Re: Improper const-evaluation of HAVING with grouping sets and subquery pullup
Andrew Gierth <andrew@tao11.riddles.org.uk>
From: Andrew Gierth <andrew@tao11.riddles.org.uk>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Heikki Linnakangas <hlinnaka@iki.fi>, Pg Bugs <pgsql-bugs@postgresql.org>
Date: 2017-10-16T15:41:29Z
Lists: pgsql-bugs
>>>>> "Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes: >> x and y aren't constants, but z is. Tom> OK, but that just means we should put PHV wrapping around only the Tom> grouping-set columns. Well, can we also take advantage of the fact that we know that anything that's not in the grouping-set columns must be in an aggregate argument, and just omit the PHV inside aggregate args? (And even if grouping columns appear inside aggregate args, they are _not_ nulled out there.) Tom> BTW, also need to think about GS expressions, eg Tom> select x+y, sum(z) from (select 1 as x, 2 as y, 3 as z) s Tom> group by grouping sets (x+y); Tom> Not real sure what needs to happen here. That one currently works (note you have to add another grouping set to test it, since the case of exactly one grouping set is reduced to plain GROUP BY) because setrefs fixes up the reference after-the-fact, replacing the outer x+y (or whatever it got munged to) with a Var based on matching the sortgroupref. This currently fails: select (x+y)*1, sum(z) from (select 1 as x, 2 as y, 3 as z) s group by grouping sets (x+y, x); because the logic in setrefs that would normally detect that (x+y) exists in the child tlist doesn't fire because the whole expression was replaced by a constant. With the patch to use PHVs it works, but I admit to some confusion over exactly why. -- Andrew (irc:RhodiumToad)
Commits
-
Fix incorrect handling of subquery pullup in the presence of grouping sets.
- ff99d7761aa4 9.5.11 landed
- d3ca1a6c3721 10.2 landed
- 90947674fc98 11.0 landed
- 6520d4a96928 9.6.7 landed
-
Make setrefs.c match by ressortgroupref even for plain Vars.
- 6a81ba1d4d26 10.1 landed
- 37b4e0fe9964 9.6.6 landed
- 08f1e1f0a47b 11.0 landed
-
Make the upper part of the planner work by generating and comparing Paths.
- 3fc6e2d7f5b6 9.6.0 cited