diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java index ffd14e0..2fbdf54 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcStruct.java @@ -17,14 +17,6 @@ */ package org.apache.hadoop.hive.ql.io.orc; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector; @@ -43,6 +35,14 @@ import org.apache.hadoop.hive.serde2.typeinfo.UnionTypeInfo; import org.apache.hadoop.io.Writable; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + final public class OrcStruct implements Writable { private Object[] fields; @@ -346,17 +346,26 @@ public ObjectInspector getMapValueObjectInspector() { @Override public Object getMapValueElement(Object map, Object key) { + if (map == null) { + return null; + } return ((Map) map).get(key); } @Override @SuppressWarnings("unchecked") public Map getMap(Object map) { + if (map == null) { + return null; + } return (Map) map; } @Override public int getMapSize(Object map) { + if (map == null) { + return -1; + } return ((Map) map).size(); } @@ -429,17 +438,26 @@ public ObjectInspector getListElementObjectInspector() { @Override public Object getListElement(Object list, int i) { + if (list == null) { + return null; + } return ((List) list).get(i); } @Override public int getListLength(Object list) { + if (list == null) { + return -1; + } return ((List) list).size(); } @Override @SuppressWarnings("unchecked") public List getList(Object list) { + if (list == null) { + return null; + } return (List) list; } diff --git ql/src/test/queries/clientpositive/orc_null_check.q ql/src/test/queries/clientpositive/orc_null_check.q new file mode 100644 index 0000000..2cb1190 --- /dev/null +++ ql/src/test/queries/clientpositive/orc_null_check.q @@ -0,0 +1,8 @@ +create table listtable(l array); +create table listtable_orc(l array) stored as orc; + +insert overwrite table listtable select array(null) from src; +insert overwrite table listtable_orc select * from listtable; + +select size(l) from listtable_orc limit 10; + diff --git ql/src/test/results/clientpositive/orc_null_check.q.out ql/src/test/results/clientpositive/orc_null_check.q.out new file mode 100644 index 0000000..093fdff --- /dev/null +++ ql/src/test/results/clientpositive/orc_null_check.q.out @@ -0,0 +1,52 @@ +PREHOOK: query: create table listtable(l array) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@listtable +POSTHOOK: query: create table listtable(l array) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@listtable +PREHOOK: query: create table listtable_orc(l array) stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@listtable_orc +POSTHOOK: query: create table listtable_orc(l array) stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@listtable_orc +PREHOOK: query: insert overwrite table listtable select array(null) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@listtable +POSTHOOK: query: insert overwrite table listtable select array(null) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@listtable +POSTHOOK: Lineage: listtable.l EXPRESSION [] +PREHOOK: query: insert overwrite table listtable_orc select * from listtable +PREHOOK: type: QUERY +PREHOOK: Input: default@listtable +PREHOOK: Output: default@listtable_orc +POSTHOOK: query: insert overwrite table listtable_orc select * from listtable +POSTHOOK: type: QUERY +POSTHOOK: Input: default@listtable +POSTHOOK: Output: default@listtable_orc +POSTHOOK: Lineage: listtable_orc.l SIMPLE [(listtable)listtable.FieldSchema(name:l, type:array, comment:null), ] +PREHOOK: query: select size(l) from listtable_orc limit 10 +PREHOOK: type: QUERY +PREHOOK: Input: default@listtable_orc +#### A masked pattern was here #### +POSTHOOK: query: select size(l) from listtable_orc limit 10 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@listtable_orc +#### A masked pattern was here #### +-1 +-1 +-1 +-1 +-1 +-1 +-1 +-1 +-1 +-1