/* * NOTE: All pg_temp objects must be dropped at the end of the script! * Otherwise the eventual DROP CASCADE of pg_temp when the session ends will * also drop the extension! Instead of risking problems, create our own * "temporary" schema instead. */ CREATE SCHEMA __cat_tools; CREATE FUNCTION __cat_tools.exec( sql text ) RETURNS void LANGUAGE plpgsql AS $body$ BEGIN RAISE DEBUG 'sql = %', sql; EXECUTE sql; END $body$; CREATE FUNCTION __cat_tools.create_function( function_name text , args text , options text , body text , grants text DEFAULT NULL ) RETURNS void LANGUAGE plpgsql AS $body$ DECLARE create_template CONSTANT text := $template$ CREATE OR REPLACE FUNCTION %s( %s ) RETURNS %s AS %L $template$ ; revoke_template CONSTANT text := $template$ REVOKE ALL ON FUNCTION %s( %s ) FROM public; $template$ ; grant_template CONSTANT text := $template$ GRANT EXECUTE ON FUNCTION %s( %s ) TO %s; $template$ ; BEGIN PERFORM __cat_tools.exec( format( create_template , function_name , args , options , body ) ) ; PERFORM __cat_tools.exec( format( revoke_template , function_name , args ) ) ; IF grants IS NOT NULL THEN PERFORM __cat_tools.exec( format( grant_template , function_name , args , grants ) ) ; END IF; END $body$; SELECT __cat_tools.create_function( 'cat_tools.trigger__get_oid' , $$ trigger_table regclass , trigger_name text $$ , $$oid LANGUAGE plpgsql$$ , $body$ DECLARE v_oid oid; BEGIN -- Note that because __loose isn't an SRF it'll always return a value v_oid := cat_tools.trigger__get_oid__loose( trigger_table, trigger_name ) ; IF v_oid IS NULL THEN RAISE EXCEPTION 'trigger % on table % does not exist', trigger_name, trigger_table; END IF; RETURN v_oid; END $body$ , 'cat_tools__usage' ); DROP FUNCTION __cat_tools.exec( sql text ); DROP FUNCTION __cat_tools.create_function( function_name text , args text , options text , body text , grants text ); DROP SCHEMA __cat_tools;