Skip to main content

arrow_array/array/
primitive_array.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use crate::array::print_long_array;
19use crate::builder::{BooleanBufferBuilder, BufferBuilder, PrimitiveBuilder};
20use crate::iterator::PrimitiveIter;
21use crate::temporal_conversions::{
22    as_date, as_datetime, as_datetime_with_timezone, as_duration, as_time,
23};
24use crate::timezone::Tz;
25use crate::trusted_len::trusted_len_unzip;
26use crate::types::*;
27use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
28use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer, NullBufferBuilder, ScalarBuffer, i256};
29use arrow_data::bit_iterator::try_for_each_valid_idx;
30use arrow_data::{ArrayData, ArrayDataBuilder};
31use arrow_schema::{ArrowError, DataType};
32use chrono::{DateTime, Duration, NaiveDate, NaiveDateTime, NaiveTime};
33use half::f16;
34use std::any::Any;
35use std::sync::Arc;
36
37/// A [`PrimitiveArray`] of `i8`
38///
39/// # Examples
40///
41/// Construction
42///
43/// ```
44/// # use arrow_array::Int8Array;
45/// // Create from Vec<Option<i8>>
46/// let arr = Int8Array::from(vec![Some(1), None, Some(2)]);
47/// // Create from Vec<i8>
48/// let arr = Int8Array::from(vec![1, 2, 3]);
49/// // Create iter/collect
50/// let arr: Int8Array = std::iter::repeat(42).take(10).collect();
51/// ```
52///
53/// See [`PrimitiveArray`] for more information and examples
54pub type Int8Array = PrimitiveArray<Int8Type>;
55
56/// A [`PrimitiveArray`] of `i16`
57///
58/// # Examples
59///
60/// Construction
61///
62/// ```
63/// # use arrow_array::Int16Array;
64/// // Create from Vec<Option<i16>>
65/// let arr = Int16Array::from(vec![Some(1), None, Some(2)]);
66/// // Create from Vec<i16>
67/// let arr = Int16Array::from(vec![1, 2, 3]);
68/// // Create iter/collect
69/// let arr: Int16Array = std::iter::repeat(42).take(10).collect();
70/// ```
71///
72/// See [`PrimitiveArray`] for more information and examples
73pub type Int16Array = PrimitiveArray<Int16Type>;
74
75/// A [`PrimitiveArray`] of `i32`
76///
77/// # Examples
78///
79/// Construction
80///
81/// ```
82/// # use arrow_array::Int32Array;
83/// // Create from Vec<Option<i32>>
84/// let arr = Int32Array::from(vec![Some(1), None, Some(2)]);
85/// // Create from Vec<i32>
86/// let arr = Int32Array::from(vec![1, 2, 3]);
87/// // Create iter/collect
88/// let arr: Int32Array = std::iter::repeat(42).take(10).collect();
89/// ```
90///
91/// See [`PrimitiveArray`] for more information and examples
92pub type Int32Array = PrimitiveArray<Int32Type>;
93
94/// A [`PrimitiveArray`] of `i64`
95///
96/// # Examples
97///
98/// Construction
99///
100/// ```
101/// # use arrow_array::Int64Array;
102/// // Create from Vec<Option<i64>>
103/// let arr = Int64Array::from(vec![Some(1), None, Some(2)]);
104/// // Create from Vec<i64>
105/// let arr = Int64Array::from(vec![1, 2, 3]);
106/// // Create iter/collect
107/// let arr: Int64Array = std::iter::repeat(42).take(10).collect();
108/// ```
109///
110/// See [`PrimitiveArray`] for more information and examples
111pub type Int64Array = PrimitiveArray<Int64Type>;
112
113/// A [`PrimitiveArray`] of `u8`
114///
115/// # Examples
116///
117/// Construction
118///
119/// ```
120/// # use arrow_array::UInt8Array;
121/// // Create from Vec<Option<u8>>
122/// let arr = UInt8Array::from(vec![Some(1), None, Some(2)]);
123/// // Create from Vec<u8>
124/// let arr = UInt8Array::from(vec![1, 2, 3]);
125/// // Create iter/collect
126/// let arr: UInt8Array = std::iter::repeat(42).take(10).collect();
127/// ```
128///
129/// See [`PrimitiveArray`] for more information and examples
130pub type UInt8Array = PrimitiveArray<UInt8Type>;
131
132/// A [`PrimitiveArray`] of `u16`
133///
134/// # Examples
135///
136/// Construction
137///
138/// ```
139/// # use arrow_array::UInt16Array;
140/// // Create from Vec<Option<u16>>
141/// let arr = UInt16Array::from(vec![Some(1), None, Some(2)]);
142/// // Create from Vec<u16>
143/// let arr = UInt16Array::from(vec![1, 2, 3]);
144/// // Create iter/collect
145/// let arr: UInt16Array = std::iter::repeat(42).take(10).collect();
146/// ```
147///
148/// See [`PrimitiveArray`] for more information and examples
149pub type UInt16Array = PrimitiveArray<UInt16Type>;
150
151/// A [`PrimitiveArray`] of `u32`
152///
153/// # Examples
154///
155/// Construction
156///
157/// ```
158/// # use arrow_array::UInt32Array;
159/// // Create from Vec<Option<u32>>
160/// let arr = UInt32Array::from(vec![Some(1), None, Some(2)]);
161/// // Create from Vec<u32>
162/// let arr = UInt32Array::from(vec![1, 2, 3]);
163/// // Create iter/collect
164/// let arr: UInt32Array = std::iter::repeat(42).take(10).collect();
165/// ```
166///
167/// See [`PrimitiveArray`] for more information and examples
168pub type UInt32Array = PrimitiveArray<UInt32Type>;
169
170/// A [`PrimitiveArray`] of `u64`
171///
172/// # Examples
173///
174/// Construction
175///
176/// ```
177/// # use arrow_array::UInt64Array;
178/// // Create from Vec<Option<u64>>
179/// let arr = UInt64Array::from(vec![Some(1), None, Some(2)]);
180/// // Create from Vec<u64>
181/// let arr = UInt64Array::from(vec![1, 2, 3]);
182/// // Create iter/collect
183/// let arr: UInt64Array = std::iter::repeat(42).take(10).collect();
184/// ```
185///
186/// See [`PrimitiveArray`] for more information and examples
187pub type UInt64Array = PrimitiveArray<UInt64Type>;
188
189/// A [`PrimitiveArray`] of `f16`
190///
191/// # Examples
192///
193/// Construction
194///
195/// ```
196/// # use arrow_array::Float16Array;
197/// use half::f16;
198/// // Create from Vec<Option<f16>>
199/// let arr = Float16Array::from(vec![Some(f16::from_f64(1.0)), Some(f16::from_f64(2.0))]);
200/// // Create from Vec<i8>
201/// let arr = Float16Array::from(vec![f16::from_f64(1.0), f16::from_f64(2.0), f16::from_f64(3.0)]);
202/// // Create iter/collect
203/// let arr: Float16Array = std::iter::repeat(f16::from_f64(1.0)).take(10).collect();
204/// ```
205///
206/// # Example: Using `collect`
207/// ```
208/// # use arrow_array::Float16Array;
209/// use half::f16;
210/// let arr : Float16Array = [Some(f16::from_f64(1.0)), Some(f16::from_f64(2.0))].into_iter().collect();
211/// ```
212///
213/// See [`PrimitiveArray`] for more information and examples
214pub type Float16Array = PrimitiveArray<Float16Type>;
215
216/// A [`PrimitiveArray`] of `f32`
217///
218/// # Examples
219///
220/// Construction
221///
222/// ```
223/// # use arrow_array::Float32Array;
224/// // Create from Vec<Option<f32>>
225/// let arr = Float32Array::from(vec![Some(1.0), None, Some(2.0)]);
226/// // Create from Vec<f32>
227/// let arr = Float32Array::from(vec![1.0, 2.0, 3.0]);
228/// // Create iter/collect
229/// let arr: Float32Array = std::iter::repeat(42.0).take(10).collect();
230/// ```
231///
232/// See [`PrimitiveArray`] for more information and examples
233pub type Float32Array = PrimitiveArray<Float32Type>;
234
235/// A [`PrimitiveArray`] of `f64`
236///
237/// # Examples
238///
239/// Construction
240///
241/// ```
242/// # use arrow_array::Float64Array;
243/// // Create from Vec<Option<f32>>
244/// let arr = Float64Array::from(vec![Some(1.0), None, Some(2.0)]);
245/// // Create from Vec<f32>
246/// let arr = Float64Array::from(vec![1.0, 2.0, 3.0]);
247/// // Create iter/collect
248/// let arr: Float64Array = std::iter::repeat(42.0).take(10).collect();
249/// ```
250///
251/// See [`PrimitiveArray`] for more information and examples
252pub type Float64Array = PrimitiveArray<Float64Type>;
253
254/// A [`PrimitiveArray`] of seconds since UNIX epoch stored as `i64`
255///
256/// This type is similar to the [`chrono::DateTime`] type and can hold
257/// values such as `1970-05-09 14:25:11 +01:00`
258///
259/// See also [`Timestamp`](arrow_schema::DataType::Timestamp).
260///
261/// # Example: UTC timestamps post epoch
262/// ```
263/// # use arrow_array::TimestampSecondArray;
264/// use arrow_array::timezone::Tz;
265/// // Corresponds to single element array with entry 1970-05-09T14:25:11+0:00
266/// let arr = TimestampSecondArray::from(vec![11111111]);
267/// // OR
268/// let arr = TimestampSecondArray::from(vec![Some(11111111)]);
269/// let utc_tz: Tz = "+00:00".parse().unwrap();
270///
271/// assert_eq!(arr.value_as_datetime_with_tz(0, utc_tz).map(|v| v.to_string()).unwrap(), "1970-05-09 14:25:11 +00:00")
272/// ```
273///
274/// # Example: UTC timestamps pre epoch
275/// ```
276/// # use arrow_array::TimestampSecondArray;
277/// use arrow_array::timezone::Tz;
278/// // Corresponds to single element array with entry 1969-08-25T09:34:49+0:00
279/// let arr = TimestampSecondArray::from(vec![-11111111]);
280/// // OR
281/// let arr = TimestampSecondArray::from(vec![Some(-11111111)]);
282/// let utc_tz: Tz = "+00:00".parse().unwrap();
283///
284/// assert_eq!(arr.value_as_datetime_with_tz(0, utc_tz).map(|v| v.to_string()).unwrap(), "1969-08-25 09:34:49 +00:00")
285/// ```
286///
287/// # Example: With timezone specified
288/// ```
289/// # use arrow_array::TimestampSecondArray;
290/// use arrow_array::timezone::Tz;
291/// // Corresponds to single element array with entry 1970-05-10T00:25:11+10:00
292/// let arr = TimestampSecondArray::from(vec![11111111]).with_timezone("+10:00".to_string());
293/// // OR
294/// let arr = TimestampSecondArray::from(vec![Some(11111111)]).with_timezone("+10:00".to_string());
295/// let sydney_tz: Tz = "+10:00".parse().unwrap();
296///
297/// assert_eq!(arr.value_as_datetime_with_tz(0, sydney_tz).map(|v| v.to_string()).unwrap(), "1970-05-10 00:25:11 +10:00")
298/// ```
299///
300/// See [`PrimitiveArray`] for more information and examples
301pub type TimestampSecondArray = PrimitiveArray<TimestampSecondType>;
302
303/// A [`PrimitiveArray`] of milliseconds since UNIX epoch stored as `i64`
304///
305/// See examples for [`TimestampSecondArray`]
306pub type TimestampMillisecondArray = PrimitiveArray<TimestampMillisecondType>;
307
308/// A [`PrimitiveArray`] of microseconds since UNIX epoch stored as `i64`
309///
310/// See examples for [`TimestampSecondArray`]
311pub type TimestampMicrosecondArray = PrimitiveArray<TimestampMicrosecondType>;
312
313/// A [`PrimitiveArray`] of nanoseconds since UNIX epoch stored as `i64`
314///
315/// See examples for [`TimestampSecondArray`]
316pub type TimestampNanosecondArray = PrimitiveArray<TimestampNanosecondType>;
317
318/// A [`PrimitiveArray`] of days since UNIX epoch stored as `i32`
319///
320/// This type is similar to the [`chrono::NaiveDate`] type and can hold
321/// values such as `2018-11-13`
322pub type Date32Array = PrimitiveArray<Date32Type>;
323
324/// A [`PrimitiveArray`] of milliseconds since UNIX epoch stored as `i64`
325///
326/// This type is similar to the [`chrono::NaiveDate`] type and can hold
327/// values such as `2018-11-13`
328pub type Date64Array = PrimitiveArray<Date64Type>;
329
330/// A [`PrimitiveArray`] of seconds since midnight stored as `i32`
331///
332/// This type is similar to the [`chrono::NaiveTime`] type and can
333/// hold values such as `00:02:00`
334pub type Time32SecondArray = PrimitiveArray<Time32SecondType>;
335
336/// A [`PrimitiveArray`] of milliseconds since midnight stored as `i32`
337///
338/// This type is similar to the [`chrono::NaiveTime`] type and can
339/// hold values such as `00:02:00.123`
340pub type Time32MillisecondArray = PrimitiveArray<Time32MillisecondType>;
341
342/// A [`PrimitiveArray`] of microseconds since midnight stored as `i64`
343///
344/// This type is similar to the [`chrono::NaiveTime`] type and can
345/// hold values such as `00:02:00.123456`
346pub type Time64MicrosecondArray = PrimitiveArray<Time64MicrosecondType>;
347
348/// A [`PrimitiveArray`] of nanoseconds since midnight stored as `i64`
349///
350/// This type is similar to the [`chrono::NaiveTime`] type and can
351/// hold values such as `00:02:00.123456789`
352pub type Time64NanosecondArray = PrimitiveArray<Time64NanosecondType>;
353
354/// A [`PrimitiveArray`] of “calendar” intervals in whole months
355///
356/// See [`IntervalYearMonthType`] for details on representation and caveats.
357///
358/// # Example
359/// ```
360/// # use arrow_array::IntervalYearMonthArray;
361/// let array = IntervalYearMonthArray::from(vec![
362///   2,  // 2 months
363///   25, // 2 years and 1 month
364///   -1  // -1 months
365/// ]);
366/// ```
367pub type IntervalYearMonthArray = PrimitiveArray<IntervalYearMonthType>;
368
369/// A [`PrimitiveArray`] of “calendar” intervals in days and milliseconds
370///
371/// See [`IntervalDayTime`] for details on representation and caveats.
372///
373/// # Example
374/// ```
375/// # use arrow_array::IntervalDayTimeArray;
376/// use arrow_array::types::IntervalDayTime;
377/// let array = IntervalDayTimeArray::from(vec![
378///   IntervalDayTime::new(1, 1000),                 // 1 day, 1000 milliseconds
379///   IntervalDayTime::new(33, 0),                  // 33 days, 0 milliseconds
380///   IntervalDayTime::new(0, 12 * 60 * 60 * 1000), // 0 days, 12 hours
381/// ]);
382/// ```
383pub type IntervalDayTimeArray = PrimitiveArray<IntervalDayTimeType>;
384
385/// A [`PrimitiveArray`] of “calendar” intervals in  months, days, and nanoseconds.
386///
387/// See [`IntervalMonthDayNano`] for details on representation and caveats.
388///
389/// # Example
390/// ```
391/// # use arrow_array::IntervalMonthDayNanoArray;
392/// use arrow_array::types::IntervalMonthDayNano;
393/// let array = IntervalMonthDayNanoArray::from(vec![
394///   IntervalMonthDayNano::new(1, 2, 1000),             // 1 month, 2 days, 1 nanosecond
395///   IntervalMonthDayNano::new(12, 1, 0),               // 12 months, 1 days, 0 nanoseconds
396///   IntervalMonthDayNano::new(0, 0, 12 * 1000 * 1000), // 0 days, 12 milliseconds
397/// ]);
398/// ```
399pub type IntervalMonthDayNanoArray = PrimitiveArray<IntervalMonthDayNanoType>;
400
401/// A [`PrimitiveArray`] of elapsed durations in seconds
402pub type DurationSecondArray = PrimitiveArray<DurationSecondType>;
403
404/// A [`PrimitiveArray`] of elapsed durations in milliseconds
405pub type DurationMillisecondArray = PrimitiveArray<DurationMillisecondType>;
406
407/// A [`PrimitiveArray`] of elapsed durations in microseconds
408pub type DurationMicrosecondArray = PrimitiveArray<DurationMicrosecondType>;
409
410/// A [`PrimitiveArray`] of elapsed durations in nanoseconds
411pub type DurationNanosecondArray = PrimitiveArray<DurationNanosecondType>;
412
413/// A [`PrimitiveArray`] of 32-bit fixed point decimals
414///
415/// # Examples
416///
417/// Construction
418///
419/// ```
420/// # use arrow_array::Decimal32Array;
421/// // Create from Vec<Option<i32>>
422/// let arr = Decimal32Array::from(vec![Some(1), None, Some(2)]);
423/// // Create from Vec<i32>
424/// let arr = Decimal32Array::from(vec![1, 2, 3]);
425/// // Create iter/collect
426/// let arr: Decimal32Array = std::iter::repeat(42).take(10).collect();
427/// ```
428///
429/// See [`PrimitiveArray`] for more information and examples
430pub type Decimal32Array = PrimitiveArray<Decimal32Type>;
431
432/// A [`PrimitiveArray`] of 64-bit fixed point decimals
433///
434/// # Examples
435///
436/// Construction
437///
438/// ```
439/// # use arrow_array::Decimal64Array;
440/// // Create from Vec<Option<i64>>
441/// let arr = Decimal64Array::from(vec![Some(1), None, Some(2)]);
442/// // Create from Vec<i64>
443/// let arr = Decimal64Array::from(vec![1, 2, 3]);
444/// // Create iter/collect
445/// let arr: Decimal64Array = std::iter::repeat(42).take(10).collect();
446/// ```
447///
448/// See [`PrimitiveArray`] for more information and examples
449pub type Decimal64Array = PrimitiveArray<Decimal64Type>;
450
451/// A [`PrimitiveArray`] of 128-bit fixed point decimals
452///
453/// # Examples
454///
455/// Construction
456///
457/// ```
458/// # use arrow_array::Decimal128Array;
459/// // Create from Vec<Option<i128>>
460/// let arr = Decimal128Array::from(vec![Some(1), None, Some(2)]);
461/// // Create from Vec<i128>
462/// let arr = Decimal128Array::from(vec![1, 2, 3]);
463/// // Create iter/collect
464/// let arr: Decimal128Array = std::iter::repeat(42).take(10).collect();
465/// ```
466///
467/// See [`PrimitiveArray`] for more information and examples
468pub type Decimal128Array = PrimitiveArray<Decimal128Type>;
469
470/// A [`PrimitiveArray`] of 256-bit fixed point decimals
471///
472/// # Examples
473///
474/// Construction
475///
476/// ```
477/// # use arrow_array::Decimal256Array;
478/// use arrow_buffer::i256;
479/// // Create from Vec<Option<i256>>
480/// let arr = Decimal256Array::from(vec![Some(i256::from(1)), None, Some(i256::from(2))]);
481/// // Create from Vec<i256>
482/// let arr = Decimal256Array::from(vec![i256::from(1), i256::from(2), i256::from(3)]);
483/// // Create iter/collect
484/// let arr: Decimal256Array = std::iter::repeat(i256::from(42)).take(10).collect();
485/// ```
486///
487/// See [`PrimitiveArray`] for more information and examples
488pub type Decimal256Array = PrimitiveArray<Decimal256Type>;
489
490pub use crate::types::ArrowPrimitiveType;
491
492/// An array of primitive values, of type [`ArrowPrimitiveType`]
493///
494/// # Example: From a Vec
495///
496/// *Note*: Converting a `Vec` to a `PrimitiveArray` does not copy the data.
497/// The new `PrimitiveArray` uses the same underlying allocation from the `Vec`.
498///
499/// ```
500/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
501/// let arr: PrimitiveArray<Int32Type> = vec![1, 2, 3, 4].into();
502/// assert_eq!(4, arr.len());
503/// assert_eq!(0, arr.null_count());
504/// assert_eq!(arr.values(), &[1, 2, 3, 4])
505/// ```
506///
507/// # Example: To a `Vec<T>`
508///
509/// *Note*: In some cases, converting `PrimitiveArray` to a `Vec` is zero-copy
510/// and does not copy the data (see [`Buffer::into_vec`] for conditions). In
511/// such cases, the `Vec` will use the same underlying memory allocation from
512/// the `PrimitiveArray`.
513///
514/// The Rust compiler generates highly optimized code for operations on
515/// Vec, so using a Vec can often be faster than using a PrimitiveArray directly.
516///
517/// ```
518/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
519/// let arr = PrimitiveArray::<Int32Type>::from(vec![1, 2, 3, 4]);
520/// let starting_ptr = arr.values().as_ptr();
521/// // split into its parts
522/// let (datatype, buffer, nulls) = arr.into_parts();
523/// // Convert the buffer to a Vec<i32> (zero copy)
524/// // (note this requires that there are no other references)
525/// let mut vec: Vec<i32> = buffer.into();
526/// vec[2] = 300;
527/// // put the parts back together
528/// let arr = PrimitiveArray::<Int32Type>::try_new(vec.into(), nulls).unwrap();
529/// assert_eq!(arr.values(), &[1, 2, 300, 4]);
530/// // The same allocation was used
531/// assert_eq!(starting_ptr, arr.values().as_ptr());
532/// ```
533///
534/// # Example: From an optional Vec
535///
536/// ```
537/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
538/// let arr: PrimitiveArray<Int32Type> = vec![Some(1), None, Some(3), None].into();
539/// assert_eq!(4, arr.len());
540/// assert_eq!(2, arr.null_count());
541/// // Note: values for null indexes are arbitrary
542/// assert_eq!(arr.values(), &[1, 0, 3, 0])
543/// ```
544///
545/// # Example: From an iterator of values
546///
547/// ```
548/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
549/// let arr: PrimitiveArray<Int32Type> = (0..10).map(|x| x + 1).collect();
550/// assert_eq!(10, arr.len());
551/// assert_eq!(0, arr.null_count());
552/// for i in 0..10i32 {
553///     assert_eq!(i + 1, arr.value(i as usize));
554/// }
555/// ```
556///
557/// # Example: From an iterator of option
558///
559/// ```
560/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
561/// let arr: PrimitiveArray<Int32Type> = (0..10).map(|x| (x % 2 == 0).then_some(x)).collect();
562/// assert_eq!(10, arr.len());
563/// assert_eq!(5, arr.null_count());
564/// // Note: values for null indexes are arbitrary
565/// assert_eq!(arr.values(), &[0, 0, 2, 0, 4, 0, 6, 0, 8, 0])
566/// ```
567///
568/// # Example: Using Builder
569///
570/// ```
571/// # use arrow_array::Array;
572/// # use arrow_array::builder::PrimitiveBuilder;
573/// # use arrow_array::types::Int32Type;
574/// let mut builder = PrimitiveBuilder::<Int32Type>::new();
575/// builder.append_value(1);
576/// builder.append_null();
577/// builder.append_value(2);
578/// let array = builder.finish();
579/// // Note: values for null indexes are arbitrary
580/// assert_eq!(array.values(), &[1, 0, 2]);
581/// assert!(array.is_null(1));
582/// ```
583///
584/// # Example: Get a `PrimitiveArray` from an [`ArrayRef`]
585/// ```
586/// # use std::sync::Arc;
587/// # use arrow_array::{Array, cast::AsArray, ArrayRef, Float32Array, PrimitiveArray};
588/// # use arrow_array::types::{Float32Type};
589/// # use arrow_schema::DataType;
590/// # let array: ArrayRef =  Arc::new(Float32Array::from(vec![1.2, 2.3]));
591/// // will panic if the array is not a Float32Array
592/// assert_eq!(&DataType::Float32, array.data_type());
593/// let f32_array: Float32Array  = array.as_primitive().clone();
594/// assert_eq!(f32_array, Float32Array::from(vec![1.2, 2.3]));
595/// ```
596pub struct PrimitiveArray<T: ArrowPrimitiveType> {
597    data_type: DataType,
598    /// Values data
599    values: ScalarBuffer<T::Native>,
600    nulls: Option<NullBuffer>,
601}
602
603impl<T: ArrowPrimitiveType> Clone for PrimitiveArray<T> {
604    fn clone(&self) -> Self {
605        Self {
606            data_type: self.data_type.clone(),
607            values: self.values.clone(),
608            nulls: self.nulls.clone(),
609        }
610    }
611}
612
613impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
614    /// Create a new [`PrimitiveArray`] from the provided values and nulls
615    ///
616    /// # Panics
617    ///
618    /// Panics if [`Self::try_new`] returns an error
619    ///
620    /// # Example
621    ///
622    /// Creating a [`PrimitiveArray`] directly from a [`ScalarBuffer`] and [`NullBuffer`] using
623    /// this constructor is the most performant approach, avoiding any additional allocations
624    ///
625    /// ```
626    /// # use arrow_array::Int32Array;
627    /// # use arrow_array::types::Int32Type;
628    /// # use arrow_buffer::NullBuffer;
629    /// // [1, 2, 3, 4]
630    /// let array = Int32Array::new(vec![1, 2, 3, 4].into(), None);
631    /// // [1, null, 3, 4]
632    /// let nulls = NullBuffer::from(vec![true, false, true, true]);
633    /// let array = Int32Array::new(vec![1, 2, 3, 4].into(), Some(nulls));
634    /// ```
635    pub fn new(values: ScalarBuffer<T::Native>, nulls: Option<NullBuffer>) -> Self {
636        Self::try_new(values, nulls).unwrap()
637    }
638
639    /// Create a new [`PrimitiveArray`] of the given length where all values are null
640    pub fn new_null(length: usize) -> Self {
641        Self {
642            data_type: T::DATA_TYPE,
643            values: vec![T::Native::usize_as(0); length].into(),
644            nulls: Some(NullBuffer::new_null(length)),
645        }
646    }
647
648    /// Create a new [`PrimitiveArray`] from the provided values and nulls
649    ///
650    /// # Errors
651    ///
652    /// Errors if:
653    /// - `values.len() != nulls.len()`
654    pub fn try_new(
655        values: ScalarBuffer<T::Native>,
656        nulls: Option<NullBuffer>,
657    ) -> Result<Self, ArrowError> {
658        if let Some(n) = nulls.as_ref() {
659            if n.len() != values.len() {
660                return Err(ArrowError::InvalidArgumentError(format!(
661                    "Incorrect length of null buffer for PrimitiveArray, expected {} got {}",
662                    values.len(),
663                    n.len(),
664                )));
665            }
666        }
667
668        Ok(Self {
669            data_type: T::DATA_TYPE,
670            values,
671            nulls,
672        })
673    }
674
675    /// Create a new [`Scalar`] from `value`
676    pub fn new_scalar(value: T::Native) -> Scalar<Self> {
677        Scalar::new(Self {
678            data_type: T::DATA_TYPE,
679            values: vec![value].into(),
680            nulls: None,
681        })
682    }
683
684    /// Deconstruct this array into its constituent parts
685    pub fn into_parts(self) -> (DataType, ScalarBuffer<T::Native>, Option<NullBuffer>) {
686        (self.data_type, self.values, self.nulls)
687    }
688
689    /// Overrides the [`DataType`] of this [`PrimitiveArray`]
690    ///
691    /// Prefer using [`Self::with_timezone`] or [`Self::with_precision_and_scale`] where
692    /// the primitive type is suitably constrained, as these cannot panic
693    ///
694    /// # Panics
695    ///
696    /// Panics if ![Self::is_compatible]
697    pub fn with_data_type(self, data_type: DataType) -> Self {
698        Self::assert_compatible(&data_type);
699        Self { data_type, ..self }
700    }
701
702    /// Asserts that `data_type` is compatible with `Self`
703    fn assert_compatible(data_type: &DataType) {
704        assert!(
705            Self::is_compatible(data_type),
706            "PrimitiveArray expected data type {} got {}",
707            T::DATA_TYPE,
708            data_type
709        );
710    }
711
712    /// Returns the length of this array.
713    #[inline]
714    pub fn len(&self) -> usize {
715        self.values.len()
716    }
717
718    /// Returns whether this array is empty.
719    pub fn is_empty(&self) -> bool {
720        self.values.is_empty()
721    }
722
723    /// Returns the values of this array
724    #[inline]
725    pub fn values(&self) -> &ScalarBuffer<T::Native> {
726        &self.values
727    }
728
729    /// Returns a new primitive array builder
730    pub fn builder(capacity: usize) -> PrimitiveBuilder<T> {
731        PrimitiveBuilder::<T>::with_capacity(capacity)
732    }
733
734    /// Returns if this [`PrimitiveArray`] is compatible with the provided [`DataType`]
735    ///
736    /// This is equivalent to `data_type == T::DATA_TYPE`, however ignores timestamp
737    /// timezones and decimal precision and scale
738    pub fn is_compatible(data_type: &DataType) -> bool {
739        match T::DATA_TYPE {
740            DataType::Timestamp(t1, _) => {
741                matches!(data_type, DataType::Timestamp(t2, _) if &t1 == t2)
742            }
743            DataType::Decimal32(_, _) => matches!(data_type, DataType::Decimal32(_, _)),
744            DataType::Decimal64(_, _) => matches!(data_type, DataType::Decimal64(_, _)),
745            DataType::Decimal128(_, _) => matches!(data_type, DataType::Decimal128(_, _)),
746            DataType::Decimal256(_, _) => matches!(data_type, DataType::Decimal256(_, _)),
747            _ => T::DATA_TYPE.eq(data_type),
748        }
749    }
750
751    /// Returns the primitive value at index `i`.
752    ///
753    /// Note: This method does not check for nulls and the value is arbitrary
754    /// if [`is_null`](Self::is_null) returns true for the index.
755    ///
756    /// # Safety
757    ///
758    /// caller must ensure that the passed in offset is less than the array len()
759    #[inline]
760    pub unsafe fn value_unchecked(&self, i: usize) -> T::Native {
761        unsafe { *self.values.get_unchecked(i) }
762    }
763
764    /// Returns the primitive value at index `i`.
765    ///
766    /// Note: This method does not check for nulls and the value is arbitrary
767    /// if [`is_null`](Self::is_null) returns true for the index.
768    ///
769    /// # Panics
770    /// Panics if index `i` is out of bounds
771    #[inline]
772    pub fn value(&self, i: usize) -> T::Native {
773        assert!(
774            i < self.len(),
775            "Trying to access an element at index {} from a PrimitiveArray of length {}",
776            i,
777            self.len()
778        );
779        unsafe { self.value_unchecked(i) }
780    }
781
782    /// Creates a PrimitiveArray based on an iterator of values without nulls
783    pub fn from_iter_values<I: IntoIterator<Item = T::Native>>(iter: I) -> Self {
784        let val_buf: Buffer = iter.into_iter().collect();
785        let len = val_buf.len() / std::mem::size_of::<T::Native>();
786        Self {
787            data_type: T::DATA_TYPE,
788            values: ScalarBuffer::new(val_buf, 0, len),
789            nulls: None,
790        }
791    }
792
793    /// Creates a PrimitiveArray based on an iterator of values with provided nulls
794    pub fn from_iter_values_with_nulls<I: IntoIterator<Item = T::Native>>(
795        iter: I,
796        nulls: Option<NullBuffer>,
797    ) -> Self {
798        let val_buf: Buffer = iter.into_iter().collect();
799        let len = val_buf.len() / std::mem::size_of::<T::Native>();
800        Self {
801            data_type: T::DATA_TYPE,
802            values: ScalarBuffer::new(val_buf, 0, len),
803            nulls,
804        }
805    }
806
807    /// Creates a PrimitiveArray based on a constant value with `count` elements
808    pub fn from_value(value: T::Native, count: usize) -> Self {
809        let val_buf: Vec<_> = vec![value; count];
810        Self::new(val_buf.into(), None)
811    }
812
813    /// Returns an iterator that returns the values of `array.value(i)` for an iterator with each element `i`
814    pub fn take_iter<'a>(
815        &'a self,
816        indexes: impl Iterator<Item = Option<usize>> + 'a,
817    ) -> impl Iterator<Item = Option<T::Native>> + 'a {
818        indexes.map(|opt_index| opt_index.map(|index| self.value(index)))
819    }
820
821    /// Returns an iterator that returns the values of `array.value(i)` for an iterator with each element `i`
822    /// # Safety
823    ///
824    /// caller must ensure that the offsets in the iterator are less than the array len()
825    pub unsafe fn take_iter_unchecked<'a>(
826        &'a self,
827        indexes: impl Iterator<Item = Option<usize>> + 'a,
828    ) -> impl Iterator<Item = Option<T::Native>> + 'a {
829        indexes.map(|opt_index| opt_index.map(|index| unsafe { self.value_unchecked(index) }))
830    }
831
832    /// Returns a zero-copy slice of this array with the indicated offset and length.
833    pub fn slice(&self, offset: usize, length: usize) -> Self {
834        Self {
835            data_type: self.data_type.clone(),
836            values: self.values.slice(offset, length),
837            nulls: self.nulls.as_ref().map(|n| n.slice(offset, length)),
838        }
839    }
840
841    /// Reinterprets this array's contents as a different data type without copying
842    ///
843    /// This can be used to efficiently convert between primitive arrays with the
844    /// same underlying representation
845    ///
846    /// Note: this will not modify the underlying values, and therefore may change
847    /// the semantic values of the array, e.g. 100 milliseconds in a [`TimestampNanosecondArray`]
848    /// will become 100 seconds in a [`TimestampSecondArray`].
849    ///
850    /// For casts that preserve the semantic value, check out the
851    /// [compute kernels](https://docs.rs/arrow/latest/arrow/compute/kernels/cast/index.html).
852    ///
853    /// ```
854    /// # use arrow_array::{Int64Array, TimestampNanosecondArray};
855    /// let a = Int64Array::from_iter_values([1, 2, 3, 4]);
856    /// let b: TimestampNanosecondArray = a.reinterpret_cast();
857    /// ```
858    pub fn reinterpret_cast<K>(&self) -> PrimitiveArray<K>
859    where
860        K: ArrowPrimitiveType<Native = T::Native>,
861    {
862        PrimitiveArray::new(self.values.clone(), self.nulls.clone())
863    }
864
865    /// Applies a unary infallible function to a primitive array, producing a
866    /// new array of potentially different type.
867    ///
868    /// This is the fastest way to perform an operation on a primitive array
869    /// when the benefits of a vectorized operation outweigh the cost of
870    /// branching nulls and non-nulls.
871    ///
872    /// See also
873    /// * [`Self::unary_mut`] for in place modification.
874    /// * [`Self::try_unary`] for fallible operations.
875    /// * [`arrow::compute::binary`] for binary operations
876    ///
877    /// [`arrow::compute::binary`]: https://docs.rs/arrow/latest/arrow/compute/fn.binary.html
878    /// # Null Handling
879    ///
880    /// Applies the function for all values, including those on null slots. This
881    /// will often allow the compiler to generate faster vectorized code, but
882    /// requires that the operation must be infallible (not error/panic) for any
883    /// value of the corresponding type or this function may panic.
884    ///
885    /// # Example
886    /// ```rust
887    /// # use arrow_array::{Int32Array, Float32Array, types::Int32Type};
888    /// # fn main() {
889    /// let array = Int32Array::from(vec![Some(5), Some(7), None]);
890    /// // Create a new array with the value of applying sqrt
891    /// let c = array.unary(|x| f32::sqrt(x as f32));
892    /// assert_eq!(c, Float32Array::from(vec![Some(2.236068), Some(2.6457512), None]));
893    /// # }
894    /// ```
895    pub fn unary<F, O>(&self, op: F) -> PrimitiveArray<O>
896    where
897        O: ArrowPrimitiveType,
898        F: Fn(T::Native) -> O::Native,
899    {
900        let nulls = self.nulls().cloned();
901        let values = self.values().into_iter().map(|v| op(*v));
902        let buffer: Vec<_> = values.collect();
903        PrimitiveArray::new(buffer.into(), nulls)
904    }
905
906    /// Applies a unary and infallible function to the array in place if possible.
907    ///
908    /// # Buffer Reuse
909    ///
910    /// If the underlying buffers are not shared with other arrays,  mutates the
911    /// underlying buffer in place, without allocating.
912    ///
913    /// If the underlying buffer is shared, returns Err(self)
914    ///
915    /// # Null Handling
916    ///
917    /// See [`Self::unary`] for more information on null handling.
918    ///
919    /// # Example
920    ///
921    /// ```rust
922    /// # use arrow_array::{Int32Array, types::Int32Type};
923    /// let array = Int32Array::from(vec![Some(5), Some(7), None]);
924    /// // Apply x*2+1 to the data in place, no allocations
925    /// let c = array.unary_mut(|x| x * 2 + 1).unwrap();
926    /// assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
927    /// ```
928    ///
929    /// # Example: modify [`ArrayRef`] in place, if not shared
930    ///
931    /// It is also possible to modify an [`ArrayRef`] if there are no other
932    /// references to the underlying buffer.
933    ///
934    /// ```rust
935    /// # use std::sync::Arc;
936    /// # use arrow_array::{Array, cast::AsArray, ArrayRef, Int32Array, PrimitiveArray, types::Int32Type};
937    /// # let array: ArrayRef = Arc::new(Int32Array::from(vec![Some(5), Some(7), None]));
938    /// // Convert to Int32Array (panic's if array.data_type is not Int32)
939    /// let a = array.as_primitive::<Int32Type>().clone();
940    /// // Try to apply x*2+1 to the data in place, fails because array is still shared
941    /// a.unary_mut(|x| x * 2 + 1).unwrap_err();
942    /// // Try again, this time dropping the last remaining reference
943    /// let a = array.as_primitive::<Int32Type>().clone();
944    /// drop(array);
945    /// // Now we can apply the operation in place
946    /// let c = a.unary_mut(|x| x * 2 + 1).unwrap();
947    /// assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
948    /// ```
949    pub fn unary_mut<F>(self, op: F) -> Result<PrimitiveArray<T>, PrimitiveArray<T>>
950    where
951        F: Fn(T::Native) -> T::Native,
952    {
953        let mut builder = self.into_builder()?;
954        builder
955            .values_slice_mut()
956            .iter_mut()
957            .for_each(|v| *v = op(*v));
958        Ok(builder.finish())
959    }
960
961    /// Applies a unary fallible function to all valid values in a primitive
962    /// array, producing a new array of potentially different type.
963    ///
964    /// Applies `op` to only rows that are valid, which is often significantly
965    /// slower than [`Self::unary`], which should be preferred if `op` is
966    /// fallible.
967    ///
968    /// Note: LLVM is currently unable to effectively vectorize fallible operations
969    pub fn try_unary<F, O, E>(&self, op: F) -> Result<PrimitiveArray<O>, E>
970    where
971        O: ArrowPrimitiveType,
972        F: Fn(T::Native) -> Result<O::Native, E>,
973    {
974        let len = self.len();
975
976        let nulls = self.nulls().cloned();
977        let mut buffer = BufferBuilder::<O::Native>::new(len);
978        buffer.append_n_zeroed(len);
979        let slice = buffer.as_slice_mut();
980
981        let f = |idx| {
982            unsafe { *slice.get_unchecked_mut(idx) = op(self.value_unchecked(idx))? };
983            Ok::<_, E>(())
984        };
985
986        match &nulls {
987            Some(nulls) => nulls.try_for_each_valid_idx(f)?,
988            None => (0..len).try_for_each(f)?,
989        }
990
991        let values = buffer.finish().into();
992        Ok(PrimitiveArray::new(values, nulls))
993    }
994
995    /// Applies a unary fallible function to all valid values in a mutable
996    /// primitive array.
997    ///
998    /// # Null Handling
999    ///
1000    /// See [`Self::try_unary`] for more information on null handling.
1001    ///
1002    /// # Buffer Reuse
1003    ///
1004    /// See [`Self::unary_mut`] for more information on buffer reuse.
1005    ///
1006    /// This returns an `Err` when the input array is shared buffer with other
1007    /// array. In the case, returned `Err` wraps input array. If the function
1008    /// encounters an error during applying on values. In the case, this returns an `Err` within
1009    /// an `Ok` which wraps the actual error.
1010    ///
1011    /// Note: LLVM is currently unable to effectively vectorize fallible operations
1012    pub fn try_unary_mut<F, E>(
1013        self,
1014        op: F,
1015    ) -> Result<Result<PrimitiveArray<T>, E>, PrimitiveArray<T>>
1016    where
1017        F: Fn(T::Native) -> Result<T::Native, E>,
1018    {
1019        let len = self.len();
1020        let null_count = self.null_count();
1021        let mut builder = self.into_builder()?;
1022
1023        let (slice, null_buffer) = builder.slices_mut();
1024
1025        let r = try_for_each_valid_idx(len, 0, null_count, null_buffer.as_deref(), |idx| {
1026            unsafe { *slice.get_unchecked_mut(idx) = op(*slice.get_unchecked(idx))? };
1027            Ok::<_, E>(())
1028        });
1029
1030        if let Err(err) = r {
1031            return Ok(Err(err));
1032        }
1033
1034        Ok(Ok(builder.finish()))
1035    }
1036
1037    /// Applies a unary and nullable function to all valid values in a primitive array
1038    ///
1039    /// Applies `op` to only rows that are valid, which is often significantly
1040    /// slower than [`Self::unary`], which should be preferred if `op` is
1041    /// fallible.
1042    ///
1043    /// Note: LLVM is currently unable to effectively vectorize fallible operations
1044    pub fn unary_opt<F, O>(&self, op: F) -> PrimitiveArray<O>
1045    where
1046        O: ArrowPrimitiveType,
1047        F: Fn(T::Native) -> Option<O::Native>,
1048    {
1049        let len = self.len();
1050        let (nulls, null_count, offset) = match self.nulls() {
1051            Some(n) => (Some(n.validity()), n.null_count(), n.offset()),
1052            None => (None, 0, 0),
1053        };
1054
1055        let mut null_builder = BooleanBufferBuilder::new(len);
1056        match nulls {
1057            Some(b) => null_builder.append_packed_range(offset..offset + len, b),
1058            None => null_builder.append_n(len, true),
1059        }
1060
1061        let mut buffer = BufferBuilder::<O::Native>::new(len);
1062        buffer.append_n_zeroed(len);
1063        let slice = buffer.as_slice_mut();
1064
1065        let mut out_null_count = null_count;
1066
1067        let _ = try_for_each_valid_idx(len, offset, null_count, nulls, |idx| {
1068            match op(unsafe { self.value_unchecked(idx) }) {
1069                Some(v) => unsafe { *slice.get_unchecked_mut(idx) = v },
1070                None => {
1071                    out_null_count += 1;
1072                    null_builder.set_bit(idx, false);
1073                }
1074            }
1075            Ok::<_, ()>(())
1076        });
1077
1078        let nulls = null_builder.finish();
1079        let values = buffer.finish().into();
1080        let nulls = unsafe { NullBuffer::new_unchecked(nulls, out_null_count) };
1081        PrimitiveArray::new(values, Some(nulls))
1082    }
1083
1084    /// Applies a unary infallible function to each value in an array, producing a
1085    /// new primitive array.
1086    ///
1087    /// # Null Handling
1088    ///
1089    /// See [`Self::unary`] for more information on null handling.
1090    ///
1091    /// # Example: create an [`Int16Array`] from an [`ArrayAccessor`] with item type `&[u8]`
1092    /// ```
1093    /// use arrow_array::{Array, FixedSizeBinaryArray, Int16Array};
1094    /// let input_arg = vec![ vec![1, 0], vec![2, 0], vec![3, 0] ];
1095    /// let arr = FixedSizeBinaryArray::try_from_iter(input_arg.into_iter()).unwrap();
1096    /// let c = Int16Array::from_unary(&arr, |x| i16::from_le_bytes(x[..2].try_into().unwrap()));
1097    /// assert_eq!(c, Int16Array::from(vec![Some(1i16), Some(2i16), Some(3i16)]));
1098    /// ```
1099    pub fn from_unary<U: ArrayAccessor, F>(left: U, mut op: F) -> Self
1100    where
1101        F: FnMut(U::Item) -> T::Native,
1102    {
1103        let nulls = left.logical_nulls();
1104        let buffer: Vec<_> = (0..left.len())
1105            // SAFETY: i in range 0..left.len()
1106            .map(|i| op(unsafe { left.value_unchecked(i) }))
1107            .collect();
1108        PrimitiveArray::new(buffer.into(), nulls)
1109    }
1110
1111    /// Returns a `PrimitiveBuilder` for this array, suitable for mutating values
1112    /// in place.
1113    ///
1114    /// # Buffer Reuse
1115    ///
1116    /// If the underlying data buffer has no other outstanding references, the
1117    /// buffer is used without copying.
1118    ///
1119    /// If the underlying data buffer does have outstanding references, returns
1120    /// `Err(self)`
1121    pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> {
1122        let len = self.len();
1123        let data = self.into_data();
1124        let null_bit_buffer = data.nulls().map(|b| b.inner().sliced());
1125
1126        let element_len = std::mem::size_of::<T::Native>();
1127        let buffer =
1128            data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len);
1129
1130        drop(data);
1131
1132        let try_mutable_null_buffer = match null_bit_buffer {
1133            None => Ok(None),
1134            Some(null_buffer) => {
1135                // Null buffer exists, tries to make it mutable
1136                null_buffer.into_mutable().map(Some)
1137            }
1138        };
1139
1140        let try_mutable_buffers = match try_mutable_null_buffer {
1141            Ok(mutable_null_buffer) => {
1142                // Got mutable null buffer, tries to get mutable value buffer
1143                let try_mutable_buffer = buffer.into_mutable();
1144
1145                // try_mutable_buffer.map(...).map_err(...) doesn't work as the compiler complains
1146                // mutable_null_buffer is moved into map closure.
1147                match try_mutable_buffer {
1148                    Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer(
1149                        mutable_buffer,
1150                        mutable_null_buffer,
1151                    )),
1152                    Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))),
1153                }
1154            }
1155            Err(mutable_null_buffer) => {
1156                // Unable to get mutable null buffer
1157                Err((buffer, Some(mutable_null_buffer)))
1158            }
1159        };
1160
1161        match try_mutable_buffers {
1162            Ok(builder) => Ok(builder),
1163            Err((buffer, null_bit_buffer)) => {
1164                let builder = ArrayData::builder(T::DATA_TYPE)
1165                    .len(len)
1166                    .add_buffer(buffer)
1167                    .null_bit_buffer(null_bit_buffer);
1168
1169                let array_data = unsafe { builder.build_unchecked() };
1170                let array = PrimitiveArray::<T>::from(array_data);
1171
1172                Err(array)
1173            }
1174        }
1175    }
1176}
1177
1178impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData {
1179    fn from(array: PrimitiveArray<T>) -> Self {
1180        let builder = ArrayDataBuilder::new(array.data_type)
1181            .len(array.values.len())
1182            .nulls(array.nulls)
1183            .buffers(vec![array.values.into_inner()]);
1184
1185        unsafe { builder.build_unchecked() }
1186    }
1187}
1188
1189/// SAFETY: Correctly implements the contract of Arrow Arrays
1190unsafe impl<T: ArrowPrimitiveType> Array for PrimitiveArray<T> {
1191    fn as_any(&self) -> &dyn Any {
1192        self
1193    }
1194
1195    fn to_data(&self) -> ArrayData {
1196        self.clone().into()
1197    }
1198
1199    fn into_data(self) -> ArrayData {
1200        self.into()
1201    }
1202
1203    fn data_type(&self) -> &DataType {
1204        &self.data_type
1205    }
1206
1207    fn slice(&self, offset: usize, length: usize) -> ArrayRef {
1208        Arc::new(self.slice(offset, length))
1209    }
1210
1211    fn len(&self) -> usize {
1212        self.values.len()
1213    }
1214
1215    fn is_empty(&self) -> bool {
1216        self.values.is_empty()
1217    }
1218
1219    fn shrink_to_fit(&mut self) {
1220        self.values.shrink_to_fit();
1221        if let Some(nulls) = &mut self.nulls {
1222            nulls.shrink_to_fit();
1223        }
1224    }
1225
1226    fn offset(&self) -> usize {
1227        0
1228    }
1229
1230    fn nulls(&self) -> Option<&NullBuffer> {
1231        self.nulls.as_ref()
1232    }
1233
1234    fn logical_null_count(&self) -> usize {
1235        self.null_count()
1236    }
1237
1238    fn get_buffer_memory_size(&self) -> usize {
1239        let mut size = self.values.inner().capacity();
1240        if let Some(n) = self.nulls.as_ref() {
1241            size += n.buffer().capacity();
1242        }
1243        size
1244    }
1245
1246    fn get_array_memory_size(&self) -> usize {
1247        std::mem::size_of::<Self>() + self.get_buffer_memory_size()
1248    }
1249
1250    #[cfg(feature = "pool")]
1251    fn claim(&self, pool: &dyn arrow_buffer::MemoryPool) {
1252        self.values.claim(pool);
1253        if let Some(nulls) = &self.nulls {
1254            nulls.claim(pool);
1255        }
1256    }
1257}
1258
1259impl<T: ArrowPrimitiveType> ArrayAccessor for &PrimitiveArray<T> {
1260    type Item = T::Native;
1261
1262    fn value(&self, index: usize) -> Self::Item {
1263        PrimitiveArray::value(self, index)
1264    }
1265
1266    #[inline]
1267    unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
1268        unsafe { PrimitiveArray::value_unchecked(self, index) }
1269    }
1270}
1271
1272impl<T: ArrowTemporalType> PrimitiveArray<T>
1273where
1274    i64: From<T::Native>,
1275{
1276    /// Returns value as a chrono `NaiveDateTime`, handling time resolution
1277    ///
1278    /// If a data type cannot be converted to `NaiveDateTime`, a `None` is returned.
1279    /// A valid value is expected, thus the user should first check for validity.
1280    ///
1281    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1282    pub fn value_as_datetime(&self, i: usize) -> Option<NaiveDateTime> {
1283        as_datetime::<T>(i64::from(self.value(i)))
1284    }
1285
1286    /// Returns value as a chrono `NaiveDateTime`, handling time resolution with the provided tz
1287    ///
1288    /// functionally it is same as `value_as_datetime`, however it adds
1289    /// the passed tz to the to-be-returned NaiveDateTime
1290    ///
1291    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1292    pub fn value_as_datetime_with_tz(&self, i: usize, tz: Tz) -> Option<DateTime<Tz>> {
1293        as_datetime_with_timezone::<T>(i64::from(self.value(i)), tz)
1294    }
1295
1296    /// Returns value as a chrono `NaiveDate` by using `Self::datetime()`
1297    ///
1298    /// If a data type cannot be converted to `NaiveDate`, a `None` is returned
1299    ///
1300    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1301    pub fn value_as_date(&self, i: usize) -> Option<NaiveDate> {
1302        self.value_as_datetime(i).map(|datetime| datetime.date())
1303    }
1304
1305    /// Returns a value as a chrono `NaiveTime`
1306    ///
1307    /// `Date32` and `Date64` return UTC midnight as they do not have time resolution
1308    ///
1309    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1310    pub fn value_as_time(&self, i: usize) -> Option<NaiveTime> {
1311        as_time::<T>(i64::from(self.value(i)))
1312    }
1313
1314    /// Returns a value as a chrono `Duration`
1315    ///
1316    /// If a data type cannot be converted to `Duration`, a `None` is returned
1317    ///
1318    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1319    pub fn value_as_duration(&self, i: usize) -> Option<Duration> {
1320        as_duration::<T>(i64::from(self.value(i)))
1321    }
1322}
1323
1324impl<T: ArrowPrimitiveType> std::fmt::Debug for PrimitiveArray<T> {
1325    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1326        let data_type = self.data_type();
1327
1328        write!(f, "PrimitiveArray<{data_type}>\n[\n")?;
1329        print_long_array(self, f, |array, index, f| match data_type {
1330            DataType::Date32 | DataType::Date64 => {
1331                let v = self.value(index).to_i64().unwrap();
1332                match as_date::<T>(v) {
1333                    Some(date) => write!(f, "{date:?}"),
1334                    None => {
1335                        write!(
1336                            f,
1337                            "Cast error: Failed to convert {v} to temporal for {data_type}"
1338                        )
1339                    }
1340                }
1341            }
1342            DataType::Time32(_) | DataType::Time64(_) => {
1343                let v = self.value(index).to_i64().unwrap();
1344                match as_time::<T>(v) {
1345                    Some(time) => write!(f, "{time:?}"),
1346                    None => {
1347                        write!(
1348                            f,
1349                            "Cast error: Failed to convert {v} to temporal for {data_type}"
1350                        )
1351                    }
1352                }
1353            }
1354            DataType::Timestamp(_, tz_string_opt) => {
1355                let v = self.value(index).to_i64().unwrap();
1356                match tz_string_opt {
1357                    // for Timestamp with TimeZone
1358                    Some(tz_string) => {
1359                        match tz_string.parse::<Tz>() {
1360                            // if the time zone is valid, construct a DateTime<Tz> and format it as rfc3339
1361                            Ok(tz) => match as_datetime_with_timezone::<T>(v, tz) {
1362                                Some(datetime) => write!(f, "{}", datetime.to_rfc3339()),
1363                                None => write!(
1364                                    f,
1365                                    "Cast error: Failed to convert {v} to timestamp for {data_type}"
1366                                ),
1367                            },
1368                            // if the time zone is invalid, shows NaiveDateTime with an error message
1369                            Err(_) => match as_datetime::<T>(v) {
1370                                Some(datetime) => {
1371                                    write!(f, "{datetime:?} (Unknown Time Zone '{tz_string}')")
1372                                }
1373                                None => write!(
1374                                    f,
1375                                    "Cast error: Failed to convert {v} to timestamp for {data_type}"
1376                                ),
1377                            },
1378                        }
1379                    }
1380                    // for Timestamp without TimeZone
1381                    None => match as_datetime::<T>(v) {
1382                        Some(datetime) => write!(f, "{datetime:?}"),
1383                        None => write!(
1384                            f,
1385                            "Cast error: Failed to convert {v} to timestamp for {data_type}"
1386                        ),
1387                    },
1388                }
1389            }
1390            _ => std::fmt::Debug::fmt(&array.value(index), f),
1391        })?;
1392        write!(f, "]")
1393    }
1394}
1395
1396impl<'a, T: ArrowPrimitiveType> IntoIterator for &'a PrimitiveArray<T> {
1397    type Item = Option<<T as ArrowPrimitiveType>::Native>;
1398    type IntoIter = PrimitiveIter<'a, T>;
1399
1400    fn into_iter(self) -> Self::IntoIter {
1401        PrimitiveIter::<'a, T>::new(self)
1402    }
1403}
1404
1405impl<'a, T: ArrowPrimitiveType> PrimitiveArray<T> {
1406    /// constructs a new iterator
1407    pub fn iter(&'a self) -> PrimitiveIter<'a, T> {
1408        PrimitiveIter::<'a, T>::new(self)
1409    }
1410}
1411
1412/// An optional primitive value
1413///
1414/// This struct is used as an adapter when creating `PrimitiveArray` from an iterator.
1415/// `FromIterator` for `PrimitiveArray` takes an iterator where the elements can be `into`
1416/// this struct. So once implementing `From` or `Into` trait for a type, an iterator of
1417/// the type can be collected to `PrimitiveArray`.
1418#[derive(Debug)]
1419pub struct NativeAdapter<T: ArrowPrimitiveType> {
1420    /// Corresponding Rust native type if available
1421    pub native: Option<T::Native>,
1422}
1423
1424macro_rules! def_from_for_primitive {
1425    ( $ty:ident, $tt:tt) => {
1426        impl From<$tt> for NativeAdapter<$ty> {
1427            fn from(value: $tt) -> Self {
1428                NativeAdapter {
1429                    native: Some(value),
1430                }
1431            }
1432        }
1433    };
1434}
1435
1436def_from_for_primitive!(Int8Type, i8);
1437def_from_for_primitive!(Int16Type, i16);
1438def_from_for_primitive!(Int32Type, i32);
1439def_from_for_primitive!(Int64Type, i64);
1440def_from_for_primitive!(UInt8Type, u8);
1441def_from_for_primitive!(UInt16Type, u16);
1442def_from_for_primitive!(UInt32Type, u32);
1443def_from_for_primitive!(UInt64Type, u64);
1444def_from_for_primitive!(Float16Type, f16);
1445def_from_for_primitive!(Float32Type, f32);
1446def_from_for_primitive!(Float64Type, f64);
1447def_from_for_primitive!(Decimal32Type, i32);
1448def_from_for_primitive!(Decimal64Type, i64);
1449def_from_for_primitive!(Decimal128Type, i128);
1450def_from_for_primitive!(Decimal256Type, i256);
1451
1452impl<T: ArrowPrimitiveType> From<Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1453    fn from(value: Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1454        NativeAdapter { native: value }
1455    }
1456}
1457
1458impl<T: ArrowPrimitiveType> From<&Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1459    fn from(value: &Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1460        NativeAdapter { native: *value }
1461    }
1462}
1463
1464impl<T: ArrowPrimitiveType, Ptr: Into<NativeAdapter<T>>> FromIterator<Ptr> for PrimitiveArray<T> {
1465    fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
1466        let iter = iter.into_iter();
1467        let (lower, _) = iter.size_hint();
1468
1469        let mut null_builder = NullBufferBuilder::new(lower);
1470
1471        let buffer: Buffer = iter
1472            .map(|item| {
1473                if let Some(a) = item.into().native {
1474                    null_builder.append_non_null();
1475                    a
1476                } else {
1477                    null_builder.append_null();
1478                    // this ensures that null items on the buffer are not arbitrary.
1479                    // This is important because fallible operations can use null values (e.g. a vectorized "add")
1480                    // which may panic (e.g. overflow if the number on the slots happen to be very large).
1481                    T::Native::default()
1482                }
1483            })
1484            .collect();
1485
1486        let maybe_nulls = null_builder.finish();
1487        PrimitiveArray::new(ScalarBuffer::from(buffer), maybe_nulls)
1488    }
1489}
1490
1491impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
1492    /// Creates a [`PrimitiveArray`] from an iterator of trusted length.
1493    /// # Safety
1494    /// The iterator must be [`TrustedLen`](https://doc.rust-lang.org/std/iter/trait.TrustedLen.html).
1495    /// I.e. that `size_hint().1` correctly reports its length.
1496    #[inline]
1497    pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
1498    where
1499        P: std::borrow::Borrow<Option<<T as ArrowPrimitiveType>::Native>>,
1500        I: IntoIterator<Item = P>,
1501    {
1502        let iterator = iter.into_iter();
1503        let (_, upper) = iterator.size_hint();
1504        let len = upper.expect("trusted_len_unzip requires an upper limit");
1505
1506        let (null, buffer) = unsafe { trusted_len_unzip(iterator) };
1507
1508        let nulls = NullBuffer::from_unsliced_buffer(null, len);
1509        PrimitiveArray::new(ScalarBuffer::from(buffer), nulls)
1510    }
1511}
1512
1513// TODO: the macro is needed here because we'd get "conflicting implementations" error
1514// otherwise with both `From<Vec<T::Native>>` and `From<Vec<Option<T::Native>>>`.
1515// We should revisit this in future.
1516macro_rules! def_numeric_from_vec {
1517    ( $ty:ident ) => {
1518        impl From<Vec<<$ty as ArrowPrimitiveType>::Native>> for PrimitiveArray<$ty> {
1519            fn from(data: Vec<<$ty as ArrowPrimitiveType>::Native>) -> Self {
1520                let buffer = ScalarBuffer::from(Buffer::from_vec(data));
1521                let nulls = None;
1522                PrimitiveArray::new(buffer, nulls)
1523            }
1524        }
1525
1526        // Constructs a primitive array from a vector. Should only be used for testing.
1527        impl From<Vec<Option<<$ty as ArrowPrimitiveType>::Native>>> for PrimitiveArray<$ty> {
1528            fn from(data: Vec<Option<<$ty as ArrowPrimitiveType>::Native>>) -> Self {
1529                PrimitiveArray::from_iter(data.iter())
1530            }
1531        }
1532    };
1533}
1534
1535def_numeric_from_vec!(Int8Type);
1536def_numeric_from_vec!(Int16Type);
1537def_numeric_from_vec!(Int32Type);
1538def_numeric_from_vec!(Int64Type);
1539def_numeric_from_vec!(UInt8Type);
1540def_numeric_from_vec!(UInt16Type);
1541def_numeric_from_vec!(UInt32Type);
1542def_numeric_from_vec!(UInt64Type);
1543def_numeric_from_vec!(Float16Type);
1544def_numeric_from_vec!(Float32Type);
1545def_numeric_from_vec!(Float64Type);
1546def_numeric_from_vec!(Decimal32Type);
1547def_numeric_from_vec!(Decimal64Type);
1548def_numeric_from_vec!(Decimal128Type);
1549def_numeric_from_vec!(Decimal256Type);
1550
1551def_numeric_from_vec!(Date32Type);
1552def_numeric_from_vec!(Date64Type);
1553def_numeric_from_vec!(Time32SecondType);
1554def_numeric_from_vec!(Time32MillisecondType);
1555def_numeric_from_vec!(Time64MicrosecondType);
1556def_numeric_from_vec!(Time64NanosecondType);
1557def_numeric_from_vec!(IntervalYearMonthType);
1558def_numeric_from_vec!(IntervalDayTimeType);
1559def_numeric_from_vec!(IntervalMonthDayNanoType);
1560def_numeric_from_vec!(DurationSecondType);
1561def_numeric_from_vec!(DurationMillisecondType);
1562def_numeric_from_vec!(DurationMicrosecondType);
1563def_numeric_from_vec!(DurationNanosecondType);
1564def_numeric_from_vec!(TimestampSecondType);
1565def_numeric_from_vec!(TimestampMillisecondType);
1566def_numeric_from_vec!(TimestampMicrosecondType);
1567def_numeric_from_vec!(TimestampNanosecondType);
1568
1569impl<T: ArrowTimestampType> PrimitiveArray<T> {
1570    /// Returns the timezone of this array if any
1571    pub fn timezone(&self) -> Option<&str> {
1572        match self.data_type() {
1573            DataType::Timestamp(_, tz) => tz.as_deref(),
1574            _ => unreachable!(),
1575        }
1576    }
1577
1578    /// Construct a timestamp array with new timezone
1579    pub fn with_timezone(self, timezone: impl Into<Arc<str>>) -> Self {
1580        self.with_timezone_opt(Some(timezone.into()))
1581    }
1582
1583    /// Construct a timestamp array with UTC
1584    pub fn with_timezone_utc(self) -> Self {
1585        self.with_timezone("+00:00")
1586    }
1587
1588    /// Construct a timestamp array with an optional timezone
1589    pub fn with_timezone_opt<S: Into<Arc<str>>>(self, timezone: Option<S>) -> Self {
1590        Self {
1591            data_type: DataType::Timestamp(T::UNIT, timezone.map(Into::into)),
1592            ..self
1593        }
1594    }
1595}
1596
1597/// Constructs a `PrimitiveArray` from an array data reference.
1598impl<T: ArrowPrimitiveType> From<ArrayData> for PrimitiveArray<T> {
1599    fn from(data: ArrayData) -> Self {
1600        let (data_type, len, nulls, offset, mut buffers, _child_data) = data.into_parts();
1601
1602        Self::assert_compatible(&data_type);
1603        assert_eq!(
1604            buffers.len(),
1605            1,
1606            "PrimitiveArray data should contain a single buffer only (values buffer)"
1607        );
1608        let buffer = buffers.pop().expect("checked above");
1609
1610        let values = ScalarBuffer::new(buffer, offset, len);
1611        Self {
1612            data_type,
1613            values,
1614            nulls,
1615        }
1616    }
1617}
1618
1619impl<T: DecimalType + ArrowPrimitiveType> PrimitiveArray<T> {
1620    /// Returns a Decimal array with the same data as self, with the
1621    /// specified precision and scale.
1622    ///
1623    /// See [`validate_decimal_precision_and_scale`]
1624    pub fn with_precision_and_scale(self, precision: u8, scale: i8) -> Result<Self, ArrowError> {
1625        validate_decimal_precision_and_scale::<T>(precision, scale)?;
1626        Ok(Self {
1627            data_type: T::TYPE_CONSTRUCTOR(precision, scale),
1628            ..self
1629        })
1630    }
1631
1632    /// Validates values in this array can be properly interpreted
1633    /// with the specified precision.
1634    pub fn validate_decimal_precision(&self, precision: u8) -> Result<(), ArrowError> {
1635        if precision < self.scale() as u8 {
1636            return Err(ArrowError::InvalidArgumentError(format!(
1637                "Decimal precision {precision} is less than scale {}",
1638                self.scale()
1639            )));
1640        }
1641        (0..self.len()).try_for_each(|idx| {
1642            if self.is_valid(idx) {
1643                let decimal = unsafe { self.value_unchecked(idx) };
1644                T::validate_decimal_precision(decimal, precision, self.scale())
1645            } else {
1646                Ok(())
1647            }
1648        })
1649    }
1650
1651    /// Validates the Decimal Array, if the value of slot is overflow for the specified precision, and
1652    /// will be casted to Null
1653    pub fn null_if_overflow_precision(&self, precision: u8) -> Self {
1654        self.unary_opt::<_, T>(|v| T::is_valid_decimal_precision(v, precision).then_some(v))
1655    }
1656
1657    /// Returns [`Self::value`] formatted as a string
1658    pub fn value_as_string(&self, row: usize) -> String {
1659        T::format_decimal(self.value(row), self.precision(), self.scale())
1660    }
1661
1662    /// Returns the decimal precision of this array
1663    pub fn precision(&self) -> u8 {
1664        match T::BYTE_LENGTH {
1665            4 => {
1666                if let DataType::Decimal32(p, _) = self.data_type() {
1667                    *p
1668                } else {
1669                    unreachable!(
1670                        "Decimal32Array datatype is not DataType::Decimal32 but {}",
1671                        self.data_type()
1672                    )
1673                }
1674            }
1675            8 => {
1676                if let DataType::Decimal64(p, _) = self.data_type() {
1677                    *p
1678                } else {
1679                    unreachable!(
1680                        "Decimal64Array datatype is not DataType::Decimal64 but {}",
1681                        self.data_type()
1682                    )
1683                }
1684            }
1685            16 => {
1686                if let DataType::Decimal128(p, _) = self.data_type() {
1687                    *p
1688                } else {
1689                    unreachable!(
1690                        "Decimal128Array datatype is not DataType::Decimal128 but {}",
1691                        self.data_type()
1692                    )
1693                }
1694            }
1695            32 => {
1696                if let DataType::Decimal256(p, _) = self.data_type() {
1697                    *p
1698                } else {
1699                    unreachable!(
1700                        "Decimal256Array datatype is not DataType::Decimal256 but {}",
1701                        self.data_type()
1702                    )
1703                }
1704            }
1705            other => unreachable!("Unsupported byte length for decimal array {}", other),
1706        }
1707    }
1708
1709    /// Returns the decimal scale of this array
1710    pub fn scale(&self) -> i8 {
1711        match T::BYTE_LENGTH {
1712            4 => {
1713                if let DataType::Decimal32(_, s) = self.data_type() {
1714                    *s
1715                } else {
1716                    unreachable!(
1717                        "Decimal32Array datatype is not DataType::Decimal32 but {}",
1718                        self.data_type()
1719                    )
1720                }
1721            }
1722            8 => {
1723                if let DataType::Decimal64(_, s) = self.data_type() {
1724                    *s
1725                } else {
1726                    unreachable!(
1727                        "Decimal64Array datatype is not DataType::Decimal64 but {}",
1728                        self.data_type()
1729                    )
1730                }
1731            }
1732            16 => {
1733                if let DataType::Decimal128(_, s) = self.data_type() {
1734                    *s
1735                } else {
1736                    unreachable!(
1737                        "Decimal128Array datatype is not DataType::Decimal128 but {}",
1738                        self.data_type()
1739                    )
1740                }
1741            }
1742            32 => {
1743                if let DataType::Decimal256(_, s) = self.data_type() {
1744                    *s
1745                } else {
1746                    unreachable!(
1747                        "Decimal256Array datatype is not DataType::Decimal256 but {}",
1748                        self.data_type()
1749                    )
1750                }
1751            }
1752            other => unreachable!("Unsupported byte length for decimal array {}", other),
1753        }
1754    }
1755}
1756
1757#[cfg(test)]
1758mod tests {
1759    use super::*;
1760    use crate::BooleanArray;
1761    use crate::builder::{
1762        Decimal32Builder, Decimal64Builder, Decimal128Builder, Decimal256Builder,
1763    };
1764    use crate::cast::downcast_array;
1765    use arrow_buffer::{IntervalDayTime, IntervalMonthDayNano};
1766    use arrow_schema::TimeUnit;
1767
1768    #[test]
1769    fn test_primitive_array_from_vec() {
1770        let buf = Buffer::from_slice_ref([0, 1, 2, 3, 4]);
1771        let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
1772        assert_eq!(&buf, arr.values.inner());
1773        assert_eq!(5, arr.len());
1774        assert_eq!(0, arr.offset());
1775        assert_eq!(0, arr.null_count());
1776        for i in 0..5 {
1777            assert!(!arr.is_null(i));
1778            assert!(arr.is_valid(i));
1779            assert_eq!(i as i32, arr.value(i));
1780        }
1781    }
1782
1783    #[test]
1784    fn test_primitive_array_from_vec_option() {
1785        // Test building a primitive array with null values
1786        let arr = Int32Array::from(vec![Some(0), None, Some(2), None, Some(4)]);
1787        assert_eq!(5, arr.len());
1788        assert_eq!(0, arr.offset());
1789        assert_eq!(2, arr.null_count());
1790        for i in 0..5 {
1791            if i % 2 == 0 {
1792                assert!(!arr.is_null(i));
1793                assert!(arr.is_valid(i));
1794                assert_eq!(i as i32, arr.value(i));
1795            } else {
1796                assert!(arr.is_null(i));
1797                assert!(!arr.is_valid(i));
1798            }
1799        }
1800    }
1801
1802    #[test]
1803    fn test_date64_array_from_vec_option() {
1804        // Test building a primitive array with null values
1805        // we use Int32 and Int64 as a backing array, so all Int32 and Int64 conventions
1806        // work
1807        let arr: PrimitiveArray<Date64Type> =
1808            vec![Some(1550902545147), None, Some(1550902545147)].into();
1809        assert_eq!(3, arr.len());
1810        assert_eq!(0, arr.offset());
1811        assert_eq!(1, arr.null_count());
1812        for i in 0..3 {
1813            if i % 2 == 0 {
1814                assert!(!arr.is_null(i));
1815                assert!(arr.is_valid(i));
1816                assert_eq!(1550902545147, arr.value(i));
1817                // roundtrip to and from datetime
1818                assert_eq!(
1819                    1550902545147,
1820                    arr.value_as_datetime(i)
1821                        .unwrap()
1822                        .and_utc()
1823                        .timestamp_millis()
1824                );
1825            } else {
1826                assert!(arr.is_null(i));
1827                assert!(!arr.is_valid(i));
1828            }
1829        }
1830    }
1831
1832    #[test]
1833    fn test_time32_millisecond_array_from_vec() {
1834        // 1:        00:00:00.001
1835        // 37800005: 10:30:00.005
1836        // 86399210: 23:59:59.210
1837        let arr: PrimitiveArray<Time32MillisecondType> = vec![1, 37_800_005, 86_399_210].into();
1838        assert_eq!(3, arr.len());
1839        assert_eq!(0, arr.offset());
1840        assert_eq!(0, arr.null_count());
1841        let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1842        for (i, formatted) in formatted.iter().enumerate().take(3) {
1843            // check that we can't create dates or datetimes from time instances
1844            assert_eq!(None, arr.value_as_datetime(i));
1845            assert_eq!(None, arr.value_as_date(i));
1846            let time = arr.value_as_time(i).unwrap();
1847            assert_eq!(*formatted, time.format("%H:%M:%S%.3f").to_string());
1848        }
1849    }
1850
1851    #[test]
1852    fn test_time64_nanosecond_array_from_vec() {
1853        // Test building a primitive array with null values
1854        // we use Int32 and Int64 as a backing array, so all Int32 and Int64 conventions
1855        // work
1856
1857        // 1e6:        00:00:00.001
1858        // 37800005e6: 10:30:00.005
1859        // 86399210e6: 23:59:59.210
1860        let arr: PrimitiveArray<Time64NanosecondType> =
1861            vec![1_000_000, 37_800_005_000_000, 86_399_210_000_000].into();
1862        assert_eq!(3, arr.len());
1863        assert_eq!(0, arr.offset());
1864        assert_eq!(0, arr.null_count());
1865        let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1866        for (i, item) in formatted.iter().enumerate().take(3) {
1867            // check that we can't create dates or datetimes from time instances
1868            assert_eq!(None, arr.value_as_datetime(i));
1869            assert_eq!(None, arr.value_as_date(i));
1870            let time = arr.value_as_time(i).unwrap();
1871            assert_eq!(*item, time.format("%H:%M:%S%.3f").to_string());
1872        }
1873    }
1874
1875    #[test]
1876    fn test_interval_array_from_vec() {
1877        // intervals are currently not treated specially, but are Int32 and Int64 arrays
1878        let arr = IntervalYearMonthArray::from(vec![Some(1), None, Some(-5)]);
1879        assert_eq!(3, arr.len());
1880        assert_eq!(0, arr.offset());
1881        assert_eq!(1, arr.null_count());
1882        assert_eq!(1, arr.value(0));
1883        assert_eq!(1, arr.values()[0]);
1884        assert!(arr.is_null(1));
1885        assert_eq!(-5, arr.value(2));
1886        assert_eq!(-5, arr.values()[2]);
1887
1888        let v0 = IntervalDayTime {
1889            days: 34,
1890            milliseconds: 1,
1891        };
1892        let v2 = IntervalDayTime {
1893            days: -2,
1894            milliseconds: -5,
1895        };
1896
1897        let arr = IntervalDayTimeArray::from(vec![Some(v0), None, Some(v2)]);
1898
1899        assert_eq!(3, arr.len());
1900        assert_eq!(0, arr.offset());
1901        assert_eq!(1, arr.null_count());
1902        assert_eq!(v0, arr.value(0));
1903        assert_eq!(v0, arr.values()[0]);
1904        assert!(arr.is_null(1));
1905        assert_eq!(v2, arr.value(2));
1906        assert_eq!(v2, arr.values()[2]);
1907
1908        let v0 = IntervalMonthDayNano {
1909            months: 2,
1910            days: 34,
1911            nanoseconds: -1,
1912        };
1913        let v2 = IntervalMonthDayNano {
1914            months: -3,
1915            days: -2,
1916            nanoseconds: 4,
1917        };
1918
1919        let arr = IntervalMonthDayNanoArray::from(vec![Some(v0), None, Some(v2)]);
1920        assert_eq!(3, arr.len());
1921        assert_eq!(0, arr.offset());
1922        assert_eq!(1, arr.null_count());
1923        assert_eq!(v0, arr.value(0));
1924        assert_eq!(v0, arr.values()[0]);
1925        assert!(arr.is_null(1));
1926        assert_eq!(v2, arr.value(2));
1927        assert_eq!(v2, arr.values()[2]);
1928    }
1929
1930    #[test]
1931    fn test_duration_array_from_vec() {
1932        let arr = DurationSecondArray::from(vec![Some(1), None, Some(-5)]);
1933        assert_eq!(3, arr.len());
1934        assert_eq!(0, arr.offset());
1935        assert_eq!(1, arr.null_count());
1936        assert_eq!(1, arr.value(0));
1937        assert_eq!(1, arr.values()[0]);
1938        assert!(arr.is_null(1));
1939        assert_eq!(-5, arr.value(2));
1940        assert_eq!(-5, arr.values()[2]);
1941
1942        let arr = DurationMillisecondArray::from(vec![Some(1), None, Some(-5)]);
1943        assert_eq!(3, arr.len());
1944        assert_eq!(0, arr.offset());
1945        assert_eq!(1, arr.null_count());
1946        assert_eq!(1, arr.value(0));
1947        assert_eq!(1, arr.values()[0]);
1948        assert!(arr.is_null(1));
1949        assert_eq!(-5, arr.value(2));
1950        assert_eq!(-5, arr.values()[2]);
1951
1952        let arr = DurationMicrosecondArray::from(vec![Some(1), None, Some(-5)]);
1953        assert_eq!(3, arr.len());
1954        assert_eq!(0, arr.offset());
1955        assert_eq!(1, arr.null_count());
1956        assert_eq!(1, arr.value(0));
1957        assert_eq!(1, arr.values()[0]);
1958        assert!(arr.is_null(1));
1959        assert_eq!(-5, arr.value(2));
1960        assert_eq!(-5, arr.values()[2]);
1961
1962        let arr = DurationNanosecondArray::from(vec![Some(1), None, Some(-5)]);
1963        assert_eq!(3, arr.len());
1964        assert_eq!(0, arr.offset());
1965        assert_eq!(1, arr.null_count());
1966        assert_eq!(1, arr.value(0));
1967        assert_eq!(1, arr.values()[0]);
1968        assert!(arr.is_null(1));
1969        assert_eq!(-5, arr.value(2));
1970        assert_eq!(-5, arr.values()[2]);
1971    }
1972
1973    #[test]
1974    fn test_timestamp_array_from_vec() {
1975        let arr = TimestampSecondArray::from(vec![1, -5]);
1976        assert_eq!(2, arr.len());
1977        assert_eq!(0, arr.offset());
1978        assert_eq!(0, arr.null_count());
1979        assert_eq!(1, arr.value(0));
1980        assert_eq!(-5, arr.value(1));
1981        assert_eq!(&[1, -5], arr.values());
1982
1983        let arr = TimestampMillisecondArray::from(vec![1, -5]);
1984        assert_eq!(2, arr.len());
1985        assert_eq!(0, arr.offset());
1986        assert_eq!(0, arr.null_count());
1987        assert_eq!(1, arr.value(0));
1988        assert_eq!(-5, arr.value(1));
1989        assert_eq!(&[1, -5], arr.values());
1990
1991        let arr = TimestampMicrosecondArray::from(vec![1, -5]);
1992        assert_eq!(2, arr.len());
1993        assert_eq!(0, arr.offset());
1994        assert_eq!(0, arr.null_count());
1995        assert_eq!(1, arr.value(0));
1996        assert_eq!(-5, arr.value(1));
1997        assert_eq!(&[1, -5], arr.values());
1998
1999        let arr = TimestampNanosecondArray::from(vec![1, -5]);
2000        assert_eq!(2, arr.len());
2001        assert_eq!(0, arr.offset());
2002        assert_eq!(0, arr.null_count());
2003        assert_eq!(1, arr.value(0));
2004        assert_eq!(-5, arr.value(1));
2005        assert_eq!(&[1, -5], arr.values());
2006    }
2007
2008    #[test]
2009    fn test_primitive_array_slice() {
2010        let arr = Int32Array::from(vec![
2011            Some(0),
2012            None,
2013            Some(2),
2014            None,
2015            Some(4),
2016            Some(5),
2017            Some(6),
2018            None,
2019            None,
2020        ]);
2021        assert_eq!(9, arr.len());
2022        assert_eq!(0, arr.offset());
2023        assert_eq!(4, arr.null_count());
2024
2025        let arr2 = arr.slice(2, 5);
2026        assert_eq!(5, arr2.len());
2027        assert_eq!(1, arr2.null_count());
2028
2029        for i in 0..arr2.len() {
2030            assert_eq!(i == 1, arr2.is_null(i));
2031            assert_eq!(i != 1, arr2.is_valid(i));
2032        }
2033        let int_arr2 = arr2.as_any().downcast_ref::<Int32Array>().unwrap();
2034        assert_eq!(2, int_arr2.values()[0]);
2035        assert_eq!(&[4, 5, 6], &int_arr2.values()[2..5]);
2036
2037        let arr3 = arr2.slice(2, 3);
2038        assert_eq!(3, arr3.len());
2039        assert_eq!(0, arr3.null_count());
2040
2041        let int_arr3 = arr3.as_any().downcast_ref::<Int32Array>().unwrap();
2042        assert_eq!(&[4, 5, 6], int_arr3.values());
2043        assert_eq!(4, int_arr3.value(0));
2044        assert_eq!(5, int_arr3.value(1));
2045        assert_eq!(6, int_arr3.value(2));
2046    }
2047
2048    #[test]
2049    fn test_boolean_array_slice() {
2050        let arr = BooleanArray::from(vec![
2051            Some(true),
2052            None,
2053            Some(false),
2054            None,
2055            Some(true),
2056            Some(false),
2057            Some(true),
2058            Some(false),
2059            None,
2060            Some(true),
2061        ]);
2062
2063        assert_eq!(10, arr.len());
2064        assert_eq!(0, arr.offset());
2065        assert_eq!(3, arr.null_count());
2066
2067        let arr2 = arr.slice(3, 5);
2068        assert_eq!(5, arr2.len());
2069        assert_eq!(3, arr2.offset());
2070        assert_eq!(1, arr2.null_count());
2071
2072        let bool_arr = arr2.as_any().downcast_ref::<BooleanArray>().unwrap();
2073
2074        assert!(!bool_arr.is_valid(0));
2075
2076        assert!(bool_arr.is_valid(1));
2077        assert!(bool_arr.value(1));
2078
2079        assert!(bool_arr.is_valid(2));
2080        assert!(!bool_arr.value(2));
2081
2082        assert!(bool_arr.is_valid(3));
2083        assert!(bool_arr.value(3));
2084
2085        assert!(bool_arr.is_valid(4));
2086        assert!(!bool_arr.value(4));
2087    }
2088
2089    #[test]
2090    fn test_int32_fmt_debug() {
2091        let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
2092        assert_eq!(
2093            "PrimitiveArray<Int32>\n[\n  0,\n  1,\n  2,\n  3,\n  4,\n]",
2094            format!("{arr:?}")
2095        );
2096    }
2097
2098    #[test]
2099    fn test_fmt_debug_up_to_20_elements() {
2100        (1..=20).for_each(|i| {
2101            let values = (0..i).collect::<Vec<i16>>();
2102            let array_expected = format!(
2103                "PrimitiveArray<Int16>\n[\n{}\n]",
2104                values
2105                    .iter()
2106                    .map(|v| { format!("  {v},") })
2107                    .collect::<Vec<String>>()
2108                    .join("\n")
2109            );
2110            let array = Int16Array::from(values);
2111
2112            assert_eq!(array_expected, format!("{array:?}"));
2113        })
2114    }
2115
2116    #[test]
2117    fn test_int32_with_null_fmt_debug() {
2118        let mut builder = Int32Array::builder(3);
2119        builder.append_slice(&[0, 1]);
2120        builder.append_null();
2121        builder.append_slice(&[3, 4]);
2122        let arr = builder.finish();
2123        assert_eq!(
2124            "PrimitiveArray<Int32>\n[\n  0,\n  1,\n  null,\n  3,\n  4,\n]",
2125            format!("{arr:?}")
2126        );
2127    }
2128
2129    #[test]
2130    fn test_timestamp_fmt_debug() {
2131        let arr: PrimitiveArray<TimestampMillisecondType> =
2132            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000]);
2133        assert_eq!(
2134            "PrimitiveArray<Timestamp(ms)>\n[\n  2018-12-31T00:00:00,\n  2018-12-31T00:00:00,\n  1921-01-02T00:00:00,\n]",
2135            format!("{arr:?}")
2136        );
2137    }
2138
2139    #[test]
2140    fn test_timestamp_fmt_debug_out_of_range() {
2141        // Include a true null into dataset to ensure we don't write that as an error
2142        let data = Int64Array::new(
2143            vec![i64::MAX, i64::MIN, i64::MAX].into(),
2144            Some(vec![true, true, false].into()),
2145        );
2146
2147        let arr = data.reinterpret_cast::<TimestampSecondType>();
2148        assert_eq!(
2149            "PrimitiveArray<Timestamp(s)>
2150[
2151  Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(s),
2152  Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(s),
2153  null,
2154]",
2155            format!("{arr:?}")
2156        );
2157
2158        let arr = data.reinterpret_cast::<TimestampMillisecondType>();
2159        assert_eq!(
2160            "PrimitiveArray<Timestamp(ms)>
2161[
2162  Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(ms),
2163  Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(ms),
2164  null,
2165]",
2166            format!("{arr:?}")
2167        );
2168
2169        let arr = data.reinterpret_cast::<TimestampMicrosecondType>();
2170        assert_eq!(
2171            "PrimitiveArray<Timestamp(µs)>
2172[
2173  Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(µs),
2174  Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(µs),
2175  null,
2176]",
2177            format!("{arr:?}")
2178        );
2179
2180        // Nanoseconds always in range
2181        let arr = data.reinterpret_cast::<TimestampNanosecondType>();
2182        assert_eq!(
2183            "PrimitiveArray<Timestamp(ns)>
2184[
2185  2262-04-11T23:47:16.854775807,
2186  1677-09-21T00:12:43.145224192,
2187  null,
2188]",
2189            format!("{arr:?}")
2190        );
2191    }
2192
2193    #[test]
2194    fn test_timestamp_utc_fmt_debug() {
2195        let arr: PrimitiveArray<TimestampMillisecondType> =
2196            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2197                .with_timezone_utc();
2198        assert_eq!(
2199            "PrimitiveArray<Timestamp(ms, \"+00:00\")>\n[\n  2018-12-31T00:00:00+00:00,\n  2018-12-31T00:00:00+00:00,\n  1921-01-02T00:00:00+00:00,\n]",
2200            format!("{arr:?}")
2201        );
2202    }
2203
2204    #[test]
2205    #[cfg(feature = "chrono-tz")]
2206    fn test_timestamp_with_named_tz_fmt_debug() {
2207        let arr: PrimitiveArray<TimestampMillisecondType> =
2208            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2209                .with_timezone("Asia/Taipei".to_string());
2210        assert_eq!(
2211            "PrimitiveArray<Timestamp(ms, \"Asia/Taipei\")>\n[\n  2018-12-31T08:00:00+08:00,\n  2018-12-31T08:00:00+08:00,\n  1921-01-02T08:00:00+08:00,\n]",
2212            format!("{arr:?}")
2213        );
2214    }
2215
2216    #[test]
2217    #[cfg(not(feature = "chrono-tz"))]
2218    fn test_timestamp_with_named_tz_fmt_debug() {
2219        let arr: PrimitiveArray<TimestampMillisecondType> =
2220            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2221                .with_timezone("Asia/Taipei".to_string());
2222
2223        println!("{arr:?}");
2224
2225        assert_eq!(
2226            "PrimitiveArray<Timestamp(ms, \"Asia/Taipei\")>\n[\n  2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n  2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n  1921-01-02T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n]",
2227            format!("{arr:?}")
2228        );
2229    }
2230
2231    #[test]
2232    fn test_timestamp_with_fixed_offset_tz_fmt_debug() {
2233        let arr: PrimitiveArray<TimestampMillisecondType> =
2234            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2235                .with_timezone("+08:00".to_string());
2236        assert_eq!(
2237            "PrimitiveArray<Timestamp(ms, \"+08:00\")>\n[\n  2018-12-31T08:00:00+08:00,\n  2018-12-31T08:00:00+08:00,\n  1921-01-02T08:00:00+08:00,\n]",
2238            format!("{arr:?}")
2239        );
2240    }
2241
2242    #[test]
2243    fn test_timestamp_with_incorrect_tz_fmt_debug() {
2244        let arr: PrimitiveArray<TimestampMillisecondType> =
2245            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2246                .with_timezone("xxx".to_string());
2247        assert_eq!(
2248            "PrimitiveArray<Timestamp(ms, \"xxx\")>\n[\n  2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n  2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n  1921-01-02T00:00:00 (Unknown Time Zone 'xxx'),\n]",
2249            format!("{arr:?}")
2250        );
2251    }
2252
2253    #[test]
2254    #[cfg(feature = "chrono-tz")]
2255    fn test_timestamp_with_tz_with_daylight_saving_fmt_debug() {
2256        let arr: PrimitiveArray<TimestampMillisecondType> = TimestampMillisecondArray::from(vec![
2257            1647161999000,
2258            1647162000000,
2259            1667717999000,
2260            1667718000000,
2261        ])
2262        .with_timezone("America/Denver".to_string());
2263        assert_eq!(
2264            "PrimitiveArray<Timestamp(ms, \"America/Denver\")>\n[\n  2022-03-13T01:59:59-07:00,\n  2022-03-13T03:00:00-06:00,\n  2022-11-06T00:59:59-06:00,\n  2022-11-06T01:00:00-06:00,\n]",
2265            format!("{arr:?}")
2266        );
2267    }
2268
2269    #[test]
2270    fn test_date32_fmt_debug() {
2271        let arr: PrimitiveArray<Date32Type> = vec![12356, 13548, -365].into();
2272        assert_eq!(
2273            "PrimitiveArray<Date32>\n[\n  2003-10-31,\n  2007-02-04,\n  1969-01-01,\n]",
2274            format!("{arr:?}")
2275        );
2276    }
2277
2278    #[test]
2279    fn test_time32second_fmt_debug() {
2280        let arr: PrimitiveArray<Time32SecondType> = vec![7201, 60054].into();
2281        assert_eq!(
2282            "PrimitiveArray<Time32(s)>\n[\n  02:00:01,\n  16:40:54,\n]",
2283            format!("{arr:?}")
2284        );
2285    }
2286
2287    #[test]
2288    fn test_time32second_invalid_neg() {
2289        // chrono::NaiveDatetime::from_timestamp_opt returns None while input is invalid
2290        let arr: PrimitiveArray<Time32SecondType> = vec![-7201, -60054].into();
2291        assert_eq!(
2292            "PrimitiveArray<Time32(s)>\n[\n  Cast error: Failed to convert -7201 to temporal for Time32(s),\n  Cast error: Failed to convert -60054 to temporal for Time32(s),\n]",
2293            // "PrimitiveArray<Time32(s)>\n[\n  null,\n  null,\n]",
2294            format!("{arr:?}")
2295        )
2296    }
2297
2298    #[test]
2299    fn test_primitive_array_builder() {
2300        // Test building a primitive array with ArrayData builder and offset
2301        let buf = Buffer::from_slice_ref([0i32, 1, 2, 3, 4, 5, 6]);
2302        let buf2 = buf.slice_with_length(8, 20);
2303        let data = ArrayData::builder(DataType::Int32)
2304            .len(5)
2305            .offset(2)
2306            .add_buffer(buf)
2307            .build()
2308            .unwrap();
2309        let arr = Int32Array::from(data);
2310        assert_eq!(&buf2, arr.values.inner());
2311        assert_eq!(5, arr.len());
2312        assert_eq!(0, arr.null_count());
2313        for i in 0..3 {
2314            assert_eq!((i + 2) as i32, arr.value(i));
2315        }
2316    }
2317
2318    #[test]
2319    fn test_primitive_from_iter_values() {
2320        // Test building a primitive array with from_iter_values
2321        let arr: PrimitiveArray<Int32Type> = PrimitiveArray::from_iter_values(0..10);
2322        assert_eq!(10, arr.len());
2323        assert_eq!(0, arr.null_count());
2324        for i in 0..10i32 {
2325            assert_eq!(i, arr.value(i as usize));
2326        }
2327    }
2328
2329    #[test]
2330    fn test_primitive_array_from_unbound_iter() {
2331        // iterator that doesn't declare (upper) size bound
2332        let value_iter = (0..)
2333            .scan(0usize, |pos, i| {
2334                if *pos < 10 {
2335                    *pos += 1;
2336                    Some(Some(i))
2337                } else {
2338                    // actually returns up to 10 values
2339                    None
2340                }
2341            })
2342            // limited using take()
2343            .take(100);
2344
2345        let (_, upper_size_bound) = value_iter.size_hint();
2346        // the upper bound, defined by take above, is 100
2347        assert_eq!(upper_size_bound, Some(100));
2348        let primitive_array: PrimitiveArray<Int32Type> = value_iter.collect();
2349        // but the actual number of items in the array should be 10
2350        assert_eq!(primitive_array.len(), 10);
2351    }
2352
2353    #[test]
2354    fn test_primitive_array_from_non_null_iter() {
2355        let iter = (0..10_i32).map(Some);
2356        let primitive_array = PrimitiveArray::<Int32Type>::from_iter(iter);
2357        assert_eq!(primitive_array.len(), 10);
2358        assert_eq!(primitive_array.null_count(), 0);
2359        assert!(primitive_array.nulls().is_none());
2360        assert_eq!(primitive_array.values(), &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2361    }
2362
2363    #[test]
2364    #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \
2365                               (values buffer)")]
2366    // Different error messages, so skip for now
2367    // https://github.com/apache/arrow-rs/issues/1545
2368    #[cfg(not(feature = "force_validate"))]
2369    fn test_primitive_array_invalid_buffer_len() {
2370        let buffer = Buffer::from_slice_ref([0i32, 1, 2, 3, 4]);
2371        let data = unsafe {
2372            ArrayData::builder(DataType::Int32)
2373                .add_buffer(buffer.clone())
2374                .add_buffer(buffer)
2375                .len(5)
2376                .build_unchecked()
2377        };
2378
2379        drop(Int32Array::from(data));
2380    }
2381
2382    #[test]
2383    fn test_access_array_concurrently() {
2384        let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
2385        let ret = std::thread::spawn(move || a.value(3)).join();
2386
2387        assert!(ret.is_ok());
2388        assert_eq!(8, ret.ok().unwrap());
2389    }
2390
2391    #[test]
2392    fn test_primitive_array_creation() {
2393        let array1: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().collect();
2394        let array2: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().map(Some).collect();
2395
2396        assert_eq!(array1, array2);
2397    }
2398
2399    #[test]
2400    #[should_panic(
2401        expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2402    )]
2403    fn test_string_array_get_value_index_out_of_bound() {
2404        let array: Int8Array = [10_i8, 11, 12].into_iter().collect();
2405
2406        array.value(4);
2407    }
2408
2409    #[test]
2410    #[should_panic(expected = "PrimitiveArray expected data type Int64 got Int32")]
2411    fn test_from_array_data_validation() {
2412        let foo = PrimitiveArray::<Int32Type>::from_iter([1, 2, 3]);
2413        let _ = PrimitiveArray::<Int64Type>::from(foo.into_data());
2414    }
2415
2416    #[test]
2417    fn test_decimal32() {
2418        let values: Vec<_> = vec![0, 1, -1, i32::MIN, i32::MAX];
2419        let array: PrimitiveArray<Decimal32Type> =
2420            PrimitiveArray::from_iter(values.iter().copied());
2421        assert_eq!(array.values(), &values);
2422
2423        let array: PrimitiveArray<Decimal32Type> =
2424            PrimitiveArray::from_iter_values(values.iter().copied());
2425        assert_eq!(array.values(), &values);
2426
2427        let array = PrimitiveArray::<Decimal32Type>::from(values.clone());
2428        assert_eq!(array.values(), &values);
2429
2430        let array = PrimitiveArray::<Decimal32Type>::from(array.to_data());
2431        assert_eq!(array.values(), &values);
2432    }
2433
2434    #[test]
2435    fn test_decimal64() {
2436        let values: Vec<_> = vec![0, 1, -1, i64::MIN, i64::MAX];
2437        let array: PrimitiveArray<Decimal64Type> =
2438            PrimitiveArray::from_iter(values.iter().copied());
2439        assert_eq!(array.values(), &values);
2440
2441        let array: PrimitiveArray<Decimal64Type> =
2442            PrimitiveArray::from_iter_values(values.iter().copied());
2443        assert_eq!(array.values(), &values);
2444
2445        let array = PrimitiveArray::<Decimal64Type>::from(values.clone());
2446        assert_eq!(array.values(), &values);
2447
2448        let array = PrimitiveArray::<Decimal64Type>::from(array.to_data());
2449        assert_eq!(array.values(), &values);
2450    }
2451
2452    #[test]
2453    fn test_decimal128() {
2454        let values: Vec<_> = vec![0, 1, -1, i128::MIN, i128::MAX];
2455        let array: PrimitiveArray<Decimal128Type> =
2456            PrimitiveArray::from_iter(values.iter().copied());
2457        assert_eq!(array.values(), &values);
2458
2459        let array: PrimitiveArray<Decimal128Type> =
2460            PrimitiveArray::from_iter_values(values.iter().copied());
2461        assert_eq!(array.values(), &values);
2462
2463        let array = PrimitiveArray::<Decimal128Type>::from(values.clone());
2464        assert_eq!(array.values(), &values);
2465
2466        let array = PrimitiveArray::<Decimal128Type>::from(array.to_data());
2467        assert_eq!(array.values(), &values);
2468    }
2469
2470    #[test]
2471    fn test_decimal256() {
2472        let values: Vec<_> = vec![i256::ZERO, i256::ONE, i256::MINUS_ONE, i256::MIN, i256::MAX];
2473
2474        let array: PrimitiveArray<Decimal256Type> =
2475            PrimitiveArray::from_iter(values.iter().copied());
2476        assert_eq!(array.values(), &values);
2477
2478        let array: PrimitiveArray<Decimal256Type> =
2479            PrimitiveArray::from_iter_values(values.iter().copied());
2480        assert_eq!(array.values(), &values);
2481
2482        let array = PrimitiveArray::<Decimal256Type>::from(values.clone());
2483        assert_eq!(array.values(), &values);
2484
2485        let array = PrimitiveArray::<Decimal256Type>::from(array.to_data());
2486        assert_eq!(array.values(), &values);
2487    }
2488
2489    #[test]
2490    fn test_decimal_array() {
2491        // let val_8887: [u8; 16] = [192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
2492        // let val_neg_8887: [u8; 16] = [64, 36, 75, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255];
2493        let values: [u8; 32] = [
2494            192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 36, 75, 238, 253, 255, 255,
2495            255, 255, 255, 255, 255, 255, 255, 255, 255,
2496        ];
2497        let array_data = ArrayData::builder(DataType::Decimal128(38, 6))
2498            .len(2)
2499            .add_buffer(Buffer::from(&values))
2500            .build()
2501            .unwrap();
2502        let decimal_array = Decimal128Array::from(array_data);
2503        assert_eq!(8_887_000_000_i128, decimal_array.value(0));
2504        assert_eq!(-8_887_000_000_i128, decimal_array.value(1));
2505    }
2506
2507    #[test]
2508    fn test_decimal_append_error_value() {
2509        let mut decimal_builder = Decimal128Builder::with_capacity(10);
2510        decimal_builder.append_value(123456);
2511        decimal_builder.append_value(12345);
2512        let result = decimal_builder.finish().with_precision_and_scale(5, 3);
2513        assert!(result.is_ok());
2514        let arr = result.unwrap();
2515        assert_eq!("12.345", arr.value_as_string(1));
2516
2517        // Validate it explicitly
2518        let result = arr.validate_decimal_precision(5);
2519        let error = result.unwrap_err();
2520        assert_eq!(
2521            "Invalid argument error: 123.456 is too large to store in a Decimal128 of precision 5. Max is 99.999",
2522            error.to_string()
2523        );
2524
2525        decimal_builder = Decimal128Builder::new();
2526        decimal_builder.append_value(100);
2527        decimal_builder.append_value(99);
2528        decimal_builder.append_value(-100);
2529        decimal_builder.append_value(-99);
2530        let result = decimal_builder.finish().with_precision_and_scale(2, 1);
2531        assert!(result.is_ok());
2532        let arr = result.unwrap();
2533        assert_eq!("9.9", arr.value_as_string(1));
2534        assert_eq!("-9.9", arr.value_as_string(3));
2535
2536        // Validate it explicitly
2537        let result = arr.validate_decimal_precision(2);
2538        let error = result.unwrap_err();
2539        assert_eq!(
2540            "Invalid argument error: 10.0 is too large to store in a Decimal128 of precision 2. Max is 9.9",
2541            error.to_string()
2542        );
2543    }
2544
2545    #[test]
2546    fn test_decimal_from_iter_values() {
2547        let array = Decimal128Array::from_iter_values(vec![-100, 0, 101]);
2548        assert_eq!(array.len(), 3);
2549        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2550        assert_eq!(-100_i128, array.value(0));
2551        assert!(!array.is_null(0));
2552        assert_eq!(0_i128, array.value(1));
2553        assert!(!array.is_null(1));
2554        assert_eq!(101_i128, array.value(2));
2555        assert!(!array.is_null(2));
2556    }
2557
2558    #[test]
2559    fn test_decimal_from_iter() {
2560        let array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2561        assert_eq!(array.len(), 3);
2562        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2563        assert_eq!(-100_i128, array.value(0));
2564        assert!(!array.is_null(0));
2565        assert!(array.is_null(1));
2566        assert_eq!(101_i128, array.value(2));
2567        assert!(!array.is_null(2));
2568    }
2569
2570    #[test]
2571    fn test_decimal_iter_sized() {
2572        let data = vec![Some(-100), None, Some(101)];
2573        let array: Decimal128Array = data.into_iter().collect();
2574        let mut iter = array.into_iter();
2575
2576        // is exact sized
2577        assert_eq!(array.len(), 3);
2578
2579        // size_hint is reported correctly
2580        assert_eq!(iter.size_hint(), (3, Some(3)));
2581        iter.next().unwrap();
2582        assert_eq!(iter.size_hint(), (2, Some(2)));
2583        iter.next().unwrap();
2584        iter.next().unwrap();
2585        assert_eq!(iter.size_hint(), (0, Some(0)));
2586        assert!(iter.next().is_none());
2587        assert_eq!(iter.size_hint(), (0, Some(0)));
2588    }
2589
2590    #[test]
2591    fn test_decimal_array_value_as_string() {
2592        let arr = [123450, -123450, 100, -100, 10, -10, 0]
2593            .into_iter()
2594            .map(Some)
2595            .collect::<Decimal128Array>()
2596            .with_precision_and_scale(6, 3)
2597            .unwrap();
2598
2599        assert_eq!("123.450", arr.value_as_string(0));
2600        assert_eq!("-123.450", arr.value_as_string(1));
2601        assert_eq!("0.100", arr.value_as_string(2));
2602        assert_eq!("-0.100", arr.value_as_string(3));
2603        assert_eq!("0.010", arr.value_as_string(4));
2604        assert_eq!("-0.010", arr.value_as_string(5));
2605        assert_eq!("0.000", arr.value_as_string(6));
2606    }
2607
2608    #[test]
2609    fn test_decimal_array_with_precision_and_scale() {
2610        let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2611            .with_precision_and_scale(20, 2)
2612            .unwrap();
2613
2614        assert_eq!(arr.data_type(), &DataType::Decimal128(20, 2));
2615        assert_eq!(arr.precision(), 20);
2616        assert_eq!(arr.scale(), 2);
2617
2618        let actual: Vec<_> = (0..arr.len()).map(|i| arr.value_as_string(i)).collect();
2619        let expected = vec!["123.45", "4.56", "78.90", "-1232234234324.32"];
2620
2621        assert_eq!(actual, expected);
2622    }
2623
2624    #[test]
2625    #[should_panic(
2626        expected = "-1232234234324.32 is too small to store in a Decimal128 of precision 5. Min is -999.99"
2627    )]
2628    fn test_decimal_array_with_precision_and_scale_out_of_range() {
2629        let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2630            // precision is too small to hold value
2631            .with_precision_and_scale(5, 2)
2632            .unwrap();
2633        arr.validate_decimal_precision(5).unwrap();
2634    }
2635
2636    #[test]
2637    #[should_panic(expected = "precision cannot be 0, has to be between [1, 38]")]
2638    fn test_decimal_array_with_precision_zero() {
2639        Decimal128Array::from_iter_values([12345, 456])
2640            .with_precision_and_scale(0, 2)
2641            .unwrap();
2642    }
2643
2644    #[test]
2645    #[should_panic(expected = "precision 40 is greater than max 38")]
2646    fn test_decimal_array_with_precision_and_scale_invalid_precision() {
2647        Decimal128Array::from_iter_values([12345, 456])
2648            .with_precision_and_scale(40, 2)
2649            .unwrap();
2650    }
2651
2652    #[test]
2653    #[should_panic(expected = "scale 40 is greater than max 38")]
2654    fn test_decimal_array_with_precision_and_scale_invalid_scale() {
2655        Decimal128Array::from_iter_values([12345, 456])
2656            .with_precision_and_scale(20, 40)
2657            .unwrap();
2658    }
2659
2660    #[test]
2661    #[should_panic(expected = "scale 10 is greater than precision 4")]
2662    fn test_decimal_array_with_precision_and_scale_invalid_precision_and_scale() {
2663        Decimal128Array::from_iter_values([12345, 456])
2664            .with_precision_and_scale(4, 10)
2665            .unwrap();
2666    }
2667
2668    #[test]
2669    fn test_decimal_array_set_null_if_overflow_with_precision() {
2670        let array = Decimal128Array::from(vec![Some(123456), Some(123), None, Some(123456)]);
2671        let result = array.null_if_overflow_precision(5);
2672        let expected = Decimal128Array::from(vec![None, Some(123), None, None]);
2673        assert_eq!(result, expected);
2674    }
2675
2676    #[test]
2677    fn test_decimal256_iter() {
2678        let mut builder = Decimal256Builder::with_capacity(30);
2679        let decimal1 = i256::from_i128(12345);
2680        builder.append_value(decimal1);
2681
2682        builder.append_null();
2683
2684        let decimal2 = i256::from_i128(56789);
2685        builder.append_value(decimal2);
2686
2687        let array: Decimal256Array = builder.finish().with_precision_and_scale(76, 6).unwrap();
2688
2689        let collected: Vec<_> = array.iter().collect();
2690        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2691    }
2692
2693    #[test]
2694    fn test_from_iter_decimal256array() {
2695        let value1 = i256::from_i128(12345);
2696        let value2 = i256::from_i128(56789);
2697
2698        let mut array: Decimal256Array =
2699            vec![Some(value1), None, Some(value2)].into_iter().collect();
2700        array = array.with_precision_and_scale(76, 10).unwrap();
2701        assert_eq!(array.len(), 3);
2702        assert_eq!(array.data_type(), &DataType::Decimal256(76, 10));
2703        assert_eq!(value1, array.value(0));
2704        assert!(!array.is_null(0));
2705        assert!(array.is_null(1));
2706        assert_eq!(value2, array.value(2));
2707        assert!(!array.is_null(2));
2708    }
2709
2710    #[test]
2711    fn test_from_iter_decimal128array() {
2712        let mut array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2713        array = array.with_precision_and_scale(38, 10).unwrap();
2714        assert_eq!(array.len(), 3);
2715        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2716        assert_eq!(-100_i128, array.value(0));
2717        assert!(!array.is_null(0));
2718        assert!(array.is_null(1));
2719        assert_eq!(101_i128, array.value(2));
2720        assert!(!array.is_null(2));
2721    }
2722
2723    #[test]
2724    fn test_decimal64_iter() {
2725        let mut builder = Decimal64Builder::with_capacity(30);
2726        let decimal1 = 12345;
2727        builder.append_value(decimal1);
2728
2729        builder.append_null();
2730
2731        let decimal2 = 56789;
2732        builder.append_value(decimal2);
2733
2734        let array: Decimal64Array = builder.finish().with_precision_and_scale(18, 4).unwrap();
2735
2736        let collected: Vec<_> = array.iter().collect();
2737        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2738    }
2739
2740    #[test]
2741    fn test_from_iter_decimal64array() {
2742        let value1 = 12345;
2743        let value2 = 56789;
2744
2745        let mut array: Decimal64Array =
2746            vec![Some(value1), None, Some(value2)].into_iter().collect();
2747        array = array.with_precision_and_scale(18, 4).unwrap();
2748        assert_eq!(array.len(), 3);
2749        assert_eq!(array.data_type(), &DataType::Decimal64(18, 4));
2750        assert_eq!(value1, array.value(0));
2751        assert!(!array.is_null(0));
2752        assert!(array.is_null(1));
2753        assert_eq!(value2, array.value(2));
2754        assert!(!array.is_null(2));
2755    }
2756
2757    #[test]
2758    fn test_decimal32_iter() {
2759        let mut builder = Decimal32Builder::with_capacity(30);
2760        let decimal1 = 12345;
2761        builder.append_value(decimal1);
2762
2763        builder.append_null();
2764
2765        let decimal2 = 56789;
2766        builder.append_value(decimal2);
2767
2768        let array: Decimal32Array = builder.finish().with_precision_and_scale(9, 2).unwrap();
2769
2770        let collected: Vec<_> = array.iter().collect();
2771        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2772    }
2773
2774    #[test]
2775    fn test_from_iter_decimal32array() {
2776        let value1 = 12345;
2777        let value2 = 56789;
2778
2779        let mut array: Decimal32Array =
2780            vec![Some(value1), None, Some(value2)].into_iter().collect();
2781        array = array.with_precision_and_scale(9, 2).unwrap();
2782        assert_eq!(array.len(), 3);
2783        assert_eq!(array.data_type(), &DataType::Decimal32(9, 2));
2784        assert_eq!(value1, array.value(0));
2785        assert!(!array.is_null(0));
2786        assert!(array.is_null(1));
2787        assert_eq!(value2, array.value(2));
2788        assert!(!array.is_null(2));
2789    }
2790
2791    #[test]
2792    fn test_unary_opt() {
2793        let array = Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7]);
2794        let r = array.unary_opt::<_, Int32Type>(|x| (x % 2 != 0).then_some(x));
2795
2796        let expected = Int32Array::from(vec![Some(1), None, Some(3), None, Some(5), None, Some(7)]);
2797        assert_eq!(r, expected);
2798
2799        let r = expected.unary_opt::<_, Int32Type>(|x| (x % 3 != 0).then_some(x));
2800        let expected = Int32Array::from(vec![Some(1), None, None, None, Some(5), None, Some(7)]);
2801        assert_eq!(r, expected);
2802    }
2803
2804    #[test]
2805    #[should_panic(
2806        expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2807    )]
2808    fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
2809        let array = Decimal128Array::from(vec![-100, 0, 101]);
2810        array.value(4);
2811    }
2812
2813    #[test]
2814    fn test_into_builder() {
2815        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2816
2817        let boxed: ArrayRef = Arc::new(array);
2818        let col: Int32Array = downcast_array(&boxed);
2819        drop(boxed);
2820
2821        let mut builder = col.into_builder().unwrap();
2822
2823        let slice = builder.values_slice_mut();
2824        assert_eq!(slice, &[1, 2, 3]);
2825
2826        slice[0] = 4;
2827        slice[1] = 2;
2828        slice[2] = 1;
2829
2830        let expected: Int32Array = vec![Some(4), Some(2), Some(1)].into_iter().collect();
2831
2832        let new_array = builder.finish();
2833        assert_eq!(expected, new_array);
2834    }
2835
2836    #[test]
2837    fn test_into_builder_cloned_array() {
2838        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2839
2840        let boxed: ArrayRef = Arc::new(array);
2841
2842        let col: Int32Array = PrimitiveArray::<Int32Type>::from(boxed.to_data());
2843        let err = col.into_builder();
2844
2845        match err {
2846            Ok(_) => panic!("Should not get builder from cloned array"),
2847            Err(returned) => {
2848                let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2849                assert_eq!(expected, returned)
2850            }
2851        }
2852    }
2853
2854    #[test]
2855    fn test_into_builder_on_sliced_array() {
2856        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2857        let slice = array.slice(1, 2);
2858        let col: Int32Array = downcast_array(&slice);
2859
2860        drop(slice);
2861
2862        col.into_builder()
2863            .expect_err("Should not build builder from sliced array");
2864    }
2865
2866    #[test]
2867    fn test_unary_mut() {
2868        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2869
2870        let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2871        let expected: Int32Array = vec![3, 5, 7].into_iter().map(Some).collect();
2872
2873        assert_eq!(expected, c);
2874
2875        let array: Int32Array = Int32Array::from(vec![Some(5), Some(7), None]);
2876        let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2877        assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
2878    }
2879
2880    #[test]
2881    #[should_panic(
2882        expected = "PrimitiveArray expected data type Interval(MonthDayNano) got Interval(DayTime)"
2883    )]
2884    fn test_invalid_interval_type() {
2885        let array = IntervalDayTimeArray::from(vec![IntervalDayTime::ZERO]);
2886        let _ = IntervalMonthDayNanoArray::from(array.into_data());
2887    }
2888
2889    #[test]
2890    fn test_timezone() {
2891        let array = TimestampNanosecondArray::from_iter_values([1, 2]);
2892        assert_eq!(array.timezone(), None);
2893
2894        let array = array.with_timezone("+02:00");
2895        assert_eq!(array.timezone(), Some("+02:00"));
2896    }
2897
2898    #[test]
2899    fn test_try_new() {
2900        Int32Array::new(vec![1, 2, 3, 4].into(), None);
2901        Int32Array::new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(4)));
2902
2903        let err = Int32Array::try_new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(3)))
2904            .unwrap_err();
2905
2906        assert_eq!(
2907            err.to_string(),
2908            "Invalid argument error: Incorrect length of null buffer for PrimitiveArray, expected 4 got 3"
2909        );
2910
2911        TimestampNanosecondArray::new(vec![1, 2, 3, 4].into(), None).with_data_type(
2912            DataType::Timestamp(TimeUnit::Nanosecond, Some("03:00".into())),
2913        );
2914    }
2915
2916    #[test]
2917    #[should_panic(expected = "PrimitiveArray expected data type Int32 got Date32")]
2918    fn test_with_data_type() {
2919        Int32Array::new(vec![1, 2, 3, 4].into(), None).with_data_type(DataType::Date32);
2920    }
2921
2922    #[test]
2923    fn test_time_32second_output() {
2924        let array: Time32SecondArray = vec![
2925            Some(-1),
2926            Some(0),
2927            Some(86_399),
2928            Some(86_400),
2929            Some(86_401),
2930            None,
2931        ]
2932        .into();
2933        let debug_str = format!("{array:?}");
2934        assert_eq!(
2935            "PrimitiveArray<Time32(s)>\n[\n  Cast error: Failed to convert -1 to temporal for Time32(s),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400 to temporal for Time32(s),\n  Cast error: Failed to convert 86401 to temporal for Time32(s),\n  null,\n]",
2936            debug_str
2937        );
2938    }
2939
2940    #[test]
2941    fn test_time_32millisecond_debug_output() {
2942        let array: Time32MillisecondArray = vec![
2943            Some(-1),
2944            Some(0),
2945            Some(86_399_000),
2946            Some(86_400_000),
2947            Some(86_401_000),
2948            None,
2949        ]
2950        .into();
2951        let debug_str = format!("{array:?}");
2952        assert_eq!(
2953            "PrimitiveArray<Time32(ms)>\n[\n  Cast error: Failed to convert -1 to temporal for Time32(ms),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000 to temporal for Time32(ms),\n  Cast error: Failed to convert 86401000 to temporal for Time32(ms),\n  null,\n]",
2954            debug_str
2955        );
2956    }
2957
2958    #[test]
2959    fn test_time_64nanosecond_debug_output() {
2960        let array: Time64NanosecondArray = vec![
2961            Some(-1),
2962            Some(0),
2963            Some(86_399 * 1_000_000_000),
2964            Some(86_400 * 1_000_000_000),
2965            Some(86_401 * 1_000_000_000),
2966            None,
2967        ]
2968        .into();
2969        let debug_str = format!("{array:?}");
2970        assert_eq!(
2971            "PrimitiveArray<Time64(ns)>\n[\n  Cast error: Failed to convert -1 to temporal for Time64(ns),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000000000 to temporal for Time64(ns),\n  Cast error: Failed to convert 86401000000000 to temporal for Time64(ns),\n  null,\n]",
2972            debug_str
2973        );
2974    }
2975
2976    #[test]
2977    fn test_time_64microsecond_debug_output() {
2978        let array: Time64MicrosecondArray = vec![
2979            Some(-1),
2980            Some(0),
2981            Some(86_399 * 1_000_000),
2982            Some(86_400 * 1_000_000),
2983            Some(86_401 * 1_000_000),
2984            None,
2985        ]
2986        .into();
2987        let debug_str = format!("{array:?}");
2988        assert_eq!(
2989            "PrimitiveArray<Time64(µs)>\n[\n  Cast error: Failed to convert -1 to temporal for Time64(µs),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000000 to temporal for Time64(µs),\n  Cast error: Failed to convert 86401000000 to temporal for Time64(µs),\n  null,\n]",
2990            debug_str
2991        );
2992    }
2993
2994    #[test]
2995    fn test_primitive_with_nulls_into_builder() {
2996        let array: Int32Array = vec![
2997            Some(1),
2998            None,
2999            Some(3),
3000            Some(4),
3001            None,
3002            Some(7),
3003            None,
3004            Some(8),
3005        ]
3006        .into_iter()
3007        .collect();
3008        let _ = array.into_builder();
3009    }
3010}