[SPARK-56910][SQL] Simplify Cast to byte/short codegen under ANSI mode#55935
Open
gengliangwang wants to merge 1 commit into
Open
[SPARK-56910][SQL] Simplify Cast to byte/short codegen under ANSI mode#55935gengliangwang wants to merge 1 commit into
gengliangwang wants to merge 1 commit into
Conversation
Member
Author
This was referenced May 17, 2026
c7b2229 to
1c34f53
Compare
1c34f53 to
2c1ab79
Compare
Member
Author
|
Audited this PR for the same lessons surfaced by @viirya and @cloud-fan on #55938 (and applied to #55934 / #55939):
So no changes needed on this PR for that review. |
Extend `CastUtils.java` with helpers for `byte` and `short` ANSI cast
targets and use them from `Cast.scala`. Drops the byte/short-target
dispatch (and the now-unused `lowerAndUpperBound` Scala helper) added
in SPARK-56909 -- after this PR, all integral and fractional narrowing
ANSI casts share the same `CastUtils.<...>Exact` one-line codegen.
Helpers added:
* `shortToByteExact(short)`, `intToByteExact(int)`, `longToByteExact(long)`
* `intToShortExact(int)`, `longToShortExact(long)`
* `floatToByteExact(float)`, `doubleToByteExact(double)`
* `floatToShortExact(float)`, `doubleToShortExact(double)`
`Cast.scala` changes:
* `castIntegralTypeToIntegralTypeExactCode` / `castFractionToIntegralTypeCode`
no longer dispatch on target type -- the helper-name pattern
`${integralPrefix(from)}To${target.capitalize}Exact` covers all four
target types.
* Eval paths for `castToByte` and `castToShort` add ANSI cases for
`ShortType` / `IntegerType` / `LongType` / `FloatType` / `DoubleType`
source types that delegate to the new helpers; the existing
`exactNumeric.toInt(b) + bounds-check` fallback now only handles the
remaining `Decimal` source.
Part of SPARK-56908 (umbrella). The original byte/short ANSI cast bodies
were 5 lines each across 8 call sites; this PR collapses them to one
line per call site, matching the int/long target work from SPARK-56909.
No. The compiled behavior is identical; only the emitted Java source
text changes.
```
build/sbt "catalyst/testOnly *CastSuite *CastWithAnsiOnSuite \
*CastWithAnsiOffSuite *AnsiCastSuite *TryCastSuite \
*ExpressionClassIdentitySuite"
```
312/312 pass.
Generated-by: Cursor 1.x
2c1ab79 to
c348b68
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes were proposed in this pull request?
Introduce
CastUtils.javawith nine static helpers for ANSI overflow-checked narrowing tobyte/short, and use them fromCast.scala(both codegen and eval paths).Helpers added:
shortToByteExact(short),intToByteExact(int),longToByteExact(long)intToShortExact(int),longToShortExact(long)floatToByteExact(float),doubleToByteExact(double)floatToShortExact(float),doubleToShortExact(double)ByteExactNumeric/ShortExactNumericonly expose same-type identity narrowing (theirtoByte(byte)/toShort(short)are trivial), so unlike theint/longtargets refactored in #55934 — which delegate toLongExactNumeric.toInt/FloatExactNumeric.toInt/DoubleExactNumeric.toInt/toLong— there is no existing Scala object to route the byte/short narrowing through. The Java helper is the cleanest fit.Cast.scalachanges:castIntegralTypeToIntegralTypeExactCode: thebyte/shortbranch (previously an inline 5-line if/throw block) emits a singleCastUtils.${integralPrefix(from)}To${target.capitalize}Exact($c)call. Theintbranch (added in [SPARK-56909][SQL] Simplify Cast to int/long codegen under ANSI mode #55934) is unchanged.castFractionToIntegralTypeCode: thebyte/shortbranch (previously an inline 5-line floor/ceil block pluslowerAndUpperBound) emits a singleCastUtils.${fractionalPrefix(from)}To${target.capitalize}Exact($c)call. Theint/longbranch (added in [SPARK-56909][SQL] Simplify Cast to int/long codegen under ANSI mode #55934) is unchanged. The now-unusedlowerAndUpperBoundScala helper is removed.castToByteandcastToShortadd ANSI cases forShortType/IntegerType/LongType/FloatType/DoubleTypesource types that delegate to the new helpers, replacing the existing multi-lineexactNumeric.toInt(b) + bounds-checkbody.integralPrefix(from: DataType)/fractionalPrefix(from: DataType)Scala helpers handle the method-name dispatch.Why are the changes needed?
Part of SPARK-56908 (umbrella). The byte/short narrowing ANSI bodies were 5 lines each across 8 codegen call sites; this PR collapses them to one line per call site, matching the int/long target work merged in #55934.
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?
307/307 pass.
Was this patch authored or co-authored using generative AI tooling?
Generated-by: Cursor 1.x