1717
1818package org .apache .spark .sql .execution .command
1919
20- import org .apache .spark .sql .{QueryTest , Row }
20+ import org .apache .spark .sql .{AnalysisException , QueryTest , Row }
2121import org .apache .spark .sql .internal .SQLConf
2222import org .apache .spark .sql .types .{StringType , StructType }
2323
@@ -36,41 +36,64 @@ trait DropNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils {
3636
3737 protected def builtinTopNamespaces : Seq [String ] = Seq .empty
3838 protected def isCasePreserving : Boolean = true
39+ protected def assertDropFails
3940
40- protected def checkNamespace (sqlText : String , expected : Seq [String ]) = {
41- val df = spark.sql(sqlText )
41+ protected def checkNamespace (expected : Seq [String ]) = {
42+ val df = spark.sql(s " SHOW NAMESPACES IN $catalog " )
4243 assert(df.schema === new StructType ().add(" namespace" , StringType , false ))
4344 checkAnswer(df, expected.map(Row (_)))
4445 }
4546
4647 test(" basic tests" ) {
4748 sql(s " CREATE NAMESPACE $catalog.ns " )
48- checkNamespace(s " SHOW NAMESPACES IN $catalog " , Seq (" ns" ) ++ builtinTopNamespaces)
49+ checkNamespace(Seq (" ns" ) ++ builtinTopNamespaces)
4950
5051 sql(s " DROP NAMESPACE $catalog.ns " )
51- checkNamespace(s " SHOW NAMESPACES IN $catalog " , builtinTopNamespaces)
52+ checkNamespace(builtinTopNamespaces)
5253 }
5354
5455 test(" DropNamespace: test handling of 'IF EXISTS'" ) {
5556 // It must not throw any exceptions
5657 sql(s " DROP NAMESPACE IF EXISTS $catalog.unknown " )
57- checkNamespace(s " SHOW NAMESPACES IN $catalog" , builtinTopNamespaces)
58+ checkNamespace(builtinTopNamespaces)
59+ }
60+
61+ test(" DropNamespace: Namespace does not exist" ) {
62+ // Namespace $catalog.unknown does not exist.
63+ val message = intercept[AnalysisException ] {
64+ sql(s " DROP DATABASE $catalog.unknown " )
65+ }.getMessage
66+ assert(message.contains(s " 'unknown' not found " ))
67+ }
68+
69+ test(" DropNamespace: drop non-empty namespace with a non-cascading mode" ) {
70+ sql(s " CREATE NAMESPACE $catalog.ns " )
71+ sql(s " CREATE TABLE $catalog.ns.table (id bigint) $defaultUsing" )
72+ checkNamespace(Seq (" ns" ) ++ builtinTopNamespaces)
73+
74+ // $catalog.ns.table is present, thus $catalog.ns cannot be dropped.
75+ assertDropFails
76+ sql(s " DROP TABLE $catalog.ns.table " )
77+
78+ // Now that $catalog.ns is empty, it can be dropped.
79+ sql(s " DROP NAMESPACE $catalog.ns " )
80+ checkNamespace(builtinTopNamespaces)
5881 }
5982
6083 test(" DropNamespace: drop non-empty namespace with a cascade mode" ) {
6184 sql(s " CREATE NAMESPACE $catalog.ns " )
6285 sql(s " CREATE TABLE $catalog.ns.table (id bigint) $defaultUsing" )
63- checkNamespace(s " SHOW NAMESPACES IN $catalog " , Seq (" ns" ) ++ builtinTopNamespaces)
86+ checkNamespace(Seq (" ns" ) ++ builtinTopNamespaces)
6487
6588 sql(s " DROP NAMESPACE $catalog.ns CASCADE " )
66- checkNamespace(s " SHOW NAMESPACES IN $catalog " , builtinTopNamespaces)
89+ checkNamespace(builtinTopNamespaces)
6790 }
6891
6992 test(" DropNamespace: drop current namespace" ) {
7093 sql(s " CREATE NAMESPACE $catalog.ns " )
7194 sql(s " USE $catalog.ns " )
7295 sql(s " DROP NAMESPACE $catalog.ns " )
73- checkNamespace(s " SHOW NAMESPACES IN $catalog " , builtinTopNamespaces)
96+ checkNamespace(builtinTopNamespaces)
7497 }
7598
7699 test(" DropNamespace: drop namespace with case sensitivity" ) {
@@ -84,7 +107,7 @@ trait DropNamespaceSuiteBase extends QueryTest with DDLCommandTestUtils {
84107
85108 sql(s " DROP NAMESPACE $catalog. $expected" )
86109 sql(s " DROP NAMESPACE $catalog.bbb " )
87- checkNamespace(s " SHOW NAMESPACES IN $catalog " , builtinTopNamespaces)
110+ checkNamespace(builtinTopNamespaces)
88111 }
89112 }
90113 }
0 commit comments