Re: return next in recursive function - Mailing list pgsql-general

From Stephan Szabo
Subject Re: return next in recursive function
Date
Msg-id 20031002225211.V85561@megazone.bigpanda.com
Whole thread Raw
In response to Re: return next in recursive function  (Petr Bravenec <pbravenec@solartec.cz>)
List pgsql-general
On Fri, 3 Oct 2003, Petr Bravenec wrote:

> Stephan Szabo napsal(a):
>
> >>create or replace function foo (integer)
> >>          returns setof foo as '
> >>    declare pid     alias for $1;
> >>    declare rec     RECORD;
> >>    BEGIN
> >>    FOR rec in select * from foo
> >>               where foo.pid=pid LOOP
> >>            return next rec;
> >>            raise warning ''uid=% pid=%'',rec.uid,rec.pid;
> >>            select into rec * from foo (rec.uid);
> >>
> >>
> >
> >Shouldn't you be looping over these results in order to return them,
> >something like
> > FOR rec2 in select * from foo(rec.uid) LOOP
> >  return next rec2;
> > END LOOP;
> >
> >Otherwise, why should the results from the other call become results from
> >your call (what if you want to process them and not return all of them, or
> >what if it's a function with a different type?)
>
> Yes, I understand but I expect that the Postgres will try to do what I
> wrote.

AFAICS it is doing exactly what you wrote. It's giving you a row in rec
from the resultset of the recursive call which you do nothing with and
then overwrite back at the top of the loop.

It's not determining it's called recursively or anything of the sort, each
function call has its own result set, there's no implicit union or any
such going on.  That'd be doing something other than what you wrote.


pgsql-general by date:

Previous
From: Dennis Gearon
Date:
Subject: anyone give me some good liniks to ...
Next
From: Alex
Date:
Subject: pg_restore takes ages