Skip to content

Commit 54c9ca8

Browse files
committed
Support unary + / -
1 parent 786b1cf commit 54c9ca8

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/sqlparser.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ impl Parser {
174174
expr: Box::new(self.parse_subexpr(p)?),
175175
})
176176
}
177+
// another SQLWord:
177178
_ => match self.peek_token() {
178179
Some(Token::LParen) => self.parse_function(w.as_sql_ident()),
179180
Some(Token::Period) => {
@@ -201,8 +202,15 @@ impl Parser {
201202
}
202203
_ => Ok(ASTNode::SQLIdentifier(w.as_sql_ident())),
203204
},
204-
},
205+
}, // End of Token::SQLWord
205206
Token::Mult => Ok(ASTNode::SQLWildcard),
207+
tok @ Token::Minus | tok @ Token::Plus => {
208+
let p = self.get_precedence(&tok)?;
209+
Ok(ASTNode::SQLUnary {
210+
operator: self.to_sql_operator(&tok)?,
211+
expr: Box::new(self.parse_subexpr(p)?),
212+
})
213+
}
206214
Token::Number(_)
207215
| Token::SingleQuotedString(_)
208216
| Token::NationalStringLiteral(_) => {

tests/sqlparser_generic.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,27 @@ fn parse_compound_expr_2() {
174174
);
175175
}
176176

177+
#[test]
178+
fn parse_unary_math() {
179+
use self::ASTNode::*;
180+
use self::SQLOperator::*;
181+
let sql = "- a + - b";
182+
assert_eq!(
183+
SQLBinaryExpr {
184+
left: Box::new(SQLUnary {
185+
operator: Minus,
186+
expr: Box::new(SQLIdentifier("a".to_string())),
187+
}),
188+
op: Plus,
189+
right: Box::new(SQLUnary {
190+
operator: Minus,
191+
expr: Box::new(SQLIdentifier("b".to_string())),
192+
}),
193+
},
194+
verified_expr(sql)
195+
);
196+
}
197+
177198
#[test]
178199
fn parse_is_null() {
179200
use self::ASTNode::*;

0 commit comments

Comments
 (0)