@@ -22,83 +22,69 @@ import org.apache.spark.sql.catalyst.dsl.plans._
2222import org .apache .spark .sql .catalyst .expressions ._
2323import org .apache .spark .sql .catalyst .plans ._
2424import org .apache .spark .sql .catalyst .plans .logical .LocalRelation
25- import org .apache .spark .sql .types .StringType
2625
2726class ResolveNaturalJoinSuite extends AnalysisTest {
28- lazy val r1 = LocalRelation (
29- AttributeReference (" r1_a" , StringType , nullable = true )(),
30- AttributeReference (" r1_b" , StringType , nullable = true )(),
31- AttributeReference (" r1_c" , StringType , nullable = true )())
32- lazy val r2 = LocalRelation (
33- AttributeReference (" r2_a" , StringType , nullable = false )(),
34- AttributeReference (" r2_b" , StringType , nullable = false )(),
35- AttributeReference (" r2_c" , StringType , nullable = false )())
36- lazy val t1 = r1.select(' r1_a , ' r1_b )
37- lazy val t2 = r1.select(' r1_a , ' r1_c )
38- lazy val r1a = r1.output(0 )
39- lazy val r1b = r1.output(1 )
40- lazy val r1c = r1.output(2 )
41- lazy val t3 = r2.select(' r2_a , ' r2_b )
42- lazy val t4 = r2.select(' r2_a , ' r2_c )
43- lazy val r2a = r2.output(0 )
44- lazy val r2b = r2.output(1 )
45- lazy val r2c = r2.output(2 )
46- lazy val nullableR2B = r2.output(1 ).withNullability(true )
47- lazy val nullableR2C = r2.output(2 ).withNullability(true )
27+ lazy val a = ' a .string
28+ lazy val b = ' b .string
29+ lazy val c = ' c .string
30+ lazy val aNotNull = a.notNull
31+ lazy val bNotNull = b.notNull
32+ lazy val cNotNull = c.notNull
33+ lazy val r1 = LocalRelation (a, b)
34+ lazy val r2 = LocalRelation (a, c)
35+ lazy val r3 = LocalRelation (aNotNull, bNotNull)
36+ lazy val r4 = LocalRelation (bNotNull, cNotNull)
4837
4938 test(" natural inner join" ) {
50- val plan = t1.join(t2, NaturalJoin (Inner ), None )
51- val expected = r1.select(r1a, r1b).join(
52- r1.select(r1a, r1c), Inner , Some (EqualTo (r1a, r1a))).select(r1a, r1b, r1c)
39+ val plan = r1.join(r2, NaturalJoin (Inner ), None )
40+ val expected = r1.join(r2, Inner , Some (EqualTo (a, a))).select(a, b, c)
5341 checkAnalysis(plan, expected)
5442 }
5543
5644 test(" natural left join" ) {
57- val plan = t1.join(t2, NaturalJoin (LeftOuter ), None )
58- val expected = r1.select(r1a, r1b).join(
59- r1.select(r1a, r1c), LeftOuter , Some (EqualTo (r1a, r1a))).select(r1a, r1b, r1c)
45+ val plan = r1.join(r2, NaturalJoin (LeftOuter ), None )
46+ val expected = r1.join(r2, LeftOuter , Some (EqualTo (a, a))).select(a, b, c)
6047 checkAnalysis(plan, expected)
6148 }
6249
6350 test(" natural right join" ) {
64- val plan = t1.join(t2, NaturalJoin (RightOuter ), None )
65- val expected = r1.select(r1a, r1b).join(
66- r1.select(r1a, r1c), RightOuter , Some (EqualTo (r1a, r1a))).select(r1a, r1b, r1c)
51+ val plan = r1.join(r2, NaturalJoin (RightOuter ), None )
52+ val expected = r1.join(r2, RightOuter , Some (EqualTo (a, a))).select(a, b, c)
6753 checkAnalysis(plan, expected)
6854 }
6955
7056 test(" natural full outer join" ) {
71- val plan = t1 .join(t2 , NaturalJoin (FullOuter ), None )
72- val expected = r1.select(r1a, r1b). join(r1.select(r1a, r1c), FullOuter , Some (
73- EqualTo (r1a, r1a))).select( Alias (Coalesce (Seq (r1a, r1a )), " r1_a " )(), r1b, r1c )
57+ val plan = r1 .join(r2 , NaturalJoin (FullOuter ), None )
58+ val expected = r1.join(r2, FullOuter , Some ( EqualTo (a, a))).select (
59+ Alias (Coalesce (Seq (a, a )), " a " )(), b, c )
7460 checkAnalysis(plan, expected)
7561 }
7662
7763 test(" natural inner join with no nullability" ) {
78- val plan = t3 .join(t4 , NaturalJoin (Inner ), None )
79- val expected = r2.select(r2a, r2b).join (
80- r2.select(r2a, r2c), Inner , Some ( EqualTo (r2a, r2a))).select(r2a, r2b, r2c )
64+ val plan = r3 .join(r4 , NaturalJoin (Inner ), None )
65+ val expected = r3.join(r4, Inner , Some ( EqualTo (bNotNull, bNotNull))).select (
66+ bNotNull, aNotNull, cNotNull )
8167 checkAnalysis(plan, expected)
8268 }
8369
8470 test(" natural left join with no nullability" ) {
85- val plan = t3 .join(t4 , NaturalJoin (LeftOuter ), None )
86- val expected = r2.select(r2a, r2b).join (
87- r2.select(r2a, r2c), LeftOuter , Some ( EqualTo (r2a, r2a))).select(r2a, r2b, nullableR2C )
71+ val plan = r3 .join(r4 , NaturalJoin (LeftOuter ), None )
72+ val expected = r3.join(r4, LeftOuter , Some ( EqualTo (bNotNull, bNotNull))).select (
73+ bNotNull, aNotNull, c )
8874 checkAnalysis(plan, expected)
8975 }
9076
9177 test(" natural right join with no nullability" ) {
92- val plan = t3 .join(t4 , NaturalJoin (RightOuter ), None )
93- val expected = r2.select(r2a, r2b).join (
94- r2.select(r2a, r2c), RightOuter , Some ( EqualTo (r2a, r2a))).select(r2a, nullableR2B, r2c )
78+ val plan = r3 .join(r4 , NaturalJoin (RightOuter ), None )
79+ val expected = r3.join(r4, RightOuter , Some ( EqualTo (bNotNull, bNotNull))).select (
80+ bNotNull, a, cNotNull )
9581 checkAnalysis(plan, expected)
9682 }
9783
9884 test(" natural full outer join with no nullability" ) {
99- val plan = t3 .join(t4 , NaturalJoin (FullOuter ), None )
100- val expected = r2.select(r2a, r2b). join(r2.select(r2a, r2c), FullOuter , Some (EqualTo (
101- r2a, r2a))).select( Alias (Coalesce (Seq (r2a, r2a )), " r2_a " )(), nullableR2B, nullableR2C )
85+ val plan = r3 .join(r4 , NaturalJoin (FullOuter ), None )
86+ val expected = r3. join(r4, FullOuter , Some (EqualTo (bNotNull, bNotNull))).select (
87+ Alias (Coalesce (Seq (bNotNull, bNotNull )), " b " )(), a, c )
10288 checkAnalysis(plan, expected)
10389 }
10490}
0 commit comments