This is an automated email from the ASF dual-hosted git repository.
maxgekk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new e72ce91250a [SPARK-44987][SQL] Assign a name to the error class
`_LEGACY_ERROR_TEMP_1100`
e72ce91250a is described below
commit e72ce91250a9a2c40fd5ed55a50dbc46e4e7e46d
Author: Max Gekk <[email protected]>
AuthorDate: Thu Aug 31 22:50:21 2023 +0300
[SPARK-44987][SQL] Assign a name to the error class
`_LEGACY_ERROR_TEMP_1100`
### What changes were proposed in this pull request?
In the PR, I propose to assign the name `NON_FOLDABLE_ARGUMENT` to the
legacy error class `_LEGACY_ERROR_TEMP_1100`, and improve the error message
format: make it less restrictive.
### Why are the changes needed?
1. To don't confuse users by slightly restrictive error message about
literals.
2. To assign proper name as a part of activity in SPARK-37935
### Does this PR introduce _any_ user-facing change?
No. Only if user's code depends on error class name and message parameters.
### How was this patch tested?
By running the modified and affected tests:
```
$ build/sbt "test:testOnly *.StringFunctionsSuite"
$ PYSPARK_PYTHON=python3 build/sbt "sql/testOnly
org.apache.spark.sql.SQLQueryTestSuite"
$ build/sbt "core/testOnly *SparkThrowableSuite"
```
### Was this patch authored or co-authored using generative AI tooling?
No.
Closes #42737 from MaxGekk/assign-name-_LEGACY_ERROR_TEMP_1100.
Authored-by: Max Gekk <[email protected]>
Signed-off-by: Max Gekk <[email protected]>
---
.../src/main/resources/error/error-classes.json | 11 ++++---
docs/sql-error-conditions.md | 6 ++++
.../catalyst/expressions/datetimeExpressions.scala | 2 +-
.../sql/catalyst/expressions/mathExpressions.scala | 4 +--
.../expressions/numberFormatExpressions.scala | 2 +-
.../spark/sql/errors/QueryCompilationErrors.scala | 14 +++++----
.../ceil-floor-with-scale-param.sql.out | 36 ++++++++++++----------
.../sql-tests/analyzer-results/extract.sql.out | 18 ++++++-----
.../results/ceil-floor-with-scale-param.sql.out | 36 ++++++++++++----------
.../resources/sql-tests/results/extract.sql.out | 18 ++++++-----
.../apache/spark/sql/StringFunctionsSuite.scala | 8 ++---
11 files changed, 88 insertions(+), 67 deletions(-)
diff --git a/common/utils/src/main/resources/error/error-classes.json
b/common/utils/src/main/resources/error/error-classes.json
index 3b537cc3d9f..af78dd2f9f8 100644
--- a/common/utils/src/main/resources/error/error-classes.json
+++ b/common/utils/src/main/resources/error/error-classes.json
@@ -2215,6 +2215,12 @@
],
"sqlState" : "42607"
},
+ "NON_FOLDABLE_ARGUMENT" : {
+ "message" : [
+ "The function <funcName> requires the parameter <paramName> to be a
foldable expression of the type <paramType>, but the actual argument is a
non-foldable."
+ ],
+ "sqlState" : "22024"
+ },
"NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION" : {
"message" : [
"When there are more than one MATCHED clauses in a MERGE statement, only
the last MATCHED clause can omit the condition."
@@ -4029,11 +4035,6 @@
"<funcName>() doesn't support the <mode> mode. Acceptable modes are
<permissiveMode> and <failFastMode>."
]
},
- "_LEGACY_ERROR_TEMP_1100" : {
- "message" : [
- "The '<argName>' parameter of function '<funcName>' needs to be a
<requiredType> literal."
- ]
- },
"_LEGACY_ERROR_TEMP_1103" : {
"message" : [
"Unsupported component type <clz> in arrays."
diff --git a/docs/sql-error-conditions.md b/docs/sql-error-conditions.md
index 89c27f72ea0..33072f6c440 100644
--- a/docs/sql-error-conditions.md
+++ b/docs/sql-error-conditions.md
@@ -1305,6 +1305,12 @@ Cannot call function `<functionName>` because named
argument references are not
It is not allowed to use an aggregate function in the argument of another
aggregate function. Please use the inner aggregate function in a sub-query.
+### NON_FOLDABLE_ARGUMENT
+
+[SQLSTATE: 22024](sql-error-conditions-sqlstates.html#class-22-data-exception)
+
+The function `<funcName>` requires the parameter `<paramName>` to be a
foldable expression of the type `<paramType>`, but the actual argument is a
non-foldable.
+
### NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION
[SQLSTATE:
42613](sql-error-conditions-sqlstates.html#class-42-syntax-error-or-access-rule-violation)
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
index 51ddf2b85f8..30a6bec1868 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
@@ -2934,7 +2934,7 @@ object Extract {
}
}
} else {
- throw QueryCompilationErrors.requireLiteralParameter(funcName, "field",
"string")
+ throw QueryCompilationErrors.nonFoldableArgumentError(funcName, "field",
StringType)
}
}
}
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
index add59a38b72..89f354db5a9 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
@@ -283,10 +283,10 @@ trait CeilFloorExpressionBuilderBase extends
ExpressionBuilder {
} else if (numArgs == 2) {
val scale = expressions(1)
if (!(scale.foldable && scale.dataType == IntegerType)) {
- throw QueryCompilationErrors.requireLiteralParameter(funcName,
"scale", "int")
+ throw QueryCompilationErrors.nonFoldableArgumentError(funcName,
"scale", IntegerType)
}
if (scale.eval() == null) {
- throw QueryCompilationErrors.requireLiteralParameter(funcName,
"scale", "int")
+ throw QueryCompilationErrors.nonFoldableArgumentError(funcName,
"scale", IntegerType)
}
buildWithTwoParams(expressions(0), scale)
} else {
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala
index 7875ed8fe20..38abcc41cbf 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala
@@ -247,7 +247,7 @@ object ToCharacterBuilder extends ExpressionBuilder {
case _: DatetimeType => DateFormatClass(inputExpr, format)
case _: BinaryType =>
if (!(format.dataType == StringType && format.foldable)) {
- throw QueryCompilationErrors.requireLiteralParameter(funcName,
"format", "string")
+ throw QueryCompilationErrors.nonFoldableArgumentError(funcName,
"format", StringType)
}
format.eval().asInstanceOf[UTF8String].toString.toLowerCase(Locale.ROOT).trim
match {
case "base64" => Base64(inputExpr)
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryCompilationErrors.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryCompilationErrors.scala
index e579e5cf565..a97abf89434 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryCompilationErrors.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryCompilationErrors.scala
@@ -1207,14 +1207,16 @@ private[sql] object QueryCompilationErrors extends
QueryErrorsBase with Compilat
"failFastMode" -> FailFastMode.name))
}
- def requireLiteralParameter(
- funcName: String, argName: String, requiredType: String): Throwable = {
+ def nonFoldableArgumentError(
+ funcName: String,
+ paramName: String,
+ paramType: DataType): Throwable = {
new AnalysisException(
- errorClass = "_LEGACY_ERROR_TEMP_1100",
+ errorClass = "NON_FOLDABLE_ARGUMENT",
messageParameters = Map(
- "argName" -> argName,
- "funcName" -> funcName,
- "requiredType" -> requiredType))
+ "funcName" -> toSQLId(funcName),
+ "paramName" -> toSQLId(paramName),
+ "paramType" -> toSQLType(paramType)))
}
def literalTypeUnsupportedForSourceTypeError(field: String, source:
Expression): Throwable = {
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/ceil-floor-with-scale-param.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/ceil-floor-with-scale-param.sql.out
index c76b2e5284a..950584caa81 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/ceil-floor-with-scale-param.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/ceil-floor-with-scale-param.sql.out
@@ -81,11 +81,12 @@ SELECT CEIL(2.5, null)
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "ceil",
- "requiredType" : "int"
+ "funcName" : "`ceil`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -102,11 +103,12 @@ SELECT CEIL(2.5, 'a')
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "ceil",
- "requiredType" : "int"
+ "funcName" : "`ceil`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -223,11 +225,12 @@ SELECT FLOOR(2.5, null)
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "floor",
- "requiredType" : "int"
+ "funcName" : "`floor`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -244,11 +247,12 @@ SELECT FLOOR(2.5, 'a')
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "floor",
- "requiredType" : "int"
+ "funcName" : "`floor`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/extract.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/extract.sql.out
index 6085457deaa..eabe92ab12d 100644
--- a/sql/core/src/test/resources/sql-tests/analyzer-results/extract.sql.out
+++ b/sql/core/src/test/resources/sql-tests/analyzer-results/extract.sql.out
@@ -932,11 +932,12 @@ select date_part(c, c) from t
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "field",
- "funcName" : "date_part",
- "requiredType" : "string"
+ "funcName" : "`date_part`",
+ "paramName" : "`field`",
+ "paramType" : "\"STRING\""
},
"queryContext" : [ {
"objectType" : "",
@@ -964,11 +965,12 @@ select date_part(i, i) from t
-- !query analysis
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "field",
- "funcName" : "date_part",
- "requiredType" : "string"
+ "funcName" : "`date_part`",
+ "paramName" : "`field`",
+ "paramType" : "\"STRING\""
},
"queryContext" : [ {
"objectType" : "",
diff --git
a/sql/core/src/test/resources/sql-tests/results/ceil-floor-with-scale-param.sql.out
b/sql/core/src/test/resources/sql-tests/results/ceil-floor-with-scale-param.sql.out
index d55e665a2a1..b15682b0a51 100644
---
a/sql/core/src/test/resources/sql-tests/results/ceil-floor-with-scale-param.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/ceil-floor-with-scale-param.sql.out
@@ -94,11 +94,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "ceil",
- "requiredType" : "int"
+ "funcName" : "`ceil`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -117,11 +118,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "ceil",
- "requiredType" : "int"
+ "funcName" : "`ceil`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -253,11 +255,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "floor",
- "requiredType" : "int"
+ "funcName" : "`floor`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
@@ -276,11 +279,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "scale",
- "funcName" : "floor",
- "requiredType" : "int"
+ "funcName" : "`floor`",
+ "paramName" : "`scale`",
+ "paramType" : "\"INT\""
},
"queryContext" : [ {
"objectType" : "",
diff --git a/sql/core/src/test/resources/sql-tests/results/extract.sql.out
b/sql/core/src/test/resources/sql-tests/results/extract.sql.out
index cc6e8bcb36c..8416327ef31 100644
--- a/sql/core/src/test/resources/sql-tests/results/extract.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/extract.sql.out
@@ -714,11 +714,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "field",
- "funcName" : "date_part",
- "requiredType" : "string"
+ "funcName" : "`date_part`",
+ "paramName" : "`field`",
+ "paramType" : "\"STRING\""
},
"queryContext" : [ {
"objectType" : "",
@@ -745,11 +746,12 @@ struct<>
-- !query output
org.apache.spark.sql.AnalysisException
{
- "errorClass" : "_LEGACY_ERROR_TEMP_1100",
+ "errorClass" : "NON_FOLDABLE_ARGUMENT",
+ "sqlState" : "22024",
"messageParameters" : {
- "argName" : "field",
- "funcName" : "date_part",
- "requiredType" : "string"
+ "funcName" : "`date_part`",
+ "paramName" : "`field`",
+ "paramType" : "\"STRING\""
},
"queryContext" : [ {
"objectType" : "",
diff --git
a/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala
b/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala
index 03b9053c71a..c61a62f293f 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala
@@ -875,11 +875,11 @@ class StringFunctionsSuite extends QueryTest with
SharedSparkSession {
exception = intercept[AnalysisException] {
df2.select(func(col("input"), col("format"))).collect()
},
- errorClass = "_LEGACY_ERROR_TEMP_1100",
+ errorClass = "NON_FOLDABLE_ARGUMENT",
parameters = Map(
- "argName" -> "format",
- "funcName" -> funcName,
- "requiredType" -> "string"))
+ "funcName" -> s"`$funcName`",
+ "paramName" -> "`format`",
+ "paramType" -> "\"STRING\""))
checkError(
exception = intercept[AnalysisException] {
df2.select(func(col("input"), lit("invalid_format"))).collect()
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]