210
210
211
211
/* SQL Keywords */
212
212
%token DEALLOCATE PARAMETERS INTERSECT TEMPORARY TIMESTAMP
213
+ %token CURRENT_TIMESTAMP CURRENT_DATE CURRENT_TIME
213
214
%token DISTINCT NVARCHAR RESTRICT TRUNCATE ANALYZE BETWEEN
214
215
%token CASCADE COLUMNS CONTROL DEFAULT EXECUTE EXPLAIN ENCODING
215
216
%token INTEGER NATURAL PREPARE SCHEMAS CHARACTER_VARYING REAL DECIMAL SMALLINT BIGINT
265
266
%type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr cast_expr
266
267
%type <expr> function_expr between_expr expr_alias param_expr
267
268
%type <expr> column_name literal int_literal num_literal string_literal bool_literal date_literal interval_literal
269
+ %type <expr> timestamp_literal time_literal current_timestamp_literal current_date_literal current_time_literal
268
270
%type <expr> comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint
269
271
%type <expr> array_expr array_index null_literal extended_literal casted_extended_literal
270
272
%type <limit> opt_limit opt_top
@@ -643,7 +645,7 @@ column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; }
643
645
| BOOLEAN { $$ = ColumnType{DataType::BOOLEAN}; }
644
646
| CHAR ' (' INTVAL ' )' { $$ = ColumnType{DataType::CHAR, $3 }; }
645
647
| CHARACTER_VARYING ' (' INTVAL ' )' { $$ = ColumnType{DataType::VARCHAR, $3 }; }
646
- | DATE { $$ = ColumnType{DataType::DATE}; };
648
+ | DATE { $$ = ColumnType{DataType::DATE}; }
647
649
| DATETIME { $$ = ColumnType{DataType::DATETIME}; }
648
650
| DECIMAL opt_decimal_specification {
649
651
$$ = ColumnType{DataType::DECIMAL, 0 , $2 ->first, $2 ->second};
@@ -653,6 +655,7 @@ column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; }
653
655
| FLOAT { $$ = ColumnType{DataType::FLOAT}; }
654
656
| INT { $$ = ColumnType{DataType::INT}; }
655
657
| INTEGER { $$ = ColumnType{DataType::INT}; }
658
+ | INTERVAL { $$ = ColumnType{DataType::INTERVAL}; }
656
659
| LONG { $$ = ColumnType{DataType::LONG}; }
657
660
| REAL { $$ = ColumnType{DataType::REAL}; }
658
661
| SMALLINT { $$ = ColumnType{DataType::SMALLINT}; }
@@ -1008,7 +1011,7 @@ extended_literal : literal {
1008
1011
}
1009
1012
$$ = $1 ;
1010
1013
}
1011
- | ' -' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); };
1014
+ | ' -' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); }
1012
1015
| ' -' interval_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); };
1013
1016
1014
1017
expr_alias : expr opt_alias {
@@ -1139,7 +1142,8 @@ column_name : IDENTIFIER { $$ = Expr::makeColumnRef($1); }
1139
1142
| ' *' { $$ = Expr::makeStar(); }
1140
1143
| IDENTIFIER ' .' ' *' { $$ = Expr::makeStar($1 ); };
1141
1144
1142
- literal : string_literal | bool_literal | num_literal | null_literal | date_literal | interval_literal | param_expr ;
1145
+ literal : string_literal | bool_literal | num_literal | null_literal | date_literal | interval_literal | param_expr
1146
+ | timestamp_literal | time_literal | current_timestamp_literal | current_date_literal | current_time_literal ;
1143
1147
1144
1148
string_literal : STRING { $$ = Expr::makeLiteral($1 ); };
1145
1149
@@ -1164,6 +1168,14 @@ date_literal : DATE STRING {
1164
1168
$$ = Expr::makeDateLiteral($2 );
1165
1169
};
1166
1170
1171
+ timestamp_literal : TIMESTAMP STRING {
1172
+ $$ = Expr::makeTimestampLiteral($2 );
1173
+ };
1174
+
1175
+ time_literal : TIME STRING {
1176
+ $$ = Expr::makeTimeLiteral($2 );
1177
+ };
1178
+
1167
1179
interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1 , $2 ); }
1168
1180
| INTERVAL STRING datetime_field {
1169
1181
int duration{0 }, chars_parsed{0 };
@@ -1176,6 +1188,9 @@ interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2
1176
1188
free ($2 );
1177
1189
$$ = Expr::makeIntervalLiteral(duration, $3 );
1178
1190
}
1191
+ | INTERVAL INTVAL datetime_field {
1192
+ $$ = Expr::makeIntervalLiteral($2 , $3 );
1193
+ }
1179
1194
| INTERVAL STRING {
1180
1195
int duration{0 }, chars_parsed{0 };
1181
1196
// 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte
@@ -1188,7 +1203,7 @@ interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2
1188
1203
}
1189
1204
free ($2 );
1190
1205
1191
- DatetimeField unit;
1206
+ DatetimeField unit = kDatetimeNone ;
1192
1207
if (strcasecmp(unit_string, " second" ) == 0 || strcasecmp(unit_string, " seconds" ) == 0 ) {
1193
1208
unit = kDatetimeSecond ;
1194
1209
} else if (strcasecmp(unit_string, " minute" ) == 0 || strcasecmp(unit_string, " minutes" ) == 0 ) {
@@ -1214,6 +1229,12 @@ param_expr : '?' {
1214
1229
yyloc.param_list.push_back($$ );
1215
1230
};
1216
1231
1232
+ current_timestamp_literal : CURRENT_TIMESTAMP { $$ = Expr::makeCurrentTimestampLiteral(); };
1233
+
1234
+ current_date_literal : CURRENT_DATE { $$ = Expr::makeCurrentDateLiteral(); };
1235
+
1236
+ current_time_literal : CURRENT_TIME { $$ = Expr::makeCurrentTimeLiteral(); };
1237
+
1217
1238
/* *****************************
1218
1239
* Table
1219
1240
******************************/
0 commit comments