| From: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> | 
|---|---|
| To: | Kluge <kluge(at)despammed(dot)com> | 
| Cc: | <pgsql-sql(at)postgresql(dot)org> | 
| Subject: | Re: plpgsql recursion | 
| Date: | 2003-05-20 17:47:06 | 
| Message-ID: | 20030520104342.L69760-100000@megazone23.bigpanda.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-sql | 
On Tue, 20 May 2003, Kluge wrote:
> Greetings!
> I have a table like:
>
> node parent
>    1       2
>    2       3
>    3       4
>
> Since i traverse this table with a recursive function, i want to avoid
> infinite recursion loop. I have wrote a function to check that a new record
> does not create a circular dependency. The function i wrote is as follow:
>
> CREATE OR REPLACE FUNCTION dba_test(INTEGER,INTEGER) RETURNS TEXT AS '
>   DECLARE
>     traversing ALIAS FOR $1;
>     testing ALIAS FOR $2;
>     t_rec RECORD;
>   BEGIN
>     FOR t_rec IN SELECT node,parent FROM dba_test WHERE parent = traversing
> LOOP
>       IF t_rec.node = testing THEN
>         RETURN ''Circular'';
>       ELSE
>         PERFORM dba_test(t_rec.node,testing);
Here you're calling dba_test recursively and ignoring its result and going
on.  I don't think that'll do what you want.  If parent is unique, I think
you can just RETURN dba_test(t_rec.node, testing).  If it's not, you'll
have to do some additional work to return the correct result.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Stephan Szabo | 2003-05-20 17:49:42 | Re: how to do this query? | 
| Previous Message | Jan Bodey | 2003-05-20 17:39:50 | Re: Date comparison question |