@@ -683,7 +683,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
683683DAY_P ,DECIMAL ,DECLARE ,DEFAULT ,DELETE ,DESC ,DISTINCT ,DOUBLE ,DROP ,
684684ELSE ,END_TRANS ,EXCEPT ,EXECUTE ,EXISTS ,EXTRACT ,
685685FALSE_P ,FETCH ,FLOAT ,FOR ,FOREIGN ,FROM ,FULL ,
686- GRANT ,GROUP ,HAVING ,HOUR_P ,
686+ GLOBAL , GRANT ,GROUP ,HAVING ,HOUR_P ,
687687IN ,INNER_P ,INSENSITIVE ,INSERT ,INTERSECT ,INTERVAL ,INTO ,IS ,
688688ISOLATION ,JOIN ,KEY ,LANGUAGE ,LEADING ,LEFT ,LEVEL ,LIKE ,LOCAL ,
689689MATCH ,MINUTE_P ,MONTH_P ,NAMES ,
@@ -702,24 +702,28 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
702702%token TRIGGER
703703
704704/* Keywords (in SQL92 non-reserved words)*/
705- %token TYPE_P
705+ %token COMMITTED , SERIALIZABLE , TYPE_P
706706
707707/* Keywords for Postgres support (not in SQL92 reserved words)
708708 *
709709 * The CREATEDB and CREATEUSER tokens should go away
710710 * when some sort of pg_privileges relation is introduced.
711711 * - Todd A. Brandys 1998-01-01?
712712*/
713- %token ABORT_TRANS ,AFTER ,AGGREGATE ,ANALYZE ,BACKWARD ,BEFORE ,BINARY ,
713+ %token ABORT_TRANS ,ACCESS ,AFTER ,AGGREGATE ,ANALYZE ,
714+ BACKWARD ,BEFORE ,BINARY ,
714715CACHE ,CLUSTER ,COPY ,CREATEDB ,CREATEUSER ,CYCLE ,
715- DATABASE ,DELIMITERS ,DO ,EACH ,ENCODING ,EXPLAIN ,EXTEND ,
716+ DATABASE ,DELIMITERS ,DO ,
717+ EACH ,ENCODING ,EXCLUSIVE ,EXPLAIN ,EXTEND ,
716718FORWARD ,FUNCTION ,HANDLER ,
717719INCREMENT ,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 ,
719722NEW ,NOCREATEDB ,NOCREATEUSER ,NONE ,NOTHING ,NOTIFY ,NOTNULL ,
720723OFFSET ,OIDS ,OPERATOR ,PASSWORD ,PROCEDURAL ,
721724RENAME ,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 ,
723727UNLISTEN ,UNTIL ,VACUUM ,VALID ,VERBOSE ,VERSION
724728
725729/* 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
776780%type <str> opt_decimal Character character opt_varying opt_charset
777781%type <str> opt_collate Datetime datetime opt_timezone opt_interval
778782%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
780784%type <str> opt_table opt_union opt_unique sort_clause sortby_list
781785%type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
782786%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
812816%type <str> GrantStmt privileges operation_commalist operation
813817%type <str> cursor_clause opt_cursor opt_readonly opt_of opt_lmode
814818%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
816820%type <str> select_offset_value table_list using_expr join_expr
817821%type <str> using_list from_expr table_expr join_clause join_type
818822%type <str> join_qual update_list join_clause join_clause_with_union
823+ %type <str> opt_level opt_lock lock_type
819824
820825%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
821826%type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
@@ -1126,25 +1131,9 @@ VariableSetStmt: SET ColId TO var_value
11261131{
11271132$$ = cat2_str(make1_str(" set time zone" ),$4 );
11281133}
1129- | SET TRANSACTION ISOLATION LEVEL READ ColId
1134+ | SET TRANSACTION ISOLATION LEVEL opt_level
11301135{
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 );
11481137}
11491138| SET NAMES encoding
11501139 {
@@ -1156,6 +1145,11 @@ VariableSetStmt: SET ColId TO var_value
11561145 }
11571146 ;
11581147
1148+ opt_level :READ COMMITTED {$$ = make1_str(" read committed" ); }
1149+ | SERIALIZABLE {$$ = make1_str(" serializable" ); }
1150+ ;
1151+
1152+
11591153var_value :Sconst {$$ =$1 ; }
11601154| DEFAULT {$$ = make1_str(" default" ); }
11611155;
@@ -1300,11 +1294,24 @@ CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
13001294}
13011295;
13021296
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" ); }
13041302| TEMPORARY {$$ = make1_str(" temporary" ); }
13051303| /* EMPTY*/ {$$ = make1_str(" " ); }
13061304;
13071305
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+
13081315OptTableElementList :OptTableElementList ' ,' OptTableElement
13091316{
13101317$$ = cat3_str($1 , make1_str(" ," ),$3 );
@@ -2674,84 +2681,25 @@ DeleteStmt: DELETE FROM relation_name
26742681}
26752682;
26762683
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
27332685{
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 );
27462687}
27472688;
27482689
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(" " );}
27512692 ;
27522693
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+ ;
27532699
2754-
2700+ opt_lmode :SHARE {$$ = make1_str(" share" ); }
2701+ | EXCLUSIVE {$$ = make1_str(" exclusive" ); }
2702+ ;
27552703
27562704/* ****************************************************************************
27572705 *
@@ -3397,9 +3345,6 @@ opt_decimal: '(' Iconst ',' Iconst ')'
33973345
33983346/* SQL92 character data types
33993347 * 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.
34033348 *- ay 6/95
34043349*/
34053350Character :character ' (' Iconst ' )'
@@ -4427,12 +4372,14 @@ TypeId: ColId
44274372ColId :ident {$$ =$1 ; }
44284373| datetime {$$ =$1 ; }
44294374| ABSOLUTE {$$ = make1_str(" absolute" ); }
4375+ | ACCESS {$$ = make1_str(" access" ); }
44304376| ACTION {$$ = make1_str(" action" ); }
44314377| AFTER {$$ = make1_str(" after" ); }
44324378| AGGREGATE {$$ = make1_str(" aggregate" ); }
44334379| BACKWARD {$$ = make1_str(" backward" ); }
44344380| BEFORE {$$ = make1_str(" before" ); }
44354381| CACHE {$$ = make1_str(" cache" ); }
4382+ | COMMITTED {$$ = make1_str(" committed" ); }
44364383| CREATEDB {$$ = make1_str(" createdb" ); }
44374384| CREATEUSER {$$ = make1_str(" createuser" ); }
44384385| CYCLE {$$ = make1_str(" cycle" ); }
@@ -4441,6 +4388,7 @@ ColId: ident{ $$ = $1; }
44414388| DOUBLE {$$ = make1_str(" double" ); }
44424389| EACH {$$ = make1_str(" each" ); }
44434390| ENCODING {$$ = make1_str(" encoding" ); }
4391+ | EXCLUSIVE {$$ = make1_str(" exclusive" ); }
44444392| FORWARD {$$ = make1_str(" forward" ); }
44454393| FUNCTION {$$ = make1_str(" function" ); }
44464394| HANDLER {$$ = make1_str(" handler" ); }
@@ -4457,6 +4405,7 @@ ColId: ident{ $$ = $1; }
44574405| MATCH {$$ = make1_str(" match" ); }
44584406| MAXVALUE {$$ = make1_str(" maxvalue" ); }
44594407| MINVALUE {$$ = make1_str(" minvalue" ); }
4408+ | MODE {$$ = make1_str(" mode" ); }
44604409| NEXT {$$ = make1_str(" next" ); }
44614410| NOCREATEDB {$$ = make1_str(" nocreatedb" ); }
44624411| NOCREATEUSER {$$ = make1_str(" nocreateuser" ); }
@@ -4481,6 +4430,8 @@ ColId: ident{ $$ = $1; }
44814430| SCROLL {$$ = make1_str(" scroll" ); }
44824431| SEQUENCE {$$ = make1_str(" sequence" ); }
44834432| SERIAL {$$ = make1_str(" serial" ); }
4433+ | SERIALIZABLE {$$ = make1_str(" serializable" ); }
4434+ | SHARE {$$ = make1_str(" share" ); }
44844435| START {$$ = make1_str(" start" ); }
44854436| STATEMENT {$$ = make1_str(" statement" ); }
44864437| STDIN {$$ = make1_str(" stdin" ); }