diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java index 1b6c64d..3168385 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java @@ -96,6 +96,9 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableStringObjectInspector; switch (inputType1) { case STRING: + case VARCHAR: + case CHAR: + inputType1 = PrimitiveCategory.STRING; textConverter = ObjectInspectorConverters.getConverter( (PrimitiveObjectInspector) arguments[0], PrimitiveObjectInspectorFactory.writableStringObjectInspector); @@ -129,7 +132,14 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (arguments[0].get() == null) { + return null; + } IntWritable toBeAdded = (IntWritable) intWritableConverter.convert(arguments[1].get()); + if (toBeAdded == null) { + return null; + } + switch (inputType1) { case STRING: String dateString = textConverter.convert(arguments[0].get()).toString(); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java index 92b1000..5d8bd0d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java @@ -113,9 +113,14 @@ private Date convertToDate(PrimitiveCategory inputType, Converter converter, Def throws HiveException { assert(converter != null); assert(argument != null); + if (argument.get() == null) { + return null; + } Date date = new Date(); switch (inputType) { case STRING: + case VARCHAR: + case CHAR: String dateString = converter.convert(argument.get()).toString(); try { date = formatter.parse(dateString); @@ -149,6 +154,8 @@ private Converter checkArguments(ObjectInspector[] arguments, int i) throws UDFA Converter converter; switch (inputType) { case STRING: + case VARCHAR: + case CHAR: converter = ObjectInspectorConverters.getConverter( (PrimitiveObjectInspector) arguments[i], PrimitiveObjectInspectorFactory.writableStringObjectInspector); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java index 125e467..1685a86 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java @@ -96,6 +96,9 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableStringObjectInspector; switch (inputType1) { case STRING: + case VARCHAR: + case CHAR: + inputType1 = PrimitiveCategory.STRING; textConverter = ObjectInspectorConverters.getConverter( (PrimitiveObjectInspector) arguments[0], PrimitiveObjectInspectorFactory.writableStringObjectInspector); @@ -129,7 +132,14 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (arguments[0].get() == null) { + return null; + } IntWritable toBeSubed = (IntWritable) intWritableConverter.convert(arguments[1].get()); + if (toBeSubed == null) { + return null; + } + switch (inputType1) { case STRING: String dateString = textConverter.convert(arguments[0].get()).toString(); diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java index ee841d3..53b8f93 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java @@ -47,6 +47,16 @@ public void testStringToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_add() test for STRING failed ", "2009-07-22", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testTimestampToDate() throws HiveException { @@ -63,6 +73,16 @@ public void testTimestampToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_add() test for TIMESTAMP failed ", "2009-07-23", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testDateWritablepToDate() throws HiveException { @@ -79,6 +99,16 @@ public void testDateWritablepToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_add() test for DATEWRITABLE failed ", "2009-07-24", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } } diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java index 936c554..849e70c 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java @@ -48,6 +48,16 @@ public void testStringToDate() throws HiveException { IntWritable output = (IntWritable) udf.evaluate(args); assertEquals("date_iff() test for STRING failed ", "-2", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testTimestampToDate() throws HiveException { @@ -65,6 +75,16 @@ public void testTimestampToDate() throws HiveException { IntWritable output = (IntWritable) udf.evaluate(args); assertEquals("datediff() test for TIMESTAMP failed ", "3", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testDateWritablepToDate() throws HiveException { @@ -81,6 +101,16 @@ public void testDateWritablepToDate() throws HiveException { IntWritable output = (IntWritable) udf.evaluate(args); assertEquals("datediff() test for DATEWRITABLE failed ", "10", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } } diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java index 46153e0..d419ef2 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java @@ -47,6 +47,16 @@ public void testStringToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_sub() test for STRING failed ", "2009-07-18", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testTimestampToDate() throws HiveException { @@ -63,6 +73,16 @@ public void testTimestampToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_sub() test for TIMESTAMP failed ", "2009-07-17", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } public void testDateWritablepToDate() throws HiveException { @@ -79,6 +99,16 @@ public void testDateWritablepToDate() throws HiveException { Text output = (Text) udf.evaluate(args); assertEquals("date_sub() test for DATEWRITABLE failed ", "2009-07-16", output.toString()); + + // Test with null args + args = new DeferredObject[] { new DeferredJavaObject(null), valueObj2 }; + assertNull("date_add() 1st arg null", udf.evaluate(args)); + + args = new DeferredObject[] { valueObj1, new DeferredJavaObject(null) }; + assertNull("date_add() 2nd arg null", udf.evaluate(args)); + + args = new DeferredObject[] { new DeferredJavaObject(null), new DeferredJavaObject(null) }; + assertNull("date_add() both args null", udf.evaluate(args)); } }