From e3c1970a3a715e8e8042384bb81bcc86730d6d81 Mon Sep 17 00:00:00 2001 From: Kunal Khamar Date: Thu, 30 Mar 2017 14:11:58 -0700 Subject: [PATCH 1/4] Add null check to AnalysisException. --- .../src/main/scala/org/apache/spark/sql/AnalysisException.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ff8576157305b..ee21d50c28d26 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 = if (plan == null) "" else plan.map(p => s";\n$p").getOrElse("") getSimpleMessage + planAnnotation } From 14fd95d87e9397fed3614e9c6a19d3bf6ac44dcb Mon Sep 17 00:00:00 2001 From: Kunal Khamar Date: Thu, 30 Mar 2017 14:59:28 -0700 Subject: [PATCH 2/4] Add a unit test. --- .../test/scala/org/apache/spark/sql/SQLQuerySuite.scala | 8 ++++++++ 1 file changed, 8 insertions(+) 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 d9e0196c57957..0dd9296a3f0ff 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) + } + } } From 1606320eecc04c4063a7b47d95b2ef54a7bcef31 Mon Sep 17 00:00:00 2001 From: Kunal Khamar Date: Thu, 30 Mar 2017 15:56:04 -0700 Subject: [PATCH 3/4] Change from review. --- .../src/main/scala/org/apache/spark/sql/AnalysisException.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ee21d50c28d26..6d2fcc0b414a9 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 = if (plan == null) "" else plan.map(p => s";\n$p").getOrElse("") + val planAnnotation = Option(plan).map(p => s";\n$p").getOrElse("") getSimpleMessage + planAnnotation } From c8aebe7a4e3d6dbeaad7c449c94e15c745526cf0 Mon Sep 17 00:00:00 2001 From: Kunal Khamar Date: Thu, 30 Mar 2017 20:15:29 -0700 Subject: [PATCH 4/4] Flatten nested option. --- .../src/main/scala/org/apache/spark/sql/AnalysisException.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6d2fcc0b414a9..50ee6cd4085ea 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 = Option(plan).map(p => s";\n$p").getOrElse("") + val planAnnotation = Option(plan).flatten.map(p => s";\n$p").getOrElse("") getSimpleMessage + planAnnotation }