mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +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:
@ -1791,6 +1791,9 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
|
||||
* Initialize data structure needed for run-time partition pruning and
|
||||
* 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
|
||||
* 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
|
||||
@ -1803,11 +1806,24 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
|
||||
PartitionPruneState *
|
||||
ExecInitPartitionPruning(PlanState *planstate,
|
||||
int n_total_subplans,
|
||||
PartitionPruneInfo *pruneinfo,
|
||||
int part_prune_index,
|
||||
Bitmapset *root_parent_relids,
|
||||
Bitmapset **initially_valid_subplans)
|
||||
{
|
||||
PartitionPruneState *prunestate;
|
||||
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 */
|
||||
ExecAssignExprContext(estate, planstate);
|
||||
|
Reference in New Issue
Block a user