Could anyone please explain the behaviour of Postgres in the cases
below? 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.
postgres=# select version(); version
---------------------------------------------------------------------------------------------------------------
PostgreSQL9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC)
4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
(1 row)
postgres=# create or replace function f()
postgres-# returns text as $$
postgres$# begin
postgres$# raise exception 'here';
postgres$# end;
postgres$# $$ language plpgsql immutable;
postgres=# select t.x
postgres-# from (
postgres(# select t.x, t.x || f()
postgres(# from (values(1)) as t(x)
postgres(# ) t;
ERROR: here
postgres=# select t.x
postgres-# from (
postgres(# select t.x, t.x::text || f()
postgres(# from (values(1)) as t(x)
postgres(# ) t; x
--- 1
(1 row)
postgres=# explain select t.x
postgres-# from (
postgres(# select t.x, t.x || f()
postgres(# from (values(1)) as t(x)
postgres(# ) t;
ERROR: here