Skip to content

Instantly share code, notes, and snippets.

@dlangille
Last active November 29, 2018 22:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlangille/5917df6cd02f731700a729504470ad91 to your computer and use it in GitHub Desktop.
Save dlangille/5917df6cd02f731700a729504470ad91 to your computer and use it in GitHub Desktop.
Identical table name and function name in PostgreSQL 11.1
CREATE OR REPLACE FUNCTION element_pathname_insert() RETURNS TRIGGER AS $$
BEGIN
RAISE WARNING 'element_pathname_insert says: %', NEW.id;
INSERT INTO element_pathname (element_id, pathname)
VALUES (NEW.id, element_pathname(NEW.id));
RETURN NEW;
END
$$ LANGUAGE 'plpgsql';
From the definition of the table: element
element_pathname_insert AFTER INSERT ON element FOR EACH ROW EXECUTE PROCEDURE element_pathname_insert()
@dlangille
Copy link
Author

The function is:

CREATE OR REPLACE FUNCTION element_pathname (integer, boolean) RETURNS text
    AS $$
   DECLARE
      element_id    ALIAS FOR $1;
      leading_slash ALIAS for $2;
      my_parent_id  int4;
      element_name  text;
      pathname      text;

begin
  RAISE WARNING ' element_pathname invoked with %', element_id;
  pathname = '';
  select name, parent_id
    into element_name, my_parent_id
    from element
   where id = element_id;

  IF FOUND THEN
    pathname := '/' || element_name || pathname;
    WHILE FOUND LOOP
      select name, parent_id
        into element_name, my_parent_id
        from element
       where id = my_parent_id;

      IF FOUND THEN
         IF my_parent_id IS NULL THEN
           IF leading_slash THEN
              pathname = '/' || element_name || pathname;
           ELSE
              pathname = element_name || pathname;
           END IF;
           EXIT;
         ELSE
           pathname = '/' || element_name || pathname;
         END IF;
      END IF;
    END LOOP;
  END IF;

  return pathname;
END;
$$
    LANGUAGE plpgsql STABLE;

@dlangille
Copy link
Author

The duplicate key issue is a red herring, that only occurs because the previous transaction retrieve a '' for element_pathname () and inserted it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment