Skip to content

Commit 1efc0f5

Browse files
committed
fixes
Signed-off-by: Robert Kruszewski <[email protected]>
1 parent b90d010 commit 1efc0f5

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

vortex-duckdb/src/convert/vector.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)