0003-Allow-create_partial_grouping_paths-to-return-NULL.patch

application/octet-stream

Filename: 0003-Allow-create_partial_grouping_paths-to-return-NULL.patch
Type: application/octet-stream
Part: 0
Message: Re: [HACKERS] Partition-wise aggregation/grouping

Patch

Format: format-patch
Series: patch 0003
Subject: Allow create_partial_grouping_paths to return NULL.
File+
src/backend/optimizer/plan/planner.c 17 5
From 584d521a38dacdf1364928d91b479c761d4d1b4e Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
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)