Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"

This reverts commit ec386948948c and its fixup 589bb816499e.

This change was intended to support query planning avoiding acquisition
of locks on partitions that were going to be pruned; however, the
overall project took a different direction at [1] and this bit is no
longer needed.  Put things back the way they were as agreed in [2], to
avoid unnecessary complexity.

Discussion: [1] https://postgr.es/m/4191508.1674157166@sss.pgh.pa.us
Discussion: [2] https://postgr.es/m/20230502175409.kcoirxczpdha26wt@alvherre.pgsql
This commit is contained in:
Alvaro Herrera 2023-05-04 12:09:59 +02:00
parent 919c486a27
commit 5472743d9e
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
16 changed files with 63 additions and 135 deletions

View File

@ -824,7 +824,6 @@ InitPlan(QueryDesc *queryDesc, int eflags)
ExecInitRangeTable(estate, rangeTable, plannedstmt->permInfos); ExecInitRangeTable(estate, rangeTable, plannedstmt->permInfos);
estate->es_plannedstmt = plannedstmt; estate->es_plannedstmt = plannedstmt;
estate->es_part_prune_infos = plannedstmt->partPruneInfos;
/* /*
* Next, build the ExecRowMark array from the PlanRowMark(s), if any. * Next, build the ExecRowMark array from the PlanRowMark(s), if any.

View File

@ -183,7 +183,6 @@ ExecSerializePlan(Plan *plan, EState *estate)
pstmt->dependsOnRole = false; pstmt->dependsOnRole = false;
pstmt->parallelModeNeeded = false; pstmt->parallelModeNeeded = false;
pstmt->planTree = plan; pstmt->planTree = plan;
pstmt->partPruneInfos = estate->es_part_prune_infos;
pstmt->rtable = estate->es_range_table; pstmt->rtable = estate->es_range_table;
pstmt->permInfos = estate->es_rteperminfos; pstmt->permInfos = estate->es_rteperminfos;
pstmt->resultRelations = NIL; pstmt->resultRelations = NIL;

View File

@ -1778,9 +1778,6 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
* Initialize data structure needed for run-time partition pruning and * Initialize data structure needed for run-time partition pruning and
* do initial pruning if needed * do initial pruning if needed
* *
* 'root_parent_relids' identifies the relation to which both the parent plan
* and the PartitionPruneInfo given by 'part_prune_index' belong.
*
* On return, *initially_valid_subplans is assigned the set of indexes of * On return, *initially_valid_subplans is assigned the set of indexes of
* child subplans that must be initialized along with the parent plan node. * child subplans that must be initialized along with the parent plan node.
* Initial pruning is performed here if needed and in that case only the * Initial pruning is performed here if needed and in that case only the
@ -1793,24 +1790,11 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
PartitionPruneState * PartitionPruneState *
ExecInitPartitionPruning(PlanState *planstate, ExecInitPartitionPruning(PlanState *planstate,
int n_total_subplans, int n_total_subplans,
int part_prune_index, PartitionPruneInfo *pruneinfo,
Bitmapset *root_parent_relids,
Bitmapset **initially_valid_subplans) Bitmapset **initially_valid_subplans)
{ {
PartitionPruneState *prunestate; PartitionPruneState *prunestate;
EState *estate = planstate->state; EState *estate = planstate->state;
PartitionPruneInfo *pruneinfo;
/* Obtain the pruneinfo we need, and make sure it's the right one */
pruneinfo = list_nth(estate->es_part_prune_infos, part_prune_index);
if (!bms_equal(root_parent_relids, pruneinfo->root_parent_relids))
ereport(ERROR,
errcode(ERRCODE_INTERNAL_ERROR),
errmsg_internal("mismatching PartitionPruneInfo found at part_prune_index %d",
part_prune_index),
errdetail_internal("plan node relids %s, pruneinfo relids %s",
bmsToString(root_parent_relids),
bmsToString(pruneinfo->root_parent_relids)));
/* We may need an expression context to evaluate partition exprs */ /* We may need an expression context to evaluate partition exprs */
ExecAssignExprContext(estate, planstate); ExecAssignExprContext(estate, planstate);

View File

