1010 *
1111 *
1212 * IDENTIFICATION
13- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.41 1997/09/01 06:00:35 thomas Exp $
13+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.42 1997/09/04 13:24:25 vadim Exp $
1414 *
1515 * HISTORY
1616 * AUTHORDATEMAJOR EVENT
@@ -107,7 +107,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
107107%type <node>stmt,
108108AddAttrStmt, ClosePortalStmt,
109109CopyStmt, CreateStmt, CreateSeqStmt, DefineStmt, DestroyStmt,
110- ExtendStmt, FetchStmt,GrantStmt,
110+ ExtendStmt, FetchStmt,GrantStmt, CreateTrigStmt, DropTrigStmt,
111111IndexStmt, MoveStmt, ListenStmt, OptimizableStmt,
112112 ProcedureStmt, PurgeStmt,
113113RecipeStmt, RemoveAggrStmt, RemoveOperStmt, RemoveFuncStmt, RemoveStmt,
@@ -119,9 +119,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
119119%type <str>txname
120120%type <node>SubSelect
121121%type <str>join_clause, join_type, join_outer, join_spec
122- %type <boolean>join_qual
122+ %type <boolean>join_qual, TriggerActionTime, TriggerForSpec
123123
124- %type <str>datetime
124+ %type <str>datetime, TriggerEvents, TriggerFuncArg
125125
126126%type <str>relation_name, copy_file_name, copy_delimiter, def_name,
127127database_name, access_method_clause, access_method, attr_name,
@@ -136,7 +136,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
136136SpecialRuleRelation
137137
138138%type <str>privileges, operation_commalist, grantee
139- %type <chr>operation
139+ %type <chr>operation, TriggerOneEvent
140140
141141%type <list>stmtblock, stmtmulti,
142142relation_name_list, OptTableElementList, tableElementList,
@@ -147,7 +147,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
147147sort_clause, sortby_list, index_params, index_list, name_list,
148148from_clause, from_list, opt_array_bounds, nest_array_bounds,
149149expr_list, default_expr_list, attrs, res_target_list, res_target_list2,
150- def_list, opt_indirection, group_clause, groupby_list
150+ def_list, opt_indirection, group_clause, groupby_list, TriggerFuncArgs
151151
152152%type <list>union_clause, select_list
153153%type <list>join_list
@@ -217,10 +217,10 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
217217MERGE, MINUTEINTERVAL, MONTHINTERVAL, MOVE,
218218NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL,
219219OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN,
220- PNULL, POSITION, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
220+ PNULL, POSITION, PRIVILEGES,PROCEDURE, PUBLIC, PURGE, P_TYPE,
221221RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE,
222222SECONDINTERVAL, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE, SUBSTRING,
223- TABLE, TIME, TO, TRAILING, TRANSACTION, TRIM,
223+ TABLE, TIME, TO, TRAILING, TRANSACTION,TRIGGER, TRIM,
224224UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES,
225225VERBOSE, VERSION, VIEW, WHERE, WITH, WORK, YEARINTERVAL, ZONE
226226%tokenEXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
@@ -278,9 +278,11 @@ stmt : AddAttrStmt
278278| CopyStmt
279279| CreateStmt
280280| CreateSeqStmt
281+ | CreateTrigStmt
281282| ClusterStmt
282283| DefineStmt
283284| DestroyStmt
285+ | DropTrigStmt
284286| ExtendStmt
285287| ExplainStmt
286288| FetchStmt
@@ -713,6 +715,95 @@ OptSeqElem:IDENT NumConst
713715;
714716
715717
718+ /*****************************************************************************
719+ *
720+ *QUERIES :
721+ *CREATE TRIGGER ...
722+ *DROP TRIGGER ...
723+ *
724+ *****************************************************************************/
725+
726+ CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
727+ relation_name TriggerForSpec EXECUTE PROCEDURE
728+ name '(' TriggerFuncArgs ')'
729+ {
730+ CreateTrigStmt *n = makeNode(CreateTrigStmt);
731+ n->trigname = $3;
732+ n->relname = $7;
733+ n->funcname = $11;
734+ n->args = $13;
735+ n->before = $4;
736+ n->row = $8;
737+ memcpy (n->actions, $5, 4);
738+ $$ = (Node *)n;
739+ }
740+ ;
741+
742+ TriggerActionTime:BEFORE{ $$ = true; }
743+ |AFTER{ $$ = false; }
744+ ;
745+
746+ TriggerEvents:TriggerOneEvent
747+ {
748+ char *e = palloc (4);
749+ e[0] = $1; e[1] = 0; $$ = e;
750+ }
751+ | TriggerOneEvent OR TriggerOneEvent
752+ {
753+ char *e = palloc (4);
754+ e[0] = $1; e[1] = $3; e[2] = 0; $$ = e;
755+ }
756+ | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
757+ {
758+ char *e = palloc (4);
759+ e[0] = $1; e[1] = $3; e[2] = $5; e[3] = 0;
760+ $$ = e;
761+ }
762+ ;
763+
764+ TriggerOneEvent:INSERT{ $$ = 'i'; }
765+ |DELETE{ $$ = 'd'; }
766+ |UPDATE{ $$ = 'u'; }
767+ ;
768+
769+ TriggerForSpec:FOR name name
770+ {
771+ if ( strcmp ($2, "each") != 0 )
772+ elog (WARN, "parser: syntax error near %s", $2);
773+ if ( strcmp ($3, "row") == 0 )
774+ $$ = true;
775+ else if ( strcmp ($3, "statement") == 0 )
776+ $$ = false;
777+ else
778+ elog (WARN, "parser: syntax error near %s", $3);
779+ }
780+ ;
781+
782+ TriggerFuncArgs: TriggerFuncArg
783+ { $$ = lcons($1, NIL); }
784+ | TriggerFuncArgs ',' TriggerFuncArg
785+ { $$ = lappend($1, $3); }
786+ | /* EMPTY */{ $$ = NIL; }
787+ ;
788+
789+ TriggerFuncArg:ICONST
790+ {
791+ char *s = (char *) palloc (256);
792+ sprintf (s, "%d", $1);
793+ $$ = s;
794+ }
795+ | Sconst{ $$ = $1; }
796+ ;
797+
798+ DropTrigStmt:DROP TRIGGER name ON relation_name
799+ {
800+ DropTrigStmt *n = makeNode(DropTrigStmt);
801+ n->trigname = $3;
802+ n->relname = $5;
803+ $$ = (Node *) n;
804+ }
805+ ;
806+
716807/*****************************************************************************
717808 *
718809 *QUERY :