Thread: recursive SQL functions

recursive SQL functions

From
Don Baccus
Date:
Is there any reason why recursive SQL functions are not allowed in PG 7.2?

After all this:

create function foo() returns setof integer as 'select 1'
language 'sql';

create or replace function foo() returns setof integer as
'select foo()'
language 'sql';

Works fine ... (until you call it and run out of stack space!)

It turns out that with the aid of a very simple and efficient recursive 
SQL function it is quite easy to devise a key structure for trees that 
scales very, very well.  Probably better than using hierarchical 
("connect by") queries with an appropriate parent foreign key in Oracle, 
though I haven't done any serious benchmarking yet.

This is important for the OpenACS project which uses a filesystem 
paradigm to organize content in many of its packages.

One of our volunteer hackers figured out an ugly kludge that lets us 
define a recursive SQL function in PG 7.1 and it works great, leading to 
extremely efficient queries that work on the parents of a given node.

We were thinking we could just declare the function directly in PG 7.2 
but instead found we have to resort to a kludge similar to the example 
above in order to do it.  It's a far nicer kludge than our PG 7.1 hack, 
believe me, but we were hoping for a clean define of a recursive function.

SQL functions can return rowsets but recursive ones can't be defined 
directly.

Recursive PL/pgSQL functions can be defined directly but they can't 
return rowsets.

Sniff...sniff...sniff [:)]

-- 
Don Baccus
Portland, OR
http://donb.photo.net, http://birdnotes.net, http://openacs.org



Re: recursive SQL functions

From
Don Baccus
Date:
Tom Lane wrote:


> Aside from the forward-reference problem, which seems easy enough to
> solve, I think there may be some performance issues that'd have to be
> dealt with (memory leaks and so forth).

OK, that's reasonable.  If potential memory leaks are only for the 
duration of a transaction I'm not worried (in regard to the one 
recursive function we're using) as it's cachable and our trees not very 
deep.

I have found one bug that crashed the backend if a recursive function's 
called.  Are you interested in it, since folks can now define them 
semi-officially (if a bit unconventially) via CREATE AND REPLACE?

-- 
Don Baccus
Portland, OR
http://donb.photo.net, http://birdnotes.net, http://openacs.org



Re: recursive SQL functions

From
Tom Lane
Date:
Don Baccus <dhogaza@pacifier.com> writes:
> I have found one bug that crashed the backend if a recursive function's 
> called.  Are you interested in it,

You bet.  Crashes are always interesting ...
        regards, tom lane


Re: recursive SQL functions

From
Tom Lane
Date:
Don Baccus <dhogaza@pacifier.com> writes:
> Is there any reason why recursive SQL functions are not allowed in PG 7.2?

It's been discussed, cf
http://fts.postgresql.org/db/mw/msg.html?mid=1038929
but no one got around to it for 7.2.

Aside from the forward-reference problem, which seems easy enough to
solve, I think there may be some performance issues that'd have to be
dealt with (memory leaks and so forth).
        regards, tom lane


Re: recursive SQL functions

From
Don Baccus
Date:
Tom Lane wrote:

> Don Baccus <dhogaza@pacifier.com> writes:
> 
>>I have found one bug that crashed the backend if a recursive function's 
>>called.  Are you interested in it,
>>
> 
> You bet.  Crashes are always interesting ...


Darn ... dies in PG 7.1 works in PG 7.2 :)


-- 
Don Baccus
Portland, OR
http://donb.photo.net, http://birdnotes.net, http://openacs.org



Re: recursive SQL functions

From
Peter Eisentraut
Date:
Tom Lane writes:

> Don Baccus <dhogaza@pacifier.com> writes:
> > Is there any reason why recursive SQL functions are not allowed in PG 7.2?
>
> It's been discussed, cf
> http://fts.postgresql.org/db/mw/msg.html?mid=1038929
> but no one got around to it for 7.2.
>
> Aside from the forward-reference problem, which seems easy enough to
> solve, I think there may be some performance issues that'd have to be
> dealt with (memory leaks and so forth).

I've prepared a patch for recursive SQL functions.  I assume these memory
leaks "and so forth" that you speak of are just issues of quality, not
something that should prevent the use of recursive functions altogether.

-- 
Peter Eisentraut   peter_e@gmx.net



Re: recursive SQL functions

From
Tom Lane
Date:
Peter Eisentraut <peter_e@gmx.net> writes:
> I've prepared a patch for recursive SQL functions.  I assume these memory
> leaks "and so forth" that you speak of are just issues of quality, not
> something that should prevent the use of recursive functions altogether.

I suspect it would not work to re-use a query plan tree at multiple
recursion levels (someday, plan trees should be read-only during
execution, but they ain't now).  As long as you are making a new
plan tree for each recursive entry, it should work ...
        regards, tom lane


Re: recursive SQL functions

From
Peter Eisentraut
Date:
Tom Lane writes:

> I suspect it would not work to re-use a query plan tree at multiple
> recursion levels (someday, plan trees should be read-only during
> execution, but they ain't now).  As long as you are making a new
> plan tree for each recursive entry, it should work ...

ISTM that this is already what's happening.  Each level gets a new plan
tree.

-- 
Peter Eisentraut   peter_e@gmx.net



Re: recursive SQL functions

From
Tom Lane
Date:
Peter Eisentraut <peter_e@gmx.net> writes:
> ISTM that this is already what's happening.  Each level gets a new plan
> tree.

Fine then.  I wasn't sure if that'd fall out of the existing behavior
or not...
        regards, tom lane