commit 301d8e58b6bfe89f35d82ad7a5216891f56c5d48
Author: Dimitri Fontaine <dim@tapoueh.org>
Date:   Sat Mar 3 15:18:59 2012 +0100

    Fix RenameCmdTrigger(), per review.

diff --git a/doc/src/sgml/ref/alter_command_trigger.sgml b/doc/src/sgml/ref/alter_command_trigger.sgml
index dd903e7..48b536c 100644
--- a/doc/src/sgml/ref/alter_command_trigger.sgml
+++ b/doc/src/sgml/ref/alter_command_trigger.sgml
@@ -22,6 +22,7 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 ALTER COMMAND TRIGGER <replaceable class="PARAMETER">name</replaceable> SET <replaceable class="parameter">enabled</replaceable>
+ALTER COMMAND TRIGGER <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">newname</replaceable>
 
 <phrase>where <replaceable class="parameter">enabled</replaceable> can be one of:</phrase>
 
@@ -62,10 +63,10 @@ ALTER COMMAND TRIGGER <replaceable class="PARAMETER">name</replaceable> SET <rep
    </varlistentry>
 
    <varlistentry>
-    <term><replaceable class="PARAMETER">command</replaceable></term>
+    <term><replaceable class="PARAMETER">newname</replaceable></term>
     <listitem>
      <para>
-      The command tag on which this trigger acts.
+      The new name of the command trigger.
      </para>
     </listitem>
    </varlistentry>
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index 4d07642..b447306 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -66,7 +66,7 @@ ExecRenameStmt(RenameStmt *stmt)
 			break;
 
 		case OBJECT_CMDTRIGGER:
-			RenameCmdTrigger(stmt->object, stmt->subname, stmt->newname);
+			RenameCmdTrigger(stmt->object, stmt->newname);
 			break;
 
 		case OBJECT_DATABASE:
diff --git a/src/backend/commands/cmdtrigger.c b/src/backend/commands/cmdtrigger.c
index e8d294d..ef9794f 100644
--- a/src/backend/commands/cmdtrigger.c
+++ b/src/backend/commands/cmdtrigger.c
@@ -294,13 +294,17 @@ AlterCmdTrigger(AlterCmdTrigStmt *stmt)
  * Rename command trigger
  */
 void
