Skip to content

[AURON #2588] Preserve literal parameters during expression fallback - #2589

Open
lyne7-sc wants to merge 4 commits into
apache:masterfrom
lyne7-sc:fix/preserve-literals-in-expression-fallback
Open

lyne7-sc wants to merge 4 commits into
apache:masterfrom
lyne7-sc:fix/preserve-literals-in-expression-fallback

Conversation

@lyne7-sc

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #2588

Rationale for this change

When exactly one child expression needs fallback, Auron also wraps literal parameters in unevaluable NativeExprWrapper objects. Parent expressions that read these constants during conversion can fail to convert, causing unnecessary fallback. In TPC-DS Q2, this makes the entire projection fall back to Spark.

What changes are included in this PR?

Preserve literal parameters when wrapping child expressions.

Are there any user-facing changes?

Affected projections can remain native while unsupported child expressions still use JVM fallback. Query results and public APIs are unchanged.

How was this patch tested?

  • Passed AuronExpressionSuite, verifying correct results and native projection.
  • Verified TPC-DS Q2 results and passed the updated golden plan check.

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

  • Yes
  • No

If yes, include: Generated-by: OpenAI Codex (GPT-6)

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

@lyne7-sc lyne7-sc changed the title [AURON #2588]Preserve literal parameters during expression fallback [AURON #2588] Preserve literal parameters during expression fallback Oct 19, 2026
@slfan1989
slfan1989 requested a balanced review from Copilot October 21, 2026 12:55

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.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Copilot review overview

1 open issue
What changed in this PR

This PR fixes unnecessary whole-expression JVM fallback during single-child expression fallback by preserving Literal parameters so parent converters can still inspect constants and remain native (e.g., TPC-DS Q2 projection).

Changes:

  • Preserve Literal children when wrapping expressions under the single-child fallback path.
  • Add a regression test covering round(a / b, 2) staying native while the unsupported child falls back.
  • Update the Spark 3.5 TPC-DS Q2 golden physical plan to reflect the improved native projection.
File Description
spark-extension/​src/​main/​scala/​org/​apache/​spark/​sql/​auron/​NativeConverters.scala Avoids wrapping Literal children in NativeExprWrapper during single-child fallback to preserve constant-pattern matching in converters.
spark-extension-shims-spark/​src/​test/​scala/​org/​apache/​auron/​AuronExpressionSuite.scala Adds a regression test to ensure literal parameters are preserved during fallback and the projection remains native.
dev/​auron-it/​src/​main/​resources/​tpcds-plan-stability/​spark-3.5/​q2.txt Updates the expected plan output for TPC-DS Q2 after the fallback behavior change.

Review effort: Lite

Comment on lines 358 to 371
val childrenConverted = sparkExpr.mapChildren {
// Preserve literal parameters when wrapping child expressions.
case literal: Literal => literal
case child =>
try {
val converted =
convertExprWithFallback(child, isPruningExpr = false, fallbackToError)
Shims.get.createNativeExprWrapper(converted, child.dataType, child.nullable)
} catch {
case _: NotImplementedError =>
val fallbacked = convertExpr(child)
Shims.get.createNativeExprWrapper(fallbacked, child.dataType, child.nullable)
}
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated the code to preserve literals only after successful conversion. Children that throw NotImplementedError continue through the existing fallback path.

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.

Literal parameters are incorrectly wrapped during expression fallback

2 participants