aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgatorsmile <gatorsmile@gmail.com>2016-04-11 22:33:05 -0700
committerYin Huai <yhuai@databricks.com>2016-04-11 22:33:05 -0700
commit2d81ba542e12db65c2bd67357093244be9403102 (patch)
treeda123970ca7c8136525ec64ff95a9c6e943ef6c7
parent83fb96403bcfb1566e9d765690744824724737ac (diff)
downloadspark-2d81ba542e12db65c2bd67357093244be9403102.tar.gz
spark-2d81ba542e12db65c2bd67357093244be9403102.tar.bz2
spark-2d81ba542e12db65c2bd67357093244be9403102.zip
[SPARK-14362][SPARK-14406][SQL][FOLLOW-UP] DDL Native Support: Drop View and Drop Table
#### What changes were proposed in this pull request? In this PR, we are trying to address the comment in the original PR: https://github.com/apache/spark/commit/dfce9665c4b2b29a19e6302216dae2800da68ff9#commitcomment-17057030 In this PR, we checks if table/view exists at the beginning and then does not need to capture the exceptions, including `NoSuchTableException` and `InvalidTableException`. We still capture the NonFatal exception when doing `sqlContext.cacheManager.tryUncacheQuery`. #### How was this patch tested? The existing test cases should cover the code changes of this PR. Author: gatorsmile <gatorsmile@gmail.com> Closes #12321 from gatorsmile/dropViewFollowup.
-rw-r--r--sql/core/src/main/scala/org/apache/spark/sql/execution/command/ddl.scala50
1 files changed, 26 insertions, 24 deletions
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/ddl.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/ddl.scala
index c55b1a690e..758a7e45d2 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/ddl.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/ddl.scala
@@ -17,6 +17,8 @@
package org.apache.spark.sql.execution.command
+import scala.util.control.NonFatal
+
import org.apache.spark.internal.Logging
import org.apache.spark.sql.{AnalysisException, Row, SQLContext}
import org.apache.spark.sql.catalyst.TableIdentifier
@@ -192,31 +194,31 @@ case class DropTable(
override def run(sqlContext: SQLContext): Seq[Row] = {
val catalog = sqlContext.sessionState.catalog
- // If the command DROP VIEW is to drop a table or DROP TABLE is to drop a view
- // issue an exception.
- catalog.getTableMetadataOption(tableName).map(_.tableType match {
- case CatalogTableType.VIRTUAL_VIEW if !isView =>
- throw new AnalysisException(
- "Cannot drop a view with DROP TABLE. Please use DROP VIEW instead")
- case o if o != CatalogTableType.VIRTUAL_VIEW && isView =>
- throw new AnalysisException(
- s"Cannot drop a table with DROP VIEW. Please use DROP TABLE instead")
- case _ =>
- })
-
- try {
- sqlContext.cacheManager.tryUncacheQuery(sqlContext.table(tableName.quotedString))
- } catch {
- // This table's metadata is not in Hive metastore (e.g. the table does not exist).
- case e if e.getClass.getName == "org.apache.hadoop.hive.ql.metadata.InvalidTableException" =>
- case _: org.apache.spark.sql.catalyst.analysis.NoSuchTableException =>
- // Other Throwables can be caused by users providing wrong parameters in OPTIONS
- // (e.g. invalid paths). We catch it and log a warning message.
- // Users should be able to drop such kinds of tables regardless if there is an error.
- case e: Throwable => log.warn(s"${e.getMessage}", e)
+ if (!catalog.tableExists(tableName)) {
+ if (!ifExists) {
+ val objectName = if (isView) "View" else "Table"
+ logError(s"$objectName '${tableName.quotedString}' does not exist")
+ }
+ } else {
+ // If the command DROP VIEW is to drop a table or DROP TABLE is to drop a view
+ // issue an exception.
+ catalog.getTableMetadataOption(tableName).map(_.tableType match {
+ case CatalogTableType.VIRTUAL_VIEW if !isView =>
+ throw new AnalysisException(
+ "Cannot drop a view with DROP TABLE. Please use DROP VIEW instead")
+ case o if o != CatalogTableType.VIRTUAL_VIEW && isView =>
+ throw new AnalysisException(
+ s"Cannot drop a table with DROP VIEW. Please use DROP TABLE instead")
+ case _ =>
+ })
+ try {
+ sqlContext.cacheManager.tryUncacheQuery(sqlContext.table(tableName.quotedString))
+ } catch {
+ case NonFatal(e) => log.warn(s"${e.getMessage}", e)
+ }
+ catalog.invalidateTable(tableName)
+ catalog.dropTable(tableName, ifExists)
}
- catalog.invalidateTable(tableName)
- catalog.dropTable(tableName, ifExists)
Seq.empty[Row]
}
}