1010 *
1111 *
1212 * IDENTIFICATION
13- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.73 1999/05/11 03:28:42 momjian Exp $
13+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.74 1999/05/12 07:22:51 thomas Exp $
1414 *
1515 * HISTORY
1616 * AUTHORDATEMAJOR EVENT
@@ -136,16 +136,17 @@ Oidparam_type(int t); /* used in parse_expr.c */
136136ClusterStmt, ExplainStmt, VariableSetStmt, VariableShowStmt, VariableResetStmt,
137137CreateUserStmt, AlterUserStmt, DropUserStmt, RuleActionStmt
138138
139- %type <str>opt_database1, opt_database2, location, encoding
139+ %type <str> opt_database1, opt_database2, location, encoding
140140
141- %type <str>opt_lmode
141+ %type <ival>opt_lock, lock_type
142+ %type <boolean>opt_lmode
142143
143144%type <pboolean> user_createdb_clause, user_createuser_clause
144- %type <str> user_passwd_clause
145- %type <str> user_valid_clause
146- %type <list> user_group_list, user_group_clause
145+ %type <str> user_passwd_clause
146+ %type <str> user_valid_clause
147+ %type <list> user_group_list, user_group_clause
147148
148- %type <boolean> TriggerActionTime, TriggerForSpec, PLangTrusted
149+ %type <boolean> TriggerActionTime, TriggerForSpec, PLangTrusted
149150
150151%type <str>TriggerEvents, TriggerFuncArg
151152
@@ -157,6 +158,7 @@ Oidparam_type(int t); /* used in parse_expr.c */
157158all_Op, MathOp, opt_name, opt_unique,
158159OptUseOp, opt_class, SpecialRuleRelation
159160
161+ %type <str>opt_level
160162%type <str>privileges, operation_commalist, grantee
161163%type <chr>operation, TriggerOneEvent
162164
@@ -175,7 +177,7 @@ Oidparam_type(int t); /* used in parse_expr.c */
175177%type <node>func_return
176178%type <boolean>set_opt
177179
178- %type <boolean>TriggerForOpt, TriggerForType, OptTemp
180+ %type <boolean>TriggerForOpt, TriggerForType, OptTemp, OptTempType, OptTempScope
179181
180182%type <list>for_update_clause, update_list
181183%type <boolean>opt_union
@@ -274,13 +276,13 @@ Oidparam_type(int t); /* used in parse_expr.c */
274276%tokenABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
275277BEGIN_TRANS, BETWEEN, BOTH, BY,
276278CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
277- COALESCE, COLLATE, COLUMN, COMMIT,
279+ COALESCE, COLLATE, COLUMN, COMMIT,
278280CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
279281CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
280282DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
281283ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,
282284FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
283- GRANT, GROUP, HAVING, HOUR_P,
285+ GLOBAL, GRANT, GROUP, HAVING, HOUR_P,
284286IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,
285287ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
286288MATCH, MINUTE_P, MONTH_P, NAMES,
@@ -299,25 +301,28 @@ Oidparam_type(int t); /* used in parse_expr.c */
299301%tokenTRIGGER
300302
301303/* Keywords (in SQL92 non-reserved words) */
302- %tokenTYPE_P
304+ %tokenCOMMITTED, SERIALIZABLE, TYPE_P
303305
304306/* Keywords for Postgres support (not in SQL92 reserved words)
305307 *
306308 * The CREATEDB and CREATEUSER tokens should go away
307309 * when some sort of pg_privileges relation is introduced.
308310 * - Todd A. Brandys 1998-01-01?
309311 */
310- %tokenABORT_TRANS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY,
312+ %tokenABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE,
313+ BACKWARD, BEFORE, BINARY,
311314CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
312- DATABASE, DELIMITERS, DO, EACH, ENCODING, EXPLAIN, EXTEND,
315+ DATABASE, DELIMITERS, DO,
316+ EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,
313317FORWARD, FUNCTION, HANDLER,
314318INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
315319LANCOMPILER, LIMIT, LISTEN, LOAD, LOCATION, LOCK_P,
316- MAXVALUE, MINVALUE, MOVE,
320+ MAXVALUE, MINVALUE,MODE, MOVE,
317321NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
318322OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
319323RENAME, RESET, RETURNS, ROW, RULE,
320- SEQUENCE, SERIAL, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED,
324+ SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT,
325+ TRUSTED,
321326UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
322327
323328/* Special keywords, not in the query language - see the "lex" file */
@@ -557,22 +562,11 @@ VariableSetStmt: SET ColId TO var_value
557562n->value = $4;
558563$$ = (Node *) n;
559564}
560- | SET TRANSACTION ISOLATION LEVEL READ ColId
561- {
562- VariableSetStmt *n = makeNode(VariableSetStmt);
563- n->name = "XactIsoLevel";
564- n->value = $6;
565- if (strcasecmp(n->value, "COMMITTED"))
566- elog(ERROR,"parser: syntax error at or near \"%s\"", n->value);
567- $$ = (Node *) n;
568- }
569- | SET TRANSACTION ISOLATION LEVEL ColId
565+ | SET TRANSACTION ISOLATION LEVEL opt_level
570566{
571567VariableSetStmt *n = makeNode(VariableSetStmt);
572568n->name = "XactIsoLevel";
573569n->value = $5;
574- if (strcasecmp(n->value, "SERIALIZABLE"))
575- elog(ERROR,"parser: syntax error at or near \"%s\"", n->value);
576570$$ = (Node *) n;
577571}
578572| SET NAMES encoding
@@ -588,6 +582,10 @@ VariableSetStmt: SET ColId TO var_value
588582}
589583;
590584
585+ opt_level: READ COMMITTED{ $$ = "committed"; }
586+ | SERIALIZABLE{ $$ = "serializable"; }
587+ ;
588+
591589var_value: Sconst{ $$ = $1; }
592590| DEFAULT{ $$ = NULL; }
593591;
@@ -767,12 +765,26 @@ CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
767765}
768766;
769767
770- OptTemp:
771- TEMP{ $$ = TRUE; }
768+ OptTemp: OptTempType{ $$ = $1; }
769+ | OptTempScope OptTempType{ $$ = $2; }
770+ ;
771+
772+ OptTempType: TEMP{ $$ = TRUE; }
772773| TEMPORARY{ $$ = TRUE; }
773774| /*EMPTY*/{ $$ = FALSE; }
774775;
775776
777+ OptTempScope: GLOBAL
778+ {
779+ elog(ERROR, "GLOBAL TEMPORARY TABLE is not currently supported");
780+ $$ = TRUE;
781+ }
782+ | LOCAL
783+ {
784+ $$ = FALSE;
785+ }
786+ ;
787+
776788OptTableElementList: OptTableElementList ',' OptTableElement
777789{
778790if ($3 != NULL)
@@ -2580,78 +2592,31 @@ DeleteStmt: DELETE FROM relation_name
25802592}
25812593;
25822594
2583- LockStmt:LOCK_P opt_table relation_name
2595+ LockStmt:LOCK_P opt_table relation_name opt_lock
25842596{
25852597LockStmt *n = makeNode(LockStmt);
25862598
25872599n->relname = $3;
2588- n->mode =AccessExclusiveLock ;
2600+ n->mode =$4 ;
25892601$$ = (Node *)n;
25902602}
2591- |LOCK_P opt_table relation_name IN opt_lmode ROW IDENT IDENT
2592- {
2593- LockStmt *n = makeNode(LockStmt);
2594-
2595- n->relname = $3;
2596- if (strcasecmp($8, "MODE"))
2597- elog(ERROR,"parser: syntax error at or near \"%s\"", $8);
2598- if ($5 != NULL)
2599- {
2600- if (strcasecmp($5, "SHARE"))
2601- elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
2602- if (strcasecmp($7, "EXCLUSIVE"))
2603- elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
2604- n->mode = ShareRowExclusiveLock;
2605- }
2606- else
2607- {
2608- if (strcasecmp($7, "SHARE") == 0)
2609- n->mode = RowShareLock;
2610- else if (strcasecmp($7, "EXCLUSIVE") == 0)
2611- n->mode = RowExclusiveLock;
2612- else
2613- elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
2614- }
2615- $$ = (Node *)n;
2616- }
2617- |LOCK_P opt_table relation_name IN IDENT IDENT IDENT
2618- {
2619- LockStmt *n = makeNode(LockStmt);
2603+ ;
26202604
2621- n->relname = $3;
2622- if (strcasecmp($7, "MODE"))
2623- elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
2624- if (strcasecmp($5, "ACCESS"))
2625- elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
2626- if (strcasecmp($6, "SHARE") == 0)
2627- n->mode = AccessShareLock;
2628- else if (strcasecmp($6, "EXCLUSIVE") == 0)
2629- n->mode = AccessExclusiveLock;
2630- else
2631- elog(ERROR,"parser: syntax error at or near \"%s\"", $6);
2632- $$ = (Node *)n;
2633- }
2634- |LOCK_P opt_table relation_name IN IDENT IDENT
2635- {
2636- LockStmt *n = makeNode(LockStmt);
2605+ opt_lock: lock_type MODE{ $$ = $1; }
2606+ | /*EMPTY*/{ $$ = AccessExclusiveLock; }
2607+ ;
26372608
2638- n->relname = $3;
2639- if (strcasecmp($6, "MODE"))
2640- elog(ERROR,"parser: syntax error at or near \"%s\"", $6);
2641- if (strcasecmp($5, "SHARE") == 0)
2642- n->mode = ShareLock;
2643- else if (strcasecmp($5, "EXCLUSIVE") == 0)
2644- n->mode = ExclusiveLock;
2645- else
2646- elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
2647- $$ = (Node *)n;
2648- }
2609+ lock_type: SHARE ROW EXCLUSIVE{ $$ = ShareRowExclusiveLock; }
2610+ | ROW opt_lmode{ $$ = ($2? RowShareLock: RowExclusiveLock); }
2611+ | ACCESS opt_lmode{ $$ = ($2? AccessShareLock: AccessExclusiveLock); }
2612+ | opt_lmode{ $$ = ($1? ShareLock: ExclusiveLock); }
26492613;
26502614
2651- opt_lmode:IDENT { $$ =$1 ; }
2652- |/*EMPTY*/ { $$ =NULL ; }
2615+ opt_lmode:SHARE { $$ =TRUE ; }
2616+ |EXCLUSIVE { $$ =FALSE ; }
26532617;
26542618
2619+
26552620/*****************************************************************************
26562621 *
26572622 *QUERY:
@@ -5173,12 +5138,14 @@ TypeId: ColId
51735138ColId: IDENT{ $$ = $1; }
51745139| datetime{ $$ = $1; }
51755140| ABSOLUTE{ $$ = "absolute"; }
5141+ | ACCESS{ $$ = "access"; }
51765142| ACTION{ $$ = "action"; }
51775143| AFTER{ $$ = "after"; }
51785144| AGGREGATE{ $$ = "aggregate"; }
51795145| BACKWARD{ $$ = "backward"; }
51805146| BEFORE{ $$ = "before"; }
51815147| CACHE{ $$ = "cache"; }
5148+ | COMMITTED{ $$ = "committed"; }
51825149| CREATEDB{ $$ = "createdb"; }
51835150| CREATEUSER{ $$ = "createuser"; }
51845151| CYCLE{ $$ = "cycle"; }
@@ -5187,6 +5154,7 @@ ColId: IDENT{ $$ = $1; }
51875154| DOUBLE{ $$ = "double"; }
51885155| EACH{ $$ = "each"; }
51895156| ENCODING{ $$ = "encoding"; }
5157+ | EXCLUSIVE{ $$ = "exclusive"; }
51905158| FORWARD{ $$ = "forward"; }
51915159| FUNCTION{ $$ = "function"; }
51925160| HANDLER{ $$ = "handler"; }
@@ -5203,6 +5171,7 @@ ColId: IDENT{ $$ = $1; }
52035171| MATCH{ $$ = "match"; }
52045172| MAXVALUE{ $$ = "maxvalue"; }
52055173| MINVALUE{ $$ = "minvalue"; }
5174+ | MODE{ $$ = "mode"; }
52065175| NEXT{ $$ = "next"; }
52075176| NOCREATEDB{ $$ = "nocreatedb"; }
52085177| NOCREATEUSER{ $$ = "nocreateuser"; }
@@ -5226,6 +5195,8 @@ ColId: IDENT{ $$ = $1; }
52265195| SCROLL{ $$ = "scroll"; }
52275196| SEQUENCE{ $$ = "sequence"; }
52285197| SERIAL{ $$ = "serial"; }
5198+ | SERIALIZABLE{ $$ = "serializable"; }
5199+ | SHARE{ $$ = "share"; }
52295200| START{ $$ = "start"; }
52305201| STATEMENT{ $$ = "statement"; }
52315202| STDIN{ $$ = "stdin"; }
@@ -5269,9 +5240,11 @@ ColLabel: ColId{ $$ = $1; }
52695240| EXTEND{ $$ = "extend"; }
52705241| FALSE_P{ $$ = "false"; }
52715242| FOREIGN{ $$ = "foreign"; }
5243+ | GLOBAL{ $$ = "global"; }
52725244| GROUP{ $$ = "group"; }
52735245| LISTEN{ $$ = "listen"; }
52745246| LOAD{ $$ = "load"; }
5247+ | LOCAL{ $$ = "local"; }
52755248| LOCK_P{ $$ = "lock"; }
52765249| MOVE{ $$ = "move"; }
52775250| NEW{ $$ = "new"; }