From 3e2b849b2f32dc3e03b5fa15d259a3000ccb6f92 Mon Sep 17 00:00:00 2001 From: Richard Guo 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