aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorMichael Armbrust <michael@databricks.com>2014-12-17 12:43:51 -0800
committerMichael Armbrust <michael@databricks.com>2014-12-17 12:43:51 -0800
commit7ad579ee972987863c09827554a6330aa54433b1 (patch)
tree5a3e828e920cf2901f8eba1077f49da81198d6f2 /sql/catalyst
parent4782def094fc5b5030a944290d2301f887f77a02 (diff)
downloadspark-7ad579ee972987863c09827554a6330aa54433b1.tar.gz
spark-7ad579ee972987863c09827554a6330aa54433b1.tar.bz2
spark-7ad579ee972987863c09827554a6330aa54433b1.zip
[SPARK-3698][SQL] Fix case insensitive resolution of GetField.
Based on #2543. Author: Michael Armbrust <michael@databricks.com> Closes #3724 from marmbrus/resolveGetField and squashes the following commits: 0a47aae [Michael Armbrust] Fix case insensitive resolution of GetField.
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala10
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala8
2 files changed, 17 insertions, 1 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 ea9bb39786..3705fcc1f1 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
@@ -21,6 +21,7 @@ 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._
+import org.apache.spark.sql.catalyst.types.StructType
/**
* A trivial [[Analyzer]] with an [[EmptyCatalog]] and [[EmptyFunctionRegistry]]. Used for testing
@@ -187,6 +188,15 @@ class Analyzer(catalog: Catalog,
val result = q.resolveChildren(name, resolver).getOrElse(u)
logDebug(s"Resolving $u to $result")
result
+
+ // Resolve field names using the resolver.
+ case f @ GetField(child, fieldName) if !f.resolved && child.resolved =>
+ child.dataType match {
+ case StructType(fields) =>
+ val resolvedFieldName = fields.map(_.name).find(resolver(_, fieldName))
+ resolvedFieldName.map(n => f.copy(fieldName = n)).getOrElse(f)
+ case _ => f
+ }
}
}
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala
index 917b346086..b12821d44b 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala
@@ -92,7 +92,13 @@ case class GetField(child: Expression, fieldName: String) extends UnaryExpressio
lazy val ordinal = structType.fields.indexOf(field)
- override lazy val resolved = childrenResolved && child.dataType.isInstanceOf[StructType]
+ override lazy val resolved = childrenResolved && fieldResolved
+
+ /** Returns true only if the fieldName is found in the child struct. */
+ private def fieldResolved = child.dataType match {
+ case StructType(fields) => fields.map(_.name).contains(fieldName)
+ case _ => false
+ }
override def eval(input: Row): Any = {
val baseValue = child.eval(input).asInstanceOf[Row]