From 5a3587f7a20af439c2e71579ce8e9f41401e931f Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Sun, 2 Feb 2025 22:00:23 +0400 Subject: [PATCH] use opposite operator for search if WHERE condition is swapped (e.g. 1 > x instead of x < 1) --- core/translate/optimizer.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/translate/optimizer.rs b/core/translate/optimizer.rs index 5ad3074cd..c1119c9ba 100644 --- a/core/translate/optimizer.rs +++ b/core/translate/optimizer.rs @@ -474,6 +474,17 @@ impl Optimizable for ast::Expr { } } +fn opposite_cmp_op(op: ast::Operator) -> ast::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, + _ => panic!("unexpected operator: {:?}", op), + } +} + pub fn try_extract_index_search_expression( cond: &mut WhereTerm, table_index: usize, @@ -533,7 +544,7 @@ pub fn try_extract_index_search_expression( | ast::Operator::LessEquals => { let lhs_owned = lhs.take_ownership(); return Ok(Some(Search::RowidSearch { - cmp_op: *operator, + cmp_op: opposite_cmp_op(*operator), cmp_expr: WhereTerm { expr: lhs_owned, from_outer_join: cond.from_outer_join, @@ -581,7 +592,7 @@ pub fn try_extract_index_search_expression( let lhs_owned = lhs.take_ownership(); return Ok(Some(Search::IndexSearch { index: available_indexes[index_index].clone(), - cmp_op: *operator, + cmp_op: opposite_cmp_op(*operator), cmp_expr: WhereTerm { expr: lhs_owned, from_outer_join: cond.from_outer_join,