From e1a9ddd142dcfd9d292b3a8c148237137b584972 Mon Sep 17 00:00:00 2001 From: lihao Date: Thu, 8 Aug 2019 21:06:42 +0800 Subject: [PATCH 1/2] hive-ddl-fix --- .../apache/spark/sql/execution/SparkSqlParser.scala | 10 +++++++++- .../apache/spark/sql/hive/execution/HiveDDLSuite.scala | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala index c4edadba278f..55cc67d6c25f 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala @@ -985,7 +985,15 @@ class SparkSqlAstBuilder(conf: SQLConf) extends AstBuilder(conf) { } else { CreateTable(tableDescWithPartitionColNames, mode, Some(q)) } - case None => CreateTable(tableDesc, mode, None) + case None => + // When creating partitioned table, we must specify data type for the partition columns. + if (Option(ctx.partitionColumnNames).isDefined) { + val errorMessage = "Create Partitioned Table must specify data type for " + + "the partition columns." + operationNotAllowed(errorMessage, ctx) + } + + CreateTable(tableDesc, mode, None) } } 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 a907fcae526c..c6919b783c71 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 @@ -548,6 +548,14 @@ class HiveDDLSuite assert(e.message == "Found duplicate column(s) in the table definition of `default`.`tbl`: `a`") } + test("create partitioned table without specifying data type for the partition columns") { + val e = intercept[AnalysisException] { + sql("CREATE TABLE tbl(a int) PARTITIONED BY (b) STORED AS parquet") + } + assert(e.message.contains("Create Partitioned Table must specify data type for " + + "the partition columns.")) + } + test("add/drop partition with location - managed table") { val tab = "tab_with_partitions" withTempDir { tmpDir => From 935af875d099451ff882662a91c9e137cd09b681 Mon Sep 17 00:00:00 2001 From: lihao Date: Wed, 14 Aug 2019 23:45:05 +0800 Subject: [PATCH 2/2] improve error message --- .../scala/org/apache/spark/sql/execution/SparkSqlParser.scala | 4 ++-- .../org/apache/spark/sql/hive/execution/HiveDDLSuite.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala index 55cc67d6c25f..4514675c56f3 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala @@ -988,8 +988,8 @@ class SparkSqlAstBuilder(conf: SQLConf) extends AstBuilder(conf) { case None => // When creating partitioned table, we must specify data type for the partition columns. if (Option(ctx.partitionColumnNames).isDefined) { - val errorMessage = "Create Partitioned Table must specify data type for " + - "the partition columns." + val errorMessage = "Must specify a data type for each partition column while creating " + + "Hive partitioned table." operationNotAllowed(errorMessage, ctx) } 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 c6919b783c71..cd8e2eaa2b4d 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 @@ -552,8 +552,8 @@ class HiveDDLSuite val e = intercept[AnalysisException] { sql("CREATE TABLE tbl(a int) PARTITIONED BY (b) STORED AS parquet") } - assert(e.message.contains("Create Partitioned Table must specify data type for " + - "the partition columns.")) + assert(e.message.contains("Must specify a data type for each partition column while creating " + + "Hive partitioned table.")) } test("add/drop partition with location - managed table") {