On Sat, Oct 26, 2024 at 12:21 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
I wrote: > However ... I don't like this implementation, not even a little > bit.
I forgot to mention a third problem, which is that reassigning the alias during subquery pullup means it doesn't happen if subquery pullup doesn't happen. As an example, with your patch:
regression=# explain verbose select * from (values (1), (2)) v(x); QUERY PLAN ---------------------------------------------------- Values Scan on v (cost=0.00..0.03 rows=2 width=4) Output: v.x (2 rows)
regression=# explain verbose select * from (values (1), (random())) v(x); QUERY PLAN ------------------------------------------------------------- Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=8) Output: "*VALUES*".column1 (2 rows)
That's because the volatile function prevents subquery flattening.
Yes, that is by design. As I used is_simple_values() so if the values list is not a simple one, which is not in this case, the alias won't be reassigned.