Hi,

I found that ALTER TRIGGER .. RENAME TO is broken and it's
unable to rename the trigger.  Looking further seems renametrig()
function, copy the new trigger name into wrong tuple.  This is
broken with below commit:

commit 578b229718e8f15fa779e20f086c4b6bb3776106
Author: Andres Freund <and...@anarazel.de>
Date:   Tue Nov 20 15:36:57 2018 -0800

    Remove WITH OIDS support, change oid catalog column visibility.

PFA patch to fix the issue.  I also added the testcase for the
same into the regression.

regards,
Rushabh Lathia
www.EnterpriseDB.com
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2daffae..5103f30 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 e95e089..af444ba 100644
--- a/src/test/regress/expected/triggers.out
+++ b/src/test/regress/expected/triggers.out
@@ -434,7 +434,15 @@ 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_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 5336185..c904117 100644
--- a/src/test/regress/sql/triggers.sql
+++ b/src/test/regress/sql/triggers.sql
@@ -284,7 +284,12 @@ 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_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;

Reply via email to