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 1ca0403d6f8ceb515061e9d70fd28f0e382597f3..b9283f668a9b5f33168d31766478af042f98b167 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 @@ -124,7 +124,6 @@ private[hive] object HiveQl { // Commands that we do not need to explain. protected val noExplainCommands = Seq( - "TOK_CREATETABLE", "TOK_DESCTABLE", "TOK_TRUNCATETABLE" // truncate table" is a NativeCommand, does not need to explain. ) ++ nativeCommands @@ -421,6 +420,11 @@ private[hive] object HiveQl { case Token("TOK_EXPLAIN", explainArgs) if noExplainCommands.contains(explainArgs.head.getText) => ExplainCommand(NoRelation) + case Token("TOK_EXPLAIN", explainArgs) + if "TOK_CREATETABLE" == explainArgs.head.getText => + val Some(crtTbl) :: _ :: extended :: Nil = + getClauses(Seq("TOK_CREATETABLE", "FORMATTED", "EXTENDED"), explainArgs) + ExplainCommand(nodeToPlan(crtTbl), extended != None) case Token("TOK_EXPLAIN", explainArgs) => // Ignore FORMATTED if present. val Some(query) :: _ :: extended :: Nil = diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveExplainSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveExplainSuite.scala index a68fc2a803bb45db30afc7758a378b1753ad901b..697211222b90cddda056bad47220bda4e5d7276f 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveExplainSuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveExplainSuite.scala @@ -38,4 +38,40 @@ class HiveExplainSuite extends QueryTest { "== Physical Plan ==", "Code Generation", "== RDD ==") } + + test("explain create table command") { + checkExistence(sql("explain create table temp__b as select * from src limit 2"), true, + "== Physical Plan ==", + "InsertIntoHiveTable", + "Limit", + "src") + + checkExistence(sql("explain extended create table temp__b as select * from src limit 2"), true, + "== Parsed Logical Plan ==", + "== Analyzed Logical Plan ==", + "== Optimized Logical Plan ==", + "== Physical Plan ==", + "CreateTableAsSelect", + "InsertIntoHiveTable", + "Limit", + "src") + + checkExistence(sql( + """ + | EXPLAIN EXTENDED CREATE TABLE temp__b + | ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe" + | WITH SERDEPROPERTIES("serde_p1"="p1","serde_p2"="p2") + | STORED AS RCFile + | TBLPROPERTIES("tbl_p1"="p11", "tbl_p2"="p22") + | AS SELECT * FROM src LIMIT 2 + """.stripMargin), true, + "== Parsed Logical Plan ==", + "== Analyzed Logical Plan ==", + "== Optimized Logical Plan ==", + "== Physical Plan ==", + "CreateTableAsSelect", + "InsertIntoHiveTable", + "Limit", + "src") + } }