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)); }