CREATE OR REPLACE FUNCTION tree_insert() RETURNS trigger AS ' DECLARE i RECORD; child integer[2]; BEGIN FOR i IN EXECUTE ''SELECT node, kids FROM ''||TG_RELNAME||''_tree WHERE id = ''||NEW.parent LOOP child := tree_child(i.node, i.kids+1); EXECUTE ''INSERT INTO ''||TG_RELNAME||''_tree (id, node, kids) '' ||''VALUES(''||NEW.id||'', ARRAY[''||child[1]||'',''||child[2]||''], 0)''; EXECUTE ''UPDATE ''||TG_RELNAME||''_tree SET kids = kids + 1 WHERE id = ''||NEW.parent; END LOOP; IF NOT FOUND THEN RAISE EXCEPTION ''Parent % does not exist'', NEW.parent; END IF; RETURN NEW; END; ' LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION tree_delete() RETURNS trigger AS ' DECLARE BEGIN IF 1 = OLD.id THEN RAISE EXCEPTION ''You can not delete the root node of a tree''; END IF; EXECUTE ''UPDATE ''||TG_RELNAME||''_tree SET kids = kids - 1 WHERE id = ''||OLD.parent; RETURN OLD; END; ' LANGUAGE plpgsql;