This is an automated email from the ASF dual-hosted git repository.
jonah pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 7adc940245 Fix overflow in pow (#11124)
7adc940245 is described below
commit 7adc940245512a6734b5945f2696186204af96bf
Author: Lorrens Pantelis <[email protected]>
AuthorDate: Wed Jun 26 11:15:14 2024 +0200
Fix overflow in pow (#11124)
* checked overflow on integer parameter
* added slt test
* fix: forgot to remove failling test case
---
datafusion/functions/src/math/power.rs | 33 ++++++++++++++++++++---------
datafusion/sqllogictest/test_files/math.slt | 3 +++
2 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/datafusion/functions/src/math/power.rs
b/datafusion/functions/src/math/power.rs
index 7677e8b2af..5b790fb56d 100644
--- a/datafusion/functions/src/math/power.rs
+++ b/datafusion/functions/src/math/power.rs
@@ -17,9 +17,11 @@
//! Math function: `power()`.
-use arrow::datatypes::DataType;
+use arrow::datatypes::{ArrowNativeTypeOp, DataType};
+
use datafusion_common::{
- exec_err, plan_datafusion_err, DataFusionError, Result, ScalarValue,
+ arrow_datafusion_err, exec_datafusion_err, exec_err, plan_datafusion_err,
+ DataFusionError, Result, ScalarValue,
};
use datafusion_expr::expr::ScalarFunction;
use datafusion_expr::simplify::{ExprSimplifyResult, SimplifyInfo};
@@ -94,14 +96,25 @@ impl ScalarUDFImpl for PowerFunc {
{ f64::powf }
)),
- DataType::Int64 => Arc::new(make_function_inputs2!(
- &args[0],
- &args[1],
- "base",
- "exponent",
- Int64Array,
- { i64::pow }
- )),
+ DataType::Int64 => {
+ let bases = downcast_arg!(&args[0], "base", Int64Array);
+ let exponents = downcast_arg!(&args[1], "exponent",
Int64Array);
+ bases
+ .iter()
+ .zip(exponents.iter())
+ .map(|(base, exp)| match (base, exp) {
+ (Some(base), Some(exp)) => Ok(Some(base.pow_checked(
+ exp.try_into().map_err(|_| {
+ exec_datafusion_err!(
+ "Can't use negative exponents: {exp} in
integer computation, please use Float."
+ )
+ })?,
+ ).map_err(|e| arrow_datafusion_err!(e))?)),
+ _ => Ok(None),
+ })
+ .collect::<Result<Int64Array>>()
+ .map(Arc::new)? as ArrayRef
+ }
other => {
return exec_err!(
diff --git a/datafusion/sqllogictest/test_files/math.slt
b/datafusion/sqllogictest/test_files/math.slt
index dfbfa84bf0..a2ce3834a8 100644
--- a/datafusion/sqllogictest/test_files/math.slt
+++ b/datafusion/sqllogictest/test_files/math.slt
@@ -589,3 +589,6 @@ select gcd(0, 0), gcd(-100, 0), gcd(0, -100);
query error DataFusion error: Arrow error: Compute error: Signed integer
overflow in LCM\(\-9223372036854775808, \-9223372036854775808\)
select lcm(-9223372036854775808, -9223372036854775808);
+
+query error DataFusion error: Arrow error: Compute error: Overflow happened
on: 2107754225 \^ 1221660777
+select power(2107754225, 1221660777);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]