aboutsummaryrefslogtreecommitdiff
path: root/sql/hive
diff options
context:
space:
mode:
authorgatorsmile <gatorsmile@gmail.com>2016-05-05 14:34:24 -0700
committerAndrew Or <andrew@databricks.com>2016-05-05 14:34:24 -0700
commit8cba57a75cf9e29b54d97366a039a97a2f305d5d (patch)
treeb9cb57154348cd0242deeff9a78e346e7b04aaa6 /sql/hive
parent63db2bd283a430971d85f2a7b06dac77723c56fa (diff)
downloadspark-8cba57a75cf9e29b54d97366a039a97a2f305d5d.tar.gz
spark-8cba57a75cf9e29b54d97366a039a97a2f305d5d.tar.bz2
spark-8cba57a75cf9e29b54d97366a039a97a2f305d5d.zip
[SPARK-14124][SQL][FOLLOWUP] Implement Database-related DDL Commands
#### What changes were proposed in this pull request? First, a few test cases failed in mac OS X because the property value of `java.io.tmpdir` does not include a trailing slash on some platform. Hive always removes the last trailing slash. For example, what I got in the web: ``` Win NT --> C:\TEMP\ Win XP --> C:\TEMP Solaris --> /var/tmp/ Linux --> /var/tmp ``` Second, a couple of test cases are added to verify if the commands work properly. #### How was this patch tested? Added a test case for it and correct the previous test cases. Author: gatorsmile <gatorsmile@gmail.com> Author: xiaoli <lixiao1983@gmail.com> Author: Xiao Li <xiaoli@Xiaos-MacBook-Pro.local> Closes #12081 from gatorsmile/mkdir.
Diffstat (limited to 'sql/hive')
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala150
1 files changed, 144 insertions, 6 deletions
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
index 373d1a1e0e..d55ddb251d 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
@@ -20,21 +20,37 @@ package org.apache.spark.sql.hive.execution
import java.io.File
import org.apache.hadoop.fs.Path
+import org.scalatest.BeforeAndAfterEach
import org.apache.spark.sql.{AnalysisException, QueryTest, SaveMode}
-import org.apache.spark.sql.catalyst.catalog.CatalogTableType
+import org.apache.spark.sql.catalyst.catalog.{CatalogDatabase, CatalogTableType}
import org.apache.spark.sql.catalyst.TableIdentifier
import org.apache.spark.sql.hive.test.TestHiveSingleton
import org.apache.spark.sql.internal.SQLConf
import org.apache.spark.sql.test.SQLTestUtils
-class HiveDDLSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
+class HiveDDLSuite
+ extends QueryTest with SQLTestUtils with TestHiveSingleton with BeforeAndAfterEach {
import hiveContext.implicits._
+ override def afterEach(): Unit = {
+ try {
+ // drop all databases, tables and functions after each test
+ sqlContext.sessionState.catalog.reset()
+ } finally {
+ super.afterEach()
+ }
+ }
// check if the directory for recording the data of the table exists.
- private def tableDirectoryExists(tableIdentifier: TableIdentifier): Boolean = {
+ private def tableDirectoryExists(
+ tableIdentifier: TableIdentifier,
+ dbPath: Option[String] = None): Boolean = {
val expectedTablePath =
- hiveContext.sessionState.catalog.hiveDefaultTableFilePath(tableIdentifier)
+ if (dbPath.isEmpty) {
+ hiveContext.sessionState.catalog.hiveDefaultTableFilePath(tableIdentifier)
+ } else {
+ new Path(new Path(dbPath.get), tableIdentifier.table).toString
+ }
val filesystemPath = new Path(expectedTablePath)
val fs = filesystemPath.getFileSystem(hiveContext.sessionState.newHadoopConf())
fs.exists(filesystemPath)
@@ -56,7 +72,7 @@ class HiveDDLSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
}
}
- test("drop managed tables") {
+ test("drop managed tables in default database") {
withTempDir { tmpDir =>
val tabName = "tab1"
withTable(tabName) {
@@ -83,7 +99,7 @@ class HiveDDLSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
}
}
- test("drop external data source table") {
+ test("drop external data source table in default database") {
withTempDir { tmpDir =>
val tabName = "tab1"
withTable(tabName) {
@@ -365,4 +381,126 @@ class HiveDDLSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
.exists(_.getString(0) == "# Detailed Table Information"))
}
}
+
+ private def createDatabaseWithLocation(tmpDir: File, dirExists: Boolean): Unit = {
+ val catalog = sqlContext.sessionState.catalog
+ val dbName = "db1"
+ val tabName = "tab1"
+ val fs = new Path(tmpDir.toString).getFileSystem(hiveContext.sessionState.newHadoopConf())
+ withTable(tabName) {
+ if (dirExists) {
+ assert(tmpDir.listFiles.isEmpty)
+ } else {
+ assert(!fs.exists(new Path(tmpDir.toString)))
+ }
+ sql(s"CREATE DATABASE $dbName Location '$tmpDir'")
+ val db1 = catalog.getDatabaseMetadata(dbName)
+ val dbPath = "file:" + tmpDir
+ assert(db1 == CatalogDatabase(
+ dbName,
+ "",
+ if (dbPath.endsWith(File.separator)) dbPath.dropRight(1) else dbPath,
+ Map.empty))
+ sql("USE db1")
+
+ sql(s"CREATE TABLE $tabName as SELECT 1")
+ assert(tableDirectoryExists(TableIdentifier(tabName), Option(tmpDir.toString)))
+
+ assert(tmpDir.listFiles.nonEmpty)
+ sql(s"DROP TABLE $tabName")
+
+ assert(tmpDir.listFiles.isEmpty)
+ sql(s"DROP DATABASE $dbName")
+ assert(!fs.exists(new Path(tmpDir.toString)))
+ }
+ }
+
+ test("create/drop database - location without pre-created directory") {
+ withTempPath { tmpDir =>
+ createDatabaseWithLocation(tmpDir, dirExists = false)
+ }
+ }
+
+ test("create/drop database - location with pre-created directory") {
+ withTempDir { tmpDir =>
+ createDatabaseWithLocation(tmpDir, dirExists = true)
+ }
+ }
+
+ private def appendTrailingSlash(path: String): String = {
+ if (!path.endsWith(File.separator)) path + File.separator else path
+ }
+
+ private def dropDatabase(cascade: Boolean, tableExists: Boolean): Unit = {
+ withTempPath { tmpDir =>
+ val path = tmpDir.toString
+ withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) {
+ val dbName = "db1"
+ val fs = new Path(path).getFileSystem(hiveContext.sessionState.newHadoopConf())
+ val dbPath = new Path(path)
+ // the database directory does not exist
+ assert(!fs.exists(dbPath))
+
+ sql(s"CREATE DATABASE $dbName")
+ val catalog = sqlContext.sessionState.catalog
+ val expectedDBLocation = "file:" + appendTrailingSlash(dbPath.toString) + s"$dbName.db"
+ val db1 = catalog.getDatabaseMetadata(dbName)
+ assert(db1 == CatalogDatabase(
+ dbName,
+ "",
+ expectedDBLocation,
+ Map.empty))
+ // the database directory was created
+ assert(fs.exists(dbPath) && fs.isDirectory(dbPath))
+ sql(s"USE $dbName")
+
+ val tabName = "tab1"
+ assert(!tableDirectoryExists(TableIdentifier(tabName), Option(expectedDBLocation)))
+ sql(s"CREATE TABLE $tabName as SELECT 1")
+ assert(tableDirectoryExists(TableIdentifier(tabName), Option(expectedDBLocation)))
+
+ if (!tableExists) {
+ sql(s"DROP TABLE $tabName")
+ assert(!tableDirectoryExists(TableIdentifier(tabName), Option(expectedDBLocation)))
+ }
+
+ val sqlDropDatabase = s"DROP DATABASE $dbName ${if (cascade) "CASCADE" else "RESTRICT"}"
+ if (tableExists && !cascade) {
+ val message = intercept[AnalysisException] {
+ sql(sqlDropDatabase)
+ }.getMessage
+ assert(message.contains(s"Database $dbName is not empty. One or more tables exist."))
+ // the database directory was not removed
+ assert(fs.exists(new Path(expectedDBLocation)))
+ } else {
+ sql(sqlDropDatabase)
+ // the database directory was removed and the inclusive table directories are also removed
+ assert(!fs.exists(new Path(expectedDBLocation)))
+ }
+ }
+ }
+ }
+
+ test("drop database containing tables - CASCADE") {
+ dropDatabase(cascade = true, tableExists = true)
+ }
+
+ test("drop an empty database - CASCADE") {
+ dropDatabase(cascade = true, tableExists = false)
+ }
+
+ test("drop database containing tables - RESTRICT") {
+ dropDatabase(cascade = false, tableExists = true)
+ }
+
+ test("drop an empty database - RESTRICT") {
+ dropDatabase(cascade = false, tableExists = false)
+ }
+
+ test("drop default database") {
+ val message = intercept[AnalysisException] {
+ sql("DROP DATABASE default")
+ }.getMessage
+ assert(message.contains("Can not drop default database"))
+ }
}