diff --git a/common/utils/src/main/resources/error/error-conditions.json b/common/utils/src/main/resources/error/error-conditions.json index 0affceab971fc..4bc48c042a0b3 100644 --- a/common/utils/src/main/resources/error/error-conditions.json +++ b/common/utils/src/main/resources/error/error-conditions.json @@ -2092,6 +2092,11 @@ "message" : [ "Too many letters in datetime pattern: . Please reduce pattern length." ] + }, + "SECONDS_FRACTION" : { + "message" : [ + "Cannot detect a seconds fraction pattern of variable length. Please make sure the pattern contains 'S', and does not contain illegal characters." + ] } }, "sqlState" : "22007" diff --git a/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelper.scala b/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelper.scala index 343468dc0270c..71777906f868e 100644 --- a/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelper.scala +++ b/sql/api/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelper.scala @@ -243,7 +243,7 @@ private object DateTimeFormatterHelper { rest = suffix case _ => throw new SparkIllegalArgumentException( - errorClass = "INVALID_DATETIME_PATTERN", + errorClass = "INVALID_DATETIME_PATTERN.SECONDS_FRACTION", messageParameters = Map("pattern" -> pattern)) } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelperSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelperSuite.scala index 034010f5825b8..6aa4f443c6add 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelperSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeFormatterHelperSuite.scala @@ -83,4 +83,14 @@ class DateTimeFormatterHelperSuite extends SparkFunSuite { assert(convertIncompatiblePattern("yyyy-MM-dd'e'HH:mm:ss") === "uuuu-MM-dd'e'HH:mm:ss") assert(convertIncompatiblePattern("yyyy-MM-dd'T'") === "uuuu-MM-dd'T'") } + + test("SPARK-49583: invalid var length second fraction") { + val pattern = "\nSSSS\r" + checkError( + exception = intercept[SparkIllegalArgumentException] { + createBuilderWithVarLengthSecondFraction(pattern) + }, + errorClass = "INVALID_DATETIME_PATTERN.SECONDS_FRACTION", + parameters = Map("pattern" -> pattern)) + } }