@ -123,7 +123,6 @@ CreateExecutorState(void)
estate->es_rowmarks = NULL; estate->es_rowmarks = NULL;
estate->es_rteperminfos = NIL; estate->es_rteperminfos = NIL;
estate->es_plannedstmt = NULL; estate->es_plannedstmt = NULL;
estate->es_part_prune_infos = NIL;
estate->es_junkFilter = NULL; estate->es_junkFilter = NULL;

View File

@ -134,7 +134,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
appendstate->as_begun = false; appendstate->as_begun = false;
/* If run-time partition pruning is enabled, then set that up now */ /* If run-time partition pruning is enabled, then set that up now */
if (node->part_prune_index >= 0) if (node->part_prune_info != NULL)
{ {
PartitionPruneState *prunestate; PartitionPruneState *prunestate;
@ -145,8 +145,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
*/ */
prunestate = ExecInitPartitionPruning(&appendstate->ps, prunestate = ExecInitPartitionPruning(&appendstate->ps,
list_length(node->appendplans), list_length(node->appendplans),
node->part_prune_index, node->part_prune_info,
node->apprelids,
&validsubplans); &validsubplans);
appendstate->as_prune_state = prunestate; appendstate->as_prune_state = prunestate;
nplans = bms_num_members(validsubplans); nplans = bms_num_members(validsubplans);

View File

@ -82,7 +82,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
mergestate->ps.ExecProcNode = ExecMergeAppend; mergestate->ps.ExecProcNode = ExecMergeAppend;
/* If run-time partition pruning is enabled, then set that up now */ /* If run-time partition pruning is enabled, then set that up now */
if (node->part_prune_index >= 0) if (node->part_prune_info != NULL)
{ {
PartitionPruneState *prunestate; PartitionPruneState *prunestate;
@ -93,8 +93,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
*/ */
prunestate = ExecInitPartitionPruning(&mergestate->ps, prunestate = ExecInitPartitionPruning(&mergestate->ps,
list_length(node->mergeplans), list_length(node->mergeplans),
node->part_prune_index, node->part_prune_info,
node->apprelids,
&validsubplans); &validsubplans);
mergestate->ms_prune_state = prunestate; mergestate->ms_prune_state = prunestate;
nplans = bms_num_members(validsubplans); nplans = bms_num_members(validsubplans);

View File

@ -1203,6 +1203,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
ListCell *subpaths; ListCell *subpaths;
int nasyncplans = 0; int nasyncplans = 0;
RelOptInfo *rel = best_path->path.parent; RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;
int nodenumsortkeys = 0; int nodenumsortkeys = 0;
AttrNumber *nodeSortColIdx = NULL; AttrNumber *nodeSortColIdx = NULL;
Oid *nodeSortOperators = NULL; Oid *nodeSortOperators = NULL;
@ -1353,9 +1354,6 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
subplans = lappend(subplans, subplan); subplans = lappend(subplans, subplan);
} }
/* Set below if we find quals that we can use to run-time prune */
plan->part_prune_index = -1;
/* /*
* If any quals exist, they may be useful to perform further partition * If any quals exist, they may be useful to perform further partition
* pruning during execution. Gather information needed by the executor to * pruning during execution. Gather information needed by the executor to
@ -1379,7 +1377,8 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
} }
if (prunequal != NIL) if (prunequal != NIL)
plan->part_prune_index = make_partition_pruneinfo(root, rel, partpruneinfo =
make_partition_pruneinfo(root, rel,
best_path->subpaths, best_path->subpaths,
prunequal); prunequal);
} }
@ -1387,6 +1386,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
plan->appendplans = subplans; plan->appendplans = subplans;
plan->nasyncplans = nasyncplans; plan->nasyncplans = nasyncplans;
plan->first_partial_plan = best_path->first_partial_path; plan->first_partial_plan = best_path->first_partial_path;
plan->part_prune_info = partpruneinfo;
copy_generic_path_info(&plan->plan, (Path *) best_path); copy_generic_path_info(&plan->plan, (Path *) best_path);
@ -1425,6 +1425,7 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
List *subplans = NIL; List *subplans = NIL;
ListCell *subpaths; ListCell *subpaths;
RelOptInfo *rel = best_path->path.parent; RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;
/* /*
* We don't have the actual creation of the MergeAppend node split out * We don't have the actual creation of the MergeAppend node split out
@ -1517,9 +1518,6 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
subplans = lappend(subplans, subplan); subplans = lappend(subplans, subplan);
} }
/* Set below if we find quals that we can use to run-time prune */
node->part_prune_index = -1;
/* /*
* If any quals exist, they may be useful to perform further partition * If any quals exist, they may be useful to perform further partition
* pruning during execution. Gather information needed by the executor to * pruning during execution. Gather information needed by the executor to
@ -1535,13 +1533,13 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
Assert(best_path->path.param_info == NULL); Assert(best_path->path.param_info == NULL);
if (prunequal != NIL) if (prunequal != NIL)
node->part_prune_index = make_partition_pruneinfo(root, rel, partpruneinfo = make_partition_pruneinfo(root, rel,
best_path->subpaths, best_path->subpaths,
prunequal); prunequal);
} }
node->mergeplans = subplans; node->mergeplans = subplans;
node->part_prune_info = partpruneinfo;
/* /*
* If prepare_sort_from_pathkeys added sort columns, but we were told to * If prepare_sort_from_pathkeys added sort columns, but we were told to

View File

@ -522,7 +522,6 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
result->dependsOnRole = glob->dependsOnRole; result->dependsOnRole = glob->dependsOnRole;
result->parallelModeNeeded = glob->parallelModeNeeded; result->parallelModeNeeded = glob->parallelModeNeeded;
result->planTree = top_plan; result->planTree = top_plan;
result->partPruneInfos = glob->partPruneInfos;
result->rtable = glob->finalrtable; result->rtable = glob->finalrtable;
result->permInfos = glob->finalrteperminfos; result->permInfos = glob->finalrteperminfos;
result->resultRelations = glob->resultRelations; result->resultRelations = glob->resultRelations;

View File

@ -350,29 +350,6 @@ set_plan_references(PlannerInfo *root, Plan *plan)
palloc0(list_length(glob->subplans) * sizeof(bool)); palloc0(list_length(glob->subplans) * sizeof(bool));
} }
/* Also fix up the information in PartitionPruneInfos. */
foreach(lc, root->partPruneInfos)
{
PartitionPruneInfo *pruneinfo = lfirst(lc);
ListCell *l;
pruneinfo->root_parent_relids =
offset_relid_set(pruneinfo->root_parent_relids, rtoffset);
foreach(l, pruneinfo->prune_infos)
{
List *prune_infos = lfirst(l);
ListCell *l2;
foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);
/* RT index of the table to which the pinfo belongs. */
pinfo->rtindex += rtoffset;
}
}
}
/* Now fix the Plan tree */ /* Now fix the Plan tree */
result = set_plan_refs(root, plan, rtoffset); result = set_plan_refs(root, plan, rtoffset);
@ -1728,29 +1705,6 @@ set_customscan_references(PlannerInfo *root,
cscan->custom_relids = offset_relid_set(cscan->custom_relids, rtoffset); cscan->custom_relids = offset_relid_set(cscan->custom_relids, rtoffset);
} }
/*
* register_partpruneinfo
* Subroutine for set_append_references and set_mergeappend_references
*
* Add the PartitionPruneInfo from root->partPruneInfos at the given index
* into PlannerGlobal->partPruneInfos and return its index there.
*/
static int
register_partpruneinfo(PlannerInfo *root, int part_prune_index)
{
PlannerGlobal *glob = root->glob;
PartitionPruneInfo *pruneinfo;
Assert(part_prune_index >= 0 &&
part_prune_index < list_length(root->partPruneInfos));
pruneinfo = list_nth_node(PartitionPruneInfo, root->partPruneInfos,
part_prune_index);
glob->partPruneInfos = lappend(glob->partPruneInfos, pruneinfo);
return list_length(glob->partPruneInfos) - 1;
}
/* /*
* set_append_references * set_append_references
* Do set_plan_references processing on an Append * Do set_plan_references processing on an Append
@ -1803,12 +1757,21 @@ set_append_references(PlannerInfo *root,
aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset); aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset);
/* if (aplan->part_prune_info)
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index. {
*/ foreach(l, aplan->part_prune_info->prune_infos)
if (aplan->part_prune_index >= 0) {
aplan->part_prune_index = List *prune_infos = lfirst(l);
register_partpruneinfo(root, aplan->part_prune_index); ListCell *l2;
foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);
pinfo->rtindex += rtoffset;
}
}
}
/* We don't need to recurse to lefttree or righttree ... */ /* We don't need to recurse to lefttree or righttree ... */
Assert(aplan->plan.lefttree == NULL); Assert(aplan->plan.lefttree == NULL);
@ -1870,12 +1833,21 @@ set_mergeappend_references(PlannerInfo *root,
mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset); mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);
/* if (mplan->part_prune_info)
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index. {
*/ foreach(l, mplan->part_prune_info->prune_infos)
if (mplan->part_prune_index >= 0) {
mplan->part_prune_index = List *prune_infos = lfirst(l);
register_partpruneinfo(root, mplan->part_prune_index); ListCell *l2;
foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);
pinfo->rtindex += rtoffset;
}
}
}
/* We don't need to recurse to lefttree or righttree ... */ /* We don't need to recurse to lefttree or righttree ... */
Assert(mplan->plan.lefttree == NULL); Assert(mplan->plan.lefttree == NULL);

