diff options
author | Dilip Biswal <dbiswal@us.ibm.com> | 2017-03-08 17:33:49 -0800 |
---|---|---|
committer | Xiao Li <gatorsmile@gmail.com> | 2017-03-08 17:33:49 -0800 |
commit | d809ceed9762d5bbb04170e45f38751713112dd8 (patch) | |
tree | 066b3cfd931db03ab5b6203a9adca6226c327aa6 | |
parent | a3648b5d4f99ff9461d02f53e9ec71787a3abf51 (diff) | |
download | spark-d809ceed9762d5bbb04170e45f38751713112dd8.tar.gz spark-d809ceed9762d5bbb04170e45f38751713112dd8.tar.bz2 spark-d809ceed9762d5bbb04170e45f38751713112dd8.zip |
[MINOR][SQL] The analyzer rules are fired twice for cases when AnalysisException is raised from analyzer.
## What changes were proposed in this pull request?
In general we have a checkAnalysis phase which validates the logical plan and throws AnalysisException on semantic errors. However we also can throw AnalysisException from a few analyzer rules like ResolveSubquery.
I found that we fire up the analyzer rules twice for the queries that throw AnalysisException from one of the analyzer rules. This is a very minor fix. We don't have to strictly fix it. I just got confused seeing the rule getting fired two times when i was not expecting it.
## How was this patch tested?
Tested manually.
Author: Dilip Biswal <dbiswal@us.ibm.com>
Closes #17214 from dilipbiswal/analyis_twice.
-rw-r--r-- | sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala | 9 |
1 files changed, 7 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 6ec2f4d840..9a3656ddc7 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,14 @@ class QueryExecution(val sparkSession: SparkSession, val logical: LogicalPlan) { protected def planner = sparkSession.sessionState.planner def assertAnalyzed(): Unit = { - try sparkSession.sessionState.analyzer.checkAnalysis(analyzed) catch { + // Analyzer is invoked outside the try block to avoid calling it again from within the + // catch block below. + analyzed + try { + sparkSession.sessionState.analyzer.checkAnalysis(analyzed) + } 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, Option(analyzed)) ae.setStackTrace(e.getStackTrace) throw ae } |