Skip to content

Commit bb7ddc8

Browse files
committed
Fix datediff array length mismatch for dictionary-backed timestamps
1 parent 6eaf948 commit bb7ddc8

1 file changed

Lines changed: 17 additions & 7 deletions

File tree

native/spark-expr/src/datetime_funcs/date_diff.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717

1818
use arrow::array::{Array, Date32Array, Int32Array};
19+
use arrow::compute::cast;
1920
use arrow::compute::kernels::arity::binary;
2021
use arrow::datatypes::DataType;
2122
use datafusion::common::{utils::take_function_args, DataFusionError, Result};
@@ -71,9 +72,22 @@ impl ScalarUDFImpl for SparkDateDiff {
7172
fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> {
7273
let [end_date, start_date] = take_function_args(self.name(), args.args)?;
7374

74-
// Convert scalars to arrays for uniform processing
75-
let end_arr = end_date.into_array(1)?;
76-
let start_arr = start_date.into_array(1)?;
75+
// Determine target length (broadcast scalars to column length)
76+
let len = match (&end_date, &start_date) {
77+
(ColumnarValue::Array(a), _) => a.len(),
78+
(_, ColumnarValue::Array(a)) => a.len(),
79+
_ => 1,
80+
};
81+
82+
// Convert both arguments to arrays of the same length
83+
let end_arr = end_date.into_array(len)?;
84+
let start_arr = start_date.into_array(len)?;
85+
86+
// Normalize dictionary arrays (important for Iceberg)
87+
let end_arr = arrow::compute::cast(&end_arr, &DataType::Date32)
88+
.map_err(|e| DataFusionError::Execution(e.to_string()))?;
89+
let start_arr = arrow::compute::cast(&start_arr, &DataType::Date32)
90+
.map_err(|e| DataFusionError::Execution(e.to_string()))?;
7791

7892
let end_date_array = end_arr
7993
.as_any()
@@ -97,8 +111,4 @@ impl ScalarUDFImpl for SparkDateDiff {
97111

98112
Ok(ColumnarValue::Array(Arc::new(result)))
99113
}
100-
101-
fn aliases(&self) -> &[String] {
102-
&self.aliases
103-
}
104114
}

0 commit comments

Comments
 (0)