View File

@ -210,20 +210,16 @@ static void partkey_datum_from_expr(PartitionPruneContext *context,
/* /*
* make_partition_pruneinfo * make_partition_pruneinfo
* Checks if the given set of quals can be used to build pruning steps * Builds a PartitionPruneInfo which can be used in the executor to allow
* that the executor can use to prune away unneeded partitions. If * additional partition pruning to take place. Returns NULL when
* suitable quals are found then a PartitionPruneInfo is built and tagged * partition pruning would be useless.
* onto the PlannerInfo's partPruneInfos list.
*
* The return value is the 0-based index of the item added to the
* partPruneInfos list or -1 if nothing was added.
* *
* 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list * 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list
* of scan paths for its child rels. * of scan paths for its child rels.
* 'prunequal' is a list of potential pruning quals (i.e., restriction * 'prunequal' is a list of potential pruning quals (i.e., restriction
* clauses that are applicable to the appendrel). * clauses that are applicable to the appendrel).
*/ */
int PartitionPruneInfo *
make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel, make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
List *subpaths, List *subpaths,
List *prunequal) List *prunequal)
@ -337,11 +333,10 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
* quals, then we can just not bother with run-time pruning. * quals, then we can just not bother with run-time pruning.
*/ */
if (prunerelinfos == NIL) if (prunerelinfos == NIL)
return -1; return NULL;
/* Else build the result data structure */ /* Else build the result data structure */
pruneinfo = makeNode(PartitionPruneInfo); pruneinfo = makeNode(PartitionPruneInfo);
pruneinfo->root_parent_relids = parentrel->relids;
pruneinfo->prune_infos = prunerelinfos; pruneinfo->prune_infos = prunerelinfos;
/* /*
@ -364,9 +359,7 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
else else
pruneinfo->other_subplans = NULL; pruneinfo->other_subplans = NULL;
root->partPruneInfos = lappend(root->partPruneInfos, pruneinfo); return pruneinfo;
return list_length(root->partPruneInfos) - 1;
} }
/* /*

View File

@ -57,6 +57,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202304211 #define CATALOG_VERSION_NO 202305041
#endif #endif

View File

@ -123,9 +123,9 @@ typedef struct PartitionPruneState
extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate, extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate,
int n_total_subplans, int n_total_subplans,
int part_prune_index, PartitionPruneInfo *pruneinfo,
Bitmapset *root_parent_relids,
Bitmapset **initially_valid_subplans); Bitmapset **initially_valid_subplans);
extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate, extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate,
bool initial_prune); bool initial_prune);
#endif /* EXECPARTITION_H */ #endif /* EXECPARTITION_H */

