From 34088b5847b306994d88dcab7c2a672cd908a202 Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Tue, 14 Jan 2025 21:02:39 +0800
Subject: [PATCH 1/8] fix: add support for Decimal128 and Decimal256 types in
 interval arithmetic

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 .../expr-common/src/interval_arithmetic.rs      | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs
index ffaa32f08075..0323d6121212 100644
--- a/datafusion/expr-common/src/interval_arithmetic.rs
+++ b/datafusion/expr-common/src/interval_arithmetic.rs
@@ -76,6 +76,14 @@ macro_rules! get_extreme_value {
             DataType::Interval(IntervalUnit::MonthDayNano) => {
                 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::$extreme))
             }
+            DataType::Decimal128(precision, scale) => {
+                ScalarValue::Decimal128(Some(i128::$extreme), *precision, *scale)
+            }
+            DataType::Decimal256(precision, scale) => ScalarValue::Decimal256(
+                Some(arrow::datatypes::i256::$extreme),
+                *precision,
+                *scale,
+            ),
             _ => unreachable!(),
         }
     };
@@ -1008,17 +1016,20 @@ fn handle_overflow<const UPPER: bool>(
     lhs: &ScalarValue,
     rhs: &ScalarValue,
 ) -> ScalarValue {
-    let zero = ScalarValue::new_zero(dt).unwrap();
+    let lhs_zero = ScalarValue::new_zero(&lhs.data_type()).unwrap();
+    let rhs_zero = ScalarValue::new_zero(&rhs.data_type()).unwrap();
     let positive_sign = match op {
         Operator::Multiply | Operator::Divide => {
-            lhs.lt(&zero) && rhs.lt(&zero) || lhs.gt(&zero) && rhs.gt(&zero)
+            lhs.lt(&lhs_zero) && rhs.lt(&rhs_zero)
+                || lhs.gt(&lhs_zero) && rhs.gt(&rhs_zero)
         }
-        Operator::Plus => lhs.ge(&zero),
+        Operator::Plus => lhs.ge(&lhs_zero),
         Operator::Minus => lhs.ge(rhs),
         _ => {
             unreachable!()
         }
     };
+
     match (UPPER, positive_sign) {
         (true, true) | (false, false) => ScalarValue::try_from(dt).unwrap(),
         (true, false) => {

From d0bef9a8770c938ba9f0ad84190e6ea535a98dde Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Tue, 14 Jan 2025 21:18:41 +0800
Subject: [PATCH 2/8] add unit test

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 .../expr-common/src/interval_arithmetic.rs    | 71 ++++++++++++++++++-
 1 file changed, 70 insertions(+), 1 deletion(-)

diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs
index 0323d6121212..9923d79d1c5c 100644
--- a/datafusion/expr-common/src/interval_arithmetic.rs
+++ b/datafusion/expr-common/src/interval_arithmetic.rs
@@ -1843,7 +1843,12 @@ impl NullableInterval {
 
 #[cfg(test)]
 mod tests {
-    use crate::interval_arithmetic::{next_value, prev_value, satisfy_greater, Interval};
+    use crate::{
+        interval_arithmetic::{
+            handle_overflow, next_value, prev_value, satisfy_greater, Interval,
+        },
+        operator::Operator,
+    };
 
     use arrow::datatypes::DataType;
     use datafusion_common::{Result, ScalarValue};
@@ -3119,6 +3124,70 @@ mod tests {
         Ok(())
     }
 
+    #[test]
+    fn test_overflow_handling() -> Result<()> {
+        // Test integer overflow handling:
+        let dt = DataType::Int32;
+        let op = Operator::Plus;
+        let lhs = ScalarValue::Int32(Some(i32::MAX));
+        let rhs = ScalarValue::Int32(Some(1));
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Int32(None));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Int32(Some(i32::MAX)));
+
+        // Test float overflow handling:
+        let dt = DataType::Float32;
+        let op = Operator::Multiply;
+        let lhs = ScalarValue::Float32(Some(f32::MAX));
+        let rhs = ScalarValue::Float32(Some(2.0));
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Float32(None));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Float32(Some(f32::MAX)));
+
+        // Test float underflow handling:
+        let lhs = ScalarValue::Float32(Some(f32::MIN));
+        let rhs = ScalarValue::Float32(Some(2.0));
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Float32(Some(f32::MIN)));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Float32(None));
+
+        // Test integer underflow handling:
+        let dt = DataType::Int64;
+        let op = Operator::Minus;
+        let lhs = ScalarValue::Int64(Some(i64::MIN));
+        let rhs = ScalarValue::Int64(Some(1));
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Int64(Some(i64::MIN)));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Int64(None));
+
+        // Test unsigned integer handling:
+        let dt = DataType::UInt32;
+        let op = Operator::Minus;
+        let lhs = ScalarValue::UInt32(Some(0));
+        let rhs = ScalarValue::UInt32(Some(1));
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::UInt32(Some(0)));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::UInt32(None));
+
+        // Test decimal handling:
+        let dt = DataType::Decimal128(38, 35);
+        let op = Operator::Plus;
+        let lhs =
+            ScalarValue::Decimal128(Some(54321543215432154321543215432154321), 35, 35);
+        let rhs = ScalarValue::Decimal128(Some(10000), 20, 0);
+        let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Decimal128(None, 38, 35));
+        let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
+        assert_eq!(result, ScalarValue::Decimal128(Some(i128::MAX), 38, 35));
+
+        Ok(())
+    }
+
     #[test]
     fn test_cardinality_of_intervals() -> Result<()> {
         // In IEEE 754 standard for floating-point arithmetic, if we keep the sign and exponent fields same,

From e3b193ad179288f23ad5fe662ddab3ca8d0b4251 Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Wed, 15 Jan 2025 12:29:06 +0800
Subject: [PATCH 3/8] add sqllogictest

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 datafusion/sqllogictest/test_files/select.slt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/datafusion/sqllogictest/test_files/select.slt b/datafusion/sqllogictest/test_files/select.slt
index a127463c2b27..0701101b8465 100644
--- a/datafusion/sqllogictest/test_files/select.slt
+++ b/datafusion/sqllogictest/test_files/select.slt
@@ -1836,3 +1836,7 @@ DROP TABLE test;
 # Can't reference an unqualified column by a qualified name
 query error DataFusion error: Schema error: No field named t1\.v1\. Valid fields are "t1\.v1"\.
 SELECT t1.v1 FROM (SELECT 1 AS "t1.v1");
+
+# Test issue: https://github.com/apache/datafusion/issues/14124
+query error DataFusion error: Arrow error: Arithmetic overflow: Overflow happened on: 10000 \* 100000000000000000000000000000000000
+SELECT ('0.54321543215432154321543215432154321'::DECIMAL(35,35) + 10000)::VARCHAR

From c51f5fbc74f753b2fc88239be13a21ac151c11eb Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Thu, 23 Jan 2025 22:59:38 +0800
Subject: [PATCH 4/8] copy constant vectors from arrow

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 .../expr-common/src/interval_arithmetic.rs    | 728 +++++++++++++++++-
 1 file changed, 724 insertions(+), 4 deletions(-)

diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs
index 9923d79d1c5c..8db582b7acd2 100644
--- a/datafusion/expr-common/src/interval_arithmetic.rs
+++ b/datafusion/expr-common/src/interval_arithmetic.rs
@@ -76,11 +76,19 @@ macro_rules! get_extreme_value {
             DataType::Interval(IntervalUnit::MonthDayNano) => {
                 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::$extreme))
             }