-RenameCmdTrigger(const char *trigname, const char *newname)
+RenameCmdTrigger(List *name, const char *newname)
 {
 	SysScanDesc tgscan;
 	ScanKeyData skey[1];
 	HeapTuple	tup;
 	Relation	rel;
 	Form_pg_cmdtrigger cmdForm;
+	char *trigname;
+
+	Assert(list_length(name) == 1);
+	trigname = strVal((Value *)linitial(name));
 
 	CheckCmdTriggerPrivileges();
 
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index defcdd1..6a20a6c 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3463,7 +3463,6 @@ _copyCreateCmdTrigStmt(const CreateCmdTrigStmt *from)
 {
 	CreateCmdTrigStmt *newnode = makeNode(CreateCmdTrigStmt);
 
-	COPY_NODE_FIELD(command);
 	COPY_STRING_FIELD(trigname);
 	COPY_SCALAR_FIELD(timing);
 	COPY_NODE_FIELD(funcname);
@@ -3476,7 +3475,6 @@ _copyAlterCmdTrigStmt(const AlterCmdTrigStmt *from)
 {
 	AlterCmdTrigStmt *newnode = makeNode(AlterCmdTrigStmt);
 
-	COPY_STRING_FIELD(command);
 	COPY_STRING_FIELD(trigname);
 	COPY_STRING_FIELD(tgenabled);
 
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 1ad31f0..137075a 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -1780,7 +1780,6 @@ _equalCreateTrigStmt(const CreateTrigStmt *a, const CreateTrigStmt *b)
 static bool
 _equalCreateCmdTrigStmt(const CreateCmdTrigStmt *a, const CreateCmdTrigStmt *b)
 {
-	COMPARE_NODE_FIELD(command);
 	COMPARE_STRING_FIELD(trigname);
 	COMPARE_SCALAR_FIELD(timing);
 	COMPARE_NODE_FIELD(funcname);
@@ -1791,7 +1790,6 @@ _equalCreateCmdTrigStmt(const CreateCmdTrigStmt *a, const CreateCmdTrigStmt *b)
 static bool
 _equalAlterCmdTrigStmt(const AlterCmdTrigStmt *a, const AlterCmdTrigStmt *b)
 {
-	COMPARE_STRING_FIELD(command);
 	COMPARE_STRING_FIELD(trigname);
 	COMPARE_STRING_FIELD(tgenabled);
 
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index e5a0d34..e9872d3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -6931,13 +6931,12 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
 					n->missing_ok = false;
 					$$ = (Node *)n;
 				}
-			| ALTER TRIGGER name ON COMMAND trigger_command RENAME TO name
+			| ALTER COMMAND TRIGGER name RENAME TO name
 				{
 					RenameStmt *n = makeNode(RenameStmt);
 					n->renameType = OBJECT_CMDTRIGGER;
-					n->object  = list_make1(makeString($6));
-					n->subname = $3;
-					n->newname = $9;
+					n->object  = list_make1(makeString($4));
+					n->newname = $7;
 					$$ = (Node *)n;
 				}
 			| ALTER ROLE RoleId RENAME TO RoleId
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 3c75cf3..69d6479 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -168,7 +168,6 @@ call_before_cmdtriggers(Node *parsetree, CommandContext cmd)
 		case T_AlterOwnerStmt:
 		case T_AlterSeqStmt:
 		case T_AlterTableStmt:
-		case T_RenameStmt:
 		case T_CommentStmt:
 		case T_DefineStmt:
 		case T_CreateCastStmt:
@@ -224,8 +223,14 @@ call_before_cmdtriggers(Node *parsetree, CommandContext cmd)
 				ExecBeforeCommandTriggers(cmd);
 			return;
 
+		case T_RenameStmt:
+			if (((RenameStmt *) parsetree)->renameType != OBJECT_CMDTRIGGER)
+				if (CommandFiresTriggers(cmd))
+					ExecBeforeCommandTriggers(cmd);
+			return;
+
 		case T_DropStmt:
-			if (((DropStmt *) cmd->parsetree)->removeType != OBJECT_CMDTRIGGER)
+			if (((DropStmt *) parsetree)->removeType != OBJECT_CMDTRIGGER)
 				if (CommandFiresTriggers(cmd))
 					ExecBeforeCommandTriggers(cmd);
 			return;
@@ -251,7 +256,6 @@ call_after_cmdtriggers(Node *parsetree, CommandContext cmd)
 		case T_AlterOwnerStmt:
 		case T_AlterSeqStmt:
 		case T_AlterTableStmt:
-		case T_RenameStmt:
 		case T_CommentStmt:
 		case T_DefineStmt:
 		case T_CreateCastStmt:
@@ -310,8 +314,14 @@ call_after_cmdtriggers(Node *parsetree, CommandContext cmd)
 					ExecAfterCommandTriggers(cmd);
 			return;
 
+		case T_RenameStmt:
+			if (((RenameStmt *) parsetree)->renameType != OBJECT_CMDTRIGGER)
+				if (CommandFiresTriggers(cmd))
+					ExecAfterCommandTriggers(cmd);
+			return;
+
 		case T_DropStmt:
-			if (((DropStmt *) cmd->parsetree)->removeType != OBJECT_CMDTRIGGER)
+			if (((DropStmt *) parsetree)->removeType != OBJECT_CMDTRIGGER)
 				if (CommandFiresAfterTriggers(cmd))
 					ExecAfterCommandTriggers(cmd);
 			return;
diff --git a/src/include/commands/cmdtrigger.h b/src/include/commands/cmdtrigger.h
index 01a6ca3..fae2bfc 100644
--- a/src/include/commands/cmdtrigger.h
+++ b/src/include/commands/cmdtrigger.h
@@ -42,7 +42,7 @@ extern void CreateCmdTrigger(CreateCmdTrigStmt *stmt, const char *queryString);
 extern void RemoveCmdTriggerById(Oid ctrigOid);
 extern Oid	get_cmdtrigger_oid(const char *trigname, bool missing_ok);
 extern void AlterCmdTrigger(AlterCmdTrigStmt *stmt);
-extern void RenameCmdTrigger(const char *trigname, const char *newname);
+extern void RenameCmdTrigger(List *name, const char *newname);
 
 extern void InitCommandContext(CommandContext cmd, const Node *stmt, bool list_triggers);
 extern bool ListCommandTriggers(CommandContext cmd);
diff --git a/src/test/regress/expected/cmdtriggers.out b/src/test/regress/expected/cmdtriggers.out
index 8cb1f78..85a8d38 100644
--- a/src/test/regress/expected/cmdtriggers.out
+++ b/src/test/regress/expected/cmdtriggers.out
@@ -21,9 +21,10 @@ begin
 end;
 $$;
 create command trigger snitch_before before any command execute procedure any_snitch();
-create command trigger snitch_after  after  any command execute procedure any_snitch();
+create command trigger snitch_after_ after  any command execute procedure any_snitch();
 alter command trigger snitch_before set disable;
 alter command trigger snitch_before set enable;
+alter command trigger snitch_after_ rename to snitch_after;
 create command trigger snitch_create_table after create table execute procedure snitch();
 create command trigger snitch_alter_table after alter table execute procedure snitch();
 create command trigger snitch_drop_table after drop table execute procedure snitch();
diff --git a/src/test/regress/sql/cmdtriggers.sql b/src/test/regress/sql/cmdtriggers.sql
index 215da78..60d3be0 100644
--- a/src/test/regress/sql/cmdtriggers.sql
+++ b/src/test/regress/sql/cmdtriggers.sql
@@ -23,10 +23,11 @@ end;
 $$;
 
 create command trigger snitch_before before any command execute procedure any_snitch();
-create command trigger snitch_after  after  any command execute procedure any_snitch();
+create command trigger snitch_after_ after  any command execute procedure any_snitch();
 
 alter command trigger snitch_before set disable;
 alter command trigger snitch_before set enable;
+alter command trigger snitch_after_ rename to snitch_after;
 
 create command trigger snitch_create_table after create table execute procedure snitch();
 create command trigger snitch_alter_table after alter table execute procedure snitch();
