Re: Function returning 2 columns evaluated twice when both columns are needed

Поиск
Список
Период
Сортировка
Искать
От
Merlin Moncure
Тема
Re: Function returning 2 columns evaluated twice when both columns are needed
Дата
Msg-id
b42b73150910201712x4b6ce6ccsb79870e4c6cfad15@mail.gmail.com
Ответ на
Список
Дерево обсуждения
Function returning 2 columns evaluated twice when both columns are needed Gerhard Wiesinger <lists@wiesinger.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Tom Lane <tgl@sss.pgh.pa.us>
Re: Function returning 2 columns evaluated twice when both columns are needed Gerhard Wiesinger <lists@wiesinger.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Tom Lane <tgl@sss.pgh.pa.us>
Re: Function returning 2 columns evaluated twice when both columns are needed Gerhard Wiesinger <lists@wiesinger.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Tom Lane <tgl@sss.pgh.pa.us>
Re: Function returning 2 columns evaluated twice when both columns are needed Pavel Stehule <pavel.stehule@gmail.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Merlin Moncure <mmoncure@gmail.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Pavel Stehule <pavel.stehule@gmail.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Merlin Moncure <mmoncure@gmail.com>
Re: Function returning 2 columns evaluated twice when both columns are needed Christophe Pettus <xof@thebuild.com>
On Tue, Oct 20, 2009 at 5:12 PM, Pavel Stehule  wrote:
>> [ shrug... ]  There are other possible reasons why the planner would
>> fail to flatten a subquery, but none of them apply to the example you
>> showed.  And your example function *was* VOLATILE, by default.
>
> I checked this on 8.5 and function is evaluated more time although is immutable.
>
> postgres=# create or replace function foo(out a int, out b int)
> returns record as $$
> begin
> raise notice 'start foo';
> a := 10; b := 20;
> return;
> end;
> $$ language plpgsql immutable;
> CREATE FUNCTION
>
> postgres=# select (foo()).*;

This is because select (func()).* is expanded to mean:
select func(f1), func(f2) ... func(fn);

This is a general issue with '*' because in postgres it means:
'evaluate me for each field of me', not 'return all fields of me'. I
don't think our behavior in this regard is correct (afaict i'm in the
minority though).

merlin
В списке pgsql-general по дате отправления
От: Pavel Stehule
Дата:
От: John
Дата:
FAQ