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. regards, tom lane