View File

@ -623,7 +623,6 @@ typedef struct EState
* ExecRowMarks, or NULL if none */ * ExecRowMarks, or NULL if none */
List *es_rteperminfos; /* List of RTEPermissionInfo */ List *es_rteperminfos; /* List of RTEPermissionInfo */
PlannedStmt *es_plannedstmt; /* link to top of plan tree */ PlannedStmt *es_plannedstmt; /* link to top of plan tree */
List *es_part_prune_infos; /* PlannedStmt.partPruneInfos */
const char *es_sourceText; /* Source text from QueryDesc */ const char *es_sourceText; /* Source text from QueryDesc */
JunkFilter *es_junkFilter; /* top-level junk filter, if any */ JunkFilter *es_junkFilter; /* top-level junk filter, if any */

View File

@ -125,9 +125,6 @@ typedef struct PlannerGlobal
/* "flat" list of AppendRelInfos */ /* "flat" list of AppendRelInfos */
List *appendRelations; List *appendRelations;
/* List of PartitionPruneInfo contained in the plan */
List *partPruneInfos;
/* OIDs of relations the plan depends on */ /* OIDs of relations the plan depends on */
List *relationOids; List *relationOids;
@ -547,9 +544,6 @@ struct PlannerInfo
/* Does this query modify any partition key columns? */ /* Does this query modify any partition key columns? */
bool partColsUpdated; bool partColsUpdated;
/* PartitionPruneInfos added in this query's plan. */
List *partPruneInfos;
}; };

