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