Merge pull request #24 from virattara/feat_paren_expr

added support for expressions with parentheses
This commit is contained in:
Andy Grove 2018-10-14 10:12:39 -06:00 committed by GitHub
commit 038698c706
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View file

@ -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

View file

@ -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, );