Return-Path: X-Original-To: apmail-hive-commits-archive@www.apache.org Delivered-To: apmail-hive-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C1BE1101F6 for ; Sun, 23 Mar 2014 17:05:17 +0000 (UTC) Received: (qmail 1504 invoked by uid 500); 23 Mar 2014 17:05:17 -0000 Delivered-To: apmail-hive-commits-archive@hive.apache.org Received: (qmail 1338 invoked by uid 500); 23 Mar 2014 17:05:16 -0000 Mailing-List: contact commits-help@hive.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hive-dev@hive.apache.org Delivered-To: mailing list commits@hive.apache.org Received: (qmail 1330 invoked by uid 99); 23 Mar 2014 17:05:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 23 Mar 2014 17:05:15 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 23 Mar 2014 17:05:11 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 38CED23888E2; Sun, 23 Mar 2014 17:04:49 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1580538 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/udf/generic/ test/org/apache/hadoop/hive/ql/udf/ Date: Sun, 23 Mar 2014 17:04:48 -0000 To: commits@hive.apache.org From: hashutosh@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140323170449.38CED23888E2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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)); } }