Repository: spark
Updated Branches:
  refs/heads/master a60d2b70a -> 44b2311d9


[SPARK-3688][SQL]LogicalPlan can't resolve column correctlly

This PR fixed the resolving problem described in 
https://issues.apache.org/jira/browse/SPARK-3688
```
CREATE TABLE t1(x INT);
CREATE TABLE t2(a STRUCT<x: INT>, k INT);
SELECT a.x FROM t1 a JOIN t2 b ON a.x = b.k;
```

Author: tianyi <tianyi.asiai...@gmail.com>

Closes #4524 from tianyi/SPARK-3688 and squashes the following commits:

237a256 [tianyi] resolve a name with table.column pattern first.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/44b2311d
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/44b2311d
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/44b2311d

Branch: refs/heads/master
Commit: 44b2311d946981c8251cb7807d70c8e99db5bbed
Parents: a60d2b7
Author: tianyi <tianyi.asiai...@gmail.com>
Authored: Wed Feb 11 12:50:17 2015 -0800
Committer: Michael Armbrust <mich...@databricks.com>
Committed: Wed Feb 11 12:50:17 2015 -0800

----------------------------------------------------------------------
 .../catalyst/plans/logical/LogicalPlan.scala    | 50 +++++++++++++-------
 ...d as hive-0-c6d02549aec166e16bfc44d5905fa33a |  0
 ...d as hive-1-a8987ff8c7b9ca95bf8b32314694ed1f |  0
 ...d as hive-2-26f54240cf5b909086fc34a34d7fdb56 |  0
 ...d as hive-3-d08d5280027adea681001ad82a5a6974 |  0
 ...d as hive-4-22eb25b5be6daf72a6649adfe5041749 |  1 +
 .../hive/execution/HiveResolutionSuite.scala    |  9 ++++
 7 files changed, 42 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
index 7cf4b81..b23f8d0 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala
@@ -128,6 +128,29 @@ abstract class LogicalPlan extends QueryPlan[LogicalPlan] 
with Logging {
   def resolve(name: String, resolver: Resolver): Option[NamedExpression] =
     resolve(name, output, resolver)
 
+  def resolveAsTableColumn(
+      nameParts: Array[String],
+      resolver: Resolver,
+      attribute: Attribute): List[(Attribute, List[String])] = {
+    if (attribute.qualifiers.find(resolver(_, nameParts.head)).nonEmpty && 
nameParts.size > 1) {
+      val remainingParts = nameParts.drop(1)
+      resolveAsColumn(remainingParts, resolver, attribute)
+    } else {
+      Nil
+    }
+  }
+
+  def resolveAsColumn(
+      nameParts: Array[String],
+      resolver: Resolver,
+      attribute: Attribute): List[(Attribute, List[String])] = {
+    if (resolver(attribute.name, nameParts.head)) {
+      (attribute.withName(nameParts.head), nameParts.tail.toList) :: Nil
+    } else {
+      Nil
+    }
+  }
+
   /** Performs attribute resolution given a name and a sequence of possible 
attributes. */
   protected def resolve(
       name: String,
@@ -136,24 +159,15 @@ abstract class LogicalPlan extends QueryPlan[LogicalPlan] 
with Logging {
 
     val parts = name.split("\\.")
 
-    // Collect all attributes that are output by this nodes children where 
either the first part
-    // matches the name or where the first part matches the scope and the 
second part matches the
-    // name.  Return these matches along with any remaining parts, which 
represent dotted access to
-    // struct fields.
-    val options = input.flatMap { option =>
-      // If the first part of the desired name matches a qualifier for this 
possible match, drop it.
-      val remainingParts =
-        if (option.qualifiers.find(resolver(_, parts.head)).nonEmpty && 
parts.size > 1) {
-          parts.drop(1)
-        } else {
-          parts
-        }
-
-      if (resolver(option.name, remainingParts.head)) {
-        // Preserve the case of the user's attribute reference.
-        (option.withName(remainingParts.head), remainingParts.tail.toList) :: 
Nil
-      } else {
-        Nil
+    // We will try to resolve this name as `table.column` pattern first.
+    var options = input.flatMap { option =>
+      resolveAsTableColumn(parts, resolver, option)
+    }
+
+    // If none of attributes match `table.column` pattern, we try to resolve 
it as a column.
+    if(options.isEmpty) {
+      options = input.flatMap { option =>
+        resolveAsColumn(parts, resolver, option)
       }
     }
 

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/resources/golden/test
 ambiguousReferences resolved as hive-0-c6d02549aec166e16bfc44d5905fa33a
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/test ambiguousReferences 
resolved as hive-0-c6d02549aec166e16bfc44d5905fa33a 
b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-0-c6d02549aec166e16bfc44d5905fa33a
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/resources/golden/test
 ambiguousReferences resolved as hive-1-a8987ff8c7b9ca95bf8b32314694ed1f
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/test ambiguousReferences 
resolved as hive-1-a8987ff8c7b9ca95bf8b32314694ed1f 
b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-1-a8987ff8c7b9ca95bf8b32314694ed1f
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/resources/golden/test
 ambiguousReferences resolved as hive-2-26f54240cf5b909086fc34a34d7fdb56
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/test ambiguousReferences 
resolved as hive-2-26f54240cf5b909086fc34a34d7fdb56 
b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-2-26f54240cf5b909086fc34a34d7fdb56
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/resources/golden/test
 ambiguousReferences resolved as hive-3-d08d5280027adea681001ad82a5a6974
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/test ambiguousReferences 
resolved as hive-3-d08d5280027adea681001ad82a5a6974 
b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-3-d08d5280027adea681001ad82a5a6974
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/resources/golden/test
 ambiguousReferences resolved as hive-4-22eb25b5be6daf72a6649adfe5041749
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/test ambiguousReferences 
resolved as hive-4-22eb25b5be6daf72a6649adfe5041749 
b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-4-22eb25b5be6daf72a6649adfe5041749
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/sql/hive/src/test/resources/golden/test ambiguousReferences resolved as 
hive-4-22eb25b5be6daf72a6649adfe5041749   
@@ -0,0 +1 @@
+1

http://git-wip-us.apache.org/repos/asf/spark/blob/44b2311d/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveResolutionSuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveResolutionSuite.scala
 
b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveResolutionSuite.scala
index ab5f9cd..029c36a 100644
--- 
a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveResolutionSuite.scala
+++ 
b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveResolutionSuite.scala
@@ -99,6 +99,15 @@ class HiveResolutionSuite extends HiveComparisonTest {
     assert(sql("SELECT nestedArray[0].a FROM 
nestedRepeatedTest").collect().head(0) === 1)
   }
 
+  createQueryTest("test ambiguousReferences resolved as hive",
+    """
+      |CREATE TABLE t1(x INT);
+      |CREATE TABLE t2(a STRUCT<x: INT>, k INT);
+      |INSERT OVERWRITE TABLE t1 SELECT 1 FROM src LIMIT 1;
+      |INSERT OVERWRITE TABLE t2 SELECT named_struct("x",1),1 FROM src LIMIT 1;
+      |SELECT a.x FROM t1 a JOIN t2 b ON a.x = b.k;
+    """.stripMargin)
+
   /**
    * Negative examples.  Currently only left here for documentation purposes.
    * TODO(marmbrus): Test that catalyst fails on these queries.


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to