From: | Merlin Moncure <mmoncure(at)gmail(dot)com> |
---|---|
To: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
Cc: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Gerhard Wiesinger <lists(at)wiesinger(dot)com>, pgsql-general(at)postgresql(dot)org |
Subject: | Re: Function returning 2 columns evaluated twice when both columns are needed |
Date: | 2009-10-21 00:12:07 |
Message-ID: | b42b73150910201712x4b6ce6ccsb79870e4c6cfad15@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Tue, Oct 20, 2009 at 5:12 PM, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> 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
From | Date | Subject | |
---|---|---|---|
Next Message | John | 2009-10-21 00:43:48 | Re: multi-company design/structure ? |
Previous Message | Pavel Stehule | 2009-10-20 21:12:43 | Re: Function returning 2 columns evaluated twice when both columns are needed |