From ff5fd127b225946fe9401ffdfb79c1ae2d1fa99b Mon Sep 17 00:00:00 2001 From: Max Gekk Date: Tue, 24 Jun 2025 17:11:03 +0200 Subject: [PATCH] Fix the class cast exception in SecondsOfTimeWithFraction --- .../spark/sql/catalyst/expressions/timeExpressions.scala | 9 +++++---- .../sql/catalyst/expressions/TimeExpressionsSuite.scala | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/timeExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/timeExpressions.scala index 47f2d5d73e212..40663a1728437 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/timeExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/timeExpressions.scala @@ -317,9 +317,11 @@ object HourExpressionBuilder extends ExpressionBuilder { case class SecondsOfTimeWithFraction(child: Expression) extends RuntimeReplaceable with ExpectsInputTypes { - override def replacement: Expression = { - + val precision = child.dataType match { + case TimeType(p) => p + case _ => TimeType.MIN_PRECISION + } StaticInvoke( classOf[DateTimeUtils.type], DecimalType(8, 6), @@ -327,10 +329,9 @@ case class SecondsOfTimeWithFraction(child: Expression) Seq(child, Literal(precision)), Seq(child.dataType, IntegerType)) } - private val precision: Int = child.dataType.asInstanceOf[TimeType].precision override def inputTypes: Seq[AbstractDataType] = - Seq(TimeType(precision)) + Seq(TypeCollection(TimeType.MIN_PRECISION to TimeType.MAX_PRECISION map TimeType.apply: _*)) override def children: Seq[Expression] = Seq(child) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/TimeExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/TimeExpressionsSuite.scala index 06ea49f0f71d0..4220a70084047 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/TimeExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/TimeExpressionsSuite.scala @@ -358,6 +358,8 @@ class TimeExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { checkEvaluation( SecondsOfTimeWithFraction(Literal.create(null, TimeType(TimeType.MICROS_PRECISION))), null) + assert(SecondsOfTimeWithFraction(Literal.create(null)).inputTypes.nonEmpty) + checkConsistencyBetweenInterpretedAndCodegen( (child: Expression) => SecondsOfTimeWithFraction(child).replacement, TimeType())