From 94df7c22e617a9fb416dac64ba5e82c4008c44e8 Mon Sep 17 00:00:00 2001 From: virattara Date: Sun, 7 Oct 2018 14:23:05 +0530 Subject: [PATCH] added support for expressions with parentheses --- src/sqlparser.rs | 9 ++++++++- tests/sqlparser_generic.rs | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/sqlparser.rs b/src/sqlparser.rs index 49f90bc8..c0a8a9ea 100644 --- a/src/sqlparser.rs +++ b/src/sqlparser.rs @@ -153,7 +153,14 @@ impl Parser { Token::DoubleQuotedString(_) => { self.prev_token(); self.parse_sql_value() - } + }, + Token::LParen => { + let expr = self.parse(); + if !self.consume_token(&Token::RParen)? { + return parser_err!(format!("expected token RParen")); + } + expr + }, _ => parser_err!(format!( "Prefix parser expected a keyword but found {:?}", t diff --git a/tests/sqlparser_generic.rs b/tests/sqlparser_generic.rs index 0e773a37..60ad8bc2 100644 --- a/tests/sqlparser_generic.rs +++ b/tests/sqlparser_generic.rs @@ -334,6 +334,29 @@ fn parse_select_version() { } } +#[test] +fn parse_parens() { + use self::ASTNode::*; + use self::SQLOperator::*; + let sql = "(a + b) - (c + d)"; + let ast = parse_sql(&sql); + assert_eq!( + SQLBinaryExpr { + left: Box::new(SQLBinaryExpr { + left: Box::new(SQLIdentifier("a".to_string())), + op: Plus, + right: Box::new(SQLIdentifier("b".to_string())) + }), + op: Minus, + right: Box::new(SQLBinaryExpr { + left: Box::new(SQLIdentifier("c".to_string())), + op: Plus, + right: Box::new(SQLIdentifier("d".to_string())) + }) + } + , ast); +} + fn parse_sql(sql: &str) -> ASTNode { let dialect = GenericSqlDialect {}; let mut tokenizer = Tokenizer::new(&dialect,&sql, );