@@ -199,7 +199,7 @@ make_name(void)
199
199
OF ,ON ,ONLY ,OPTION ,OR ,ORDER ,OUTER_P ,OVERLAPS ,
200
200
PARTIAL ,POSITION ,PRECISION ,PRIMARY ,PRIOR ,PRIVILEGES ,PROCEDURE ,PUBLIC ,
201
201
READ ,REFERENCES ,RELATIVE ,REVOKE ,RIGHT ,ROLLBACK ,
202
- SCROLL ,SECOND_P ,SELECT ,SESSION_USER ,SET ,SUBSTRING ,
202
+ SCROLL ,SECOND_P ,SELECT ,SESSION_USER ,SET ,SOME , SUBSTRING ,
203
203
TABLE ,TEMPORARY ,THEN ,TIME ,TIMESTAMP ,TIMEZONE_HOUR ,
204
204
TIMEZONE_MINUTE ,TO ,TRAILING ,TRANSACTION ,TRIM ,TRUE_P ,
205
205
UNION ,UNIQUE ,UPDATE ,USER ,USING ,
@@ -280,7 +280,7 @@ make_name(void)
280
280
%type <str> key_match ColLabel SpecialRuleRelation ColId columnDef
281
281
%type <str> ColConstraint ColConstraintElem NumericOnly FloatOnly
282
282
%type <str> OptTableElementList OptTableElement TableConstraint
283
- %type <str> ConstraintElem key_actions ColQualList
283
+ %type <str> ConstraintElem key_actions ColQualList TokenId
284
284
%type <str> target_list target_el update_target_list alias_clause
285
285
%type <str> update_target_el opt_id relation_name database_name
286
286
%type <str> access_method attr_name class index_name name func_name
@@ -292,7 +292,7 @@ make_name(void)
292
292
%type <str> Typename SimpleTypename Generic Numeric generic opt_float opt_numeric
293
293
%type <str> opt_decimal Character character opt_varying opt_charset
294
294
%type <str> opt_collate Datetime datetime opt_timezone opt_interval
295
- %type <str> row_expr row_descriptor row_list
295
+ %type <str> row_expr row_descriptor row_list typename numeric
296
296
%type <str> SelectStmt SubSelect result OptTemp ConstraintAttributeSpec
297
297
%type <str> opt_table opt_all sort_clause sortby_list ConstraintAttr
298
298
%type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
@@ -306,7 +306,7 @@ make_name(void)
306
306
%type <str> ClosePortalStmt DropStmt VacuumStmt opt_verbose func_arg
307
307
%type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
308
308
%type <str> index_list func_index index_elem opt_type opt_class access_method_clause
309
- %type <str> index_opt_unique IndexStmt func_return def_rest
309
+ %type <str> index_opt_unique IndexStmt func_return
310
310
%type <str> func_args_list func_args opt_with ProcedureStmt def_arg
311
311
%type <str> def_elem def_list definition def_name def_type DefineStmt
312
312
%type <str> opt_instead event event_object RuleActionList opt_using
@@ -790,6 +790,8 @@ var_value: Sconst{ $$ = $1; }
790
790
791
791
$$ =$1 ;
792
792
}
793
+ /* "OFF" is not a token, so it is handled by the name_list production*/
794
+ | ON {$$ = make_str(" on" ); }
793
795
| DEFAULT {$$ = make_str(" default" ); }
794
796
;
795
797
@@ -1443,17 +1445,18 @@ DropTrigStmt: DROP TRIGGER name ON relation_name
1443
1445
*
1444
1446
*****************************************************************************/
1445
1447
1446
- DefineStmt :CREATE def_type def_rest
1448
+ DefineStmt :CREATE def_type def_name definition
1447
1449
{
1448
- $$ = cat_str(3 , make_str(" create" ),$2 ,$3 );
1450
+ $$ = cat_str(3 , make_str(" create" ),$2 ,$3 , $4 );
1449
1451
}
1450
1452
;
1451
-
1453
+ /*
1452
1454
def_rest: def_name definition
1453
1455
{
1454
1456
$$ = cat2_str($1, $2);
1455
1457
}
1456
1458
;
1459
+ */
1457
1460
1458
1461
def_type :OPERATOR {$$ = make_str(" operator" ); }
1459
1462
| TYPE_P {$$ = make_str(" type" ); }
@@ -1462,8 +1465,12 @@ def_type: OPERATOR{ $$ = make_str("operator"); }
1462
1465
1463
1466
def_name :PROCEDURE {$$ = make_str(" procedure" ); }
1464
1467
| JOIN {$$ = make_str(" join" ); }
1465
- | ColId {$$ =$1 ; }
1466
1468
| all_Op {$$ =$1 ; }
1469
+ | typename {$$ =$1 ; }
1470
+ | TokenId {$$ =$1 ; }
1471
+ | INTERVAL {$$ = make_str(" interval" ); }
1472
+ | TIME {$$ = make_str(" time" ); }
1473
+ | TIMESTAMP {$$ = make_str(" timestamp" ); }
1467
1474
;
1468
1475
1469
1476
definition :' (' def_list ' )' {$$ = cat_str(3 , make_str(" (" ),$2 , make_str(" )" )); }
@@ -1486,14 +1493,11 @@ def_elem: def_name '=' def_arg{
1486
1493
}
1487
1494
;
1488
1495
1489
- def_arg :ColId {$$ =$1 ; }
1496
+ def_arg :func_return {$$ =$1 ; }
1497
+ | TokenId {$$ =$1 ; }
1490
1498
| all_Op {$$ =$1 ; }
1491
1499
| NumericOnly {$$ =$1 ; }
1492
1500
| Sconst {$$ =$1 ; }
1493
- | SETOF ColId
1494
- {
1495
- $$ = cat2_str(make_str(" setof" ),$2 );
1496
- }
1497
1501
;
1498
1502
1499
1503
/* ****************************************************************************
@@ -2934,6 +2938,13 @@ SimpleTypename: Generic{ $$ = $1; }
2934
2938
| Character {$$ =$1 ; }
2935
2939
;
2936
2940
2941
+ typename :generic {$$ =$1 ; }
2942
+ | numeric {$$ =$1 ; }
2943
+ | bit {$$ =$1 ; }
2944
+ | character {$$ =$1 ; }
2945
+ | datetime {$$ =$1 ; }
2946
+ ;
2947
+
2937
2948
Generic :generic
2938
2949
{
2939
2950
$$ =$1 ;
@@ -3015,6 +3026,13 @@ Numeric: FLOAT opt_float
3015
3026
}
3016
3027
;
3017
3028
3029
+ numeric :FLOAT {$$ = make_str(" float" ); }
3030
+ | DOUBLE PRECISION {$$ = make_str(" double precision" ); }
3031
+ | DECIMAL {$$ = make_str(" decimal" ); }
3032
+ | DEC {$$ = make_str(" dec" ); }
3033
+ | NUMERIC {$$ = make_str(" numeric" ); }
3034
+ ;
3035
+
3018
3036
opt_float :' (' Iconst ' )'
3019
3037
{
3020
3038
if (atol($2 ) <1 )
@@ -3244,6 +3262,7 @@ row_descriptor: row_list ',' a_expr
3244
3262
;
3245
3263
3246
3264
sub_type :ANY {$$ = make_str(" ANY" ); }
3265
+ | SOME {$$ = make_str(" SOME" ); }
3247
3266
| ALL {$$ = make_str(" ALL" ); }
3248
3267
;
3249
3268
@@ -4942,21 +4961,27 @@ opt_symbol:symbol{ $$ = $1; }
4942
4961
4943
4962
symbol :ColLabel {$$ =$1 ; };
4944
4963
4945
- /* These show up as operators, and will screw up the parsing if
4946
- * allowed as identifiers or labels.
4964
+ /* Any tokens which show up as operators will screw up the parsing if
4965
+ * allowed as identifiers, but are acceptable as ColLabels:
4966
+ * BETWEEN, IN, IS, ISNULL, NOTNULL, OVERLAPS
4947
4967
* Thanks to Tom Lane for pointing this out. - thomas 2000-03-29
4948
- | BETWEEN{ $$ = make_str("between"); }
4949
- | IN{ $$ = make_str("in"); }
4950
- | IS{ $$ = make_str("is"); }
4951
- | ISNULL{ $$ = make_str("isnull"); }
4952
- | NOTNULL{ $$ = make_str("notnull"); }
4953
- | OVERLAPS{ $$ = make_str("overlaps"); }
4954
4968
*/
4955
4969
ECPGColId :/* to be used instead of ColId*/
4956
4970
ECPGKeywords {$$ =$1 ; }
4957
4971
| ident {$$ =$1 ; }
4972
+ | TokenId {$$ =$1 ; }
4958
4973
| datetime {$$ =$1 ; }
4959
- | ABSOLUTE {$$ = make_str(" absolute" ); }
4974
+ | INTERVAL {$$ = make_str(" interval" ); }
4975
+ | TIME {$$ = make_str(" time" ); }
4976
+ | TIMESTAMP {$$ = make_str(" timestamp" ); }
4977
+ | TYPE_P {$$ = make_str(" type" ); }
4978
+ ;
4979
+
4980
+ /* Parser tokens to be used as identifiers.
4981
+ * Tokens involving data types should appear in ColId only,
4982
+ * since they will conflict with real TypeName productions.
4983
+ */
4984
+ TokenId :ABSOLUTE {$$ = make_str(" absolute" ); }
4960
4985
| ACCESS {$$ = make_str(" access" ); }
4961
4986
| ACTION {$$ = make_str(" action" ); }
4962
4987
| ADD {$$ = make_str(" add" ); }
@@ -4999,7 +5024,6 @@ ECPGColId: /* to be used instead of ColId */
4999
5024
| INSENSITIVE {$$ = make_str(" insensitive" ); }
5000
5025
| INSERT {$$ = make_str(" insert" ); }
5001
5026
| INSTEAD {$$ = make_str(" instead" ); }
5002
- | INTERVAL {$$ = make_str(" interval" ); }
5003
5027
| ISOLATION {$$ = make_str(" isolation" ); }
5004
5028
| KEY {$$ = make_str(" key" ); }
5005
5029
| LANGUAGE {$$ = make_str(" language" ); }
@@ -5052,14 +5076,11 @@ ECPGColId: /* to be used instead of ColId */
5052
5076
| SYSID {$$ = make_str(" sysid" ); }
5053
5077
| TEMP {$$ = make_str(" temp" ); }
5054
5078
| TEMPORARY {$$ = make_str(" temporary" ); }
5055
- | TIME {$$ = make_str(" time" ); }
5056
- | TIMESTAMP {$$ = make_str(" timestamp" ); }
5057
5079
| TIMEZONE_HOUR {$$ = make_str(" timezone_hour" ); }
5058
5080
| TIMEZONE_MINUTE {$$ = make_str(" timezone_minute" ); }
5059
5081
| TRIGGER {$$ = make_str(" trigger" ); }
5060
5082
| TRUNCATE {$$ = make_str(" truncate" ); }
5061
5083
| TRUSTED {$$ = make_str(" trusted" ); }
5062
- | TYPE_P {$$ = make_str(" type" ); }
5063
5084
| UNLISTEN {$$ = make_str(" unlisten" ); }
5064
5085
| UNTIL {$$ = make_str(" until" ); }
5065
5086
| UPDATE {$$ = make_str(" update" ); }
@@ -5073,23 +5094,13 @@ ECPGColId: /* to be used instead of ColId */
5073
5094
| ZONE {$$ = make_str(" zone" ); }
5074
5095
;
5075
5096
5076
- /* These show up as operators, and will screw up the parsing if
5077
- * allowed as identifiers or labels.
5078
- * Thanks to Tom Lane for pointing this out. - thomas 2000-03-29
5079
- | ALL{ $$ = make_str("all"); }
5080
- | ANY{ $$ = make_str("any"); }
5081
- | EXCEPT{ $$ = make_str("except"); }
5082
- | INTERSECT{ $$ = make_str("intersect"); }
5083
- | LIKE{ $$ = make_str("like"); }
5084
- | NOT{ $$ = make_str("not"); }
5085
- | NULLIF { $$ = make_str("nullif"); }
5086
- | NULL_P{ $$ = make_str("null"); }
5087
- | OR{ $$ = make_str("or"); }
5088
- */
5089
5097
ECPGColLabel :ECPGColId {$$ =$1 ; }
5090
5098
| ABORT_TRANS {$$ = make_str(" abort" ); }
5099
+ | ALL {$$ = make_str(" all" ); }
5091
5100
| ANALYZE {$$ = make_str(" analyze" ); }
5101
+ | ANY {$$ = make_str(" any" ); }
5092
5102
| ASC {$$ = make_str(" asc" ); }
5103
+ | BETWEEN {$$ = make_str(" between" ); }
5093
5104
| BINARY {$$ = make_str(" binary" ); }
5094
5105
| BIT {$$ = make_str(" bit" ); }
5095
5106
| BOTH {$$ = make_str(" both" ); }
@@ -5118,6 +5129,7 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
5118
5129
| DO {$$ = make_str(" do" ); }
5119
5130
| ELSE {$$ = make_str(" else" ); }
5120
5131
| END_TRANS {$$ = make_str(" end" ); }
5132
+ | EXCEPT {$$ = make_str(" except" ); }
5121
5133
| EXISTS {$$ = make_str(" exists" ); }
5122
5134
| EXPLAIN {$$ = make_str(" explain" ); }
5123
5135
| EXTEND {$$ = make_str(" extend" ); }
@@ -5127,15 +5139,20 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
5127
5139
| FOREIGN {$$ = make_str(" foreign" ); }
5128
5140
| FROM {$$ = make_str(" from" ); }
5129
5141
| FULL {$$ = make_str(" full" ); }
5142
+ | IN {$$ = make_str(" in" ); }
5143
+ | IS {$$ = make_str(" is" ); }
5144
+ | ISNULL {$$ = make_str(" isnull" ); }
5130
5145
| GLOBAL {$$ = make_str(" global" ); }
5131
5146
| GROUP {$$ = make_str(" group" ); }
5132
5147
| HAVING {$$ = make_str(" having" ); }
5133
5148
| INITIALLY {$$ = make_str(" initially" ); }
5134
5149
| INNER_P {$$ = make_str(" inner" ); }
5150
+ | INTERSECT {$$ = make_str(" intersect" ); }
5135
5151
| INTO {$$ = make_str(" into" ); }
5136
5152
| JOIN {$$ = make_str(" join" ); }
5137
5153
| LEADING {$$ = make_str(" leading" ); }
5138
5154
| LEFT {$$ = make_str(" left" ); }
5155
+ | LIKE {$$ = make_str(" like" ); }
5139
5156
| LISTEN {$$ = make_str(" listen" ); }
5140
5157
| LOAD {$$ = make_str(" load" ); }
5141
5158
| LOCK_P {$$ = make_str(" lock" ); }
@@ -5144,11 +5161,17 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
5144
5161
| NCHAR {$$ = make_str(" nchar" ); }
5145
5162
| NEW {$$ = make_str(" new" ); }
5146
5163
| NONE {$$ = make_str(" none" ); }
5164
+ | NOT {$$ = make_str(" not" ); }
5165
+ | NOTNULL {$$ = make_str(" notnull" ); }
5166
+ | NULLIF {$$ = make_str(" nullif" ); }
5167
+ | NULL_P {$$ = make_str(" null" ); }
5147
5168
| NUMERIC {$$ = make_str(" numeric" ); }
5148
5169
| OFFSET {$$ = make_str(" offset" ); }
5149
5170
| ON {$$ = make_str(" on" ); }
5171
+ | OR {$$ = make_str(" or" ); }
5150
5172
| ORDER {$$ = make_str(" order" ); }
5151
5173
| OUTER_P {$$ = make_str(" outer" ); }
5174
+ | OVERLAPS {$$ = make_str(" overlaps" ); }
5152
5175
| POSITION {$$ = make_str(" position" ); }
5153
5176
| PRECISION {$$ = make_str(" precision" ); }
5154
5177
| PRIMARY {$$ = make_str(" primary" ); }