Skip to content

Commit 490c99c

Browse files
committed
Use divide_opt` kernel
1 parent a9b1fb3 commit 490c99c

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

datafusion/physical-expr/src/expressions/binary.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use std::{any::Any, sync::Arc};
2424

2525
use arrow::array::*;
2626
use arrow::compute::kernels::arithmetic::{
27-
add, add_scalar, divide, divide_scalar, modulus, modulus_scalar, multiply,
27+
add, add_scalar, divide_opt, divide_scalar, modulus, modulus_scalar, multiply,
2828
multiply_scalar, subtract, subtract_scalar,
2929
};
3030
use arrow::compute::kernels::boolean::{and_kleene, not, or_kleene};
@@ -60,7 +60,7 @@ use kernels::{
6060
bitwise_xor, bitwise_xor_scalar,
6161
};
6262
use kernels_arrow::{
63-
add_decimal, add_decimal_scalar, divide_decimal, divide_decimal_scalar,
63+
add_decimal, add_decimal_scalar, divide_decimal_scalar, divide_opt_decimal,
6464
eq_decimal_scalar, gt_decimal_scalar, gt_eq_decimal_scalar, is_distinct_from,
6565
is_distinct_from_bool, is_distinct_from_decimal, is_distinct_from_null,
6666
is_distinct_from_utf8, is_not_distinct_from, is_not_distinct_from_bool,
@@ -844,7 +844,7 @@ impl BinaryExpr {
844844
Operator::Plus => binary_primitive_array_op!(left, right, add),
845845
Operator::Minus => binary_primitive_array_op!(left, right, subtract),
846846
Operator::Multiply => binary_primitive_array_op!(left, right, multiply),
847-
Operator::Divide => binary_primitive_array_op!(left, right, divide),
847+
Operator::Divide => binary_primitive_array_op!(left, right, divide_opt),
848848
Operator::Modulo => binary_primitive_array_op!(left, right, modulus),
849849
Operator::And => {
850850
if left_data_type == &DataType::Boolean {

datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,14 +372,18 @@ pub(crate) fn multiply_decimal_scalar(
372372
Ok(array)
373373
}
374374

375-
pub(crate) fn divide_decimal(
375+
pub(crate) fn divide_opt_decimal(
376376
left: &Decimal128Array,
377377
right: &Decimal128Array,
378378
) -> Result<Decimal128Array> {
379379
let mul = 10_f64.powi(left.scale() as i32);
380380
let array = arith_decimal(left, right, |left, right| {
381381
let l_value = left as f64;
382382
let r_value = right as f64;
383+
// TODO: Since this uses f64 division, divide by zero and then casting to i128
384+
// gives a nasty asnwer:
385+
// 170141183460469231731687303715884105727
386+
//https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b5949eb324d9828a802aa11b4fa9d029
383387
let result = ((l_value / r_value) * mul) as i128;
384388
Ok(result)
385389
})?
@@ -621,7 +625,7 @@ mod tests {
621625
);
622626
let right_decimal_array =
623627
create_decimal_array(&[Some(10), Some(100), Some(55), Some(-123)], 25, 3);
624-
let result = divide_decimal(&left_decimal_array, &right_decimal_array)?;
628+
let result = divide_decimal_opt(&left_decimal_array, &right_decimal_array)?;
625629
let expect = create_decimal_array(
626630
&[Some(123456700), None, Some(22446672), Some(-10037130)],
627631
25,

0 commit comments

Comments
 (0)