Repository: spark
Updated Branches:
  refs/heads/master a8a765b3f -> 254877c2f


[SPARK-20164][SQL] AnalysisException not tolerant of null query plan.

## What changes were proposed in this pull request?

The query plan in an `AnalysisException` may be `null` when an 
`AnalysisException` object is serialized and then deserialized, since `plan` is 
marked `transient`. Or when someone throws an `AnalysisException` with a null 
query plan (which should not happen).
`def getMessage` is not tolerant of this and throws a `NullPointerException`, 
leading to loss of information about the original exception.
The fix is to add a `null` check in `getMessage`.

## How was this patch tested?

- Unit test

Author: Kunal Khamar <kkha...@outlook.com>

Closes #17486 from kunalkhamar/spark-20164.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/254877c2
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/254877c2
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/254877c2

Branch: refs/heads/master
Commit: 254877c2f04414c70d92fa0a00c0ecee1d73aba7
Parents: a8a765b
Author: Kunal Khamar <kkha...@outlook.com>
Authored: Fri Mar 31 09:17:22 2017 -0700
Committer: Xiao Li <gatorsm...@gmail.com>
Committed: Fri Mar 31 09:17:22 2017 -0700

----------------------------------------------------------------------
 .../main/scala/org/apache/spark/sql/AnalysisException.scala  | 2 +-
 .../src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala  | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/254877c2/sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala
index ff85761..50ee6cd 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/AnalysisException.scala
@@ -43,7 +43,7 @@ class AnalysisException protected[sql] (
   }
 
   override def getMessage: String = {
-    val planAnnotation = plan.map(p => s";\n$p").getOrElse("")
+    val planAnnotation = Option(plan).flatten.map(p => s";\n$p").getOrElse("")
     getSimpleMessage + planAnnotation
   }
 

http://git-wip-us.apache.org/repos/asf/spark/blob/254877c2/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index d9e0196..0dd9296 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -2598,4 +2598,12 @@ class SQLQuerySuite extends QueryTest with 
SharedSQLContext {
     }
     assert(!jobStarted.get(), "Command should not trigger a Spark job.")
   }
+
+  test("SPARK-20164: AnalysisException should be tolerant to null query plan") 
{
+    try {
+      throw new AnalysisException("", None, None, plan = null)
+    } catch {
+      case ae: AnalysisException => assert(ae.plan == null && ae.getMessage == 
ae.getSimpleMessage)
+    }
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to