diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 1076dfd4c10e51c7a6ba1ad9101941bc473da483..53cf71ca98aae6e58e27a2ee30635660295c904e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -6477,7 +6477,8 @@ protected Operator genFileSinkPlan(String dest, QB qb, Operator input) } colName = fixCtasColumnName(colName); col.setName(colName); - col.setType(colInfo.getType().getTypeName()); + String typeName = TypeInfoUtils.getSchemaTypeNameFromTypeInfo(colInfo.getType()); + col.setType(typeName); field_schemas.add(col); } diff --git a/ql/src/test/queries/clientpositive/ctas_nullvalueorc.q b/ql/src/test/queries/clientpositive/ctas_nullvalueorc.q new file mode 100644 index 0000000000000000000000000000000000000000..666e4116b1f7aa01768cd6001d9174795eca7a36 --- /dev/null +++ b/ql/src/test/queries/clientpositive/ctas_nullvalueorc.q @@ -0,0 +1,9 @@ +create table if not exists emptytab(value int); +CREATE TABLE orc_table_with_null1 STORED AS ORC AS +SELECT value, null FROM emptytab; +insert into table emptytab select count(*) from emptytab; +CREATE TABLE orc_table_with_null2 STORED AS ORC AS +SELECT value, null FROM emptytab; +DROP TABLE orc_table_with_null2; +DROP TABLE orc_table_with_null1; +DROP TABLE emptytab; diff --git a/ql/src/test/results/clientpositive/ctas_nullvalueorc.q.out b/ql/src/test/results/clientpositive/ctas_nullvalueorc.q.out new file mode 100644 index 0000000000000000000000000000000000000000..c6b50616c37cface67be7fefe83ce6a812b083e8 --- /dev/null +++ b/ql/src/test/results/clientpositive/ctas_nullvalueorc.q.out @@ -0,0 +1,65 @@ +PREHOOK: query: create table if not exists emptytab(value int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@emptytab +POSTHOOK: query: create table if not exists emptytab(value int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@emptytab +PREHOOK: query: CREATE TABLE orc_table_with_null1 STORED AS ORC AS +SELECT value, null FROM emptytab +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@emptytab +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_with_null1 +POSTHOOK: query: CREATE TABLE orc_table_with_null1 STORED AS ORC AS +SELECT value, null FROM emptytab +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@emptytab +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_with_null1 +PREHOOK: query: insert into table emptytab select count(*) from emptytab +PREHOOK: type: QUERY +PREHOOK: Input: default@emptytab +PREHOOK: Output: default@emptytab +POSTHOOK: query: insert into table emptytab select count(*) from emptytab +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emptytab +POSTHOOK: Output: default@emptytab +POSTHOOK: Lineage: emptytab.value EXPRESSION [(emptytab)emptytab.null, ] +PREHOOK: query: CREATE TABLE orc_table_with_null2 STORED AS ORC AS +SELECT value, null FROM emptytab +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@emptytab +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_with_null2 +POSTHOOK: query: CREATE TABLE orc_table_with_null2 STORED AS ORC AS +SELECT value, null FROM emptytab +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@emptytab +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_with_null2 +PREHOOK: query: DROP TABLE orc_table_with_null2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@orc_table_with_null2 +PREHOOK: Output: default@orc_table_with_null2 +POSTHOOK: query: DROP TABLE orc_table_with_null2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@orc_table_with_null2 +POSTHOOK: Output: default@orc_table_with_null2 +PREHOOK: query: DROP TABLE orc_table_with_null1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@orc_table_with_null1 +PREHOOK: Output: default@orc_table_with_null1 +POSTHOOK: query: DROP TABLE orc_table_with_null1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@orc_table_with_null1 +POSTHOOK: Output: default@orc_table_with_null1 +PREHOOK: query: DROP TABLE emptytab +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@emptytab +PREHOOK: Output: default@emptytab +POSTHOOK: query: DROP TABLE emptytab +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@emptytab +POSTHOOK: Output: default@emptytab diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java index a4323d1e4b4e9f662cd36869dee517b35f0a2be9..5d332fc24235abc37b0bb3803ce374fb815690eb 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java @@ -807,4 +807,18 @@ public static int getCharacterLengthForType(PrimitiveTypeInfo typeInfo) { return 0; } } + + /** + * Return the column type name + * @param typeInfo + * @return + */ + public static String getSchemaTypeNameFromTypeInfo(TypeInfo typeinfo) { + String typeName = typeinfo.getTypeName(); + //The schema field can not be void type. + if (typeName.equals(serdeConstants.VOID_TYPE_NAME)) { + typeName = serdeConstants.STRING_TYPE_NAME; + } + return typeName; + } }