Skip to content

Commit cc6c12b

Browse files
Add custom nullability to SparkMakeInterval
- Implement return_field_from_args for SparkMakeInterval - Output is nullable if ANY input argument is nullable - Follows same pattern as other Spark functions (sha1, like, length, ilike) Closes #19155
1 parent 9a9ff8d commit cc6c12b

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

datafusion/spark/src/function/datetime/make_interval.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ use std::sync::Arc;
2121
use arrow::array::{Array, ArrayRef, IntervalMonthDayNanoBuilder, PrimitiveArray};
2222
use arrow::datatypes::DataType::Interval;
2323
use arrow::datatypes::IntervalUnit::MonthDayNano;
24-
use arrow::datatypes::{DataType, IntervalMonthDayNano};
24+
use arrow::datatypes::{DataType, Field, FieldRef, IntervalMonthDayNano};
2525
use datafusion_common::types::{NativeType, logical_float64, logical_int32};
2626
use datafusion_common::{DataFusionError, Result, ScalarValue, plan_datafusion_err};
2727
use datafusion_expr::{
28-
Coercion, ColumnarValue, ScalarFunctionArgs, ScalarUDFImpl, Signature, TypeSignature,
29-
TypeSignatureClass, Volatility,
28+
Coercion, ColumnarValue, ReturnFieldArgs, ScalarFunctionArgs, ScalarUDFImpl, Signature,
29+
TypeSignature, TypeSignatureClass, Volatility,
3030
};
3131
use datafusion_functions::utils::make_scalar_function;
3232

@@ -122,6 +122,19 @@ impl ScalarUDFImpl for SparkMakeInterval {
122122
Ok(Interval(MonthDayNano))
123123
}
124124

125+
fn return_field_from_args(&self, args: ReturnFieldArgs<'_>) -> Result<FieldRef> {
126+
// Spark make_interval semantics:
127+
// Output is nullable if ANY input argument is nullable.
128+
// With no arguments, returns a non-null zero interval.
129+
let nullable = args.arg_fields.iter().any(|f| f.is_nullable());
130+
131+
Ok(Arc::new(Field::new(
132+
"make_interval",
133+
Interval(MonthDayNano),
134+
nullable,
135+
)))
136+
}
137+
125138
fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> {
126139
if args.args.is_empty() {
127140
return Ok(ColumnarValue::Scalar(ScalarValue::IntervalMonthDayNano(

0 commit comments

Comments
 (0)