mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-21 14:40:18 +00:00
add more consistency in ast (#523)
* add more consistency in ast * refactor styling
This commit is contained in:
parent
d981f70143
commit
c884fbc388
3 changed files with 43 additions and 15 deletions
|
@ -426,7 +426,7 @@ impl<'a> Parser<'a> {
|
|||
Keyword::CASE => self.parse_case_expr(),
|
||||
Keyword::CAST => self.parse_cast_expr(),
|
||||
Keyword::TRY_CAST => self.parse_try_cast_expr(),
|
||||
Keyword::EXISTS => self.parse_exists_expr(),
|
||||
Keyword::EXISTS => self.parse_exists_expr(false),
|
||||
Keyword::EXTRACT => self.parse_extract_expr(),
|
||||
Keyword::POSITION => self.parse_position_expr(),
|
||||
Keyword::SUBSTRING => self.parse_substring_expr(),
|
||||
|
@ -438,10 +438,7 @@ impl<'a> Parser<'a> {
|
|||
self.expect_token(&Token::LBracket)?;
|
||||
self.parse_array_expr(true)
|
||||
}
|
||||
Keyword::NOT => Ok(Expr::UnaryOp {
|
||||
op: UnaryOperator::Not,
|
||||
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
|
||||
}),
|
||||
Keyword::NOT => self.parse_not(),
|
||||
// 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() {
|
||||
|
@ -783,9 +780,12 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
|
||||
pub fn parse_exists_expr(&mut self) -> Result<Expr, ParserError> {
|
||||
pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
|
||||
self.expect_token(&Token::LParen)?;
|
||||
let exists_node = Expr::Exists(Box::new(self.parse_query()?));
|
||||
let exists_node = Expr::Exists {
|
||||
negated,
|
||||
subquery: Box::new(self.parse_query()?),
|
||||
};
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(exists_node)
|
||||
}
|
||||
|
@ -984,6 +984,26 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
|
||||
match self.peek_token() {
|
||||
Token::Word(w) => match w.keyword {
|
||||
Keyword::EXISTS => {
|
||||
let negated = true;
|
||||
let _ = self.parse_keyword(Keyword::EXISTS);
|
||||
self.parse_exists_expr(negated)
|
||||
}
|
||||
_ => Ok(Expr::UnaryOp {
|
||||
op: UnaryOperator::Not,
|
||||
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
|
||||
}),
|
||||
},
|
||||
_ => Ok(Expr::UnaryOp {
|
||||
op: UnaryOperator::Not,
|
||||
expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse an INTERVAL literal.
|
||||
///
|
||||
/// Some syntactically valid intervals:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue