mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-04 21:20:32 +00:00
Support parsing dates, times, and timestamps as strings
This commit is contained in:
parent
11fc833433
commit
ed3ed26bb1
3 changed files with 44 additions and 0 deletions
|
@ -15,6 +15,12 @@ pub enum Value {
|
||||||
HexStringLiteral(String),
|
HexStringLiteral(String),
|
||||||
/// Boolean value true or false
|
/// Boolean value true or false
|
||||||
Boolean(bool),
|
Boolean(bool),
|
||||||
|
/// Date literals
|
||||||
|
Date(String),
|
||||||
|
/// Time literals
|
||||||
|
Time(String),
|
||||||
|
/// Timestamp literals, which include both a date and time
|
||||||
|
Timestamp(String),
|
||||||
/// NULL value in insert statements,
|
/// NULL value in insert statements,
|
||||||
Null,
|
Null,
|
||||||
}
|
}
|
||||||
|
@ -28,6 +34,9 @@ impl ToString for Value {
|
||||||
Value::NationalStringLiteral(v) => format!("N'{}'", v),
|
Value::NationalStringLiteral(v) => format!("N'{}'", v),
|
||||||
Value::HexStringLiteral(v) => format!("X'{}'", v),
|
Value::HexStringLiteral(v) => format!("X'{}'", v),
|
||||||
Value::Boolean(v) => v.to_string(),
|
Value::Boolean(v) => v.to_string(),
|
||||||
|
Value::Date(v) => format!("DATE '{}'", escape_single_quote_string(v)),
|
||||||
|
Value::Time(v) => format!("TIME '{}'", escape_single_quote_string(v)),
|
||||||
|
Value::Timestamp(v) => format!("TIMESTAMP '{}'", escape_single_quote_string(v)),
|
||||||
Value::Null => "NULL".to_string(),
|
Value::Null => "NULL".to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,12 +192,17 @@ impl Parser {
|
||||||
}
|
}
|
||||||
"CASE" => self.parse_case_expression(),
|
"CASE" => self.parse_case_expression(),
|
||||||
"CAST" => self.parse_cast_expression(),
|
"CAST" => self.parse_cast_expression(),
|
||||||
|
"DATE" => Ok(ASTNode::SQLValue(Value::Date(self.parse_literal_string()?))),
|
||||||
"EXISTS" => self.parse_exists_expression(),
|
"EXISTS" => self.parse_exists_expression(),
|
||||||
"EXTRACT" => self.parse_extract_expression(),
|
"EXTRACT" => self.parse_extract_expression(),
|
||||||
"NOT" => Ok(ASTNode::SQLUnary {
|
"NOT" => Ok(ASTNode::SQLUnary {
|
||||||
operator: SQLOperator::Not,
|
operator: SQLOperator::Not,
|
||||||
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
|
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
|
||||||
}),
|
}),
|
||||||
|
"TIME" => Ok(ASTNode::SQLValue(Value::Time(self.parse_literal_string()?))),
|
||||||
|
"TIMESTAMP" => Ok(ASTNode::SQLValue(Value::Timestamp(
|
||||||
|
self.parse_literal_string()?,
|
||||||
|
))),
|
||||||
// Here `w` is a word, check if it's a part of a multi-part
|
// Here `w` is a word, check if it's a part of a multi-part
|
||||||
// identifier, a function call, or a simple identifier:
|
// identifier, a function call, or a simple identifier:
|
||||||
_ => match self.peek_token() {
|
_ => match self.peek_token() {
|
||||||
|
|
|
@ -1085,6 +1085,36 @@ fn parse_literal_string() {
|
||||||
one_statement_parses_to("SELECT x'deadBEEF'", "SELECT X'deadBEEF'");
|
one_statement_parses_to("SELECT x'deadBEEF'", "SELECT X'deadBEEF'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_literal_date() {
|
||||||
|
let sql = "SELECT DATE '1999-01-01'";
|
||||||
|
let select = verified_only_select(sql);
|
||||||
|
assert_eq!(
|
||||||
|
&ASTNode::SQLValue(Value::Date("1999-01-01".into())),
|
||||||
|
expr_from_projection(only(&select.projection)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_literal_time() {
|
||||||
|
let sql = "SELECT TIME '01:23:34'";
|
||||||
|
let select = verified_only_select(sql);
|
||||||
|
assert_eq!(
|
||||||
|
&ASTNode::SQLValue(Value::Time("01:23:34".into())),
|
||||||
|
expr_from_projection(only(&select.projection)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_literal_timestamp() {
|
||||||
|
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
|
||||||
|
let select = verified_only_select(sql);
|
||||||
|
assert_eq!(
|
||||||
|
&ASTNode::SQLValue(Value::Timestamp("1999-01-01 01:23:34".into())),
|
||||||
|
expr_from_projection(only(&select.projection)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_simple_math_expr_plus() {
|
fn parse_simple_math_expr_plus() {
|
||||||
let sql = "SELECT a + b, 2 + a, 2.5 + a, a_f + b_f, 2 + a_f, 2.5 + a_f FROM c";
|
let sql = "SELECT a + b, 2 + a, 2.5 + a, a_f + b_f, 2 + a_f, 2.5 + a_f FROM c";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue