Skip to content
Snippets Groups Projects
Commit 86430cc4 authored by gatorsmile's avatar gatorsmile Committed by Reynold Xin
Browse files

[SPARK-18430][SQL] Fixed Exception Messages when Hitting an Invocation Exception of Function Lookup

### What changes were proposed in this pull request?
When the exception is an invocation exception during function lookup, we return a useless/confusing error message:

For example,
```Scala
df.selectExpr("concat_ws()")
```
Below is the error message we got:
```
null; line 1 pos 0
org.apache.spark.sql.AnalysisException: null; line 1 pos 0
```

To get the meaningful error message, we need to get the cause. The fix is exactly the same as what we did in https://github.com/apache/spark/pull/12136. After the fix, the message we got is the exception issued in the constuctor of function implementation:
```
requirement failed: concat_ws requires at least one argument.; line 1 pos 0
org.apache.spark.sql.AnalysisException: requirement failed: concat_ws requires at least one argument.; line 1 pos 0
```

### How was this patch tested?
Added test cases.

Author: gatorsmile <gatorsmile@gmail.com>

Closes #15878 from gatorsmile/functionNotFound.
parent c31def1d
No related branches found
No related tags found
No related merge requests found
...@@ -446,7 +446,10 @@ object FunctionRegistry { ...@@ -446,7 +446,10 @@ object FunctionRegistry {
// If there is an apply method that accepts Seq[Expression], use that one. // If there is an apply method that accepts Seq[Expression], use that one.
Try(varargCtor.get.newInstance(expressions).asInstanceOf[Expression]) match { Try(varargCtor.get.newInstance(expressions).asInstanceOf[Expression]) match {
case Success(e) => e case Success(e) => e
case Failure(e) => throw new AnalysisException(e.getMessage) case Failure(e) =>
// the exception is an invocation exception. To get a meaningful message, we need the
// cause.
throw new AnalysisException(e.getCause.getMessage)
} }
} else { } else {
// Otherwise, find a constructor method that matches the number of arguments, and use that. // Otherwise, find a constructor method that matches the number of arguments, and use that.
......
-- Argument number exception
select concat_ws();
select format_string();
-- Automatically generated by SQLQueryTestSuite
-- Number of queries: 2
-- !query 0
select concat_ws()
-- !query 0 schema
struct<>
-- !query 0 output
org.apache.spark.sql.AnalysisException
requirement failed: concat_ws requires at least one argument.; line 1 pos 7
-- !query 1
select format_string()
-- !query 1 schema
struct<>
-- !query 1 output
org.apache.spark.sql.AnalysisException
requirement failed: format_string() should take at least 1 argument; line 1 pos 7
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment