diff --git a/core/translate/optimizer.rs b/core/translate/optimizer.rs index a65468c89..ec657c58c 100644 --- a/core/translate/optimizer.rs +++ b/core/translate/optimizer.rs @@ -743,9 +743,17 @@ impl Optimizable for ast::Expr { rhs.check_index_scan(table_index, referenced_tables, available_indexes)?; if rhs_index.is_some() { // swap lhs and rhs + let swapped_operator = match *op { + ast::Operator::Equals => ast::Operator::Equals, + ast::Operator::Greater => ast::Operator::Less, + ast::Operator::GreaterEquals => ast::Operator::LessEquals, + ast::Operator::Less => ast::Operator::Greater, + ast::Operator::LessEquals => ast::Operator::GreaterEquals, + _ => unreachable!(), + }; let lhs_new = rhs.take_ownership(); let rhs_new = lhs.take_ownership(); - *self = Self::Binary(Box::new(lhs_new), *op, Box::new(rhs_new)); + *self = Self::Binary(Box::new(lhs_new), swapped_operator, Box::new(rhs_new)); return Ok(rhs_index); } Ok(None) diff --git a/testing/where.test b/testing/where.test index 8a568d0fc..feb4e812a 100755 --- a/testing/where.test +++ b/testing/where.test @@ -338,3 +338,8 @@ do_execsql_test between-price-range-with-names { AND (name = 'sweatshirt' OR name = 'sneakers'); } {5|sweatshirt|74.0 8|sneakers|82.0} + +do_execsql_test where-between-true-and-2 { + select id from users where id between true and 2; +} {1 +2}