[SPARK-30302][SQL] Complete info for show create table for views

### What changes were proposed in this pull request?

Add table/column comments and table properties to the result of show create table of views.

### Does this PR introduce any user-facing change?

When show create table for views, after this patch, the result can contain table/column comments and table properties if they exist.

### How was this patch tested?

add new tests

Closes #26944 from wzhfy/complete_show_create_view.

Authored-by: Zhenhua Wang <wzh_zju@163.com>
Signed-off-by: Takeshi Yamamuro <yamamuro@apache.org>
This commit is contained in:
Zhenhua Wang 2020-01-08 11:28:37 +09:00 committed by Takeshi Yamamuro
parent d7c7e37ae0
commit 9535776e28
4 changed files with 174 additions and 12 deletions

View file

@ -388,12 +388,13 @@ case class CatalogTable(
}
object CatalogTable {
val VIEW_PREFIX = "view."
// Starting from Spark 3.0, we don't use this property any more. `VIEW_CATALOG_AND_NAMESPACE` is
// used instead.
val VIEW_DEFAULT_DATABASE = "view.default.database"
val VIEW_DEFAULT_DATABASE = VIEW_PREFIX + "default.database"
val VIEW_CATALOG_AND_NAMESPACE = "view.catalogAndNamespace.numParts"
val VIEW_CATALOG_AND_NAMESPACE_PART_PREFIX = "view.catalogAndNamespace.part."
val VIEW_CATALOG_AND_NAMESPACE = VIEW_PREFIX + "catalogAndNamespace.numParts"
val VIEW_CATALOG_AND_NAMESPACE_PART_PREFIX = VIEW_PREFIX + "catalogAndNamespace.part."
// Convert the current catalog and namespace to properties.
def catalogAndNamespaceToProps(
currentCatalog: String,
@ -409,7 +410,7 @@ object CatalogTable {
props.toMap
}
val VIEW_QUERY_OUTPUT_PREFIX = "view.query.out."
val VIEW_QUERY_OUTPUT_PREFIX = VIEW_PREFIX + "query.out."
val VIEW_QUERY_OUTPUT_NUM_COLUMNS = VIEW_QUERY_OUTPUT_PREFIX + "numCols"
val VIEW_QUERY_OUTPUT_COLUMN_NAME_PREFIX = VIEW_QUERY_OUTPUT_PREFIX + "col."
}

View file

@ -1014,13 +1014,13 @@ case class ShowCreateTableCommand(table: TableIdentifier) extends RunnableComman
builder ++= s"CREATE$tableTypeString ${table.quotedString}"
if (metadata.tableType == VIEW) {
if (metadata.schema.nonEmpty) {
builder ++= metadata.schema.map(_.name).mkString("(", ", ", ")")
}
builder ++= metadata.viewText.mkString(" AS\n", "", "\n")
showViewDataColumns(metadata, builder)
showComment(metadata, builder)
showViewProperties(metadata, builder)
showViewText(metadata, builder)
} else {
showHiveTableHeader(metadata, builder)
showTableComment(metadata, builder)
showComment(metadata, builder)
showHiveTableNonDataColumns(metadata, builder)
showHiveTableStorageInfo(metadata, builder)
showTableLocation(metadata, builder)
@ -1030,6 +1030,35 @@ case class ShowCreateTableCommand(table: TableIdentifier) extends RunnableComman
builder.toString()
}
private def showViewDataColumns(metadata: CatalogTable, builder: StringBuilder): Unit = {
if (metadata.schema.nonEmpty) {
val viewColumns = metadata.schema.map { f =>
val comment = f.getComment()
.map(escapeSingleQuotedString)
.map(" COMMENT '" + _ + "'")
// view columns shouldn't have data type info
s"${quoteIdentifier(f.name)}${comment.getOrElse("")}"
}
builder ++= viewColumns.mkString("(", ", ", ")\n")
}
}
private def showViewProperties(metadata: CatalogTable, builder: StringBuilder): Unit = {
val viewProps = metadata.properties.filterKeys(!_.startsWith(CatalogTable.VIEW_PREFIX))
if (viewProps.nonEmpty) {
val props = viewProps.map { case (key, value) =>
s"'${escapeSingleQuotedString(key)}' = '${escapeSingleQuotedString(value)}'"
}
builder ++= props.mkString("TBLPROPERTIES (\n ", ",\n ", "\n)\n")
}
}
private def showViewText(metadata: CatalogTable, builder: StringBuilder): Unit = {
builder ++= metadata.viewText.mkString("AS ", "", "\n")
}
private def showHiveTableHeader(metadata: CatalogTable, builder: StringBuilder): Unit = {
val columns = metadata.schema.filterNot { column =>
metadata.partitionColumnNames.contains(column.name)
@ -1092,7 +1121,7 @@ case class ShowCreateTableCommand(table: TableIdentifier) extends RunnableComman
}
}
private def showTableComment(metadata: CatalogTable, builder: StringBuilder): Unit = {
private def showComment(metadata: CatalogTable, builder: StringBuilder): Unit = {
metadata
.comment
.map("COMMENT '" + escapeSingleQuotedString(_) + "'\n")
@ -1116,7 +1145,7 @@ case class ShowCreateTableCommand(table: TableIdentifier) extends RunnableComman
showDataSourceTableDataColumns(metadata, builder)
showDataSourceTableOptions(metadata, builder)
showDataSourceTableNonDataColumns(metadata, builder)
showTableComment(metadata, builder)
showComment(metadata, builder)
showTableLocation(metadata, builder)
showTableProperties(metadata, builder)

View file

@ -64,3 +64,34 @@ DROP TABLE tbl;
CREATE TABLE tbl (a REAL, b NUMERIC, c NUMERIC(10), d NUMERIC(10,1)) USING parquet;
SHOW CREATE TABLE tbl;
DROP TABLE tbl;
-- show create table for view
CREATE TABLE tbl (a INT, b STRING, c INT) USING parquet;
-- simple
CREATE VIEW view_SPARK_30302 (aaa, bbb)
AS SELECT a, b FROM tbl;
SHOW CREATE TABLE view_SPARK_30302;
DROP VIEW view_SPARK_30302;
-- comment
CREATE VIEW view_SPARK_30302 (aaa COMMENT 'comment with \'quoted text\' for aaa', bbb)
COMMENT 'This is a comment with \'quoted text\' for view'
AS SELECT a, b FROM tbl;
SHOW CREATE TABLE view_SPARK_30302;
DROP VIEW view_SPARK_30302;
-- tblproperties
CREATE VIEW view_SPARK_30302 (aaa, bbb)
TBLPROPERTIES ('a' = '1', 'b' = '2')
AS SELECT a, b FROM tbl;
SHOW CREATE TABLE view_SPARK_30302;
DROP VIEW view_SPARK_30302;
DROP TABLE tbl;

View file

@ -1,5 +1,5 @@
-- Automatically generated by SQLQueryTestSuite
-- Number of queries: 27
-- Number of queries: 38
-- !query 0
@ -245,3 +245,104 @@ DROP TABLE tbl
struct<>
-- !query 26 output
-- !query 27
CREATE TABLE tbl (a INT, b STRING, c INT) USING parquet
-- !query 27 schema
struct<>
-- !query 27 output
-- !query 28
CREATE VIEW view_SPARK_30302 (aaa, bbb)
AS SELECT a, b FROM tbl
-- !query 28 schema
struct<>
-- !query 28 output
-- !query 29
SHOW CREATE TABLE view_SPARK_30302
-- !query 29 schema
struct<createtab_stmt:string>
-- !query 29 output
CREATE VIEW `view_SPARK_30302`(`aaa`, `bbb`)
AS SELECT a, b FROM tbl
-- !query 30
DROP VIEW view_SPARK_30302
-- !query 30 schema
struct<>
-- !query 30 output
-- !query 31
CREATE VIEW view_SPARK_30302 (aaa COMMENT 'comment with \'quoted text\' for aaa', bbb)
COMMENT 'This is a comment with \'quoted text\' for view'
AS SELECT a, b FROM tbl
-- !query 31 schema
struct<>
-- !query 31 output
-- !query 32
SHOW CREATE TABLE view_SPARK_30302
-- !query 32 schema
struct<createtab_stmt:string>
-- !query 32 output
CREATE VIEW `view_SPARK_30302`(`aaa` COMMENT 'comment with \'quoted text\' for aaa', `bbb`)
COMMENT 'This is a comment with \'quoted text\' for view'
AS SELECT a, b FROM tbl
-- !query 33
DROP VIEW view_SPARK_30302
-- !query 33 schema
struct<>
-- !query 33 output
-- !query 34
CREATE VIEW view_SPARK_30302 (aaa, bbb)
TBLPROPERTIES ('a' = '1', 'b' = '2')
AS SELECT a, b FROM tbl
-- !query 34 schema
struct<>
-- !query 34 output
-- !query 35
SHOW CREATE TABLE view_SPARK_30302
-- !query 35 schema
struct<createtab_stmt:string>
-- !query 35 output
CREATE VIEW `view_SPARK_30302`(`aaa`, `bbb`)
TBLPROPERTIES (
'a' = '1',
'b' = '2'
)
AS SELECT a, b FROM tbl
-- !query 36
DROP VIEW view_SPARK_30302
-- !query 36 schema
struct<>
-- !query 36 output
-- !query 37
DROP TABLE tbl
-- !query 37 schema
struct<>
-- !query 37 output