v1-0001-Fix-handling-of-outer-GroupingFunc-within-subqueries.patch
application/octet-stream
Filename: v1-0001-Fix-handling-of-outer-GroupingFunc-within-subqueries.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Fix handling of outer GroupingFunc within subqueries
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/subselect.c | 18 | 10 |
| src/test/regress/expected/groupingsets.out | 45 | 0 |
| src/test/regress/sql/groupingsets.sql | 9 | 0 |
From 94a800434b670725a24e41a74ca6fcbb0ad6989a Mon Sep 17 00:00:00 2001
From: Richard Guo <guofenglinux@gmail.com>
Date: Fri, 9 Jul 2021 13:52:09 +0800
Subject: [PATCH] Fix handling of outer GroupingFunc within subqueries
---
src/backend/optimizer/plan/subselect.c | 28 +++++++++-----
src/test/regress/expected/groupingsets.out | 45 ++++++++++++++++++++++
src/test/regress/sql/groupingsets.sql | 9 +++++
3 files changed, 72 insertions(+), 10 deletions(-)
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 0881a208ac..2cae6cefc1 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -356,15 +356,17 @@ build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot,
Node *arg = pitem->item;
/*
- * The Var, PlaceHolderVar, or Aggref has already been adjusted to
- * have the correct varlevelsup, phlevelsup, or agglevelsup.
+ * The Var, PlaceHolderVar, Aggref or GroupingFunc has already been
+ * adjusted to have the correct varlevelsup, phlevelsup, or
+ * agglevelsup.
*
- * If it's a PlaceHolderVar or Aggref, its arguments might contain
- * SubLinks, which have not yet been processed (see the comments for
- * SS_replace_correlation_vars). Do that now.
+ * If it's a PlaceHolderVar, Aggref or GroupingFunc, its arguments
+ * might contain SubLinks, which have not yet been processed (see the
+ * comments for SS_replace_correlation_vars). Do that now.
*/
if (IsA(arg, PlaceHolderVar) ||
- IsA(arg, Aggref))
+ IsA(arg, Aggref) ||
+ IsA(arg, GroupingFunc))
arg = SS_process_sublinks(root, arg, false);
splan->parParam = lappend_int(splan->parParam, pitem->paramId);
@@ -1959,10 +1961,11 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context)
}
/*
- * Don't recurse into the arguments of an outer PHV or aggregate here. Any
- * SubLinks in the arguments have to be dealt with at the outer query
- * level; they'll be handled when build_subplan collects the PHV or Aggref
- * into the arguments to be passed down to the current subplan.
+ * Don't recurse into the arguments of an outer PHV, aggregate or
+ * GroupingFunc here. Any SubLinks in the arguments have to be dealt with
+ * at the outer query level; they'll be handled when build_subplan collects
+ * the PHV, Aggref or GroupingFunc into the arguments to be passed down to
+ * the current subplan.
*/
if (IsA(node, PlaceHolderVar))
{
@@ -1974,6 +1977,11 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context)
if (((Aggref *) node)->agglevelsup > 0)
return node;
}
+ else if (IsA(node, GroupingFunc))
+ {
+ if (((GroupingFunc *) node)->agglevelsup > 0)
+ return node;
+ }
/*
* We should never see a SubPlan expression in the input (since this is
diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out
index 4c467c1b15..29e6b52a45 100644
--- a/src/test/regress/expected/groupingsets.out
+++ b/src/test/regress/expected/groupingsets.out
@@ -2040,4 +2040,49 @@ order by a, b, c;
| |
(11 rows)
+-- test handling of outer GroupingFunc within subqueries
+explain (costs off)
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1);
+ QUERY PLAN
+---------------------------
+ MixedAggregate
+ Hash Key: $2
+ Group Key: ()
+ InitPlan 1 (returns $1)
+ -> Result
+ InitPlan 3 (returns $2)
+ -> Result
+ -> Result
+ SubPlan 2
+ -> Result
+(10 rows)
+
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1);
+ grouping
+----------
+ 1
+ 0
+(2 rows)
+
+explain (costs off)
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1;
+ QUERY PLAN
+---------------------------
+ GroupAggregate
+ Group Key: $2
+ InitPlan 1 (returns $1)
+ -> Result
+ InitPlan 3 (returns $2)
+ -> Result
+ -> Result
+ SubPlan 2
+ -> Result
+(9 rows)
+
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1;
+ grouping
+----------
+ 0
+(1 row)
+
-- end
diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql
index 3944944704..c0786bbed8 100644
--- a/src/test/regress/sql/groupingsets.sql
+++ b/src/test/regress/sql/groupingsets.sql
@@ -555,4 +555,13 @@ from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c)
group by rollup(a, b), rollup(a, c)
order by a, b, c;
+-- test handling of outer GroupingFunc within subqueries
+explain (costs off)
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1);
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1);
+
+explain (costs off)
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1;
+select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1;
+
-- end
--
2.31.0