From 84e8d453a2dea084daa0e80f23954f12b3cba8fb Mon Sep 17 00:00:00 2001 From: Mandar Joshi Date: Thu, 3 Sep 2026 00:37:06 +0530 Subject: [PATCH 1/2] fix(pgmq): dynamically drop overloaded drop_queue functions Fixes #1867 When pgmq was updated to 1.5.1, the drop_queue function introduced overloading (adding a partitioned parameter). The static drop commands in the after-create.sql script failed with 'function is not unique', breaking local db resets for new projects. This replaces the static drops with a dynamic loop over pg_proc to safely drop all overloaded signatures, and updates the patched function signature to align with 1.5.1 API while maintaining backwards compatibility. --- .../pgmq/after-create.sql | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql index 1581d93ca8..fb7959e755 100644 --- a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql +++ b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql @@ -18,17 +18,28 @@ begin this update is backwards compatible with version 1.4.4 but should be removed once we're on physical backups everywhere */ --- Detach and delete the official function -if extversion = '1.4.4' then - alter extension pgmq drop function pgmq.drop_queue; - drop function pgmq.drop_queue; -else -- 1.5.1+ - alter extension pgmq drop function pgmq.drop_queue(TEXT); - drop function pgmq.drop_queue(TEXT); -end if; +-- Detach and delete all versions of the function + FOR r IN + SELECT + pg_get_function_identity_arguments(p.oid) AS sig, + EXISTS ( + SELECT 1 FROM pg_depend d + WHERE d.objid = p.oid + AND d.refobjid = extoid + AND d.deptype = 'e' + ) AS is_extension_member + FROM pg_proc p + JOIN pg_namespace n ON p.pronamespace = n.oid + WHERE n.nspname = 'pgmq' AND p.proname = 'drop_queue' + LOOP + IF r.is_extension_member THEN + EXECUTE format('ALTER EXTENSION pgmq DROP FUNCTION pgmq.drop_queue(%s)', r.sig); + END IF; + EXECUTE format('DROP FUNCTION IF EXISTS pgmq.drop_queue(%s)', r.sig); + END LOOP; -- Create and reattach the patched function -CREATE FUNCTION pgmq.drop_queue(queue_name TEXT) +CREATE FUNCTION pgmq.drop_queue(queue_name TEXT, partitioned BOOLEAN DEFAULT FALSE) RETURNS BOOLEAN AS $func$ DECLARE qtable TEXT := pgmq.format_table_name(queue_name, 'q'); @@ -36,7 +47,6 @@ DECLARE fq_qtable TEXT := 'pgmq.' || qtable; atable TEXT := pgmq.format_table_name(queue_name, 'a'); fq_atable TEXT := 'pgmq.' || atable; - partitioned BOOLEAN; BEGIN EXECUTE FORMAT( $QUERY$ @@ -140,11 +150,7 @@ BEGIN END; $func$ LANGUAGE plpgsql; -if extversion = '1.4.4' then - alter extension pgmq add function pgmq.drop_queue; -else -- 1.5.1+ - alter extension pgmq add function pgmq.drop_queue(TEXT); -end if; + alter extension pgmq add function pgmq.drop_queue(TEXT, BOOLEAN); update pg_extension set extowner = 'postgres'::regrole where extname = 'pgmq'; From c380e27c5e8755d9109d80a486ff716c34d5d6a8 Mon Sep 17 00:00:00 2001 From: Mandar Joshi Date: Sat, 5 Sep 2026 17:44:57 +0530 Subject: [PATCH 2/2] refactor: clean up drop_queue overload detachment loop --- .../pgmq/after-create.sql | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql index fb7959e755..510403dc1e 100644 --- a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql +++ b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql @@ -18,25 +18,20 @@ begin this update is backwards compatible with version 1.4.4 but should be removed once we're on physical backups everywhere */ --- Detach and delete all versions of the function - FOR r IN - SELECT - pg_get_function_identity_arguments(p.oid) AS sig, - EXISTS ( - SELECT 1 FROM pg_depend d - WHERE d.objid = p.oid - AND d.refobjid = extoid - AND d.deptype = 'e' - ) AS is_extension_member - FROM pg_proc p - JOIN pg_namespace n ON p.pronamespace = n.oid - WHERE n.nspname = 'pgmq' AND p.proname = 'drop_queue' - LOOP - IF r.is_extension_member THEN - EXECUTE format('ALTER EXTENSION pgmq DROP FUNCTION pgmq.drop_queue(%s)', r.sig); - END IF; - EXECUTE format('DROP FUNCTION IF EXISTS pgmq.drop_queue(%s)', r.sig); - END LOOP; + -- detach and drop any existing drop_queue overloads + for r in + select pg_get_function_identity_arguments(p.oid) as args, + d.objid is not null as in_extension + from pg_proc p + left join pg_depend d on d.objid = p.oid and d.refobjid = extoid and d.deptype = 'e' + where p.pronamespace = 'pgmq'::regnamespace + and p.proname = 'drop_queue' + loop + if r.in_extension then + execute format('alter extension pgmq drop function pgmq.drop_queue(%s)', r.args); + end if; + execute format('drop function pgmq.drop_queue(%s)', r.args); + end loop; -- Create and reattach the patched function CREATE FUNCTION pgmq.drop_queue(queue_name TEXT, partitioned BOOLEAN DEFAULT FALSE) @@ -150,7 +145,7 @@ BEGIN END; $func$ LANGUAGE plpgsql; - alter extension pgmq add function pgmq.drop_queue(TEXT, BOOLEAN); + alter extension pgmq add function pgmq.drop_queue(text, boolean); update pg_extension set extowner = 'postgres'::regrole where extname = 'pgmq';