git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c30446b)
Fix the just-reported problem that you can't specify all four trigger event
2009年6月18日 01:27:02 +0000 (01:27 +0000)
2009年6月18日 01:27:02 +0000 (01:27 +0000)
types in CREATE TRIGGER. While at it, clean up the amazingly tedious and
inextensible way that the trigger event type list was handled. Per report
from Greg Sabino Mullane.


diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index f75261160e7335c47ddc7227a5ac0548eb00f217..f22e7be5d88eab5b6ff1e698dc19a15e320870fc 100644 (file)
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.287 2009年06月11日 20:46:11 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.288 2009年06月18日 01:27:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -5206,14 +5206,13 @@ CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint,
if (on_insert)
{
fk_trigger->funcname = SystemFuncName("RI_FKey_check_ins");
- fk_trigger->actions[0] = 'i';
+ fk_trigger->events = TRIGGER_TYPE_INSERT;
}
else
{
fk_trigger->funcname = SystemFuncName("RI_FKey_check_upd");
- fk_trigger->actions[0] = 'u';
+ fk_trigger->events = TRIGGER_TYPE_UPDATE;
}
- fk_trigger->actions[1] = '0円';
fk_trigger->isconstraint = true;
fk_trigger->deferrable = fkconstraint->deferrable;
@@ -5263,9 +5262,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
fk_trigger->relation = fkconstraint->pktable;
fk_trigger->before = false;
fk_trigger->row = true;
- fk_trigger->actions[0] = 'd';
- fk_trigger->actions[1] = '0円';
-
+ fk_trigger->events = TRIGGER_TYPE_DELETE;
fk_trigger->isconstraint = true;
fk_trigger->constrrel = myRel;
switch (fkconstraint->fk_del_action)
@@ -5316,8 +5313,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
fk_trigger->relation = fkconstraint->pktable;
fk_trigger->before = false;
fk_trigger->row = true;
- fk_trigger->actions[0] = 'u';
- fk_trigger->actions[1] = '0円';
+ fk_trigger->events = TRIGGER_TYPE_UPDATE;
fk_trigger->isconstraint = true;
fk_trigger->constrrel = myRel;
switch (fkconstraint->fk_upd_action)
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 08d9593de9118cdedc85f7d359178cbcf2296787..bb628ed80a3a9b1edbb5c1233a02cf178820ee49 100644 (file)
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.247 2009年06月11日 14:48:56 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.248 2009年06月18日 01:27:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -100,7 +100,6 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid, bool checkPermissions)
Oid funcoid;
Oid funcrettype;
Oid trigoid;
- int i;
char constrtrigname[NAMEDATALEN];
char *trigname;
char *constrname;
@@ -150,50 +149,13 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid, bool checkPermissions)
TRIGGER_SETT_BEFORE(tgtype);
if (stmt->row)
TRIGGER_SETT_ROW(tgtype);
+ tgtype |= stmt->events;
- for (i = 0; stmt->actions[i]; i++)
- {
- switch (stmt->actions[i])
- {
- case 'i':
- if (TRIGGER_FOR_INSERT(tgtype))
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("multiple INSERT events specified")));
- TRIGGER_SETT_INSERT(tgtype);
- break;
- case 'd':
- if (TRIGGER_FOR_DELETE(tgtype))
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("multiple DELETE events specified")));
- TRIGGER_SETT_DELETE(tgtype);
- break;
- case 'u':
- if (TRIGGER_FOR_UPDATE(tgtype))
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("multiple UPDATE events specified")));
- TRIGGER_SETT_UPDATE(tgtype);
- break;
- case 't':
- if (TRIGGER_FOR_TRUNCATE(tgtype))
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("multiple TRUNCATE events specified")));
- TRIGGER_SETT_TRUNCATE(tgtype);
- /* Disallow ROW-level TRUNCATE triggers */
- if (stmt->row)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("TRUNCATE FOR EACH ROW triggers are not supported")));
- break;
- default:
- elog(ERROR, "unrecognized trigger event: %d",
- (int) stmt->actions[i]);
- break;
- }
- }
+ /* Disallow ROW-level TRUNCATE triggers */
+ if (TRIGGER_FOR_ROW(tgtype) && TRIGGER_FOR_TRUNCATE(tgtype))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("TRUNCATE FOR EACH ROW triggers are not supported")));
/*
* Find and validate the trigger function.
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 4917986e891dbafe352b6af4eca42e95e60cb6a0..72c9877ffd5c8c8b906d9f526746d83e8fc2656b 100644 (file)
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.431 2009年06月11日 14:48:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.432 2009年06月18日 01:27:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3081,7 +3081,7 @@ _copyCreateTrigStmt(CreateTrigStmt *from)
COPY_NODE_FIELD(args);
COPY_SCALAR_FIELD(before);
COPY_SCALAR_FIELD(row);
- strcpy(newnode->actions, from->actions); /* in-line string field */
+ COPY_SCALAR_FIELD(events);
COPY_SCALAR_FIELD(isconstraint);
COPY_SCALAR_FIELD(deferrable);
COPY_SCALAR_FIELD(initdeferred);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 78756e6e788d4e5a4b813756050f88da93e340fb..041b96971c63657cdb78caaaa0431212944ebad4 100644 (file)
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -22,7 +22,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.354 2009年06月11日 14:48:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.355 2009年06月18日 01:27:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1639,8 +1639,7 @@ _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
COMPARE_NODE_FIELD(args);
COMPARE_SCALAR_FIELD(before);
COMPARE_SCALAR_FIELD(row);
- if (strcmp(a->actions, b->actions) != 0) /* in-line string field */
- return false;
+ COMPARE_SCALAR_FIELD(events);
COMPARE_SCALAR_FIELD(isconstraint);
COMPARE_SCALAR_FIELD(deferrable);
COMPARE_SCALAR_FIELD(initdeferred);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 544b69246ed67c85b7a2a461492a18d7debf6e34..280443074f5de72d1b2ad80bc81729b36ca27448 100644 (file)
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.664 2009年05月27日 20:42:29 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.665 2009年06月18日 01:27:02 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -53,6 +53,7 @@
#include "catalog/index.h"
#include "catalog/namespace.h"
+#include "catalog/pg_trigger.h"
#include "commands/defrem.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
@@ -244,7 +245,7 @@ static TypeName *TableFuncTypeName(List *columns);
%type <boolean> TriggerActionTime TriggerForSpec opt_trusted opt_restart_seqs
%type <str> opt_lancompiler
-%type <str> TriggerEvents
+%type <ival> TriggerEvents TriggerOneEvent
%type <value> TriggerFuncArg
%type <str> relation_name copy_file_name
@@ -266,7 +267,6 @@ static TypeName *TableFuncTypeName(List *columns);
%type <privtarget> privilege_target
%type <funwithargs> function_with_argtypes
%type <list> function_with_argtypes_list
-%type <chr> TriggerOneEvent
%type <list> stmtblock stmtmulti
OptTableElementList TableElementList OptInherit definition
@@ -3133,7 +3133,7 @@ CreateTrigStmt:
n->args = 13ドル;
n->before = 4ドル;
n->row = 8ドル;
- memcpy(n->actions, 5,ドル 4);
+ n->events = 5ドル;
n->isconstraint = FALSE;
n->deferrable = FALSE;
n->initdeferred = FALSE;
@@ -3153,11 +3153,10 @@ CreateTrigStmt:
n->args = 18ドル;
n->before = FALSE;
n->row = TRUE;
- memcpy(n->actions, 6,ドル 4);
+ n->events = 6ドル;
n->isconstraint = TRUE;
n->deferrable = (10ドル & 1) != 0;
n->initdeferred = (10ドル & 2) != 0;
-
n->constrrel = 9ドル;
$$ = (Node *)n;
}
@@ -3170,30 +3169,20 @@ TriggerActionTime:
TriggerEvents:
TriggerOneEvent
+ { $$ = 1ドル; }
+ | TriggerEvents OR TriggerOneEvent
{
- char *e = palloc(4);
- e[0] = 1ドル; e[1] = '0円';
- $$ = e;
- }
- | TriggerOneEvent OR TriggerOneEvent
- {
- char *e = palloc(4);
- e[0] = 1ドル; e[1] = 3ドル; e[2] = '0円';
- $$ = e;
- }
- | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
- {
- char *e = palloc(4);
- e[0] = 1ドル; e[1] = 3ドル; e[2] = 5ドル; e[3] = '0円';
- $$ = e;
+ if (1ドル & 3ドル)
+ yyerror("duplicate trigger events specified");
+ $$ = 1ドル | 3ドル;
}
;
TriggerOneEvent:
- INSERT { $$ = 'i'; }
- | DELETE_P { $$ = 'd'; }
- | UPDATE { $$ = 'u'; }
- | TRUNCATE { $$ = 't'; }
+ INSERT { $$ = TRIGGER_TYPE_INSERT; }
+ | DELETE_P { $$ = TRIGGER_TYPE_DELETE; }
+ | UPDATE { $$ = TRIGGER_TYPE_UPDATE; }
+ | TRUNCATE { $$ = TRIGGER_TYPE_TRUNCATE; }
;
TriggerForSpec:
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 54f1007818391aca19865ec51a1a1e4cad9cf5cb..7793f66f20fd5597e5628b4b9c9d9b7b7bb14923 100644 (file)
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -13,7 +13,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.394 2009年06月11日 14:49:11 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.395 2009年06月18日 01:27:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1551,7 +1551,8 @@ typedef struct CreateTrigStmt
List *args; /* list of (T_String) Values or NIL */
bool before; /* BEFORE/AFTER */
bool row; /* ROW/STATEMENT */
- char actions[4]; /* 1 to 3 of 'i', 'u', 'd', + trailing 0円 */
+ /* events uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */
+ int16 events; /* INSERT/UPDATE/DELETE/TRUNCATE */
/* The following are used for referential */
/* integrity constraint triggers */
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /