10
10
*
11
11
*
12
12
* 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 $
14
14
*
15
15
* HISTORY
16
16
* AUTHOR DATE MAJOR EVENT
@@ -136,16 +136,17 @@ Oid param_type(int t); /* used in parse_expr.c */
136
136
ClusterStmt, ExplainStmt, VariableSetStmt, VariableShowStmt, VariableResetStmt,
137
137
CreateUserStmt, AlterUserStmt, DropUserStmt, RuleActionStmt
138
138
139
- %type <str> opt_database1, opt_database2, location, encoding
139
+ %type <str> opt_database1, opt_database2, location, encoding
140
140
141
- %type <str> opt_lmode
141
+ %type <ival> opt_lock, lock_type
142
+ %type <boolean> opt_lmode
142
143
143
144
%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
147
148
148
- %type <boolean> TriggerActionTime, TriggerForSpec, PLangTrusted
149
+ %type <boolean> TriggerActionTime, TriggerForSpec, PLangTrusted
149
150
150
151
%type <str> TriggerEvents, TriggerFuncArg
151
152
@@ -157,6 +158,7 @@ Oid param_type(int t); /* used in parse_expr.c */
157
158
all_Op, MathOp, opt_name, opt_unique,
158
159
OptUseOp, opt_class, SpecialRuleRelation
159
160
161
+ %type <str> opt_level
160
162
%type <str> privileges, operation_commalist, grantee
161
163
%type <chr> operation, TriggerOneEvent
162
164
@@ -175,7 +177,7 @@ Oid param_type(int t); /* used in parse_expr.c */
175
177
%type <node> func_return
176
178
%type <boolean> set_opt
177
179
178
- %type <boolean> TriggerForOpt, TriggerForType, OptTemp
180
+ %type <boolean> TriggerForOpt, TriggerForType, OptTemp, OptTempType, OptTempScope
179
181
180
182
%type <list> for_update_clause, update_list
181
183
%type <boolean> opt_union
@@ -274,13 +276,13 @@ Oid param_type(int t); /* used in parse_expr.c */
274
276
%token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
275
277
BEGIN_TRANS, BETWEEN, BOTH, BY,
276
278
CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
277
- COALESCE, COLLATE, COLUMN, COMMIT,
279
+ COALESCE, COLLATE, COLUMN, COMMIT,
278
280
CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
279
281
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
280
282
DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
281
283
ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,
282
284
FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
283
- GRANT, GROUP, HAVING, HOUR_P,
285
+ GLOBAL, GRANT, GROUP, HAVING, HOUR_P,
284
286
IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,
285
287
ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
286
288
MATCH, MINUTE_P, MONTH_P, NAMES,
@@ -299,25 +301,28 @@ Oid param_type(int t); /* used in parse_expr.c */
299
301
%token TRIGGER
300
302
301
303
/* Keywords (in SQL92 non-reserved words) */
302
- %token TYPE_P
304
+ %token COMMITTED, SERIALIZABLE, TYPE_P
303
305
304
306
/* Keywords for Postgres support (not in SQL92 reserved words)
305
307
*
306
308
* The CREATEDB and CREATEUSER tokens should go away
307
309
* when some sort of pg_privileges relation is introduced.
308
310
* - Todd A. Brandys 1998-01-01?
309
311
*/
310
- %token ABORT_TRANS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY,
312
+ %token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE,
313
+ BACKWARD, BEFORE, BINARY,
311
314
CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
312
- DATABASE, DELIMITERS, DO, EACH, ENCODING, EXPLAIN, EXTEND,
315
+ DATABASE, DELIMITERS, DO,
316
+ EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,
313
317
FORWARD, FUNCTION, HANDLER,
314
318
INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
315
319
LANCOMPILER, LIMIT, LISTEN, LOAD, LOCATION, LOCK_P,
316
- MAXVALUE, MINVALUE, MOVE,
320
+ MAXVALUE, MINVALUE, MODE, MOVE,
317
321
NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
318
322
OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
319
323
RENAME, 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,
321
326
UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
322
327
323
328
/* Special keywords, not in the query language - see the "lex" file */
@@ -557,22 +562,11 @@ VariableSetStmt: SET ColId TO var_value
557
562
n->value = $4;
558
563
$$ = (Node *) n;
559
564
}
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
570
566
{
571
567
VariableSetStmt *n = makeNode(VariableSetStmt);
572
568
n->name = "XactIsoLevel";
573
569
n->value = $5;
574
- if (strcasecmp(n->value, "SERIALIZABLE"))
575
- elog(ERROR,"parser: syntax error at or near \"%s\"", n->value);
576
570
$$ = (Node *) n;
577
571
}
578
572
| SET NAMES encoding
@@ -588,6 +582,10 @@ VariableSetStmt: SET ColId TO var_value
588
582
}
589
583
;
590
584
585
+ opt_level: READ COMMITTED { $$ = "committed"; }
586
+ | SERIALIZABLE { $$ = "serializable"; }
587
+ ;
588
+
591
589
var_value: Sconst { $$ = $1; }
592
590
| DEFAULT { $$ = NULL; }
593
591
;
@@ -767,12 +765,26 @@ CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
767
765
}
768
766
;
769
767
770
- OptTemp:
771
- TEMP { $$ = TRUE; }
768
+ OptTemp: OptTempType { $$ = $1; }
769
+ | OptTempScope OptTempType { $$ = $2; }
770
+ ;
771
+
772
+ OptTempType: TEMP { $$ = TRUE; }
772
773
| TEMPORARY { $$ = TRUE; }
773
774
| /*EMPTY*/ { $$ = FALSE; }
774
775
;
775
776
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
+
776
788
OptTableElementList: OptTableElementList ',' OptTableElement
777
789
{
778
790
if ($3 != NULL)
@@ -2580,78 +2592,31 @@ DeleteStmt: DELETE FROM relation_name
2580
2592
}
2581
2593
;
2582
2594
2583
- LockStmt: LOCK_P opt_table relation_name
2595
+ LockStmt: LOCK_P opt_table relation_name opt_lock
2584
2596
{
2585
2597
LockStmt *n = makeNode(LockStmt);
2586
2598
2587
2599
n->relname = $3;
2588
- n->mode = AccessExclusiveLock ;
2600
+ n->mode = $4 ;
2589
2601
$$ = (Node *)n;
2590
2602
}
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
+ ;
2620
2604
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
+ ;
2637
2608
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); }
2649
2613
;
2650
2614
2651
- opt_lmode: IDENT { $$ = $1 ; }
2652
- | /*EMPTY*/ { $$ = NULL ; }
2615
+ opt_lmode: SHARE { $$ = TRUE ; }
2616
+ | EXCLUSIVE { $$ = FALSE ; }
2653
2617
;
2654
2618
2619
+
2655
2620
/*****************************************************************************
2656
2621
*
2657
2622
* QUERY:
@@ -5173,12 +5138,14 @@ TypeId: ColId
5173
5138
ColId: IDENT { $$ = $1; }
5174
5139
| datetime { $$ = $1; }
5175
5140
| ABSOLUTE { $$ = "absolute"; }
5141
+ | ACCESS { $$ = "access"; }
5176
5142
| ACTION { $$ = "action"; }
5177
5143
| AFTER { $$ = "after"; }
5178
5144
| AGGREGATE { $$ = "aggregate"; }
5179
5145
| BACKWARD { $$ = "backward"; }
5180
5146
| BEFORE { $$ = "before"; }
5181
5147
| CACHE { $$ = "cache"; }
5148
+ | COMMITTED { $$ = "committed"; }
5182
5149
| CREATEDB { $$ = "createdb"; }
5183
5150
| CREATEUSER { $$ = "createuser"; }
5184
5151
| CYCLE { $$ = "cycle"; }
@@ -5187,6 +5154,7 @@ ColId: IDENT { $$ = $1; }
5187
5154
| DOUBLE { $$ = "double"; }
5188
5155
| EACH { $$ = "each"; }
5189
5156
| ENCODING { $$ = "encoding"; }
5157
+ | EXCLUSIVE { $$ = "exclusive"; }
5190
5158
| FORWARD { $$ = "forward"; }
5191
5159
| FUNCTION { $$ = "function"; }
5192
5160
| HANDLER { $$ = "handler"; }
@@ -5203,6 +5171,7 @@ ColId: IDENT { $$ = $1; }
5203
5171
| MATCH { $$ = "match"; }
5204
5172
| MAXVALUE { $$ = "maxvalue"; }
5205
5173
| MINVALUE { $$ = "minvalue"; }
5174
+ | MODE { $$ = "mode"; }
5206
5175
| NEXT { $$ = "next"; }
5207
5176
| NOCREATEDB { $$ = "nocreatedb"; }
5208
5177
| NOCREATEUSER { $$ = "nocreateuser"; }
@@ -5226,6 +5195,8 @@ ColId: IDENT { $$ = $1; }
5226
5195
| SCROLL { $$ = "scroll"; }
5227
5196
| SEQUENCE { $$ = "sequence"; }
5228
5197
| SERIAL { $$ = "serial"; }
5198
+ | SERIALIZABLE { $$ = "serializable"; }
5199
+ | SHARE { $$ = "share"; }
5229
5200
| START { $$ = "start"; }
5230
5201
| STATEMENT { $$ = "statement"; }
5231
5202
| STDIN { $$ = "stdin"; }
@@ -5269,9 +5240,11 @@ ColLabel: ColId { $$ = $1; }
5269
5240
| EXTEND { $$ = "extend"; }
5270
5241
| FALSE_P { $$ = "false"; }
5271
5242
| FOREIGN { $$ = "foreign"; }
5243
+ | GLOBAL { $$ = "global"; }
5272
5244
| GROUP { $$ = "group"; }
5273
5245
| LISTEN { $$ = "listen"; }
5274
5246
| LOAD { $$ = "load"; }
5247
+ | LOCAL { $$ = "local"; }
5275
5248
| LOCK_P { $$ = "lock"; }
5276
5249
| MOVE { $$ = "move"; }
5277
5250
| NEW { $$ = "new"; }
0 commit comments