-            DataType::Decimal128(precision, scale) => {
-                ScalarValue::Decimal128(Some(i128::$extreme), *precision, *scale)
-            }
+            DataType::Decimal128(precision, scale) => ScalarValue::Decimal128(
+                Some(
+                    paste::paste! {[<$extreme _DECIMAL128_FOR_EACH_PRECISION>]}
+                        [*precision as usize],
+                ),
+                *precision,
+                *scale,
+            ),
             DataType::Decimal256(precision, scale) => ScalarValue::Decimal256(
-                Some(arrow::datatypes::i256::$extreme),
+                Some(
+                    paste::paste! {[<$extreme _DECIMAL256_FOR_EACH_PRECISION>]}
+                        [*precision as usize],
+                ),
                 *precision,
                 *scale,
             ),
@@ -89,6 +97,718 @@ macro_rules! get_extreme_value {
     };
 }
 
+/// The maximum `i128` value that can be stored in a `Decimal128` value of precision `p`.
+///
+/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+const MAX_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
+    0, // unused first element
+    9,
+    99,
+    999,
+    9999,
+    99999,
+    999999,
+    9999999,
+    99999999,
+    999999999,
+    9999999999,
+    99999999999,
+    999999999999,
+    9999999999999,
+    99999999999999,
+    999999999999999,
+    9999999999999999,
+    99999999999999999,
+    999999999999999999,
+    9999999999999999999,
+    99999999999999999999,
+    999999999999999999999,
+    9999999999999999999999,
+    99999999999999999999999,
+    999999999999999999999999,
+    9999999999999999999999999,
+    99999999999999999999999999,
+    999999999999999999999999999,
+    9999999999999999999999999999,
+    99999999999999999999999999999,
+    999999999999999999999999999999,
+    9999999999999999999999999999999,
+    99999999999999999999999999999999,
+    999999999999999999999999999999999,
+    9999999999999999999999999999999999,
+    99999999999999999999999999999999999,
+    999999999999999999999999999999999999,
+    9999999999999999999999999999999999999,
+    99999999999999999999999999999999999999,
+];
+
+/// The minimum `i128` value that can be stored in a `Decimal128` value of precision `p`.
+///
+/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+const MIN_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
+    0, // unused first element
+    -9,
+    -99,
+    -999,
+    -9999,
+    -99999,
+    -999999,
+    -9999999,
+    -99999999,
+    -999999999,
+    -9999999999,
+    -99999999999,
+    -999999999999,
+    -9999999999999,
+    -99999999999999,
+    -999999999999999,
+    -9999999999999999,
+    -99999999999999999,
+    -999999999999999999,
+    -9999999999999999999,
+    -99999999999999999999,
+    -999999999999999999999,
+    -9999999999999999999999,
+    -99999999999999999999999,
+    -999999999999999999999999,
+    -9999999999999999999999999,
+    -99999999999999999999999999,
+    -999999999999999999999999999,
+    -9999999999999999999999999999,
+    -99999999999999999999999999999,
+    -999999999999999999999999999999,
+    -9999999999999999999999999999999,
+    -99999999999999999999999999999999,
+    -999999999999999999999999999999999,
+    -9999999999999999999999999999999999,
+    -99999999999999999999999999999999999,
+    -999999999999999999999999999999999999,
+    -9999999999999999999999999999999999999,
+    -99999999999999999999999999999999999999,
+];
+
+/// The maximum `i256` value that can be stored in a `Decimal256` value of precision `p`.
+///
+/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+const MAX_DECIMAL256_FOR_EACH_PRECISION: [arrow::datatypes::i256; 77] = [
+    arrow::datatypes::i256::from_i128(0_i128), // unused first element
+    arrow::datatypes::i256::from_le_bytes([
+        9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        15, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        159, 134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        63, 66, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        127, 150, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 224, 245, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 201, 154, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 227, 11, 84, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 231, 118, 72, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 15, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 159, 114, 78, 24, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 63, 122, 16, 243, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 127, 198, 164, 126, 141, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 192, 111, 242, 134, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 137, 93, 120, 69, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 99, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 231, 137, 4, 35, 199, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 15, 99, 45, 94, 199, 107, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 159, 222, 197, 173, 201, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 63, 178, 186, 201, 224, 25, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 127, 246, 74, 225, 199, 2, 45, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 160, 237, 204, 206, 27, 194, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 73, 72, 1, 20, 22, 149, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 227, 210, 12, 200, 220, 210, 183, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 231, 60, 128, 208, 159, 60, 46, 59, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 15, 97, 2, 37, 62, 94, 206, 79, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 159, 202, 23, 114, 109, 174, 15, 30, 67, 1, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 63, 234, 237, 116, 70, 208, 156, 44, 159, 12, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 127, 38, 75, 145, 192, 34, 32, 190, 55, 126, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 128, 239, 172, 133, 91, 65, 109, 45, 238, 4, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 9, 91, 193, 56, 147, 141, 68, 198, 77, 49, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 99, 142, 141, 55, 192, 135, 173, 190, 9, 237, 1, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 231, 143, 135, 43, 130, 77, 199, 114, 97, 66, 19, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 15, 159, 75, 179, 21, 7, 201, 123, 206, 151, 192, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 159, 54, 244, 0, 217, 70, 218, 213, 16, 238, 133, 7, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 63, 34, 138, 9, 122, 196, 134, 90, 168, 76, 59, 75, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 127, 86, 101, 95, 196, 172, 67, 137, 147, 254, 80, 240, 2, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 96, 245, 185, 171, 191, 164, 92, 195, 241, 41, 99, 29,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 201, 149, 67, 181, 124, 111, 158, 161, 113, 163, 223,
+        37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 227, 217, 163, 20, 223, 90, 48, 80, 112, 98, 188, 122,
+        11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 231, 130, 102, 206, 182, 140, 227, 33, 99, 216, 91, 203,
+        114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 15, 29, 1, 16, 36, 127, 227, 82, 223, 115, 150, 241,
+        123, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 159, 34, 11, 160, 104, 247, 226, 60, 185, 134, 224, 111,
+        215, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 63, 90, 111, 64, 22, 170, 221, 96, 60, 67, 197, 94, 106,
+        192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 127, 134, 89, 132, 222, 164, 168, 200, 91, 160, 180,
+        179, 39, 132, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 64, 127, 43, 177, 112, 150, 214, 149, 67, 14, 5,
+        141, 41, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 137, 248, 178, 235, 102, 224, 97, 218, 163, 142,
+        50, 130, 159, 215, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 99, 181, 253, 52, 5, 196, 210, 135, 102, 146, 249,
+        21, 59, 108, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 231, 21, 233, 17, 52, 168, 59, 78, 1, 184, 191,
+        219, 78, 58, 172, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 15, 219, 26, 179, 8, 146, 84, 14, 13, 48, 125, 149,
+        20, 71, 186, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 159, 142, 12, 255, 86, 180, 77, 143, 130, 224, 227,
+        214, 205, 198, 70, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 63, 146, 125, 246, 101, 11, 9, 153, 25, 197, 230,
+        100, 10, 196, 195, 112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 127, 182, 231, 160, 251, 113, 90, 250, 255, 178, 3,
+        241, 103, 168, 165, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 32, 13, 73, 212, 115, 136, 199, 255, 253, 36,
+        106, 15, 148, 120, 12, 20, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 73, 131, 218, 74, 134, 84, 203, 253, 235, 113,
+        37, 154, 200, 181, 124, 200, 40, 0, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 227, 32, 137, 236, 62, 77, 241, 233, 55, 115,
+        118, 5, 214, 25, 223, 212, 151, 1, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 231, 72, 91, 61, 117, 4, 109, 35, 47, 128,
+        160, 54, 92, 2, 183, 80, 238, 15, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 15, 217, 144, 101, 148, 44, 66, 98, 215, 1,
+        69, 34, 154, 23, 38, 39, 79, 159, 0, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 159, 122, 168, 247, 203, 189, 149, 214, 105,
+        18, 178, 86, 5, 236, 124, 135, 23, 57, 6, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 63, 202, 148, 172, 247, 105, 217, 97, 34, 184,
+        244, 98, 53, 56, 225, 74, 235, 58, 62, 0, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 127, 230, 207, 189, 172, 35, 126, 210, 87, 49,
+        143, 221, 21, 50, 204, 236, 48, 77, 110, 2, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 0, 31, 106, 191, 100, 237, 56, 110, 237,
+        151, 167, 218, 244, 249, 63, 233, 3, 79, 24, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 9, 54, 37, 122, 239, 69, 57, 78, 70, 239,
+        139, 138, 144, 195, 127, 28, 39, 22, 243, 0, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 99, 28, 116, 197, 90, 187, 60, 14, 191,
+        88, 119, 105, 165, 163, 253, 28, 135, 221, 126, 9, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 231, 27, 137, 182, 139, 81, 95, 142, 118,
+        119, 169, 30, 118, 100, 232, 33, 71, 167, 244, 94, 0, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 15, 23, 91, 33, 117, 47, 185, 143, 161,
+        170, 158, 50, 157, 236, 19, 83, 199, 136, 142, 181, 3, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 159, 230, 142, 77, 147, 218, 59, 157, 79,
+        170, 50, 250, 35, 62, 199, 62, 201, 87, 145, 23, 37, 0, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 63, 2, 149, 7, 193, 137, 86, 36, 28, 167,
+        250, 197, 103, 109, 200, 115, 220, 109, 173, 235, 114, 1, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 127, 22, 210, 75, 138, 97, 97, 107, 25,
+        135, 202, 187, 13, 70, 212, 133, 156, 74, 198, 52, 125, 14, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 52, 246, 102, 207, 205, 49,
+        254, 70, 233, 85, 137, 188, 74, 58, 29, 234, 190, 15, 228, 144, 0, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 16, 158, 5, 26, 10, 242, 237,
+        197, 28, 91, 93, 93, 235, 70, 36, 37, 117, 157, 232, 168, 5, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 167, 44, 56, 4, 101, 116, 75,
+        187, 31, 143, 165, 165, 49, 197, 106, 115, 147, 38, 22, 153, 56, 0,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 142, 190, 49, 42, 242, 139,
+        242, 80, 61, 151, 119, 120, 240, 179, 43, 130, 194, 129, 221, 250, 53, 2,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 149, 113, 241, 165, 117, 119,
+        121, 41, 101, 232, 171, 180, 100, 7, 181, 21, 153, 17, 167, 204, 27, 22,
+    ]),
+];
+
+/// The minimum `i256` value that can be stored in a `Decimal256` value of precision `p`.
+///
+/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+const MIN_DECIMAL256_FOR_EACH_PRECISION: [arrow::datatypes::i256; 77] = [
+    arrow::datatypes::i256::from_i128(0_i128), // unused first element
+    arrow::datatypes::i256::from_le_bytes([
+        247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        157, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        25, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        241, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        97, 121, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        193, 189, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        129, 105, 103, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 31, 10, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 54, 101, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 28, 244, 171, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 24, 137, 183, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 240, 90, 43, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 96, 141, 177, 231, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 192, 133, 239, 12, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 128, 57, 91, 129, 114, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 63, 144, 13, 121, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 118, 162, 135, 186, 156, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 156, 88, 76, 73, 31, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 24, 118, 251, 220, 56, 117, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 240, 156, 210, 161, 56, 148, 250, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 96, 33, 58, 82, 54, 202, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 192, 77, 69, 54, 31, 230, 225, 253, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 128, 9, 181, 30, 56, 253, 210, 234, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 95, 18, 51, 49, 228, 61, 44, 255, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 182, 183, 254, 235, 233, 106, 186, 247, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 28, 45, 243, 55, 35, 45, 72, 173, 255, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 24, 195, 127, 47, 96, 195, 209, 196, 252, 255, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 240, 158, 253, 218, 193, 161, 49, 176, 223, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 96, 53, 232, 141, 146, 81, 240, 225, 188, 254, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 192, 21, 18, 139, 185, 47, 99, 211, 96, 243, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 128, 217, 180, 110, 63, 221, 223, 65, 200, 129, 255, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 127, 16, 83, 122, 164, 190, 146, 210, 17, 251, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 246, 164, 62, 199, 108, 114, 187, 57, 178, 206, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 156, 113, 114, 200, 63, 120, 82, 65, 246, 18, 254, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 24, 112, 120, 212, 125, 178, 56, 141, 158, 189, 236, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 240, 96, 180, 76, 234, 248, 54, 132, 49, 104, 63, 255, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 96, 201, 11, 255, 38, 185, 37, 42, 239, 17, 122, 248, 255, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 192, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 180, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 128, 169, 154, 160, 59, 83, 188, 118, 108, 1, 175, 15, 253, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 159, 10, 70, 84, 64, 91, 163, 60, 14, 214, 156, 226, 255, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 54, 106, 188, 74, 131, 144, 97, 94, 142, 92, 32, 218, 254, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 28, 38, 92, 235, 32, 165, 207, 175, 143, 157, 67, 133, 244, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 24, 125, 153, 49, 73, 115, 28, 222, 156, 39, 164, 52, 141, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 240, 226, 254, 239, 219, 128, 28, 173, 32, 140, 105, 14, 132, 251,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 96, 221, 244, 95, 151, 8, 29, 195, 70, 121, 31, 144, 40, 211, 255,
+        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 192, 165, 144, 191, 233, 85, 34, 159, 195, 188, 58, 161, 149, 63,
+        254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 128, 121, 166, 123, 33, 91, 87, 55, 164, 95, 75, 76, 216, 123,
+        238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 191, 128, 212, 78, 143, 105, 41, 106, 188, 241, 250, 114, 214,
+        80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 118, 7, 77, 20, 153, 31, 158, 37, 92, 113, 205, 125, 96, 40,
+        249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 156, 74, 2, 203, 250, 59, 45, 120, 153, 109, 6, 234, 196, 147,
+        187, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 24, 234, 22, 238, 203, 87, 196, 177, 254, 71, 64, 36, 177, 197,
+        83, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 240, 36, 229, 76, 247, 109, 171, 241, 242, 207, 130, 106, 235,
+        184, 69, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 96, 113, 243, 0, 169, 75, 178, 112, 125, 31, 28, 41, 50, 57,
+        185, 244, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 192, 109, 130, 9, 154, 244, 246, 102, 230, 58, 25, 155, 245,
+        59, 60, 143, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 128, 73, 24, 95, 4, 142, 165, 5, 0, 77, 252, 14, 152, 87, 90,
+        152, 151, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 223, 242, 182, 43, 140, 119, 56, 0, 2, 219, 149, 240, 107,
+        135, 243, 235, 251, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 182, 124, 37, 181, 121, 171, 52, 2, 20, 142, 218, 101, 55,
+        74, 131, 55, 215, 255, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 28, 223, 118, 19, 193, 178, 14, 22, 200, 140, 137, 250, 41,
+        230, 32, 43, 104, 254, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 24, 183, 164, 194, 138, 251, 146, 220, 208, 127, 95, 201,
+        163, 253, 72, 175, 17, 240, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 240, 38, 111, 154, 107, 211, 189, 157, 40, 254, 186, 221,
+        101, 232, 217, 216, 176, 96, 255, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 96, 133, 87, 8, 52, 66, 106, 41, 150, 237, 77, 169, 250, 19,
+        131, 120, 232, 198, 249, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 192, 53, 107, 83, 8, 150, 38, 158, 221, 71, 11, 157, 202,
+        199, 30, 181, 20, 197, 193, 255, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 128, 25, 48, 66, 83, 220, 129, 45, 168, 206, 112, 34, 234,
+        205, 51, 19, 207, 178, 145, 253, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 255, 224, 149, 64, 155, 18, 199, 145, 18, 104, 88, 37,
+        11, 6, 192, 22, 252, 176, 231, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 246, 201, 218, 133, 16, 186, 198, 177, 185, 16, 116, 117,
+        111, 60, 128, 227, 216, 233, 12, 255, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 156, 227, 139, 58, 165, 68, 195, 241, 64, 167, 136, 150,
+        90, 92, 2, 227, 120, 34, 129, 246, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 24, 228, 118, 73, 116, 174, 160, 113, 137, 136, 86, 225,
+        137, 155, 23, 222, 184, 88, 11, 161, 255, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 240, 232, 164, 222, 138, 208, 70, 112, 94, 85, 97, 205,
+        98, 19, 236, 172, 56, 119, 113, 74, 252, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 96, 25, 113, 178, 108, 37, 196, 98, 176, 85, 205, 5, 220,
+        193, 56, 193, 54, 168, 110, 232, 218, 255, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 192, 253, 106, 248, 62, 118, 169, 219, 227, 88, 5, 58,
+        152, 146, 55, 140, 35, 146, 82, 20, 141, 254, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 128, 233, 45, 180, 117, 158, 158, 148, 230, 120, 53, 68,
+        242, 185, 43, 122, 99, 181, 57, 203, 130, 241, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 31, 203, 9, 153, 48, 50, 206, 1, 185, 22, 170, 118,
+        67, 181, 197, 226, 21, 65, 240, 27, 111, 255, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 54, 239, 97, 250, 229, 245, 13, 18, 58, 227, 164, 162,
+        162, 20, 185, 219, 218, 138, 98, 23, 87, 250, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 28, 88, 211, 199, 251, 154, 139, 180, 68, 224, 112,
+        90, 90, 206, 58, 149, 140, 108, 217, 233, 102, 199, 255,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 24, 113, 65, 206, 213, 13, 116, 13, 175, 194, 104,
+        136, 135, 15, 76, 212, 125, 61, 126, 34, 5, 202, 253,
+    ]),
+    arrow::datatypes::i256::from_le_bytes([
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 240, 106, 142, 14, 90, 138, 136, 134, 214, 154, 23,
+        84, 75, 155, 248, 74, 234, 102, 238, 88, 51, 228, 233,
+    ]),
+];
+
 macro_rules! value_transition {
     ($bound:ident, $direction:expr, $value:expr) => {
         match $value {

From a5f129bda02f3824532cc17373d4555e8df4fa85 Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Thu, 23 Jan 2025 23:03:04 +0800
Subject: [PATCH 5/8] toml file

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 datafusion/expr-common/Cargo.toml | 2 --
 1 file changed, 2 deletions(-)

diff --git a/datafusion/expr-common/Cargo.toml b/datafusion/expr-common/Cargo.toml
index 1ccc6fc17293..109d8e0b89a6 100644
--- a/datafusion/expr-common/Cargo.toml
+++ b/datafusion/expr-common/Cargo.toml
@@ -40,6 +40,4 @@ path = "src/lib.rs"
 arrow = { workspace = true }
 datafusion-common = { workspace = true }
 itertools = { workspace = true }
-
-[dev-dependencies]
 paste = "^1.0"

From e0768e68ece6d9d9976ac3d170db3d480de33a0d Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Thu, 23 Jan 2025 23:24:18 +0800
Subject: [PATCH 6/8] update ut

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 datafusion/expr-common/src/interval_arithmetic.rs | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs
index 8db582b7acd2..df80afb3dd9b 100644
--- a/datafusion/expr-common/src/interval_arithmetic.rs
+++ b/datafusion/expr-common/src/interval_arithmetic.rs
@@ -3903,7 +3903,10 @@ mod tests {
         let result = handle_overflow::<true>(&dt, op, &lhs, &rhs);
         assert_eq!(result, ScalarValue::Decimal128(None, 38, 35));
         let result = handle_overflow::<false>(&dt, op, &lhs, &rhs);
-        assert_eq!(result, ScalarValue::Decimal128(Some(i128::MAX), 38, 35));
+        assert_eq!(
+            result,
+            ScalarValue::Decimal128(Some(99999999999999999999999999999999999999), 38, 35)
+        );
 
         Ok(())
     }

From fe8d3b637bd11248725c08b415db28cca6b3ec01 Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Thu, 23 Jan 2025 23:53:05 +0800
Subject: [PATCH 7/8] update lock file

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 datafusion-cli/Cargo.lock | 1 +
 1 file changed, 1 insertion(+)

diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index dfc75f15b03b..004df6d2d073 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -1407,6 +1407,7 @@ dependencies = [
  "arrow",
  "datafusion-common",
  "itertools 0.14.0",
+ "paste",
 ]
 
 [[package]]

From 03050282aab74b2217f5d2a63290ce45e8a1f7d6 Mon Sep 17 00:00:00 2001
From: Ruihang Xia <waynestxia@gmail.com>
Date: Fri, 24 Jan 2025 10:19:06 +0800
Subject: [PATCH 8/8] use auto link

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
---
 datafusion/expr-common/src/interval_arithmetic.rs | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs
index df80afb3dd9b..993051eaeee1 100644
--- a/datafusion/expr-common/src/interval_arithmetic.rs
+++ b/datafusion/expr-common/src/interval_arithmetic.rs
@@ -99,7 +99,7 @@ macro_rules! get_extreme_value {
 
 /// The maximum `i128` value that can be stored in a `Decimal128` value of precision `p`.
 ///
-/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+/// Remove this once <https://github.com/apache/arrow-rs/pull/6992> is available
 const MAX_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
     0, // unused first element
     9,
@@ -144,7 +144,7 @@ const MAX_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
 
 /// The minimum `i128` value that can be stored in a `Decimal128` value of precision `p`.
 ///
-/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+/// Remove this once <https://github.com/apache/arrow-rs/pull/6992> is available
 const MIN_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
     0, // unused first element
     -9,
@@ -189,7 +189,7 @@ const MIN_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
 
 /// The maximum `i256` value that can be stored in a `Decimal256` value of precision `p`.
 ///
-/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+/// Remove this once <https://github.com/apache/arrow-rs/pull/6992> is available
 const MAX_DECIMAL256_FOR_EACH_PRECISION: [arrow::datatypes::i256; 77] = [
     arrow::datatypes::i256::from_i128(0_i128), // unused first element
     arrow::datatypes::i256::from_le_bytes([
@@ -500,7 +500,7 @@ const MAX_DECIMAL256_FOR_EACH_PRECISION: [arrow::datatypes::i256; 77] = [
 
 /// The minimum `i256` value that can be stored in a `Decimal256` value of precision `p`.
 ///
-/// Remove this once https://github.com/apache/arrow-rs/pull/6992 is available
+/// Remove this once <https://github.com/apache/arrow-rs/pull/6992> is available
 const MIN_DECIMAL256_FOR_EACH_PRECISION: [arrow::datatypes::i256; 77] = [
     arrow::datatypes::i256::from_i128(0_i128), // unused first element
     arrow::datatypes::i256::from_le_bytes([