diff --git a/core/src/main/resources/error/error-classes.json b/core/src/main/resources/error/error-classes.json index 6faaf0af35f7..f86e512878fc 100644 --- a/core/src/main/resources/error/error-classes.json +++ b/core/src/main/resources/error/error-classes.json @@ -1537,8 +1537,20 @@ }, "WRONG_NUM_ARGS" : { "message" : [ - "The requires parameters but the actual number is ." - ] + "Invalid number of arguments for the function ." + ], + "subClass" : { + "WITHOUT_SUGGESTION" : { + "message" : [ + "Please, refer to 'https://spark.apache.org/docs/latest/sql-ref-functions.html' for a fix." + ] + }, + "WITH_SUGGESTION" : { + "message" : [ + "Consider to change the number of arguments because the function requires parameters but the actual number is ." + ] + } + } }, "_LEGACY_ERROR_TEMP_0001" : { "message" : [ @@ -2007,11 +2019,6 @@ "Undefined function ." ] }, - "_LEGACY_ERROR_TEMP_1043" : { - "message" : [ - "Invalid arguments for function ." - ] - }, "_LEGACY_ERROR_TEMP_1045" : { "message" : [ "ALTER TABLE SET LOCATION does not support partition for v2 tables." 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 b507045f8c6a..ab51b31e578b 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 @@ -640,7 +640,7 @@ private[sql] object QueryCompilationErrors extends QueryErrorsBase { def invalidFunctionArgumentsError( name: String, expectedNum: String, actualNum: Int): Throwable = { new AnalysisException( - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", messageParameters = Map( "functionName" -> toSQLId(name), "expectedNum" -> expectedNum, @@ -649,10 +649,10 @@ private[sql] object QueryCompilationErrors extends QueryErrorsBase { def invalidFunctionArgumentNumberError( validParametersCount: Seq[Int], name: String, actualNumber: Int): Throwable = { - if (validParametersCount.length == 0) { + if (validParametersCount.isEmpty) { new AnalysisException( - errorClass = "_LEGACY_ERROR_TEMP_1043", - messageParameters = Map("name" -> name)) + errorClass = "WRONG_NUM_ARGS.WITHOUT_SUGGESTION", + messageParameters = Map("functionName" -> toSQLId(name))) } else { val expectedNumberOfParameters = if (validParametersCount.length == 1) { validParametersCount.head.toString diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/date.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/date.sql.out index a292e3f0efeb..b0f79ea29346 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/date.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/date.sql.out @@ -145,7 +145,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "1", "expectedNum" : "0", diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out index 253396694a66..e95240a1de2f 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out @@ -821,7 +821,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "2", @@ -844,7 +844,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "1", "expectedNum" : "2", 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 1d8adce90c42..3c05abe6473c 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 @@ -140,7 +140,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "3", "expectedNum" : "2", @@ -297,7 +297,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "3", "expectedNum" : "2", diff --git a/sql/core/src/test/resources/sql-tests/results/csv-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/csv-functions.sql.out index 58c0a7b9f3cc..ac68d7596f4b 100644 --- a/sql/core/src/test/resources/sql-tests/results/csv-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/csv-functions.sql.out @@ -127,7 +127,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "[2, 3]", diff --git a/sql/core/src/test/resources/sql-tests/results/date.sql.out b/sql/core/src/test/resources/sql-tests/results/date.sql.out index 2cc1b70be708..cd6253c2b229 100644 --- a/sql/core/src/test/resources/sql-tests/results/date.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/date.sql.out @@ -131,7 +131,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "1", "expectedNum" : "0", diff --git a/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out b/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out index e057b22df013..fba2cc7e1e61 100644 --- a/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out @@ -131,7 +131,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "1", "expectedNum" : "0", diff --git a/sql/core/src/test/resources/sql-tests/results/json-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/json-functions.sql.out index c8c8bee3925d..1fa08a078480 100644 --- a/sql/core/src/test/resources/sql-tests/results/json-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/json-functions.sql.out @@ -109,7 +109,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "[1, 2]", @@ -231,7 +231,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "[2, 3]", @@ -572,7 +572,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "1", @@ -659,7 +659,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "1", diff --git a/sql/core/src/test/resources/sql-tests/results/sql-compatibility-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/sql-compatibility-functions.sql.out index 319ac059385c..f4d32e1746f2 100644 --- a/sql/core/src/test/resources/sql-tests/results/sql-compatibility-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/sql-compatibility-functions.sql.out @@ -94,7 +94,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "2", "expectedNum" : "1", diff --git a/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out index 68e980e7672e..3a0f2df7073f 100644 --- a/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out @@ -753,7 +753,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "0", "expectedNum" : "2", @@ -776,7 +776,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "1", "expectedNum" : "2", diff --git a/sql/core/src/test/resources/sql-tests/results/table-valued-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/table-valued-functions.sql.out index 1e14bfa2a9d6..f142e2d0a89b 100644 --- a/sql/core/src/test/resources/sql-tests/results/table-valued-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/table-valued-functions.sql.out @@ -83,7 +83,7 @@ org.apache.spark.sql.AnalysisException "errorClass" : "_LEGACY_ERROR_TEMP_1179", "messageParameters" : { "arguments" : "integer, integer, integer, integer, integer", - "details" : "[WRONG_NUM_ARGS] The `range` requires [1, 2, 3, 4] parameters but the actual number is 5.", + "details" : "[WRONG_NUM_ARGS.WITH_SUGGESTION] Invalid number of arguments for the function `range`. Consider to change the number of arguments because the function requires [1, 2, 3, 4] parameters but the actual number is 5.", "name" : "range", "usage" : "\n range(start: long, end: long, step: long, numSlices: integer)\n range(start: long, end: long, step: long)\n range(start: long, end: long)\n range(end: long)" }, diff --git a/sql/core/src/test/resources/sql-tests/results/timestamp-ntz.sql.out b/sql/core/src/test/resources/sql-tests/results/timestamp-ntz.sql.out index ef47da8c8c7c..a965c3929758 100644 --- a/sql/core/src/test/resources/sql-tests/results/timestamp-ntz.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/timestamp-ntz.sql.out @@ -46,7 +46,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "7", "expectedNum" : "6", diff --git a/sql/core/src/test/resources/sql-tests/results/udaf/udaf.sql.out b/sql/core/src/test/resources/sql-tests/results/udaf/udaf.sql.out index c8c5bd286d62..65acfae3e5dc 100644 --- a/sql/core/src/test/resources/sql-tests/results/udaf/udaf.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/udaf/udaf.sql.out @@ -32,7 +32,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "2", "expectedNum" : "1", diff --git a/sql/core/src/test/resources/sql-tests/results/udf/udf-udaf.sql.out b/sql/core/src/test/resources/sql-tests/results/udf/udf-udaf.sql.out index 58389f26ea3c..b358ec371c13 100644 --- a/sql/core/src/test/resources/sql-tests/results/udf/udf-udaf.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/udf/udf-udaf.sql.out @@ -32,7 +32,7 @@ struct<> -- !query output org.apache.spark.sql.AnalysisException { - "errorClass" : "WRONG_NUM_ARGS", + "errorClass" : "WRONG_NUM_ARGS.WITH_SUGGESTION", "messageParameters" : { "actualNum" : "2", "expectedNum" : "1", diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala index 2b747735f189..9a7d78b1b203 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala @@ -4881,7 +4881,7 @@ class DataFrameFunctionsSuite extends QueryTest with SharedSparkSession { exception = intercept[AnalysisException] { df.selectExpr("zip_with(a1, a2, (acc, x) -> x, (acc, x) -> x)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("zip_with"), "expectedNum" -> "3", diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala index 028ab8ea1474..a01b7cc5edf7 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala @@ -54,7 +54,7 @@ class DateFunctionsSuite extends QueryTest with SharedSparkSession { exception = intercept[AnalysisException] { sql("SELECT CURDATE(1)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> "`curdate`", "expectedNum" -> "0", diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala index efcb501d9547..f984019401e2 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala @@ -2634,7 +2634,7 @@ class SQLQuerySuite extends QueryTest with SharedSparkSession with AdaptiveSpark exception = intercept[AnalysisException] { sql("SELECT nvl(1, 2, 3)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("nvl"), "expectedNum" -> "2", 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 2372fe6f78db..eed094afc501 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 @@ -579,7 +579,7 @@ class StringFunctionsSuite extends QueryTest with SharedSparkSession { exception = intercept[AnalysisException] { df.selectExpr("sentences()") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("sentences"), "expectedNum" -> "[1, 2, 3]", diff --git a/sql/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala index d158ace7928e..e08e7cb789a6 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala @@ -105,7 +105,7 @@ class UDFSuite extends QueryTest with SharedSparkSession { exception = intercept[AnalysisException] { df.selectExpr("substr('abcd', 2, 3, 4)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("substr"), "expectedNum" -> "[2, 3]", @@ -125,7 +125,7 @@ class UDFSuite extends QueryTest with SharedSparkSession { spark.udf.register("foo", (_: String).length) df.selectExpr("foo(2, 3, 4)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("foo"), "expectedNum" -> "1", @@ -637,13 +637,6 @@ class UDFSuite extends QueryTest with SharedSparkSession { assert(spark.range(2).select(nonDeterministicJavaUDF()).distinct().count() == 2) } - test("SPARK-28521 error message for CAST(parameter types contains DataType)") { - val e = intercept[AnalysisException] { - spark.sql("SELECT CAST(1)") - } - assert(e.getMessage.contains("Invalid arguments for function cast")) - } - test("only one case class parameter") { val f = (d: TestData) => d.key * d.value.toInt val myUdf = udf(f) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryCompilationErrorsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryCompilationErrorsSuite.scala index bed647ef49fc..439786d0ecc2 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryCompilationErrorsSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryCompilationErrorsSuite.scala @@ -667,6 +667,19 @@ class QueryCompilationErrorsSuite errorClass = "DATATYPE_MISMATCH.INVALID_JSON_SCHEMA", parameters = Map("schema" -> "\"INT\"", "sqlExpr" -> "\"from_json(a)\"")) } + + test("WRONG_NUM_ARGS.WITHOUT_SUGGESTION: wrong args of CAST(parameter types contains DataType)") { + checkError( + exception = intercept[AnalysisException] { + sql("SELECT CAST(1)") + }, + errorClass = "WRONG_NUM_ARGS.WITHOUT_SUGGESTION", + parameters = Map( + "functionName" -> "`cast`" + ), + context = ExpectedContext("", "", 7, 13, "CAST(1)") + ) + } } class MyCastToString extends SparkUserDefinedFunction( diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveUDAFSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveUDAFSuite.scala index d5de8a014327..2a96534e7b26 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveUDAFSuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveUDAFSuite.scala @@ -175,7 +175,7 @@ class HiveUDAFSuite extends QueryTest exception = intercept[AnalysisException] { sql(s"SELECT $functionName(100)") }, - errorClass = "WRONG_NUM_ARGS", + errorClass = "WRONG_NUM_ARGS.WITH_SUGGESTION", parameters = Map( "functionName" -> toSQLId("longProductSum"), "expectedNum" -> "2",