mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +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:
@@ -209,16 +209,20 @@ static void partkey_datum_from_expr(PartitionPruneContext *context,
|
||||
|
||||
/*
|
||||
* make_partition_pruneinfo
|
||||
* Builds a PartitionPruneInfo which can be used in the executor to allow
|
||||
* additional partition pruning to take place. Returns NULL when
|
||||
* partition pruning would be useless.
|
||||
* Checks if the given set of quals can be used to build pruning steps
|
||||
* that the executor can use to prune away unneeded partitions. If
|
||||
* suitable quals are found then a PartitionPruneInfo is built and tagged
|
||||
* onto the PlannerInfo's partPruneInfos list.
|
||||
*
|
||||
* The return value is the 0-based index of the item added to the
|
||||
* partPruneInfos list or -1 if nothing was added.
|
||||
*
|
||||
* 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list
|
||||
* of scan paths for its child rels.
|
||||
* 'prunequal' is a list of potential pruning quals (i.e., restriction
|
||||
* clauses that are applicable to the appendrel).
|
||||
*/
|
||||
PartitionPruneInfo *
|
||||
int
|
||||
make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
||||
List *subpaths,
|
||||
List *prunequal)
|
||||
@@ -332,10 +336,11 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
||||
* quals, then we can just not bother with run-time pruning.
|
||||
*/
|
||||
if (prunerelinfos == NIL)
|
||||
return NULL;
|
||||
return -1;
|
||||
|
||||
/* Else build the result data structure */
|
||||
pruneinfo = makeNode(PartitionPruneInfo);
|
||||
pruneinfo->root_parent_relids = parentrel->relids;
|
||||
pruneinfo->prune_infos = prunerelinfos;
|
||||
|
||||
/*
|
||||
@@ -358,7 +363,9 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
||||
else
|
||||
pruneinfo->other_subplans = NULL;
|
||||
|
||||
return pruneinfo;
|
||||
root->partPruneInfos = lappend(root->partPruneInfos, pruneinfo);
|
||||
|
||||
return list_length(root->partPruneInfos) - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user