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

Reply via email to