aboutsummaryrefslogtreecommitdiff
path: root/sql/hive
diff options
context:
space:
mode:
authorWenchen Fan <wenchen@databricks.com>2016-08-31 17:08:08 +0800
committerWenchen Fan <wenchen@databricks.com>2016-08-31 17:08:08 +0800
commit12fd0cd615683cd4c3e9094ce71a1e6fc33b8d6a (patch)
treef94ec14cb9c9b9c483de9e4b60c72e6e3920e7ba /sql/hive
parentfa6347938fc1c72ddc03a5f3cd2e929b5694f0a6 (diff)
downloadspark-12fd0cd615683cd4c3e9094ce71a1e6fc33b8d6a.tar.gz
spark-12fd0cd615683cd4c3e9094ce71a1e6fc33b8d6a.tar.bz2
spark-12fd0cd615683cd4c3e9094ce71a1e6fc33b8d6a.zip
[SPARK-17180][SPARK-17309][SPARK-17323][SQL] create AlterViewAsCommand to handle ALTER VIEW AS
## What changes were proposed in this pull request? Currently we use `CreateViewCommand` to implement ALTER VIEW AS, which has 3 bugs: 1. SPARK-17180: ALTER VIEW AS should alter temp view if view name has no database part and temp view exists 2. SPARK-17309: ALTER VIEW AS should issue exception if view does not exist. 3. SPARK-17323: ALTER VIEW AS should keep the previous table properties, comment, create_time, etc. The root cause is, ALTER VIEW AS is quite different from CREATE VIEW, we need different code path to handle them. However, in `CreateViewCommand`, there is no way to distinguish ALTER VIEW AS and CREATE VIEW, we have to introduce extra flag. But instead of doing this, I think a more natural way is to separate the ALTER VIEW AS logic into a new command. ## How was this patch tested? new tests in SQLViewSuite Author: Wenchen Fan <wenchen@databricks.com> Closes #14874 from cloud-fan/minor4.
Diffstat (limited to 'sql/hive')
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLViewSuite.scala77
1 files changed, 74 insertions, 3 deletions
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLViewSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLViewSuite.scala
index 6a80664417..bc999d4724 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLViewSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLViewSuite.scala
@@ -18,6 +18,8 @@
package org.apache.spark.sql.hive.execution
import org.apache.spark.sql.{AnalysisException, QueryTest, Row, SaveMode}
+import org.apache.spark.sql.catalyst.TableIdentifier
+import org.apache.spark.sql.catalyst.analysis.NoSuchTableException
import org.apache.spark.sql.hive.test.TestHiveSingleton
import org.apache.spark.sql.test.SQLTestUtils
@@ -60,15 +62,15 @@ class SQLViewSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
var e = intercept[AnalysisException] {
sql("CREATE OR REPLACE VIEW tab1 AS SELECT * FROM jt")
}.getMessage
- assert(e.contains("The following is an existing table, not a view: `default`.`tab1`"))
+ assert(e.contains("`default`.`tab1` is not a view"))
e = intercept[AnalysisException] {
sql("CREATE VIEW tab1 AS SELECT * FROM jt")
}.getMessage
- assert(e.contains("The following is an existing table, not a view: `default`.`tab1`"))
+ assert(e.contains("`default`.`tab1` is not a view"))
e = intercept[AnalysisException] {
sql("ALTER VIEW tab1 AS SELECT * FROM jt")
}.getMessage
- assert(e.contains("The following is an existing table, not a view: `default`.`tab1`"))
+ assert(e.contains("`default`.`tab1` is not a view"))
}
}
@@ -274,6 +276,75 @@ class SQLViewSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
}
}
+ test("should not allow ALTER VIEW AS when the view does not exist") {
+ intercept[NoSuchTableException](
+ sql("ALTER VIEW testView AS SELECT 1, 2")
+ )
+
+ intercept[NoSuchTableException](
+ sql("ALTER VIEW default.testView AS SELECT 1, 2")
+ )
+ }
+
+ test("ALTER VIEW AS should try to alter temp view first if view name has no database part") {
+ withView("test_view") {
+ withTempView("test_view") {
+ sql("CREATE VIEW test_view AS SELECT 1 AS a, 2 AS b")
+ sql("CREATE TEMP VIEW test_view AS SELECT 1 AS a, 2 AS b")
+
+ sql("ALTER VIEW test_view AS SELECT 3 AS i, 4 AS j")
+
+ // The temporary view should be updated.
+ checkAnswer(spark.table("test_view"), Row(3, 4))
+
+ // The permanent view should stay same.
+ checkAnswer(spark.table("default.test_view"), Row(1, 2))
+ }
+ }
+ }
+
+ test("ALTER VIEW AS should alter permanent view if view name has database part") {
+ withView("test_view") {
+ withTempView("test_view") {
+ sql("CREATE VIEW test_view AS SELECT 1 AS a, 2 AS b")
+ sql("CREATE TEMP VIEW test_view AS SELECT 1 AS a, 2 AS b")
+
+ sql("ALTER VIEW default.test_view AS SELECT 3 AS i, 4 AS j")
+
+ // The temporary view should stay same.
+ checkAnswer(spark.table("test_view"), Row(1, 2))
+
+ // The permanent view should be updated.
+ checkAnswer(spark.table("default.test_view"), Row(3, 4))
+ }
+ }
+ }
+
+ test("ALTER VIEW AS should keep the previous table properties, comment, create_time, etc.") {
+ withView("test_view") {
+ sql(
+ """
+ |CREATE VIEW test_view
+ |COMMENT 'test'
+ |TBLPROPERTIES ('key' = 'a')
+ |AS SELECT 1 AS a, 2 AS b
+ """.stripMargin)
+
+ val catalog = spark.sessionState.catalog
+ val viewMeta = catalog.getTableMetadata(TableIdentifier("test_view"))
+ assert(viewMeta.comment == Some("test"))
+ assert(viewMeta.properties("key") == "a")
+
+ sql("ALTER VIEW test_view AS SELECT 3 AS i, 4 AS j")
+ val updatedViewMeta = catalog.getTableMetadata(TableIdentifier("test_view"))
+ assert(updatedViewMeta.comment == Some("test"))
+ assert(updatedViewMeta.properties("key") == "a")
+ assert(updatedViewMeta.createTime == viewMeta.createTime)
+ // The view should be updated.
+ checkAnswer(spark.table("test_view"), Row(3, 4))
+ }
+ }
+
test("create hive view for json table") {
// json table is not hive-compatible, make sure the new flag fix it.
withView("testView") {