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;
