Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbad4bc4

Browse files
committed
CREATE/DROP TRIGGER syntax
1 parent0badb77 commitbad4bc4

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
* AUTHORDATEMAJOR 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
%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 :

‎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)

[8]ページ先頭

©2009-2025 Movatter.jp