@@ -390,13 +390,20 @@ pub fn flat_vector_to_arrow_array(
390390 flat_vector_to_arrow_array ( & mut vector. struct_vector_get_child ( idx) , len)
391391 } )
392392 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
393- Ok ( Arc :: new ( arrow_array:: StructArray :: try_new (
394- DType :: from_logical_type ( vector. logical_type ( ) , Nullability :: NonNullable ) ?
395- . to_arrow_schema ( ) ?
396- . fields ,
397- children,
398- vector. validity_ref ( len) . to_null_buffer ( ) ,
399- ) ?) )
393+ if children. is_empty ( ) {
394+ Ok ( Arc :: new ( arrow_array:: StructArray :: new_empty_fields (
395+ len,
396+ vector. validity_ref ( len) . to_null_buffer ( ) ,
397+ ) ) )
398+ } else {
399+ Ok ( Arc :: new ( arrow_array:: StructArray :: try_new (
400+ DType :: from_logical_type ( vector. logical_type ( ) , Nullability :: NonNullable ) ?
401+ . to_arrow_schema ( ) ?
402+ . fields ,
403+ children,
404+ vector. validity_ref ( len) . to_null_buffer ( ) ,
405+ ) ?) )
406+ }
400407 }
401408 _ => todo ! ( "missing impl for {type_id:?}" ) ,
402409 }
@@ -756,6 +763,20 @@ mod tests {
756763 ) ;
757764 }
758765
766+ #[ test]
767+ fn test_empty_struct ( ) {
768+ let len = 4 ;
769+ let logical_type = LogicalType :: struct_type ( [ ] , [ ] ) . vortex_unwrap ( ) ;
770+ let mut vector = Vector :: with_capacity ( logical_type, len) ;
771+
772+ // Test conversion
773+ let result = flat_vector_to_arrow_array ( & mut vector, len) . unwrap ( ) ;
774+ let arrow_array = result. as_struct ( ) ;
775+
776+ assert_eq ! ( arrow_array. len( ) , len) ;
777+ assert_eq ! ( arrow_array. fields( ) . len( ) , 0 ) ;
778+ }
779+
759780 #[ test]
760781 fn test_struct ( ) {
761782 let values1 = vec ! [ 1i32 , 2 , 3 , 4 ] ;
0 commit comments