diff --git ql/src/test/queries/clientpositive/analyze_npe.q ql/src/test/queries/clientpositive/analyze_npe.q new file mode 100644 index 0000000000..e7cfea0c17 --- /dev/null +++ ql/src/test/queries/clientpositive/analyze_npe.q @@ -0,0 +1,26 @@ +drop table if exists explain_npe_map; +drop table if exists explain_npe_array; +drop table if exists explain_npe_struct; + +create table explain_npe_map ( c1 map ); +create table explain_npe_array ( c1 array ); +create table explain_npe_struct ( c1 struct ); + +-- error +set hive.cbo.enable=false; +explain select c1 from explain_npe_map where c1 is null; +explain select c1 from explain_npe_array where c1 is null; +-- maybe correct in branch of master, +-- but i think it is necessary to initialize the value of StandardConstantStructObjectInspector +explain select c1 from explain_npe_struct where c1 is null; + +-- correct +set hive.cbo.enable=true; +explain select c1 from explain_npe_map where c1 is null; +explain select c1 from explain_npe_array where c1 is null; +explain select c1 from explain_npe_struct where c1 is null; + +-- drop test table +drop table if exists explain_npe_map; +drop table if exists explain_npe_array; +drop table if exists explain_npe_struct; \ No newline at end of file diff --git ql/src/test/results/clientpositive/analyze_npe.q.out ql/src/test/results/clientpositive/analyze_npe.q.out new file mode 100644 index 0000000000..158d35177a --- /dev/null +++ ql/src/test/results/clientpositive/analyze_npe.q.out @@ -0,0 +1,283 @@ +PREHOOK: query: drop table if exists explain_npe_map +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists explain_npe_map +POSTHOOK: type: DROPTABLE +PREHOOK: query: drop table if exists explain_npe_array +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists explain_npe_array +POSTHOOK: type: DROPTABLE +PREHOOK: query: drop table if exists explain_npe_struct +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists explain_npe_struct +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table explain_npe_map ( c1 map ) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@explain_npe_map +POSTHOOK: query: create table explain_npe_map ( c1 map ) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@explain_npe_map +PREHOOK: query: create table explain_npe_array ( c1 array ) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@explain_npe_array +POSTHOOK: query: create table explain_npe_array ( c1 array ) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@explain_npe_array +PREHOOK: query: create table explain_npe_struct ( c1 struct ) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@explain_npe_struct +POSTHOOK: query: create table explain_npe_struct ( c1 struct ) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@explain_npe_struct +PREHOOK: query: explain select c1 from explain_npe_map where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_map +#### A masked pattern was here #### +POSTHOOK: query: explain select c1 from explain_npe_map where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_map +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_map + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: Const map null (type: map) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select c1 from explain_npe_array where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_array +#### A masked pattern was here #### +POSTHOOK: query: explain select c1 from explain_npe_array where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_array +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_array + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: Const array null (type: array) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select c1 from explain_npe_struct where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_struct +#### A masked pattern was here #### +POSTHOOK: query: explain select c1 from explain_npe_struct where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_struct +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_struct + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 48 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 48 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: const struct(null,null) (type: struct) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 48 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 48 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select c1 from explain_npe_map where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_map +#### A masked pattern was here #### +POSTHOOK: query: explain select c1 from explain_npe_map where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_map +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_map + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: Const map null (type: map) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select c1 from explain_npe_array where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_array +#### A masked pattern was here #### +POSTHOOK: query: explain select c1 from explain_npe_array where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_array +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_array + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: Const array null (type: array) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 40 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select c1 from explain_npe_struct where c1 is null +PREHOOK: type: QUERY +PREHOOK: Input: default@explain_npe_struct +#### A masked pattern was here ####ExprNodeConstantDesc +POSTHOOK: query: explain select c1 from explain_npe_struct where c1 is null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@explain_npe_struct +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: explain_npe_struct + filterExpr: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: c1 is null (type: boolean) + Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: null (type: void) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java index c0cdae4d32..076eb9963e 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hive.serde2.objectinspector; +import java.util.ArrayList; import java.util.List; /** @@ -30,7 +31,7 @@ public class StandardConstantListObjectInspector extends StandardListObjectInspector implements ConstantObjectInspector { - private List value; + private List value = new ArrayList<>(); protected StandardConstantListObjectInspector() { super(); @@ -41,7 +42,9 @@ protected StandardConstantListObjectInspector() { protected StandardConstantListObjectInspector( ObjectInspector listElementObjectInspector, List value) { super(listElementObjectInspector); - this.value = value; + if (null != value) { + this.value = value; + } } @Override diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java index 55b9fc8c2f..e7ab565928 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hive.serde2.objectinspector; +import java.util.HashMap; import java.util.Map; /** @@ -30,7 +31,7 @@ public class StandardConstantMapObjectInspector extends StandardMapObjectInspector implements ConstantObjectInspector { - private Map value; + private Map value = new HashMap<>(); protected StandardConstantMapObjectInspector() { super(); @@ -40,8 +41,10 @@ protected StandardConstantMapObjectInspector() { */ protected StandardConstantMapObjectInspector(ObjectInspector mapKeyObjectInspector, ObjectInspector mapValueObjectInspector, Map value) { - super(mapKeyObjectInspector, mapValueObjectInspector); - this.value = value; + super(mapKeyObjectInspector, mapValueObjectInspector); + if (null != value) { + this.value = value; + } } @Override diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantStructObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantStructObjectInspector.java index cf0be75d48..65ba0cc72f 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantStructObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantStructObjectInspector.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hive.serde2.objectinspector; +import java.util.ArrayList; import java.util.List; /** @@ -30,7 +31,7 @@ public class StandardConstantStructObjectInspector extends StandardStructObjectInspector implements ConstantObjectInspector { - private List value; + private List value = new ArrayList<>(); protected StandardConstantStructObjectInspector() { super(); @@ -41,7 +42,9 @@ protected StandardConstantStructObjectInspector() { protected StandardConstantStructObjectInspector(List structFieldNames, List structFieldObjectInspectors, List value) { super(structFieldNames, structFieldObjectInspectors); - this.value = value; + if (null != value) { + this.value = value; + } } @Override