From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Joel Hoffman <joel(dot)hoffman(at)gmail(dot)com> |
Cc: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org> |
Subject: | Re: Multiple evaluation of single reference to function with out parameters |
Date: | 2017-09-23 03:01:29 |
Message-ID: | CAFj8pRAPhebN0L_m_wm+0ebf2691LKOQKJ08+RiBHrawc1hP3A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
2017-09-23 4:49 GMT+02:00 Joel Hoffman <joel(dot)hoffman(at)gmail(dot)com>:
> Thanks for the response. Here's the documentation reference:
>
> https://www.postgresql.org/docs/9.6/static/rowtypes.html#ROWTYPES-USAGE
>
> Not a bug, but I do think it's very surprising behavior.
>
yes, but the fix is very simple - you just need only one level of nested
query more - or you call function from FROM clause.
The reason of this behave is given by implementation, that is very simple.
Nobody had too issues with it and nobody sent a patch to change it.
Regards
Pavel
> Joel
>
>
> On Fri, Sep 22, 2017 at 5:22 PM, David G. Johnston <
> david(dot)g(dot)johnston(at)gmail(dot)com> wrote:
>
>> On Friday, September 22, 2017, Joel Hoffman <joel(dot)hoffman(at)gmail(dot)com>
>> wrote:
>>
>>> If I create a function with more than one out parameter, and then refer
>>> to it inside parentheses as a record, e.g. select (function()).*, the
>>> function appears to be evaluated multiple times, once for every column
>>> returned. This seems to be true regardless of whether it's defined as
>>> volatile or immutable.
>>>
>>> ...
>>
>>> As far as I can tell, this behavior has been the same since at least
>>> version 8.2 and up through 10 beta 4, but I can't find any references to it
>>> and it seems very surprising. It could certainly cause unexpected results
>>> if the function has side effects. Is this a bug?
>>>
>>>
>> It is not a bug or likely to be fixed. LATERAL makes the need for
>> function invocation in the manner you describe nearly unnecessary and you
>> can use OFFSET 0 in other cases to put the function call in a subquery and
>> place the (composite).* expressionin the upper-level.
>>
>> There is a cautionary note somewhere in docs about this. It is a parser
>> byproduct. The star gets expanded at parse time to individual and
>> independent column names. What happens is exactly what you'd expect if you
>> tried to write the query without resorting to using ".*"
>>
>> David J.
>>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2017-09-23 03:19:52 | Re: BUG #14825: enum type: unsafe use? |
Previous Message | Joel Hoffman | 2017-09-23 02:49:22 | Re: Multiple evaluation of single reference to function with out parameters |