From 584d521a38dacdf1364928d91b479c761d4d1b4e Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 20 Mar 2018 15:02:23 -0400 Subject: [PATCH 3/3] Allow create_partial_grouping_paths to return NULL. --- src/backend/optimizer/plan/planner.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index fda32b310c..b2627f5288 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -3928,11 +3928,7 @@ create_ordinary_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, * partially grouped paths; that way, later code can easily consider both * parallel and non-parallel approaches to grouping. */ - if ((grouped_rel->consider_parallel && input_rel->partial_pathlist != NIL - && (extra->flags & GROUPING_CAN_PARTIAL_AGG) != 0) || - ((extra->flags & GROUPING_CAN_PARTITIONWISE_AGG) != 0 - && extra->perform_partial_partitionwise_aggregation) || - extra->is_partial_aggregation) + if ((extra->flags & GROUPING_CAN_PARTIAL_AGG) != 0) partially_grouped_rel = create_partial_grouping_paths(root, grouped_rel, @@ -6366,6 +6362,9 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, * All paths for this new upper relation -- both partial and non-partial -- * have been partially aggregated but require a subsequent FinalizeAggregate * step. + * + * NB: This function is allowed to return NULL if it determines that there is + * no real need to create a new RelOptInfo. */ static RelOptInfo * create_partial_grouping_paths(PlannerInfo *root, @@ -6405,6 +6404,19 @@ create_partial_grouping_paths(PlannerInfo *root, if (grouped_rel->consider_parallel && input_rel->partial_pathlist != NIL) cheapest_partial_path = linitial(input_rel->partial_pathlist); + /* + * If we can't partially aggregate partial paths, and we can't partially + * aggregate non-partial paths, then there may not be any point to creating + * a new RelOptInfo after all. However, if partition-wise aggregate is + * a possibility, then we need to create the RelOptInfo anyway, becuase the + * caller may want to add Append paths to it. + */ + if (cheapest_total_path == NULL && + cheapest_partial_path == NULL && + ((extra->flags & GROUPING_CAN_PARTITIONWISE_AGG) == 0 || + !IS_OTHER_REL(input_rel))) + return NULL; + /* * Build a new upper relation to represent the result of partially * aggregating the rows from the input relation. -- 2.14.3 (Apple Git-98)