From 5d8d730e5fc28acdf75e33b00c56c172b400ffe3 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Wed, 8 Feb 2023 15:22:28 +0900
Subject: [PATCH 1/2] Mark more nodes with node attribute no_query_jumble

This mostly covers plan and path nodes, which should never be included
in the jumbling because we ignore these in Query nodes.
---
 src/include/nodes/parsenodes.h |   8 +++
 src/include/nodes/pathnodes.h  | 126 ++++++++++++++++++++++++++-------
 src/include/nodes/plannodes.h  | 108 +++++++++++++++++++++++++---
 src/include/nodes/primnodes.h  |   4 ++
 4 files changed, 210 insertions(+), 36 deletions(-)

diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 855da99ec0..29e2940b7d 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1239,6 +1239,8 @@ typedef struct RangeTblEntry
  */
 typedef struct RTEPermissionInfo
 {
+	pg_node_attr(no_query_jumble)
+
 	NodeTag		type;
 
 	Oid			relid;			/* relation OID */
@@ -1596,6 +1598,8 @@ typedef enum CTEMaterialize
 
 typedef struct CTESearchClause
 {
+	pg_node_attr(no_query_jumble)
+
 	NodeTag		type;
 	List	   *search_col_list;
 	bool		search_breadth_first;
@@ -1605,6 +1609,8 @@ typedef struct CTESearchClause
 
 typedef struct CTECycleClause
 {
+	pg_node_attr(no_query_jumble)
+
 	NodeTag		type;
 	List	   *cycle_col_list;
 	char	   *cycle_mark_column;
@@ -1731,6 +1737,8 @@ typedef struct TriggerTransition
  */
 typedef struct RawStmt
 {
+	pg_node_attr(no_query_jumble)
+
 	NodeTag		type;
 	Node	   *stmt;			/* raw parse tree */
 	int			stmt_location;	/* start location, or -1 if unknown */
diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h
index 0d4b1ec4e4..453dedaec8 100644
--- a/src/include/nodes/pathnodes.h
+++ b/src/include/nodes/pathnodes.h
@@ -94,7 +94,7 @@ typedef enum UpperRelationKind
  */
 typedef struct PlannerGlobal
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -194,7 +194,7 @@ typedef struct PlannerInfo PlannerInfo;
 
 struct PlannerInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -853,7 +853,7 @@ typedef enum RelOptKind
 
 typedef struct RelOptInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1098,7 +1098,7 @@ typedef struct IndexOptInfo IndexOptInfo;
 
 struct IndexOptInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1208,7 +1208,7 @@ struct IndexOptInfo
  */
 typedef struct ForeignKeyOptInfo
 {
-	pg_node_attr(custom_read_write, no_copy_equal, no_read)
+	pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1258,7 +1258,7 @@ typedef struct ForeignKeyOptInfo
  */
 typedef struct StatisticExtInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1309,7 +1309,7 @@ typedef struct StatisticExtInfo
  */
 typedef struct JoinDomain
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1371,7 +1371,7 @@ typedef struct JoinDomain
  */
 typedef struct EquivalenceClass
 {
-	pg_node_attr(custom_read_write, no_copy_equal, no_read)
+	pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1422,7 +1422,7 @@ typedef struct EquivalenceClass
  */
 typedef struct EquivalenceMember
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1455,7 +1455,7 @@ typedef struct EquivalenceMember
  */
 typedef struct PathKey
 {
-	pg_node_attr(no_read)
+	pg_node_attr(no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1503,7 +1503,7 @@ typedef enum VolatileFunctionStatus
  */
 typedef struct PathTarget
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1550,7 +1550,7 @@ typedef struct PathTarget
  */
 typedef struct ParamPathInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1596,7 +1596,7 @@ typedef struct ParamPathInfo
  */
 typedef struct Path
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1684,6 +1684,8 @@ typedef struct Path
  */
 typedef struct IndexPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	IndexOptInfo *indexinfo;
 	List	   *indexclauses;
@@ -1730,7 +1732,7 @@ typedef struct IndexPath
  */
 typedef struct IndexClause
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 	struct RestrictInfo *rinfo; /* original restriction or join clause */
@@ -1759,6 +1761,8 @@ typedef struct IndexClause
  */
 typedef struct BitmapHeapPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *bitmapqual;		/* IndexPath, BitmapAndPath, BitmapOrPath */
 } BitmapHeapPath;
@@ -1771,6 +1775,8 @@ typedef struct BitmapHeapPath
  */
 typedef struct BitmapAndPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *bitmapquals;	/* IndexPaths and BitmapOrPaths */
 	Selectivity bitmapselectivity;
@@ -1784,6 +1790,8 @@ typedef struct BitmapAndPath
  */
 typedef struct BitmapOrPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *bitmapquals;	/* IndexPaths and BitmapAndPaths */
 	Selectivity bitmapselectivity;
@@ -1798,6 +1806,8 @@ typedef struct BitmapOrPath
  */
 typedef struct TidPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *tidquals;		/* qual(s) involving CTID = something */
 } TidPath;
@@ -1810,6 +1820,8 @@ typedef struct TidPath
  */
 typedef struct TidRangePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *tidrangequals;
 } TidRangePath;
@@ -1824,6 +1836,8 @@ typedef struct TidRangePath
  */
 typedef struct SubqueryScanPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing subquery execution */
 } SubqueryScanPath;
@@ -1840,6 +1854,8 @@ typedef struct SubqueryScanPath
  */
 typedef struct ForeignPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *fdw_outerpath;
 	List	   *fdw_private;
@@ -1868,6 +1884,8 @@ struct CustomPathMethods;
 
 typedef struct CustomPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	uint32		flags;			/* mask of CUSTOMPATH_* flags, see
 								 * nodes/extensible.h */
@@ -1893,6 +1911,8 @@ typedef struct CustomPath
  */
 typedef struct AppendPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *subpaths;		/* list of component Paths */
 	/* Index of first partial path in subpaths; list_length(subpaths) if none */
@@ -1917,6 +1937,8 @@ extern bool is_dummy_rel(RelOptInfo *rel);
  */
 typedef struct MergeAppendPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *subpaths;		/* list of component Paths */
 	Cardinality limit_tuples;	/* hard limit on output tuples, or -1 */
@@ -1931,6 +1953,8 @@ typedef struct MergeAppendPath
  */
 typedef struct GroupResultPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *quals;
 } GroupResultPath;
@@ -1943,6 +1967,8 @@ typedef struct GroupResultPath
  */
 typedef struct MaterialPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;
 } MaterialPath;
@@ -1954,6 +1980,8 @@ typedef struct MaterialPath
  */
 typedef struct MemoizePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* outerpath to cache tuples from */
 	List	   *hash_operators; /* OIDs of hash equality ops for cache keys */
@@ -1989,6 +2017,8 @@ typedef enum UniquePathMethod
 
 typedef struct UniquePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;
 	UniquePathMethod umethod;
@@ -2003,6 +2033,8 @@ typedef struct UniquePath
  */
 typedef struct GatherPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path for each worker */
 	bool		single_copy;	/* don't execute path more than once */
@@ -2015,6 +2047,8 @@ typedef struct GatherPath
  */
 typedef struct GatherMergePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path for each worker */
 	int			num_workers;	/* number of workers sought to help */
@@ -2027,7 +2061,7 @@ typedef struct GatherMergePath
 
 typedef struct JoinPath
 {
-	pg_node_attr(abstract)
+	pg_node_attr(abstract, no_query_jumble)
 
 	Path		path;
 
@@ -2054,6 +2088,8 @@ typedef struct JoinPath
 
 typedef struct NestPath
 {
+	pg_node_attr(no_query_jumble)
+
 	JoinPath	jpath;
 } NestPath;
 
@@ -2094,6 +2130,8 @@ typedef struct NestPath
 
 typedef struct MergePath
 {
+	pg_node_attr(no_query_jumble)
+
 	JoinPath	jpath;
 	List	   *path_mergeclauses;	/* join clauses to be used for merge */
 	List	   *outersortkeys;	/* keys for explicit sort, if any */
@@ -2113,6 +2151,8 @@ typedef struct MergePath
 
 typedef struct HashPath
 {
+	pg_node_attr(no_query_jumble)
+
 	JoinPath	jpath;
 	List	   *path_hashclauses;	/* join clauses used for hashing */
 	int			num_batches;	/* number of batches expected */
@@ -2135,6 +2175,8 @@ typedef struct HashPath
  */
 typedef struct ProjectionPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	bool		dummypp;		/* true if no separate Result is needed */
@@ -2147,6 +2189,8 @@ typedef struct ProjectionPath
  */
 typedef struct ProjectSetPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 } ProjectSetPath;
@@ -2161,6 +2205,8 @@ typedef struct ProjectSetPath
  */
 typedef struct SortPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 } SortPath;
@@ -2173,6 +2219,8 @@ typedef struct SortPath
  */
 typedef struct IncrementalSortPath
 {
+	pg_node_attr(no_query_jumble)
+
 	SortPath	spath;
 	int			nPresortedCols; /* number of presorted columns */
 } IncrementalSortPath;
@@ -2187,6 +2235,8 @@ typedef struct IncrementalSortPath
  */
 typedef struct GroupPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	List	   *groupClause;	/* a list of SortGroupClause's */
@@ -2201,6 +2251,8 @@ typedef struct GroupPath
  */
 typedef struct UpperUniquePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	int			numkeys;		/* number of pathkey columns to compare */
@@ -2215,6 +2267,8 @@ typedef struct UpperUniquePath
  */
 typedef struct AggPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	AggStrategy aggstrategy;	/* basic strategy, see nodes.h */
@@ -2231,7 +2285,7 @@ typedef struct AggPath
 
 typedef struct GroupingSetData
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 	List	   *set;			/* grouping set as list of sortgrouprefs */
@@ -2240,7 +2294,7 @@ typedef struct GroupingSetData
 
 typedef struct RollupData
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 	List	   *groupClause;	/* applicable subset of parse->groupClause */
@@ -2257,6 +2311,8 @@ typedef struct RollupData
 
 typedef struct GroupingSetsPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	AggStrategy aggstrategy;	/* basic strategy */
@@ -2270,6 +2326,8 @@ typedef struct GroupingSetsPath
  */
 typedef struct MinMaxAggPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	List	   *mmaggregates;	/* list of MinMaxAggInfo */
 	List	   *quals;			/* HAVING quals, if any */
@@ -2280,6 +2338,8 @@ typedef struct MinMaxAggPath
  */
 typedef struct WindowAggPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	WindowClause *winclause;	/* WindowClause we'll be using */
@@ -2293,6 +2353,8 @@ typedef struct WindowAggPath
  */
 typedef struct SetOpPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	SetOpCmd	cmd;			/* what to do, see nodes.h */
@@ -2308,6 +2370,8 @@ typedef struct SetOpPath
  */
 typedef struct RecursiveUnionPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *leftpath;		/* paths representing input sources */
 	Path	   *rightpath;
@@ -2321,6 +2385,8 @@ typedef struct RecursiveUnionPath
  */
 typedef struct LockRowsPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	List	   *rowMarks;		/* a list of PlanRowMark's */
@@ -2336,6 +2402,8 @@ typedef struct LockRowsPath
  */
 typedef struct ModifyTablePath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* Path producing source data */
 	CmdType		operation;		/* INSERT, UPDATE, DELETE, or MERGE */
@@ -2359,6 +2427,8 @@ typedef struct ModifyTablePath
  */
 typedef struct LimitPath
 {
+	pg_node_attr(no_query_jumble)
+
 	Path		path;
 	Path	   *subpath;		/* path representing input source */
 	Node	   *limitOffset;	/* OFFSET parameter, or NULL if none */
@@ -2509,7 +2579,7 @@ typedef struct LimitPath
 
 typedef struct RestrictInfo
 {
-	pg_node_attr(no_read)
+	pg_node_attr(no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -2724,6 +2794,8 @@ typedef struct MergeScanSelCache
 
 typedef struct PlaceHolderVar
 {
+	pg_node_attr(no_query_jumble)
+
 	Expr		xpr;
 
 	/* the represented expression */
@@ -2825,7 +2897,7 @@ typedef struct SpecialJoinInfo SpecialJoinInfo;
 
 struct SpecialJoinInfo
 {
-	pg_node_attr(no_read)
+	pg_node_attr(no_read, no_query_jumble)
 
 	NodeTag		type;
 	Relids		min_lefthand;	/* base+OJ relids in minimum LHS for join */
@@ -2853,7 +2925,7 @@ struct SpecialJoinInfo
  */
 typedef struct OuterJoinClauseInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 	RestrictInfo *rinfo;		/* a mergejoinable outer-join clause */
@@ -2892,6 +2964,8 @@ typedef struct OuterJoinClauseInfo
 
 typedef struct AppendRelInfo
 {
+	pg_node_attr(no_query_jumble)
+
 	NodeTag		type;
 
 	/*
@@ -2967,7 +3041,7 @@ typedef struct AppendRelInfo
  */
 typedef struct RowIdentityVarInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -3005,7 +3079,7 @@ typedef struct RowIdentityVarInfo
 
 typedef struct PlaceHolderInfo
 {
-	pg_node_attr(no_read)
+	pg_node_attr(no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -3038,7 +3112,7 @@ typedef struct PlaceHolderInfo
  */
 typedef struct MinMaxAggInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -3116,7 +3190,7 @@ typedef struct MinMaxAggInfo
  */
 typedef struct PlannerParamItem
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -3296,7 +3370,7 @@ typedef struct JoinCostWorkspace
  */
 typedef struct AggInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
@@ -3330,7 +3404,7 @@ typedef struct AggInfo
  */
 typedef struct AggTransInfo
 {
-	pg_node_attr(no_copy_equal, no_read)
+	pg_node_attr(no_copy_equal, no_read, no_query_jumble)
 
 	NodeTag		type;
 
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index 4781a9c632..9199c16f6f 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -46,7 +46,7 @@
  */
 typedef struct PlannedStmt
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 
@@ -122,7 +122,7 @@ typedef struct PlannedStmt
  */
 typedef struct Plan
 {
-	pg_node_attr(abstract, no_equal)
+	pg_node_attr(abstract, no_equal, no_query_jumble)
 
 	NodeTag		type;
 
@@ -199,6 +199,8 @@ typedef struct Plan
  */
 typedef struct Result
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	Node	   *resconstantqual;
 } Result;
@@ -211,6 +213,8 @@ typedef struct Result
  */
 typedef struct ProjectSet
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 } ProjectSet;
 
@@ -231,6 +235,8 @@ typedef struct ProjectSet
  */
 typedef struct ModifyTable
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	CmdType		operation;		/* INSERT, UPDATE, DELETE, or MERGE */
 	bool		canSetTag;		/* do we set the command tag/es_processed? */
@@ -265,6 +271,8 @@ struct PartitionPruneInfo;		/* forward reference to struct below */
  */
 typedef struct Append
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	Bitmapset  *apprelids;		/* RTIs of appendrel(s) formed by this node */
 	List	   *appendplans;
@@ -287,6 +295,8 @@ typedef struct Append
  */
 typedef struct MergeAppend
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* RTIs of appendrel(s) formed by this node */
@@ -325,6 +335,8 @@ typedef struct MergeAppend
  */
 typedef struct RecursiveUnion
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* ID of Param representing work table */
@@ -356,6 +368,8 @@ typedef struct RecursiveUnion
  */
 typedef struct BitmapAnd
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	List	   *bitmapplans;
 } BitmapAnd;
@@ -370,6 +384,8 @@ typedef struct BitmapAnd
  */
 typedef struct BitmapOr
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	bool		isshared;
 	List	   *bitmapplans;
@@ -384,7 +400,7 @@ typedef struct BitmapOr
  */
 typedef struct Scan
 {
-	pg_node_attr(abstract)
+	pg_node_attr(abstract, no_query_jumble)
 
 	Plan		plan;
 	Index		scanrelid;		/* relid is index into the range table */
@@ -396,6 +412,8 @@ typedef struct Scan
  */
 typedef struct SeqScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 } SeqScan;
 
@@ -405,6 +423,8 @@ typedef struct SeqScan
  */
 typedef struct SampleScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	/* use struct pointer to avoid including parsenodes.h here */
 	struct TableSampleClause *tablesample;
@@ -449,6 +469,8 @@ typedef struct SampleScan
  */
 typedef struct IndexScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	Oid			indexid;		/* OID of index to scan */
 	List	   *indexqual;		/* list of index quals (usually OpExprs) */
@@ -492,6 +514,8 @@ typedef struct IndexScan
  */
 typedef struct IndexOnlyScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	Oid			indexid;		/* OID of index to scan */
 	List	   *indexqual;		/* list of index quals (usually OpExprs) */
@@ -520,6 +544,8 @@ typedef struct IndexOnlyScan
  */
 typedef struct BitmapIndexScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	Oid			indexid;		/* OID of index to scan */
 	bool		isshared;		/* Create shared bitmap if set */
@@ -538,6 +564,8 @@ typedef struct BitmapIndexScan
  */
 typedef struct BitmapHeapScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	List	   *bitmapqualorig; /* index quals, in standard expr form */
 } BitmapHeapScan;
@@ -552,6 +580,8 @@ typedef struct BitmapHeapScan
  */
 typedef struct TidScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	List	   *tidquals;		/* qual(s) involving CTID = something */
 } TidScan;
@@ -565,6 +595,8 @@ typedef struct TidScan
  */
 typedef struct TidRangeScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	List	   *tidrangequals;	/* qual(s) involving CTID op something */
 } TidRangeScan;
@@ -598,6 +630,8 @@ typedef enum SubqueryScanStatus
 
 typedef struct SubqueryScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	Plan	   *subplan;
 	SubqueryScanStatus scanstatus;
@@ -609,6 +643,8 @@ typedef struct SubqueryScan
  */
 typedef struct FunctionScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	List	   *functions;		/* list of RangeTblFunction nodes */
 	bool		funcordinality; /* WITH ORDINALITY */
@@ -620,6 +656,8 @@ typedef struct FunctionScan
  */
 typedef struct ValuesScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	List	   *values_lists;	/* list of expression lists */
 } ValuesScan;
@@ -630,6 +668,8 @@ typedef struct ValuesScan
  */
 typedef struct TableFuncScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	TableFunc  *tablefunc;		/* table function node */
 } TableFuncScan;
@@ -640,6 +680,8 @@ typedef struct TableFuncScan
  */
 typedef struct CteScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	int			ctePlanId;		/* ID of init SubPlan for CTE */
 	int			cteParam;		/* ID of Param representing CTE output */
@@ -651,6 +693,8 @@ typedef struct CteScan
  */
 typedef struct NamedTuplestoreScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	char	   *enrname;		/* Name given to Ephemeral Named Relation */
 } NamedTuplestoreScan;
@@ -661,6 +705,8 @@ typedef struct NamedTuplestoreScan
  */
 typedef struct WorkTableScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	int			wtParam;		/* ID of Param representing work table */
 } WorkTableScan;
@@ -707,6 +753,8 @@ typedef struct WorkTableScan
  */
 typedef struct ForeignScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	CmdType		operation;		/* SELECT/INSERT/UPDATE/DELETE */
 	Index		resultRelation; /* direct modification target's RT index */
@@ -739,6 +787,8 @@ struct CustomScanMethods;
 
 typedef struct CustomScan
 {
+	pg_node_attr(no_query_jumble)
+
 	Scan		scan;
 	uint32		flags;			/* mask of CUSTOMPATH_* flags, see
 								 * nodes/extensible.h */
@@ -786,7 +836,7 @@ typedef struct CustomScan
  */
 typedef struct Join
 {
-	pg_node_attr(abstract)
+	pg_node_attr(abstract, no_query_jumble)
 
 	Plan		plan;
 	JoinType	jointype;
@@ -807,13 +857,15 @@ typedef struct Join
  */
 typedef struct NestLoop
 {
+	pg_node_attr(no_query_jumble)
+
 	Join		join;
 	List	   *nestParams;		/* list of NestLoopParam nodes */
 } NestLoop;
 
 typedef struct NestLoopParam
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 	int			paramno;		/* number of the PARAM_EXEC Param to set */
@@ -833,6 +885,8 @@ typedef struct NestLoopParam
  */
 typedef struct MergeJoin
 {
+	pg_node_attr(no_query_jumble)
+
 	Join		join;
 
 	/* Can we skip mark/restore calls? */
@@ -862,6 +916,8 @@ typedef struct MergeJoin
  */
 typedef struct HashJoin
 {
+	pg_node_attr(no_query_jumble)
+
 	Join		join;
 	List	   *hashclauses;
 	List	   *hashoperators;
@@ -880,6 +936,8 @@ typedef struct HashJoin
  */
 typedef struct Material
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 } Material;
 
@@ -889,6 +947,8 @@ typedef struct Material
  */
 typedef struct Memoize
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* size of the two arrays below */
@@ -931,6 +991,8 @@ typedef struct Memoize
  */
 typedef struct Sort
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* number of sort-key columns */
@@ -955,6 +1017,8 @@ typedef struct Sort
  */
 typedef struct IncrementalSort
 {
+	pg_node_attr(no_query_jumble)
+
 	Sort		sort;
 	int			nPresortedCols; /* number of presorted columns */
 } IncrementalSort;
@@ -967,6 +1031,8 @@ typedef struct IncrementalSort
  */
 typedef struct Group
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* number of grouping columns */
@@ -996,6 +1062,8 @@ typedef struct Group
  */
 typedef struct Agg
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* basic strategy, see nodes.h */
@@ -1038,6 +1106,8 @@ typedef struct Agg
  */
 typedef struct WindowAgg
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* ID referenced by window functions */
@@ -1112,6 +1182,8 @@ typedef struct WindowAgg
  */
 typedef struct Unique
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* number of columns to check for uniqueness */
@@ -1140,6 +1212,8 @@ typedef struct Unique
  */
 typedef struct Gather
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	int			num_workers;	/* planned number of worker processes */
 	int			rescan_param;	/* ID of Param that signals a rescan, or -1 */
@@ -1155,6 +1229,8 @@ typedef struct Gather
  */
 typedef struct GatherMerge
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* planned number of worker processes */
@@ -1197,6 +1273,8 @@ typedef struct GatherMerge
  */
 typedef struct Hash
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/*
@@ -1217,6 +1295,8 @@ typedef struct Hash
  */
 typedef struct SetOp
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* what to do, see nodes.h */
@@ -1256,6 +1336,8 @@ typedef struct SetOp
  */
 typedef struct LockRows
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 	List	   *rowMarks;		/* a list of PlanRowMark's */
 	int			epqParam;		/* ID of Param for EvalPlanQual re-eval */
@@ -1270,6 +1352,8 @@ typedef struct LockRows
  */
 typedef struct Limit
 {
+	pg_node_attr(no_query_jumble)
+
 	Plan		plan;
 
 	/* OFFSET parameter, or NULL if none */
@@ -1377,7 +1461,7 @@ typedef enum RowMarkType
  */
 typedef struct PlanRowMark
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 	Index		rti;			/* range table index of markable relation */
@@ -1425,7 +1509,7 @@ typedef struct PlanRowMark
  */
 typedef struct PartitionPruneInfo
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 	Bitmapset  *root_parent_relids;
@@ -1452,7 +1536,7 @@ typedef struct PartitionPruneInfo
  */
 typedef struct PartitionedRelPruneInfo
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 
@@ -1495,7 +1579,7 @@ typedef struct PartitionedRelPruneInfo
  */
 typedef struct PartitionPruneStep
 {
-	pg_node_attr(abstract, no_equal)
+	pg_node_attr(abstract, no_equal, no_query_jumble)
 
 	NodeTag		type;
 	int			step_id;
@@ -1530,6 +1614,8 @@ typedef struct PartitionPruneStep
  */
 typedef struct PartitionPruneStepOp
 {
+	pg_node_attr(no_query_jumble)
+
 	PartitionPruneStep step;
 
 	StrategyNumber opstrategy;
@@ -1552,6 +1638,8 @@ typedef enum PartitionPruneCombineOp
 
 typedef struct PartitionPruneStepCombine
 {
+	pg_node_attr(no_query_jumble)
+
 	PartitionPruneStep step;
 
 	PartitionPruneCombineOp combineOp;
@@ -1570,7 +1658,7 @@ typedef struct PartitionPruneStepCombine
  */
 typedef struct PlanInvalItem
 {
-	pg_node_attr(no_equal)
+	pg_node_attr(no_equal, no_query_jumble)
 
 	NodeTag		type;
 	int			cacheId;		/* a syscache ID, see utils/syscache.h */
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 6d740be5c0..1be1642d92 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -982,6 +982,8 @@ typedef struct SubLink
  */
 typedef struct SubPlan
 {
+	pg_node_attr(no_query_jumble)
+
 	Expr		xpr;
 	/* Fields copied from original SubLink: */
 	SubLinkType subLinkType;	/* see above */
@@ -1029,6 +1031,8 @@ typedef struct SubPlan
  */
 typedef struct AlternativeSubPlan
 {
+	pg_node_attr(no_query_jumble)
+
 	Expr		xpr;
 	List	   *subplans;		/* SubPlan(s) with equivalent results */
 } AlternativeSubPlan;
-- 
2.39.1

