core: Change always falseness of equivalence between variables expressions to be only on anonymous variables

Named variables are compared by name
This commit is contained in:
Diego Reis
2025-04-12 16:51:47 -03:00
parent db0f07499d
commit ff7a4e8297

View File

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