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 <[email protected]>
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