diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java index f0b8e3b..f621715 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java @@ -66,7 +66,7 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { Text str = (Text) converter1.convert(valObject1); IntWritable lenW = (IntWritable) converter2.convert(valObject2); Text pad = (Text) converter3.convert(valObject3); - if (str == null || pad == null || lenW == null) { + if (str == null || pad == null || lenW == null || pad.toString().isEmpty()) { return null; } int len = lenW.get(); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java index 32b2ea2..5b4d09a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java @@ -19,7 +19,6 @@ package org.apache.hadoop.hive.ql.udf.generic; import org.apache.hadoop.hive.ql.exec.Description; -import org.apache.hadoop.io.Text; /** * UDFLpad. @@ -29,10 +28,14 @@ value = "_FUNC_(str, len, pad) - Returns str, left-padded with pad to a length of len", extended = "If str is longer than len, the return value is shortened to " + "len characters.\n" + + "In case of empty pad string, the return value is null.\n" + "Example:\n" + " > SELECT _FUNC_('hi', 5, '??') FROM src LIMIT 1;\n" - + " '???hi'" - + " > SELECT _FUNC_('hi', 1, '??') FROM src LIMIT 1;\n" + " 'h'") + + " '???hi'\n" + + " > SELECT _FUNC_('hi', 1, '??') FROM src LIMIT 1;\n" + + " 'h'\n" + + " > SELECT _FUNC_('hi', 5, '') FROM src LIMIT 1;\n" + + " null\n") public class GenericUDFLpad extends GenericUDFBasePad { public GenericUDFLpad() { super("lpad"); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java index a063b37..92913c6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java @@ -29,9 +29,14 @@ "Returns str, right-padded with pad to a length of len", extended = "If str is longer than len, the return value is shortened to " + "len characters.\n" + + "In case of empty pad string, the return value is null.\n" + "Example:\n" + " > SELECT _FUNC_('hi', 5, '??') FROM src LIMIT 1;\n" - + " 'hi???'" + " > SELECT _FUNC_('hi', 1, '??') FROM src LIMIT 1;\n" + " 'h'") + + " 'hi???'\n" + + " > SELECT _FUNC_('hi', 1, '??') FROM src LIMIT 1;\n" + + " 'h'\n" + + " > SELECT _FUNC_('hi', 5, '') FROM src LIMIT 1;\n" + + " null\n") public class GenericUDFRpad extends GenericUDFBasePad { public GenericUDFRpad() { super("rpad"); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java index f2d1fa9..9929215 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java @@ -43,6 +43,7 @@ public void testLpad() throws HiveException { runAndVerify("hi", 1, "??", "h", udf); runAndVerify("hi", 5, "??", "???hi", udf); runAndVerify("hi", 1, "??", "h", udf); + runAndVerify("hi", 3, "", null, udf); } private void runAndVerify(String str, int len, String pad, String expResult, GenericUDF udf) @@ -51,7 +52,11 @@ private void runAndVerify(String str, int len, String pad, String expResult, Gen DeferredObject valueObj2 = new DeferredJavaObject(new IntWritable(len)); DeferredObject valueObj3 = new DeferredJavaObject(new Text(pad)); DeferredObject[] args = { valueObj1, valueObj2, valueObj3 }; - Text output = (Text) udf.evaluate(args); - assertEquals("lpad() test ", expResult, output.toString()); + Object output = udf.evaluate(args); + if(expResult != null) { + assertEquals("lpad() test ", expResult, output.toString()); + } else { + assertNull("lpad() test ", output); + } } } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java index 62908fd..28c6818 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java @@ -18,10 +18,8 @@ package org.apache.hadoop.hive.ql.udf.generic; import org.apache.hadoop.hive.ql.metadata.HiveException; -import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject; -import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLpad; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.io.IntWritable; @@ -43,6 +41,7 @@ public void testRpad() throws HiveException { runAndVerify("hi", 1, "??", "h", udf); runAndVerify("hi", 5, "??", "hi???", udf); runAndVerify("hi", 1, "??", "h", udf); + runAndVerify("hi", 3, "", null, udf); } private void runAndVerify(String str, int len, String pad, String expResult, GenericUDF udf) @@ -51,7 +50,11 @@ private void runAndVerify(String str, int len, String pad, String expResult, Gen DeferredObject valueObj2 = new DeferredJavaObject(new IntWritable(len)); DeferredObject valueObj3 = new DeferredJavaObject(new Text(pad)); DeferredObject[] args = { valueObj1, valueObj2, valueObj3 }; - Text output = (Text) udf.evaluate(args); - assertEquals("rpad() test ", expResult, output.toString()); + Object output = udf.evaluate(args); + if(expResult != null) { + assertEquals("rpad() test ", expResult, output.toString()); + } else { + assertNull("rpad() test ", output); + } } }