aboutsummaryrefslogtreecommitdiff
path: root/sql/hive/src/test
diff options
context:
space:
mode:
authorDongjoon Hyun <dongjoon@apache.org>2016-11-15 15:59:04 -0800
committerHerman van Hovell <hvanhovell@databricks.com>2016-11-15 15:59:04 -0800
commit3ce057d0010a0f6f8163046ba502a126adc68f33 (patch)
tree0efbff69f01d6b6ceff9092873b74b92b7c1554d /sql/hive/src/test
parent503378f10ca92064034aa88e0feebe4718af8bbe (diff)
downloadspark-3ce057d0010a0f6f8163046ba502a126adc68f33.tar.gz
spark-3ce057d0010a0f6f8163046ba502a126adc68f33.tar.bz2
spark-3ce057d0010a0f6f8163046ba502a126adc68f33.zip
[SPARK-17732][SQL] ALTER TABLE DROP PARTITION should support comparators
## What changes were proposed in this pull request? This PR aims to support `comparators`, e.g. '<', '<=', '>', '>=', again in Apache Spark 2.0 for backward compatibility. **Spark 1.6** ``` scala scala> sql("CREATE TABLE sales(id INT) PARTITIONED BY (country STRING, quarter STRING)") res0: org.apache.spark.sql.DataFrame = [result: string] scala> sql("ALTER TABLE sales DROP PARTITION (country < 'KR')") res1: org.apache.spark.sql.DataFrame = [result: string] ``` **Spark 2.0** ``` scala scala> sql("CREATE TABLE sales(id INT) PARTITIONED BY (country STRING, quarter STRING)") res0: org.apache.spark.sql.DataFrame = [] scala> sql("ALTER TABLE sales DROP PARTITION (country < 'KR')") org.apache.spark.sql.catalyst.parser.ParseException: mismatched input '<' expecting {')', ','}(line 1, pos 42) ``` After this PR, it's supported. ## How was this patch tested? Pass the Jenkins test with a newly added testcase. Author: Dongjoon Hyun <dongjoon@apache.org> Closes #15704 from dongjoon-hyun/SPARK-17732-2.
Diffstat (limited to 'sql/hive/src/test')
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala103
1 files changed, 103 insertions, 0 deletions
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
index 6efae13ddf..a2b04863d3 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala
@@ -26,6 +26,7 @@ import org.apache.spark.sql.{AnalysisException, QueryTest, Row, SaveMode}
import org.apache.spark.sql.catalyst.analysis.{NoSuchPartitionException, TableAlreadyExistsException}
import org.apache.spark.sql.catalyst.catalog.{CatalogDatabase, CatalogTable, CatalogTableType}
import org.apache.spark.sql.catalyst.TableIdentifier
+import org.apache.spark.sql.catalyst.parser.ParseException
import org.apache.spark.sql.execution.command.DDLUtils
import org.apache.spark.sql.hive.HiveExternalCatalog
import org.apache.spark.sql.hive.test.TestHiveSingleton
@@ -225,6 +226,108 @@ class HiveDDLSuite
}
}
+ test("SPARK-17732: Drop partitions by filter") {
+ withTable("sales") {
+ sql("CREATE TABLE sales(id INT) PARTITIONED BY (country STRING, quarter STRING)")
+
+ for (country <- Seq("US", "CA", "KR")) {
+ for (quarter <- 1 to 4) {
+ sql(s"ALTER TABLE sales ADD PARTITION (country = '$country', quarter = '$quarter')")
+ }
+ }
+
+ sql("ALTER TABLE sales DROP PARTITION (country < 'KR', quarter > '2')")
+ checkAnswer(sql("SHOW PARTITIONS sales"),
+ Row("country=CA/quarter=1") ::
+ Row("country=CA/quarter=2") ::
+ Row("country=KR/quarter=1") ::
+ Row("country=KR/quarter=2") ::
+ Row("country=KR/quarter=3") ::
+ Row("country=KR/quarter=4") ::
+ Row("country=US/quarter=1") ::
+ Row("country=US/quarter=2") ::
+ Row("country=US/quarter=3") ::
+ Row("country=US/quarter=4") :: Nil)
+
+ sql("ALTER TABLE sales DROP PARTITION (country < 'KR'), PARTITION (quarter <= '1')")
+ checkAnswer(sql("SHOW PARTITIONS sales"),
+ Row("country=KR/quarter=2") ::
+ Row("country=KR/quarter=3") ::
+ Row("country=KR/quarter=4") ::
+ Row("country=US/quarter=2") ::
+ Row("country=US/quarter=3") ::
+ Row("country=US/quarter=4") :: Nil)
+
+ sql("ALTER TABLE sales DROP PARTITION (country='KR', quarter='4')")
+ sql("ALTER TABLE sales DROP PARTITION (country='US', quarter='3')")
+ checkAnswer(sql("SHOW PARTITIONS sales"),
+ Row("country=KR/quarter=2") ::
+ Row("country=KR/quarter=3") ::
+ Row("country=US/quarter=2") ::
+ Row("country=US/quarter=4") :: Nil)
+
+ sql("ALTER TABLE sales DROP PARTITION (quarter <= 2), PARTITION (quarter >= '4')")
+ checkAnswer(sql("SHOW PARTITIONS sales"),
+ Row("country=KR/quarter=3") :: Nil)
+
+ // According to the declarative partition spec definitions, this drops the union of target
+ // partitions without exceptions. Hive raises exceptions because it handles them sequentially.
+ sql("ALTER TABLE sales DROP PARTITION (quarter <= 4), PARTITION (quarter <= '3')")
+ checkAnswer(sql("SHOW PARTITIONS sales"), Nil)
+ }
+ }
+
+ test("SPARK-17732: Error handling for drop partitions by filter") {
+ withTable("sales") {
+ sql("CREATE TABLE sales(id INT) PARTITIONED BY (country STRING, quarter STRING)")
+
+ val m = intercept[AnalysisException] {
+ sql("ALTER TABLE sales DROP PARTITION (unknown = 'KR')")
+ }.getMessage
+ assert(m.contains("unknown is not a valid partition column in table"))
+
+ val m2 = intercept[AnalysisException] {
+ sql("ALTER TABLE sales DROP PARTITION (unknown < 'KR')")
+ }.getMessage
+ assert(m2.contains("unknown is not a valid partition column in table"))
+
+ val m3 = intercept[AnalysisException] {
+ sql("ALTER TABLE sales DROP PARTITION (unknown <=> 'KR')")
+ }.getMessage
+ assert(m3.contains("'<=>' operator is not allowed in partition specification"))
+
+ val m4 = intercept[ParseException] {
+ sql("ALTER TABLE sales DROP PARTITION (unknown <=> upper('KR'))")
+ }.getMessage
+ assert(m4.contains("'<=>' operator is not allowed in partition specification"))
+
+ val m5 = intercept[ParseException] {
+ sql("ALTER TABLE sales DROP PARTITION (country < 'KR', quarter)")
+ }.getMessage
+ assert(m5.contains("Invalid partition filter specification"))
+
+ sql(s"ALTER TABLE sales ADD PARTITION (country = 'KR', quarter = '3')")
+ val m6 = intercept[AnalysisException] {
+ sql("ALTER TABLE sales DROP PARTITION (quarter <= '4'), PARTITION (quarter <= '2')")
+ }.getMessage
+ // The query is not executed because `PARTITION (quarter <= '2')` is invalid.
+ checkAnswer(sql("SHOW PARTITIONS sales"),
+ Row("country=KR/quarter=3") :: Nil)
+ assert(m6.contains("There is no partition for (`quarter` <= '2')"))
+ }
+ }
+
+ test("SPARK-17732: Partition filter is not allowed in ADD PARTITION") {
+ withTable("sales") {
+ sql("CREATE TABLE sales(id INT) PARTITIONED BY (country STRING, quarter STRING)")
+
+ val m = intercept[ParseException] {
+ sql("ALTER TABLE sales ADD PARTITION (country = 'US', quarter < '1')")
+ }.getMessage()
+ assert(m.contains("Invalid partition filter specification"))
+ }
+ }
+
test("drop views") {
withTable("tab1") {
val tabName = "tab1"