summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c15
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,