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..9f75b66 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") 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..21d1cab 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 @@ -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; /** * UDFRpad. @@ -29,9 +28,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") 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); + } } } diff --git a/ql/src/test/results/clientpositive/udf_lpad.q.out b/ql/src/test/results/clientpositive/udf_lpad.q.out index 7d7cc92..4dcb105 100644 --- a/ql/src/test/results/clientpositive/udf_lpad.q.out +++ b/ql/src/test/results/clientpositive/udf_lpad.q.out @@ -9,10 +9,14 @@ POSTHOOK: query: DESCRIBE FUNCTION EXTENDED lpad POSTHOOK: type: DESCFUNCTION lpad(str, len, pad) - Returns str, left-padded with pad to a length of len If str is longer than len, the return value is shortened to len characters. +In case of empty pad string, the return value is null. Example: > SELECT lpad('hi', 5, '??') FROM src LIMIT 1; - '???hi' > SELECT lpad('hi', 1, '??') FROM src LIMIT 1; + '???hi' + > SELECT lpad('hi', 1, '??') FROM src LIMIT 1; 'h' + > SELECT lpad('hi', 5, '') FROM src LIMIT 1; + null Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFLpad Function type:BUILTIN PREHOOK: query: EXPLAIN SELECT diff --git a/ql/src/test/results/clientpositive/udf_rpad.q.out b/ql/src/test/results/clientpositive/udf_rpad.q.out index bf77b7f..0a80f66 100644 --- a/ql/src/test/results/clientpositive/udf_rpad.q.out +++ b/ql/src/test/results/clientpositive/udf_rpad.q.out @@ -9,10 +9,14 @@ POSTHOOK: query: DESCRIBE FUNCTION EXTENDED rpad POSTHOOK: type: DESCFUNCTION rpad(str, len, pad) - Returns str, right-padded with pad to a length of len If str is longer than len, the return value is shortened to len characters. +In case of empty pad string, the return value is null. Example: > SELECT rpad('hi', 5, '??') FROM src LIMIT 1; - 'hi???' > SELECT rpad('hi', 1, '??') FROM src LIMIT 1; + 'hi???' + > SELECT rpad('hi', 1, '??') FROM src LIMIT 1; 'h' + > SELECT rpad('hi', 5, '') FROM src LIMIT 1; + null Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFRpad Function type:BUILTIN PREHOOK: query: EXPLAIN SELECT