1mod 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
112pub 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 match source_type {
130 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 DataType::Date64 => match target_unit {
145 TimeUnit::Second => None,
146 TimeUnit::Millisecond => None,
151 TimeUnit::Microsecond => Some(MICROS_PER_MILLISECOND),
152 TimeUnit::Nanosecond => Some(NANOS_PER_MILLISECOND),
153 },
154
155 _ => None,
156 }
157}
158
159pub 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
183pub 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
209pub(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#[derive(Clone)]
358pub enum ScalarValue {
359 Null,
361 Boolean(Option<bool>),
363 Float16(Option<f16>),
365 Float32(Option<f32>),
367 Float64(Option<f64>),
369 Decimal32(Option<i32>, u8, i8),
371 Decimal64(Option<i64>, u8, i8),
373 Decimal128(Option<i128>, u8, i8),
375 Decimal256(Option<i256>, u8, i8),
377 Int8(Option<i8>),
379 Int16(Option<i16>),
381 Int32(Option<i32>),
383 Int64(Option<i64>),
385 UInt8(Option<u8>),
387 UInt16(Option<u16>),
389 UInt32(Option<u32>),
391 UInt64(Option<u64>),
393 Utf8(Option<String>),
395 Utf8View(Option<String>),
397 LargeUtf8(Option<String>),
399 Binary(Option<Vec<u8>>),
401 BinaryView(Option<Vec<u8>>),
403 FixedSizeBinary(i32, Option<Vec<u8>>),
405 LargeBinary(Option<Vec<u8>>),
407 FixedSizeList(Arc<FixedSizeListArray>),
411 List(Arc<ListArray>),
415 LargeList(Arc<LargeListArray>),
417 ListView(Arc<ListViewArray>),
421 LargeListView(Arc<LargeListViewArray>),
425 Struct(Arc<StructArray>),
428 Map(Arc<MapArray>),
430 Date32(Option<i32>),
432 Date64(Option<i64>),
434 Time32Second(Option<i32>),
436 Time32Millisecond(Option<i32>),
438 Time64Microsecond(Option<i64>),
440 Time64Nanosecond(Option<i64>),
442 TimestampSecond(Option<i64>, Option<Arc<str>>),
444 TimestampMillisecond(Option<i64>, Option<Arc<str>>),
446 TimestampMicrosecond(Option<i64>, Option<Arc<str>>),
448 TimestampNanosecond(Option<i64>, Option<Arc<str>>),
450 IntervalYearMonth(Option<i32>),
452 IntervalDayTime(Option<IntervalDayTime>),
455 IntervalMonthDayNano(Option<IntervalMonthDayNano>),
459 DurationSecond(Option<i64>),
461 DurationMillisecond(Option<i64>),
463 DurationMicrosecond(Option<i64>),
465 DurationNanosecond(Option<i64>),
467 Union(Option<(i8, Box<ScalarValue>)>, UnionFields, UnionMode),
472 Dictionary(Box<DataType>, Box<ScalarValue>),
474 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
484impl PartialEq for ScalarValue {
486 fn eq(&self, other: &Self) -> bool {
487 use ScalarValue::*;
488 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
619impl PartialOrd for ScalarValue {
621 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
622 use ScalarValue::*;
623 match (self, other) {
627 (Decimal32(v1, _, s1), Decimal32(v2, _, s2)) => {
628 if s1.eq(s2) {
629 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 (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 if k1 == k2 { v1.partial_cmp(v2) } else { None }
788 }
789 (Dictionary(_, _), _) => None,
790 (RunEndEncoded(rf1, vf1, v1), RunEndEncoded(rf2, vf2, v2)) => {
791 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
805fn 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
826fn 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 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 flatten(nested_struct, columns);
873 } else {
874 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
944struct 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
960impl 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 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 hashes.hash(state);
1071}
1072
1073#[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
1088fn dict_from_scalar<K: ArrowDictionaryKeyType>(
1091 value: &ScalarValue,
1092 size: usize,
1093) -> Result<ArrayRef> {
1094 let values_array = value.to_array_of_size(1)?;
1096
1097 let key_array: PrimitiveArray<K> =
1100 get_or_create_cached_key_array::<K>(size, value.is_null());
1101
1102 Ok(Arc::new(
1108 DictionaryArray::<K>::try_new(key_array, values_array)?, ))
1110}
1111
1112pub fn dict_from_values<K: ArrowDictionaryKeyType>(
1127 values_array: ArrayRef,
1128) -> Result<ArrayRef> {
1129 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 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 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 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 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 DataType::List(field_ref) => ScalarValue::List(Arc::new(
1344 GenericListArray::new_null(Arc::clone(field_ref), 1),
1345 )),
1346 DataType::LargeList(field_ref) => ScalarValue::LargeList(Arc::new(
1348 GenericListArray::new_null(Arc::clone(field_ref), 1),
1349 )),
1350 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 pub fn new_utf8(val: impl Into<String>) -> Self {
1390 ScalarValue::from(val.into())
1391 }
1392
1393 pub fn new_utf8view(val: impl Into<String>) -> Self {
1395 ScalarValue::Utf8View(Some(val.into()))
1396 }
1397
1398 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn new_default(datatype: &DataType) -> Result<ScalarValue> {
1661 match datatype {
1662 DataType::Null => Ok(ScalarValue::Null),
1664
1665 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 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 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 DataType::FixedSizeBinary(size) => Ok(ScalarValue::FixedSizeBinary(
1702 *size,
1703 Some(vec![0; *size as usize]),
1704 )),
1705
1706 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 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 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 DataType::Map(field, _) => Ok(ScalarValue::Map(Arc::new(MapArray::from(
1776 ArrayData::new_empty(field.data_type()),
1777 )))),
1778
1779 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 (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 (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 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 pub fn to_array(&self) -> Result<ArrayRef> {
2754 self.to_array_of_size(1)
2755 }
2756
2757 pub fn to_scalar(&self) -> Result<Scalar<ArrayRef>> {
2783 Ok(Scalar::new(self.to_array_of_size(1)?))
2784 }
2785
2786 pub fn iter_to_array(
2813 scalars: impl IntoIterator<Item = ScalarValue>,
2814 ) -> Result<ArrayRef> {
2815 let mut scalars = scalars.into_iter().peekable();
2816
2817 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn try_from_array(array: &dyn Array, index: usize) -> Result<Self> {
4037 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 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 SingleRowListArrayBuilder::new(nested_array)
4103 .with_field(field)
4104 .build_large_list_scalar()
4105 }
4106 DataType::FixedSizeList(field, _) => {
4108 let list_array = as_fixed_size_list_array(array)?;
4109 let nested_array = list_array.value(index);
4110 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 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 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 let value = match values_index {
4188 Some(values_index) => {
4189 ScalarValue::try_from_array(values_array, values_index)
4190 }
4191 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 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 pub fn try_from_string(value: String, target_type: &DataType) -> Result<Self> {
4289 ScalarValue::from(value).cast_to(target_type)
4290 }
4291
4292 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 pub fn cast_to(&self, target_type: &DataType) -> Result<Self> {
4352 self.cast_to_with_options(target_type, &DEFAULT_CAST_OPTIONS)
4353 }
4354
4355 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 if &source_type == target_type {
4371 return Ok(self.clone());
4372 }
4373
4374 if source_type.is_string() && target_type.is_string() {
4379 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 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 #[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 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 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 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 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 + 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.size() + sv.size()
4848 }
4849 ScalarValue::RunEndEncoded(rf, vf, v) => rf.size() + vf.size() + v.size(),
4850 }
4851 }
4852
4853 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 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 #[allow(clippy::allow_attributes, clippy::mutable_key_type)] 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 #[allow(clippy::allow_attributes, clippy::mutable_key_type)] 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 pub fn compact(&mut self) {
4908 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 pub fn compacted(mut self) -> Self {
4989 self.compact();
4990 self
4991 }
4992
4993 fn compact_view_buffers(array: ArrayRef) -> ArrayRef {
5007 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_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 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 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 Some(ScalarValue::Time32Second(Some(86_399)))
5219 }
5220 DataType::Time32(TimeUnit::Millisecond) => {
5221 Some(ScalarValue::Time32Millisecond(Some(86_399_999)))
5223 }
5224 DataType::Time64(TimeUnit::Microsecond) => {
5225 Some(ScalarValue::Time64Microsecond(Some(86_399_999_999)))
5227 }
5228 DataType::Time64(TimeUnit::Nanosecond) => {
5229 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 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
5279pub 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
5355impl 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
5410impl 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
5429impl 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
5452impl 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
5468impl 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 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 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
5549impl 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 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 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 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
5741fn 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 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
5951pub trait ScalarType<T: ArrowNativeType> {
5953 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 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 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 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 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 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 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 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 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 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 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 #[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 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 Buffer::from(&[1]),
6487 ));
6488
6489 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 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 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 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 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 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 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 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 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 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 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(×tamp)?;
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(×tamp)?;
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(×tamp)?;
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 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 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 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 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 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 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 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 assert_eq!(
7105 ScalarValue::new_one(&DataType::Decimal128(7, 2)).unwrap(),
7106 ScalarValue::Decimal128(Some(100), 7, 2)
7107 );
7108 assert!(ScalarValue::new_one(&DataType::Decimal128(5, -1)).is_err());
7110 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 assert_eq!(
7131 ScalarValue::new_one(&DataType::Decimal256(7, 2)).unwrap(),
7132 ScalarValue::Decimal256(Some(100.into()), 7, 2)
7133 );
7134 assert!(ScalarValue::new_one(&DataType::Decimal256(5, -1)).is_err());
7136 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 assert_eq!(
7153 ScalarValue::new_ten(&DataType::Decimal128(7, 2)).unwrap(),
7154 ScalarValue::Decimal128(Some(1000), 7, 2)
7155 );
7156 assert!(ScalarValue::new_ten(&DataType::Decimal128(5, -1)).is_err());
7158 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 assert_eq!(
7175 ScalarValue::new_ten(&DataType::Decimal256(7, 2)).unwrap(),
7176 ScalarValue::Decimal256(Some(1000.into()), 7, 2)
7177 );
7178 assert!(ScalarValue::new_ten(&DataType::Decimal256(5, -1)).is_err());
7180 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 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 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 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 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 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 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 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 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 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 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 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 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 let mut s = HashSet::with_capacity(0);
7852 s.insert(v.pop().unwrap());
7854 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 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 #[derive(Debug)]
7907 struct TestCase {
7908 array: ArrayRef,
7909 scalars: Vec<ScalarValue>,
7910 }
7911
7912 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 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 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 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 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 let constructed = ScalarValue::try_from_array(&expected, 1).unwrap();
8228 assert_eq!(constructed, scalar);
8229
8230 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 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 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 let cases: Vec<ArrayRef> = vec![
8329 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 Arc::new(BooleanArray::from(vec![Some(true), None, Some(false)])),
8340 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 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 {
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 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 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 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 Arc::new(Date32Array::from(vec![Some(1), None, Some(3)])),
8403 Arc::new(Date64Array::from(vec![Some(1), None, Some(3)])),
8404 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 Arc::new(NullArray::new(3)),
8411 {
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 {
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 {
8427 let values_builder = StringBuilder::new();
8428 let mut builder = ListBuilder::new(values_builder);
8429 builder.values().append_value("A");
8431 builder.values().append_value("B");
8432 builder.append(true);
8433 builder.append(true);
8435 builder.values().append_value("?"); builder.append(false);
8438 Arc::new(builder.finish())
8439 },
8440 {
8442 let values_builder = StringBuilder::new();
8443 let mut builder = LargeListBuilder::new(values_builder);
8444 builder.values().append_value("A");
8446 builder.values().append_value("B");
8447 builder.append(true);
8448 builder.append(true);
8450 builder.append(false);
8452 Arc::new(builder.finish())
8453 },
8454 {
8456 let values_builder = Int32Builder::new();
8457 let mut builder = FixedSizeListBuilder::new(values_builder, 3);
8458
8459 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 {
8476 let values_builder = StringBuilder::new();
8477 let mut builder = ListViewBuilder::new(values_builder);
8478 builder.values().append_value("A");
8480 builder.values().append_value("B");
8481 builder.append(true);
8482 builder.append(true);
8484 builder.append(false);
8486 Arc::new(builder.finish())
8487 },
8488 {
8490 let values_builder = StringBuilder::new();
8491 let mut builder = LargeListViewBuilder::new(values_builder);
8492 builder.values().append_value("A");
8494 builder.values().append_value("B");
8495 builder.append(true);
8496 builder.append(true);
8498 builder.append(false);
8500 Arc::new(builder.finish())
8501 },
8502 {
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 builder.keys().append_value("joe");
8510 builder.values().append_value(1);
8511 builder.append(true).unwrap();
8512 builder.append(true).unwrap();
8514 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 fn round_trip_through_scalar(arr: ArrayRef) {
8531 for i in 0..arr.len() {
8532 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 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 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 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 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 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 let array = ScalarValue::iter_to_array(vec![nl0, nl1, nl2]).unwrap();
8754 let array = array.as_list::<i32>();
8755
8756 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 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 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 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 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 check_scalar_cast(ScalarValue::Int32(Some(123)), DataType::Decimal128(10, 0));
9002 check_scalar_cast(ScalarValue::Decimal128(Some(123), 3, 0), DataType::Int64);
9003 check_scalar_cast(
9005 ScalarValue::Decimal128(Some(12300), 5, 2),
9006 DataType::Decimal128(8, 5),
9007 );
9008
9009 check_scalar_cast(
9011 ScalarValue::TimestampNanosecond(Some(123456), None),
9012 DataType::Timestamp(TimeUnit::Microsecond, None),
9013 );
9014 check_scalar_cast(
9016 ScalarValue::TimestampSecond(Some(12345), None),
9017 DataType::Timestamp(TimeUnit::Second, Some("+00:00".into())),
9018 );
9019 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 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 check_scalar_cast(
9040 ScalarValue::Dictionary(
9041 Box::new(DataType::Int32),
9042 Box::new(ScalarValue::from("foo")),
9043 ),
9044 DataType::Utf8,
9045 );
9046
9047 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 fn check_scalar_cast(scalar: ScalarValue, desired_type: DataType) {
9134 let scalar_array = scalar.to_array().expect("Failed to convert to array");
9136 let cast_array = kernels::cast::cast(&scalar_array, &desired_type).unwrap();
9138
9139 let cast_scalar = ScalarValue::try_from_array(&cast_array, 0).unwrap();
9141 assert_eq!(cast_scalar.data_type(), desired_type);
9142
9143 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 let array = cast_scalar
9155 .to_array_of_size(10)
9156 .expect("Failed to convert to array of size");
9157
9158 assert_eq!(array.data_type(), &desired_type)
9160 }
9161
9162 #[test]
9163 fn test_scalar_negative() -> Result<()> {
9164 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 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 i8::MIN.into(),
9196 i16::MIN.into(),
9197 i32::MIN.into(),
9198 i64::MIN.into(),
9199 ScalarValue::try_new_decimal128(i128::MIN, 10, 5)?,
9201 ScalarValue::Decimal256(Some(i256::MIN), 20, 5),
9202 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 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 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 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 [
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 [
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 [None, 10, 2, Some(123), 10, 2, None, 11, 2],
9348 [Some(123), 10, 2, None, 10, 2, None, 11, 2],
9350 [Some(123), 8, 2, None, 10, 3, None, 11, 3],
9352 [None, 8, 2, Some(123), 10, 3, None, 11, 3],
9354 [Some(123), 8, 4, None, 10, 3, None, 12, 4],
9356 [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 (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 (
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 (
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 (ScalarValue::Int8(None), ScalarValue::Int8(None)),
9563 (ScalarValue::Int8(None), ScalarValue::Int8(Some(1))),
9564 (ScalarValue::Int8(Some(1)), ScalarValue::Int8(None)),
9565 (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 (ScalarValue::Int8(None), ScalarValue::Int16(Some(1))),
9586 (ScalarValue::Int8(Some(1)), ScalarValue::Int16(None)),
9587 (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 (
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 (
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 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 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 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 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 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 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 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 let rhs = ScalarValue::Float64(Some(1.9e19));
9676 assert_eq!(lhs.distance_u64(&rhs), None);
9677
9678 let exact_2_64_f64 = ScalarValue::Float64(Some(18446744073709551616.0));
9680 assert_eq!(lhs.distance_u64(&exact_2_64_f64), None);
9681
9682 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 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 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 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 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 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 let sample_size = 1000;
9818 let timestamps1 = get_random_timestamps(sample_size);
9819 let intervals = get_random_intervals(sample_size);
9820 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 ScalarValue::Struct(Arc::new(StructArray::from((
9893 struct_value.clone(),
9894 Buffer::from(&[0]),
9895 )))),
9896 ScalarValue::Struct(Arc::new(StructArray::from((
9898 struct_value_with_nulls.clone(),
9899 Buffer::from(&[1]),
9900 )))),
9901 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 let array = ScalarValue::iter_to_array(scalars.clone()).unwrap();
9931 check_array(array);
9932
9933 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 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 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 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 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 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); 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 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 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 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 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 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 assert_eq!(
10582 ScalarValue::new_default(&DataType::Binary).unwrap(),
10583 ScalarValue::Binary(Some(vec![]))
10584 );
10585
10586 assert_eq!(
10588 ScalarValue::new_default(&DataType::FixedSizeBinary(5)).unwrap(),
10589 ScalarValue::FixedSizeBinary(5, Some(vec![0, 0, 0, 0, 0]))
10590 );
10591
10592 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 assert_eq!(
10604 ScalarValue::new_default(&DataType::Decimal128(10, 2)).unwrap(),
10605 ScalarValue::Decimal128(Some(0), 10, 2)
10606 );
10607
10608 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); }
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); }
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); }
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); }
10653 _ => panic!("Expected LargeListView"),
10654 }
10655
10656 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 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 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 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 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); }
10731 _ => panic!("Expected Decimal128"),
10732 }
10733
10734 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 assert_eq!(
10750 ScalarValue::min(&DataType::Duration(TimeUnit::Second)),
10751 Some(ScalarValue::DurationSecond(Some(i64::MIN)))
10752 );
10753
10754 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 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 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 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); }
10827 _ => panic!("Expected Decimal128"),
10828 }
10829
10830 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))) );
10839 assert_eq!(
10840 ScalarValue::max(&DataType::Time64(TimeUnit::Microsecond)),
10841 Some(ScalarValue::Time64Microsecond(Some(86_399_999_999))) );
10843 assert_eq!(
10844 ScalarValue::max(&DataType::Timestamp(TimeUnit::Nanosecond, None)),
10845 Some(ScalarValue::TimestampNanosecond(Some(i64::MAX), None))
10846 );
10847
10848 assert_eq!(
10850 ScalarValue::max(&DataType::Duration(TimeUnit::Millisecond)),
10851 Some(ScalarValue::DurationMillisecond(Some(i64::MAX)))
10852 );
10853
10854 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 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 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 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 assert_eq!(value.len(), buffers[0].len());
10960
10961 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 let max_scale = D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE);
11519 let max_scale_less_one =
11521 D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE - 1);
11522 let max_scale_less_two =
11524 D::TYPE_CONSTRUCTOR(D::MAX_PRECISION, D::MAX_SCALE - 2);
11525
11526 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 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 let requested_element_type =
11555 DataType::Struct(Fields::from(vec![Field::new("n", DataType::Int32, true)]));
11556
11557 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 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 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 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}