Re: Weird behaviour

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Vlad Arkhipov <arhipov(at)dc(dot)baikal(dot)ru>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Weird behaviour
Date: 2012-03-14 15:02:24
Message-ID: 628.1331737344@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Vlad Arkhipov <arhipov(at)dc(dot)baikal(dot)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

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Kohei KaiGai 2012-03-14 15:10:39 Re: [v9.2] Add GUC sepgsql.client_label
Previous Message David Fetter 2012-03-14 14:59:34 Re: VALID UNTIL