1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"

This reverts commit ec38694894 and its fixup 589bb81649.

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
16 changed files with 63 additions and 135 deletions

View File

@ -1203,6 +1203,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
ListCell *subpaths;
int nasyncplans = 0;
RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;
int nodenumsortkeys = 0;
AttrNumber *nodeSortColIdx = NULL;
Oid *nodeSortOperators = NULL;
@ -1353,9 +1354,6 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
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
* pruning during execution. Gather information needed by the executor to
@ -1379,14 +1377,16 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
}
if (prunequal != NIL)
plan->part_prune_index = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
partpruneinfo =
make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
}
plan->appendplans = subplans;
plan->nasyncplans = nasyncplans;
plan->first_partial_plan = best_path->first_partial_path;
plan->part_prune_info = partpruneinfo;
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;
ListCell *subpaths;
RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;
/*
* 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);
}
/* 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
* 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);
if (prunequal != NIL)
node->part_prune_index = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
partpruneinfo = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
}
node->mergeplans = subplans;
node->part_prune_info = partpruneinfo;
/*
* 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->parallelModeNeeded = glob->parallelModeNeeded;
result->planTree = top_plan;
result->partPruneInfos = glob->partPruneInfos;
result->rtable = glob->finalrtable;
result->permInfos = glob->finalrteperminfos;
result->resultRelations = glob->resultRelations;

View File

@ -350,29 +350,6 @@ set_plan_references(PlannerInfo *root, Plan *plan)
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 */
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);
}
/*
* 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
* 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);
/*
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
*/
if (aplan->part_prune_index >= 0)
aplan->part_prune_index =
register_partpruneinfo(root, aplan->part_prune_index);
if (aplan->part_prune_info)
{
foreach(l, aplan->part_prune_info->prune_infos)
{
List *prune_infos = lfirst(l);
ListCell *l2;
foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);
pinfo->rtindex += rtoffset;
}
}
}
/* We don't need to recurse to lefttree or righttree ... */
Assert(aplan->plan.lefttree == NULL);
@ -1870,12 +1833,21 @@ set_mergeappend_references(PlannerInfo *root,
mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);
/*
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
*/
if (mplan->part_prune_index >= 0)
mplan->part_prune_index =
register_partpruneinfo(root, mplan->part_prune_index);
if (mplan->part_prune_info)
{
foreach(l, mplan->part_prune_info->prune_infos)
{
List *prune_infos = lfirst(l);
ListCell *l2;
foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);
pinfo->rtindex += rtoffset;
}
}
}
/* We don't need to recurse to lefttree or righttree ... */
Assert(mplan->plan.lefttree == NULL);