The following bug has been logged on the website:
Bug reference: 8678
Logged by: Maksym
Email address: maxim.boguk@gmail.com
PostgreSQL version: 9.3.2
Operating system: Linux
Description:
Hi everyone,
One of my client got the problem of multiple-evaluation of the single
volatile function call.
Simplified test case:
CREATE OR REPLACE FUNCTION _test1(OUT val1 float, OUT val2 float) AS
$BODY$
DECLARE
_val float;
BEGIN
_val := random();
val1 := _val;
val2 := _val;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Now good case:
select * from _test1();
val1 | val2
-------------------+-------------------
0.616893119178712 | 0.616893119178712
Wrong case:
select (_test1()).*;
val1 | val2
------------------+-------------------
0.54869711631909 | 0.251445888541639
Wrong case hits especially painful when volatile function performs some
modification of the money-related data.
PS: yes I know such query could be rewritten via LATERAL but it doesn't make
current behavior more correct.