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.
index f75261160e7335c47ddc7227a5ac0548eb00f217..f22e7be5d88eab5b6ff1e698dc19a15e320870fc 100644 (file)
*
*
* 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)
index 08d9593de9118cdedc85f7d359178cbcf2296787..bb628ed80a3a9b1edbb5c1233a02cf178820ee49 100644 (file)
* 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.
index 4917986e891dbafe352b6af4eca42e95e60cb6a0..72c9877ffd5c8c8b906d9f526746d83e8fc2656b 100644 (file)
* 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 $
*
*-------------------------------------------------------------------------
*/
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);
index 78756e6e788d4e5a4b813756050f88da93e340fb..041b96971c63657cdb78caaaa0431212944ebad4 100644 (file)
* 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);
index 544b69246ed67c85b7a2a461492a18d7debf6e34..280443074f5de72d1b2ad80bc81729b36ca27448 100644 (file)
*
*
* 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
#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
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;
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;
}
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:
index 54f1007818391aca19865ec51a1a1e4cad9cf5cb..7793f66f20fd5597e5628b4b9c9d9b7b7bb14923 100644 (file)
* 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 $
*
*-------------------------------------------------------------------------
*/
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 */