Skip to content
Snippets Groups Projects
Commit 2f8776cc authored by gatorsmile's avatar gatorsmile Committed by Wenchen Fan
Browse files

[SPARK-18674][SQL][FOLLOW-UP] improve the error message of using join

### What changes were proposed in this pull request?
Added a test case for using joins with nested fields.

### How was this patch tested?
N/A

Author: gatorsmile <gatorsmile@gmail.com>

Closes #16110 from gatorsmile/followup-18674.
parent 7935c847
No related branches found
No related tags found
No related merge requests found
...@@ -1974,14 +1974,14 @@ class Analyzer( ...@@ -1974,14 +1974,14 @@ class Analyzer(
condition: Option[Expression]) = { condition: Option[Expression]) = {
val leftKeys = joinNames.map { keyName => val leftKeys = joinNames.map { keyName =>
left.output.find(attr => resolver(attr.name, keyName)).getOrElse { left.output.find(attr => resolver(attr.name, keyName)).getOrElse {
throw new AnalysisException(s"USING column `$keyName` can not be resolved with the " + throw new AnalysisException(s"USING column `$keyName` cannot be resolved on the left " +
s"left join side, the left output is: [${left.output.map(_.name).mkString(", ")}]") s"side of the join. The left-side columns: [${left.output.map(_.name).mkString(", ")}]")
} }
} }
val rightKeys = joinNames.map { keyName => val rightKeys = joinNames.map { keyName =>
right.output.find(attr => resolver(attr.name, keyName)).getOrElse { right.output.find(attr => resolver(attr.name, keyName)).getOrElse {
throw new AnalysisException(s"USING column `$keyName` can not be resolved with the " + throw new AnalysisException(s"USING column `$keyName` cannot be resolved on the right " +
s"right join side, the right output is: [${right.output.map(_.name).mkString(", ")}]") s"side of the join. The right-side columns: [${right.output.map(_.name).mkString(", ")}]")
} }
} }
val joinPairs = leftKeys.zip(rightKeys) val joinPairs = leftKeys.zip(rightKeys)
......
...@@ -28,6 +28,7 @@ class ResolveNaturalJoinSuite extends AnalysisTest { ...@@ -28,6 +28,7 @@ class ResolveNaturalJoinSuite extends AnalysisTest {
lazy val a = 'a.string lazy val a = 'a.string
lazy val b = 'b.string lazy val b = 'b.string
lazy val c = 'c.string lazy val c = 'c.string
lazy val d = 'd.struct('f1.int, 'f2.long)
lazy val aNotNull = a.notNull lazy val aNotNull = a.notNull
lazy val bNotNull = b.notNull lazy val bNotNull = b.notNull
lazy val cNotNull = c.notNull lazy val cNotNull = c.notNull
...@@ -35,6 +36,8 @@ class ResolveNaturalJoinSuite extends AnalysisTest { ...@@ -35,6 +36,8 @@ class ResolveNaturalJoinSuite extends AnalysisTest {
lazy val r2 = LocalRelation(c, a) lazy val r2 = LocalRelation(c, a)
lazy val r3 = LocalRelation(aNotNull, bNotNull) lazy val r3 = LocalRelation(aNotNull, bNotNull)
lazy val r4 = LocalRelation(cNotNull, bNotNull) lazy val r4 = LocalRelation(cNotNull, bNotNull)
lazy val r5 = LocalRelation(d)
lazy val r6 = LocalRelation(d)
test("natural/using inner join") { test("natural/using inner join") {
val naturalPlan = r1.join(r2, NaturalJoin(Inner), None) val naturalPlan = r1.join(r2, NaturalJoin(Inner), None)
...@@ -108,10 +111,10 @@ class ResolveNaturalJoinSuite extends AnalysisTest { ...@@ -108,10 +111,10 @@ class ResolveNaturalJoinSuite extends AnalysisTest {
test("using unresolved attribute") { test("using unresolved attribute") {
assertAnalysisError( assertAnalysisError(
r1.join(r2, UsingJoin(Inner, Seq("d"))), r1.join(r2, UsingJoin(Inner, Seq("d"))),
"USING column `d` can not be resolved with the left join side" :: Nil) "USING column `d` cannot be resolved on the left side of the join" :: Nil)
assertAnalysisError( assertAnalysisError(
r1.join(r2, UsingJoin(Inner, Seq("b"))), r1.join(r2, UsingJoin(Inner, Seq("b"))),
"USING column `b` can not be resolved with the right join side" :: Nil) "USING column `b` cannot be resolved on the right side of the join" :: Nil)
} }
test("using join with a case sensitive analyzer") { test("using join with a case sensitive analyzer") {
...@@ -122,7 +125,14 @@ class ResolveNaturalJoinSuite extends AnalysisTest { ...@@ -122,7 +125,14 @@ class ResolveNaturalJoinSuite extends AnalysisTest {
assertAnalysisError( assertAnalysisError(
r1.join(r2, UsingJoin(Inner, Seq("A"))), r1.join(r2, UsingJoin(Inner, Seq("A"))),
"USING column `A` can not be resolved with the left join side" :: Nil) "USING column `A` cannot be resolved on the left side of the join" :: Nil)
}
test("using join on nested fields") {
assertAnalysisError(
r5.join(r6, UsingJoin(Inner, Seq("d.f1"))),
"USING column `d.f1` cannot be resolved on the left side of the join. " +
"The left-side columns: [d]" :: Nil)
} }
test("using join with a case insensitive analyzer") { test("using join with a case insensitive analyzer") {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment