aboutsummaryrefslogtreecommitdiff
path: root/sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala
diff options
context:
space:
mode:
Diffstat (limited to 'sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala')
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/execution/command/DDLCommandSuite.scala608
1 files changed, 353 insertions, 255 deletions
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 a33175aa60..d6ccaf9348 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
@@ -17,15 +17,24 @@
package org.apache.spark.sql.execution.command
+import org.apache.spark.sql.AnalysisException
import org.apache.spark.sql.catalyst.TableIdentifier
-import org.apache.spark.sql.catalyst.expressions.{Ascending, Descending}
+import org.apache.spark.sql.catalyst.parser.ParseException
import org.apache.spark.sql.catalyst.plans.PlanTest
-import org.apache.spark.sql.execution.SparkQl
-import org.apache.spark.sql.execution.datasources.BucketSpec
+import org.apache.spark.sql.catalyst.plans.logical.Project
+import org.apache.spark.sql.execution.SparkSqlParser
import org.apache.spark.sql.types._
+// TODO: merge this with DDLSuite (SPARK-14441)
class DDLCommandSuite extends PlanTest {
- private val parser = new SparkQl
+ private val parser = SparkSqlParser
+
+ private def assertUnsupported(sql: String): Unit = {
+ val e = intercept[AnalysisException] {
+ parser.parsePlan(sql)
+ }
+ assert(e.getMessage.toLowerCase.contains("operation not allowed"))
+ }
test("create database") {
val sql =
@@ -40,7 +49,7 @@ class DDLCommandSuite extends PlanTest {
ifNotExists = true,
Some("/home/user/db"),
Some("database_comment"),
- Map("a" -> "a", "b" -> "b", "c" -> "c"))(sql)
+ Map("a" -> "a", "b" -> "b", "c" -> "c"))
comparePlans(parsed, expected)
}
@@ -66,39 +75,65 @@ class DDLCommandSuite extends PlanTest {
val expected1 = DropDatabase(
"database_name",
ifExists = true,
- restrict = true)(sql1)
+ cascade = false)
val expected2 = DropDatabase(
"database_name",
ifExists = true,
- restrict = false)(sql2)
+ cascade = true)
val expected3 = DropDatabase(
"database_name",
- ifExists = true,
- restrict = true)(sql3)
+ ifExists = false,
+ cascade = false)
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(
+ cascade = true)
+
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ comparePlans(parsed3, expected1)
+ comparePlans(parsed4, expected2)
+ comparePlans(parsed5, expected1)
+ comparePlans(parsed6, expected3)
+ comparePlans(parsed7, expected4)
+ }
+
+ test("alter database set dbproperties") {
+ // ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...)
+ val sql1 = "ALTER DATABASE database_name SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')"
+ val sql2 = "ALTER SCHEMA database_name SET DBPROPERTIES ('a'='a')"
+
+ val parsed1 = parser.parsePlan(sql1)
+ val parsed2 = parser.parsePlan(sql2)
+
+ val expected1 = AlterDatabaseProperties(
"database_name",
- ifExists = false,
- restrict = false)(sql7)
+ Map("a" -> "a", "b" -> "b", "c" -> "c"))
+ val expected2 = AlterDatabaseProperties(
+ "database_name",
+ Map("a" -> "a"))
+
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ }
+
+ test("describe database") {
+ // DESCRIBE DATABASE [EXTENDED] db_name;
+ val sql1 = "DESCRIBE DATABASE EXTENDED db_name"
+ val sql2 = "DESCRIBE DATABASE db_name"
+
+ val parsed1 = parser.parsePlan(sql1)
+ val parsed2 = parser.parsePlan(sql2)
+
+ val expected1 = DescribeDatabase(
+ "db_name",
+ extended = true)
+ val expected2 = DescribeDatabase(
+ "db_name",
+ extended = false)
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
- comparePlans(parsed3, expected3)
- comparePlans(parsed4, expected4)
- comparePlans(parsed5, expected5)
- comparePlans(parsed6, expected6)
- comparePlans(parsed7, expected7)
}
test("create function") {
@@ -117,46 +152,115 @@ class DDLCommandSuite extends PlanTest {
val parsed1 = parser.parsePlan(sql1)
val parsed2 = parser.parsePlan(sql2)
val expected1 = CreateFunction(
+ None,
"helloworld",
"com.matthewrathbone.example.SimpleUDFExample",
Seq(("jar", "/path/to/jar1"), ("jar", "/path/to/jar2")),
- isTemp = true)(sql1)
+ isTemp = true)
val expected2 = CreateFunction(
- "hello.world",
+ Some("hello"),
+ "world",
"com.matthewrathbone.example.SimpleUDFExample",
Seq(("archive", "/path/to/archive"), ("file", "/path/to/file")),
- isTemp = false)(sql2)
+ isTemp = false)
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
}
- test("alter table: rename table") {
- val sql = "ALTER TABLE table_name RENAME TO new_table_name"
- val parsed = parser.parsePlan(sql)
- val expected = AlterTableRename(
- TableIdentifier("table_name", None),
- TableIdentifier("new_table_name", None))(sql)
- comparePlans(parsed, expected)
- }
+ test("drop function") {
+ val sql1 = "DROP TEMPORARY FUNCTION helloworld"
+ val sql2 = "DROP TEMPORARY FUNCTION IF EXISTS helloworld"
+ val sql3 = "DROP FUNCTION hello.world"
+ val sql4 = "DROP FUNCTION IF EXISTS hello.world"
- test("alter table: alter table properties") {
- val sql1 = "ALTER TABLE table_name SET TBLPROPERTIES ('test' = 'test', " +
- "'comment' = 'new_comment')"
- val sql2 = "ALTER TABLE table_name UNSET TBLPROPERTIES ('comment', 'test')"
- val sql3 = "ALTER TABLE table_name UNSET TBLPROPERTIES IF EXISTS ('comment', 'test')"
val parsed1 = parser.parsePlan(sql1)
val parsed2 = parser.parsePlan(sql2)
val parsed3 = parser.parsePlan(sql3)
- val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableSetProperties(
- tableIdent, Map("test" -> "test", "comment" -> "new_comment"))(sql1)
- val expected2 = AlterTableUnsetProperties(
- tableIdent, Map("comment" -> null, "test" -> null), ifExists = false)(sql2)
- val expected3 = AlterTableUnsetProperties(
- tableIdent, Map("comment" -> null, "test" -> null), ifExists = true)(sql3)
+ val parsed4 = parser.parsePlan(sql4)
+
+ val expected1 = DropFunction(
+ None,
+ "helloworld",
+ ifExists = false,
+ isTemp = true)
+ val expected2 = DropFunction(
+ None,
+ "helloworld",
+ ifExists = true,
+ isTemp = true)
+ val expected3 = DropFunction(
+ Some("hello"),
+ "world",
+ ifExists = false,
+ isTemp = false)
+ val expected4 = DropFunction(
+ Some("hello"),
+ "world",
+ ifExists = true,
+ isTemp = false)
+
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
comparePlans(parsed3, expected3)
+ comparePlans(parsed4, expected4)
+ }
+
+ // ALTER TABLE table_name RENAME TO new_table_name;
+ // ALTER VIEW view_name RENAME TO new_view_name;
+ test("alter table/view: rename table/view") {
+ val sql_table = "ALTER TABLE table_name RENAME TO new_table_name"
+ val sql_view = sql_table.replace("TABLE", "VIEW")
+ val parsed_table = parser.parsePlan(sql_table)
+ val parsed_view = parser.parsePlan(sql_view)
+ val expected_table = AlterTableRename(
+ TableIdentifier("table_name", None),
+ TableIdentifier("new_table_name", None),
+ isView = false)
+ val expected_view = AlterTableRename(
+ TableIdentifier("table_name", None),
+ TableIdentifier("new_table_name", None),
+ isView = true)
+ comparePlans(parsed_table, expected_table)
+ comparePlans(parsed_view, expected_view)
+ }
+
+ // ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);
+ // ALTER TABLE table_name UNSET TBLPROPERTIES [IF EXISTS] ('comment', 'key');
+ // ALTER VIEW view_name SET TBLPROPERTIES ('comment' = new_comment);
+ // ALTER VIEW view_name UNSET TBLPROPERTIES [IF EXISTS] ('comment', 'key');
+ test("alter table/view: alter table/view properties") {
+ val sql1_table = "ALTER TABLE table_name SET TBLPROPERTIES ('test' = 'test', " +
+ "'comment' = 'new_comment')"
+ val sql2_table = "ALTER TABLE table_name UNSET TBLPROPERTIES ('comment', 'test')"
+ val sql3_table = "ALTER TABLE table_name UNSET TBLPROPERTIES IF EXISTS ('comment', 'test')"
+ val sql1_view = sql1_table.replace("TABLE", "VIEW")
+ val sql2_view = sql2_table.replace("TABLE", "VIEW")
+ val sql3_view = sql3_table.replace("TABLE", "VIEW")
+
+ val parsed1_table = parser.parsePlan(sql1_table)
+ val parsed2_table = parser.parsePlan(sql2_table)
+ val parsed3_table = parser.parsePlan(sql3_table)
+ val parsed1_view = parser.parsePlan(sql1_view)
+ val parsed2_view = parser.parsePlan(sql2_view)
+ val parsed3_view = parser.parsePlan(sql3_view)
+
+ val tableIdent = TableIdentifier("table_name", None)
+ val expected1_table = AlterTableSetProperties(
+ tableIdent, Map("test" -> "test", "comment" -> "new_comment"), isView = false)
+ val expected2_table = AlterTableUnsetProperties(
+ tableIdent, Seq("comment", "test"), ifExists = false, isView = false)
+ val expected3_table = AlterTableUnsetProperties(
+ tableIdent, Seq("comment", "test"), ifExists = true, isView = false)
+ val expected1_view = expected1_table.copy(isView = true)
+ val expected2_view = expected2_table.copy(isView = true)
+ val expected3_view = expected3_table.copy(isView = true)
+
+ comparePlans(parsed1_table, expected1_table)
+ comparePlans(parsed2_table, expected2_table)
+ comparePlans(parsed3_table, expected3_table)
+ comparePlans(parsed1_view, expected1_view)
+ comparePlans(parsed2_view, expected2_view)
+ comparePlans(parsed3_view, expected3_view)
}
test("alter table: SerDe properties") {
@@ -189,24 +293,24 @@ class DDLCommandSuite extends PlanTest {
val parsed5 = parser.parsePlan(sql5)
val tableIdent = TableIdentifier("table_name", None)
val expected1 = AlterTableSerDeProperties(
- tableIdent, Some("org.apache.class"), None, None)(sql1)
+ tableIdent, Some("org.apache.class"), None, None)
val expected2 = AlterTableSerDeProperties(
tableIdent,
Some("org.apache.class"),
Some(Map("columns" -> "foo,bar", "field.delim" -> ",")),
- None)(sql2)
+ None)
val expected3 = AlterTableSerDeProperties(
- tableIdent, None, Some(Map("columns" -> "foo,bar", "field.delim" -> ",")), None)(sql3)
+ tableIdent, None, Some(Map("columns" -> "foo,bar", "field.delim" -> ",")), None)
val expected4 = AlterTableSerDeProperties(
tableIdent,
Some("org.apache.class"),
Some(Map("columns" -> "foo,bar", "field.delim" -> ",")),
- Some(Map("test" -> null, "dt" -> "2008-08-08", "country" -> "us")))(sql4)
+ Some(Map("test" -> null, "dt" -> "2008-08-08", "country" -> "us")))
val expected5 = AlterTableSerDeProperties(
tableIdent,
None,
Some(Map("columns" -> "foo,bar", "field.delim" -> ",")),
- Some(Map("test" -> null, "dt" -> "2008-08-08", "country" -> "us")))(sql5)
+ Some(Map("test" -> null, "dt" -> "2008-08-08", "country" -> "us")))
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
comparePlans(parsed3, expected3)
@@ -214,118 +318,56 @@ class DDLCommandSuite extends PlanTest {
comparePlans(parsed5, expected5)
}
- test("alter table: storage properties") {
- val sql1 = "ALTER TABLE table_name CLUSTERED BY (dt, country) INTO 10 BUCKETS"
- val sql2 = "ALTER TABLE table_name CLUSTERED BY (dt, country) SORTED BY " +
- "(dt, country DESC) INTO 10 BUCKETS"
- val sql3 = "ALTER TABLE table_name NOT CLUSTERED"
- val sql4 = "ALTER TABLE table_name NOT SORTED"
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
- val parsed3 = parser.parsePlan(sql3)
- val parsed4 = parser.parsePlan(sql4)
- val tableIdent = TableIdentifier("table_name", None)
- val cols = List("dt", "country")
- // TODO: also test the sort directions once we keep track of that
- val expected1 = AlterTableStorageProperties(
- tableIdent, BucketSpec(10, cols, Nil))(sql1)
- val expected2 = AlterTableStorageProperties(
- tableIdent, BucketSpec(10, cols, cols))(sql2)
- val expected3 = AlterTableNotClustered(tableIdent)(sql3)
- val expected4 = AlterTableNotSorted(tableIdent)(sql4)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
- comparePlans(parsed3, expected3)
- comparePlans(parsed4, expected4)
- }
-
- test("alter table: skewed") {
+ // ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
+ // [LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
+ test("alter table: add partition") {
val sql1 =
"""
- |ALTER TABLE table_name SKEWED BY (dt, country) ON
- |(('2008-08-08', 'us'), ('2009-09-09', 'uk'), ('2010-10-10', 'cn')) STORED AS DIRECTORIES
- """.stripMargin
- val sql2 =
- """
- |ALTER TABLE table_name SKEWED BY (dt, country) ON
- |('2008-08-08', 'us') STORED AS DIRECTORIES
- """.stripMargin
- val sql3 =
- """
- |ALTER TABLE table_name SKEWED BY (dt, country) ON
- |(('2008-08-08', 'us'), ('2009-09-09', 'uk'))
+ |ALTER TABLE table_name ADD IF NOT EXISTS PARTITION
+ |(dt='2008-08-08', country='us') LOCATION 'location1' PARTITION
+ |(dt='2009-09-09', country='uk')
""".stripMargin
- val sql4 = "ALTER TABLE table_name NOT SKEWED"
- val sql5 = "ALTER TABLE table_name NOT STORED AS DIRECTORIES"
+ val sql2 = "ALTER TABLE table_name ADD PARTITION (dt='2008-08-08') LOCATION 'loc'"
+
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 tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableSkewed(
- tableIdent,
- Seq("dt", "country"),
- Seq(List("2008-08-08", "us"), List("2009-09-09", "uk"), List("2010-10-10", "cn")),
- storedAsDirs = true)(sql1)
- val expected2 = AlterTableSkewed(
- tableIdent,
- Seq("dt", "country"),
- Seq(List("2008-08-08", "us")),
- storedAsDirs = true)(sql2)
- val expected3 = AlterTableSkewed(
- tableIdent,
- Seq("dt", "country"),
- Seq(List("2008-08-08", "us"), List("2009-09-09", "uk")),
- storedAsDirs = false)(sql3)
- val expected4 = AlterTableNotSkewed(tableIdent)(sql4)
- val expected5 = AlterTableNotStoredAsDirs(tableIdent)(sql5)
+
+ val expected1 = AlterTableAddPartition(
+ TableIdentifier("table_name", None),
+ Seq(
+ (Map("dt" -> "2008-08-08", "country" -> "us"), Some("location1")),
+ (Map("dt" -> "2009-09-09", "country" -> "uk"), None)),
+ ifNotExists = true)
+ val expected2 = AlterTableAddPartition(
+ TableIdentifier("table_name", None),
+ Seq((Map("dt" -> "2008-08-08"), Some("loc"))),
+ ifNotExists = false)
+
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
- comparePlans(parsed3, expected3)
- comparePlans(parsed4, expected4)
- comparePlans(parsed5, expected5)
}
- test("alter table: skewed location") {
+ // ALTER VIEW view_name ADD [IF NOT EXISTS] PARTITION partition_spec PARTITION partition_spec ...;
+ test("alter view: add partition") {
val sql1 =
"""
- |ALTER TABLE table_name SET SKEWED LOCATION
- |('123'='location1', 'test'='location2')
+ |ALTER VIEW view_name ADD IF NOT EXISTS PARTITION
+ |(dt='2008-08-08', country='us') PARTITION
+ |(dt='2009-09-09', country='uk')
""".stripMargin
+ // different constant types in partitioning spec
val sql2 =
- """
- |ALTER TABLE table_name SET SKEWED LOCATION
- |(('2008-08-08', 'us')='location1', 'test'='location2')
- """.stripMargin
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
- val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableSkewedLocation(
- tableIdent,
- Map("123" -> "location1", "test" -> "location2"))(sql1)
- val expected2 = AlterTableSkewedLocation(
- tableIdent,
- Map("2008-08-08" -> "location1", "us" -> "location1", "test" -> "location2"))(sql2)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
- }
+ """
+ |ALTER VIEW view_name ADD PARTITION
+ |(col1=NULL, cOL2='f', col3=5, COL4=true)
+ """.stripMargin
- test("alter table: add partition") {
- val sql =
- """
- |ALTER TABLE table_name ADD IF NOT EXISTS PARTITION
- |(dt='2008-08-08', country='us') LOCATION 'location1' PARTITION
- |(dt='2009-09-09', country='uk')
- """.stripMargin
- val parsed = parser.parsePlan(sql)
- val expected = AlterTableAddPartition(
- TableIdentifier("table_name", None),
- Seq(
- (Map("dt" -> "2008-08-08", "country" -> "us"), Some("location1")),
- (Map("dt" -> "2009-09-09", "country" -> "uk"), None)),
- ifNotExists = true)(sql)
- comparePlans(parsed, expected)
+ intercept[ParseException] {
+ parser.parsePlan(sql1)
+ }
+ intercept[ParseException] {
+ parser.parsePlan(sql2)
+ }
}
test("alter table: rename partition") {
@@ -338,106 +380,87 @@ class DDLCommandSuite extends PlanTest {
val expected = AlterTableRenamePartition(
TableIdentifier("table_name", None),
Map("dt" -> "2008-08-08", "country" -> "us"),
- Map("dt" -> "2008-09-09", "country" -> "uk"))(sql)
+ Map("dt" -> "2008-09-09", "country" -> "uk"))
comparePlans(parsed, expected)
}
- test("alter table: exchange partition") {
- val sql =
+ test("alter table: exchange partition (not supported)") {
+ assertUnsupported(
"""
|ALTER TABLE table_name_1 EXCHANGE PARTITION
|(dt='2008-08-08', country='us') WITH TABLE table_name_2
- """.stripMargin
- val parsed = parser.parsePlan(sql)
- val expected = AlterTableExchangePartition(
- TableIdentifier("table_name_1", None),
- TableIdentifier("table_name_2", None),
- Map("dt" -> "2008-08-08", "country" -> "us"))(sql)
- comparePlans(parsed, expected)
+ """.stripMargin)
}
- test("alter table: drop partitions") {
- val sql1 =
+ // ALTER TABLE table_name DROP [IF EXISTS] PARTITION spec1[, PARTITION spec2, ...] [PURGE]
+ // ALTER VIEW table_name DROP [IF EXISTS] PARTITION spec1[, PARTITION spec2, ...]
+ test("alter table/view: drop partitions") {
+ val sql1_table =
"""
|ALTER TABLE table_name DROP IF EXISTS PARTITION
|(dt='2008-08-08', country='us'), PARTITION (dt='2009-09-09', country='uk')
""".stripMargin
- val sql2 =
+ val sql2_table =
"""
|ALTER TABLE table_name DROP PARTITION
|(dt='2008-08-08', country='us'), PARTITION (dt='2009-09-09', country='uk') PURGE
""".stripMargin
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
+ val sql1_view = sql1_table.replace("TABLE", "VIEW")
+ // Note: ALTER VIEW DROP PARTITION does not support PURGE
+ val sql2_view = sql2_table.replace("TABLE", "VIEW").replace("PURGE", "")
+
+ val parsed1_table = parser.parsePlan(sql1_table)
+ val e = intercept[ParseException] {
+ parser.parsePlan(sql2_table)
+ }
+ assert(e.getMessage.contains("Operation not allowed"))
+
+ intercept[ParseException] {
+ parser.parsePlan(sql1_view)
+ }
+ intercept[ParseException] {
+ parser.parsePlan(sql2_view)
+ }
+
val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableDropPartition(
- tableIdent,
- Seq(
- Map("dt" -> "2008-08-08", "country" -> "us"),
- Map("dt" -> "2009-09-09", "country" -> "uk")),
- ifExists = true,
- purge = false)(sql1)
- val expected2 = AlterTableDropPartition(
+ val expected1_table = AlterTableDropPartition(
tableIdent,
Seq(
Map("dt" -> "2008-08-08", "country" -> "us"),
Map("dt" -> "2009-09-09", "country" -> "uk")),
- ifExists = false,
- purge = true)(sql2)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
+ ifExists = true)
+
+ comparePlans(parsed1_table, expected1_table)
}
- test("alter table: archive partition") {
- val sql = "ALTER TABLE table_name ARCHIVE PARTITION (dt='2008-08-08', country='us')"
- val parsed = parser.parsePlan(sql)
- val expected = AlterTableArchivePartition(
- TableIdentifier("table_name", None),
- Map("dt" -> "2008-08-08", "country" -> "us"))(sql)
- comparePlans(parsed, expected)
+ test("alter table: archive partition (not supported)") {
+ assertUnsupported("ALTER TABLE table_name ARCHIVE PARTITION (dt='2008-08-08', country='us')")
}
- test("alter table: unarchive partition") {
- val sql = "ALTER TABLE table_name UNARCHIVE PARTITION (dt='2008-08-08', country='us')"
- val parsed = parser.parsePlan(sql)
- val expected = AlterTableUnarchivePartition(
- TableIdentifier("table_name", None),
- Map("dt" -> "2008-08-08", "country" -> "us"))(sql)
- comparePlans(parsed, expected)
+ test("alter table: unarchive partition (not supported)") {
+ assertUnsupported("ALTER TABLE table_name UNARCHIVE PARTITION (dt='2008-08-08', country='us')")
}
test("alter table: set file format") {
- val sql1 =
- """
- |ALTER TABLE table_name SET FILEFORMAT INPUTFORMAT 'test'
- |OUTPUTFORMAT 'test' SERDE 'test' INPUTDRIVER 'test' OUTPUTDRIVER 'test'
- """.stripMargin
- val sql2 = "ALTER TABLE table_name SET FILEFORMAT INPUTFORMAT 'test' " +
+ val sql1 = "ALTER TABLE table_name SET FILEFORMAT INPUTFORMAT 'test' " +
"OUTPUTFORMAT 'test' SERDE 'test'"
- val sql3 = "ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us') " +
+ val sql2 = "ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us') " +
"SET FILEFORMAT PARQUET"
val parsed1 = parser.parsePlan(sql1)
val parsed2 = parser.parsePlan(sql2)
- val parsed3 = parser.parsePlan(sql3)
val tableIdent = TableIdentifier("table_name", None)
val expected1 = AlterTableSetFileFormat(
tableIdent,
None,
- List("test", "test", "test", "test", "test"),
+ List("test", "test", "test"),
None)(sql1)
val expected2 = AlterTableSetFileFormat(
tableIdent,
- None,
- List("test", "test", "test"),
- None)(sql2)
- val expected3 = AlterTableSetFileFormat(
- tableIdent,
Some(Map("dt" -> "2008-08-08", "country" -> "us")),
Seq(),
- Some("PARQUET"))(sql3)
+ Some("PARQUET"))(sql2)
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
- comparePlans(parsed3, expected3)
}
test("alter table: set location") {
@@ -450,64 +473,33 @@ class DDLCommandSuite extends PlanTest {
val expected1 = AlterTableSetLocation(
tableIdent,
None,
- "new location")(sql1)
+ "new location")
val expected2 = AlterTableSetLocation(
tableIdent,
Some(Map("dt" -> "2008-08-08", "country" -> "us")),
- "new location")(sql2)
+ "new location")
comparePlans(parsed1, expected1)
comparePlans(parsed2, expected2)
}
- test("alter table: touch") {
- val sql1 = "ALTER TABLE table_name TOUCH"
- val sql2 = "ALTER TABLE table_name TOUCH PARTITION (dt='2008-08-08', country='us')"
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
- val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableTouch(
- tableIdent,
- None)(sql1)
- val expected2 = AlterTableTouch(
- tableIdent,
- Some(Map("dt" -> "2008-08-08", "country" -> "us")))(sql2)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
+ test("alter table: touch (not supported)") {
+ assertUnsupported("ALTER TABLE table_name TOUCH")
+ assertUnsupported("ALTER TABLE table_name TOUCH PARTITION (dt='2008-08-08', country='us')")
}
- test("alter table: compact") {
- val sql1 = "ALTER TABLE table_name COMPACT 'compaction_type'"
- val sql2 =
+ test("alter table: compact (not supported)") {
+ assertUnsupported("ALTER TABLE table_name COMPACT 'compaction_type'")
+ assertUnsupported(
"""
- |ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us')
- |COMPACT 'MAJOR'
- """.stripMargin
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
- val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableCompact(
- tableIdent,
- None,
- "compaction_type")(sql1)
- val expected2 = AlterTableCompact(
- tableIdent,
- Some(Map("dt" -> "2008-08-08", "country" -> "us")),
- "MAJOR")(sql2)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
+ |ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us')
+ |COMPACT 'MAJOR'
+ """.stripMargin)
}
- test("alter table: concatenate") {
- val sql1 = "ALTER TABLE table_name CONCATENATE"
- val sql2 = "ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us') CONCATENATE"
- val parsed1 = parser.parsePlan(sql1)
- val parsed2 = parser.parsePlan(sql2)
- val tableIdent = TableIdentifier("table_name", None)
- val expected1 = AlterTableMerge(tableIdent, None)(sql1)
- val expected2 = AlterTableMerge(
- tableIdent, Some(Map("dt" -> "2008-08-08", "country" -> "us")))(sql2)
- comparePlans(parsed1, expected1)
- comparePlans(parsed2, expected2)
+ test("alter table: concatenate (not supported)") {
+ assertUnsupported("ALTER TABLE table_name CONCATENATE")
+ assertUnsupported(
+ "ALTER TABLE table_name PARTITION (dt='2008-08-08', country='us') CONCATENATE")
}
test("alter table: change column name/type/position/comment") {
@@ -598,4 +590,110 @@ class DDLCommandSuite extends PlanTest {
comparePlans(parsed2, expected2)
}
+ test("show databases") {
+ val sql1 = "SHOW DATABASES"
+ val sql2 = "SHOW DATABASES LIKE 'defau*'"
+ val parsed1 = parser.parsePlan(sql1)
+ val expected1 = ShowDatabasesCommand(None)
+ val parsed2 = parser.parsePlan(sql2)
+ val expected2 = ShowDatabasesCommand(Some("defau*"))
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ }
+
+ test("show tblproperties") {
+ val parsed1 = parser.parsePlan("SHOW TBLPROPERTIES tab1")
+ val expected1 = ShowTablePropertiesCommand(TableIdentifier("tab1", None), None)
+ val parsed2 = parser.parsePlan("SHOW TBLPROPERTIES tab1('propKey1')")
+ val expected2 = ShowTablePropertiesCommand(TableIdentifier("tab1", None), Some("propKey1"))
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ }
+
+ test("unsupported operations") {
+ intercept[ParseException] {
+ parser.parsePlan("DROP TABLE tab PURGE")
+ }
+ intercept[ParseException] {
+ parser.parsePlan("DROP TABLE tab FOR REPLICATION('eventid')")
+ }
+ intercept[ParseException] {
+ parser.parsePlan("CREATE VIEW testView AS SELECT id FROM tab")
+ }
+ intercept[ParseException] {
+ parser.parsePlan("ALTER VIEW testView AS SELECT id FROM tab")
+ }
+ intercept[ParseException] {
+ parser.parsePlan(
+ """
+ |CREATE EXTERNAL TABLE parquet_tab2(c1 INT, c2 STRING)
+ |TBLPROPERTIES('prop1Key '= "prop1Val", ' `prop2Key` '= "prop2Val")
+ """.stripMargin)
+ }
+ intercept[ParseException] {
+ parser.parsePlan(
+ """
+ |CREATE EXTERNAL TABLE oneToTenDef
+ |USING org.apache.spark.sql.sources
+ |OPTIONS (from '1', to '10')
+ """.stripMargin)
+ }
+ intercept[ParseException] {
+ parser.parsePlan("SELECT TRANSFORM (key, value) USING 'cat' AS (tKey, tValue) FROM testData")
+ }
+ }
+
+ test("SPARK-14383: DISTRIBUTE and UNSET as non-keywords") {
+ val sql = "SELECT distribute, unset FROM x"
+ val parsed = parser.parsePlan(sql)
+ assert(parsed.isInstanceOf[Project])
+ }
+
+ test("drop table") {
+ val tableName1 = "db.tab"
+ val tableName2 = "tab"
+
+ val parsed1 = parser.parsePlan(s"DROP TABLE $tableName1")
+ val parsed2 = parser.parsePlan(s"DROP TABLE IF EXISTS $tableName1")
+ val parsed3 = parser.parsePlan(s"DROP TABLE $tableName2")
+ val parsed4 = parser.parsePlan(s"DROP TABLE IF EXISTS $tableName2")
+
+ val expected1 =
+ DropTable(TableIdentifier("tab", Option("db")), ifExists = false, isView = false)
+ val expected2 =
+ DropTable(TableIdentifier("tab", Option("db")), ifExists = true, isView = false)
+ val expected3 =
+ DropTable(TableIdentifier("tab", None), ifExists = false, isView = false)
+ val expected4 =
+ DropTable(TableIdentifier("tab", None), ifExists = true, isView = false)
+
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ comparePlans(parsed3, expected3)
+ comparePlans(parsed4, expected4)
+ }
+
+ test("drop view") {
+ val viewName1 = "db.view"
+ val viewName2 = "view"
+
+ val parsed1 = parser.parsePlan(s"DROP VIEW $viewName1")
+ val parsed2 = parser.parsePlan(s"DROP VIEW IF EXISTS $viewName1")
+ val parsed3 = parser.parsePlan(s"DROP VIEW $viewName2")
+ val parsed4 = parser.parsePlan(s"DROP VIEW IF EXISTS $viewName2")
+
+ val expected1 =
+ DropTable(TableIdentifier("view", Option("db")), ifExists = false, isView = true)
+ val expected2 =
+ DropTable(TableIdentifier("view", Option("db")), ifExists = true, isView = true)
+ val expected3 =
+ DropTable(TableIdentifier("view", None), ifExists = false, isView = true)
+ val expected4 =
+ DropTable(TableIdentifier("view", None), ifExists = true, isView = true)
+
+ comparePlans(parsed1, expected1)
+ comparePlans(parsed2, expected2)
+ comparePlans(parsed3, expected3)
+ comparePlans(parsed4, expected4)
+ }
}