Skip to content

Commit 1f87083

Browse files
authored
Merge pull request #99 from benesch/dates
Basic date/time support
2 parents 11fc833 + ed3ed26 commit 1f87083

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

src/sqlast/value.rs

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ pub enum Value {
1515
HexStringLiteral(String),
1616
/// Boolean value true or false
1717
Boolean(bool),
18+
/// Date literals
19+
Date(String),
20+
/// Time literals
21+
Time(String),
22+
/// Timestamp literals, which include both a date and time
23+
Timestamp(String),
1824
/// NULL value in insert statements,
1925
Null,
2026
}
@@ -28,6 +34,9 @@ impl ToString for Value {
2834
Value::NationalStringLiteral(v) => format!("N'{}'", v),
2935
Value::HexStringLiteral(v) => format!("X'{}'", v),
3036
Value::Boolean(v) => v.to_string(),
37+
Value::Date(v) => format!("DATE '{}'", escape_single_quote_string(v)),
38+
Value::Time(v) => format!("TIME '{}'", escape_single_quote_string(v)),
39+
Value::Timestamp(v) => format!("TIMESTAMP '{}'", escape_single_quote_string(v)),
3140
Value::Null => "NULL".to_string(),
3241
}
3342
}

src/sqlparser.rs

+5
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,17 @@ impl Parser {
192192
}
193193
"CASE" => self.parse_case_expression(),
194194
"CAST" => self.parse_cast_expression(),
195+
"DATE" => Ok(ASTNode::SQLValue(Value::Date(self.parse_literal_string()?))),
195196
"EXISTS" => self.parse_exists_expression(),
196197
"EXTRACT" => self.parse_extract_expression(),
197198
"NOT" => Ok(ASTNode::SQLUnary {
198199
operator: SQLOperator::Not,
199200
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
200201
}),
202+
"TIME" => Ok(ASTNode::SQLValue(Value::Time(self.parse_literal_string()?))),
203+
"TIMESTAMP" => Ok(ASTNode::SQLValue(Value::Timestamp(
204+
self.parse_literal_string()?,
205+
))),
201206
// Here `w` is a word, check if it's a part of a multi-part
202207
// identifier, a function call, or a simple identifier:
203208
_ => match self.peek_token() {

tests/sqlparser_common.rs

+30
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,36 @@ fn parse_literal_string() {
10851085
one_statement_parses_to("SELECT x'deadBEEF'", "SELECT X'deadBEEF'");
10861086
}
10871087

1088+
#[test]
1089+
fn parse_literal_date() {
1090+
let sql = "SELECT DATE '1999-01-01'";
1091+
let select = verified_only_select(sql);
1092+
assert_eq!(
1093+
&ASTNode::SQLValue(Value::Date("1999-01-01".into())),
1094+
expr_from_projection(only(&select.projection)),
1095+
);
1096+
}
1097+
1098+
#[test]
1099+
fn parse_literal_time() {
1100+
let sql = "SELECT TIME '01:23:34'";
1101+
let select = verified_only_select(sql);
1102+
assert_eq!(
1103+
&ASTNode::SQLValue(Value::Time("01:23:34".into())),
1104+
expr_from_projection(only(&select.projection)),
1105+
);
1106+
}
1107+
1108+
#[test]
1109+
fn parse_literal_timestamp() {
1110+
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
1111+
let select = verified_only_select(sql);
1112+
assert_eq!(
1113+
&ASTNode::SQLValue(Value::Timestamp("1999-01-01 01:23:34".into())),
1114+
expr_from_projection(only(&select.projection)),
1115+
);
1116+
}
1117+
10881118
#[test]
10891119
fn parse_simple_math_expr_plus() {
10901120
let sql = "SELECT a + b, 2 + a, 2.5 + a, a_f + b_f, 2 + a_f, 2.5 + a_f FROM c";

0 commit comments

Comments
 (0)