diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index e8f6cc5..8ceef22 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -195,12 +195,13 @@ static void add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, double dNumGroups, List *havingQual); static void add_paths_to_partial_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, - RelOptInfo *partial_grouped_rel, + RelOptInfo *partially_grouped_rel, AggClauseCosts *agg_partial_costs, grouping_sets_data *gd, bool can_sort, - bool can_hash, - List *havingQual); + bool can_hash); +static void create_non_partial_paths(PlannerInfo *root, + RelOptInfo *partially_grouped_rel); static bool can_parallel_agg(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel, const AggClauseCosts *agg_costs); @@ -3838,8 +3839,10 @@ create_grouping_paths(PlannerInfo *root, add_paths_to_partial_grouping_rel(root, input_rel, partially_grouped_rel, &agg_partial_costs, - gd, can_sort, can_hash, - (List *) parse->havingQual); + gd, can_sort, can_hash); + + /* Add Gather or Gather Merge atop cheapest partial path. */ + create_non_partial_paths(root, partially_grouped_rel); } /* Build final grouping paths */ @@ -6224,8 +6227,7 @@ add_paths_to_partial_grouping_rel(PlannerInfo *root, AggClauseCosts *agg_partial_costs, grouping_sets_data *gd, bool can_sort, - bool can_hash, - List *havingQual) + bool can_hash) { Query *parse = root->parse; Path *cheapest_partial_path = linitial(input_rel->partial_pathlist); @@ -6332,13 +6334,26 @@ add_paths_to_partial_grouping_rel(PlannerInfo *root, UPPERREL_PARTIAL_GROUP_AGG, input_rel, partially_grouped_rel); } +} - /* - * Try adding Gather or Gather Merge to partial paths to produce - * non-partial paths. - */ +/* + * create_non_partial_paths + * + * Try adding Gather or Gather Merge to partial paths to produce non-partial + * paths. + */ +static void +create_non_partial_paths(PlannerInfo *root, + RelOptInfo *partially_grouped_rel) +{ + Path *cheapest_partial_path; + + /* Gather all partial paths */ generate_gather_paths(root, partially_grouped_rel, true); + /* Get cheapest partial path from partially_grouped_rel */ + cheapest_partial_path = linitial(partially_grouped_rel->partial_pathlist); + /* * generate_gather_paths won't consider sorting the cheapest path to match * the group keys and then applying a Gather Merge node to the result;