Skip to content

Commit c3112a9

Browse files
Davies Liuyhuai
authored andcommitted
[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 apache#8755 from davies/view. (cherry picked from commit 22d4015) Signed-off-by: Yin Huai <yhuai@databricks.com>
1 parent 646155e commit c3112a9

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,22 @@ class Analyzer(
378378
val newOrdering = resolveSortOrders(ordering, child, throws = false)
379379
Sort(newOrdering, global, child)
380380

381+
// A special case for Generate, because the output of Generate should not be resolved by
382+
// ResolveReferences. Attributes in the output will be resolved by ResolveGenerate.
383+
case g @ Generate(generator, join, outer, qualifier, output, child)
384+
if child.resolved && !generator.resolved =>
385+
val newG = generator transformUp {
386+
case u @ UnresolvedAttribute(nameParts) =>
387+
withPosition(u) { child.resolve(nameParts, resolver).getOrElse(u) }
388+
case UnresolvedExtractValue(child, fieldExpr) =>
389+
ExtractValue(child, fieldExpr, resolver)
390+
}
391+
if (newG.fastEquals(generator)) {
392+
g
393+
} else {
394+
Generate(newG.asInstanceOf[Generator], join, outer, qualifier, output, child)
395+
}
396+
381397
case q: LogicalPlan =>
382398
logTrace(s"Attempting to resolve ${q.simpleString}")
383399
q transformExpressionsUp {

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package org.apache.spark.sql.catalyst.plans
1919

2020
import org.apache.spark.sql.catalyst.expressions.{Attribute, AttributeSet, Expression, VirtualColumn}
21-
import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
2221
import org.apache.spark.sql.catalyst.trees.TreeNode
2322
import org.apache.spark.sql.types.{DataType, StructType}
2423

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ case class Generate(
6868
generator.resolved &&
6969
childrenResolved &&
7070
generator.elementTypes.length == generatorOutput.length &&
71-
!generatorOutput.exists(!_.resolved)
71+
generatorOutput.forall(_.resolved)
7272
}
7373

7474
// we don't want the gOutput to be taken as part of the expressions

sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,4 +1173,18 @@ class SQLQuerySuite extends QueryTest with SQLTestUtils {
11731173
checkAnswer(sqlContext.table("`db.t`"), df)
11741174
}
11751175
}
1176+
1177+
test("SPARK-10593 same column names in lateral view") {
1178+
val df = sqlContext.sql(
1179+
"""
1180+
|select
1181+
|insideLayer2.json as a2
1182+
|from (select '{"layer1": {"layer2": "text inside layer 2"}}' json) test
1183+
|lateral view json_tuple(json, 'layer1') insideLayer1 as json
1184+
|lateral view json_tuple(insideLayer1.json, 'layer2') insideLayer2 as json
1185+
""".stripMargin
1186+
)
1187+
1188+
checkAnswer(df, Row("text inside layer 2") :: Nil)
1189+
}
11761190
}

0 commit comments

Comments
 (0)