You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/03/23 18:04:48 UTC
svn commit: r1580538 - in /hive/trunk/ql/src:
java/org/apache/hadoop/hive/ql/udf/generic/
test/org/apache/hadoop/hive/ql/udf/
Author: hashutosh
Date: Sun Mar 23 17:04:48 2014
New Revision: 1580538
URL: http://svn.apache.org/r1580538
Log:
HIVE-6704 : date_add()/date_sub()/datediff() fail with NPE with null input (Jason Dere via Ashutosh Chauhan)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateAdd.java Sun Mar 23 17:04:48 2014
@@ -96,6 +96,9 @@ public class GenericUDFDateAdd extends G
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 class GenericUDFDateAdd extends G
@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();
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateDiff.java Sun Mar 23 17:04:48 2014
@@ -113,9 +113,14 @@ public class GenericUDFDateDiff extends
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 @@ public class GenericUDFDateDiff extends
Converter converter;
switch (inputType) {
case STRING:
+ case VARCHAR:
+ case CHAR:
converter = ObjectInspectorConverters.getConverter(
(PrimitiveObjectInspector) arguments[i],
PrimitiveObjectInspectorFactory.writableStringObjectInspector);
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateSub.java Sun Mar 23 17:04:48 2014
@@ -96,6 +96,9 @@ public class GenericUDFDateSub extends G
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 class GenericUDFDateSub extends G
@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();
Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateAdd.java Sun Mar 23 17:04:48 2014
@@ -47,6 +47,16 @@ public class TestGenericUDFDateAdd exten
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 class TestGenericUDFDateAdd exten
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 class TestGenericUDFDateAdd exten
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));
}
}
Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateDiff.java Sun Mar 23 17:04:48 2014
@@ -48,6 +48,16 @@ public class TestGenericUDFDateDiff exte
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 class TestGenericUDFDateDiff exte
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 class TestGenericUDFDateDiff exte
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));
}
}
Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java?rev=1580538&r1=1580537&r2=1580538&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestGenericUDFDateSub.java Sun Mar 23 17:04:48 2014
@@ -47,6 +47,16 @@ public class TestGenericUDFDateSub exten
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 class TestGenericUDFDateSub exten
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 class TestGenericUDFDateSub exten
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));
}
}