@@ -528,7 +528,7 @@ output_statement(char * stmt, int mode)
528
528
%token TYPECAST
529
529
530
530
/* Keywords (in SQL92 reserved words) */
531
- %token ACTION , ADD , ALL , ALTER , AND , ANY AS , ASC ,
531
+ %token ABSOLUTE , ACTION , ADD , ALL , ALTER , AND , ANY AS , ASC ,
532
532
BEGIN_TRANS , BETWEEN , BOTH , BY ,
533
533
CASCADE , CAST , CHAR , CHARACTER , CHECK , CLOSE , COLLATE , COLUMN , COMMIT ,
534
534
CONSTRAINT , CREATE , CROSS , CURRENT , CURRENT_DATE , CURRENT_TIME ,
@@ -537,14 +537,14 @@ output_statement(char * stmt, int mode)
537
537
END_TRANS , EXECUTE , EXISTS , EXTRACT ,
538
538
FETCH , FLOAT , FOR , FOREIGN , FROM , FULL ,
539
539
GRANT , GROUP , HAVING , HOUR_P ,
540
- IN , INNER_P , INSERT , INTERVAL , INTO , IS ,
540
+ IN , INNER_P , INSENSITIVE , INSERT , INTERVAL , INTO , IS ,
541
541
JOIN , KEY , LANGUAGE , LEADING , LEFT , LIKE , LOCAL ,
542
542
MATCH , MINUTE_P , MONTH_P , NAMES ,
543
- NATIONAL , NATURAL , NCHAR , NO , NOT , NOTIFY , NULL_P , NUMERIC ,
544
- ON , OPTION , OR , ORDER , OUTER_P ,
545
- PARTIAL , POSITION , PRECISION , PRIMARY , PRIVILEGES , PROCEDURE , PUBLIC ,
546
- REFERENCES , REVOKE , RIGHT , ROLLBACK ,
547
- SECOND_P , SELECT , SET , SUBSTRING ,
543
+ NATIONAL , NATURAL , NCHAR , NEXT , NO , NOT , NOTIFY , NULL_P , NUMERIC ,
544
+ OF , ON , ONLY , OPTION , OR , ORDER , OUTER_P ,
545
+ PARTIAL , POSITION , PRECISION , PRIMARY , PRIOR , PRIVILEGES , PROCEDURE , PUBLIC ,
546
+ READ , REFERENCES , RELATIVE , REVOKE , RIGHT , ROLLBACK ,
547
+ SCROLL , SECOND_P , SELECT , SET , SUBSTRING ,
548
548
TABLE , TIME , TIMESTAMP , TIMEZONE_HOUR , TIMEZONE_MINUTE ,
549
549
TO , TRAILING , TRANSACTION , TRIM ,
550
550
UNION , UNIQUE , UPDATE , USER , USING ,
@@ -620,7 +620,7 @@ output_statement(char * stmt, int mode)
620
620
%type <str> ColId default_expr ColQualifier columnDef ColQualList
621
621
%type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
622
622
%type <str> OptTableElementList OptTableElement TableConstraint
623
- %type <str> ConstraintElem key_actions constraint_list
623
+ %type <str> ConstraintElem key_actions constraint_list ColPrimaryKey
624
624
%type <str> res_target_list res_target_el res_target_list2
625
625
%type <str> res_target_el2 opt_id relation_name database_name
626
626
%type <str> access_method attr_name class index_name name func_name
@@ -667,6 +667,7 @@ output_statement(char * stmt, int mode)
667
667
%type <str> ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location
668
668
%type <str> DestroydbStmt ClusterStmt grantee RevokeStmt encoding
669
669
%type <str> GrantStmt privileges operation_commalist operation
670
+ %type <str> cursor_clause , opt_cursor , opt_readonly , opt_of
670
671
671
672
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen open_opts
672
673
%type <str> indicator ECPGExecute ecpg_expr dotext
@@ -1083,9 +1084,9 @@ columnDef: ColId Typename ColQualifier
1083
1084
{
1084
1085
$$ = cat3_str($1 , $2 , $3 );
1085
1086
}
1086
- | ColId SERIAL
1087
+ | ColId SERIAL ColPrimaryKey
1087
1088
{
1088
- $$ = make2_str ($1 , make1_str(" serial" ) );
1089
+ $$ = make3_str ($1 , make1_str(" serial " ), $3 );
1089
1090
}
1090
1091
;
1091
1092
@@ -1097,6 +1098,16 @@ ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); }
1097
1098
| ColConstraint { $$ = $1 ; }
1098
1099
;
1099
1100
1101
+ ColPrimaryKey : PRIMARY KEY
1102
+ {
1103
+ $$ = make1_str(" primary key" );
1104
+ }
1105
+ | /* EMPTY*/
1106
+ {
1107
+ $$ = make1_str(" " );
1108
+ }
1109
+ ;
1110
+
1100
1111
ColConstraint :
1101
1112
CONSTRAINT name ColConstraintElem
1102
1113
{
@@ -1106,10 +1117,29 @@ ColConstraint:
1106
1117
{ $$ = $1 ; }
1107
1118
;
1108
1119
1120
+ /* The column constraint WITH NULL gives a shift/reduce error
1121
+ * because it requires yacc to look more than one token ahead to
1122
+ * resolve WITH TIME ZONE and WITH NULL.
1123
+ * So, leave it out of the syntax for now.
1124
+ | WITH NULL_P
1125
+ {
1126
+ $$ = NULL;
1127
+ }
1128
+ * - thomas 1998-09-12
1129
+ *
1130
+ * DEFAULT NULL is already the default for Postgres.
1131
+ * Bue define it here and carry it forward into the system
1132
+ * to make it explicit.
1133
+ * - thomas 1998-09-13
1134
+ */
1109
1135
ColConstraintElem : CHECK ' (' constraint_expr ' )'
1110
1136
{
1111
1137
$$ = make3_str(make1_str(" check(" ), $3 , make1_str(" )" ));
1112
1138
}
1139
+ | DEFAULT NULL_P
1140
+ {
1141
+ $$ = make1_str(" default null" );
1142
+ }
1113
1143
| DEFAULT default_expr
1114
1144
{
1115
1145
$$ = cat2_str(make1_str(" default" ), $2 );
@@ -1143,10 +1173,16 @@ default_list: default_list ',' default_expr
1143
1173
}
1144
1174
;
1145
1175
1176
+ /* The Postgres default column value is NULL.
1177
+ * Rather than carrying DEFAULT NULL forward as a clause,
1178
+ * let's just have it be a no-op.
1179
+ | NULL_P
1180
+ { $$ = make1_str("null"); }
1181
+ * - thomas 1998-09-13
1182
+ */
1183
+
1146
1184
default_expr : AexprConst
1147
1185
{ $$ = $1 ; }
1148
- | NULL_P
1149
- { $$ = make1_str(" null" ); }
1150
1186
| ' -' default_expr %prec UMINUS
1151
1187
{ $$ = cat2_str(make1_str(" -" ), $2 ); }
1152
1188
| default_expr ' +' default_expr
@@ -1559,7 +1595,7 @@ TriggerForType: ROW { $$ = make1_str("row"); }
1559
1595
;
1560
1596
1561
1597
TriggerFuncArgs : TriggerFuncArg
1562
- { $$ = $1 }
1598
+ { $$ = $1 ; }
1563
1599
| TriggerFuncArgs ' ,' TriggerFuncArg
1564
1600
{ $$ = cat3_str($1 , make1_str(" ," ), $3 ); }
1565
1601
| /* EMPTY*/
@@ -1667,12 +1703,17 @@ DestroyStmt: DROP TABLE relation_name_list
1667
1703
/* ****************************************************************************
1668
1704
*
1669
1705
* QUERY:
1670
- * fetch/move [forward | backward] [number | all ] [ in <portalname> ]
1706
+ * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
1707
+ * fetch [ forward | backward | absolute | relative ]
1708
+ * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
1671
1709
*
1672
1710
*****************************************************************************/
1673
1711
1674
1712
FetchStmt : FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
1675
1713
{
1714
+ if (strncmp($2 , " relative" , strlen(" relative" )) == 0 && atol($3 ) == 0L )
1715
+ yyerror (" FETCH/RELATIVE at current position is not supported" );
1716
+
1676
1717
$$ = cat4_str(make1_str(" fetch" ), $2 , $3 , $4 );
1677
1718
}
1678
1719
| MOVE opt_direction fetch_how_many opt_portal_name
@@ -1683,18 +1724,26 @@ FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
1683
1724
1684
1725
opt_direction : FORWARD { $$ = make1_str(" forward" ); }
1685
1726
| BACKWARD { $$ = make1_str(" backward" ); }
1727
+ | RELATIVE { $$ = make1_str(" relative" ); }
1728
+ | ABSOLUTE
1729
+ {
1730
+ fprintf (stderr, " FETCH/ABSOLUTE not supported, using RELATIVE" );
1731
+ $$ = make1_str(" absolute" );
1732
+ }
1686
1733
| /* EMPTY*/ { $$ = make1_str(" " ); /* default */ }
1687
1734
;
1688
1735
1689
- fetch_how_many : Iconst
1690
- { $$ = $1 ;
1691
- if (atol($1 ) <= 0 ) yyerror (" Please specify nonnegative count for fetch" ); }
1736
+ fetch_how_many : Iconst { $$ = $1 ; }
1737
+ | ' -' Iconst { $$ = make2_str(make1_str(" -" ), $2 ); }
1692
1738
| ALL { $$ = make1_str(" all" ); }
1739
+ | NEXT { $$ = make1_str(" next" ); }
1740
+ | PRIOR { $$ = make1_str(" prior" ); }
1693
1741
| /* EMPTY*/ { $$ = make1_str(" " ); /* default*/ }
1694
1742
;
1695
1743
1696
1744
opt_portal_name : IN name { $$ = cat2_str(make1_str(" in" ), $2 ); }
1697
- | name { $$ = cat2_str(make1_str(" in" ), $1 ); }
1745
+ | FROM name { $$ = cat2_str(make1_str(" from" ), $2 ); }
1746
+ /* | name { $$ = cat2_str(make1_str("in"), $1); */
1698
1747
| /* EMPTY*/ { $$ = make1_str(" " ); }
1699
1748
;
1700
1749
@@ -2328,6 +2377,10 @@ insert_rest: VALUES '(' res_target_list2 ')'
2328
2377
{
2329
2378
$$ = make3_str(make1_str(" values(" ), $3 , make1_str(" )" ));
2330
2379
}
2380
+ | DEFAULT VALUES
2381
+ {
2382
+ $$ = make1_str(" default values" );
2383
+ }
2331
2384
| SELECT opt_unique res_target_list2
2332
2385
from_clause where_clause
2333
2386
group_clause having_clause
@@ -2404,11 +2457,12 @@ UpdateStmt: UPDATE relation_name
2404
2457
* CURSOR STATEMENTS
2405
2458
*
2406
2459
*****************************************************************************/
2407
- CursorStmt : DECLARE name opt_binary CURSOR FOR
2460
+ CursorStmt : DECLARE name opt_cursor CURSOR FOR
2408
2461
SELECT opt_unique res_target_list2
2409
2462
from_clause where_clause
2410
2463
group_clause having_clause
2411
2464
union_clause sort_clause
2465
+ cursor_clause
2412
2466
{
2413
2467
struct cursor *ptr, *this ;
2414
2468
@@ -2438,7 +2492,26 @@ CursorStmt: DECLARE name opt_binary CURSOR FOR
2438
2492
}
2439
2493
;
2440
2494
2495
+ opt_cursor : BINARY { $$ = make1_str(" binary" ); }
2496
+ | INSENSITIVE { $$ = make1_str(" insensitive" ); }
2497
+ | SCROLL { $$ = make1_str(" scroll" ); }
2498
+ | INSENSITIVE SCROLL { $$ = make1_str(" insensitive scroll" ); }
2499
+ | /* EMPTY*/ { $$ = make1_str(" " ); }
2500
+ ;
2501
+
2502
+ cursor_clause : FOR opt_readonly { $$ = cat2_str(make1_str(" for" ), $2 ); }
2503
+ | /* EMPTY*/ { $$ = make1_str(" " ); }
2504
+
2505
+ ;
2506
+
2507
+ opt_readonly : READ ONLY { $$ = make1_str(" read only" ); }
2508
+ | UPDATE opt_of
2509
+ {
2510
+ yyerror (" DECLARE/UPDATE not supported; Cursors must be READ ONLY." );
2511
+ }
2512
+ ;
2441
2513
2514
+ opt_of : OF columnList { $$ = make2_str(make1_str(" of" ), $2 ); }
2442
2515
2443
2516
/* ****************************************************************************
2444
2517
*
@@ -3776,6 +3849,7 @@ TypeId: ColId
3776
3849
*/
3777
3850
ColId : ident { $$ = $1 ; }
3778
3851
| datetime { $$ = $1 ; }
3852
+ | ABSOLUTE { $$ = make1_str(" absolute" ); }
3779
3853
| ACTION { $$ = make1_str(" action" ); }
3780
3854
| CACHE { $$ = make1_str(" cache" ); }
3781
3855
| CYCLE { $$ = make1_str(" cycle" ); }
@@ -3787,18 +3861,26 @@ ColId: ident { $$ = $1; }
3787
3861
| FUNCTION { $$ = make1_str(" function" ); }
3788
3862
| INCREMENT { $$ = make1_str(" increment" ); }
3789
3863
| INDEX { $$ = make1_str(" index" ); }
3864
+ | INSENSITIVE { $$ = make1_str(" insensitive" ); }
3790
3865
| KEY { $$ = make1_str(" key" ); }
3791
3866
| LANGUAGE { $$ = make1_str(" language" ); }
3792
3867
| LOCATION { $$ = make1_str(" location" ); }
3793
3868
| MATCH { $$ = make1_str(" match" ); }
3794
3869
| MAXVALUE { $$ = make1_str(" maxvalue" ); }
3795
3870
| MINVALUE { $$ = make1_str(" minvalue" ); }
3871
+ | NEXT { $$ = make1_str(" next" ); }
3872
+ | OF { $$ = make1_str(" of" ); }
3873
+ | ONLY { $$ = make1_str(" only" ); }
3796
3874
| OPERATOR { $$ = make1_str(" operator" ); }
3797
3875
| OPTION { $$ = make1_str(" option" ); }
3798
3876
| PASSWORD { $$ = make1_str(" password" ); }
3799
- | PRIVILEGES { $$ = make1_str(" privileges" ); }
3877
+ | PRIOR { $$ = make1_str(" prior" ); }
3878
+ | PRIVILEGES { $$ = make1_str(" privileges" ); }
3879
+ | READ { $$ = make1_str(" read" ); }
3800
3880
| RECIPE { $$ = make1_str(" recipe" ); }
3881
+ | RELATIVE { $$ = make1_str(" relative" ); }
3801
3882
| ROW { $$ = make1_str(" row" ); }
3883
+ | SCROLL { $$ = make1_str(" scroll" ); }
3802
3884
| SERIAL { $$ = make1_str(" serial" ); }
3803
3885
| START { $$ = make1_str(" start" ); }
3804
3886
| STATEMENT { $$ = make1_str(" statement" ); }
@@ -4006,7 +4088,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer
4006
4088
switch (dimension)
4007
4089
{
4008
4090
case 0 :
4009
- strcpy (" []" , dim );
4091
+ strcpy (dim, " []" );
4010
4092
break ;
4011
4093
case 1 :
4012
4094
*dim = ' \0 ' ;
0 commit comments