You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by mb...@apache.org on 2026/06/22 15:28:36 UTC
(datafusion) branch branch-54 updated: [branch-54]: backport #22811 (bugfix: changed return type of spark's width_bucket to i64) (#23087)
This is an automated email from the ASF dual-hosted git repository.
mbutrovich pushed a commit to branch branch-54
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/branch-54 by this push:
new aa59c66c10 [branch-54]: backport #22811 (bugfix: changed return type of spark's width_bucket to i64) (#23087)
aa59c66c10 is described below
commit aa59c66c10e58d48e60ee30f19f27a02eb8a8577
Author: Matt Butrovich <mb...@users.noreply.github.com>
AuthorDate: Mon Jun 22 11:28:30 2026 -0400
[branch-54]: backport #22811 (bugfix: changed return type of spark's width_bucket to i64) (#23087)
backport #22811 to `branch-54` in anticipation of 54.1.0 release.
DataFusion Comet encountered this issue while trying to upgrade to DF
54.0.0, so it would ease that upgrade for Comet if this were backported.
Co-authored-by: Eduardo Aguilar <co...@eduaguilar.com>
---
datafusion/spark/src/function/math/width_bucket.rs | 78 ++++++++++------------
1 file changed, 37 insertions(+), 41 deletions(-)
diff --git a/datafusion/spark/src/function/math/width_bucket.rs b/datafusion/spark/src/function/math/width_bucket.rs
index 79da924116..93be47a4ca 100644
--- a/datafusion/spark/src/function/math/width_bucket.rs
+++ b/datafusion/spark/src/function/math/width_bucket.rs
@@ -21,8 +21,7 @@ use arrow::array::{
Array, ArrayRef, DurationMicrosecondArray, Float64Array, IntervalMonthDayNanoArray,
IntervalYearMonthArray,
};
-use arrow::datatypes::DataType;
-use arrow::datatypes::DataType::{Duration, Float64, Int32, Interval};
+use arrow::datatypes::DataType::{self, Duration, Float64, Int64, Interval};
use arrow::datatypes::IntervalUnit::{MonthDayNano, YearMonth};
use datafusion_common::cast::{
as_duration_microsecond_array, as_float64_array, as_int64_array,
@@ -40,7 +39,7 @@ use datafusion_expr::{
};
use datafusion_functions::utils::make_scalar_function;
-use arrow::array::{Int32Array, Int32Builder, Int64Array};
+use arrow::array::{Int64Array, Int64Builder};
use arrow::datatypes::TimeUnit::Microsecond;
use datafusion_expr::Coercion;
use datafusion_expr::Volatility::Immutable;
@@ -125,7 +124,7 @@ impl ScalarUDFImpl for SparkWidthBucket {
}
fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
- Ok(Int32)
+ Ok(Int64)
}
fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> {
@@ -199,9 +198,9 @@ macro_rules! width_bucket_kernel_impl {
min: &$arr_ty,
max: &$arr_ty,
n_bucket: &Int64Array,
- ) -> Int32Array {
+ ) -> Int64Array {
let len = v.len();
- let mut b = Int32Builder::with_capacity(len);
+ let mut b = Int64Builder::with_capacity(len);
for i in 0..len {
if v.is_null(i) || min.is_null(i) || max.is_null(i) || n_bucket.is_null(i)
@@ -218,7 +217,7 @@ macro_rules! width_bucket_kernel_impl {
b.append_null();
continue;
}
- let next_bucket = (buckets + 1) as i32;
+ let next_bucket = (buckets + 1) as i64;
if $check_nan {
if !x.is_finite() || !l.is_finite() || !h.is_finite() {
b.append_null();
@@ -264,7 +263,7 @@ macro_rules! width_bucket_kernel_impl {
b.append_null();
continue;
}
- let mut bucket = ((x - l) / width).floor() as i32 + 1;
+ let mut bucket = ((x - l) / width).floor() as i64 + 1;
if bucket < 1 {
bucket = 1;
}
@@ -306,9 +305,9 @@ pub(crate) fn width_bucket_interval_mdn_exact(
lo: &IntervalMonthDayNanoArray,
hi: &IntervalMonthDayNanoArray,
n: &Int64Array,
-) -> Int32Array {
+) -> Int64Array {
let len = v.len();
- let mut b = Int32Builder::with_capacity(len);
+ let mut b = Int64Builder::with_capacity(len);
for i in 0..len {
if v.is_null(i) || lo.is_null(i) || hi.is_null(i) || n.is_null(i) {
@@ -320,7 +319,7 @@ pub(crate) fn width_bucket_interval_mdn_exact(
b.append_null();
continue;
}
- let next_bucket = (buckets + 1) as i32;
+ let next_bucket = buckets + 1;
let x = v.value(i);
let l = lo.value(i);
@@ -366,7 +365,7 @@ pub(crate) fn width_bucket_interval_mdn_exact(
continue;
}
- let mut bucket = ((x_m - l_m) / width).floor() as i32 + 1;
+ let mut bucket = ((x_m - l_m) / width).floor() as i64 + 1;
if bucket < 1 {
bucket = 1;
}
@@ -417,7 +416,7 @@ pub(crate) fn width_bucket_interval_mdn_exact(
continue;
}
- let mut bucket = ((x_f - l_f) / width).floor() as i32 + 1;
+ let mut bucket = ((x_f - l_f) / width).floor() as i64 + 1;
if bucket < 1 {
bucket = 1;
}
@@ -437,10 +436,11 @@ pub(crate) fn width_bucket_interval_mdn_exact(
#[cfg(test)]
mod tests {
use super::*;
+ use arrow::datatypes::Int64Type;
use arrow::array::{
- ArrayRef, DurationMicrosecondArray, Float64Array, Int32Array, Int64Array,
- IntervalYearMonthArray,
+ ArrayRef, AsArray, DurationMicrosecondArray, Float64Array, Int32Array,
+ Int64Array, IntervalYearMonthArray,
};
use arrow::datatypes::IntervalMonthDayNano;
@@ -466,10 +466,6 @@ mod tests {
Arc::new(IntervalYearMonthArray::from(vals.to_vec()))
}
- fn downcast_i32(arr: &ArrayRef) -> &Int32Array {
- arr.as_any().downcast_ref::<Int32Array>().unwrap()
- }
-
fn mdn_array(vals: &[(i32, i32, i64)]) -> Arc<IntervalMonthDayNanoArray> {
let data: Vec<IntervalMonthDayNano> = vals
.iter()
@@ -488,7 +484,7 @@ mod tests {
let n = i64_array_all(5, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 2, 10, 0, 11]);
}
@@ -500,7 +496,7 @@ mod tests {
let n = i64_array_all(5, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 1, 11, 11, 0]);
}
@@ -512,7 +508,7 @@ mod tests {
let n = i64_array_all(3, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 10, 11]);
}
@@ -524,7 +520,7 @@ mod tests {
let n = i64_array_all(3, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 11, 11]);
}
@@ -535,7 +531,7 @@ mod tests {
let hi = f64_array(&[10.0, 10.0, 10.0]);
let n = Arc::new(Int64Array::from(vec![0, -1, 10]));
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
assert!(out.is_null(1));
assert_eq!(out.value(2), 10);
@@ -545,7 +541,7 @@ mod tests {
let hi = f64_array(&[5.0]);
let n = i64_array_all(1, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
let v = f64_array_opt(&[Some(f64::NAN)]);
@@ -553,7 +549,7 @@ mod tests {
let hi = f64_array(&[10.0]);
let n = i64_array_all(1, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
}
@@ -565,7 +561,7 @@ mod tests {
let n = i64_array_all(4, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
assert_eq!(out.value(1), 2);
assert_eq!(out.value(2), 3);
@@ -576,7 +572,7 @@ mod tests {
let hi = f64_array(&[10.0]);
let n = i64_array_all(1, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
}
@@ -590,7 +586,7 @@ mod tests {
let n = i64_array_all(3, 2);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[2, 1, 0]);
}
@@ -601,7 +597,7 @@ mod tests {
let hi = dur_us_array(&[1]);
let n = i64_array_all(1, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- assert!(downcast_i32(&out).is_null(0));
+ assert!(out.as_primitive::<Int64Type>().is_null(0));
}
// --- Interval(YearMonth) ------------------------------------------------
@@ -614,7 +610,7 @@ mod tests {
let n = i64_array_all(5, 12);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 6, 12, 13, 13]);
}
@@ -626,7 +622,7 @@ mod tests {
let n = i64_array_all(5, 12);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[2, 1, 13, 13, 0]);
}
@@ -640,7 +636,7 @@ mod tests {
let n = i64_array_all(5, 12);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 6, 12, 13, 13]);
}
@@ -652,7 +648,7 @@ mod tests {
let n = i64_array_all(5, 12);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
// Mismo patrĂ³n que YM descendente
assert_eq!(out.values(), &[2, 1, 13, 13, 0]);
}
@@ -672,7 +668,7 @@ mod tests {
let n = i64_array_all(6, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
// x==hi -> n+1, x<lo -> 0, x>hi -> n+1
assert_eq!(out.values(), &[1, 6, 10, 11, 0, 11]);
}
@@ -685,7 +681,7 @@ mod tests {
let n = i64_array_all(5, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[2, 1, 11, 11, 0]);
}
@@ -697,7 +693,7 @@ mod tests {
let n = i64_array_all(5, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert_eq!(out.values(), &[1, 1, 11, 11, 0]);
}
@@ -710,7 +706,7 @@ mod tests {
let n = i64_array_all(1, 4);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
}
@@ -722,7 +718,7 @@ mod tests {
let n = i64_array_all(1, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- assert!(downcast_i32(&out).is_null(0));
+ assert!(out.as_primitive::<Int64Type>().is_null(0));
}
#[test]
@@ -733,7 +729,7 @@ mod tests {
let n = Arc::new(Int64Array::from(vec![0])); // n <= 0
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- assert!(downcast_i32(&out).is_null(0));
+ assert!(out.as_primitive::<Int64Type>().is_null(0));
}
#[test]
@@ -747,7 +743,7 @@ mod tests {
let n = i64_array_all(2, 10);
let out = width_bucket_kern(&[v, lo, hi, n]).unwrap();
- let out = downcast_i32(&out);
+ let out = out.as_primitive::<Int64Type>();
assert!(out.is_null(0));
assert_eq!(out.value(1), 6);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org