diff --git a/arrow-data/src/equal/mod.rs b/arrow-data/src/equal/mod.rs index 7a310b1240df..b241b8cf6641 100644 --- a/arrow-data/src/equal/mod.rs +++ b/arrow-data/src/equal/mod.rs @@ -20,7 +20,7 @@ //! depend on dynamic casting of `Array`. use crate::data::ArrayData; -use arrow_buffer::i256; +use arrow_buffer::{IntervalMonthDayNano, i256}; use arrow_schema::{DataType, IntervalUnit}; use half::f16; @@ -92,7 +92,7 @@ fn equal_values( | DataType::Timestamp(_, _) | DataType::Duration(_) => primitive_equal::(lhs, rhs, lhs_start, rhs_start, len), DataType::Interval(IntervalUnit::MonthDayNano) => { - primitive_equal::(lhs, rhs, lhs_start, rhs_start, len) + primitive_equal::(lhs, rhs, lhs_start, rhs_start, len) } DataType::Utf8 | DataType::Binary => { variable_sized_equal::(lhs, rhs, lhs_start, rhs_start, len) diff --git a/arrow-data/src/transform/mod.rs b/arrow-data/src/transform/mod.rs index 66f6603f02fc..df9a22b83991 100644 --- a/arrow-data/src/transform/mod.rs +++ b/arrow-data/src/transform/mod.rs @@ -23,7 +23,7 @@ use super::{ArrayData, ArrayDataBuilder, ByteView, data::new_buffers}; use crate::bit_mask::set_bits; use arrow_buffer::buffer::{BooleanBuffer, NullBuffer}; -use arrow_buffer::{ArrowNativeType, Buffer, MutableBuffer, bit_util, i256}; +use arrow_buffer::{ArrowNativeType, Buffer, IntervalMonthDayNano, MutableBuffer, bit_util, i256}; use arrow_schema::{ArrowError, DataType, IntervalUnit, UnionMode}; use half::f16; use num_integer::Integer; @@ -257,7 +257,9 @@ fn build_extend(array: &ArrayData) -> Extend<'_> { | DataType::Timestamp(_, _) | DataType::Duration(_) | DataType::Interval(IntervalUnit::DayTime) => primitive::build_extend::(array), - DataType::Interval(IntervalUnit::MonthDayNano) => primitive::build_extend::(array), + DataType::Interval(IntervalUnit::MonthDayNano) => { + primitive::build_extend::(array) + } DataType::Decimal32(_, _) => primitive::build_extend::(array), DataType::Decimal64(_, _) => primitive::build_extend::(array), DataType::Decimal128(_, _) => primitive::build_extend::(array), @@ -304,7 +306,9 @@ fn build_extend_nulls(data_type: &DataType) -> ExtendNulls { | DataType::Timestamp(_, _) | DataType::Duration(_) | DataType::Interval(IntervalUnit::DayTime) => primitive::extend_nulls::, - DataType::Interval(IntervalUnit::MonthDayNano) => primitive::extend_nulls::, + DataType::Interval(IntervalUnit::MonthDayNano) => { + primitive::extend_nulls:: + } DataType::Decimal32(_, _) => primitive::extend_nulls::, DataType::Decimal64(_, _) => primitive::extend_nulls::, DataType::Decimal128(_, _) => primitive::extend_nulls::, diff --git a/arrow/tests/array_transform.rs b/arrow/tests/array_transform.rs index c24d0992a473..0dd4dd5f5e9b 100644 --- a/arrow/tests/array_transform.rs +++ b/arrow/tests/array_transform.rs @@ -21,7 +21,7 @@ use arrow::array::{ MapBuilder, NullArray, StringArray, StringBuilder, StringDictionaryBuilder, StructArray, UInt8Array, UInt16Array, UInt16Builder, UnionArray, }; -use arrow::datatypes::Int16Type; +use arrow::datatypes::{Int16Type, IntervalMonthDayNanoType}; use arrow_array::StringViewArray; use arrow_buffer::{Buffer, ScalarBuffer}; use arrow_data::ArrayData; @@ -1239,3 +1239,23 @@ fn test_extend_nulls_dense_union() { // Second child (str) should have 1 entry from extend assert_eq!(result_array.child(1).len(), 1); } + +#[test] +fn test_interval_month_day_nano_aligned_to_8() { + let ty = DataType::Interval(arrow_schema::IntervalUnit::MonthDayNano); + + let offset = 8; + let mut buffer = arrow_buffer::MutableBuffer::new(0); + buffer.extend_zeros(offset); + buffer.push(IntervalMonthDayNanoType::make_value(0, 0, 0)); + let buffer = Buffer::from(buffer).slice(offset); + + let b = ArrayData::builder(ty.clone()) + .add_buffer(buffer) + .align_buffers(true) // no alignment should be done + .build() + .unwrap(); + + // roundtripping through arraydata shouldnt panic + MutableArrayData::new(vec![&b], false, 0); +}