@@ -387,8 +387,8 @@ impl PhysicalExpr for BinaryExpr {
387
387
let input_schema = schema. as_ref ( ) ;
388
388
389
389
if left_data_type. is_nested ( ) {
390
- if right_data_type != left_data_type {
391
- return internal_err ! ( "type mismatch" ) ;
390
+ if ! left_data_type. equals_datatype ( & right_data_type ) {
391
+ return internal_err ! ( "Cannot evaluate binary expression because of type mismatch: left {}, right {} " , left_data_type , right_data_type ) ;
392
392
}
393
393
return apply_cmp_for_nested ( self . op , & lhs, & rhs) ;
394
394
}
@@ -5399,4 +5399,65 @@ mod tests {
5399
5399
Interval :: make( Some ( false ) , Some ( false ) ) . unwrap( )
5400
5400
) ;
5401
5401
}
5402
+
5403
+ #[ test]
5404
+ fn test_evaluate_nested_type ( ) {
5405
+ let batch_schema = Arc :: new ( Schema :: new ( vec ! [
5406
+ Field :: new(
5407
+ "a" ,
5408
+ DataType :: List ( Arc :: new( Field :: new_list_field( DataType :: Int32 , true ) ) ) ,
5409
+ true ,
5410
+ ) ,
5411
+ Field :: new(
5412
+ "b" ,
5413
+ DataType :: List ( Arc :: new( Field :: new_list_field( DataType :: Int32 , true ) ) ) ,
5414
+ true ,
5415
+ ) ,
5416
+ ] ) ) ;
5417
+
5418
+ let mut list_builder_a = ListBuilder :: new ( Int32Builder :: new ( ) ) ;
5419
+
5420
+ list_builder_a. append_value ( [ Some ( 1 ) ] ) ;
5421
+ list_builder_a. append_value ( [ Some ( 2 ) ] ) ;
5422
+ list_builder_a. append_value ( [ ] ) ;
5423
+ list_builder_a. append_value ( [ None ] ) ;
5424
+
5425
+ let list_array_a: ArrayRef = Arc :: new ( list_builder_a. finish ( ) ) ;
5426
+
5427
+ let mut list_builder_b = ListBuilder :: new ( Int32Builder :: new ( ) ) ;
5428
+
5429
+ list_builder_b. append_value ( [ Some ( 1 ) ] ) ;
5430
+ list_builder_b. append_value ( [ Some ( 2 ) ] ) ;
5431
+ list_builder_b. append_value ( [ ] ) ;
5432
+ list_builder_b. append_value ( [ None ] ) ;
5433
+
5434
+ let list_array_b: ArrayRef = Arc :: new ( list_builder_b. finish ( ) ) ;
5435
+
5436
+ let batch =
5437
+ RecordBatch :: try_new ( batch_schema, vec ! [ list_array_a, list_array_b] ) . unwrap ( ) ;
5438
+
5439
+ let schema = Arc :: new ( Schema :: new ( vec ! [
5440
+ Field :: new(
5441
+ "a" ,
5442
+ DataType :: List ( Arc :: new( Field :: new( "foo" , DataType :: Int32 , true ) ) ) ,
5443
+ true ,
5444
+ ) ,
5445
+ Field :: new(
5446
+ "b" ,
5447
+ DataType :: List ( Arc :: new( Field :: new( "bar" , DataType :: Int32 , true ) ) ) ,
5448
+ true ,
5449
+ ) ,
5450
+ ] ) ) ;
5451
+
5452
+ let a = Arc :: new ( Column :: new ( "a" , 0 ) ) as _ ;
5453
+ let b = Arc :: new ( Column :: new ( "b" , 1 ) ) as _ ;
5454
+
5455
+ let eq_expr =
5456
+ binary_expr ( Arc :: clone ( & a) , Operator :: Eq , Arc :: clone ( & b) , & schema) . unwrap ( ) ;
5457
+
5458
+ let eq_result = eq_expr. evaluate ( & batch) . unwrap ( ) ;
5459
+ let expected =
5460
+ BooleanArray :: from_iter ( vec ! [ Some ( true ) , Some ( true ) , Some ( true ) , Some ( true ) ] ) ;
5461
+ assert_eq ! ( eq_result. into_array( 4 ) . unwrap( ) . as_boolean( ) , & expected) ;
5462
+ }
5402
5463
}
0 commit comments