diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl index 19ed29657c..ecbcadb8bf 100644 --- a/src/backend/nodes/gen_node_support.pl +++ b/src/backend/nodes/gen_node_support.pl @@ -121,7 +121,7 @@ my %node_type_info; my @no_copy; # node types we don't want equal support for my @no_equal; -# node types we don't want jumble support for +# node types we don't want query jumble support for my @no_query_jumble; # node types we don't want read support for my @no_read; @@ -422,6 +422,8 @@ foreach my $infile (@ARGV) if elem $supertype, @no_equal; push @no_read, $in_struct if elem $supertype, @no_read; + push @no_query_jumble, $in_struct + if elem $supertype, @no_query_jumble; } } diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 75dfe1919d..bdfef0f461 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -77,10 +77,10 @@ typedef enum NodeTag * * Node types can be supertypes of other types whether or not they are marked * abstract: if a node struct appears as the first field of another struct - * type, then it is the supertype of that type. The no_copy, no_equal, and - * no_read node attributes are automatically inherited from the supertype. - * (Notice that nodetag_only does not inherit, so it's not quite equivalent - * to a combination of other attributes.) + * type, then it is the supertype of that type. The no_copy, no_equal, + * no_query_jumble and no_read node attributes are automatically inherited + * from the supertype. (Notice that nodetag_only does not inherit, so it's + * not quite equivalent to a combination of other attributes.) * * Valid node field attributes: * diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index eafdb083ea..f7d7f10f7d 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1728,9 +1728,14 @@ typedef struct TriggerTransition * * stmt_location/stmt_len identify the portion of the source text string * containing this raw statement (useful for multi-statement strings). + * + * This is irrelevant for query jumbling, as this is not used in parsed + * queries. */ 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..be4d791212 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; @@ -1730,7 +1730,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 */ @@ -2231,7 +2231,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 +2240,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 */ @@ -2509,7 +2509,7 @@ typedef struct LimitPath typedef struct RestrictInfo { - pg_node_attr(no_read) + pg_node_attr(no_read, no_query_jumble) NodeTag type; @@ -2724,6 +2724,8 @@ typedef struct MergeScanSelCache typedef struct PlaceHolderVar { + pg_node_attr(no_query_jumble) + Expr xpr; /* the represented expression */ @@ -2825,7 +2827,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 +2855,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 +2894,8 @@ typedef struct OuterJoinClauseInfo typedef struct AppendRelInfo { + pg_node_attr(no_query_jumble) + NodeTag type; /* @@ -2967,7 +2971,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 +3009,7 @@ typedef struct RowIdentityVarInfo typedef struct PlaceHolderInfo { - pg_node_attr(no_read) + pg_node_attr(no_read, no_query_jumble) NodeTag type; @@ -3038,7 +3042,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 +3120,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 +3300,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 +3334,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..659bd05c0c 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; @@ -813,7 +813,7 @@ typedef struct 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 */ @@ -1377,7 +1377,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 +1425,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 +1452,7 @@ typedef struct PartitionPruneInfo */ typedef struct PartitionedRelPruneInfo { - pg_node_attr(no_equal) + pg_node_attr(no_equal, no_query_jumble) NodeTag type; @@ -1495,7 +1495,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; @@ -1570,7 +1570,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; diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index af9785038d..67f994cb3e 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -268,7 +268,7 @@ typedef struct RelationData */ typedef struct ForeignKeyCacheInfo { - pg_node_attr(no_equal, no_read) + pg_node_attr(no_equal, no_read, no_query_jumble) NodeTag type; /* oid of the constraint itself */