From ac7d1740c3db6ff7e9d9770f8fe826cbf9fbcef6 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Tue, 24 Oct 2023 17:06:41 +0200 Subject: [PATCH] Fix alignment errors when receiving empty arrays Empty `Vec`s have a dummy pointer that is set to the alignment of the item type. Thus, the pointer for empty `Vec` data is `0x1`. Using this pointer to construct a `ArrayData` instance can lead to alignment errors if the arrow array is of a type with larger alignment, e.g. float64. This commit fixes the alignment error by checking for an empty raw buffer and constructing an empty `ArrayData` instance in this case. Fixes #362 --- apis/rust/node/src/event_stream/event.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apis/rust/node/src/event_stream/event.rs b/apis/rust/node/src/event_stream/event.rs index e1abe3ab..f72266ea 100644 --- a/apis/rust/node/src/event_stream/event.rs +++ b/apis/rust/node/src/event_stream/event.rs @@ -57,7 +57,11 @@ pub struct SharedMemoryData { fn buffer_into_arrow_array( raw_buffer: &arrow::buffer::Buffer, type_info: &ArrowTypeInfo, -) -> std::result::Result { +) -> eyre::Result { + if raw_buffer.is_empty() { + return Ok(arrow::array::ArrayData::new_empty(&type_info.data_type)); + } + let mut buffers = Vec::new(); for BufferOffset { offset, len } in &type_info.buffer_offsets { buffers.push(raw_buffer.slice_with_length(*offset, *len));