@@ -875,6 +875,18 @@ impl<'a> Parser<'a> {
875875 left : Box :: new ( lhs) ,
876876 right : self . parse_expression ( infix. precedence ( ) ) . map ( Box :: new) ?,
877877 } ,
878+ InfixOperator :: Between => {
879+ let low = self . parse_expression ( infix. precedence ( ) ) ?;
880+ self . next_except ( TokenType :: Keyword ( Keyword :: And ) ) ?;
881+ let high = self . parse_expression ( infix. precedence ( ) ) ?;
882+
883+ Expression :: Between {
884+ negated,
885+ expr : Box :: new ( lhs) ,
886+ low : Box :: new ( low) ,
887+ high : Box :: new ( high) ,
888+ }
889+ }
878890 InfixOperator :: In => self . parse_in_expr ( lhs, negated) ?,
879891 InfixOperator :: DoubleColon => self . parse_data_type ( ) . map ( |dt| Expression :: Cast {
880892 expr : Box :: new ( lhs) ,
@@ -1253,6 +1265,7 @@ enum InfixOperator {
12531265 And ,
12541266 Or ,
12551267 In ,
1268+ Between ,
12561269 DoubleColon ,
12571270 Is ,
12581271 Like ,
@@ -1275,6 +1288,7 @@ impl Operator for InfixOperator {
12751288 TokenType :: Keyword ( Keyword :: And ) => Some ( InfixOperator :: And ) ,
12761289 TokenType :: Keyword ( Keyword :: Or ) => Some ( InfixOperator :: Or ) ,
12771290 TokenType :: Keyword ( Keyword :: In ) => Some ( InfixOperator :: In ) ,
1291+ TokenType :: Keyword ( Keyword :: Between ) => Some ( InfixOperator :: Between ) ,
12781292 TokenType :: Keyword ( Keyword :: Is ) => Some ( InfixOperator :: Is ) ,
12791293 TokenType :: Keyword ( Keyword :: Like ) => Some ( InfixOperator :: Like ) ,
12801294 _ => None ,
@@ -1285,7 +1299,7 @@ impl Operator for InfixOperator {
12851299 match self {
12861300 InfixOperator :: Or => 1 ,
12871301 InfixOperator :: And => 2 ,
1288- InfixOperator :: Eq | InfixOperator :: NotEq | InfixOperator :: Like => 3 ,
1302+ InfixOperator :: Eq | InfixOperator :: NotEq | InfixOperator :: Like | InfixOperator :: Between => 3 ,
12891303 InfixOperator :: Gt | InfixOperator :: Gte | InfixOperator :: Lt | InfixOperator :: Lte => 4 ,
12901304 InfixOperator :: Add | InfixOperator :: Sub => 5 ,
12911305 InfixOperator :: Mul | InfixOperator :: Div => 6 ,
@@ -4584,6 +4598,35 @@ mod tests {
45844598 }
45854599 }
45864600
4601+ #[ test]
4602+ fn test_parse_between_expression ( ) {
4603+ let stmt = parse_stmt ( "SELECT * FROM tbl WHERE id BETWEEN 1 AND 3" ) . unwrap ( ) ;
4604+
4605+ assert_eq ! (
4606+ stmt,
4607+ ast:: Statement :: Select ( Box :: new( ast:: Select {
4608+ with: None ,
4609+ distinct: None ,
4610+ columns: vec![ ast:: SelectItem :: Wildcard ] ,
4611+ from: vec![ ast:: From :: Table {
4612+ name: "tbl" . to_owned( ) ,
4613+ alias: None
4614+ } ] ,
4615+ r#where: Some ( ast:: Expression :: Between {
4616+ negated: false ,
4617+ expr: Box :: new( ast:: Expression :: Identifier ( "id" . into( ) ) ) ,
4618+ low: Box :: new( ast:: Expression :: Literal ( ast:: Literal :: Int ( 1 ) ) ) ,
4619+ high: Box :: new( ast:: Expression :: Literal ( ast:: Literal :: Int ( 3 ) ) ) ,
4620+ } ) ,
4621+ group_by: None ,
4622+ having: None ,
4623+ order_by: None ,
4624+ limit: None ,
4625+ offset: None ,
4626+ } ) )
4627+ ) ;
4628+ }
4629+
45874630 fn parse_stmt ( input : & str ) -> Result < Statement > {
45884631 let mut parser = Parser :: new ( input) ;
45894632 parser. parse ( )
0 commit comments