Skip to main content

datafusion_common/scalar/
mod.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
18//! [`ScalarValue`]: stores single  values
19
20mod cache;
21mod consts;
22mod struct_builder;
23
24use std::borrow::Borrow;
25use std::cmp::Ordering;
26use std::collections::{HashMap, HashSet, VecDeque};
27use std::convert::Infallible;
28use std::fmt;
29use std::fmt::Write;
30use std::hash::Hash;
31use std::hash::Hasher;
32use std::iter::repeat_n;
33use std::mem::{size_of, size_of_val};
34use std::str::FromStr;
35use std::sync::Arc;
36
37use crate::assert_or_internal_err;
38use crate::cast::{
39    as_binary_array, as_binary_view_array, as_boolean_array, as_date32_array,
40    as_date64_array, as_decimal32_array, as_decimal64_array, as_decimal128_array,
41    as_decimal256_array, as_dictionary_array, as_duration_microsecond_array,
42    as_duration_millisecond_array, as_duration_nanosecond_array,
43    as_duration_second_array, as_fixed_size_binary_array, as_fixed_size_list_array,
44    as_float16_array, as_float32_array, as_float64_array, as_int8_array, as_int16_array,
45    as_int32_array, as_int64_array, as_interval_dt_array, as_interval_mdn_array,
46    as_interval_ym_array, as_large_binary_array, as_large_list_array,
47    as_large_list_view_array, as_large_string_array, as_list_view_array, as_run_array,
48    as_string_array, as_string_view_array, as_time32_millisecond_array,
49    as_time32_second_array, as_time64_microsecond_array, as_time64_nanosecond_array,
50    as_timestamp_microsecond_array, as_timestamp_millisecond_array,
51    as_timestamp_nanosecond_array, as_timestamp_second_array, as_uint8_array,
52    as_uint16_array, as_uint32_array, as_uint64_array, as_union_array,
53};
54use crate::error::{_exec_err, _internal_err, _not_impl_err, DataFusionError, Result};
55use crate::format::DEFAULT_CAST_OPTIONS;
56use crate::hash_utils::create_hashes;
57use crate::scalar::consts::{
58    DECIMAL32_ONES, DECIMAL64_ONES, DECIMAL128_ONES, DECIMAL256_ONES,
59};
60use crate::utils::SingleRowListArrayBuilder;
61use crate::{_internal_datafusion_err, arrow_datafusion_err};
62use arrow::array::{
63    Array, ArrayData, ArrayDataBuilder, ArrayRef, ArrowNativeTypeOp, ArrowPrimitiveType,
64    AsArray, BinaryArray, BinaryViewArray, BinaryViewBuilder, BooleanArray, Date32Array,
65    Date64Array, Decimal32Array, Decimal64Array, Decimal128Array, Decimal256Array,
66    DictionaryArray, DurationMicrosecondArray, DurationMillisecondArray,
67    DurationNanosecondArray, DurationSecondArray, FixedSizeBinaryArray,
68    FixedSizeListArray, Float16Array, Float32Array, Float64Array, GenericListArray,
69    GenericListViewArray, Int8Array, Int16Array, Int32Array, Int64Array,
70    IntervalDayTimeArray, IntervalMonthDayNanoArray, IntervalYearMonthArray,
71    LargeBinaryArray, LargeListArray, LargeListViewArray, LargeStringArray, ListArray,
72    ListViewArray, MapArray, MutableArrayData, PrimitiveArray, RunArray, Scalar,
73    StringArray, StringViewArray, StringViewBuilder, StructArray, Time32MillisecondArray,
74    Time32SecondArray, Time64MicrosecondArray, Time64NanosecondArray,
75    TimestampMicrosecondArray, TimestampMillisecondArray, TimestampNanosecondArray,
76    TimestampSecondArray, UInt8Array, UInt16Array, UInt32Array, UInt64Array, UnionArray,
77    downcast_run_array, new_empty_array, new_null_array,
78};
79use arrow::buffer::{BooleanBuffer, ScalarBuffer};
80use arrow::compute::kernels::cast::{CastOptions, cast_with_options};
81use arrow::compute::kernels::numeric::{
82    add, add_wrapping, div, mul, mul_wrapping, rem, sub, sub_wrapping,
83};
84use arrow::datatypes::{
85    ArrowDictionaryKeyType, ArrowNativeType, ArrowTimestampType, DataType, Date32Type,
86    Decimal32Type, Decimal64Type, Decimal128Type, Decimal256Type, DecimalType, Field,
87    FieldRef, Float32Type, Int8Type, Int16Type, Int32Type, Int64Type, IntervalDayTime,
88    IntervalDayTimeType, IntervalMonthDayNano, IntervalMonthDayNanoType, IntervalUnit,
89    IntervalYearMonthType, MAX_DECIMAL32_FOR_EACH_PRECISION,
90    MAX_DECIMAL64_FOR_EACH_PRECISION, MAX_DECIMAL128_FOR_EACH_PRECISION,
91    MAX_DECIMAL256_FOR_EACH_PRECISION, MIN_DECIMAL32_FOR_EACH_PRECISION,
92    MIN_DECIMAL64_FOR_EACH_PRECISION, MIN_DECIMAL128_FOR_EACH_PRECISION,
93    MIN_DECIMAL256_FOR_EACH_PRECISION, RunEndIndexType, TimeUnit,
94    TimestampMicrosecondType, TimestampMillisecondType, TimestampNanosecondType,
95    TimestampSecondType, UInt8Type, UInt16Type, UInt32Type, UInt64Type, UnionFields,
96    UnionMode, i256, validate_decimal_precision_and_scale,
97};
98use arrow::util::display::{ArrayFormatter, FormatOptions, array_value_to_string};
99use cache::{get_or_create_cached_key_array, get_or_create_cached_null_array};
100use chrono::{Duration, NaiveDate};
101use half::f16;
102use num_traits::ToPrimitive;
103pub use struct_builder::ScalarStructBuilder;
104
105const SECONDS_PER_DAY: i64 = 86_400;
106const MILLIS_PER_DAY: i64 = SECONDS_PER_DAY * 1_000;
107const MICROS_PER_DAY: i64 = MILLIS_PER_DAY * 1_000;
108const NANOS_PER_DAY: i64 = MICROS_PER_DAY * 1_000;
109const MICROS_PER_MILLISECOND: i64 = 1_000;
110const NANOS_PER_MILLISECOND: i64 = 1_000_000;
111
112/// Returns the multiplier that converts the input date representation into the
113/// desired timestamp unit, if the conversion requires a multiplication that can
114/// overflow an `i64`.
115pub fn date_to_timestamp_multiplier(
116    source_type: &DataType,
117    target_type: &DataType,
118) -> Option<i64> {
119    let DataType::Timestamp(target_unit, _) = target_type else {
120        return None;
121    };
122
123    // Only `Timestamp` target types have a time unit; otherwise no
124    // multiplier applies (handled above). The function returns `Some(m)`
125    // when converting the `source_type` to `target_type` requires a
126    // multiplication that could overflow `i64`. It returns `None` when
127    // the conversion is a division or otherwise doesn't require a
128    // multiplication (e.g. Date64 -> Second).
129    match source_type {
130        // Date32 stores days since epoch. Converting to any timestamp
131        // unit requires multiplying by the per-day factor (seconds,
132        // milliseconds, microseconds, nanoseconds).
133        DataType::Date32 => Some(match target_unit {
134            TimeUnit::Second => SECONDS_PER_DAY,
135            TimeUnit::Millisecond => MILLIS_PER_DAY,
136            TimeUnit::Microsecond => MICROS_PER_DAY,
137            TimeUnit::Nanosecond => NANOS_PER_DAY,
138        }),
139
140        // Date64 stores milliseconds since epoch. Converting to
141        // seconds is a division (no multiplication), so return `None`.
142        // Converting to milliseconds is 1:1 (multiplier 1). Converting
143        // to micro/nano requires multiplying by 1_000 / 1_000_000.
144        DataType::Date64 => match target_unit {
145            TimeUnit::Second => None,
146            // Converting Date64 (ms since epoch) to millisecond timestamps
147            // is an identity conversion and does not require multiplication.
148            // Returning `None` indicates no multiplication-based overflow
149            // check is necessary.
150            TimeUnit::Millisecond => None,
151            TimeUnit::Microsecond => Some(MICROS_PER_MILLISECOND),
152            TimeUnit::Nanosecond => Some(NANOS_PER_MILLISECOND),
153        },
154
155        _ => None,
156    }
157}
158
159/// Returns the multiplier that converts the input timestamp representation into
160/// the desired timestamp unit, if the conversion requires a multiplication that
161/// can overflow an `i64`.
162pub fn timestamp_to_timestamp_multiplier(
163    source_type: &DataType,
164    target_type: &DataType,
165) -> Option<i64> {
166    let (DataType::Timestamp(source_unit, _), DataType::Timestamp(target_unit, _)) =
167        (source_type, target_type)
168    else {
169        return None;
170    };
171
172    match (source_unit, target_unit) {
173        (TimeUnit::Second, TimeUnit::Millisecond) => Some(1_000),
174        (TimeUnit::Second, TimeUnit::Microsecond) => Some(1_000_000),
175        (TimeUnit::Second, TimeUnit::Nanosecond) => Some(1_000_000_000),
176        (TimeUnit::Millisecond, TimeUnit::Microsecond) => Some(1_000),
177        (TimeUnit::Millisecond, TimeUnit::Nanosecond) => Some(1_000_000),
178        (TimeUnit::Microsecond, TimeUnit::Nanosecond) => Some(1_000),
179        _ => None,
180    }
181}
182
183/// Ensures the provided value can be represented as a timestamp with the given
184/// multiplier. Returns an [`DataFusionError::Execution`] when the converted
185/// value would overflow the timestamp range.
186pub fn ensure_timestamp_in_bounds(
187    value: i64,
188    multiplier: i64,
189    source_type: &DataType,
190    target_type: &DataType,
191) -> Result<()> {
192    if multiplier <= 1 {
193        return Ok(());
194    }
195
196    if value.checked_mul(multiplier).is_none() {
197        let target = format_timestamp_type_for_error(target_type);
198        _exec_err!(
199            "Cannot cast {} value {} to {}: converted value exceeds the representable i64 range",
200            source_type,
201            value,
202            target
203        )
204    } else {
205        Ok(())
206    }
207}
208
209/// Format a `DataType::Timestamp` into a short, stable string used in
210/// user-facing error messages.
211pub(crate) fn format_timestamp_type_for_error(target_type: &DataType) -> String {
212    match target_type {
213        DataType::Timestamp(unit, _) => {
214            let s = match unit {
215                TimeUnit::Second => "s",
216                TimeUnit::Millisecond => "ms",
217                TimeUnit::Microsecond => "us",
218                TimeUnit::Nanosecond => "ns",
219            };
220            format!("Timestamp({s})")
221        }
222        other => format!("{other}"),
223    }
224}
225
226/// A dynamically typed, nullable single value.
227///
228/// While an arrow  [`Array`]) stores one or more values of the same type, in a
229/// single column, a `ScalarValue` stores a single value of a single type, the
230/// equivalent of 1 row and one column.
231///
232/// ```text
233///  ┌────────┐
234///  │ value1 │
235///  │ value2 │                  ┌────────┐
236///  │ value3 │                  │ value2 │
237///  │  ...   │                  └────────┘
238///  │ valueN │
239///  └────────┘
240///
241///    Array                     ScalarValue
242///
243/// stores multiple,             stores a single,
244/// possibly null, values of     possible null, value
245/// the same type
246/// ```
247///
248/// # Performance
249///
250/// In general, performance will be better using arrow [`Array`]s rather than
251/// [`ScalarValue`], as it is far more efficient to process multiple values at
252/// once (vectorized processing).
253///
254/// # Example
255/// ```
256/// # use datafusion_common::ScalarValue;
257/// // Create single scalar value for an Int32 value
258/// let s1 = ScalarValue::Int32(Some(10));
259///
260/// // You can also create values using the From impl:
261/// let s2 = ScalarValue::from(10i32);
262/// assert_eq!(s1, s2);
263/// ```
264///
265/// # Null Handling
266///
267/// `ScalarValue` represents null values in the same way as Arrow. Nulls are
268/// "typed" in the sense that a null value in an [`Int32Array`] is different
269/// from a null value in a [`Float64Array`], and is different from the values in
270/// a [`NullArray`].
271///
272/// ```
273/// # fn main() -> datafusion_common::Result<()> {
274/// # use std::collections::hash_set::Difference;
275/// # use datafusion_common::ScalarValue;
276/// # use arrow::datatypes::DataType;
277/// // You can create a 'null' Int32 value directly:
278/// let s1 = ScalarValue::Int32(None);
279///
280/// // You can also create a null value for a given datatype:
281/// let s2 = ScalarValue::try_from(&DataType::Int32)?;
282/// assert_eq!(s1, s2);
283///
284/// // Note that this is DIFFERENT than a `ScalarValue::Null`
285/// let s3 = ScalarValue::Null;
286/// assert_ne!(s1, s3);
287/// # Ok(())
288/// # }
289/// ```
290///
291/// # Nested Types
292///
293/// `List` / `LargeList` / `FixedSizeList` / `ListView` / `LargeListView` / `Struct` / `Map`
294/// are represented as a single element array of the corresponding type.
295///
296/// ## Example: Creating [`ScalarValue::Struct`] using [`ScalarStructBuilder`]
297/// ```
298/// # use std::sync::Arc;
299/// # use arrow::datatypes::{DataType, Field};
300/// # use datafusion_common::{ScalarValue, scalar::ScalarStructBuilder};
301/// // Build a struct like: {a: 1, b: "foo"}
302/// let field_a = Field::new("a", DataType::Int32, false);
303/// let field_b = Field::new("b", DataType::Utf8, false);
304///
305/// let s1 = ScalarStructBuilder::new()
306///     .with_scalar(field_a, ScalarValue::from(1i32))
307///     .with_scalar(field_b, ScalarValue::from("foo"))
308///     .build();
309/// ```
310///
311/// ## Example: Creating a null [`ScalarValue::Struct`] using [`ScalarStructBuilder`]
312/// ```
313/// # use std::sync::Arc;
314/// # use arrow::datatypes::{DataType, Field};
315/// # use datafusion_common::{ScalarValue, scalar::ScalarStructBuilder};
316/// // Build a struct representing a NULL value
317/// let fields = vec![
318///     Field::new("a", DataType::Int32, false),
319///     Field::new("b", DataType::Utf8, false),
320/// ];
321///
322/// let s1 = ScalarStructBuilder::new_null(fields);
323/// ```
324///
325/// ## Example: Creating [`ScalarValue::Struct`] directly
326/// ```
327/// # use std::sync::Arc;
328/// # use arrow::datatypes::{DataType, Field, Fields};
329/// # use arrow::array::{ArrayRef, Int32Array, StructArray, StringArray};
330/// # use datafusion_common::ScalarValue;
331/// // Build a struct like: {a: 1, b: "foo"}
332/// // Field description
333/// let fields = Fields::from(vec![
334///     Field::new("a", DataType::Int32, false),
335///     Field::new("b", DataType::Utf8, false),
336/// ]);
337/// // one row arrays for each field
338/// let arrays: Vec<ArrayRef> = vec![
339///     Arc::new(Int32Array::from(vec![1])),
340///     Arc::new(StringArray::from(vec!["foo"])),
341/// ];
342/// // no nulls for this array
343/// let nulls = None;
344/// let arr = StructArray::new(fields, arrays, nulls);
345///
346/// // Create a ScalarValue::Struct directly
347/// let s1 = ScalarValue::Struct(Arc::new(arr));
348/// ```
349///
350///
351/// # Further Reading
352/// See [datatypes](https://arrow.apache.org/docs/python/api/datatypes.html) for
353/// details on datatypes and the [format](https://github.com/apache/arrow/blob/master/format/Schema.fbs#L354-L375)
354/// for the definitive reference.
355///
356/// [`NullArray`]: arrow::array::NullArray
357#[derive(Clone)]
358pub enum ScalarValue {
359    /// represents `DataType::Null` (castable to/from any other type)
360    Null,
361    /// true or false value
362    Boolean(Option<bool>),
363    /// 16bit float
364    Float16(Option<f16>),
365    /// 32bit float
366    Float32(Option<f32>),
367    /// 64bit float
368    Float64(Option<f64>),
369    /// 32bit decimal, using the i32 to represent the decimal, precision scale
370    Decimal32(Option<i32>, u8, i8),
371    /// 64bit decimal, using the i64 to represent the decimal, precision scale
372    Decimal64(Option<i64>, u8, i8),
373    /// 128bit decimal, using the i128 to represent the decimal, precision scale
374    Decimal128(Option<i128>, u8, i8),
375    /// 256bit decimal, using the i256 to represent the decimal, precision scale
376    Decimal256(Option<i256>, u8, i8),
377    /// signed 8bit int
378    Int8(Option<i8>),
379    /// signed 16bit int
380    Int16(Option<i16>),
381    /// signed 32bit int
382    Int32(Option<i32>),
383    /// signed 64bit int
384    Int64(Option<i64>),
385    /// unsigned 8bit int
386    UInt8(Option<u8>),
387    /// unsigned 16bit int
388    UInt16(Option<u16>),
389    /// unsigned 32bit int
390    UInt32(Option<u32>),
391    /// unsigned 64bit int
392    UInt64(Option<u64>),
393    /// utf-8 encoded string.
394    Utf8(Option<String>),
395    /// utf-8 encoded string but from view types.
396    Utf8View(Option<String>),
397    /// utf-8 encoded string representing a LargeString's arrow type.
398    LargeUtf8(Option<String>),
399    /// binary
400    Binary(Option<Vec<u8>>),
401    /// binary but from view types.
402    BinaryView(Option<Vec<u8>>),
403    /// fixed size binary
404    FixedSizeBinary(i32, Option<Vec<u8>>),
405    /// large binary
406    LargeBinary(Option<Vec<u8>>),
407    /// Fixed size list scalar.
408    ///
409    /// The array must be a FixedSizeListArray with length 1.
410    FixedSizeList(Arc<FixedSizeListArray>),
411    /// Represents a single element of a [`ListArray`] as an [`ArrayRef`]
412    ///
413    /// The array must be a ListArray with length 1.
414    List(Arc<ListArray>),
415    /// The array must be a LargeListArray with length 1.
416    LargeList(Arc<LargeListArray>),
417    /// Represents a single element of a [`ListViewArray`] as an [`ArrayRef`]
418    ///
419    /// The array must be a ListViewArray with length 1.
420    ListView(Arc<ListViewArray>),
421    /// Represents a single element of a [`LargeListViewArray`] as an [`ArrayRef`]
422    ///
423    /// The array must be a LargeListViewArray with length 1.
424    LargeListView(Arc<LargeListViewArray>),
425    /// Represents a single element [`StructArray`] as an [`ArrayRef`]. See
426    /// [`ScalarValue`] for examples of how to create instances of this type.
427    Struct(Arc<StructArray>),
428    /// Represents a single element [`MapArray`] as an [`ArrayRef`].
429    Map(Arc<MapArray>),
430    /// Date stored as a signed 32bit int days since UNIX epoch 1970-01-01
431    Date32(Option<i32>),
432    /// Date stored as a signed 64bit int milliseconds since UNIX epoch 1970-01-01
433    Date64(Option<i64>),
434    /// Time stored as a signed 32bit int as seconds since midnight
435    Time32Second(Option<i32>),
436    /// Time stored as a signed 32bit int as milliseconds since midnight
437    Time32Millisecond(Option<i32>),
438    /// Time stored as a signed 64bit int as microseconds since midnight
439    Time64Microsecond(Option<i64>),
440    /// Time stored as a signed 64bit int as nanoseconds since midnight
441    Time64Nanosecond(Option<i64>),
442    /// Timestamp Second
443    TimestampSecond(Option<i64>, Option<Arc<str>>),
444    /// Timestamp Milliseconds
445    TimestampMillisecond(Option<i64>, Option<Arc<str>>),
446    /// Timestamp Microseconds
447    TimestampMicrosecond(Option<i64>, Option<Arc<str>>),
448    /// Timestamp Nanoseconds
449    TimestampNanosecond(Option<i64>, Option<Arc<str>>),
450    /// Number of elapsed whole months
451    IntervalYearMonth(Option<i32>),
452    /// Number of elapsed days and milliseconds (no leap seconds)
453    /// stored as 2 contiguous 32-bit signed integers
454    IntervalDayTime(Option<IntervalDayTime>),
455    /// A triple of the number of elapsed months, days, and nanoseconds.
456    /// Months and days are encoded as 32-bit signed integers.
457    /// Nanoseconds is encoded as a 64-bit signed integer (no leap seconds).
458    IntervalMonthDayNano(Option<IntervalMonthDayNano>),
459    /// Duration in seconds
460    DurationSecond(Option<i64>),
461    /// Duration in milliseconds
462    DurationMillisecond(Option<i64>),
463    /// Duration in microseconds
464    DurationMicrosecond(Option<i64>),
465    /// Duration in nanoseconds
466    DurationNanosecond(Option<i64>),
467    /// A nested datatype that can represent slots of differing types. Components:
468    /// `.0`: a tuple of union `type_id` and the single value held by this Scalar
469    /// `.1`: the list of fields, zero-to-one of which will by set in `.0`
470    /// `.2`: the physical storage of the source/destination UnionArray from which this Scalar came
471    Union(Option<(i8, Box<ScalarValue>)>, UnionFields, UnionMode),
472    /// Dictionary type: index type and value
473    Dictionary(Box<DataType>, Box<ScalarValue>),
474    /// (run-ends field, value field, value)
475    RunEndEncoded(FieldRef, FieldRef, Box<ScalarValue>),
476}
477
478impl Hash for Fl<f16> {
479    fn hash<H: Hasher>(&self, state: &mut H) {
480        self.0.to_bits().hash(state);
481    }
482}
483
484// manual implementation of `PartialEq`
485impl PartialEq for ScalarValue {
486    fn eq(&self, other: &Self) -> bool {
487        use ScalarValue::*;
488        // This purposely doesn't have a catch-all "(_, _)" so that
489        // any newly added enum variant will require editing this list
490        // or else face a compile error
491        match (self, other) {
492            (Decimal32(v1, p1, s1), Decimal32(v2, p2, s2)) => {
493                v1.eq(v2) && p1.eq(p2) && s1.eq(s2)
494            }
495            (Decimal32(_, _, _), _) => false,
496            (Decimal64(v1, p1, s1), Decimal64(v2, p2, s2)) => {
497                v1.eq(v2) && p1.eq(p2) && s1.eq(s2)
498            }
499            (Decimal64(_, _, _), _) => false,
500            (Decimal128(v1, p1, s1), Decimal128(v2, p2, s2)) => {
501                v1.eq(v2) && p1.eq(p2) && s1.eq(s2)
502            }
503            (Decimal128(_, _, _), _) => false,
504            (Decimal256(v1, p1, s1), Decimal256(v2, p2, s2)) => {
505                v1.eq(v2) && p1.eq(p2) && s1.eq(s2)
506            }
507            (Decimal256(_, _, _), _) => false,
508            (Boolean(v1), Boolean(v2)) => v1.eq(v2),
509            (Boolean(_), _) => false,
510            (Float32(v1), Float32(v2)) => match (v1, v2) {
511                (Some(f1), Some(f2)) => f1.to_bits() == f2.to_bits(),
512                _ => v1.eq(v2),
513            },
514            (Float16(v1), Float16(v2)) => match (v1, v2) {
515                (Some(f1), Some(f2)) => f1.to_bits() == f2.to_bits(),
516                _ => v1.eq(v2),
517            },
518            (Float32(_), _) => false,
519            (Float16(_), _) => false,
520            (Float64(v1), Float64(v2)) => match (v1, v2) {
521                (Some(f1), Some(f2)) => f1.to_bits() == f2.to_bits(),
522                _ => v1.eq(v2),
523            },
524            (Float64(_), _) => false,
525            (Int8(v1), Int8(v2)) => v1.eq(v2),
526            (Int8(_), _) => false,
527            (Int16(v1), Int16(v2)) => v1.eq(v2),
528            (Int16(_), _) => false,
529            (Int32(v1), Int32(v2)) => v1.eq(v2),
530            (Int32(_), _) => false,
531            (Int64(v1), Int64(v2)) => v1.eq(v2),
532            (Int64(_), _) => false,
533            (UInt8(v1), UInt8(v2)) => v1.eq(v2),
534            (UInt8(_), _) => false,
535            (UInt16(v1), UInt16(v2)) => v1.eq(v2),
536            (UInt16(_), _) => false,
537            (UInt32(v1), UInt32(v2)) => v1.eq(v2),
538            (UInt32(_), _) => false,
539            (UInt64(v1), UInt64(v2)) => v1.eq(v2),
540            (UInt64(_), _) => false,
541            (Utf8(v1), Utf8(v2)) => v1.eq(v2),
542            (Utf8(_), _) => false,
543            (Utf8View(v1), Utf8View(v2)) => v1.eq(v2),
544            (Utf8View(_), _) => false,
545            (LargeUtf8(v1), LargeUtf8(v2)) => v1.eq(v2),
546            (LargeUtf8(_), _) => false,
547            (Binary(v1), Binary(v2)) => v1.eq(v2),
548            (Binary(_), _) => false,
549            (BinaryView(v1), BinaryView(v2)) => v1.eq(v2),
550            (BinaryView(_), _) => false,
551            (FixedSizeBinary(_, v1), FixedSizeBinary(_, v2)) => v1.eq(v2),
552            (FixedSizeBinary(_, _), _) => false,
553            (LargeBinary(v1), LargeBinary(v2)) => v1.eq(v2),
554            (LargeBinary(_), _) => false,
555            (FixedSizeList(v1), FixedSizeList(v2)) => v1.eq(v2),
556            (FixedSizeList(_), _) => false,
557            (List(v1), List(v2)) => v1.eq(v2),
558            (List(_), _) => false,
559            (LargeList(v1), LargeList(v2)) => v1.eq(v2),
560            (LargeList(_), _) => false,
561            (ListView(v1), ListView(v2)) => v1.eq(v2),
562            (ListView(_), _) => false,
563            (LargeListView(v1), LargeListView(v2)) => v1.eq(v2),
564            (LargeListView(_), _) => false,
565            (Struct(v1), Struct(v2)) => v1.eq(v2),
566            (Struct(_), _) => false,
567            (Map(v1), Map(v2)) => v1.eq(v2),
568            (Map(_), _) => false,
569            (Date32(v1), Date32(v2)) => v1.eq(v2),
570            (Date32(_), _) => false,
571            (Date64(v1), Date64(v2)) => v1.eq(v2),
572            (Date64(_), _) => false,
573            (Time32Second(v1), Time32Second(v2)) => v1.eq(v2),
574            (Time32Second(_), _) => false,
575            (Time32Millisecond(v1), Time32Millisecond(v2)) => v1.eq(v2),
576            (Time32Millisecond(_), _) => false,
577            (Time64Microsecond(v1), Time64Microsecond(v2)) => v1.eq(v2),
578            (Time64Microsecond(_), _) => false,
579            (Time64Nanosecond(v1), Time64Nanosecond(v2)) => v1.eq(v2),
580            (Time64Nanosecond(_), _) => false,
581            (TimestampSecond(v1, _), TimestampSecond(v2, _)) => v1.eq(v2),
582            (TimestampSecond(_, _), _) => false,
583            (TimestampMillisecond(v1, _), TimestampMillisecond(v2, _)) => v1.eq(v2),
584            (TimestampMillisecond(_, _), _) => false,
585            (TimestampMicrosecond(v1, _), TimestampMicrosecond(v2, _)) => v1.eq(v2),
586            (TimestampMicrosecond(_, _), _) => false,
587            (TimestampNanosecond(v1, _), TimestampNanosecond(v2, _)) => v1.eq(v2),
588            (TimestampNanosecond(_, _), _) => false,
589            (DurationSecond(v1), DurationSecond(v2)) => v1.eq(v2),
590            (DurationSecond(_), _) => false,
591            (DurationMillisecond(v1), DurationMillisecond(v2)) => v1.eq(v2),
592            (DurationMillisecond(_), _) => false,
593            (DurationMicrosecond(v1), DurationMicrosecond(v2)) => v1.eq(v2),
594            (DurationMicrosecond(_), _) => false,
595            (DurationNanosecond(v1), DurationNanosecond(v2)) => v1.eq(v2),
596            (DurationNanosecond(_), _) => false,
597            (IntervalYearMonth(v1), IntervalYearMonth(v2)) => v1.eq(v2),
598            (IntervalYearMonth(_), _) => false,
599            (IntervalDayTime(v1), IntervalDayTime(v2)) => v1.eq(v2),
600            (IntervalDayTime(_), _) => false,
601            (IntervalMonthDayNano(v1), IntervalMonthDayNano(v2)) => v1.eq(v2),
602            (IntervalMonthDayNano(_), _) => false,
603            (Union(val1, fields1, mode1), Union(val2, fields2, mode2)) => {
604                val1.eq(val2) && fields1.eq(fields2) && mode1.eq(mode2)
605            }
606            (Union(_, _, _), _) => false,
607            (Dictionary(k1, v1), Dictionary(k2, v2)) => k1.eq(k2) && v1.eq(v2),
608            (Dictionary(_, _), _) => false,
609            (RunEndEncoded(rf1, vf1, v1), RunEndEncoded(rf2, vf2, v2)) => {
610                rf1.eq(rf2) && vf1.eq(vf2) && v1.eq(v2)
611            }
612            (RunEndEncoded(_, _, _), _) => false,
613            (Null, Null) => true,
614            (Null, _) => false,
615        }
616    }
617}
618
619// manual implementation of `PartialOrd`
620impl PartialOrd for ScalarValue {
621    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
622        use ScalarValue::*;
623        // This purposely doesn't have a catch-all "(_, _)" so that
624        // any newly added enum variant will require editing this list
625        // or else face a compile error
626        match (self, other) {
627            (Decimal32(v1, _, s1), Decimal32(v2, _, s2)) => {
628                if s1.eq(s2) {
629                    // Same scale means the underlying integer values share
630                    // a common interpretation regardless of declared
631                    // precision (arithmetic such as `add_checked` widens
632                    // precision by 1 but does not change the numeric
633                    // meaning).
634                    v1.partial_cmp(v2)
635                } else {
636                    None
637                }
638            }
639            (Decimal32(_, _, _), _) => None,
640            (Decimal64(v1, _, s1), Decimal64(v2, _, s2)) => {
641                if s1.eq(s2) {
642                    v1.partial_cmp(v2)
643                } else {
644                    None
645                }
646            }
647            (Decimal64(_, _, _), _) => None,
648            (Decimal128(v1, _, s1), Decimal128(v2, _, s2)) => {
649                if s1.eq(s2) {
650                    v1.partial_cmp(v2)
651                } else {
652                    None
653                }
654            }
655            (Decimal128(_, _, _), _) => None,
656            (Decimal256(v1, _, s1), Decimal256(v2, _, s2)) => {
657                if s1.eq(s2) {
658                    v1.partial_cmp(v2)
659                } else {
660                    None
661                }
662            }
663            (Decimal256(_, _, _), _) => None,
664            (Boolean(v1), Boolean(v2)) => v1.partial_cmp(v2),
665            (Boolean(_), _) => None,
666            (Float32(v1), Float32(v2)) => match (v1, v2) {
667                (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)),
668                _ => v1.partial_cmp(v2),
669            },
670            (Float16(v1), Float16(v2)) => match (v1, v2) {
671                (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)),
672                _ => v1.partial_cmp(v2),
673            },
674            (Float32(_), _) => None,
675            (Float16(_), _) => None,
676            (Float64(v1), Float64(v2)) => match (v1, v2) {
677                (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)),
678                _ => v1.partial_cmp(v2),
679            },
680            (Float64(_), _) => None,
681            (Int8(v1), Int8(v2)) => v1.partial_cmp(v2),
682            (Int8(_), _) => None,
683            (Int16(v1), Int16(v2)) => v1.partial_cmp(v2),
684            (Int16(_), _) => None,
685            (Int32(v1), Int32(v2)) => v1.partial_cmp(v2),
686            (Int32(_), _) => None,
687            (Int64(v1), Int64(v2)) => v1.partial_cmp(v2),
688            (Int64(_), _) => None,
689            (UInt8(v1), UInt8(v2)) => v1.partial_cmp(v2),
690            (UInt8(_), _) => None,
691            (UInt16(v1), UInt16(v2)) => v1.partial_cmp(v2),
692            (UInt16(_), _) => None,
693            (UInt32(v1), UInt32(v2)) => v1.partial_cmp(v2),
694            (UInt32(_), _) => None,
695            (UInt64(v1), UInt64(v2)) => v1.partial_cmp(v2),
696            (UInt64(_), _) => None,
697            (Utf8(v1), Utf8(v2)) => v1.partial_cmp(v2),
698            (Utf8(_), _) => None,
699            (LargeUtf8(v1), LargeUtf8(v2)) => v1.partial_cmp(v2),
700            (LargeUtf8(_), _) => None,
701            (Utf8View(v1), Utf8View(v2)) => v1.partial_cmp(v2),
702            (Utf8View(_), _) => None,
703            (Binary(v1), Binary(v2)) => v1.partial_cmp(v2),
704            (Binary(_), _) => None,
705            (BinaryView(v1), BinaryView(v2)) => v1.partial_cmp(v2),
706            (BinaryView(_), _) => None,
707            (FixedSizeBinary(_, v1), FixedSizeBinary(_, v2)) => v1.partial_cmp(v2),
708            (FixedSizeBinary(_, _), _) => None,
709            (LargeBinary(v1), LargeBinary(v2)) => v1.partial_cmp(v2),
710            (LargeBinary(_), _) => None,
711            // ScalarValue::List / ScalarValue::FixedSizeList / ScalarValue::LargeList / ScalarValue::ListView / ScalarValue::LargeListView
712            // are guaranteed to have length 1
713            (List(arr1), List(arr2)) => partial_cmp_list(arr1.as_ref(), arr2.as_ref()),
714            (FixedSizeList(arr1), FixedSizeList(arr2)) => {
715                partial_cmp_list(arr1.as_ref(), arr2.as_ref())
716            }
717            (LargeList(arr1), LargeList(arr2)) => {
718                partial_cmp_list(arr1.as_ref(), arr2.as_ref())
719            }
720            (ListView(arr1), ListView(arr2)) => {
721                partial_cmp_list(arr1.as_ref(), arr2.as_ref())
722            }
723            (LargeListView(arr1), LargeListView(arr2)) => {
724                partial_cmp_list(arr1.as_ref(), arr2.as_ref())
725            }
726            (List(_), _)
727            | (LargeList(_), _)
728            | (FixedSizeList(_), _)
729            | (ListView(_), _)
730            | (LargeListView(_), _) => None,
731            (Struct(struct_arr1), Struct(struct_arr2)) => {
732                partial_cmp_struct(struct_arr1.as_ref(), struct_arr2.as_ref())
733            }
734            (Struct(_), _) => None,
735            (Map(map_arr1), Map(map_arr2)) => partial_cmp_map(map_arr1, map_arr2),
736            (Map(_), _) => None,
737            (Date32(v1), Date32(v2)) => v1.partial_cmp(v2),
738            (Date32(_), _) => None,
739            (Date64(v1), Date64(v2)) => v1.partial_cmp(v2),
740            (Date64(_), _) => None,
741            (Time32Second(v1), Time32Second(v2)) => v1.partial_cmp(v2),
742            (Time32Second(_), _) => None,
743            (Time32Millisecond(v1), Time32Millisecond(v2)) => v1.partial_cmp(v2),
744            (Time32Millisecond(_), _) => None,
745            (Time64Microsecond(v1), Time64Microsecond(v2)) => v1.partial_cmp(v2),
746            (Time64Microsecond(_), _) => None,
747            (Time64Nanosecond(v1), Time64Nanosecond(v2)) => v1.partial_cmp(v2),
748            (Time64Nanosecond(_), _) => None,
749            (TimestampSecond(v1, _), TimestampSecond(v2, _)) => v1.partial_cmp(v2),
750            (TimestampSecond(_, _), _) => None,
751            (TimestampMillisecond(v1, _), TimestampMillisecond(v2, _)) => {
752                v1.partial_cmp(v2)
753            }
754            (TimestampMillisecond(_, _), _) => None,
755            (TimestampMicrosecond(v1, _), TimestampMicrosecond(v2, _)) => {
756                v1.partial_cmp(v2)
757            }
758            (TimestampMicrosecond(_, _), _) => None,
759            (TimestampNanosecond(v1, _), TimestampNanosecond(v2, _)) => {
760                v1.partial_cmp(v2)
761            }
762            (TimestampNanosecond(_, _), _) => None,
763            (IntervalYearMonth(v1), IntervalYearMonth(v2)) => v1.partial_cmp(v2),
764            (IntervalYearMonth(_), _) => None,
765            (IntervalDayTime(v1), IntervalDayTime(v2)) => v1.partial_cmp(v2),
766            (IntervalDayTime(_), _) => None,
767            (IntervalMonthDayNano(v1), IntervalMonthDayNano(v2)) => v1.partial_cmp(v2),
768            (IntervalMonthDayNano(_), _) => None,
769            (DurationSecond(v1), DurationSecond(v2)) => v1.partial_cmp(v2),
770            (DurationSecond(_), _) => None,
771            (DurationMillisecond(v1), DurationMillisecond(v2)) => v1.partial_cmp(v2),
772            (DurationMillisecond(_), _) => None,
773            (DurationMicrosecond(v1), DurationMicrosecond(v2)) => v1.partial_cmp(v2),
774            (DurationMicrosecond(_), _) => None,
775            (DurationNanosecond(v1), DurationNanosecond(v2)) => v1.partial_cmp(v2),
776            (DurationNanosecond(_), _) => None,
777            (Union(v1, t1, m1), Union(v2, t2, m2)) => {
778                if t1.eq(t2) && m1.eq(m2) {
779                    v1.partial_cmp(v2)
780                } else {
781                    None
782                }
783            }
784            (Union(_, _, _), _) => None,
785            (Dictionary(k1, v1), Dictionary(k2, v2)) => {
786                // Don't compare if the key types don't match (it is effectively a different datatype)
787                if k1 == k2 { v1.partial_cmp(v2) } else { None }
788            }
789            (Dictionary(_, _), _) => None,
790            (RunEndEncoded(rf1, vf1, v1), RunEndEncoded(rf2, vf2, v2)) => {
791                // Don't compare if the run ends fields don't match (it is effectively a different datatype)
792                if rf1 == rf2 && vf1 == vf2 {
793                    v1.partial_cmp(v2)
794                } else {
795                    None
796                }
797            }
798            (RunEndEncoded(_, _, _), _) => None,
799            (Null, Null) => Some(Ordering::Equal),
800            (Null, _) => None,
801        }
802    }
803}
804
805/// List/LargeList/FixedSizeList/ListView/LargeListView scalars always have a single element
806/// array. This function returns that array
807fn first_array_for_list(arr: &dyn Array) -> ArrayRef {
808    assert_eq!(arr.len(), 1);
809    if let Some(arr) = arr.as_list_opt::<i32>() {
810        arr.value(0)
811    } else if let Some(arr) = arr.as_list_opt::<i64>() {
812        arr.value(0)
813    } else if let Some(arr) = arr.as_fixed_size_list_opt() {
814        arr.value(0)
815    } else if let Some(arr) = arr.as_list_view_opt::<i32>() {
816        arr.value(0)
817    } else if let Some(arr) = arr.as_list_view_opt::<i64>() {
818        arr.value(0)
819    } else {
820        unreachable!(
821            "Since only List / LargeList / FixedSizeList / ListView / LargeListView are supported, this should never happen"
822        )
823    }
824}
825
826/// Compares two List/LargeList/FixedSizeList/ListView/LargeListView scalars
827fn partial_cmp_list(arr1: &dyn Array, arr2: &dyn Array) -> Option<Ordering> {
828    if arr1.data_type() != arr2.data_type() {
829        return None;
830    }
831    let arr1 = first_array_for_list(arr1);
832    let arr2 = first_array_for_list(arr2);
833
834    let min_length = arr1.len().min(arr2.len());
835    let arr1_trimmed = arr1.slice(0, min_length);
836    let arr2_trimmed = arr2.slice(0, min_length);
837
838    let lt_res = arrow::compute::kernels::cmp::lt(&arr1_trimmed, &arr2_trimmed).ok()?;
839    let eq_res = arrow::compute::kernels::cmp::eq(&arr1_trimmed, &arr2_trimmed).ok()?;
840
841    for j in 0..lt_res.len() {
842        // In Postgres, NULL values in lists are always considered to be greater than non-NULL values:
843        //
844        // $ SELECT ARRAY[NULL]::integer[] > ARRAY[1]
845        // true
846        //
847        // These next two if statements are introduced for replicating Postgres behavior, as
848        // arrow::compute does not account for this.
849        if arr1_trimmed.is_null(j) && !arr2_trimmed.is_null(j) {
850            return Some(Ordering::Greater);
851        }
852        if !arr1_trimmed.is_null(j) && arr2_trimmed.is_null(j) {
853            return Some(Ordering::Less);
854        }
855
856        if lt_res.is_valid(j) && lt_res.value(j) {
857            return Some(Ordering::Less);
858        }
859        if eq_res.is_valid(j) && !eq_res.value(j) {
860            return Some(Ordering::Greater);
861        }
862    }
863
864    Some(arr1.len().cmp(&arr2.len()))
865}
866
867fn flatten<'a>(array: &'a StructArray, columns: &mut Vec<&'a ArrayRef>) {
868    for i in 0..array.num_columns() {
869        let column = array.column(i);
870        if let Some(nested_struct) = column.as_any().downcast_ref::<StructArray>() {
871            // If it's a nested struct, recursively expand
872            flatten(nested_struct, columns);
873        } else {
874            // If it's a primitive type, add directly
875            columns.push(column);
876        }
877    }
878}
879
880pub fn partial_cmp_struct(s1: &StructArray, s2: &StructArray) -> Option<Ordering> {
881    if s1.len() != s2.len() {
882        return None;
883    }
884
885    if s1.data_type() != s2.data_type() {
886        return None;
887    }
888
889    let mut expanded_columns1 = Vec::with_capacity(s1.num_columns());
890    let mut expanded_columns2 = Vec::with_capacity(s2.num_columns());
891
892    flatten(s1, &mut expanded_columns1);
893    flatten(s2, &mut expanded_columns2);
894
895    for col_index in 0..expanded_columns1.len() {
896        let arr1 = expanded_columns1[col_index];
897        let arr2 = expanded_columns2[col_index];
898
899        let lt_res = arrow::compute::kernels::cmp::lt(arr1, arr2).ok()?;
900        let eq_res = arrow::compute::kernels::cmp::eq(arr1, arr2).ok()?;
901
902        for j in 0..lt_res.len() {
903            if lt_res.is_valid(j) && lt_res.value(j) {
904                return Some(Ordering::Less);
905            }
906            if eq_res.is_valid(j) && !eq_res.value(j) {
907                return Some(Ordering::Greater);
908            }
909        }
910    }
911    Some(Ordering::Equal)
912}
913
914fn partial_cmp_map(m1: &Arc<MapArray>, m2: &Arc<MapArray>) -> Option<Ordering> {
915    if m1.len() != m2.len() {
916        return None;
917    }
918
919    if m1.data_type() != m2.data_type() {
920        return None;
921    }
922
923    for col_index in 0..m1.len() {
924        let arr1 = m1.entries().column(col_index);
925        let arr2 = m2.entries().column(col_index);
926
927        let lt_res = arrow::compute::kernels::cmp::lt(arr1, arr2).ok()?;
928        let eq_res = arrow::compute::kernels::cmp::eq(arr1, arr2).ok()?;
929
930        for j in 0..lt_res.len() {
931            if lt_res.is_valid(j) && lt_res.value(j) {
932                return Some(Ordering::Less);
933            }
934            if eq_res.is_valid(j) && !eq_res.value(j) {
935                return Some(Ordering::Greater);
936            }
937        }
938    }
939    Some(Ordering::Equal)
940}
941
942impl Eq for ScalarValue {}
943
944//Float wrapper over f32/f64. Just because we cannot build std::hash::Hash for floats directly we have to do it through type wrapper
945struct Fl<T>(T);
946
947macro_rules! hash_float_value {
948    ($(($t:ty, $i:ty)),+) => {
949        $(impl std::hash::Hash for Fl<$t> {
950            #[inline]
951            fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
952                state.write(&<$i>::from_ne_bytes(self.0.to_ne_bytes()).to_ne_bytes())
953            }
954        })+
955    };
956}
957
958hash_float_value!((f64, u64), (f32, u32));
959
960// manual implementation of `Hash`
961//
962// # Panics
963//
964// Panics if there is an error when creating hash values for rows
965impl Hash for ScalarValue {
966    fn hash<H: Hasher>(&self, state: &mut H) {
967        use ScalarValue::*;
968        match self {
969            Decimal32(v, p, s) => {
970                v.hash(state);
971                p.hash(state);
972                s.hash(state)
973            }
974            Decimal64(v, p, s) => {
975                v.hash(state);
976                p.hash(state);
977                s.hash(state)
978            }
979            Decimal128(v, p, s) => {
980                v.hash(state);
981                p.hash(state);
982                s.hash(state)
983            }
984            Decimal256(v, p, s) => {
985                v.hash(state);
986                p.hash(state);
987                s.hash(state)
988            }
989            Boolean(v) => v.hash(state),
990            Float16(v) => v.map(Fl).hash(state),
991            Float32(v) => v.map(Fl).hash(state),
992            Float64(v) => v.map(Fl).hash(state),
993            Int8(v) => v.hash(state),
994            Int16(v) => v.hash(state),
995            Int32(v) => v.hash(state),
996            Int64(v) => v.hash(state),
997            UInt8(v) => v.hash(state),
998            UInt16(v) => v.hash(state),
999            UInt32(v) => v.hash(state),
1000            UInt64(v) => v.hash(state),
1001            Utf8(v) | LargeUtf8(v) | Utf8View(v) => v.hash(state),
1002            Binary(v) | FixedSizeBinary(_, v) | LargeBinary(v) | BinaryView(v) => {
1003                v.hash(state)
1004            }
1005            List(arr) => {
1006                hash_nested_array(arr.to_owned() as ArrayRef, state);
1007            }
1008            LargeList(arr) => {
1009                hash_nested_array(arr.to_owned() as ArrayRef, state);
1010            }
1011            FixedSizeList(arr) => {
1012                hash_nested_array(arr.to_owned() as ArrayRef, state);
1013            }
1014            ListView(arr) => {
1015                hash_nested_array(arr.to_owned() as ArrayRef, state);
1016            }
1017            LargeListView(arr) => {
1018                hash_nested_array(arr.to_owned() as ArrayRef, state);
1019            }
1020            Struct(arr) => {
1021                hash_nested_array(arr.to_owned() as ArrayRef, state);
1022            }
1023            Map(arr) => {
1024                hash_nested_array(arr.to_owned() as ArrayRef, state);
1025            }
1026            Date32(v) => v.hash(state),
1027            Date64(v) => v.hash(state),
1028            Time32Second(v) => v.hash(state),
1029            Time32Millisecond(v) => v.hash(state),
1030            Time64Microsecond(v) => v.hash(state),
1031            Time64Nanosecond(v) => v.hash(state),
1032            TimestampSecond(v, _) => v.hash(state),
1033            TimestampMillisecond(v, _) => v.hash(state),
1034            TimestampMicrosecond(v, _) => v.hash(state),
1035            TimestampNanosecond(v, _) => v.hash(state),
1036            DurationSecond(v) => v.hash(state),
1037            DurationMillisecond(v) => v.hash(state),
1038            DurationMicrosecond(v) => v.hash(state),
1039            DurationNanosecond(v) => v.hash(state),
1040            IntervalYearMonth(v) => v.hash(state),
1041            IntervalDayTime(v) => v.hash(state),
1042            IntervalMonthDayNano(v) => v.hash(state),
1043            Union(v, t, m) => {
1044                v.hash(state);
1045                t.hash(state);
1046                m.hash(state);
1047            }
1048            Dictionary(k, v) => {
1049                k.hash(state);
1050                v.hash(state);
1051            }
1052            RunEndEncoded(rf, vf, v) => {
1053                rf.hash(state);
1054                vf.hash(state);
1055                v.hash(state);
1056            }
1057            // stable hash for Null value
1058            Null => 1.hash(state),
1059        }
1060    }
1061}
1062
1063fn hash_nested_array<H: Hasher>(arr: ArrayRef, state: &mut H) {
1064    let len = arr.len();
1065    let hashes_buffer = &mut vec![0; len];
1066    let random_state = crate::hash_utils::RandomState::with_seed(0);
1067    let hashes = create_hashes(&[arr], &random_state, hashes_buffer)
1068        .expect("hash_nested_array: failed to create row hashes");
1069    // Hash back to std::hash::Hasher
1070    hashes.hash(state);
1071}
1072
1073/// Return a reference to the values array and the index into it for a
1074/// dictionary array
1075///
1076/// # Errors
1077///
1078/// Errors if the array cannot be downcasted to DictionaryArray
1079#[inline]
1080pub fn get_dict_value<K: ArrowDictionaryKeyType>(
1081    array: &dyn Array,
1082    index: usize,
1083) -> Result<(&ArrayRef, Option<usize>)> {
1084    let dict_array = as_dictionary_array::<K>(array)?;
1085    Ok((dict_array.values(), dict_array.key(index)))
1086}
1087
1088/// Create a dictionary array representing `value` repeated `size`
1089/// times
1090fn dict_from_scalar<K: ArrowDictionaryKeyType>(
1091    value: &ScalarValue,
1092    size: usize,
1093) -> Result<ArrayRef> {
1094    // values array is one element long (the value)
1095    let values_array = value.to_array_of_size(1)?;
1096
1097    // Create a key array with `size` elements, each of 0
1098    // Use cache to avoid repeated allocations for the same size
1099    let key_array: PrimitiveArray<K> =
1100        get_or_create_cached_key_array::<K>(size, value.is_null());
1101
1102    // create a new DictionaryArray
1103    //
1104    // Note: this path could be made faster by using the ArrayData
1105    // APIs and skipping validation, if it every comes up in
1106    // performance traces.
1107    Ok(Arc::new(
1108        DictionaryArray::<K>::try_new(key_array, values_array)?, // should always be valid by construction above
1109    ))
1110}
1111
1112/// Create a `DictionaryArray` from the provided values array.
1113///
1114/// Each element gets a unique key (`0..N-1`), without deduplication.
1115/// Useful for wrapping arrays in dictionary form.
1116///
1117/// # Input
1118/// ["alice", "bob", "alice", null, "carol"]
1119///
1120/// # Output
1121/// `DictionaryArray<Int32>`
1122/// {
1123///   keys:   [0, 1, 2, 3, 4],
1124///   values: ["alice", "bob", "alice", null, "carol"]
1125/// }
1126pub fn dict_from_values<K: ArrowDictionaryKeyType>(
1127    values_array: ArrayRef,
1128) -> Result<ArrayRef> {
1129    // Create a key array with `size` elements of 0..array_len for all
1130    // non-null value elements
1131    let key_array: PrimitiveArray<K> = (0..values_array.len())
1132        .map(|index| {
1133            if values_array.is_valid(index) {
1134                let native_index = K::Native::from_usize(index).ok_or_else(|| {
1135                    _internal_datafusion_err!(
1136                        "Can not create index of type {} from value {index}",
1137                        K::DATA_TYPE
1138                    )
1139                })?;
1140                Ok(Some(native_index))
1141            } else {
1142                Ok(None)
1143            }
1144        })
1145        .collect::<Result<Vec<_>>>()?
1146        .into_iter()
1147        .collect();
1148
1149    // create a new DictionaryArray
1150    //
1151    // Note: this path could be made faster by using the ArrayData
1152    // APIs and skipping validation, if it every comes up in
1153    // performance traces.
1154    let dict_array = DictionaryArray::<K>::try_new(key_array, values_array)?;
1155    Ok(Arc::new(dict_array))
1156}
1157
1158macro_rules! typed_cast_tz {
1159    ($array:expr, $index:expr, $array_cast:ident, $SCALAR:ident, $TZ:expr) => {{
1160        let array = $array_cast($array)?;
1161        Ok::<ScalarValue, DataFusionError>(ScalarValue::$SCALAR(
1162            match array.is_null($index) {
1163                true => None,
1164                false => Some(array.value($index).into()),
1165            },
1166            $TZ.clone(),
1167        ))
1168    }};
1169}
1170
1171macro_rules! typed_cast {
1172    ($array:expr, $index:expr, $array_cast:ident, $SCALAR:ident) => {{
1173        let array = $array_cast($array)?;
1174        Ok::<ScalarValue, DataFusionError>(ScalarValue::$SCALAR(
1175            match array.is_null($index) {
1176                true => None,
1177                false => Some(array.value($index).into()),
1178            },
1179        ))
1180    }};
1181}
1182
1183macro_rules! build_array_from_option {
1184    ($DATA_TYPE:ident, $ARRAY_TYPE:ident, $EXPR:expr, $SIZE:expr) => {{
1185        match $EXPR {
1186            Some(value) => Arc::new($ARRAY_TYPE::from_value(*value, $SIZE)),
1187            None => new_null_array(&DataType::$DATA_TYPE, $SIZE),
1188        }
1189    }};
1190    ($DATA_TYPE:ident, $ENUM:expr, $ARRAY_TYPE:ident, $EXPR:expr, $SIZE:expr) => {{
1191        match $EXPR {
1192            Some(value) => Arc::new($ARRAY_TYPE::from_value(*value, $SIZE)),
1193            None => new_null_array(&DataType::$DATA_TYPE($ENUM), $SIZE),
1194        }
1195    }};
1196}
1197
1198macro_rules! build_timestamp_array_from_option {
1199    ($TIME_UNIT:expr, $TZ:expr, $ARRAY_TYPE:ident, $EXPR:expr, $SIZE:expr) => {
1200        match $EXPR {
1201            Some(value) => {
1202                Arc::new($ARRAY_TYPE::from_value(*value, $SIZE).with_timezone_opt($TZ))
1203            }
1204            None => new_null_array(&DataType::Timestamp($TIME_UNIT, $TZ), $SIZE),
1205        }
1206    };
1207}
1208
1209macro_rules! eq_array_primitive {
1210    ($array:expr, $index:expr, $array_cast:ident, $VALUE:expr) => {{
1211        let array = $array_cast($array)?;
1212        let is_valid = array.is_valid($index);
1213        Ok::<bool, DataFusionError>(match $VALUE {
1214            Some(val) => is_valid && &array.value($index) == val,
1215            None => !is_valid,
1216        })
1217    }};
1218}
1219
1220impl ScalarValue {
1221    /// Create a [`Result<ScalarValue>`] with the provided value and datatype
1222    ///
1223    /// # Panics
1224    ///
1225    /// Panics if d is not compatible with T
1226    pub fn new_primitive<T: ArrowPrimitiveType>(
1227        a: Option<T::Native>,
1228        d: &DataType,
1229    ) -> Result<Self> {
1230        match a {
1231            None => d.try_into(),
1232            Some(v) => {
1233                let array = PrimitiveArray::<T>::new(vec![v].into(), None)
1234                    .with_data_type(d.clone());
1235                Self::try_from_array(&array, 0)
1236            }
1237        }
1238    }
1239
1240    /// Create a decimal Scalar from value/precision and scale.
1241    pub fn try_new_decimal128(value: i128, precision: u8, scale: i8) -> Result<Self> {
1242        Self::validate_decimal_or_internal_err::<Decimal128Type>(precision, scale)?;
1243        Ok(ScalarValue::Decimal128(Some(value), precision, scale))
1244    }
1245
1246    /// Create a Null instance of ScalarValue for this datatype
1247    ///
1248    /// Example
1249    /// ```
1250    /// use arrow::datatypes::DataType;
1251    /// use datafusion_common::ScalarValue;
1252    ///
1253    /// let scalar = ScalarValue::try_new_null(&DataType::Int32).unwrap();
1254    /// assert_eq!(scalar.is_null(), true);
1255    /// assert_eq!(scalar.data_type(), DataType::Int32);
1256    /// ```
1257    pub fn try_new_null(data_type: &DataType) -> Result<Self> {
1258        Ok(match data_type {
1259            DataType::Boolean => ScalarValue::Boolean(None),
1260            DataType::Float16 => ScalarValue::Float16(None),
1261            DataType::Float64 => ScalarValue::Float64(None),
1262            DataType::Float32 => ScalarValue::Float32(None),
1263            DataType::Int8 => ScalarValue::Int8(None),
1264            DataType::Int16 => ScalarValue::Int16(None),
1265            DataType::Int32 => ScalarValue::Int32(None),
1266            DataType::Int64 => ScalarValue::Int64(None),
1267            DataType::UInt8 => ScalarValue::UInt8(None),
1268            DataType::UInt16 => ScalarValue::UInt16(None),
1269            DataType::UInt32 => ScalarValue::UInt32(None),
1270            DataType::UInt64 => ScalarValue::UInt64(None),
1271            DataType::Decimal32(precision, scale) => {
1272                ScalarValue::Decimal32(None, *precision, *scale)
1273            }
1274            DataType::Decimal64(precision, scale) => {
1275                ScalarValue::Decimal64(None, *precision, *scale)
1276            }
1277            DataType::Decimal128(precision, scale) => {
1278                ScalarValue::Decimal128(None, *precision, *scale)
1279            }
1280            DataType::Decimal256(precision, scale) => {
1281                ScalarValue::Decimal256(None, *precision, *scale)
1282            }
1283            DataType::Utf8 => ScalarValue::Utf8(None),
1284            DataType::LargeUtf8 => ScalarValue::LargeUtf8(None),
1285            DataType::Utf8View => ScalarValue::Utf8View(None),
1286            DataType::Binary => ScalarValue::Binary(None),
1287            DataType::BinaryView => ScalarValue::BinaryView(None),
1288            DataType::FixedSizeBinary(len) => ScalarValue::FixedSizeBinary(*len, None),
1289            DataType::LargeBinary => ScalarValue::LargeBinary(None),
1290            DataType::Date32 => ScalarValue::Date32(None),
1291            DataType::Date64 => ScalarValue::Date64(None),
1292            DataType::Time32(TimeUnit::Second) => ScalarValue::Time32Second(None),
1293            DataType::Time32(TimeUnit::Millisecond) => {
1294                ScalarValue::Time32Millisecond(None)
1295            }
1296            DataType::Time64(TimeUnit::Microsecond) => {
1297                ScalarValue::Time64Microsecond(None)
1298            }
1299            DataType::Time64(TimeUnit::Nanosecond) => ScalarValue::Time64Nanosecond(None),
1300            DataType::Timestamp(TimeUnit::Second, tz_opt) => {
1301                ScalarValue::TimestampSecond(None, tz_opt.clone())
1302            }
1303            DataType::Timestamp(TimeUnit::Millisecond, tz_opt) => {
1304                ScalarValue::TimestampMillisecond(None, tz_opt.clone())
1305            }
1306            DataType::Timestamp(TimeUnit::Microsecond, tz_opt) => {
1307                ScalarValue::TimestampMicrosecond(None, tz_opt.clone())
1308            }
1309            DataType::Timestamp(TimeUnit::Nanosecond, tz_opt) => {
1310                ScalarValue::TimestampNanosecond(None, tz_opt.clone())
1311            }
1312            DataType::Interval(IntervalUnit::YearMonth) => {
1313                ScalarValue::IntervalYearMonth(None)
1314            }
1315            DataType::Interval(IntervalUnit::DayTime) => {
1316                ScalarValue::IntervalDayTime(None)
1317            }
1318            DataType::Interval(IntervalUnit::MonthDayNano) => {
1319                ScalarValue::IntervalMonthDayNano(None)
1320            }
1321            DataType::Duration(TimeUnit::Second) => ScalarValue::DurationSecond(None),
1322            DataType::Duration(TimeUnit::Millisecond) => {
1323                ScalarValue::DurationMillisecond(None)
1324            }
1325            DataType::Duration(TimeUnit::Microsecond) => {
1326                ScalarValue::DurationMicrosecond(None)
1327            }
1328            DataType::Duration(TimeUnit::Nanosecond) => {
1329                ScalarValue::DurationNanosecond(None)
1330            }
1331            DataType::Dictionary(index_type, value_type) => ScalarValue::Dictionary(
1332                index_type.clone(),
1333                Box::new(value_type.as_ref().try_into()?),
1334            ),
1335            DataType::RunEndEncoded(run_ends_field, value_field) => {
1336                ScalarValue::RunEndEncoded(
1337                    Arc::clone(run_ends_field),
1338                    Arc::clone(value_field),
1339                    Box::new(value_field.data_type().try_into()?),
1340                )
1341            }
1342            // `ScalarValue::List` contains single element `ListArray`.
1343            DataType::List(field_ref) => ScalarValue::List(Arc::new(
1344                GenericListArray::new_null(Arc::clone(field_ref), 1),
1345            )),
1346            // `ScalarValue::LargeList` contains single element `LargeListArray`.
1347            DataType::LargeList(field_ref) => ScalarValue::LargeList(Arc::new(
1348                GenericListArray::new_null(Arc::clone(field_ref), 1),
1349            )),
1350            // `ScalarValue::FixedSizeList` contains single element `FixedSizeList`.
1351            DataType::FixedSizeList(field_ref, fixed_length) => {
1352                ScalarValue::FixedSizeList(Arc::new(FixedSizeListArray::new_null(
1353                    Arc::clone(field_ref),
1354                    *fixed_length,
1355                    1,
1356                )))
1357            }
1358            DataType::ListView(field_ref) => ScalarValue::ListView(Arc::new(
1359                GenericListViewArray::new_null(Arc::clone(field_ref), 1),
1360            )),
1361            DataType::LargeListView(field_ref) => ScalarValue::LargeListView(Arc::new(
1362                GenericListViewArray::new_null(Arc::clone(field_ref), 1),
1363            )),
1364            DataType::Struct(fields) => ScalarValue::Struct(
1365                new_null_array(&DataType::Struct(fields.to_owned()), 1)
1366                    .as_struct()
1367                    .to_owned()
1368                    .into(),
1369            ),
1370            DataType::Map(fields, sorted) => ScalarValue::Map(
1371                new_null_array(&DataType::Map(fields.to_owned(), sorted.to_owned()), 1)
1372                    .as_map()
1373                    .to_owned()
1374                    .into(),
1375            ),
1376            DataType::Union(fields, mode) => {
1377                ScalarValue::Union(None, fields.clone(), *mode)
1378            }
1379            DataType::Null => ScalarValue::Null,
1380            _ => {
1381                return _not_impl_err!(
1382                    "Can't create a null scalar from data_type \"{data_type}\""
1383                );
1384            }
1385        })
1386    }
1387
1388    /// Returns a [`ScalarValue::Utf8`] representing `val`
1389    pub fn new_utf8(val: impl Into<String>) -> Self {
1390        ScalarValue::from(val.into())
1391    }
1392
1393    /// Returns a [`ScalarValue::Utf8View`] representing `val`
1394    pub fn new_utf8view(val: impl Into<String>) -> Self {
1395        ScalarValue::Utf8View(Some(val.into()))
1396    }
1397
1398    /// Returns a [`ScalarValue::IntervalYearMonth`] representing
1399    /// `years` years and `months` months
1400    pub fn new_interval_ym(years: i32, months: i32) -> Self {
1401        let val = IntervalYearMonthType::make_value(years, months);
1402        ScalarValue::IntervalYearMonth(Some(val))
1403    }
1404
1405    /// Returns a [`ScalarValue::IntervalDayTime`] representing
1406    /// `days` days and `millis` milliseconds
1407    pub fn new_interval_dt(days: i32, millis: i32) -> Self {
1408        let val = IntervalDayTimeType::make_value(days, millis);
1409        Self::IntervalDayTime(Some(val))
1410    }
1411
1412    /// Returns a [`ScalarValue::IntervalMonthDayNano`] representing
1413    /// `months` months and `days` days, and `nanos` nanoseconds
1414    pub fn new_interval_mdn(months: i32, days: i32, nanos: i64) -> Self {
1415        let val = IntervalMonthDayNanoType::make_value(months, days, nanos);
1416        ScalarValue::IntervalMonthDayNano(Some(val))
1417    }
1418
1419    /// Returns a [`ScalarValue`] representing
1420    /// `value` and `tz_opt` timezone
1421    pub fn new_timestamp<T: ArrowTimestampType>(
1422        value: Option<i64>,
1423        tz_opt: Option<Arc<str>>,
1424    ) -> Self {
1425        match T::UNIT {
1426            TimeUnit::Second => ScalarValue::TimestampSecond(value, tz_opt),
1427            TimeUnit::Millisecond => ScalarValue::TimestampMillisecond(value, tz_opt),
1428            TimeUnit::Microsecond => ScalarValue::TimestampMicrosecond(value, tz_opt),
1429            TimeUnit::Nanosecond => ScalarValue::TimestampNanosecond(value, tz_opt),
1430        }
1431    }
1432
1433    /// Returns a [`ScalarValue`] representing PI
1434    pub fn new_pi(datatype: &DataType) -> Result<ScalarValue> {
1435        match datatype {
1436            DataType::Float16 => Ok(ScalarValue::from(f16::PI)),
1437            DataType::Float32 => Ok(ScalarValue::from(std::f32::consts::PI)),
1438            DataType::Float64 => Ok(ScalarValue::from(std::f64::consts::PI)),
1439            _ => _internal_err!("PI is not supported for data type: {}", datatype),
1440        }
1441    }
1442
1443    /// Returns a [`ScalarValue`] representing PI's upper bound
1444    pub fn new_pi_upper(datatype: &DataType) -> Result<ScalarValue> {
1445        match datatype {
1446            DataType::Float16 => Ok(ScalarValue::Float16(Some(consts::PI_UPPER_F16))),
1447            DataType::Float32 => Ok(ScalarValue::from(consts::PI_UPPER_F32)),
1448            DataType::Float64 => Ok(ScalarValue::from(consts::PI_UPPER_F64)),
1449            _ => {
1450                _internal_err!("PI_UPPER is not supported for data type: {}", datatype)
1451            }
1452        }
1453    }
1454
1455    /// Returns a [`ScalarValue`] representing -PI's lower bound
1456    pub fn new_negative_pi_lower(datatype: &DataType) -> Result<ScalarValue> {
1457        match datatype {
1458            DataType::Float16 => {
1459                Ok(ScalarValue::Float16(Some(consts::NEGATIVE_PI_LOWER_F16)))
1460            }
1461            DataType::Float32 => Ok(ScalarValue::from(consts::NEGATIVE_PI_LOWER_F32)),
1462            DataType::Float64 => Ok(ScalarValue::from(consts::NEGATIVE_PI_LOWER_F64)),
1463            _ => {
1464                _internal_err!("-PI_LOWER is not supported for data type: {}", datatype)
1465            }
1466        }
1467    }
1468
1469    /// Returns a [`ScalarValue`] representing FRAC_PI_2's upper bound
1470    pub fn new_frac_pi_2_upper(datatype: &DataType) -> Result<ScalarValue> {
1471        match datatype {
1472            DataType::Float16 => {
1473                Ok(ScalarValue::Float16(Some(consts::FRAC_PI_2_UPPER_F16)))
1474            }
1475            DataType::Float32 => Ok(ScalarValue::from(consts::FRAC_PI_2_UPPER_F32)),
1476            DataType::Float64 => Ok(ScalarValue::from(consts::FRAC_PI_2_UPPER_F64)),
1477            _ => {
1478                _internal_err!("PI_UPPER/2 is not supported for data type: {}", datatype)
1479            }
1480        }
1481    }
1482
1483    // Returns a [`ScalarValue`] representing FRAC_PI_2's lower bound
1484    pub fn new_neg_frac_pi_2_lower(datatype: &DataType) -> Result<ScalarValue> {
1485        match datatype {
1486            DataType::Float16 => Ok(ScalarValue::Float16(Some(
1487                consts::NEGATIVE_FRAC_PI_2_LOWER_F16,
1488            ))),
1489            DataType::Float32 => {
1490                Ok(ScalarValue::from(consts::NEGATIVE_FRAC_PI_2_LOWER_F32))
1491            }
1492            DataType::Float64 => {
1493                Ok(ScalarValue::from(consts::NEGATIVE_FRAC_PI_2_LOWER_F64))
1494            }
1495            _ => {
1496                _internal_err!("-PI/2_LOWER is not supported for data type: {}", datatype)
1497            }
1498        }
1499    }
1500
1501    /// Returns a [`ScalarValue`] representing -PI
1502    pub fn new_negative_pi(datatype: &DataType) -> Result<ScalarValue> {
1503        match datatype {
1504            DataType::Float16 => Ok(ScalarValue::from(-f16::PI)),
1505            DataType::Float32 => Ok(ScalarValue::from(-std::f32::consts::PI)),
1506            DataType::Float64 => Ok(ScalarValue::from(-std::f64::consts::PI)),
1507            _ => _internal_err!("-PI is not supported for data type: {}", datatype),
1508        }
1509    }
1510
1511    /// Returns a [`ScalarValue`] representing PI/2
1512    pub fn new_frac_pi_2(datatype: &DataType) -> Result<ScalarValue> {
1513        match datatype {
1514            DataType::Float16 => Ok(ScalarValue::from(f16::FRAC_PI_2)),
1515            DataType::Float32 => Ok(ScalarValue::from(std::f32::consts::FRAC_PI_2)),
1516            DataType::Float64 => Ok(ScalarValue::from(std::f64::consts::FRAC_PI_2)),
1517            _ => _internal_err!("PI/2 is not supported for data type: {}", datatype),
1518        }
1519    }
1520
1521    /// Returns a [`ScalarValue`] representing -PI/2
1522    pub fn new_neg_frac_pi_2(datatype: &DataType) -> Result<ScalarValue> {
1523        match datatype {
1524            DataType::Float16 => Ok(ScalarValue::from(-f16::FRAC_PI_2)),
1525            DataType::Float32 => Ok(ScalarValue::from(-std::f32::consts::FRAC_PI_2)),
1526            DataType::Float64 => Ok(ScalarValue::from(-std::f64::consts::FRAC_PI_2)),
1527            _ => _internal_err!("-PI/2 is not supported for data type: {}", datatype),
1528        }
1529    }
1530
1531    /// Returns a [`ScalarValue`] representing infinity
1532    pub fn new_infinity(datatype: &DataType) -> Result<ScalarValue> {
1533        match datatype {
1534            DataType::Float16 => Ok(ScalarValue::from(f16::INFINITY)),
1535            DataType::Float32 => Ok(ScalarValue::from(f32::INFINITY)),
1536            DataType::Float64 => Ok(ScalarValue::from(f64::INFINITY)),
1537            _ => {
1538                _internal_err!("Infinity is not supported for data type: {}", datatype)
1539            }
1540        }
1541    }
1542
1543    /// Returns a [`ScalarValue`] representing negative infinity
1544    pub fn new_neg_infinity(datatype: &DataType) -> Result<ScalarValue> {
1545        match datatype {
1546            DataType::Float16 => Ok(ScalarValue::from(f16::NEG_INFINITY)),
1547            DataType::Float32 => Ok(ScalarValue::from(f32::NEG_INFINITY)),
1548            DataType::Float64 => Ok(ScalarValue::from(f64::NEG_INFINITY)),
1549            _ => {
1550                _internal_err!(
1551                    "Negative Infinity is not supported for data type: {}",
1552                    datatype
1553                )
1554            }
1555        }
1556    }
1557
1558    /// Create a zero value in the given type.
1559    pub fn new_zero(datatype: &DataType) -> Result<ScalarValue> {
1560        Ok(match datatype {
1561            DataType::Boolean => ScalarValue::Boolean(Some(false)),
1562            DataType::Int8 => ScalarValue::Int8(Some(0)),
1563            DataType::Int16 => ScalarValue::Int16(Some(0)),
1564            DataType::Int32 => ScalarValue::Int32(Some(0)),
1565            DataType::Int64 => ScalarValue::Int64(Some(0)),
1566            DataType::UInt8 => ScalarValue::UInt8(Some(0)),
1567            DataType::UInt16 => ScalarValue::UInt16(Some(0)),
1568            DataType::UInt32 => ScalarValue::UInt32(Some(0)),
1569            DataType::UInt64 => ScalarValue::UInt64(Some(0)),
1570            DataType::Float16 => ScalarValue::Float16(Some(f16::ZERO)),
1571            DataType::Float32 => ScalarValue::Float32(Some(0.0)),
1572            DataType::Float64 => ScalarValue::Float64(Some(0.0)),
1573            DataType::Decimal32(precision, scale) => {
1574                ScalarValue::Decimal32(Some(0), *precision, *scale)
1575            }
1576            DataType::Decimal64(precision, scale) => {
1577                ScalarValue::Decimal64(Some(0), *precision, *scale)
1578            }
1579            DataType::Decimal128(precision, scale) => {
1580                ScalarValue::Decimal128(Some(0), *precision, *scale)
1581            }
1582            DataType::Decimal256(precision, scale) => {
1583                ScalarValue::Decimal256(Some(i256::ZERO), *precision, *scale)
1584            }
1585            DataType::Timestamp(TimeUnit::Second, tz) => {
1586                ScalarValue::TimestampSecond(Some(0), tz.clone())
1587            }
1588            DataType::Timestamp(TimeUnit::Millisecond, tz) => {
1589                ScalarValue::TimestampMillisecond(Some(0), tz.clone())
1590            }
1591            DataType::Timestamp(TimeUnit::Microsecond, tz) => {
1592                ScalarValue::TimestampMicrosecond(Some(0), tz.clone())
1593            }
1594            DataType::Timestamp(TimeUnit::Nanosecond, tz) => {
1595                ScalarValue::TimestampNanosecond(Some(0), tz.clone())
1596            }
1597            DataType::Time32(TimeUnit::Second) => ScalarValue::Time32Second(Some(0)),
1598            DataType::Time32(TimeUnit::Millisecond) => {
1599                ScalarValue::Time32Millisecond(Some(0))
1600            }
1601            DataType::Time64(TimeUnit::Microsecond) => {
1602                ScalarValue::Time64Microsecond(Some(0))
1603            }
1604            DataType::Time64(TimeUnit::Nanosecond) => {
1605                ScalarValue::Time64Nanosecond(Some(0))
1606            }
1607            DataType::Interval(IntervalUnit::YearMonth) => {
1608                ScalarValue::IntervalYearMonth(Some(0))
1609            }
1610            DataType::Interval(IntervalUnit::DayTime) => {
1611                ScalarValue::IntervalDayTime(Some(IntervalDayTime::ZERO))
1612            }
1613            DataType::Interval(IntervalUnit::MonthDayNano) => {
1614                ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::ZERO))
1615            }
1616            DataType::Duration(TimeUnit::Second) => ScalarValue::DurationSecond(Some(0)),
1617            DataType::Duration(TimeUnit::Millisecond) => {
1618                ScalarValue::DurationMillisecond(Some(0))
1619            }
1620            DataType::Duration(TimeUnit::Microsecond) => {
1621                ScalarValue::DurationMicrosecond(Some(0))
1622            }
1623            DataType::Duration(TimeUnit::Nanosecond) => {
1624                ScalarValue::DurationNanosecond(Some(0))
1625            }
1626            DataType::Date32 => ScalarValue::Date32(Some(0)),
1627            DataType::Date64 => ScalarValue::Date64(Some(0)),
1628            _ => {
1629                return _not_impl_err!(
1630                    "Can't create a zero scalar from data_type \"{datatype}\""
1631                );
1632            }
1633        })
1634    }
1635
1636    /// Returns a default value for the given `DataType`.
1637    ///
1638    /// This function is useful when you need to initialize a column with
1639    /// non-null values in a DataFrame or when you need a "zero" value
1640    /// for a specific data type.
1641    ///
1642    /// # Default Values
1643    ///
1644    /// - **Numeric types**: Returns zero (via [`new_zero`])
1645    /// - **String types**: Returns empty string (`""`)
1646    /// - **Binary types**: Returns empty byte array
1647    /// - **Temporal types**: Returns zero/epoch value
1648    /// - **List types**: Returns empty list
1649    /// - **Struct types**: Returns struct with all fields set to their defaults
1650    /// - **Dictionary types**: Returns dictionary with default value
1651    /// - **Map types**: Returns empty map
1652    /// - **Union types**: Returns first variant with default value
1653    ///
1654    /// # Errors
1655    ///
1656    /// Returns an error for data types that don't have a clear default value
1657    /// or are not yet supported (e.g., `RunEndEncoded`).
1658    ///
1659    /// [`new_zero`]: Self::new_zero
1660    pub fn new_default(datatype: &DataType) -> Result<ScalarValue> {
1661        match datatype {
1662            // Null type
1663            DataType::Null => Ok(ScalarValue::Null),
1664
1665            // Numeric types
1666            DataType::Boolean
1667            | DataType::Int8
1668            | DataType::Int16
1669            | DataType::Int32
1670            | DataType::Int64
1671            | DataType::UInt8
1672            | DataType::UInt16
1673            | DataType::UInt32
1674            | DataType::UInt64
1675            | DataType::Float16
1676            | DataType::Float32
1677            | DataType::Float64
1678            | DataType::Decimal32(_, _)
1679            | DataType::Decimal64(_, _)
1680            | DataType::Decimal128(_, _)
1681            | DataType::Decimal256(_, _)
1682            | DataType::Timestamp(_, _)
1683            | DataType::Time32(_)
1684            | DataType::Time64(_)
1685            | DataType::Interval(_)
1686            | DataType::Duration(_)
1687            | DataType::Date32
1688            | DataType::Date64 => ScalarValue::new_zero(datatype),
1689
1690            // String types
1691            DataType::Utf8 => Ok(ScalarValue::Utf8(Some("".to_string()))),
1692            DataType::LargeUtf8 => Ok(ScalarValue::LargeUtf8(Some("".to_string()))),
1693            DataType::Utf8View => Ok(ScalarValue::Utf8View(Some("".to_string()))),
1694
1695            // Binary types
1696            DataType::Binary => Ok(ScalarValue::Binary(Some(vec![]))),
1697            DataType::LargeBinary => Ok(ScalarValue::LargeBinary(Some(vec![]))),
1698            DataType::BinaryView => Ok(ScalarValue::BinaryView(Some(vec![]))),
1699
1700            // Fixed-size binary
1701            DataType::FixedSizeBinary(size) => Ok(ScalarValue::FixedSizeBinary(
1702                *size,
1703                Some(vec![0; *size as usize]),
1704            )),
1705
1706            // List types
1707            DataType::List(field) => {
1708                let list =
1709                    ScalarValue::new_list(&[], field.data_type(), field.is_nullable());
1710                Ok(ScalarValue::List(list))
1711            }
1712            DataType::FixedSizeList(field, _size) => {
1713                let empty_arr = new_empty_array(field.data_type());
1714                let values = Arc::new(
1715                    SingleRowListArrayBuilder::new(empty_arr)
1716                        .with_field(field)
1717                        .build_fixed_size_list_array(0),
1718                );
1719                Ok(ScalarValue::FixedSizeList(values))
1720            }
1721            DataType::LargeList(field) => {
1722                let list = ScalarValue::new_large_list(&[], field.data_type());
1723                Ok(ScalarValue::LargeList(list))
1724            }
1725            DataType::ListView(field) => {
1726                let empty_arr = new_empty_array(field.data_type());
1727                let values = Arc::new(
1728                    SingleRowListArrayBuilder::new(empty_arr)
1729                        .with_field(field)
1730                        .build_list_view_array(),
1731                );
1732                Ok(ScalarValue::ListView(values))
1733            }
1734            DataType::LargeListView(field) => {
1735                let empty_arr = new_empty_array(field.data_type());
1736                let values = Arc::new(
1737                    SingleRowListArrayBuilder::new(empty_arr)
1738                        .with_field(field)
1739                        .build_large_list_view_array(),
1740                );
1741                Ok(ScalarValue::LargeListView(values))
1742            }
1743
1744            // Struct types
1745            DataType::Struct(fields) => {
1746                let values = fields
1747                    .iter()
1748                    .map(|f| ScalarValue::new_default(f.data_type()))
1749                    .collect::<Result<Vec<_>>>()?;
1750                Ok(ScalarValue::Struct(Arc::new(StructArray::new(
1751                    fields.clone(),
1752                    values
1753                        .into_iter()
1754                        .map(|v| v.to_array())
1755                        .collect::<Result<_>>()?,
1756                    None,
1757                ))))
1758            }
1759
1760            // Dictionary types
1761            DataType::Dictionary(key_type, value_type) => Ok(ScalarValue::Dictionary(
1762                key_type.clone(),
1763                Box::new(ScalarValue::new_default(value_type)?),
1764            )),
1765
1766            DataType::RunEndEncoded(run_ends_field, value_field) => {
1767                Ok(ScalarValue::RunEndEncoded(
1768                    Arc::clone(run_ends_field),
1769                    Arc::clone(value_field),
1770                    Box::new(ScalarValue::new_default(value_field.data_type())?),
1771                ))
1772            }
1773
1774            // Map types
1775            DataType::Map(field, _) => Ok(ScalarValue::Map(Arc::new(MapArray::from(
1776                ArrayData::new_empty(field.data_type()),
1777            )))),
1778
1779            // Union types - return first variant with default value
1780            DataType::Union(fields, mode) => {
1781                if let Some((type_id, field)) = fields.iter().next() {
1782                    let default_value = ScalarValue::new_default(field.data_type())?;
1783                    Ok(ScalarValue::Union(
1784                        Some((type_id, Box::new(default_value))),
1785                        fields.clone(),
1786                        *mode,
1787                    ))
1788                } else {
1789                    _internal_err!("Union type must have at least one field")
1790                }
1791            }
1792        }
1793    }
1794
1795    /// Create an one value in the given type.
1796    pub fn new_one(datatype: &DataType) -> Result<ScalarValue> {
1797        Ok(match datatype {
1798            DataType::Int8 => ScalarValue::Int8(Some(1)),
1799            DataType::Int16 => ScalarValue::Int16(Some(1)),
1800            DataType::Int32 => ScalarValue::Int32(Some(1)),
1801            DataType::Int64 => ScalarValue::Int64(Some(1)),
1802            DataType::UInt8 => ScalarValue::UInt8(Some(1)),
1803            DataType::UInt16 => ScalarValue::UInt16(Some(1)),
1804            DataType::UInt32 => ScalarValue::UInt32(Some(1)),
1805            DataType::UInt64 => ScalarValue::UInt64(Some(1)),
1806            DataType::Float16 => ScalarValue::Float16(Some(f16::ONE)),
1807            DataType::Float32 => ScalarValue::Float32(Some(1.0)),
1808            DataType::Float64 => ScalarValue::Float64(Some(1.0)),
1809            DataType::Decimal32(precision, scale) => {
1810                Self::validate_decimal_or_internal_err::<Decimal32Type>(
1811                    *precision, *scale,
1812                )?;
1813                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1814                assert_or_internal_err!(
1815                    *precision != *scale as u8,
1816                    "Can't represent one at scale {} with precision {}",
1817                    *scale,
1818                    *precision
1819                );
1820                let one = DECIMAL32_ONES[*scale as usize];
1821                ScalarValue::Decimal32(Some(one), *precision, *scale)
1822            }
1823            DataType::Decimal64(precision, scale) => {
1824                Self::validate_decimal_or_internal_err::<Decimal64Type>(
1825                    *precision, *scale,
1826                )?;
1827                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1828                assert_or_internal_err!(
1829                    *precision != *scale as u8,
1830                    "Can't represent one at scale {} with precision {}",
1831                    *scale,
1832                    *precision
1833                );
1834                let one = DECIMAL64_ONES[*scale as usize];
1835                ScalarValue::Decimal64(Some(one), *precision, *scale)
1836            }
1837            DataType::Decimal128(precision, scale) => {
1838                Self::validate_decimal_or_internal_err::<Decimal128Type>(
1839                    *precision, *scale,
1840                )?;
1841                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1842                assert_or_internal_err!(
1843                    *precision != *scale as u8,
1844                    "Can't represent one at scale {} with precision {}",
1845                    *scale,
1846                    *precision
1847                );
1848                let one = DECIMAL128_ONES[*scale as usize];
1849                ScalarValue::Decimal128(Some(one), *precision, *scale)
1850            }
1851            DataType::Decimal256(precision, scale) => {
1852                Self::validate_decimal_or_internal_err::<Decimal256Type>(
1853                    *precision, *scale,
1854                )?;
1855                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1856                assert_or_internal_err!(
1857                    *precision != *scale as u8,
1858                    "Can't represent one at scale {} with precision {}",
1859                    *scale,
1860                    *precision
1861                );
1862                let one = DECIMAL256_ONES[*scale as usize];
1863                ScalarValue::Decimal256(Some(one), *precision, *scale)
1864            }
1865            _ => {
1866                return _not_impl_err!(
1867                    "Can't create an one scalar from data_type \"{datatype}\""
1868                );
1869            }
1870        })
1871    }
1872
1873    /// Create a negative one value in the given type.
1874    pub fn new_negative_one(datatype: &DataType) -> Result<ScalarValue> {
1875        Ok(match datatype {
1876            DataType::Int8 => ScalarValue::Int8(Some(-1)),
1877            DataType::Int16 => ScalarValue::Int16(Some(-1)),
1878            DataType::Int32 => ScalarValue::Int32(Some(-1)),
1879            DataType::Int64 => ScalarValue::Int64(Some(-1)),
1880            DataType::Float16 => ScalarValue::Float16(Some(f16::NEG_ONE)),
1881            DataType::Float32 => ScalarValue::Float32(Some(-1.0)),
1882            DataType::Float64 => ScalarValue::Float64(Some(-1.0)),
1883            DataType::Decimal32(precision, scale) => {
1884                Self::validate_decimal_or_internal_err::<Decimal32Type>(
1885                    *precision, *scale,
1886                )?;
1887                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1888                assert_or_internal_err!(
1889                    *precision != *scale as u8,
1890                    "Can't represent negative one at scale {} with precision {}",
1891                    *scale,
1892                    *precision
1893                );
1894                let one = DECIMAL32_ONES[*scale as usize];
1895                ScalarValue::Decimal32(Some(-one), *precision, *scale)
1896            }
1897            DataType::Decimal64(precision, scale) => {
1898                Self::validate_decimal_or_internal_err::<Decimal64Type>(
1899                    *precision, *scale,
1900                )?;
1901                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1902                assert_or_internal_err!(
1903                    *precision != *scale as u8,
1904                    "Can't represent negative one at scale {} with precision {}",
1905                    *scale,
1906                    *precision
1907                );
1908                let one = DECIMAL64_ONES[*scale as usize];
1909                ScalarValue::Decimal64(Some(-one), *precision, *scale)
1910            }
1911            DataType::Decimal128(precision, scale) => {
1912                Self::validate_decimal_or_internal_err::<Decimal128Type>(
1913                    *precision, *scale,
1914                )?;
1915                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1916                assert_or_internal_err!(
1917                    *precision != *scale as u8,
1918                    "Can't represent negative one at scale {} with precision {}",
1919                    *scale,
1920                    *precision
1921                );
1922                let one = DECIMAL128_ONES[*scale as usize];
1923                ScalarValue::Decimal128(Some(-one), *precision, *scale)
1924            }
1925            DataType::Decimal256(precision, scale) => {
1926                Self::validate_decimal_or_internal_err::<Decimal256Type>(
1927                    *precision, *scale,
1928                )?;
1929                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1930                assert_or_internal_err!(
1931                    *precision != *scale as u8,
1932                    "Can't represent one at scale {} with precision {}",
1933                    *scale,
1934                    *precision
1935                );
1936                let one = DECIMAL256_ONES[*scale as usize];
1937                ScalarValue::Decimal256(Some(-one), *precision, *scale)
1938            }
1939            _ => {
1940                return _not_impl_err!(
1941                    "Can't create a negative one scalar from data_type \"{datatype}\""
1942                );
1943            }
1944        })
1945    }
1946
1947    pub fn new_ten(datatype: &DataType) -> Result<ScalarValue> {
1948        Ok(match datatype {
1949            DataType::Int8 => ScalarValue::Int8(Some(10)),
1950            DataType::Int16 => ScalarValue::Int16(Some(10)),
1951            DataType::Int32 => ScalarValue::Int32(Some(10)),
1952            DataType::Int64 => ScalarValue::Int64(Some(10)),
1953            DataType::UInt8 => ScalarValue::UInt8(Some(10)),
1954            DataType::UInt16 => ScalarValue::UInt16(Some(10)),
1955            DataType::UInt32 => ScalarValue::UInt32(Some(10)),
1956            DataType::UInt64 => ScalarValue::UInt64(Some(10)),
1957            DataType::Float16 => ScalarValue::Float16(Some(f16::from_f32(10.0))),
1958            DataType::Float32 => ScalarValue::Float32(Some(10.0)),
1959            DataType::Float64 => ScalarValue::Float64(Some(10.0)),
1960            DataType::Decimal32(precision, scale) => {
1961                Self::validate_decimal_or_internal_err::<Decimal32Type>(
1962                    *precision, *scale,
1963                )?;
1964                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1965                assert_or_internal_err!(
1966                    (*precision - *scale as u8) > 1,
1967                    "Can't represent ten at scale {} with precision {}",
1968                    *scale,
1969                    *precision
1970                );
1971                // +1 safe since we validate above that scale must be less than
1972                // the max possible scale
1973                let ten = DECIMAL32_ONES[*scale as usize + 1];
1974                ScalarValue::Decimal32(Some(ten), *precision, *scale)
1975            }
1976            DataType::Decimal64(precision, scale) => {
1977                Self::validate_decimal_or_internal_err::<Decimal64Type>(
1978                    *precision, *scale,
1979                )?;
1980                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1981                assert_or_internal_err!(
1982                    (*precision - *scale as u8) > 1,
1983                    "Can't represent ten at scale {} with precision {}",
1984                    *scale,
1985                    *precision
1986                );
1987                // +1 safe since we validate above that scale must be less than
1988                // the max possible scale
1989                let ten = DECIMAL64_ONES[*scale as usize + 1];
1990                ScalarValue::Decimal64(Some(ten), *precision, *scale)
1991            }
1992            DataType::Decimal128(precision, scale) => {
1993                Self::validate_decimal_or_internal_err::<Decimal128Type>(
1994                    *precision, *scale,
1995                )?;
1996                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
1997                assert_or_internal_err!(
1998                    (*precision - *scale as u8) > 1,
1999                    "Can't represent ten at scale {} with precision {}",
2000                    *scale,
2001                    *precision
2002                );
2003                // +1 safe since we validate above that scale must be less than
2004                // the max possible scale
2005                let ten = DECIMAL128_ONES[*scale as usize + 1];
2006                ScalarValue::Decimal128(Some(ten), *precision, *scale)
2007            }
2008            DataType::Decimal256(precision, scale) => {
2009                Self::validate_decimal_or_internal_err::<Decimal256Type>(
2010                    *precision, *scale,
2011                )?;
2012                assert_or_internal_err!(*scale >= 0, "Negative scale is not supported");
2013                assert_or_internal_err!(
2014                    (*precision - *scale as u8) > 1,
2015                    "Can't represent ten at scale {} with precision {}",
2016                    *scale,
2017                    *precision
2018                );
2019                // +1 safe since we validate above that scale must be less than
2020                // the max possible scale
2021                let ten = DECIMAL256_ONES[*scale as usize + 1];
2022                ScalarValue::Decimal256(Some(ten), *precision, *scale)
2023            }
2024            _ => {
2025                return _not_impl_err!(
2026                    "Can't create a ten scalar from data_type \"{datatype}\""
2027                );
2028            }
2029        })
2030    }
2031
2032    /// return the [`DataType`] of this `ScalarValue`
2033    pub fn data_type(&self) -> DataType {
2034        match self {
2035            ScalarValue::Boolean(_) => DataType::Boolean,
2036            ScalarValue::UInt8(_) => DataType::UInt8,
2037            ScalarValue::UInt16(_) => DataType::UInt16,
2038            ScalarValue::UInt32(_) => DataType::UInt32,
2039            ScalarValue::UInt64(_) => DataType::UInt64,
2040            ScalarValue::Int8(_) => DataType::Int8,
2041            ScalarValue::Int16(_) => DataType::Int16,
2042            ScalarValue::Int32(_) => DataType::Int32,
2043            ScalarValue::Int64(_) => DataType::Int64,
2044            ScalarValue::Decimal32(_, precision, scale) => {
2045                DataType::Decimal32(*precision, *scale)
2046            }
2047            ScalarValue::Decimal64(_, precision, scale) => {
2048                DataType::Decimal64(*precision, *scale)
2049            }
2050            ScalarValue::Decimal128(_, precision, scale) => {
2051                DataType::Decimal128(*precision, *scale)
2052            }
2053            ScalarValue::Decimal256(_, precision, scale) => {
2054                DataType::Decimal256(*precision, *scale)
2055            }
2056            ScalarValue::TimestampSecond(_, tz_opt) => {
2057                DataType::Timestamp(TimeUnit::Second, tz_opt.clone())
2058            }
2059            ScalarValue::TimestampMillisecond(_, tz_opt) => {
2060                DataType::Timestamp(TimeUnit::Millisecond, tz_opt.clone())
2061            }
2062            ScalarValue::TimestampMicrosecond(_, tz_opt) => {
2063                DataType::Timestamp(TimeUnit::Microsecond, tz_opt.clone())
2064            }
2065            ScalarValue::TimestampNanosecond(_, tz_opt) => {
2066                DataType::Timestamp(TimeUnit::Nanosecond, tz_opt.clone())
2067            }
2068            ScalarValue::Float16(_) => DataType::Float16,
2069            ScalarValue::Float32(_) => DataType::Float32,
2070            ScalarValue::Float64(_) => DataType::Float64,
2071            ScalarValue::Utf8(_) => DataType::Utf8,
2072            ScalarValue::LargeUtf8(_) => DataType::LargeUtf8,
2073            ScalarValue::Utf8View(_) => DataType::Utf8View,
2074            ScalarValue::Binary(_) => DataType::Binary,
2075            ScalarValue::BinaryView(_) => DataType::BinaryView,
2076            ScalarValue::FixedSizeBinary(sz, _) => DataType::FixedSizeBinary(*sz),
2077            ScalarValue::LargeBinary(_) => DataType::LargeBinary,
2078            ScalarValue::List(arr) => arr.data_type().to_owned(),
2079            ScalarValue::LargeList(arr) => arr.data_type().to_owned(),
2080            ScalarValue::FixedSizeList(arr) => arr.data_type().to_owned(),
2081            ScalarValue::ListView(arr) => arr.data_type().to_owned(),
2082            ScalarValue::LargeListView(arr) => arr.data_type().to_owned(),
2083            ScalarValue::Struct(arr) => arr.data_type().to_owned(),
2084            ScalarValue::Map(arr) => arr.data_type().to_owned(),
2085            ScalarValue::Date32(_) => DataType::Date32,
2086            ScalarValue::Date64(_) => DataType::Date64,
2087            ScalarValue::Time32Second(_) => DataType::Time32(TimeUnit::Second),
2088            ScalarValue::Time32Millisecond(_) => DataType::Time32(TimeUnit::Millisecond),
2089            ScalarValue::Time64Microsecond(_) => DataType::Time64(TimeUnit::Microsecond),
2090            ScalarValue::Time64Nanosecond(_) => DataType::Time64(TimeUnit::Nanosecond),
2091            ScalarValue::IntervalYearMonth(_) => {
2092                DataType::Interval(IntervalUnit::YearMonth)
2093            }
2094            ScalarValue::IntervalDayTime(_) => DataType::Interval(IntervalUnit::DayTime),
2095            ScalarValue::IntervalMonthDayNano(_) => {
2096                DataType::Interval(IntervalUnit::MonthDayNano)
2097            }
2098            ScalarValue::DurationSecond(_) => DataType::Duration(TimeUnit::Second),
2099            ScalarValue::DurationMillisecond(_) => {
2100                DataType::Duration(TimeUnit::Millisecond)
2101            }
2102            ScalarValue::DurationMicrosecond(_) => {
2103                DataType::Duration(TimeUnit::Microsecond)
2104            }
2105            ScalarValue::DurationNanosecond(_) => {
2106                DataType::Duration(TimeUnit::Nanosecond)
2107            }
2108            ScalarValue::Union(_, fields, mode) => DataType::Union(fields.clone(), *mode),
2109            ScalarValue::Dictionary(k, v) => {
2110                DataType::Dictionary(k.clone(), Box::new(v.data_type()))
2111            }
2112            ScalarValue::RunEndEncoded(run_ends_field, value_field, _) => {
2113                DataType::RunEndEncoded(
2114                    Arc::clone(run_ends_field),
2115                    Arc::clone(value_field),
2116                )
2117            }
2118            ScalarValue::Null => DataType::Null,
2119        }
2120    }
2121
2122    #[inline]
2123    fn can_use_direct_add(lhs: &ScalarValue, rhs: &ScalarValue) -> bool {
2124        matches!(
2125            (lhs, rhs),
2126            (ScalarValue::Int8(_), ScalarValue::Int8(_))
2127                | (ScalarValue::Int16(_), ScalarValue::Int16(_))
2128                | (ScalarValue::Int32(_), ScalarValue::Int32(_))
2129                | (ScalarValue::Int64(_), ScalarValue::Int64(_))
2130                | (ScalarValue::UInt8(_), ScalarValue::UInt8(_))
2131                | (ScalarValue::UInt16(_), ScalarValue::UInt16(_))
2132                | (ScalarValue::UInt32(_), ScalarValue::UInt32(_))
2133                | (ScalarValue::UInt64(_), ScalarValue::UInt64(_))
2134                | (ScalarValue::Float16(_), ScalarValue::Float16(_))
2135                | (ScalarValue::Float32(_), ScalarValue::Float32(_))
2136                | (ScalarValue::Float64(_), ScalarValue::Float64(_))
2137                | (
2138                    ScalarValue::Decimal32(_, _, _),
2139                    ScalarValue::Decimal32(_, _, _)
2140                )
2141                | (
2142                    ScalarValue::Decimal64(_, _, _),
2143                    ScalarValue::Decimal64(_, _, _)
2144                )
2145                | (
2146                    ScalarValue::Decimal128(_, _, _),
2147                    ScalarValue::Decimal128(_, _, _),
2148                )
2149                | (
2150                    ScalarValue::Decimal256(_, _, _),
2151                    ScalarValue::Decimal256(_, _, _),
2152                )
2153        )
2154    }
2155
2156    #[inline]
2157    fn add_optional<T: ArrowNativeTypeOp>(
2158        lhs: &mut Option<T>,
2159        rhs: Option<T>,
2160        checked: bool,
2161    ) -> Result<()> {
2162        match rhs {
2163            Some(rhs) => {
2164                if let Some(lhs) = lhs.as_mut() {
2165                    *lhs = if checked {
2166                        lhs.add_checked(rhs).map_err(|e| arrow_datafusion_err!(e))?
2167                    } else {
2168                        lhs.add_wrapping(rhs)
2169                    };
2170                }
2171            }
2172            None => *lhs = None,
2173        }
2174        Ok(())
2175    }
2176
2177    #[inline]
2178    fn add_decimal_values<T: DecimalType>(
2179        lhs_value: &mut Option<T::Native>,
2180        lhs_precision: &mut u8,
2181        lhs_scale: &mut i8,
2182        rhs_value: Option<T::Native>,
2183        rhs_precision: u8,
2184        rhs_scale: i8,
2185    ) -> Result<()>
2186    where
2187        T::Native: ArrowNativeTypeOp,
2188    {
2189        Self::validate_decimal_or_internal_err::<T>(*lhs_precision, *lhs_scale)?;
2190        Self::validate_decimal_or_internal_err::<T>(rhs_precision, rhs_scale)?;
2191
2192        let result_scale = (*lhs_scale).max(rhs_scale);
2193        // Decimal scales can be negative, so use a wider signed type for the
2194        // intermediate precision arithmetic.
2195        let lhs_precision_delta = i16::from(*lhs_precision) - i16::from(*lhs_scale);
2196        let rhs_precision_delta = i16::from(rhs_precision) - i16::from(rhs_scale);
2197        let result_precision =
2198            (i16::from(result_scale) + lhs_precision_delta.max(rhs_precision_delta) + 1)
2199                .min(i16::from(T::MAX_PRECISION)) as u8;
2200
2201        Self::validate_decimal_or_internal_err::<T>(result_precision, result_scale)?;
2202
2203        let lhs_mul = T::Native::usize_as(10)
2204            .pow_checked((result_scale - *lhs_scale) as u32)
2205            .map_err(|e| arrow_datafusion_err!(e))?;
2206        let rhs_mul = T::Native::usize_as(10)
2207            .pow_checked((result_scale - rhs_scale) as u32)
2208            .map_err(|e| arrow_datafusion_err!(e))?;
2209
2210        let result_value = match (*lhs_value, rhs_value) {
2211            (Some(lhs_value), Some(rhs_value)) => Some(
2212                lhs_value
2213                    .mul_checked(lhs_mul)
2214                    .and_then(|lhs| {
2215                        rhs_value
2216                            .mul_checked(rhs_mul)
2217                            .and_then(|rhs| lhs.add_checked(rhs))
2218                    })
2219                    .map_err(|e| arrow_datafusion_err!(e))?,
2220            ),
2221            _ => None,
2222        };
2223
2224        *lhs_value = result_value;
2225        *lhs_precision = result_precision;
2226        *lhs_scale = result_scale;
2227
2228        Ok(())
2229    }
2230
2231    #[inline]
2232    fn try_add_in_place_impl(
2233        &mut self,
2234        other: &ScalarValue,
2235        checked: bool,
2236    ) -> Result<bool> {
2237        match (self, other) {
2238            (ScalarValue::Int8(lhs), ScalarValue::Int8(rhs)) => {
2239                Self::add_optional(lhs, *rhs, checked)?;
2240            }
2241            (ScalarValue::Int16(lhs), ScalarValue::Int16(rhs)) => {
2242                Self::add_optional(lhs, *rhs, checked)?;
2243            }
2244            (ScalarValue::Int32(lhs), ScalarValue::Int32(rhs)) => {
2245                Self::add_optional(lhs, *rhs, checked)?;
2246            }
2247            (ScalarValue::Int64(lhs), ScalarValue::Int64(rhs)) => {
2248                Self::add_optional(lhs, *rhs, checked)?;
2249            }
2250            (ScalarValue::UInt8(lhs), ScalarValue::UInt8(rhs)) => {
2251                Self::add_optional(lhs, *rhs, checked)?;
2252            }
2253            (ScalarValue::UInt16(lhs), ScalarValue::UInt16(rhs)) => {
2254                Self::add_optional(lhs, *rhs, checked)?;
2255            }
2256            (ScalarValue::UInt32(lhs), ScalarValue::UInt32(rhs)) => {
2257                Self::add_optional(lhs, *rhs, checked)?;
2258            }
2259            (ScalarValue::UInt64(lhs), ScalarValue::UInt64(rhs)) => {
2260                Self::add_optional(lhs, *rhs, checked)?;
2261            }
2262            (ScalarValue::Float16(lhs), ScalarValue::Float16(rhs)) => {
2263                Self::add_optional(lhs, *rhs, checked)?;
2264            }
2265            (ScalarValue::Float32(lhs), ScalarValue::Float32(rhs)) => {
2266                Self::add_optional(lhs, *rhs, checked)?;
2267            }
2268            (ScalarValue::Float64(lhs), ScalarValue::Float64(rhs)) => {
2269                Self::add_optional(lhs, *rhs, checked)?;
2270            }
2271            (
2272                ScalarValue::Decimal32(lhs, p, s),
2273                ScalarValue::Decimal32(rhs, rhs_p, rhs_s),
2274            ) => {
2275                Self::add_decimal_values::<Decimal32Type>(
2276                    lhs, p, s, *rhs, *rhs_p, *rhs_s,
2277                )?;
2278            }
2279            (
2280                ScalarValue::Decimal64(lhs, p, s),
2281                ScalarValue::Decimal64(rhs, rhs_p, rhs_s),
2282            ) => {
2283                Self::add_decimal_values::<Decimal64Type>(
2284                    lhs, p, s, *rhs, *rhs_p, *rhs_s,
2285                )?;
2286            }
2287            (
2288                ScalarValue::Decimal128(lhs, p, s),
2289                ScalarValue::Decimal128(rhs, rhs_p, rhs_s),
2290            ) => {
2291                Self::add_decimal_values::<Decimal128Type>(
2292                    lhs, p, s, *rhs, *rhs_p, *rhs_s,
2293                )?;
2294            }
2295            (
2296                ScalarValue::Decimal256(lhs, p, s),
2297                ScalarValue::Decimal256(rhs, rhs_p, rhs_s),
2298            ) => {
2299                Self::add_decimal_values::<Decimal256Type>(
2300                    lhs, p, s, *rhs, *rhs_p, *rhs_s,
2301                )?;
2302            }
2303            _ => return Ok(false),
2304        }
2305
2306        Ok(true)
2307    }
2308
2309    #[inline]
2310    pub(crate) fn try_add_wrapping_in_place(
2311        &mut self,
2312        other: &ScalarValue,
2313    ) -> Result<bool> {
2314        self.try_add_in_place_impl(other, false)
2315    }
2316
2317    #[inline]
2318    pub(crate) fn try_add_checked_in_place(
2319        &mut self,
2320        other: &ScalarValue,
2321    ) -> Result<bool> {
2322        self.try_add_in_place_impl(other, true)
2323    }
2324
2325    /// Calculate arithmetic negation for a scalar value
2326    pub fn arithmetic_negate(&self) -> Result<Self> {
2327        fn neg_checked_with_ctx<T: ArrowNativeTypeOp>(
2328            v: T,
2329            ctx: impl Fn() -> String,
2330        ) -> Result<T> {
2331            v.neg_checked()
2332                .map_err(|e| arrow_datafusion_err!(e).context(ctx()))
2333        }
2334        match self {
2335            ScalarValue::Int8(None)
2336            | ScalarValue::Int16(None)
2337            | ScalarValue::Int32(None)
2338            | ScalarValue::Int64(None)
2339            | ScalarValue::Float16(None)
2340            | ScalarValue::Float32(None)
2341            | ScalarValue::Float64(None)
2342            | ScalarValue::IntervalYearMonth(None)
2343            | ScalarValue::IntervalDayTime(None)
2344            | ScalarValue::IntervalMonthDayNano(None)
2345            | ScalarValue::Decimal32(None, _, _)
2346            | ScalarValue::Decimal64(None, _, _)
2347            | ScalarValue::Decimal128(None, _, _)
2348            | ScalarValue::Decimal256(None, _, _)
2349            | ScalarValue::TimestampSecond(None, _)
2350            | ScalarValue::TimestampMillisecond(None, _)
2351            | ScalarValue::TimestampMicrosecond(None, _)
2352            | ScalarValue::TimestampNanosecond(None, _) => Ok(self.clone()),
2353            ScalarValue::Float16(Some(v)) => Ok(ScalarValue::Float16(Some(-v))),
2354            ScalarValue::Float64(Some(v)) => Ok(ScalarValue::Float64(Some(-v))),
2355            ScalarValue::Float32(Some(v)) => Ok(ScalarValue::Float32(Some(-v))),
2356            ScalarValue::Int8(Some(v)) => Ok(ScalarValue::Int8(Some(v.neg_checked()?))),
2357            ScalarValue::Int16(Some(v)) => Ok(ScalarValue::Int16(Some(v.neg_checked()?))),
2358            ScalarValue::Int32(Some(v)) => Ok(ScalarValue::Int32(Some(v.neg_checked()?))),
2359            ScalarValue::Int64(Some(v)) => Ok(ScalarValue::Int64(Some(v.neg_checked()?))),
2360            ScalarValue::IntervalYearMonth(Some(v)) => Ok(
2361                ScalarValue::IntervalYearMonth(Some(neg_checked_with_ctx(*v, || {
2362                    format!("In negation of IntervalYearMonth({v})")
2363                })?)),
2364            ),
2365            ScalarValue::IntervalDayTime(Some(v)) => {
2366                let (days, ms) = IntervalDayTimeType::to_parts(*v);
2367                let val = IntervalDayTimeType::make_value(
2368                    neg_checked_with_ctx(days, || {
2369                        format!("In negation of days {days} in IntervalDayTime")
2370                    })?,
2371                    neg_checked_with_ctx(ms, || {
2372                        format!("In negation of milliseconds {ms} in IntervalDayTime")
2373                    })?,
2374                );
2375                Ok(ScalarValue::IntervalDayTime(Some(val)))
2376            }
2377            ScalarValue::IntervalMonthDayNano(Some(v)) => {
2378                let (months, days, nanos) = IntervalMonthDayNanoType::to_parts(*v);
2379                let val = IntervalMonthDayNanoType::make_value(
2380                    neg_checked_with_ctx(months, || {
2381                        format!("In negation of months {months} of IntervalMonthDayNano")
2382                    })?,
2383                    neg_checked_with_ctx(days, || {
2384                        format!("In negation of days {days} of IntervalMonthDayNano")
2385                    })?,
2386                    neg_checked_with_ctx(nanos, || {
2387                        format!("In negation of nanos {nanos} of IntervalMonthDayNano")
2388                    })?,
2389                );
2390                Ok(ScalarValue::IntervalMonthDayNano(Some(val)))
2391            }
2392            ScalarValue::Decimal32(Some(v), precision, scale) => {
2393                Ok(ScalarValue::Decimal32(
2394                    Some(neg_checked_with_ctx(*v, || {
2395                        format!("In negation of Decimal32({v}, {precision}, {scale})")
2396                    })?),
2397                    *precision,
2398                    *scale,
2399                ))
2400            }
2401            ScalarValue::Decimal64(Some(v), precision, scale) => {
2402                Ok(ScalarValue::Decimal64(
2403                    Some(neg_checked_with_ctx(*v, || {
2404                        format!("In negation of Decimal64({v}, {precision}, {scale})")
2405                    })?),
2406                    *precision,
2407                    *scale,
2408                ))
2409            }
2410            ScalarValue::Decimal128(Some(v), precision, scale) => {
2411                Ok(ScalarValue::Decimal128(
2412                    Some(neg_checked_with_ctx(*v, || {
2413                        format!("In negation of Decimal128({v}, {precision}, {scale})")
2414                    })?),
2415                    *precision,
2416                    *scale,
2417                ))
2418            }
2419            ScalarValue::Decimal256(Some(v), precision, scale) => {
2420                Ok(ScalarValue::Decimal256(
2421                    Some(neg_checked_with_ctx(*v, || {
2422                        format!("In negation of Decimal256({v}, {precision}, {scale})")
2423                    })?),
2424                    *precision,
2425                    *scale,
2426                ))
2427            }
2428            ScalarValue::TimestampSecond(Some(v), tz) => {
2429                Ok(ScalarValue::TimestampSecond(
2430                    Some(neg_checked_with_ctx(*v, || {
2431                        format!("In negation of TimestampSecond({v})")
2432                    })?),
2433                    tz.clone(),
2434                ))
2435            }
2436            ScalarValue::TimestampNanosecond(Some(v), tz) => {
2437                Ok(ScalarValue::TimestampNanosecond(
2438                    Some(neg_checked_with_ctx(*v, || {
2439                        format!("In negation of TimestampNanoSecond({v})")
2440                    })?),
2441                    tz.clone(),
2442                ))
2443            }
2444            ScalarValue::TimestampMicrosecond(Some(v), tz) => {
2445                Ok(ScalarValue::TimestampMicrosecond(
2446                    Some(neg_checked_with_ctx(*v, || {
2447                        format!("In negation of TimestampMicroSecond({v})")
2448                    })?),
2449                    tz.clone(),
2450                ))
2451            }
2452            ScalarValue::TimestampMillisecond(Some(v), tz) => {
2453                Ok(ScalarValue::TimestampMillisecond(
2454                    Some(neg_checked_with_ctx(*v, || {
2455                        format!("In negation of TimestampMilliSecond({v})")
2456                    })?),
2457                    tz.clone(),
2458                ))
2459            }
2460            value => _internal_err!(
2461                "Can not run arithmetic negative on scalar value {value:?}"
2462            ),
2463        }
2464    }
2465
2466    /// Wrapping addition of `ScalarValue`
2467    ///
2468    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2469    /// should operate on Arrays directly, using vectorized array kernels
2470    pub fn add<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2471        let other = other.borrow();
2472        if Self::can_use_direct_add(self, other) {
2473            let mut result = self.clone();
2474            if result.try_add_wrapping_in_place(other)? {
2475                return Ok(result);
2476            }
2477            debug_assert!(false, "fast-path eligibility drifted from implementation");
2478        }
2479
2480        let r = add_wrapping(&self.to_scalar()?, &other.to_scalar()?)?;
2481        Self::try_from_array(r.as_ref(), 0)
2482    }
2483
2484    /// Checked addition of `ScalarValue`
2485    ///
2486    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2487    /// should operate on Arrays directly, using vectorized array kernels
2488    pub fn add_checked<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2489        let other = other.borrow();
2490        if Self::can_use_direct_add(self, other) {
2491            let mut result = self.clone();
2492            if result.try_add_checked_in_place(other)? {
2493                return Ok(result);
2494            }
2495            debug_assert!(false, "fast-path eligibility drifted from implementation");
2496        }
2497
2498        let r = add(&self.to_scalar()?, &other.to_scalar()?)?;
2499        Self::try_from_array(r.as_ref(), 0)
2500    }
2501
2502    /// Wrapping subtraction of `ScalarValue`
2503    ///
2504    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2505    /// should operate on Arrays directly, using vectorized array kernels
2506    pub fn sub<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2507        let r = sub_wrapping(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2508        Self::try_from_array(r.as_ref(), 0)
2509    }
2510
2511    /// Checked subtraction of `ScalarValue`
2512    ///
2513    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2514    /// should operate on Arrays directly, using vectorized array kernels
2515    pub fn sub_checked<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2516        let r = sub(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2517        Self::try_from_array(r.as_ref(), 0)
2518    }
2519
2520    /// Wrapping multiplication of `ScalarValue`
2521    ///
2522    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2523    /// should operate on Arrays directly, using vectorized array kernels.
2524    pub fn mul<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2525        let r = mul_wrapping(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2526        Self::try_from_array(r.as_ref(), 0)
2527    }
2528
2529    /// Checked multiplication of `ScalarValue`
2530    ///
2531    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2532    /// should operate on Arrays directly, using vectorized array kernels.
2533    pub fn mul_checked<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2534        let r = mul(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2535        Self::try_from_array(r.as_ref(), 0)
2536    }
2537
2538    /// Performs `lhs / rhs`
2539    ///
2540    /// Overflow or division by zero will result in an error, with exception to
2541    /// floating point numbers, which instead follow the IEEE 754 rules.
2542    ///
2543    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2544    /// should operate on Arrays directly, using vectorized array kernels.
2545    pub fn div<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2546        let r = div(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2547        Self::try_from_array(r.as_ref(), 0)
2548    }
2549
2550    /// Performs `lhs % rhs`
2551    ///
2552    /// Overflow or division by zero will result in an error, with exception to
2553    /// floating point numbers, which instead follow the IEEE 754 rules.
2554    ///
2555    /// NB: operating on `ScalarValue` directly is not efficient, performance sensitive code
2556    /// should operate on Arrays directly, using vectorized array kernels.
2557    pub fn rem<T: Borrow<ScalarValue>>(&self, other: T) -> Result<ScalarValue> {
2558        let r = rem(&self.to_scalar()?, &other.borrow().to_scalar()?)?;
2559        Self::try_from_array(r.as_ref(), 0)
2560    }
2561
2562    pub fn is_unsigned(&self) -> bool {
2563        matches!(
2564            self,
2565            ScalarValue::UInt8(_)
2566                | ScalarValue::UInt16(_)
2567                | ScalarValue::UInt32(_)
2568                | ScalarValue::UInt64(_)
2569        )
2570    }
2571
2572    /// whether this value is null or not.
2573    pub fn is_null(&self) -> bool {
2574        match self {
2575            ScalarValue::Boolean(v) => v.is_none(),
2576            ScalarValue::Null => true,
2577            ScalarValue::Float16(v) => v.is_none(),
2578            ScalarValue::Float32(v) => v.is_none(),
2579            ScalarValue::Float64(v) => v.is_none(),
2580            ScalarValue::Decimal32(v, _, _) => v.is_none(),
2581            ScalarValue::Decimal64(v, _, _) => v.is_none(),
2582            ScalarValue::Decimal128(v, _, _) => v.is_none(),
2583            ScalarValue::Decimal256(v, _, _) => v.is_none(),
2584            ScalarValue::Int8(v) => v.is_none(),
2585            ScalarValue::Int16(v) => v.is_none(),
2586            ScalarValue::Int32(v) => v.is_none(),
2587            ScalarValue::Int64(v) => v.is_none(),
2588            ScalarValue::UInt8(v) => v.is_none(),
2589            ScalarValue::UInt16(v) => v.is_none(),
2590            ScalarValue::UInt32(v) => v.is_none(),
2591            ScalarValue::UInt64(v) => v.is_none(),
2592            ScalarValue::Utf8(v)
2593            | ScalarValue::Utf8View(v)
2594            | ScalarValue::LargeUtf8(v) => v.is_none(),
2595            ScalarValue::Binary(v)
2596            | ScalarValue::BinaryView(v)
2597            | ScalarValue::FixedSizeBinary(_, v)
2598            | ScalarValue::LargeBinary(v) => v.is_none(),
2599            // arr.len() should be 1 for a list scalar, but we don't seem to
2600            // enforce that anywhere, so we still check against array length.
2601            ScalarValue::List(arr) => arr.len() == arr.null_count(),
2602            ScalarValue::LargeList(arr) => arr.len() == arr.null_count(),
2603            ScalarValue::FixedSizeList(arr) => arr.len() == arr.null_count(),
2604            ScalarValue::ListView(arr) => arr.len() == arr.null_count(),
2605            ScalarValue::LargeListView(arr) => arr.len() == arr.null_count(),
2606            ScalarValue::Struct(arr) => arr.len() == arr.null_count(),
2607            ScalarValue::Map(arr) => arr.len() == arr.null_count(),
2608            ScalarValue::Date32(v) => v.is_none(),
2609            ScalarValue::Date64(v) => v.is_none(),
2610            ScalarValue::Time32Second(v) => v.is_none(),
2611            ScalarValue::Time32Millisecond(v) => v.is_none(),
2612            ScalarValue::Time64Microsecond(v) => v.is_none(),
2613            ScalarValue::Time64Nanosecond(v) => v.is_none(),
2614            ScalarValue::TimestampSecond(v, _) => v.is_none(),
2615            ScalarValue::TimestampMillisecond(v, _) => v.is_none(),
2616            ScalarValue::TimestampMicrosecond(v, _) => v.is_none(),
2617            ScalarValue::TimestampNanosecond(v, _) => v.is_none(),
2618            ScalarValue::IntervalYearMonth(v) => v.is_none(),
2619            ScalarValue::IntervalDayTime(v) => v.is_none(),
2620            ScalarValue::IntervalMonthDayNano(v) => v.is_none(),
2621            ScalarValue::DurationSecond(v) => v.is_none(),
2622            ScalarValue::DurationMillisecond(v) => v.is_none(),
2623            ScalarValue::DurationMicrosecond(v) => v.is_none(),
2624            ScalarValue::DurationNanosecond(v) => v.is_none(),
2625            ScalarValue::Union(v, _, _) => match v {
2626                Some((_, s)) => s.is_null(),
2627                None => true,
2628            },
2629            ScalarValue::Dictionary(_, v) => v.is_null(),
2630            ScalarValue::RunEndEncoded(_, _, v) => v.is_null(),
2631        }
2632    }
2633
2634    /// Absolute distance between two numeric values (of the same type). This method will return
2635    /// None if either one of the arguments are null. It might also return None if the resulting
2636    /// distance is greater than [`usize::MAX`]. If the type is a float, then the distance will be
2637    /// rounded to the nearest integer.
2638    ///
2639    /// Note: the datatype itself must support subtraction.
2640    pub fn distance(&self, other: &ScalarValue) -> Option<usize> {
2641        self.distance_u64(other)
2642            .and_then(|d| usize::try_from(d).ok())
2643    }
2644
2645    /// Helper to convert a rounded float distance to u64, returning None if it exceeds u64::MAX, is negative, or is not finite.
2646    fn rounded_float_distance_u64(diff: f64) -> Option<u64> {
2647        if diff.is_finite() && diff >= 0.0 && diff < u64::MAX as f64 {
2648            Some(diff as u64)
2649        } else {
2650            None
2651        }
2652    }
2653
2654    /// Absolute distance between two numeric values (of the same type). This method will return
2655    /// None if either one of the arguments are null. It might also return None if the resulting
2656    /// distance is greater than [`u64::MAX`]. If the type is a float, then the distance will be
2657    /// rounded to the nearest integer.
2658    ///
2659    /// Note: the datatype itself must support subtraction.
2660    pub fn distance_u64(&self, other: &ScalarValue) -> Option<u64> {
2661        match (self, other) {
2662            (Self::Int8(Some(l)), Self::Int8(Some(r))) => Some(l.abs_diff(*r) as u64),
2663            (Self::Int16(Some(l)), Self::Int16(Some(r))) => Some(l.abs_diff(*r) as u64),
2664            (Self::Int32(Some(l)), Self::Int32(Some(r))) => Some(l.abs_diff(*r) as u64),
2665            (Self::Int64(Some(l)), Self::Int64(Some(r))) => Some(l.abs_diff(*r)),
2666            (Self::UInt8(Some(l)), Self::UInt8(Some(r))) => Some(l.abs_diff(*r) as u64),
2667            (Self::UInt16(Some(l)), Self::UInt16(Some(r))) => Some(l.abs_diff(*r) as u64),
2668            (Self::UInt32(Some(l)), Self::UInt32(Some(r))) => Some(l.abs_diff(*r) as u64),
2669            (Self::UInt64(Some(l)), Self::UInt64(Some(r))) => Some(l.abs_diff(*r)),
2670            // TODO: we might want to look into supporting ceil/floor here for floats.
2671            (Self::Float16(Some(l)), Self::Float16(Some(r))) => {
2672                let diff = (f16::to_f32(*l) - f16::to_f32(*r)).abs().round();
2673                Self::rounded_float_distance_u64(diff as f64)
2674            }
2675            (Self::Float32(Some(l)), Self::Float32(Some(r))) => {
2676                let diff = (l - r).abs().round();
2677                Self::rounded_float_distance_u64(diff as f64)
2678            }
2679            (Self::Float64(Some(l)), Self::Float64(Some(r))) => {
2680                let diff = (l - r).abs().round();
2681                Self::rounded_float_distance_u64(diff)
2682            }
2683            (Self::Date32(Some(l)), Self::Date32(Some(r))) => Some(l.abs_diff(*r) as u64),
2684            (Self::Date64(Some(l)), Self::Date64(Some(r))) => Some(l.abs_diff(*r)),
2685            // Timestamp values are stored as epoch ticks regardless of timezone
2686            // annotation, so the distance is tz-independent (tz is display metadata).
2687            (Self::TimestampSecond(Some(l), _), Self::TimestampSecond(Some(r), _)) => {
2688                Some(l.abs_diff(*r))
2689            }
2690            (
2691                Self::TimestampMillisecond(Some(l), _),
2692                Self::TimestampMillisecond(Some(r), _),
2693            ) => Some(l.abs_diff(*r)),
2694            (
2695                Self::TimestampMicrosecond(Some(l), _),
2696                Self::TimestampMicrosecond(Some(r), _),
2697            ) => Some(l.abs_diff(*r)),
2698            (
2699                Self::TimestampNanosecond(Some(l), _),
2700                Self::TimestampNanosecond(Some(r), _),
2701            ) => Some(l.abs_diff(*r)),
2702            (
2703                Self::Decimal32(Some(l), _, lscale),
2704                Self::Decimal32(Some(r), _, rscale),
2705            ) => {
2706                // In order to be aligned with PartialOrd we only
2707                // check for equal scale, ignoring precision
2708                if lscale == rscale {
2709                    Some(l.abs_diff(*r) as u64)
2710                } else {
2711                    None
2712                }
2713            }
2714            (
2715                Self::Decimal64(Some(l), _, lscale),
2716                Self::Decimal64(Some(r), _, rscale),
2717            ) => {
2718                if lscale == rscale {
2719                    Some(l.abs_diff(*r))
2720                } else {
2721                    None
2722                }
2723            }
2724            (
2725                Self::Decimal128(Some(l), _, lscale),
2726                Self::Decimal128(Some(r), _, rscale),
2727            ) => {
2728                if lscale == rscale {
2729                    l.checked_sub(*r)?.checked_abs()?.to_u64()
2730                } else {
2731                    None
2732                }
2733            }
2734            (
2735                Self::Decimal256(Some(l), _, lscale),
2736                Self::Decimal256(Some(r), _, rscale),
2737            ) => {
2738                if lscale == rscale {
2739                    l.checked_sub(*r)?.checked_abs()?.to_u64()
2740                } else {
2741                    None
2742                }
2743            }
2744            _ => None,
2745        }
2746    }
2747
2748    /// Converts a scalar value into an 1-row array.
2749    ///
2750    /// # Errors
2751    ///
2752    /// Errors if the ScalarValue cannot be converted into a 1-row array
2753    pub fn to_array(&self) -> Result<ArrayRef> {
2754        self.to_array_of_size(1)
2755    }
2756
2757    /// Converts a scalar into an arrow [`Scalar`] (which implements
2758    /// the [`Datum`] interface).
2759    ///
2760    /// This can be used to call arrow compute kernels such as `lt`
2761    ///
2762    /// # Errors
2763    ///
2764    /// Errors if the ScalarValue cannot be converted into a 1-row array
2765    ///
2766    /// # Example
2767    /// ```
2768    /// use arrow::array::{BooleanArray, Int32Array};
2769    /// use datafusion_common::ScalarValue;
2770    ///
2771    /// let arr = Int32Array::from(vec![Some(1), None, Some(10)]);
2772    /// let five = ScalarValue::Int32(Some(5));
2773    ///
2774    /// let result =
2775    ///     arrow::compute::kernels::cmp::lt(&arr, &five.to_scalar().unwrap()).unwrap();
2776    ///
2777    /// let expected = BooleanArray::from(vec![Some(true), None, Some(false)]);
2778    ///
2779    /// assert_eq!(&result, &expected);
2780    /// ```
2781    /// [`Datum`]: arrow::array::Datum
2782    pub fn to_scalar(&self) -> Result<Scalar<ArrayRef>> {
2783        Ok(Scalar::new(self.to_array_of_size(1)?))
2784    }
2785
2786    /// Converts an iterator of references [`ScalarValue`] into an [`ArrayRef`]
2787    /// corresponding to those values. For example, an iterator of
2788    /// [`ScalarValue::Int32`] would be converted to an [`Int32Array`].
2789    ///
2790    /// Returns an error if the iterator is empty or if the
2791    /// [`ScalarValue`]s are not all the same type
2792    ///
2793    /// # Example
2794    /// ```
2795    /// use arrow::array::{ArrayRef, BooleanArray};
2796    /// use datafusion_common::ScalarValue;
2797    ///
2798    /// let scalars = vec![
2799    ///     ScalarValue::Boolean(Some(true)),
2800    ///     ScalarValue::Boolean(None),
2801    ///     ScalarValue::Boolean(Some(false)),
2802    /// ];
2803    ///
2804    /// // Build an Array from the list of ScalarValues
2805    /// let array = ScalarValue::iter_to_array(scalars.into_iter()).unwrap();
2806    ///
2807    /// let expected: ArrayRef =
2808    ///     std::sync::Arc::new(BooleanArray::from(vec![Some(true), None, Some(false)]));
2809    ///
2810    /// assert_eq!(&array, &expected);
2811    /// ```
2812    pub fn iter_to_array(
2813        scalars: impl IntoIterator<Item = ScalarValue>,
2814    ) -> Result<ArrayRef> {
2815        let mut scalars = scalars.into_iter().peekable();
2816
2817        // figure out the type based on the first element
2818        let data_type = match scalars.peek() {
2819            None => {
2820                return _exec_err!("Empty iterator passed to ScalarValue::iter_to_array");
2821            }
2822            Some(sv) => sv.data_type(),
2823        };
2824
2825        /// Creates an array of $ARRAY_TY by unpacking values of
2826        /// SCALAR_TY for primitive types
2827        macro_rules! build_array_primitive {
2828            ($ARRAY_TY:ident, $SCALAR_TY:ident) => {{
2829                {
2830                    let array = scalars
2831                        .map(|sv| {
2832                            if let ScalarValue::$SCALAR_TY(v) = sv {
2833                                Ok(v)
2834                            } else {
2835                                _exec_err!(
2836                                    "Inconsistent types in ScalarValue::iter_to_array. \
2837                                    Expected {:?}, got {:?}",
2838                                    data_type,
2839                                    sv
2840                                )
2841                            }
2842                        })
2843                        .collect::<Result<$ARRAY_TY>>()?;
2844                    Arc::new(array)
2845                }
2846            }};
2847        }
2848
2849        macro_rules! build_array_primitive_tz {
2850            ($ARRAY_TY:ident, $SCALAR_TY:ident, $TZ:expr) => {{
2851                {
2852                    let array = scalars
2853                        .map(|sv| {
2854                            if let ScalarValue::$SCALAR_TY(v, _) = sv {
2855                                Ok(v)
2856                            } else {
2857                                _exec_err!(
2858                                    "Inconsistent types in ScalarValue::iter_to_array. \
2859                                    Expected {:?}, got {:?}",
2860                                    data_type,
2861                                    sv
2862                                )
2863                            }
2864                        })
2865                        .collect::<Result<$ARRAY_TY>>()?;
2866                    Arc::new(array.with_timezone_opt($TZ.clone()))
2867                }
2868            }};
2869        }
2870
2871        /// Creates an array of $ARRAY_TY by unpacking values of
2872        /// SCALAR_TY for "string-like" types.
2873        macro_rules! build_array_string {
2874            ($ARRAY_TY:ident, $SCALAR_TY:ident) => {{
2875                {
2876                    let array = scalars
2877                        .map(|sv| {
2878                            if let ScalarValue::$SCALAR_TY(v) = sv {
2879                                Ok(v)
2880                            } else {
2881                                _exec_err!(
2882                                    "Inconsistent types in ScalarValue::iter_to_array. \
2883                                    Expected {:?}, got {:?}",
2884                                    data_type,
2885                                    sv
2886                                )
2887                            }
2888                        })
2889                        .collect::<Result<$ARRAY_TY>>()?;
2890                    Arc::new(array)
2891                }
2892            }};
2893        }
2894
2895        let array: ArrayRef = match &data_type {
2896            DataType::Decimal32(precision, scale) => {
2897                let decimal_array =
2898                    ScalarValue::iter_to_decimal32_array(scalars, *precision, *scale)?;
2899                Arc::new(decimal_array)
2900            }
2901            DataType::Decimal64(precision, scale) => {
2902                let decimal_array =
2903                    ScalarValue::iter_to_decimal64_array(scalars, *precision, *scale)?;
2904                Arc::new(decimal_array)
2905            }
2906            DataType::Decimal128(precision, scale) => {
2907                let decimal_array =
2908                    ScalarValue::iter_to_decimal128_array(scalars, *precision, *scale)?;
2909                Arc::new(decimal_array)
2910            }
2911            DataType::Decimal256(precision, scale) => {
2912                let decimal_array =
2913                    ScalarValue::iter_to_decimal256_array(scalars, *precision, *scale)?;
2914                Arc::new(decimal_array)
2915            }
2916            DataType::Null => ScalarValue::iter_to_null_array(scalars)?,
2917            DataType::Boolean => build_array_primitive!(BooleanArray, Boolean),
2918            DataType::Float16 => build_array_primitive!(Float16Array, Float16),
2919            DataType::Float32 => build_array_primitive!(Float32Array, Float32),
2920            DataType::Float64 => build_array_primitive!(Float64Array, Float64),
2921            DataType::Int8 => build_array_primitive!(Int8Array, Int8),
2922            DataType::Int16 => build_array_primitive!(Int16Array, Int16),
2923            DataType::Int32 => build_array_primitive!(Int32Array, Int32),
2924            DataType::Int64 => build_array_primitive!(Int64Array, Int64),
2925            DataType::UInt8 => build_array_primitive!(UInt8Array, UInt8),
2926            DataType::UInt16 => build_array_primitive!(UInt16Array, UInt16),
2927            DataType::UInt32 => build_array_primitive!(UInt32Array, UInt32),
2928            DataType::UInt64 => build_array_primitive!(UInt64Array, UInt64),
2929            DataType::Utf8View => build_array_string!(StringViewArray, Utf8View),
2930            DataType::Utf8 => build_array_string!(StringArray, Utf8),
2931            DataType::LargeUtf8 => build_array_string!(LargeStringArray, LargeUtf8),
2932            DataType::BinaryView => build_array_string!(BinaryViewArray, BinaryView),
2933            DataType::Binary => build_array_string!(BinaryArray, Binary),
2934            DataType::LargeBinary => build_array_string!(LargeBinaryArray, LargeBinary),
2935            DataType::Date32 => build_array_primitive!(Date32Array, Date32),
2936            DataType::Date64 => build_array_primitive!(Date64Array, Date64),
2937            DataType::Time32(TimeUnit::Second) => {
2938                build_array_primitive!(Time32SecondArray, Time32Second)
2939            }
2940            DataType::Time32(TimeUnit::Millisecond) => {
2941                build_array_primitive!(Time32MillisecondArray, Time32Millisecond)
2942            }
2943            DataType::Time64(TimeUnit::Microsecond) => {
2944                build_array_primitive!(Time64MicrosecondArray, Time64Microsecond)
2945            }
2946            DataType::Time64(TimeUnit::Nanosecond) => {
2947                build_array_primitive!(Time64NanosecondArray, Time64Nanosecond)
2948            }
2949            DataType::Timestamp(TimeUnit::Second, tz) => {
2950                build_array_primitive_tz!(TimestampSecondArray, TimestampSecond, tz)
2951            }
2952            DataType::Timestamp(TimeUnit::Millisecond, tz) => {
2953                build_array_primitive_tz!(
2954                    TimestampMillisecondArray,
2955                    TimestampMillisecond,
2956                    tz
2957                )
2958            }
2959            DataType::Timestamp(TimeUnit::Microsecond, tz) => {
2960                build_array_primitive_tz!(
2961                    TimestampMicrosecondArray,
2962                    TimestampMicrosecond,
2963                    tz
2964                )
2965            }
2966            DataType::Timestamp(TimeUnit::Nanosecond, tz) => {
2967                build_array_primitive_tz!(
2968                    TimestampNanosecondArray,
2969                    TimestampNanosecond,
2970                    tz
2971                )
2972            }
2973            DataType::Duration(TimeUnit::Second) => {
2974                build_array_primitive!(DurationSecondArray, DurationSecond)
2975            }
2976            DataType::Duration(TimeUnit::Millisecond) => {
2977                build_array_primitive!(DurationMillisecondArray, DurationMillisecond)
2978            }
2979            DataType::Duration(TimeUnit::Microsecond) => {
2980                build_array_primitive!(DurationMicrosecondArray, DurationMicrosecond)
2981            }
2982            DataType::Duration(TimeUnit::Nanosecond) => {
2983                build_array_primitive!(DurationNanosecondArray, DurationNanosecond)
2984            }
2985            DataType::Interval(IntervalUnit::DayTime) => {
2986                build_array_primitive!(IntervalDayTimeArray, IntervalDayTime)
2987            }
2988            DataType::Interval(IntervalUnit::YearMonth) => {
2989                build_array_primitive!(IntervalYearMonthArray, IntervalYearMonth)
2990            }
2991            DataType::Interval(IntervalUnit::MonthDayNano) => {
2992                build_array_primitive!(IntervalMonthDayNanoArray, IntervalMonthDayNano)
2993            }
2994            DataType::FixedSizeList(_, _) => {
2995                // arrow::compute::concat does not allow inconsistent types including the size of FixedSizeList.
2996                // The length of nulls here we got is 1, so we need to resize the length of nulls to
2997                // the length of non-nulls.
2998                let mut arrays =
2999                    scalars.map(|s| s.to_array()).collect::<Result<Vec<_>>>()?;
3000                let first_non_null_data_type = arrays
3001                    .iter()
3002                    .find(|sv| !sv.is_null(0))
3003                    .map(|sv| sv.data_type().to_owned());
3004                if let Some(DataType::FixedSizeList(f, l)) = first_non_null_data_type {
3005                    for array in arrays.iter_mut() {
3006                        if array.is_null(0) {
3007                            *array = Arc::new(FixedSizeListArray::new_null(
3008                                Arc::clone(&f),
3009                                l,
3010                                1,
3011                            ));
3012                        }
3013                    }
3014                }
3015                let arrays = arrays.iter().map(|a| a.as_ref()).collect::<Vec<_>>();
3016                arrow::compute::concat(arrays.as_slice())?
3017            }
3018            DataType::List(_)
3019            | DataType::LargeList(_)
3020            | DataType::ListView(_)
3021            | DataType::LargeListView(_)
3022            | DataType::Map(_, _)
3023            | DataType::Struct(_)
3024            | DataType::Union(_, _) => {
3025                let arrays = scalars.map(|s| s.to_array()).collect::<Result<Vec<_>>>()?;
3026                let arrays = arrays.iter().map(|a| a.as_ref()).collect::<Vec<_>>();
3027                arrow::compute::concat(arrays.as_slice())?
3028            }
3029            DataType::Dictionary(key_type, value_type) => {
3030                // create the values array
3031                let value_scalars = scalars
3032                    .map(|scalar| match scalar {
3033                        ScalarValue::Dictionary(inner_key_type, scalar) => {
3034                            if &inner_key_type == key_type {
3035                                Ok(*scalar)
3036                            } else {
3037                                _exec_err!("Expected inner key type of {key_type} but found: {inner_key_type}, value was ({scalar:?})")
3038                            }
3039                        }
3040                        _ => {
3041                            _exec_err!(
3042                                "Expected scalar of type {value_type} but found: {scalar} {scalar:?}"
3043                            )
3044                        }
3045                    })
3046                    .collect::<Result<Vec<_>>>()?;
3047
3048                let values = Self::iter_to_array(value_scalars)?;
3049                assert_eq!(values.data_type(), value_type.as_ref());
3050
3051                match key_type.as_ref() {
3052                    DataType::Int8 => dict_from_values::<Int8Type>(values)?,
3053                    DataType::Int16 => dict_from_values::<Int16Type>(values)?,
3054                    DataType::Int32 => dict_from_values::<Int32Type>(values)?,
3055                    DataType::Int64 => dict_from_values::<Int64Type>(values)?,
3056                    DataType::UInt8 => dict_from_values::<UInt8Type>(values)?,
3057                    DataType::UInt16 => dict_from_values::<UInt16Type>(values)?,
3058                    DataType::UInt32 => dict_from_values::<UInt32Type>(values)?,
3059                    DataType::UInt64 => dict_from_values::<UInt64Type>(values)?,
3060                    _ => unreachable!("Invalid dictionary keys type: {}", key_type),
3061                }
3062            }
3063            DataType::RunEndEncoded(run_ends_field, value_field) => {
3064                fn make_run_array<R: RunEndIndexType>(
3065                    scalars: impl IntoIterator<Item = ScalarValue>,
3066                    run_ends_field: &FieldRef,
3067                    values_field: &FieldRef,
3068                ) -> Result<ArrayRef> {
3069                    let mut scalars = scalars.into_iter();
3070
3071                    let mut run_ends = vec![];
3072                    let mut value_scalars = vec![];
3073
3074                    let mut len = R::Native::ONE;
3075                    let mut current =
3076                        if let Some(ScalarValue::RunEndEncoded(_, _, scalar)) =
3077                            scalars.next()
3078                        {
3079                            *scalar
3080                        } else {
3081                            // We are guaranteed to have one element of correct
3082                            // type because we peeked above
3083                            unreachable!()
3084                        };
3085                    for scalar in scalars {
3086                        let scalar = match scalar {
3087                            ScalarValue::RunEndEncoded(
3088                                inner_run_ends_field,
3089                                inner_value_field,
3090                                scalar,
3091                            ) if &inner_run_ends_field == run_ends_field
3092                                && &inner_value_field == values_field =>
3093                            {
3094                                *scalar
3095                            }
3096                            _ => {
3097                                return _exec_err!(
3098                                    "Expected RunEndEncoded scalar with run-ends field {run_ends_field} but got: {scalar:?}"
3099                                );
3100                            }
3101                        };
3102
3103                        // new run
3104                        if scalar != current {
3105                            run_ends.push(len);
3106                            value_scalars.push(current);
3107                            current = scalar;
3108                        }
3109
3110                        len = len.add_checked(R::Native::ONE).map_err(|_| {
3111                            DataFusionError::Execution(format!(
3112                                "Cannot construct RunArray: Overflows run-ends type {}",
3113                                run_ends_field.data_type()
3114                            ))
3115                        })?;
3116                    }
3117
3118                    run_ends.push(len);
3119                    value_scalars.push(current);
3120
3121                    let run_ends = PrimitiveArray::<R>::from_iter_values(run_ends);
3122                    let values = ScalarValue::iter_to_array(value_scalars)?;
3123
3124                    // Using ArrayDataBuilder so we can maintain the fields
3125                    let dt = DataType::RunEndEncoded(
3126                        Arc::clone(run_ends_field),
3127                        Arc::clone(values_field),
3128                    );
3129                    let builder = ArrayDataBuilder::new(dt)
3130                        .len(RunArray::logical_len(&run_ends))
3131                        .add_child_data(run_ends.to_data())
3132                        .add_child_data(values.to_data());
3133                    let run_array = RunArray::<R>::from(builder.build()?);
3134
3135                    Ok(Arc::new(run_array))
3136                }
3137
3138                match run_ends_field.data_type() {
3139                    DataType::Int16 => {
3140                        make_run_array::<Int16Type>(scalars, run_ends_field, value_field)?
3141                    }
3142                    DataType::Int32 => {
3143                        make_run_array::<Int32Type>(scalars, run_ends_field, value_field)?
3144                    }
3145                    DataType::Int64 => {
3146                        make_run_array::<Int64Type>(scalars, run_ends_field, value_field)?
3147                    }
3148                    dt => unreachable!("Invalid run-ends type: {dt}"),
3149                }
3150            }
3151            DataType::FixedSizeBinary(size) => {
3152                let array = scalars
3153                    .map(|sv| {
3154                        if let ScalarValue::FixedSizeBinary(_, v) = sv {
3155                            Ok(v)
3156                        } else {
3157                            _exec_err!(
3158                                "Inconsistent types in ScalarValue::iter_to_array. \
3159                                Expected {data_type}, got {sv:?}"
3160                            )
3161                        }
3162                    })
3163                    .collect::<Result<Vec<_>>>()?;
3164                let array = FixedSizeBinaryArray::try_from_sparse_iter_with_size(
3165                    array.into_iter(),
3166                    *size,
3167                )?;
3168                Arc::new(array)
3169            }
3170            // explicitly enumerate unsupported types so newly added
3171            // types must be acknowledged, Time32 and Time64 types are
3172            // not supported if the TimeUnit is not valid (Time32 can
3173            // only be used with Second and Millisecond, Time64 only
3174            // with Microsecond and Nanosecond)
3175            DataType::Time32(TimeUnit::Microsecond)
3176            | DataType::Time32(TimeUnit::Nanosecond)
3177            | DataType::Time64(TimeUnit::Second)
3178            | DataType::Time64(TimeUnit::Millisecond) => {
3179                return _not_impl_err!(
3180                    "Unsupported creation of {:?} array from ScalarValue {:?}",
3181                    data_type,
3182                    scalars.peek()
3183                );
3184            }
3185        };
3186        Ok(array)
3187    }
3188
3189    fn iter_to_null_array(
3190        scalars: impl IntoIterator<Item = ScalarValue>,
3191    ) -> Result<ArrayRef> {
3192        let length = scalars.into_iter().try_fold(
3193            0usize,
3194            |r, element: ScalarValue| match element {
3195                ScalarValue::Null => Ok::<usize, DataFusionError>(r + 1),
3196                s => {
3197                    _internal_err!("Expected ScalarValue::Null element. Received {s:?}")
3198                }
3199            },
3200        )?;
3201        Ok(new_null_array(&DataType::Null, length))
3202    }
3203
3204    fn iter_to_decimal32_array(
3205        scalars: impl IntoIterator<Item = ScalarValue>,
3206        precision: u8,
3207        scale: i8,
3208    ) -> Result<Decimal32Array> {
3209        let array = scalars
3210            .into_iter()
3211            .map(|element: ScalarValue| match element {
3212                ScalarValue::Decimal32(v1, _, _) => Ok(v1),
3213                s => {
3214                    _internal_err!("Expected ScalarValue::Null element. Received {s:?}")
3215                }
3216            })
3217            .collect::<Result<Decimal32Array>>()?
3218            .with_precision_and_scale(precision, scale)?;
3219        Ok(array)
3220    }
3221
3222    fn iter_to_decimal64_array(
3223        scalars: impl IntoIterator<Item = ScalarValue>,
3224        precision: u8,
3225        scale: i8,
3226    ) -> Result<Decimal64Array> {
3227        let array = scalars
3228            .into_iter()
3229            .map(|element: ScalarValue| match element {
3230                ScalarValue::Decimal64(v1, _, _) => Ok(v1),
3231                s => {
3232                    _internal_err!("Expected ScalarValue::Null element. Received {s:?}")
3233                }
3234            })
3235            .collect::<Result<Decimal64Array>>()?
3236            .with_precision_and_scale(precision, scale)?;
3237        Ok(array)
3238    }
3239
3240    fn iter_to_decimal128_array(
3241        scalars: impl IntoIterator<Item = ScalarValue>,
3242        precision: u8,
3243        scale: i8,
3244    ) -> Result<Decimal128Array> {
3245        let array = scalars
3246            .into_iter()
3247            .map(|element: ScalarValue| match element {
3248                ScalarValue::Decimal128(v1, _, _) => Ok(v1),
3249                s => {
3250                    _internal_err!("Expected ScalarValue::Null element. Received {s:?}")
3251                }
3252            })
3253            .collect::<Result<Decimal128Array>>()?
3254            .with_precision_and_scale(precision, scale)?;
3255        Ok(array)
3256    }
3257
3258    fn iter_to_decimal256_array(
3259        scalars: impl IntoIterator<Item = ScalarValue>,
3260        precision: u8,
3261        scale: i8,
3262    ) -> Result<Decimal256Array> {
3263        let array = scalars
3264            .into_iter()
3265            .map(|element: ScalarValue| match element {
3266                ScalarValue::Decimal256(v1, _, _) => Ok(v1),
3267                s => {
3268                    _internal_err!(
3269                        "Expected ScalarValue::Decimal256 element. Received {s:?}"
3270                    )
3271                }
3272            })
3273            .collect::<Result<Decimal256Array>>()?
3274            .with_precision_and_scale(precision, scale)?;
3275        Ok(array)
3276    }
3277
3278    /// Converts `Vec<ScalarValue>` where each element has type corresponding to
3279    /// `data_type`, to a single element [`ListArray`].
3280    ///
3281    /// Example
3282    /// ```
3283    /// use arrow::array::{Int32Array, ListArray};
3284    /// use arrow::datatypes::{DataType, Int32Type};
3285    /// use datafusion_common::cast::as_list_array;
3286    /// use datafusion_common::ScalarValue;
3287    ///
3288    /// let scalars = vec![
3289    ///     ScalarValue::Int32(Some(1)),
3290    ///     ScalarValue::Int32(None),
3291    ///     ScalarValue::Int32(Some(2)),
3292    /// ];
3293    ///
3294    /// let result = ScalarValue::new_list(&scalars, &DataType::Int32, true);
3295    ///
3296    /// let expected = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
3297    ///     Some(1),
3298    ///     None,
3299    ///     Some(2),
3300    /// ])]);
3301    ///
3302    /// assert_eq!(*result, expected);
3303    /// ```
3304    pub fn new_list(
3305        values: &[ScalarValue],
3306        data_type: &DataType,
3307        nullable: bool,
3308    ) -> Arc<ListArray> {
3309        let values = if values.is_empty() {
3310            new_empty_array(data_type)
3311        } else {
3312            let arr = Self::iter_to_array(values.iter().cloned()).unwrap();
3313            cast_with_options(&arr, data_type, &DEFAULT_CAST_OPTIONS).unwrap()
3314        };
3315        Arc::new(
3316            SingleRowListArrayBuilder::new(values)
3317                .with_nullable(nullable)
3318                .build_list_array(),
3319        )
3320    }
3321
3322    /// Same as [`ScalarValue::new_list`] but with nullable set to true.
3323    pub fn new_list_nullable(
3324        values: &[ScalarValue],
3325        data_type: &DataType,
3326    ) -> Arc<ListArray> {
3327        Self::new_list(values, data_type, true)
3328    }
3329
3330    /// Create ListArray with Null with specific data type
3331    ///
3332    /// - new_null_list(i32, nullable, 1): `ListArray[NULL]`
3333    pub fn new_null_list(data_type: DataType, nullable: bool, null_len: usize) -> Self {
3334        let data_type = DataType::List(Field::new_list_field(data_type, nullable).into());
3335        Self::List(Arc::new(ListArray::from(ArrayData::new_null(
3336            &data_type, null_len,
3337        ))))
3338    }
3339
3340    /// Converts `IntoIterator<Item = ScalarValue>` where each element has type corresponding to
3341    /// `data_type`, to a [`ListArray`].
3342    ///
3343    /// Example
3344    /// ```
3345    /// use arrow::array::{Int32Array, ListArray};
3346    /// use arrow::datatypes::{DataType, Int32Type};
3347    /// use datafusion_common::cast::as_list_array;
3348    /// use datafusion_common::ScalarValue;
3349    ///
3350    /// let scalars = vec![
3351    ///     ScalarValue::Int32(Some(1)),
3352    ///     ScalarValue::Int32(None),
3353    ///     ScalarValue::Int32(Some(2)),
3354    /// ];
3355    ///
3356    /// let result =
3357    ///     ScalarValue::new_list_from_iter(scalars.into_iter(), &DataType::Int32, true);
3358    ///
3359    /// let expected = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
3360    ///     Some(1),
3361    ///     None,
3362    ///     Some(2),
3363    /// ])]);
3364    ///
3365    /// assert_eq!(*result, expected);
3366    /// ```
3367    pub fn new_list_from_iter(
3368        values: impl IntoIterator<Item = ScalarValue> + ExactSizeIterator,
3369        data_type: &DataType,
3370        nullable: bool,
3371    ) -> Arc<ListArray> {
3372        let values = if values.len() == 0 {
3373            new_empty_array(data_type)
3374        } else {
3375            let arr = Self::iter_to_array(values).unwrap();
3376            cast_with_options(&arr, data_type, &DEFAULT_CAST_OPTIONS).unwrap()
3377        };
3378        Arc::new(
3379            SingleRowListArrayBuilder::new(values)
3380                .with_nullable(nullable)
3381                .build_list_array(),
3382        )
3383    }
3384
3385    /// Converts `Vec<ScalarValue>` where each element has type corresponding to
3386    /// `data_type`, to a [`LargeListArray`].
3387    ///
3388    /// Example
3389    /// ```
3390    /// use arrow::array::{Int32Array, LargeListArray};
3391    /// use arrow::datatypes::{DataType, Int32Type};
3392    /// use datafusion_common::cast::as_large_list_array;
3393    /// use datafusion_common::ScalarValue;
3394    ///
3395    /// let scalars = vec![
3396    ///     ScalarValue::Int32(Some(1)),
3397    ///     ScalarValue::Int32(None),
3398    ///     ScalarValue::Int32(Some(2)),
3399    /// ];
3400    ///
3401    /// let result = ScalarValue::new_large_list(&scalars, &DataType::Int32);
3402    ///
3403    /// let expected =
3404    ///     LargeListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
3405    ///         Some(1),
3406    ///         None,
3407    ///         Some(2),
3408    ///     ])]);
3409    ///
3410    /// assert_eq!(*result, expected);
3411    /// ```
3412    pub fn new_large_list(
3413        values: &[ScalarValue],
3414        data_type: &DataType,
3415    ) -> Arc<LargeListArray> {
3416        let values = if values.is_empty() {
3417            new_empty_array(data_type)
3418        } else {
3419            let arr = Self::iter_to_array(values.iter().cloned()).unwrap();
3420            cast_with_options(&arr, data_type, &DEFAULT_CAST_OPTIONS).unwrap()
3421        };
3422        Arc::new(SingleRowListArrayBuilder::new(values).build_large_list_array())
3423    }
3424
3425    /// Converts a scalar value into an array of `size` rows.
3426    ///
3427    /// # Errors
3428    ///
3429    /// Errors if `self` is
3430    /// - a decimal that fails be converted to a decimal array of size
3431    /// - a `FixedSizeList` that fails to be concatenated into an array of size
3432    /// - a `List` that fails to be concatenated into an array of size
3433    /// - a `Dictionary` that fails be converted to a dictionary array of size
3434    pub fn to_array_of_size(&self, size: usize) -> Result<ArrayRef> {
3435        Ok(match self {
3436            ScalarValue::Decimal32(Some(e), precision, scale) => Arc::new(
3437                Decimal32Array::from_value(*e, size)
3438                    .with_precision_and_scale(*precision, *scale)?,
3439            ),
3440            ScalarValue::Decimal32(None, precision, scale) => {
3441                new_null_array(&DataType::Decimal32(*precision, *scale), size)
3442            }
3443            ScalarValue::Decimal64(Some(e), precision, scale) => Arc::new(
3444                Decimal64Array::from_value(*e, size)
3445                    .with_precision_and_scale(*precision, *scale)?,
3446            ),
3447            ScalarValue::Decimal64(None, precision, scale) => {
3448                new_null_array(&DataType::Decimal64(*precision, *scale), size)
3449            }
3450            ScalarValue::Decimal128(Some(e), precision, scale) => Arc::new(
3451                Decimal128Array::from_value(*e, size)
3452                    .with_precision_and_scale(*precision, *scale)?,
3453            ),
3454            ScalarValue::Decimal128(None, precision, scale) => {
3455                new_null_array(&DataType::Decimal128(*precision, *scale), size)
3456            }
3457            ScalarValue::Decimal256(Some(e), precision, scale) => Arc::new(
3458                Decimal256Array::from_value(*e, size)
3459                    .with_precision_and_scale(*precision, *scale)?,
3460            ),
3461            ScalarValue::Decimal256(None, precision, scale) => {
3462                new_null_array(&DataType::Decimal256(*precision, *scale), size)
3463            }
3464
3465            ScalarValue::Boolean(e) => match e {
3466                None => new_null_array(&DataType::Boolean, size),
3467                Some(true) => {
3468                    Arc::new(BooleanArray::new(BooleanBuffer::new_set(size), None))
3469                        as ArrayRef
3470                }
3471                Some(false) => {
3472                    Arc::new(BooleanArray::new(BooleanBuffer::new_unset(size), None))
3473                        as ArrayRef
3474                }
3475            },
3476            ScalarValue::Float64(e) => {
3477                build_array_from_option!(Float64, Float64Array, e, size)
3478            }
3479            ScalarValue::Float32(e) => {
3480                build_array_from_option!(Float32, Float32Array, e, size)
3481            }
3482            ScalarValue::Float16(e) => {
3483                build_array_from_option!(Float16, Float16Array, e, size)
3484            }
3485            ScalarValue::Int8(e) => build_array_from_option!(Int8, Int8Array, e, size),
3486            ScalarValue::Int16(e) => build_array_from_option!(Int16, Int16Array, e, size),
3487            ScalarValue::Int32(e) => build_array_from_option!(Int32, Int32Array, e, size),
3488            ScalarValue::Int64(e) => build_array_from_option!(Int64, Int64Array, e, size),
3489            ScalarValue::UInt8(e) => build_array_from_option!(UInt8, UInt8Array, e, size),
3490            ScalarValue::UInt16(e) => {
3491                build_array_from_option!(UInt16, UInt16Array, e, size)
3492            }
3493            ScalarValue::UInt32(e) => {
3494                build_array_from_option!(UInt32, UInt32Array, e, size)
3495            }
3496            ScalarValue::UInt64(e) => {
3497                build_array_from_option!(UInt64, UInt64Array, e, size)
3498            }
3499            ScalarValue::TimestampSecond(e, tz_opt) => {
3500                build_timestamp_array_from_option!(
3501                    TimeUnit::Second,
3502                    tz_opt.clone(),
3503                    TimestampSecondArray,
3504                    e,
3505                    size
3506                )
3507            }
3508            ScalarValue::TimestampMillisecond(e, tz_opt) => {
3509                build_timestamp_array_from_option!(
3510                    TimeUnit::Millisecond,
3511                    tz_opt.clone(),
3512                    TimestampMillisecondArray,
3513                    e,
3514                    size
3515                )
3516            }
3517
3518            ScalarValue::TimestampMicrosecond(e, tz_opt) => {
3519                build_timestamp_array_from_option!(
3520                    TimeUnit::Microsecond,
3521                    tz_opt.clone(),
3522                    TimestampMicrosecondArray,
3523                    e,
3524                    size
3525                )
3526            }
3527            ScalarValue::TimestampNanosecond(e, tz_opt) => {
3528                build_timestamp_array_from_option!(
3529                    TimeUnit::Nanosecond,
3530                    tz_opt.clone(),
3531                    TimestampNanosecondArray,
3532                    e,
3533                    size
3534                )
3535            }
3536            ScalarValue::Utf8(e) => match e {
3537                Some(value) => Arc::new(StringArray::new_repeated(value, size)),
3538                None => new_null_array(&DataType::Utf8, size),
3539            },
3540            ScalarValue::Utf8View(e) => match e {
3541                Some(value) => {
3542                    let mut builder = StringViewBuilder::with_capacity(size);
3543                    builder.try_append_value_n(value, size)?;
3544                    let array = builder.finish();
3545                    Arc::new(array)
3546                }
3547                None => new_null_array(&DataType::Utf8View, size),
3548            },
3549            ScalarValue::LargeUtf8(e) => match e {
3550                Some(value) => Arc::new(LargeStringArray::new_repeated(value, size)),
3551                None => new_null_array(&DataType::LargeUtf8, size),
3552            },
3553            ScalarValue::Binary(e) => match e {
3554                Some(value) => {
3555                    Arc::new(BinaryArray::new_repeated(value.as_slice(), size))
3556                }
3557                None => new_null_array(&DataType::Binary, size),
3558            },
3559            ScalarValue::BinaryView(e) => match e {
3560                Some(value) => {
3561                    let mut builder = BinaryViewBuilder::with_capacity(size);
3562                    builder.try_append_value_n(value, size)?;
3563                    let array = builder.finish();
3564                    Arc::new(array)
3565                }
3566                None => new_null_array(&DataType::BinaryView, size),
3567            },
3568            ScalarValue::FixedSizeBinary(s, e) => match e {
3569                Some(value) => Arc::new(
3570                    FixedSizeBinaryArray::try_from_sparse_iter_with_size(
3571                        repeat_n(Some(value.as_slice()), size),
3572                        *s,
3573                    )
3574                    .unwrap(),
3575                ),
3576                None => Arc::new(FixedSizeBinaryArray::new_null(*s, size)),
3577            },
3578            ScalarValue::LargeBinary(e) => match e {
3579                Some(value) => {
3580                    Arc::new(LargeBinaryArray::new_repeated(value.as_slice(), size))
3581                }
3582                None => new_null_array(&DataType::LargeBinary, size),
3583            },
3584            ScalarValue::List(arr) => {
3585                if size == 1 {
3586                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3587                }
3588                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3589            }
3590            ScalarValue::LargeList(arr) => {
3591                if size == 1 {
3592                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3593                }
3594                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3595            }
3596            ScalarValue::FixedSizeList(arr) => {
3597                if size == 1 {
3598                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3599                }
3600                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3601            }
3602            ScalarValue::ListView(arr) => {
3603                if size == 1 {
3604                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3605                }
3606                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3607            }
3608            ScalarValue::LargeListView(arr) => {
3609                if size == 1 {
3610                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3611                }
3612                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3613            }
3614            ScalarValue::Struct(arr) => {
3615                if size == 1 {
3616                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3617                }
3618                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3619            }
3620            ScalarValue::Map(arr) => {
3621                if size == 1 {
3622                    return Ok(Arc::clone(arr) as Arc<dyn Array>);
3623                }
3624                Self::list_to_array_of_size(arr.as_ref() as &dyn Array, size)?
3625            }
3626            ScalarValue::Date32(e) => {
3627                build_array_from_option!(Date32, Date32Array, e, size)
3628            }
3629            ScalarValue::Date64(e) => {
3630                build_array_from_option!(Date64, Date64Array, e, size)
3631            }
3632            ScalarValue::Time32Second(e) => {
3633                build_array_from_option!(
3634                    Time32,
3635                    TimeUnit::Second,
3636                    Time32SecondArray,
3637                    e,
3638                    size
3639                )
3640            }
3641            ScalarValue::Time32Millisecond(e) => {
3642                build_array_from_option!(
3643                    Time32,
3644                    TimeUnit::Millisecond,
3645                    Time32MillisecondArray,
3646                    e,
3647                    size
3648                )
3649            }
3650            ScalarValue::Time64Microsecond(e) => {
3651                build_array_from_option!(
3652                    Time64,
3653                    TimeUnit::Microsecond,
3654                    Time64MicrosecondArray,
3655                    e,
3656                    size
3657                )
3658            }
3659            ScalarValue::Time64Nanosecond(e) => {
3660                build_array_from_option!(
3661                    Time64,
3662                    TimeUnit::Nanosecond,
3663                    Time64NanosecondArray,
3664                    e,
3665                    size
3666                )
3667            }
3668            ScalarValue::IntervalDayTime(e) => build_array_from_option!(
3669                Interval,
3670                IntervalUnit::DayTime,
3671                IntervalDayTimeArray,
3672                e,
3673                size
3674            ),
3675            ScalarValue::IntervalYearMonth(e) => build_array_from_option!(
3676                Interval,
3677                IntervalUnit::YearMonth,
3678                IntervalYearMonthArray,
3679                e,
3680                size
3681            ),
3682            ScalarValue::IntervalMonthDayNano(e) => build_array_from_option!(
3683                Interval,
3684                IntervalUnit::MonthDayNano,
3685                IntervalMonthDayNanoArray,
3686                e,
3687                size
3688            ),
3689            ScalarValue::DurationSecond(e) => build_array_from_option!(
3690                Duration,
3691                TimeUnit::Second,
3692                DurationSecondArray,
3693                e,
3694                size
3695            ),
3696            ScalarValue::DurationMillisecond(e) => build_array_from_option!(
3697                Duration,
3698                TimeUnit::Millisecond,
3699                DurationMillisecondArray,
3700                e,
3701                size
3702            ),
3703            ScalarValue::DurationMicrosecond(e) => build_array_from_option!(
3704                Duration,
3705                TimeUnit::Microsecond,
3706                DurationMicrosecondArray,
3707                e,
3708                size
3709            ),
3710            ScalarValue::DurationNanosecond(e) => build_array_from_option!(
3711                Duration,
3712                TimeUnit::Nanosecond,
3713                DurationNanosecondArray,
3714                e,
3715                size
3716            ),
3717            ScalarValue::Union(value, fields, mode) => match value {
3718                Some((v_id, value)) => {
3719                    let mut new_fields = Vec::with_capacity(fields.len());
3720                    let mut child_arrays = Vec::<ArrayRef>::with_capacity(fields.len());
3721                    for (f_id, field) in fields.iter() {
3722                        let ar = if f_id == *v_id {
3723                            value.to_array_of_size(size)?
3724                        } else {
3725                            let dt = field.data_type();
3726                            match mode {
3727                                UnionMode::Sparse => new_null_array(dt, size),
3728                                // In a dense union, only the child with values needs to be
3729                                // allocated
3730                                UnionMode::Dense => new_null_array(dt, 0),
3731                            }
3732                        };
3733                        let field = (**field).clone();
3734                        child_arrays.push(ar);
3735                        new_fields.push(field.clone());
3736                    }
3737                    let type_ids = repeat_n(*v_id, size);
3738                    let type_ids = ScalarBuffer::<i8>::from_iter(type_ids);
3739                    let value_offsets = match mode {
3740                        UnionMode::Sparse => None,
3741                        UnionMode::Dense => Some(ScalarBuffer::from_iter(0..size as i32)),
3742                    };
3743                    let ar = UnionArray::try_new(
3744                        fields.clone(),
3745                        type_ids,
3746                        value_offsets,
3747                        child_arrays,
3748                    )
3749                    .map_err(|e| DataFusionError::ArrowError(Box::new(e), None))?;
3750                    Arc::new(ar)
3751                }
3752                None => new_null_array(&DataType::Union(fields.clone(), *mode), size),
3753            },
3754            ScalarValue::Dictionary(key_type, v) => {
3755                // values array is one element long (the value)
3756                match key_type.as_ref() {
3757                    DataType::Int8 => dict_from_scalar::<Int8Type>(v, size)?,
3758                    DataType::Int16 => dict_from_scalar::<Int16Type>(v, size)?,
3759                    DataType::Int32 => dict_from_scalar::<Int32Type>(v, size)?,
3760                    DataType::Int64 => dict_from_scalar::<Int64Type>(v, size)?,
3761                    DataType::UInt8 => dict_from_scalar::<UInt8Type>(v, size)?,
3762                    DataType::UInt16 => dict_from_scalar::<UInt16Type>(v, size)?,
3763                    DataType::UInt32 => dict_from_scalar::<UInt32Type>(v, size)?,
3764                    DataType::UInt64 => dict_from_scalar::<UInt64Type>(v, size)?,
3765                    _ => unreachable!("Invalid dictionary keys type: {}", key_type),
3766                }
3767            }
3768            ScalarValue::RunEndEncoded(run_ends_field, values_field, value) => {
3769                fn make_run_array<R: RunEndIndexType>(
3770                    run_ends_field: &Arc<Field>,
3771                    values_field: &Arc<Field>,
3772                    value: &ScalarValue,
3773                    size: usize,
3774                ) -> Result<ArrayRef> {
3775                    let size_native = R::Native::from_usize(size)
3776                        .ok_or_else(|| DataFusionError::Execution(format!("Cannot construct RunArray of size {size}: Overflows run-ends type {}", R::DATA_TYPE)))?;
3777                    let values = value.to_array_of_size(1)?;
3778                    let run_ends =
3779                        PrimitiveArray::<R>::new(vec![size_native].into(), None);
3780
3781                    // Using ArrayDataBuilder so we can maintain the fields
3782                    let dt = DataType::RunEndEncoded(
3783                        Arc::clone(run_ends_field),
3784                        Arc::clone(values_field),
3785                    );
3786                    let builder = ArrayDataBuilder::new(dt)
3787                        .len(size)
3788                        .add_child_data(run_ends.to_data())
3789                        .add_child_data(values.to_data());
3790                    let run_array = RunArray::<R>::from(builder.build()?);
3791
3792                    Ok(Arc::new(run_array))
3793                }
3794                match run_ends_field.data_type() {
3795                    DataType::Int16 => make_run_array::<Int16Type>(
3796                        run_ends_field,
3797                        values_field,
3798                        value,
3799                        size,
3800                    )?,
3801                    DataType::Int32 => make_run_array::<Int32Type>(
3802                        run_ends_field,
3803                        values_field,
3804                        value,
3805                        size,
3806                    )?,
3807                    DataType::Int64 => make_run_array::<Int64Type>(
3808                        run_ends_field,
3809                        values_field,
3810                        value,
3811                        size,
3812                    )?,
3813                    dt => unreachable!("Invalid run-ends type: {dt}"),
3814                }
3815            }
3816            ScalarValue::Null => get_or_create_cached_null_array(size),
3817        })
3818    }
3819
3820    fn get_decimal_value_from_array(
3821        array: &dyn Array,
3822        index: usize,
3823        precision: u8,
3824        scale: i8,
3825    ) -> Result<ScalarValue> {
3826        match array.data_type() {
3827            DataType::Decimal32(_, _) => {
3828                let array = as_decimal32_array(array)?;
3829                if array.is_null(index) {
3830                    Ok(ScalarValue::Decimal32(None, precision, scale))
3831                } else {
3832                    let value = array.value(index);
3833                    Ok(ScalarValue::Decimal32(Some(value), precision, scale))
3834                }
3835            }
3836            DataType::Decimal64(_, _) => {
3837                let array = as_decimal64_array(array)?;
3838                if array.is_null(index) {
3839                    Ok(ScalarValue::Decimal64(None, precision, scale))
3840                } else {
3841                    let value = array.value(index);
3842                    Ok(ScalarValue::Decimal64(Some(value), precision, scale))
3843                }
3844            }
3845            DataType::Decimal128(_, _) => {
3846                let array = as_decimal128_array(array)?;
3847                if array.is_null(index) {
3848                    Ok(ScalarValue::Decimal128(None, precision, scale))
3849                } else {
3850                    let value = array.value(index);
3851                    Ok(ScalarValue::Decimal128(Some(value), precision, scale))
3852                }
3853            }
3854            DataType::Decimal256(_, _) => {
3855                let array = as_decimal256_array(array)?;
3856                if array.is_null(index) {
3857                    Ok(ScalarValue::Decimal256(None, precision, scale))
3858                } else {
3859                    let value = array.value(index);
3860                    Ok(ScalarValue::Decimal256(Some(value), precision, scale))
3861                }
3862            }
3863            other => {
3864                unreachable!("Invalid type isn't decimal: {other:?}")
3865            }
3866        }
3867    }
3868
3869    /// Repeats the rows of `arr` `size` times, producing an array with
3870    /// `arr.len() * size` total rows.
3871    fn list_to_array_of_size(arr: &dyn Array, size: usize) -> Result<ArrayRef> {
3872        if size == 0 {
3873            return Ok(arr.slice(0, 0));
3874        }
3875
3876        // Examples: given `arr = [[A, B, C]]` and `size = 3`, `indices = [0, 0, 0]` and
3877        // the result is `[[A, B, C], [A, B, C], [A, B, C]]`.
3878        //
3879        // Given `arr = [[A, B], [C]]` and `size = 2`, `indices = [0, 1, 0, 1]` and the
3880        // result is `[[A, B], [C], [A, B], [C]]`. (But in practice, we are always called
3881        // with `arr.len() == 1`.)
3882        let n = arr.len() as u32;
3883        let indices = UInt32Array::from_iter_values((0..size).flat_map(|_| 0..n));
3884        Ok(arrow::compute::take(arr, &indices, None)?)
3885    }
3886
3887    /// Retrieve ScalarValue for each row in `array`
3888    ///
3889    /// Elements in `array` may be NULL, in which case the corresponding element in the returned vector is None.
3890    ///
3891    /// Example 1: Array (ScalarValue::Int32)
3892    /// ```
3893    /// use arrow::array::ListArray;
3894    /// use arrow::datatypes::{DataType, Int32Type};
3895    /// use datafusion_common::ScalarValue;
3896    ///
3897    /// // Equivalent to [[1,2,3], [4,5]]
3898    /// let list_arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
3899    ///     Some(vec![Some(1), Some(2), Some(3)]),
3900    ///     Some(vec![Some(4), Some(5)]),
3901    /// ]);
3902    ///
3903    /// // Convert the array into Scalar Values for each row
3904    /// let scalar_vec = ScalarValue::convert_array_to_scalar_vec(&list_arr).unwrap();
3905    ///
3906    /// let expected = vec![
3907    ///     Some(vec![
3908    ///         ScalarValue::Int32(Some(1)),
3909    ///         ScalarValue::Int32(Some(2)),
3910    ///         ScalarValue::Int32(Some(3)),
3911    ///     ]),
3912    ///     Some(vec![
3913    ///         ScalarValue::Int32(Some(4)),
3914    ///         ScalarValue::Int32(Some(5)),
3915    ///     ]),
3916    /// ];
3917    ///
3918    /// assert_eq!(scalar_vec, expected);
3919    /// ```
3920    ///
3921    /// Example 2: Nested array (ScalarValue::List)
3922    /// ```
3923    /// use arrow::array::ListArray;
3924    /// use arrow::datatypes::{DataType, Int32Type};
3925    /// use datafusion_common::utils::SingleRowListArrayBuilder;
3926    /// use datafusion_common::ScalarValue;
3927    /// use std::sync::Arc;
3928    ///
3929    /// let list_arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
3930    ///     Some(vec![Some(1), Some(2), Some(3)]),
3931    ///     Some(vec![Some(4), Some(5)]),
3932    /// ]);
3933    ///
3934    /// // Wrap into another layer of list, we got nested array as [ [[1,2,3], [4,5]] ]
3935    /// let list_arr = SingleRowListArrayBuilder::new(Arc::new(list_arr)).build_list_array();
3936    ///
3937    /// // Convert the array into Scalar Values for each row, we got 1D arrays in this example
3938    /// let scalar_vec = ScalarValue::convert_array_to_scalar_vec(&list_arr).unwrap();
3939    ///
3940    /// let l1 = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
3941    ///     Some(1),
3942    ///     Some(2),
3943    ///     Some(3),
3944    /// ])]);
3945    /// let l2 = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
3946    ///     Some(4),
3947    ///     Some(5),
3948    /// ])]);
3949    ///
3950    /// let expected = vec![Some(vec![
3951    ///     ScalarValue::List(Arc::new(l1)),
3952    ///     ScalarValue::List(Arc::new(l2)),
3953    /// ])];
3954    ///
3955    /// assert_eq!(scalar_vec, expected);
3956    /// ```
3957    ///
3958    /// Example 3: Nullable array
3959    /// ```
3960    /// use arrow::array::ListArray;
3961    /// use arrow::datatypes::{DataType, Int32Type};
3962    /// use datafusion_common::ScalarValue;
3963    ///
3964    /// let list_arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
3965    ///     Some(vec![Some(1), Some(2), Some(3)]),
3966    ///     None,
3967    ///     Some(vec![Some(4), Some(5)]),
3968    /// ]);
3969    ///
3970    /// // Convert the array into Scalar Values for each row
3971    /// let scalar_vec = ScalarValue::convert_array_to_scalar_vec(&list_arr).unwrap();
3972    ///
3973    /// let expected = vec![
3974    ///     Some(vec![
3975    ///         ScalarValue::Int32(Some(1)),
3976    ///         ScalarValue::Int32(Some(2)),
3977    ///         ScalarValue::Int32(Some(3)),
3978    ///     ]),
3979    ///     None,
3980    ///     Some(vec![
3981    ///         ScalarValue::Int32(Some(4)),
3982    ///         ScalarValue::Int32(Some(5)),
3983    ///     ]),
3984    /// ];
3985    ///
3986    /// assert_eq!(scalar_vec, expected);
3987    /// ```
3988    pub fn convert_array_to_scalar_vec(
3989        array: &dyn Array,
3990    ) -> Result<Vec<Option<Vec<Self>>>> {
3991        fn map_element(
3992            nested_array: Option<ArrayRef>,
3993        ) -> Result<Option<Vec<ScalarValue>>> {
3994            nested_array
3995                .map(|array| {
3996                    (0..array.len())
3997                        .map(|i| ScalarValue::try_from_array(&array, i))
3998                        .collect::<Result<Vec<_>>>()
3999                })
4000                .transpose()
4001        }
4002
4003        match array.data_type() {
4004            DataType::List(_) => array.as_list::<i32>().iter().map(map_element).collect(),
4005            DataType::LargeList(_) => {
4006                array.as_list::<i64>().iter().map(map_element).collect()
4007            }
4008            DataType::ListView(_) => array
4009                .as_list_view::<i32>()
4010                .iter()
4011                .map(map_element)
4012                .collect(),
4013            DataType::LargeListView(_) => array
4014                .as_list_view::<i64>()
4015                .iter()
4016                .map(map_element)
4017                .collect(),
4018            _ => _internal_err!(
4019                "ScalarValue::convert_array_to_scalar_vec input must be a List/LargeList/ListView/LargeListView type"
4020            ),
4021        }
4022    }
4023
4024    #[deprecated(
4025        since = "46.0.0",
4026        note = "This function is obsolete. Use `to_array` instead"
4027    )]
4028    pub fn raw_data(&self) -> Result<ArrayRef> {
4029        match self {
4030            ScalarValue::List(arr) => Ok(arr.to_owned()),
4031            _ => _internal_err!("ScalarValue is not a list"),
4032        }
4033    }
4034
4035    /// Converts a value in `array` at `index` into a ScalarValue
4036    pub fn try_from_array(array: &dyn Array, index: usize) -> Result<Self> {
4037        // handle NULL value
4038        if array.is_null(index) {
4039            return array.data_type().try_into();
4040        }
4041
4042        Ok(match array.data_type() {
4043            DataType::Null => ScalarValue::Null,
4044            DataType::Decimal32(precision, scale) => {
4045                ScalarValue::get_decimal_value_from_array(
4046                    array, index, *precision, *scale,
4047                )?
4048            }
4049            DataType::Decimal64(precision, scale) => {
4050                ScalarValue::get_decimal_value_from_array(
4051                    array, index, *precision, *scale,
4052                )?
4053            }
4054            DataType::Decimal128(precision, scale) => {
4055                ScalarValue::get_decimal_value_from_array(
4056                    array, index, *precision, *scale,
4057                )?
4058            }
4059            DataType::Decimal256(precision, scale) => {
4060                ScalarValue::get_decimal_value_from_array(
4061                    array, index, *precision, *scale,
4062                )?
4063            }
4064            DataType::Boolean => typed_cast!(array, index, as_boolean_array, Boolean)?,
4065            DataType::Float64 => typed_cast!(array, index, as_float64_array, Float64)?,
4066            DataType::Float32 => typed_cast!(array, index, as_float32_array, Float32)?,
4067            DataType::Float16 => typed_cast!(array, index, as_float16_array, Float16)?,
4068            DataType::UInt64 => typed_cast!(array, index, as_uint64_array, UInt64)?,
4069            DataType::UInt32 => typed_cast!(array, index, as_uint32_array, UInt32)?,
4070            DataType::UInt16 => typed_cast!(array, index, as_uint16_array, UInt16)?,
4071            DataType::UInt8 => typed_cast!(array, index, as_uint8_array, UInt8)?,
4072            DataType::Int64 => typed_cast!(array, index, as_int64_array, Int64)?,
4073            DataType::Int32 => typed_cast!(array, index, as_int32_array, Int32)?,
4074            DataType::Int16 => typed_cast!(array, index, as_int16_array, Int16)?,
4075            DataType::Int8 => typed_cast!(array, index, as_int8_array, Int8)?,
4076            DataType::Binary => typed_cast!(array, index, as_binary_array, Binary)?,
4077            DataType::LargeBinary => {
4078                typed_cast!(array, index, as_large_binary_array, LargeBinary)?
4079            }
4080            DataType::BinaryView => {
4081                typed_cast!(array, index, as_binary_view_array, BinaryView)?
4082            }
4083            DataType::Utf8 => typed_cast!(array, index, as_string_array, Utf8)?,
4084            DataType::LargeUtf8 => {
4085                typed_cast!(array, index, as_large_string_array, LargeUtf8)?
4086            }
4087            DataType::Utf8View => {
4088                typed_cast!(array, index, as_string_view_array, Utf8View)?
4089            }
4090            DataType::List(field) => {
4091                let list_array = array.as_list::<i32>();
4092                let nested_array = list_array.value(index);
4093                // Produces a single element `ListArray` with the value at `index`.
4094                SingleRowListArrayBuilder::new(nested_array)
4095                    .with_field(field)
4096                    .build_list_scalar()
4097            }
4098            DataType::LargeList(field) => {
4099                let list_array = as_large_list_array(array)?;
4100                let nested_array = list_array.value(index);
4101                // Produces a single element `LargeListArray` with the value at `index`.
4102                SingleRowListArrayBuilder::new(nested_array)
4103                    .with_field(field)
4104                    .build_large_list_scalar()
4105            }
4106            // TODO: There is no test for FixedSizeList now, add it later
4107            DataType::FixedSizeList(field, _) => {
4108                let list_array = as_fixed_size_list_array(array)?;
4109                let nested_array = list_array.value(index);
4110                // Produces a single element `FixedSizeListArray` with the value at `index`.
4111                let list_size = nested_array.len();
4112                SingleRowListArrayBuilder::new(nested_array)
4113                    .with_field(field)
4114                    .build_fixed_size_list_scalar(list_size)
4115            }
4116            DataType::ListView(field) => {
4117                let list_array = as_list_view_array(array)?;
4118                let nested_array = list_array.value(index);
4119                // Produces a single element `ListViewArray` with the value at `index`.
4120                SingleRowListArrayBuilder::new(nested_array)
4121                    .with_field(field)
4122                    .build_list_view_scalar()
4123            }
4124            DataType::LargeListView(field) => {
4125                let list_array = as_large_list_view_array(array)?;
4126                let nested_array = list_array.value(index);
4127                // Produces a single element `LargeListViewArray` with the value at `index`.
4128                SingleRowListArrayBuilder::new(nested_array)
4129                    .with_field(field)
4130                    .build_large_list_view_scalar()
4131            }
4132            DataType::Date32 => typed_cast!(array, index, as_date32_array, Date32)?,
4133            DataType::Date64 => typed_cast!(array, index, as_date64_array, Date64)?,
4134            DataType::Time32(TimeUnit::Second) => {
4135                typed_cast!(array, index, as_time32_second_array, Time32Second)?
4136            }
4137            DataType::Time32(TimeUnit::Millisecond) => {
4138                typed_cast!(array, index, as_time32_millisecond_array, Time32Millisecond)?
4139            }
4140            DataType::Time64(TimeUnit::Microsecond) => {
4141                typed_cast!(array, index, as_time64_microsecond_array, Time64Microsecond)?
4142            }
4143            DataType::Time64(TimeUnit::Nanosecond) => {
4144                typed_cast!(array, index, as_time64_nanosecond_array, Time64Nanosecond)?
4145            }
4146            DataType::Timestamp(TimeUnit::Second, tz_opt) => typed_cast_tz!(
4147                array,
4148                index,
4149                as_timestamp_second_array,
4150                TimestampSecond,
4151                tz_opt
4152            )?,
4153            DataType::Timestamp(TimeUnit::Millisecond, tz_opt) => typed_cast_tz!(
4154                array,
4155                index,
4156                as_timestamp_millisecond_array,
4157                TimestampMillisecond,
4158                tz_opt
4159            )?,
4160            DataType::Timestamp(TimeUnit::Microsecond, tz_opt) => typed_cast_tz!(
4161                array,
4162                index,
4163                as_timestamp_microsecond_array,
4164                TimestampMicrosecond,
4165                tz_opt
4166            )?,
4167            DataType::Timestamp(TimeUnit::Nanosecond, tz_opt) => typed_cast_tz!(
4168                array,
4169                index,
4170                as_timestamp_nanosecond_array,
4171                TimestampNanosecond,
4172                tz_opt
4173            )?,
4174            DataType::Dictionary(key_type, _) => {
4175                let (values_array, values_index) = match key_type.as_ref() {
4176                    DataType::Int8 => get_dict_value::<Int8Type>(array, index)?,
4177                    DataType::Int16 => get_dict_value::<Int16Type>(array, index)?,
4178                    DataType::Int32 => get_dict_value::<Int32Type>(array, index)?,
4179                    DataType::Int64 => get_dict_value::<Int64Type>(array, index)?,
4180                    DataType::UInt8 => get_dict_value::<UInt8Type>(array, index)?,
4181                    DataType::UInt16 => get_dict_value::<UInt16Type>(array, index)?,
4182                    DataType::UInt32 => get_dict_value::<UInt32Type>(array, index)?,
4183                    DataType::UInt64 => get_dict_value::<UInt64Type>(array, index)?,
4184                    _ => unreachable!("Invalid dictionary keys type: {}", key_type),
4185                };
4186                // look up the index in the values dictionary
4187                let value = match values_index {
4188                    Some(values_index) => {
4189                        ScalarValue::try_from_array(values_array, values_index)
4190                    }
4191                    // else entry was null, so return null
4192                    None => values_array.data_type().try_into(),
4193                }?;
4194
4195                Self::Dictionary(key_type.clone(), Box::new(value))
4196            }
4197            DataType::RunEndEncoded(run_ends_field, value_field) => {
4198                // Explicitly check length here since get_physical_index() doesn't
4199                // bound check for us
4200                if index > array.len() {
4201                    return _exec_err!(
4202                        "Index {index} out of bounds for array of length {}",
4203                        array.len()
4204                    );
4205                }
4206                let scalar = downcast_run_array!(
4207                    array => {
4208                        let index = array.get_physical_index(index);
4209                        ScalarValue::try_from_array(array.values(), index)?
4210                    },
4211                    dt => unreachable!("Invalid run-ends type: {dt}")
4212                );
4213                Self::RunEndEncoded(
4214                    Arc::clone(run_ends_field),
4215                    Arc::clone(value_field),
4216                    Box::new(scalar),
4217                )
4218            }
4219            DataType::Struct(_) => {
4220                let a = array.slice(index, 1);
4221                Self::Struct(Arc::new(a.as_struct().to_owned()))
4222            }
4223            DataType::FixedSizeBinary(_) => {
4224                let array = as_fixed_size_binary_array(array)?;
4225                let size = match array.data_type() {
4226                    DataType::FixedSizeBinary(size) => *size,
4227                    _ => unreachable!(),
4228                };
4229                ScalarValue::FixedSizeBinary(
4230                    size,
4231                    match array.is_null(index) {
4232                        true => None,
4233                        false => Some(array.value(index).into()),
4234                    },
4235                )
4236            }
4237            DataType::Interval(IntervalUnit::DayTime) => {
4238                typed_cast!(array, index, as_interval_dt_array, IntervalDayTime)?
4239            }
4240            DataType::Interval(IntervalUnit::YearMonth) => {
4241                typed_cast!(array, index, as_interval_ym_array, IntervalYearMonth)?
4242            }
4243            DataType::Interval(IntervalUnit::MonthDayNano) => {
4244                typed_cast!(array, index, as_interval_mdn_array, IntervalMonthDayNano)?
4245            }
4246
4247            DataType::Duration(TimeUnit::Second) => {
4248                typed_cast!(array, index, as_duration_second_array, DurationSecond)?
4249            }
4250            DataType::Duration(TimeUnit::Millisecond) => typed_cast!(
4251                array,
4252                index,
4253                as_duration_millisecond_array,
4254                DurationMillisecond
4255            )?,
4256            DataType::Duration(TimeUnit::Microsecond) => typed_cast!(
4257                array,
4258                index,
4259                as_duration_microsecond_array,
4260                DurationMicrosecond
4261            )?,
4262            DataType::Duration(TimeUnit::Nanosecond) => typed_cast!(
4263                array,
4264                index,
4265                as_duration_nanosecond_array,
4266                DurationNanosecond
4267            )?,
4268            DataType::Map(_, _) => {
4269                let a = array.slice(index, 1);
4270                Self::Map(Arc::new(a.as_map().to_owned()))
4271            }
4272            DataType::Union(fields, mode) => {
4273                let array = as_union_array(array)?;
4274                let ti = array.type_id(index);
4275                let index = array.value_offset(index);
4276                let value = ScalarValue::try_from_array(array.child(ti), index)?;
4277                ScalarValue::Union(Some((ti, Box::new(value))), fields.clone(), *mode)
4278            }
4279            other => {
4280                return _not_impl_err!(
4281                    "Can't create a scalar from array of type \"{other:?}\""
4282                );
4283            }
4284        })
4285    }
4286
4287    /// Try to parse `value` into a ScalarValue of type `target_type`
4288    pub fn try_from_string(value: String, target_type: &DataType) -> Result<Self> {
4289        ScalarValue::from(value).cast_to(target_type)
4290    }
4291
4292    /// Returns the Some(`&str`) representation of `ScalarValue` of logical string type
4293    ///
4294    /// Returns `None` if this `ScalarValue` is not a logical string type or the
4295    /// `ScalarValue` represents the `NULL` value.
4296    ///
4297    /// Note you can use [`Option::flatten`] to check for non null logical
4298    /// strings.
4299    ///
4300    /// For example, [`ScalarValue::Utf8`], [`ScalarValue::LargeUtf8`], and
4301    /// [`ScalarValue::Dictionary`] with a logical string value and store
4302    /// strings and can be accessed as `&str` using this method.
4303    ///
4304    /// # Example: logical strings
4305    /// ```
4306    /// # use datafusion_common::ScalarValue;
4307    /// /// non strings return None
4308    /// let scalar = ScalarValue::from(42);
4309    /// assert_eq!(scalar.try_as_str(), None);
4310    /// // Non null logical string returns Some(Some(&str))
4311    /// let scalar = ScalarValue::from("hello");
4312    /// assert_eq!(scalar.try_as_str(), Some(Some("hello")));
4313    /// // Null logical string returns Some(None)
4314    /// let scalar = ScalarValue::Utf8(None);
4315    /// assert_eq!(scalar.try_as_str(), Some(None));
4316    /// ```
4317    ///
4318    /// # Example: use [`Option::flatten`] to check for non-null logical strings
4319    /// ```
4320    /// # use datafusion_common::ScalarValue;
4321    /// // Non null logical string returns Some(Some(&str))
4322    /// let scalar = ScalarValue::from("hello");
4323    /// assert_eq!(scalar.try_as_str().flatten(), Some("hello"));
4324    /// ```
4325    pub fn try_as_str(&self) -> Option<Option<&str>> {
4326        let v = match self {
4327            ScalarValue::Utf8(v) => v,
4328            ScalarValue::LargeUtf8(v) => v,
4329            ScalarValue::Utf8View(v) => v,
4330            ScalarValue::Dictionary(_, v) => return v.try_as_str(),
4331            ScalarValue::RunEndEncoded(_, _, v) => return v.try_as_str(),
4332            _ => return None,
4333        };
4334        Some(v.as_ref().map(|v| v.as_str()))
4335    }
4336
4337    /// Cast this value to a `ScalarValue` of type `target_type` using the
4338    /// default [`CastOptions`].
4339    ///
4340    /// This is a general-purpose cast with the same semantics as the Arrow
4341    /// [`cast_with_options`] kernel and can therefore **lose information** --
4342    /// for example casting the floating point value `123.45` to the integer
4343    /// `123`.
4344    ///
4345    /// Returns an error for casts the Arrow kernel cannot perform.
4346    ///
4347    /// # See Also
4348    /// - [`try_cast_literal_to_type`]: for a *value-preserving* cast
4349    ///
4350    /// [`try_cast_literal_to_type`]: https://docs.rs/datafusion/latest/datafusion/logical_expr_common/casts/fn.try_cast_literal_to_type.html
4351    pub fn cast_to(&self, target_type: &DataType) -> Result<Self> {
4352        self.cast_to_with_options(target_type, &DEFAULT_CAST_OPTIONS)
4353    }
4354
4355    /// Cast this value to type `target_type` with the given [`CastOptions`].
4356    ///
4357    /// # See Also
4358    /// - [`ScalarValue::cast_to`] for more details.
4359    /// - [`try_cast_literal_to_type`]: for a *value-preserving* cast
4360    ///
4361    /// [`try_cast_literal_to_type`]: https://docs.rs/datafusion/latest/datafusion/logical_expr_common/casts/fn.try_cast_literal_to_type.html
4362    pub fn cast_to_with_options(
4363        &self,
4364        target_type: &DataType,
4365        cast_options: &CastOptions<'static>,
4366    ) -> Result<Self> {
4367        let source_type = self.data_type();
4368
4369        // Fast path: an identical target type needs no conversion at all.
4370        if &source_type == target_type {
4371            return Ok(self.clone());
4372        }
4373
4374        // Fast path: conversions among the string types (`Utf8`, `LargeUtf8`,
4375        // `Utf8View`) are value-preserving, so we can rewrap the string
4376        // directly instead of building a single-row array and invoking the
4377        // arrow cast kernel.
4378        if source_type.is_string() && target_type.is_string() {
4379            // `self` is one of the string types, so `try_as_str` returns `Some`
4380            let value = self.try_as_str().flatten().map(|s| s.to_string());
4381            return Ok(match target_type {
4382                DataType::Utf8 => ScalarValue::Utf8(value),
4383                DataType::LargeUtf8 => ScalarValue::LargeUtf8(value),
4384                DataType::Utf8View => ScalarValue::Utf8View(value),
4385                _ => unreachable!("matched a string target type above"),
4386            });
4387        }
4388
4389        if let Some(multiplier) = date_to_timestamp_multiplier(&source_type, target_type)
4390            .or_else(|| timestamp_to_timestamp_multiplier(&source_type, target_type))
4391            && let Some(value) = self.temporal_scalar_value_as_i64()
4392        {
4393            match ensure_timestamp_in_bounds(value, multiplier, &source_type, target_type)
4394            {
4395                Ok(()) => {}
4396                Err(_) if cast_options.safe => {
4397                    return ScalarValue::try_new_null(target_type);
4398                }
4399                Err(e) => return Err(e),
4400            }
4401        }
4402
4403        let scalar_array = self.to_array()?;
4404
4405        // For types that contain structs (including nested inside Lists, Dictionaries,
4406        // etc.), use name-based casting logic that matches struct fields by name and
4407        // recursively casts nested structs.
4408        let cast_arr = if crate::nested_struct::requires_nested_struct_cast(
4409            scalar_array.data_type(),
4410            target_type,
4411        ) {
4412            crate::nested_struct::cast_column(&scalar_array, target_type, cast_options)?
4413        } else {
4414            cast_with_options(&scalar_array, target_type, cast_options)?
4415        };
4416
4417        ScalarValue::try_from_array(&cast_arr, 0)
4418    }
4419
4420    fn temporal_scalar_value_as_i64(&self) -> Option<i64> {
4421        match self {
4422            ScalarValue::Date32(Some(value)) => Some(i64::from(*value)),
4423            ScalarValue::Date64(Some(value)) => Some(*value),
4424            ScalarValue::TimestampSecond(Some(value), _)
4425            | ScalarValue::TimestampMillisecond(Some(value), _)
4426            | ScalarValue::TimestampMicrosecond(Some(value), _)
4427            | ScalarValue::TimestampNanosecond(Some(value), _) => Some(*value),
4428            _ => None,
4429        }
4430    }
4431
4432    fn eq_array_decimal32(
4433        array: &ArrayRef,
4434        index: usize,
4435        value: Option<&i32>,
4436        precision: u8,
4437        scale: i8,
4438    ) -> Result<bool> {
4439        let array = as_decimal32_array(array)?;
4440        if array.precision() != precision || array.scale() != scale {
4441            return Ok(false);
4442        }
4443        let is_null = array.is_null(index);
4444        if let Some(v) = value {
4445            Ok(!array.is_null(index) && array.value(index) == *v)
4446        } else {
4447            Ok(is_null)
4448        }
4449    }
4450
4451    fn eq_array_decimal64(
4452        array: &ArrayRef,
4453        index: usize,
4454        value: Option<&i64>,
4455        precision: u8,
4456        scale: i8,
4457    ) -> Result<bool> {
4458        let array = as_decimal64_array(array)?;
4459        if array.precision() != precision || array.scale() != scale {
4460            return Ok(false);
4461        }
4462        let is_null = array.is_null(index);
4463        if let Some(v) = value {
4464            Ok(!array.is_null(index) && array.value(index) == *v)
4465        } else {
4466            Ok(is_null)
4467        }
4468    }
4469
4470    fn eq_array_decimal(
4471        array: &ArrayRef,
4472        index: usize,
4473        value: Option<&i128>,
4474        precision: u8,
4475        scale: i8,
4476    ) -> Result<bool> {
4477        let array = as_decimal128_array(array)?;
4478        if array.precision() != precision || array.scale() != scale {
4479            return Ok(false);
4480        }
4481        let is_null = array.is_null(index);
4482        if let Some(v) = value {
4483            Ok(!array.is_null(index) && array.value(index) == *v)
4484        } else {
4485            Ok(is_null)
4486        }
4487    }
4488
4489    fn eq_array_decimal256(
4490        array: &ArrayRef,
4491        index: usize,
4492        value: Option<&i256>,
4493        precision: u8,
4494        scale: i8,
4495    ) -> Result<bool> {
4496        let array = as_decimal256_array(array)?;
4497        if array.precision() != precision || array.scale() != scale {
4498            return Ok(false);
4499        }
4500        let is_null = array.is_null(index);
4501        if let Some(v) = value {
4502            Ok(!array.is_null(index) && array.value(index) == *v)
4503        } else {
4504            Ok(is_null)
4505        }
4506    }
4507
4508    /// Compares a single row of array @ index for equality with self,
4509    /// in an optimized fashion.
4510    ///
4511    /// This method implements an optimized version of:
4512    ///
4513    /// ```text
4514    ///     let arr_scalar = Self::try_from_array(array, index).unwrap();
4515    ///     arr_scalar.eq(self)
4516    /// ```
4517    ///
4518    /// *Performance note*: the arrow compute kernels should be
4519    /// preferred over this function if at all possible as they can be
4520    /// vectorized and are generally much faster.
4521    ///
4522    /// This function has a few narrow use cases such as hash table key
4523    /// comparisons where comparing a single row at a time is necessary.
4524    ///
4525    /// # Errors
4526    ///
4527    /// Errors if
4528    /// - it fails to downcast `array` to the data type of `self`
4529    /// - `self` is a `Struct`
4530    ///
4531    /// # Panics
4532    ///
4533    /// Panics if `self` is a dictionary with invalid key type
4534    #[inline]
4535    pub fn eq_array(&self, array: &ArrayRef, index: usize) -> Result<bool> {
4536        Ok(match self {
4537            ScalarValue::Decimal32(v, precision, scale) => {
4538                ScalarValue::eq_array_decimal32(
4539                    array,
4540                    index,
4541                    v.as_ref(),
4542                    *precision,
4543                    *scale,
4544                )?
4545            }
4546            ScalarValue::Decimal64(v, precision, scale) => {
4547                ScalarValue::eq_array_decimal64(
4548                    array,
4549                    index,
4550                    v.as_ref(),
4551                    *precision,
4552                    *scale,
4553                )?
4554            }
4555            ScalarValue::Decimal128(v, precision, scale) => {
4556                ScalarValue::eq_array_decimal(
4557                    array,
4558                    index,
4559                    v.as_ref(),
4560                    *precision,
4561                    *scale,
4562                )?
4563            }
4564            ScalarValue::Decimal256(v, precision, scale) => {
4565                ScalarValue::eq_array_decimal256(
4566                    array,
4567                    index,
4568                    v.as_ref(),
4569                    *precision,
4570                    *scale,
4571                )?
4572            }
4573            ScalarValue::Boolean(val) => {
4574                eq_array_primitive!(array, index, as_boolean_array, val)?
4575            }
4576            ScalarValue::Float16(val) => {
4577                eq_array_primitive!(array, index, as_float16_array, val)?
4578            }
4579            ScalarValue::Float32(val) => {
4580                eq_array_primitive!(array, index, as_float32_array, val)?
4581            }
4582            ScalarValue::Float64(val) => {
4583                eq_array_primitive!(array, index, as_float64_array, val)?
4584            }
4585            ScalarValue::Int8(val) => {
4586                eq_array_primitive!(array, index, as_int8_array, val)?
4587            }
4588            ScalarValue::Int16(val) => {
4589                eq_array_primitive!(array, index, as_int16_array, val)?
4590            }
4591            ScalarValue::Int32(val) => {
4592                eq_array_primitive!(array, index, as_int32_array, val)?
4593            }
4594            ScalarValue::Int64(val) => {
4595                eq_array_primitive!(array, index, as_int64_array, val)?
4596            }
4597            ScalarValue::UInt8(val) => {
4598                eq_array_primitive!(array, index, as_uint8_array, val)?
4599            }
4600            ScalarValue::UInt16(val) => {
4601                eq_array_primitive!(array, index, as_uint16_array, val)?
4602            }
4603            ScalarValue::UInt32(val) => {
4604                eq_array_primitive!(array, index, as_uint32_array, val)?
4605            }
4606            ScalarValue::UInt64(val) => {
4607                eq_array_primitive!(array, index, as_uint64_array, val)?
4608            }
4609            ScalarValue::Utf8(val) => {
4610                eq_array_primitive!(array, index, as_string_array, val)?
4611            }
4612            ScalarValue::Utf8View(val) => {
4613                eq_array_primitive!(array, index, as_string_view_array, val)?
4614            }
4615            ScalarValue::LargeUtf8(val) => {
4616                eq_array_primitive!(array, index, as_large_string_array, val)?
4617            }
4618            ScalarValue::Binary(val) => {
4619                eq_array_primitive!(array, index, as_binary_array, val)?
4620            }
4621            ScalarValue::BinaryView(val) => {
4622                eq_array_primitive!(array, index, as_binary_view_array, val)?
4623            }
4624            ScalarValue::FixedSizeBinary(_, val) => {
4625                eq_array_primitive!(array, index, as_fixed_size_binary_array, val)?
4626            }
4627            ScalarValue::LargeBinary(val) => {
4628                eq_array_primitive!(array, index, as_large_binary_array, val)?
4629            }
4630            ScalarValue::List(arr) => {
4631                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4632            }
4633            ScalarValue::LargeList(arr) => {
4634                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4635            }
4636            ScalarValue::FixedSizeList(arr) => {
4637                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4638            }
4639            ScalarValue::ListView(arr) => {
4640                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4641            }
4642            ScalarValue::LargeListView(arr) => {
4643                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4644            }
4645            ScalarValue::Struct(arr) => {
4646                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4647            }
4648            ScalarValue::Map(arr) => {
4649                Self::eq_array_list(&(arr.to_owned() as ArrayRef), array, index)
4650            }
4651            ScalarValue::Date32(val) => {
4652                eq_array_primitive!(array, index, as_date32_array, val)?
4653            }
4654            ScalarValue::Date64(val) => {
4655                eq_array_primitive!(array, index, as_date64_array, val)?
4656            }
4657            ScalarValue::Time32Second(val) => {
4658                eq_array_primitive!(array, index, as_time32_second_array, val)?
4659            }
4660            ScalarValue::Time32Millisecond(val) => {
4661                eq_array_primitive!(array, index, as_time32_millisecond_array, val)?
4662            }
4663            ScalarValue::Time64Microsecond(val) => {
4664                eq_array_primitive!(array, index, as_time64_microsecond_array, val)?
4665            }
4666            ScalarValue::Time64Nanosecond(val) => {
4667                eq_array_primitive!(array, index, as_time64_nanosecond_array, val)?
4668            }
4669            ScalarValue::TimestampSecond(val, _) => {
4670                eq_array_primitive!(array, index, as_timestamp_second_array, val)?
4671            }
4672            ScalarValue::TimestampMillisecond(val, _) => {
4673                eq_array_primitive!(array, index, as_timestamp_millisecond_array, val)?
4674            }
4675            ScalarValue::TimestampMicrosecond(val, _) => {
4676                eq_array_primitive!(array, index, as_timestamp_microsecond_array, val)?
4677            }
4678            ScalarValue::TimestampNanosecond(val, _) => {
4679                eq_array_primitive!(array, index, as_timestamp_nanosecond_array, val)?
4680            }
4681            ScalarValue::IntervalYearMonth(val) => {
4682                eq_array_primitive!(array, index, as_interval_ym_array, val)?
4683            }
4684            ScalarValue::IntervalDayTime(val) => {
4685                eq_array_primitive!(array, index, as_interval_dt_array, val)?
4686            }
4687            ScalarValue::IntervalMonthDayNano(val) => {
4688                eq_array_primitive!(array, index, as_interval_mdn_array, val)?
4689            }
4690            ScalarValue::DurationSecond(val) => {
4691                eq_array_primitive!(array, index, as_duration_second_array, val)?
4692            }
4693            ScalarValue::DurationMillisecond(val) => {
4694                eq_array_primitive!(array, index, as_duration_millisecond_array, val)?
4695            }
4696            ScalarValue::DurationMicrosecond(val) => {
4697                eq_array_primitive!(array, index, as_duration_microsecond_array, val)?
4698            }
4699            ScalarValue::DurationNanosecond(val) => {
4700                eq_array_primitive!(array, index, as_duration_nanosecond_array, val)?
4701            }
4702            ScalarValue::Union(value, _, _) => {
4703                let array = as_union_array(array)?;
4704                let ti = array.type_id(index);
4705                let index = array.value_offset(index);
4706                if let Some((ti_v, value)) = value {
4707                    ti_v == &ti && value.eq_array(array.child(ti), index)?
4708                } else {
4709                    array.child(ti).is_null(index)
4710                }
4711            }
4712            ScalarValue::Dictionary(key_type, v) => {
4713                let (values_array, values_index) = match key_type.as_ref() {
4714                    DataType::Int8 => get_dict_value::<Int8Type>(array, index)?,
4715                    DataType::Int16 => get_dict_value::<Int16Type>(array, index)?,
4716                    DataType::Int32 => get_dict_value::<Int32Type>(array, index)?,
4717                    DataType::Int64 => get_dict_value::<Int64Type>(array, index)?,
4718                    DataType::UInt8 => get_dict_value::<UInt8Type>(array, index)?,
4719                    DataType::UInt16 => get_dict_value::<UInt16Type>(array, index)?,
4720                    DataType::UInt32 => get_dict_value::<UInt32Type>(array, index)?,
4721                    DataType::UInt64 => get_dict_value::<UInt64Type>(array, index)?,
4722                    _ => unreachable!("Invalid dictionary keys type: {}", key_type),
4723                };
4724                // was the value in the array non null?
4725                match values_index {
4726                    Some(values_index) => v.eq_array(values_array, values_index)?,
4727                    None => v.is_null(),
4728                }
4729            }
4730            ScalarValue::RunEndEncoded(run_ends_field, _, value) => {
4731                // Explicitly check length here since get_physical_index() doesn't
4732                // bound check for us
4733                if index > array.len() {
4734                    return _exec_err!(
4735                        "Index {index} out of bounds for array of length {}",
4736                        array.len()
4737                    );
4738                }
4739                match run_ends_field.data_type() {
4740                    DataType::Int16 => {
4741                        let array = as_run_array::<Int16Type>(array)?;
4742                        let index = array.get_physical_index(index);
4743                        value.eq_array(array.values(), index)?
4744                    }
4745                    DataType::Int32 => {
4746                        let array = as_run_array::<Int32Type>(array)?;
4747                        let index = array.get_physical_index(index);
4748                        value.eq_array(array.values(), index)?
4749                    }
4750                    DataType::Int64 => {
4751                        let array = as_run_array::<Int64Type>(array)?;
4752                        let index = array.get_physical_index(index);
4753                        value.eq_array(array.values(), index)?
4754                    }
4755                    dt => unreachable!("Invalid run-ends type: {dt}"),
4756                }
4757            }
4758            ScalarValue::Null => array.is_null(index),
4759        })
4760    }
4761
4762    fn eq_array_list(arr1: &ArrayRef, arr2: &ArrayRef, index: usize) -> bool {
4763        let right = arr2.slice(index, 1);
4764        arr1 == &right
4765    }
4766
4767    /// Compare `self` with `other` and return an `Ordering`.
4768    ///
4769    /// This is the same as [`PartialOrd`] except that it returns
4770    /// `Err` if the values cannot be compared, e.g., they have incompatible data types.
4771    pub fn try_cmp(&self, other: &Self) -> Result<Ordering> {
4772        self.partial_cmp(other).ok_or_else(|| {
4773            _internal_datafusion_err!("Uncomparable values: {self:?}, {other:?}")
4774        })
4775    }
4776
4777    /// Estimate size if bytes including `Self`. For values with internal containers such as `String`
4778    /// includes the allocated size (`capacity`) rather than the current length (`len`)
4779    pub fn size(&self) -> usize {
4780        size_of_val(self)
4781            + match self {
4782                ScalarValue::Null
4783                | ScalarValue::Boolean(_)
4784                | ScalarValue::Float16(_)
4785                | ScalarValue::Float32(_)
4786                | ScalarValue::Float64(_)
4787                | ScalarValue::Decimal32(_, _, _)
4788                | ScalarValue::Decimal64(_, _, _)
4789                | ScalarValue::Decimal128(_, _, _)
4790                | ScalarValue::Decimal256(_, _, _)
4791                | ScalarValue::Int8(_)
4792                | ScalarValue::Int16(_)
4793                | ScalarValue::Int32(_)
4794                | ScalarValue::Int64(_)
4795                | ScalarValue::UInt8(_)
4796                | ScalarValue::UInt16(_)
4797                | ScalarValue::UInt32(_)
4798                | ScalarValue::UInt64(_)
4799                | ScalarValue::Date32(_)
4800                | ScalarValue::Date64(_)
4801                | ScalarValue::Time32Second(_)
4802                | ScalarValue::Time32Millisecond(_)
4803                | ScalarValue::Time64Microsecond(_)
4804                | ScalarValue::Time64Nanosecond(_)
4805                | ScalarValue::IntervalYearMonth(_)
4806                | ScalarValue::IntervalDayTime(_)
4807                | ScalarValue::IntervalMonthDayNano(_)
4808                | ScalarValue::DurationSecond(_)
4809                | ScalarValue::DurationMillisecond(_)
4810                | ScalarValue::DurationMicrosecond(_)
4811                | ScalarValue::DurationNanosecond(_) => 0,
4812                ScalarValue::Utf8(s)
4813                | ScalarValue::LargeUtf8(s)
4814                | ScalarValue::Utf8View(s) => {
4815                    s.as_ref().map(|s| s.capacity()).unwrap_or_default()
4816                }
4817                ScalarValue::TimestampSecond(_, s)
4818                | ScalarValue::TimestampMillisecond(_, s)
4819                | ScalarValue::TimestampMicrosecond(_, s)
4820                | ScalarValue::TimestampNanosecond(_, s) => {
4821                    s.as_ref().map(|s| s.len()).unwrap_or_default()
4822                }
4823                ScalarValue::Binary(b)
4824                | ScalarValue::FixedSizeBinary(_, b)
4825                | ScalarValue::LargeBinary(b)
4826                | ScalarValue::BinaryView(b) => {
4827                    b.as_ref().map(|b| b.capacity()).unwrap_or_default()
4828                }
4829                ScalarValue::List(arr) => arr.get_array_memory_size(),
4830                ScalarValue::LargeList(arr) => arr.get_array_memory_size(),
4831                ScalarValue::FixedSizeList(arr) => arr.get_array_memory_size(),
4832                ScalarValue::ListView(arr) => arr.get_array_memory_size(),
4833                ScalarValue::LargeListView(arr) => arr.get_array_memory_size(),
4834                ScalarValue::Struct(arr) => arr.get_array_memory_size(),
4835                ScalarValue::Map(arr) => arr.get_array_memory_size(),
4836                ScalarValue::Union(vals, fields, _mode) => {
4837                    vals.as_ref()
4838                        .map(|(_id, sv)| sv.size() - size_of_val(sv))
4839                        .unwrap_or_default()
4840                        // `fields` is boxed, so it is NOT already included in `self`
4841                        + size_of_val(fields)
4842                        + (size_of::<Field>() * fields.len())
4843                        + fields.iter().map(|(_idx, field)| field.size() - size_of_val(field)).sum::<usize>()
4844                }
4845                ScalarValue::Dictionary(dt, sv) => {
4846                    // `dt` and `sv` are boxed, so they are NOT already included in `self`
4847                    dt.size() + sv.size()
4848                }
4849                ScalarValue::RunEndEncoded(rf, vf, v) => rf.size() + vf.size() + v.size(),
4850            }
4851    }
4852
4853    /// Estimates [size](Self::size) of [`Vec`] in bytes.
4854    ///
4855    /// Includes the size of the [`Vec`] container itself.
4856    pub fn size_of_vec(vec: &Vec<Self>) -> usize {
4857        size_of_val(vec)
4858            + (size_of::<ScalarValue>() * vec.capacity())
4859            + vec
4860                .iter()
4861                .map(|sv| sv.size() - size_of_val(sv))
4862                .sum::<usize>()
4863    }
4864
4865    /// Estimates [size](Self::size) of [`VecDeque`] in bytes.
4866    ///
4867    /// Includes the size of the [`VecDeque`] container itself.
4868    pub fn size_of_vec_deque(vec_deque: &VecDeque<Self>) -> usize {
4869        size_of_val(vec_deque)
4870            + (size_of::<ScalarValue>() * vec_deque.capacity())
4871            + vec_deque
4872                .iter()
4873                .map(|sv| sv.size() - size_of_val(sv))
4874                .sum::<usize>()
4875    }
4876
4877    /// Estimates [size](Self::size) of [`HashSet`] in bytes.
4878    ///
4879    /// Includes the size of the [`HashSet`] container itself.
4880    #[allow(clippy::allow_attributes, clippy::mutable_key_type)] // ScalarValue has interior mutability but is intentionally used as hash key
4881    pub fn size_of_hashset<S>(set: &HashSet<Self, S>) -> usize {
4882        size_of_val(set)
4883            + (size_of::<ScalarValue>() * set.capacity())
4884            + set
4885                .iter()
4886                .map(|sv| sv.size() - size_of_val(sv))
4887                .sum::<usize>()
4888    }
4889
4890    /// Estimates [size](Self::size) of [`HashMap`] keyed by [`ScalarValue`] in bytes.
4891    ///
4892    /// Includes the size of the [`HashMap`] container itself. Heap payload of
4893    /// `V` is not accounted for; callers storing heap-backed values should
4894    /// supplement this estimate.
4895    #[allow(clippy::allow_attributes, clippy::mutable_key_type)] // ScalarValue has interior mutability but is intentionally used as hash key
4896    pub fn size_of_hashmap<V, S>(map: &HashMap<Self, V, S>) -> usize {
4897        size_of_val(map)
4898            + ((size_of::<ScalarValue>() + size_of::<V>()) * map.capacity())
4899            + map.keys().map(|k| k.size() - size_of_val(k)).sum::<usize>()
4900    }
4901
4902    /// Compacts the allocation referenced by `self` to the minimum, copying the data if
4903    /// necessary.
4904    ///
4905    /// This can be relevant when `self` is a list or contains a list as a nested value, as
4906    /// a single list holds an Arc to its entire original array buffer.
4907    pub fn compact(&mut self) {
4908        // copy_array_data + compact_view_buffers + downcast back, all in one step.
4909        macro_rules! compact_array {
4910            ($arr:expr, $from_type:ty, $($as_method:tt)+) => {
4911                *Arc::make_mut($arr) = ScalarValue::compact_view_buffers(
4912                    Arc::new(<$from_type>::from(copy_array_data(&$arr.to_data()))) as ArrayRef,
4913                ).$($as_method)+.clone()
4914            };
4915        }
4916        match self {
4917            ScalarValue::Null
4918            | ScalarValue::Boolean(_)
4919            | ScalarValue::Float16(_)
4920            | ScalarValue::Float32(_)
4921            | ScalarValue::Float64(_)
4922            | ScalarValue::Decimal32(_, _, _)
4923            | ScalarValue::Decimal64(_, _, _)
4924            | ScalarValue::Decimal128(_, _, _)
4925            | ScalarValue::Decimal256(_, _, _)
4926            | ScalarValue::Int8(_)
4927            | ScalarValue::Int16(_)
4928            | ScalarValue::Int32(_)
4929            | ScalarValue::Int64(_)
4930            | ScalarValue::UInt8(_)
4931            | ScalarValue::UInt16(_)
4932            | ScalarValue::UInt32(_)
4933            | ScalarValue::UInt64(_)
4934            | ScalarValue::Date32(_)
4935            | ScalarValue::Date64(_)
4936            | ScalarValue::Time32Second(_)
4937            | ScalarValue::Time32Millisecond(_)
4938            | ScalarValue::Time64Microsecond(_)
4939            | ScalarValue::Time64Nanosecond(_)
4940            | ScalarValue::IntervalYearMonth(_)
4941            | ScalarValue::IntervalDayTime(_)
4942            | ScalarValue::IntervalMonthDayNano(_)
4943            | ScalarValue::DurationSecond(_)
4944            | ScalarValue::DurationMillisecond(_)
4945            | ScalarValue::DurationMicrosecond(_)
4946            | ScalarValue::DurationNanosecond(_)
4947            | ScalarValue::Utf8(_)
4948            | ScalarValue::LargeUtf8(_)
4949            | ScalarValue::Utf8View(_)
4950            | ScalarValue::TimestampSecond(_, _)
4951            | ScalarValue::TimestampMillisecond(_, _)
4952            | ScalarValue::TimestampMicrosecond(_, _)
4953            | ScalarValue::TimestampNanosecond(_, _)
4954            | ScalarValue::Binary(_)
4955            | ScalarValue::FixedSizeBinary(_, _)
4956            | ScalarValue::LargeBinary(_)
4957            | ScalarValue::BinaryView(_) => (),
4958            ScalarValue::FixedSizeList(arr) => {
4959                compact_array!(arr, FixedSizeListArray, as_fixed_size_list())
4960            }
4961            ScalarValue::List(arr) => compact_array!(arr, ListArray, as_list::<i32>()),
4962            ScalarValue::LargeList(arr) => {
4963                compact_array!(arr, LargeListArray, as_list::<i64>())
4964            }
4965            ScalarValue::ListView(arr) => {
4966                compact_array!(arr, ListViewArray, as_list_view::<i32>())
4967            }
4968            ScalarValue::LargeListView(arr) => {
4969                compact_array!(arr, LargeListViewArray, as_list_view::<i64>())
4970            }
4971            ScalarValue::Struct(arr) => compact_array!(arr, StructArray, as_struct()),
4972            ScalarValue::Map(arr) => compact_array!(arr, MapArray, as_map()),
4973            ScalarValue::Union(val, _, _) => {
4974                if let Some((_, value)) = val.as_mut() {
4975                    value.compact();
4976                }
4977            }
4978            ScalarValue::Dictionary(_, value) => {
4979                value.compact();
4980            }
4981            ScalarValue::RunEndEncoded(_, _, value) => {
4982                value.compact();
4983            }
4984        }
4985    }
4986
4987    /// Compacts ([ScalarValue::compact]) the current [ScalarValue] and returns it.
4988    pub fn compacted(mut self) -> Self {
4989        self.compact();
4990        self
4991    }
4992
4993    /// Recursively compacts the backing buffers of any [`StringViewArray`] or
4994    /// [`BinaryViewArray`] nested within `array`.
4995    ///
4996    /// View-typed arrays keep an `Arc` reference to their original backing
4997    /// buffers, so a single scalar extracted from a large batch still retains
4998    /// the entire buffer.  Calling [`.gc()`][StringViewArray::gc] copies only
4999    /// the bytes that are actually referenced by the surviving views, releasing
5000    /// the rest.
5001    ///
5002    /// Container types (`List`, `LargeList`, `FixedSizeList`, `ListView`,
5003    /// `LargeListView`, `Struct`, `Map`) are handled by recursing into their
5004    /// child / values arrays and reconstructing the parent with the compacted
5005    /// children.  All other types are returned unchanged.
5006    fn compact_view_buffers(array: ArrayRef) -> ArrayRef {
5007        // Macro for the i32/i64-offset list pair (List / LargeList).
5008        macro_rules! gc_list {
5009            ($field:expr, $offset_type:ty, $array_type:ty) => {{
5010                let list = array.as_list::<$offset_type>();
5011                Arc::new(<$array_type>::new(
5012                    Arc::clone($field),
5013                    list.offsets().clone(),
5014                    ScalarValue::compact_view_buffers(Arc::clone(list.values())),
5015                    list.nulls().cloned(),
5016                )) as ArrayRef
5017            }};
5018        }
5019        // Macro for the i32/i64-offset list-view pair (ListView / LargeListView).
5020        macro_rules! gc_list_view {
5021            ($field:expr, $offset_type:ty, $array_type:ty) => {{
5022                let list = array.as_list_view::<$offset_type>();
5023                Arc::new(<$array_type>::new(
5024                    Arc::clone($field),
5025                    list.offsets().clone(),
5026                    list.sizes().clone(),
5027                    ScalarValue::compact_view_buffers(Arc::clone(list.values())),
5028                    list.nulls().cloned(),
5029                )) as ArrayRef
5030            }};
5031        }
5032
5033        match array.data_type() {
5034            DataType::Utf8View => Arc::new(array.as_string_view().gc()),
5035            DataType::BinaryView => Arc::new(array.as_binary_view().gc()),
5036            DataType::Struct(_) => {
5037                let s = array.as_struct();
5038                let columns = s
5039                    .columns()
5040                    .iter()
5041                    .map(|c| ScalarValue::compact_view_buffers(Arc::clone(c)))
5042                    .collect();
5043                Arc::new(StructArray::new(
5044                    s.fields().clone(),
5045                    columns,
5046                    s.nulls().cloned(),
5047                ))
5048            }
5049            DataType::List(field) => gc_list!(field, i32, ListArray),
5050            DataType::LargeList(field) => gc_list!(field, i64, LargeListArray),
5051            DataType::FixedSizeList(field, size) => {
5052                let list = array.as_fixed_size_list();
5053                Arc::new(FixedSizeListArray::new(
5054                    Arc::clone(field),
5055                    *size,
5056                    ScalarValue::compact_view_buffers(Arc::clone(list.values())),
5057                    list.nulls().cloned(),
5058                ))
5059            }
5060            DataType::ListView(field) => gc_list_view!(field, i32, ListViewArray),
5061            DataType::LargeListView(field) => {
5062                gc_list_view!(field, i64, LargeListViewArray)
5063            }
5064            DataType::Map(field, ordered) => {
5065                let map = array.as_map();
5066                let entries = ScalarValue::compact_view_buffers(Arc::new(
5067                    map.entries().clone(),
5068                )
5069                    as ArrayRef);
5070                Arc::new(MapArray::new(
5071                    Arc::clone(field),
5072                    map.offsets().clone(),
5073                    entries.as_struct().clone(),
5074                    map.nulls().cloned(),
5075                    *ordered,
5076                ))
5077            }
5078            _ => array,
5079        }
5080    }
5081
5082    /// Returns the minimum value for the given numeric `DataType`.
5083    ///
5084    /// This function returns the smallest representable value for numeric
5085    /// and temporal data types. For non-numeric types, it returns `None`.
5086    ///
5087    /// # Supported Types
5088    ///
5089    /// - **Integer types**: `i8::MIN`, `i16::MIN`, etc.
5090    /// - **Unsigned types**: Always 0 (`u8::MIN`, `u16::MIN`, etc.)
5091    /// - **Float types**: Negative infinity (IEEE 754)
5092    /// - **Decimal types**: Smallest value based on precision
5093    /// - **Temporal types**: Minimum timestamp/date values
5094    /// - **Time types**: 0 (midnight)
5095    /// - **Duration types**: `i64::MIN`
5096    pub fn min(datatype: &DataType) -> Option<ScalarValue> {
5097        match datatype {
5098            DataType::Int8 => Some(ScalarValue::Int8(Some(i8::MIN))),
5099            DataType::Int16 => Some(ScalarValue::Int16(Some(i16::MIN))),
5100            DataType::Int32 => Some(ScalarValue::Int32(Some(i32::MIN))),
5101            DataType::Int64 => Some(ScalarValue::Int64(Some(i64::MIN))),
5102            DataType::UInt8 => Some(ScalarValue::UInt8(Some(u8::MIN))),
5103            DataType::UInt16 => Some(ScalarValue::UInt16(Some(u16::MIN))),
5104            DataType::UInt32 => Some(ScalarValue::UInt32(Some(u32::MIN))),
5105            DataType::UInt64 => Some(ScalarValue::UInt64(Some(u64::MIN))),
5106            DataType::Float16 => Some(ScalarValue::Float16(Some(f16::NEG_INFINITY))),
5107            DataType::Float32 => Some(ScalarValue::Float32(Some(f32::NEG_INFINITY))),
5108            DataType::Float64 => Some(ScalarValue::Float64(Some(f64::NEG_INFINITY))),
5109            DataType::Decimal32(precision, scale) => {
5110                let min = MIN_DECIMAL32_FOR_EACH_PRECISION[*precision as usize];
5111                Some(ScalarValue::Decimal32(Some(min), *precision, *scale))
5112            }
5113            DataType::Decimal64(precision, scale) => {
5114                let min = MIN_DECIMAL64_FOR_EACH_PRECISION[*precision as usize];
5115                Some(ScalarValue::Decimal64(Some(min), *precision, *scale))
5116            }
5117            DataType::Decimal128(precision, scale) => {
5118                let min = MIN_DECIMAL128_FOR_EACH_PRECISION[*precision as usize];
5119                Some(ScalarValue::Decimal128(Some(min), *precision, *scale))
5120            }
5121            DataType::Decimal256(precision, scale) => {
5122                let min = MIN_DECIMAL256_FOR_EACH_PRECISION[*precision as usize];
5123                Some(ScalarValue::Decimal256(Some(min), *precision, *scale))
5124            }
5125            DataType::Date32 => Some(ScalarValue::Date32(Some(i32::MIN))),
5126            DataType::Date64 => Some(ScalarValue::Date64(Some(i64::MIN))),
5127            DataType::Time32(TimeUnit::Second) => {
5128                Some(ScalarValue::Time32Second(Some(0)))
5129            }
5130            DataType::Time32(TimeUnit::Millisecond) => {
5131                Some(ScalarValue::Time32Millisecond(Some(0)))
5132            }
5133            DataType::Time64(TimeUnit::Microsecond) => {
5134                Some(ScalarValue::Time64Microsecond(Some(0)))
5135            }
5136            DataType::Time64(TimeUnit::Nanosecond) => {
5137                Some(ScalarValue::Time64Nanosecond(Some(0)))
5138            }
5139            DataType::Timestamp(unit, tz) => match unit {
5140                TimeUnit::Second => {
5141                    Some(ScalarValue::TimestampSecond(Some(i64::MIN), tz.clone()))
5142                }
5143                TimeUnit::Millisecond => Some(ScalarValue::TimestampMillisecond(
5144                    Some(i64::MIN),
5145                    tz.clone(),
5146                )),
5147                TimeUnit::Microsecond => Some(ScalarValue::TimestampMicrosecond(
5148                    Some(i64::MIN),
5149                    tz.clone(),
5150                )),
5151                TimeUnit::Nanosecond => {
5152                    Some(ScalarValue::TimestampNanosecond(Some(i64::MIN), tz.clone()))
5153                }
5154            },
5155            DataType::Duration(unit) => match unit {
5156                TimeUnit::Second => Some(ScalarValue::DurationSecond(Some(i64::MIN))),
5157                TimeUnit::Millisecond => {
5158                    Some(ScalarValue::DurationMillisecond(Some(i64::MIN)))
5159                }
5160                TimeUnit::Microsecond => {
5161                    Some(ScalarValue::DurationMicrosecond(Some(i64::MIN)))
5162                }
5163                TimeUnit::Nanosecond => {
5164                    Some(ScalarValue::DurationNanosecond(Some(i64::MIN)))
5165                }
5166            },
5167            _ => None,
5168        }
5169    }
5170
5171    /// Returns the maximum value for the given numeric `DataType`.
5172    ///
5173    /// This function returns the largest representable value for numeric
5174    /// and temporal data types. For non-numeric types, it returns `None`.
5175    ///
5176    /// # Supported Types
5177    ///
5178    /// - **Integer types**: `i8::MAX`, `i16::MAX`, etc.
5179    /// - **Unsigned types**: `u8::MAX`, `u16::MAX`, etc.
5180    /// - **Float types**: Positive infinity (IEEE 754)
5181    /// - **Decimal types**: Largest value based on precision
5182    /// - **Temporal types**: Maximum timestamp/date values
5183    /// - **Time types**: Maximum time in the day (1 day - 1 unit)
5184    /// - **Duration types**: `i64::MAX`
5185    pub fn max(datatype: &DataType) -> Option<ScalarValue> {
5186        match datatype {
5187            DataType::Int8 => Some(ScalarValue::Int8(Some(i8::MAX))),
5188            DataType::Int16 => Some(ScalarValue::Int16(Some(i16::MAX))),
5189            DataType::Int32 => Some(ScalarValue::Int32(Some(i32::MAX))),
5190            DataType::Int64 => Some(ScalarValue::Int64(Some(i64::MAX))),
5191            DataType::UInt8 => Some(ScalarValue::UInt8(Some(u8::MAX))),
5192            DataType::UInt16 => Some(ScalarValue::UInt16(Some(u16::MAX))),
5193            DataType::UInt32 => Some(ScalarValue::UInt32(Some(u32::MAX))),
5194            DataType::UInt64 => Some(ScalarValue::UInt64(Some(u64::MAX))),
5195            DataType::Float16 => Some(ScalarValue::Float16(Some(f16::INFINITY))),
5196            DataType::Float32 => Some(ScalarValue::Float32(Some(f32::INFINITY))),
5197            DataType::Float64 => Some(ScalarValue::Float64(Some(f64::INFINITY))),
5198            DataType::Decimal32(precision, scale) => {
5199                let max = MAX_DECIMAL32_FOR_EACH_PRECISION[*precision as usize];
5200                Some(ScalarValue::Decimal32(Some(max), *precision, *scale))
5201            }
5202            DataType::Decimal64(precision, scale) => {
5203                let max = MAX_DECIMAL64_FOR_EACH_PRECISION[*precision as usize];
5204                Some(ScalarValue::Decimal64(Some(max), *precision, *scale))
5205            }
5206            DataType::Decimal128(precision, scale) => {
5207                let max = MAX_DECIMAL128_FOR_EACH_PRECISION[*precision as usize];
5208                Some(ScalarValue::Decimal128(Some(max), *precision, *scale))
5209            }
5210            DataType::Decimal256(precision, scale) => {
5211                let max = MAX_DECIMAL256_FOR_EACH_PRECISION[*precision as usize];
5212                Some(ScalarValue::Decimal256(Some(max), *precision, *scale))
5213            }
5214            DataType::Date32 => Some(ScalarValue::Date32(Some(i32::MAX))),
5215            DataType::Date64 => Some(ScalarValue::Date64(Some(i64::MAX))),
5216            DataType::Time32(TimeUnit::Second) => {
5217                // 86399 seconds = 23:59:59
5218                Some(ScalarValue::Time32Second(Some(86_399)))
5219            }
5220            DataType::Time32(TimeUnit::Millisecond) => {
5221                // 86_399_999 milliseconds = 23:59:59.999
5222                Some(ScalarValue::Time32Millisecond(Some(86_399_999)))
5223            }
5224            DataType::Time64(TimeUnit::Microsecond) => {
5225                // 86_399_999_999 microseconds = 23:59:59.999999
5226                Some(ScalarValue::Time64Microsecond(Some(86_399_999_999)))
5227            }
5228            DataType::Time64(TimeUnit::Nanosecond) => {
5229                // 86_399_999_999_999 nanoseconds = 23:59:59.999999999
5230                Some(ScalarValue::Time64Nanosecond(Some(86_399_999_999_999)))
5231            }
5232            DataType::Timestamp(unit, tz) => match unit {
5233                TimeUnit::Second => {
5234                    Some(ScalarValue::TimestampSecond(Some(i64::MAX), tz.clone()))
5235                }
5236                TimeUnit::Millisecond => Some(ScalarValue::TimestampMillisecond(
5237                    Some(i64::MAX),
5238                    tz.clone(),
5239                )),
5240                TimeUnit::Microsecond => Some(ScalarValue::TimestampMicrosecond(
5241                    Some(i64::MAX),
5242                    tz.clone(),
5243                )),
5244                TimeUnit::Nanosecond => {
5245                    Some(ScalarValue::TimestampNanosecond(Some(i64::MAX), tz.clone()))
5246                }
5247            },
5248            DataType::Duration(unit) => match unit {
5249                TimeUnit::Second => Some(ScalarValue::DurationSecond(Some(i64::MAX))),
5250                TimeUnit::Millisecond => {
5251                    Some(ScalarValue::DurationMillisecond(Some(i64::MAX)))
5252                }
5253                TimeUnit::Microsecond => {
5254                    Some(ScalarValue::DurationMicrosecond(Some(i64::MAX)))
5255                }
5256                TimeUnit::Nanosecond => {
5257                    Some(ScalarValue::DurationNanosecond(Some(i64::MAX)))
5258                }
5259            },
5260            _ => None,
5261        }
5262    }
5263
5264    /// A thin wrapper on Arrow's validation that throws internal error if validation
5265    /// fails.
5266    fn validate_decimal_or_internal_err<T: DecimalType>(
5267        precision: u8,
5268        scale: i8,
5269    ) -> Result<()> {
5270        validate_decimal_precision_and_scale::<T>(precision, scale).map_err(|err| {
5271            _internal_datafusion_err!(
5272                "Decimal precision/scale invariant violated \
5273                 (precision={precision}, scale={scale}): {err}"
5274            )
5275        })
5276    }
5277}
5278
5279/// Compacts the data of an `ArrayData` into a new `ArrayData`.
5280///
5281/// This is useful when you want to minimize the memory footprint of an
5282/// `ArrayData`. For example, the value returned by [`Array::slice`] still
5283/// points at the same underlying data buffers as the original array, which may
5284/// hold many more values. Calling `copy_array_data` on the sliced array will
5285/// create a new, smaller, `ArrayData` that only contains the data for the
5286/// sliced array.
5287///
5288/// # Example
5289/// ```
5290/// # use arrow::array::{make_array, Array, Int32Array};
5291/// use datafusion_common::scalar::copy_array_data;
5292/// let array = Int32Array::from_iter_values(0..8192);
5293/// // Take only the first 2 elements
5294/// let sliced_array = array.slice(0, 2);
5295/// // The memory footprint of `sliced_array` is close to 8192 * 4 bytes
5296/// assert_eq!(32864, sliced_array.get_array_memory_size());
5297/// // however, we can copy the data to a new `ArrayData`
5298/// let new_array = make_array(copy_array_data(&sliced_array.into_data()));
5299/// // The memory footprint of `new_array` is now only 2 * 4 bytes
5300/// // and overhead:
5301/// assert_eq!(160, new_array.get_array_memory_size());
5302/// ```
5303///
5304/// See also [`ScalarValue::compact`] which applies to `ScalarValue` instances
5305/// as necessary.
5306pub fn copy_array_data(src_data: &ArrayData) -> ArrayData {
5307    let mut copy = MutableArrayData::new(vec![&src_data], true, src_data.len());
5308    copy.try_extend(0, 0, src_data.len())
5309        .expect("copy_array_data failed due to offset overflow");
5310    copy.freeze()
5311}
5312
5313macro_rules! impl_scalar {
5314    ($ty:ty, $scalar:tt) => {
5315        impl From<$ty> for ScalarValue {
5316            fn from(value: $ty) -> Self {
5317                ScalarValue::$scalar(Some(value))
5318            }
5319        }
5320
5321        impl From<Option<$ty>> for ScalarValue {
5322            fn from(value: Option<$ty>) -> Self {
5323                ScalarValue::$scalar(value)
5324            }
5325        }
5326    };
5327}
5328
5329impl_scalar!(f64, Float64);
5330impl_scalar!(f32, Float32);
5331impl_scalar!(f16, Float16);
5332impl_scalar!(i8, Int8);
5333impl_scalar!(i16, Int16);
5334impl_scalar!(i32, Int32);
5335impl_scalar!(i64, Int64);
5336impl_scalar!(bool, Boolean);
5337impl_scalar!(u8, UInt8);
5338impl_scalar!(u16, UInt16);
5339impl_scalar!(u32, UInt32);
5340impl_scalar!(u64, UInt64);
5341
5342impl From<&str> for ScalarValue {
5343    fn from(value: &str) -> Self {
5344        Some(value).into()
5345    }
5346}
5347
5348impl From<Option<&str>> for ScalarValue {
5349    fn from(value: Option<&str>) -> Self {
5350        let value = value.map(|s| s.to_string());
5351        value.into()
5352    }
5353}
5354
5355/// Wrapper to create ScalarValue::Struct for convenience
5356impl From<Vec<(&str, ScalarValue)>> for ScalarValue {
5357    fn from(value: Vec<(&str, ScalarValue)>) -> Self {
5358        value
5359            .into_iter()
5360            .fold(ScalarStructBuilder::new(), |builder, (name, value)| {
5361                builder.with_name_and_scalar(name, value)
5362            })
5363            .build()
5364            .unwrap()
5365    }
5366}
5367
5368impl FromStr for ScalarValue {
5369    type Err = Infallible;
5370
5371    fn from_str(s: &str) -> Result<Self, Self::Err> {
5372        Ok(s.into())
5373    }
5374}
5375
5376impl From<String> for ScalarValue {
5377    fn from(value: String) -> Self {
5378        Some(value).into()
5379    }
5380}
5381
5382impl From<Option<String>> for ScalarValue {
5383    fn from(value: Option<String>) -> Self {
5384        ScalarValue::Utf8(value)
5385    }
5386}
5387
5388macro_rules! impl_try_from {
5389    ($SCALAR:ident, $NATIVE:ident) => {
5390        impl TryFrom<ScalarValue> for $NATIVE {
5391            type Error = DataFusionError;
5392
5393            fn try_from(value: ScalarValue) -> Result<Self> {
5394                match value {
5395                    ScalarValue::$SCALAR(Some(inner_value)) => Ok(inner_value),
5396                    _ => _internal_err!(
5397                        "Cannot convert {:?} to {}",
5398                        value,
5399                        std::any::type_name::<Self>()
5400                    ),
5401                }
5402            }
5403        }
5404    };
5405}
5406
5407impl_try_from!(Int8, i8);
5408impl_try_from!(Int16, i16);
5409
5410// special implementation for i32 because of Date32 and Time32
5411impl TryFrom<ScalarValue> for i32 {
5412    type Error = DataFusionError;
5413
5414    fn try_from(value: ScalarValue) -> Result<Self> {
5415        match value {
5416            ScalarValue::Int32(Some(inner_value))
5417            | ScalarValue::Date32(Some(inner_value))
5418            | ScalarValue::Time32Second(Some(inner_value))
5419            | ScalarValue::Time32Millisecond(Some(inner_value)) => Ok(inner_value),
5420            _ => _internal_err!(
5421                "Cannot convert {:?} to {}",
5422                value,
5423                std::any::type_name::<Self>()
5424            ),
5425        }
5426    }
5427}
5428
5429// special implementation for i64 because of Date64, Time64 and Timestamp
5430impl TryFrom<ScalarValue> for i64 {
5431    type Error = DataFusionError;
5432
5433    fn try_from(value: ScalarValue) -> Result<Self> {
5434        match value {
5435            ScalarValue::Int64(Some(inner_value))
5436            | ScalarValue::Date64(Some(inner_value))
5437            | ScalarValue::Time64Microsecond(Some(inner_value))
5438            | ScalarValue::Time64Nanosecond(Some(inner_value))
5439            | ScalarValue::TimestampNanosecond(Some(inner_value), _)
5440            | ScalarValue::TimestampMicrosecond(Some(inner_value), _)
5441            | ScalarValue::TimestampMillisecond(Some(inner_value), _)
5442            | ScalarValue::TimestampSecond(Some(inner_value), _) => Ok(inner_value),
5443            _ => _internal_err!(
5444                "Cannot convert {:?} to {}",
5445                value,
5446                std::any::type_name::<Self>()
5447            ),
5448        }
5449    }
5450}
5451
5452// special implementation for i128 because of Decimal128
5453impl TryFrom<ScalarValue> for i128 {
5454    type Error = DataFusionError;
5455
5456    fn try_from(value: ScalarValue) -> Result<Self> {
5457        match value {
5458            ScalarValue::Decimal128(Some(inner_value), _, _) => Ok(inner_value),
5459            _ => _internal_err!(
5460                "Cannot convert {:?} to {}",
5461                value,
5462                std::any::type_name::<Self>()
5463            ),
5464        }
5465    }
5466}
5467
5468// special implementation for i256 because of Decimal128
5469impl TryFrom<ScalarValue> for i256 {
5470    type Error = DataFusionError;
5471
5472    fn try_from(value: ScalarValue) -> Result<Self> {
5473        match value {
5474            ScalarValue::Decimal256(Some(inner_value), _, _) => Ok(inner_value),
5475            _ => _internal_err!(
5476                "Cannot convert {:?} to {}",
5477                value,
5478                std::any::type_name::<Self>()
5479            ),
5480        }
5481    }
5482}
5483
5484impl_try_from!(UInt8, u8);
5485impl_try_from!(UInt16, u16);
5486impl_try_from!(UInt32, u32);
5487impl_try_from!(UInt64, u64);
5488impl_try_from!(Float16, f16);
5489impl_try_from!(Float32, f32);
5490impl_try_from!(Float64, f64);
5491impl_try_from!(Boolean, bool);
5492
5493impl TryFrom<DataType> for ScalarValue {
5494    type Error = DataFusionError;
5495
5496    /// Create a Null instance of ScalarValue for this datatype
5497    fn try_from(datatype: DataType) -> Result<Self> {
5498        (&datatype).try_into()
5499    }
5500}
5501
5502impl TryFrom<&DataType> for ScalarValue {
5503    type Error = DataFusionError;
5504
5505    /// Create a Null instance of ScalarValue for this datatype
5506    fn try_from(data_type: &DataType) -> Result<Self> {
5507        Self::try_new_null(data_type)
5508    }
5509}
5510
5511macro_rules! format_option {
5512    ($F:expr, $EXPR:expr) => {{
5513        match $EXPR {
5514            Some(e) => write!($F, "{e}"),
5515            None => write!($F, "NULL"),
5516        }
5517    }};
5518}
5519
5520macro_rules! format_decimal {
5521    ($F:expr, $TYPE:ty, $VALUE:expr, $PRECISION:expr, $SCALE:expr) => {{
5522        match $VALUE {
5523            Some(value) => write!(
5524                $F,
5525                "{}",
5526                <$TYPE>::format_decimal(*value, *$PRECISION, *$SCALE)
5527            ),
5528            None => write!($F, "NULL"),
5529        }
5530    }};
5531}
5532
5533macro_rules! format_decimal_debug {
5534    ($F:expr, $TYPE_NAME:literal, $TYPE:ty, $VALUE:expr, $PRECISION:expr, $SCALE:expr) => {{
5535        match $VALUE {
5536            Some(value) => write!(
5537                $F,
5538                "{}({},{},{})",
5539                $TYPE_NAME,
5540                <$TYPE>::format_decimal(*value, *$PRECISION, *$SCALE),
5541                $PRECISION,
5542                $SCALE
5543            ),
5544            None => write!($F, "{}(NULL,{},{})", $TYPE_NAME, $PRECISION, $SCALE),
5545        }
5546    }};
5547}
5548
5549// Implement Display trait for ScalarValue
5550//
5551// # Panics
5552//
5553// Panics if there is an error when creating a visual representation of columns via `arrow::util::pretty`
5554impl fmt::Display for ScalarValue {
5555    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
5556        match self {
5557            ScalarValue::Decimal32(v, p, s) => {
5558                format_decimal!(f, Decimal32Type, v, p, s)?
5559            }
5560            ScalarValue::Decimal64(v, p, s) => {
5561                format_decimal!(f, Decimal64Type, v, p, s)?
5562            }
5563            ScalarValue::Decimal128(v, p, s) => {
5564                format_decimal!(f, Decimal128Type, v, p, s)?
5565            }
5566            ScalarValue::Decimal256(v, p, s) => {
5567                format_decimal!(f, Decimal256Type, v, p, s)?
5568            }
5569            ScalarValue::Boolean(e) => format_option!(f, e)?,
5570            ScalarValue::Float16(e) => format_option!(f, e)?,
5571            ScalarValue::Float32(e) => format_option!(f, e)?,
5572            ScalarValue::Float64(e) => format_option!(f, e)?,
5573            ScalarValue::Int8(e) => format_option!(f, e)?,
5574            ScalarValue::Int16(e) => format_option!(f, e)?,
5575            ScalarValue::Int32(e) => format_option!(f, e)?,
5576            ScalarValue::Int64(e) => format_option!(f, e)?,
5577            ScalarValue::UInt8(e) => format_option!(f, e)?,
5578            ScalarValue::UInt16(e) => format_option!(f, e)?,
5579            ScalarValue::UInt32(e) => format_option!(f, e)?,
5580            ScalarValue::UInt64(e) => format_option!(f, e)?,
5581            ScalarValue::TimestampSecond(e, _) => format_option!(f, e)?,
5582            ScalarValue::TimestampMillisecond(e, _) => format_option!(f, e)?,
5583            ScalarValue::TimestampMicrosecond(e, _) => format_option!(f, e)?,
5584            ScalarValue::TimestampNanosecond(e, _) => format_option!(f, e)?,
5585            ScalarValue::Utf8(e)
5586            | ScalarValue::LargeUtf8(e)
5587            | ScalarValue::Utf8View(e) => format_option!(f, e)?,
5588            ScalarValue::Binary(e)
5589            | ScalarValue::FixedSizeBinary(_, e)
5590            | ScalarValue::LargeBinary(e)
5591            | ScalarValue::BinaryView(e) => match e {
5592                Some(bytes) => {
5593                    // print up to first 10 bytes, with trailing ... if needed
5594                    const HEX_CHARS_UPPER: &[u8; 16] = b"0123456789ABCDEF";
5595                    for b in bytes.iter().take(10) {
5596                        f.write_char(HEX_CHARS_UPPER[(b >> 4) as usize] as char)?;
5597                        f.write_char(HEX_CHARS_UPPER[(b & 0x0f) as usize] as char)?;
5598                    }
5599                    if bytes.len() > 10 {
5600                        write!(f, "...")?;
5601                    }
5602                }
5603                None => write!(f, "NULL")?,
5604            },
5605            ScalarValue::List(arr) => fmt_list(arr.as_ref(), f)?,
5606            ScalarValue::LargeList(arr) => fmt_list(arr.as_ref(), f)?,
5607            ScalarValue::FixedSizeList(arr) => fmt_list(arr.as_ref(), f)?,
5608            ScalarValue::ListView(arr) => fmt_list(arr.as_ref(), f)?,
5609            ScalarValue::LargeListView(arr) => fmt_list(arr.as_ref(), f)?,
5610            ScalarValue::Date32(e) => format_option!(
5611                f,
5612                e.map(|v| {
5613                    let epoch = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
5614                    match epoch.checked_add_signed(Duration::try_days(v as i64).unwrap())
5615                    {
5616                        Some(date) => date.to_string(),
5617                        None => "".to_string(),
5618                    }
5619                })
5620            )?,
5621            ScalarValue::Date64(e) => format_option!(
5622                f,
5623                e.map(|v| {
5624                    let epoch = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
5625                    match epoch.checked_add_signed(Duration::try_milliseconds(v).unwrap())
5626                    {
5627                        Some(date) => date.to_string(),
5628                        None => "".to_string(),
5629                    }
5630                })
5631            )?,
5632            ScalarValue::Time32Second(e) => format_option!(f, e)?,
5633            ScalarValue::Time32Millisecond(e) => format_option!(f, e)?,
5634            ScalarValue::Time64Microsecond(e) => format_option!(f, e)?,
5635            ScalarValue::Time64Nanosecond(e) => format_option!(f, e)?,
5636            ScalarValue::IntervalYearMonth(e) => format_option!(f, e)?,
5637            ScalarValue::IntervalMonthDayNano(e) => {
5638                format_option!(f, e.map(|v| format!("{v:?}")))?
5639            }
5640            ScalarValue::IntervalDayTime(e) => {
5641                format_option!(f, e.map(|v| format!("{v:?}")))?;
5642            }
5643            ScalarValue::DurationSecond(e) => format_option!(f, e)?,
5644            ScalarValue::DurationMillisecond(e) => format_option!(f, e)?,
5645            ScalarValue::DurationMicrosecond(e) => format_option!(f, e)?,
5646            ScalarValue::DurationNanosecond(e) => format_option!(f, e)?,
5647            ScalarValue::Struct(struct_arr) => {
5648                // ScalarValue Struct should always have a single element
5649                assert_eq!(struct_arr.len(), 1);
5650
5651                if struct_arr.null_count() == struct_arr.len() {
5652                    write!(f, "NULL")?;
5653                    return Ok(());
5654                }
5655
5656                let columns = struct_arr.columns();
5657                let fields = struct_arr.fields();
5658                let nulls = struct_arr.nulls();
5659
5660                write!(
5661                    f,
5662                    "{{{}}}",
5663                    columns
5664                        .iter()
5665                        .zip(fields.iter())
5666                        .map(|(column, field)| {
5667                            if nulls.is_some_and(|b| b.is_null(0)) {
5668                                format!("{}:NULL", field.name())
5669                            } else if let DataType::Struct(_) = field.data_type() {
5670                                let sv = ScalarValue::Struct(Arc::new(
5671                                    column.as_struct().to_owned(),
5672                                ));
5673                                format!("{}:{sv}", field.name())
5674                            } else {
5675                                let sv = array_value_to_string(column, 0).unwrap();
5676                                format!("{}:{sv}", field.name())
5677                            }
5678                        })
5679                        .collect::<Vec<_>>()
5680                        .join(",")
5681                )?
5682            }
5683            ScalarValue::Map(map_arr) => {
5684                if map_arr.null_count() == map_arr.len() {
5685                    write!(f, "NULL")?;
5686                    return Ok(());
5687                }
5688
5689                write!(
5690                    f,
5691                    "[{}]",
5692                    map_arr
5693                        .iter()
5694                        .map(|struct_array| {
5695                            if let Some(arr) = struct_array {
5696                                let mut buffer = VecDeque::new();
5697                                for i in 0..arr.len() {
5698                                    let key =
5699                                        array_value_to_string(arr.column(0), i).unwrap();
5700                                    let value =
5701                                        array_value_to_string(arr.column(1), i).unwrap();
5702                                    buffer.push_back(format!("{key}:{value}"));
5703                                }
5704                                format!(
5705                                    "{{{}}}",
5706                                    buffer
5707                                        .into_iter()
5708                                        .collect::<Vec<_>>()
5709                                        .join(",")
5710                                        .as_str()
5711                                )
5712                            } else {
5713                                "NULL".to_string()
5714                            }
5715                        })
5716                        .collect::<Vec<_>>()
5717                        .join(",")
5718                )?
5719            }
5720            ScalarValue::Union(val, _fields, _mode) => match val {
5721                Some((id, val)) => write!(f, "{id}:{val}")?,
5722                None => write!(f, "NULL")?,
5723            },
5724            ScalarValue::Dictionary(_k, v) => write!(f, "{v}")?,
5725            ScalarValue::RunEndEncoded(_, _, v) => write!(f, "{v}")?,
5726            ScalarValue::Null => write!(f, "NULL")?,
5727        };
5728        Ok(())
5729    }
5730}
5731
5732fn fmt_list(arr: &dyn Array, f: &mut fmt::Formatter) -> fmt::Result {
5733    // ScalarValue List, LargeList, FixedSizeList, ListView, LargeListView should always have a single element
5734    assert_eq!(arr.len(), 1);
5735    let options = FormatOptions::default().with_display_error(true);
5736    let formatter = ArrayFormatter::try_new(arr, &options).unwrap();
5737    let value_formatter = formatter.value(0);
5738    write!(f, "{value_formatter}")
5739}
5740
5741/// Writes a byte array for ScalarValue Debug formatting.
5742/// `[1, 2, 3]` -> `"1,2,3"`
5743fn fmt_binary_debug(data: &[u8], f: &mut fmt::Formatter) -> fmt::Result {
5744    let mut iter = data.iter();
5745    if let Some(b) = iter.next() {
5746        write!(f, "{b}")?;
5747    }
5748    for b in iter {
5749        write!(f, ",{b}")?;
5750    }
5751    Ok(())
5752}
5753
5754impl fmt::Debug for ScalarValue {
5755    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
5756        match self {
5757            ScalarValue::Decimal32(value, precision, scale) => {
5758                format_decimal_debug!(
5759                    f,
5760                    "Decimal32",
5761                    Decimal32Type,
5762                    value,
5763                    precision,
5764                    scale
5765                )
5766            }
5767            ScalarValue::Decimal64(value, precision, scale) => {
5768                format_decimal_debug!(
5769                    f,
5770                    "Decimal64",
5771                    Decimal64Type,
5772                    value,
5773                    precision,
5774                    scale
5775                )
5776            }
5777            ScalarValue::Decimal128(value, precision, scale) => {
5778                format_decimal_debug!(
5779                    f,
5780                    "Decimal128",
5781                    Decimal128Type,
5782                    value,
5783                    precision,
5784                    scale
5785                )
5786            }
5787            ScalarValue::Decimal256(value, precision, scale) => {
5788                format_decimal_debug!(
5789                    f,
5790                    "Decimal256",
5791                    Decimal256Type,
5792                    value,
5793                    precision,
5794                    scale
5795                )
5796            }
5797            ScalarValue::Boolean(_) => write!(f, "Boolean({self})"),
5798            ScalarValue::Float16(_) => write!(f, "Float16({self})"),
5799            ScalarValue::Float32(_) => write!(f, "Float32({self})"),
5800            ScalarValue::Float64(_) => write!(f, "Float64({self})"),
5801            ScalarValue::Int8(_) => write!(f, "Int8({self})"),
5802            ScalarValue::Int16(_) => write!(f, "Int16({self})"),
5803            ScalarValue::Int32(_) => write!(f, "Int32({self})"),
5804            ScalarValue::Int64(_) => write!(f, "Int64({self})"),
5805            ScalarValue::UInt8(_) => write!(f, "UInt8({self})"),
5806            ScalarValue::UInt16(_) => write!(f, "UInt16({self})"),
5807            ScalarValue::UInt32(_) => write!(f, "UInt32({self})"),
5808            ScalarValue::UInt64(_) => write!(f, "UInt64({self})"),
5809            ScalarValue::TimestampSecond(_, tz_opt) => {
5810                write!(f, "TimestampSecond({self}, {tz_opt:?})")
5811            }
5812            ScalarValue::TimestampMillisecond(_, tz_opt) => {
5813                write!(f, "TimestampMillisecond({self}, {tz_opt:?})")
5814            }
5815            ScalarValue::TimestampMicrosecond(_, tz_opt) => {
5816                write!(f, "TimestampMicrosecond({self}, {tz_opt:?})")
5817            }
5818            ScalarValue::TimestampNanosecond(_, tz_opt) => {
5819                write!(f, "TimestampNanosecond({self}, {tz_opt:?})")
5820            }
5821            ScalarValue::Utf8(None) => write!(f, "Utf8({self})"),
5822            ScalarValue::Utf8(Some(_)) => write!(f, "Utf8(\"{self}\")"),
5823            ScalarValue::Utf8View(None) => write!(f, "Utf8View({self})"),
5824            ScalarValue::Utf8View(Some(_)) => write!(f, "Utf8View(\"{self}\")"),
5825            ScalarValue::LargeUtf8(None) => write!(f, "LargeUtf8({self})"),
5826            ScalarValue::LargeUtf8(Some(_)) => write!(f, "LargeUtf8(\"{self}\")"),
5827            ScalarValue::Binary(None) => write!(f, "Binary({self})"),
5828            ScalarValue::Binary(Some(b)) => {
5829                write!(f, "Binary(\"")?;
5830                fmt_binary_debug(b.as_slice(), f)?;
5831                write!(f, "\")")
5832            }
5833            ScalarValue::BinaryView(None) => write!(f, "BinaryView({self})"),
5834            ScalarValue::BinaryView(Some(b)) => {
5835                write!(f, "BinaryView(\"")?;
5836                fmt_binary_debug(b.as_slice(), f)?;
5837                write!(f, "\")")
5838            }
5839            ScalarValue::FixedSizeBinary(size, None) => {
5840                write!(f, "FixedSizeBinary({size}, {self})")
5841            }
5842            ScalarValue::FixedSizeBinary(size, Some(b)) => {
5843                write!(f, "FixedSizeBinary({size}, \"")?;
5844                fmt_binary_debug(b.as_slice(), f)?;
5845                write!(f, "\")")
5846            }
5847            ScalarValue::LargeBinary(None) => write!(f, "LargeBinary({self})"),
5848            ScalarValue::LargeBinary(Some(b)) => {
5849                write!(f, "LargeBinary(\"")?;
5850                fmt_binary_debug(b.as_slice(), f)?;
5851                write!(f, "\")")
5852            }
5853            ScalarValue::FixedSizeList(_) => write!(f, "FixedSizeList({self})"),
5854            ScalarValue::List(_) => write!(f, "List({self})"),
5855            ScalarValue::LargeList(_) => write!(f, "LargeList({self})"),
5856            ScalarValue::ListView(_) => write!(f, "ListView({self})"),
5857            ScalarValue::LargeListView(_) => write!(f, "LargeListView({self})"),
5858            ScalarValue::Struct(struct_arr) => {
5859                // ScalarValue Struct should always have a single element
5860                assert_eq!(struct_arr.len(), 1);
5861
5862                let columns = struct_arr.columns();
5863                let fields = struct_arr.fields();
5864
5865                write!(
5866                    f,
5867                    "Struct({{{}}})",
5868                    columns
5869                        .iter()
5870                        .zip(fields.iter())
5871                        .map(|(column, field)| {
5872                            let sv = array_value_to_string(column, 0).unwrap();
5873                            let name = field.name();
5874                            format!("{name}:{sv}")
5875                        })
5876                        .collect::<Vec<_>>()
5877                        .join(",")
5878                )
5879            }
5880            ScalarValue::Map(map_arr) => {
5881                write!(
5882                    f,
5883                    "Map([{}])",
5884                    map_arr
5885                        .iter()
5886                        .map(|struct_array| {
5887                            if let Some(arr) = struct_array {
5888                                let buffer: Vec<String> = (0..arr.len())
5889                                    .map(|i| {
5890                                        let key = array_value_to_string(arr.column(0), i)
5891                                            .unwrap();
5892                                        let value =
5893                                            array_value_to_string(arr.column(1), i)
5894                                                .unwrap();
5895                                        format!("{key:?}:{value:?}")
5896                                    })
5897                                    .collect();
5898                                format!("{{{}}}", buffer.join(","))
5899                            } else {
5900                                "NULL".to_string()
5901                            }
5902                        })
5903                        .collect::<Vec<_>>()
5904                        .join(",")
5905                )
5906            }
5907            ScalarValue::Date32(_) => write!(f, "Date32(\"{self}\")"),
5908            ScalarValue::Date64(_) => write!(f, "Date64(\"{self}\")"),
5909            ScalarValue::Time32Second(_) => write!(f, "Time32Second(\"{self}\")"),
5910            ScalarValue::Time32Millisecond(_) => {
5911                write!(f, "Time32Millisecond(\"{self}\")")
5912            }
5913            ScalarValue::Time64Microsecond(_) => {
5914                write!(f, "Time64Microsecond(\"{self}\")")
5915            }
5916            ScalarValue::Time64Nanosecond(_) => {
5917                write!(f, "Time64Nanosecond(\"{self}\")")
5918            }
5919            ScalarValue::IntervalDayTime(_) => {
5920                write!(f, "IntervalDayTime(\"{self}\")")
5921            }
5922            ScalarValue::IntervalYearMonth(_) => {
5923                write!(f, "IntervalYearMonth(\"{self}\")")
5924            }
5925            ScalarValue::IntervalMonthDayNano(_) => {
5926                write!(f, "IntervalMonthDayNano(\"{self}\")")
5927            }
5928            ScalarValue::DurationSecond(_) => write!(f, "DurationSecond(\"{self}\")"),
5929            ScalarValue::DurationMillisecond(_) => {
5930                write!(f, "DurationMillisecond(\"{self}\")")
5931            }
5932            ScalarValue::DurationMicrosecond(_) => {
5933                write!(f, "DurationMicrosecond(\"{self}\")")
5934            }
5935            ScalarValue::DurationNanosecond(_) => {
5936                write!(f, "DurationNanosecond(\"{self}\")")
5937            }
5938            ScalarValue::Union(val, _fields, _mode) => match val {
5939                Some((id, val)) => write!(f, "Union {id}:{val}"),
5940                None => write!(f, "Union(NULL)"),
5941            },
5942            ScalarValue::Dictionary(k, v) => write!(f, "Dictionary({k:?}, {v:?})"),
5943            ScalarValue::RunEndEncoded(rf, vf, v) => {
5944                write!(f, "RunEndEncoded({rf:?}, {vf:?}, {v:?})")
5945            }
5946            ScalarValue::Null => write!(f, "NULL"),
5947        }
5948    }
5949}
5950
5951/// Trait used to map a NativeType to a ScalarValue
5952pub trait ScalarType<T: ArrowNativeType> {
5953    /// returns a scalar from an optional T
5954    fn scalar(r: Option<T>) -> ScalarValue;
5955}
5956
5957impl ScalarType<f32> for Float32Type {
5958    fn scalar(r: Option<f32>) -> ScalarValue {
5959        ScalarValue::Float32(r)
5960    }
5961}
5962
5963impl ScalarType<i64> for TimestampSecondType {
5964    fn scalar(r: Option<i64>) -> ScalarValue {
5965        ScalarValue::TimestampSecond(r, None)
5966    }
5967}
5968
5969impl ScalarType<i64> for TimestampMillisecondType {
5970    fn scalar(r: Option<i64>) -> ScalarValue {
5971        ScalarValue::TimestampMillisecond(r, None)
5972    }
5973}
5974
5975impl ScalarType<i64> for TimestampMicrosecondType {
5976    fn scalar(r: Option<i64>) -> ScalarValue {
5977        ScalarValue::TimestampMicrosecond(r, None)
5978    }
5979}
5980
5981impl ScalarType<i64> for TimestampNanosecondType {
5982    fn scalar(r: Option<i64>) -> ScalarValue {
5983        ScalarValue::TimestampNanosecond(r, None)
5984    }
5985}
5986
5987impl ScalarType<i32> for Date32Type {
5988    fn scalar(r: Option<i32>) -> ScalarValue {
5989        ScalarValue::Date32(r)
5990    }
5991}
5992
5993#[cfg(test)]
5994mod tests {
5995
5996    use super::*;
5997    use crate::cast::{
5998        as_large_list_view_array, as_list_array, as_map_array, as_struct_array,
5999    };
6000    use crate::test_util::batches_to_string;
6001    use arrow::array::{
6002        FixedSizeListBuilder, Int32Builder, LargeListBuilder, LargeListViewBuilder,
6003        ListBuilder, ListViewBuilder, MapBuilder, NullArray, NullBufferBuilder,
6004        OffsetSizeTrait, PrimitiveBuilder, RecordBatch, StringBuilder,
6005        StringDictionaryBuilder, StructBuilder, UnionBuilder,
6006    };
6007    use arrow::buffer::{Buffer, NullBuffer, OffsetBuffer};
6008    use arrow::compute::{is_null, kernels};
6009    use arrow::datatypes::{
6010        ArrowNumericType, DECIMAL128_MAX_PRECISION, DECIMAL256_MAX_PRECISION, Fields,
6011        Float64Type, TimeUnit,
6012    };
6013    use arrow::error::ArrowError;
6014    use arrow::util::pretty::pretty_format_columns;
6015    use insta::assert_snapshot;
6016    use rand::Rng;
6017
6018    #[test]
6019    fn test_scalar_value_from_for_map() {
6020        let string_builder = StringBuilder::new();
6021        let int_builder = Int32Builder::with_capacity(4);
6022        let mut builder = MapBuilder::new(None, string_builder, int_builder);
6023        builder.keys().append_value("joe");
6024        builder.values().append_value(1);
6025        builder.append(true).unwrap();
6026
6027        builder.keys().append_value("blogs");
6028        builder.values().append_value(2);
6029        builder.keys().append_value("foo");
6030        builder.values().append_value(4);
6031        builder.append(true).unwrap();
6032        builder.append(true).unwrap();
6033        builder.append(false).unwrap();
6034
6035        let expected = builder.finish();
6036
6037        let sv = ScalarValue::Map(Arc::new(expected.clone()));
6038        let map_arr = sv.to_array().unwrap();
6039        let actual = as_map_array(&map_arr).unwrap();
6040        assert_eq!(actual, &expected);
6041    }
6042
6043    #[test]
6044    fn test_format_timestamp_type_for_error_and_bounds() {
6045        // format helper
6046        let ts_ns = format_timestamp_type_for_error(&DataType::Timestamp(
6047            TimeUnit::Nanosecond,
6048            None,
6049        ));
6050        assert_eq!(ts_ns, "Timestamp(ns)");
6051
6052        let ts_us = format_timestamp_type_for_error(&DataType::Timestamp(
6053            TimeUnit::Microsecond,
6054            None,
6055        ));
6056        assert_eq!(ts_us, "Timestamp(us)");
6057
6058        // ensure_timestamp_in_bounds: Date32 non-overflow
6059        let ok = ensure_timestamp_in_bounds(
6060            1000,
6061            NANOS_PER_DAY,
6062            &DataType::Date32,
6063            &DataType::Timestamp(TimeUnit::Nanosecond, None),
6064        );
6065        assert!(ok.is_ok());
6066
6067        // Date32 overflow -- known large day value (9999-12-31 -> 2932896)
6068        let err = ensure_timestamp_in_bounds(
6069            2932896,
6070            NANOS_PER_DAY,
6071            &DataType::Date32,
6072            &DataType::Timestamp(TimeUnit::Nanosecond, None),
6073        );
6074        assert!(err.is_err());
6075        let msg = err.unwrap_err().to_string();
6076        assert!(msg.contains("Cannot cast Date32 value 2932896 to Timestamp(ns): converted value exceeds the representable i64 range"));
6077
6078        // Date64 overflow for ns (millis * 1_000_000)
6079        let overflow_millis: i64 = (i64::MAX / NANOS_PER_MILLISECOND) + 1;
6080        let err2 = ensure_timestamp_in_bounds(
6081            overflow_millis,
6082            NANOS_PER_MILLISECOND,
6083            &DataType::Date64,
6084            &DataType::Timestamp(TimeUnit::Nanosecond, None),
6085        );
6086        assert!(err2.is_err());
6087    }
6088
6089    #[test]
6090    fn test_scalar_value_from_for_struct() {
6091        let boolean = Arc::new(BooleanArray::from(vec![false]));
6092        let int = Arc::new(Int32Array::from(vec![42]));
6093
6094        let expected = StructArray::from(vec![
6095            (
6096                Arc::new(Field::new("b", DataType::Boolean, false)),
6097                Arc::clone(&boolean) as ArrayRef,
6098            ),
6099            (
6100                Arc::new(Field::new("c", DataType::Int32, false)),
6101                Arc::clone(&int) as ArrayRef,
6102            ),
6103        ]);
6104
6105        let sv = ScalarStructBuilder::new()
6106            .with_array(Field::new("b", DataType::Boolean, false), boolean)
6107            .with_array(Field::new("c", DataType::Int32, false), int)
6108            .build()
6109            .unwrap();
6110
6111        let struct_arr = sv.to_array().unwrap();
6112        let actual = as_struct_array(&struct_arr).unwrap();
6113        assert_eq!(actual, &expected);
6114    }
6115
6116    #[test]
6117    #[should_panic(
6118        expected = "InvalidArgumentError(\"Incorrect array length for StructArray field \\\"bool\\\", expected 1 got 4\")"
6119    )]
6120    fn test_scalar_value_from_for_struct_should_panic() {
6121        let _ = ScalarStructBuilder::new()
6122            .with_array(
6123                Field::new("bool", DataType::Boolean, false),
6124                Arc::new(BooleanArray::from(vec![false, true, false, false])),
6125            )
6126            .with_array(
6127                Field::new("i32", DataType::Int32, false),
6128                Arc::new(Int32Array::from(vec![42, 28, 19, 31])),
6129            )
6130            .build()
6131            .unwrap();
6132    }
6133
6134    #[test]
6135    fn test_to_array_of_size_for_nested() {
6136        // Struct
6137        let boolean = Arc::new(BooleanArray::from(vec![false, false, true, true]));
6138        let int = Arc::new(Int32Array::from(vec![42, 28, 19, 31]));
6139
6140        let struct_array = StructArray::from(vec![
6141            (
6142                Arc::new(Field::new("b", DataType::Boolean, false)),
6143                Arc::clone(&boolean) as ArrayRef,
6144            ),
6145            (
6146                Arc::new(Field::new("c", DataType::Int32, false)),
6147                Arc::clone(&int) as ArrayRef,
6148            ),
6149        ]);
6150        let sv = ScalarValue::Struct(Arc::new(struct_array));
6151        let actual_arr = sv.to_array_of_size(2).unwrap();
6152
6153        let boolean = Arc::new(BooleanArray::from(vec![
6154            false, false, true, true, false, false, true, true,
6155        ]));
6156        let int = Arc::new(Int32Array::from(vec![42, 28, 19, 31, 42, 28, 19, 31]));
6157
6158        let struct_array = StructArray::from(vec![
6159            (
6160                Arc::new(Field::new("b", DataType::Boolean, false)),
6161                Arc::clone(&boolean) as ArrayRef,
6162            ),
6163            (
6164                Arc::new(Field::new("c", DataType::Int32, false)),
6165                Arc::clone(&int) as ArrayRef,
6166            ),
6167        ]);
6168
6169        let actual = as_struct_array(&actual_arr).unwrap();
6170        assert_eq!(actual, &struct_array);
6171
6172        // List
6173        let arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
6174            Some(1),
6175            None,
6176            Some(2),
6177        ])]);
6178
6179        let sv = ScalarValue::List(Arc::new(arr));
6180        let actual_arr = sv
6181            .to_array_of_size(2)
6182            .expect("Failed to convert to array of size");
6183        let actual_list_arr = actual_arr.as_list::<i32>();
6184
6185        let arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
6186            Some(vec![Some(1), None, Some(2)]),
6187            Some(vec![Some(1), None, Some(2)]),
6188        ]);
6189
6190        assert_eq!(&arr, actual_list_arr);
6191
6192        // ListView
6193        let arr =
6194            ListViewArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
6195                Some(1),
6196                None,
6197                Some(2),
6198            ])]);
6199
6200        let sv = ScalarValue::ListView(Arc::new(arr));
6201        let actual_arr = sv
6202            .to_array_of_size(2)
6203            .expect("Failed to convert to array of size");
6204        let actual_list_arr = actual_arr.as_list_view::<i32>();
6205
6206        let arr = ListViewArray::from_iter_primitive::<Int32Type, _, _>(vec![
6207            Some(vec![Some(1), None, Some(2)]),
6208            Some(vec![Some(1), None, Some(2)]),
6209        ]);
6210
6211        assert_eq!(&arr, actual_list_arr);
6212    }
6213
6214    #[test]
6215    fn test_to_array_of_size_for_fsl() {
6216        let values = Int32Array::from_iter([Some(1), None, Some(2)]);
6217        let field = Arc::new(Field::new_list_field(DataType::Int32, true));
6218        let arr = FixedSizeListArray::new(Arc::clone(&field), 3, Arc::new(values), None);
6219        let sv = ScalarValue::FixedSizeList(Arc::new(arr));
6220        let actual_arr = sv
6221            .to_array_of_size(2)
6222            .expect("Failed to convert to array of size");
6223
6224        let expected_values =
6225            Int32Array::from_iter([Some(1), None, Some(2), Some(1), None, Some(2)]);
6226        let expected_arr =
6227            FixedSizeListArray::new(field, 3, Arc::new(expected_values), None);
6228
6229        assert_eq!(
6230            &expected_arr,
6231            as_fixed_size_list_array(actual_arr.as_ref()).unwrap()
6232        );
6233
6234        let empty_array = sv
6235            .to_array_of_size(0)
6236            .expect("Failed to convert to empty array");
6237
6238        assert_eq!(empty_array.len(), 0);
6239    }
6240
6241    #[test]
6242    fn test_to_array_of_size_list_size_one() {
6243        // size=1 takes the fast path (Arc::clone)
6244        let arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
6245            Some(10),
6246            Some(20),
6247        ])]);
6248        let sv = ScalarValue::List(Arc::new(arr.clone()));
6249        let result = sv.to_array_of_size(1).unwrap();
6250        assert_eq!(result.as_list::<i32>(), &arr);
6251    }
6252
6253    #[test]
6254    fn test_to_array_of_size_list_empty_inner() {
6255        // A list scalar containing an empty list: [[]]
6256        let arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![])]);
6257        let sv = ScalarValue::List(Arc::new(arr));
6258        let result = sv.to_array_of_size(3).unwrap();
6259        let result_list = result.as_list::<i32>();
6260        assert_eq!(result_list.len(), 3);
6261        for i in 0..3 {
6262            assert_eq!(result_list.value(i).len(), 0);
6263        }
6264    }
6265
6266    #[test]
6267    fn test_to_array_of_size_large_list() {
6268        let arr =
6269            LargeListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
6270                Some(100),
6271                Some(200),
6272            ])]);
6273        let sv = ScalarValue::LargeList(Arc::new(arr));
6274        let result = sv.to_array_of_size(3).unwrap();
6275        let expected = LargeListArray::from_iter_primitive::<Int32Type, _, _>(vec![
6276            Some(vec![Some(100), Some(200)]),
6277            Some(vec![Some(100), Some(200)]),
6278            Some(vec![Some(100), Some(200)]),
6279        ]);
6280        assert_eq!(result.as_list::<i64>(), &expected);
6281    }
6282
6283    #[test]
6284    fn test_list_to_array_of_size_multi_row() {
6285        // Call list_to_array_of_size directly with arr.len() > 1
6286        let arr = Int32Array::from(vec![Some(10), None, Some(30)]);
6287        let result = ScalarValue::list_to_array_of_size(&arr, 3).unwrap();
6288        let result = result.as_primitive::<Int32Type>();
6289        assert_eq!(
6290            result.iter().collect::<Vec<_>>(),
6291            vec![
6292                Some(10),
6293                None,
6294                Some(30),
6295                Some(10),
6296                None,
6297                Some(30),
6298                Some(10),
6299                None,
6300                Some(30),
6301            ]
6302        );
6303    }
6304
6305    #[test]
6306    fn test_to_array_of_size_null_list() {
6307        let dt = DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true)));
6308        let sv = ScalarValue::try_from(&dt).unwrap();
6309        let result = sv.to_array_of_size(3).unwrap();
6310        assert_eq!(result.len(), 3);
6311        assert_eq!(result.null_count(), 3);
6312    }
6313
6314    /// See https://github.com/apache/datafusion/issues/18870
6315    #[test]
6316    fn test_to_array_of_size_for_none_fsb() {
6317        let sv = ScalarValue::FixedSizeBinary(5, None);
6318        let result = sv
6319            .to_array_of_size(2)
6320            .expect("Failed to convert to array of size");
6321        assert_eq!(result.len(), 2);
6322        assert_eq!(result.null_count(), 2);
6323        assert_eq!(result.as_fixed_size_binary().values().len(), 10);
6324    }
6325
6326    #[test]
6327    fn test_list_to_array_string() {
6328        let scalars = vec![
6329            ScalarValue::from("rust"),
6330            ScalarValue::from("arrow"),
6331            ScalarValue::from("data-fusion"),
6332        ];
6333
6334        let result = ScalarValue::new_list_nullable(scalars.as_slice(), &DataType::Utf8);
6335
6336        let expected = single_row_list_array(vec!["rust", "arrow", "data-fusion"]);
6337        assert_eq!(*result, expected);
6338    }
6339
6340    fn single_row_list_array(items: Vec<&str>) -> ListArray {
6341        SingleRowListArrayBuilder::new(Arc::new(StringArray::from(items)))
6342            .build_list_array()
6343    }
6344
6345    fn build_list<O: OffsetSizeTrait>(
6346        values: Vec<Option<Vec<Option<i64>>>>,
6347    ) -> Vec<ScalarValue> {
6348        values
6349            .into_iter()
6350            .map(|v| {
6351                let arr = Arc::new(GenericListArray::<O>::from_iter_primitive::<
6352                    Int64Type,
6353                    _,
6354                    _,
6355                >(vec![v])) as ArrayRef;
6356
6357                if O::IS_LARGE {
6358                    ScalarValue::LargeList(arr.as_list::<i64>().to_owned().into())
6359                } else {
6360                    ScalarValue::List(arr.as_list::<i32>().to_owned().into())
6361                }
6362            })
6363            .collect()
6364    }
6365
6366    fn build_list_view<O: OffsetSizeTrait>(
6367        values: Vec<Option<Vec<Option<i64>>>>,
6368    ) -> Vec<ScalarValue> {
6369        values
6370            .into_iter()
6371            .map(|v| {
6372                let arr = Arc::new(GenericListViewArray::<O>::from_iter_primitive::<
6373                    Int64Type,
6374                    _,
6375                    _,
6376                >(vec![v])) as ArrayRef;
6377
6378                if O::IS_LARGE {
6379                    ScalarValue::LargeListView(
6380                        arr.as_list_view::<i64>().to_owned().into(),
6381                    )
6382                } else {
6383                    ScalarValue::ListView(arr.as_list_view::<i32>().to_owned().into())
6384                }
6385            })
6386            .collect()
6387    }
6388
6389    #[test]
6390    fn test_iter_to_array_fixed_size_list() {
6391        let field = Arc::new(Field::new_list_field(DataType::Int32, true));
6392        let f1 = Arc::new(FixedSizeListArray::new(
6393            Arc::clone(&field),
6394            3,
6395            Arc::new(Int32Array::from(vec![1, 2, 3])),
6396            None,
6397        ));
6398        let f2 = Arc::new(FixedSizeListArray::new(
6399            Arc::clone(&field),
6400            3,
6401            Arc::new(Int32Array::from(vec![4, 5, 6])),
6402            None,
6403        ));
6404        let f_nulls = Arc::new(FixedSizeListArray::new_null(field, 1, 1));
6405
6406        let scalars = vec![
6407            ScalarValue::FixedSizeList(Arc::clone(&f_nulls)),
6408            ScalarValue::FixedSizeList(f1),
6409            ScalarValue::FixedSizeList(f2),
6410            ScalarValue::FixedSizeList(f_nulls),
6411        ];
6412
6413        let array = ScalarValue::iter_to_array(scalars).unwrap();
6414
6415        let expected = FixedSizeListArray::from_iter_primitive::<Int32Type, _, _>(
6416            vec![
6417                None,
6418                Some(vec![Some(1), Some(2), Some(3)]),
6419                Some(vec![Some(4), Some(5), Some(6)]),
6420                None,
6421            ],
6422            3,
6423        );
6424        assert_eq!(array.as_ref(), &expected);
6425    }
6426
6427    #[test]
6428    fn test_iter_to_array_struct() {
6429        let s1 = StructArray::from(vec![
6430            (
6431                Arc::new(Field::new("A", DataType::Boolean, false)),
6432                Arc::new(BooleanArray::from(vec![false])) as ArrayRef,
6433            ),
6434            (
6435                Arc::new(Field::new("B", DataType::Int32, false)),
6436                Arc::new(Int32Array::from(vec![42])) as ArrayRef,
6437            ),
6438        ]);
6439
6440        let s2 = StructArray::from(vec![
6441            (
6442                Arc::new(Field::new("A", DataType::Boolean, false)),
6443                Arc::new(BooleanArray::from(vec![false])) as ArrayRef,
6444            ),
6445            (
6446                Arc::new(Field::new("B", DataType::Int32, false)),
6447                Arc::new(Int32Array::from(vec![42])) as ArrayRef,
6448            ),
6449        ]);
6450
6451        let scalars = vec![
6452            ScalarValue::Struct(Arc::new(s1)),
6453            ScalarValue::Struct(Arc::new(s2)),
6454        ];
6455
6456        let array = ScalarValue::iter_to_array(scalars).unwrap();
6457
6458        let expected = StructArray::from(vec![
6459            (
6460                Arc::new(Field::new("A", DataType::Boolean, false)),
6461                Arc::new(BooleanArray::from(vec![false, false])) as ArrayRef,
6462            ),
6463            (
6464                Arc::new(Field::new("B", DataType::Int32, false)),
6465                Arc::new(Int32Array::from(vec![42, 42])) as ArrayRef,
6466            ),
6467        ]);
6468        assert_eq!(array.as_ref(), &expected);
6469    }
6470
6471    #[test]
6472    fn test_iter_to_array_struct_with_nulls() {
6473        // non-null
6474        let s1 = StructArray::from((
6475            vec![
6476                (
6477                    Arc::new(Field::new("A", DataType::Int32, false)),
6478                    Arc::new(Int32Array::from(vec![1])) as ArrayRef,
6479                ),
6480                (
6481                    Arc::new(Field::new("B", DataType::Int64, false)),
6482                    Arc::new(Int64Array::from(vec![2])) as ArrayRef,
6483                ),
6484            ],
6485            // Present the null mask, 1 is non-null, 0 is null
6486            Buffer::from(&[1]),
6487        ));
6488
6489        // null
6490        let s2 = StructArray::from((
6491            vec![
6492                (
6493                    Arc::new(Field::new("A", DataType::Int32, false)),
6494                    Arc::new(Int32Array::from(vec![3])) as ArrayRef,
6495                ),
6496                (
6497                    Arc::new(Field::new("B", DataType::Int64, false)),
6498                    Arc::new(Int64Array::from(vec![4])) as ArrayRef,
6499                ),
6500            ],
6501            Buffer::from(&[0]),
6502        ));
6503
6504        let scalars = vec![
6505            ScalarValue::Struct(Arc::new(s1)),
6506            ScalarValue::Struct(Arc::new(s2)),
6507        ];
6508
6509        let array = ScalarValue::iter_to_array(scalars).unwrap();
6510        let struct_array = array.as_struct();
6511        assert!(struct_array.is_valid(0));
6512        assert!(struct_array.is_null(1));
6513    }
6514
6515    #[test]
6516    fn iter_to_array_primitive_test() {
6517        // List
6518        // List[[1,2,3]], List[null], List[[4,5]]
6519        let scalars = build_list::<i32>(vec![
6520            Some(vec![Some(1), Some(2), Some(3)]),
6521            None,
6522            Some(vec![Some(4), Some(5)]),
6523        ]);
6524        let array = ScalarValue::iter_to_array(scalars).unwrap();
6525        let list_array = as_list_array(&array).unwrap();
6526        // List[[1,2,3], null, [4,5]]
6527        let expected = ListArray::from_iter_primitive::<Int64Type, _, _>(vec![
6528            Some(vec![Some(1), Some(2), Some(3)]),
6529            None,
6530            Some(vec![Some(4), Some(5)]),
6531        ]);
6532        assert_eq!(list_array, &expected);
6533
6534        // LargeList
6535        // List[[1,2,3]], List[null], List[[4,5]]
6536        let scalars = build_list::<i64>(vec![
6537            Some(vec![Some(1), Some(2), Some(3)]),
6538            None,
6539            Some(vec![Some(4), Some(5)]),
6540        ]);
6541        let array = ScalarValue::iter_to_array(scalars).unwrap();
6542        let large_list_array = as_large_list_array(&array).unwrap();
6543        let expected = LargeListArray::from_iter_primitive::<Int64Type, _, _>(vec![
6544            Some(vec![Some(1), Some(2), Some(3)]),
6545            None,
6546            Some(vec![Some(4), Some(5)]),
6547        ]);
6548        assert_eq!(large_list_array, &expected);
6549
6550        // ListView
6551        // ListView[[1,2,3]], ListView[null], ListView[[4,5]]
6552        let scalars = build_list_view::<i32>(vec![
6553            Some(vec![Some(1), Some(2), Some(3)]),
6554            None,
6555            Some(vec![Some(4), Some(5)]),
6556        ]);
6557
6558        let array = ScalarValue::iter_to_array(scalars).unwrap();
6559        let list_view_array = as_list_view_array(&array).unwrap();
6560        // ListView[[1,2,3], null, [4,5]]
6561        let expected = ListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![
6562            Some(vec![Some(1), Some(2), Some(3)]),
6563            None,
6564            Some(vec![Some(4), Some(5)]),
6565        ]);
6566        assert_eq!(list_view_array, &expected);
6567
6568        // LargeListView
6569        // LargeListView[[1,2,3]], LargeListView[null], LargeListView[[4,5]]
6570        let scalars = build_list_view::<i64>(vec![
6571            Some(vec![Some(1), Some(2), Some(3)]),
6572            None,
6573            Some(vec![Some(4), Some(5)]),
6574        ]);
6575
6576        let array = ScalarValue::iter_to_array(scalars).unwrap();
6577        let large_list_view_array = as_large_list_view_array(&array).unwrap();
6578        // LargeListView[[1,2,3], null, [4,5]]
6579        let expected = LargeListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![
6580            Some(vec![Some(1), Some(2), Some(3)]),
6581            None,
6582            Some(vec![Some(4), Some(5)]),
6583        ]);
6584        assert_eq!(large_list_view_array, &expected);
6585    }
6586
6587    #[test]
6588    fn iter_to_array_string_test() {
6589        let arr1 = single_row_list_array(vec!["foo", "bar", "baz"]);
6590        let arr2 = single_row_list_array(vec!["rust", "world"]);
6591
6592        let scalars = vec![
6593            ScalarValue::List(Arc::new(arr1)),
6594            ScalarValue::List(Arc::new(arr2)),
6595        ];
6596
6597        let array = ScalarValue::iter_to_array(scalars).unwrap();
6598        let result = array.as_list::<i32>();
6599
6600        // build expected array
6601        let string_builder = StringBuilder::with_capacity(5, 25);
6602        let mut list_of_string_builder = ListBuilder::new(string_builder);
6603
6604        list_of_string_builder.values().append_value("foo");
6605        list_of_string_builder.values().append_value("bar");
6606        list_of_string_builder.values().append_value("baz");
6607        list_of_string_builder.append(true);
6608
6609        list_of_string_builder.values().append_value("rust");
6610        list_of_string_builder.values().append_value("world");
6611        list_of_string_builder.append(true);
6612        let expected = list_of_string_builder.finish();
6613
6614        assert_eq!(result, &expected);
6615    }
6616
6617    #[test]
6618    fn test_list_scalar_eq_to_array() {
6619        let list_array: ArrayRef =
6620            Arc::new(ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
6621                Some(vec![Some(0), Some(1), Some(2)]),
6622                None,
6623                Some(vec![None, Some(5)]),
6624            ]));
6625
6626        let fsl_array: ArrayRef =
6627            Arc::new(FixedSizeListArray::from_iter_primitive::<Int32Type, _, _>(
6628                vec![
6629                    Some(vec![Some(0), Some(1), Some(2)]),
6630                    None,
6631                    Some(vec![Some(3), None, Some(5)]),
6632                ],
6633                3,
6634            ));
6635        let list_view_array: ArrayRef =
6636            Arc::new(ListViewArray::from_iter_primitive::<Int32Type, _, _>(vec![
6637                Some(vec![Some(0), Some(1), Some(2)]),
6638                None,
6639                Some(vec![None, Some(5)]),
6640            ]));
6641
6642        for arr in [list_array, fsl_array, list_view_array] {
6643            for i in 0..arr.len() {
6644                let slice = arr.slice(i, 1);
6645                let scalar = match arr.data_type() {
6646                    DataType::List(_) => {
6647                        ScalarValue::List(slice.as_list::<i32>().to_owned().into())
6648                    }
6649                    DataType::FixedSizeList(_, _) => ScalarValue::FixedSizeList(
6650                        slice.as_fixed_size_list().to_owned().into(),
6651                    ),
6652                    DataType::ListView(_) => ScalarValue::ListView(
6653                        slice.as_list_view::<i32>().to_owned().into(),
6654                    ),
6655                    _ => unreachable!(),
6656                };
6657                assert!(scalar.eq_array(&arr, i).unwrap());
6658            }
6659        }
6660    }
6661
6662    #[test]
6663    fn test_eq_array_err_message() {
6664        assert_starts_with(
6665            ScalarValue::Utf8(Some("123".to_string()))
6666                .eq_array(&(Arc::new(Int32Array::from(vec![123])) as ArrayRef), 0)
6667                .unwrap_err()
6668                .message(),
6669            "could not cast array of type Int32 to arrow_array::array::byte_array::GenericByteArray<arrow_array::types::GenericStringType<i32>>",
6670        );
6671    }
6672
6673    #[test]
6674    fn scalar_add_trait_test() -> Result<()> {
6675        let float_value = ScalarValue::Float64(Some(123.));
6676        let float_value_2 = ScalarValue::Float64(Some(123.));
6677        assert_eq!(
6678            (float_value.add(&float_value_2))?,
6679            ScalarValue::Float64(Some(246.))
6680        );
6681        assert_eq!(
6682            (float_value.add(float_value_2))?,
6683            ScalarValue::Float64(Some(246.))
6684        );
6685        Ok(())
6686    }
6687
6688    #[test]
6689    fn scalar_add_trait_null_test() -> Result<()> {
6690        let int_value = ScalarValue::Int32(Some(42));
6691
6692        assert_eq!(
6693            int_value.add(ScalarValue::Int32(None))?,
6694            ScalarValue::Int32(None)
6695        );
6696
6697        Ok(())
6698    }
6699
6700    #[test]
6701    fn scalar_add_trait_wrapping_overflow_test() -> Result<()> {
6702        let int_value = ScalarValue::Int32(Some(i32::MAX));
6703        let one = ScalarValue::Int32(Some(1));
6704
6705        assert_eq!(int_value.add(one)?, ScalarValue::Int32(Some(i32::MIN)));
6706
6707        Ok(())
6708    }
6709
6710    #[test]
6711    fn scalar_add_trait_decimal_scale_test() -> Result<()> {
6712        let decimal = ScalarValue::Decimal128(Some(123), 10, 2);
6713        let decimal_2 = ScalarValue::Decimal128(Some(4), 9, 1);
6714
6715        assert_eq!(
6716            decimal.add(decimal_2)?,
6717            ScalarValue::Decimal128(Some(163), 11, 2)
6718        );
6719
6720        Ok(())
6721    }
6722
6723    #[test]
6724    fn scalar_add_trait_decimal256_scale_test() -> Result<()> {
6725        let decimal = ScalarValue::Decimal256(Some(i256::from(123)), 10, 2);
6726        let decimal_2 = ScalarValue::Decimal256(Some(i256::from(4)), 9, 1);
6727
6728        assert_eq!(
6729            decimal.add(decimal_2)?,
6730            ScalarValue::Decimal256(Some(i256::from(163)), 11, 2)
6731        );
6732
6733        Ok(())
6734    }
6735
6736    #[test]
6737    fn scalar_add_trait_decimal_negative_scale_test() -> Result<()> {
6738        let decimal = ScalarValue::Decimal128(Some(1), DECIMAL128_MAX_PRECISION, i8::MIN);
6739        let decimal_2 =
6740            ScalarValue::Decimal128(Some(1), DECIMAL128_MAX_PRECISION, i8::MIN);
6741
6742        assert_eq!(
6743            decimal.add(decimal_2)?,
6744            ScalarValue::Decimal128(Some(2), DECIMAL128_MAX_PRECISION, i8::MIN)
6745        );
6746
6747        Ok(())
6748    }
6749
6750    #[test]
6751    fn scalar_sub_trait_test() -> Result<()> {
6752        let float_value = ScalarValue::Float64(Some(123.));
6753        let float_value_2 = ScalarValue::Float64(Some(123.));
6754        assert_eq!(
6755            float_value.sub(&float_value_2)?,
6756            ScalarValue::Float64(Some(0.))
6757        );
6758        assert_eq!(
6759            float_value.sub(float_value_2)?,
6760            ScalarValue::Float64(Some(0.))
6761        );
6762        Ok(())
6763    }
6764
6765    #[test]
6766    fn scalar_sub_trait_int32_test() -> Result<()> {
6767        let int_value = ScalarValue::Int32(Some(42));
6768        let int_value_2 = ScalarValue::Int32(Some(100));
6769        assert_eq!(int_value.sub(&int_value_2)?, ScalarValue::Int32(Some(-58)));
6770        assert_eq!(int_value_2.sub(int_value)?, ScalarValue::Int32(Some(58)));
6771        Ok(())
6772    }
6773
6774    #[test]
6775    fn scalar_sub_trait_int32_overflow_test() {
6776        let int_value = ScalarValue::Int32(Some(i32::MAX));
6777        let int_value_2 = ScalarValue::Int32(Some(i32::MIN));
6778        let err = int_value
6779            .sub_checked(&int_value_2)
6780            .unwrap_err()
6781            .strip_backtrace();
6782        assert_eq!(
6783            err,
6784            "Arrow error: Arithmetic overflow: Overflow happened on: 2147483647 - -2147483648"
6785        )
6786    }
6787
6788    #[test]
6789    fn scalar_sub_trait_int64_test() -> Result<()> {
6790        let int_value = ScalarValue::Int64(Some(42));
6791        let int_value_2 = ScalarValue::Int64(Some(100));
6792        assert_eq!(int_value.sub(&int_value_2)?, ScalarValue::Int64(Some(-58)));
6793        assert_eq!(int_value_2.sub(int_value)?, ScalarValue::Int64(Some(58)));
6794        Ok(())
6795    }
6796
6797    #[test]
6798    fn scalar_sub_trait_int64_overflow_test() {
6799        let int_value = ScalarValue::Int64(Some(i64::MAX));
6800        let int_value_2 = ScalarValue::Int64(Some(i64::MIN));
6801        let err = int_value
6802            .sub_checked(&int_value_2)
6803            .unwrap_err()
6804            .strip_backtrace();
6805        assert_eq!(
6806            err,
6807            "Arrow error: Arithmetic overflow: Overflow happened on: 9223372036854775807 - -9223372036854775808"
6808        )
6809    }
6810
6811    #[test]
6812    fn scalar_add_overflow_test() -> Result<()> {
6813        check_scalar_add_overflow::<Int8Type>(
6814            ScalarValue::Int8(Some(i8::MAX)),
6815            ScalarValue::Int8(Some(i8::MAX)),
6816        );
6817        check_scalar_add_overflow::<UInt8Type>(
6818            ScalarValue::UInt8(Some(u8::MAX)),
6819            ScalarValue::UInt8(Some(u8::MAX)),
6820        );
6821        check_scalar_add_overflow::<Int16Type>(
6822            ScalarValue::Int16(Some(i16::MAX)),
6823            ScalarValue::Int16(Some(i16::MAX)),
6824        );
6825        check_scalar_add_overflow::<UInt16Type>(
6826            ScalarValue::UInt16(Some(u16::MAX)),
6827            ScalarValue::UInt16(Some(u16::MAX)),
6828        );
6829        check_scalar_add_overflow::<Int32Type>(
6830            ScalarValue::Int32(Some(i32::MAX)),
6831            ScalarValue::Int32(Some(i32::MAX)),
6832        );
6833        check_scalar_add_overflow::<UInt32Type>(
6834            ScalarValue::UInt32(Some(u32::MAX)),
6835            ScalarValue::UInt32(Some(u32::MAX)),
6836        );
6837        check_scalar_add_overflow::<Int64Type>(
6838            ScalarValue::Int64(Some(i64::MAX)),
6839            ScalarValue::Int64(Some(i64::MAX)),
6840        );
6841        check_scalar_add_overflow::<UInt64Type>(
6842            ScalarValue::UInt64(Some(u64::MAX)),
6843            ScalarValue::UInt64(Some(u64::MAX)),
6844        );
6845
6846        Ok(())
6847    }
6848
6849    #[test]
6850    fn scalar_decimal_add_overflow_test() {
6851        check_scalar_decimal_add_overflow::<Decimal128Type>(
6852            ScalarValue::Decimal128(Some(i128::MAX), DECIMAL128_MAX_PRECISION, 0),
6853            ScalarValue::Decimal128(Some(1), DECIMAL128_MAX_PRECISION, 0),
6854        );
6855        check_scalar_decimal_add_overflow::<Decimal256Type>(
6856            ScalarValue::Decimal256(Some(i256::MAX), DECIMAL256_MAX_PRECISION, 0),
6857            ScalarValue::Decimal256(Some(i256::ONE), DECIMAL256_MAX_PRECISION, 0),
6858        );
6859    }
6860
6861    #[test]
6862    fn scalar_decimal_in_place_add_error_preserves_lhs() {
6863        let mut lhs =
6864            ScalarValue::Decimal128(Some(i128::MAX), DECIMAL128_MAX_PRECISION, 0);
6865        let original = lhs.clone();
6866
6867        let err = lhs
6868            .try_add_checked_in_place(&ScalarValue::Decimal128(
6869                Some(1),
6870                DECIMAL128_MAX_PRECISION,
6871                0,
6872            ))
6873            .unwrap_err()
6874            .strip_backtrace();
6875
6876        assert_eq!(
6877            err,
6878            format!(
6879                "Arrow error: Arithmetic overflow: Overflow happened on: {} + 1",
6880                i128::MAX
6881            )
6882        );
6883        assert_eq!(lhs, original);
6884    }
6885
6886    // Verifies that ScalarValue has the same behavior with compute kernel when it overflows.
6887    fn check_scalar_add_overflow<T>(left: ScalarValue, right: ScalarValue)
6888    where
6889        T: ArrowNumericType,
6890    {
6891        let scalar_result = left.add_checked(&right);
6892
6893        let left_array = left.to_array().expect("Failed to convert to array");
6894        let right_array = right.to_array().expect("Failed to convert to array");
6895        let arrow_left_array = left_array.as_primitive::<T>();
6896        let arrow_right_array = right_array.as_primitive::<T>();
6897        let arrow_result = add(arrow_left_array, arrow_right_array);
6898
6899        assert_eq!(scalar_result.is_ok(), arrow_result.is_ok());
6900    }
6901
6902    // Verifies the decimal fast path preserves the same overflow behavior as Arrow kernels.
6903    fn check_scalar_decimal_add_overflow<T>(left: ScalarValue, right: ScalarValue)
6904    where
6905        T: ArrowPrimitiveType,
6906    {
6907        let scalar_result = left.add(&right);
6908
6909        let left_array = left.to_array().expect("Failed to convert to array");
6910        let right_array = right.to_array().expect("Failed to convert to array");
6911        let arrow_left_array = left_array.as_primitive::<T>();
6912        let arrow_right_array = right_array.as_primitive::<T>();
6913        let arrow_result = add_wrapping(arrow_left_array, arrow_right_array);
6914
6915        assert_eq!(scalar_result.is_ok(), arrow_result.is_ok());
6916    }
6917
6918    #[test]
6919    fn test_interval_add_timestamp() -> Result<()> {
6920        let interval = ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano {
6921            months: 1,
6922            days: 2,
6923            nanoseconds: 3,
6924        }));
6925        let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
6926        let result = interval.add(&timestamp)?;
6927        let expect = timestamp.add(&interval)?;
6928        assert_eq!(result, expect);
6929
6930        let interval = ScalarValue::IntervalYearMonth(Some(123));
6931        let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
6932        let result = interval.add(&timestamp)?;
6933        let expect = timestamp.add(&interval)?;
6934        assert_eq!(result, expect);
6935
6936        let interval = ScalarValue::IntervalDayTime(Some(IntervalDayTime {
6937            days: 1,
6938            milliseconds: 23,
6939        }));
6940        let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
6941        let result = interval.add(&timestamp)?;
6942        let expect = timestamp.add(&interval)?;
6943        assert_eq!(result, expect);
6944        Ok(())
6945    }
6946
6947    #[test]
6948    fn test_try_cmp() {
6949        assert_eq!(
6950            ScalarValue::try_cmp(
6951                &ScalarValue::Int32(Some(1)),
6952                &ScalarValue::Int32(Some(2))
6953            )
6954            .unwrap(),
6955            Ordering::Less
6956        );
6957        assert_eq!(
6958            ScalarValue::try_cmp(&ScalarValue::Int32(None), &ScalarValue::Int32(Some(2)))
6959                .unwrap(),
6960            Ordering::Less
6961        );
6962        assert_starts_with(
6963            ScalarValue::try_cmp(
6964                &ScalarValue::Int32(Some(1)),
6965                &ScalarValue::Int64(Some(2)),
6966            )
6967            .unwrap_err()
6968            .message(),
6969            "Uncomparable values: Int32(1), Int64(2)",
6970        );
6971    }
6972
6973    #[test]
6974    fn scalar_decimal_test() -> Result<()> {
6975        let decimal_value = ScalarValue::Decimal128(Some(123), 10, 1);
6976        assert_eq!(DataType::Decimal128(10, 1), decimal_value.data_type());
6977        let try_into_value: i128 = decimal_value.clone().try_into().unwrap();
6978        assert_eq!(123_i128, try_into_value);
6979        assert!(!decimal_value.is_null());
6980        let neg_decimal_value = decimal_value.arithmetic_negate()?;
6981        match neg_decimal_value {
6982            ScalarValue::Decimal128(v, _, _) => {
6983                assert_eq!(-123, v.unwrap());
6984            }
6985            _ => {
6986                unreachable!();
6987            }
6988        }
6989
6990        // decimal scalar to array
6991        let array = decimal_value
6992            .to_array()
6993            .expect("Failed to convert to array");
6994        let array = as_decimal128_array(&array)?;
6995        assert_eq!(1, array.len());
6996        assert_eq!(DataType::Decimal128(10, 1), array.data_type().clone());
6997        assert_eq!(123i128, array.value(0));
6998
6999        // decimal scalar to array with size
7000        let array = decimal_value
7001            .to_array_of_size(10)
7002            .expect("Failed to convert to array of size");
7003        let array_decimal = as_decimal128_array(&array)?;
7004        assert_eq!(10, array.len());
7005        assert_eq!(DataType::Decimal128(10, 1), array.data_type().clone());
7006        assert_eq!(123i128, array_decimal.value(0));
7007        assert_eq!(123i128, array_decimal.value(9));
7008        // test eq array
7009        assert!(
7010            decimal_value
7011                .eq_array(&array, 1)
7012                .expect("Failed to compare arrays")
7013        );
7014        assert!(
7015            decimal_value
7016                .eq_array(&array, 5)
7017                .expect("Failed to compare arrays")
7018        );
7019        // test try from array
7020        assert_eq!(
7021            decimal_value,
7022            ScalarValue::try_from_array(&array, 5).unwrap()
7023        );
7024
7025        assert_eq!(
7026            decimal_value,
7027            ScalarValue::try_new_decimal128(123, 10, 1).unwrap()
7028        );
7029
7030        // test compare
7031        let left = ScalarValue::Decimal128(Some(123), 10, 2);
7032        let right = ScalarValue::Decimal128(Some(124), 10, 2);
7033        assert!(!left.eq(&right));
7034        let result = left < right;
7035        assert!(result);
7036        let result = left <= right;
7037        assert!(result);
7038        let right = ScalarValue::Decimal128(Some(124), 10, 3);
7039        // make sure that two decimals with diff datatype can't be compared.
7040        let result = left.partial_cmp(&right);
7041        assert_eq!(None, result);
7042
7043        let decimal_vec = vec![
7044            ScalarValue::Decimal128(Some(1), 10, 2),
7045            ScalarValue::Decimal128(Some(2), 10, 2),
7046            ScalarValue::Decimal128(Some(3), 10, 2),
7047        ];
7048        // convert the vec to decimal array and check the result
7049        let array = ScalarValue::iter_to_array(decimal_vec).unwrap();
7050        assert_eq!(3, array.len());
7051        assert_eq!(DataType::Decimal128(10, 2), array.data_type().clone());
7052
7053        let decimal_vec = vec![
7054            ScalarValue::Decimal128(Some(1), 10, 2),
7055            ScalarValue::Decimal128(Some(2), 10, 2),
7056            ScalarValue::Decimal128(Some(3), 10, 2),
7057            ScalarValue::Decimal128(None, 10, 2),
7058        ];
7059        let array = ScalarValue::iter_to_array(decimal_vec).unwrap();
7060        assert_eq!(4, array.len());
7061        assert_eq!(DataType::Decimal128(10, 2), array.data_type().clone());
7062
7063        assert!(
7064            ScalarValue::try_new_decimal128(1, 10, 2)
7065                .unwrap()
7066                .eq_array(&array, 0)
7067                .expect("Failed to compare arrays")
7068        );
7069        assert!(
7070            ScalarValue::try_new_decimal128(2, 10, 2)
7071                .unwrap()
7072                .eq_array(&array, 1)
7073                .expect("Failed to compare arrays")
7074        );
7075        assert!(
7076            ScalarValue::try_new_decimal128(3, 10, 2)
7077                .unwrap()
7078                .eq_array(&array, 2)
7079                .expect("Failed to compare arrays")
7080        );
7081        assert_eq!(
7082            ScalarValue::Decimal128(None, 10, 2),
7083            ScalarValue::try_from_array(&array, 3).unwrap()
7084        );
7085
7086        Ok(())
7087    }
7088
7089    #[test]
7090    fn test_new_one_decimal128() {
7091        assert_eq!(
7092            ScalarValue::new_one(&DataType::Decimal128(5, 0)).unwrap(),
7093            ScalarValue::Decimal128(Some(1), 5, 0)
7094        );
7095        assert_eq!(
7096            ScalarValue::new_one(&DataType::Decimal128(5, 1)).unwrap(),
7097            ScalarValue::Decimal128(Some(10), 5, 1)
7098        );
7099        assert_eq!(
7100            ScalarValue::new_one(&DataType::Decimal128(5, 2)).unwrap(),
7101            ScalarValue::Decimal128(Some(100), 5, 2)
7102        );
7103        // More precision
7104        assert_eq!(
7105            ScalarValue::new_one(&DataType::Decimal128(7, 2)).unwrap(),
7106            ScalarValue::Decimal128(Some(100), 7, 2)
7107        );
7108        // No negative scale
7109        assert!(ScalarValue::new_one(&DataType::Decimal128(5, -1)).is_err());
7110        // Invalid combination
7111        assert!(ScalarValue::new_one(&DataType::Decimal128(0, 2)).is_err());
7112        assert!(ScalarValue::new_one(&DataType::Decimal128(5, 7)).is_err());
7113    }
7114
7115    #[test]
7116    fn test_new_one_decimal256() {
7117        assert_eq!(
7118            ScalarValue::new_one(&DataType::Decimal256(5, 0)).unwrap(),
7119            ScalarValue::Decimal256(Some(1.into()), 5, 0)
7120        );
7121        assert_eq!(
7122            ScalarValue::new_one(&DataType::Decimal256(5, 1)).unwrap(),
7123            ScalarValue::Decimal256(Some(10.into()), 5, 1)
7124        );
7125        assert_eq!(
7126            ScalarValue::new_one(&DataType::Decimal256(5, 2)).unwrap(),
7127            ScalarValue::Decimal256(Some(100.into()), 5, 2)
7128        );
7129        // More precision
7130        assert_eq!(
7131            ScalarValue::new_one(&DataType::Decimal256(7, 2)).unwrap(),
7132            ScalarValue::Decimal256(Some(100.into()), 7, 2)
7133        );
7134        // No negative scale
7135        assert!(ScalarValue::new_one(&DataType::Decimal256(5, -1)).is_err());
7136        // Invalid combination
7137        assert!(ScalarValue::new_one(&DataType::Decimal256(0, 2)).is_err());
7138        assert!(ScalarValue::new_one(&DataType::Decimal256(5, 7)).is_err());
7139    }
7140
7141    #[test]
7142    fn test_new_ten_decimal128() {
7143        assert_eq!(
7144            ScalarValue::new_ten(&DataType::Decimal128(5, 1)).unwrap(),
7145            ScalarValue::Decimal128(Some(100), 5, 1)
7146        );
7147        assert_eq!(
7148            ScalarValue::new_ten(&DataType::Decimal128(5, 2)).unwrap(),
7149            ScalarValue::Decimal128(Some(1000), 5, 2)
7150        );
7151        // More precision
7152        assert_eq!(
7153            ScalarValue::new_ten(&DataType::Decimal128(7, 2)).unwrap(),
7154            ScalarValue::Decimal128(Some(1000), 7, 2)
7155        );
7156        // No negative scale
7157        assert!(ScalarValue::new_ten(&DataType::Decimal128(5, -1)).is_err());
7158        // Invalid combination
7159        assert!(ScalarValue::new_ten(&DataType::Decimal128(0, 2)).is_err());
7160        assert!(ScalarValue::new_ten(&DataType::Decimal128(5, 7)).is_err());
7161    }
7162
7163    #[test]
7164    fn test_new_ten_decimal256() {
7165        assert_eq!(
7166            ScalarValue::new_ten(&DataType::Decimal256(5, 1)).unwrap(),
7167            ScalarValue::Decimal256(Some(100.into()), 5, 1)
7168        );
7169        assert_eq!(
7170            ScalarValue::new_ten(&DataType::Decimal256(5, 2)).unwrap(),
7171            ScalarValue::Decimal256(Some(1000.into()), 5, 2)
7172        );
7173        // More precision
7174        assert_eq!(
7175            ScalarValue::new_ten(&DataType::Decimal256(7, 2)).unwrap(),
7176            ScalarValue::Decimal256(Some(1000.into()), 7, 2)
7177        );
7178        // No negative scale
7179        assert!(ScalarValue::new_ten(&DataType::Decimal256(5, -1)).is_err());
7180        // Invalid combination
7181        assert!(ScalarValue::new_ten(&DataType::Decimal256(0, 2)).is_err());
7182        assert!(ScalarValue::new_ten(&DataType::Decimal256(5, 7)).is_err());
7183    }
7184
7185    #[test]
7186    fn test_new_negative_one_decimal128() {
7187        assert_eq!(
7188            ScalarValue::new_negative_one(&DataType::Decimal128(5, 0)).unwrap(),
7189            ScalarValue::Decimal128(Some(-1), 5, 0)
7190        );
7191        assert_eq!(
7192            ScalarValue::new_negative_one(&DataType::Decimal128(5, 2)).unwrap(),
7193            ScalarValue::Decimal128(Some(-100), 5, 2)
7194        );
7195    }
7196
7197    #[test]
7198    fn test_list_partial_cmp() {
7199        let a =
7200            ScalarValue::List(Arc::new(
7201                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7202                    Some(1),
7203                    Some(2),
7204                    Some(3),
7205                ])]),
7206            ));
7207        let b =
7208            ScalarValue::List(Arc::new(
7209                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7210                    Some(1),
7211                    Some(2),
7212                    Some(3),
7213                ])]),
7214            ));
7215        assert_eq!(a.partial_cmp(&b), Some(Ordering::Equal));
7216
7217        let a =
7218            ScalarValue::List(Arc::new(
7219                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7220                    Some(10),
7221                    Some(2),
7222                    Some(3),
7223                ])]),
7224            ));
7225        let b =
7226            ScalarValue::List(Arc::new(
7227                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7228                    Some(1),
7229                    Some(2),
7230                    Some(30),
7231                ])]),
7232            ));
7233        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7234
7235        let a =
7236            ScalarValue::List(Arc::new(
7237                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7238                    Some(10),
7239                    Some(2),
7240                    Some(3),
7241                ])]),
7242            ));
7243        let b =
7244            ScalarValue::List(Arc::new(
7245                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7246                    Some(10),
7247                    Some(2),
7248                    Some(30),
7249                ])]),
7250            ));
7251        assert_eq!(a.partial_cmp(&b), Some(Ordering::Less));
7252
7253        let a =
7254            ScalarValue::List(Arc::new(
7255                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7256                    Some(1),
7257                    Some(2),
7258                    Some(3),
7259                ])]),
7260            ));
7261        let b =
7262            ScalarValue::List(Arc::new(
7263                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7264                    Some(2),
7265                    Some(3),
7266                ])]),
7267            ));
7268        assert_eq!(a.partial_cmp(&b), Some(Ordering::Less));
7269
7270        let a =
7271            ScalarValue::List(Arc::new(
7272                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7273                    Some(2),
7274                    Some(3),
7275                    Some(4),
7276                ])]),
7277            ));
7278        let b =
7279            ScalarValue::List(Arc::new(
7280                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7281                    Some(1),
7282                    Some(2),
7283                ])]),
7284            ));
7285        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7286
7287        let a =
7288            ScalarValue::List(Arc::new(
7289                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7290                    Some(1),
7291                    Some(2),
7292                    Some(3),
7293                ])]),
7294            ));
7295        let b =
7296            ScalarValue::List(Arc::new(
7297                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7298                    Some(1),
7299                    Some(2),
7300                ])]),
7301            ));
7302        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7303
7304        let a =
7305            ScalarValue::List(Arc::new(
7306                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7307                    None,
7308                    Some(2),
7309                    Some(3),
7310                ])]),
7311            ));
7312        let b =
7313            ScalarValue::List(Arc::new(
7314                ListArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
7315                    Some(1),
7316                    Some(2),
7317                    Some(3),
7318                ])]),
7319            ));
7320        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7321
7322        let a = ScalarValue::LargeList(Arc::new(LargeListArray::from_iter_primitive::<
7323            Int64Type,
7324            _,
7325            _,
7326        >(vec![Some(vec![
7327            None,
7328            Some(2),
7329            Some(3),
7330        ])])));
7331        let b = ScalarValue::LargeList(Arc::new(LargeListArray::from_iter_primitive::<
7332            Int64Type,
7333            _,
7334            _,
7335        >(vec![Some(vec![
7336            Some(1),
7337            Some(2),
7338            Some(3),
7339        ])])));
7340        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7341
7342        let a = ScalarValue::FixedSizeList(Arc::new(
7343            FixedSizeListArray::from_iter_primitive::<Int64Type, _, _>(
7344                vec![Some(vec![None, Some(2), Some(3)])],
7345                3,
7346            ),
7347        ));
7348        let b = ScalarValue::FixedSizeList(Arc::new(
7349            FixedSizeListArray::from_iter_primitive::<Int64Type, _, _>(
7350                vec![Some(vec![Some(1), Some(2), Some(3)])],
7351                3,
7352            ),
7353        ));
7354        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7355
7356        let a = ScalarValue::ListView(Arc::new(ListViewArray::from_iter_primitive::<
7357            Int64Type,
7358            _,
7359            _,
7360        >(vec![Some(vec![
7361            None,
7362            Some(2),
7363            Some(3),
7364        ])])));
7365        let b = ScalarValue::ListView(Arc::new(ListViewArray::from_iter_primitive::<
7366            Int64Type,
7367            _,
7368            _,
7369        >(vec![Some(vec![
7370            Some(1),
7371            Some(2),
7372            Some(3),
7373        ])])));
7374        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7375
7376        let a =
7377            ScalarValue::LargeListView(Arc::new(
7378                LargeListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(
7379                    vec![None, Some(2), Some(3)],
7380                )]),
7381            ));
7382        let b =
7383            ScalarValue::LargeListView(Arc::new(
7384                LargeListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(
7385                    vec![Some(1), Some(2), Some(3)],
7386                )]),
7387            ));
7388        assert_eq!(a.partial_cmp(&b), Some(Ordering::Greater));
7389    }
7390
7391    #[test]
7392    fn scalar_value_to_array_u64() -> Result<()> {
7393        let value = ScalarValue::UInt64(Some(13u64));
7394        let array = value.to_array().expect("Failed to convert to array");
7395        let array = as_uint64_array(&array)?;
7396        assert_eq!(array.len(), 1);
7397        assert!(!array.is_null(0));
7398        assert_eq!(array.value(0), 13);
7399
7400        let value = ScalarValue::UInt64(None);
7401        let array = value.to_array().expect("Failed to convert to array");
7402        let array = as_uint64_array(&array)?;
7403        assert_eq!(array.len(), 1);
7404        assert!(array.is_null(0));
7405        Ok(())
7406    }
7407
7408    #[test]
7409    fn scalar_value_to_array_u32() -> Result<()> {
7410        let value = ScalarValue::UInt32(Some(13u32));
7411        let array = value.to_array().expect("Failed to convert to array");
7412        let array = as_uint32_array(&array)?;
7413        assert_eq!(array.len(), 1);
7414        assert!(!array.is_null(0));
7415        assert_eq!(array.value(0), 13);
7416
7417        let value = ScalarValue::UInt32(None);
7418        let array = value.to_array().expect("Failed to convert to array");
7419        let array = as_uint32_array(&array)?;
7420        assert_eq!(array.len(), 1);
7421        assert!(array.is_null(0));
7422        Ok(())
7423    }
7424
7425    #[test]
7426    fn scalar_list_null_to_array() {
7427        let list_array = ScalarValue::new_list_nullable(&[], &DataType::UInt64);
7428
7429        assert_eq!(list_array.len(), 1);
7430        assert_eq!(list_array.values().len(), 0);
7431    }
7432
7433    #[test]
7434    fn scalar_large_list_null_to_array() {
7435        let list_array = ScalarValue::new_large_list(&[], &DataType::UInt64);
7436
7437        assert_eq!(list_array.len(), 1);
7438        assert_eq!(list_array.values().len(), 0);
7439    }
7440
7441    #[test]
7442    fn scalar_list_to_array() -> Result<()> {
7443        let values = vec![
7444            ScalarValue::UInt64(Some(100)),
7445            ScalarValue::UInt64(None),
7446            ScalarValue::UInt64(Some(101)),
7447        ];
7448        let list_array = ScalarValue::new_list_nullable(&values, &DataType::UInt64);
7449        assert_eq!(list_array.len(), 1);
7450        assert_eq!(list_array.values().len(), 3);
7451
7452        let prim_array_ref = list_array.value(0);
7453        let prim_array = as_uint64_array(&prim_array_ref)?;
7454        assert_eq!(prim_array.len(), 3);
7455        assert_eq!(prim_array.value(0), 100);
7456        assert!(prim_array.is_null(1));
7457        assert_eq!(prim_array.value(2), 101);
7458        Ok(())
7459    }
7460
7461    #[test]
7462    fn scalar_large_list_to_array() -> Result<()> {
7463        let values = vec![
7464            ScalarValue::UInt64(Some(100)),
7465            ScalarValue::UInt64(None),
7466            ScalarValue::UInt64(Some(101)),
7467        ];
7468        let list_array = ScalarValue::new_large_list(&values, &DataType::UInt64);
7469        assert_eq!(list_array.len(), 1);
7470        assert_eq!(list_array.values().len(), 3);
7471
7472        let prim_array_ref = list_array.value(0);
7473        let prim_array = as_uint64_array(&prim_array_ref)?;
7474        assert_eq!(prim_array.len(), 3);
7475        assert_eq!(prim_array.value(0), 100);
7476        assert!(prim_array.is_null(1));
7477        assert_eq!(prim_array.value(2), 101);
7478        Ok(())
7479    }
7480
7481    /// Creates array directly and via ScalarValue and ensures they are the same
7482    macro_rules! check_scalar_iter {
7483        ($SCALAR_T:ident, $ARRAYTYPE:ident, $INPUT:expr) => {{
7484            let scalars: Vec<_> =
7485                $INPUT.iter().map(|v| ScalarValue::$SCALAR_T(*v)).collect();
7486
7487            let array = ScalarValue::iter_to_array(scalars.into_iter()).unwrap();
7488
7489            let expected: ArrayRef = Arc::new($ARRAYTYPE::from($INPUT));
7490
7491            assert_eq!(&array, &expected);
7492        }};
7493    }
7494
7495    /// Creates array directly and via ScalarValue and ensures they are the same
7496    /// but for variants that carry a timezone field.
7497    macro_rules! check_scalar_iter_tz {
7498        ($SCALAR_T:ident, $ARRAYTYPE:ident, $INPUT:expr) => {{
7499            let scalars: Vec<_> = $INPUT
7500                .iter()
7501                .map(|v| ScalarValue::$SCALAR_T(*v, None))
7502                .collect();
7503
7504            let array = ScalarValue::iter_to_array(scalars.into_iter()).unwrap();
7505
7506            let expected: ArrayRef = Arc::new($ARRAYTYPE::from($INPUT));
7507
7508            assert_eq!(&array, &expected);
7509        }};
7510    }
7511
7512    /// Creates array directly and via ScalarValue and ensures they
7513    /// are the same, for string  arrays
7514    macro_rules! check_scalar_iter_string {
7515        ($SCALAR_T:ident, $ARRAYTYPE:ident, $INPUT:expr) => {{
7516            let scalars: Vec<_> = $INPUT
7517                .iter()
7518                .map(|v| ScalarValue::$SCALAR_T(v.map(|v| v.to_string())))
7519                .collect();
7520
7521            let array = ScalarValue::iter_to_array(scalars.into_iter()).unwrap();
7522
7523            let expected: ArrayRef = Arc::new($ARRAYTYPE::from($INPUT));
7524
7525            assert_eq!(&array, &expected);
7526        }};
7527    }
7528
7529    /// Creates array directly and via ScalarValue and ensures they
7530    /// are the same, for binary arrays
7531    macro_rules! check_scalar_iter_binary {
7532        ($SCALAR_T:ident, $ARRAYTYPE:ident, $INPUT:expr) => {{
7533            let scalars: Vec<_> = $INPUT
7534                .iter()
7535                .map(|v| ScalarValue::$SCALAR_T(v.map(|v| v.to_vec())))
7536                .collect();
7537
7538            let array = ScalarValue::iter_to_array(scalars.into_iter()).unwrap();
7539
7540            let expected: $ARRAYTYPE =
7541                $INPUT.iter().map(|v| v.map(|v| v.to_vec())).collect();
7542
7543            let expected: ArrayRef = Arc::new(expected);
7544
7545            assert_eq!(&array, &expected);
7546        }};
7547    }
7548
7549    #[test]
7550    fn scalar_iter_to_array_boolean() {
7551        check_scalar_iter!(Boolean, BooleanArray, vec![Some(true), None, Some(false)]);
7552        check_scalar_iter!(Float32, Float32Array, vec![Some(1.9), None, Some(-2.1)]);
7553        check_scalar_iter!(Float64, Float64Array, vec![Some(1.9), None, Some(-2.1)]);
7554
7555        check_scalar_iter!(Int8, Int8Array, vec![Some(1), None, Some(3)]);
7556        check_scalar_iter!(Int16, Int16Array, vec![Some(1), None, Some(3)]);
7557        check_scalar_iter!(Int32, Int32Array, vec![Some(1), None, Some(3)]);
7558        check_scalar_iter!(Int64, Int64Array, vec![Some(1), None, Some(3)]);
7559
7560        check_scalar_iter!(UInt8, UInt8Array, vec![Some(1), None, Some(3)]);
7561        check_scalar_iter!(UInt16, UInt16Array, vec![Some(1), None, Some(3)]);
7562        check_scalar_iter!(UInt32, UInt32Array, vec![Some(1), None, Some(3)]);
7563        check_scalar_iter!(UInt64, UInt64Array, vec![Some(1), None, Some(3)]);
7564
7565        check_scalar_iter_tz!(
7566            TimestampSecond,
7567            TimestampSecondArray,
7568            vec![Some(1), None, Some(3)]
7569        );
7570        check_scalar_iter_tz!(
7571            TimestampMillisecond,
7572            TimestampMillisecondArray,
7573            vec![Some(1), None, Some(3)]
7574        );
7575        check_scalar_iter_tz!(
7576            TimestampMicrosecond,
7577            TimestampMicrosecondArray,
7578            vec![Some(1), None, Some(3)]
7579        );
7580        check_scalar_iter_tz!(
7581            TimestampNanosecond,
7582            TimestampNanosecondArray,
7583            vec![Some(1), None, Some(3)]
7584        );
7585
7586        check_scalar_iter_string!(
7587            Utf8,
7588            StringArray,
7589            vec![Some("foo"), None, Some("bar")]
7590        );
7591        check_scalar_iter_string!(
7592            LargeUtf8,
7593            LargeStringArray,
7594            vec![Some("foo"), None, Some("bar")]
7595        );
7596        check_scalar_iter_binary!(
7597            Binary,
7598            BinaryArray,
7599            [Some(b"foo"), None, Some(b"bar")]
7600        );
7601        check_scalar_iter_binary!(
7602            LargeBinary,
7603            LargeBinaryArray,
7604            [Some(b"foo"), None, Some(b"bar")]
7605        );
7606    }
7607
7608    #[test]
7609    fn scalar_iter_to_array_empty() {
7610        let scalars = vec![] as Vec<ScalarValue>;
7611
7612        let result = ScalarValue::iter_to_array(scalars).unwrap_err();
7613        assert!(
7614            result
7615                .to_string()
7616                .contains("Empty iterator passed to ScalarValue::iter_to_array"),
7617            "{}",
7618            result
7619        );
7620    }
7621
7622    #[test]
7623    fn scalar_iter_to_dictionary() {
7624        fn make_val(v: Option<String>) -> ScalarValue {
7625            let key_type = DataType::Int32;
7626            let value = ScalarValue::Utf8(v);
7627            ScalarValue::Dictionary(Box::new(key_type), Box::new(value))
7628        }
7629
7630        let scalars = [
7631            make_val(Some("Foo".into())),
7632            make_val(None),
7633            make_val(Some("Bar".into())),
7634        ];
7635
7636        let array = ScalarValue::iter_to_array(scalars).unwrap();
7637        let array = as_dictionary_array::<Int32Type>(&array).unwrap();
7638        let values_array = as_string_array(array.values()).unwrap();
7639
7640        let values = array
7641            .keys_iter()
7642            .map(|k| {
7643                k.map(|k| {
7644                    assert!(values_array.is_valid(k));
7645                    values_array.value(k)
7646                })
7647            })
7648            .collect::<Vec<_>>();
7649
7650        let expected = vec![Some("Foo"), None, Some("Bar")];
7651        assert_eq!(values, expected);
7652    }
7653
7654    #[test]
7655    fn scalar_iter_to_array_mismatched_types() {
7656        use ScalarValue::*;
7657        // If the scalar values are not all the correct type, error here
7658        let scalars = [Boolean(Some(true)), Int32(Some(5))];
7659
7660        let result = ScalarValue::iter_to_array(scalars).unwrap_err();
7661        assert!(result.to_string().contains("Inconsistent types in ScalarValue::iter_to_array. Expected Boolean, got Int32(5)"),
7662                "{}", result);
7663    }
7664
7665    #[test]
7666    fn scalar_try_from_array_null() {
7667        let array = vec![Some(33), None].into_iter().collect::<Int64Array>();
7668        let array: ArrayRef = Arc::new(array);
7669
7670        assert_eq!(
7671            ScalarValue::Int64(Some(33)),
7672            ScalarValue::try_from_array(&array, 0).unwrap()
7673        );
7674        assert_eq!(
7675            ScalarValue::Int64(None),
7676            ScalarValue::try_from_array(&array, 1).unwrap()
7677        );
7678    }
7679
7680    #[test]
7681    fn scalar_try_from_array_list_array_null() {
7682        let list = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
7683            Some(vec![Some(1), Some(2)]),
7684            None,
7685        ]);
7686
7687        let non_null_list_scalar = ScalarValue::try_from_array(&list, 0).unwrap();
7688        let null_list_scalar = ScalarValue::try_from_array(&list, 1).unwrap();
7689
7690        let data_type =
7691            DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true)));
7692
7693        assert_eq!(non_null_list_scalar.data_type(), data_type);
7694        assert_eq!(null_list_scalar.data_type(), data_type);
7695    }
7696
7697    #[test]
7698    fn scalar_try_from_list_datatypes() {
7699        let inner_field = Arc::new(Field::new_list_field(DataType::Int32, true));
7700
7701        // Test for List
7702        let data_type = &DataType::List(Arc::clone(&inner_field));
7703        let scalar: ScalarValue = data_type.try_into().unwrap();
7704        let expected = ScalarValue::List(
7705            new_null_array(data_type, 1)
7706                .as_list::<i32>()
7707                .to_owned()
7708                .into(),
7709        );
7710        assert_eq!(expected, scalar);
7711        assert!(expected.is_null());
7712
7713        // Test for LargeList
7714        let data_type = &DataType::LargeList(Arc::clone(&inner_field));
7715        let scalar: ScalarValue = data_type.try_into().unwrap();
7716        let expected = ScalarValue::LargeList(
7717            new_null_array(data_type, 1)
7718                .as_list::<i64>()
7719                .to_owned()
7720                .into(),
7721        );
7722        assert_eq!(expected, scalar);
7723        assert!(expected.is_null());
7724
7725        // Test for FixedSizeList(5)
7726        let data_type = &DataType::FixedSizeList(Arc::clone(&inner_field), 5);
7727        let scalar: ScalarValue = data_type.try_into().unwrap();
7728        let expected = ScalarValue::FixedSizeList(
7729            new_null_array(data_type, 1)
7730                .as_fixed_size_list()
7731                .to_owned()
7732                .into(),
7733        );
7734        assert_eq!(expected, scalar);
7735        assert!(expected.is_null());
7736
7737        // Test for ListView
7738        let data_type = &DataType::ListView(Arc::clone(&inner_field));
7739        let scalar: ScalarValue = data_type.try_into().unwrap();
7740        let expected = ScalarValue::ListView(
7741            new_null_array(data_type, 1)
7742                .as_list_view::<i32>()
7743                .to_owned()
7744                .into(),
7745        );
7746        assert_eq!(expected, scalar);
7747        assert!(expected.is_null());
7748
7749        // Test for LargeListView
7750        let data_type = &DataType::LargeListView(Arc::clone(&inner_field));
7751        let scalar: ScalarValue = data_type.try_into().unwrap();
7752        let expected = ScalarValue::LargeListView(
7753            new_null_array(data_type, 1)
7754                .as_list_view::<i64>()
7755                .to_owned()
7756                .into(),
7757        );
7758        assert_eq!(expected, scalar);
7759        assert!(expected.is_null());
7760    }
7761
7762    #[test]
7763    fn scalar_try_from_list_of_list() {
7764        let data_type = DataType::List(Arc::new(Field::new_list_field(
7765            DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
7766            true,
7767        )));
7768        let data_type = &data_type;
7769        let scalar: ScalarValue = data_type.try_into().unwrap();
7770
7771        let expected = ScalarValue::List(
7772            new_null_array(
7773                &DataType::List(Arc::new(Field::new_list_field(
7774                    DataType::List(Arc::new(Field::new_list_field(
7775                        DataType::Int32,
7776                        true,
7777                    ))),
7778                    true,
7779                ))),
7780                1,
7781            )
7782            .as_list::<i32>()
7783            .to_owned()
7784            .into(),
7785        );
7786
7787        assert_eq!(expected, scalar)
7788    }
7789
7790    #[test]
7791    fn scalar_try_from_not_equal_list_nested_list() {
7792        let list_data_type =
7793            DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true)));
7794        let data_type = &list_data_type;
7795        let list_scalar: ScalarValue = data_type.try_into().unwrap();
7796
7797        let nested_list_data_type = DataType::List(Arc::new(Field::new_list_field(
7798            DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
7799            true,
7800        )));
7801        let data_type = &nested_list_data_type;
7802        let nested_list_scalar: ScalarValue = data_type.try_into().unwrap();
7803
7804        assert_ne!(list_scalar, nested_list_scalar);
7805    }
7806
7807    #[test]
7808    fn scalar_try_from_dict_datatype() {
7809        let data_type =
7810            DataType::Dictionary(Box::new(DataType::Int8), Box::new(DataType::Utf8));
7811        let data_type = &data_type;
7812        let expected = ScalarValue::Dictionary(
7813            Box::new(DataType::Int8),
7814            Box::new(ScalarValue::Utf8(None)),
7815        );
7816        assert_eq!(expected, data_type.try_into().unwrap())
7817    }
7818
7819    #[test]
7820    fn size_of_scalar() {
7821        // Since ScalarValues are used in a non trivial number of places,
7822        // making it larger means significant more memory consumption
7823        // per distinct value.
7824        //
7825        // Thus this test ensures that no code change makes ScalarValue larger
7826        //
7827        // The alignment requirements differ across architectures and
7828        // thus the size of the enum appears to as well
7829
7830        // The value may also change depending on rust version
7831        assert_eq!(size_of::<ScalarValue>(), 64);
7832    }
7833
7834    #[test]
7835    fn memory_size() {
7836        let sv = ScalarValue::Binary(Some(Vec::with_capacity(10)));
7837        assert_eq!(sv.size(), size_of::<ScalarValue>() + 10,);
7838        let sv_size = sv.size();
7839
7840        let mut v = Vec::with_capacity(10);
7841        // do NOT clone `sv` here because this may shrink the vector capacity
7842        v.push(sv);
7843        assert_eq!(v.capacity(), 10);
7844        assert_eq!(
7845            ScalarValue::size_of_vec(&v),
7846            size_of::<Vec<ScalarValue>>() + (9 * size_of::<ScalarValue>()) + sv_size,
7847        );
7848
7849        #[allow(clippy::allow_attributes, clippy::mutable_key_type)]
7850        // ScalarValue has interior mutability but is intentionally used as hash key
7851        let mut s = HashSet::with_capacity(0);
7852        // do NOT clone `sv` here because this may shrink the vector capacity
7853        s.insert(v.pop().unwrap());
7854        // hashsets may easily grow during insert, so capacity is dynamic
7855        let s_capacity = s.capacity();
7856        assert_eq!(
7857            ScalarValue::size_of_hashset(&s),
7858            size_of::<HashSet<ScalarValue>>()
7859                + ((s_capacity - 1) * size_of::<ScalarValue>())
7860                + sv_size,
7861        );
7862    }
7863
7864    #[test]
7865    fn scalar_eq_array() {
7866        // Validate that eq_array has the same semantics as ScalarValue::eq
7867        macro_rules! make_typed_vec {
7868            ($INPUT:expr, $TYPE:ident) => {{
7869                $INPUT
7870                    .iter()
7871                    .map(|v| v.map(|v| v as $TYPE))
7872                    .collect::<Vec<_>>()
7873            }};
7874        }
7875
7876        let bool_vals = [Some(true), None, Some(false)];
7877        let f32_vals = [Some(-1.0), None, Some(1.0)];
7878        let f64_vals = make_typed_vec!(f32_vals, f64);
7879
7880        let i8_vals = [Some(-1), None, Some(1)];
7881        let i16_vals = make_typed_vec!(i8_vals, i16);
7882        let i32_vals = make_typed_vec!(i8_vals, i32);
7883        let i64_vals = make_typed_vec!(i8_vals, i64);
7884
7885        let u8_vals = [Some(0), None, Some(1)];
7886        let u16_vals = make_typed_vec!(u8_vals, u16);
7887        let u32_vals = make_typed_vec!(u8_vals, u32);
7888        let u64_vals = make_typed_vec!(u8_vals, u64);
7889
7890        let str_vals = [Some("foo"), None, Some("bar")];
7891
7892        let interval_dt_vals = [
7893            Some(IntervalDayTime::MINUS_ONE),
7894            None,
7895            Some(IntervalDayTime::ONE),
7896        ];
7897        let interval_mdn_vals = [
7898            Some(IntervalMonthDayNano::MINUS_ONE),
7899            None,
7900            Some(IntervalMonthDayNano::ONE),
7901        ];
7902
7903        /// Test each value in `scalar` with the corresponding element
7904        /// at `array`. Assumes each element is unique (aka not equal
7905        /// with all other indexes)
7906        #[derive(Debug)]
7907        struct TestCase {
7908            array: ArrayRef,
7909            scalars: Vec<ScalarValue>,
7910        }
7911
7912        /// Create a test case for casing the input to the specified array type
7913        macro_rules! make_test_case {
7914            ($INPUT:expr, $ARRAY_TY:ident, $SCALAR_TY:ident) => {{
7915                TestCase {
7916                    array: Arc::new($INPUT.iter().collect::<$ARRAY_TY>()),
7917                    scalars: $INPUT.iter().map(|v| ScalarValue::$SCALAR_TY(*v)).collect(),
7918                }
7919            }};
7920
7921            ($INPUT:expr, $ARRAY_TY:ident, $SCALAR_TY:ident, $TZ:expr) => {{
7922                let tz = $TZ;
7923                TestCase {
7924                    array: Arc::new($INPUT.iter().collect::<$ARRAY_TY>()),
7925                    scalars: $INPUT
7926                        .iter()
7927                        .map(|v| ScalarValue::$SCALAR_TY(*v, tz.clone()))
7928                        .collect(),
7929                }
7930            }};
7931        }
7932
7933        macro_rules! make_str_test_case {
7934            ($INPUT:expr, $ARRAY_TY:ident, $SCALAR_TY:ident) => {{
7935                TestCase {
7936                    array: Arc::new($INPUT.iter().cloned().collect::<$ARRAY_TY>()),
7937                    scalars: $INPUT
7938                        .iter()
7939                        .map(|v| ScalarValue::$SCALAR_TY(v.map(|v| v.to_string())))
7940                        .collect(),
7941                }
7942            }};
7943        }
7944
7945        macro_rules! make_binary_test_case {
7946            ($INPUT:expr, $ARRAY_TY:ident, $SCALAR_TY:ident) => {{
7947                TestCase {
7948                    array: Arc::new($INPUT.iter().cloned().collect::<$ARRAY_TY>()),
7949                    scalars: $INPUT
7950                        .iter()
7951                        .map(|v| {
7952                            ScalarValue::$SCALAR_TY(v.map(|v| v.as_bytes().to_vec()))
7953                        })
7954                        .collect(),
7955                }
7956            }};
7957        }
7958
7959        /// create a test case for DictionaryArray<$INDEX_TY>
7960        macro_rules! make_str_dict_test_case {
7961            ($INPUT:expr, $INDEX_TY:ident) => {{
7962                TestCase {
7963                    array: Arc::new(
7964                        $INPUT
7965                            .iter()
7966                            .cloned()
7967                            .collect::<DictionaryArray<$INDEX_TY>>(),
7968                    ),
7969                    scalars: $INPUT
7970                        .iter()
7971                        .map(|v| {
7972                            ScalarValue::Dictionary(
7973                                Box::new($INDEX_TY::DATA_TYPE),
7974                                Box::new(ScalarValue::Utf8(v.map(|v| v.to_string()))),
7975                            )
7976                        })
7977                        .collect(),
7978                }
7979            }};
7980        }
7981
7982        let cases = vec![
7983            make_test_case!(bool_vals, BooleanArray, Boolean),
7984            make_test_case!(f32_vals, Float32Array, Float32),
7985            make_test_case!(f64_vals, Float64Array, Float64),
7986            make_test_case!(i8_vals, Int8Array, Int8),
7987            make_test_case!(i16_vals, Int16Array, Int16),
7988            make_test_case!(i32_vals, Int32Array, Int32),
7989            make_test_case!(i64_vals, Int64Array, Int64),
7990            make_test_case!(u8_vals, UInt8Array, UInt8),
7991            make_test_case!(u16_vals, UInt16Array, UInt16),
7992            make_test_case!(u32_vals, UInt32Array, UInt32),
7993            make_test_case!(u64_vals, UInt64Array, UInt64),
7994            make_str_test_case!(str_vals, StringArray, Utf8),
7995            make_str_test_case!(str_vals, LargeStringArray, LargeUtf8),
7996            make_binary_test_case!(str_vals, BinaryArray, Binary),
7997            make_binary_test_case!(str_vals, LargeBinaryArray, LargeBinary),
7998            make_test_case!(i32_vals, Date32Array, Date32),
7999            make_test_case!(i64_vals, Date64Array, Date64),
8000            make_test_case!(i32_vals, Time32SecondArray, Time32Second),
8001            make_test_case!(i32_vals, Time32MillisecondArray, Time32Millisecond),
8002            make_test_case!(i64_vals, Time64MicrosecondArray, Time64Microsecond),
8003            make_test_case!(i64_vals, Time64NanosecondArray, Time64Nanosecond),
8004            make_test_case!(i64_vals, TimestampSecondArray, TimestampSecond, None),
8005            make_test_case!(
8006                i64_vals,
8007                TimestampSecondArray,
8008                TimestampSecond,
8009                Some("UTC".into())
8010            ),
8011            make_test_case!(
8012                i64_vals,
8013                TimestampMillisecondArray,
8014                TimestampMillisecond,
8015                None
8016            ),
8017            make_test_case!(
8018                i64_vals,
8019                TimestampMillisecondArray,
8020                TimestampMillisecond,
8021                Some("UTC".into())
8022            ),
8023            make_test_case!(
8024                i64_vals,
8025                TimestampMicrosecondArray,
8026                TimestampMicrosecond,
8027                None
8028            ),
8029            make_test_case!(
8030                i64_vals,
8031                TimestampMicrosecondArray,
8032                TimestampMicrosecond,
8033                Some("UTC".into())
8034            ),
8035            make_test_case!(
8036                i64_vals,
8037                TimestampNanosecondArray,
8038                TimestampNanosecond,
8039                None
8040            ),
8041            make_test_case!(
8042                i64_vals,
8043                TimestampNanosecondArray,
8044                TimestampNanosecond,
8045                Some("UTC".into())
8046            ),
8047            make_test_case!(i32_vals, IntervalYearMonthArray, IntervalYearMonth),
8048            make_test_case!(interval_dt_vals, IntervalDayTimeArray, IntervalDayTime),
8049            make_test_case!(
8050                interval_mdn_vals,
8051                IntervalMonthDayNanoArray,
8052                IntervalMonthDayNano
8053            ),
8054            make_str_dict_test_case!(str_vals, Int8Type),
8055            make_str_dict_test_case!(str_vals, Int16Type),
8056            make_str_dict_test_case!(str_vals, Int32Type),
8057            make_str_dict_test_case!(str_vals, Int64Type),
8058            make_str_dict_test_case!(str_vals, UInt8Type),
8059            make_str_dict_test_case!(str_vals, UInt16Type),
8060            make_str_dict_test_case!(str_vals, UInt32Type),
8061            make_str_dict_test_case!(str_vals, UInt64Type),
8062        ];
8063
8064        for case in cases {
8065            println!("**** Test Case *****");
8066            let TestCase { array, scalars } = case;
8067            println!("Input array type: {}", array.data_type());
8068            println!("Input scalars: {scalars:#?}");
8069            assert_eq!(array.len(), scalars.len());
8070
8071            for (index, scalar) in scalars.into_iter().enumerate() {
8072                assert!(
8073                    scalar
8074                        .eq_array(&array, index)
8075                        .expect("Failed to compare arrays"),
8076                    "Expected {scalar:?} to be equal to {array:?} at index {index}"
8077                );
8078
8079                // test that all other elements are *not* equal
8080                for other_index in 0..array.len() {
8081                    if index != other_index {
8082                        assert!(
8083                            !scalar
8084                                .eq_array(&array, other_index)
8085                                .expect("Failed to compare arrays"),
8086                            "Expected {scalar:?} to be NOT equal to {array:?} at index {other_index}"
8087                        );
8088                    }
8089                }
8090            }
8091        }
8092    }
8093
8094    #[test]
8095    fn scalar_partial_ordering() {
8096        use ScalarValue::*;
8097
8098        assert_eq!(
8099            Int64(Some(33)).partial_cmp(&Int64(Some(0))),
8100            Some(Ordering::Greater)
8101        );
8102        assert_eq!(
8103            Int64(Some(0)).partial_cmp(&Int64(Some(33))),
8104            Some(Ordering::Less)
8105        );
8106        assert_eq!(
8107            Int64(Some(33)).partial_cmp(&Int64(Some(33))),
8108            Some(Ordering::Equal)
8109        );
8110        // For different data type, `partial_cmp` returns None.
8111        assert_eq!(Int64(Some(33)).partial_cmp(&Int32(Some(33))), None);
8112        assert_eq!(Int32(Some(33)).partial_cmp(&Int64(Some(33))), None);
8113
8114        assert_eq!(
8115            ScalarValue::from(vec![
8116                ("A", ScalarValue::from(1.0)),
8117                ("B", ScalarValue::from("Z")),
8118            ])
8119            .partial_cmp(&ScalarValue::from(vec![
8120                ("A", ScalarValue::from(2.0)),
8121                ("B", ScalarValue::from("A")),
8122            ])),
8123            Some(Ordering::Less)
8124        );
8125
8126        // For different struct fields, `partial_cmp` returns None.
8127        assert_eq!(
8128            ScalarValue::from(vec![
8129                ("A", ScalarValue::from(1.0)),
8130                ("B", ScalarValue::from("Z")),
8131            ])
8132            .partial_cmp(&ScalarValue::from(vec![
8133                ("a", ScalarValue::from(2.0)),
8134                ("b", ScalarValue::from("A")),
8135            ])),
8136            None
8137        );
8138    }
8139
8140    #[test]
8141    fn test_scalar_value_from_string() {
8142        let scalar = ScalarValue::from("foo");
8143        assert_eq!(scalar, ScalarValue::Utf8(Some("foo".to_string())));
8144        let scalar = ScalarValue::from("foo".to_string());
8145        assert_eq!(scalar, ScalarValue::Utf8(Some("foo".to_string())));
8146        let scalar = ScalarValue::from_str("foo").unwrap();
8147        assert_eq!(scalar, ScalarValue::Utf8(Some("foo".to_string())));
8148    }
8149
8150    #[test]
8151    fn test_scalar_struct() {
8152        let field_a = Arc::new(Field::new("A", DataType::Int32, false));
8153        let field_b = Arc::new(Field::new("B", DataType::Boolean, false));
8154        let field_c = Arc::new(Field::new("C", DataType::Utf8, false));
8155
8156        let field_e = Arc::new(Field::new("e", DataType::Int16, false));
8157        let field_f = Arc::new(Field::new("f", DataType::Int64, false));
8158        let field_d = Arc::new(Field::new(
8159            "D",
8160            DataType::Struct(vec![Arc::clone(&field_e), Arc::clone(&field_f)].into()),
8161            false,
8162        ));
8163
8164        let struct_array = StructArray::from(vec![
8165            (
8166                Arc::clone(&field_e),
8167                Arc::new(Int16Array::from(vec![2])) as ArrayRef,
8168            ),
8169            (
8170                Arc::clone(&field_f),
8171                Arc::new(Int64Array::from(vec![3])) as ArrayRef,
8172            ),
8173        ]);
8174
8175        let struct_array = StructArray::from(vec![
8176            (
8177                Arc::clone(&field_a),
8178                Arc::new(Int32Array::from(vec![23])) as ArrayRef,
8179            ),
8180            (
8181                Arc::clone(&field_b),
8182                Arc::new(BooleanArray::from(vec![false])) as ArrayRef,
8183            ),
8184            (
8185                Arc::clone(&field_c),
8186                Arc::new(StringArray::from(vec!["Hello"])) as ArrayRef,
8187            ),
8188            (Arc::clone(&field_d), Arc::new(struct_array) as ArrayRef),
8189        ]);
8190        let scalar = ScalarValue::Struct(Arc::new(struct_array));
8191
8192        let array = scalar
8193            .to_array_of_size(2)
8194            .expect("Failed to convert to array of size");
8195
8196        let expected = Arc::new(StructArray::from(vec![
8197            (
8198                Arc::clone(&field_a),
8199                Arc::new(Int32Array::from(vec![23, 23])) as ArrayRef,
8200            ),
8201            (
8202                Arc::clone(&field_b),
8203                Arc::new(BooleanArray::from(vec![false, false])) as ArrayRef,
8204            ),
8205            (
8206                Arc::clone(&field_c),
8207                Arc::new(StringArray::from(vec!["Hello", "Hello"])) as ArrayRef,
8208            ),
8209            (
8210                Arc::clone(&field_d),
8211                Arc::new(StructArray::from(vec![
8212                    (
8213                        Arc::clone(&field_e),
8214                        Arc::new(Int16Array::from(vec![2, 2])) as ArrayRef,
8215                    ),
8216                    (
8217                        Arc::clone(&field_f),
8218                        Arc::new(Int64Array::from(vec![3, 3])) as ArrayRef,
8219                    ),
8220                ])) as ArrayRef,
8221            ),
8222        ])) as ArrayRef;
8223
8224        assert_eq!(&array, &expected);
8225
8226        // Construct from second element of ArrayRef
8227        let constructed = ScalarValue::try_from_array(&expected, 1).unwrap();
8228        assert_eq!(constructed, scalar);
8229
8230        // None version
8231        let none_scalar = ScalarValue::try_from(array.data_type()).unwrap();
8232        assert!(none_scalar.is_null());
8233        assert_eq!(
8234            format!("{none_scalar:?}"),
8235            String::from("Struct({A:,B:,C:,D:})")
8236        );
8237
8238        // Construct with convenience From<Vec<(&str, ScalarValue)>>
8239        let constructed = ScalarValue::from(vec![
8240            ("A", ScalarValue::from(23)),
8241            ("B", ScalarValue::from(false)),
8242            ("C", ScalarValue::from("Hello")),
8243            (
8244                "D",
8245                ScalarValue::from(vec![
8246                    ("e", ScalarValue::from(2i16)),
8247                    ("f", ScalarValue::from(3i64)),
8248                ]),
8249            ),
8250        ]);
8251        assert_eq!(constructed, scalar);
8252
8253        // Build Array from Vec of structs
8254        let scalars = vec![
8255            ScalarValue::from(vec![
8256                ("A", ScalarValue::from(23)),
8257                ("B", ScalarValue::from(false)),
8258                ("C", ScalarValue::from("Hello")),
8259                (
8260                    "D",
8261                    ScalarValue::from(vec![
8262                        ("e", ScalarValue::from(2i16)),
8263                        ("f", ScalarValue::from(3i64)),
8264                    ]),
8265                ),
8266            ]),
8267            ScalarValue::from(vec![
8268                ("A", ScalarValue::from(7)),
8269                ("B", ScalarValue::from(true)),
8270                ("C", ScalarValue::from("World")),
8271                (
8272                    "D",
8273                    ScalarValue::from(vec![
8274                        ("e", ScalarValue::from(4i16)),
8275                        ("f", ScalarValue::from(5i64)),
8276                    ]),
8277                ),
8278            ]),
8279            ScalarValue::from(vec![
8280                ("A", ScalarValue::from(-1000)),
8281                ("B", ScalarValue::from(true)),
8282                ("C", ScalarValue::from("!!!!!")),
8283                (
8284                    "D",
8285                    ScalarValue::from(vec![
8286                        ("e", ScalarValue::from(6i16)),
8287                        ("f", ScalarValue::from(7i64)),
8288                    ]),
8289                ),
8290            ]),
8291        ];
8292        let array = ScalarValue::iter_to_array(scalars).unwrap();
8293
8294        let expected = Arc::new(StructArray::from(vec![
8295            (
8296                Arc::clone(&field_a),
8297                Arc::new(Int32Array::from(vec![23, 7, -1000])) as ArrayRef,
8298            ),
8299            (
8300                Arc::clone(&field_b),
8301                Arc::new(BooleanArray::from(vec![false, true, true])) as ArrayRef,
8302            ),
8303            (
8304                Arc::clone(&field_c),
8305                Arc::new(StringArray::from(vec!["Hello", "World", "!!!!!"])) as ArrayRef,
8306            ),
8307            (
8308                Arc::clone(&field_d),
8309                Arc::new(StructArray::from(vec![
8310                    (
8311                        Arc::clone(&field_e),
8312                        Arc::new(Int16Array::from(vec![2, 4, 6])) as ArrayRef,
8313                    ),
8314                    (
8315                        Arc::clone(&field_f),
8316                        Arc::new(Int64Array::from(vec![3, 5, 7])) as ArrayRef,
8317                    ),
8318                ])) as ArrayRef,
8319            ),
8320        ])) as ArrayRef;
8321
8322        assert_eq!(&array, &expected);
8323    }
8324
8325    #[test]
8326    fn round_trip() {
8327        // Each array type should be able to round tripped through a scalar
8328        let cases: Vec<ArrayRef> = vec![
8329            // int
8330            Arc::new(Int8Array::from(vec![Some(1), None, Some(3)])),
8331            Arc::new(Int16Array::from(vec![Some(1), None, Some(3)])),
8332            Arc::new(Int32Array::from(vec![Some(1), None, Some(3)])),
8333            Arc::new(Int64Array::from(vec![Some(1), None, Some(3)])),
8334            Arc::new(UInt8Array::from(vec![Some(1), None, Some(3)])),
8335            Arc::new(UInt16Array::from(vec![Some(1), None, Some(3)])),
8336            Arc::new(UInt32Array::from(vec![Some(1), None, Some(3)])),
8337            Arc::new(UInt64Array::from(vec![Some(1), None, Some(3)])),
8338            // bool
8339            Arc::new(BooleanArray::from(vec![Some(true), None, Some(false)])),
8340            // float
8341            Arc::new(Float32Array::from(vec![Some(1.0), None, Some(3.0)])),
8342            Arc::new(Float64Array::from(vec![Some(1.0), None, Some(3.0)])),
8343            // string array
8344            Arc::new(StringArray::from(vec![Some("foo"), None, Some("bar")])),
8345            Arc::new(LargeStringArray::from(vec![Some("foo"), None, Some("bar")])),
8346            Arc::new(StringViewArray::from(vec![Some("foo"), None, Some("bar")])),
8347            // string dictionary
8348            {
8349                let mut builder = StringDictionaryBuilder::<Int32Type>::new();
8350                builder.append("foo").unwrap();
8351                builder.append_null();
8352                builder.append("bar").unwrap();
8353                Arc::new(builder.finish())
8354            },
8355            // binary array
8356            Arc::new(BinaryArray::from_iter(vec![
8357                Some(b"foo"),
8358                None,
8359                Some(b"bar"),
8360            ])),
8361            Arc::new(LargeBinaryArray::from_iter(vec![
8362                Some(b"foo"),
8363                None,
8364                Some(b"bar"),
8365            ])),
8366            Arc::new(BinaryViewArray::from_iter(vec![
8367                Some(b"foo"),
8368                None,
8369                Some(b"bar"),
8370            ])),
8371            // timestamp
8372            Arc::new(TimestampSecondArray::from(vec![Some(1), None, Some(3)])),
8373            Arc::new(TimestampMillisecondArray::from(vec![
8374                Some(1),
8375                None,
8376                Some(3),
8377            ])),
8378            Arc::new(TimestampMicrosecondArray::from(vec![
8379                Some(1),
8380                None,
8381                Some(3),
8382            ])),
8383            Arc::new(TimestampNanosecondArray::from(vec![Some(1), None, Some(3)])),
8384            // timestamp with timezone
8385            Arc::new(
8386                TimestampSecondArray::from(vec![Some(1), None, Some(3)])
8387                    .with_timezone_opt(Some("UTC")),
8388            ),
8389            Arc::new(
8390                TimestampMillisecondArray::from(vec![Some(1), None, Some(3)])
8391                    .with_timezone_opt(Some("UTC")),
8392            ),
8393            Arc::new(
8394                TimestampMicrosecondArray::from(vec![Some(1), None, Some(3)])
8395                    .with_timezone_opt(Some("UTC")),
8396            ),
8397            Arc::new(
8398                TimestampNanosecondArray::from(vec![Some(1), None, Some(3)])
8399                    .with_timezone_opt(Some("UTC")),
8400            ),
8401            // date
8402            Arc::new(Date32Array::from(vec![Some(1), None, Some(3)])),
8403            Arc::new(Date64Array::from(vec![Some(1), None, Some(3)])),
8404            // time
8405            Arc::new(Time32SecondArray::from(vec![Some(1), None, Some(3)])),
8406            Arc::new(Time32MillisecondArray::from(vec![Some(1), None, Some(3)])),
8407            Arc::new(Time64MicrosecondArray::from(vec![Some(1), None, Some(3)])),
8408            Arc::new(Time64NanosecondArray::from(vec![Some(1), None, Some(3)])),
8409            // null array
8410            Arc::new(NullArray::new(3)),
8411            // dense union
8412            {
8413                let mut builder = UnionBuilder::new_dense();
8414                builder.append::<Int32Type>("a", 1).unwrap();
8415                builder.append::<Float64Type>("b", 3.4).unwrap();
8416                Arc::new(builder.build().unwrap())
8417            },
8418            // sparse union
8419            {
8420                let mut builder = UnionBuilder::new_sparse();
8421                builder.append::<Int32Type>("a", 1).unwrap();
8422                builder.append::<Float64Type>("b", 3.4).unwrap();
8423                Arc::new(builder.build().unwrap())
8424            },
8425            // list array
8426            {
8427                let values_builder = StringBuilder::new();
8428                let mut builder = ListBuilder::new(values_builder);
8429                // [A, B]
8430                builder.values().append_value("A");
8431                builder.values().append_value("B");
8432                builder.append(true);
8433                // [ ] (empty list)
8434                builder.append(true);
8435                // Null
8436                builder.values().append_value("?"); // irrelevant
8437                builder.append(false);
8438                Arc::new(builder.finish())
8439            },
8440            // large list array
8441            {
8442                let values_builder = StringBuilder::new();
8443                let mut builder = LargeListBuilder::new(values_builder);
8444                // [A, B]
8445                builder.values().append_value("A");
8446                builder.values().append_value("B");
8447                builder.append(true);
8448                // [ ] (empty list)
8449                builder.append(true);
8450                // Null
8451                builder.append(false);
8452                Arc::new(builder.finish())
8453            },
8454            // fixed size list array
8455            {
8456                let values_builder = Int32Builder::new();
8457                let mut builder = FixedSizeListBuilder::new(values_builder, 3);
8458
8459                //  [[0, 1, 2], null, [3, null, 5]
8460                builder.values().append_value(0);
8461                builder.values().append_value(1);
8462                builder.values().append_value(2);
8463                builder.append(true);
8464                builder.values().append_null();
8465                builder.values().append_null();
8466                builder.values().append_null();
8467                builder.append(false);
8468                builder.values().append_value(3);
8469                builder.values().append_null();
8470                builder.values().append_value(5);
8471                builder.append(true);
8472                Arc::new(builder.finish())
8473            },
8474            // list view array
8475            {
8476                let values_builder = StringBuilder::new();
8477                let mut builder = ListViewBuilder::new(values_builder);
8478                // [A, B]
8479                builder.values().append_value("A");
8480                builder.values().append_value("B");
8481                builder.append(true);
8482                // [ ] (empty list)
8483                builder.append(true);
8484                // Null
8485                builder.append(false);
8486                Arc::new(builder.finish())
8487            },
8488            // large list view array
8489            {
8490                let values_builder = StringBuilder::new();
8491                let mut builder = LargeListViewBuilder::new(values_builder);
8492                // [A, B]
8493                builder.values().append_value("A");
8494                builder.values().append_value("B");
8495                builder.append(true);
8496                // [ ] (empty list)
8497                builder.append(true);
8498                // Null
8499                builder.append(false);
8500                Arc::new(builder.finish())
8501            },
8502            // map
8503            {
8504                let string_builder = StringBuilder::new();
8505                let int_builder = Int32Builder::with_capacity(4);
8506
8507                let mut builder = MapBuilder::new(None, string_builder, int_builder);
8508                // {"joe": 1}
8509                builder.keys().append_value("joe");
8510                builder.values().append_value(1);
8511                builder.append(true).unwrap();
8512                // {}
8513                builder.append(true).unwrap();
8514                // null
8515                builder.append(false).unwrap();
8516
8517                Arc::new(builder.finish())
8518            },
8519        ];
8520
8521        for arr in cases {
8522            round_trip_through_scalar(arr);
8523        }
8524    }
8525
8526    /// for each row in `arr`:
8527    /// 1. convert to a `ScalarValue`
8528    /// 2. Convert `ScalarValue` back to an `ArrayRef`
8529    /// 3. Compare the original array (sliced) and new array for equality
8530    fn round_trip_through_scalar(arr: ArrayRef) {
8531        for i in 0..arr.len() {
8532            // convert Scalar --> Array
8533            let scalar = ScalarValue::try_from_array(&arr, i).unwrap();
8534            let array = scalar.to_array_of_size(1).unwrap();
8535            assert_eq!(array.len(), 1);
8536            assert_eq!(array.data_type(), arr.data_type());
8537            assert_eq!(array.as_ref(), arr.slice(i, 1).as_ref());
8538        }
8539    }
8540
8541    #[test]
8542    fn roundtrip_run_array() {
8543        // Comparison logic in round_trip_through_scalar doesn't work for RunArrays
8544        // so we have a custom test for them
8545        // TODO: https://github.com/apache/arrow-rs/pull/9213 might fix this ^
8546        let run_ends = Int16Array::from(vec![2, 3]);
8547        let values = Int64Array::from(vec![Some(1), None]);
8548        let run_array = RunArray::try_new(&run_ends, &values).unwrap();
8549        let run_array = run_array.downcast::<Int64Array>().unwrap();
8550
8551        let expected_values = run_array.into_iter().collect::<Vec<_>>();
8552
8553        for i in 0..run_array.len() {
8554            let scalar = ScalarValue::try_from_array(&run_array, i).unwrap();
8555            let array = scalar.to_array_of_size(1).unwrap();
8556            assert_eq!(array.data_type(), run_array.data_type());
8557            let array = array.as_run::<Int16Type>();
8558            let array = array.downcast::<Int64Array>().unwrap();
8559            assert_eq!(
8560                array.into_iter().collect::<Vec<_>>(),
8561                expected_values[i..i + 1]
8562            );
8563        }
8564    }
8565
8566    #[test]
8567    fn test_scalar_union_sparse() {
8568        let field_a = Arc::new(Field::new("A", DataType::Int32, true));
8569        let field_b = Arc::new(Field::new("B", DataType::Boolean, true));
8570        let field_c = Arc::new(Field::new("C", DataType::Utf8, true));
8571        let fields = UnionFields::from_iter([(0, field_a), (1, field_b), (2, field_c)]);
8572
8573        let mut values_a = vec![None; 6];
8574        values_a[0] = Some(42);
8575        let mut values_b = vec![None; 6];
8576        values_b[1] = Some(true);
8577        let mut values_c = vec![None; 6];
8578        values_c[2] = Some("foo");
8579        let children: Vec<ArrayRef> = vec![
8580            Arc::new(Int32Array::from(values_a)),
8581            Arc::new(BooleanArray::from(values_b)),
8582            Arc::new(StringArray::from(values_c)),
8583        ];
8584
8585        let type_ids = ScalarBuffer::from(vec![0, 1, 2, 0, 1, 2]);
8586        let array: ArrayRef = Arc::new(
8587            UnionArray::try_new(fields.clone(), type_ids, None, children)
8588                .expect("UnionArray"),
8589        );
8590
8591        let expected = [
8592            (0, ScalarValue::from(42)),
8593            (1, ScalarValue::from(true)),
8594            (2, ScalarValue::from("foo")),
8595            (0, ScalarValue::Int32(None)),
8596            (1, ScalarValue::Boolean(None)),
8597            (2, ScalarValue::Utf8(None)),
8598        ];
8599
8600        for (i, (ti, value)) in expected.into_iter().enumerate() {
8601            let is_null = value.is_null();
8602            let value = Some((ti, Box::new(value)));
8603            let expected = ScalarValue::Union(value, fields.clone(), UnionMode::Sparse);
8604            let actual = ScalarValue::try_from_array(&array, i).expect("try_from_array");
8605
8606            assert_eq!(
8607                actual, expected,
8608                "[{i}] {actual} was not equal to {expected}"
8609            );
8610
8611            assert!(
8612                expected.eq_array(&array, i).expect("eq_array"),
8613                "[{i}] {expected}.eq_array was false"
8614            );
8615
8616            if is_null {
8617                assert!(actual.is_null(), "[{i}] {actual} was not null")
8618            }
8619        }
8620    }
8621
8622    #[test]
8623    fn test_scalar_union_dense() {
8624        let field_a = Arc::new(Field::new("A", DataType::Int32, true));
8625        let field_b = Arc::new(Field::new("B", DataType::Boolean, true));
8626        let field_c = Arc::new(Field::new("C", DataType::Utf8, true));
8627        let fields = UnionFields::from_iter([(0, field_a), (1, field_b), (2, field_c)]);
8628        let children: Vec<ArrayRef> = vec![
8629            Arc::new(Int32Array::from(vec![Some(42), None])),
8630            Arc::new(BooleanArray::from(vec![Some(true), None])),
8631            Arc::new(StringArray::from(vec![Some("foo"), None])),
8632        ];
8633
8634        let type_ids = ScalarBuffer::from(vec![0, 1, 2, 0, 1, 2]);
8635        let offsets = ScalarBuffer::from(vec![0, 0, 0, 1, 1, 1]);
8636        let array: ArrayRef = Arc::new(
8637            UnionArray::try_new(fields.clone(), type_ids, Some(offsets), children)
8638                .expect("UnionArray"),
8639        );
8640
8641        let expected = [
8642            (0, ScalarValue::from(42)),
8643            (1, ScalarValue::from(true)),
8644            (2, ScalarValue::from("foo")),
8645            (0, ScalarValue::Int32(None)),
8646            (1, ScalarValue::Boolean(None)),
8647            (2, ScalarValue::Utf8(None)),
8648        ];
8649
8650        for (i, (ti, value)) in expected.into_iter().enumerate() {
8651            let is_null = value.is_null();
8652            let value = Some((ti, Box::new(value)));
8653            let expected = ScalarValue::Union(value, fields.clone(), UnionMode::Dense);
8654            let actual = ScalarValue::try_from_array(&array, i).expect("try_from_array");
8655
8656            assert_eq!(
8657                actual, expected,
8658                "[{i}] {actual} was not equal to {expected}"
8659            );
8660
8661            assert!(
8662                expected.eq_array(&array, i).expect("eq_array"),
8663                "[{i}] {expected}.eq_array was false"
8664            );
8665
8666            if is_null {
8667                assert!(actual.is_null(), "[{i}] {actual} was not null")
8668            }
8669        }
8670    }
8671
8672    #[test]
8673    fn test_lists_in_struct() {
8674        let field_a = Arc::new(Field::new("A", DataType::Utf8, false));
8675        let field_primitive_list = Arc::new(Field::new(
8676            "primitive_list",
8677            DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
8678            false,
8679        ));
8680
8681        // Define primitive list scalars
8682        let l0 =
8683            ScalarValue::List(Arc::new(
8684                ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
8685                    Some(1),
8686                    Some(2),
8687                    Some(3),
8688                ])]),
8689            ));
8690        let l1 =
8691            ScalarValue::List(Arc::new(
8692                ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![
8693                    Some(4),
8694                    Some(5),
8695                ])]),
8696            ));
8697        let l2 = ScalarValue::List(Arc::new(ListArray::from_iter_primitive::<
8698            Int32Type,
8699            _,
8700            _,
8701        >(vec![Some(vec![Some(6)])])));
8702
8703        // Define struct scalars
8704        let s0 = ScalarValue::from(vec![
8705            ("A", ScalarValue::from("First")),
8706            ("primitive_list", l0),
8707        ]);
8708
8709        let s1 = ScalarValue::from(vec![
8710            ("A", ScalarValue::from("Second")),
8711            ("primitive_list", l1),
8712        ]);
8713
8714        let s2 = ScalarValue::from(vec![
8715            ("A", ScalarValue::from("Third")),
8716            ("primitive_list", l2),
8717        ]);
8718
8719        // iter_to_array for struct scalars
8720        let array =
8721            ScalarValue::iter_to_array(vec![s0.clone(), s1.clone(), s2.clone()]).unwrap();
8722
8723        let array = as_struct_array(&array).unwrap();
8724        let expected = StructArray::from(vec![
8725            (
8726                Arc::clone(&field_a),
8727                Arc::new(StringArray::from(vec!["First", "Second", "Third"])) as ArrayRef,
8728            ),
8729            (
8730                Arc::clone(&field_primitive_list),
8731                Arc::new(ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
8732                    Some(vec![Some(1), Some(2), Some(3)]),
8733                    Some(vec![Some(4), Some(5)]),
8734                    Some(vec![Some(6)]),
8735                ])),
8736            ),
8737        ]);
8738
8739        assert_eq!(array, &expected);
8740
8741        // Define list-of-structs scalars
8742
8743        let nl0_array = ScalarValue::iter_to_array(vec![s0, s1.clone()]).unwrap();
8744        let nl0 = SingleRowListArrayBuilder::new(nl0_array).build_list_scalar();
8745
8746        let nl1_array = ScalarValue::iter_to_array(vec![s2]).unwrap();
8747        let nl1 = SingleRowListArrayBuilder::new(nl1_array).build_list_scalar();
8748
8749        let nl2_array = ScalarValue::iter_to_array(vec![s1]).unwrap();
8750        let nl2 = SingleRowListArrayBuilder::new(nl2_array).build_list_scalar();
8751
8752        // iter_to_array for list-of-struct
8753        let array = ScalarValue::iter_to_array(vec![nl0, nl1, nl2]).unwrap();
8754        let array = array.as_list::<i32>();
8755
8756        // Construct expected array with array builders
8757        let field_a_builder = StringBuilder::with_capacity(4, 1024);
8758        let primitive_value_builder = Int32Array::builder(8);
8759        let field_primitive_list_builder = ListBuilder::new(primitive_value_builder);
8760
8761        let element_builder = StructBuilder::new(
8762            vec![field_a, field_primitive_list],
8763            vec![
8764                Box::new(field_a_builder),
8765                Box::new(field_primitive_list_builder),
8766            ],
8767        );
8768
8769        let mut list_builder = ListBuilder::new(element_builder);
8770
8771        list_builder
8772            .values()
8773            .field_builder::<StringBuilder>(0)
8774            .unwrap()
8775            .append_value("First");
8776        list_builder
8777            .values()
8778            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8779            .unwrap()
8780            .values()
8781            .append_value(1);
8782        list_builder
8783            .values()
8784            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8785            .unwrap()
8786            .values()
8787            .append_value(2);
8788        list_builder
8789            .values()
8790            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8791            .unwrap()
8792            .values()
8793            .append_value(3);
8794        list_builder
8795            .values()
8796            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8797            .unwrap()
8798            .append(true);
8799        list_builder.values().append(true);
8800
8801        list_builder
8802            .values()
8803            .field_builder::<StringBuilder>(0)
8804            .unwrap()
8805            .append_value("Second");
8806        list_builder
8807            .values()
8808            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8809            .unwrap()
8810            .values()
8811            .append_value(4);
8812        list_builder
8813            .values()
8814            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8815            .unwrap()
8816            .values()
8817            .append_value(5);
8818        list_builder
8819            .values()
8820            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8821            .unwrap()
8822            .append(true);
8823        list_builder.values().append(true);
8824        list_builder.append(true);
8825
8826        list_builder
8827            .values()
8828            .field_builder::<StringBuilder>(0)
8829            .unwrap()
8830            .append_value("Third");
8831        list_builder
8832            .values()
8833            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8834            .unwrap()
8835            .values()
8836            .append_value(6);
8837        list_builder
8838            .values()
8839            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8840            .unwrap()
8841            .append(true);
8842        list_builder.values().append(true);
8843        list_builder.append(true);
8844
8845        list_builder
8846            .values()
8847            .field_builder::<StringBuilder>(0)
8848            .unwrap()
8849            .append_value("Second");
8850        list_builder
8851            .values()
8852            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8853            .unwrap()
8854            .values()
8855            .append_value(4);
8856        list_builder
8857            .values()
8858            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8859            .unwrap()
8860            .values()
8861            .append_value(5);
8862        list_builder
8863            .values()
8864            .field_builder::<ListBuilder<PrimitiveBuilder<Int32Type>>>(1)
8865            .unwrap()
8866            .append(true);
8867        list_builder.values().append(true);
8868        list_builder.append(true);
8869
8870        let expected = list_builder.finish();
8871
8872        assert_eq!(array, &expected);
8873    }
8874
8875    fn build_2d_list(data: Vec<Option<i32>>) -> ListArray {
8876        let a1 = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(data)]);
8877        ListArray::new(
8878            Arc::new(Field::new_list_field(
8879                DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
8880                true,
8881            )),
8882            OffsetBuffer::<i32>::from_lengths([1]),
8883            Arc::new(a1),
8884            None,
8885        )
8886    }
8887
8888    #[test]
8889    fn test_nested_lists() {
8890        // Define inner list scalars
8891        let arr1 = build_2d_list(vec![Some(1), Some(2), Some(3)]);
8892        let arr2 = build_2d_list(vec![Some(4), Some(5)]);
8893        let arr3 = build_2d_list(vec![Some(6)]);
8894
8895        let array = ScalarValue::iter_to_array(vec![
8896            ScalarValue::List(Arc::new(arr1)),
8897            ScalarValue::List(Arc::new(arr2)),
8898            ScalarValue::List(Arc::new(arr3)),
8899        ])
8900        .unwrap();
8901        let array = array.as_list::<i32>();
8902
8903        // Construct expected array with array builders
8904        let inner_builder = Int32Array::builder(6);
8905        let middle_builder = ListBuilder::new(inner_builder);
8906        let mut outer_builder = ListBuilder::new(middle_builder);
8907
8908        outer_builder.values().values().append_value(1);
8909        outer_builder.values().values().append_value(2);
8910        outer_builder.values().values().append_value(3);
8911        outer_builder.values().append(true);
8912        outer_builder.append(true);
8913
8914        outer_builder.values().values().append_value(4);
8915        outer_builder.values().values().append_value(5);
8916        outer_builder.values().append(true);
8917        outer_builder.append(true);
8918
8919        outer_builder.values().values().append_value(6);
8920        outer_builder.values().append(true);
8921        outer_builder.append(true);
8922
8923        let expected = outer_builder.finish();
8924
8925        assert_eq!(array, &expected);
8926    }
8927
8928    #[test]
8929    fn scalar_timestamp_ns_utc_timezone() {
8930        let scalar = ScalarValue::TimestampNanosecond(
8931            Some(1599566400000000000),
8932            Some("UTC".into()),
8933        );
8934
8935        assert_eq!(
8936            scalar.data_type(),
8937            DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into()))
8938        );
8939
8940        let array = scalar.to_array().expect("Failed to convert to array");
8941        assert_eq!(array.len(), 1);
8942        assert_eq!(
8943            array.data_type(),
8944            &DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into()))
8945        );
8946
8947        let new_scalar = ScalarValue::try_from_array(&array, 0).unwrap();
8948        assert_eq!(
8949            new_scalar.data_type(),
8950            DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into()))
8951        );
8952    }
8953
8954    #[test]
8955    fn cast_round_trip() {
8956        check_scalar_cast(ScalarValue::Int8(Some(5)), DataType::Int16);
8957        check_scalar_cast(ScalarValue::Int8(None), DataType::Int16);
8958
8959        check_scalar_cast(ScalarValue::Float64(Some(5.5)), DataType::Int16);
8960
8961        check_scalar_cast(ScalarValue::Float64(None), DataType::Int16);
8962
8963        check_scalar_cast(
8964            ScalarValue::from("foo"),
8965            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
8966        );
8967
8968        check_scalar_cast(
8969            ScalarValue::Utf8(None),
8970            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
8971        );
8972
8973        check_scalar_cast(ScalarValue::Utf8(None), DataType::Utf8View);
8974        check_scalar_cast(ScalarValue::from("foo"), DataType::Utf8View);
8975        check_scalar_cast(
8976            ScalarValue::from("larger than 12 bytes string"),
8977            DataType::Utf8View,
8978        );
8979
8980        // Cases also covered by `try_cast_literal_to_type` in datafusion-expr-common
8981
8982        // identity casts (exercise the no-conversion fast path in `cast_to`)
8983        check_scalar_cast(ScalarValue::Int32(Some(5)), DataType::Int32);
8984        check_scalar_cast(ScalarValue::from("foo"), DataType::Utf8);
8985        check_scalar_cast(ScalarValue::Utf8(None), DataType::Utf8);
8986        check_scalar_cast(
8987            ScalarValue::Dictionary(
8988                Box::new(DataType::Int32),
8989                Box::new(ScalarValue::from("foo")),
8990            ),
8991            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
8992        );
8993
8994        // integer widening / narrowing (in range)
8995        check_scalar_cast(ScalarValue::Int32(Some(123)), DataType::Int64);
8996        check_scalar_cast(ScalarValue::Int64(Some(123)), DataType::Int32);
8997        check_scalar_cast(ScalarValue::UInt32(Some(123)), DataType::Int64);
8998        check_scalar_cast(ScalarValue::Int32(Some(123)), DataType::UInt64);
8999
9000        // integer <-> decimal
9001        check_scalar_cast(ScalarValue::Int32(Some(123)), DataType::Decimal128(10, 0));
9002        check_scalar_cast(ScalarValue::Decimal128(Some(123), 3, 0), DataType::Int64);
9003        // decimal rescale
9004        check_scalar_cast(
9005            ScalarValue::Decimal128(Some(12300), 5, 2),
9006            DataType::Decimal128(8, 5),
9007        );
9008
9009        // timestamp unit conversion
9010        check_scalar_cast(
9011            ScalarValue::TimestampNanosecond(Some(123456), None),
9012            DataType::Timestamp(TimeUnit::Microsecond, None),
9013        );
9014        // timestamp timezone conversion
9015        check_scalar_cast(
9016            ScalarValue::TimestampSecond(Some(12345), None),
9017            DataType::Timestamp(TimeUnit::Second, Some("+00:00".into())),
9018        );
9019        // int64 <-> timestamp
9020        check_scalar_cast(
9021            ScalarValue::Int64(Some(12345)),
9022            DataType::Timestamp(TimeUnit::Nanosecond, None),
9023        );
9024        check_scalar_cast(
9025            ScalarValue::TimestampSecond(Some(12345), Some("+00:00".into())),
9026            DataType::Int64,
9027        );
9028
9029        // additional string conversions
9030        check_scalar_cast(ScalarValue::from("foo"), DataType::LargeUtf8);
9031        check_scalar_cast(ScalarValue::LargeUtf8(Some("foo".into())), DataType::Utf8);
9032        check_scalar_cast(
9033            ScalarValue::LargeUtf8(Some("foo".into())),
9034            DataType::Utf8View,
9035        );
9036        check_scalar_cast(ScalarValue::Utf8View(Some("foo".into())), DataType::Utf8);
9037
9038        // dictionary unwrap
9039        check_scalar_cast(
9040            ScalarValue::Dictionary(
9041                Box::new(DataType::Int32),
9042                Box::new(ScalarValue::from("foo")),
9043            ),
9044            DataType::Utf8,
9045        );
9046
9047        // binary -> fixed size binary
9048        check_scalar_cast(
9049            ScalarValue::Binary(Some(vec![1, 2, 3])),
9050            DataType::FixedSizeBinary(3),
9051        );
9052
9053        check_scalar_cast(
9054            {
9055                let element_field =
9056                    Arc::new(Field::new("element", DataType::Int32, true));
9057
9058                let mut builder =
9059                    ListBuilder::new(Int32Builder::new()).with_field(element_field);
9060                builder.append_value([Some(1)]);
9061                builder.append(true);
9062
9063                ScalarValue::List(Arc::new(builder.finish()))
9064            },
9065            DataType::List(Arc::new(Field::new("element", DataType::Int64, true))),
9066        );
9067        check_scalar_cast(
9068            {
9069                let element_field =
9070                    Arc::new(Field::new("element", DataType::Int32, true));
9071
9072                let mut builder = FixedSizeListBuilder::new(Int32Builder::new(), 1)
9073                    .with_field(element_field);
9074                builder.values().append_value(1);
9075                builder.append(true);
9076
9077                ScalarValue::FixedSizeList(Arc::new(builder.finish()))
9078            },
9079            DataType::FixedSizeList(
9080                Arc::new(Field::new("element", DataType::Int64, true)),
9081                1,
9082            ),
9083        );
9084        check_scalar_cast(
9085            {
9086                let element_field =
9087                    Arc::new(Field::new("element", DataType::Int32, true));
9088
9089                let mut builder =
9090                    LargeListBuilder::new(Int32Builder::new()).with_field(element_field);
9091                builder.append_value([Some(1)]);
9092                builder.append(true);
9093
9094                ScalarValue::LargeList(Arc::new(builder.finish()))
9095            },
9096            DataType::LargeList(Arc::new(Field::new("element", DataType::Int64, true))),
9097        );
9098        check_scalar_cast(
9099            {
9100                let element_field =
9101                    Arc::new(Field::new("element", DataType::Int32, true));
9102
9103                let mut builder =
9104                    ListViewBuilder::new(Int32Builder::new()).with_field(element_field);
9105                builder.append_value([Some(1)]);
9106                builder.append(true);
9107
9108                ScalarValue::ListView(Arc::new(builder.finish()))
9109            },
9110            DataType::ListView(Arc::new(Field::new("element", DataType::Int64, true))),
9111        );
9112        check_scalar_cast(
9113            {
9114                let element_field =
9115                    Arc::new(Field::new("element", DataType::Int32, true));
9116
9117                let mut builder = LargeListViewBuilder::new(Int32Builder::new())
9118                    .with_field(element_field);
9119                builder.append_value([Some(1)]);
9120                builder.append(true);
9121
9122                ScalarValue::LargeListView(Arc::new(builder.finish()))
9123            },
9124            DataType::LargeListView(Arc::new(Field::new(
9125                "element",
9126                DataType::Int64,
9127                true,
9128            ))),
9129        );
9130    }
9131
9132    // mimics how casting work on scalar values by `casting` `scalar` to `desired_type`
9133    fn check_scalar_cast(scalar: ScalarValue, desired_type: DataType) {
9134        // convert from scalar --> Array to call cast
9135        let scalar_array = scalar.to_array().expect("Failed to convert to array");
9136        // cast the actual value
9137        let cast_array = kernels::cast::cast(&scalar_array, &desired_type).unwrap();
9138
9139        // turn it back to a scalar
9140        let cast_scalar = ScalarValue::try_from_array(&cast_array, 0).unwrap();
9141        assert_eq!(cast_scalar.data_type(), desired_type);
9142
9143        // `ScalarValue::cast_to` (which has array-free fast paths) must produce
9144        // exactly the same result as casting through the arrow kernel above.
9145        let cast_to_scalar = scalar
9146            .cast_to(&desired_type)
9147            .expect("Failed to cast_to scalar");
9148        assert_eq!(
9149            cast_to_scalar, cast_scalar,
9150            "cast_to({scalar:?} -> {desired_type:?}) disagreed with the arrow cast kernel"
9151        );
9152
9153        // Some time later the "cast" scalar is turned back into an array:
9154        let array = cast_scalar
9155            .to_array_of_size(10)
9156            .expect("Failed to convert to array of size");
9157
9158        // The datatype should be "Dictionary" but is actually Utf8!!!
9159        assert_eq!(array.data_type(), &desired_type)
9160    }
9161
9162    #[test]
9163    fn test_scalar_negative() -> Result<()> {
9164        // positive test
9165        let value = ScalarValue::Int32(Some(12));
9166        assert_eq!(ScalarValue::Int32(Some(-12)), value.arithmetic_negate()?);
9167        let value = ScalarValue::Int32(None);
9168        assert_eq!(ScalarValue::Int32(None), value.arithmetic_negate()?);
9169
9170        // negative test
9171        let value = ScalarValue::UInt8(Some(12));
9172        assert!(value.arithmetic_negate().is_err());
9173        let value = ScalarValue::Boolean(None);
9174        assert!(value.arithmetic_negate().is_err());
9175        Ok(())
9176    }
9177
9178    #[test]
9179    fn test_scalar_negative_overflows() -> Result<()> {
9180        macro_rules! test_overflow_on_value {
9181            ($($val:expr),* $(,)?) => {$(
9182                {
9183                    let value: ScalarValue = $val;
9184                    let err = value.arithmetic_negate().expect_err("Should receive overflow error on negating {value:?}");
9185                    let root_err = err.find_root();
9186                    match  root_err{
9187                        DataFusionError::ArrowError(err, _) if matches!(err.as_ref(), ArrowError::ArithmeticOverflow(_)) => {}
9188                        _ => return Err(err),
9189                    };
9190                }
9191            )*};
9192        }
9193        test_overflow_on_value!(
9194            // the integers
9195            i8::MIN.into(),
9196            i16::MIN.into(),
9197            i32::MIN.into(),
9198            i64::MIN.into(),
9199            // for decimals, only value needs to be tested
9200            ScalarValue::try_new_decimal128(i128::MIN, 10, 5)?,
9201            ScalarValue::Decimal256(Some(i256::MIN), 20, 5),
9202            // interval, check all possible values
9203            ScalarValue::IntervalYearMonth(Some(i32::MIN)),
9204            ScalarValue::new_interval_dt(i32::MIN, 999),
9205            ScalarValue::new_interval_dt(1, i32::MIN),
9206            ScalarValue::new_interval_mdn(i32::MIN, 15, 123_456),
9207            ScalarValue::new_interval_mdn(12, i32::MIN, 123_456),
9208            ScalarValue::new_interval_mdn(12, 15, i64::MIN),
9209            // tz doesn't matter when negating
9210            ScalarValue::TimestampSecond(Some(i64::MIN), None),
9211            ScalarValue::TimestampMillisecond(Some(i64::MIN), None),
9212            ScalarValue::TimestampMicrosecond(Some(i64::MIN), None),
9213            ScalarValue::TimestampNanosecond(Some(i64::MIN), None),
9214        );
9215
9216        let float_cases = [
9217            (
9218                ScalarValue::Float16(Some(f16::MIN)),
9219                ScalarValue::Float16(Some(f16::MAX)),
9220            ),
9221            (
9222                ScalarValue::Float16(Some(f16::MAX)),
9223                ScalarValue::Float16(Some(f16::MIN)),
9224            ),
9225            (f32::MIN.into(), f32::MAX.into()),
9226            (f32::MAX.into(), f32::MIN.into()),
9227            (f64::MIN.into(), f64::MAX.into()),
9228            (f64::MAX.into(), f64::MIN.into()),
9229        ];
9230        // skip float 16 because they aren't supported
9231        for (test, expected) in float_cases.into_iter().skip(2) {
9232            assert_eq!(test.arithmetic_negate()?, expected);
9233        }
9234        Ok(())
9235    }
9236
9237    #[test]
9238    fn f16_test_overflow() {
9239        // TODO: if negate supports f16, add these cases to `test_scalar_negative_overflows` test case
9240        let cases = [
9241            (
9242                ScalarValue::Float16(Some(f16::MIN)),
9243                ScalarValue::Float16(Some(f16::MAX)),
9244            ),
9245            (
9246                ScalarValue::Float16(Some(f16::MAX)),
9247                ScalarValue::Float16(Some(f16::MIN)),
9248            ),
9249        ];
9250
9251        for (test, expected) in cases {
9252            assert_eq!(test.arithmetic_negate().unwrap(), expected);
9253        }
9254    }
9255
9256    macro_rules! expect_operation_error {
9257        ($TEST_NAME:ident, $FUNCTION:ident, $EXPECTED_ERROR:expr) => {
9258            #[test]
9259            fn $TEST_NAME() {
9260                let lhs = ScalarValue::UInt64(Some(12));
9261                let rhs = ScalarValue::Int32(Some(-3));
9262                match lhs.$FUNCTION(&rhs) {
9263                    Ok(_result) => {
9264                        panic!(
9265                            "Expected binary operation error between lhs: '{:?}', rhs: {:?}",
9266                            lhs, rhs
9267                        );
9268                    }
9269                    Err(e) => {
9270                        let error_message = e.to_string();
9271                        assert!(
9272                            error_message.contains($EXPECTED_ERROR),
9273                            "Expected error '{}' not found in actual error '{}'",
9274                            $EXPECTED_ERROR,
9275                            error_message
9276                        );
9277                    }
9278                }
9279            }
9280        };
9281    }
9282
9283    expect_operation_error!(
9284        expect_add_error,
9285        add,
9286        "Invalid arithmetic operation: UInt64 + Int32"
9287    );
9288    expect_operation_error!(
9289        expect_sub_error,
9290        sub,
9291        "Invalid arithmetic operation: UInt64 - Int32"
9292    );
9293
9294    macro_rules! decimal_op_test_cases {
9295    ($OPERATION:ident, [$([$L_VALUE:expr, $L_PRECISION:expr, $L_SCALE:expr, $R_VALUE:expr, $R_PRECISION:expr, $R_SCALE:expr, $O_VALUE:expr, $O_PRECISION:expr, $O_SCALE:expr]),+]) => {
9296            $(
9297
9298                let left = ScalarValue::Decimal128($L_VALUE, $L_PRECISION, $L_SCALE);
9299                let right = ScalarValue::Decimal128($R_VALUE, $R_PRECISION, $R_SCALE);
9300                let result = left.$OPERATION(&right).unwrap();
9301                assert_eq!(ScalarValue::Decimal128($O_VALUE, $O_PRECISION, $O_SCALE), result);
9302
9303            )+
9304        };
9305    }
9306
9307    #[test]
9308    fn decimal_operations() {
9309        decimal_op_test_cases!(
9310            add,
9311            [
9312                [Some(123), 10, 2, Some(124), 10, 2, Some(123 + 124), 11, 2],
9313                // test sum decimal with diff scale
9314                [
9315                    Some(123),
9316                    10,
9317                    3,
9318                    Some(124),
9319                    10,
9320                    2,
9321                    Some(123 + 124 * 10_i128.pow(1)),
9322                    12,
9323                    3
9324                ],
9325                // diff precision and scale for decimal data type
9326                [
9327                    Some(123),
9328                    10,
9329                    2,
9330                    Some(124),
9331                    11,
9332                    3,
9333                    Some(123 * 10_i128.pow(3 - 2) + 124),
9334                    12,
9335                    3
9336                ]
9337            ]
9338        );
9339    }
9340
9341    #[test]
9342    fn decimal_operations_with_nulls() {
9343        decimal_op_test_cases!(
9344            add,
9345            [
9346                // Case: (None, Some, 0)
9347                [None, 10, 2, Some(123), 10, 2, None, 11, 2],
9348                // Case: (Some, None, 0)
9349                [Some(123), 10, 2, None, 10, 2, None, 11, 2],
9350                // Case: (Some, None, _) + Side=False
9351                [Some(123), 8, 2, None, 10, 3, None, 11, 3],
9352                // Case: (None, Some, _) + Side=False
9353                [None, 8, 2, Some(123), 10, 3, None, 11, 3],
9354                // Case: (Some, None, _) + Side=True
9355                [Some(123), 8, 4, None, 10, 3, None, 12, 4],
9356                // Case: (None, Some, _) + Side=True
9357                [None, 10, 3, Some(123), 8, 4, None, 12, 4]
9358            ]
9359        );
9360    }
9361
9362    #[test]
9363    fn test_scalar_distance() {
9364        let cases = [
9365            // scalar (lhs), scalar (rhs), expected distance
9366            // ---------------------------------------------
9367            (ScalarValue::Int8(Some(1)), ScalarValue::Int8(Some(2)), 1),
9368            (ScalarValue::Int8(Some(2)), ScalarValue::Int8(Some(1)), 1),
9369            (
9370                ScalarValue::Int16(Some(-5)),
9371                ScalarValue::Int16(Some(5)),
9372                10,
9373            ),
9374            (
9375                ScalarValue::Int16(Some(5)),
9376                ScalarValue::Int16(Some(-5)),
9377                10,
9378            ),
9379            (ScalarValue::Int32(Some(0)), ScalarValue::Int32(Some(0)), 0),
9380            (
9381                ScalarValue::Int32(Some(-5)),
9382                ScalarValue::Int32(Some(-10)),
9383                5,
9384            ),
9385            (
9386                ScalarValue::Int64(Some(-10)),
9387                ScalarValue::Int64(Some(-5)),
9388                5,
9389            ),
9390            (ScalarValue::UInt8(Some(1)), ScalarValue::UInt8(Some(2)), 1),
9391            (ScalarValue::UInt8(Some(0)), ScalarValue::UInt8(Some(0)), 0),
9392            (
9393                ScalarValue::UInt16(Some(5)),
9394                ScalarValue::UInt16(Some(10)),
9395                5,
9396            ),
9397            (
9398                ScalarValue::UInt32(Some(10)),
9399                ScalarValue::UInt32(Some(5)),
9400                5,
9401            ),
9402            (
9403                ScalarValue::UInt64(Some(5)),
9404                ScalarValue::UInt64(Some(10)),
9405                5,
9406            ),
9407            (
9408                ScalarValue::Float16(Some(f16::from_f32(1.1))),
9409                ScalarValue::Float16(Some(f16::from_f32(1.9))),
9410                1,
9411            ),
9412            (
9413                ScalarValue::Float16(Some(f16::from_f32(-5.3))),
9414                ScalarValue::Float16(Some(f16::from_f32(-9.2))),
9415                4,
9416            ),
9417            (
9418                ScalarValue::Float16(Some(f16::from_f32(-5.3))),
9419                ScalarValue::Float16(Some(f16::from_f32(-9.7))),
9420                4,
9421            ),
9422            (
9423                ScalarValue::Float32(Some(1.0)),
9424                ScalarValue::Float32(Some(2.0)),
9425                1,
9426            ),
9427            (
9428                ScalarValue::Float32(Some(2.0)),
9429                ScalarValue::Float32(Some(1.0)),
9430                1,
9431            ),
9432            (
9433                ScalarValue::Float64(Some(0.0)),
9434                ScalarValue::Float64(Some(0.0)),
9435                0,
9436            ),
9437            (
9438                ScalarValue::Float64(Some(-5.0)),
9439                ScalarValue::Float64(Some(-10.0)),
9440                5,
9441            ),
9442            (
9443                ScalarValue::Float64(Some(-10.0)),
9444                ScalarValue::Float64(Some(-5.0)),
9445                5,
9446            ),
9447            // Floats are currently special cased to f64/f32 and the result is rounded
9448            // rather than ceiled/floored. In the future we might want to take a mode
9449            // which specified the rounding behavior.
9450            (
9451                ScalarValue::Float32(Some(1.2)),
9452                ScalarValue::Float32(Some(1.3)),
9453                0,
9454            ),
9455            (
9456                ScalarValue::Float32(Some(1.1)),
9457                ScalarValue::Float32(Some(1.9)),
9458                1,
9459            ),
9460            (
9461                ScalarValue::Float64(Some(-5.3)),
9462                ScalarValue::Float64(Some(-9.2)),
9463                4,
9464            ),
9465            (
9466                ScalarValue::Float64(Some(-5.3)),
9467                ScalarValue::Float64(Some(-9.7)),
9468                4,
9469            ),
9470            (
9471                ScalarValue::Float64(Some(-5.3)),
9472                ScalarValue::Float64(Some(-9.9)),
9473                5,
9474            ),
9475            (
9476                ScalarValue::Decimal128(Some(10), 1, 0),
9477                ScalarValue::Decimal128(Some(5), 1, 0),
9478                5,
9479            ),
9480            (
9481                ScalarValue::Decimal128(Some(5), 1, 0),
9482                ScalarValue::Decimal128(Some(10), 1, 0),
9483                5,
9484            ),
9485            (
9486                ScalarValue::Decimal256(Some(10.into()), 1, 0),
9487                ScalarValue::Decimal256(Some(5.into()), 1, 0),
9488                5,
9489            ),
9490            (
9491                ScalarValue::Decimal256(Some(5.into()), 1, 0),
9492                ScalarValue::Decimal256(Some(10.into()), 1, 0),
9493                5,
9494            ),
9495            // Temporal types
9496            (
9497                ScalarValue::Date32(Some(0)),
9498                ScalarValue::Date32(Some(10)),
9499                10,
9500            ),
9501            (
9502                ScalarValue::Date32(Some(10)),
9503                ScalarValue::Date32(Some(0)),
9504                10,
9505            ),
9506            (
9507                ScalarValue::Date64(Some(1000)),
9508                ScalarValue::Date64(Some(5000)),
9509                4000,
9510            ),
9511            (
9512                ScalarValue::TimestampSecond(Some(100), None),
9513                ScalarValue::TimestampSecond(Some(200), None),
9514                100,
9515            ),
9516            (
9517                ScalarValue::TimestampMillisecond(Some(1000), None),
9518                ScalarValue::TimestampMillisecond(Some(5000), None),
9519                4000,
9520            ),
9521            (
9522                ScalarValue::TimestampMicrosecond(Some(0), None),
9523                ScalarValue::TimestampMicrosecond(Some(1_000_000), None),
9524                1_000_000,
9525            ),
9526            (
9527                ScalarValue::TimestampNanosecond(Some(1_000_000_000), None),
9528                ScalarValue::TimestampNanosecond(Some(2_000_000_000), None),
9529                1_000_000_000,
9530            ),
9531        ];
9532        for (lhs, rhs, expected) in cases.iter() {
9533            let distance = lhs.distance_u64(rhs).unwrap();
9534            assert_eq!(distance, *expected as u64);
9535        }
9536    }
9537
9538    #[test]
9539    fn test_distance_none() {
9540        let cases = [
9541            (
9542                ScalarValue::Decimal128(Some(i128::MAX), DECIMAL128_MAX_PRECISION, 0),
9543                ScalarValue::Decimal128(Some(-i128::MAX), DECIMAL128_MAX_PRECISION, 0),
9544            ),
9545            (
9546                ScalarValue::Decimal256(Some(i256::MAX), DECIMAL256_MAX_PRECISION, 0),
9547                ScalarValue::Decimal256(Some(-i256::MAX), DECIMAL256_MAX_PRECISION, 0),
9548            ),
9549        ];
9550        for (lhs, rhs) in cases.iter() {
9551            let distance = lhs.distance_u64(rhs);
9552            assert!(distance.is_none(), "{lhs} vs {rhs}");
9553        }
9554    }
9555
9556    #[test]
9557    fn test_scalar_distance_invalid() {
9558        let cases = [
9559            // scalar (lhs), scalar (rhs)
9560            // --------------------------
9561            // Same type but with nulls
9562            (ScalarValue::Int8(None), ScalarValue::Int8(None)),
9563            (ScalarValue::Int8(None), ScalarValue::Int8(Some(1))),
9564            (ScalarValue::Int8(Some(1)), ScalarValue::Int8(None)),
9565            // Different type
9566            (ScalarValue::Int8(Some(1)), ScalarValue::Int16(Some(1))),
9567            (ScalarValue::Int8(Some(1)), ScalarValue::Float32(Some(1.0))),
9568            (
9569                ScalarValue::Float16(Some(f16::from_f32(1.0))),
9570                ScalarValue::Float32(Some(1.0)),
9571            ),
9572            (
9573                ScalarValue::Float16(Some(f16::from_f32(1.0))),
9574                ScalarValue::Int32(Some(1)),
9575            ),
9576            (
9577                ScalarValue::Float64(Some(1.1)),
9578                ScalarValue::Float32(Some(2.2)),
9579            ),
9580            (
9581                ScalarValue::UInt64(Some(777)),
9582                ScalarValue::Int32(Some(111)),
9583            ),
9584            // Different types with nulls
9585            (ScalarValue::Int8(None), ScalarValue::Int16(Some(1))),
9586            (ScalarValue::Int8(Some(1)), ScalarValue::Int16(None)),
9587            // Unsupported types
9588            (ScalarValue::from("foo"), ScalarValue::from("bar")),
9589            (
9590                ScalarValue::Boolean(Some(true)),
9591                ScalarValue::Boolean(Some(false)),
9592            ),
9593            (
9594                ScalarValue::Decimal128(Some(123), 5, 5),
9595                ScalarValue::Decimal128(Some(120), 5, 3),
9596            ),
9597            (
9598                ScalarValue::Decimal256(Some(123.into()), 5, 5),
9599                ScalarValue::Decimal256(Some(120.into()), 5, 3),
9600            ),
9601            // Distance 2 * 2^50 is larger than usize
9602            (
9603                ScalarValue::Decimal256(
9604                    Some(i256::from_parts(0, 2_i64.pow(50).into())),
9605                    1,
9606                    0,
9607                ),
9608                ScalarValue::Decimal256(
9609                    Some(i256::from_parts(0, (-(2_i64).pow(50)).into())),
9610                    1,
9611                    0,
9612                ),
9613            ),
9614            // Distance overflow
9615            (
9616                ScalarValue::Decimal256(Some(i256::from_parts(0, i128::MAX)), 1, 0),
9617                ScalarValue::Decimal256(Some(i256::from_parts(0, -i128::MAX)), 1, 0),
9618            ),
9619        ];
9620        for (lhs, rhs) in cases {
9621            let distance = lhs.distance_u64(&rhs);
9622            assert!(distance.is_none());
9623        }
9624    }
9625
9626    #[test]
9627    fn test_scalar_distance_u64_boundaries() {
9628        // 1. Full-domain integer ranges
9629        // i64::MIN to i64::MAX -> distance is u64::MAX
9630        let lhs = ScalarValue::Int64(Some(i64::MIN));
9631        let rhs = ScalarValue::Int64(Some(i64::MAX));
9632        assert_eq!(lhs.distance_u64(&rhs), Some(u64::MAX));
9633        assert_eq!(rhs.distance_u64(&lhs), Some(u64::MAX));
9634
9635        // u64::MIN to u64::MAX -> distance is u64::MAX
9636        let lhs = ScalarValue::UInt64(Some(u64::MIN));
9637        let rhs = ScalarValue::UInt64(Some(u64::MAX));
9638        assert_eq!(lhs.distance_u64(&rhs), Some(u64::MAX));
9639        assert_eq!(rhs.distance_u64(&lhs), Some(u64::MAX));
9640
9641        // 2. Decimal128 overflow edges (around u64::MAX)
9642        // distance equal to u64::MAX fits
9643        let lhs = ScalarValue::Decimal128(Some(0), 20, 0);
9644        let rhs = ScalarValue::Decimal128(Some(u64::MAX as i128), 20, 0);
9645        assert_eq!(lhs.distance_u64(&rhs), Some(u64::MAX));
9646
9647        // distance greater than u64::MAX overflows
9648        let lhs = ScalarValue::Decimal128(Some(0), 20, 0);
9649        let rhs = ScalarValue::Decimal128(Some(u64::MAX as i128 + 1), 20, 0);
9650        assert_eq!(lhs.distance_u64(&rhs), None);
9651
9652        // 3. Decimal256 overflow edges (around u64::MAX)
9653        // distance equal to u64::MAX fits
9654        let lhs = ScalarValue::Decimal256(Some(i256::from_parts(0, 0)), 20, 0);
9655        let rhs =
9656            ScalarValue::Decimal256(Some(i256::from_parts(u64::MAX as u128, 0)), 20, 0);
9657        assert_eq!(lhs.distance_u64(&rhs), Some(u64::MAX));
9658
9659        // distance greater than u64::MAX overflows
9660        let lhs = ScalarValue::Decimal256(Some(i256::from_parts(0, 0)), 20, 0);
9661        let rhs = ScalarValue::Decimal256(
9662            Some(i256::from_parts(u64::MAX as u128 + 1, 0)),
9663            20,
9664            0,
9665        );
9666        assert_eq!(lhs.distance_u64(&rhs), None);
9667
9668        // 4. Float64 overflow edges (around u64::MAX)
9669        let lhs = ScalarValue::Float64(Some(0.0));
9670        let val: f64 = 18446744073709500000.0;
9671        let rhs = ScalarValue::Float64(Some(val));
9672        assert_eq!(lhs.distance_u64(&rhs), Some(18446744073709500416));
9673
9674        // float value > u64::MAX overflows
9675        let rhs = ScalarValue::Float64(Some(1.9e19));
9676        assert_eq!(lhs.distance_u64(&rhs), None);
9677
9678        // exact 2^64 boundary (18446744073709551616.0) is greater than u64::MAX, so it should return None
9679        let exact_2_64_f64 = ScalarValue::Float64(Some(18446744073709551616.0));
9680        assert_eq!(lhs.distance_u64(&exact_2_64_f64), None);
9681
9682        // exact 2^64 boundary as Float32 should also return None
9683        let lhs_f32 = ScalarValue::Float32(Some(0.0));
9684        let exact_2_64_f32 = ScalarValue::Float32(Some(18446744073709551616.0));
9685        assert_eq!(lhs_f32.distance_u64(&exact_2_64_f32), None);
9686
9687        // largest float32 value below 2^64 (2^64 - 2^41 = 18446741874686296064.0) should fit
9688        let below_2_64_f32 = ScalarValue::Float32(Some(18446741874686296064.0));
9689        assert_eq!(
9690            lhs_f32.distance_u64(&below_2_64_f32),
9691            Some(18446741874686296064)
9692        );
9693
9694        // Inf, NegInf, NaN
9695        let inf = ScalarValue::Float64(Some(f64::INFINITY));
9696        let neg_inf = ScalarValue::Float64(Some(f64::NEG_INFINITY));
9697        let nan = ScalarValue::Float64(Some(f64::NAN));
9698        assert_eq!(lhs.distance_u64(&inf), None);
9699        assert_eq!(lhs.distance_u64(&neg_inf), None);
9700        assert_eq!(lhs.distance_u64(&nan), None);
9701
9702        let inf_f32 = ScalarValue::Float32(Some(f32::INFINITY));
9703        let neg_inf_f32 = ScalarValue::Float32(Some(f32::NEG_INFINITY));
9704        let nan_f32 = ScalarValue::Float32(Some(f32::NAN));
9705        assert_eq!(lhs_f32.distance_u64(&inf_f32), None);
9706        assert_eq!(lhs_f32.distance_u64(&neg_inf_f32), None);
9707        assert_eq!(lhs_f32.distance_u64(&nan_f32), None);
9708
9709        let lhs_f16 = ScalarValue::Float16(Some(f16::ZERO));
9710        let inf_f16 = ScalarValue::Float16(Some(f16::INFINITY));
9711        let neg_inf_f16 = ScalarValue::Float16(Some(f16::NEG_INFINITY));
9712        let nan_f16 = ScalarValue::Float16(Some(f16::NAN));
9713        assert_eq!(lhs_f16.distance_u64(&inf_f16), None);
9714        assert_eq!(lhs_f16.distance_u64(&neg_inf_f16), None);
9715        assert_eq!(lhs_f16.distance_u64(&nan_f16), None);
9716
9717        // 5. Date and Timestamp boundaries
9718        // Date32: i32::MIN to i32::MAX
9719        let lhs = ScalarValue::Date32(Some(i32::MIN));
9720        let rhs = ScalarValue::Date32(Some(i32::MAX));
9721        assert_eq!(lhs.distance_u64(&rhs), Some(u32::MAX as u64));
9722
9723        // TimestampSecond: i64::MIN to i64::MAX
9724        let lhs = ScalarValue::TimestampSecond(Some(i64::MIN), None);
9725        let rhs = ScalarValue::TimestampSecond(Some(i64::MAX), None);
9726        assert_eq!(lhs.distance_u64(&rhs), Some(u64::MAX));
9727
9728        // 6. Decimal scale matching (ignoring precision)
9729        let lhs = ScalarValue::Decimal128(Some(100), 10, 2);
9730        let rhs = ScalarValue::Decimal128(Some(150), 15, 2);
9731        assert_eq!(lhs.distance_u64(&rhs), Some(50));
9732        assert_eq!(rhs.distance_u64(&lhs), Some(50));
9733
9734        let lhs = ScalarValue::Decimal128(Some(100), 10, 2);
9735        let rhs = ScalarValue::Decimal128(Some(150), 10, 3);
9736        assert_eq!(lhs.distance_u64(&rhs), None);
9737    }
9738
9739    #[test]
9740    fn test_scalar_interval_negate() {
9741        let cases = [
9742            (
9743                ScalarValue::new_interval_ym(1, 12),
9744                ScalarValue::new_interval_ym(-1, -12),
9745            ),
9746            (
9747                ScalarValue::new_interval_dt(1, 999),
9748                ScalarValue::new_interval_dt(-1, -999),
9749            ),
9750            (
9751                ScalarValue::new_interval_mdn(12, 15, 123_456),
9752                ScalarValue::new_interval_mdn(-12, -15, -123_456),
9753            ),
9754        ];
9755        for (expr, expected) in cases.iter() {
9756            let result = expr.arithmetic_negate().unwrap();
9757            assert_eq!(*expected, result, "-expr:{expr:?}");
9758        }
9759    }
9760
9761    #[test]
9762    fn test_scalar_interval_add() {
9763        let cases = [
9764            (
9765                ScalarValue::new_interval_ym(1, 12),
9766                ScalarValue::new_interval_ym(1, 12),
9767                ScalarValue::new_interval_ym(2, 24),
9768            ),
9769            (
9770                ScalarValue::new_interval_dt(1, 999),
9771                ScalarValue::new_interval_dt(1, 999),
9772                ScalarValue::new_interval_dt(2, 1998),
9773            ),
9774            (
9775                ScalarValue::new_interval_mdn(12, 15, 123_456),
9776                ScalarValue::new_interval_mdn(12, 15, 123_456),
9777                ScalarValue::new_interval_mdn(24, 30, 246_912),
9778            ),
9779        ];
9780        for (lhs, rhs, expected) in cases.iter() {
9781            let result = lhs.add(rhs).unwrap();
9782            let result_commute = rhs.add(lhs).unwrap();
9783            assert_eq!(*expected, result, "lhs:{lhs:?} + rhs:{rhs:?}");
9784            assert_eq!(*expected, result_commute, "lhs:{rhs:?} + rhs:{lhs:?}");
9785        }
9786    }
9787
9788    #[test]
9789    fn test_scalar_interval_sub() {
9790        let cases = [
9791            (
9792                ScalarValue::new_interval_ym(1, 12),
9793                ScalarValue::new_interval_ym(1, 12),
9794                ScalarValue::new_interval_ym(0, 0),
9795            ),
9796            (
9797                ScalarValue::new_interval_dt(1, 999),
9798                ScalarValue::new_interval_dt(1, 999),
9799                ScalarValue::new_interval_dt(0, 0),
9800            ),
9801            (
9802                ScalarValue::new_interval_mdn(12, 15, 123_456),
9803                ScalarValue::new_interval_mdn(12, 15, 123_456),
9804                ScalarValue::new_interval_mdn(0, 0, 0),
9805            ),
9806        ];
9807        for (lhs, rhs, expected) in cases.iter() {
9808            let result = lhs.sub(rhs).unwrap();
9809            assert_eq!(*expected, result, "lhs:{lhs:?} - rhs:{rhs:?}");
9810        }
9811    }
9812
9813    #[test]
9814    fn timestamp_op_random_tests() {
9815        // timestamp1 + (or -) interval = timestamp2
9816        // timestamp2 - timestamp1 (or timestamp1 - timestamp2) = interval ?
9817        let sample_size = 1000;
9818        let timestamps1 = get_random_timestamps(sample_size);
9819        let intervals = get_random_intervals(sample_size);
9820        // ts(sec) + interval(ns) = ts(sec); however,
9821        // ts(sec) - ts(sec) cannot be = interval(ns). Therefore,
9822        // timestamps are more precise than intervals in tests.
9823        for (idx, ts1) in timestamps1.iter().enumerate() {
9824            if idx % 2 == 0 {
9825                let timestamp2 = ts1.add(intervals[idx].clone()).unwrap();
9826                let back = timestamp2.sub(intervals[idx].clone()).unwrap();
9827                assert_eq!(ts1, &back);
9828            } else {
9829                let timestamp2 = ts1.sub(intervals[idx].clone()).unwrap();
9830                let back = timestamp2.add(intervals[idx].clone()).unwrap();
9831                assert_eq!(ts1, &back);
9832            };
9833        }
9834    }
9835
9836    #[test]
9837    fn test_struct_nulls() {
9838        let fields_b = Fields::from(vec![
9839            Field::new("ba", DataType::UInt64, true),
9840            Field::new("bb", DataType::UInt64, true),
9841        ]);
9842        let fields = Fields::from(vec![
9843            Field::new("a", DataType::UInt64, true),
9844            Field::new("b", DataType::Struct(fields_b.clone()), true),
9845        ]);
9846
9847        let struct_value = vec![
9848            (
9849                Arc::clone(&fields[0]),
9850                Arc::new(UInt64Array::from(vec![Some(1)])) as ArrayRef,
9851            ),
9852            (
9853                Arc::clone(&fields[1]),
9854                Arc::new(StructArray::from(vec![
9855                    (
9856                        Arc::clone(&fields_b[0]),
9857                        Arc::new(UInt64Array::from(vec![Some(2)])) as ArrayRef,
9858                    ),
9859                    (
9860                        Arc::clone(&fields_b[1]),
9861                        Arc::new(UInt64Array::from(vec![Some(3)])) as ArrayRef,
9862                    ),
9863                ])) as ArrayRef,
9864            ),
9865        ];
9866
9867        let struct_value_with_nulls = vec![
9868            (
9869                Arc::clone(&fields[0]),
9870                Arc::new(UInt64Array::from(vec![Some(1)])) as ArrayRef,
9871            ),
9872            (
9873                Arc::clone(&fields[1]),
9874                Arc::new(StructArray::from((
9875                    vec![
9876                        (
9877                            Arc::clone(&fields_b[0]),
9878                            Arc::new(UInt64Array::from(vec![Some(2)])) as ArrayRef,
9879                        ),
9880                        (
9881                            Arc::clone(&fields_b[1]),
9882                            Arc::new(UInt64Array::from(vec![Some(3)])) as ArrayRef,
9883                        ),
9884                    ],
9885                    Buffer::from(&[0]),
9886                ))) as ArrayRef,
9887            ),
9888        ];
9889
9890        let scalars = vec![
9891            // all null
9892            ScalarValue::Struct(Arc::new(StructArray::from((
9893                struct_value.clone(),
9894                Buffer::from(&[0]),
9895            )))),
9896            // field 1 valid, field 2 null
9897            ScalarValue::Struct(Arc::new(StructArray::from((
9898                struct_value_with_nulls.clone(),
9899                Buffer::from(&[1]),
9900            )))),
9901            // all valid
9902            ScalarValue::Struct(Arc::new(StructArray::from((
9903                struct_value.clone(),
9904                Buffer::from(&[1]),
9905            )))),
9906        ];
9907
9908        let check_array = |array: Arc<dyn Array>| {
9909            let is_null = is_null(&array).unwrap();
9910            assert_eq!(is_null, BooleanArray::from(vec![true, false, false]));
9911
9912            let formatted = pretty_format_columns("col", &[array]).unwrap().to_string();
9913            let formatted = formatted.split('\n').collect::<Vec<_>>();
9914            let expected = vec![
9915                "+---------------------------+",
9916                "| col                       |",
9917                "+---------------------------+",
9918                "|                           |",
9919                "| {a: 1, b: }               |",
9920                "| {a: 1, b: {ba: 2, bb: 3}} |",
9921                "+---------------------------+",
9922            ];
9923            assert_eq!(
9924                formatted, expected,
9925                "Actual:\n{formatted:#?}\n\nExpected:\n{expected:#?}"
9926            );
9927        };
9928
9929        // test `ScalarValue::iter_to_array`
9930        let array = ScalarValue::iter_to_array(scalars.clone()).unwrap();
9931        check_array(array);
9932
9933        // test `ScalarValue::to_array` / `ScalarValue::to_array_of_size`
9934        let arrays = scalars
9935            .iter()
9936            .map(ScalarValue::to_array)
9937            .collect::<Result<Vec<_>>>()
9938            .expect("Failed to convert to array");
9939        let arrays = arrays.iter().map(|a| a.as_ref()).collect::<Vec<_>>();
9940        let array = arrow::compute::concat(&arrays).unwrap();
9941        check_array(array);
9942    }
9943
9944    #[test]
9945    fn test_struct_display() {
9946        let field_a = Field::new("a", DataType::Int32, true);
9947        let field_b = Field::new("b", DataType::Utf8, true);
9948
9949        let s = ScalarStructBuilder::new()
9950            .with_scalar(field_a, ScalarValue::from(1i32))
9951            .with_scalar(field_b, ScalarValue::Utf8(None))
9952            .build()
9953            .unwrap();
9954
9955        assert_eq!(s.to_string(), "{a:1,b:}");
9956        assert_eq!(format!("{s:?}"), r#"Struct({a:1,b:})"#);
9957
9958        let ScalarValue::Struct(arr) = s else {
9959            panic!("Expected struct");
9960        };
9961
9962        //verify compared to arrow display
9963        let batch = RecordBatch::try_from_iter(vec![("s", arr as _)]).unwrap();
9964        assert_snapshot!(batches_to_string(&[batch]), @r"
9965        +-------------+
9966        | s           |
9967        +-------------+
9968        | {a: 1, b: } |
9969        +-------------+
9970        ");
9971    }
9972
9973    #[test]
9974    fn test_list_view_display() {
9975        let s = ScalarValue::ListView(
9976            ListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![Some(vec![
9977                Some(1),
9978                None,
9979                Some(3),
9980            ])])
9981            .into(),
9982        );
9983
9984        assert_eq!(s.to_string(), "[1, , 3]");
9985        assert_eq!(format!("{s:?}"), "ListView([1, , 3])");
9986    }
9987
9988    #[test]
9989    fn test_null_bug() {
9990        let field_a = Field::new("a", DataType::Int32, true);
9991        let field_b = Field::new("b", DataType::Int32, true);
9992        let fields = Fields::from(vec![field_a, field_b]);
9993
9994        let array_a = Arc::new(Int32Array::from_iter_values([1]));
9995        let array_b = Arc::new(Int32Array::from_iter_values([2]));
9996        let arrays: Vec<ArrayRef> = vec![array_a, array_b];
9997
9998        let mut not_nulls = NullBufferBuilder::new(1);
9999
10000        not_nulls.append_non_null();
10001
10002        let ar = StructArray::new(fields, arrays, not_nulls.finish());
10003        let s = ScalarValue::Struct(Arc::new(ar));
10004
10005        assert_eq!(s.to_string(), "{a:1,b:2}");
10006        assert_eq!(format!("{s:?}"), r#"Struct({a:1,b:2})"#);
10007
10008        let ScalarValue::Struct(arr) = s else {
10009            panic!("Expected struct");
10010        };
10011
10012        //verify compared to arrow display
10013        let batch = RecordBatch::try_from_iter(vec![("s", arr as _)]).unwrap();
10014        assert_snapshot!(batches_to_string(&[batch]), @r"
10015        +--------------+
10016        | s            |
10017        +--------------+
10018        | {a: 1, b: 2} |
10019        +--------------+
10020        ");
10021    }
10022
10023    #[test]
10024    fn test_display_date64_large_values() {
10025        assert_eq!(
10026            format!("{}", ScalarValue::Date64(Some(790179464505))),
10027            "1995-01-15"
10028        );
10029        // This used to panic, see https://github.com/apache/arrow-rs/issues/7728
10030        assert_eq!(
10031            format!("{}", ScalarValue::Date64(Some(-790179464505600000))),
10032            ""
10033        );
10034    }
10035
10036    #[test]
10037    fn test_decimal_display_and_debug() {
10038        let decimal32 = ScalarValue::Decimal32(Some(123), 3, 2);
10039        assert_eq!(decimal32.to_string(), "1.23");
10040        assert_eq!(format!("{decimal32:?}"), "Decimal32(1.23,3,2)");
10041
10042        let decimal64 = ScalarValue::Decimal64(Some(-12345), 5, 3);
10043        assert_eq!(decimal64.to_string(), "-12.345");
10044        assert_eq!(format!("{decimal64:?}"), "Decimal64(-12.345,5,3)");
10045
10046        let decimal128 = ScalarValue::Decimal128(Some(1), 1, 1);
10047        assert_eq!(decimal128.to_string(), "0.1");
10048        assert_eq!(format!("{decimal128:?}"), "Decimal128(0.1,1,1)");
10049
10050        let decimal128_trailing_zero = ScalarValue::Decimal128(Some(120), 3, 2);
10051        assert_eq!(decimal128_trailing_zero.to_string(), "1.20");
10052        assert_eq!(
10053            format!("{decimal128_trailing_zero:?}"),
10054            "Decimal128(1.20,3,2)"
10055        );
10056
10057        let decimal256 = ScalarValue::Decimal256(Some(i256::from(100123)), 28, 3);
10058        assert_eq!(decimal256.to_string(), "100.123");
10059        assert_eq!(format!("{decimal256:?}"), "Decimal256(100.123,28,3)");
10060
10061        let null_decimal = ScalarValue::Decimal128(None, 10, 2);
10062        assert_eq!(null_decimal.to_string(), "NULL");
10063        assert_eq!(format!("{null_decimal:?}"), "Decimal128(NULL,10,2)");
10064    }
10065
10066    #[test]
10067    fn test_struct_display_null() {
10068        let fields = vec![Field::new("a", DataType::Int32, false)];
10069        let s = ScalarStructBuilder::new_null(fields);
10070        assert_eq!(s.to_string(), "NULL");
10071
10072        let ScalarValue::Struct(arr) = s else {
10073            panic!("Expected struct");
10074        };
10075
10076        //verify compared to arrow display
10077        let batch = RecordBatch::try_from_iter(vec![("s", arr as _)]).unwrap();
10078
10079        assert_snapshot!(batches_to_string(&[batch]), @r"
10080        +---+
10081        | s |
10082        +---+
10083        |   |
10084        +---+
10085        ");
10086    }
10087
10088    #[test]
10089    fn test_map_display_and_debug() {
10090        let string_builder = StringBuilder::new();
10091        let int_builder = Int32Builder::with_capacity(4);
10092        let mut builder = MapBuilder::new(None, string_builder, int_builder);
10093        builder.keys().append_value("joe");
10094        builder.values().append_value(1);
10095        builder.append(true).unwrap();
10096
10097        builder.keys().append_value("blogs");
10098        builder.values().append_value(2);
10099        builder.keys().append_value("foo");
10100        builder.values().append_value(4);
10101        builder.append(true).unwrap();
10102        builder.append(true).unwrap();
10103        builder.append(false).unwrap();
10104
10105        let map_value = ScalarValue::Map(Arc::new(builder.finish()));
10106
10107        assert_eq!(map_value.to_string(), "[{joe:1},{blogs:2,foo:4},{},NULL]");
10108        assert_eq!(
10109            format!("{map_value:?}"),
10110            r#"Map([{"joe":"1"},{"blogs":"2","foo":"4"},{},NULL])"#
10111        );
10112
10113        let ScalarValue::Map(arr) = map_value else {
10114            panic!("Expected map");
10115        };
10116
10117        //verify compared to arrow display
10118        let batch = RecordBatch::try_from_iter(vec![("m", arr as _)]).unwrap();
10119        assert_snapshot!(batches_to_string(&[batch]), @r"
10120        +--------------------+
10121        | m                  |
10122        +--------------------+
10123        | {joe: 1}           |
10124        | {blogs: 2, foo: 4} |
10125        | {}                 |
10126        |                    |
10127        +--------------------+
10128        ");
10129    }
10130
10131    #[test]
10132    fn test_binary_display() {
10133        let no_binary_value = ScalarValue::Binary(None);
10134        assert_eq!(format!("{no_binary_value}"), "NULL");
10135        let single_binary_value = ScalarValue::Binary(Some(vec![42u8]));
10136        assert_eq!(format!("{single_binary_value}"), "2A");
10137        let small_binary_value = ScalarValue::Binary(Some(vec![1u8, 2, 3]));
10138        assert_eq!(format!("{small_binary_value}"), "010203");
10139        let large_binary_value =
10140            ScalarValue::Binary(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10141        assert_eq!(format!("{large_binary_value}"), "0102030405060708090A...");
10142
10143        let no_binary_value = ScalarValue::BinaryView(None);
10144        assert_eq!(format!("{no_binary_value}"), "NULL");
10145        let small_binary_value = ScalarValue::BinaryView(Some(vec![1u8, 2, 3]));
10146        assert_eq!(format!("{small_binary_value}"), "010203");
10147        let large_binary_value =
10148            ScalarValue::BinaryView(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10149        assert_eq!(format!("{large_binary_value}"), "0102030405060708090A...");
10150
10151        let no_binary_value = ScalarValue::LargeBinary(None);
10152        assert_eq!(format!("{no_binary_value}"), "NULL");
10153        let small_binary_value = ScalarValue::LargeBinary(Some(vec![1u8, 2, 3]));
10154        assert_eq!(format!("{small_binary_value}"), "010203");
10155        let large_binary_value =
10156            ScalarValue::LargeBinary(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10157        assert_eq!(format!("{large_binary_value}"), "0102030405060708090A...");
10158
10159        let no_binary_value = ScalarValue::FixedSizeBinary(3, None);
10160        assert_eq!(format!("{no_binary_value}"), "NULL");
10161        let small_binary_value = ScalarValue::FixedSizeBinary(3, Some(vec![1u8, 2, 3]));
10162        assert_eq!(format!("{small_binary_value}"), "010203");
10163        let large_binary_value = ScalarValue::FixedSizeBinary(
10164            11,
10165            Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
10166        );
10167        assert_eq!(format!("{large_binary_value}"), "0102030405060708090A...");
10168    }
10169
10170    #[test]
10171    fn test_binary_debug() {
10172        let no_binary_value = ScalarValue::Binary(None);
10173        assert_eq!(format!("{no_binary_value:?}"), "Binary(NULL)");
10174        let single_binary_value = ScalarValue::Binary(Some(vec![42u8]));
10175        assert_eq!(format!("{single_binary_value:?}"), "Binary(\"42\")");
10176        let small_binary_value = ScalarValue::Binary(Some(vec![1u8, 2, 3]));
10177        assert_eq!(format!("{small_binary_value:?}"), "Binary(\"1,2,3\")");
10178        let large_binary_value =
10179            ScalarValue::Binary(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10180        assert_eq!(
10181            format!("{large_binary_value:?}"),
10182            "Binary(\"1,2,3,4,5,6,7,8,9,10,11\")"
10183        );
10184
10185        let no_binary_value = ScalarValue::BinaryView(None);
10186        assert_eq!(format!("{no_binary_value:?}"), "BinaryView(NULL)");
10187        let small_binary_value = ScalarValue::BinaryView(Some(vec![1u8, 2, 3]));
10188        assert_eq!(format!("{small_binary_value:?}"), "BinaryView(\"1,2,3\")");
10189        let large_binary_value =
10190            ScalarValue::BinaryView(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10191        assert_eq!(
10192            format!("{large_binary_value:?}"),
10193            "BinaryView(\"1,2,3,4,5,6,7,8,9,10,11\")"
10194        );
10195
10196        let no_binary_value = ScalarValue::LargeBinary(None);
10197        assert_eq!(format!("{no_binary_value:?}"), "LargeBinary(NULL)");
10198        let small_binary_value = ScalarValue::LargeBinary(Some(vec![1u8, 2, 3]));
10199        assert_eq!(format!("{small_binary_value:?}"), "LargeBinary(\"1,2,3\")");
10200        let large_binary_value =
10201            ScalarValue::LargeBinary(Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
10202        assert_eq!(
10203            format!("{large_binary_value:?}"),
10204            "LargeBinary(\"1,2,3,4,5,6,7,8,9,10,11\")"
10205        );
10206
10207        let no_binary_value = ScalarValue::FixedSizeBinary(3, None);
10208        assert_eq!(format!("{no_binary_value:?}"), "FixedSizeBinary(3, NULL)");
10209        let small_binary_value = ScalarValue::FixedSizeBinary(3, Some(vec![1u8, 2, 3]));
10210        assert_eq!(
10211            format!("{small_binary_value:?}"),
10212            "FixedSizeBinary(3, \"1,2,3\")"
10213        );
10214        let large_binary_value = ScalarValue::FixedSizeBinary(
10215            11,
10216            Some(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
10217        );
10218        assert_eq!(
10219            format!("{large_binary_value:?}"),
10220            "FixedSizeBinary(11, \"1,2,3,4,5,6,7,8,9,10,11\")"
10221        );
10222    }
10223
10224    #[test]
10225    fn test_build_timestamp_millisecond_list() {
10226        let values = vec![ScalarValue::TimestampMillisecond(Some(1), None)];
10227        let arr = ScalarValue::new_list_nullable(
10228            &values,
10229            &DataType::Timestamp(TimeUnit::Millisecond, None),
10230        );
10231        assert_eq!(1, arr.len());
10232    }
10233
10234    #[test]
10235    fn test_newlist_timestamp_zone() {
10236        let s: &'static str = "UTC";
10237        let values = vec![ScalarValue::TimestampMillisecond(Some(1), Some(s.into()))];
10238        let arr = ScalarValue::new_list_nullable(
10239            &values,
10240            &DataType::Timestamp(TimeUnit::Millisecond, Some(s.into())),
10241        );
10242        assert_eq!(1, arr.len());
10243        assert_eq!(
10244            arr.data_type(),
10245            &DataType::List(Arc::new(Field::new_list_field(
10246                DataType::Timestamp(TimeUnit::Millisecond, Some(s.into())),
10247                true,
10248            )))
10249        );
10250    }
10251
10252    fn get_random_timestamps(sample_size: u64) -> Vec<ScalarValue> {
10253        let vector_size = sample_size;
10254        let mut timestamp = vec![];
10255        let mut rng = rand::rng();
10256        for i in 0..vector_size {
10257            let year = rng.random_range(1995..=2050);
10258            let month = rng.random_range(1..=12);
10259            let day = rng.random_range(1..=28); // to exclude invalid dates
10260            let hour = rng.random_range(0..=23);
10261            let minute = rng.random_range(0..=59);
10262            let second = rng.random_range(0..=59);
10263            if i % 4 == 0 {
10264                timestamp.push(ScalarValue::TimestampSecond(
10265                    Some(
10266                        NaiveDate::from_ymd_opt(year, month, day)
10267                            .unwrap()
10268                            .and_hms_opt(hour, minute, second)
10269                            .unwrap()
10270                            .and_utc()
10271                            .timestamp(),
10272                    ),
10273                    None,
10274                ))
10275            } else if i % 4 == 1 {
10276                let millisec = rng.random_range(0..=999);
10277                timestamp.push(ScalarValue::TimestampMillisecond(
10278                    Some(
10279                        NaiveDate::from_ymd_opt(year, month, day)
10280                            .unwrap()
10281                            .and_hms_milli_opt(hour, minute, second, millisec)
10282                            .unwrap()
10283                            .and_utc()
10284                            .timestamp_millis(),
10285                    ),
10286                    None,
10287                ))
10288            } else if i % 4 == 2 {
10289                let microsec = rng.random_range(0..=999_999);
10290                timestamp.push(ScalarValue::TimestampMicrosecond(
10291                    Some(
10292                        NaiveDate::from_ymd_opt(year, month, day)
10293                            .unwrap()
10294                            .and_hms_micro_opt(hour, minute, second, microsec)
10295                            .unwrap()
10296                            .and_utc()
10297                            .timestamp_micros(),
10298                    ),
10299                    None,
10300                ))
10301            } else if i % 4 == 3 {
10302                let nanosec = rng.random_range(0..=999_999_999);
10303                timestamp.push(ScalarValue::TimestampNanosecond(
10304                    Some(
10305                        NaiveDate::from_ymd_opt(year, month, day)
10306                            .unwrap()
10307                            .and_hms_nano_opt(hour, minute, second, nanosec)
10308                            .unwrap()
10309                            .and_utc()
10310                            .timestamp_nanos_opt()
10311                            .unwrap(),
10312                    ),
10313                    None,
10314                ))
10315            }
10316        }
10317        timestamp
10318    }
10319
10320    fn get_random_intervals(sample_size: u64) -> Vec<ScalarValue> {
10321        const MILLISECS_IN_ONE_DAY: i64 = 86_400_000;
10322        const NANOSECS_IN_ONE_DAY: i64 = 86_400_000_000_000;
10323
10324        let vector_size = sample_size;
10325        let mut intervals = vec![];
10326        let mut rng = rand::rng();
10327        const SECS_IN_ONE_DAY: i32 = 86_400;
10328        const MICROSECS_IN_ONE_DAY: i64 = 86_400_000_000;
10329        for i in 0..vector_size {
10330            if i % 4 == 0 {
10331                let days = rng.random_range(0..5000);
10332                // to not break second precision
10333                let millis = rng.random_range(0..SECS_IN_ONE_DAY) * 1000;
10334                intervals.push(ScalarValue::new_interval_dt(days, millis));
10335            } else if i % 4 == 1 {
10336                let days = rng.random_range(0..5000);
10337                let millisec = rng.random_range(0..(MILLISECS_IN_ONE_DAY as i32));
10338                intervals.push(ScalarValue::new_interval_dt(days, millisec));
10339            } else if i % 4 == 2 {
10340                let days = rng.random_range(0..5000);
10341                // to not break microsec precision
10342                let nanosec = rng.random_range(0..MICROSECS_IN_ONE_DAY) * 1000;
10343                intervals.push(ScalarValue::new_interval_mdn(0, days, nanosec));
10344            } else {
10345                let days = rng.random_range(0..5000);
10346                let nanosec = rng.random_range(0..NANOSECS_IN_ONE_DAY);
10347                intervals.push(ScalarValue::new_interval_mdn(0, days, nanosec));
10348            }
10349        }
10350        intervals
10351    }
10352
10353    fn union_fields() -> UnionFields {
10354        [
10355            (0, Arc::new(Field::new("A", DataType::Int32, true))),
10356            (1, Arc::new(Field::new("B", DataType::Float64, true))),
10357        ]
10358        .into_iter()
10359        .collect()
10360    }
10361
10362    #[test]
10363    fn sparse_scalar_union_is_null() {
10364        let sparse_scalar = ScalarValue::Union(
10365            Some((0_i8, Box::new(ScalarValue::Int32(None)))),
10366            union_fields(),
10367            UnionMode::Sparse,
10368        );
10369        assert!(sparse_scalar.is_null());
10370    }
10371
10372    #[test]
10373    fn dense_scalar_union_is_null() {
10374        let dense_scalar = ScalarValue::Union(
10375            Some((0_i8, Box::new(ScalarValue::Int32(None)))),
10376            union_fields(),
10377            UnionMode::Dense,
10378        );
10379        assert!(dense_scalar.is_null());
10380    }
10381
10382    #[test]
10383    fn cast_date_to_timestamp_overflow_returns_error() {
10384        let scalar = ScalarValue::Date32(Some(i32::MAX));
10385        let err = scalar
10386            .cast_to(&DataType::Timestamp(TimeUnit::Nanosecond, None))
10387            .expect_err("expected cast to fail");
10388        assert!(
10389            err.to_string()
10390                .contains("converted value exceeds the representable i64 range"),
10391            "unexpected error: {err}"
10392        );
10393    }
10394
10395    #[test]
10396    fn safe_cast_date_to_timestamp_overflow_returns_null() {
10397        let scalar = ScalarValue::Date32(Some(i32::MAX));
10398        let safe_options = CastOptions {
10399            safe: true,
10400            ..DEFAULT_CAST_OPTIONS
10401        };
10402
10403        let casted = scalar
10404            .cast_to_with_options(
10405                &DataType::Timestamp(TimeUnit::Nanosecond, None),
10406                &safe_options,
10407            )
10408            .expect("expected safe cast to return null");
10409
10410        assert_eq!(casted, ScalarValue::TimestampNanosecond(None, None));
10411    }
10412
10413    #[test]
10414    fn cast_timestamp_to_timestamp_overflow_returns_error() {
10415        let scalar = ScalarValue::TimestampSecond(Some(i64::MAX), None);
10416        let err = scalar
10417            .cast_to(&DataType::Timestamp(TimeUnit::Nanosecond, None))
10418            .expect_err("expected cast to fail");
10419        assert!(
10420            err.to_string()
10421                .contains("converted value exceeds the representable i64 range"),
10422            "unexpected error: {err}"
10423        );
10424    }
10425
10426    #[test]
10427    fn safe_cast_timestamp_to_timestamp_overflow_returns_null() {
10428        let scalar = ScalarValue::TimestampSecond(Some(i64::MAX), None);
10429        let safe_options = CastOptions {
10430            safe: true,
10431            ..DEFAULT_CAST_OPTIONS
10432        };
10433
10434        let casted = scalar
10435            .cast_to_with_options(
10436                &DataType::Timestamp(TimeUnit::Nanosecond, None),
10437                &safe_options,
10438            )
10439            .expect("expected safe cast to return null");
10440
10441        assert_eq!(casted, ScalarValue::TimestampNanosecond(None, None));
10442    }
10443
10444    #[test]
10445    fn null_dictionary_scalar_produces_null_dictionary_array() {
10446        let dictionary_scalar = ScalarValue::Dictionary(
10447            Box::new(DataType::Int32),
10448            Box::new(ScalarValue::Null),
10449        );
10450        assert!(dictionary_scalar.is_null());
10451        let dictionary_array = dictionary_scalar.to_array().unwrap();
10452        assert!(dictionary_array.is_null(0));
10453    }
10454
10455    #[test]
10456    fn test_scalar_value_try_new_null() {
10457        let scalars = vec![
10458            ScalarValue::try_new_null(&DataType::Boolean).unwrap(),
10459            ScalarValue::try_new_null(&DataType::Int8).unwrap(),
10460            ScalarValue::try_new_null(&DataType::Int16).unwrap(),
10461            ScalarValue::try_new_null(&DataType::Int32).unwrap(),
10462            ScalarValue::try_new_null(&DataType::Int64).unwrap(),
10463            ScalarValue::try_new_null(&DataType::UInt8).unwrap(),
10464            ScalarValue::try_new_null(&DataType::UInt16).unwrap(),
10465            ScalarValue::try_new_null(&DataType::UInt32).unwrap(),
10466            ScalarValue::try_new_null(&DataType::UInt64).unwrap(),
10467            ScalarValue::try_new_null(&DataType::Float16).unwrap(),
10468            ScalarValue::try_new_null(&DataType::Float32).unwrap(),
10469            ScalarValue::try_new_null(&DataType::Float64).unwrap(),
10470            ScalarValue::try_new_null(&DataType::Decimal128(42, 42)).unwrap(),
10471            ScalarValue::try_new_null(&DataType::Decimal256(42, 42)).unwrap(),
10472            ScalarValue::try_new_null(&DataType::Utf8).unwrap(),
10473            ScalarValue::try_new_null(&DataType::LargeUtf8).unwrap(),
10474            ScalarValue::try_new_null(&DataType::Utf8View).unwrap(),
10475            ScalarValue::try_new_null(&DataType::Binary).unwrap(),
10476            ScalarValue::try_new_null(&DataType::BinaryView).unwrap(),
10477            ScalarValue::try_new_null(&DataType::FixedSizeBinary(42)).unwrap(),
10478            ScalarValue::try_new_null(&DataType::LargeBinary).unwrap(),
10479            ScalarValue::try_new_null(&DataType::Date32).unwrap(),
10480            ScalarValue::try_new_null(&DataType::Date64).unwrap(),
10481            ScalarValue::try_new_null(&DataType::Time32(TimeUnit::Second)).unwrap(),
10482            ScalarValue::try_new_null(&DataType::Time32(TimeUnit::Millisecond)).unwrap(),
10483            ScalarValue::try_new_null(&DataType::Time64(TimeUnit::Microsecond)).unwrap(),
10484            ScalarValue::try_new_null(&DataType::Time64(TimeUnit::Nanosecond)).unwrap(),
10485            ScalarValue::try_new_null(&DataType::Timestamp(TimeUnit::Second, None))
10486                .unwrap(),
10487            ScalarValue::try_new_null(&DataType::Timestamp(TimeUnit::Millisecond, None))
10488                .unwrap(),
10489            ScalarValue::try_new_null(&DataType::Timestamp(TimeUnit::Microsecond, None))
10490                .unwrap(),
10491            ScalarValue::try_new_null(&DataType::Timestamp(TimeUnit::Nanosecond, None))
10492                .unwrap(),
10493            ScalarValue::try_new_null(&DataType::Interval(IntervalUnit::YearMonth))
10494                .unwrap(),
10495            ScalarValue::try_new_null(&DataType::Interval(IntervalUnit::DayTime))
10496                .unwrap(),
10497            ScalarValue::try_new_null(&DataType::Interval(IntervalUnit::MonthDayNano))
10498                .unwrap(),
10499            ScalarValue::try_new_null(&DataType::Duration(TimeUnit::Second)).unwrap(),
10500            ScalarValue::try_new_null(&DataType::Duration(TimeUnit::Microsecond))
10501                .unwrap(),
10502            ScalarValue::try_new_null(&DataType::Duration(TimeUnit::Nanosecond)).unwrap(),
10503            ScalarValue::try_new_null(&DataType::Null).unwrap(),
10504        ];
10505        assert!(scalars.iter().all(|s| s.is_null()));
10506
10507        let field_ref = Arc::new(Field::new("foo", DataType::Int32, true));
10508        let map_field_ref = Arc::new(Field::new(
10509            "foo",
10510            DataType::Struct(Fields::from(vec![
10511                Field::new("bar", DataType::Utf8, true),
10512                Field::new("baz", DataType::Int32, true),
10513            ])),
10514            true,
10515        ));
10516        let scalars = [
10517            ScalarValue::try_new_null(&DataType::List(Arc::clone(&field_ref))).unwrap(),
10518            ScalarValue::try_new_null(&DataType::LargeList(Arc::clone(&field_ref)))
10519                .unwrap(),
10520            ScalarValue::try_new_null(&DataType::FixedSizeList(
10521                Arc::clone(&field_ref),
10522                42,
10523            ))
10524            .unwrap(),
10525            ScalarValue::try_new_null(&DataType::ListView(Arc::clone(&field_ref)))
10526                .unwrap(),
10527            ScalarValue::try_new_null(&DataType::LargeListView(Arc::clone(&field_ref)))
10528                .unwrap(),
10529            ScalarValue::try_new_null(&DataType::Struct(
10530                vec![Arc::clone(&field_ref)].into(),
10531            ))
10532            .unwrap(),
10533            ScalarValue::try_new_null(&DataType::Map(map_field_ref, false)).unwrap(),
10534            ScalarValue::try_new_null(&DataType::Union(
10535                UnionFields::try_new(vec![42], vec![field_ref]).unwrap(),
10536                UnionMode::Dense,
10537            ))
10538            .unwrap(),
10539        ];
10540        assert!(scalars.iter().all(|s| s.is_null()));
10541    }
10542
10543    // `err.to_string()` depends on backtrace being present (may have backtrace appended)
10544    // `err.strip_backtrace()` also depends on backtrace being present (may have "This was likely caused by ..." stripped)
10545    fn assert_starts_with(actual: impl AsRef<str>, expected_prefix: impl AsRef<str>) {
10546        let actual = actual.as_ref();
10547        let expected_prefix = expected_prefix.as_ref();
10548        assert!(
10549            actual.starts_with(expected_prefix),
10550            "Expected '{actual}' to start with '{expected_prefix}'"
10551        );
10552    }
10553
10554    #[test]
10555    fn test_new_default() {
10556        // Test numeric types
10557        assert_eq!(
10558            ScalarValue::new_default(&DataType::Int32).unwrap(),
10559            ScalarValue::Int32(Some(0))
10560        );
10561        assert_eq!(
10562            ScalarValue::new_default(&DataType::Float64).unwrap(),
10563            ScalarValue::Float64(Some(0.0))
10564        );
10565        assert_eq!(
10566            ScalarValue::new_default(&DataType::Boolean).unwrap(),
10567            ScalarValue::Boolean(Some(false))
10568        );
10569
10570        // Test string types
10571        assert_eq!(
10572            ScalarValue::new_default(&DataType::Utf8).unwrap(),
10573            ScalarValue::Utf8(Some("".to_string()))
10574        );
10575        assert_eq!(
10576            ScalarValue::new_default(&DataType::LargeUtf8).unwrap(),
10577            ScalarValue::LargeUtf8(Some("".to_string()))
10578        );
10579
10580        // Test binary types
10581        assert_eq!(
10582            ScalarValue::new_default(&DataType::Binary).unwrap(),
10583            ScalarValue::Binary(Some(vec![]))
10584        );
10585
10586        // Test fixed size binary
10587        assert_eq!(
10588            ScalarValue::new_default(&DataType::FixedSizeBinary(5)).unwrap(),
10589            ScalarValue::FixedSizeBinary(5, Some(vec![0, 0, 0, 0, 0]))
10590        );
10591
10592        // Test temporal types
10593        assert_eq!(
10594            ScalarValue::new_default(&DataType::Date32).unwrap(),
10595            ScalarValue::Date32(Some(0))
10596        );
10597        assert_eq!(
10598            ScalarValue::new_default(&DataType::Time32(TimeUnit::Second)).unwrap(),
10599            ScalarValue::Time32Second(Some(0))
10600        );
10601
10602        // Test decimal types
10603        assert_eq!(
10604            ScalarValue::new_default(&DataType::Decimal128(10, 2)).unwrap(),
10605            ScalarValue::Decimal128(Some(0), 10, 2)
10606        );
10607
10608        // Test list type
10609        let list_field = Field::new_list_field(DataType::Int32, true);
10610        let list_result =
10611            ScalarValue::new_default(&DataType::List(Arc::new(list_field.clone())))
10612                .unwrap();
10613        match list_result {
10614            ScalarValue::List(arr) => {
10615                assert_eq!(arr.len(), 1);
10616                assert_eq!(arr.value_length(0), 0); // empty list
10617            }
10618            _ => panic!("Expected List"),
10619        }
10620
10621        let list_field = Field::new_list_field(DataType::Int32, true);
10622        let list_result =
10623            ScalarValue::new_default(&DataType::LargeList(Arc::new(list_field.clone())))
10624                .unwrap();
10625        match list_result {
10626            ScalarValue::LargeList(arr) => {
10627                assert_eq!(arr.len(), 1);
10628                assert_eq!(arr.value_length(0), 0); // empty list
10629            }
10630            _ => panic!("Expected LargeList"),
10631        }
10632
10633        let list_result =
10634            ScalarValue::new_default(&DataType::ListView(Arc::new(list_field.clone())))
10635                .unwrap();
10636        match list_result {
10637            ScalarValue::ListView(arr) => {
10638                assert_eq!(arr.len(), 1);
10639                assert_eq!(arr.value_size(0), 0); // empty list
10640            }
10641            _ => panic!("Expected ListView"),
10642        }
10643
10644        let list_result = ScalarValue::new_default(&DataType::LargeListView(Arc::new(
10645            list_field.clone(),
10646        )))
10647        .unwrap();
10648        match list_result {
10649            ScalarValue::LargeListView(arr) => {
10650                assert_eq!(arr.len(), 1);
10651                assert_eq!(arr.value_size(0), 0); // empty list
10652            }
10653            _ => panic!("Expected LargeListView"),
10654        }
10655
10656        // Test struct type
10657        let struct_fields = Fields::from(vec![
10658            Field::new("a", DataType::Int32, false),
10659            Field::new("b", DataType::Utf8, false),
10660        ]);
10661        let struct_result =
10662            ScalarValue::new_default(&DataType::Struct(struct_fields.clone())).unwrap();
10663        match struct_result {
10664            ScalarValue::Struct(arr) => {
10665                assert_eq!(arr.len(), 1);
10666                assert_eq!(arr.column(0).as_primitive::<Int32Type>().value(0), 0);
10667                assert_eq!(arr.column(1).as_string::<i32>().value(0), "");
10668            }
10669            _ => panic!("Expected Struct"),
10670        }
10671
10672        // Test union type
10673        let union_fields = UnionFields::try_new(
10674            vec![0, 1],
10675            vec![
10676                Field::new("i32", DataType::Int32, false),
10677                Field::new("f64", DataType::Float64, false),
10678            ],
10679        )
10680        .unwrap();
10681        let union_result = ScalarValue::new_default(&DataType::Union(
10682            union_fields.clone(),
10683            UnionMode::Sparse,
10684        ))
10685        .unwrap();
10686        match union_result {
10687            ScalarValue::Union(Some((type_id, value)), _, _) => {
10688                assert_eq!(type_id, 0);
10689                assert_eq!(*value, ScalarValue::Int32(Some(0)));
10690            }
10691            _ => panic!("Expected Union"),
10692        }
10693    }
10694
10695    #[test]
10696    fn test_scalar_min() {
10697        // Test integer types
10698        assert_eq!(
10699            ScalarValue::min(&DataType::Int8),
10700            Some(ScalarValue::Int8(Some(i8::MIN)))
10701        );
10702        assert_eq!(
10703            ScalarValue::min(&DataType::Int32),
10704            Some(ScalarValue::Int32(Some(i32::MIN)))
10705        );
10706        assert_eq!(
10707            ScalarValue::min(&DataType::UInt8),
10708            Some(ScalarValue::UInt8(Some(0)))
10709        );
10710        assert_eq!(
10711            ScalarValue::min(&DataType::UInt64),
10712            Some(ScalarValue::UInt64(Some(0)))
10713        );
10714
10715        // Test float types
10716        assert_eq!(
10717            ScalarValue::min(&DataType::Float32),
10718            Some(ScalarValue::Float32(Some(f32::NEG_INFINITY)))
10719        );
10720        assert_eq!(
10721            ScalarValue::min(&DataType::Float64),
10722            Some(ScalarValue::Float64(Some(f64::NEG_INFINITY)))
10723        );
10724
10725        // Test decimal types
10726        let decimal_min = ScalarValue::min(&DataType::Decimal128(5, 2)).unwrap();
10727        match decimal_min {
10728            ScalarValue::Decimal128(Some(val), 5, 2) => {
10729                assert_eq!(val, -99999); // -999.99 with scale 2
10730            }
10731            _ => panic!("Expected Decimal128"),
10732        }
10733
10734        // Test temporal types
10735        assert_eq!(
10736            ScalarValue::min(&DataType::Date32),
10737            Some(ScalarValue::Date32(Some(i32::MIN)))
10738        );
10739        assert_eq!(
10740            ScalarValue::min(&DataType::Time32(TimeUnit::Second)),
10741            Some(ScalarValue::Time32Second(Some(0)))
10742        );
10743        assert_eq!(
10744            ScalarValue::min(&DataType::Timestamp(TimeUnit::Nanosecond, None)),
10745            Some(ScalarValue::TimestampNanosecond(Some(i64::MIN), None))
10746        );
10747
10748        // Test duration types
10749        assert_eq!(
10750            ScalarValue::min(&DataType::Duration(TimeUnit::Second)),
10751            Some(ScalarValue::DurationSecond(Some(i64::MIN)))
10752        );
10753
10754        // Test unsupported types
10755        assert_eq!(ScalarValue::min(&DataType::Utf8), None);
10756        assert_eq!(ScalarValue::min(&DataType::Binary), None);
10757        assert_eq!(
10758            ScalarValue::min(&DataType::List(Arc::new(Field::new(
10759                "item",
10760                DataType::Int32,
10761                true
10762            )))),
10763            None
10764        );
10765        assert_eq!(
10766            ScalarValue::min(&DataType::LargeList(Arc::new(Field::new(
10767                "item",
10768                DataType::Int32,
10769                true
10770            )))),
10771            None
10772        );
10773        assert_eq!(
10774            ScalarValue::min(&DataType::ListView(Arc::new(Field::new(
10775                "item",
10776                DataType::Int32,
10777                true
10778            )))),
10779            None
10780        );
10781        assert_eq!(
10782            ScalarValue::min(&DataType::LargeListView(Arc::new(Field::new(
10783                "item",
10784                DataType::Int32,
10785                true
10786            )))),
10787            None
10788        );
10789    }
10790
10791    #[test]
10792    fn test_scalar_max() {
10793        // Test integer types
10794        assert_eq!(
10795            ScalarValue::max(&DataType::Int8),
10796            Some(ScalarValue::Int8(Some(i8::MAX)))
10797        );
10798        assert_eq!(
10799            ScalarValue::max(&DataType::Int32),
10800            Some(ScalarValue::Int32(Some(i32::MAX)))
10801        );
10802        assert_eq!(
10803            ScalarValue::max(&DataType::UInt8),
10804            Some(ScalarValue::UInt8(Some(u8::MAX)))
10805        );
10806        assert_eq!(
10807            ScalarValue::max(&DataType::UInt64),
10808            Some(ScalarValue::UInt64(Some(u64::MAX)))
10809        );
10810
10811        // Test float types
10812        assert_eq!(
10813            ScalarValue::max(&DataType::Float32),
10814            Some(ScalarValue::Float32(Some(f32::INFINITY)))
10815        );
10816        assert_eq!(
10817            ScalarValue::max(&DataType::Float64),
10818            Some(ScalarValue::Float64(Some(f64::INFINITY)))
10819        );
10820
10821        // Test decimal types
10822        let decimal_max = ScalarValue::max(&DataType::Decimal128(5, 2)).unwrap();
10823        match decimal_max {
10824            ScalarValue::Decimal128(Some(val), 5, 2) => {
10825                assert_eq!(val, 99999); // 999.99 with scale 2
10826            }
10827            _ => panic!("Expected Decimal128"),
10828        }
10829
10830        // Test temporal types
10831        assert_eq!(
10832            ScalarValue::max(&DataType::Date32),
10833            Some(ScalarValue::Date32(Some(i32::MAX)))
10834        );
10835        assert_eq!(
10836            ScalarValue::max(&DataType::Time32(TimeUnit::Second)),
10837            Some(ScalarValue::Time32Second(Some(86_399))) // 23:59:59
10838        );
10839        assert_eq!(
10840            ScalarValue::max(&DataType::Time64(TimeUnit::Microsecond)),
10841            Some(ScalarValue::Time64Microsecond(Some(86_399_999_999))) // 23:59:59.999999
10842        );
10843        assert_eq!(
10844            ScalarValue::max(&DataType::Timestamp(TimeUnit::Nanosecond, None)),
10845            Some(ScalarValue::TimestampNanosecond(Some(i64::MAX), None))
10846        );
10847
10848        // Test duration types
10849        assert_eq!(
10850            ScalarValue::max(&DataType::Duration(TimeUnit::Millisecond)),
10851            Some(ScalarValue::DurationMillisecond(Some(i64::MAX)))
10852        );
10853
10854        // Test unsupported types
10855        assert_eq!(ScalarValue::max(&DataType::Utf8), None);
10856        assert_eq!(ScalarValue::max(&DataType::Binary), None);
10857        assert_eq!(
10858            ScalarValue::max(&DataType::Struct(Fields::from(vec![Field::new(
10859                "field",
10860                DataType::Int32,
10861                true
10862            )]))),
10863            None
10864        );
10865        assert_eq!(
10866            ScalarValue::max(&DataType::ListView(Arc::new(Field::new(
10867                "item",
10868                DataType::Int32,
10869                true
10870            )))),
10871            None
10872        );
10873        assert_eq!(
10874            ScalarValue::max(&DataType::LargeListView(Arc::new(Field::new(
10875                "item",
10876                DataType::Int32,
10877                true
10878            )))),
10879            None
10880        );
10881    }
10882
10883    #[test]
10884    fn test_min_max_float16() {
10885        // Test Float16 min and max
10886        let min_f16 = ScalarValue::min(&DataType::Float16).unwrap();
10887        match min_f16 {
10888            ScalarValue::Float16(Some(val)) => {
10889                assert_eq!(val, f16::NEG_INFINITY);
10890            }
10891            _ => panic!("Expected Float16"),
10892        }
10893
10894        let max_f16 = ScalarValue::max(&DataType::Float16).unwrap();
10895        match max_f16 {
10896            ScalarValue::Float16(Some(val)) => {
10897                assert_eq!(val, f16::INFINITY);
10898            }
10899            _ => panic!("Expected Float16"),
10900        }
10901    }
10902
10903    #[test]
10904    fn test_new_default_interval() {
10905        // Test all interval types
10906        assert_eq!(
10907            ScalarValue::new_default(&DataType::Interval(IntervalUnit::YearMonth))
10908                .unwrap(),
10909            ScalarValue::IntervalYearMonth(Some(0))
10910        );
10911        assert_eq!(
10912            ScalarValue::new_default(&DataType::Interval(IntervalUnit::DayTime)).unwrap(),
10913            ScalarValue::IntervalDayTime(Some(IntervalDayTime::ZERO))
10914        );
10915        assert_eq!(
10916            ScalarValue::new_default(&DataType::Interval(IntervalUnit::MonthDayNano))
10917                .unwrap(),
10918            ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::ZERO))
10919        );
10920    }
10921
10922    #[test]
10923    fn test_min_max_with_timezone() {
10924        let tz = Some(Arc::from("UTC"));
10925
10926        // Test timestamp with timezone
10927        let min_ts =
10928            ScalarValue::min(&DataType::Timestamp(TimeUnit::Second, tz.clone())).unwrap();
10929        match min_ts {
10930            ScalarValue::TimestampSecond(Some(val), Some(tz_str)) => {
10931                assert_eq!(val, i64::MIN);
10932                assert_eq!(tz_str.as_ref(), "UTC");
10933            }
10934            _ => panic!("Expected TimestampSecond with timezone"),
10935        }
10936
10937        let max_ts =
10938            ScalarValue::max(&DataType::Timestamp(TimeUnit::Millisecond, tz.clone()))
10939                .unwrap();
10940        match max_ts {
10941            ScalarValue::TimestampMillisecond(Some(val), Some(tz_str)) => {
10942                assert_eq!(val, i64::MAX);
10943                assert_eq!(tz_str.as_ref(), "UTC");
10944            }
10945            _ => panic!("Expected TimestampMillisecond with timezone"),
10946        }
10947    }
10948
10949    #[test]
10950    fn test_views_minimize_memory() {
10951        let value = "this string is longer than 12 bytes".to_string();
10952
10953        let scalar = ScalarValue::Utf8View(Some(value.clone()));
10954        let array = scalar.to_array_of_size(10).unwrap();
10955        let array = array.as_string_view();
10956        let buffers = array.data_buffers();
10957        assert_eq!(1, buffers.len());
10958        // Ensure we only have a single copy of the value string
10959        assert_eq!(value.len(), buffers[0].len());
10960
10961        // Same but for BinaryView
10962        let scalar = ScalarValue::BinaryView(Some(value.bytes().collect()));
10963        let array = scalar.to_array_of_size(10).unwrap();
10964        let array = array.as_binary_view();
10965        let buffers = array.data_buffers();
10966        assert_eq!(1, buffers.len());
10967        assert_eq!(value.len(), buffers[0].len());
10968    }
10969
10970    #[test]
10971    fn test_to_array_of_size_run_end_encoded() {
10972        fn run_test<R: RunEndIndexType>() {
10973            let value = Box::new(ScalarValue::Float32(Some(1.0)));
10974            let size = 5;
10975            let scalar = ScalarValue::RunEndEncoded(
10976                Field::new("run_ends", R::DATA_TYPE, false).into(),
10977                Field::new("values", DataType::Float32, true).into(),
10978                value.clone(),
10979            );
10980            let array = scalar.to_array_of_size(size).unwrap();
10981            let array = array.as_run::<R>();
10982            let array = array.downcast::<Float32Array>().unwrap();
10983            assert_eq!(vec![Some(1.0); size], array.into_iter().collect::<Vec<_>>());
10984            assert_eq!(1, array.values().len());
10985        }
10986
10987        run_test::<Int16Type>();
10988        run_test::<Int32Type>();
10989        run_test::<Int64Type>();
10990
10991        let scalar = ScalarValue::RunEndEncoded(
10992            Field::new("run_ends", DataType::Int16, false).into(),
10993            Field::new("values", DataType::Float32, true).into(),
10994            Box::new(ScalarValue::Float32(Some(1.0))),
10995        );
10996        let err = scalar.to_array_of_size(i16::MAX as usize + 10).unwrap_err();
10997        assert_eq!(
10998            "Execution error: Cannot construct RunArray of size 32777: Overflows run-ends type Int16",
10999            err.to_string()
11000        )
11001    }
11002
11003    #[test]
11004    fn test_eq_array_run_end_encoded() {
11005        let run_ends = Int16Array::from(vec![1, 3]);
11006        let values = Float32Array::from(vec![None, Some(1.0)]);
11007        let run_array =
11008            Arc::new(RunArray::try_new(&run_ends, &values).unwrap()) as ArrayRef;
11009
11010        let scalar = ScalarValue::RunEndEncoded(
11011            Field::new("run_ends", DataType::Int16, false).into(),
11012            Field::new("values", DataType::Float32, true).into(),
11013            Box::new(ScalarValue::Float32(None)),
11014        );
11015        assert!(scalar.eq_array(&run_array, 0).unwrap());
11016
11017        let scalar = ScalarValue::RunEndEncoded(
11018            Field::new("run_ends", DataType::Int16, false).into(),
11019            Field::new("values", DataType::Float32, true).into(),
11020            Box::new(ScalarValue::Float32(Some(1.0))),
11021        );
11022        assert!(scalar.eq_array(&run_array, 1).unwrap());
11023        assert!(scalar.eq_array(&run_array, 2).unwrap());
11024
11025        // value types must match
11026        let scalar = ScalarValue::RunEndEncoded(
11027            Field::new("run_ends", DataType::Int16, false).into(),
11028            Field::new("values", DataType::Float64, true).into(),
11029            Box::new(ScalarValue::Float64(Some(1.0))),
11030        );
11031        let err = scalar.eq_array(&run_array, 1).unwrap_err();
11032        let expected = "Internal error: could not cast array of type Float32 to arrow_array::array::primitive_array::PrimitiveArray<arrow_array::types::Float64Type>";
11033        assert!(err.to_string().starts_with(expected));
11034
11035        // run ends type must match
11036        let scalar = ScalarValue::RunEndEncoded(
11037            Field::new("run_ends", DataType::Int32, false).into(),
11038            Field::new("values", DataType::Float32, true).into(),
11039            Box::new(ScalarValue::Float32(None)),
11040        );
11041        let err = scalar.eq_array(&run_array, 0).unwrap_err();
11042        let expected = "Internal error: could not cast array of type RunEndEncoded(\"run_ends\": non-null Int16, \"values\": Float32) to arrow_array::array::run_array::RunArray<arrow_array::types::Int32Type>";
11043        assert!(err.to_string().starts_with(expected));
11044    }
11045
11046    #[test]
11047    fn test_iter_to_array_run_end_encoded() {
11048        let run_ends_field = Arc::new(Field::new("run_ends", DataType::Int16, false));
11049        let values_field = Arc::new(Field::new("values", DataType::Int64, true));
11050        let scalars = vec![
11051            ScalarValue::RunEndEncoded(
11052                Arc::clone(&run_ends_field),
11053                Arc::clone(&values_field),
11054                Box::new(ScalarValue::Int64(Some(1))),
11055            ),
11056            ScalarValue::RunEndEncoded(
11057                Arc::clone(&run_ends_field),
11058                Arc::clone(&values_field),
11059                Box::new(ScalarValue::Int64(Some(1))),
11060            ),
11061            ScalarValue::RunEndEncoded(
11062                Arc::clone(&run_ends_field),
11063                Arc::clone(&values_field),
11064                Box::new(ScalarValue::Int64(None)),
11065            ),
11066            ScalarValue::RunEndEncoded(
11067                Arc::clone(&run_ends_field),
11068                Arc::clone(&values_field),
11069                Box::new(ScalarValue::Int64(Some(2))),
11070            ),
11071            ScalarValue::RunEndEncoded(
11072                Arc::clone(&run_ends_field),
11073                Arc::clone(&values_field),
11074                Box::new(ScalarValue::Int64(Some(2))),
11075            ),
11076            ScalarValue::RunEndEncoded(
11077                Arc::clone(&run_ends_field),
11078                Arc::clone(&values_field),
11079                Box::new(ScalarValue::Int64(Some(2))),
11080            ),
11081        ];
11082
11083        let run_array = ScalarValue::iter_to_array(scalars).unwrap();
11084        let expected = RunArray::try_new(
11085            &Int16Array::from(vec![2, 3, 6]),
11086            &Int64Array::from(vec![Some(1), None, Some(2)]),
11087        )
11088        .unwrap();
11089        assert_eq!(&expected as &dyn Array, run_array.as_ref());
11090
11091        // inconsistent run-ends type
11092        let scalars = vec![
11093            ScalarValue::RunEndEncoded(
11094                Arc::clone(&run_ends_field),
11095                Arc::clone(&values_field),
11096                Box::new(ScalarValue::Int64(Some(1))),
11097            ),
11098            ScalarValue::RunEndEncoded(
11099                Field::new("run_ends", DataType::Int32, false).into(),
11100                Arc::clone(&values_field),
11101                Box::new(ScalarValue::Int64(Some(1))),
11102            ),
11103        ];
11104        let err = ScalarValue::iter_to_array(scalars).unwrap_err();
11105        let expected = "Execution error: Expected RunEndEncoded scalar with run-ends field Field { \"run_ends\": Int16 } but got: RunEndEncoded(Field { name: \"run_ends\", data_type: Int32 }, Field { name: \"values\", data_type: Int64, nullable: true }, Int64(1))";
11106        assert!(err.to_string().starts_with(expected));
11107
11108        // inconsistent value type
11109        let scalars = vec![
11110            ScalarValue::RunEndEncoded(
11111                Arc::clone(&run_ends_field),
11112                Arc::clone(&values_field),
11113                Box::new(ScalarValue::Int64(Some(1))),
11114            ),
11115            ScalarValue::RunEndEncoded(
11116                Arc::clone(&run_ends_field),
11117                Field::new("values", DataType::Int32, true).into(),
11118                Box::new(ScalarValue::Int32(Some(1))),
11119            ),
11120        ];
11121        let err = ScalarValue::iter_to_array(scalars).unwrap_err();
11122        let expected = "Execution error: Expected RunEndEncoded scalar with run-ends field Field { \"run_ends\": Int16 } but got: RunEndEncoded(Field { name: \"run_ends\", data_type: Int16 }, Field { name: \"values\", data_type: Int32, nullable: true }, Int32(1))";
11123        assert!(err.to_string().starts_with(expected));
11124
11125        // inconsistent scalars type
11126        let scalars = vec![
11127            ScalarValue::RunEndEncoded(
11128                Arc::clone(&run_ends_field),
11129                Arc::clone(&values_field),
11130                Box::new(ScalarValue::Int64(Some(1))),
11131            ),
11132            ScalarValue::Int64(Some(1)),
11133        ];
11134        let err = ScalarValue::iter_to_array(scalars).unwrap_err();
11135        let expected = "Execution error: Expected RunEndEncoded scalar with run-ends field Field { \"run_ends\": Int16 } but got: Int64(1)";
11136        assert!(err.to_string().starts_with(expected));
11137    }
11138
11139    #[test]
11140    fn test_convert_array_to_scalar_vec() {
11141        // 1: Regular ListArray
11142        let list = ListArray::from_iter_primitive::<Int64Type, _, _>(vec![
11143            Some(vec![Some(1), Some(2)]),
11144            None,
11145            Some(vec![Some(3), None, Some(4)]),
11146        ]);
11147        let converted = ScalarValue::convert_array_to_scalar_vec(&list).unwrap();
11148        assert_eq!(
11149            converted,
11150            vec![
11151                Some(vec![
11152                    ScalarValue::Int64(Some(1)),
11153                    ScalarValue::Int64(Some(2))
11154                ]),
11155                None,
11156                Some(vec![
11157                    ScalarValue::Int64(Some(3)),
11158                    ScalarValue::Int64(None),
11159                    ScalarValue::Int64(Some(4))
11160                ]),
11161            ]
11162        );
11163
11164        // 2: Regular LargeListArray
11165        let large_list = LargeListArray::from_iter_primitive::<Int64Type, _, _>(vec![
11166            Some(vec![Some(1), Some(2)]),
11167            None,
11168            Some(vec![Some(3), None, Some(4)]),
11169        ]);
11170        let converted = ScalarValue::convert_array_to_scalar_vec(&large_list).unwrap();
11171        assert_eq!(
11172            converted,
11173            vec![
11174                Some(vec![
11175                    ScalarValue::Int64(Some(1)),
11176                    ScalarValue::Int64(Some(2))
11177                ]),
11178                None,
11179                Some(vec![
11180                    ScalarValue::Int64(Some(3)),
11181                    ScalarValue::Int64(None),
11182                    ScalarValue::Int64(Some(4))
11183                ]),
11184            ]
11185        );
11186
11187        // 3: Funky (null slot has non-zero list offsets)
11188        // Offsets + Values looks like this: [[1, 2], [3, 4], [5]]
11189        // But with NullBuffer it's like this: [[1, 2], NULL, [5]]
11190        let funky = ListArray::new(
11191            Field::new_list_field(DataType::Int64, true).into(),
11192            OffsetBuffer::new(vec![0, 2, 4, 5].into()),
11193            Arc::new(Int64Array::from(vec![1, 2, 3, 4, 5, 6])),
11194            Some(NullBuffer::from(vec![true, false, true])),
11195        );
11196        let converted = ScalarValue::convert_array_to_scalar_vec(&funky).unwrap();
11197        assert_eq!(
11198            converted,
11199            vec![
11200                Some(vec![
11201                    ScalarValue::Int64(Some(1)),
11202                    ScalarValue::Int64(Some(2))
11203                ]),
11204                None,
11205                Some(vec![ScalarValue::Int64(Some(5))]),
11206            ]
11207        );
11208
11209        // 4: Offsets + Values looks like this: [[1, 2], [], [5]]
11210        // But with NullBuffer it's like this: [[1, 2], NULL, [5]]
11211        // The converted result is: [[1, 2], None, [5]]
11212        let array4 = ListArray::new(
11213            Field::new_list_field(DataType::Int64, true).into(),
11214            OffsetBuffer::new(vec![0, 2, 2, 5].into()),
11215            Arc::new(Int64Array::from(vec![1, 2, 3, 4, 5, 6])),
11216            Some(NullBuffer::from(vec![true, false, true])),
11217        );
11218        let converted = ScalarValue::convert_array_to_scalar_vec(&array4).unwrap();
11219        assert_eq!(
11220            converted,
11221            vec![
11222                Some(vec![
11223                    ScalarValue::Int64(Some(1)),
11224                    ScalarValue::Int64(Some(2))
11225                ]),
11226                None,
11227                Some(vec![
11228                    ScalarValue::Int64(Some(3)),
11229                    ScalarValue::Int64(Some(4)),
11230                    ScalarValue::Int64(Some(5)),
11231                ]),
11232            ]
11233        );
11234
11235        // 5: Offsets + Values looks like this: [[1, 2], [], [5]]
11236        // Same as 4, but the middle array is not null, so after conversion it's empty.
11237        let array5 = ListArray::new(
11238            Field::new_list_field(DataType::Int64, true).into(),
11239            OffsetBuffer::new(vec![0, 2, 2, 5].into()),
11240            Arc::new(Int64Array::from(vec![1, 2, 3, 4, 5, 6])),
11241            Some(NullBuffer::from(vec![true, true, true])),
11242        );
11243        let converted = ScalarValue::convert_array_to_scalar_vec(&array5).unwrap();
11244        assert_eq!(
11245            converted,
11246            vec![
11247                Some(vec![
11248                    ScalarValue::Int64(Some(1)),
11249                    ScalarValue::Int64(Some(2))
11250                ]),
11251                Some(vec![]),
11252                Some(vec![
11253                    ScalarValue::Int64(Some(3)),
11254                    ScalarValue::Int64(Some(4)),
11255                    ScalarValue::Int64(Some(5)),
11256                ]),
11257            ]
11258        );
11259
11260        // 6: Regular ListViewArray
11261        let list = ListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![
11262            Some(vec![Some(1), Some(2)]),
11263            None,
11264            Some(vec![Some(3), None, Some(4)]),
11265        ]);
11266        let converted = ScalarValue::convert_array_to_scalar_vec(&list).unwrap();
11267        assert_eq!(
11268            converted,
11269            vec![
11270                Some(vec![
11271                    ScalarValue::Int64(Some(1)),
11272                    ScalarValue::Int64(Some(2))
11273                ]),
11274                None,
11275                Some(vec![
11276                    ScalarValue::Int64(Some(3)),
11277                    ScalarValue::Int64(None),
11278                    ScalarValue::Int64(Some(4))
11279                ]),
11280            ]
11281        );
11282
11283        // 7: Regular LargeListViewArray
11284        let large_list =
11285            LargeListViewArray::from_iter_primitive::<Int64Type, _, _>(vec![
11286                Some(vec![Some(1), Some(2)]),
11287                None,
11288                Some(vec![Some(3), None, Some(4)]),
11289            ]);
11290        let converted = ScalarValue::convert_array_to_scalar_vec(&large_list).unwrap();
11291        assert_eq!(
11292            converted,
11293            vec![
11294                Some(vec![
11295                    ScalarValue::Int64(Some(1)),
11296                    ScalarValue::Int64(Some(2))
11297                ]),
11298                None,
11299                Some(vec![
11300                    ScalarValue::Int64(Some(3)),
11301                    ScalarValue::Int64(None),
11302                    ScalarValue::Int64(Some(4))
11303                ]),
11304            ]
11305        );
11306    }
11307
11308    // ── compact / compact_view_buffers ───────────────────────────────────────
11309
11310    /// Builds a `StringViewArray` with `n` strings that are all longer than
11311    /// 12 bytes so they are stored in backing buffers rather than inline.
11312    fn make_long_strings(n: usize) -> StringViewArray {
11313        let mut b = StringViewBuilder::new();
11314        for i in 0..n {
11315            b.append_value(format!("long_string_value_pad_{i:04}"));
11316        }
11317        b.finish()
11318    }
11319
11320    /// Total bytes across all backing buffers of a `StringViewArray`.
11321    fn utf8view_buffer_bytes(a: &StringViewArray) -> usize {
11322        a.data_buffers().iter().map(|b| b.len()).sum()
11323    }
11324
11325    #[test]
11326    fn test_compact_list_utf8view() {
11327        const N: usize = 50;
11328        let strings = make_long_strings(N);
11329        let one_len = strings.value(0).len();
11330        assert!(utf8view_buffer_bytes(&strings) >= N * one_len);
11331
11332        let single_row_list_array =
11333            SingleRowListArrayBuilder::new(Arc::new(strings.slice(0, 1)) as ArrayRef)
11334                .build_list_array();
11335        let mut scalar = ScalarValue::List(Arc::new(single_row_list_array));
11336        scalar.compact();
11337
11338        let ScalarValue::List(arr) = &scalar else {
11339            panic!("expected List")
11340        };
11341        assert_eq!(
11342            utf8view_buffer_bytes(arr.values().as_string_view()),
11343            one_len
11344        );
11345        assert_eq!(arr.values().as_string_view().value(0), strings.value(0));
11346    }
11347
11348    #[test]
11349    fn test_compact_large_list_utf8view() {
11350        const N: usize = 50;
11351        let strings = make_long_strings(N);
11352        let one_len = strings.value(0).len();
11353        assert!(utf8view_buffer_bytes(&strings) >= N * one_len);
11354
11355        let single_row_list_array =
11356            SingleRowListArrayBuilder::new(Arc::new(strings.slice(0, 1)) as ArrayRef)
11357                .build_large_list_array();
11358        let mut scalar = ScalarValue::LargeList(Arc::new(single_row_list_array));
11359        scalar.compact();
11360
11361        let ScalarValue::LargeList(arr) = &scalar else {
11362            panic!("expected LargeList")
11363        };
11364        assert_eq!(
11365            utf8view_buffer_bytes(arr.values().as_string_view()),
11366            one_len
11367        );
11368        assert_eq!(arr.values().as_string_view().value(0), strings.value(0));
11369    }
11370
11371    #[test]
11372    fn test_compact_fixed_size_list_utf8view() {
11373        const N: usize = 50;
11374        let strings = make_long_strings(N);
11375        let one_len = strings.value(0).len();
11376        assert!(utf8view_buffer_bytes(&strings) >= N * one_len);
11377
11378        let single_row_list_array =
11379            SingleRowListArrayBuilder::new(Arc::new(strings.slice(0, 1)) as ArrayRef)
11380                .build_fixed_size_list_array(1);
11381        let mut scalar = ScalarValue::FixedSizeList(Arc::new(single_row_list_array));
11382        scalar.compact();
11383
11384        let ScalarValue::FixedSizeList(arr) = &scalar else {
11385            panic!("expected FixedSizeList")
11386        };
11387        assert_eq!(
11388            utf8view_buffer_bytes(arr.values().as_string_view()),
11389            one_len
11390        );
11391        assert_eq!(arr.values().as_string_view().value(0), strings.value(0));
11392    }
11393
11394    #[test]
11395    fn test_compact_list_view_utf8view() {
11396        const N: usize = 50;
11397        let strings = make_long_strings(N);
11398        let one_len = strings.value(0).len();
11399        assert!(utf8view_buffer_bytes(&strings) >= N * one_len);
11400
11401        let single_row_list_array =
11402            SingleRowListArrayBuilder::new(Arc::new(strings.slice(0, 1)) as ArrayRef)
11403                .build_list_view_array();
11404        let mut scalar = ScalarValue::ListView(Arc::new(single_row_list_array));
11405        scalar.compact();
11406
11407        let ScalarValue::ListView(arr) = &scalar else {
11408            panic!("expected ListView")
11409        };
11410        assert_eq!(
11411            utf8view_buffer_bytes(arr.values().as_string_view()),
11412            one_len
11413        );
11414        assert_eq!(arr.values().as_string_view().value(0), strings.value(0));
11415    }
11416
11417    #[test]
11418    fn test_compact_large_list_view_utf8view() {
11419        const N: usize = 50;
11420        let strings = make_long_strings(N);
11421        let one_len = strings.value(0).len();
11422        assert!(utf8view_buffer_bytes(&strings) >= N * one_len);
11423
11424        let single_row_list_array =
11425            SingleRowListArrayBuilder::new(Arc::new(strings.slice(0, 1)) as ArrayRef)
11426                .build_large_list_view_array();
11427        let mut scalar = ScalarValue::LargeListView(Arc::new(single_row_list_array));
11428        scalar.compact();
11429
11430        let ScalarValue::LargeListView(arr) = &scalar else {
11431            panic!("expected LargeListView")
11432        };
11433        assert_eq!(
11434            utf8view_buffer_bytes(arr.values().as_string_view()),
11435            one_len
11436        );
11437        assert_eq!(arr.values().as_string_view().value(0), strings.value(0));
11438    }
11439
11440    #[test]
11441    fn test_compact_struct_utf8view() {
11442        const N: usize = 50;
11443        let strings = make_long_strings(N);
11444        let one_len = strings.value(0).len();
11445
11446        let field = Arc::new(Field::new("name", DataType::Utf8View, true));
11447        let struct_arr = StructArray::new(
11448            Fields::from(vec![Arc::clone(&field)]),
11449            vec![Arc::new(strings.slice(0, 1)) as ArrayRef],
11450            None,
11451        );
11452
11453        let mut scalar = ScalarValue::Struct(Arc::new(struct_arr));
11454        scalar.compact();
11455
11456        let ScalarValue::Struct(arr) = &scalar else {
11457            panic!("expected Struct")
11458        };
11459        let col = arr.column(0).as_string_view();
11460        assert_eq!(utf8view_buffer_bytes(col), one_len);
11461        assert_eq!(col.value(0), strings.value(0));
11462    }
11463
11464    #[test]
11465    fn test_compact_map_utf8view() {
11466        const N: usize = 50;
11467        let strings = make_long_strings(N);
11468        let one_len = strings.value(0).len();
11469
11470        let key_field = Arc::new(Field::new("key", DataType::Utf8View, false));
11471        let val_field = Arc::new(Field::new("value", DataType::Int32, true));
11472        let entries = StructArray::new(
11473            Fields::from(vec![Arc::clone(&key_field), Arc::clone(&val_field)]),
11474            vec![
11475                Arc::new(strings.slice(0, 1)) as ArrayRef,
11476                Arc::new(Int32Array::from(vec![1i32])) as ArrayRef,
11477            ],
11478            None,
11479        );
11480        let entries_field = Arc::new(Field::new(
11481            "entries",
11482            DataType::Struct(Fields::from(vec![key_field, val_field])),
11483            false,
11484        ));
11485        let map = MapArray::new(
11486            entries_field,
11487            OffsetBuffer::new(vec![0i32, 1].into()),
11488            entries,
11489            None,
11490            false,
11491        );
11492
11493        let mut scalar = ScalarValue::Map(Arc::new(map));
11494        scalar.compact();
11495
11496        let ScalarValue::Map(arr) = &scalar else {
11497            panic!("expected Map")
11498        };
11499        let keys = arr.entries().column(0).as_string_view();
11500        assert_eq!(utf8view_buffer_bytes(keys), one_len);
11501        assert_eq!(keys.value(0), strings.value(0));
11502    }
11503
11504    #[test]
11505    fn test_zero_size_fsl() {
11506        let s = ScalarValue::new_default(&DataType::FixedSizeList(
11507            Field::new("a", DataType::Int32, true).into(),
11508            0,
11509        ))
11510        .unwrap();
11511        assert_eq!(s.to_string(), "[]");
11512    }
11513
11514    #[test]
11515    fn test_decimal_value_bounds() {
11516        fn run_tests<D: DecimalType>() {
11517            // 0.1111, 0.2222, etc.
11518            let max_scale = D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE);
11519            // 1.111, 2.222, etc.
11520            let max_scale_less_one =
11521                D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE - 1);
11522            // 11.11, 22.22, etc.
11523            let max_scale_less_two =
11524                D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE - 2);
11525
11526            // Invalid (can't represent the value)
11527            assert!(ScalarValue::new_one(&max_scale).is_err());
11528            assert!(ScalarValue::new_negative_one(&max_scale).is_err());
11529            assert!(ScalarValue::new_ten(&max_scale).is_err());
11530            assert!(ScalarValue::new_ten(&max_scale_less_one).is_err());
11531
11532            // Valid
11533            let one = ScalarValue::Int32(Some(1));
11534            let neg_one = ScalarValue::Int32(Some(-1));
11535            let ten = ScalarValue::Int32(Some(10));
11536
11537            let num = ScalarValue::new_one(&max_scale_less_one).unwrap();
11538            assert_eq!(num.cast_to(&DataType::Int32).unwrap(), one);
11539            let num = ScalarValue::new_negative_one(&max_scale_less_one).unwrap();
11540            assert_eq!(num.cast_to(&DataType::Int32).unwrap(), neg_one);
11541            let num = ScalarValue::new_ten(&max_scale_less_two).unwrap();
11542            assert_eq!(num.cast_to(&DataType::Int32).unwrap(), ten);
11543        }
11544
11545        run_tests::<Decimal32Type>();
11546        run_tests::<Decimal64Type>();
11547        run_tests::<Decimal128Type>();
11548        run_tests::<Decimal256Type>();
11549    }
11550
11551    #[test]
11552    fn test_new_list_nested_nullability_mismatch_issue_24022() {
11553        // requested element type: Struct(n: Int32 nullable=true)
11554        let requested_element_type =
11555            DataType::Struct(Fields::from(vec![Field::new("n", DataType::Int32, true)]));
11556
11557        // inferred from concrete values: Struct(n: Int32 nullable=false)
11558        let inferred_field = Field::new("n", DataType::Int32, false);
11559
11560        let value = ScalarValue::Struct(Arc::new(StructArray::from(vec![(
11561            Arc::new(inferred_field),
11562            Arc::new(Int32Array::from(vec![1])) as ArrayRef,
11563        )])));
11564
11565        let expected_struct_array = StructArray::from(vec![(
11566            Arc::new(Field::new("n", DataType::Int32, true)),
11567            Arc::new(Int32Array::from(vec![1])) as ArrayRef,
11568        )]);
11569        let expected_array = Arc::new(expected_struct_array) as ArrayRef;
11570
11571        // Test new_list
11572        let list = ScalarValue::new_list(
11573            std::slice::from_ref(&value),
11574            &requested_element_type,
11575            true,
11576        );
11577        assert_eq!(
11578            list.data_type(),
11579            &DataType::List(Arc::new(Field::new_list_field(
11580                requested_element_type.clone(),
11581                true
11582            )))
11583        );
11584        assert_eq!(&list.value(0), &expected_array);
11585
11586        // Test new_list_from_iter
11587        let list_from_iter = ScalarValue::new_list_from_iter(
11588            std::iter::once(value.clone()),
11589            &requested_element_type,
11590            true,
11591        );
11592        assert_eq!(
11593            list_from_iter.data_type(),
11594            &DataType::List(Arc::new(Field::new_list_field(
11595                requested_element_type.clone(),
11596                true
11597            )))
11598        );
11599        assert_eq!(&list_from_iter.value(0), &expected_array);
11600
11601        // Test new_large_list
11602        let large_list = ScalarValue::new_large_list(&[value], &requested_element_type);
11603        assert_eq!(
11604            large_list.data_type(),
11605            &DataType::LargeList(Arc::new(Field::new(
11606                "item",
11607                requested_element_type.clone(),
11608                true
11609            )))
11610        );
11611        assert_eq!(&large_list.value(0), &expected_array);
11612    }
11613}