diff --git a/arrow-data/src/transform/list.rs b/arrow-data/src/transform/list.rs index 2f14f2fb514..c0bcf7dd8ec 100644 --- a/arrow-data/src/transform/list.rs +++ b/arrow-data/src/transform/list.rs @@ -21,9 +21,9 @@ use super::{ }; use crate::ArrayData; use arrow_buffer::ArrowNativeType; -use num::Integer; +use num::{CheckedAdd, Integer}; -pub(super) fn build_extend(array: &ArrayData) -> Extend { +pub(super) fn build_extend(array: &ArrayData) -> Extend { let offsets = array.buffer::(0); if array.null_count() == 0 { // fast case where we can copy regions without nullability checks diff --git a/arrow-data/src/transform/utils.rs b/arrow-data/src/transform/utils.rs index 6a4c240c9ae..10c8a500a64 100644 --- a/arrow-data/src/transform/utils.rs +++ b/arrow-data/src/transform/utils.rs @@ -16,7 +16,7 @@ // under the License. use arrow_buffer::{bit_util, ArrowNativeType, MutableBuffer}; -use num::Integer; +use num::{CheckedAdd, Integer}; /// extends the `buffer` to be able to hold `len` bits, setting all bits of the new size to zero. #[inline] @@ -27,7 +27,7 @@ pub(super) fn resize_for_bits(buffer: &mut MutableBuffer, len: usize) { } } -pub(super) fn extend_offsets( +pub(super) fn extend_offsets( buffer: &mut MutableBuffer, mut last_offset: T, offsets: &[T], @@ -36,7 +36,7 @@ pub(super) fn extend_offsets( offsets.windows(2).for_each(|offsets| { // compute the new offset let length = offsets[1] - offsets[0]; - last_offset = last_offset + length; + last_offset = last_offset.checked_add(&length).expect("offset overflow"); buffer.push(last_offset); }); } diff --git a/arrow-data/src/transform/variable_size.rs b/arrow-data/src/transform/variable_size.rs index 73c4783189d..ce62459aef0 100644 --- a/arrow-data/src/transform/variable_size.rs +++ b/arrow-data/src/transform/variable_size.rs @@ -18,7 +18,7 @@ use crate::ArrayData; use arrow_buffer::{ArrowNativeType, MutableBuffer}; use num::traits::AsPrimitive; -use num::Integer; +use num::{CheckedAdd, Integer}; use super::{ Extend, _MutableArrayData, @@ -39,7 +39,9 @@ fn extend_offset_values>( buffer.extend_from_slice(new_values); } -pub(super) fn build_extend>( +pub(super) fn build_extend< + T: ArrowNativeType + Integer + CheckedAdd + AsPrimitive, +>( array: &ArrayData, ) -> Extend { let offsets = array.buffer::(0);