Skip to content

Commit 08fe178

Browse files
committed
INTERVAL support, date pseudo literals TIMESTAMP and TIME literals.
The interval was not allowed to be a column data type. With this patch we add this support. We add support for the pseudo literals CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_DATE. Also, we add support for TIMESTAMP and TIME literals. The user can now explicitly set the type of the string value it follows with TIMESTAMP 'value' and TIME 'value. DATE was already supported.
1 parent 87e6eac commit 08fe178

14 files changed

+3483
-3222
lines changed

src/parser/bison_parser.cpp

Lines changed: 1928 additions & 1822 deletions
Large diffs are not rendered by default.

src/parser/bison_parser.h

Lines changed: 174 additions & 171 deletions
Large diffs are not rendered by default.

src/parser/bison_parser.y

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
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
@@ -265,6 +266,7 @@
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_literal current_date_literal current_time_literal
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

10141017
expr_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_literal | current_date_literal | current_time_literal;
11431147

11441148
string_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+
11671179
interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2); }
11681180
| INTERVAL STRING datetime_field {
11691181
int duration{0}, chars_parsed{0};
@@ -1176,6 +1188,9 @@ 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
@@ -1188,7 +1203,7 @@ interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2
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_literal : CURRENT_TIMESTAMP { $$ = Expr::makeCurrentTimestampLiteral(); };
1233+
1234+
current_date_literal : CURRENT_DATE { $$ = Expr::makeCurrentDateLiteral(); };
1235+
1236+
current_time_literal : CURRENT_TIME { $$ = Expr::makeCurrentTimeLiteral(); };
1237+
12171238
/******************************
12181239
* Table
12191240
******************************/

0 commit comments

Comments
 (0)