diff --git a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql b/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql deleted file mode 100644 index 050e07dfc..000000000 --- a/ansible/files/postgresql_extension_custom_scripts/pgmq/after-create.sql +++ /dev/null @@ -1,173 +0,0 @@ -do $$ -declare - extoid oid := (select oid from pg_extension where extname = 'pgmq'); - r record; - cls pg_class%rowtype; -begin - - set local search_path = ''; - -/* - Override the pgmq.drop_queue to check if relevant tables are owned - by the pgmq extension before attempting to run - `alter extension pgmq drop table ...` - this is necessary becasue, to enable nightly logical backups to include user queues - we automatically detach them from pgmq. - - 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 -alter extension pgmq drop function pgmq.drop_queue; -drop function pgmq.drop_queue; - --- Create and reattach the patched function -CREATE FUNCTION pgmq.drop_queue(queue_name TEXT) -RETURNS BOOLEAN AS $func$ -DECLARE - qtable TEXT := pgmq.format_table_name(queue_name, 'q'); - qtable_seq TEXT := qtable || '_msg_id_seq'; - 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$ - SELECT is_partitioned FROM pgmq.meta WHERE queue_name = %L - $QUERY$, - queue_name - ) INTO partitioned; - - -- NEW CONDITIONAL CHECK - if exists ( - select 1 - from pg_class c - join pg_depend d on c.oid = d.objid - join pg_extension e on d.refobjid = e.oid - where c.relname = qtable and e.extname = 'pgmq' - ) then - - EXECUTE FORMAT( - $QUERY$ - ALTER EXTENSION pgmq DROP TABLE pgmq.%I - $QUERY$, - qtable - ); - - end if; - - -- NEW CONDITIONAL CHECK - if exists ( - select 1 - from pg_class c - join pg_depend d on c.oid = d.objid - join pg_extension e on d.refobjid = e.oid - where c.relname = qtable_seq and e.extname = 'pgmq' - ) then - EXECUTE FORMAT( - $QUERY$ - ALTER EXTENSION pgmq DROP SEQUENCE pgmq.%I - $QUERY$, - qtable_seq - ); - - end if; - - -- NEW CONDITIONAL CHECK - if exists ( - select 1 - from pg_class c - join pg_depend d on c.oid = d.objid - join pg_extension e on d.refobjid = e.oid - where c.relname = atable and e.extname = 'pgmq' - ) then - - EXECUTE FORMAT( - $QUERY$ - ALTER EXTENSION pgmq DROP TABLE pgmq.%I - $QUERY$, - atable - ); - - end if; - - -- NO CHANGES PAST THIS POINT - - EXECUTE FORMAT( - $QUERY$ - DROP TABLE IF EXISTS pgmq.%I - $QUERY$, - qtable - ); - - EXECUTE FORMAT( - $QUERY$ - DROP TABLE IF EXISTS pgmq.%I - $QUERY$, - atable - ); - - IF EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_name = 'meta' and table_schema = 'pgmq' - ) THEN - EXECUTE FORMAT( - $QUERY$ - DELETE FROM pgmq.meta WHERE queue_name = %L - $QUERY$, - queue_name - ); - END IF; - - IF partitioned THEN - EXECUTE FORMAT( - $QUERY$ - DELETE FROM %I.part_config where parent_table in (%L, %L) - $QUERY$, - pgmq._get_pg_partman_schema(), fq_qtable, fq_atable - ); - END IF; - - RETURN TRUE; -END; -$func$ LANGUAGE plpgsql; - -alter extension pgmq add function pgmq.drop_queue; - - - update pg_extension set extowner = 'postgres'::regrole where extname = 'pgmq'; - - for r in (select * from pg_depend where refobjid = extoid) loop - - - if r.classid = 'pg_type'::regclass then - - -- store the type's relkind - select * into cls from pg_class c where c.reltype = r.objid; - - if r.objid::regtype::text like '%[]' then - -- do nothing (skipping array type) - - elsif cls.relkind in ('r', 'p', 'f', 'm') then - -- table-like objects (regular table, partitioned, foreign, materialized view) - execute format('alter table pgmq.%I owner to postgres;', cls.relname); - - else - execute(format('alter type %s owner to postgres;', r.objid::regtype)); - - end if; - - elsif r.classid = 'pg_proc'::regclass then - execute(format('alter function %s(%s) owner to postgres;', r.objid::regproc, pg_get_function_identity_arguments(r.objid))); - - elsif r.classid = 'pg_class'::regclass then - execute(format('alter table %s owner to postgres;', r.objid::regclass)); - - else - raise exception 'error on pgmq after-create script: unexpected object type %', r.classid; - - end if; - end loop; -end $$; diff --git a/ansible/vars.yml b/ansible/vars.yml index 6454ddf3e..1c9199664 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -9,9 +9,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.0.1.062-orioledb" - postgres17: "17.4.1.012" - postgres15: "15.8.1.069" + postgresorioledb-17: "17.0.1.062-orioledb-test-1" + postgres17: "17.4.1.012-test-1" + postgres15: "15.8.1.069-test-1" # Non Postgres Extensions pgbouncer_release: "1.19.0" diff --git a/nix/ext/patches/pgmq-fix-logical-backup-bug.patch b/nix/ext/patches/pgmq-fix-logical-backup-bug.patch new file mode 100644 index 000000000..f6937ea34 --- /dev/null +++ b/nix/ext/patches/pgmq-fix-logical-backup-bug.patch @@ -0,0 +1,112 @@ +From 0719e02b68873684a8829eaaac8851baff10ee7a Mon Sep 17 00:00:00 2001 +From: steve-chavez +Date: Mon, 7 Apr 2025 18:36:13 -0500 +Subject: [PATCH] fix: logical backup bug + +This checks if queue tables, archive tables, and sequences are attached to the +pgmq extension before attempting to detach them. + +This change enables the on-pause hook to execute on-backup, resolving a logical backup bug. +--- + pgmq-extension/sql/pgmq.sql | 62 +++++++++++++++++++++++++++++++++---- + 1 file changed, 56 insertions(+), 6 deletions(-) + +diff --git a/pgmq-extension/sql/pgmq.sql b/pgmq-extension/sql/pgmq.sql +index 751a22f..40a232e 100644 +--- a/pgmq-extension/sql/pgmq.sql ++++ b/pgmq-extension/sql/pgmq.sql +@@ -460,20 +460,66 @@ RETURNS TEXT AS $$ + extname = 'pg_partman'; + $$ LANGUAGE SQL; + +-CREATE FUNCTION pgmq.drop_queue(queue_name TEXT, partitioned BOOLEAN DEFAULT FALSE) +-RETURNS BOOLEAN AS $$ ++CREATE FUNCTION pgmq.drop_queue(queue_name TEXT) ++RETURNS BOOLEAN AS $func$ + DECLARE + qtable TEXT := pgmq.format_table_name(queue_name, 'q'); ++ qtable_seq TEXT := qtable || '_msg_id_seq'; + 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$ +- ALTER EXTENSION pgmq DROP TABLE pgmq.%I ++ SELECT is_partitioned FROM pgmq.meta WHERE queue_name = %L + $QUERY$, +- qtable +- ); ++ queue_name ++ ) INTO partitioned; ++ ++ -- NEW CONDITIONAL CHECK ++ if exists ( ++ select 1 ++ from pg_class c ++ join pg_depend d on c.oid = d.objid ++ join pg_extension e on d.refobjid = e.oid ++ where c.relname = qtable and e.extname = 'pgmq' ++ ) then ++ ++ EXECUTE FORMAT( ++ $QUERY$ ++ ALTER EXTENSION pgmq DROP TABLE pgmq.%I ++ $QUERY$, ++ qtable ++ ); ++ ++ end if; ++ ++ -- NEW CONDITIONAL CHECK ++ if exists ( ++ select 1 ++ from pg_class c ++ join pg_depend d on c.oid = d.objid ++ join pg_extension e on d.refobjid = e.oid ++ where c.relname = qtable_seq and e.extname = 'pgmq' ++ ) then ++ EXECUTE FORMAT( ++ $QUERY$ ++ ALTER EXTENSION pgmq DROP SEQUENCE pgmq.%I ++ $QUERY$, ++ qtable_seq ++ ); ++ ++ end if; ++ ++ -- NEW CONDITIONAL CHECK ++ if exists ( ++ select 1 ++ from pg_class c ++ join pg_depend d on c.oid = d.objid ++ join pg_extension e on d.refobjid = e.oid ++ where c.relname = atable and e.extname = 'pgmq' ++ ) then + + EXECUTE FORMAT( + $QUERY$ +@@ -482,6 +528,10 @@ BEGIN + atable + ); + ++ end if; ++ ++ -- NO CHANGES PAST THIS POINT ++ + EXECUTE FORMAT( + $QUERY$ + DROP TABLE IF EXISTS pgmq.%I +@@ -520,7 +570,7 @@ BEGIN + + RETURN TRUE; + END; +-$$ LANGUAGE plpgsql; ++$func$ LANGUAGE plpgsql; + + CREATE FUNCTION pgmq.validate_queue_name(queue_name TEXT) + RETURNS void AS $$ +-- +2.40.1 + diff --git a/nix/ext/pgmq.nix b/nix/ext/pgmq.nix index 97a3c27e3..b7481fcd5 100644 --- a/nix/ext/pgmq.nix +++ b/nix/ext/pgmq.nix @@ -11,6 +11,10 @@ stdenv.mkDerivation rec { hash = "sha256-z+8/BqIlHwlMnuIzMz6eylmYbSmhtsNt7TJf/CxbdVw="; }; + patches = [ + ./patches/pgmq-fix-logical-backup-bug.patch + ]; + buildPhase = '' cd pgmq-extension '';