--
-- One purpose of these tests is to make sure that ORCA can gracefully fall
-- back for these queries. To detect that, turn optimizer_trace_fallback on,
-- and watch for "falling back to planner" messages.
--
-- start_matchignore
-- m/^DETAIL:  GPDB Expression type: .* not supported in DXL/
-- end_matchignore

set optimizer_trace_fallback='on';

create temp table gstest1 (a int, b int, c int, d int, v int);
insert into gstest1 values (1, 5, 10, 0, 100);
insert into gstest1 values (1, 42, 20, 7, 200);
insert into gstest1 values (2, 5, 30, 21, 300);
insert into gstest1 values (2, 42, 40, 53, 400);

-- Orca falls back due to multiple grouping sets specifications referencing
-- duplicate alias columns where column is possibly nulled by ROLLUP or CUBE.
-- This is also a known issue in Postgres. Following threads [1][2] have more
-- details.
--
-- [1] https://www.postgresql.org/message-id/flat/CAHnPFjSdFx_TtNpQturPMkRSJMYaD5rGP2=8iFH9V24-OjHGiQ@mail.gmail.com
-- [2] https://www.postgresql.org/message-id/flat/830269.1656693747@sss.pgh.pa.us
select a as alias1, a as alias2 from gstest1 group by alias1, rollup(alias2);
select a as alias1, a as alias2 from gstest1 group by alias1, cube(alias2);
-- Following does not need to fallback because no ROLLUP/CUBE means neither
-- column needs to be nulled.
select a as alias1, a as alias2 from gstest1 group by alias1, alias2;

-- Orca falls back due to nested grouping sets
select sum(v), b, a, c, d from gstest1 group by grouping sets(a, b, rollup(c, d));

-- Orca falls back when all grouping sets contain the primary key and the target
-- list contains a column that does not appear in any grouping set
create temp table gstest2 (a int primary key, b int, c int, d int, v int);
insert into gstest2 values (1, 1, 1, 1, 1);
insert into gstest2 values (2, 2, 2, 2, 1);
select d from gstest2 group by grouping sets ((a,b), (a));

-- Orca falls back due to HAVING clause with outer references
-- start_ignore
-- The output with relid will not be the same.
select v.c, (select count(*) from gstest1 group by () having v.c) from (values (false),(true)) v(c);
-- end_ignore

-- Orca falls back due to grouping function with multiple arguments
select a, b, grouping(a,b), sum(v), count(*), max(v) from gstest1 group by rollup (a,b);
-- Orca falls back due to grouping function with outer references
select (select grouping(a) from (values(1)) v2(c)) from (values(1, 2)) v1(a, b) group by (a, b);

