17
17
18
18
package org.apache.spark.sql.catalyst
19
19
20
- import com.google.common.collect.Maps
20
+ import java.util.Locale
21
21
22
+ import com.google.common.collect.Maps
22
23
import org.apache.spark.sql.AnalysisException
23
24
import org.apache.spark.sql.catalyst.analysis.{Resolver, UnresolvedAttribute}
24
25
import org.apache.spark.sql.catalyst.expressions._
@@ -147,13 +148,13 @@ package object expressions {
147
148
148
149
/** Map to use for direct case insensitive attribute lookups. */
149
150
@transient private lazy val direct: Map[String, Seq[Attribute]] = {
150
- unique(attrs.groupBy(_.name.toLowerCase))
151
+ unique(attrs.groupBy(_.name.toLowerCase(Locale.ROOT) ))
151
152
}
152
153
153
154
/** Map to use for qualified case insensitive attribute lookups. */
154
155
@transient private val qualified: Map[(String, String), Seq[Attribute]] = {
155
156
val grouped = attrs.filter(_.qualifier.isDefined).groupBy { a =>
156
- (a.qualifier.get.toLowerCase, a.name.toLowerCase)
157
+ (a.qualifier.get.toLowerCase(Locale.ROOT) , a.name.toLowerCase(Locale.ROOT) )
157
158
}
158
159
unique(grouped)
159
160
}
@@ -176,7 +177,7 @@ package object expressions {
176
177
// and the second element will be List("c").
177
178
val matches = nameParts match {
178
179
case qualifier +: name +: nestedFields =>
179
- val key = (qualifier.toLowerCase, name.toLowerCase)
180
+ val key = (qualifier.toLowerCase(Locale.ROOT) , name.toLowerCase(Locale.ROOT) )
180
181
val attributes = collectMatches(name, qualified.get(key)).filter { a =>
181
182
resolver(qualifier, a.qualifier.get)
182
183
}
@@ -189,7 +190,7 @@ package object expressions {
189
190
val (candidates, nestedFields) = matches match {
190
191
case (Seq(), _) =>
191
192
val name = nameParts.head
192
- val attributes = collectMatches(name, direct.get(name.toLowerCase))
193
+ val attributes = collectMatches(name, direct.get(name.toLowerCase(Locale.ROOT) ))
193
194
(attributes, nameParts.tail)
194
195
case _ => matches
195
196
}
@@ -218,7 +219,7 @@ package object expressions {
218
219
219
220
case ambiguousReferences =>
220
221
// More than one match.
221
- val referenceNames = ambiguousReferences.mkString(", ")
222
+ val referenceNames = ambiguousReferences.map(_.qualifiedName). mkString(", ")
222
223
throw new AnalysisException(s"Reference '$name' is ambiguous, could be: $referenceNames.")
223
224
}
224
225
}
0 commit comments