@@ -4,7 +4,7 @@ use std::sync::Arc;
44
55use datafusion:: arrow:: array:: {
66 downcast_array, AnyDictionaryArray , Array , ArrayAccessor , ArrayRef , AsArray , DictionaryArray , LargeStringArray ,
7- PrimitiveArray , PrimitiveBuilder , RunArray , StringArray , StringViewArray ,
7+ PrimitiveArray , RunArray , StringArray , StringViewArray , PrimitiveBuilder
88} ;
99use datafusion:: arrow:: compute:: kernels:: cast;
1010use datafusion:: arrow:: compute:: take;
@@ -255,9 +255,14 @@ fn invoke_array_array<R: InvokeResult>(
255255/// Not following this invariant causes invalid dictionary arrays to be built later on inside of DataFusion
256256/// when arrays are concacted and such.
257257fn remap_dictionary_key_nulls (
258- keys : & PrimitiveArray < Int64Type > ,
259- values : & ArrayRef ,
258+ keys : PrimitiveArray < Int64Type > ,
259+ values : ArrayRef ,
260260) -> DataFusionResult < DictionaryArray < Int64Type > > {
261+ // fast path: no nulls in values
262+ if values. null_count ( ) == 0 {
263+ return Ok ( DictionaryArray :: new ( keys, values) ) ;
264+ }
265+
261266 let mut new_keys_builder = PrimitiveBuilder :: < Int64Type > :: new ( ) ;
262267 let mut value_indices_builder = PrimitiveBuilder :: < Int64Type > :: new ( ) ;
263268 let mut value_map: HashMap < i64 , i64 > = HashMap :: new ( ) ; // Map old indices to new indices
@@ -289,7 +294,7 @@ fn remap_dictionary_key_nulls(
289294
290295 let new_keys = new_keys_builder. finish ( ) ;
291296 let value_indices = value_indices_builder. finish ( ) ;
292- let new_values = take ( values, & value_indices, None ) ?;
297+ let new_values = take ( & values, & value_indices, None ) ?;
293298
294299 Ok ( DictionaryArray :: new ( new_keys, new_values) )
295300}
@@ -330,7 +335,7 @@ fn invoke_array_scalars<R: InvokeResult>(
330335 let type_ids = values. as_union ( ) . type_ids ( ) ;
331336 keys = mask_dictionary_keys ( & keys, type_ids) ;
332337 }
333- Ok ( Arc :: new ( remap_dictionary_key_nulls ( & keys, & values) ?) )
338+ Ok ( Arc :: new ( remap_dictionary_key_nulls ( keys, values) ?) )
334339 } else {
335340 // this is what cast would do under the hood to unpack a dictionary into an array of its values
336341 Ok ( take ( & values, json_array. keys ( ) , None ) ?)
0 commit comments