You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kg...@apache.org on 2019/03/08 09:05:39 UTC

[hive] 02/02: HIVE-19968: UDF exception is not throw out (Laszlo Bodor via Zoltan Haindrich)

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 <bo...@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 <ki...@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