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

Reply via email to