aboutsummaryrefslogtreecommitdiff
path: root/sql/core/src/test/scala
diff options
context:
space:
mode:
authorWenchen Fan <wenchen@databricks.com>2016-09-18 21:15:35 +0800
committerWenchen Fan <wenchen@databricks.com>2016-09-18 21:15:35 +0800
commit3fe630d314cf50d69868b7707ac8d8d2027080b8 (patch)
tree9108a526cf2d18ddec7c5e2278e38c3849a54773 /sql/core/src/test/scala
parent3a3c9ffbd282244407e9437c2b02ae7e062dd183 (diff)
downloadspark-3fe630d314cf50d69868b7707ac8d8d2027080b8.tar.gz
spark-3fe630d314cf50d69868b7707ac8d8d2027080b8.tar.bz2
spark-3fe630d314cf50d69868b7707ac8d8d2027080b8.zip
[SPARK-17541][SQL] fix some DDL bugs about table management when same-name temp view exists
## What changes were proposed in this pull request? In `SessionCatalog`, we have several operations(`tableExists`, `dropTable`, `loopupRelation`, etc) that handle both temp views and metastore tables/views. This brings some bugs to DDL commands that want to handle temp view only or metastore table/view only. These bugs are: 1. `CREATE TABLE USING` will fail if a same-name temp view exists 2. `Catalog.dropTempView`will un-cache and drop metastore table if a same-name table exists 3. `saveAsTable` will fail or have unexpected behaviour if a same-name temp view exists. These bug fixes are pulled out from https://github.com/apache/spark/pull/14962 and targets both master and 2.0 branch ## How was this patch tested? new regression tests Author: Wenchen Fan <wenchen@databricks.com> Closes #15099 from cloud-fan/fix-view.
Diffstat (limited to 'sql/core/src/test/scala')
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala11
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala11
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala76
3 files changed, 98 insertions, 0 deletions
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index 3cc3b319f5..0ee8c959ee 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -2667,4 +2667,15 @@ class SQLQuerySuite extends QueryTest with SharedSQLContext {
}.limit(1).queryExecution.toRdd.count()
assert(numRecordsRead.value === 10)
}
+
+ test("CREATE TABLE USING should not fail if a same-name temp view exists") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ spark.range(10).createTempView("same_name")
+ sql("CREATE TABLE same_name(i int) USING json")
+ checkAnswer(spark.table("same_name"), spark.range(10).toDF())
+ assert(spark.table("default.same_name").collect().isEmpty)
+ }
+ }
+ }
}
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala
index 549fd63f74..3dc67ffafb 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala
@@ -329,6 +329,17 @@ class CatalogSuite
assert(e.message.contains("Cannot create hive serde table with createExternalTable API"))
}
+ test("dropTempView should not un-cache and drop metastore table if a same-name table exists") {
+ withTable("same_name") {
+ spark.range(10).write.saveAsTable("same_name")
+ sql("CACHE TABLE same_name")
+ assert(spark.catalog.isCached("default.same_name"))
+ spark.catalog.dropTempView("same_name")
+ assert(spark.sessionState.catalog.tableExists(TableIdentifier("same_name", Some("default"))))
+ assert(spark.catalog.isCached("default.same_name"))
+ }
+ }
+
// TODO: add tests for the rest of them
}
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala
index 63b0e4588e..7368dad628 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala
@@ -22,6 +22,7 @@ import java.io.File
import org.scalatest.BeforeAndAfter
import org.apache.spark.sql._
+import org.apache.spark.sql.catalyst.TableIdentifier
import org.apache.spark.sql.sources._
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.util.Utils
@@ -464,4 +465,79 @@ class DataFrameReaderWriterSuite extends QueryTest with SharedSQLContext with Be
checkAnswer(df, spark.createDataset(expectedResult).toDF())
assert(df.schema === expectedSchema)
}
+
+ test("saveAsTable with mode Append should not fail if the table not exists " +
+ "but a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.Append).saveAsTable("same_name")
+ assert(
+ spark.sessionState.catalog.tableExists(TableIdentifier("same_name", Some("default"))))
+ }
+ }
+ }
+
+ test("saveAsTable with mode Append should not fail if the table already exists " +
+ "and a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ sql("CREATE TABLE same_name(id LONG) USING parquet")
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.Append).saveAsTable("same_name")
+ checkAnswer(spark.table("same_name"), spark.range(10).toDF())
+ checkAnswer(spark.table("default.same_name"), spark.range(20).toDF())
+ }
+ }
+ }
+
+ test("saveAsTable with mode ErrorIfExists should not fail if the table not exists " +
+ "but a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.ErrorIfExists).saveAsTable("same_name")
+ assert(
+ spark.sessionState.catalog.tableExists(TableIdentifier("same_name", Some("default"))))
+ }
+ }
+ }
+
+ test("saveAsTable with mode Overwrite should not drop the temp view if the table not exists " +
+ "but a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.Overwrite).saveAsTable("same_name")
+ assert(spark.sessionState.catalog.getTempView("same_name").isDefined)
+ assert(
+ spark.sessionState.catalog.tableExists(TableIdentifier("same_name", Some("default"))))
+ }
+ }
+ }
+
+ test("saveAsTable with mode Overwrite should not fail if the table already exists " +
+ "and a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ sql("CREATE TABLE same_name(id LONG) USING parquet")
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.Overwrite).saveAsTable("same_name")
+ checkAnswer(spark.table("same_name"), spark.range(10).toDF())
+ checkAnswer(spark.table("default.same_name"), spark.range(20).toDF())
+ }
+ }
+ }
+
+ test("saveAsTable with mode Ignore should create the table if the table not exists " +
+ "but a same-name temp view exist") {
+ withTable("same_name") {
+ withTempView("same_name") {
+ spark.range(10).createTempView("same_name")
+ spark.range(20).write.mode(SaveMode.Ignore).saveAsTable("same_name")
+ assert(
+ spark.sessionState.catalog.tableExists(TableIdentifier("same_name", Some("default"))))
+ }
+ }
+ }
}