This is an automated email from the ASF dual-hosted git repository. wenchen 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 27b9538a3bf [SPARK-41975][SQL] Improve error message for `INDEX_ALREADY_EXISTS` 27b9538a3bf is described below commit 27b9538a3bf44973b7b7d266fbcff88631753ffd Author: itholic <haejoon....@databricks.com> AuthorDate: Wed Jan 18 17:15:40 2023 +0800 [SPARK-41975][SQL] Improve error message for `INDEX_ALREADY_EXISTS` ### What changes were proposed in this pull request? This PR proposes to improve error message for `INDEX_ALREADY_EXISTS`. ### Why are the changes needed? Make the error message more clear and proper. ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Fix UT and `./build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite*` Closes #39497 from itholic/INDEX_ALREADY_EXISTS. Authored-by: itholic <haejoon....@databricks.com> Signed-off-by: Wenchen Fan <wenc...@databricks.com> --- .../test/scala/org/apache/spark/sql/jdbc/v2/V2JDBCTest.scala | 11 +++++++---- core/src/main/resources/error/error-classes.json | 2 +- .../spark/sql/catalyst/analysis/AlreadyExistException.scala | 12 +++++++++--- .../src/main/scala/org/apache/spark/sql/jdbc/H2Dialect.scala | 7 ++++++- .../main/scala/org/apache/spark/sql/jdbc/MySQLDialect.scala | 7 ++++++- .../scala/org/apache/spark/sql/jdbc/PostgresDialect.scala | 8 +++++++- .../test/scala/org/apache/spark/sql/jdbc/JDBCV2Suite.scala | 3 ++- 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/V2JDBCTest.scala b/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/V2JDBCTest.scala index 3528540b425..5bedcbd172e 100644 --- a/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/V2JDBCTest.scala +++ b/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/V2JDBCTest.scala @@ -253,10 +253,13 @@ private[v2] trait V2JDBCTest extends SharedSparkSession with DockerIntegrationFu // This should pass without exception sql(s"CREATE index IF NOT EXISTS i1 ON $catalogName.new_table (col1)") - m = intercept[IndexAlreadyExistsException] { - sql(s"CREATE index i1 ON $catalogName.new_table (col1)") - }.getMessage - assert(m.contains("Failed to create index i1 in new_table")) + checkError( + exception = intercept[IndexAlreadyExistsException] { + sql(s"CREATE index i1 ON $catalogName.new_table (col1)") + }, + errorClass = "INDEX_ALREADY_EXISTS", + parameters = Map("indexName" -> "i1", "tableName" -> "new_table") + ) sql(s"DROP index i1 ON $catalogName.new_table") assert(jdbcTable.indexExists("i1") == false) diff --git a/core/src/main/resources/error/error-classes.json b/core/src/main/resources/error/error-classes.json index 91655f6e62f..9db0dc74562 100644 --- a/core/src/main/resources/error/error-classes.json +++ b/core/src/main/resources/error/error-classes.json @@ -643,7 +643,7 @@ }, "INDEX_ALREADY_EXISTS" : { "message" : [ - "Cannot create the index because it already exists. <message>." + "Cannot create the index <indexName> on table <tableName> because it already exists." ], "sqlState" : "42710" }, diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala index 1b5dca840d6..762b6155d5d 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala @@ -136,6 +136,12 @@ class FunctionAlreadyExistsException(errorClass: String, messageParameters: Map[ } } -class IndexAlreadyExistsException(message: String, cause: Option[Throwable] = None) - extends AnalysisException(errorClass = "INDEX_ALREADY_EXISTS", - Map("message" -> message), cause) +class IndexAlreadyExistsException( + indexName: String, + tableName: String, + cause: Option[Throwable] = None) + extends AnalysisException( + errorClass = "INDEX_ALREADY_EXISTS", + Map("indexName" -> indexName, "tableName" -> tableName), + cause + ) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/H2Dialect.scala b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/H2Dialect.scala index 0b735dd0e46..eac3dab4f6b 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/H2Dialect.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/H2Dialect.scala @@ -208,7 +208,12 @@ private[sql] object H2Dialect extends JdbcDialect { messageParameters = Map("schemaName" -> quotedName)) // INDEX_ALREADY_EXISTS_1 case 42111 => - throw new IndexAlreadyExistsException(message, cause = Some(e)) + // The message is: Failed to create index indexName in tableName + val regex = "(?s)Failed to create index (.*) in (.*)".r + val indexName = regex.findFirstMatchIn(message).get.group(1) + val tableName = regex.findFirstMatchIn(message).get.group(2) + throw new IndexAlreadyExistsException( + indexName = indexName, tableName = tableName, cause = Some(e)) // INDEX_NOT_FOUND_1 case 42112 => throw new NoSuchIndexException(message, cause = Some(e)) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/MySQLDialect.scala b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/MySQLDialect.scala index d88f3566eaa..5f15bdf9113 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/MySQLDialect.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/MySQLDialect.scala @@ -251,7 +251,12 @@ private case object MySQLDialect extends JdbcDialect with SQLConfHelper { sqlException.getErrorCode match { // ER_DUP_KEYNAME case 1061 => - throw new IndexAlreadyExistsException(message, cause = Some(e)) + // The message is: Failed to create index indexName in tableName + val regex = "(?s)Failed to create index (.*) in (.*)".r + val indexName = regex.findFirstMatchIn(message).get.group(1) + val tableName = regex.findFirstMatchIn(message).get.group(2) + throw new IndexAlreadyExistsException( + indexName = indexName, tableName = tableName, cause = Some(e)) case 1091 => throw new NoSuchIndexException(message, cause = Some(e)) case _ => super.classifyException(message, e) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala index 620423d9502..dd0107beb94 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala @@ -223,7 +223,13 @@ private object PostgresDialect extends JdbcDialect with SQLConfHelper { case sqlException: SQLException => sqlException.getSQLState match { // https://www.postgresql.org/docs/14/errcodes-appendix.html - case "42P07" => throw new IndexAlreadyExistsException(message, cause = Some(e)) + case "42P07" => + // The message is: Failed to create index indexName in tableName + val regex = "(?s)Failed to create index (.*) in (.*)".r + val indexName = regex.findFirstMatchIn(message).get.group(1) + val tableName = regex.findFirstMatchIn(message).get.group(2) + throw new IndexAlreadyExistsException( + indexName = indexName, tableName = tableName, cause = Some(e)) case "42704" => throw new NoSuchIndexException(message, cause = Some(e)) case "2BP01" => throw NonEmptyNamespaceException(message, cause = Some(e)) case _ => super.classifyException(message, e) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCV2Suite.scala b/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCV2Suite.scala index 98d61499b52..d3563219485 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCV2Suite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCV2Suite.scala @@ -2650,7 +2650,8 @@ class JDBCV2Suite extends QueryTest with SharedSparkSession with ExplainSuiteHel }, errorClass = "INDEX_ALREADY_EXISTS", parameters = Map( - "message" -> "Failed to create index people_index in test.people" + "indexName" -> "people_index", + "tableName" -> "test.people" ) ) assert(jdbcTable.indexExists("people_index")) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org