@@ -683,7 +683,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
683
683
DAY_P ,DECIMAL ,DECLARE ,DEFAULT ,DELETE ,DESC ,DISTINCT ,DOUBLE ,DROP ,
684
684
ELSE ,END_TRANS ,EXCEPT ,EXECUTE ,EXISTS ,EXTRACT ,
685
685
FALSE_P ,FETCH ,FLOAT ,FOR ,FOREIGN ,FROM ,FULL ,
686
- GRANT ,GROUP ,HAVING ,HOUR_P ,
686
+ GLOBAL , GRANT ,GROUP ,HAVING ,HOUR_P ,
687
687
IN ,INNER_P ,INSENSITIVE ,INSERT ,INTERSECT ,INTERVAL ,INTO ,IS ,
688
688
ISOLATION ,JOIN ,KEY ,LANGUAGE ,LEADING ,LEFT ,LEVEL ,LIKE ,LOCAL ,
689
689
MATCH ,MINUTE_P ,MONTH_P ,NAMES ,
@@ -702,24 +702,28 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
702
702
%token TRIGGER
703
703
704
704
/* Keywords (in SQL92 non-reserved words)*/
705
- %token TYPE_P
705
+ %token COMMITTED , SERIALIZABLE , TYPE_P
706
706
707
707
/* Keywords for Postgres support (not in SQL92 reserved words)
708
708
*
709
709
* The CREATEDB and CREATEUSER tokens should go away
710
710
* when some sort of pg_privileges relation is introduced.
711
711
* - Todd A. Brandys 1998-01-01?
712
712
*/
713
- %token ABORT_TRANS ,AFTER ,AGGREGATE ,ANALYZE ,BACKWARD ,BEFORE ,BINARY ,
713
+ %token ABORT_TRANS ,ACCESS ,AFTER ,AGGREGATE ,ANALYZE ,
714
+ BACKWARD ,BEFORE ,BINARY ,
714
715
CACHE ,CLUSTER ,COPY ,CREATEDB ,CREATEUSER ,CYCLE ,
715
- DATABASE ,DELIMITERS ,DO ,EACH ,ENCODING ,EXPLAIN ,EXTEND ,
716
+ DATABASE ,DELIMITERS ,DO ,
717
+ EACH ,ENCODING ,EXCLUSIVE ,EXPLAIN ,EXTEND ,
716
718
FORWARD ,FUNCTION ,HANDLER ,
717
719
INCREMENT ,INDEX ,INHERITS ,INSTEAD ,ISNULL ,
718
- LANCOMPILER ,LIMIT ,LISTEN ,UNLISTEN ,LOAD ,LOCATION ,LOCK_P ,MAXVALUE ,MINVALUE ,MOVE ,
720
+ LANCOMPILER ,LIMIT ,LISTEN ,UNLISTEN ,LOAD ,LOCATION ,LOCK_P ,
721
+ MAXVALUE ,MINVALUE ,MODE ,MOVE ,
719
722
NEW ,NOCREATEDB ,NOCREATEUSER ,NONE ,NOTHING ,NOTIFY ,NOTNULL ,
720
723
OFFSET ,OIDS ,OPERATOR ,PASSWORD ,PROCEDURAL ,
721
724
RENAME ,RESET ,RETURNS ,ROW ,RULE ,
722
- SERIAL ,SEQUENCE ,SETOF ,SHOW ,START ,STATEMENT ,STDIN ,STDOUT ,TRUSTED ,
725
+ SERIAL ,SEQUENCE ,SETOF ,SHARE ,SHOW ,START ,STATEMENT ,STDIN ,STDOUT ,
726
+ TRUSTED ,
723
727
UNLISTEN ,UNTIL ,VACUUM ,VALID ,VERBOSE ,VERSION
724
728
725
729
/* Special keywords, not in the query language - see the "lex" file*/
@@ -776,7 +780,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
776
780
%type <str> opt_decimal Character character opt_varying opt_charset
777
781
%type <str> opt_collate Datetime datetime opt_timezone opt_interval
778
782
%type <str> numeric a_expr_or_null row_expr row_descriptor row_list
779
- %type <str> SelectStmt SubSelect result OptTemp
783
+ %type <str> SelectStmt SubSelect result OptTemp OptTempType OptTempScope
780
784
%type <str> opt_table opt_union opt_unique sort_clause sortby_list
781
785
%type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
782
786
%type <str> group_clause having_clause from_clause c_list
@@ -812,10 +816,11 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
812
816
%type <str> GrantStmt privileges operation_commalist operation
813
817
%type <str> cursor_clause opt_cursor opt_readonly opt_of opt_lmode
814
818
%type <str> case_expr when_clause_list case_default case_arg when_clause
815
- %type <str> select_clause opt_select_limit select_limit_value ,
819
+ %type <str> select_clause opt_select_limit select_limit_value
816
820
%type <str> select_offset_value table_list using_expr join_expr
817
821
%type <str> using_list from_expr table_expr join_clause join_type
818
822
%type <str> join_qual update_list join_clause join_clause_with_union
823
+ %type <str> opt_level opt_lock lock_type
819
824
820
825
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
821
826
%type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
@@ -1126,25 +1131,9 @@ VariableSetStmt: SET ColId TO var_value
1126
1131
{
1127
1132
$$ = cat2_str(make1_str(" set time zone" ),$4 );
1128
1133
}
1129
- | SET TRANSACTION ISOLATION LEVEL READ ColId
1134
+ | SET TRANSACTION ISOLATION LEVEL opt_level
1130
1135
{
1131
- if (strcasecmp($6 ," COMMITTED" ))
1132
- {
1133
- sprintf (errortext," syntax error at or near\" %s\" " , $6 );
1134
- yyerror (errortext);
1135
- }
1136
-
1137
- $$ = cat2_str(make1_str(" set transaction isolation level read" ),$6 );
1138
- }
1139
- | SET TRANSACTION ISOLATION LEVEL ColId
1140
- {
1141
- if (strcasecmp($5 ," SERIALIZABLE" ))
1142
- {
1143
- sprintf (errortext," syntax error at or near\" %s\" " , $5 );
1144
- yyerror (errortext);
1145
- }
1146
-
1147
- $$ = cat2_str(make1_str(" set transaction isolation level read" ),$5 );
1136
+ $$ = cat2_str(make1_str(" set transaction isolation level" ),$5 );
1148
1137
}
1149
1138
| SET NAMES encoding
1150
1139
{
@@ -1156,6 +1145,11 @@ VariableSetStmt: SET ColId TO var_value
1156
1145
}
1157
1146
;
1158
1147
1148
+ opt_level :READ COMMITTED {$$ = make1_str(" read committed" ); }
1149
+ | SERIALIZABLE {$$ = make1_str(" serializable" ); }
1150
+ ;
1151
+
1152
+
1159
1153
var_value :Sconst {$$ =$1 ; }
1160
1154
| DEFAULT {$$ = make1_str(" default" ); }
1161
1155
;
@@ -1300,11 +1294,24 @@ CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
1300
1294
}
1301
1295
;
1302
1296
1303
- OptTemp :TEMP {$$ = make1_str(" temp" ); }
1297
+ OptTemp :OptTempType {$$ =$1 ; }
1298
+ | OptTempScope OptTempType {$$ = cat2_str($1 ,$2 ); }
1299
+ ;
1300
+
1301
+ OptTempType :TEMP {$$ = make1_str(" temp" ); }
1304
1302
| TEMPORARY {$$ = make1_str(" temporary" ); }
1305
1303
| /* EMPTY*/ {$$ = make1_str(" " ); }
1306
1304
;
1307
1305
1306
+ OptTempScope :GLOBAL
1307
+ {
1308
+ yyerror (" GLOBAL TEMPORARY TABLE is not currently supported" );
1309
+ $$ = make1_str(" global" );
1310
+ }
1311
+ | LOCAL {$$ = make1_str(" local" ); }
1312
+ ;
1313
+
1314
+
1308
1315
OptTableElementList :OptTableElementList ' ,' OptTableElement
1309
1316
{
1310
1317
$$ = cat3_str($1 , make1_str(" ," ),$3 );
@@ -2674,84 +2681,25 @@ DeleteStmt: DELETE FROM relation_name
2674
2681
}
2675
2682
;
2676
2683
2677
- LockStmt :LOCK_P opt_table relation_name
2678
- {
2679
- $$ = cat3_str(make1_str(" lock" ),$2 ,$3 );
2680
- }
2681
- | LOCK_P opt_table relation_name IN opt_lmode ROW IDENT IDENT
2682
- {
2683
- if (strcasecmp($8 ," MODE" ))
2684
- {
2685
- sprintf (errortext," syntax error at or near\" %s\" " , $8 );
2686
- yyerror (errortext);
2687
- }
2688
- if ($5 !=NULL )
2689
- {
2690
- if (strcasecmp($5 ," SHARE" ))
2691
- {
2692
- sprintf (errortext," syntax error at or near\" %s\" " , $5 );
2693
- yyerror (errortext);
2694
- }
2695
- if (strcasecmp($7 ," EXCLUSIVE" ))
2696
- {
2697
- sprintf (errortext," syntax error at or near\" %s\" " , $7 );
2698
- yyerror (errortext);
2699
- }
2700
- }
2701
- else
2702
- {
2703
- if (strcasecmp($7 ," SHARE" ) && strcasecmp($7 ," EXCLUSIVE" ))
2704
- {
2705
- sprintf (errortext," syntax error at or near\" %s\" " , $7 );
2706
- yyerror (errortext);
2707
- }
2708
- }
2709
-
2710
- $$ =cat4_str(cat5_str(make1_str(" lock" ),$2 ,$3 , make1_str(" in" ),$5 ), make1_str(" row" ),$7 ,$8 );
2711
- }
2712
- | LOCK_P opt_table relation_name IN IDENT IDENT IDENT
2713
- {
2714
- if (strcasecmp($7 ," MODE" ))
2715
- {
2716
- sprintf (errortext," syntax error at or near\" %s\" " , $7 );
2717
- yyerror (errortext);
2718
- }
2719
- if (strcasecmp($5 ," ACCESS" ))
2720
- {
2721
- sprintf (errortext," syntax error at or near\" %s\" " , $5 );
2722
- yyerror (errortext);
2723
- }
2724
- if (strcasecmp($6 ," SHARE" ) && strcasecmp($6 ," EXCLUSIVE" ))
2725
- {
2726
- sprintf (errortext," syntax error at or near\" %s\" " , $6 );
2727
- yyerror (errortext);
2728
- }
2729
-
2730
- $$ =cat3_str(cat5_str(make1_str(" lock" ),$2 ,$3 , make1_str(" in" ),$5 ),$6 ,$7 );
2731
- }
2732
- | LOCK_P opt_table relation_name IN IDENT IDENT
2684
+ LockStmt :LOCK_P opt_table relation_name opt_lock
2733
2685
{
2734
- if (strcasecmp($6 ," MODE" ))
2735
- {
2736
- sprintf (errortext," syntax error at or near\" %s\" " , $6 );
2737
- yyerror (errortext);
2738
- }
2739
- if (strcasecmp($5 ," SHARE" ) && strcasecmp($5 ," EXCLUSIVE" ))
2740
- {
2741
- sprintf (errortext," syntax error at or near\" %s\" " , $5 );
2742
- yyerror (errortext);
2743
- }
2744
-
2745
- $$ =cat2_str(cat5_str(make1_str(" lock" ),$2 ,$3 , make1_str(" in" ),$5 ),$6 );
2686
+ $$ = cat4_str(make1_str(" lock" ),$2 ,$3 ,$4 );
2746
2687
}
2747
2688
;
2748
2689
2749
- opt_lmode :IDENT {$$ =$1 ; }
2750
- | /* EMPTY*/ {$$ = make1_str(" " ); }
2690
+ opt_lock :lock_type MODE {$$ =cat2_str( $1 , make1_str( " mode " )) ; }
2691
+ | /* EMPTY*/ {$$ = make1_str(" " );}
2751
2692
;
2752
2693
2694
+ lock_type :SHARE ROW EXCLUSIVE {$$ = make1_str(" share row exclusive" ); }
2695
+ | ROW opt_lmode {$$ = cat2_str(make1_str(" row" ),$2 );}
2696
+ | ACCESS opt_lmode {$$ = cat2_str(make1_str(" access" ),$2 );}
2697
+ | opt_lmode {$$ =$1 ; }
2698
+ ;
2753
2699
2754
-
2700
+ opt_lmode :SHARE {$$ = make1_str(" share" ); }
2701
+ | EXCLUSIVE {$$ = make1_str(" exclusive" ); }
2702
+ ;
2755
2703
2756
2704
/* ****************************************************************************
2757
2705
*
@@ -3397,9 +3345,6 @@ opt_decimal: '(' Iconst ',' Iconst ')'
3397
3345
3398
3346
/* SQL92 character data types
3399
3347
* The following implements CHAR() and VARCHAR().
3400
- * We do it here instead of the 'Generic' production
3401
- * because we don't want to allow arrays of VARCHAR().
3402
- * I haven't thought about whether that will work or not.
3403
3348
*- ay 6/95
3404
3349
*/
3405
3350
Character :character ' (' Iconst ' )'
@@ -4427,12 +4372,14 @@ TypeId: ColId
4427
4372
ColId :ident {$$ =$1 ; }
4428
4373
| datetime {$$ =$1 ; }
4429
4374
| ABSOLUTE {$$ = make1_str(" absolute" ); }
4375
+ | ACCESS {$$ = make1_str(" access" ); }
4430
4376
| ACTION {$$ = make1_str(" action" ); }
4431
4377
| AFTER {$$ = make1_str(" after" ); }
4432
4378
| AGGREGATE {$$ = make1_str(" aggregate" ); }
4433
4379
| BACKWARD {$$ = make1_str(" backward" ); }
4434
4380
| BEFORE {$$ = make1_str(" before" ); }
4435
4381
| CACHE {$$ = make1_str(" cache" ); }
4382
+ | COMMITTED {$$ = make1_str(" committed" ); }
4436
4383
| CREATEDB {$$ = make1_str(" createdb" ); }
4437
4384
| CREATEUSER {$$ = make1_str(" createuser" ); }
4438
4385
| CYCLE {$$ = make1_str(" cycle" ); }
@@ -4441,6 +4388,7 @@ ColId: ident{ $$ = $1; }
4441
4388
| DOUBLE {$$ = make1_str(" double" ); }
4442
4389
| EACH {$$ = make1_str(" each" ); }
4443
4390
| ENCODING {$$ = make1_str(" encoding" ); }
4391
+ | EXCLUSIVE {$$ = make1_str(" exclusive" ); }
4444
4392
| FORWARD {$$ = make1_str(" forward" ); }
4445
4393
| FUNCTION {$$ = make1_str(" function" ); }
4446
4394
| HANDLER {$$ = make1_str(" handler" ); }
@@ -4457,6 +4405,7 @@ ColId: ident{ $$ = $1; }
4457
4405
| MATCH {$$ = make1_str(" match" ); }
4458
4406
| MAXVALUE {$$ = make1_str(" maxvalue" ); }
4459
4407
| MINVALUE {$$ = make1_str(" minvalue" ); }
4408
+ | MODE {$$ = make1_str(" mode" ); }
4460
4409
| NEXT {$$ = make1_str(" next" ); }
4461
4410
| NOCREATEDB {$$ = make1_str(" nocreatedb" ); }
4462
4411
| NOCREATEUSER {$$ = make1_str(" nocreateuser" ); }
@@ -4481,6 +4430,8 @@ ColId: ident{ $$ = $1; }
4481
4430
| SCROLL {$$ = make1_str(" scroll" ); }
4482
4431
| SEQUENCE {$$ = make1_str(" sequence" ); }
4483
4432
| SERIAL {$$ = make1_str(" serial" ); }
4433
+ | SERIALIZABLE {$$ = make1_str(" serializable" ); }
4434
+ | SHARE {$$ = make1_str(" share" ); }
4484
4435
| START {$$ = make1_str(" start" ); }
4485
4436
| STATEMENT {$$ = make1_str(" statement" ); }
4486
4437
| STDIN {$$ = make1_str(" stdin" ); }