Skip to content

Commit 890ce8d

Browse files
deepujainMaxGekk
authored andcommitted
[SPARK-49642][SQL] Remove the ANSI config suggestion in DATETIME_FIELD_OUT_OF_BOUNDS
## Summary In Spark 4.0.0 ANSI mode is on by default. The JIRA asks to minimize suggestions that tell users to turn ANSI off. The error `DATETIME_FIELD_OUT_OF_BOUNDS` previously had a subclass `WITH_SUGGESTION` that appended "If necessary set spark.sql.ansi.enabled to false to bypass this error." This PR removes that suggestion; users can use `try_*` functions for safe behavior instead. The error now always uses `WITHOUT_SUGGESTION` (message is just the range description). ## Change - **error-conditions.json**: Removed the `WITH_SUGGESTION` subclass from `DATETIME_FIELD_OUT_OF_BOUNDS` (kept only `WITHOUT_SUGGESTION`). - **QueryExecutionErrors.scala**: `ansiDateTimeArgumentOutOfRange` now throws `DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION` with only `rangeMessage` (removed `ansiConfig` parameter). - **SQL test result files** (date.sql.out, timestamp.sql.out, timestampNTZ/timestamp-ansi.sql.out, postgreSQL/date.sql.out, datetime-legacy.sql.out): Updated expected error class from `WITH_SUGGESTION` to `WITHOUT_SUGGESTION` and removed `ansiConfig` from expected messageParameters where the error is `DATETIME_FIELD_OUT_OF_BOUNDS`. - **QueryExecutionAnsiErrorsSuite.scala**: Added a regression test for `DATETIME_FIELD_OUT_OF_BOUNDS` so the error does not suggest disabling ANSI mode. ## Tests Added `SPARK-49642: DATETIME_FIELD_OUT_OF_BOUNDS does not suggest ANSI config` in `QueryExecutionAnsiErrorsSuite`. Local validation: - `./build/sbt "sql/testOnly org.apache.spark.sql.errors.QueryExecutionAnsiErrorsSuite -- -z SPARK-49642"` passed. - `./build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite -- -z time.sql"` passed. Fixes SPARK-49642 **JIRA assignee for credit:** deepujain Closes #54695 from deepujain/SPARK-49642-remove-ansi-suggestion-datetime-out-of-bounds. Authored-by: Deepak Jain <deepujain@gmail.com> Signed-off-by: Max Gekk <max.gekk@gmail.com>
1 parent bc72d93 commit 890ce8d

9 files changed

Lines changed: 37 additions & 52 deletions

File tree

common/utils/src/main/resources/error/error-conditions.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,11 +2128,6 @@
21282128
"message" : [
21292129
""
21302130
]
2131-
},
2132-
"WITH_SUGGESTION" : {
2133-
"message" : [
2134-
"If necessary set <ansiConfig> to \"false\" to bypass this error."
2135-
]
21362131
}
21372132
},
21382133
"sqlState" : "22023"

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,7 @@ object DateTimeUtils extends SparkDateTimeUtils {
10301030
localTimeToNanos(lt)
10311031
} catch {
10321032
case e @ (_: DateTimeException | _: ArithmeticException) =>
1033-
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRangeWithoutSuggestion(e)
1033+
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRange(e)
10341034
}
10351035
}
10361036

@@ -1045,9 +1045,9 @@ object DateTimeUtils extends SparkDateTimeUtils {
10451045
nanos
10461046
} catch {
10471047
case e: DateTimeException =>
1048-
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRangeWithoutSuggestion(e)
1048+
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRange(e)
10491049
case e: ArithmeticException =>
1050-
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRangeWithoutSuggestion(
1050+
throw QueryExecutionErrors.ansiDateTimeArgumentOutOfRange(
10511051
new DateTimeException("Overflow in TIME conversion", e))
10521052
}
10531053
}

sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryExecutionErrors.scala

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,7 @@ private[sql] object QueryExecutionErrors extends QueryErrorsBase with ExecutionE
303303
cause = Some(e))
304304
}
305305

