mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-11 14:32:04 +00:00
Support EXTRACT function-like operator
The EXTRACT function, for extracting components of a date from a timestamp, has special syntax: `EXTRACT(<field> FROM <timestamp>)`.
This commit is contained in:
parent
2f4cd8f6c8
commit
d484756182
3 changed files with 85 additions and 0 deletions
|
@ -193,6 +193,7 @@ impl Parser {
|
|||
"CASE" => self.parse_case_expression(),
|
||||
"CAST" => self.parse_cast_expression(),
|
||||
"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)?),
|
||||
|
@ -417,6 +418,31 @@ impl Parser {
|
|||
Ok(exists_node)
|
||||
}
|
||||
|
||||
pub fn parse_extract_expression(&mut self) -> Result<ASTNode, ParserError> {
|
||||
self.expect_token(&Token::LParen)?;
|
||||
let tok = self.next_token();
|
||||
let field = if let Some(Token::SQLWord(ref k)) = tok {
|
||||
match k.keyword.as_ref() {
|
||||
"YEAR" => SQLDateTimeField::Year,
|
||||
"MONTH" => SQLDateTimeField::Month,
|
||||
"DAY" => SQLDateTimeField::Day,
|
||||
"HOUR" => SQLDateTimeField::Hour,
|
||||
"MINUTE" => SQLDateTimeField::Minute,
|
||||
"SECOND" => SQLDateTimeField::Second,
|
||||
_ => self.expected("Date/time field inside of EXTRACT function", tok)?,
|
||||
}
|
||||
} else {
|
||||
self.expected("Date/time field inside of EXTRACT function", tok)?
|
||||
};
|
||||
self.expect_keyword("FROM")?;
|
||||
let expr = self.parse_expr()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(ASTNode::SQLExtract {
|
||||
field,
|
||||
expr: Box::new(expr),
|
||||
})
|
||||
}
|
||||
|
||||
/// Parse an operator following an expression
|
||||
pub fn parse_infix(&mut self, expr: ASTNode, precedence: u8) -> Result<ASTNode, ParserError> {
|
||||
debug!("parsing infix");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue