Skip to content

[AURON #2501] Support datediff function natively - #2502

Open
Sigma-Ma wants to merge 1 commit into
apache:masterfrom
Sigma-Ma:Auron-2501-implement-native-function-of-datediff
Open

[AURON #2501] Support datediff function natively#2502
Sigma-Ma wants to merge 1 commit into
apache:masterfrom
Sigma-Ma:Auron-2501-implement-native-function-of-datediff

Conversation

@Sigma-Ma

@Sigma-Ma Sigma-Ma commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #2501

Rationale for this change

Spark DateDiff expressions are not currently converted to native expressions, so queries using datediff remain on the fallback path.

This change adds native execution while preserving Spark's argument order, signed day difference, and null behavior.

What changes are included in this PR?

  • convert Spark DateDiff expressions in NativeConverters
  • register the Spark_DateDiff extension function
  • implement the signed Date32 day difference with null propagation
  • add Rust unit tests for positive, negative, zero, leap-year, year-boundary, and null cases
  • add regression coverage in AuronFunctionSuite

Are there any user-facing changes?

No. The SQL syntax and result semantics remain unchanged. Eligible datediff expressions can now execute natively.

How was this patch tested?

cargo test -p datafusion-ext-functions spark_dates::tests::test_spark_datediff -- --exact

cargo test -p datafusion-ext-functions

./dev/reformat --check

./auron-build.sh --pre --clean true --sparkver 3.5 --scalaver 2.12 --skiptests false -DwildcardSuites=org.apache.auron.AuronFunctionSuite

Was this patch authored or co-authored using generative AI tooling?

  • Yes
  • No

Generated-by: OpenAI Codex (GPT-5)

ASF guidance: https://www.apache.org/legal/generative-tooling.html

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The native datediff implementation/conversion currently lacks session-timezone handling for timestamp inputs, which can yield incorrect results vs Spark in non-UTC timezones.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR adds native execution support for Spark SQL datediff(endDate, startDate) by converting Spark DateDiff expressions into Auron extension functions and implementing Spark_DateDiff in the native DataFusion extension layer, along with regression/unit test coverage.

Changes:

  • Convert Spark DateDiff expressions to the Spark_DateDiff extension function in NativeConverters.
  • Register Spark_DateDiff in the native extension function factory and implement its Date32 signed-day difference logic with null propagation.
  • Add regression coverage in AuronFunctionSuite and Rust unit tests for core datediff cases.
File summaries
File Description
spark-extension/src/main/scala/org/apache/spark/sql/auron/NativeConverters.scala Adds conversion of Spark DateDiff to Spark_DateDiff extension function.
spark-extension-shims-spark/src/test/scala/org/apache/auron/AuronFunctionSuite.scala Adds Spark-vs-native regression test for datediff.
native-engine/datafusion-ext-functions/src/spark_dates.rs Implements spark_datediff and adds Rust unit test coverage.
native-engine/datafusion-ext-functions/src/lib.rs Registers Spark_DateDiff in the extension-function dispatch table.
Review details
  • Files reviewed: 4/4 changed files
  • Comments generated: 3
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +300 to +321
pub fn spark_datediff(args: &[ColumnarValue]) -> Result<ColumnarValue> {
let dates = ColumnarValue::values_to_arrays(args)?;
let end_date = cast(&dates[0], &DataType::Date32)?;
let start_date = cast(&dates[1], &DataType::Date32)?;
let end_date = end_date
.as_any()
.downcast_ref::<Date32Array>()
.expect("cast to Date32 must succeed");
let start_date = start_date
.as_any()
.downcast_ref::<Date32Array>()
.expect("cast to Date32 must succeed");
let result = Int32Array::from_iter(end_date.iter().zip(start_date.iter()).map(
|(end_date, start_date)| {
end_date
.zip(start_date)
.map(|(end_date, start_date)| end_date.wrapping_sub(start_date))
},
));

Ok(ColumnarValue::Array(Arc::new(result)))
}
Comment on lines +1005 to +1006
case e: DateDiff =>
buildExtScalarFunction("Spark_DateDiff", e.children, e.dataType)
Comment on lines +218 to +220
checkSparkAnswerAndOperator(
"select datediff(end_date, start_date), datediff(end_date, date'2024-01-01') from t1")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement native function of datediff

3 participants