@@ -2444,7 +2444,7 @@ impl ScalarValue {
2444
2444
e,
2445
2445
size
2446
2446
) ,
2447
- ScalarValue :: Union ( value, fields, _mode ) => match value {
2447
+ ScalarValue :: Union ( value, fields, mode ) => match value {
2448
2448
Some ( ( v_id, value) ) => {
2449
2449
let mut new_fields = Vec :: with_capacity ( fields. len ( ) ) ;
2450
2450
let mut child_arrays = Vec :: < ArrayRef > :: with_capacity ( fields. len ( ) ) ;
@@ -2453,15 +2453,23 @@ impl ScalarValue {
2453
2453
value. to_array_of_size ( size) ?
2454
2454
} else {
2455
2455
let dt = field. data_type ( ) ;
2456
- new_null_array ( dt, size)
2456
+ match mode {
2457
+ UnionMode :: Sparse => new_null_array ( dt, size) ,
2458
+ // In a dense union, only the child with values needs to be
2459
+ // allocated
2460
+ UnionMode :: Dense => new_null_array ( dt, 0 ) ,
2461
+ }
2457
2462
} ;
2458
2463
let field = ( * * field) . clone ( ) ;
2459
2464
child_arrays. push ( ar) ;
2460
2465
new_fields. push ( field. clone ( ) ) ;
2461
2466
}
2462
2467
let type_ids = repeat ( * v_id) . take ( size) ;
2463
2468
let type_ids = ScalarBuffer :: < i8 > :: from_iter ( type_ids) ;
2464
- let value_offsets: Option < ScalarBuffer < i32 > > = None ;
2469
+ let value_offsets = match mode {
2470
+ UnionMode :: Sparse => None ,
2471
+ UnionMode :: Dense => Some ( ScalarBuffer :: from_iter ( 0 ..size as i32 ) ) ,
2472
+ } ;
2465
2473
let ar = UnionArray :: try_new (
2466
2474
fields. clone ( ) ,
2467
2475
type_ids,
@@ -5642,14 +5650,12 @@ mod tests {
5642
5650
// null array
5643
5651
Arc :: new( NullArray :: new( 3 ) ) ,
5644
5652
// dense union
5645
- /* Dense union fails due to https://github.com/apache/datafusion/issues/13762
5646
5653
{
5647
5654
let mut builder = UnionBuilder :: new_dense( ) ;
5648
5655
builder. append:: <Int32Type >( "a" , 1 ) . unwrap( ) ;
5649
5656
builder. append:: <Float64Type >( "b" , 3.4 ) . unwrap( ) ;
5650
5657
Arc :: new( builder. build( ) . unwrap( ) )
5651
- }
5652
- */
5658
+ } ,
5653
5659
// sparse union
5654
5660
{
5655
5661
let mut builder = UnionBuilder :: new_sparse( ) ;
0 commit comments