HIVE-20879: Using null in a projection expression leads to CastException (David Lavati via Zoltan Haindrich)
Signed-off-by: Zoltan Haindrich <k...@rxd.hu> Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/34c8ca43 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/34c8ca43 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/34c8ca43 Branch: refs/heads/master Commit: 34c8ca432c5802192ef07d92ca81e5eea22d6c6b Parents: 750b7c1 Author: David Lavati <david.lav...@gmail.com> Authored: Mon Jan 21 14:48:10 2019 +0100 Committer: Zoltan Haindrich <k...@rxd.hu> Committed: Mon Jan 21 14:48:10 2019 +0100 ---------------------------------------------------------------------- .../hive/ql/parse/TypeCheckProcFactory.java | 6 +++ ql/src/test/queries/clientpositive/cast3.q | 9 +++++ ql/src/test/results/clientpositive/cast3.q.out | 40 ++++++++++++++++++++ 3 files changed, 55 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/34c8ca43/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index fa4abf9..b49bb36 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -1229,6 +1229,9 @@ public class TypeCheckProcFactory { List<ExprNodeDesc> childrenList = new ArrayList<ExprNodeDesc>( children.size()); for (ExprNodeDesc child : children) { + if (TypeInfoFactory.getPrimitiveTypeInfo("void").equals(child.getTypeInfo())) { + child.setTypeInfo(TypeInfoFactory.getPrimitiveTypeInfo("boolean")); + } if (FunctionRegistry.isOpOr(child)) { childrenList.addAll(child.getChildren()); } else { @@ -1242,6 +1245,9 @@ public class TypeCheckProcFactory { List<ExprNodeDesc> childrenList = new ArrayList<ExprNodeDesc>( children.size()); for (ExprNodeDesc child : children) { + if (TypeInfoFactory.getPrimitiveTypeInfo("void").equals(child.getTypeInfo())) { + child.setTypeInfo(TypeInfoFactory.getPrimitiveTypeInfo("boolean")); + } if (FunctionRegistry.isOpAnd(child)) { childrenList.addAll(child.getChildren()); } else { http://git-wip-us.apache.org/repos/asf/hive/blob/34c8ca43/ql/src/test/queries/clientpositive/cast3.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientpositive/cast3.q b/ql/src/test/queries/clientpositive/cast3.q new file mode 100644 index 0000000..a01eb3a --- /dev/null +++ b/ql/src/test/queries/clientpositive/cast3.q @@ -0,0 +1,9 @@ +create table cx1(bool0 boolean); + +select cast(NULL as boolean) or bool0 from cx1; + +select NULL or bool0 from cx1; + +select cast(NULL as boolean) and bool0 from cx1; + +select NULL and bool0 from cx1; http://git-wip-us.apache.org/repos/asf/hive/blob/34c8ca43/ql/src/test/results/clientpositive/cast3.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/cast3.q.out b/ql/src/test/results/clientpositive/cast3.q.out new file mode 100644 index 0000000..d3234e9 --- /dev/null +++ b/ql/src/test/results/clientpositive/cast3.q.out @@ -0,0 +1,40 @@ +PREHOOK: query: create table cx1(bool0 boolean) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@cx1 +POSTHOOK: query: create table cx1(bool0 boolean) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@cx1 +PREHOOK: query: select cast(NULL as boolean) or bool0 from cx1 +PREHOOK: type: QUERY +PREHOOK: Input: default@cx1 +#### A masked pattern was here #### +POSTHOOK: query: select cast(NULL as boolean) or bool0 from cx1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@cx1 +#### A masked pattern was here #### +PREHOOK: query: select NULL or bool0 from cx1 +PREHOOK: type: QUERY +PREHOOK: Input: default@cx1 +#### A masked pattern was here #### +POSTHOOK: query: select NULL or bool0 from cx1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@cx1 +#### A masked pattern was here #### +PREHOOK: query: select cast(NULL as boolean) and bool0 from cx1 +PREHOOK: type: QUERY +PREHOOK: Input: default@cx1 +#### A masked pattern was here #### +POSTHOOK: query: select cast(NULL as boolean) and bool0 from cx1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@cx1 +#### A masked pattern was here #### +PREHOOK: query: select NULL and bool0 from cx1 +PREHOOK: type: QUERY +PREHOOK: Input: default@cx1 +#### A masked pattern was here #### +POSTHOOK: query: select NULL and bool0 from cx1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@cx1 +#### A masked pattern was here ####