From 8f20e5ad4798170154385edcd7a54456ff8c3148 Mon Sep 17 00:00:00 2001 From: gatorsmile Date: Fri, 25 Mar 2016 11:21:24 -0700 Subject: [PATCH 1/4] native DDL parsing for Drop Database --- .../apache/spark/sql/execution/SparkQl.scala | 14 +++++ .../spark/sql/execution/command/ddl.scala | 6 ++ .../execution/command/DDLCommandSuite.scala | 57 +++++++++++++++++++ .../org/apache/spark/sql/hive/HiveQl.scala | 1 - 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkQl.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkQl.scala index ef30ba0cdbf55..b9542c7173505 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkQl.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkQl.scala @@ -128,6 +128,20 @@ private[sql] class SparkQl(conf: ParserConf = SimpleParserConf()) extends Cataly }.toMap CreateDatabase(databaseName, ifNotExists.isDefined, location, comment, props)(node.source) + // DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE]; + case Token("TOK_DROPDATABASE", Token(dbName, Nil) :: otherArgs) => + // Example format: + // + // TOK_DROPDATABASE + // :- database_name + // :- TOK_IFEXISTS + // +- TOK_RESTRICT/TOK_CASCADE + val databaseName = unquoteString(dbName) + // The default is RESTRICT + val Seq(ifExists, _, cascade) = getClauses(Seq( + "TOK_IFEXISTS", "TOK_RESTRICT", "TOK_CASCADE"), otherArgs) + DropDatabase(databaseName, ifExists.isDefined, restrict = cascade.isEmpty)(node.source) + // CREATE [TEMPORARY] FUNCTION [db_name.]function_name AS class_name // [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ]; case Token("TOK_CREATEFUNCTION", args) => 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 07c89afafb6b6..dd82db3d282bc 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 @@ -52,6 +52,12 @@ case class CreateDatabase( props: Map[String, String])(sql: String) extends NativeDDLCommand(sql) with Logging +case class DropDatabase( + databaseName: String, + ifExists: Boolean, + restrict: Boolean)(sql: String) + extends NativeDDLCommand(sql) with Logging + case class CreateFunction( functionName: String, alias: String, diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala index 6f1eea273fafa..a33175aa60b5b 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala @@ -44,6 +44,63 @@ class DDLCommandSuite extends PlanTest { comparePlans(parsed, expected) } + test("drop database") { + val sql1 = "DROP DATABASE IF EXISTS database_name RESTRICT" + val sql2 = "DROP DATABASE IF EXISTS database_name CASCADE" + val sql3 = "DROP SCHEMA IF EXISTS database_name RESTRICT" + val sql4 = "DROP SCHEMA IF EXISTS database_name CASCADE" + // The default is restrict=true + val sql5 = "DROP DATABASE IF EXISTS database_name" + // The default is ifExists=false + val sql6 = "DROP DATABASE database_name" + val sql7 = "DROP DATABASE database_name CASCADE" + + val parsed1 = parser.parsePlan(sql1) + val parsed2 = parser.parsePlan(sql2) + val parsed3 = parser.parsePlan(sql3) + val parsed4 = parser.parsePlan(sql4) + val parsed5 = parser.parsePlan(sql5) + val parsed6 = parser.parsePlan(sql6) + val parsed7 = parser.parsePlan(sql7) + + val expected1 = DropDatabase( + "database_name", + ifExists = true, + restrict = true)(sql1) + val expected2 = DropDatabase( + "database_name", + ifExists = true, + restrict = false)(sql2) + val expected3 = DropDatabase( + "database_name", + ifExists = true, + restrict = true)(sql3) + val expected4 = DropDatabase( + "database_name", + ifExists = true, + restrict = false)(sql4) + val expected5 = DropDatabase( + "database_name", + ifExists = true, + restrict = true)(sql5) + val expected6 = DropDatabase( + "database_name", + ifExists = false, + restrict = true)(sql6) + val expected7 = DropDatabase( + "database_name", + ifExists = false, + restrict = false)(sql7) + + comparePlans(parsed1, expected1) + comparePlans(parsed2, expected2) + comparePlans(parsed3, expected3) + comparePlans(parsed4, expected4) + comparePlans(parsed5, expected5) + comparePlans(parsed6, expected6) + comparePlans(parsed7, expected7) + } + test("create function") { val sql1 = """ diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveQl.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveQl.scala index e802d3dfc3866..6586b90377eb7 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveQl.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveQl.scala @@ -102,7 +102,6 @@ private[hive] class HiveQl(conf: ParserConf) extends SparkQl(conf) with Logging "TOK_DESCDATABASE", - "TOK_DROPDATABASE", "TOK_DROPFUNCTION", "TOK_DROPINDEX", "TOK_DROPMACRO", From dd0d82b8a924b4bced85215a23e5975ea577effe Mon Sep 17 00:00:00 2001 From: gatorsmile Date: Fri, 25 Mar 2016 16:40:51 -0700 Subject: [PATCH 2/4] add comments. --- .../org/apache/spark/sql/execution/command/ddl.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 dd82db3d282bc..5fc97c3be5502 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 @@ -52,6 +52,16 @@ case class CreateDatabase( props: Map[String, String])(sql: String) extends NativeDDLCommand(sql) with Logging +// Drop Database DDL: +// +// ifExists: +// - true, if database_name does't exist, no action +// - false (default), if database_name does't exist, a warning message will be issued +// restric: +// - true (default), the database cannot be dropped if it is not empty. The inclusive +// tables must be dropped at first. +// - false, it is in the Cascade mode. The dependent objects are automatically dropped +// before dropping database. case class DropDatabase( databaseName: String, ifExists: Boolean, From e162cf71547bcd5efb293bbb0a93f9433a108ba4 Mon Sep 17 00:00:00 2001 From: gatorsmile Date: Fri, 25 Mar 2016 23:48:01 -0700 Subject: [PATCH 3/4] update the comment. --- .../spark/sql/execution/command/ddl.scala | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 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 5fc97c3be5502..87fc45ab910e8 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 @@ -52,16 +52,18 @@ case class CreateDatabase( props: Map[String, String])(sql: String) extends NativeDDLCommand(sql) with Logging -// Drop Database DDL: -// -// ifExists: -// - true, if database_name does't exist, no action -// - false (default), if database_name does't exist, a warning message will be issued -// restric: -// - true (default), the database cannot be dropped if it is not empty. The inclusive -// tables must be dropped at first. -// - false, it is in the Cascade mode. The dependent objects are automatically dropped -// before dropping database. +/** + * Drop Database: Removes a database from the system. + * + * 'ifExists': + * - true, if database_name does't exist, no action + * - false (default), if database_name does't exist, a warning message will be issued + * `restric`: + * - true (default), the database cannot be dropped if it is not empty. The inclusive + * tables must be dropped at first. + * - false, it is in the Cascade mode. The dependent objects are automatically dropped + * before dropping database. + */ case class DropDatabase( databaseName: String, ifExists: Boolean, From 598a6b68a33f35b0b53cfc9fc7db85b8f6abafc1 Mon Sep 17 00:00:00 2001 From: gatorsmile Date: Fri, 25 Mar 2016 23:48:16 -0700 Subject: [PATCH 4/4] update the comment. --- .../main/scala/org/apache/spark/sql/execution/command/ddl.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 87fc45ab910e8..373b557683f15 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 @@ -58,7 +58,7 @@ case class CreateDatabase( * 'ifExists': * - true, if database_name does't exist, no action * - false (default), if database_name does't exist, a warning message will be issued - * `restric`: + * 'restric': * - true (default), the database cannot be dropped if it is not empty. The inclusive * tables must be dropped at first. * - false, it is in the Cascade mode. The dependent objects are automatically dropped