This is an automated email from the ASF dual-hosted git repository. mgergely pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push: new 22f5ab5 HIVE-22723 Add backtics to identifiers within structs at SHOW CREATE TABLE (Miklos Gergely, reviewed by Zoltan Haindrich) 22f5ab5 is described below commit 22f5ab51660aa660fdae58bb56a8c5cc44b60630 Author: miklosgergely <mgerg...@cloudera.com> AuthorDate: Fri Jan 24 16:15:44 2020 +0100 HIVE-22723 Add backtics to identifiers within structs at SHOW CREATE TABLE (Miklos Gergely, reviewed by Zoltan Haindrich) --- .../create/show/ShowCreateTableOperation.java | 62 ++++++++++++++++++++-- .../clientpositive/show_create_table_db_table.q | 3 ++ .../show_create_table_db_table.q.out | 36 +++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java index 9c584ae..e07559f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java @@ -51,6 +51,12 @@ import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.util.DirectionUtils; import org.apache.hadoop.hive.serde.serdeConstants; +import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.StructTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; +import org.apache.hadoop.hive.serde2.typeinfo.UnionTypeInfo; import org.apache.hive.common.util.HiveStringUtils; import org.stringtemplate.v4.ST; @@ -142,16 +148,64 @@ public class ShowCreateTableOperation extends DDLOperation<ShowCreateTableDesc> private String getColumns(Table table) { List<String> columnDescs = new ArrayList<String>(); - for (FieldSchema col : table.getCols()) { - String columnDesc = " `" + col.getName() + "` " + col.getType(); - if (col.getComment() != null) { - columnDesc += " COMMENT '" + HiveStringUtils.escapeHiveCommand(col.getComment()) + "'"; + for (FieldSchema column : table.getCols()) { + String columnType = formatType(TypeInfoUtils.getTypeInfoFromTypeString(column.getType())); + String columnDesc = " `" + column.getName() + "` " + columnType; + if (column.getComment() != null) { + columnDesc += " COMMENT '" + HiveStringUtils.escapeHiveCommand(column.getComment()) + "'"; } columnDescs.add(columnDesc); } return StringUtils.join(columnDescs, ", \n"); } + /** Struct fields are identifiers, need to be put between ``. */ + private String formatType(TypeInfo typeInfo) { + switch (typeInfo.getCategory()) { + case PRIMITIVE: + return typeInfo.getTypeName(); + case STRUCT: + StringBuilder structFormattedType = new StringBuilder(); + + StructTypeInfo structTypeInfo = (StructTypeInfo)typeInfo; + for (int i = 0; i < structTypeInfo.getAllStructFieldNames().size(); i++) { + if (structFormattedType.length() != 0) { + structFormattedType.append(", "); + } + + String structElementName = structTypeInfo.getAllStructFieldNames().get(i); + String structElementType = formatType(structTypeInfo.getAllStructFieldTypeInfos().get(i)); + + structFormattedType.append("`" + structElementName + "`:" + structElementType); + } + return "struct<" + structFormattedType.toString() + ">"; + case LIST: + ListTypeInfo listTypeInfo = (ListTypeInfo)typeInfo; + String elementType = formatType(listTypeInfo.getListElementTypeInfo()); + return "array<" + elementType + ">"; + case MAP: + MapTypeInfo mapTypeInfo = (MapTypeInfo)typeInfo; + String keyTypeInfo = mapTypeInfo.getMapKeyTypeInfo().getTypeName(); + String valueTypeInfo = formatType(mapTypeInfo.getMapValueTypeInfo()); + return "map<" + keyTypeInfo + "," + valueTypeInfo + ">"; + case UNION: + StringBuilder unionFormattedType = new StringBuilder(); + + UnionTypeInfo unionTypeInfo = (UnionTypeInfo)typeInfo; + for (TypeInfo unionElementTypeInfo : unionTypeInfo.getAllUnionObjectTypeInfos()) { + if (unionFormattedType.length() != 0) { + unionFormattedType.append(", "); + } + + String unionElementType = formatType(unionElementTypeInfo); + unionFormattedType.append(unionElementType); + } + return "uniontype<" + unionFormattedType.toString() + ">"; + default: + throw new RuntimeException("Unknown type: " + typeInfo.getCategory()); + } + } + private String getComment(Table table) { String comment = table.getProperty("comment"); return (comment != null) ? "COMMENT '" + HiveStringUtils.escapeHiveCommand(comment) + "'" : ""; diff --git a/ql/src/test/queries/clientpositive/show_create_table_db_table.q b/ql/src/test/queries/clientpositive/show_create_table_db_table.q index 35ac5bf..ffe3618 100644 --- a/ql/src/test/queries/clientpositive/show_create_table_db_table.q +++ b/ql/src/test/queries/clientpositive/show_create_table_db_table.q @@ -5,12 +5,15 @@ SHOW DATABASES; CREATE TABLE tmp_feng.tmp_showcrt1(key string, value int); CREATE TABLE tmp_feng.tmp_showcrt2(key string, value int) skewed by (key) on ('1','2'); CREATE TABLE tmp_feng.tmp_showcrt3(key string, value int) skewed by (key) on ('1','2') stored as directories; +CREATE TABLE tmp_feng.tmp_showcrt4(s1 struct<p1:string>, s2 struct<p2:array<map<int, uniontype<struct<a:int, b:string>, array<struct<c:int, d:string>>>>>>); USE default; SHOW CREATE TABLE tmp_feng.tmp_showcrt1; SHOW CREATE TABLE tmp_feng.tmp_showcrt2; SHOW CREATE TABLE tmp_feng.tmp_showcrt3; +SHOW CREATE TABLE tmp_feng.tmp_showcrt4; DROP TABLE tmp_feng.tmp_showcrt1; DROP TABLE tmp_feng.tmp_showcrt2; DROP TABLE tmp_feng.tmp_showcrt3; +DROP TABLE tmp_feng.tmp_showcrt4; DROP DATABASE tmp_feng; diff --git a/ql/src/test/results/clientpositive/show_create_table_db_table.q.out b/ql/src/test/results/clientpositive/show_create_table_db_table.q.out index 33410c8..27e68b8 100644 --- a/ql/src/test/results/clientpositive/show_create_table_db_table.q.out +++ b/ql/src/test/results/clientpositive/show_create_table_db_table.q.out @@ -34,6 +34,14 @@ POSTHOOK: query: CREATE TABLE tmp_feng.tmp_showcrt3(key string, value int) skewe POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:tmp_feng POSTHOOK: Output: tmp_feng@tmp_showcrt3 +PREHOOK: query: CREATE TABLE tmp_feng.tmp_showcrt4(s1 struct<p1:string>, s2 struct<p2:array<map<int, uniontype<struct<a:int, b:string>, array<struct<c:int, d:string>>>>>>) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:tmp_feng +PREHOOK: Output: tmp_feng@tmp_showcrt4 +POSTHOOK: query: CREATE TABLE tmp_feng.tmp_showcrt4(s1 struct<p1:string>, s2 struct<p2:array<map<int, uniontype<struct<a:int, b:string>, array<struct<c:int, d:string>>>>>>) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:tmp_feng +POSTHOOK: Output: tmp_feng@tmp_showcrt4 PREHOOK: query: USE default PREHOOK: type: SWITCHDATABASE PREHOOK: Input: database:default @@ -105,6 +113,26 @@ LOCATION TBLPROPERTIES ( 'bucketing_version'='2', #### A masked pattern was here #### +PREHOOK: query: SHOW CREATE TABLE tmp_feng.tmp_showcrt4 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: tmp_feng@tmp_showcrt4 +POSTHOOK: query: SHOW CREATE TABLE tmp_feng.tmp_showcrt4 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: tmp_feng@tmp_showcrt4 +CREATE TABLE `tmp_feng.tmp_showcrt4`( + `s1` struct<`p1`:string>, + `s2` struct<`p2`:array<map<int,uniontype<struct<`a`:int, `b`:string>, array<struct<`c`:int, `d`:string>>>>>>) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.mapred.TextInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' +LOCATION +#### A masked pattern was here #### +TBLPROPERTIES ( + 'bucketing_version'='2', +#### A masked pattern was here #### PREHOOK: query: DROP TABLE tmp_feng.tmp_showcrt1 PREHOOK: type: DROPTABLE PREHOOK: Input: tmp_feng@tmp_showcrt1 @@ -129,6 +157,14 @@ POSTHOOK: query: DROP TABLE tmp_feng.tmp_showcrt3 POSTHOOK: type: DROPTABLE POSTHOOK: Input: tmp_feng@tmp_showcrt3 POSTHOOK: Output: tmp_feng@tmp_showcrt3 +PREHOOK: query: DROP TABLE tmp_feng.tmp_showcrt4 +PREHOOK: type: DROPTABLE +PREHOOK: Input: tmp_feng@tmp_showcrt4 +PREHOOK: Output: tmp_feng@tmp_showcrt4 +POSTHOOK: query: DROP TABLE tmp_feng.tmp_showcrt4 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: tmp_feng@tmp_showcrt4 +POSTHOOK: Output: tmp_feng@tmp_showcrt4 PREHOOK: query: DROP DATABASE tmp_feng PREHOOK: type: DROPDATABASE PREHOOK: Input: database:tmp_feng