@@ -387,8 +387,8 @@ impl PhysicalExpr for BinaryExpr {
387387 let input_schema = schema. as_ref ( ) ;
388388
389389 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 ) ;
392392 }
393393 return apply_cmp_for_nested ( self . op , & lhs, & rhs) ;
394394 }
@@ -5399,4 +5399,65 @@ mod tests {
53995399 Interval :: make( Some ( false ) , Some ( false ) ) . unwrap( )
54005400 ) ;
54015401 }
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+ }
54025463}
0 commit comments