mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Move PartitioPruneInfo out of plan nodes into PlannedStmt
The planner will now add a given PartitioPruneInfo to PlannedStmt.partPruneInfos instead of directly to the Append/MergeAppend plan node. What gets set instead in the latter is an index field which points to the list element of PlannedStmt.partPruneInfos containing the PartitioPruneInfo belonging to the plan node. A later commit will make AcquireExecutorLocks() do the initial partition pruning to determine a minimal set of partitions to be locked when validating a plan tree and it will need to consult the PartitioPruneInfos referenced therein to do so. It would be better for the PartitioPruneInfos to be accessible directly than requiring a walk of the plan tree to find them, which is easier when it can be done by simply iterating over PlannedStmt.partPruneInfos. Author: Amit Langote <amitlangote09@gmail.com> Discussion: https://postgr.es/m/CA+HiwqFGkMSge6TgC9KQzde0ohpAycLQuV7ooitEEpbKB0O_mg@mail.gmail.com
This commit is contained in:
@ -348,6 +348,31 @@ set_plan_references(PlannerInfo *root, Plan *plan)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
glob->partPruneInfos = lappend(glob->partPruneInfos, pruneinfo);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -1658,21 +1683,12 @@ set_append_references(PlannerInfo *root,
|
||||
|
||||
aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* PartitionPruneInfos will be added to a list in PlannerGlobal, so update
|
||||
* the index.
|
||||
*/
|
||||
if (aplan->part_prune_index >= 0)
|
||||
aplan->part_prune_index += list_length(root->glob->partPruneInfos);
|
||||
|
||||
/* We don't need to recurse to lefttree or righttree ... */
|
||||
Assert(aplan->plan.lefttree == NULL);
|
||||
@ -1734,21 +1750,12 @@ set_mergeappend_references(PlannerInfo *root,
|
||||
|
||||
mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* PartitionPruneInfos will be added to a list in PlannerGlobal, so update
|
||||
* the index.
|
||||
*/
|
||||
if (mplan->part_prune_index >= 0)
|
||||
mplan->part_prune_index += list_length(root->glob->partPruneInfos);
|
||||
|
||||
/* We don't need to recurse to lefttree or righttree ... */
|
||||
Assert(mplan->plan.lefttree == NULL);
|
||||
|
Reference in New Issue
Block a user