mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Fix flattening of nested grouping sets.
Previously nested grouping set specifications accidentally weren't flattened, but instead contained the nested specification as a element in the outer list. Fix this by, as actually documented in comments, concatenating the nested set specification into the outer one. Also add tests to prevent this from breaking again. Author: Andrew Gierth, with tests from Jeevan Chalke Reported-By: Jeevan Chalke Discussion: CAM2+6=V5YvuxB+EyN4iH=GbD-XTA435TCNvnDFSD--YvXs+pww@mail.gmail.com Backpatch: 9.5, where grouping sets were introduced
This commit is contained in:
@ -145,6 +145,127 @@ select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum
|
||||
| | 12 | 36
|
||||
(6 rows)
|
||||
|
||||
-- nesting with grouping sets
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((), grouping sets((), grouping sets(())))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
12
|
||||
12
|
||||
12
|
||||
(3 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((), grouping sets((), grouping sets(((a, b)))))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
12
|
||||
12
|
||||
8
|
||||
2
|
||||
2
|
||||
(5 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c))))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
12
|
||||
12
|
||||
6
|
||||
6
|
||||
6
|
||||
6
|
||||
(6 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(a, grouping sets(a, cube(b)))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
12
|
||||
10
|
||||
10
|
||||
8
|
||||
4
|
||||
2
|
||||
2
|
||||
(7 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets((a, (b))))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
8
|
||||
2
|
||||
2
|
||||
(3 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets((a, b)))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
8
|
||||
2
|
||||
2
|
||||
(3 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(a, grouping sets(a), a))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
10
|
||||
10
|
||||
10
|
||||
2
|
||||
2
|
||||
2
|
||||
(6 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
(16 rows)
|
||||
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((a,(a,b)), grouping sets((a,(a,b)),a))
|
||||
order by 1 desc;
|
||||
sum
|
||||
-----
|
||||
10
|
||||
8
|
||||
8
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
(8 rows)
|
||||
|
||||
-- empty input: first is 0 rows, second 1, third 3 etc.
|
||||
select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a);
|
||||
a | b | sum | count
|
||||
|
@ -73,6 +73,35 @@ select grouping(a), a, array_agg(b),
|
||||
select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum
|
||||
from gstest2 group by rollup (a,b) order by rsum, a, b;
|
||||
|
||||
-- nesting with grouping sets
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((), grouping sets((), grouping sets(())))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((), grouping sets((), grouping sets(((a, b)))))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c))))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(a, grouping sets(a, cube(b)))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets((a, (b))))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets((a, b)))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(a, grouping sets(a), a))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a))
|
||||
order by 1 desc;
|
||||
select sum(c) from gstest2
|
||||
group by grouping sets((a,(a,b)), grouping sets((a,(a,b)),a))
|
||||
order by 1 desc;
|
||||
|
||||
-- empty input: first is 0 rows, second 1, third 3 etc.
|
||||
select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a);
|
||||
select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),());
|
||||
|
Reference in New Issue
Block a user