@@ -347,7 +347,6 @@ pub fn flat_vector_to_arrow_array(
347347 ) ?) )
348348 }
349349 DUCKDB_TYPE :: DUCKDB_TYPE_LIST => {
350- let arrow_child = flat_vector_to_arrow_array ( & mut vector. list_vector_get_child ( ) , len) ?;
351350 let array_child_type = vector. logical_type ( ) . list_child_type ( ) ;
352351
353352 let mut offsets = BufferMut :: with_capacity ( len) ;
@@ -364,6 +363,13 @@ pub fn flat_vector_to_arrow_array(
364363 ) ;
365364 }
366365 }
366+ let offsets = offsets. freeze ( ) ;
367+ let lengths = lengths. freeze ( ) ;
368+ let arrow_child = flat_vector_to_arrow_array (
369+ & mut vector. list_vector_get_child ( ) ,
370+ usize:: try_from ( offsets[ len - 1 ] + lengths[ len - 1 ] )
371+ . vortex_expect ( "last offset and length sum must fit in usize " ) ,
372+ ) ?;
367373
368374 Ok ( Arc :: new ( GenericListViewArray :: try_new (
369375 Arc :: new ( Field :: new (
@@ -372,8 +378,8 @@ pub fn flat_vector_to_arrow_array(
372378 . to_arrow_dtype ( ) ?,
373379 true ,
374380 ) ) ,
375- offsets. freeze ( ) . into_arrow_scalar_buffer ( ) ,
376- lengths. freeze ( ) . into_arrow_scalar_buffer ( ) ,
381+ offsets. into_arrow_scalar_buffer ( ) ,
382+ lengths. into_arrow_scalar_buffer ( ) ,
377383 arrow_child,
378384 vector. validity_ref ( len) . to_null_buffer ( ) ,
379385 ) ?) )
@@ -689,10 +695,43 @@ mod tests {
689695 assert_eq ! ( arrow_array. value( 2 ) , 3 ) ;
690696 }
691697
698+ #[ test]
699+ fn test_list ( ) {
700+ let values = vec ! [ 1i32 , 2 , 3 , 4 ] ;
701+ let len = 1 ;
702+
703+ let logical_type =
704+ LogicalType :: list_type ( LogicalType :: new ( DUCKDB_TYPE :: DUCKDB_TYPE_INTEGER ) )
705+ . vortex_unwrap ( ) ;
706+ let mut vector = Vector :: with_capacity ( logical_type, len) ;
707+
708+ // Populate with data
709+ unsafe {
710+ let entries = vector. as_slice_mut :: < duckdb_list_entry > ( len) ;
711+ entries[ 0 ] = duckdb_list_entry {
712+ offset : 0 ,
713+ length : values. len ( ) as u64 ,
714+ } ;
715+ let mut child = vector. list_vector_get_child ( ) ;
716+ let slice = child. as_slice_mut :: < i32 > ( values. len ( ) ) ;
717+ slice. copy_from_slice ( & values) ;
718+ }
719+
720+ // Test conversion
721+ let result = flat_vector_to_arrow_array ( & mut vector, len) . unwrap ( ) ;
722+ let arrow_array = result. as_list_view :: < i64 > ( ) ;
723+
724+ assert_eq ! ( arrow_array. len( ) , len) ;
725+ assert_eq ! (
726+ arrow_array. value( 0 ) . as_primitive:: <Int32Type >( ) ,
727+ & Int32Array :: from_iter( [ 1 , 2 , 3 , 4 ] )
728+ ) ;
729+ }
730+
692731 #[ test]
693732 fn test_fixed_sized_list ( ) {
694733 let values = vec ! [ 1i32 , 2 , 3 , 4 ] ;
695- let len = values . len ( ) ;
734+ let len = 1 ;
696735
697736 let logical_type =
698737 LogicalType :: array_type ( LogicalType :: new ( DUCKDB_TYPE :: DUCKDB_TYPE_INTEGER ) , 4 )
@@ -702,7 +741,7 @@ mod tests {
702741 // Populate with data
703742 unsafe {
704743 let mut child = vector. array_vector_get_child ( ) ;
705- let slice = child. as_slice_mut :: < i32 > ( len) ;
744+ let slice = child. as_slice_mut :: < i32 > ( values . len ( ) ) ;
706745 slice. copy_from_slice ( & values) ;
707746 }
708747
0 commit comments