@@ -309,6 +309,8 @@ impl Parser {
309
309
Token :: SQLWord ( ref k) if k. keyword == "NOT" => {
310
310
if self . parse_keyword ( "IN" ) {
311
311
self . parse_in ( expr, true )
312
+ } else if self . parse_keyword ( "BETWEEN" ) {
313
+ self . parse_between ( expr, true )
312
314
} else if self . parse_keyword ( "LIKE" ) {
313
315
Ok ( ASTNode :: SQLBinaryExpr {
314
316
left : Box :: new ( expr) ,
@@ -323,6 +325,7 @@ impl Parser {
323
325
}
324
326
}
325
327
Token :: SQLWord ( ref k) if k. keyword == "IN" => self . parse_in ( expr, false ) ,
328
+ Token :: SQLWord ( ref k) if k. keyword == "BETWEEN" => self . parse_between ( expr, false ) ,
326
329
Token :: DoubleColon => self . parse_pg_cast ( expr) ,
327
330
Token :: SQLWord ( _)
328
331
| Token :: Eq
@@ -369,6 +372,19 @@ impl Parser {
369
372
Ok ( in_op)
370
373
}
371
374
375
+ /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed
376
+ pub fn parse_between ( & mut self , expr : ASTNode , negated : bool ) -> Result < ASTNode , ParserError > {
377
+ let low = self . parse_prefix ( ) ?;
378
+ self . expect_keyword ( "AND" ) ?;
379
+ let high = self . parse_prefix ( ) ?;
380
+ Ok ( ASTNode :: SQLBetween {
381
+ expr : Box :: new ( expr) ,
382
+ negated,
383
+ low : Box :: new ( low) ,
384
+ high : Box :: new ( high) ,
385
+ } )
386
+ }
387
+
372
388
/// Parse a postgresql casting style which is in the form of `expr::datatype`
373
389
pub fn parse_pg_cast ( & mut self , expr : ASTNode ) -> Result < ASTNode , ParserError > {
374
390
Ok ( ASTNode :: SQLCast {
@@ -418,6 +434,7 @@ impl Parser {
418
434
& Token :: SQLWord ( ref k) if k. keyword == "NOT" => Ok ( 15 ) ,
419
435
& Token :: SQLWord ( ref k) if k. keyword == "IS" => Ok ( 17 ) ,
420
436
& Token :: SQLWord ( ref k) if k. keyword == "IN" => Ok ( 20 ) ,
437
+ & Token :: SQLWord ( ref k) if k. keyword == "BETWEEN" => Ok ( 20 ) ,
421
438
& Token :: SQLWord ( ref k) if k. keyword == "LIKE" => Ok ( 20 ) ,
422
439
& Token :: Eq | & Token :: Lt | & Token :: LtEq | & Token :: Neq | & Token :: Gt | & Token :: GtEq => {
423
440
Ok ( 20 )
0 commit comments