306-
def ansiDateTimeArgumentOutOfRange(e: Exception): SparkDateTimeException = {
307-
new SparkDateTimeException(
308-
errorClass = "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
309-
messageParameters = Map(
310-
"rangeMessage" -> e.getMessage,
311-
"ansiConfig" -> toSQLConf(SQLConf.ANSI_ENABLED.key)),
312-
context = Array.empty,
313-
summary = "",
314-
cause = Some(e))
315-
}
316-
317-
def ansiDateTimeArgumentOutOfRangeWithoutSuggestion(e: Throwable): SparkDateTimeException = {
306+
def ansiDateTimeArgumentOutOfRange(e: Throwable): SparkDateTimeException = {
318307
new SparkDateTimeException(
319308
errorClass = "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
320309
messageParameters = Map("rangeMessage" -> e.getMessage),

sql/core/src/test/resources/sql-tests/results/date.sql.out

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@ struct<>
5353
-- !query output
5454
org.apache.spark.SparkDateTimeException
5555
{
56-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
56+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
5757
"sqlState" : "22023",
5858
"messageParameters" : {
59-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
6059
"rangeMessage" : "Invalid value for MonthOfYear (valid values 1 - 12): 13"
6160
}
6261
}
@@ -69,10 +68,9 @@ struct<>
6968
-- !query output
7069
org.apache.spark.SparkDateTimeException
7170
{
72-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
71+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
7372
"sqlState" : "22023",
7473
"messageParameters" : {
75-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
7674
"rangeMessage" : "Invalid value for DayOfMonth (valid values 1 - 28/31): 33"
7775
}
7876
}

sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@ struct<>
5353
-- !query output
5454
org.apache.spark.SparkDateTimeException
5555
{
56-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
56+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
5757
"sqlState" : "22023",
5858
"messageParameters" : {
59-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
6059
"rangeMessage" : "Invalid value for MonthOfYear (valid values 1 - 12): 13"
6160
}
6261
}
@@ -69,10 +68,9 @@ struct<>
6968
-- !query output
7069
org.apache.spark.SparkDateTimeException
7170
{
72-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
71+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
7372
"sqlState" : "22023",
7473
"messageParameters" : {
75-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
7674
"rangeMessage" : "Invalid value for DayOfMonth (valid values 1 - 28/31): 33"
7775
}
7876
}
@@ -1347,10 +1345,9 @@ struct<>
13471345
-- !query output
13481346
org.apache.spark.SparkDateTimeException
13491347
{
1350-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
1348+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
13511349
"sqlState" : "22023",
13521350
"messageParameters" : {
1353-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
13541351
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 61"
13551352
}
13561353
}
@@ -1379,10 +1376,9 @@ struct<>
13791376
-- !query output
13801377
org.apache.spark.SparkDateTimeException
13811378
{
1382-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
1379+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
13831380
"sqlState" : "22023",
13841381
"messageParameters" : {
1385-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
13861382
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 99"
13871383
}
13881384
}
@@ -1395,10 +1391,9 @@ struct<>
13951391
-- !query output
13961392
org.apache.spark.SparkDateTimeException
13971393
{
1398-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
1394+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
13991395
"sqlState" : "22023",
14001396
"messageParameters" : {
1401-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
14021397
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 999"
14031398
}
14041399
}

sql/core/src/test/resources/sql-tests/results/postgreSQL/date.sql.out

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -687,10 +687,9 @@ struct<>
687687
-- !query output
688688
org.apache.spark.SparkDateTimeException
689689
{
690-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
690+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
691691
"sqlState" : "22023",
692692
"messageParameters" : {
693-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
694693
"rangeMessage" : "Invalid date 'FEBRUARY 30'"
695694
}
696695
}
@@ -703,10 +702,9 @@ struct<>
703702
-- !query output
704703
org.apache.spark.SparkDateTimeException
705704
{
706-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
705+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
707706
"sqlState" : "22023",
708707
"messageParameters" : {
709-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
710708
"rangeMessage" : "Invalid value for MonthOfYear (valid values 1 - 12): 13"
711709
}
712710
}
@@ -719,10 +717,9 @@ struct<>
719717
-- !query output
720718
org.apache.spark.SparkDateTimeException
721719
{
722-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
720+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
723721
"sqlState" : "22023",
724722
"messageParameters" : {
725-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
726723
"rangeMessage" : "Invalid value for DayOfMonth (valid values 1 - 28/31): -1"
727724
}
728725
}

sql/core/src/test/resources/sql-tests/results/timestamp.sql.out

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,9 @@ struct<>
154154
-- !query output
155155
org.apache.spark.SparkDateTimeException
156156
{
157-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
157+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
158158
"sqlState" : "22023",
159159
"messageParameters" : {
160-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
161160
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 61"
162161
}
163162
}
@@ -186,10 +185,9 @@ struct<>
186185
-- !query output
187186
org.apache.spark.SparkDateTimeException
188187
{
189-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
188+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
190189
"sqlState" : "22023",
191190
"messageParameters" : {
192-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
193191
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 99"
194192
}
195193
}
@@ -202,10 +200,9 @@ struct<>
202200
-- !query output
203201
org.apache.spark.SparkDateTimeException
204202
{
205-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
203+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
206204
"sqlState" : "22023",
207205
"messageParameters" : {
208-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
209206
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 999"
210207
}
211208
}

sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,9 @@ struct<>
154154
-- !query output
155155
org.apache.spark.SparkDateTimeException
156156
{
157-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
157+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
158158
"sqlState" : "22023",
159159
"messageParameters" : {
160-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
161160
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 61"
162161
}
163162
}
@@ -186,10 +185,9 @@ struct<>
186185
-- !query output
187186
org.apache.spark.SparkDateTimeException
188187
{
189-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
188+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
190189
"sqlState" : "22023",
191190
"messageParameters" : {
192-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
193191
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 99"
194192
}
195193
}
@@ -202,10 +200,9 @@ struct<>
202200
-- !query output
203201
org.apache.spark.SparkDateTimeException
204202
{
205-
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITH_SUGGESTION",
203+
"errorClass" : "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
206204
"sqlState" : "22023",
207205
"messageParameters" : {
208-
"ansiConfig" : "\"spark.sql.ansi.enabled\"",
209206
"rangeMessage" : "Invalid value for SecondOfMinute (valid values 0 - 59): 999"
210207
}
211208
}

sql/core/src/test/scala/org/apache/spark/sql/errors/QueryExecutionAnsiErrorsSuite.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,23 @@ class QueryExecutionAnsiErrorsSuite extends SharedSparkSession {
127127
))
128128
}
129129

130+
test("SPARK-49642: DATETIME_FIELD_OUT_OF_BOUNDS does not suggest ANSI config") {
131+
checkError(
132+
exception = intercept[SparkDateTimeException] {
133+
sql("select make_date(2000, 13, 1)").collect()
134+
},
135+
condition = "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION",
136+
sqlState = "22023",
137+
parameters = Map("rangeMessage" -> "Invalid value for MonthOfYear (valid values 1 - 12): 13"))
138+
// Ensure message does not contain the removed ANSI bypass suggestion
139+
val e = intercept[SparkDateTimeException] {
140+
sql("select make_date(2000, 1, 33)").collect()
141+
}
142+
assert(e.getCondition === "DATETIME_FIELD_OUT_OF_BOUNDS.WITHOUT_SUGGESTION")
143+
assert(!e.getMessage.contains("spark.sql.ansi.enabled"))
144+
assert(!e.getMessage.contains("to \"false\" to bypass"))
145+
}
146+
130147
test("NUMERIC_VALUE_OUT_OF_RANGE: cast string to decimal") {
131148
checkError(
132149
exception = intercept[SparkArithmeticException] {

0 commit comments

Comments
 (0)