fix-rename-cmdtrigger.patch
text/x-patch
Filename: fix-rename-cmdtrigger.patch
Type: text/x-patch
Part: 0
Message:
Re: Command Triggers, patch v11
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| doc/src/sgml/ref/alter_command_trigger.sgml | 3 | 2 |
| src/backend/commands/alter.c | 1 | 1 |
| src/backend/commands/cmdtrigger.c | 5 | 1 |
| src/backend/nodes/copyfuncs.c | 0 | 2 |
| src/backend/nodes/equalfuncs.c | 0 | 2 |
| src/backend/parser/gram.y | 3 | 4 |
| src/backend/tcop/utility.c | 14 | 4 |
| src/include/commands/cmdtrigger.h | 1 | 1 |
| src/test/regress/expected/cmdtriggers.out | 2 | 1 |
| src/test/regress/sql/cmdtriggers.sql | 2 | 1 |
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();