From 8cc157b23413c21f229e376cb2982a2086655fc9 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Jan 2019 09:12:31 -0800 Subject: [PATCH] Fix ALTER TRIGGER ... RENAME, broken in WITH OIDS removal. I (Andres) broke this in 578b229718e. Author: Rushabh Lathia Discussion: https://postgr.es/m/CAGPqQf04PywZX3sVQaF6H=oLiW9GJncRW+=e78vTy4MokEWcZw@mail.gmail.com --- src/backend/commands/trigger.c | 6 +++--- src/test/regress/expected/triggers.out | 16 +++++++++++++++- src/test/regress/sql/triggers.sql | 8 +++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 2daffae8cd..5103f30c8f 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -1721,14 +1721,14 @@ renametrig(RenameStmt *stmt) NULL, 2, key); if (HeapTupleIsValid(tuple = systable_getnext(tgscan))) { - Form_pg_trigger trigform = (Form_pg_trigger) GETSTRUCT(tuple); - - tgoid = trigform->oid; + Form_pg_trigger trigform; /* * Update pg_trigger tuple with new tgname. */ tuple = heap_copytuple(tuple); /* need a modifiable copy */ + trigform = (Form_pg_trigger) GETSTRUCT(tuple); + tgoid = trigform->oid; namestrcpy(&trigform->tgname, stmt->newname); diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index e95e089317..f561de9222 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -434,7 +434,21 @@ SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table' CREATE TRIGGER modified_any BEFORE UPDATE OF a ON main_table FOR EACH ROW WHEN (old.* IS DISTINCT FROM new.*) EXECUTE PROCEDURE trigger_func('modified_any') (1 row) -DROP TRIGGER modified_a ON main_table; +-- Test RENAME TRIGGER +ALTER TRIGGER modified_a ON main_table RENAME TO modified_modified_a; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_modified_a'; + count +------- + 1 +(1 row) + +DROP TRIGGER modified_modified_a ON main_table; DROP TRIGGER modified_any ON main_table; DROP TRIGGER insert_a ON main_table; DROP TRIGGER delete_a ON main_table; diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index 5336185ed2..60d1dc6f46 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -284,7 +284,13 @@ SELECT * FROM main_table ORDER BY a, b; SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_any'; -DROP TRIGGER modified_a ON main_table; + +-- Test RENAME TRIGGER +ALTER TRIGGER modified_a ON main_table RENAME TO modified_modified_a; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_modified_a'; + +DROP TRIGGER modified_modified_a ON main_table; DROP TRIGGER modified_any ON main_table; DROP TRIGGER insert_a ON main_table; DROP TRIGGER delete_a ON main_table;