aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorReynold Xin <rxin@apache.org>2014-07-04 00:53:41 -0700
committerReynold Xin <rxin@apache.org>2014-07-04 00:54:37 -0700
commit354a6273987062ef4e69bf52c15de3fb05911987 (patch)
tree29121898b54b091f01a35ade89155f872c03ed46 /sql/catalyst
parentdc73ee13c83e81f21c978f3a92a126f3b08eb56f (diff)
downloadspark-354a6273987062ef4e69bf52c15de3fb05911987.tar.gz
spark-354a6273987062ef4e69bf52c15de3fb05911987.tar.bz2
spark-354a6273987062ef4e69bf52c15de3fb05911987.zip
[SPARK-2059][SQL] Add analysis checks
This replaces #1263 with a test case. Author: Reynold Xin <rxin@apache.org> Author: Michael Armbrust <michael@databricks.com> Closes #1265 from rxin/sql-analysis-error and squashes the following commits: a639e01 [Reynold Xin] Added a test case for unresolved attribute analysis. 7371e1b [Reynold Xin] Merge pull request #1263 from marmbrus/analysisChecks 448c088 [Michael Armbrust] Add analysis checks (cherry picked from commit b3e768e154bd7175db44c3ffc3d8f783f15ab776) Signed-off-by: Reynold Xin <rxin@apache.org>
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala16
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala8
2 files changed, 24 insertions, 0 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
index 4ebc0e70d9..c7188469bf 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala
@@ -17,6 +17,7 @@
package org.apache.spark.sql.catalyst.analysis
+import org.apache.spark.sql.catalyst.errors.TreeNodeException
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.plans.logical._
import org.apache.spark.sql.catalyst.rules._
@@ -54,11 +55,26 @@ class Analyzer(catalog: Catalog, registry: FunctionRegistry, caseSensitive: Bool
ResolveFunctions ::
GlobalAggregates ::
typeCoercionRules :_*),
+ Batch("Check Analysis", Once,
+ CheckResolution),
Batch("AnalysisOperators", fixedPoint,
EliminateAnalysisOperators)
)
/**
+ * Makes sure all attributes have been resolved.
+ */
+ object CheckResolution extends Rule[LogicalPlan] {
+ def apply(plan: LogicalPlan): LogicalPlan = {
+ plan.transform {
+ case p if p.expressions.exists(!_.resolved) =>
+ throw new TreeNodeException(p,
+ s"Unresolved attributes: ${p.expressions.filterNot(_.resolved).mkString(",")}")
+ }
+ }
+ }
+
+ /**
* Replaces [[UnresolvedRelation]]s with concrete relations from the catalog.
*/
object ResolveRelations extends Rule[LogicalPlan] {
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
index 4c313585c6..f14df81376 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
@@ -19,6 +19,7 @@ package org.apache.spark.sql.catalyst.analysis
import org.scalatest.FunSuite
+import org.apache.spark.sql.catalyst.errors.TreeNodeException
import org.apache.spark.sql.catalyst.plans.logical._
/* Implicit conversions */
@@ -34,4 +35,11 @@ class AnalysisSuite extends FunSuite {
analyze(Project(Seq(UnresolvedAttribute("a")), testRelation)) ===
Project(testRelation.output, testRelation))
}
+
+ test("throw errors for unresolved attributes during analysis") {
+ val e = intercept[TreeNodeException[_]] {
+ analyze(Project(Seq(UnresolvedAttribute("abcd")), testRelation))
+ }
+ assert(e.getMessage().toLowerCase.contains("unresolved"))
+ }
}