From ff7a4e8297164455b9b5708298cbffc7acd56db8 Mon Sep 17 00:00:00 2001 From: Diego Reis Date: Sat, 12 Apr 2025 16:51:47 -0300 Subject: [PATCH] core: Change always falseness of equivalence between variables expressions to be only on anonymous variables Named variables are compared by name --- core/util.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/util.rs b/core/util.rs index aa13e2edc..80a52f387 100644 --- a/core/util.rs +++ b/core/util.rs @@ -401,7 +401,9 @@ pub fn exprs_are_equivalent(expr1: &Expr, expr2: &Expr) -> bool { } // Variables that are not bound to a specific value, are treated as NULL // https://sqlite.org/lang_expr.html#varparam - (Expr::Variable(..), Expr::Variable(..)) => false, + (Expr::Variable(var), Expr::Variable(var2)) if var == "" && var2 == "" => false, + // Named variables can be compared by their name + (Expr::Variable(val), Expr::Variable(val2)) => val == val2, (Expr::Parenthesized(exprs1), Expr::Parenthesized(exprs2)) => { exprs1.len() == exprs2.len() && exprs1 @@ -948,9 +950,20 @@ pub mod tests { } #[test] - fn test_variable_comparison() { - let expr1 = Expr::Variable("?".to_string()); - let expr2 = Expr::Variable("?".to_string()); + fn test_anonymous_variable_comparison() { + let expr1 = Expr::Variable("".to_string()); + let expr2 = Expr::Variable("".to_string()); + assert!(!exprs_are_equivalent(&expr1, &expr2)); + } + + #[test] + fn test_named_variable_comparison() { + let expr1 = Expr::Variable("1".to_string()); + let expr2 = Expr::Variable("1".to_string()); + assert!(exprs_are_equivalent(&expr1, &expr2)); + + let expr1 = Expr::Variable("1".to_string()); + let expr2 = Expr::Variable("2".to_string()); assert!(!exprs_are_equivalent(&expr1, &expr2)); }