aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorDavies Liu <davies@databricks.com>2015-09-22 11:07:01 -0700
committerYin Huai <yhuai@databricks.com>2015-09-22 11:07:10 -0700
commit22d40159e60dd27a428e4051ef607292cbffbff3 (patch)
tree3f79a9b3fa0d84d45edb6532af3379684cb26645 /sql
parent2ea0f2e11b82ef4817c7e6a162ea23da7860b893 (diff)
downloadspark-22d40159e60dd27a428e4051ef607292cbffbff3.tar.gz
spark-22d40159e60dd27a428e4051ef607292cbffbff3.tar.bz2
spark-22d40159e60dd27a428e4051ef607292cbffbff3.zip
[SPARK-10593] [SQL] fix resolve output of Generate
The output of Generate should not be resolved as Reference. Author: Davies Liu <davies@databricks.com> Closes #8755 from davies/view.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala16
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala1
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala2
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala14
4 files changed, 31 insertions, 2 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 02f34cbf58..bf72d47ce1 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
@@ -378,6 +378,22 @@ class Analyzer(
val newOrdering = resolveSortOrders(ordering, child, throws = false)
Sort(newOrdering, global, child)
+ // A special case for Generate, because the output of Generate should not be resolved by
+ // ResolveReferences. Attributes in the output will be resolved by ResolveGenerate.
+ case g @ Generate(generator, join, outer, qualifier, output, child)
+ if child.resolved && !generator.resolved =>
+ val newG = generator transformUp {
+ case u @ UnresolvedAttribute(nameParts) =>
+ withPosition(u) { child.resolve(nameParts, resolver).getOrElse(u) }
+ case UnresolvedExtractValue(child, fieldExpr) =>
+ ExtractValue(child, fieldExpr, resolver)
+ }
+ if (newG.fastEquals(generator)) {
+ g
+ } else {
+ Generate(newG.asInstanceOf[Generator], join, outer, qualifier, output, child)
+ }
+
case q: LogicalPlan =>
logTrace(s"Attempting to resolve ${q.simpleString}")
q transformExpressionsUp {
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
index 55286f9f2f..0ec9f08571 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
@@ -18,7 +18,6 @@
package org.apache.spark.sql.catalyst.plans
import org.apache.spark.sql.catalyst.expressions.{Attribute, AttributeSet, Expression, VirtualColumn}
-import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
import org.apache.spark.sql.catalyst.trees.TreeNode
import org.apache.spark.sql.types.{DataType, StructType}
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala
index 722f69cdca..ae9482c10f 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala
@@ -68,7 +68,7 @@ case class Generate(
generator.resolved &&
childrenResolved &&
generator.elementTypes.length == generatorOutput.length &&
- !generatorOutput.exists(!_.resolved)
+ generatorOutput.forall(_.resolved)
}
// we don't want the gOutput to be taken as part of the expressions
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala
index 8126d02335..bb02473dd1 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala
@@ -1170,4 +1170,18 @@ class SQLQuerySuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
checkAnswer(sqlContext.table("`db.t`"), df)
}
}
+
+ test("SPARK-10593 same column names in lateral view") {
+ val df = sqlContext.sql(
+ """
+ |select
+ |insideLayer2.json as a2
+ |from (select '{"layer1": {"layer2": "text inside layer 2"}}' json) test
+ |lateral view json_tuple(json, 'layer1') insideLayer1 as json
+ |lateral view json_tuple(insideLayer1.json, 'layer2') insideLayer2 as json
+ """.stripMargin
+ )
+
+ checkAnswer(df, Row("text inside layer 2") :: Nil)
+ }
}