From 86582ef421818110a3c2f4705a9e461dd9a17ffe Mon Sep 17 00:00:00 2001 From: Dilip Biswal Date: Wed, 8 Mar 2017 11:02:02 -0800 Subject: [PATCH 1/2] [SQL][MINOR] The analyzer rules are fired twice for cases AnalysisException is raised from analyzer rules --- .../org/apache/spark/sql/execution/QueryExecution.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala index 6ec2f4d840862..4fa5b33c9e25d 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala @@ -46,9 +46,13 @@ class QueryExecution(val sparkSession: SparkSession, val logical: LogicalPlan) { protected def planner = sparkSession.sessionState.planner def assertAnalyzed(): Unit = { - try sparkSession.sessionState.analyzer.checkAnalysis(analyzed) catch { + var analyzedPlan: Option[LogicalPlan] = None + try { + analyzedPlan = Some(analyzed) + sparkSession.sessionState.analyzer.checkAnalysis(analyzedPlan.get) + } catch { case e: AnalysisException => - val ae = new AnalysisException(e.message, e.line, e.startPosition, Some(analyzed)) + val ae = new AnalysisException(e.message, e.line, e.startPosition, analyzedPlan) ae.setStackTrace(e.getStackTrace) throw ae } From 0dee6dd3a81acab8524eb811522b5c9dacc3cee5 Mon Sep 17 00:00:00 2001 From: Dilip Biswal Date: Wed, 8 Mar 2017 15:18:29 -0800 Subject: [PATCH 2/2] Review comments --- .../org/apache/spark/sql/execution/QueryExecution.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala index 4fa5b33c9e25d..9a3656ddc79f4 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala @@ -46,13 +46,14 @@ class QueryExecution(val sparkSession: SparkSession, val logical: LogicalPlan) { protected def planner = sparkSession.sessionState.planner def assertAnalyzed(): Unit = { - var analyzedPlan: Option[LogicalPlan] = None + // Analyzer is invoked outside the try block to avoid calling it again from within the + // catch block below. + analyzed try { - analyzedPlan = Some(analyzed) - sparkSession.sessionState.analyzer.checkAnalysis(analyzedPlan.get) + sparkSession.sessionState.analyzer.checkAnalysis(analyzed) } catch { case e: AnalysisException => - val ae = new AnalysisException(e.message, e.line, e.startPosition, analyzedPlan) + val ae = new AnalysisException(e.message, e.line, e.startPosition, Option(analyzed)) ae.setStackTrace(e.getStackTrace) throw ae }