From 7def73a33b0273d75ea31dae1d1c6f3198f6288f Mon Sep 17 00:00:00 2001 From: Haejoon Lee Date: Wed, 23 Oct 2024 10:21:16 +0900 Subject: [PATCH] [SPARK-50078][SQL] Assign appropriate error condition for _LEGACY_ERROR_TEMP_0038: DUPLICATED_CTE_NAMES --- .../src/main/resources/error/error-conditions.json | 11 ++++++----- .../apache/spark/sql/errors/QueryParsingErrors.scala | 2 +- .../apache/spark/sql/catalyst/parser/AstBuilder.scala | 2 +- .../spark/sql/catalyst/parser/PlanParserSuite.scala | 4 ++-- .../resources/sql-tests/analyzer-results/cte.sql.out | 10 ++++++---- .../src/test/resources/sql-tests/results/cte.sql.out | 10 ++++++---- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/common/utils/src/main/resources/error/error-conditions.json b/common/utils/src/main/resources/error/error-conditions.json index 08e88f8c74c5..7a5f9bf04d49 100644 --- a/common/utils/src/main/resources/error/error-conditions.json +++ b/common/utils/src/main/resources/error/error-conditions.json @@ -1154,6 +1154,12 @@ ], "sqlState" : "22012" }, + "DUPLICATED_CTE_NAMES" : { + "message" : [ + "CTE definition can't have duplicate names: ." + ], + "sqlState" : "42602" + }, "DUPLICATED_FIELD_NAME_IN_ARROW_STRUCT" : { "message" : [ "Duplicated field names in Arrow Struct are not allowed, got ." @@ -5764,11 +5770,6 @@ "It is not allowed to add catalog/namespace prefix to the table name in CACHE TABLE AS SELECT." ] }, - "_LEGACY_ERROR_TEMP_0038" : { - "message" : [ - "CTE definition can't have duplicate names: ." - ] - }, "_LEGACY_ERROR_TEMP_0043" : { "message" : [ "Expected format is 'RESET' or 'RESET key'. If you want to include special characters in key, please use quotes, e.g., RESET `key`." diff --git a/sql/api/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala b/sql/api/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala index df4a9daf76b7..a9e556fad046 100644 --- a/sql/api/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala +++ b/sql/api/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala @@ -471,7 +471,7 @@ private[sql] object QueryParsingErrors extends DataTypeErrorsBase { def duplicateCteDefinitionNamesError(duplicateNames: String, ctx: CtesContext): Throwable = { new ParseException( - errorClass = "_LEGACY_ERROR_TEMP_0038", + errorClass = "DUPLICATED_CTE_NAMES", messageParameters = Map("duplicateNames" -> duplicateNames), ctx) } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala index dde2ec6f5ae6..cedeca14a10d 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala @@ -450,7 +450,7 @@ class AstBuilder extends DataTypeAstBuilder val duplicates = ctes.groupBy(_._1).filter(_._2.size > 1).keys if (duplicates.nonEmpty) { throw QueryParsingErrors.duplicateCteDefinitionNamesError( - duplicates.mkString("'", "', '", "'"), ctx) + duplicates.map(toSQLId).mkString(", "), ctx) } UnresolvedWith(plan, ctes.toSeq) } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala index 6923be0bd7e0..fdae3863f46f 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala @@ -295,8 +295,8 @@ class PlanParserSuite extends AnalysisTest { val sql = "with cte1 (select 1), cte1 as (select 1 from cte1) select * from cte1" checkError( exception = parseException(sql), - condition = "_LEGACY_ERROR_TEMP_0038", - parameters = Map("duplicateNames" -> "'cte1'"), + condition = "DUPLICATED_CTE_NAMES", + parameters = Map("duplicateNames" -> "`cte1`"), context = ExpectedContext( fragment = sql, start = 0, diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/cte.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/cte.sql.out index 155308ee0d7e..9b86c4df62c4 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/cte.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/cte.sql.out @@ -233,9 +233,10 @@ SELECT * FROM t -- !query analysis org.apache.spark.sql.catalyst.parser.ParseException { - "errorClass" : "_LEGACY_ERROR_TEMP_0038", + "errorClass" : "DUPLICATED_CTE_NAMES", + "sqlState" : "42602", "messageParameters" : { - "duplicateNames" : "'t'" + "duplicateNames" : "`t`" }, "queryContext" : [ { "objectType" : "", @@ -688,9 +689,10 @@ with cte1 as (select 42), cte1 as (select 42) select * FROM cte1 -- !query analysis org.apache.spark.sql.catalyst.parser.ParseException { - "errorClass" : "_LEGACY_ERROR_TEMP_0038", + "errorClass" : "DUPLICATED_CTE_NAMES", + "sqlState" : "42602", "messageParameters" : { - "duplicateNames" : "'cte1'" + "duplicateNames" : "`cte1`" }, "queryContext" : [ { "objectType" : "", diff --git a/sql/core/src/test/resources/sql-tests/results/cte.sql.out b/sql/core/src/test/resources/sql-tests/results/cte.sql.out index 245210e28b1d..754a8832ef6c 100644 --- a/sql/core/src/test/resources/sql-tests/results/cte.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/cte.sql.out @@ -188,9 +188,10 @@ struct<> -- !query output org.apache.spark.sql.catalyst.parser.ParseException { - "errorClass" : "_LEGACY_ERROR_TEMP_0038", + "errorClass" : "DUPLICATED_CTE_NAMES", + "sqlState" : "42602", "messageParameters" : { - "duplicateNames" : "'t'" + "duplicateNames" : "`t`" }, "queryContext" : [ { "objectType" : "", @@ -497,9 +498,10 @@ struct<> -- !query output org.apache.spark.sql.catalyst.parser.ParseException { - "errorClass" : "_LEGACY_ERROR_TEMP_0038", + "errorClass" : "DUPLICATED_CTE_NAMES", + "sqlState" : "42602", "messageParameters" : { - "duplicateNames" : "'cte1'" + "duplicateNames" : "`cte1`" }, "queryContext" : [ { "objectType" : "",