@@ -86,8 +86,8 @@ use datafusion::physical_expr::LexOrdering;
8686
8787use crate :: parquet:: parquet_exec:: init_datasource_exec;
8888use arrow:: array:: {
89- BinaryArray , BooleanArray , Date32Array , Decimal128Array , Float32Array , Float64Array ,
90- Int16Array , Int32Array , Int64Array , Int8Array , NullArray , StringBuilder ,
89+ BinaryArray , BinaryBuilder , BooleanArray , Date32Array , Decimal128Array , Float32Array ,
90+ Float64Array , Int16Array , Int32Array , Int64Array , Int8Array , NullArray , StringBuilder ,
9191 TimestampMicrosecondArray ,
9292} ;
9393use arrow:: buffer:: { BooleanBuffer , Buffer , MutableBuffer , OffsetBuffer } ;
@@ -540,21 +540,32 @@ impl PhysicalPlanner {
540540 . build_list_scalar ( )
541541 }
542542 DataType :: Binary => {
543+ // Using a builder here as it is quite complicated to create StringArray from a vector with nulls
544+ // to calculate correct offsets
543545 let vals = values. clone ( ) ;
544- let offsets = MutableBuffer :: new ( ( vals. bytes_values . len ( ) + 1 ) * size_of :: < i32 > ( ) ) ;
545- let offsets = Buffer :: from ( offsets) ;
546- let value_offsets = unsafe { OffsetBuffer :: new_unchecked ( offsets. into ( ) ) } ;
547- SingleRowListArrayBuilder :: new ( Arc :: new ( BinaryArray :: new ( value_offsets, vals. int_values . into ( ) , Some ( vals. null_mask . into ( ) ) ) ) )
546+ let len = vals. bytes_values . len ( ) ;
547+ let mut arr = BinaryBuilder :: with_capacity ( len, len) ;
548+
549+ for ( i, v) in vals. bytes_values . into_iter ( ) . enumerate ( ) {
550+ if vals. null_mask [ i] {
551+ arr. append_value ( v) ;
552+ } else {
553+ arr. append_null ( ) ;
554+ }
555+ }
556+
557+ SingleRowListArrayBuilder :: new ( Arc :: new ( arr. finish ( ) ) )
548558 . build_list_scalar ( )
549559 }
550560 DataType :: Utf8 => {
551- // Using a builder here as it is quite complicated to create StringArray from vector of string with nulls
561+ // Using a builder here as it is quite complicated to create StringArray from a vector with nulls
562+ // to calculate correct offsets
552563 let vals = values. clone ( ) ;
553564 let len = vals. string_values . len ( ) ;
554565 let mut arr = StringBuilder :: with_capacity ( len, len) ;
555566
556567 for ( i, v) in vals. string_values . into_iter ( ) . enumerate ( ) {
557- if ! vals. null_mask [ i] {
568+ if vals. null_mask [ i] {
558569 arr. append_value ( v) ;
559570 } else {
560571 arr. append_null ( ) ;
0 commit comments