Repository: spark
Updated Branches:
  refs/heads/branch-2.4 0f74bac64 -> 00771dced


[SPARK-25816][SQL] Fix attribute resolution in nested extractors

## What changes were proposed in this pull request?

Extractors are made of 2 expressions, one of them defines the the value to be 
extract from (called `child`) and the other defines the way of extraction 
(called `extraction`). In this term extractors have 2 children so they 
shouldn't be `UnaryExpression`s.

`ResolveReferences` was changed in this commit: 
https://github.com/apache/spark/commit/36b826f5d17ae7be89135cb2c43ff797f9e7fe48 
which resulted a regression with nested extractors. An extractor need to define 
its children as the set of both `child` and `extraction`; and should try to 
resolve both in `ResolveReferences`.

This PR changes `UnresolvedExtractValue` to a `BinaryExpression`.

## How was this patch tested?

added UT

Closes #22817 from peter-toth/SPARK-25816.

Authored-by: Peter Toth <peter.t...@gmail.com>
Signed-off-by: gatorsmile <gatorsm...@gmail.com>
(cherry picked from commit ca2fca143277deaff58a69b7f1e0360cfc70561f)
Signed-off-by: gatorsmile <gatorsm...@gmail.com>


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

Branch: refs/heads/branch-2.4
Commit: 00771dced9c73cddfc6325b3ffb00b32864a02a3
Parents: 0f74bac
Author: Peter Toth <peter.t...@gmail.com>
Authored: Sun Oct 28 17:51:35 2018 -0700
Committer: gatorsmile <gatorsm...@gmail.com>
Committed: Sun Oct 28 17:51:53 2018 -0700

----------------------------------------------------------------------
 .../org/apache/spark/sql/catalyst/analysis/unresolved.scala   | 5 ++++-
 .../src/test/scala/org/apache/spark/sql/DataFrameSuite.scala  | 7 +++++++
 2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/00771dce/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
index c1ec736..857cf38 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/unresolved.scala
@@ -407,7 +407,10 @@ case class ResolvedStar(expressions: Seq[NamedExpression]) 
extends Star with Une
  *                   can be key of Map, index of Array, field name of Struct.
  */
 case class UnresolvedExtractValue(child: Expression, extraction: Expression)
-  extends UnaryExpression with Unevaluable {
+  extends BinaryExpression with Unevaluable {
+
+  override def left: Expression = child
+  override def right: Expression = extraction
 
   override def dataType: DataType = throw new UnresolvedException(this, 
"dataType")
   override def foldable: Boolean = throw new UnresolvedException(this, 
"foldable")

http://git-wip-us.apache.org/repos/asf/spark/blob/00771dce/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
index e84cd8c..2ca0e5f 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
@@ -2590,4 +2590,11 @@ class DataFrameSuite extends QueryTest with 
SharedSQLContext {
         Row ("abc", 1))
     }
   }
+
+  test("SPARK-25816 ResolveReferences works with nested extractors") {
+    val df = Seq((1, Map(1 -> "a")), (2, Map(2 -> "b"))).toDF("key", "map")
+    val swappedDf = df.select($"key".as("map"), $"map".as("key"))
+
+    checkAnswer(swappedDf.filter($"key"($"map") > "a"), Row(2, Map(2 -> "b")))
+  }
 }


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

Reply via email to