mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +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:
@ -825,6 +825,7 @@ InitPlan(QueryDesc *queryDesc, int eflags)
|
||||
ExecInitRangeTable(estate, rangeTable);
|
||||
|
||||
estate->es_plannedstmt = plannedstmt;
|
||||
estate->es_part_prune_infos = plannedstmt->partPruneInfos;
|
||||
|
||||
/*
|
||||
* Next, build the ExecRowMark array from the PlanRowMark(s), if any.
|
||||
|
@ -183,6 +183,7 @@ ExecSerializePlan(Plan *plan, EState *estate)
|
||||
pstmt->dependsOnRole = false;
|
||||
pstmt->parallelModeNeeded = false;
|
||||
pstmt->planTree = plan;
|
||||
pstmt->partPruneInfos = estate->es_part_prune_infos;
|
||||
pstmt->rtable = estate->es_range_table;
|
||||
pstmt->resultRelations = NIL;
|
||||
pstmt->appendRelations = NIL;
|
||||
|
@ -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);
|
||||
|
@ -119,6 +119,7 @@ CreateExecutorState(void)
|
||||
estate->es_relations = NULL;
|
||||
estate->es_rowmarks = NULL;
|
||||
estate->es_plannedstmt = NULL;
|
||||
estate->es_part_prune_infos = NIL;
|
||||
|
||||
estate->es_junkFilter = NULL;
|
||||
|
||||
|
@ -134,7 +134,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
|
||||
appendstate->as_begun = false;
|
||||
|
||||
/* If run-time partition pruning is enabled, then set that up now */
|
||||
if (node->part_prune_info != NULL)
|
||||
if (node->part_prune_index >= 0)
|
||||
{
|
||||
PartitionPruneState *prunestate;
|
||||
|
||||
@ -145,7 +145,8 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
|
||||
*/
|
||||
prunestate = ExecInitPartitionPruning(&appendstate->ps,
|
||||
list_length(node->appendplans),
|
||||
node->part_prune_info,
|
||||
node->part_prune_index,
|
||||
node->apprelids,
|
||||
&validsubplans);
|
||||
appendstate->as_prune_state = prunestate;
|
||||
nplans = bms_num_members(validsubplans);
|
||||
|
@ -82,7 +82,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
|
||||
mergestate->ps.ExecProcNode = ExecMergeAppend;
|
||||
|
||||
/* If run-time partition pruning is enabled, then set that up now */
|
||||
if (node->part_prune_info != NULL)
|
||||
if (node->part_prune_index >= 0)
|
||||
{
|
||||
PartitionPruneState *prunestate;
|
||||
|
||||
@ -93,7 +93,8 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
|
||||
*/
|
||||
prunestate = ExecInitPartitionPruning(&mergestate->ps,
|
||||
list_length(node->mergeplans),
|
||||
node->part_prune_info,
|
||||
node->part_prune_index,
|
||||
node->apprelids,
|
||||
&validsubplans);
|
||||
mergestate->ms_prune_state = prunestate;
|
||||
nplans = bms_num_members(validsubplans);
|
||||
|
Reference in New Issue
Block a user