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 8b4fa13fe2766..7a29210dfb933 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 @@ -187,7 +187,8 @@ case class MinutesOfTime(child: Expression) Seq(child.dataType) ) - override def inputTypes: Seq[AbstractDataType] = Seq(TimeType()) + override def inputTypes: Seq[AbstractDataType] = + Seq(TypeCollection(TimeType.MIN_PRECISION to TimeType.MAX_PRECISION map TimeType: _*)) 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 e0aebb46cccec..7ec7b11c61989 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 @@ -125,11 +125,22 @@ class TimeExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { "docroot" -> SPARK_DOC_ROOT) ) - // test TIME-typed child should build MinutesOfTime + // test TIME-typed child should build MinutesOfTime for default precision value val timeExpr = Literal(localTime(12, 58, 59), TimeType()) val builtExprForTime = MinuteExpressionBuilder.build("minute", Seq(timeExpr)) assert(builtExprForTime.isInstanceOf[MinutesOfTime]) assert(builtExprForTime.asInstanceOf[MinutesOfTime].child eq timeExpr) + assert(builtExprForTime.checkInputDataTypes().isSuccess) + + // test TIME-typed child should build MinutesOfTime for all allowed custom precision values + (TimeType.MIN_PRECISION to TimeType.MICROS_PRECISION).foreach { precision => + val timeExpr = Literal(localTime(12, 58, 59), TimeType(precision)) + val builtExpr = MinuteExpressionBuilder.build("minute", Seq(timeExpr)) + + assert(builtExpr.isInstanceOf[MinutesOfTime]) + assert(builtExpr.asInstanceOf[MinutesOfTime].child eq timeExpr) + assert(builtExpr.checkInputDataTypes().isSuccess) + } // test non TIME-typed child should build Minute val tsExpr = Literal("2009-07-30 12:58:59")