Re: Wierded error in recursive function; debugging ideas? - Mailing list pgsql-sql

From Josh Berkus
Subject Re: Wierded error in recursive function; debugging ideas?
Date
Msg-id 200408111058.15234.josh@agliodbs.com
Whole thread Raw
In response to Re: Wierded error in recursive function; debugging ideas?  (Joe Conway <mail@joeconway.com>)
List pgsql-sql
Joe,

> There is no in_array() function in Postgres that I'm aware of -- you 
> sure that isn't array_in()?

Yep.  That's a cut-and-paste of the exact log message.

> The rest of that error message doesn't seem 
> to be there in 7.4 either. Can we see the function?

Sure:

CREATE OR REPLACE FUNCTION "sf_event_decendants" (integer,integer)
RETURNS text AS '
DECLARE v_event ALIAS for $1;v_user ALIAS for $2;child_list INT[];sub_child TEXT;child_rec RECORD;p_status INT;contfrom
INT;
BEGIN
child_list := ARRAY [ 0 ];
SELECT status INTO p_status
FROM events WHERE event_id = v_event;
IF p_status < 0 THENp_status = -99;
ELSEp_status = 0;
END IF;
FOR child_rec IN SELECT event_id FROM eventsWHERE parent_id = v_event AND status > p_status LOOPchild_list :=
child_rec.event_id|| child_list;IF v_user <> 0 THEN    IF if_get_lock(v_user, ''events'', child_rec.event_id, NULL) <>
''OK''THEN        RETURN ''LOCKED:  One or more of the child events of the current event are 
 
locked by '' ||            ''another user at this time.  You cannot proceed.'';    END IF;END IF;
END LOOP;
FOR child_rec IN SELECT event_id FROM eventsWHERE (continued_id = v_event or event_id = COALESCE(contfrom, 0)) and
status
 
> p_status LOOPchild_list := child_rec.event_id || child_list;IF v_user <> 0 THEN    IF if_get_lock(v_user, ''events'',
child_rec.event_id,NULL) <> ''OK'' THEN        RETURN ''LOCKED:  One or more of the child events of the current event
are
 
locked by '' ||            ''another user at this time.  You cannot proceed.'';    END IF;END IF;
END LOOP;
IF child_list = ARRAY[0] THENRETURN ''0'';
END IF;
FOR child_rec IN SELECT event_id FROM events            WHERE status > p_status            AND event_id = ANY (
child_list)            LOOPsub_child := sf_event_decendants(child_rec.event_id, v_user);IF sub_child <> ''0'' THEN
child_list:= child_list || string_to_array(sub_child, '','')::INT[];    IF v_user <> 0 THEN        IF
if_get_lock(v_user,''events'', child_rec.event_id, NULL) <> ''OK'' THEN            RETURN ''LOCKED:  One or more of the
childevents of the current event are 
 
locked by '' ||                ''another user at this time.  You cannot proceed.'';        END IF;    END IF;END IF;
END LOOP;
RETURN array_to_string(child_list, '','');
END;' LANGUAGE 'plpgsql';



-- 
-Josh Berkus"A developer of Very Little Brain"Aglio Database SolutionsSan Francisco



pgsql-sql by date:

Previous
From: Michael Kleiser
Date:
Subject: Re: Displaying two tables side by side
Next
From: Rod Taylor
Date:
Subject: Re: Displaying two tables side by side