mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 06:18:17 +00:00
commit
1f87083906
3 changed files with 44 additions and 0 deletions
|
@ -15,6 +15,12 @@ pub enum Value {
|
|||
HexStringLiteral(String),
|
||||
/// Boolean value true or false
|
||||
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,
|
||||
}
|
||||
|
@ -28,6 +34,9 @@ impl ToString for Value {
|
|||
Value::NationalStringLiteral(v) => format!("N'{}'", v),
|
||||
Value::HexStringLiteral(v) => format!("X'{}'", v),
|
||||
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(),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -192,12 +192,17 @@ impl Parser {
|
|||
}
|
||||
"CASE" => self.parse_case_expression(),
|
||||
"CAST" => self.parse_cast_expression(),
|
||||
"DATE" => Ok(ASTNode::SQLValue(Value::Date(self.parse_literal_string()?))),
|
||||
"EXISTS" => self.parse_exists_expression(),
|
||||
"EXTRACT" => self.parse_extract_expression(),
|
||||
"NOT" => Ok(ASTNode::SQLUnary {
|
||||
operator: SQLOperator::Not,
|
||||
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
|
||||
// identifier, a function call, or a simple identifier:
|
||||
_ => match self.peek_token() {
|
||||
|
|
|
@ -1085,6 +1085,36 @@ fn parse_literal_string() {
|
|||
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]
|
||||
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";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue