Skip to content

Commit eb4b5bc

Browse files
committed
Stop returning Option from parse_infix
This reduces amount of boilerplate and avoids cloning the `expr` param.
1 parent d73a1e0 commit eb4b5bc

File tree

1 file changed

+13
-19
lines changed

1 file changed

+13
-19
lines changed

src/sqlparser.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ impl Parser {
7777
break;
7878
}
7979

80-
if let Some(infix_expr) = self.parse_infix(expr.clone(), next_precedence)? {
81-
expr = infix_expr;
82-
}
80+
expr = self.parse_infix(expr, next_precedence)?;
8381
}
8482
Ok(expr)
8583
}
@@ -102,9 +100,7 @@ impl Parser {
102100
break;
103101
}
104102

105-
if let Some(infix_expr) = self.parse_infix(expr.clone(), next_precedence)? {
106-
expr = infix_expr;
107-
}
103+
expr = self.parse_infix(expr, next_precedence)?;
108104
}
109105
Ok(expr)
110106
}
@@ -248,37 +244,33 @@ impl Parser {
248244
}
249245

250246
/// Parse an expression infix (typically an operator)
251-
pub fn parse_infix(
252-
&mut self,
253-
expr: ASTNode,
254-
precedence: u8,
255-
) -> Result<Option<ASTNode>, ParserError> {
247+
pub fn parse_infix(&mut self, expr: ASTNode, precedence: u8) -> Result<ASTNode, ParserError> {
256248
debug!("parsing infix");
257249
match self.next_token() {
258250
Some(tok) => match tok {
259251
Token::Keyword(ref k) if k == "IS" => {
260252
if self.parse_keywords(vec!["NULL"]) {
261-
Ok(Some(ASTNode::SQLIsNull(Box::new(expr))))
253+
Ok(ASTNode::SQLIsNull(Box::new(expr)))
262254
} else if self.parse_keywords(vec!["NOT", "NULL"]) {
263-
Ok(Some(ASTNode::SQLIsNotNull(Box::new(expr))))
255+
Ok(ASTNode::SQLIsNotNull(Box::new(expr)))
264256
} else {
265257
parser_err!("Invalid tokens after IS")
266258
}
267259
}
268260
Token::Keyword(ref k) if k == "NOT" => {
269261
if self.parse_keywords(vec!["LIKE"]) {
270-
Ok(Some(ASTNode::SQLBinaryExpr {
262+
Ok(ASTNode::SQLBinaryExpr {
271263
left: Box::new(expr),
272264
op: SQLOperator::NotLike,
273265
right: Box::new(self.parse_expr(precedence)?),
274-
}))
266+
})
275267
} else {
276268
parser_err!("Invalid tokens after NOT")
277269
}
278270
}
279271
Token::DoubleColon => {
280272
let pg_cast = self.parse_pg_cast(expr)?;
281-
Ok(Some(pg_cast))
273+
Ok(pg_cast)
282274
}
283275
Token::Keyword(_)
284276
| Token::Eq
@@ -291,14 +283,16 @@ impl Parser {
291283
| Token::Minus
292284
| Token::Mult
293285
| Token::Mod
294-
| Token::Div => Ok(Some(ASTNode::SQLBinaryExpr {
286+
| Token::Div => Ok(ASTNode::SQLBinaryExpr {
295287
left: Box::new(expr),
296288
op: self.to_sql_operator(&tok)?,
297289
right: Box::new(self.parse_expr(precedence)?),
298-
})),
290+
}),
299291
_ => parser_err!(format!("No infix parser for token {:?}", tok)),
300292
},
301-
None => Ok(None),
293+
// This is not supposed to happen, because of the precedence check
294+
// in parse_expr.
295+
None => parser_err!("Unexpected EOF in parse_infix"),
302296
}
303297
}
304298

0 commit comments

Comments
 (0)