create_non_partial_paths.patch
text/x-patch
Filename: create_non_partial_paths.patch
Type: text/x-patch
Part: 3
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/planner.c | 26 | 11 |
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;