@@ -9,6 +9,7 @@ use arrow_ord::cmp;
99use arrow_ord:: ord:: make_comparator;
1010use arrow_schema:: SortOptions ;
1111use vortex_error:: VortexResult ;
12+ use vortex_error:: vortex_err;
1213
1314use crate :: ArrayRef ;
1415use crate :: Canonical ;
@@ -187,29 +188,22 @@ pub fn scalar_cmp(lhs: &Scalar, rhs: &Scalar, operator: CompareOperator) -> Vort
187188
188189 let nullability = lhs. dtype ( ) . nullability ( ) | rhs. dtype ( ) . nullability ( ) ;
189190
190- // Equality and inequality can be determined without `partial_cmp`.
191- match operator {
192- CompareOperator :: Eq => return Ok ( Scalar :: bool ( lhs == rhs, nullability) ) ,
193- CompareOperator :: NotEq => return Ok ( Scalar :: bool ( lhs != rhs, nullability) ) ,
194- _ => { }
195- }
196-
197- // We do this instead of `<` and `>` to ensure we do not lose a type mismatch error.
191+ // We use `partial_cmp` to ensure we do not lose a type mismatch error.
198192 let ordering = lhs. partial_cmp ( rhs) . ok_or_else ( || {
199- vortex_error :: vortex_err!(
193+ vortex_err ! (
200194 "Cannot compare scalars with incompatible types: {} and {}" ,
201195 lhs. dtype( ) ,
202196 rhs. dtype( )
203197 )
204198 } ) ?;
205199
206200 let b = match operator {
201+ CompareOperator :: Eq => ordering. is_eq ( ) ,
202+ CompareOperator :: NotEq => ordering. is_ne ( ) ,
207203 CompareOperator :: Gt => ordering. is_gt ( ) ,
208204 CompareOperator :: Gte => ordering. is_ge ( ) ,
209205 CompareOperator :: Lt => ordering. is_lt ( ) ,
210206 CompareOperator :: Lte => ordering. is_le ( ) ,
211- // Already handled above.
212- CompareOperator :: Eq | CompareOperator :: NotEq => unreachable ! ( ) ,
213207 } ;
214208
215209 Ok ( Scalar :: bool ( b, nullability) )
@@ -275,6 +269,7 @@ mod tests {
275269 use crate :: extension:: datetime:: TimestampOptions ;
276270 use crate :: scalar:: Scalar ;
277271 use crate :: scalar_fn:: fns:: binary:: compare:: ConstantArray ;
272+ use crate :: scalar_fn:: fns:: binary:: scalar_cmp;
278273 use crate :: scalar_fn:: fns:: operators:: CompareOperator ;
279274 use crate :: scalar_fn:: fns:: operators:: Operator ;
280275 use crate :: test_harness:: to_int_indices;
@@ -523,21 +518,21 @@ mod tests {
523518 ) ;
524519
525520 // Ordering comparisons must error on incompatible types.
526- assert ! ( super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Gt ) . is_err( ) ) ;
527- assert ! ( super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Lt ) . is_err( ) ) ;
528- assert ! ( super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Gte ) . is_err( ) ) ;
529- assert ! ( super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Lte ) . is_err( ) ) ;
521+ assert ! ( scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Gt ) . is_err( ) ) ;
522+ assert ! ( scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Lt ) . is_err( ) ) ;
523+ assert ! ( scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Gte ) . is_err( ) ) ;
524+ assert ! ( scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Lte ) . is_err( ) ) ;
530525
531526 // Equality comparisons should succeed (and return false since the types differ).
532527 assert_eq ! (
533- super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Eq )
528+ scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: Eq )
534529 . unwrap( )
535530 . as_bool( )
536531 . value( ) ,
537532 Some ( false ) ,
538533 ) ;
539534 assert_eq ! (
540- super :: scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: NotEq )
535+ scalar_cmp( & ms_scalar, & s_scalar, CompareOperator :: NotEq )
541536 . unwrap( )
542537 . as_bool( )
543538 . value( ) ,
0 commit comments