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 <[email protected]>
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 <[email protected]>
Signed-off-by: Wenchen Fan <[email protected]>
---
.../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: [email protected]
For additional commands, e-mail: [email protected]