diff --git a/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/MathUtils.scala b/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/MathUtils.scala index b113bccc74dfb..9f8ee7ae9319f 100644 --- a/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/MathUtils.scala +++ b/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/MathUtils.scala @@ -94,7 +94,9 @@ object MathUtils { f } catch { case e: ArithmeticException => - throw ExecutionErrors.arithmeticOverflowError(e.getMessage, hint, context) + // On JDK 25+, Math.*Exact may throw ArithmeticException without a message + val message = if (e.getMessage != null) e.getMessage else "Overflow" + throw ExecutionErrors.arithmeticOverflowError(message, hint, context) } } @@ -103,7 +105,8 @@ object MathUtils { |try { | $evalCode |} catch (ArithmeticException e) { - | throw QueryExecutionErrors.arithmeticOverflowError(e.getMessage(), "", $context); + | String msg = e.getMessage() != null ? e.getMessage() : "Overflow"; + | throw QueryExecutionErrors.arithmeticOverflowError(msg, "", $context); |} |""".stripMargin } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystTypeConvertersSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystTypeConvertersSuite.scala index 1b46825b34143..75ca908a941b5 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystTypeConvertersSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystTypeConvertersSuite.scala @@ -302,7 +302,8 @@ class CatalystTypeConvertersSuite extends SparkFunSuite with SQLHelper { val errMsg = intercept[ArithmeticException] { IntervalUtils.durationToMicros(Duration.ofSeconds(Long.MaxValue, Long.MaxValue)) }.getMessage - assert(errMsg.contains("long overflow")) + // On JDK 25+, Math.multiplyExact may throw ArithmeticException without a message + assert(errMsg == null || errMsg.contains("long overflow")) } test("SPARK-35726: Truncate java.time.Duration by fields of day-time interval type") { diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala index 4e942b8b3e518..dede06bdc4b6a 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala @@ -1822,7 +1822,8 @@ class DateExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { null) }.getCause assert(e.isInstanceOf[ArithmeticException]) - assert(e.getMessage.contains("long overflow")) + // On JDK 25+, Math.multiplyExact may throw ArithmeticException without a message + assert(e.getMessage == null || e.getMessage.contains("long overflow")) checkEvaluation( TimestampAddInterval( diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala index b5b69a8340378..e7f29f547fc48 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala @@ -832,7 +832,8 @@ class DateTimeUtilsSuite extends SparkFunSuite with Matchers with SQLHelper { val msg = intercept[ArithmeticException] { DateTimeUtils.localDateTimeToMicros(dt) }.getMessage - assert(msg == "long overflow") + // On JDK 25+, Math.multiplyExact may throw ArithmeticException without a message + assert(msg == null || msg == "long overflow") } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/IntervalUtilsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/IntervalUtilsSuite.scala index a87d599711cfc..c8a8a0c1444a1 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/IntervalUtilsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/IntervalUtilsSuite.scala @@ -590,7 +590,8 @@ class IntervalUtilsSuite extends SparkFunSuite with SQLHelper { val errMsg = intercept[ArithmeticException] { durationToMicros(Duration.ofDays(106751991 + 1)) }.getMessage - assert(errMsg.contains("long overflow")) + // On JDK 25+, Math.multiplyExact may throw ArithmeticException without a message + assert(errMsg == null || errMsg.contains("long overflow")) } test("SPARK-34615: period to months") { diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/TimestampFormatterSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/TimestampFormatterSuite.scala index 558d7eda78b4a..b1f6fefc2735e 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/TimestampFormatterSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/TimestampFormatterSuite.scala @@ -448,9 +448,10 @@ class TimestampFormatterSuite extends DatetimeFormatterSuite { assert(formatter.parse("294247") === date(294247)) assert(formatter.parse("-290307") === date(-290307)) val e1 = intercept[ArithmeticException](formatter.parse("294248")) - assert(e1.getMessage === "long overflow") + // On JDK 25+, Math.multiplyExact may throw ArithmeticException without a message + assert(e1.getMessage == null || e1.getMessage === "long overflow") val e2 = intercept[ArithmeticException](formatter.parse("-290308")) - assert(e2.getMessage === "long overflow") + assert(e2.getMessage == null || e2.getMessage === "long overflow") } test("SPARK-36418: default parsing w/o pattern") {