Vlad Arkhipov <arhipov@dc.baikal.ru> writes:
> Could anyone please explain the behaviour of Postgres in the cases
> below?
I think it has something to do with anytextcat() being mistakenly marked
as volatile, thus preventing flattening of the subquery in the cases
where you don't explicitly coerce the integer to text. When the
subquery does get flattened, that results in discarding the troublesome
expression as being unreferenced, so no error. HEAD doesn't throw the
error for either case, thanks to commit
3db6524fe63f0598dcb2b307bb422bc126f2b15d.
> It evaluates an unused expression t.x || t.y in the first case
> but doesn't do it in the second one. It's also strange that the last
> explain throws an error.
I think your expectations need adjustment: what is strange is not
getting the error, but failing to get it. In general the planner
assumes that it can freely evaluate immutable functions, and so this
query typically *will* throw an error during constant-simplification.
In some of these phrasings you manage to avoid that because the
expression is discarded as unreferenced before const-simplification
gets run, but that's an implementation artifact that should not
be relied on.
regards, tom lane