Postgres and recursion

Lists: pgsql-novice
From: glenn <vmstech(at)tpg(dot)com(dot)au>
To: "pgsql-novice(at)postgresql(dot)org" <pgsql-novice(at)postgresql(dot)org>
Subject: Postgres and recursion
Date: 2003-02-27 03:16:39
Message-ID: 1046315799.9243.12.camel@thor.valhalla
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice

Hi all
How well does postgres handle recursion?
I've got this simple function which climbs up a 'selfjoin' tree called
job, and reports back the id of the root of the tree. It seemed to work
in 7.2 (which I'm told doesn't recurse???), but I've just upgraded to
7.3.2 (i.e debians latest) and when I execute it, the server kicks me
off, like so:

vmspj=# select fx_root_job(2);
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!#

Should I abandon this approach altogether?
Thanks
Glenn

--------------
create or replace function fx_root_job(int4) returns int4 as '

declare
x int4;
returnvalue int4;
begin
select into x id_parent_ from job
where id_ = $1;
if x = $1 or x = 0 then
returnvalue = $1;
else
returnvalue = fx_root_job( x );
end if;
return returnvalue;
end;' language 'plpgsql';


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: glenn <vmstech(at)tpg(dot)com(dot)au>
Cc: "pgsql-novice(at)postgresql(dot)org" <pgsql-novice(at)postgresql(dot)org>
Subject: Re: Postgres and recursion
Date: 2003-02-27 06:46:04
Message-ID: 8971.1046328364@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice

glenn <vmstech(at)tpg(dot)com(dot)au> writes:
> I've got this simple function which climbs up a 'selfjoin' tree called
> job, and reports back the id of the root of the tree. It seemed to work
> in 7.2 (which I'm told doesn't recurse???), but I've just upgraded to
> 7.3.2 (i.e debians latest) and when I execute it, the server kicks me
> off, like so:

That sounds like a bug, but you have not provided enough detail to let
anyone try to reproduce it --- the function uses a table that you
haven't described, and any specific call would depend on the contents
of the table, which you haven't given.

The function does appear to be capable of going into infinite recursion
if the table contents are wrong (eg two nodes pointing at each other),
but AFAICS that would lead to stack-overflow coredump in any PG version.

regards, tom lane