This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new f42d24205 Add ArrowError::ArithmeticError (#6130)
f42d24205 is described below
commit f42d2420525a05a9b55461d83b359779ca5cc2a3
Author: Andy Grove <[email protected]>
AuthorDate: Fri Jul 26 11:47:46 2024 -0600
Add ArrowError::ArithmeticError (#6130)
---
arrow-arith/src/arithmetic.rs | 4 ++--
arrow-arith/src/numeric.rs | 32 +++++++++++++++++++-------------
arrow-array/src/arithmetic.rs | 17 ++++++++++-------
arrow-cast/src/cast/mod.rs | 7 +++++--
arrow-schema/src/error.rs | 2 ++
5 files changed, 38 insertions(+), 24 deletions(-)
diff --git a/arrow-arith/src/arithmetic.rs b/arrow-arith/src/arithmetic.rs
index 124614d77..febf5ceab 100644
--- a/arrow-arith/src/arithmetic.rs
+++ b/arrow-arith/src/arithmetic.rs
@@ -122,7 +122,7 @@ pub fn multiply_fixed_point_checked(
let mut mul = a.wrapping_mul(b);
mul = divide_and_round::<Decimal256Type>(mul, divisor);
mul.to_i128().ok_or_else(|| {
- ArrowError::ComputeError(format!("Overflow happened on: {:?} *
{:?}", a, b))
+ ArrowError::ArithmeticOverflow(format!("Overflow happened on: {:?}
* {:?}", a, b))
})
})
.and_then(|a| a.with_precision_and_scale(precision, required_scale))
@@ -323,7 +323,7 @@ mod tests {
// `multiply` overflows on this case.
let err = mul(&a, &b).unwrap_err();
- assert_eq!(err.to_string(), "Compute error: Overflow happened on:
123456789000000000000000000 * 10000000000000000000");
+ assert_eq!(err.to_string(), "Arithmetic overflow: Overflow happened
on: 123456789000000000000000000 * 10000000000000000000");
// Avoid overflow by reducing the scale.
let result = multiply_fixed_point(&a, &b, 28).unwrap();
diff --git a/arrow-arith/src/numeric.rs b/arrow-arith/src/numeric.rs
index 91aaf6284..b6af40f7d 100644
--- a/arrow-arith/src/numeric.rs
+++ b/arrow-arith/src/numeric.rs
@@ -888,15 +888,15 @@ mod tests {
test_neg_primitive::<Int32Type>(
&[i32::MIN],
- Err("Compute error: Overflow happened on: - -2147483648"),
+ Err("Arithmetic overflow: Overflow happened on: - -2147483648"),
);
test_neg_primitive::<Int64Type>(
&[i64::MIN],
- Err("Compute error: Overflow happened on: - -9223372036854775808"),
+ Err("Arithmetic overflow: Overflow happened on: -
-9223372036854775808"),
);
test_neg_primitive::<DurationSecondType>(
&[i64::MIN],
- Err("Compute error: Overflow happened on: - -9223372036854775808"),
+ Err("Arithmetic overflow: Overflow happened on: -
-9223372036854775808"),
);
let r = neg_wrapping(&Int32Array::from(vec![i32::MIN])).unwrap();
@@ -911,7 +911,7 @@ mod tests {
assert_eq!(
err,
- "Compute error: Overflow happened on: - -9223372036854775808"
+ "Arithmetic overflow: Overflow happened on: - -9223372036854775808"
);
let a = Decimal128Array::from(vec![1, 3, -44, 2, 4])
@@ -1016,28 +1016,31 @@ mod tests {
let a = UInt8Array::from(vec![56, 5, 3]);
let b = UInt8Array::from(vec![200, 2, 5]);
let err = add(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: 56 + 200");
+ assert_eq!(err, "Arithmetic overflow: Overflow happened on: 56 + 200");
let result = add_wrapping(&a, &b).unwrap();
assert_eq!(result.as_ref(), &UInt8Array::from(vec![0, 7, 8]));
let a = UInt8Array::from(vec![34, 5, 3]);
let b = UInt8Array::from(vec![200, 2, 5]);
let err = sub(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: 34 - 200");
+ assert_eq!(err, "Arithmetic overflow: Overflow happened on: 34 - 200");
let result = sub_wrapping(&a, &b).unwrap();
assert_eq!(result.as_ref(), &UInt8Array::from(vec![90, 3, 254]));
let a = UInt8Array::from(vec![34, 5, 3]);
let b = UInt8Array::from(vec![200, 2, 5]);
let err = mul(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: 34 * 200");
+ assert_eq!(err, "Arithmetic overflow: Overflow happened on: 34 * 200");
let result = mul_wrapping(&a, &b).unwrap();
assert_eq!(result.as_ref(), &UInt8Array::from(vec![144, 10, 15]));
let a = Int16Array::from(vec![i16::MIN]);
let b = Int16Array::from(vec![-1]);
let err = div(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: -32768 / -1");
+ assert_eq!(
+ err,
+ "Arithmetic overflow: Overflow happened on: -32768 / -1"
+ );
let a = Int16Array::from(vec![21]);
let b = Int16Array::from(vec![0]);
@@ -1146,7 +1149,7 @@ mod tests {
.with_precision_and_scale(3, -2)
.unwrap();
let err = add(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: 10 ^ 39");
+ assert_eq!(err, "Arithmetic overflow: Overflow happened on: 10 ^ 39");
let a = Decimal128Array::from(vec![10])
.with_precision_and_scale(3, -1)
@@ -1154,7 +1157,7 @@ mod tests {
let err = add(&a, &b).unwrap_err().to_string();
assert_eq!(
err,
- "Compute error: Overflow happened on: 10 *
100000000000000000000000000000000000000"
+ "Arithmetic overflow: Overflow happened on: 10 *
100000000000000000000000000000000000000"
);
let b = Decimal128Array::from(vec![0])
@@ -1349,7 +1352,10 @@ mod tests {
let a =
IntervalMonthDayNanoArray::from(vec![IntervalMonthDayNano::MAX]);
let b =
IntervalMonthDayNanoArray::from(vec![IntervalMonthDayNano::ONE]);
let err = add(&a, &b).unwrap_err().to_string();
- assert_eq!(err, "Compute error: Overflow happened on: 2147483647 + 1");
+ assert_eq!(
+ err,
+ "Arithmetic overflow: Overflow happened on: 2147483647 + 1"
+ );
}
fn test_duration_impl<T: ArrowPrimitiveType<Native = i64>>() {
@@ -1384,7 +1390,7 @@ mod tests {
let err = add(&a, &b).unwrap_err().to_string();
assert_eq!(
err,
- "Compute error: Overflow happened on: 9223372036854775807 + 1"
+ "Arithmetic overflow: Overflow happened on: 9223372036854775807 +
1"
);
}
@@ -1511,7 +1517,7 @@ mod tests {
let err = sub(&a, &b).unwrap_err().to_string();
assert_eq!(
err,
- "Compute error: Overflow happened on: 9223372036854775807 - -1"
+ "Arithmetic overflow: Overflow happened on: 9223372036854775807 -
-1"
);
}
}
diff --git a/arrow-array/src/arithmetic.rs b/arrow-array/src/arithmetic.rs
index 078c2e3bc..fb9c868fb 100644
--- a/arrow-array/src/arithmetic.rs
+++ b/arrow-array/src/arithmetic.rs
@@ -154,7 +154,7 @@ macro_rules! native_type_op {
#[inline]
fn add_checked(self, rhs: Self) -> Result<Self, ArrowError> {
self.checked_add(rhs).ok_or_else(|| {
- ArrowError::ComputeError(format!(
+ ArrowError::ArithmeticOverflow(format!(
"Overflow happened on: {:?} + {:?}",
self, rhs
))
@@ -169,7 +169,7 @@ macro_rules! native_type_op {
#[inline]
fn sub_checked(self, rhs: Self) -> Result<Self, ArrowError> {
self.checked_sub(rhs).ok_or_else(|| {
- ArrowError::ComputeError(format!(
+ ArrowError::ArithmeticOverflow(format!(
"Overflow happened on: {:?} - {:?}",
self, rhs
))
@@ -184,7 +184,7 @@ macro_rules! native_type_op {
#[inline]
fn mul_checked(self, rhs: Self) -> Result<Self, ArrowError> {
self.checked_mul(rhs).ok_or_else(|| {
- ArrowError::ComputeError(format!(
+ ArrowError::ArithmeticOverflow(format!(
"Overflow happened on: {:?} * {:?}",
self, rhs
))
@@ -202,7 +202,7 @@ macro_rules! native_type_op {
Err(ArrowError::DivideByZero)
} else {
self.checked_div(rhs).ok_or_else(|| {
- ArrowError::ComputeError(format!(
+ ArrowError::ArithmeticOverflow(format!(
"Overflow happened on: {:?} / {:?}",
self, rhs
))
@@ -221,7 +221,7 @@ macro_rules! native_type_op {
Err(ArrowError::DivideByZero)
} else {
self.checked_rem(rhs).ok_or_else(|| {
- ArrowError::ComputeError(format!(
+ ArrowError::ArithmeticOverflow(format!(
"Overflow happened on: {:?} % {:?}",
self, rhs
))
@@ -237,14 +237,17 @@ macro_rules! native_type_op {
#[inline]
fn neg_checked(self) -> Result<Self, ArrowError> {
self.checked_neg().ok_or_else(|| {
- ArrowError::ComputeError(format!("Overflow happened on: -
{:?}", self))
+ ArrowError::ArithmeticOverflow(format!("Overflow happened
on: - {:?}", self))
})
}
#[inline]
fn pow_checked(self, exp: u32) -> Result<Self, ArrowError> {
self.checked_pow(exp).ok_or_else(|| {
- ArrowError::ComputeError(format!("Overflow happened on:
{:?} ^ {exp:?}", self))
+ ArrowError::ArithmeticOverflow(format!(
+ "Overflow happened on: {:?} ^ {exp:?}",
+ self
+ ))
})
}
diff --git a/arrow-cast/src/cast/mod.rs b/arrow-cast/src/cast/mod.rs
index 7df9420f9..5f72debcd 100644
--- a/arrow-cast/src/cast/mod.rs
+++ b/arrow-cast/src/cast/mod.rs
@@ -4531,7 +4531,7 @@ mod tests {
))],
IntervalUnit::DayTime,
format!(
- "Compute error: Overflow happened on: {} * 100",
+ "Arithmetic overflow: Overflow happened on: {} * 100",
i64::MAX - 2
)
);
@@ -4543,7 +4543,10 @@ mod tests {
i64::MAX - 2
))],
IntervalUnit::MonthDayNano,
- format!("Compute error: Overflow happened on: {} * 12", i64::MAX -
2)
+ format!(
+ "Arithmetic overflow: Overflow happened on: {} * 12",
+ i64::MAX - 2
+ )
);
}
diff --git a/arrow-schema/src/error.rs b/arrow-schema/src/error.rs
index d9a0f3452..5e632d051 100644
--- a/arrow-schema/src/error.rs
+++ b/arrow-schema/src/error.rs
@@ -33,6 +33,7 @@ pub enum ArrowError {
SchemaError(String),
ComputeError(String),
DivideByZero,
+ ArithmeticOverflow(String),
CsvError(String),
JsonError(String),
IoError(String, std::io::Error),
@@ -88,6 +89,7 @@ impl Display for ArrowError {
ArrowError::ParseError(desc) => write!(f, "Parser error: {desc}"),
ArrowError::SchemaError(desc) => write!(f, "Schema error: {desc}"),
ArrowError::ComputeError(desc) => write!(f, "Compute error:
{desc}"),
+ ArrowError::ArithmeticOverflow(desc) => write!(f, "Arithmetic
overflow: {desc}"),
ArrowError::DivideByZero => write!(f, "Divide by zero error"),
ArrowError::CsvError(desc) => write!(f, "Csv error: {desc}"),
ArrowError::JsonError(desc) => write!(f, "Json error: {desc}"),