v2-0001-Mark-more-nodes-with-node-attribute-no_query_jumb.patch
text/x-diff
Filename: v2-0001-Mark-more-nodes-with-node-attribute-no_query_jumb.patch
Type: text/x-diff
Part: 0
Patch
Format: format-patch
Series: patch v2-0001
Subject: Mark more nodes with node attribute no_query_jumble
| File | + | − |
|---|---|---|
| src/backend/nodes/gen_node_support.pl | 2 | 0 |
| src/include/nodes/nodes.h | 4 | 4 |
| src/include/nodes/parsenodes.h | 5 | 0 |
| src/include/nodes/pathnodes.h | 29 | 25 |
| src/include/nodes/plannodes.h | 8 | 8 |
| src/include/nodes/primnodes.h | 4 | 0 |
From 316df43f7574f54ff93606549167102e319f5473 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Fri, 10 Feb 2023 11:15:24 +0900
Subject: [PATCH v2 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. no_query_jumble
is now an inherited attribute to be able to achieve that, like its read
and write counterparts.
---
src/include/nodes/nodes.h | 8 ++--
src/include/nodes/parsenodes.h | 5 +++
src/include/nodes/pathnodes.h | 54 ++++++++++++++-------------
src/include/nodes/plannodes.h | 16 ++++----
src/include/nodes/primnodes.h | 4 ++
src/backend/nodes/gen_node_support.pl | 2 +
6 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 75dfe1919d..e6cf520547 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 855da99ec0..9c97148b69 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/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 19ed29657c..2e57db915b 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -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;
}
}
--
2.39.1