From 84e8d453a2dea084daa0e80f23954f12b3cba8fb Mon Sep 17 00:00:00 2001 From: Mandar Joshi Date: Thu, 3 Sep 2026 00:37:06 +0530 Subject: [PATCH 1/3] 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/3] 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'; From e3c817dd93a9a32ed7d7d642d67fcedab7553fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Tue, 8 Sep 2026 02:07:06 +0300 Subject: [PATCH 3/3] simplify: drop known signatures directly instead of dynamic loop --- .../pgmq/after-create.sql | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 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 510403dc1e..13369dc812 100644 --- a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql +++ b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql @@ -18,20 +18,19 @@ begin this update is backwards compatible with version 1.4.4 but should be removed once we're on physical backups everywhere */ - -- 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; + -- detach and drop both historical drop_queue signatures (1.4.4 only ever + -- has (text, boolean); 1.5.0+ has both (text) and (text, boolean)) + begin + alter extension pgmq drop function pgmq.drop_queue(text); + exception when others then null; + end; + begin + alter extension pgmq drop function pgmq.drop_queue(text, boolean); + exception when others then null; + end; + + drop function if exists pgmq.drop_queue(text); + drop function if exists pgmq.drop_queue(text, boolean); -- Create and reattach the patched function CREATE FUNCTION pgmq.drop_queue(queue_name TEXT, partitioned BOOLEAN DEFAULT FALSE)