diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCase.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCase.java index 07cc84c..53af7ed 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCase.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCase.java @@ -23,6 +23,7 @@ import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils; /** @@ -89,11 +90,15 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen } } - return returnOIResolver.get(); + ObjectInspector resolved = returnOIResolver.get(); + return resolved == null ? PrimitiveObjectInspectorFactory.javaVoidObjectInspector : resolved; } @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (returnOIResolver.get() == null) { + return null; + } Object exprValue = arguments[0].get(); for (int i = 1; i + 1 < arguments.length; i += 2) { Object caseKey = arguments[i].get(); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFWhen.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFWhen.java index 3853540..ebc0d7a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFWhen.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFWhen.java @@ -24,6 +24,7 @@ import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; /** * GenericUDF Class for SQL construct @@ -84,11 +85,15 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen } } - return returnOIResolver.get(); + ObjectInspector resolved = returnOIResolver.get(); + return resolved == null ? PrimitiveObjectInspectorFactory.javaVoidObjectInspector : resolved; } @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (returnOIResolver.get() == null) { + return null; + } for (int i = 0; i + 1 < arguments.length; i += 2) { Object caseKey = arguments[i].get(); if (caseKey != null diff --git ql/src/test/queries/clientpositive/udf_case.q ql/src/test/queries/clientpositive/udf_case.q index 43573bf..7582200 100644 --- ql/src/test/queries/clientpositive/udf_case.q +++ ql/src/test/queries/clientpositive/udf_case.q @@ -80,3 +80,5 @@ SELECT CASE 1 ELSE cast('ijkl' as char(4)) END FROM src tablesample (1 rows); + +select case 1 when 1 then null when 2 then null end from src tablesample (1 rows); diff --git ql/src/test/queries/clientpositive/udf_when.q ql/src/test/queries/clientpositive/udf_when.q index 4eb7f69..04b18cf 100644 --- ql/src/test/queries/clientpositive/udf_when.q +++ ql/src/test/queries/clientpositive/udf_when.q @@ -74,3 +74,5 @@ SELECT CASE ELSE cast('ijkl' as char(4)) END FROM src tablesample (1 rows); + +select case when 1=1 then null when 1=2 then null end from src tablesample (1 rows); diff --git ql/src/test/results/clientpositive/udf_case.q.out ql/src/test/results/clientpositive/udf_case.q.out index ed0aac0..2a98eb0 100644 --- ql/src/test/results/clientpositive/udf_case.q.out +++ ql/src/test/results/clientpositive/udf_case.q.out @@ -209,3 +209,12 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 123 123.0 abcd +PREHOOK: query: select case 1 when 1 then null when 2 then null end from src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select case 1 when 1 then null when 2 then null end from src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +NULL diff --git ql/src/test/results/clientpositive/udf_when.q.out ql/src/test/results/clientpositive/udf_when.q.out index 52f15b3..aa54f47 100644 --- ql/src/test/results/clientpositive/udf_when.q.out +++ ql/src/test/results/clientpositive/udf_when.q.out @@ -192,3 +192,12 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 123 123.0 abcd +PREHOOK: query: select case when 1=1 then null when 1=2 then null end from src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select case when 1=1 then null when 1=2 then null end from src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +NULL diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaVoidObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaVoidObjectInspector.java index 4ea3651..07ffb17 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaVoidObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaVoidObjectInspector.java @@ -17,14 +17,14 @@ */ package org.apache.hadoop.hive.serde2.objectinspector.primitive; +import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; -import org.apache.hadoop.io.NullWritable; /** * A JavaVoidObjectInspector inspects a Java Void Object. */ public class JavaVoidObjectInspector extends - AbstractPrimitiveJavaObjectInspector implements VoidObjectInspector { + AbstractPrimitiveJavaObjectInspector implements VoidObjectInspector, ConstantObjectInspector { JavaVoidObjectInspector() { super(TypeInfoFactory.voidTypeInfo); @@ -32,7 +32,11 @@ @Override public Object getPrimitiveWritableObject(Object o) { - return NullWritable.get(); + return null; } + @Override + public Object getWritableConstantValue() { + return null; + } }