1use std::borrow::Borrow;
21use std::fmt::{self, Display, Formatter};
22use std::ops::{AddAssign, SubAssign};
23
24use crate::operator::Operator;
25use crate::type_coercion::binary::{comparison_coercion_numeric, BinaryTypeCoercer};
26
27use arrow::compute::{cast_with_options, CastOptions};
28use arrow::datatypes::{
29 DataType, IntervalDayTime, IntervalMonthDayNano, IntervalUnit, TimeUnit,
30 MAX_DECIMAL128_FOR_EACH_PRECISION, MAX_DECIMAL256_FOR_EACH_PRECISION,
31 MIN_DECIMAL128_FOR_EACH_PRECISION, MIN_DECIMAL256_FOR_EACH_PRECISION,
32};
33use datafusion_common::rounding::{alter_fp_rounding_mode, next_down, next_up};
34use datafusion_common::{internal_err, Result, ScalarValue};
35
36macro_rules! get_extreme_value {
37 ($extreme:ident, $value:expr) => {
38 match $value {
39 DataType::UInt8 => ScalarValue::UInt8(Some(u8::$extreme)),
40 DataType::UInt16 => ScalarValue::UInt16(Some(u16::$extreme)),
41 DataType::UInt32 => ScalarValue::UInt32(Some(u32::$extreme)),
42 DataType::UInt64 => ScalarValue::UInt64(Some(u64::$extreme)),
43 DataType::Int8 => ScalarValue::Int8(Some(i8::$extreme)),
44 DataType::Int16 => ScalarValue::Int16(Some(i16::$extreme)),
45 DataType::Int32 => ScalarValue::Int32(Some(i32::$extreme)),
46 DataType::Int64 => ScalarValue::Int64(Some(i64::$extreme)),
47 DataType::Float32 => ScalarValue::Float32(Some(f32::$extreme)),
48 DataType::Float64 => ScalarValue::Float64(Some(f64::$extreme)),
49 DataType::Duration(TimeUnit::Second) => {
50 ScalarValue::DurationSecond(Some(i64::$extreme))
51 }
52 DataType::Duration(TimeUnit::Millisecond) => {
53 ScalarValue::DurationMillisecond(Some(i64::$extreme))
54 }
55 DataType::Duration(TimeUnit::Microsecond) => {
56 ScalarValue::DurationMicrosecond(Some(i64::$extreme))
57 }
58 DataType::Duration(TimeUnit::Nanosecond) => {
59 ScalarValue::DurationNanosecond(Some(i64::$extreme))
60 }
61 DataType::Timestamp(TimeUnit::Second, _) => {
62 ScalarValue::TimestampSecond(Some(i64::$extreme), None)
63 }
64 DataType::Timestamp(TimeUnit::Millisecond, _) => {
65 ScalarValue::TimestampMillisecond(Some(i64::$extreme), None)
66 }
67 DataType::Timestamp(TimeUnit::Microsecond, _) => {
68 ScalarValue::TimestampMicrosecond(Some(i64::$extreme), None)
69 }
70 DataType::Timestamp(TimeUnit::Nanosecond, _) => {
71 ScalarValue::TimestampNanosecond(Some(i64::$extreme), None)
72 }
73 DataType::Interval(IntervalUnit::YearMonth) => {
74 ScalarValue::IntervalYearMonth(Some(i32::$extreme))
75 }
76 DataType::Interval(IntervalUnit::DayTime) => {
77 ScalarValue::IntervalDayTime(Some(IntervalDayTime::$extreme))
78 }
79 DataType::Interval(IntervalUnit::MonthDayNano) => {
80 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::$extreme))
81 }
82 DataType::Decimal128(precision, scale) => ScalarValue::Decimal128(
83 Some(
84 paste::paste! {[<$extreme _DECIMAL128_FOR_EACH_PRECISION>]}
85 [*precision as usize],
86 ),
87 *precision,
88 *scale,
89 ),
90 DataType::Decimal256(precision, scale) => ScalarValue::Decimal256(
91 Some(
92 paste::paste! {[<$extreme _DECIMAL256_FOR_EACH_PRECISION>]}
93 [*precision as usize],
94 ),
95 *precision,
96 *scale,
97 ),
98 _ => unreachable!(),
99 }
100 };
101}
102
103macro_rules! value_transition {
104 ($bound:ident, $direction:expr, $value:expr) => {
105 match $value {
106 UInt8(Some(value)) if value == u8::$bound => UInt8(None),
107 UInt16(Some(value)) if value == u16::$bound => UInt16(None),
108 UInt32(Some(value)) if value == u32::$bound => UInt32(None),
109 UInt64(Some(value)) if value == u64::$bound => UInt64(None),
110 Int8(Some(value)) if value == i8::$bound => Int8(None),
111 Int16(Some(value)) if value == i16::$bound => Int16(None),
112 Int32(Some(value)) if value == i32::$bound => Int32(None),
113 Int64(Some(value)) if value == i64::$bound => Int64(None),
114 Float32(Some(value)) if value == f32::$bound => Float32(None),
115 Float64(Some(value)) if value == f64::$bound => Float64(None),
116 DurationSecond(Some(value)) if value == i64::$bound => DurationSecond(None),
117 DurationMillisecond(Some(value)) if value == i64::$bound => {
118 DurationMillisecond(None)
119 }
120 DurationMicrosecond(Some(value)) if value == i64::$bound => {
121 DurationMicrosecond(None)
122 }
123 DurationNanosecond(Some(value)) if value == i64::$bound => {
124 DurationNanosecond(None)
125 }
126 TimestampSecond(Some(value), tz) if value == i64::$bound => {
127 TimestampSecond(None, tz)
128 }
129 TimestampMillisecond(Some(value), tz) if value == i64::$bound => {
130 TimestampMillisecond(None, tz)
131 }
132 TimestampMicrosecond(Some(value), tz) if value == i64::$bound => {
133 TimestampMicrosecond(None, tz)
134 }
135 TimestampNanosecond(Some(value), tz) if value == i64::$bound => {
136 TimestampNanosecond(None, tz)
137 }
138 IntervalYearMonth(Some(value)) if value == i32::$bound => {
139 IntervalYearMonth(None)
140 }
141 IntervalDayTime(Some(value))
142 if value == arrow::datatypes::IntervalDayTime::$bound =>
143 {
144 IntervalDayTime(None)
145 }
146 IntervalMonthDayNano(Some(value))
147 if value == arrow::datatypes::IntervalMonthDayNano::$bound =>
148 {
149 IntervalMonthDayNano(None)
150 }
151 _ => next_value_helper::<$direction>($value),
152 }
153 };
154}
155
156#[derive(Debug, Clone, PartialEq, Eq)]
179pub struct Interval {
180 lower: ScalarValue,
181 upper: ScalarValue,
182}
183
184macro_rules! handle_float_intervals {
198 ($scalar_type:ident, $primitive_type:ident, $lower:expr, $upper:expr) => {{
199 let lower = match $lower {
200 ScalarValue::$scalar_type(Some(l_val))
201 if l_val == $primitive_type::NEG_INFINITY || l_val.is_nan() =>
202 {
203 ScalarValue::$scalar_type(None)
204 }
205 ScalarValue::$scalar_type(Some(l_val))
206 if l_val == $primitive_type::INFINITY =>
207 {
208 ScalarValue::$scalar_type(Some($primitive_type::MAX))
209 }
210 value @ ScalarValue::$scalar_type(Some(_)) => value,
211 _ => ScalarValue::$scalar_type(None),
212 };
213
214 let upper = match $upper {
215 ScalarValue::$scalar_type(Some(r_val))
216 if r_val == $primitive_type::INFINITY || r_val.is_nan() =>
217 {
218 ScalarValue::$scalar_type(None)
219 }
220 ScalarValue::$scalar_type(Some(r_val))
221 if r_val == $primitive_type::NEG_INFINITY =>
222 {
223 ScalarValue::$scalar_type(Some($primitive_type::MIN))
224 }
225 value @ ScalarValue::$scalar_type(Some(_)) => value,
226 _ => ScalarValue::$scalar_type(None),
227 };
228
229 Interval { lower, upper }
230 }};
231}
232
233macro_rules! map_floating_point_order {
243 ($value:expr, $ty:ty) => {{
244 let num_bits = std::mem::size_of::<$ty>() * 8;
245 let sign_bit = 1 << (num_bits - 1);
246 if $value & sign_bit == sign_bit {
247 !$value
249 } else {
250 $value | sign_bit
252 }
253 }};
254}
255
256impl Interval {
257 pub fn try_new(lower: ScalarValue, upper: ScalarValue) -> Result<Self> {
269 if lower.data_type() != upper.data_type() {
270 return internal_err!("Endpoints of an Interval should have the same type");
271 }
272
273 let interval = Self::new(lower, upper);
274
275 if interval.lower.is_null()
276 || interval.upper.is_null()
277 || interval.lower <= interval.upper
278 {
279 Ok(interval)
280 } else {
281 internal_err!(
282 "Interval's lower bound {} is greater than the upper bound {}",
283 interval.lower,
284 interval.upper
285 )
286 }
287 }
288
289 fn new(lower: ScalarValue, upper: ScalarValue) -> Self {
295 if let ScalarValue::Boolean(lower_bool) = lower {
296 let ScalarValue::Boolean(upper_bool) = upper else {
297 unreachable!();
299 };
300 return Self {
302 lower: ScalarValue::Boolean(Some(lower_bool.unwrap_or(false))),
303 upper: ScalarValue::Boolean(Some(upper_bool.unwrap_or(true))),
304 };
305 }
306 match lower.data_type() {
307 DataType::Float32 => handle_float_intervals!(Float32, f32, lower, upper),
309 DataType::Float64 => handle_float_intervals!(Float64, f64, lower, upper),
310 DataType::UInt8 if lower.is_null() => Self {
312 lower: ScalarValue::UInt8(Some(0)),
313 upper,
314 },
315 DataType::UInt16 if lower.is_null() => Self {
316 lower: ScalarValue::UInt16(Some(0)),
317 upper,
318 },
319 DataType::UInt32 if lower.is_null() => Self {
320 lower: ScalarValue::UInt32(Some(0)),
321 upper,
322 },
323 DataType::UInt64 if lower.is_null() => Self {
324 lower: ScalarValue::UInt64(Some(0)),
325 upper,
326 },
327 _ => Self { lower, upper },
329 }
330 }
331
332 pub fn make<T>(lower: Option<T>, upper: Option<T>) -> Result<Self>
336 where
337 ScalarValue: From<Option<T>>,
338 {
339 Self::try_new(ScalarValue::from(lower), ScalarValue::from(upper))
340 }
341
342 pub fn make_zero(data_type: &DataType) -> Result<Self> {
344 let zero_endpoint = ScalarValue::new_zero(data_type)?;
345 Ok(Self::new(zero_endpoint.clone(), zero_endpoint))
346 }
347
348 pub fn make_unbounded(data_type: &DataType) -> Result<Self> {
350 let unbounded_endpoint = ScalarValue::try_from(data_type)?;
351 Ok(Self::new(unbounded_endpoint.clone(), unbounded_endpoint))
352 }
353
354 pub fn make_symmetric_unit_interval(data_type: &DataType) -> Result<Self> {
356 Self::try_new(
357 ScalarValue::new_negative_one(data_type)?,
358 ScalarValue::new_one(data_type)?,
359 )
360 }
361
362 pub fn make_symmetric_pi_interval(data_type: &DataType) -> Result<Self> {
364 Self::try_new(
365 ScalarValue::new_negative_pi_lower(data_type)?,
366 ScalarValue::new_pi_upper(data_type)?,
367 )
368 }
369
370 pub fn make_symmetric_half_pi_interval(data_type: &DataType) -> Result<Self> {
372 Self::try_new(
373 ScalarValue::new_neg_frac_pi_2_lower(data_type)?,
374 ScalarValue::new_frac_pi_2_upper(data_type)?,
375 )
376 }
377
378 pub fn make_non_negative_infinity_interval(data_type: &DataType) -> Result<Self> {
380 Self::try_new(
381 ScalarValue::new_zero(data_type)?,
382 ScalarValue::try_from(data_type)?,
383 )
384 }
385
386 pub fn lower(&self) -> &ScalarValue {
388 &self.lower
389 }
390
391 pub fn upper(&self) -> &ScalarValue {
393 &self.upper
394 }
395
396 pub fn into_bounds(self) -> (ScalarValue, ScalarValue) {
399 (self.lower, self.upper)
400 }
401
402 pub fn data_type(&self) -> DataType {
404 let lower_type = self.lower.data_type();
405 let upper_type = self.upper.data_type();
406
407 debug_assert!(
410 lower_type == upper_type,
411 "Interval bounds have different types: {lower_type} != {upper_type}"
412 );
413 lower_type
414 }
415
416 pub fn is_unbounded(&self) -> bool {
418 self.lower.is_null() || self.upper.is_null()
419 }
420
421 pub fn cast_to(
423 &self,
424 data_type: &DataType,
425 cast_options: &CastOptions,
426 ) -> Result<Self> {
427 Self::try_new(
428 cast_scalar_value(&self.lower, data_type, cast_options)?,
429 cast_scalar_value(&self.upper, data_type, cast_options)?,
430 )
431 }
432
433 pub const CERTAINLY_FALSE: Self = Self {
434 lower: ScalarValue::Boolean(Some(false)),
435 upper: ScalarValue::Boolean(Some(false)),
436 };
437
438 pub const UNCERTAIN: Self = Self {
439 lower: ScalarValue::Boolean(Some(false)),
440 upper: ScalarValue::Boolean(Some(true)),
441 };
442
443 pub const CERTAINLY_TRUE: Self = Self {
444 lower: ScalarValue::Boolean(Some(true)),
445 upper: ScalarValue::Boolean(Some(true)),
446 };
447
448 pub fn gt<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
456 let rhs = other.borrow();
457 if self.data_type().ne(&rhs.data_type()) {
458 internal_err!(
459 "Only intervals with the same data type are comparable, lhs:{}, rhs:{}",
460 self.data_type(),
461 rhs.data_type()
462 )
463 } else if !(self.upper.is_null() || rhs.lower.is_null())
464 && self.upper <= rhs.lower
465 {
466 Ok(Self::CERTAINLY_FALSE)
469 } else if !(self.lower.is_null() || rhs.upper.is_null())
470 && (self.lower > rhs.upper)
471 {
472 Ok(Self::CERTAINLY_TRUE)
475 } else {
476 Ok(Self::UNCERTAIN)
478 }
479 }
480
481 pub fn gt_eq<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
489 let rhs = other.borrow();
490 if self.data_type().ne(&rhs.data_type()) {
491 internal_err!(
492 "Only intervals with the same data type are comparable, lhs:{}, rhs:{}",
493 self.data_type(),
494 rhs.data_type()
495 )
496 } else if !(self.lower.is_null() || rhs.upper.is_null())
497 && self.lower >= rhs.upper
498 {
499 Ok(Self::CERTAINLY_TRUE)
502 } else if !(self.upper.is_null() || rhs.lower.is_null())
503 && (self.upper < rhs.lower)
504 {
505 Ok(Self::CERTAINLY_FALSE)
508 } else {
509 Ok(Self::UNCERTAIN)
511 }
512 }
513
514 pub fn lt<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
522 other.borrow().gt(self)
523 }
524
525 pub fn lt_eq<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
533 other.borrow().gt_eq(self)
534 }
535
536 pub fn equal<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
544 let rhs = other.borrow();
545 if BinaryTypeCoercer::new(&self.data_type(), &Operator::Eq, &rhs.data_type())
546 .get_result_type()
547 .is_err()
548 {
549 internal_err!(
550 "Interval data types must be compatible for equality checks, lhs:{}, rhs:{}",
551 self.data_type(),
552 rhs.data_type()
553 )
554 } else if !self.lower.is_null()
555 && (self.lower == self.upper)
556 && (rhs.lower == rhs.upper)
557 && (self.lower == rhs.lower)
558 {
559 Ok(Self::CERTAINLY_TRUE)
560 } else if self.intersect(rhs)?.is_none() {
561 Ok(Self::CERTAINLY_FALSE)
562 } else {
563 Ok(Self::UNCERTAIN)
564 }
565 }
566
567 pub fn and<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
570 let rhs = other.borrow();
571 match (&self.lower, &self.upper, &rhs.lower, &rhs.upper) {
572 (
573 &ScalarValue::Boolean(Some(self_lower)),
574 &ScalarValue::Boolean(Some(self_upper)),
575 &ScalarValue::Boolean(Some(other_lower)),
576 &ScalarValue::Boolean(Some(other_upper)),
577 ) => {
578 let lower = self_lower && other_lower;
579 let upper = self_upper && other_upper;
580
581 Ok(Self {
582 lower: ScalarValue::Boolean(Some(lower)),
583 upper: ScalarValue::Boolean(Some(upper)),
584 })
585 }
586 _ => internal_err!("Incompatible data types for logical conjunction"),
587 }
588 }
589
590 pub fn or<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
593 let rhs = other.borrow();
594 match (&self.lower, &self.upper, &rhs.lower, &rhs.upper) {
595 (
596 &ScalarValue::Boolean(Some(self_lower)),
597 &ScalarValue::Boolean(Some(self_upper)),
598 &ScalarValue::Boolean(Some(other_lower)),
599 &ScalarValue::Boolean(Some(other_upper)),
600 ) => {
601 let lower = self_lower || other_lower;
602 let upper = self_upper || other_upper;
603
604 Ok(Self {
605 lower: ScalarValue::Boolean(Some(lower)),
606 upper: ScalarValue::Boolean(Some(upper)),
607 })
608 }
609 _ => internal_err!("Incompatible data types for logical conjunction"),
610 }
611 }
612
613 pub fn not(&self) -> Result<Self> {
615 if self.data_type().ne(&DataType::Boolean) {
616 internal_err!("Cannot apply logical negation to a non-boolean interval")
617 } else if self == &Self::CERTAINLY_TRUE {
618 Ok(Self::CERTAINLY_FALSE)
619 } else if self == &Self::CERTAINLY_FALSE {
620 Ok(Self::CERTAINLY_TRUE)
621 } else {
622 Ok(Self::UNCERTAIN)
623 }
624 }
625
626 pub fn intersect<T: Borrow<Self>>(&self, other: T) -> Result<Option<Self>> {
633 let rhs = other.borrow();
634 if self.data_type().ne(&rhs.data_type()) {
635 return internal_err!(
636 "Only intervals with the same data type are intersectable, lhs:{}, rhs:{}",
637 self.data_type(),
638 rhs.data_type()
639 );
640 };
641
642 if (!(self.lower.is_null() || rhs.upper.is_null()) && self.lower > rhs.upper)
645 || (!(self.upper.is_null() || rhs.lower.is_null()) && self.upper < rhs.lower)
646 {
647 return Ok(None);
648 }
649
650 let lower = max_of_bounds(&self.lower, &rhs.lower);
651 let upper = min_of_bounds(&self.upper, &rhs.upper);
652
653 debug_assert!(
655 (lower.is_null() || upper.is_null() || (lower <= upper)),
656 "The intersection of two intervals can not be an invalid interval"
657 );
658
659 Ok(Some(Self { lower, upper }))
660 }
661
662 pub fn union<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
668 let rhs = other.borrow();
669 if self.data_type().ne(&rhs.data_type()) {
670 return internal_err!(
671 "Cannot calculate the union of intervals with different data types, lhs:{}, rhs:{}",
672 self.data_type(),
673 rhs.data_type()
674 );
675 };
676
677 let lower = if self.lower.is_null()
678 || (!rhs.lower.is_null() && self.lower <= rhs.lower)
679 {
680 self.lower.clone()
681 } else {
682 rhs.lower.clone()
683 };
684 let upper = if self.upper.is_null()
685 || (!rhs.upper.is_null() && self.upper >= rhs.upper)
686 {
687 self.upper.clone()
688 } else {
689 rhs.upper.clone()
690 };
691
692 debug_assert!(
694 (lower.is_null() || upper.is_null() || (lower <= upper)),
695 "The union of two intervals can not be an invalid interval"
696 );
697
698 Ok(Self { lower, upper })
699 }
700
701 pub fn contains_value<T: Borrow<ScalarValue>>(&self, other: T) -> Result<bool> {
703 let rhs = other.borrow();
704
705 let (lhs_lower, lhs_upper, rhs) = if self.data_type().eq(&rhs.data_type()) {
706 (&self.lower, &self.upper, rhs)
707 } else if let Some(common_type) =
708 comparison_coercion_numeric(&self.data_type(), &rhs.data_type())
709 {
710 (
711 &self.lower.cast_to(&common_type)?,
712 &self.upper.cast_to(&common_type)?,
713 &rhs.cast_to(&common_type)?,
714 )
715 } else {
716 return internal_err!(
717 "Data types must be compatible for containment checks, lhs:{}, rhs:{}",
718 self.data_type(),
719 rhs.data_type()
720 );
721 };
722
723 Ok(lhs_lower <= rhs && (lhs_upper.is_null() || rhs <= lhs_upper))
726 }
727
728 pub fn contains<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
736 let rhs = other.borrow();
737 if self.data_type().ne(&rhs.data_type()) {
738 return internal_err!(
739 "Interval data types must match for containment checks, lhs:{}, rhs:{}",
740 self.data_type(),
741 rhs.data_type()
742 );
743 };
744
745 match self.intersect(rhs)? {
746 Some(intersection) => {
747 if &intersection == rhs {
748 Ok(Self::CERTAINLY_TRUE)
749 } else {
750 Ok(Self::UNCERTAIN)
751 }
752 }
753 None => Ok(Self::CERTAINLY_FALSE),
754 }
755 }
756
757 pub fn add<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
762 let rhs = other.borrow();
763 let dt =
764 BinaryTypeCoercer::new(&self.data_type(), &Operator::Plus, &rhs.data_type())
765 .get_result_type()?;
766
767 Ok(Self::new(
768 add_bounds::<false>(&dt, &self.lower, &rhs.lower),
769 add_bounds::<true>(&dt, &self.upper, &rhs.upper),
770 ))
771 }
772
773 pub fn sub<T: Borrow<Interval>>(&self, other: T) -> Result<Self> {
779 let rhs = other.borrow();
780 let dt =
781 BinaryTypeCoercer::new(&self.data_type(), &Operator::Minus, &rhs.data_type())
782 .get_result_type()?;
783
784 Ok(Self::new(
785 sub_bounds::<false>(&dt, &self.lower, &rhs.upper),
786 sub_bounds::<true>(&dt, &self.upper, &rhs.lower),
787 ))
788 }
789
790 pub fn mul<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
800 let rhs = other.borrow();
801 let dt = if self.data_type().eq(&rhs.data_type()) {
802 self.data_type()
803 } else {
804 return internal_err!(
805 "Intervals must have the same data type for multiplication, lhs:{}, rhs:{}",
806 self.data_type(),
807 rhs.data_type()
808 );
809 };
810
811 let zero = ScalarValue::new_zero(&dt)?;
812
813 let result = match (
814 self.contains_value(&zero)?,
815 rhs.contains_value(&zero)?,
816 dt.is_unsigned_integer(),
817 ) {
818 (true, true, false) => mul_helper_multi_zero_inclusive(&dt, self, rhs),
819 (true, false, false) => {
820 mul_helper_single_zero_inclusive(&dt, self, rhs, zero)
821 }
822 (false, true, false) => {
823 mul_helper_single_zero_inclusive(&dt, rhs, self, zero)
824 }
825 _ => mul_helper_zero_exclusive(&dt, self, rhs, zero),
826 };
827 Ok(result)
828 }
829
830 pub fn div<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
843 let rhs = other.borrow();
844 let dt = if self.data_type().eq(&rhs.data_type()) {
845 self.data_type()
846 } else {
847 return internal_err!(
848 "Intervals must have the same data type for division, lhs:{}, rhs:{}",
849 self.data_type(),
850 rhs.data_type()
851 );
852 };
853
854 let zero = ScalarValue::new_zero(&dt)?;
855 let zero_point = match &dt {
857 DataType::Float32 | DataType::Float64 => Self::new(zero.clone(), zero),
858 _ => Self::new(prev_value(zero.clone()), next_value(zero)),
859 };
860
861 if rhs.contains(&zero_point)? == Self::CERTAINLY_TRUE && !dt.is_unsigned_integer()
864 {
865 Self::make_unbounded(&dt)
866 }
867 else if self.contains(&zero_point)? == Self::CERTAINLY_TRUE
870 && !dt.is_unsigned_integer()
871 {
872 Ok(div_helper_lhs_zero_inclusive(&dt, self, rhs, &zero_point))
873 } else {
874 Ok(div_helper_zero_exclusive(&dt, self, rhs, &zero_point))
875 }
876 }
877
878 pub fn width(&self) -> Result<ScalarValue> {
883 let dt = self.data_type();
884 let width_dt =
885 BinaryTypeCoercer::new(&dt, &Operator::Minus, &dt).get_result_type()?;
886 Ok(sub_bounds::<true>(&width_dt, &self.upper, &self.lower))
887 }
888
889 pub fn cardinality(&self) -> Option<u64> {
897 let data_type = self.data_type();
898 if data_type.is_integer() {
899 self.upper.distance(&self.lower).map(|diff| diff as u64)
900 } else if data_type.is_floating() {
901 match (&self.lower, &self.upper) {
905 (
908 ScalarValue::Float32(Some(lower)),
909 ScalarValue::Float32(Some(upper)),
910 ) => {
911 let lower_bits = map_floating_point_order!(lower.to_bits(), u32);
912 let upper_bits = map_floating_point_order!(upper.to_bits(), u32);
913 Some((upper_bits - lower_bits) as u64)
914 }
915 (
916 ScalarValue::Float64(Some(lower)),
917 ScalarValue::Float64(Some(upper)),
918 ) => {
919 let lower_bits = map_floating_point_order!(lower.to_bits(), u64);
920 let upper_bits = map_floating_point_order!(upper.to_bits(), u64);
921 let count = upper_bits - lower_bits;
922 (count != u64::MAX).then_some(count)
923 }
924 _ => None,
925 }
926 } else {
927 None
929 }
930 .map(|result| result + 1)
931 }
932
933 pub fn arithmetic_negate(&self) -> Result<Self> {
939 Ok(Self {
940 lower: self.upper.arithmetic_negate()?,
941 upper: self.lower.arithmetic_negate()?,
942 })
943 }
944}
945
946impl Display for Interval {
947 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
948 write!(f, "[{}, {}]", self.lower, self.upper)
949 }
950}
951
952pub fn apply_operator(op: &Operator, lhs: &Interval, rhs: &Interval) -> Result<Interval> {
954 match *op {
955 Operator::Eq => lhs.equal(rhs),
956 Operator::NotEq => lhs.equal(rhs)?.not(),
957 Operator::Gt => lhs.gt(rhs),
958 Operator::GtEq => lhs.gt_eq(rhs),
959 Operator::Lt => lhs.lt(rhs),
960 Operator::LtEq => lhs.lt_eq(rhs),
961 Operator::And => lhs.and(rhs),
962 Operator::Plus => lhs.add(rhs),
963 Operator::Minus => lhs.sub(rhs),
964 Operator::Multiply => lhs.mul(rhs),
965 Operator::Divide => lhs.div(rhs),
966 _ => internal_err!("Interval arithmetic does not support the operator {op}"),
967 }
968}
969
970fn add_bounds<const UPPER: bool>(
978 dt: &DataType,
979 lhs: &ScalarValue,
980 rhs: &ScalarValue,
981) -> ScalarValue {
982 if lhs.is_null() || rhs.is_null() {
983 return ScalarValue::try_from(dt).unwrap();
984 }
985
986 match dt {
987 DataType::Float64 | DataType::Float32 => {
988 alter_fp_rounding_mode::<UPPER, _>(lhs, rhs, |lhs, rhs| lhs.add_checked(rhs))
989 }
990 _ => lhs.add_checked(rhs),
991 }
992 .unwrap_or_else(|_| handle_overflow::<UPPER>(dt, Operator::Plus, lhs, rhs))
993}
994
995fn sub_bounds<const UPPER: bool>(
1003 dt: &DataType,
1004 lhs: &ScalarValue,
1005 rhs: &ScalarValue,
1006) -> ScalarValue {
1007 if lhs.is_null() || rhs.is_null() {
1008 return ScalarValue::try_from(dt).unwrap();
1009 }
1010
1011 match dt {
1012 DataType::Float64 | DataType::Float32 => {
1013 alter_fp_rounding_mode::<UPPER, _>(lhs, rhs, |lhs, rhs| lhs.sub_checked(rhs))
1014 }
1015 _ => lhs.sub_checked(rhs),
1016 }
1017 .unwrap_or_else(|_| handle_overflow::<UPPER>(dt, Operator::Minus, lhs, rhs))
1018}
1019
1020fn mul_bounds<const UPPER: bool>(
1028 dt: &DataType,
1029 lhs: &ScalarValue,
1030 rhs: &ScalarValue,
1031) -> ScalarValue {
1032 if lhs.is_null() || rhs.is_null() {
1033 return ScalarValue::try_from(dt).unwrap();
1034 }
1035
1036 match dt {
1037 DataType::Float64 | DataType::Float32 => {
1038 alter_fp_rounding_mode::<UPPER, _>(lhs, rhs, |lhs, rhs| lhs.mul_checked(rhs))
1039 }
1040 _ => lhs.mul_checked(rhs),
1041 }
1042 .unwrap_or_else(|_| handle_overflow::<UPPER>(dt, Operator::Multiply, lhs, rhs))
1043}
1044
1045fn div_bounds<const UPPER: bool>(
1053 dt: &DataType,
1054 lhs: &ScalarValue,
1055 rhs: &ScalarValue,
1056) -> ScalarValue {
1057 let zero = ScalarValue::new_zero(dt).unwrap();
1058
1059 if (lhs.is_null() || rhs.eq(&zero)) || (dt.is_unsigned_integer() && rhs.is_null()) {
1060 return ScalarValue::try_from(dt).unwrap();
1061 } else if rhs.is_null() {
1062 return zero;
1063 }
1064
1065 match dt {
1066 DataType::Float64 | DataType::Float32 => {
1067 alter_fp_rounding_mode::<UPPER, _>(lhs, rhs, |lhs, rhs| lhs.div(rhs))
1068 }
1069 _ => lhs.div(rhs),
1070 }
1071 .unwrap_or_else(|_| handle_overflow::<UPPER>(dt, Operator::Divide, lhs, rhs))
1072}
1073
1074fn handle_overflow<const UPPER: bool>(
1092 dt: &DataType,
1093 op: Operator,
1094 lhs: &ScalarValue,
1095 rhs: &ScalarValue,
1096) -> ScalarValue {
1097 let lhs_zero = ScalarValue::new_zero(&lhs.data_type()).unwrap();
1098 let rhs_zero = ScalarValue::new_zero(&rhs.data_type()).unwrap();
1099 let positive_sign = match op {
1100 Operator::Multiply | Operator::Divide => {
1101 lhs.lt(&lhs_zero) && rhs.lt(&rhs_zero)
1102 || lhs.gt(&lhs_zero) && rhs.gt(&rhs_zero)
1103 }
1104 Operator::Plus => lhs.ge(&lhs_zero),
1105 Operator::Minus => lhs.ge(rhs),
1106 _ => {
1107 unreachable!()
1108 }
1109 };
1110
1111 match (UPPER, positive_sign) {
1112 (true, true) | (false, false) => ScalarValue::try_from(dt).unwrap(),
1113 (true, false) => {
1114 get_extreme_value!(MIN, dt)
1115 }
1116 (false, true) => {
1117 get_extreme_value!(MAX, dt)
1118 }
1119 }
1120}
1121
1122fn next_value(value: ScalarValue) -> ScalarValue {
1125 use ScalarValue::*;
1126 value_transition!(MAX, true, value)
1127}
1128
1129fn prev_value(value: ScalarValue) -> ScalarValue {
1132 use ScalarValue::*;
1133 value_transition!(MIN, false, value)
1134}
1135
1136trait OneTrait: Sized + std::ops::Add + std::ops::Sub {
1137 fn one() -> Self;
1138}
1139macro_rules! impl_OneTrait{
1140 ($($m:ty),*) => {$( impl OneTrait for $m { fn one() -> Self { 1 as $m } })*}
1141}
1142impl_OneTrait! {u8, u16, u32, u64, i8, i16, i32, i64, i128}
1143
1144impl OneTrait for IntervalDayTime {
1145 fn one() -> Self {
1146 IntervalDayTime {
1147 days: 0,
1148 milliseconds: 1,
1149 }
1150 }
1151}
1152
1153impl OneTrait for IntervalMonthDayNano {
1154 fn one() -> Self {
1155 IntervalMonthDayNano {
1156 months: 0,
1157 days: 0,
1158 nanoseconds: 1,
1159 }
1160 }
1161}
1162
1163fn increment_decrement<const INC: bool, T: OneTrait + SubAssign + AddAssign>(
1166 mut value: T,
1167) -> T {
1168 if INC {
1169 value.add_assign(T::one());
1170 } else {
1171 value.sub_assign(T::one());
1172 }
1173 value
1174}
1175
1176fn next_value_helper<const INC: bool>(value: ScalarValue) -> ScalarValue {
1179 use ScalarValue::*;
1180 match value {
1181 Float32(Some(val)) => {
1183 debug_assert!(val.is_finite(), "Non-standardized floating point usage");
1184 Float32(Some(if INC { next_up(val) } else { next_down(val) }))
1185 }
1186 Float64(Some(val)) => {
1187 debug_assert!(val.is_finite(), "Non-standardized floating point usage");
1188 Float64(Some(if INC { next_up(val) } else { next_down(val) }))
1189 }
1190 Int8(Some(val)) => Int8(Some(increment_decrement::<INC, i8>(val))),
1191 Int16(Some(val)) => Int16(Some(increment_decrement::<INC, i16>(val))),
1192 Int32(Some(val)) => Int32(Some(increment_decrement::<INC, i32>(val))),
1193 Int64(Some(val)) => Int64(Some(increment_decrement::<INC, i64>(val))),
1194 UInt8(Some(val)) => UInt8(Some(increment_decrement::<INC, u8>(val))),
1195 UInt16(Some(val)) => UInt16(Some(increment_decrement::<INC, u16>(val))),
1196 UInt32(Some(val)) => UInt32(Some(increment_decrement::<INC, u32>(val))),
1197 UInt64(Some(val)) => UInt64(Some(increment_decrement::<INC, u64>(val))),
1198 DurationSecond(Some(val)) => {
1199 DurationSecond(Some(increment_decrement::<INC, i64>(val)))
1200 }
1201 DurationMillisecond(Some(val)) => {
1202 DurationMillisecond(Some(increment_decrement::<INC, i64>(val)))
1203 }
1204 DurationMicrosecond(Some(val)) => {
1205 DurationMicrosecond(Some(increment_decrement::<INC, i64>(val)))
1206 }
1207 DurationNanosecond(Some(val)) => {
1208 DurationNanosecond(Some(increment_decrement::<INC, i64>(val)))
1209 }
1210 TimestampSecond(Some(val), tz) => {
1211 TimestampSecond(Some(increment_decrement::<INC, i64>(val)), tz)
1212 }
1213 TimestampMillisecond(Some(val), tz) => {
1214 TimestampMillisecond(Some(increment_decrement::<INC, i64>(val)), tz)
1215 }
1216 TimestampMicrosecond(Some(val), tz) => {
1217 TimestampMicrosecond(Some(increment_decrement::<INC, i64>(val)), tz)
1218 }
1219 TimestampNanosecond(Some(val), tz) => {
1220 TimestampNanosecond(Some(increment_decrement::<INC, i64>(val)), tz)
1221 }
1222 IntervalYearMonth(Some(val)) => {
1223 IntervalYearMonth(Some(increment_decrement::<INC, i32>(val)))
1224 }
1225 IntervalDayTime(Some(val)) => IntervalDayTime(Some(increment_decrement::<
1226 INC,
1227 arrow::datatypes::IntervalDayTime,
1228 >(val))),
1229 IntervalMonthDayNano(Some(val)) => {
1230 IntervalMonthDayNano(Some(increment_decrement::<
1231 INC,
1232 arrow::datatypes::IntervalMonthDayNano,
1233 >(val)))
1234 }
1235 _ => value, }
1237}
1238
1239fn max_of_bounds(first: &ScalarValue, second: &ScalarValue) -> ScalarValue {
1242 if !first.is_null() && (second.is_null() || first >= second) {
1243 first.clone()
1244 } else {
1245 second.clone()
1246 }
1247}
1248
1249fn min_of_bounds(first: &ScalarValue, second: &ScalarValue) -> ScalarValue {
1252 if !first.is_null() && (second.is_null() || first <= second) {
1253 first.clone()
1254 } else {
1255 second.clone()
1256 }
1257}
1258
1259pub fn satisfy_greater(
1288 left: &Interval,
1289 right: &Interval,
1290 strict: bool,
1291) -> Result<Option<(Interval, Interval)>> {
1292 if left.data_type().ne(&right.data_type()) {
1293 return internal_err!(
1294 "Intervals must have the same data type, lhs:{}, rhs:{}",
1295 left.data_type(),
1296 right.data_type()
1297 );
1298 }
1299
1300 if !left.upper.is_null() && left.upper <= right.lower {
1301 if !strict && left.upper == right.lower {
1302 return Ok(Some((
1304 Interval::new(left.upper.clone(), left.upper.clone()),
1305 Interval::new(left.upper.clone(), left.upper.clone()),
1306 )));
1307 } else {
1308 return Ok(None);
1312 }
1313 }
1314
1315 let new_left_lower = if left.lower.is_null() || left.lower <= right.lower {
1318 if strict {
1319 next_value(right.lower.clone())
1320 } else {
1321 right.lower.clone()
1322 }
1323 } else {
1324 left.lower.clone()
1325 };
1326 let new_right_upper = if right.upper.is_null()
1329 || (!left.upper.is_null() && left.upper <= right.upper)
1330 {
1331 if strict {
1332 prev_value(left.upper.clone())
1333 } else {
1334 left.upper.clone()
1335 }
1336 } else {
1337 right.upper.clone()
1338 };
1339 Ok(Some((
1341 Interval::new(new_left_lower, left.upper.clone()),
1342 Interval::new(right.lower.clone(), new_right_upper),
1343 )))
1344}
1345
1346fn mul_helper_multi_zero_inclusive(
1362 dt: &DataType,
1363 lhs: &Interval,
1364 rhs: &Interval,
1365) -> Interval {
1366 if lhs.lower.is_null()
1367 || lhs.upper.is_null()
1368 || rhs.lower.is_null()
1369 || rhs.upper.is_null()
1370 {
1371 return Interval::make_unbounded(dt).unwrap();
1372 }
1373 let lower = min_of_bounds(
1376 &mul_bounds::<false>(dt, &lhs.lower, &rhs.upper),
1377 &mul_bounds::<false>(dt, &rhs.lower, &lhs.upper),
1378 );
1379 let upper = max_of_bounds(
1380 &mul_bounds::<true>(dt, &lhs.upper, &rhs.upper),
1381 &mul_bounds::<true>(dt, &lhs.lower, &rhs.lower),
1382 );
1383 Interval::new(lower, upper)
1385}
1386
1387fn mul_helper_single_zero_inclusive(
1409 dt: &DataType,
1410 lhs: &Interval,
1411 rhs: &Interval,
1412 zero: ScalarValue,
1413) -> Interval {
1414 if rhs.upper <= zero && !rhs.upper.is_null() {
1416 let lower = mul_bounds::<false>(dt, &lhs.upper, &rhs.lower);
1419 let upper = mul_bounds::<true>(dt, &lhs.lower, &rhs.lower);
1420 Interval::new(lower, upper)
1421 } else {
1422 let lower = mul_bounds::<false>(dt, &lhs.lower, &rhs.upper);
1425 let upper = mul_bounds::<true>(dt, &lhs.upper, &rhs.upper);
1426 Interval::new(lower, upper)
1427 }
1428}
1429
1430fn mul_helper_zero_exclusive(
1461 dt: &DataType,
1462 lhs: &Interval,
1463 rhs: &Interval,
1464 zero: ScalarValue,
1465) -> Interval {
1466 let (lower, upper) = match (
1467 lhs.upper <= zero && !lhs.upper.is_null(),
1468 rhs.upper <= zero && !rhs.upper.is_null(),
1469 ) {
1470 (true, true) => (
1472 mul_bounds::<false>(dt, &lhs.upper, &rhs.upper),
1475 mul_bounds::<true>(dt, &lhs.lower, &rhs.lower),
1476 ),
1477 (true, false) => (
1478 mul_bounds::<false>(dt, &lhs.lower, &rhs.upper),
1481 mul_bounds::<true>(dt, &lhs.upper, &rhs.lower),
1482 ),
1483 (false, true) => (
1484 mul_bounds::<false>(dt, &rhs.lower, &lhs.upper),
1487 mul_bounds::<true>(dt, &rhs.upper, &lhs.lower),
1488 ),
1489 (false, false) => (
1490 mul_bounds::<false>(dt, &lhs.lower, &rhs.lower),
1493 mul_bounds::<true>(dt, &lhs.upper, &rhs.upper),
1494 ),
1495 };
1496 Interval::new(lower, upper)
1497}
1498
1499fn div_helper_lhs_zero_inclusive(
1521 dt: &DataType,
1522 lhs: &Interval,
1523 rhs: &Interval,
1524 zero_point: &Interval,
1525) -> Interval {
1526 if rhs.upper <= zero_point.lower && !rhs.upper.is_null() {
1528 let lower = div_bounds::<false>(dt, &lhs.upper, &rhs.upper);
1531 let upper = div_bounds::<true>(dt, &lhs.lower, &rhs.upper);
1532 Interval::new(lower, upper)
1533 } else {
1534 let lower = div_bounds::<false>(dt, &lhs.lower, &rhs.lower);
1537 let upper = div_bounds::<true>(dt, &lhs.upper, &rhs.lower);
1538 Interval::new(lower, upper)
1539 }
1540}
1541
1542fn div_helper_zero_exclusive(
1574 dt: &DataType,
1575 lhs: &Interval,
1576 rhs: &Interval,
1577 zero_point: &Interval,
1578) -> Interval {
1579 let (lower, upper) = match (
1580 lhs.upper <= zero_point.lower && !lhs.upper.is_null(),
1581 rhs.upper <= zero_point.lower && !rhs.upper.is_null(),
1582 ) {
1583 (true, true) => (
1585 div_bounds::<false>(dt, &lhs.upper, &rhs.lower),
1588 div_bounds::<true>(dt, &lhs.lower, &rhs.upper),
1589 ),
1590 (true, false) => (
1591 div_bounds::<false>(dt, &lhs.lower, &rhs.lower),
1594 div_bounds::<true>(dt, &lhs.upper, &rhs.upper),
1595 ),
1596 (false, true) => (
1597 div_bounds::<false>(dt, &lhs.upper, &rhs.upper),
1600 div_bounds::<true>(dt, &lhs.lower, &rhs.lower),
1601 ),
1602 (false, false) => (
1603 div_bounds::<false>(dt, &lhs.lower, &rhs.upper),
1606 div_bounds::<true>(dt, &lhs.upper, &rhs.lower),
1607 ),
1608 };
1609 Interval::new(lower, upper)
1610}
1611
1612pub fn cardinality_ratio(initial_interval: &Interval, final_interval: &Interval) -> f64 {
1617 match (final_interval.cardinality(), initial_interval.cardinality()) {
1618 (Some(final_interval), Some(initial_interval)) => {
1619 (final_interval as f64) / (initial_interval as f64)
1620 }
1621 _ => 1.0,
1622 }
1623}
1624
1625fn cast_scalar_value(
1627 value: &ScalarValue,
1628 data_type: &DataType,
1629 cast_options: &CastOptions,
1630) -> Result<ScalarValue> {
1631 let cast_array = cast_with_options(&value.to_array()?, data_type, cast_options)?;
1632 ScalarValue::try_from_array(&cast_array, 0)
1633}
1634
1635#[derive(Debug, Clone, PartialEq, Eq)]
1670pub enum NullableInterval {
1671 Null { datatype: DataType },
1674 MaybeNull { values: Interval },
1677 NotNull { values: Interval },
1679}
1680
1681impl Display for NullableInterval {
1682 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1683 match self {
1684 Self::Null { .. } => write!(f, "NullableInterval: {{NULL}}"),
1685 Self::MaybeNull { values } => {
1686 write!(f, "NullableInterval: {} U {{NULL}}", values)
1687 }
1688 Self::NotNull { values } => write!(f, "NullableInterval: {}", values),
1689 }
1690 }
1691}
1692
1693impl From<ScalarValue> for NullableInterval {
1694 fn from(value: ScalarValue) -> Self {
1696 if value.is_null() {
1697 Self::Null {
1698 datatype: value.data_type(),
1699 }
1700 } else {
1701 Self::NotNull {
1702 values: Interval {
1703 lower: value.clone(),
1704 upper: value,
1705 },
1706 }
1707 }
1708 }
1709}
1710
1711impl NullableInterval {
1712 pub fn values(&self) -> Option<&Interval> {
1714 match self {
1715 Self::Null { .. } => None,
1716 Self::MaybeNull { values } | Self::NotNull { values } => Some(values),
1717 }
1718 }
1719
1720 pub fn data_type(&self) -> DataType {
1722 match self {
1723 Self::Null { datatype } => datatype.clone(),
1724 Self::MaybeNull { values } | Self::NotNull { values } => values.data_type(),
1725 }
1726 }
1727
1728 pub fn is_certainly_true(&self) -> bool {
1730 match self {
1731 Self::Null { .. } | Self::MaybeNull { .. } => false,
1732 Self::NotNull { values } => values == &Interval::CERTAINLY_TRUE,
1733 }
1734 }
1735
1736 pub fn is_certainly_false(&self) -> bool {
1738 match self {
1739 Self::Null { .. } => false,
1740 Self::MaybeNull { .. } => false,
1741 Self::NotNull { values } => values == &Interval::CERTAINLY_FALSE,
1742 }
1743 }
1744
1745 fn not(&self) -> Result<Self> {
1747 match self {
1748 Self::Null { datatype } => Ok(Self::Null {
1749 datatype: datatype.clone(),
1750 }),
1751 Self::MaybeNull { values } => Ok(Self::MaybeNull {
1752 values: values.not()?,
1753 }),
1754 Self::NotNull { values } => Ok(Self::NotNull {
1755 values: values.not()?,
1756 }),
1757 }
1758 }
1759
1760 pub fn apply_operator(&self, op: &Operator, rhs: &Self) -> Result<Self> {
1808 match op {
1809 Operator::IsDistinctFrom => {
1810 let values = match (self, rhs) {
1811 (Self::Null { .. }, Self::Null { .. }) => Interval::CERTAINLY_FALSE,
1813 (Self::NotNull { .. }, _) | (_, Self::NotNull { .. }) => {
1816 let lhs_values = self.values();
1817 let rhs_values = rhs.values();
1818 match (lhs_values, rhs_values) {
1819 (Some(lhs_values), Some(rhs_values)) => {
1820 lhs_values.equal(rhs_values)?.not()?
1821 }
1822 (Some(_), None) | (None, Some(_)) => Interval::CERTAINLY_TRUE,
1823 (None, None) => unreachable!("Null case handled above"),
1824 }
1825 }
1826 _ => Interval::UNCERTAIN,
1827 };
1828 Ok(Self::NotNull { values })
1830 }
1831 Operator::IsNotDistinctFrom => self
1832 .apply_operator(&Operator::IsDistinctFrom, rhs)
1833 .map(|i| i.not())?,
1834 _ => {
1835 if let (Some(left_values), Some(right_values)) =
1836 (self.values(), rhs.values())
1837 {
1838 let values = apply_operator(op, left_values, right_values)?;
1839 match (self, rhs) {
1840 (Self::NotNull { .. }, Self::NotNull { .. }) => {
1841 Ok(Self::NotNull { values })
1842 }
1843 _ => Ok(Self::MaybeNull { values }),
1844 }
1845 } else if op.supports_propagation() {
1846 Ok(Self::Null {
1847 datatype: DataType::Boolean,
1848 })
1849 } else {
1850 Ok(Self::Null {
1851 datatype: self.data_type(),
1852 })
1853 }
1854 }
1855 }
1856 }
1857
1858 pub fn contains<T: Borrow<Self>>(&self, other: T) -> Result<Self> {
1866 let rhs = other.borrow();
1867 if let (Some(left_values), Some(right_values)) = (self.values(), rhs.values()) {
1868 left_values
1869 .contains(right_values)
1870 .map(|values| match (self, rhs) {
1871 (Self::NotNull { .. }, Self::NotNull { .. }) => {
1872 Self::NotNull { values }
1873 }
1874 _ => Self::MaybeNull { values },
1875 })
1876 } else {
1877 Ok(Self::Null {
1878 datatype: DataType::Boolean,
1879 })
1880 }
1881 }
1882
1883 pub fn single_value(&self) -> Option<ScalarValue> {
1908 match self {
1909 Self::Null { datatype } => {
1910 Some(ScalarValue::try_from(datatype).unwrap_or(ScalarValue::Null))
1911 }
1912 Self::MaybeNull { values } | Self::NotNull { values }
1913 if values.lower == values.upper && !values.lower.is_null() =>
1914 {
1915 Some(values.lower.clone())
1916 }
1917 _ => None,
1918 }
1919 }
1920}
1921
1922#[cfg(test)]
1923mod tests {
1924 use crate::{
1925 interval_arithmetic::{
1926 handle_overflow, next_value, prev_value, satisfy_greater, Interval,
1927 },
1928 operator::Operator,
1929 };
1930
1931 use arrow::datatypes::DataType;
1932 use datafusion_common::rounding::{next_down, next_up};
1933 use datafusion_common::{Result, ScalarValue};
1934
1935 #[test]
1936 fn test_next_prev_value() -> Result<()> {
1937 let zeros = vec![
1938 ScalarValue::new_zero(&DataType::UInt8)?,
1939 ScalarValue::new_zero(&DataType::UInt16)?,
1940 ScalarValue::new_zero(&DataType::UInt32)?,
1941 ScalarValue::new_zero(&DataType::UInt64)?,
1942 ScalarValue::new_zero(&DataType::Int8)?,
1943 ScalarValue::new_zero(&DataType::Int16)?,
1944 ScalarValue::new_zero(&DataType::Int32)?,
1945 ScalarValue::new_zero(&DataType::Int64)?,
1946 ];
1947 let ones = vec![
1948 ScalarValue::new_one(&DataType::UInt8)?,
1949 ScalarValue::new_one(&DataType::UInt16)?,
1950 ScalarValue::new_one(&DataType::UInt32)?,
1951 ScalarValue::new_one(&DataType::UInt64)?,
1952 ScalarValue::new_one(&DataType::Int8)?,
1953 ScalarValue::new_one(&DataType::Int16)?,
1954 ScalarValue::new_one(&DataType::Int32)?,
1955 ScalarValue::new_one(&DataType::Int64)?,
1956 ];
1957 zeros.into_iter().zip(ones).for_each(|(z, o)| {
1958 assert_eq!(next_value(z.clone()), o);
1959 assert_eq!(prev_value(o), z);
1960 });
1961
1962 let values = vec![
1963 ScalarValue::new_zero(&DataType::Float32)?,
1964 ScalarValue::new_zero(&DataType::Float64)?,
1965 ];
1966 let eps = vec![
1967 ScalarValue::Float32(Some(1e-6)),
1968 ScalarValue::Float64(Some(1e-6)),
1969 ];
1970 values.into_iter().zip(eps).for_each(|(value, eps)| {
1971 assert!(next_value(value.clone())
1972 .sub(value.clone())
1973 .unwrap()
1974 .lt(&eps));
1975 assert!(value.sub(prev_value(value.clone())).unwrap().lt(&eps));
1976 assert_ne!(next_value(value.clone()), value);
1977 assert_ne!(prev_value(value.clone()), value);
1978 });
1979
1980 let min_max = vec![
1981 (
1982 ScalarValue::UInt64(Some(u64::MIN)),
1983 ScalarValue::UInt64(Some(u64::MAX)),
1984 ),
1985 (
1986 ScalarValue::Int8(Some(i8::MIN)),
1987 ScalarValue::Int8(Some(i8::MAX)),
1988 ),
1989 (
1990 ScalarValue::Float32(Some(f32::MIN)),
1991 ScalarValue::Float32(Some(f32::MAX)),
1992 ),
1993 (
1994 ScalarValue::Float64(Some(f64::MIN)),
1995 ScalarValue::Float64(Some(f64::MAX)),
1996 ),
1997 ];
1998 let inf = vec![
1999 ScalarValue::UInt64(None),
2000 ScalarValue::Int8(None),
2001 ScalarValue::Float32(None),
2002 ScalarValue::Float64(None),
2003 ];
2004 min_max.into_iter().zip(inf).for_each(|((min, max), inf)| {
2005 assert_eq!(next_value(max.clone()), inf);
2006 assert_ne!(prev_value(max.clone()), max);
2007 assert_ne!(prev_value(max), inf);
2008
2009 assert_eq!(prev_value(min.clone()), inf);
2010 assert_ne!(next_value(min.clone()), min);
2011 assert_ne!(next_value(min), inf);
2012
2013 assert_eq!(next_value(inf.clone()), inf);
2014 assert_eq!(prev_value(inf.clone()), inf);
2015 });
2016
2017 Ok(())
2018 }
2019
2020 #[test]
2021 fn test_new_interval() -> Result<()> {
2022 use ScalarValue::*;
2023
2024 let cases = vec![
2025 (
2026 (Boolean(None), Boolean(Some(false))),
2027 Boolean(Some(false)),
2028 Boolean(Some(false)),
2029 ),
2030 (
2031 (Boolean(Some(false)), Boolean(None)),
2032 Boolean(Some(false)),
2033 Boolean(Some(true)),
2034 ),
2035 (
2036 (Boolean(Some(false)), Boolean(Some(true))),
2037 Boolean(Some(false)),
2038 Boolean(Some(true)),
2039 ),
2040 (
2041 (UInt16(Some(u16::MAX)), UInt16(None)),
2042 UInt16(Some(u16::MAX)),
2043 UInt16(None),
2044 ),
2045 (
2046 (Int16(None), Int16(Some(-1000))),
2047 Int16(None),
2048 Int16(Some(-1000)),
2049 ),
2050 (
2051 (Float32(Some(f32::MAX)), Float32(Some(f32::MAX))),
2052 Float32(Some(f32::MAX)),
2053 Float32(Some(f32::MAX)),
2054 ),
2055 (
2056 (Float32(Some(f32::NAN)), Float32(Some(f32::MIN))),
2057 Float32(None),
2058 Float32(Some(f32::MIN)),
2059 ),
2060 (
2061 (
2062 Float64(Some(f64::NEG_INFINITY)),
2063 Float64(Some(f64::INFINITY)),
2064 ),
2065 Float64(None),
2066 Float64(None),
2067 ),
2068 ];
2069 for (inputs, lower, upper) in cases {
2070 let result = Interval::try_new(inputs.0, inputs.1)?;
2071 assert_eq!(result.clone().lower(), &lower);
2072 assert_eq!(result.upper(), &upper);
2073 }
2074
2075 let invalid_intervals = vec![
2076 (Float32(Some(f32::INFINITY)), Float32(Some(100_f32))),
2077 (Float64(Some(0_f64)), Float64(Some(f64::NEG_INFINITY))),
2078 (Boolean(Some(true)), Boolean(Some(false))),
2079 (Int32(Some(1000)), Int32(Some(-2000))),
2080 (UInt64(Some(1)), UInt64(Some(0))),
2081 ];
2082 for (lower, upper) in invalid_intervals {
2083 Interval::try_new(lower, upper).expect_err(
2084 "Given parameters should have given an invalid interval error",
2085 );
2086 }
2087
2088 Ok(())
2089 }
2090
2091 #[test]
2092 fn test_make_unbounded() -> Result<()> {
2093 use ScalarValue::*;
2094
2095 let unbounded_cases = vec![
2096 (DataType::Boolean, Boolean(Some(false)), Boolean(Some(true))),
2097 (DataType::UInt8, UInt8(Some(0)), UInt8(None)),
2098 (DataType::UInt16, UInt16(Some(0)), UInt16(None)),
2099 (DataType::UInt32, UInt32(Some(0)), UInt32(None)),
2100 (DataType::UInt64, UInt64(Some(0)), UInt64(None)),
2101 (DataType::Int8, Int8(None), Int8(None)),
2102 (DataType::Int16, Int16(None), Int16(None)),
2103 (DataType::Int32, Int32(None), Int32(None)),
2104 (DataType::Int64, Int64(None), Int64(None)),
2105 (DataType::Float32, Float32(None), Float32(None)),
2106 (DataType::Float64, Float64(None), Float64(None)),
2107 ];
2108 for (dt, lower, upper) in unbounded_cases {
2109 let inf = Interval::make_unbounded(&dt)?;
2110 assert_eq!(inf.clone().lower(), &lower);
2111 assert_eq!(inf.upper(), &upper);
2112 }
2113
2114 Ok(())
2115 }
2116
2117 #[test]
2118 fn gt_lt_test() -> Result<()> {
2119 let exactly_gt_cases = vec![
2120 (
2121 Interval::make(Some(1000_i64), None)?,
2122 Interval::make(None, Some(999_i64))?,
2123 ),
2124 (
2125 Interval::make(Some(1000_i64), Some(1000_i64))?,
2126 Interval::make(None, Some(999_i64))?,
2127 ),
2128 (
2129 Interval::make(Some(501_i64), Some(1000_i64))?,
2130 Interval::make(Some(500_i64), Some(500_i64))?,
2131 ),
2132 (
2133 Interval::make(Some(-1000_i64), Some(1000_i64))?,
2134 Interval::make(None, Some(-1500_i64))?,
2135 ),
2136 (
2137 Interval::try_new(
2138 next_value(ScalarValue::Float32(Some(0.0))),
2139 next_value(ScalarValue::Float32(Some(0.0))),
2140 )?,
2141 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2142 ),
2143 (
2144 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2145 Interval::try_new(
2146 prev_value(ScalarValue::Float32(Some(-1.0))),
2147 prev_value(ScalarValue::Float32(Some(-1.0))),
2148 )?,
2149 ),
2150 ];
2151 for (first, second) in exactly_gt_cases {
2152 assert_eq!(first.gt(second.clone())?, Interval::CERTAINLY_TRUE);
2153 assert_eq!(second.lt(first)?, Interval::CERTAINLY_TRUE);
2154 }
2155
2156 let possibly_gt_cases = vec![
2157 (
2158 Interval::make(Some(1000_i64), Some(2000_i64))?,
2159 Interval::make(Some(1000_i64), Some(1000_i64))?,
2160 ),
2161 (
2162 Interval::make(Some(500_i64), Some(1000_i64))?,
2163 Interval::make(Some(500_i64), Some(1000_i64))?,
2164 ),
2165 (
2166 Interval::make(Some(1000_i64), None)?,
2167 Interval::make(Some(1000_i64), None)?,
2168 ),
2169 (
2170 Interval::make::<i64>(None, None)?,
2171 Interval::make::<i64>(None, None)?,
2172 ),
2173 (
2174 Interval::try_new(
2175 ScalarValue::Float32(Some(0.0_f32)),
2176 next_value(ScalarValue::Float32(Some(0.0_f32))),
2177 )?,
2178 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2179 ),
2180 (
2181 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2182 Interval::try_new(
2183 prev_value(ScalarValue::Float32(Some(-1.0_f32))),
2184 ScalarValue::Float32(Some(-1.0_f32)),
2185 )?,
2186 ),
2187 ];
2188 for (first, second) in possibly_gt_cases {
2189 assert_eq!(first.gt(second.clone())?, Interval::UNCERTAIN);
2190 assert_eq!(second.lt(first)?, Interval::UNCERTAIN);
2191 }
2192
2193 let not_gt_cases = vec![
2194 (
2195 Interval::make(Some(1000_i64), Some(1000_i64))?,
2196 Interval::make(Some(1000_i64), Some(1000_i64))?,
2197 ),
2198 (
2199 Interval::make(Some(500_i64), Some(1000_i64))?,
2200 Interval::make(Some(1000_i64), None)?,
2201 ),
2202 (
2203 Interval::make(None, Some(1000_i64))?,
2204 Interval::make(Some(1000_i64), Some(1500_i64))?,
2205 ),
2206 (
2207 Interval::make(Some(0_u8), Some(0_u8))?,
2208 Interval::make::<u8>(None, None)?,
2209 ),
2210 (
2211 Interval::try_new(
2212 prev_value(ScalarValue::Float32(Some(0.0_f32))),
2213 ScalarValue::Float32(Some(0.0_f32)),
2214 )?,
2215 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2216 ),
2217 (
2218 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2219 Interval::try_new(
2220 ScalarValue::Float32(Some(-1.0_f32)),
2221 next_value(ScalarValue::Float32(Some(-1.0_f32))),
2222 )?,
2223 ),
2224 ];
2225 for (first, second) in not_gt_cases {
2226 assert_eq!(first.gt(second.clone())?, Interval::CERTAINLY_FALSE);
2227 assert_eq!(second.lt(first)?, Interval::CERTAINLY_FALSE);
2228 }
2229
2230 Ok(())
2231 }
2232
2233 #[test]
2234 fn gteq_lteq_test() -> Result<()> {
2235 let exactly_gteq_cases = vec![
2236 (
2237 Interval::make(Some(1000_i64), None)?,
2238 Interval::make(None, Some(1000_i64))?,
2239 ),
2240 (
2241 Interval::make(Some(1000_i64), Some(1000_i64))?,
2242 Interval::make(None, Some(1000_i64))?,
2243 ),
2244 (
2245 Interval::make(Some(500_i64), Some(1000_i64))?,
2246 Interval::make(Some(500_i64), Some(500_i64))?,
2247 ),
2248 (
2249 Interval::make(Some(-1000_i64), Some(1000_i64))?,
2250 Interval::make(None, Some(-1500_i64))?,
2251 ),
2252 (
2253 Interval::make::<u64>(None, None)?,
2254 Interval::make(Some(0_u64), Some(0_u64))?,
2255 ),
2256 (
2257 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2258 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2259 ),
2260 (
2261 Interval::try_new(
2262 ScalarValue::Float32(Some(-1.0)),
2263 next_value(ScalarValue::Float32(Some(-1.0))),
2264 )?,
2265 Interval::try_new(
2266 prev_value(ScalarValue::Float32(Some(-1.0))),
2267 ScalarValue::Float32(Some(-1.0)),
2268 )?,
2269 ),
2270 ];
2271 for (first, second) in exactly_gteq_cases {
2272 assert_eq!(first.gt_eq(second.clone())?, Interval::CERTAINLY_TRUE);
2273 assert_eq!(second.lt_eq(first)?, Interval::CERTAINLY_TRUE);
2274 }
2275
2276 let possibly_gteq_cases = vec![
2277 (
2278 Interval::make(Some(999_i64), Some(2000_i64))?,
2279 Interval::make(Some(1000_i64), Some(1000_i64))?,
2280 ),
2281 (
2282 Interval::make(Some(500_i64), Some(1000_i64))?,
2283 Interval::make(Some(500_i64), Some(1001_i64))?,
2284 ),
2285 (
2286 Interval::make(Some(0_i64), None)?,
2287 Interval::make(Some(1000_i64), None)?,
2288 ),
2289 (
2290 Interval::make::<i64>(None, None)?,
2291 Interval::make::<i64>(None, None)?,
2292 ),
2293 (
2294 Interval::try_new(
2295 prev_value(ScalarValue::Float32(Some(0.0))),
2296 ScalarValue::Float32(Some(0.0)),
2297 )?,
2298 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2299 ),
2300 (
2301 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2302 Interval::try_new(
2303 prev_value(ScalarValue::Float32(Some(-1.0_f32))),
2304 next_value(ScalarValue::Float32(Some(-1.0_f32))),
2305 )?,
2306 ),
2307 ];
2308 for (first, second) in possibly_gteq_cases {
2309 assert_eq!(first.gt_eq(second.clone())?, Interval::UNCERTAIN);
2310 assert_eq!(second.lt_eq(first)?, Interval::UNCERTAIN);
2311 }
2312
2313 let not_gteq_cases = vec![
2314 (
2315 Interval::make(Some(1000_i64), Some(1000_i64))?,
2316 Interval::make(Some(2000_i64), Some(2000_i64))?,
2317 ),
2318 (
2319 Interval::make(Some(500_i64), Some(999_i64))?,
2320 Interval::make(Some(1000_i64), None)?,
2321 ),
2322 (
2323 Interval::make(None, Some(1000_i64))?,
2324 Interval::make(Some(1001_i64), Some(1500_i64))?,
2325 ),
2326 (
2327 Interval::try_new(
2328 prev_value(ScalarValue::Float32(Some(0.0_f32))),
2329 prev_value(ScalarValue::Float32(Some(0.0_f32))),
2330 )?,
2331 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2332 ),
2333 (
2334 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2335 Interval::try_new(
2336 next_value(ScalarValue::Float32(Some(-1.0))),
2337 next_value(ScalarValue::Float32(Some(-1.0))),
2338 )?,
2339 ),
2340 ];
2341 for (first, second) in not_gteq_cases {
2342 assert_eq!(first.gt_eq(second.clone())?, Interval::CERTAINLY_FALSE);
2343 assert_eq!(second.lt_eq(first)?, Interval::CERTAINLY_FALSE);
2344 }
2345
2346 Ok(())
2347 }
2348
2349 #[test]
2350 fn equal_test() -> Result<()> {
2351 let exactly_eq_cases = vec![
2352 (
2353 Interval::make(Some(1000_i64), Some(1000_i64))?,
2354 Interval::make(Some(1000_i64), Some(1000_i64))?,
2355 ),
2356 (
2357 Interval::make(Some(0_u64), Some(0_u64))?,
2358 Interval::make(Some(0_u64), Some(0_u64))?,
2359 ),
2360 (
2361 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
2362 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
2363 ),
2364 (
2365 Interval::make(Some(f64::MIN), Some(f64::MIN))?,
2366 Interval::make(Some(f64::MIN), Some(f64::MIN))?,
2367 ),
2368 ];
2369 for (first, second) in exactly_eq_cases {
2370 assert_eq!(first.equal(second.clone())?, Interval::CERTAINLY_TRUE);
2371 assert_eq!(second.equal(first)?, Interval::CERTAINLY_TRUE);
2372 }
2373
2374 let possibly_eq_cases = vec![
2375 (
2376 Interval::make::<i64>(None, None)?,
2377 Interval::make::<i64>(None, None)?,
2378 ),
2379 (
2380 Interval::make(Some(0_i64), Some(0_i64))?,
2381 Interval::make(Some(0_i64), Some(1000_i64))?,
2382 ),
2383 (
2384 Interval::make(Some(0_i64), Some(0_i64))?,
2385 Interval::make(Some(0_i64), Some(1000_i64))?,
2386 ),
2387 (
2388 Interval::make(Some(100.0_f32), Some(200.0_f32))?,
2389 Interval::make(Some(0.0_f32), Some(1000.0_f32))?,
2390 ),
2391 (
2392 Interval::try_new(
2393 prev_value(ScalarValue::Float32(Some(0.0))),
2394 ScalarValue::Float32(Some(0.0)),
2395 )?,
2396 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2397 ),
2398 (
2399 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2400 Interval::try_new(
2401 prev_value(ScalarValue::Float32(Some(-1.0))),
2402 next_value(ScalarValue::Float32(Some(-1.0))),
2403 )?,
2404 ),
2405 ];
2406 for (first, second) in possibly_eq_cases {
2407 assert_eq!(first.equal(second.clone())?, Interval::UNCERTAIN);
2408 assert_eq!(second.equal(first)?, Interval::UNCERTAIN);
2409 }
2410
2411 let not_eq_cases = vec![
2412 (
2413 Interval::make(Some(1000_i64), Some(1000_i64))?,
2414 Interval::make(Some(2000_i64), Some(2000_i64))?,
2415 ),
2416 (
2417 Interval::make(Some(500_i64), Some(999_i64))?,
2418 Interval::make(Some(1000_i64), None)?,
2419 ),
2420 (
2421 Interval::make(None, Some(1000_i64))?,
2422 Interval::make(Some(1001_i64), Some(1500_i64))?,
2423 ),
2424 (
2425 Interval::try_new(
2426 prev_value(ScalarValue::Float32(Some(0.0))),
2427 prev_value(ScalarValue::Float32(Some(0.0))),
2428 )?,
2429 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
2430 ),
2431 (
2432 Interval::make(Some(-1.0_f32), Some(-1.0_f32))?,
2433 Interval::try_new(
2434 next_value(ScalarValue::Float32(Some(-1.0))),
2435 next_value(ScalarValue::Float32(Some(-1.0))),
2436 )?,
2437 ),
2438 ];
2439 for (first, second) in not_eq_cases {
2440 assert_eq!(first.equal(second.clone())?, Interval::CERTAINLY_FALSE);
2441 assert_eq!(second.equal(first)?, Interval::CERTAINLY_FALSE);
2442 }
2443
2444 Ok(())
2445 }
2446
2447 #[test]
2448 fn and_test() -> Result<()> {
2449 let cases = vec![
2450 (false, true, false, false, false, false),
2451 (false, false, false, true, false, false),
2452 (false, true, false, true, false, true),
2453 (false, true, true, true, false, true),
2454 (false, false, false, false, false, false),
2455 (true, true, true, true, true, true),
2456 ];
2457
2458 for case in cases {
2459 assert_eq!(
2460 Interval::make(Some(case.0), Some(case.1))?
2461 .and(Interval::make(Some(case.2), Some(case.3))?)?,
2462 Interval::make(Some(case.4), Some(case.5))?
2463 );
2464 }
2465 Ok(())
2466 }
2467
2468 #[test]
2469 fn not_test() -> Result<()> {
2470 let cases = vec![
2471 (false, true, false, true),
2472 (false, false, true, true),
2473 (true, true, false, false),
2474 ];
2475
2476 for case in cases {
2477 assert_eq!(
2478 Interval::make(Some(case.0), Some(case.1))?.not()?,
2479 Interval::make(Some(case.2), Some(case.3))?
2480 );
2481 }
2482 Ok(())
2483 }
2484
2485 #[test]
2486 fn intersect_test() -> Result<()> {
2487 let possible_cases = vec![
2488 (
2489 Interval::make(Some(1000_i64), None)?,
2490 Interval::make::<i64>(None, None)?,
2491 Interval::make(Some(1000_i64), None)?,
2492 ),
2493 (
2494 Interval::make(Some(1000_i64), None)?,
2495 Interval::make(None, Some(1000_i64))?,
2496 Interval::make(Some(1000_i64), Some(1000_i64))?,
2497 ),
2498 (
2499 Interval::make(Some(1000_i64), None)?,
2500 Interval::make(None, Some(2000_i64))?,
2501 Interval::make(Some(1000_i64), Some(2000_i64))?,
2502 ),
2503 (
2504 Interval::make(Some(1000_i64), Some(2000_i64))?,
2505 Interval::make(Some(1000_i64), None)?,
2506 Interval::make(Some(1000_i64), Some(2000_i64))?,
2507 ),
2508 (
2509 Interval::make(Some(1000_i64), Some(2000_i64))?,
2510 Interval::make(Some(1000_i64), Some(1500_i64))?,
2511 Interval::make(Some(1000_i64), Some(1500_i64))?,
2512 ),
2513 (
2514 Interval::make(Some(1000_i64), Some(2000_i64))?,
2515 Interval::make(Some(500_i64), Some(1500_i64))?,
2516 Interval::make(Some(1000_i64), Some(1500_i64))?,
2517 ),
2518 (
2519 Interval::make::<i64>(None, None)?,
2520 Interval::make::<i64>(None, None)?,
2521 Interval::make::<i64>(None, None)?,
2522 ),
2523 (
2524 Interval::make(None, Some(2000_u64))?,
2525 Interval::make(Some(500_u64), None)?,
2526 Interval::make(Some(500_u64), Some(2000_u64))?,
2527 ),
2528 (
2529 Interval::make(Some(0_u64), Some(0_u64))?,
2530 Interval::make(Some(0_u64), None)?,
2531 Interval::make(Some(0_u64), Some(0_u64))?,
2532 ),
2533 (
2534 Interval::make(Some(1000.0_f32), None)?,
2535 Interval::make(None, Some(1000.0_f32))?,
2536 Interval::make(Some(1000.0_f32), Some(1000.0_f32))?,
2537 ),
2538 (
2539 Interval::make(Some(1000.0_f32), Some(1500.0_f32))?,
2540 Interval::make(Some(0.0_f32), Some(1500.0_f32))?,
2541 Interval::make(Some(1000.0_f32), Some(1500.0_f32))?,
2542 ),
2543 (
2544 Interval::make(Some(-1000.0_f64), Some(1500.0_f64))?,
2545 Interval::make(Some(-1500.0_f64), Some(2000.0_f64))?,
2546 Interval::make(Some(-1000.0_f64), Some(1500.0_f64))?,
2547 ),
2548 (
2549 Interval::make(Some(16.0_f64), Some(32.0_f64))?,
2550 Interval::make(Some(32.0_f64), Some(64.0_f64))?,
2551 Interval::make(Some(32.0_f64), Some(32.0_f64))?,
2552 ),
2553 ];
2554 for (first, second, expected) in possible_cases {
2555 assert_eq!(first.intersect(second)?.unwrap(), expected)
2556 }
2557
2558 let empty_cases = vec![
2559 (
2560 Interval::make(Some(1000_i64), None)?,
2561 Interval::make(None, Some(0_i64))?,
2562 ),
2563 (
2564 Interval::make(Some(1000_i64), None)?,
2565 Interval::make(None, Some(999_i64))?,
2566 ),
2567 (
2568 Interval::make(Some(1500_i64), Some(2000_i64))?,
2569 Interval::make(Some(1000_i64), Some(1499_i64))?,
2570 ),
2571 (
2572 Interval::make(Some(0_i64), Some(1000_i64))?,
2573 Interval::make(Some(2000_i64), Some(3000_i64))?,
2574 ),
2575 (
2576 Interval::try_new(
2577 prev_value(ScalarValue::Float32(Some(1.0))),
2578 prev_value(ScalarValue::Float32(Some(1.0))),
2579 )?,
2580 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2581 ),
2582 (
2583 Interval::try_new(
2584 next_value(ScalarValue::Float32(Some(1.0))),
2585 next_value(ScalarValue::Float32(Some(1.0))),
2586 )?,
2587 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2588 ),
2589 ];
2590 for (first, second) in empty_cases {
2591 assert_eq!(first.intersect(second)?, None)
2592 }
2593
2594 Ok(())
2595 }
2596
2597 #[test]
2598 fn union_test() -> Result<()> {
2599 let possible_cases = vec![
2600 (
2601 Interval::make(Some(1000_i64), None)?,
2602 Interval::make::<i64>(None, None)?,
2603 Interval::make_unbounded(&DataType::Int64)?,
2604 ),
2605 (
2606 Interval::make(Some(1000_i64), None)?,
2607 Interval::make(None, Some(1000_i64))?,
2608 Interval::make_unbounded(&DataType::Int64)?,
2609 ),
2610 (
2611 Interval::make(Some(1000_i64), None)?,
2612 Interval::make(None, Some(2000_i64))?,
2613 Interval::make_unbounded(&DataType::Int64)?,
2614 ),
2615 (
2616 Interval::make(Some(1000_i64), Some(2000_i64))?,
2617 Interval::make(Some(1000_i64), None)?,
2618 Interval::make(Some(1000_i64), None)?,
2619 ),
2620 (
2621 Interval::make(Some(1000_i64), Some(2000_i64))?,
2622 Interval::make(Some(1000_i64), Some(1500_i64))?,
2623 Interval::make(Some(1000_i64), Some(2000_i64))?,
2624 ),
2625 (
2626 Interval::make(Some(1000_i64), Some(2000_i64))?,
2627 Interval::make(Some(500_i64), Some(1500_i64))?,
2628 Interval::make(Some(500_i64), Some(2000_i64))?,
2629 ),
2630 (
2631 Interval::make::<i64>(None, None)?,
2632 Interval::make::<i64>(None, None)?,
2633 Interval::make::<i64>(None, None)?,
2634 ),
2635 (
2636 Interval::make(Some(1000_i64), None)?,
2637 Interval::make(None, Some(0_i64))?,
2638 Interval::make_unbounded(&DataType::Int64)?,
2639 ),
2640 (
2641 Interval::make(Some(1000_i64), None)?,
2642 Interval::make(None, Some(999_i64))?,
2643 Interval::make_unbounded(&DataType::Int64)?,
2644 ),
2645 (
2646 Interval::make(Some(1500_i64), Some(2000_i64))?,
2647 Interval::make(Some(1000_i64), Some(1499_i64))?,
2648 Interval::make(Some(1000_i64), Some(2000_i64))?,
2649 ),
2650 (
2651 Interval::make(Some(0_i64), Some(1000_i64))?,
2652 Interval::make(Some(2000_i64), Some(3000_i64))?,
2653 Interval::make(Some(0_i64), Some(3000_i64))?,
2654 ),
2655 (
2656 Interval::make(None, Some(2000_u64))?,
2657 Interval::make(Some(500_u64), None)?,
2658 Interval::make(Some(0_u64), None)?,
2659 ),
2660 (
2661 Interval::make(Some(0_u64), Some(0_u64))?,
2662 Interval::make(Some(0_u64), None)?,
2663 Interval::make(Some(0_u64), None)?,
2664 ),
2665 (
2666 Interval::make(Some(1000.0_f32), None)?,
2667 Interval::make(None, Some(1000.0_f32))?,
2668 Interval::make_unbounded(&DataType::Float32)?,
2669 ),
2670 (
2671 Interval::make(Some(1000.0_f32), Some(1500.0_f32))?,
2672 Interval::make(Some(0.0_f32), Some(1500.0_f32))?,
2673 Interval::make(Some(0.0_f32), Some(1500.0_f32))?,
2674 ),
2675 (
2676 Interval::try_new(
2677 prev_value(ScalarValue::Float32(Some(1.0))),
2678 prev_value(ScalarValue::Float32(Some(1.0))),
2679 )?,
2680 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2681 Interval::try_new(
2682 prev_value(ScalarValue::Float32(Some(1.0))),
2683 ScalarValue::Float32(Some(1.0)),
2684 )?,
2685 ),
2686 (
2687 Interval::try_new(
2688 next_value(ScalarValue::Float32(Some(1.0))),
2689 next_value(ScalarValue::Float32(Some(1.0))),
2690 )?,
2691 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2692 Interval::try_new(
2693 ScalarValue::Float32(Some(1.0)),
2694 next_value(ScalarValue::Float32(Some(1.0))),
2695 )?,
2696 ),
2697 (
2698 Interval::make(Some(-1000.0_f64), Some(1500.0_f64))?,
2699 Interval::make(Some(-1500.0_f64), Some(2000.0_f64))?,
2700 Interval::make(Some(-1500.0_f64), Some(2000.0_f64))?,
2701 ),
2702 (
2703 Interval::make(Some(16.0_f64), Some(32.0_f64))?,
2704 Interval::make(Some(32.0_f64), Some(64.0_f64))?,
2705 Interval::make(Some(16.0_f64), Some(64.0_f64))?,
2706 ),
2707 ];
2708 for (first, second, expected) in possible_cases {
2709 println!("{}", first);
2710 println!("{}", second);
2711 assert_eq!(first.union(second)?, expected)
2712 }
2713
2714 Ok(())
2715 }
2716
2717 #[test]
2718 fn test_contains() -> Result<()> {
2719 let possible_cases = vec![
2720 (
2721 Interval::make::<i64>(None, None)?,
2722 Interval::make::<i64>(None, None)?,
2723 Interval::CERTAINLY_TRUE,
2724 ),
2725 (
2726 Interval::make(Some(1500_i64), Some(2000_i64))?,
2727 Interval::make(Some(1501_i64), Some(1999_i64))?,
2728 Interval::CERTAINLY_TRUE,
2729 ),
2730 (
2731 Interval::make(Some(1000_i64), None)?,
2732 Interval::make::<i64>(None, None)?,
2733 Interval::UNCERTAIN,
2734 ),
2735 (
2736 Interval::make(Some(1000_i64), Some(2000_i64))?,
2737 Interval::make(Some(500), Some(1500_i64))?,
2738 Interval::UNCERTAIN,
2739 ),
2740 (
2741 Interval::make(Some(16.0), Some(32.0))?,
2742 Interval::make(Some(32.0), Some(64.0))?,
2743 Interval::UNCERTAIN,
2744 ),
2745 (
2746 Interval::make(Some(1000_i64), None)?,
2747 Interval::make(None, Some(0_i64))?,
2748 Interval::CERTAINLY_FALSE,
2749 ),
2750 (
2751 Interval::make(Some(1500_i64), Some(2000_i64))?,
2752 Interval::make(Some(1000_i64), Some(1499_i64))?,
2753 Interval::CERTAINLY_FALSE,
2754 ),
2755 (
2756 Interval::try_new(
2757 prev_value(ScalarValue::Float32(Some(1.0))),
2758 prev_value(ScalarValue::Float32(Some(1.0))),
2759 )?,
2760 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2761 Interval::CERTAINLY_FALSE,
2762 ),
2763 (
2764 Interval::try_new(
2765 next_value(ScalarValue::Float32(Some(1.0))),
2766 next_value(ScalarValue::Float32(Some(1.0))),
2767 )?,
2768 Interval::make(Some(1.0_f32), Some(1.0_f32))?,
2769 Interval::CERTAINLY_FALSE,
2770 ),
2771 ];
2772 for (first, second, expected) in possible_cases {
2773 assert_eq!(first.contains(second)?, expected)
2774 }
2775
2776 Ok(())
2777 }
2778
2779 #[test]
2780 fn test_contains_value() -> Result<()> {
2781 let possible_cases = vec![
2782 (
2783 Interval::make(Some(0), Some(100))?,
2784 ScalarValue::Int32(Some(50)),
2785 true,
2786 ),
2787 (
2788 Interval::make(Some(0), Some(100))?,
2789 ScalarValue::Int32(Some(150)),
2790 false,
2791 ),
2792 (
2793 Interval::make(Some(0), Some(100))?,
2794 ScalarValue::Float64(Some(50.)),
2795 true,
2796 ),
2797 (
2798 Interval::make(Some(0), Some(100))?,
2799 ScalarValue::Float64(Some(next_down(100.))),
2800 true,
2801 ),
2802 (
2803 Interval::make(Some(0), Some(100))?,
2804 ScalarValue::Float64(Some(next_up(100.))),
2805 false,
2806 ),
2807 ];
2808
2809 for (interval, value, expected) in possible_cases {
2810 assert_eq!(interval.contains_value(value)?, expected)
2811 }
2812
2813 Ok(())
2814 }
2815
2816 #[test]
2817 fn test_add() -> Result<()> {
2818 let cases = vec![
2819 (
2820 Interval::make(Some(100_i64), Some(200_i64))?,
2821 Interval::make(None, Some(200_i64))?,
2822 Interval::make(None, Some(400_i64))?,
2823 ),
2824 (
2825 Interval::make(Some(100_i64), Some(200_i64))?,
2826 Interval::make(Some(200_i64), None)?,
2827 Interval::make(Some(300_i64), None)?,
2828 ),
2829 (
2830 Interval::make(None, Some(200_i64))?,
2831 Interval::make(Some(100_i64), Some(200_i64))?,
2832 Interval::make(None, Some(400_i64))?,
2833 ),
2834 (
2835 Interval::make(Some(200_i64), None)?,
2836 Interval::make(Some(100_i64), Some(200_i64))?,
2837 Interval::make(Some(300_i64), None)?,
2838 ),
2839 (
2840 Interval::make(Some(100_i64), Some(200_i64))?,
2841 Interval::make(Some(-300_i64), Some(150_i64))?,
2842 Interval::make(Some(-200_i64), Some(350_i64))?,
2843 ),
2844 (
2845 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
2846 Interval::make(Some(11_f32), Some(11_f32))?,
2847 Interval::make(Some(f32::MAX), None)?,
2848 ),
2849 (
2850 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
2851 Interval::make(Some(-10_f32), Some(10_f32))?,
2852 Interval::make(
2855 None,
2856 Some(-340282330000000000000000000000000000000.0_f32),
2857 )?,
2858 ),
2859 (
2860 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
2861 Interval::make(Some(-10_f32), Some(-10_f32))?,
2862 Interval::make(None, Some(f32::MIN))?,
2863 ),
2864 (
2865 Interval::make(Some(1.0), Some(f32::MAX))?,
2866 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
2867 Interval::make(Some(f32::MAX), None)?,
2868 ),
2869 (
2870 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
2871 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
2872 Interval::make(Some(-0.0_f32), Some(0.0_f32))?,
2873 ),
2874 (
2875 Interval::make(Some(100_f64), None)?,
2876 Interval::make(None, Some(200_f64))?,
2877 Interval::make::<i64>(None, None)?,
2878 ),
2879 (
2880 Interval::make(None, Some(100_f64))?,
2881 Interval::make(None, Some(200_f64))?,
2882 Interval::make(None, Some(300_f64))?,
2883 ),
2884 ];
2885 for case in cases {
2886 let result = case.0.add(case.1)?;
2887 if case.0.data_type().is_floating() {
2888 assert!(
2889 result.lower().is_null() && case.2.lower().is_null()
2890 || result.lower().le(case.2.lower())
2891 );
2892 assert!(
2893 result.upper().is_null() && case.2.upper().is_null()
2894 || result.upper().ge(case.2.upper())
2895 );
2896 } else {
2897 assert_eq!(result, case.2);
2898 }
2899 }
2900
2901 Ok(())
2902 }
2903
2904 #[test]
2905 fn test_sub() -> Result<()> {
2906 let cases = vec![
2907 (
2908 Interval::make(Some(i32::MAX), Some(i32::MAX))?,
2909 Interval::make(Some(11_i32), Some(11_i32))?,
2910 Interval::make(Some(i32::MAX - 11), Some(i32::MAX - 11))?,
2911 ),
2912 (
2913 Interval::make(Some(100_i64), Some(200_i64))?,
2914 Interval::make(None, Some(200_i64))?,
2915 Interval::make(Some(-100_i64), None)?,
2916 ),
2917 (
2918 Interval::make(Some(100_i64), Some(200_i64))?,
2919 Interval::make(Some(200_i64), None)?,
2920 Interval::make(None, Some(0_i64))?,
2921 ),
2922 (
2923 Interval::make(None, Some(200_i64))?,
2924 Interval::make(Some(100_i64), Some(200_i64))?,
2925 Interval::make(None, Some(100_i64))?,
2926 ),
2927 (
2928 Interval::make(Some(200_i64), None)?,
2929 Interval::make(Some(100_i64), Some(200_i64))?,
2930 Interval::make(Some(0_i64), None)?,
2931 ),
2932 (
2933 Interval::make(Some(100_i64), Some(200_i64))?,
2934 Interval::make(Some(-300_i64), Some(150_i64))?,
2935 Interval::make(Some(-50_i64), Some(500_i64))?,
2936 ),
2937 (
2938 Interval::make(Some(i64::MIN), Some(i64::MIN))?,
2939 Interval::make(Some(-10_i64), Some(-10_i64))?,
2940 Interval::make(Some(i64::MIN + 10), Some(i64::MIN + 10))?,
2941 ),
2942 (
2943 Interval::make(Some(1), Some(i64::MAX))?,
2944 Interval::make(Some(i64::MAX), Some(i64::MAX))?,
2945 Interval::make(Some(1 - i64::MAX), Some(0))?,
2946 ),
2947 (
2948 Interval::make(Some(i64::MIN), Some(i64::MIN))?,
2949 Interval::make(Some(i64::MAX), Some(i64::MAX))?,
2950 Interval::make(None, Some(i64::MIN))?,
2951 ),
2952 (
2953 Interval::make(Some(2_u32), Some(10_u32))?,
2954 Interval::make(Some(4_u32), Some(6_u32))?,
2955 Interval::make(None, Some(6_u32))?,
2956 ),
2957 (
2958 Interval::make(Some(2_u32), Some(10_u32))?,
2959 Interval::make(Some(20_u32), Some(30_u32))?,
2960 Interval::make(None, Some(0_u32))?,
2961 ),
2962 (
2963 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
2964 Interval::make(Some(-10_f32), Some(10_f32))?,
2965 Interval::make(
2968 None,
2969 Some(-340282330000000000000000000000000000000.0_f32),
2970 )?,
2971 ),
2972 (
2973 Interval::make(Some(100_f64), None)?,
2974 Interval::make(None, Some(200_f64))?,
2975 Interval::make(Some(-100_f64), None)?,
2976 ),
2977 (
2978 Interval::make(None, Some(100_f64))?,
2979 Interval::make(None, Some(200_f64))?,
2980 Interval::make::<i64>(None, None)?,
2981 ),
2982 ];
2983 for case in cases {
2984 let result = case.0.sub(case.1)?;
2985 if case.0.data_type().is_floating() {
2986 assert!(
2987 result.lower().is_null() && case.2.lower().is_null()
2988 || result.lower().le(case.2.lower())
2989 );
2990 assert!(
2991 result.upper().is_null() && case.2.upper().is_null()
2992 || result.upper().ge(case.2.upper(),)
2993 );
2994 } else {
2995 assert_eq!(result, case.2);
2996 }
2997 }
2998
2999 Ok(())
3000 }
3001
3002 #[test]
3003 fn test_mul() -> Result<()> {
3004 let cases = vec![
3005 (
3006 Interval::make(Some(1_i64), Some(2_i64))?,
3007 Interval::make(None, Some(2_i64))?,
3008 Interval::make(None, Some(4_i64))?,
3009 ),
3010 (
3011 Interval::make(Some(1_i64), Some(2_i64))?,
3012 Interval::make(Some(2_i64), None)?,
3013 Interval::make(Some(2_i64), None)?,
3014 ),
3015 (
3016 Interval::make(None, Some(2_i64))?,
3017 Interval::make(Some(1_i64), Some(2_i64))?,
3018 Interval::make(None, Some(4_i64))?,
3019 ),
3020 (
3021 Interval::make(Some(2_i64), None)?,
3022 Interval::make(Some(1_i64), Some(2_i64))?,
3023 Interval::make(Some(2_i64), None)?,
3024 ),
3025 (
3026 Interval::make(Some(1_i64), Some(2_i64))?,
3027 Interval::make(Some(-3_i64), Some(15_i64))?,
3028 Interval::make(Some(-6_i64), Some(30_i64))?,
3029 ),
3030 (
3031 Interval::make(Some(-0.0), Some(0.0))?,
3032 Interval::make(None, Some(0.0))?,
3033 Interval::make::<i64>(None, None)?,
3034 ),
3035 (
3036 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
3037 Interval::make(Some(-10_f32), Some(10_f32))?,
3038 Interval::make::<i64>(None, None)?,
3039 ),
3040 (
3041 Interval::make(Some(1_u32), Some(2_u32))?,
3042 Interval::make(Some(0_u32), Some(1_u32))?,
3043 Interval::make(Some(0_u32), Some(2_u32))?,
3044 ),
3045 (
3046 Interval::make(None, Some(2_u32))?,
3047 Interval::make(Some(0_u32), Some(1_u32))?,
3048 Interval::make(None, Some(2_u32))?,
3049 ),
3050 (
3051 Interval::make(None, Some(2_u32))?,
3052 Interval::make(Some(1_u32), Some(2_u32))?,
3053 Interval::make(None, Some(4_u32))?,
3054 ),
3055 (
3056 Interval::make(None, Some(2_u32))?,
3057 Interval::make(Some(1_u32), None)?,
3058 Interval::make::<u32>(None, None)?,
3059 ),
3060 (
3061 Interval::make::<u32>(None, None)?,
3062 Interval::make(Some(0_u32), None)?,
3063 Interval::make::<u32>(None, None)?,
3064 ),
3065 (
3066 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
3067 Interval::make(Some(11_f32), Some(11_f32))?,
3068 Interval::make(Some(f32::MAX), None)?,
3069 ),
3070 (
3071 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
3072 Interval::make(Some(-10_f32), Some(-10_f32))?,
3073 Interval::make(Some(f32::MAX), None)?,
3074 ),
3075 (
3076 Interval::make(Some(1.0), Some(f32::MAX))?,
3077 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
3078 Interval::make(Some(f32::MAX), None)?,
3079 ),
3080 (
3081 Interval::make(Some(f32::MIN), Some(f32::MIN))?,
3082 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
3083 Interval::make(None, Some(f32::MIN))?,
3084 ),
3085 (
3086 Interval::make(Some(-0.0_f32), Some(0.0_f32))?,
3087 Interval::make(Some(f32::MAX), None)?,
3088 Interval::make::<f32>(None, None)?,
3089 ),
3090 (
3091 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
3092 Interval::make(Some(f32::MAX), None)?,
3093 Interval::make(Some(0.0_f32), None)?,
3094 ),
3095 (
3096 Interval::make(Some(1_f64), None)?,
3097 Interval::make(None, Some(2_f64))?,
3098 Interval::make::<f64>(None, None)?,
3099 ),
3100 (
3101 Interval::make(None, Some(1_f64))?,
3102 Interval::make(None, Some(2_f64))?,
3103 Interval::make::<f64>(None, None)?,
3104 ),
3105 (
3106 Interval::make(Some(-0.0_f64), Some(-0.0_f64))?,
3107 Interval::make(Some(1_f64), Some(2_f64))?,
3108 Interval::make(Some(-0.0_f64), Some(-0.0_f64))?,
3109 ),
3110 (
3111 Interval::make(Some(0.0_f64), Some(0.0_f64))?,
3112 Interval::make(Some(1_f64), Some(2_f64))?,
3113 Interval::make(Some(0.0_f64), Some(0.0_f64))?,
3114 ),
3115 (
3116 Interval::make(Some(-0.0_f64), Some(0.0_f64))?,
3117 Interval::make(Some(1_f64), Some(2_f64))?,
3118 Interval::make(Some(-0.0_f64), Some(0.0_f64))?,
3119 ),
3120 (
3121 Interval::make(Some(-0.0_f64), Some(1.0_f64))?,
3122 Interval::make(Some(1_f64), Some(2_f64))?,
3123 Interval::make(Some(-0.0_f64), Some(2.0_f64))?,
3124 ),
3125 (
3126 Interval::make(Some(0.0_f64), Some(1.0_f64))?,
3127 Interval::make(Some(1_f64), Some(2_f64))?,
3128 Interval::make(Some(0.0_f64), Some(2.0_f64))?,
3129 ),
3130 (
3131 Interval::make(Some(-0.0_f64), Some(1.0_f64))?,
3132 Interval::make(Some(-1_f64), Some(2_f64))?,
3133 Interval::make(Some(-1.0_f64), Some(2.0_f64))?,
3134 ),
3135 (
3136 Interval::make::<f64>(None, None)?,
3137 Interval::make(Some(-0.0_f64), Some(0.0_f64))?,
3138 Interval::make::<f64>(None, None)?,
3139 ),
3140 (
3141 Interval::make::<f64>(None, Some(10.0_f64))?,
3142 Interval::make(Some(-0.0_f64), Some(0.0_f64))?,
3143 Interval::make::<f64>(None, None)?,
3144 ),
3145 ];
3146 for case in cases {
3147 let result = case.0.mul(case.1)?;
3148 if case.0.data_type().is_floating() {
3149 assert!(
3150 result.lower().is_null() && case.2.lower().is_null()
3151 || result.lower().le(case.2.lower())
3152 );
3153 assert!(
3154 result.upper().is_null() && case.2.upper().is_null()
3155 || result.upper().ge(case.2.upper())
3156 );
3157 } else {
3158 assert_eq!(result, case.2);
3159 }
3160 }
3161
3162 Ok(())
3163 }
3164
3165 #[test]
3166 fn test_div() -> Result<()> {
3167 let cases = vec![
3168 (
3169 Interval::make(Some(100_i64), Some(200_i64))?,
3170 Interval::make(Some(1_i64), Some(2_i64))?,
3171 Interval::make(Some(50_i64), Some(200_i64))?,
3172 ),
3173 (
3174 Interval::make(Some(-200_i64), Some(-100_i64))?,
3175 Interval::make(Some(-2_i64), Some(-1_i64))?,
3176 Interval::make(Some(50_i64), Some(200_i64))?,
3177 ),
3178 (
3179 Interval::make(Some(100_i64), Some(200_i64))?,
3180 Interval::make(Some(-2_i64), Some(-1_i64))?,
3181 Interval::make(Some(-200_i64), Some(-50_i64))?,
3182 ),
3183 (
3184 Interval::make(Some(-200_i64), Some(-100_i64))?,
3185 Interval::make(Some(1_i64), Some(2_i64))?,
3186 Interval::make(Some(-200_i64), Some(-50_i64))?,
3187 ),
3188 (
3189 Interval::make(Some(-200_i64), Some(100_i64))?,
3190 Interval::make(Some(1_i64), Some(2_i64))?,
3191 Interval::make(Some(-200_i64), Some(100_i64))?,
3192 ),
3193 (
3194 Interval::make(Some(-100_i64), Some(200_i64))?,
3195 Interval::make(Some(1_i64), Some(2_i64))?,
3196 Interval::make(Some(-100_i64), Some(200_i64))?,
3197 ),
3198 (
3199 Interval::make(Some(10_i64), Some(20_i64))?,
3200 Interval::make::<i64>(None, None)?,
3201 Interval::make::<i64>(None, None)?,
3202 ),
3203 (
3204 Interval::make(Some(-100_i64), Some(200_i64))?,
3205 Interval::make(Some(-1_i64), Some(2_i64))?,
3206 Interval::make::<i64>(None, None)?,
3207 ),
3208 (
3209 Interval::make(Some(-100_i64), Some(200_i64))?,
3210 Interval::make(Some(-2_i64), Some(1_i64))?,
3211 Interval::make::<i64>(None, None)?,
3212 ),
3213 (
3214 Interval::make(Some(100_i64), Some(200_i64))?,
3215 Interval::make(Some(0_i64), Some(1_i64))?,
3216 Interval::make(Some(100_i64), None)?,
3217 ),
3218 (
3219 Interval::make(Some(100_i64), Some(200_i64))?,
3220 Interval::make(None, Some(0_i64))?,
3221 Interval::make(None, Some(0_i64))?,
3222 ),
3223 (
3224 Interval::make(Some(100_i64), Some(200_i64))?,
3225 Interval::make(Some(0_i64), Some(0_i64))?,
3226 Interval::make::<i64>(None, None)?,
3227 ),
3228 (
3229 Interval::make(Some(0_i64), Some(1_i64))?,
3230 Interval::make(Some(100_i64), Some(200_i64))?,
3231 Interval::make(Some(0_i64), Some(0_i64))?,
3232 ),
3233 (
3234 Interval::make(Some(0_i64), Some(1_i64))?,
3235 Interval::make(Some(100_i64), Some(200_i64))?,
3236 Interval::make(Some(0_i64), Some(0_i64))?,
3237 ),
3238 (
3239 Interval::make(Some(1_u32), Some(2_u32))?,
3240 Interval::make(Some(0_u32), Some(0_u32))?,
3241 Interval::make::<u32>(None, None)?,
3242 ),
3243 (
3244 Interval::make(Some(10_u32), Some(20_u32))?,
3245 Interval::make(None, Some(2_u32))?,
3246 Interval::make(Some(5_u32), None)?,
3247 ),
3248 (
3249 Interval::make(Some(10_u32), Some(20_u32))?,
3250 Interval::make(Some(0_u32), Some(2_u32))?,
3251 Interval::make(Some(5_u32), None)?,
3252 ),
3253 (
3254 Interval::make(Some(10_u32), Some(20_u32))?,
3255 Interval::make(Some(0_u32), Some(0_u32))?,
3256 Interval::make::<u32>(None, None)?,
3257 ),
3258 (
3259 Interval::make(Some(12_u64), Some(48_u64))?,
3260 Interval::make(Some(10_u64), Some(20_u64))?,
3261 Interval::make(Some(0_u64), Some(4_u64))?,
3262 ),
3263 (
3264 Interval::make(Some(12_u64), Some(48_u64))?,
3265 Interval::make(None, Some(2_u64))?,
3266 Interval::make(Some(6_u64), None)?,
3267 ),
3268 (
3269 Interval::make(Some(12_u64), Some(48_u64))?,
3270 Interval::make(Some(0_u64), Some(2_u64))?,
3271 Interval::make(Some(6_u64), None)?,
3272 ),
3273 (
3274 Interval::make(None, Some(48_u64))?,
3275 Interval::make(Some(0_u64), Some(2_u64))?,
3276 Interval::make::<u64>(None, None)?,
3277 ),
3278 (
3279 Interval::make(Some(f32::MAX), Some(f32::MAX))?,
3280 Interval::make(Some(-0.1_f32), Some(0.1_f32))?,
3281 Interval::make::<f32>(None, None)?,
3282 ),
3283 (
3284 Interval::make(Some(f32::MIN), None)?,
3285 Interval::make(Some(0.1_f32), Some(0.1_f32))?,
3286 Interval::make::<f32>(None, None)?,
3287 ),
3288 (
3289 Interval::make(Some(-10.0_f32), Some(10.0_f32))?,
3290 Interval::make(Some(-0.1_f32), Some(-0.1_f32))?,
3291 Interval::make(Some(-100.0_f32), Some(100.0_f32))?,
3292 ),
3293 (
3294 Interval::make(Some(-10.0_f32), Some(f32::MAX))?,
3295 Interval::make::<f32>(None, None)?,
3296 Interval::make::<f32>(None, None)?,
3297 ),
3298 (
3299 Interval::make(Some(f32::MIN), Some(10.0_f32))?,
3300 Interval::make(Some(1.0_f32), None)?,
3301 Interval::make(Some(f32::MIN), Some(10.0_f32))?,
3302 ),
3303 (
3304 Interval::make(Some(-0.0_f32), Some(0.0_f32))?,
3305 Interval::make(Some(f32::MAX), None)?,
3306 Interval::make(Some(-0.0_f32), Some(0.0_f32))?,
3307 ),
3308 (
3309 Interval::make(Some(-0.0_f32), Some(0.0_f32))?,
3310 Interval::make(None, Some(-0.0_f32))?,
3311 Interval::make::<f32>(None, None)?,
3312 ),
3313 (
3314 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
3315 Interval::make(Some(f32::MAX), None)?,
3316 Interval::make(Some(0.0_f32), Some(0.0_f32))?,
3317 ),
3318 (
3319 Interval::make(Some(1.0_f32), Some(2.0_f32))?,
3320 Interval::make(Some(0.0_f32), Some(4.0_f32))?,
3321 Interval::make(Some(0.25_f32), None)?,
3322 ),
3323 (
3324 Interval::make(Some(1.0_f32), Some(2.0_f32))?,
3325 Interval::make(Some(-4.0_f32), Some(-0.0_f32))?,
3326 Interval::make(None, Some(-0.25_f32))?,
3327 ),
3328 (
3329 Interval::make(Some(-4.0_f64), Some(2.0_f64))?,
3330 Interval::make(Some(10.0_f64), Some(20.0_f64))?,
3331 Interval::make(Some(-0.4_f64), Some(0.2_f64))?,
3332 ),
3333 (
3334 Interval::make(Some(-0.0_f64), Some(-0.0_f64))?,
3335 Interval::make(None, Some(-0.0_f64))?,
3336 Interval::make(Some(0.0_f64), None)?,
3337 ),
3338 (
3339 Interval::make(Some(1.0_f64), Some(2.0_f64))?,
3340 Interval::make::<f64>(None, None)?,
3341 Interval::make(Some(0.0_f64), None)?,
3342 ),
3343 ];
3344 for case in cases {
3345 let result = case.0.div(case.1)?;
3346 if case.0.data_type().is_floating() {
3347 assert!(
3348 result.lower().is_null() && case.2.lower().is_null()
3349 || result.lower().le(case.2.lower())
3350 );
3351 assert!(
3352 result.upper().is_null() && case.2.upper().is_null()
3353 || result.upper().ge(case.2.upper())
3354 );
3355 } else {
3356 assert_eq!(result, case.2);
3357 }
3358 }
3359
3360 Ok(())
3361 }
3362
3363 #[test]
3364 fn test_overflow_handling() -> Result<()> {
3365 let dt = DataType::Int32;
3367 let op = Operator::Plus;
3368 let lhs = ScalarValue::Int32(Some(i32::MAX));
3369 let rhs = ScalarValue::Int32(Some(1));
3370 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3371 assert_eq!(result, ScalarValue::Int32(None));
3372 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3373 assert_eq!(result, ScalarValue::Int32(Some(i32::MAX)));
3374
3375 let dt = DataType::Float32;
3377 let op = Operator::Multiply;
3378 let lhs = ScalarValue::Float32(Some(f32::MAX));
3379 let rhs = ScalarValue::Float32(Some(2.0));
3380 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3381 assert_eq!(result, ScalarValue::Float32(None));
3382 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3383 assert_eq!(result, ScalarValue::Float32(Some(f32::MAX)));
3384
3385 let lhs = ScalarValue::Float32(Some(f32::MIN));
3387 let rhs = ScalarValue::Float32(Some(2.0));
3388 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3389 assert_eq!(result, ScalarValue::Float32(Some(f32::MIN)));
3390 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3391 assert_eq!(result, ScalarValue::Float32(None));
3392
3393 let dt = DataType::Int64;
3395 let op = Operator::Minus;
3396 let lhs = ScalarValue::Int64(Some(i64::MIN));
3397 let rhs = ScalarValue::Int64(Some(1));
3398 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3399 assert_eq!(result, ScalarValue::Int64(Some(i64::MIN)));
3400 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3401 assert_eq!(result, ScalarValue::Int64(None));
3402
3403 let dt = DataType::UInt32;
3405 let op = Operator::Minus;
3406 let lhs = ScalarValue::UInt32(Some(0));
3407 let rhs = ScalarValue::UInt32(Some(1));
3408 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3409 assert_eq!(result, ScalarValue::UInt32(Some(0)));
3410 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3411 assert_eq!(result, ScalarValue::UInt32(None));
3412
3413 let dt = DataType::Decimal128(38, 35);
3415 let op = Operator::Plus;
3416 let lhs =
3417 ScalarValue::Decimal128(Some(54321543215432154321543215432154321), 35, 35);
3418 let rhs = ScalarValue::Decimal128(Some(10000), 20, 0);
3419 let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
3420 assert_eq!(result, ScalarValue::Decimal128(None, 38, 35));
3421 let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
3422 assert_eq!(
3423 result,
3424 ScalarValue::Decimal128(Some(99999999999999999999999999999999999999), 38, 35)
3425 );
3426
3427 Ok(())
3428 }
3429
3430 #[test]
3431 fn test_width_of_intervals() -> Result<()> {
3432 let intervals = [
3433 (
3434 Interval::make(Some(0.25_f64), Some(0.50_f64))?,
3435 ScalarValue::from(0.25_f64),
3436 ),
3437 (
3438 Interval::make(Some(0.5_f64), Some(1.0_f64))?,
3439 ScalarValue::from(0.5_f64),
3440 ),
3441 (
3442 Interval::make(Some(1.0_f64), Some(2.0_f64))?,
3443 ScalarValue::from(1.0_f64),
3444 ),
3445 (
3446 Interval::make(Some(32.0_f64), Some(64.0_f64))?,
3447 ScalarValue::from(32.0_f64),
3448 ),
3449 (
3450 Interval::make(Some(-0.50_f64), Some(-0.25_f64))?,
3451 ScalarValue::from(0.25_f64),
3452 ),
3453 (
3454 Interval::make(Some(-32.0_f64), Some(-16.0_f64))?,
3455 ScalarValue::from(16.0_f64),
3456 ),
3457 (
3458 Interval::make(Some(-0.50_f64), Some(0.25_f64))?,
3459 ScalarValue::from(0.75_f64),
3460 ),
3461 (
3462 Interval::make(Some(-32.0_f64), Some(16.0_f64))?,
3463 ScalarValue::from(48.0_f64),
3464 ),
3465 (
3466 Interval::make(Some(-32_i64), Some(16_i64))?,
3467 ScalarValue::from(48_i64),
3468 ),
3469 ];
3470 for (interval, expected) in intervals {
3471 assert_eq!(interval.width()?, expected);
3472 }
3473
3474 Ok(())
3475 }
3476
3477 #[test]
3478 fn test_cardinality_of_intervals() -> Result<()> {
3479 let distinct_f64 = 4503599627370497;
3484 let distinct_f32 = 8388609;
3485 let intervals = [
3486 Interval::make(Some(0.25_f64), Some(0.50_f64))?,
3487 Interval::make(Some(0.5_f64), Some(1.0_f64))?,
3488 Interval::make(Some(1.0_f64), Some(2.0_f64))?,
3489 Interval::make(Some(32.0_f64), Some(64.0_f64))?,
3490 Interval::make(Some(-0.50_f64), Some(-0.25_f64))?,
3491 Interval::make(Some(-32.0_f64), Some(-16.0_f64))?,
3492 ];
3493 for interval in intervals {
3494 assert_eq!(interval.cardinality().unwrap(), distinct_f64);
3495 }
3496
3497 let intervals = [
3498 Interval::make(Some(0.25_f32), Some(0.50_f32))?,
3499 Interval::make(Some(-1_f32), Some(-0.5_f32))?,
3500 ];
3501 for interval in intervals {
3502 assert_eq!(interval.cardinality().unwrap(), distinct_f32);
3503 }
3504
3505 let interval = Interval::make(Some(-0.0625), Some(0.0625))?;
3512 assert_eq!(interval.cardinality().unwrap(), 9178336040581070850);
3513
3514 let interval = Interval::try_new(
3515 ScalarValue::UInt64(Some(u64::MIN + 1)),
3516 ScalarValue::UInt64(Some(u64::MAX)),
3517 )?;
3518 assert_eq!(interval.cardinality().unwrap(), u64::MAX);
3519
3520 let interval = Interval::try_new(
3521 ScalarValue::Int64(Some(i64::MIN + 1)),
3522 ScalarValue::Int64(Some(i64::MAX)),
3523 )?;
3524 assert_eq!(interval.cardinality().unwrap(), u64::MAX);
3525
3526 let interval = Interval::try_new(
3527 ScalarValue::Float32(Some(-0.0_f32)),
3528 ScalarValue::Float32(Some(0.0_f32)),
3529 )?;
3530 assert_eq!(interval.cardinality().unwrap(), 2);
3531
3532 Ok(())
3533 }
3534
3535 #[test]
3536 fn test_satisfy_comparison() -> Result<()> {
3537 let cases = vec![
3538 (
3539 Interval::make(Some(1000_i64), None)?,
3540 Interval::make(None, Some(1000_i64))?,
3541 true,
3542 Interval::make(Some(1000_i64), None)?,
3543 Interval::make(None, Some(1000_i64))?,
3544 ),
3545 (
3546 Interval::make(None, Some(1000_i64))?,
3547 Interval::make(Some(1000_i64), None)?,
3548 true,
3549 Interval::make(Some(1000_i64), Some(1000_i64))?,
3550 Interval::make(Some(1000_i64), Some(1000_i64))?,
3551 ),
3552 (
3553 Interval::make(Some(1000_i64), None)?,
3554 Interval::make(None, Some(1000_i64))?,
3555 false,
3556 Interval::make(Some(1000_i64), None)?,
3557 Interval::make(None, Some(1000_i64))?,
3558 ),
3559 (
3560 Interval::make(Some(0_i64), Some(1000_i64))?,
3561 Interval::make(Some(500_i64), Some(1500_i64))?,
3562 true,
3563 Interval::make(Some(500_i64), Some(1000_i64))?,
3564 Interval::make(Some(500_i64), Some(1000_i64))?,
3565 ),
3566 (
3567 Interval::make(Some(500_i64), Some(1500_i64))?,
3568 Interval::make(Some(0_i64), Some(1000_i64))?,
3569 true,
3570 Interval::make(Some(500_i64), Some(1500_i64))?,
3571 Interval::make(Some(0_i64), Some(1000_i64))?,
3572 ),
3573 (
3574 Interval::make(Some(0_i64), Some(1000_i64))?,
3575 Interval::make(Some(500_i64), Some(1500_i64))?,
3576 false,
3577 Interval::make(Some(501_i64), Some(1000_i64))?,
3578 Interval::make(Some(500_i64), Some(999_i64))?,
3579 ),
3580 (
3581 Interval::make(Some(500_i64), Some(1500_i64))?,
3582 Interval::make(Some(0_i64), Some(1000_i64))?,
3583 false,
3584 Interval::make(Some(500_i64), Some(1500_i64))?,
3585 Interval::make(Some(0_i64), Some(1000_i64))?,
3586 ),
3587 (
3588 Interval::make::<i64>(None, None)?,
3589 Interval::make(Some(1_i64), Some(1_i64))?,
3590 false,
3591 Interval::make(Some(2_i64), None)?,
3592 Interval::make(Some(1_i64), Some(1_i64))?,
3593 ),
3594 (
3595 Interval::make::<i64>(None, None)?,
3596 Interval::make(Some(1_i64), Some(1_i64))?,
3597 true,
3598 Interval::make(Some(1_i64), None)?,
3599 Interval::make(Some(1_i64), Some(1_i64))?,
3600 ),
3601 (
3602 Interval::make(Some(1_i64), Some(1_i64))?,
3603 Interval::make::<i64>(None, None)?,
3604 false,
3605 Interval::make(Some(1_i64), Some(1_i64))?,
3606 Interval::make(None, Some(0_i64))?,
3607 ),
3608 (
3609 Interval::make(Some(1_i64), Some(1_i64))?,
3610 Interval::make::<i64>(None, None)?,
3611 true,
3612 Interval::make(Some(1_i64), Some(1_i64))?,
3613 Interval::make(None, Some(1_i64))?,
3614 ),
3615 (
3616 Interval::make(Some(1_i64), Some(1_i64))?,
3617 Interval::make::<i64>(None, None)?,
3618 false,
3619 Interval::make(Some(1_i64), Some(1_i64))?,
3620 Interval::make(None, Some(0_i64))?,
3621 ),
3622 (
3623 Interval::make(Some(1_i64), Some(1_i64))?,
3624 Interval::make::<i64>(None, None)?,
3625 true,
3626 Interval::make(Some(1_i64), Some(1_i64))?,
3627 Interval::make(None, Some(1_i64))?,
3628 ),
3629 (
3630 Interval::make::<i64>(None, None)?,
3631 Interval::make(Some(1_i64), Some(1_i64))?,
3632 false,
3633 Interval::make(Some(2_i64), None)?,
3634 Interval::make(Some(1_i64), Some(1_i64))?,
3635 ),
3636 (
3637 Interval::make::<i64>(None, None)?,
3638 Interval::make(Some(1_i64), Some(1_i64))?,
3639 true,
3640 Interval::make(Some(1_i64), None)?,
3641 Interval::make(Some(1_i64), Some(1_i64))?,
3642 ),
3643 (
3644 Interval::make(Some(-1000.0_f32), Some(1000.0_f32))?,
3645 Interval::make(Some(-500.0_f32), Some(500.0_f32))?,
3646 false,
3647 Interval::try_new(
3648 next_value(ScalarValue::Float32(Some(-500.0))),
3649 ScalarValue::Float32(Some(1000.0)),
3650 )?,
3651 Interval::make(Some(-500_f32), Some(500.0_f32))?,
3652 ),
3653 (
3654 Interval::make(Some(-500.0_f32), Some(500.0_f32))?,
3655 Interval::make(Some(-1000.0_f32), Some(1000.0_f32))?,
3656 true,
3657 Interval::make(Some(-500.0_f32), Some(500.0_f32))?,
3658 Interval::make(Some(-1000.0_f32), Some(500.0_f32))?,
3659 ),
3660 (
3661 Interval::make(Some(-500.0_f32), Some(500.0_f32))?,
3662 Interval::make(Some(-1000.0_f32), Some(1000.0_f32))?,
3663 false,
3664 Interval::make(Some(-500.0_f32), Some(500.0_f32))?,
3665 Interval::try_new(
3666 ScalarValue::Float32(Some(-1000.0_f32)),
3667 prev_value(ScalarValue::Float32(Some(500.0_f32))),
3668 )?,
3669 ),
3670 (
3671 Interval::make(Some(-1000.0_f64), Some(1000.0_f64))?,
3672 Interval::make(Some(-500.0_f64), Some(500.0_f64))?,
3673 true,
3674 Interval::make(Some(-500.0_f64), Some(1000.0_f64))?,
3675 Interval::make(Some(-500.0_f64), Some(500.0_f64))?,
3676 ),
3677 ];
3678 for (first, second, includes_endpoints, left_modified, right_modified) in cases {
3679 assert_eq!(
3680 satisfy_greater(&first, &second, !includes_endpoints)?.unwrap(),
3681 (left_modified, right_modified)
3682 );
3683 }
3684
3685 let infeasible_cases = vec![
3686 (
3687 Interval::make(None, Some(1000_i64))?,
3688 Interval::make(Some(1000_i64), None)?,
3689 false,
3690 ),
3691 (
3692 Interval::make(Some(-1000.0_f32), Some(1000.0_f32))?,
3693 Interval::make(Some(1500.0_f32), Some(2000.0_f32))?,
3694 false,
3695 ),
3696 ];
3697 for (first, second, includes_endpoints) in infeasible_cases {
3698 assert_eq!(satisfy_greater(&first, &second, !includes_endpoints)?, None);
3699 }
3700
3701 Ok(())
3702 }
3703
3704 #[test]
3705 fn test_interval_display() {
3706 let interval = Interval::make(Some(0.25_f32), Some(0.50_f32)).unwrap();
3707 assert_eq!(format!("{}", interval), "[0.25, 0.5]");
3708
3709 let interval = Interval::try_new(
3710 ScalarValue::Float32(Some(f32::NEG_INFINITY)),
3711 ScalarValue::Float32(Some(f32::INFINITY)),
3712 )
3713 .unwrap();
3714 assert_eq!(format!("{}", interval), "[NULL, NULL]");
3715 }
3716
3717 macro_rules! capture_mode_change {
3718 ($TYPE:ty) => {
3719 paste::item! {
3720 capture_mode_change_helper!([<capture_mode_change_ $TYPE>],
3721 [<create_interval_ $TYPE>],
3722 $TYPE);
3723 }
3724 };
3725 }
3726
3727 macro_rules! capture_mode_change_helper {
3728 ($TEST_FN_NAME:ident, $CREATE_FN_NAME:ident, $TYPE:ty) => {
3729 fn $CREATE_FN_NAME(lower: $TYPE, upper: $TYPE) -> Interval {
3730 Interval::try_new(
3731 ScalarValue::try_from(Some(lower as $TYPE)).unwrap(),
3732 ScalarValue::try_from(Some(upper as $TYPE)).unwrap(),
3733 )
3734 .unwrap()
3735 }
3736
3737 fn $TEST_FN_NAME(input: ($TYPE, $TYPE), expect_low: bool, expect_high: bool) {
3738 assert!(expect_low || expect_high);
3739 let interval1 = $CREATE_FN_NAME(input.0, input.0);
3740 let interval2 = $CREATE_FN_NAME(input.1, input.1);
3741 let result = interval1.add(&interval2).unwrap();
3742 let without_fe = $CREATE_FN_NAME(input.0 + input.1, input.0 + input.1);
3743 assert!(
3744 (!expect_low || result.lower < without_fe.lower)
3745 && (!expect_high || result.upper > without_fe.upper)
3746 );
3747 }
3748 };
3749 }
3750
3751 capture_mode_change!(f32);
3752 capture_mode_change!(f64);
3753
3754 #[cfg(all(
3755 any(target_arch = "x86_64", target_arch = "aarch64"),
3756 not(target_os = "windows")
3757 ))]
3758 #[test]
3759 fn test_add_intervals_lower_affected_f32() {
3760 let lower = f32::from_bits(1073741887); let upper = f32::from_bits(1098907651); capture_mode_change_f32((lower, upper), true, false);
3764
3765 let lower = f32::from_bits(1072693248); let upper = f32::from_bits(715827883); capture_mode_change_f32((lower, upper), false, true);
3769
3770 let lower = 1.0; let upper = 0.3; capture_mode_change_f64((lower, upper), true, false);
3774
3775 let lower = 1.4999999999999998; let upper = 0.000_000_000_000_000_022_044_604_925_031_31; capture_mode_change_f64((lower, upper), false, true);
3779 }
3780
3781 #[cfg(any(
3782 not(any(target_arch = "x86_64", target_arch = "aarch64")),
3783 target_os = "windows"
3784 ))]
3785 #[test]
3786 fn test_next_impl_add_intervals_f64() {
3787 let lower = 1.5;
3788 let upper = 1.5;
3789 capture_mode_change_f64((lower, upper), true, true);
3790
3791 let lower = 1.5;
3792 let upper = 1.5;
3793 capture_mode_change_f32((lower, upper), true, true);
3794 }
3795}