Обсуждение: recursive SQL functions
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
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
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
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
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
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
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
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
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