View File

@ -70,9 +70,6 @@ typedef struct PlannedStmt
struct Plan *planTree; /* tree of Plan nodes */ struct Plan *planTree; /* tree of Plan nodes */
List *partPruneInfos; /* List of PartitionPruneInfo contained in the
* plan */
List *rtable; /* list of RangeTblEntry nodes */ List *rtable; /* list of RangeTblEntry nodes */
List *permInfos; /* list of RTEPermissionInfo nodes for rtable List *permInfos; /* list of RTEPermissionInfo nodes for rtable
@ -276,8 +273,8 @@ typedef struct Append
*/ */
int first_partial_plan; int first_partial_plan;
/* Index to PlannerInfo.partPruneInfos or -1 if no run-time pruning */ /* Info for run-time subplan pruning; NULL if we're not doing that */
int part_prune_index; struct PartitionPruneInfo *part_prune_info;
} Append; } Append;
/* ---------------- /* ----------------
@ -311,8 +308,8 @@ typedef struct MergeAppend
/* NULLS FIRST/LAST directions */ /* NULLS FIRST/LAST directions */
bool *nullsFirst pg_node_attr(array_size(numCols)); bool *nullsFirst pg_node_attr(array_size(numCols));
/* Index to PlannerInfo.partPruneInfos or -1 if no run-time pruning */ /* Info for run-time subplan pruning; NULL if we're not doing that */
int part_prune_index; struct PartitionPruneInfo *part_prune_info;
} MergeAppend; } MergeAppend;
/* ---------------- /* ----------------
@ -1414,8 +1411,6 @@ typedef struct PlanRowMark
* Then, since an Append-type node could have multiple partitioning * Then, since an Append-type node could have multiple partitioning
* hierarchies among its children, we have an unordered List of those Lists. * hierarchies among its children, we have an unordered List of those Lists.
* *
* root_parent_relids RelOptInfo.relids of the relation to which the parent
* plan node and this PartitionPruneInfo node belong
* prune_infos List of Lists containing PartitionedRelPruneInfo nodes, * prune_infos List of Lists containing PartitionedRelPruneInfo nodes,
* one sublist per run-time-prunable partition hierarchy * one sublist per run-time-prunable partition hierarchy
* appearing in the parent plan node's subplans. * appearing in the parent plan node's subplans.
@ -1428,7 +1423,6 @@ typedef struct PartitionPruneInfo
pg_node_attr(no_equal, no_query_jumble) pg_node_attr(no_equal, no_query_jumble)
NodeTag type; NodeTag type;
Bitmapset *root_parent_relids;
List *prune_infos; List *prune_infos;
Bitmapset *other_subplans; Bitmapset *other_subplans;
} PartitionPruneInfo; } PartitionPruneInfo;

View File

@ -70,7 +70,7 @@ typedef struct PartitionPruneContext
#define PruneCxtStateIdx(partnatts, step_id, keyno) \ #define PruneCxtStateIdx(partnatts, step_id, keyno) \
((partnatts) * (step_id) + (keyno)) ((partnatts) * (step_id) + (keyno))
extern int make_partition_pruneinfo(struct PlannerInfo *root, extern PartitionPruneInfo *make_partition_pruneinfo(struct PlannerInfo *root,
struct RelOptInfo *parentrel, struct RelOptInfo *parentrel,
List *subpaths, List *subpaths,
List *prunequal); List *prunequal);