210210
211211/* SQL Keywords */
212212%token DEALLOCATE PARAMETERS INTERSECT TEMPORARY TIMESTAMP
213+ %token CURRENT_TIMESTAMP CURRENT_DATE CURRENT_TIME
213214%token DISTINCT NVARCHAR RESTRICT TRUNCATE ANALYZE BETWEEN
214215%token CASCADE COLUMNS CONTROL DEFAULT EXECUTE EXPLAIN ENCODING
215216%token INTEGER NATURAL PREPARE SCHEMAS CHARACTER_VARYING REAL DECIMAL SMALLINT BIGINT
265266%type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr cast_expr
266267%type <expr> function_expr between_expr expr_alias param_expr
267268%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 current_date current_time
268270%type <expr> comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint
269271%type <expr> array_expr array_index null_literal extended_literal casted_extended_literal
270272%type <limit> opt_limit opt_top
@@ -643,7 +645,7 @@ column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; }
643645| BOOLEAN { $$ = ColumnType{DataType::BOOLEAN}; }
644646| CHAR ' (' INTVAL ' )' { $$ = ColumnType{DataType::CHAR, $3 }; }
645647| CHARACTER_VARYING ' (' INTVAL ' )' { $$ = ColumnType{DataType::VARCHAR, $3 }; }
646- | DATE { $$ = ColumnType{DataType::DATE}; };
648+ | DATE { $$ = ColumnType{DataType::DATE}; }
647649| DATETIME { $$ = ColumnType{DataType::DATETIME}; }
648650| DECIMAL opt_decimal_specification {
649651 $$ = ColumnType{DataType::DECIMAL, 0 , $2 ->first, $2 ->second};
@@ -653,6 +655,7 @@ column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; }
653655| FLOAT { $$ = ColumnType{DataType::FLOAT}; }
654656| INT { $$ = ColumnType{DataType::INT}; }
655657| INTEGER { $$ = ColumnType{DataType::INT}; }
658+ | INTERVAL { $$ = ColumnType{DataType::INTERVAL}; }
656659| LONG { $$ = ColumnType{DataType::LONG}; }
657660| REAL { $$ = ColumnType{DataType::REAL}; }
658661| SMALLINT { $$ = ColumnType{DataType::SMALLINT}; }
@@ -1008,7 +1011,7 @@ extended_literal : literal {
10081011 }
10091012 $$ = $1 ;
10101013}
1011- | ' -' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); };
1014+ | ' -' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); }
10121015| ' -' interval_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus , $2 ); };
10131016
10141017expr_alias : expr opt_alias {
@@ -1139,7 +1142,8 @@ column_name : IDENTIFIER { $$ = Expr::makeColumnRef($1); }
11391142| ' *' { $$ = Expr::makeStar(); }
11401143| IDENTIFIER ' .' ' *' { $$ = Expr::makeStar($1 ); };
11411144
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 | current_date | current_time ;
11431147
11441148string_literal : STRING { $$ = Expr::makeLiteral($1 ); };
11451149
@@ -1164,6 +1168,14 @@ date_literal : DATE STRING {
11641168 $$ = Expr::makeDateLiteral($2 );
11651169};
11661170
1171+ timestamp_literal : TIMESTAMP STRING {
1172+ $$ = Expr::makeTimestampLiteral($2 );
1173+ };
1174+
1175+ time_literal : TIME STRING {
1176+ $$ = Expr::makeTimeLiteral($2 );
1177+ };
1178+
11671179interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1 , $2 ); }
11681180| INTERVAL STRING datetime_field {
11691181 int duration{0 }, chars_parsed{0 };
@@ -1176,19 +1188,22 @@ interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2
11761188 free ($2 );
11771189 $$ = Expr::makeIntervalLiteral(duration, $3 );
11781190}
1191+ | INTERVAL INTVAL datetime_field {
1192+ $$ = Expr::makeIntervalLiteral($2 , $3 );
1193+ }
11791194| INTERVAL STRING {
11801195 int duration{0 }, chars_parsed{0 };
11811196 // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte
11821197 char unit_string[8 ];
11831198 // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character
11841199 if (sscanf($2 , " %d %7s%n" , &duration, unit_string, &chars_parsed) != 2 || $2 [chars_parsed] != 0 ) {
11851200 free ($2 );
1186- yyerror (&yyloc, result, scanner, " Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIIFIER " );
1201+ yyerror (&yyloc, result, scanner, " Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIFIER " );
11871202 YYERROR ;
11881203 }
11891204 free ($2 );
11901205
1191- DatetimeField unit;
1206+ DatetimeField unit = kDatetimeNone ;
11921207 if (strcasecmp(unit_string, " second" ) == 0 || strcasecmp(unit_string, " seconds" ) == 0 ) {
11931208 unit = kDatetimeSecond ;
11941209 } else if (strcasecmp(unit_string, " minute" ) == 0 || strcasecmp(unit_string, " minutes" ) == 0 ) {
@@ -1214,6 +1229,12 @@ param_expr : '?' {
12141229 yyloc.param_list.push_back($$ );
12151230};
12161231
1232+ current_timestamp : CURRENT_TIMESTAMP { $$ = Expr::makeCurrentTimestamp(); };
1233+
1234+ current_date : CURRENT_DATE { $$ = Expr::makeCurrentDate(); };
1235+
1236+ current_time : CURRENT_TIME { $$ = Expr::makeCurrentTime(); };
1237+
12171238/* *****************************
12181239 * Table
12191240 ******************************/
0 commit comments