gengliangwang opened a new pull request, #55936:
URL: https://github.com/apache/spark/pull/55936

   **Title**: [SPARK-56911][SQL] Refactor Cast to decimal codegen under ANSI 
mode
   
   **Base**: apache/spark master (stacked on SPARK-56910 → SPARK-56909)
   **Head**: gengliangwang:SPARK-56911-cast-decimal
   
   ---
   
   ### What changes were proposed in this pull request?
   
   Extend `CastUtils.java` with two helpers for decimal precision adjustment 
and use them from `Cast.changePrecision` (both the eval and codegen 
implementations). The new helpers mutate the input `Decimal` in place (matching 
the behavior of the existing inline codegen), so they're safe to call on the 
temporary produced by `Decimal.fromString(...)` / `Decimal.apply(...)` / 
decimal-arithmetic results.
   
   Helpers added:
   * `changePrecisionExact(Decimal, int, int, QueryContext)`: ANSI throw on 
overflow, preserves the per-call-site `QueryContext` so error messages keep 
their query-origin info.
   * `changePrecisionOrNull(Decimal, int, int)`: non-ANSI, returns `null` on 
overflow (no `QueryContext` needed).
   
   `Cast.scala` changes:
   * `changePrecision` eval method dispatches on `nullOnOverflow` and delegates 
to the appropriate helper.
   * `changePrecision` codegen method has three branches now: the existing 
`canNullSafeCast` fast path (unchanged), a `nullOnOverflow` branch (inline), 
and the ANSI throw branch which now emits a one-line 
`CastUtils.changePrecisionExact(...)` call instead of the 5-line `if/else` 
overflow block.
   
   ### Why are the changes needed?
   
   Part of SPARK-56908 (umbrella). The ANSI throw branch of 
`Cast.changePrecision` is hit by every cast to decimal that may overflow (very 
common in TPC-DS, where `cast(int as decimal(7,2))` is widespread). Collapsing 
the 5-line inline body to one line shrinks the generated Java source for those 
plans.
   
   ### Does this PR introduce _any_ user-facing change?
   
   No. The compiled behavior is identical; only the emitted Java source text 
changes.
   
   ### How was this patch tested?
   
   ```
   build/sbt "catalyst/testOnly *CastSuite *CastWithAnsiOnSuite 
*CastWithAnsiOffSuite *AnsiCastSuite *TryCastSuite *DecimalSuite 
*ExpressionClassIdentitySuite"
   ```
   
   337/337 pass.
   
   ### Was this patch authored or co-authored using generative AI tooling?
   
   Generated-by: Cursor 1.x
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to