Skip to content

Commit a7f66ef

Browse files
yhuaidavies
authored andcommitted
[SPARK-16301] [SQL] The analyzer rule for resolving using joins should respect the case sensitivity setting.
## What changes were proposed in this pull request? The analyzer rule for resolving using joins should respect the case sensitivity setting. ## How was this patch tested? New tests in ResolveNaturalJoinSuite Author: Yin Huai <[email protected]> Closes #13977 from yhuai/SPARK-16301. (cherry picked from commit 8b5a8b2) Signed-off-by: Davies Liu <[email protected]>
1 parent 809af6d commit a7f66ef

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-7
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,13 +1836,25 @@ class Analyzer(
18361836
}
18371837

18381838
private def commonNaturalJoinProcessing(
1839-
left: LogicalPlan,
1840-
right: LogicalPlan,
1841-
joinType: JoinType,
1842-
joinNames: Seq[String],
1843-
condition: Option[Expression]) = {
1844-
val leftKeys = joinNames.map(keyName => left.output.find(_.name == keyName).get)
1845-
val rightKeys = joinNames.map(keyName => right.output.find(_.name == keyName).get)
1839+
left: LogicalPlan,
1840+
right: LogicalPlan,
1841+
joinType: JoinType,
1842+
joinNames: Seq[String],
1843+
condition: Option[Expression]) = {
1844+
val leftKeys = joinNames.map { keyName =>
1845+
val joinColumn = left.output.find(attr => resolver(attr.name, keyName))
1846+
assert(
1847+
joinColumn.isDefined,
1848+
s"$keyName should exist in ${left.output.map(_.name).mkString(",")}")
1849+
joinColumn.get
1850+
}
1851+
val rightKeys = joinNames.map { keyName =>
1852+
val joinColumn = right.output.find(attr => resolver(attr.name, keyName))
1853+
assert(
1854+
joinColumn.isDefined,
1855+
s"$keyName should exist in ${right.output.map(_.name).mkString(",")}")
1856+
joinColumn.get
1857+
}
18461858
val joinPairs = leftKeys.zip(rightKeys)
18471859

18481860
val newCondition = (condition ++ joinPairs.map(EqualTo.tupled)).reduceOption(And)

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/ResolveNaturalJoinSuite.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,34 @@ class ResolveNaturalJoinSuite extends AnalysisTest {
113113
assert(error.message.contains(
114114
"using columns ['d] can not be resolved given input columns: [b, a, c]"))
115115
}
116+
117+
test("using join with a case sensitive analyzer") {
118+
val expected = r1.join(r2, Inner, Some(EqualTo(a, a))).select(a, b, c)
119+
120+
{
121+
val usingPlan = r1.join(r2, UsingJoin(Inner, Seq(UnresolvedAttribute("a"))), None)
122+
checkAnalysis(usingPlan, expected, caseSensitive = true)
123+
}
124+
125+
{
126+
val usingPlan = r1.join(r2, UsingJoin(Inner, Seq(UnresolvedAttribute("A"))), None)
127+
assertAnalysisError(
128+
usingPlan,
129+
Seq("using columns ['A] can not be resolved given input columns: [b, a, c, a]"))
130+
}
131+
}
132+
133+
test("using join with a case insensitive analyzer") {
134+
val expected = r1.join(r2, Inner, Some(EqualTo(a, a))).select(a, b, c)
135+
136+
{
137+
val usingPlan = r1.join(r2, UsingJoin(Inner, Seq(UnresolvedAttribute("a"))), None)
138+
checkAnalysis(usingPlan, expected, caseSensitive = false)
139+
}
140+
141+
{
142+
val usingPlan = r1.join(r2, UsingJoin(Inner, Seq(UnresolvedAttribute("A"))), None)
143+
checkAnalysis(usingPlan, expected, caseSensitive = false)
144+
}
145+
}
116146
}

0 commit comments

Comments
 (0)