Repository: spark
Updated Branches:
  refs/heads/master 7bf8a4049 -> 0a8e51a5e


[SPARK-17657][SQL] Disallow Users to Change Table Type

### What changes were proposed in this pull request?
Hive allows users to change the table type from `Managed` to `External` or from 
`External` to `Managed` by altering table's property `EXTERNAL`. See the JIRA: 
https://issues.apache.org/jira/browse/HIVE-1329

So far, Spark SQL does not correctly support it, although users can do it. Many 
assumptions are broken in the implementation. Thus, this PR is to disallow 
users to change it.

In addition, we also do not allow users to set the property `EXTERNAL` when 
creating a table.

### How was this patch tested?
Added test cases

Author: gatorsmile <gatorsm...@gmail.com>

Closes #15230 from gatorsmile/alterTableSetExternal.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/0a8e51a5
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/0a8e51a5
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/0a8e51a5

Branch: refs/heads/master
Commit: 0a8e51a5e4cfd3275eff12e9fbbeb3fb487990aa
Parents: 7bf8a40
Author: gatorsmile <gatorsm...@gmail.com>
Authored: Thu Oct 13 21:36:39 2016 +0800
Committer: Wenchen Fan <wenc...@databricks.com>
Committed: Thu Oct 13 21:36:39 2016 +0800

----------------------------------------------------------------------
 .../spark/sql/hive/HiveExternalCatalog.scala    |  5 +++
 .../spark/sql/hive/execution/HiveDDLSuite.scala | 32 ++++++++++++++++++++
 2 files changed, 37 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/0a8e51a5/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveExternalCatalog.scala
----------------------------------------------------------------------
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 ed18972..237b829 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
@@ -112,6 +112,11 @@ private[spark] class HiveExternalCatalog(conf: SparkConf, 
hadoopConf: Configurat
         s"as table property keys may not start with '$DATASOURCE_PREFIX' or 
'$STATISTICS_PREFIX':" +
         s" ${invalidKeys.mkString("[", ", ", "]")}")
     }
+    // External users are not allowed to set/switch the table type. In Hive 
metastore, the table
+    // type can be switched by changing the value of a case-sensitive table 
property `EXTERNAL`.
+    if (table.properties.contains("EXTERNAL")) {
+      throw new AnalysisException("Cannot set or change the preserved property 
key: 'EXTERNAL'")
+    }
   }
 
   // --------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/spark/blob/0a8e51a5/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
----------------------------------------------------------------------
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 8bff6de..3d1712e 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
@@ -315,6 +315,38 @@ class HiveDDLSuite
     assert(message.contains("Cannot alter a table with ALTER VIEW. Please use 
ALTER TABLE instead"))
   }
 
+  test("create table - SET TBLPROPERTIES EXTERNAL to TRUE") {
+    val tabName = "tab1"
+    withTable(tabName) {
+      val message = intercept[AnalysisException] {
+        sql(s"CREATE TABLE $tabName (height INT, length INT) 
TBLPROPERTIES('EXTERNAL'='TRUE')")
+      }.getMessage
+      assert(message.contains("Cannot set or change the preserved property 
key: 'EXTERNAL'"))
+    }
+  }
+
+  test("alter table - SET TBLPROPERTIES EXTERNAL to TRUE") {
+    val tabName = "tab1"
+    withTable(tabName) {
+      val catalog = spark.sessionState.catalog
+      sql(s"CREATE TABLE $tabName (height INT, length INT)")
+      assert(
+        catalog.getTableMetadata(TableIdentifier(tabName)).tableType == 
CatalogTableType.MANAGED)
+      val message = intercept[AnalysisException] {
+        sql(s"ALTER TABLE $tabName SET TBLPROPERTIES ('EXTERNAL' = 'TRUE')")
+      }.getMessage
+      assert(message.contains("Cannot set or change the preserved property 
key: 'EXTERNAL'"))
+      // The table type is not changed to external
+      assert(
+        catalog.getTableMetadata(TableIdentifier(tabName)).tableType == 
CatalogTableType.MANAGED)
+      // The table property is case sensitive. Thus, external is allowed
+      sql(s"ALTER TABLE $tabName SET TBLPROPERTIES ('external' = 'TRUE')")
+      // The table type is not changed to external
+      assert(
+        catalog.getTableMetadata(TableIdentifier(tabName)).tableType == 
CatalogTableType.MANAGED)
+    }
+  }
+
   test("alter views and alter table - misuse") {
     val tabName = "tab1"
     withTable(tabName) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to