diff options
Diffstat (limited to 'src/backend/optimizer/plan')
| -rw-r--r-- | src/backend/optimizer/plan/planner.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 34ce39c56a..fde0c6d141 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -1888,12 +1888,17 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) * results. */ bool need_sort_for_grouping = false; + Plan *checkplan; + bool insert_gather = false; /* Try to run it in a worker. */ if (best_path->parallel_safe) + { + insert_gather = true; best_path = (Path *) create_single_copy_gather_path(root, final_rel, best_path, NULL); + } current_pathkeys = best_path->pathkeys; @@ -1912,6 +1917,14 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) result_plan = create_plan(root, best_path); + checkplan = result_plan; + if (insert_gather) + { + Assert(IsA(checkplan, Gather)); + checkplan = outerPlan(checkplan); + Assert(!IsA(checkplan, Gather)); + } + /* * create_plan returns a plan with just a "flat" tlist of required * Vars. Usually we need to insert the sub_tlist as the tlist of @@ -1926,7 +1939,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) * we need, we must insert a Result node to project the * desired tlist. */ - if (!is_projection_capable_plan(result_plan) && + if (!is_projection_capable_plan(checkplan) && !tlist_same_exprs(sub_tlist, result_plan->targetlist)) { result_plan = (Plan *) make_result(root, |
