From e6b17c15e9b0d049b9b36715a1d386b7fe7f3ae5 Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Wed, 5 Jan 2022 21:38:41 -0800 Subject: [PATCH 1/6] initial commit --- .../analysis/ResolveSessionCatalog.scala | 19 ++++++++++++------- .../command/TestsV1AndV2Commands.scala | 9 ++++++++- .../command/v1/CreateNamespaceSuite.scala | 2 +- .../command/CreateNamespaceSuite.scala | 4 +++- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala b/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala index 835ea9214481d..7e5e2bad041e7 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala @@ -214,16 +214,11 @@ class ResolveSessionCatalog(val catalogManager: CatalogManager) case DropView(r: ResolvedView, ifExists) => DropTableCommand(r.identifier.asTableIdentifier, ifExists, isView = true, purge = false) - case c @ CreateNamespace(ResolvedDBObjectName(catalog, name), _, _) - if isSessionCatalog(catalog) => - if (name.length != 1) { - throw QueryCompilationErrors.invalidDatabaseNameError(name.quoted) - } - + case c @ CreateNamespace(DatabaseNameInSessionCatalog(name), _, _) if conf.useV1Command => val comment = c.properties.get(SupportsNamespaces.PROP_COMMENT) val location = c.properties.get(SupportsNamespaces.PROP_LOCATION) val newProperties = c.properties -- CatalogV2Util.NAMESPACE_RESERVED_PROPERTIES - CreateDatabaseCommand(name.head, c.ifNotExists, location, comment, newProperties) + CreateDatabaseCommand(name, c.ifNotExists, location, comment, newProperties) case d @ DropNamespace(DatabaseInSessionCatalog(db), _, _) => DropDatabaseCommand(db, d.ifExists, d.cascade) @@ -609,4 +604,14 @@ class ResolveSessionCatalog(val catalogManager: CatalogManager) resolved.namespace.map(quoteIfNeeded).mkString(".")) } } + + private object DatabaseNameInSessionCatalog { + def unapply(resolved: ResolvedDBObjectName): Option[String] = resolved match { + case ResolvedDBObjectName(catalog, _) if !isSessionCatalog(catalog) => None + case ResolvedDBObjectName(_, Seq(dbName)) => Some(dbName) + case _ => + assert(resolved.nameParts.length > 1) + throw QueryCompilationErrors.invalidDatabaseNameError(resolved.nameParts.quoted) + } + } } diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala index 15976f2df7c22..aad1ea37baa8c 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala @@ -28,14 +28,21 @@ import org.apache.spark.sql.internal.SQLConf trait TestsV1AndV2Commands extends DDLCommandTestUtils { private var _version: String = "" override def commandVersion: String = _version + def runningV1Command: Boolean = commandVersion == "V1" // Tests using V1 catalogs will run with `spark.sql.legacy.useV1Command` on and off // to test both V1 and V2 commands. override def test(testName: String, testTags: Tag*)(testFun: => Any) (implicit pos: Position): Unit = { Seq(true, false).foreach { useV1Command => - _version = if (useV1Command) "V1" else "V2" + def setCommandVersion(): Unit = { + _version = if (useV1Command) "V1" else "V2" + } + setCommandVersion() super.test(testName, testTags: _*) { + // Need to set command version inside this test function so that + // the correct command version is available in each test. + setCommandVersion() withSQLConf(SQLConf.LEGACY_USE_V1_COMMAND.key -> useV1Command.toString) { testFun } diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala index ba3eba9323557..7ff15a1c2299b 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala @@ -36,7 +36,7 @@ import org.apache.spark.sql.execution.command trait CreateNamespaceSuiteBase extends command.CreateNamespaceSuiteBase with command.TestsV1AndV2Commands { override def namespace: String = "db" - override def notFoundMsgPrefix: String = "Database" + override def notFoundMsgPrefix: String = if (runningV1Command) "Database" else "Namespace" test("Create namespace using default warehouse path") { val ns = s"$catalog.$namespace" diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala index e8f85f40e9fb8..dcc9acf19a41c 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala @@ -25,5 +25,7 @@ import org.apache.spark.sql.execution.command.v1 */ class CreateNamespaceSuite extends v1.CreateNamespaceSuiteBase with CommandSuiteBase { override def commandVersion: String = super[CreateNamespaceSuiteBase].commandVersion - override def alreadyExistErrorMessage: String = s"$notFoundMsgPrefix $namespace already exists" + override def alreadyExistErrorMessage: String = + s"$notFoundMsgPrefix $namespaceMessage already exists" + private def namespaceMessage: String = if (runningV1Command) s"$namespace" else s"'$namespace'" } From 57179bc986440b1e2945804bf6dfeb5d944cf237 Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Thu, 6 Jan 2022 23:12:55 -0800 Subject: [PATCH 2/6] address PR comments --- .../command/CreateNamespaceSuiteBase.scala | 7 +++---- .../apache/spark/sql/hive/HiveExternalCatalog.scala | 13 ++++++++++--- .../execution/command/CreateNamespaceSuite.scala | 3 --- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala index 597ea869eb8ac..649c42535671b 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala @@ -21,7 +21,8 @@ import scala.collection.JavaConverters._ import org.apache.hadoop.fs.Path -import org.apache.spark.sql.{AnalysisException, QueryTest} +import org.apache.spark.sql.QueryTest +import org.apache.spark.sql.catalyst.analysis.NamespaceAlreadyExistsException import org.apache.spark.sql.catalyst.parser.ParseException import org.apache.spark.sql.connector.catalog.{CatalogPlugin, CatalogV2Util, SupportsNamespaces} import org.apache.spark.sql.internal.SQLConf @@ -88,9 +89,7 @@ trait CreateNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils { withNamespace(ns) { sql(s"CREATE NAMESPACE $ns") - // TODO: HiveExternalCatalog throws DatabaseAlreadyExistsException, and - // non-Hive catalogs throw NamespaceAlreadyExistsException. - val e = intercept[AnalysisException] { + val e = intercept[NamespaceAlreadyExistsException] { sql(s"CREATE NAMESPACE $ns") } assert(e.getMessage.contains(alreadyExistErrorMessage)) diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala index 52b21598edc09..59e9128ccdd2a 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala @@ -36,7 +36,7 @@ import org.apache.spark.{SparkConf, SparkException} import org.apache.spark.internal.Logging import org.apache.spark.sql.AnalysisException import org.apache.spark.sql.catalyst.TableIdentifier -import org.apache.spark.sql.catalyst.analysis.TableAlreadyExistsException +import org.apache.spark.sql.catalyst.analysis.{DatabaseAlreadyExistsException, TableAlreadyExistsException} import org.apache.spark.sql.catalyst.catalog._ import org.apache.spark.sql.catalyst.catalog.ExternalCatalogUtils._ import org.apache.spark.sql.catalyst.expressions._ @@ -189,8 +189,15 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, hadoopConf: Configurat override def createDatabase( dbDefinition: CatalogDatabase, - ignoreIfExists: Boolean): Unit = withClient { - client.createDatabase(dbDefinition, ignoreIfExists) + ignoreIfExists: Boolean): Unit = { + try { + withClient { + client.createDatabase(dbDefinition, ignoreIfExists) + } + } catch { + case e: AnalysisException if e.message.contains("already exists") => + throw new DatabaseAlreadyExistsException(dbDefinition.name) + } } override def dropDatabase( diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala index dcc9acf19a41c..afe6f1138d30a 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/command/CreateNamespaceSuite.scala @@ -25,7 +25,4 @@ import org.apache.spark.sql.execution.command.v1 */ class CreateNamespaceSuite extends v1.CreateNamespaceSuiteBase with CommandSuiteBase { override def commandVersion: String = super[CreateNamespaceSuiteBase].commandVersion - override def alreadyExistErrorMessage: String = - s"$notFoundMsgPrefix $namespaceMessage already exists" - private def namespaceMessage: String = if (runningV1Command) s"$namespace" else s"'$namespace'" } From 4eabbb37c2351484f3587291b9ffe01796b7faed Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Fri, 7 Jan 2022 09:48:13 -0800 Subject: [PATCH 3/6] address PR comment --- .../sql/execution/command/CreateNamespaceSuiteBase.scala | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala index 649c42535671b..a1416601aaef8 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala @@ -50,8 +50,6 @@ trait CreateNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils { protected def notFoundMsgPrefix: String - protected def alreadyExistErrorMessage: String = s"$notFoundMsgPrefix '$namespace' already exists" - test("basic") { val ns = s"$catalog.$namespace" withNamespace(ns) { @@ -92,7 +90,7 @@ trait CreateNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils { val e = intercept[NamespaceAlreadyExistsException] { sql(s"CREATE NAMESPACE $ns") } - assert(e.getMessage.contains(alreadyExistErrorMessage)) + assert(e.getMessage.contains(s"$notFoundMsgPrefix '$namespace' already exists")) // The following will be no-op since the namespace already exists. sql(s"CREATE NAMESPACE IF NOT EXISTS $ns") From 20ac17f3243e8a096218e902b02da26cc2eb18b6 Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Sun, 9 Jan 2022 19:39:54 -0800 Subject: [PATCH 4/6] address PR comments --- .../spark/sql/hive/HiveExternalCatalog.scala | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala index 59e9128ccdd2a..051f602f87ed0 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala @@ -94,10 +94,22 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, hadoopConf: Configurat } /** - * Run some code involving `client` in a [[synchronized]] block and wrap certain + * Run some code involving `client` in a [[synchronized]] block and wrap non-fatal * exceptions thrown in the process in [[AnalysisException]]. */ - private def withClient[T](body: => T): T = synchronized { + private def withClient[T](body: => T): T = withClientWrappingException{ + body + } { + _ => None // Will fallback to default wrapping strategy in withClientWrappingException. + } + + /** + * Run some code involving `client` in a [[synchronized]] block and wrap non-fatal + * exceptions thrown in the process in [[AnalysisException]] using the given + * `wrapException` function. + */ + private def withClientWrappingException[T](body: => T) + (wrapException: Throwable => Option[AnalysisException]): T = synchronized { try { body } catch { @@ -108,8 +120,11 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, hadoopConf: Configurat case i: InvocationTargetException => i.getCause case o => o } - throw new AnalysisException( - e.getClass.getCanonicalName + ": " + e.getMessage, cause = Some(e)) + wrapException(e) match { + case Some(wrapped) => throw wrapped + case None => throw new AnalysisException( + e.getClass.getCanonicalName + ": " + e.getMessage, cause = Some(e)) + } } } @@ -189,14 +204,16 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, hadoopConf: Configurat override def createDatabase( dbDefinition: CatalogDatabase, - ignoreIfExists: Boolean): Unit = { - try { - withClient { - client.createDatabase(dbDefinition, ignoreIfExists) - } - } catch { - case e: AnalysisException if e.message.contains("already exists") => - throw new DatabaseAlreadyExistsException(dbDefinition.name) + ignoreIfExists: Boolean): Unit = withClientWrappingException { + client.createDatabase(dbDefinition, ignoreIfExists) + } { exception => + if (exception.getClass.getName.equals( + "org.apache.hadoop.hive.metastore.api.AlreadyExistsException") + && exception.getMessage.contains( + s"Database ${dbDefinition.name} already exists")) { + Some(new DatabaseAlreadyExistsException(dbDefinition.name)) + } else { + None } } From ed5c96bf69c00dfc6fbfe0c25d6aaedb19cd1d95 Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Mon, 10 Jan 2022 10:28:22 -0800 Subject: [PATCH 5/6] address comments --- .../apache/spark/sql/hive/HiveExternalCatalog.scala | 2 +- .../apache/spark/sql/hive/client/VersionsSuite.scala | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala index 051f602f87ed0..24e60529d227b 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala @@ -97,7 +97,7 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, hadoopConf: Configurat * Run some code involving `client` in a [[synchronized]] block and wrap non-fatal * exceptions thrown in the process in [[AnalysisException]]. */ - private def withClient[T](body: => T): T = withClientWrappingException{ + private def withClient[T](body: => T): T = withClientWrappingException { body } { _ => None // Will fallback to default wrapping strategy in withClientWrappingException. diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/client/VersionsSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/client/VersionsSuite.scala index 03aba2db9932e..14b2a51bff8c0 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/client/VersionsSuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/client/VersionsSuite.scala @@ -183,6 +183,16 @@ class VersionsSuite extends SparkFunSuite with Logging { val tempDB = CatalogDatabase( "temporary", description = "test create", tempDatabasePath, Map()) client.createDatabase(tempDB, ignoreIfExists = true) + + try { + client.createDatabase(tempDB, ignoreIfExists = false) + assert(false, "createDatabase should throw AlreadyExistsException") + } catch { + case ex: Throwable => + assert(ex.getClass.getName.equals( + "org.apache.hadoop.hive.metastore.api.AlreadyExistsException")) + assert(ex.getMessage.contains(s"Database ${tempDB.name} already exists")) + } } test(s"$version: create/get/alter database should pick right user name as owner") { From 044d7e548fc13d11be41187ac1a3148a09161489 Mon Sep 17 00:00:00 2001 From: Terry Kim Date: Mon, 10 Jan 2022 10:48:37 -0800 Subject: [PATCH 6/6] Simplify --- .../sql/execution/command/CreateNamespaceSuiteBase.scala | 4 +++- .../spark/sql/execution/command/DDLCommandTestUtils.scala | 5 +++++ .../spark/sql/execution/command/TestsV1AndV2Commands.scala | 4 ++-- .../sql/execution/command/v1/CreateNamespaceSuite.scala | 1 - .../sql/execution/command/v2/CreateNamespaceSuite.scala | 1 - 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala index a1416601aaef8..7db8fba8ac366 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/CreateNamespaceSuiteBase.scala @@ -25,6 +25,7 @@ import org.apache.spark.sql.QueryTest import org.apache.spark.sql.catalyst.analysis.NamespaceAlreadyExistsException import org.apache.spark.sql.catalyst.parser.ParseException import org.apache.spark.sql.connector.catalog.{CatalogPlugin, CatalogV2Util, SupportsNamespaces} +import org.apache.spark.sql.execution.command.DDLCommandTestUtils.V1_COMMAND_VERSION import org.apache.spark.sql.internal.SQLConf /** @@ -48,7 +49,8 @@ trait CreateNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils { protected def namespaceArray: Array[String] = namespace.split('.') - protected def notFoundMsgPrefix: String + protected def notFoundMsgPrefix: String = + if (commandVersion == V1_COMMAND_VERSION) "Database" else "Namespace" test("basic") { val ns = s"$catalog.$namespace" diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandTestUtils.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandTestUtils.scala index af3e92a55868b..39f2abd35c2b5 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandTestUtils.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandTestUtils.scala @@ -173,3 +173,8 @@ trait DDLCommandTestUtils extends SQLTestUtils { part1Loc } } + +object DDLCommandTestUtils { + val V1_COMMAND_VERSION = "V1" + val V2_COMMAND_VERSION = "V2" +} diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala index aad1ea37baa8c..73e75dca4517c 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/TestsV1AndV2Commands.scala @@ -20,6 +20,7 @@ package org.apache.spark.sql.execution.command import org.scalactic.source.Position import org.scalatest.Tag +import org.apache.spark.sql.execution.command.DDLCommandTestUtils.{V1_COMMAND_VERSION, V2_COMMAND_VERSION} import org.apache.spark.sql.internal.SQLConf /** @@ -28,7 +29,6 @@ import org.apache.spark.sql.internal.SQLConf trait TestsV1AndV2Commands extends DDLCommandTestUtils { private var _version: String = "" override def commandVersion: String = _version - def runningV1Command: Boolean = commandVersion == "V1" // Tests using V1 catalogs will run with `spark.sql.legacy.useV1Command` on and off // to test both V1 and V2 commands. @@ -36,7 +36,7 @@ trait TestsV1AndV2Commands extends DDLCommandTestUtils { (implicit pos: Position): Unit = { Seq(true, false).foreach { useV1Command => def setCommandVersion(): Unit = { - _version = if (useV1Command) "V1" else "V2" + _version = if (useV1Command) V1_COMMAND_VERSION else V2_COMMAND_VERSION } setCommandVersion() super.test(testName, testTags: _*) { diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala index 7ff15a1c2299b..f8ded64669b1c 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v1/CreateNamespaceSuite.scala @@ -36,7 +36,6 @@ import org.apache.spark.sql.execution.command trait CreateNamespaceSuiteBase extends command.CreateNamespaceSuiteBase with command.TestsV1AndV2Commands { override def namespace: String = "db" - override def notFoundMsgPrefix: String = if (runningV1Command) "Database" else "Namespace" test("Create namespace using default warehouse path") { val ns = s"$catalog.$namespace" diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v2/CreateNamespaceSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v2/CreateNamespaceSuite.scala index 66865ff0c5bda..6b5475a1e2674 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v2/CreateNamespaceSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/v2/CreateNamespaceSuite.scala @@ -24,5 +24,4 @@ import org.apache.spark.sql.execution.command */ class CreateNamespaceSuite extends command.CreateNamespaceSuiteBase with CommandSuiteBase { override def namespace: String = "ns1.ns2" - override def notFoundMsgPrefix: String = "Namespace" }