10
10
*
11
11
*
12
12
* 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 $
14
14
*
15
15
* HISTORY
16
16
* AUTHOR DATE MAJOR EVENT
@@ -107,7 +107,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
107
107
%type <node> stmt,
108
108
AddAttrStmt, ClosePortalStmt,
109
109
CopyStmt, CreateStmt, CreateSeqStmt, DefineStmt, DestroyStmt,
110
- ExtendStmt, FetchStmt, GrantStmt,
110
+ ExtendStmt, FetchStmt, GrantStmt, CreateTrigStmt, DropTrigStmt,
111
111
IndexStmt, MoveStmt, ListenStmt, OptimizableStmt,
112
112
ProcedureStmt, PurgeStmt,
113
113
RecipeStmt, RemoveAggrStmt, RemoveOperStmt, RemoveFuncStmt, RemoveStmt,
@@ -119,9 +119,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
119
119
%type <str> txname
120
120
%type <node> SubSelect
121
121
%type <str> join_clause, join_type, join_outer, join_spec
122
- %type <boolean> join_qual
122
+ %type <boolean> join_qual, TriggerActionTime, TriggerForSpec
123
123
124
- %type <str> datetime
124
+ %type <str> datetime, TriggerEvents, TriggerFuncArg
125
125
126
126
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
127
127
database_name, access_method_clause, access_method, attr_name,
@@ -136,7 +136,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
136
136
SpecialRuleRelation
137
137
138
138
%type <str> privileges, operation_commalist, grantee
139
- %type <chr> operation
139
+ %type <chr> operation, TriggerOneEvent
140
140
141
141
%type <list> stmtblock, stmtmulti,
142
142
relation_name_list, OptTableElementList, tableElementList,
@@ -147,7 +147,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
147
147
sort_clause, sortby_list, index_params, index_list, name_list,
148
148
from_clause, from_list, opt_array_bounds, nest_array_bounds,
149
149
expr_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
151
151
152
152
%type <list> union_clause, select_list
153
153
%type <list> join_list
@@ -217,10 +217,10 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
217
217
MERGE, MINUTEINTERVAL, MONTHINTERVAL, MOVE,
218
218
NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL,
219
219
OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN,
220
- PNULL, POSITION, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
220
+ PNULL, POSITION, PRIVILEGES, PROCEDURE, PUBLIC, PURGE, P_TYPE,
221
221
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE,
222
222
SECONDINTERVAL, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE, SUBSTRING,
223
- TABLE, TIME, TO, TRAILING, TRANSACTION, TRIM,
223
+ TABLE, TIME, TO, TRAILING, TRANSACTION, TRIGGER, TRIM,
224
224
UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES,
225
225
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK, YEARINTERVAL, ZONE
226
226
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
@@ -278,9 +278,11 @@ stmt : AddAttrStmt
278
278
| CopyStmt
279
279
| CreateStmt
280
280
| CreateSeqStmt
281
+ | CreateTrigStmt
281
282
| ClusterStmt
282
283
| DefineStmt
283
284
| DestroyStmt
285
+ | DropTrigStmt
284
286
| ExtendStmt
285
287
| ExplainStmt
286
288
| FetchStmt
@@ -713,6 +715,95 @@ OptSeqElem: IDENT NumConst
713
715
;
714
716
715
717
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
+
716
807
/*****************************************************************************
717
808
*
718
809
* QUERY :
0 commit comments