Skip to content

Commit bad4bc4

Browse files
committed
CREATE/DROP TRIGGER syntax
1 parent 0badb77 commit bad4bc4

File tree

2 files changed

+102
-9
lines changed

2 files changed

+102
-9
lines changed

src/backend/parser/gram.y

Lines changed: 99 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
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
* AUTHOR DATE MAJOR EVENT
@@ -107,7 +107,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
107107
%type <node> stmt,
108108
AddAttrStmt, ClosePortalStmt,
109109
CopyStmt, CreateStmt, CreateSeqStmt, DefineStmt, DestroyStmt,
110-
ExtendStmt, FetchStmt, GrantStmt,
110+
ExtendStmt, FetchStmt, GrantStmt, CreateTrigStmt, DropTrigStmt,
111111
IndexStmt, MoveStmt, ListenStmt, OptimizableStmt,
112112
ProcedureStmt, PurgeStmt,
113113
RecipeStmt, 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,
127127
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);
136136
SpecialRuleRelation
137137

138138
%type <str> privileges, operation_commalist, grantee
139-
%type <chr> operation
139+
%type <chr> operation, TriggerOneEvent
140140

141141
%type <list> stmtblock, stmtmulti,
142142
relation_name_list, OptTableElementList, tableElementList,
@@ -147,7 +147,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
147147
sort_clause, sortby_list, index_params, index_list, name_list,
148148
from_clause, from_list, opt_array_bounds, nest_array_bounds,
149149
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
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);
217217
MERGE, MINUTEINTERVAL, MONTHINTERVAL, MOVE,
218218
NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL,
219219
OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN,
220-
PNULL, POSITION, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
220+
PNULL, POSITION, PRIVILEGES, PROCEDURE, PUBLIC, PURGE, P_TYPE,
221221
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE,
222222
SECONDINTERVAL, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE, SUBSTRING,
223-
TABLE, TIME, TO, TRAILING, TRANSACTION, TRIM,
223+
TABLE, TIME, TO, TRAILING, TRANSACTION, TRIGGER, TRIM,
224224
UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES,
225225
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK, YEARINTERVAL, ZONE
226226
%token EXECUTE, 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 :

src/backend/parser/keywords.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.13 1997/09/01 05:53:31 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.14 1997/09/04 13:24:26 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -133,6 +133,7 @@ static ScanKeyword ScanKeywords[] = {
133133
{ "outer", OUTERJOIN },
134134
{ "position", POSITION },
135135
{ "privileges", PRIVILEGES },
136+
{ "procedure", PROCEDURE },
136137
{ "public", PUBLIC },
137138
{ "purge", PURGE },
138139
{ "recipe", RECIPE },
@@ -160,6 +161,7 @@ static ScanKeyword ScanKeywords[] = {
160161
{ "to", TO },
161162
{ "transaction", TRANSACTION },
162163
{ "trailing", TRAILING },
164+
{ "trigger", TRIGGER },
163165
{ "trim", TRIM },
164166
{ "type", P_TYPE },
165167
{ "union", UNION },

0 commit comments

Comments
 (0)