From 3e2b849b2f32dc3e03b5fa15d259a3000ccb6f92 Mon Sep 17 00:00:00 2001
From: Richard Guo <riguo@pivotal.io>
Date: Mon, 17 Jun 2019 08:34:47 +0000
Subject: [PATCH] Fix up grouping sets reorder.

---
 src/backend/optimizer/plan/planner.c       |  4 +++
 src/test/regress/expected/groupingsets.out | 41 ++++++++++++++++++++++++++++++
 src/test/regress/sql/groupingsets.sql      |  6 +++++
 3 files changed, 51 insertions(+)

diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index cb897cc..36d78fe 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -3551,6 +3551,10 @@ reorder_grouping_sets(List *groupingsets, List *sortclause)
 				{
 					previous = lappend_int(previous, ref);
 					new_elems = list_delete_int(new_elems, ref);
+
+					/* finished with this grouping set */
+					if (list_length(new_elems) == 0)
+						break;
 				}
 				else
 				{
diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out
index 381ebce..4e3040e 100644
--- a/src/test/regress/expected/groupingsets.out
+++ b/src/test/regress/expected/groupingsets.out
@@ -929,6 +929,47 @@ select sum(ten) from onek group by rollup(four::text), two order by 1;
  2500
 (6 rows)
 
+-- Grouping sets reorder
+explain (costs off, verbose)
+select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a;
+                                    QUERY PLAN                                    
+----------------------------------------------------------------------------------
+ GroupAggregate
+   Output: "*VALUES*".column1, "*VALUES*".column2, "*VALUES*".column3
+   Group Key: "*VALUES*".column3, "*VALUES*".column2, "*VALUES*".column1
+   Group Key: "*VALUES*".column3
+   ->  Sort
+         Output: "*VALUES*".column1, "*VALUES*".column2, "*VALUES*".column3
+         Sort Key: "*VALUES*".column3, "*VALUES*".column2, "*VALUES*".column1
+         ->  Values Scan on "*VALUES*"
+               Output: "*VALUES*".column1, "*VALUES*".column2, "*VALUES*".column3
+(9 rows)
+
+select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a;
+ a | b | v  
+---+---+----
+ 1 | 1 | 10
+   |   | 10
+ 1 | 1 | 11
+   |   | 11
+ 1 | 2 | 12
+   |   | 12
+ 1 | 2 | 13
+   |   | 13
+ 1 | 3 | 14
+   |   | 14
+ 2 | 3 | 15
+   |   | 15
+ 3 | 3 | 16
+   |   | 16
+ 3 | 4 | 17
+   |   | 17
+ 4 | 1 | 18
+   |   | 18
+ 4 | 1 | 19
+   |   | 19
+(20 rows)
+
 -- hashing support
 set enable_hashagg = true;
 -- failure cases
diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql
index 5d64859..88ff042 100644
--- a/src/test/regress/sql/groupingsets.sql
+++ b/src/test/regress/sql/groupingsets.sql
@@ -266,6 +266,12 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou
 select sum(ten) from onek group by two, rollup(four::text) order by 1;
 select sum(ten) from onek group by rollup(four::text), two order by 1;
 
+-- Grouping sets reorder
+explain (costs off, verbose)
+select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a;
+
+select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a;
+
 -- hashing support
 
 set enable_hashagg = true;
-- 
2.7.4

