From 8e7e4a91d29c4c8cb17788a84d7c61a4fd9d74c1 Mon Sep 17 00:00:00 2001 From: cui Date: Mon, 30 Mar 2026 11:22:04 +0800 Subject: [PATCH] fix(datatypes): correct ConstantVector rhs comparison in vector equality (#7866) * fix(datatypes): compare ConstantVector rhs inner in vector equality When either operand is a ConstantVector, the recursive equal() call must compare lhs.inner() against rhs.inner(). The second argument incorrectly used lhs twice, breaking equality when only the rhs was constant. Signed-off-by: Weixie Cui * fix: review Signed-off-by: Weixie Cui --------- Signed-off-by: Weixie Cui --- src/datatypes/src/vectors/eq.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/datatypes/src/vectors/eq.rs b/src/datatypes/src/vectors/eq.rs index 372b3ceee4..e8e942d3ff 100644 --- a/src/datatypes/src/vectors/eq.rs +++ b/src/datatypes/src/vectors/eq.rs @@ -67,7 +67,7 @@ fn equal(lhs: &dyn Vector, rhs: &dyn Vector) -> bool { .downcast_ref::() .unwrap() .inner(), - &**lhs + &**rhs .as_any() .downcast_ref::() .unwrap() @@ -259,6 +259,22 @@ mod tests { ]))); } + // Regression: second arm must downcast `rhs` (was `lhs`), or same-length ConstantVectors + // with different inners compare equal. + #[test] + fn test_constant_vector_eq_compares_both_inners() { + assert_vector_ref_ne( + Arc::new(ConstantVector::new( + Arc::new(BooleanVector::from(vec![true])), + 5, + )), + Arc::new(ConstantVector::new( + Arc::new(BooleanVector::from(vec![false])), + 5, + )), + ); + } + #[test] fn test_vector_ne() { assert_vector_ref_ne(