diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDate.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDate.java index 9ee9480..2334395 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDate.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDate.java @@ -74,6 +74,8 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen inputType = argumentOI.getPrimitiveCategory(); ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableStringObjectInspector; switch (inputType) { + case VOID: + break; case CHAR: case VARCHAR: case STRING: @@ -103,6 +105,8 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { } switch (inputType) { + case VOID: + throw new UDFArgumentException("TO_DATE() received non-null object of VOID type"); case STRING: Date date; String dateString = textConverter.convert(arguments[0].get()).toString(); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDate.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDate.java index 0d40ff7..429a4f6 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDate.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDate.java @@ -23,6 +23,7 @@ import junit.framework.TestCase; +import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject; @@ -89,4 +90,26 @@ public void testDateWritablepToDate() throws HiveException { assertNull("to_date() with null DATE", output); } + public void testVoidToDate() throws HiveException { + GenericUDFDate udf = new GenericUDFDate(); + ObjectInspector valueOI = PrimitiveObjectInspectorFactory.writableVoidObjectInspector; + ObjectInspector[] arguments = {valueOI}; + + udf.initialize(arguments); + DeferredObject[] args = { new DeferredJavaObject(null) }; + Text output = (Text) udf.evaluate(args); + + // Try with null VOID + assertNull("to_date() with null DATE ", output); + + // Try with erroneously generated VOID + DeferredObject[] junkArgs = { new DeferredJavaObject(new Text("2015-11-22")) }; + try { + udf.evaluate(junkArgs); + fail("to_date() test with VOID non-null failed"); + } catch (UDFArgumentException udfae) { + assertEquals("TO_DATE() received non-null object of VOID type", udfae.getMessage()); + } + } + }