@@ -833,7 +833,21 @@ opt_boolean: TRUE_P { $$ = make_str("true"); }
833
833
| OFF {$$ = make_str(" off" ); }
834
834
;
835
835
836
- zone_value :StringConst {$$ =$1 ; }
836
+ /* Timezone values can be:
837
+ * - a string such as 'pst8pdt'
838
+ * - an integer or floating point number
839
+ * - a time interval per SQL99
840
+ */
841
+ zone_value :StringConst {$$ =$1 ; }
842
+ | ConstInterval StringConst opt_interval
843
+ {
844
+ $$ = cat_str(3 ,$1 ,$2 ,$3 );
845
+ }
846
+ | ConstInterval ' (' PosIntConst ' )' StringConst opt_interval
847
+ {
848
+ $$ = cat_str(6 ,$1 , make_str(" (" ),$3 , make_str(" )" ),$5 ,$6 );
849
+ }
850
+ | NumConst {$$ =$1 ; }
837
851
| DEFAULT {$$ = make_str(" default" ); }
838
852
| LOCAL {$$ = make_str(" local" ); }
839
853
;
@@ -844,7 +858,7 @@ opt_encoding:StringConst { $$ = $1; }
844
858
;
845
859
846
860
ColId_or_Sconst :ColId {$$ =$1 ; }
847
- | SCONST {$$ =$1 ; }
861
+ | StringConst {$$ =$1 ; }
848
862
;
849
863
850
864
VariableShowStmt :SHOW ColId
@@ -2950,8 +2964,9 @@ Iresult:PosIntConst{ $$ = atol($1); }
2950
2964
| Iresult ' %' Iresult {$$ =$1 %$3 ; }
2951
2965
;
2952
2966
2953
- SimpleTypename :ConstTypename {$$ =$1 ; }
2954
- | ConstInterval {$$ =$1 ; }
2967
+ SimpleTypename :ConstTypename {$$ =$1 ; }
2968
+ | ConstInterval opt_interval {$$ = cat2_str($1 ,$2 ); }
2969
+ | ConstInterval ' (' PosIntConst ' )' opt_interval {$$ = cat_str(5 ,$1 , make_str(" (" ),$3 , make_str(" )" ),$5 ); }
2955
2970
;
2956
2971
2957
2972
ConstTypename :Generic {$$ =$1 ; }
@@ -3120,9 +3135,9 @@ ConstDatetime: datetime
3120
3135
}
3121
3136
;
3122
3137
3123
- ConstInterval :INTERVAL opt_interval
3138
+ ConstInterval :INTERVAL
3124
3139
{
3125
- $$ =cat2_str( make_str(" interval" ), $2 );
3140
+ $$ = make_str(" interval" );
3126
3141
}
3127
3142
;
3128
3143
@@ -3139,15 +3154,20 @@ opt_timezone: WITH TIME ZONE{ $$ = make_str("with time zone"); }
3139
3154
| /* EMPTY*/ {$$ = EMPTY; }
3140
3155
;
3141
3156
3142
- opt_interval :datetime {$$ =$1 ; }
3143
- | YEAR_P TO MONTH_P {$$ = make_str(" year to #month" ); }
3144
- | DAY_P TO HOUR_P {$$ = make_str(" day to hour" ); }
3145
- | DAY_P TO MINUTE_P {$$ = make_str(" day to minute" ); }
3146
- | DAY_P TO SECOND_P {$$ = make_str(" day to second" ); }
3147
- | HOUR_P TO MINUTE_P {$$ = make_str(" hour to minute" ); }
3148
- | MINUTE_P TO SECOND_P {$$ = make_str(" minute to second" ); }
3149
- | HOUR_P TO SECOND_P {$$ = make_str(" hour to second" ); }
3150
- | /* EMPTY*/ {$$ = EMPTY; }
3157
+ opt_interval :YEAR_P {$$ = make_str(" year" ); }
3158
+ | MONTH_P {$$ = make_str(" month" ); }
3159
+ | DAY_P {$$ = make_str(" day" ); }
3160
+ | HOUR_P {$$ = make_str(" hour" ); }
3161
+ | MINUTE_P {$$ = make_str(" minute" ); }
3162
+ | SECOND_P {$$ = make_str(" second" ); }
3163
+ | YEAR_P TO MONTH_P {$$ = make_str(" year to month" ); }
3164
+ | DAY_P TO HOUR_P {$$ = make_str(" day to hour" ); }
3165
+ | DAY_P TO MINUTE_P {$$ = make_str(" day to minute" ); }
3166
+ | DAY_P TO SECOND_P {$$ = make_str(" day to second" ); }
3167
+ | HOUR_P TO MINUTE_P {$$ = make_str(" hour to minute" ); }
3168
+ | MINUTE_P TO SECOND_P {$$ = make_str(" minute to second" ); }
3169
+ | HOUR_P TO SECOND_P {$$ = make_str(" hour to second" ); }
3170
+ | /* EMPTY*/ {$$ = EMPTY; }
3151
3171
;
3152
3172
3153
3173
@@ -3523,7 +3543,7 @@ extract_list: extract_arg FROM a_expr
3523
3543
*/
3524
3544
3525
3545
extract_arg :datetime {$$ =$1 ; }
3526
- | SCONST {$$ =$1 ; }
3546
+ | StringConst {$$ =$1 ; }
3527
3547
| IDENT {$$ =$1 ; }
3528
3548
;
3529
3549
@@ -3761,6 +3781,10 @@ AexprConst: PosAllConst
3761
3781
{
3762
3782
$$ = cat_str(3 ,$1 ,$2 ,$3 );
3763
3783
}
3784
+ | ConstInterval ' (' PosIntConst ' )' StringConst opt_interval
3785
+ {
3786
+ $$ = cat_str(6 ,$1 , make_str(" (" ),$3 , make_str(" )" ),$5 ,$6 );
3787
+ }
3764
3788
| ParamNo
3765
3789
{$$ =$1 ; }
3766
3790
| TRUE_P
@@ -5081,7 +5105,6 @@ ECPGColId: ident{ $$ = $1; }
5081
5105
| TYPE_P {$$ = make_str(" type" ); }
5082
5106
| datetime {$$ =$1 ; }
5083
5107
| TokenId {$$ =$1 ; }
5084
- | INTERVAL {$$ = make_str(" interval" ); }
5085
5108
| NATIONAL {$$ = make_str(" national" ); }
5086
5109
| NONE {$$ = make_str(" none" ); }
5087
5110
| PATH_P {$$ = make_str(" path_p" ); }
@@ -5140,11 +5163,13 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
5140
5163
| GROUP {$$ = make_str(" group" ); }
5141
5164
| HAVING {$$ = make_str(" having" ); }
5142
5165
| ILIKE {$$ = make_str(" ilike" ); }
5166
+ | IN {$$ = make_str(" in" ); }
5143
5167
| INITIALLY {$$ = make_str(" initially" ); }
5144
5168
| INNER_P {$$ = make_str(" inner" ); }
5169
+ | INOUT {$$ = make_str(" inout" ); }
5145
5170
| INTERSECT {$$ = make_str(" intersect" ); }
5171
+ | INTERVAL {$$ = make_str(" interval" ); }
5146
5172
| INTO {$$ = make_str(" into" ); }
5147
- | INOUT {$$ = make_str(" inout" ); }
5148
5173
| JOIN {$$ = make_str(" join" ); }
5149
5174
| LEADING {$$ = make_str(" leading" ); }
5150
5175
| LEFT {$$ = make_str(" left" ); }