Skip to content

Commit 8d21e38

Browse files
committed
fix: patch pgmq using Nix
1 parent 2da30ff commit 8d21e38

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
From 0719e02b68873684a8829eaaac8851baff10ee7a Mon Sep 17 00:00:00 2001
2+
From: steve-chavez <[email protected]>
3+
Date: Mon, 7 Apr 2025 18:36:13 -0500
4+
Subject: [PATCH] fix: logical backup bug
5+
6+
This checks if queue tables, archive tables, and sequences are attached to the
7+
pgmq extension before attempting to detach them.
8+
9+
This change enables the on-pause hook to execute on-backup, resolving a logical backup bug.
10+
---
11+
pgmq-extension/sql/pgmq.sql | 62 +++++++++++++++++++++++++++++++++----
12+
1 file changed, 56 insertions(+), 6 deletions(-)
13+
14+
diff --git a/pgmq-extension/sql/pgmq.sql b/pgmq-extension/sql/pgmq.sql
15+
index 751a22f..40a232e 100644
16+
--- a/pgmq-extension/sql/pgmq.sql
17+
+++ b/pgmq-extension/sql/pgmq.sql
18+
@@ -460,20 +460,66 @@ RETURNS TEXT AS $$
19+
extname = 'pg_partman';
20+
$$ LANGUAGE SQL;
21+
22+
-CREATE FUNCTION pgmq.drop_queue(queue_name TEXT, partitioned BOOLEAN DEFAULT FALSE)
23+
-RETURNS BOOLEAN AS $$
24+
+CREATE FUNCTION pgmq.drop_queue(queue_name TEXT)
25+
+RETURNS BOOLEAN AS $func$
26+
DECLARE
27+
qtable TEXT := pgmq.format_table_name(queue_name, 'q');
28+
+ qtable_seq TEXT := qtable || '_msg_id_seq';
29+
fq_qtable TEXT := 'pgmq.' || qtable;
30+
atable TEXT := pgmq.format_table_name(queue_name, 'a');
31+
fq_atable TEXT := 'pgmq.' || atable;
32+
+ partitioned BOOLEAN;
33+
BEGIN
34+
EXECUTE FORMAT(
35+
$QUERY$
36+
- ALTER EXTENSION pgmq DROP TABLE pgmq.%I
37+
+ SELECT is_partitioned FROM pgmq.meta WHERE queue_name = %L
38+
$QUERY$,
39+
- qtable
40+
- );
41+
+ queue_name
42+
+ ) INTO partitioned;
43+
+
44+
+ -- NEW CONDITIONAL CHECK
45+
+ if exists (
46+
+ select 1
47+
+ from pg_class c
48+
+ join pg_depend d on c.oid = d.objid
49+
+ join pg_extension e on d.refobjid = e.oid
50+
+ where c.relname = qtable and e.extname = 'pgmq'
51+
+ ) then
52+
+
53+
+ EXECUTE FORMAT(
54+
+ $QUERY$
55+
+ ALTER EXTENSION pgmq DROP TABLE pgmq.%I
56+
+ $QUERY$,
57+
+ qtable
58+
+ );
59+
+
60+
+ end if;
61+
+
62+
+ -- NEW CONDITIONAL CHECK
63+
+ if exists (
64+
+ select 1
65+
+ from pg_class c
66+
+ join pg_depend d on c.oid = d.objid
67+
+ join pg_extension e on d.refobjid = e.oid
68+
+ where c.relname = qtable_seq and e.extname = 'pgmq'
69+
+ ) then
70+
+ EXECUTE FORMAT(
71+
+ $QUERY$
72+
+ ALTER EXTENSION pgmq DROP SEQUENCE pgmq.%I
73+
+ $QUERY$,
74+
+ qtable_seq
75+
+ );
76+
+
77+
+ end if;
78+
+
79+
+ -- NEW CONDITIONAL CHECK
80+
+ if exists (
81+
+ select 1
82+
+ from pg_class c
83+
+ join pg_depend d on c.oid = d.objid
84+
+ join pg_extension e on d.refobjid = e.oid
85+
+ where c.relname = atable and e.extname = 'pgmq'
86+
+ ) then
87+
88+
EXECUTE FORMAT(
89+
$QUERY$
90+
@@ -482,6 +528,10 @@ BEGIN
91+
atable
92+
);
93+
94+
+ end if;
95+
+
96+
+ -- NO CHANGES PAST THIS POINT
97+
+
98+
EXECUTE FORMAT(
99+
$QUERY$
100+
DROP TABLE IF EXISTS pgmq.%I
101+
@@ -520,7 +570,7 @@ BEGIN
102+
103+
RETURN TRUE;
104+
END;
105+
-$$ LANGUAGE plpgsql;
106+
+$func$ LANGUAGE plpgsql;
107+
108+
CREATE FUNCTION pgmq.validate_queue_name(queue_name TEXT)
109+
RETURNS void AS $$
110+
--
111+
2.40.1
112+

nix/ext/pgmq.nix

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ stdenv.mkDerivation rec {
1111
hash = "sha256-z+8/BqIlHwlMnuIzMz6eylmYbSmhtsNt7TJf/CxbdVw=";
1212
};
1313

14+
patches = [
15+
./patches/pgmq-fix-logical-backup-bug.patch
16+
];
17+
1418
buildPhase = ''
1519
cd pgmq-extension
1620
'';

0 commit comments

Comments
 (0)