added support for expressions with parentheses

This commit is contained in:
virattara 2018-10-07 14:23:05 +05:30
parent 335607f6bb
commit 94df7c22e6
2 changed files with 31 additions and 1 deletions

View file

@ -153,7 +153,14 @@ impl Parser {
Token::DoubleQuotedString(_) => { Token::DoubleQuotedString(_) => {
self.prev_token(); self.prev_token();
self.parse_sql_value() 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!( _ => parser_err!(format!(
"Prefix parser expected a keyword but found {:?}", "Prefix parser expected a keyword but found {:?}",
t 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 { fn parse_sql(sql: &str) -> ASTNode {
let dialect = GenericSqlDialect {}; let dialect = GenericSqlDialect {};
let mut tokenizer = Tokenizer::new(&dialect,&sql, ); let mut tokenizer = Tokenizer::new(&dialect,&sql, );