diff options
Diffstat (limited to 'src/backend/optimizer/plan')
| -rw-r--r-- | src/backend/optimizer/plan/createplan.c | 24 | ||||
| -rw-r--r-- | src/backend/optimizer/plan/planner.c | 1 | ||||
| -rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 88 |
3 files changed, 41 insertions, 72 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 910ffbf1e1..4bb38160b3 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -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 diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 502ccbcea2..1e4dd27dba 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -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; diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 1812db7f2f..f6f8a79354 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -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); @@ -1729,29 +1706,6 @@ set_customscan_references(PlannerInfo *root, } /* - * 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); |
