BUG #8678: Multiple evaluation single volatile function in select statement - Mailing list pgsql-bugs

From maxim.boguk@gmail.com
Subject BUG #8678: Multiple evaluation single volatile function in select statement
Date
Msg-id E1Vr5Yt-0006cV-6e@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #8678: Multiple evaluation single volatile function in select statement  (David Johnston <polobo@yahoo.com>)
List pgsql-bugs
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.

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: xlog.c has executable permission in git
Next
From: "timi"
Date:
Subject: hi,postgresql bug