From 48bfd1fe03e394d6bd4017c62a3d3dfc61ca10a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Wed, 28 Jan 2026 22:06:07 +0100 Subject: [PATCH 1/3] Improve from_iter --- arrow-array/src/array/primitive_array.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arrow-array/src/array/primitive_array.rs b/arrow-array/src/array/primitive_array.rs index d49db8a7b2f6..8a3a20bd97b6 100644 --- a/arrow-array/src/array/primitive_array.rs +++ b/arrow-array/src/array/primitive_array.rs @@ -25,7 +25,7 @@ use crate::timezone::Tz; use crate::trusted_len::trusted_len_unzip; use crate::types::*; use crate::{Array, ArrayAccessor, ArrayRef, Scalar}; -use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer, ScalarBuffer, i256}; +use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer, NullBufferBuilder, ScalarBuffer, i256}; use arrow_data::bit_iterator::try_for_each_valid_idx; use arrow_data::{ArrayData, ArrayDataBuilder}; use arrow_schema::{ArrowError, DataType}; @@ -1450,15 +1450,15 @@ impl>> FromIterator for P let iter = iter.into_iter(); let (lower, _) = iter.size_hint(); - let mut null_builder = BooleanBufferBuilder::new(lower); + let mut null_builder = NullBufferBuilder::new(lower); let buffer: Buffer = iter .map(|item| { if let Some(a) = item.into().native { - null_builder.append(true); + null_builder.append_non_null(); a } else { - null_builder.append(false); + null_builder.append_null(); // this ensures that null items on the buffer are not arbitrary. // This is important because fallible operations can use null values (e.g. a vectorized "add") // which may panic (e.g. overflow if the number on the slots happen to be very large). @@ -1468,13 +1468,14 @@ impl>> FromIterator for P .collect(); let len = null_builder.len(); + let maybe_nulls = null_builder.finish().map(|x|x.into_inner().into_inner()); let data = unsafe { ArrayData::new_unchecked( T::DATA_TYPE, len, None, - Some(null_builder.into()), + maybe_nulls, 0, vec![buffer], vec![], From 1f2bdf7dbd14b49efde9d7f07175d94cdf2cd1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Thu, 29 Jan 2026 07:07:13 +0100 Subject: [PATCH 2/3] Improve from_iter --- arrow-array/src/array/primitive_array.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arrow-array/src/array/primitive_array.rs b/arrow-array/src/array/primitive_array.rs index 8a3a20bd97b6..c0d8189b13dd 100644 --- a/arrow-array/src/array/primitive_array.rs +++ b/arrow-array/src/array/primitive_array.rs @@ -1468,7 +1468,7 @@ impl>> FromIterator for P .collect(); let len = null_builder.len(); - let maybe_nulls = null_builder.finish().map(|x|x.into_inner().into_inner()); + let maybe_nulls = null_builder.finish().map(|x| x.into_inner().into_inner()); let data = unsafe { ArrayData::new_unchecked( From 2a4ab06078460f88fe0d6b8b8c919f17251849a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Thu, 29 Jan 2026 14:08:31 +0100 Subject: [PATCH 3/3] Avoid second allocation --- arrow-array/src/array/primitive_array.rs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/arrow-array/src/array/primitive_array.rs b/arrow-array/src/array/primitive_array.rs index c0d8189b13dd..b7fbc21ff90c 100644 --- a/arrow-array/src/array/primitive_array.rs +++ b/arrow-array/src/array/primitive_array.rs @@ -1467,21 +1467,8 @@ impl>> FromIterator for P }) .collect(); - let len = null_builder.len(); - let maybe_nulls = null_builder.finish().map(|x| x.into_inner().into_inner()); - - let data = unsafe { - ArrayData::new_unchecked( - T::DATA_TYPE, - len, - None, - maybe_nulls, - 0, - vec![buffer], - vec![], - ) - }; - PrimitiveArray::from(data) + let maybe_nulls = null_builder.finish(); + PrimitiveArray::new(ScalarBuffer::from(buffer), maybe_nulls) } }