Skip to content

Commit 477fba8

Browse files
committed
Ignore AFTER triggers sorting after z_repack_trigger
They are not a problem, and they fore after the BEFORE trigger anyway. To be checked against more PostgreSQL versions.
1 parent 22762fc commit 477fba8

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

bin/expected/repack.out

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,3 +379,29 @@ SELECT repack.get_order_by('issue3_5_idx'::regclass::oid, 'issue3_5'::regclass::
379379

380380
\! pg_repack --dbname=contrib_regression --table=issue3_5
381381
INFO: repacking table "issue3_5"
382+
--
383+
-- Triggers handling
384+
--
385+
CREATE FUNCTION trgtest() RETURNS trigger AS
386+
$$BEGIN RETURN NEW; END$$
387+
LANGUAGE plpgsql;
388+
CREATE TABLE trg1 (id integer PRIMARY KEY);
389+
CREATE TRIGGER z_repack_triggeq BEFORE UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest();
390+
\! pg_repack --dbname=contrib_regression --table=trg1
391+
INFO: repacking table "trg1"
392+
CREATE TABLE trg2 (id integer PRIMARY KEY);
393+
CREATE TRIGGER z_repack_trigger BEFORE UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest();
394+
\! pg_repack --dbname=contrib_regression --table=trg2
395+
INFO: repacking table "trg2"
396+
WARNING: the table "trg2" has already a trigger called "z_repack_trigger"
397+
DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects. Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over.
398+
CREATE TABLE trg3 (id integer PRIMARY KEY);
399+
CREATE TRIGGER z_repack_trigges BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest();
400+
\! pg_repack --dbname=contrib_regression --table=trg3
401+
INFO: repacking table "trg3"
402+
WARNING: trigger "z_repack_trigges" conflicting on table "trg3"
403+
DETAIL: The trigger "z_repack_trigger" must be the last of the BEFORE triggers to fire on the table (triggers fire in alphabetical order). Please rename the trigger so that it sorts before "z_repack_trigger": you can use "ALTER TRIGGER z_repack_trigges ON trg3 RENAME TO newname".
404+
CREATE TABLE trg4 (id integer PRIMARY KEY);
405+
CREATE TRIGGER zzzzzz AFTER UPDATE ON trg4 FOR EACH ROW EXECUTE PROCEDURE trgtest();
406+
\! pg_repack --dbname=contrib_regression --table=trg4
407+
INFO: repacking table "trg4"

bin/sql/repack.sql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,22 @@ CREATE TABLE issue3_5 (col1 int NOT NULL, col2 text NOT NULL);
215215
CREATE UNIQUE INDEX issue3_5_idx ON issue3_5 (col1 DESC NULLS FIRST, col2 COLLATE "POSIX" DESC);
216216
SELECT repack.get_order_by('issue3_5_idx'::regclass::oid, 'issue3_5'::regclass::oid);
217217
\! pg_repack --dbname=contrib_regression --table=issue3_5
218+
219+
--
220+
-- Triggers handling
221+
--
222+
CREATE FUNCTION trgtest() RETURNS trigger AS
223+
$$BEGIN RETURN NEW; END$$
224+
LANGUAGE plpgsql;
225+
CREATE TABLE trg1 (id integer PRIMARY KEY);
226+
CREATE TRIGGER z_repack_triggeq BEFORE UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest();
227+
\! pg_repack --dbname=contrib_regression --table=trg1
228+
CREATE TABLE trg2 (id integer PRIMARY KEY);
229+
CREATE TRIGGER z_repack_trigger BEFORE UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest();
230+
\! pg_repack --dbname=contrib_regression --table=trg2
231+
CREATE TABLE trg3 (id integer PRIMARY KEY);
232+
CREATE TRIGGER z_repack_trigges BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest();
233+
\! pg_repack --dbname=contrib_regression --table=trg3
234+
CREATE TABLE trg4 (id integer PRIMARY KEY);
235+
CREATE TRIGGER zzzzzz AFTER UPDATE ON trg4 FOR EACH ROW EXECUTE PROCEDURE trgtest();
236+
\! pg_repack --dbname=contrib_regression --table=trg4

lib/pg_repack.sql.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ CREATE FUNCTION repack.conflicted_triggers(oid) RETURNS SETOF name AS
219219
$$
220220
SELECT tgname FROM pg_trigger
221221
WHERE tgrelid = $1 AND tgname >= 'z_repack_trigger'
222+
AND (tgtype & 2) = 2 -- BEFORE trigger
222223
ORDER BY tgname;
223224
$$
224225
LANGUAGE sql STABLE STRICT;

0 commit comments

Comments
 (0)