@@ -95,49 +95,81 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
95
95
catalog.createPartitions(tableName, Seq (part), ignoreIfExists = false )
96
96
}
97
97
98
+ private def appendTrailingSlash (path : String ): String = {
99
+ if (! path.endsWith(File .separator)) path + File .separator else path
100
+ }
101
+
98
102
test(" the qualified path of a database is stored in the catalog" ) {
99
103
val catalog = sqlContext.sessionState.catalog
100
104
101
- val path = System .getProperty(" java.io.tmpdir" )
102
- // The generated temp path is not qualified.
103
- assert(! path.startsWith(" file:/" ))
104
- sql(s " CREATE DATABASE db1 LOCATION ' $path' " )
105
- val pathInCatalog = new Path (catalog.getDatabaseMetadata(" db1" ).locationUri).toUri
106
- assert(" file" === pathInCatalog.getScheme)
107
- assert(path === pathInCatalog.getPath)
108
-
109
- withSQLConf(
110
- SQLConf .WAREHOUSE_PATH .key -> (System .getProperty(" java.io.tmpdir" ))) {
111
- sql(s " CREATE DATABASE db2 " )
112
- val pathInCatalog = new Path (catalog.getDatabaseMetadata(" db2" ).locationUri).toUri
105
+ withTempDir { tmpDir =>
106
+ val path = tmpDir.toString
107
+ // The generated temp path is not qualified.
108
+ assert(! path.startsWith(" file:/" ))
109
+ sql(s " CREATE DATABASE db1 LOCATION ' $path' " )
110
+ val pathInCatalog = new Path (catalog.getDatabaseMetadata(" db1" ).locationUri).toUri
113
111
assert(" file" === pathInCatalog.getScheme)
114
- assert(s " ${sqlContext.conf.warehousePath}/db2.db " === pathInCatalog.getPath)
115
- }
112
+ val expectedPath = if (path.endsWith(File .separator)) path.dropRight(1 ) else path
113
+ assert(expectedPath === pathInCatalog.getPath)
114
+
115
+ withSQLConf(SQLConf .WAREHOUSE_PATH .key -> path) {
116
+ sql(s " CREATE DATABASE db2 " )
117
+ val pathInCatalog = new Path (catalog.getDatabaseMetadata(" db2" ).locationUri).toUri
118
+ assert(" file" === pathInCatalog.getScheme)
119
+ val expectedPath = appendTrailingSlash(sqlContext.conf.warehousePath) + " db2.db"
120
+ assert(expectedPath === pathInCatalog.getPath)
121
+ }
116
122
117
- sql(" DROP DATABASE db1" )
118
- sql(" DROP DATABASE db2" )
123
+ sql(" DROP DATABASE db1" )
124
+ sql(" DROP DATABASE db2" )
125
+ }
119
126
}
120
127
121
128
test(" Create/Drop Database" ) {
122
- withSQLConf(
123
- SQLConf .WAREHOUSE_PATH .key -> (System .getProperty(" java.io.tmpdir" ) + File .separator)) {
124
- val catalog = sqlContext.sessionState.catalog
129
+ withTempDir { tmpDir =>
130
+ val path = tmpDir.toString
131
+ withSQLConf(SQLConf .WAREHOUSE_PATH .key -> path) {
132
+ val catalog = sqlContext.sessionState.catalog
133
+ val databaseNames = Seq (" db1" , " `database`" )
134
+
135
+ databaseNames.foreach { dbName =>
136
+ try {
137
+ val dbNameWithoutBackTicks = cleanIdentifier(dbName)
125
138
126
- val databaseNames = Seq (" db1" , " `database`" )
139
+ sql(s " CREATE DATABASE $dbName" )
140
+ val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
141
+ val expectedLocation =
142
+ " file:" + appendTrailingSlash(path) + s " $dbNameWithoutBackTicks.db "
143
+ assert(db1 == CatalogDatabase (
144
+ dbNameWithoutBackTicks,
145
+ " " ,
146
+ expectedLocation,
147
+ Map .empty))
148
+ sql(s " DROP DATABASE $dbName CASCADE " )
149
+ assert(! catalog.databaseExists(dbNameWithoutBackTicks))
150
+ } finally {
151
+ catalog.reset()
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
127
157
158
+ test(" Create/Drop Database - location" ) {
159
+ val catalog = sqlContext.sessionState.catalog
160
+ val databaseNames = Seq (" db1" , " `database`" )
161
+ withTempDir { tmpDir =>
162
+ val path = tmpDir.toString
163
+ val dbPath = " file:" + path
128
164
databaseNames.foreach { dbName =>
129
165
try {
130
166
val dbNameWithoutBackTicks = cleanIdentifier(dbName)
131
-
132
- sql(s " CREATE DATABASE $dbName" )
167
+ sql(s " CREATE DATABASE $dbName Location ' $path' " )
133
168
val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
134
- val expectedLocation =
135
- " file:" + System .getProperty(" java.io.tmpdir" ) +
136
- File .separator + s " $dbNameWithoutBackTicks.db "
137
169
assert(db1 == CatalogDatabase (
138
170
dbNameWithoutBackTicks,
139
171
" " ,
140
- expectedLocation ,
172
+ if (dbPath.endsWith( File .separator)) dbPath.dropRight( 1 ) else dbPath ,
141
173
Map .empty))
142
174
sql(s " DROP DATABASE $dbName CASCADE " )
143
175
assert(! catalog.databaseExists(dbNameWithoutBackTicks))
@@ -149,77 +181,78 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
149
181
}
150
182
151
183
test(" Create Database - database already exists" ) {
152
- withSQLConf(
153
- SQLConf .WAREHOUSE_PATH .key -> (System .getProperty(" java.io.tmpdir" ) + File .separator)) {
154
- val catalog = sqlContext.sessionState.catalog
155
- val databaseNames = Seq (" db1" , " `database`" )
156
-
157
- databaseNames.foreach { dbName =>
158
- try {
159
- val dbNameWithoutBackTicks = cleanIdentifier(dbName)
160
- sql(s " CREATE DATABASE $dbName" )
161
- val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
162
- val expectedLocation =
163
- " file:" + System .getProperty(" java.io.tmpdir" ) +
164
- File .separator + s " $dbNameWithoutBackTicks.db "
165
- assert(db1 == CatalogDatabase (
166
- dbNameWithoutBackTicks,
167
- " " ,
168
- expectedLocation,
169
- Map .empty))
170
-
171
- val message = intercept[AnalysisException ] {
184
+ withTempDir { tmpDir =>
185
+ val path = tmpDir.toString
186
+ withSQLConf(SQLConf .WAREHOUSE_PATH .key -> path) {
187
+ val catalog = sqlContext.sessionState.catalog
188
+ val databaseNames = Seq (" db1" , " `database`" )
189
+
190
+ databaseNames.foreach { dbName =>
191
+ try {
192
+ val dbNameWithoutBackTicks = cleanIdentifier(dbName)
172
193
sql(s " CREATE DATABASE $dbName" )
173
- }.getMessage
174
- assert(message.contains(s " Database ' $dbNameWithoutBackTicks' already exists. " ))
175
- } finally {
176
- catalog.reset()
194
+ val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
195
+ val expectedLocation =
196
+ " file:" + appendTrailingSlash(path) + s " $dbNameWithoutBackTicks.db "
197
+ assert(db1 == CatalogDatabase (
198
+ dbNameWithoutBackTicks,
199
+ " " ,
200
+ expectedLocation,
201
+ Map .empty))
202
+
203
+ val message = intercept[AnalysisException ] {
204
+ sql(s " CREATE DATABASE $dbName" )
205
+ }.getMessage
206
+ assert(message.contains(s " Database ' $dbNameWithoutBackTicks' already exists. " ))
207
+ } finally {
208
+ catalog.reset()
209
+ }
177
210
}
178
211
}
179
212
}
180
213
}
181
214
182
215
test(" Alter/Describe Database" ) {
183
- withSQLConf(
184
- SQLConf .WAREHOUSE_PATH .key -> (System .getProperty(" java.io.tmpdir" ) + File .separator)) {
185
- val catalog = sqlContext.sessionState.catalog
186
- val databaseNames = Seq (" db1" , " `database`" )
216
+ withTempDir { tmpDir =>
217
+ val path = tmpDir.toString
218
+ withSQLConf(SQLConf .WAREHOUSE_PATH .key -> path) {
219
+ val catalog = sqlContext.sessionState.catalog
220
+ val databaseNames = Seq (" db1" , " `database`" )
187
221
188
- databaseNames.foreach { dbName =>
189
- try {
190
- val dbNameWithoutBackTicks = cleanIdentifier(dbName)
191
- val location =
192
- " file:" + System .getProperty(" java.io.tmpdir" ) +
193
- File .separator + s " $dbNameWithoutBackTicks.db "
194
-
195
- sql(s " CREATE DATABASE $dbName" )
196
-
197
- checkAnswer(
198
- sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
199
- Row (" Database Name" , dbNameWithoutBackTicks) ::
200
- Row (" Description" , " " ) ::
201
- Row (" Location" , location) ::
202
- Row (" Properties" , " " ) :: Nil )
203
-
204
- sql(s " ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c') " )
205
-
206
- checkAnswer(
207
- sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
208
- Row (" Database Name" , dbNameWithoutBackTicks) ::
209
- Row (" Description" , " " ) ::
210
- Row (" Location" , location) ::
211
- Row (" Properties" , " ((a,a), (b,b), (c,c))" ) :: Nil )
212
-
213
- sql(s " ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d') " )
214
-
215
- checkAnswer(
216
- sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
217
- Row (" Database Name" , dbNameWithoutBackTicks) ::
218
- Row (" Description" , " " ) ::
219
- Row (" Location" , location) ::
220
- Row (" Properties" , " ((a,a), (b,b), (c,c), (d,d))" ) :: Nil )
221
- } finally {
222
- catalog.reset()
222
+ databaseNames.foreach { dbName =>
223
+ try {
224
+ val dbNameWithoutBackTicks = cleanIdentifier(dbName)
225
+ val location = " file:" + appendTrailingSlash(path) + s " $dbNameWithoutBackTicks.db "
226
+
227
+ sql(s " CREATE DATABASE $dbName" )
228
+
229
+ checkAnswer(
230
+ sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
231
+ Row (" Database Name" , dbNameWithoutBackTicks) ::
232
+ Row (" Description" , " " ) ::
233
+ Row (" Location" , location) ::
234
+ Row (" Properties" , " " ) :: Nil )
235
+
236
+ sql(s " ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c') " )
237
+
238
+ checkAnswer(
239
+ sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
240
+ Row (" Database Name" , dbNameWithoutBackTicks) ::
241
+ Row (" Description" , " " ) ::
242
+ Row (" Location" , location) ::
243
+ Row (" Properties" , " ((a,a), (b,b), (c,c))" ) :: Nil )
244
+
245
+ sql(s " ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d') " )
246
+
247
+ checkAnswer(
248
+ sql(s " DESCRIBE DATABASE EXTENDED $dbName" ),
249
+ Row (" Database Name" , dbNameWithoutBackTicks) ::
250
+ Row (" Description" , " " ) ::
251
+ Row (" Location" , location) ::
252
+ Row (" Properties" , " ((a,a), (b,b), (c,c), (d,d))" ) :: Nil )
253
+ } finally {
254
+ catalog.reset()
255
+ }
223
256
}
224
257
}
225
258
}
@@ -251,7 +284,43 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
251
284
}
252
285
}
253
286
254
- // TODO: test drop database in restrict mode
287
+ test(" drop non-empty database in restrict mode" ) {
288
+ val catalog = sqlContext.sessionState.catalog
289
+ val dbName = " db1"
290
+ sql(s " CREATE DATABASE $dbName" )
291
+
292
+ // create a table in database
293
+ val tableIdent1 = TableIdentifier (" tab1" , Some (dbName))
294
+ createTable(catalog, tableIdent1)
295
+
296
+ // drop a non-empty database in Restrict mode
297
+ val message = intercept[AnalysisException ] {
298
+ sql(s " DROP DATABASE $dbName RESTRICT " )
299
+ }.getMessage
300
+ assert(message.contains(s " Database ' $dbName' is not empty. One or more tables exist " ))
301
+
302
+ catalog.dropTable(tableIdent1, ignoreIfNotExists = false )
303
+
304
+ assert(catalog.listDatabases().contains(dbName))
305
+ sql(s " DROP DATABASE $dbName RESTRICT " )
306
+ assert(! catalog.listDatabases().contains(dbName))
307
+ }
308
+
309
+ test(" drop non-empty database in cascade mode" ) {
310
+ val catalog = sqlContext.sessionState.catalog
311
+ val dbName = " db1"
312
+ sql(s " CREATE DATABASE $dbName" )
313
+
314
+ // create a table in database
315
+ val tableIdent1 = TableIdentifier (" tab1" , Some (dbName))
316
+ createTable(catalog, tableIdent1)
317
+
318
+ // drop a non-empty database in CASCADE mode
319
+ assert(catalog.listTables(dbName).contains(tableIdent1))
320
+ assert(catalog.listDatabases().contains(dbName))
321
+ sql(s " DROP DATABASE $dbName CASCADE " )
322
+ assert(! catalog.listDatabases().contains(dbName))
323
+ }
255
324
256
325
test(" create table in default db" ) {
257
326
val catalog = sqlContext.sessionState.catalog
0 commit comments