This is an automated email from the ASF dual-hosted git repository.

viirya pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new eb03b4f118 Return error when internal multiplication overflowing in 
decimal division kernel (#6833)
eb03b4f118 is described below

commit eb03b4f1183c35993949cf21e0a32677087788b2
Author: Liang-Chi Hsieh <[email protected]>
AuthorDate: Thu Jul 6 00:20:22 2023 -0700

    Return error when internal multiplication overflowing in decimal division 
kernel (#6833)
---
 datafusion/core/tests/sqllogictests/test_files/decimal.slt       | 9 +++++++++
 datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs | 8 ++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/datafusion/core/tests/sqllogictests/test_files/decimal.slt 
b/datafusion/core/tests/sqllogictests/test_files/decimal.slt
index fd4e80e1af..f413517741 100644
--- a/datafusion/core/tests/sqllogictests/test_files/decimal.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/decimal.slt
@@ -603,3 +603,12 @@ query R
 select try_cast(1234567 as decimal(7,3));
 ----
 NULL
+
+statement ok
+create table foo (a DECIMAL(38, 20), b DECIMAL(38, 0));
+
+statement ok
+insert into foo VALUES (1, 5);
+
+query error DataFusion error: Arrow error: Compute error: Overflow happened 
on: 100000000000000000000 \* 100000000000000000000000000000000000000
+select a / b from foo;
diff --git a/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs 
b/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
index e7d7f62c86..9c6645c303 100644
--- a/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
+++ b/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
@@ -20,8 +20,8 @@
 
 use arrow::compute::{
     add_dyn, add_scalar_dyn, divide_dyn_checked, divide_scalar_dyn, 
modulus_dyn,
-    modulus_scalar_dyn, multiply_fixed_point, multiply_scalar_dyn, 
subtract_dyn,
-    subtract_scalar_dyn, try_unary,
+    modulus_scalar_dyn, multiply_fixed_point, multiply_scalar_checked_dyn,
+    multiply_scalar_dyn, subtract_dyn, subtract_scalar_dyn, try_unary,
 };
 use arrow::datatypes::{Date32Type, Date64Type, Decimal128Type};
 use arrow::{array::*, datatypes::ArrowNumericType};
@@ -662,7 +662,7 @@ pub(crate) fn divide_decimal_dyn_scalar(
     let (precision, scale) = get_precision_scale(result_type)?;
 
     let mul = 10_i128.pow(scale as u32);
-    let array = multiply_scalar_dyn::<Decimal128Type>(left, mul)?;
+    let array = multiply_scalar_checked_dyn::<Decimal128Type>(left, mul)?;
 
     let array = divide_scalar_dyn::<Decimal128Type>(&array, right)?;
     decimal_array_with_precision_scale(array, precision, scale)
@@ -719,7 +719,7 @@ pub(crate) fn divide_dyn_checked_decimal(
     let (precision, scale) = get_precision_scale(result_type)?;
 
     let mul = 10_i128.pow(scale as u32);
-    let array = multiply_scalar_dyn::<Decimal128Type>(left, mul)?;
+    let array = multiply_scalar_checked_dyn::<Decimal128Type>(left, mul)?;
 
     // Restore to original precision and scale (metadata only)
     let (org_precision, org_scale) = get_precision_scale(right.data_type())?;

Reply via email to