Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/17185#discussion_r208074745
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/package.scala
---
@@ -169,25 +181,50 @@ package object expressions {
})
}
- // Find matches for the given name assuming that the 1st part is a
qualifier (i.e. table name,
- // alias, or subquery alias) and the 2nd part is the actual name.
This returns a tuple of
+ // Find matches for the given name assuming that the 1st two parts
are qualifier
+ // (i.e. database name and table name) and the 3rd part is the
actual column name.
+ //
+ // For example, consider an example where "db1" is the database
name, "a" is the table name
+ // and "b" is the column name and "c" is the struct field name.
+ // If the name parts is db1.a.b.c, then Attribute will match
+ // Attribute(b, qualifier("db1,"a")) and List("c") will be the
second element
+ var matches: (Seq[Attribute], Seq[String]) = nameParts match {
+ case dbPart +: tblPart +: name +: nestedFields =>
+ val key = (dbPart.toLowerCase(Locale.ROOT),
+ tblPart.toLowerCase(Locale.ROOT),
name.toLowerCase(Locale.ROOT))
+ val attributes = collectMatches(name,
qualified3Part.get(key)).filter {
+ a => (resolver(dbPart, a.qualifier.head) && resolver(tblPart,
a.qualifier.last))
+ }
+ (attributes, nestedFields)
+ case all =>
+ (Seq.empty, Seq.empty)
+ }
+
+ // If there are no matches, then find matches for the given name
assuming that
+ // the 1st part is a qualifier (i.e. table name, alias, or subquery
alias) and the
+ // 2nd part is the actual name. This returns a tuple of
// matched attributes and a list of parts that are to be resolved.
//
// For example, consider an example where "a" is the table name, "b"
is the column name,
// and "c" is the struct field name, i.e. "a.b.c". In this case,
Attribute will be "a.b",
// and the second element will be List("c").
- val matches = nameParts match {
- case qualifier +: name +: nestedFields =>
- val key = (qualifier.toLowerCase(Locale.ROOT),
name.toLowerCase(Locale.ROOT))
- val attributes = collectMatches(name, qualified.get(key)).filter
{ a =>
- resolver(qualifier, a.qualifier.get)
+ matches = matches match {
--- End diff --
nit:
```
if (matches._1.isEmpty) {
matches = ...
}
```
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]