mirror of
https://github.com/postgres/postgres.git
synced 2026-01-05 23:38:41 +03:00
Allow pushdown of HAVING clauses with grouping sets
In some cases, we may want to transfer a HAVING clause into WHERE in hopes of eliminating tuples before aggregation instead of after. Previously, we couldn't do this if there were any nonempty grouping sets, because we didn't have a way to tell if the HAVING clause referenced any columns that were nullable by the grouping sets, and moving such a clause into WHERE could potentially change the results. Now, with expressions marked nullable by grouping sets with the RT index of the RTE_GROUP RTE, it is much easier to identify those clauses that reference any nullable-by-grouping-sets columns: we just need to check if the RT index of the RTE_GROUP RTE is present in the clause. For other HAVING clauses, they can be safely pushed down. Author: Richard Guo Discussion: https://postgr.es/m/CAMbWs4-NpzPgtKU=hgnvyn+J-GanxQCjrUi7piNzZ=upiCV=2Q@mail.gmail.com
This commit is contained in:
@@ -279,6 +279,11 @@ explain (costs off)
|
||||
select v.c, (select count(*) from gstest2 group by () having v.c)
|
||||
from (values (false),(true)) v(c) order by v.c;
|
||||
|
||||
-- test pushdown of HAVING clause that does not reference any columns that are nullable by grouping sets
|
||||
explain (costs off)
|
||||
select a, b, count(*) from gstest2 group by grouping sets ((a, b), (a)) having a > 1 and b > 1;
|
||||
select a, b, count(*) from gstest2 group by grouping sets ((a, b), (a)) having a > 1 and b > 1;
|
||||
|
||||
-- HAVING with GROUPING queries
|
||||
select ten, grouping(ten) from onek
|
||||
group by grouping sets(ten) having grouping(ten) >= 0
|
||||
|
||||
Reference in New Issue
Block a user