mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Mark more nodes with attribute no_query_jumble
This commit removes most of the Plan and Path nodes, which should never be included in the query jumbling because we ignore these in Query nodes. This is facilitated by making no_query_jumble an inherited attribute, like no_copy, no_equal and no_read when the supertype of a node is found as marked with that. RawStmt is not used in parsed queries, so it can be removed from the query jumbling. A couple of nodes defined in pathnodes.h, plannodes.h and primnodes.h with NodeTag as supertype need to be marked individually. Forcing the execution of the query jumbling code with compute_query_id = auto while pg_stat_statements is loaded brings the code coverage of queryjumblefuncs.funcs.c to 95.6%. The core code does not yet include a way to enforce the execution in query jumbling except in pg_stat_statements, so the numbers I am mentioning above will not reflect on the default coverage report with just what is done in this commit. Reported-by: Tom Lane Reviewed-by: Tom Lane Discussion: https://postgr.es/m/3344827.1675809127@sss.pgh.pa.us
This commit is contained in:
parent
6ded4a5a3d
commit
2a507f6fd8
@ -121,7 +121,7 @@ my %node_type_info;
|
|||||||
my @no_copy;
|
my @no_copy;
|
||||||
# node types we don't want equal support for
|
# node types we don't want equal support for
|
||||||
my @no_equal;
|
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;
|
my @no_query_jumble;
|
||||||
# node types we don't want read support for
|
# node types we don't want read support for
|
||||||
my @no_read;
|
my @no_read;
|
||||||
@ -422,6 +422,8 @@ foreach my $infile (@ARGV)
|
|||||||
if elem $supertype, @no_equal;
|
if elem $supertype, @no_equal;
|
||||||
push @no_read, $in_struct
|
push @no_read, $in_struct
|
||||||
if elem $supertype, @no_read;
|
if elem $supertype, @no_read;
|
||||||
|
push @no_query_jumble, $in_struct
|
||||||
|
if elem $supertype, @no_query_jumble;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,10 +77,10 @@ typedef enum NodeTag
|
|||||||
*
|
*
|
||||||
* Node types can be supertypes of other types whether or not they are marked
|
* 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
|
* 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
|
* type, then it is the supertype of that type. The no_copy, no_equal,
|
||||||
* no_read node attributes are automatically inherited from the supertype.
|
* no_query_jumble and no_read node attributes are automatically inherited
|
||||||
* (Notice that nodetag_only does not inherit, so it's not quite equivalent
|
* from the supertype. (Notice that nodetag_only does not inherit, so it's
|
||||||
* to a combination of other attributes.)
|
* not quite equivalent to a combination of other attributes.)
|
||||||
*
|
*
|
||||||
* Valid node field attributes:
|
* Valid node field attributes:
|
||||||
*
|
*
|
||||||
|
@ -1728,9 +1728,14 @@ typedef struct TriggerTransition
|
|||||||
*
|
*
|
||||||
* stmt_location/stmt_len identify the portion of the source text string
|
* stmt_location/stmt_len identify the portion of the source text string
|
||||||
* containing this raw statement (useful for multi-statement strings).
|
* 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
|
typedef struct RawStmt
|
||||||
{
|
{
|
||||||
|
pg_node_attr(no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
Node *stmt; /* raw parse tree */
|
Node *stmt; /* raw parse tree */
|
||||||
int stmt_location; /* start location, or -1 if unknown */
|
int stmt_location; /* start location, or -1 if unknown */
|
||||||
|
@ -94,7 +94,7 @@ typedef enum UpperRelationKind
|
|||||||
*/
|
*/
|
||||||
typedef struct PlannerGlobal
|
typedef struct PlannerGlobal
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ typedef struct PlannerInfo PlannerInfo;
|
|||||||
|
|
||||||
struct PlannerInfo
|
struct PlannerInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -853,7 +853,7 @@ typedef enum RelOptKind
|
|||||||
|
|
||||||
typedef struct RelOptInfo
|
typedef struct RelOptInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1098,7 +1098,7 @@ typedef struct IndexOptInfo IndexOptInfo;
|
|||||||
|
|
||||||
struct IndexOptInfo
|
struct IndexOptInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1208,7 +1208,7 @@ struct IndexOptInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct ForeignKeyOptInfo
|
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;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1258,7 +1258,7 @@ typedef struct ForeignKeyOptInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct StatisticExtInfo
|
typedef struct StatisticExtInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1309,7 +1309,7 @@ typedef struct StatisticExtInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct JoinDomain
|
typedef struct JoinDomain
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1371,7 +1371,7 @@ typedef struct JoinDomain
|
|||||||
*/
|
*/
|
||||||
typedef struct EquivalenceClass
|
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;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1422,7 +1422,7 @@ typedef struct EquivalenceClass
|
|||||||
*/
|
*/
|
||||||
typedef struct EquivalenceMember
|
typedef struct EquivalenceMember
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1455,7 +1455,7 @@ typedef struct EquivalenceMember
|
|||||||
*/
|
*/
|
||||||
typedef struct PathKey
|
typedef struct PathKey
|
||||||
{
|
{
|
||||||
pg_node_attr(no_read)
|
pg_node_attr(no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1503,7 +1503,7 @@ typedef enum VolatileFunctionStatus
|
|||||||
*/
|
*/
|
||||||
typedef struct PathTarget
|
typedef struct PathTarget
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1550,7 +1550,7 @@ typedef struct PathTarget
|
|||||||
*/
|
*/
|
||||||
typedef struct ParamPathInfo
|
typedef struct ParamPathInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1596,7 +1596,7 @@ typedef struct ParamPathInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct Path
|
typedef struct Path
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1730,7 +1730,7 @@ typedef struct IndexPath
|
|||||||
*/
|
*/
|
||||||
typedef struct IndexClause
|
typedef struct IndexClause
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
struct RestrictInfo *rinfo; /* original restriction or join clause */
|
struct RestrictInfo *rinfo; /* original restriction or join clause */
|
||||||
@ -2231,7 +2231,7 @@ typedef struct AggPath
|
|||||||
|
|
||||||
typedef struct GroupingSetData
|
typedef struct GroupingSetData
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
List *set; /* grouping set as list of sortgrouprefs */
|
List *set; /* grouping set as list of sortgrouprefs */
|
||||||
@ -2240,7 +2240,7 @@ typedef struct GroupingSetData
|
|||||||
|
|
||||||
typedef struct RollupData
|
typedef struct RollupData
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
List *groupClause; /* applicable subset of parse->groupClause */
|
List *groupClause; /* applicable subset of parse->groupClause */
|
||||||
@ -2509,7 +2509,7 @@ typedef struct LimitPath
|
|||||||
|
|
||||||
typedef struct RestrictInfo
|
typedef struct RestrictInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_read)
|
pg_node_attr(no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -2724,6 +2724,8 @@ typedef struct MergeScanSelCache
|
|||||||
|
|
||||||
typedef struct PlaceHolderVar
|
typedef struct PlaceHolderVar
|
||||||
{
|
{
|
||||||
|
pg_node_attr(no_query_jumble)
|
||||||
|
|
||||||
Expr xpr;
|
Expr xpr;
|
||||||
|
|
||||||
/* the represented expression */
|
/* the represented expression */
|
||||||
@ -2825,7 +2827,7 @@ typedef struct SpecialJoinInfo SpecialJoinInfo;
|
|||||||
|
|
||||||
struct SpecialJoinInfo
|
struct SpecialJoinInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_read)
|
pg_node_attr(no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
Relids min_lefthand; /* base+OJ relids in minimum LHS for join */
|
Relids min_lefthand; /* base+OJ relids in minimum LHS for join */
|
||||||
@ -2853,7 +2855,7 @@ struct SpecialJoinInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct OuterJoinClauseInfo
|
typedef struct OuterJoinClauseInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
RestrictInfo *rinfo; /* a mergejoinable outer-join clause */
|
RestrictInfo *rinfo; /* a mergejoinable outer-join clause */
|
||||||
@ -2892,6 +2894,8 @@ typedef struct OuterJoinClauseInfo
|
|||||||
|
|
||||||
typedef struct AppendRelInfo
|
typedef struct AppendRelInfo
|
||||||
{
|
{
|
||||||
|
pg_node_attr(no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2967,7 +2971,7 @@ typedef struct AppendRelInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct RowIdentityVarInfo
|
typedef struct RowIdentityVarInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -3005,7 +3009,7 @@ typedef struct RowIdentityVarInfo
|
|||||||
|
|
||||||
typedef struct PlaceHolderInfo
|
typedef struct PlaceHolderInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_read)
|
pg_node_attr(no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -3038,7 +3042,7 @@ typedef struct PlaceHolderInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct MinMaxAggInfo
|
typedef struct MinMaxAggInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -3116,7 +3120,7 @@ typedef struct MinMaxAggInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct PlannerParamItem
|
typedef struct PlannerParamItem
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -3296,7 +3300,7 @@ typedef struct JoinCostWorkspace
|
|||||||
*/
|
*/
|
||||||
typedef struct AggInfo
|
typedef struct AggInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -3330,7 +3334,7 @@ typedef struct AggInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct AggTransInfo
|
typedef struct AggTransInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_copy_equal, no_read)
|
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
*/
|
*/
|
||||||
typedef struct PlannedStmt
|
typedef struct PlannedStmt
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ typedef struct PlannedStmt
|
|||||||
*/
|
*/
|
||||||
typedef struct Plan
|
typedef struct Plan
|
||||||
{
|
{
|
||||||
pg_node_attr(abstract, no_equal)
|
pg_node_attr(abstract, no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -813,7 +813,7 @@ typedef struct NestLoop
|
|||||||
|
|
||||||
typedef struct NestLoopParam
|
typedef struct NestLoopParam
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
int paramno; /* number of the PARAM_EXEC Param to set */
|
int paramno; /* number of the PARAM_EXEC Param to set */
|
||||||
@ -1377,7 +1377,7 @@ typedef enum RowMarkType
|
|||||||
*/
|
*/
|
||||||
typedef struct PlanRowMark
|
typedef struct PlanRowMark
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
Index rti; /* range table index of markable relation */
|
Index rti; /* range table index of markable relation */
|
||||||
@ -1425,7 +1425,7 @@ typedef struct PlanRowMark
|
|||||||
*/
|
*/
|
||||||
typedef struct PartitionPruneInfo
|
typedef struct PartitionPruneInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
Bitmapset *root_parent_relids;
|
Bitmapset *root_parent_relids;
|
||||||
@ -1452,7 +1452,7 @@ typedef struct PartitionPruneInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct PartitionedRelPruneInfo
|
typedef struct PartitionedRelPruneInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
|
|
||||||
@ -1495,7 +1495,7 @@ typedef struct PartitionedRelPruneInfo
|
|||||||
*/
|
*/
|
||||||
typedef struct PartitionPruneStep
|
typedef struct PartitionPruneStep
|
||||||
{
|
{
|
||||||
pg_node_attr(abstract, no_equal)
|
pg_node_attr(abstract, no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
int step_id;
|
int step_id;
|
||||||
@ -1570,7 +1570,7 @@ typedef struct PartitionPruneStepCombine
|
|||||||
*/
|
*/
|
||||||
typedef struct PlanInvalItem
|
typedef struct PlanInvalItem
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
int cacheId; /* a syscache ID, see utils/syscache.h */
|
int cacheId; /* a syscache ID, see utils/syscache.h */
|
||||||
|
@ -982,6 +982,8 @@ typedef struct SubLink
|
|||||||
*/
|
*/
|
||||||
typedef struct SubPlan
|
typedef struct SubPlan
|
||||||
{
|
{
|
||||||
|
pg_node_attr(no_query_jumble)
|
||||||
|
|
||||||
Expr xpr;
|
Expr xpr;
|
||||||
/* Fields copied from original SubLink: */
|
/* Fields copied from original SubLink: */
|
||||||
SubLinkType subLinkType; /* see above */
|
SubLinkType subLinkType; /* see above */
|
||||||
@ -1029,6 +1031,8 @@ typedef struct SubPlan
|
|||||||
*/
|
*/
|
||||||
typedef struct AlternativeSubPlan
|
typedef struct AlternativeSubPlan
|
||||||
{
|
{
|
||||||
|
pg_node_attr(no_query_jumble)
|
||||||
|
|
||||||
Expr xpr;
|
Expr xpr;
|
||||||
List *subplans; /* SubPlan(s) with equivalent results */
|
List *subplans; /* SubPlan(s) with equivalent results */
|
||||||
} AlternativeSubPlan;
|
} AlternativeSubPlan;
|
||||||
|
@ -268,7 +268,7 @@ typedef struct RelationData
|
|||||||
*/
|
*/
|
||||||
typedef struct ForeignKeyCacheInfo
|
typedef struct ForeignKeyCacheInfo
|
||||||
{
|
{
|
||||||
pg_node_attr(no_equal, no_read)
|
pg_node_attr(no_equal, no_read, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
/* oid of the constraint itself */
|
/* oid of the constraint itself */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user