This is an automated email from the ASF dual-hosted git repository. kgyrtkirk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
commit d42809ea49b4afe34a8f648f6e406c46b9d412d6 Author: Laszlo Bodor <bodorlaszlo0...@gmail.com> AuthorDate: Fri Mar 8 09:40:45 2019 +0100 HIVE-19968: UDF exception is not throw out (Laszlo Bodor via Zoltan Haindrich) Signed-off-by: Zoltan Haindrich <k...@rxd.hu> --- .../hive/ql/udf/generic/GenericUDFReflect.java | 13 +++++++++++-- ql/src/test/queries/clientpositive/udf_reflect.q | 6 ++++-- ql/src/test/results/clientpositive/udf_reflect.q.out | 20 ++++++++++++-------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java index 9e364af..471a6a1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java @@ -22,6 +22,7 @@ import java.util.Arrays; import org.apache.hadoop.hive.common.JavaUtils; import org.apache.hadoop.hive.ql.exec.Description; +import org.apache.hadoop.hive.ql.exec.FunctionRegistry; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException; import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; @@ -33,6 +34,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.Pr import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector; import org.apache.hadoop.util.ReflectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A simple generic udf to call java static functions via reflection. @@ -42,6 +45,7 @@ import org.apache.hadoop.util.ReflectionUtils; extended = "Use this UDF to call Java methods by matching the argument signature\n") @UDFType(deterministic = false) public class GenericUDFReflect extends AbstractGenericUDFReflect { + private static final Logger LOG = LoggerFactory.getLogger(GenericUDFReflect.class); private transient StringObjectInspector inputClassNameOI; private transient StringObjectInspector inputMethodNameOI; @@ -105,13 +109,18 @@ public class GenericUDFReflect extends AbstractGenericUDFReflect { try { c = JavaUtils.loadClass(classNameString); } catch (ClassNotFoundException ex) { - throw new HiveException("UDFReflect evaluate ", ex); + throw new HiveException(String.format("UDFReflect evaluate error while loading class %s", classNameString), ex); } try { o = null; o = ReflectionUtils.newInstance(c, null); } catch (Exception e) { - // ignored + if (e.getCause() instanceof NoSuchMethodException){ + // still could be okay while using a static method of a class that hasn't got a default/parameterless constructor + LOG.trace("ignoring NoSuchMethodException while instantiating class", e); + }else{ + throw new HiveException(String.format("UDFReflect evaluate error while instantiating class %s", classNameString), e); + } } classNameChanged = true; } diff --git a/ql/src/test/queries/clientpositive/udf_reflect.q b/ql/src/test/queries/clientpositive/udf_reflect.q index c7cdd7f..90ef5bb 100644 --- a/ql/src/test/queries/clientpositive/udf_reflect.q +++ b/ql/src/test/queries/clientpositive/udf_reflect.q @@ -12,7 +12,8 @@ SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows); @@ -23,5 +24,6 @@ SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows); diff --git a/ql/src/test/results/clientpositive/udf_reflect.q.out b/ql/src/test/results/clientpositive/udf_reflect.q.out index 40e1d84..57b3b30 100644 --- a/ql/src/test/results/clientpositive/udf_reflect.q.out +++ b/ql/src/test/results/clientpositive/udf_reflect.q.out @@ -21,7 +21,8 @@ SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows) PREHOOK: type: QUERY PREHOOK: Input: default@src @@ -34,7 +35,8 @@ SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src @@ -53,9 +55,9 @@ STAGE PLANS: Statistics: Num rows: 500 Data size: 43500 Basic stats: COMPLETE Column stats: COMPLETE GatherStats: false Select Operator - expressions: reflect('java.lang.String','valueOf',1) (type: string), reflect('java.lang.String','isEmpty') (type: string), reflect('java.lang.Math','max',2,3) (type: string), reflect('java.lang.Math','min',2,3) (type: string), reflect('java.lang.Math','round',2.5D) (type: string), round(reflect('java.lang.Math','exp',1.0D), 6) (type: double), reflect('java.lang.Math','floor',1.9D) (type: string), reflect('java.lang.Integer','valueOf',key,16) (type: string) - outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7 - Statistics: Num rows: 500 Data size: 648000 Basic stats: COMPLETE Column stats: COMPLETE + expressions: reflect('java.lang.String','valueOf',1) (type: string), reflect('java.lang.String','isEmpty') (type: string), reflect('java.lang.Math','max',2,3) (type: string), reflect('java.lang.Math','min',2,3) (type: string), reflect('java.lang.Math','round',2.5D) (type: string), round(reflect('java.lang.Math','exp',1.0D), 6) (type: double), reflect('java.lang.Math','floor',1.9D) (type: string), reflect('java.lang.Integer','valueOf',key,16) (type: string), reflect('java.lang [...] + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8 + Statistics: Num rows: 500 Data size: 740000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1), @@ -65,7 +67,8 @@ PREHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows) PREHOOK: type: QUERY PREHOOK: Input: default@src @@ -77,9 +80,10 @@ POSTHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1), reflect("java.lang.Math", "round", 2.5D), round(reflect("java.lang.Math", "exp", 1.0D), 6), reflect("java.lang.Math", "floor", 1.9D), - reflect("java.lang.Integer", "valueOf", key, 16) + reflect("java.lang.Integer", "valueOf", key, 16), + reflect("java.lang.Integer", "valueOf", "16") FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -1 true 3 2 3 2.718282 1.0 568 +1 true 3 2 3 2.718282 1.0 568 16