Commit 144666f6 authored by Andres Freund's avatar Andres Freund

Build column mapping for grouping sets in all required cases.

The previous coding frequently failed to fail because for one it's
unusual to have rollup clauses with one column, and for another
sometimes the wrong mapping didn't cause obvious problems.

Author: Jeevan Chalke
Reviewed-By: Andrew Gierth
Discussion: CAM2+6=W=9=hQOipH0HAPbkun3Z3TFWij_EiHue0_6UX=oR=1kw@mail.gmail.com
Backpatch: 9.5, where grouping sets were introduced
parent cf80ddee
...@@ -2401,13 +2401,8 @@ build_grouping_chain(PlannerInfo *root, ...@@ -2401,13 +2401,8 @@ build_grouping_chain(PlannerInfo *root,
* Prepare the grpColIdx for the real Agg node first, because we may need * Prepare the grpColIdx for the real Agg node first, because we may need
* it for sorting * it for sorting
*/ */
if (list_length(rollup_groupclauses) > 1) if (parse->groupingSets)
{ top_grpColIdx = remap_groupColIdx(root, llast(rollup_groupclauses));
Assert(rollup_lists && llast(rollup_lists));
top_grpColIdx =
remap_groupColIdx(root, llast(rollup_groupclauses));
}
/* /*
* If we need a Sort operation on the input, generate that. * If we need a Sort operation on the input, generate that.
......
...@@ -587,4 +587,27 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou ...@@ -587,4 +587,27 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou
{"(2,0,0,250)","(2,0,2,250)","(2,0,,500)","(2,1,1,250)","(2,1,3,250)","(2,1,,500)","(2,,0,250)","(2,,1,250)","(2,,2,250)","(2,,3,250)","(2,,,1000)"} {"(2,0,0,250)","(2,0,2,250)","(2,0,,500)","(2,1,1,250)","(2,1,3,250)","(2,1,,500)","(2,,0,250)","(2,,1,250)","(2,,2,250)","(2,,3,250)","(2,,,1000)"}
(2 rows) (2 rows)
-- Grouping on text columns
select sum(ten) from onek group by two, rollup(four::text) order by 1;
sum
------
1000
1000
1250
1250
2000
2500
(6 rows)
select sum(ten) from onek group by rollup(four::text), two order by 1;
sum
------
1000
1000
1250
1250
2000
2500
(6 rows)
-- end -- end
...@@ -162,4 +162,8 @@ group by rollup(ten); ...@@ -162,4 +162,8 @@ group by rollup(ten);
select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten; select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten;
select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a); select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a);
-- Grouping on text columns
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;
-- end -- end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment