mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-10 05:52:13 +00:00
Support bigquery CAST AS x [STRING|DATE] FORMAT
syntax (#978)
This commit is contained in:
parent
83cb734b3c
commit
c68e9775a2
6 changed files with 130 additions and 6 deletions
|
@ -1139,16 +1139,34 @@ impl<'a> Parser<'a> {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
|
||||
if self.parse_keyword(Keyword::FORMAT) {
|
||||
let value = self.parse_value()?;
|
||||
if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
|
||||
Ok(Some(CastFormat::ValueAtTimeZone(
|
||||
value,
|
||||
self.parse_value()?,
|
||||
)))
|
||||
} else {
|
||||
Ok(Some(CastFormat::Value(value)))
|
||||
}
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
|
||||
pub fn parse_cast_expr(&mut self) -> Result<Expr, ParserError> {
|
||||
self.expect_token(&Token::LParen)?;
|
||||
let expr = self.parse_expr()?;
|
||||
self.expect_keyword(Keyword::AS)?;
|
||||
let data_type = self.parse_data_type()?;
|
||||
let format = self.parse_optional_cast_format()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(Expr::Cast {
|
||||
expr: Box::new(expr),
|
||||
data_type,
|
||||
format,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1158,10 +1176,12 @@ impl<'a> Parser<'a> {
|
|||
let expr = self.parse_expr()?;
|
||||
self.expect_keyword(Keyword::AS)?;
|
||||
let data_type = self.parse_data_type()?;
|
||||
let format = self.parse_optional_cast_format()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(Expr::TryCast {
|
||||
expr: Box::new(expr),
|
||||
data_type,
|
||||
format,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1171,10 +1191,12 @@ impl<'a> Parser<'a> {
|
|||
let expr = self.parse_expr()?;
|
||||
self.expect_keyword(Keyword::AS)?;
|
||||
let data_type = self.parse_data_type()?;
|
||||
let format = self.parse_optional_cast_format()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(Expr::SafeCast {
|
||||
expr: Box::new(expr),
|
||||
data_type,
|
||||
format,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -2101,6 +2123,7 @@ impl<'a> Parser<'a> {
|
|||
Ok(Expr::Cast {
|
||||
expr: Box::new(expr),
|
||||
data_type: self.parse_data_type()?,
|
||||
format: None,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue