@@ -77,9 +77,7 @@ impl Parser {
77
77
break ;
78
78
}
79
79
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) ?;
83
81
}
84
82
Ok ( expr)
85
83
}
@@ -102,9 +100,7 @@ impl Parser {
102
100
break ;
103
101
}
104
102
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) ?;
108
104
}
109
105
Ok ( expr)
110
106
}
@@ -248,37 +244,33 @@ impl Parser {
248
244
}
249
245
250
246
/// 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 > {
256
248
debug ! ( "parsing infix" ) ;
257
249
match self . next_token ( ) {
258
250
Some ( tok) => match tok {
259
251
Token :: Keyword ( ref k) if k == "IS" => {
260
252
if self . parse_keywords ( vec ! [ "NULL" ] ) {
261
- Ok ( Some ( ASTNode :: SQLIsNull ( Box :: new ( expr) ) ) )
253
+ Ok ( ASTNode :: SQLIsNull ( Box :: new ( expr) ) )
262
254
} else if self . parse_keywords ( vec ! [ "NOT" , "NULL" ] ) {
263
- Ok ( Some ( ASTNode :: SQLIsNotNull ( Box :: new ( expr) ) ) )
255
+ Ok ( ASTNode :: SQLIsNotNull ( Box :: new ( expr) ) )
264
256
} else {
265
257
parser_err ! ( "Invalid tokens after IS" )
266
258
}
267
259
}
268
260
Token :: Keyword ( ref k) if k == "NOT" => {
269
261
if self . parse_keywords ( vec ! [ "LIKE" ] ) {
270
- Ok ( Some ( ASTNode :: SQLBinaryExpr {
262
+ Ok ( ASTNode :: SQLBinaryExpr {
271
263
left : Box :: new ( expr) ,
272
264
op : SQLOperator :: NotLike ,
273
265
right : Box :: new ( self . parse_expr ( precedence) ?) ,
274
- } ) )
266
+ } )
275
267
} else {
276
268
parser_err ! ( "Invalid tokens after NOT" )
277
269
}
278
270
}
279
271
Token :: DoubleColon => {
280
272
let pg_cast = self . parse_pg_cast ( expr) ?;
281
- Ok ( Some ( pg_cast) )
273
+ Ok ( pg_cast)
282
274
}
283
275
Token :: Keyword ( _)
284
276
| Token :: Eq
@@ -291,14 +283,16 @@ impl Parser {
291
283
| Token :: Minus
292
284
| Token :: Mult
293
285
| Token :: Mod
294
- | Token :: Div => Ok ( Some ( ASTNode :: SQLBinaryExpr {
286
+ | Token :: Div => Ok ( ASTNode :: SQLBinaryExpr {
295
287
left : Box :: new ( expr) ,
296
288
op : self . to_sql_operator ( & tok) ?,
297
289
right : Box :: new ( self . parse_expr ( precedence) ?) ,
298
- } ) ) ,
290
+ } ) ,
299
291
_ => parser_err ! ( format!( "No infix parser for token {:?}" , tok) ) ,
300
292
} ,
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" ) ,
302
296
}
303
297
}
304
298
0 commit comments