diff --git a/ql/src/gen/protobuf/gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java b/ql/src/gen/protobuf/gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java index f4cc2404de83affd806fe423a2d1afc8ff83a938..c6ae032ac6cd182fa79c424ba5e67db1bab61d65 100644 --- a/ql/src/gen/protobuf/gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java +++ b/ql/src/gen/protobuf/gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java @@ -12051,6 +12051,10 @@ public Type parsePartialFrom( * CHAR = 17; */ CHAR(17, 17), + /** + * VOID = 18; + */ + VOID(18, 18), ; /** @@ -12125,6 +12129,10 @@ public Type parsePartialFrom( * CHAR = 17; */ public static final int CHAR_VALUE = 17; + /** + * VOID = 18; + */ + public static final int VOID_VALUE = 18; public final int getNumber() { return value; } @@ -12149,6 +12157,7 @@ public static Kind valueOf(int value) { case 15: return DATE; case 16: return VARCHAR; case 17: return CHAR; + case 18: return VOID; default: return null; } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java index b1a32bccbb0d775dcc8f337122f4241870d39e42..52e44f4e2569ec8b3b9867c30982c1051b03cc13 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java @@ -26,6 +26,7 @@ import org.apache.hadoop.hive.serde2.objectinspector.SettableStructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableVoidObjectInspector; import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; @@ -541,6 +542,9 @@ static public ObjectInspector createObjectInspector(TypeInfo info) { case DECIMAL: return PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( (PrimitiveTypeInfo)info); + case VOID: + return PrimitiveObjectInspectorFactory.getPrimitiveWritableConstantObjectInspector( + (PrimitiveTypeInfo)info, null); default: throw new IllegalArgumentException("Unknown primitive type " + ((PrimitiveTypeInfo) info).getPrimitiveCategory()); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderFactory.java index 23a9af437996d03db1a97b2de5dcab5751f3c024..d8eae3b474627a4039259313087a92c4e108d94e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderFactory.java @@ -236,6 +236,9 @@ private static void getOrcTypesImpl(List result, ObjectInspector type.setPrecision(decTypeInfo.precision()); type.setScale(decTypeInfo.scale()); break; + case VOID: + type.setKind(OrcProto.Type.Kind.VOID); + break; default: throw new IllegalArgumentException("Unknown primitive category: " + ((PrimitiveObjectInspector) inspector).getPrimitiveCategory()); 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..f71e97bbd60fcfd048e679cc452b65cc2161100e --- /dev/null +++ b/ql/src/test/queries/clientpositive/ctas_nullvalueorc.q @@ -0,0 +1,11 @@ +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; +SELECT * from orc_table_with_null1; +SELECT * from orc_table_with_null2; +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..5a5092bc890087ceb7404394d64063fbc67118f7 --- /dev/null +++ b/ql/src/test/results/clientpositive/ctas_nullvalueorc.q.out @@ -0,0 +1,82 @@ +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 [] +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: SELECT * from orc_table_with_null1 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_with_null1 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * from orc_table_with_null1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_with_null1 +#### A masked pattern was here #### +PREHOOK: query: SELECT * from orc_table_with_null2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_with_null2 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * from orc_table_with_null2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_with_null2 +#### A masked pattern was here #### +0 NULL +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