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 commitec38694894
and its fixup589bb81649
. 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:
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user