@@ -43,11 +43,13 @@ type JoinPlanTest struct {
4343 skipOld bool
4444}
4545
46- var JoinPlanningTests = [] struct {
46+ type joinPlanScript struct {
4747 name string
4848 setup []string
4949 tests []JoinPlanTest
50- }{
50+ }
51+
52+ var JoinPlanningTests = []joinPlanScript {
5153 {
5254 name : "filter pushdown through join uppercase name" ,
5355 setup : []string {
@@ -78,6 +80,43 @@ var JoinPlanningTests = []struct {
7880 },
7981 },
8082 },
83+ {
84+ name : "block merge join" ,
85+ setup : []string {
86+ "CREATE table xy (x int primary key, y int, unique index y_idx(y));" ,
87+ "CREATE table ab (a int primary key, b int);" ,
88+ "insert into xy values (1,0), (2,1), (0,2), (3,3);" ,
89+ "insert into ab values (0,2), (1,2), (2,2), (3,1);" ,
90+ `analyze table xy update histogram on x using data '{"row_count":1000000}'` ,
91+ `analyze table ab update histogram on a using data '{"row_count":1000000}'` ,
92+ },
93+ tests : []JoinPlanTest {
94+ {
95+ q : "select /*+ JOIN_ORDER(ab, xy) MERGE_JOIN(ab, xy)*/ * from ab join xy on y = a order by 1, 3" ,
96+ types : []plan.JoinType {plan .JoinTypeMerge },
97+ exp : []sql.Row {{0 , 2 , 1 , 0 }, {1 , 2 , 2 , 1 }, {2 , 2 , 0 , 2 }, {3 , 1 , 3 , 3 }},
98+ },
99+ {
100+ q : "select * from ab join xy on x = a and y = a order by 1, 3" ,
101+ types : []plan.JoinType {plan .JoinTypeMerge },
102+ exp : []sql.Row {{3 , 1 , 3 , 3 }},
103+ },
104+ {
105+ q : "set @@SESSION.disable_merge_join = 1" ,
106+ exp : []sql.Row {{}},
107+ },
108+ {
109+ q : "select /*+ JOIN_ORDER(ab, xy) MERGE_JOIN(ab, xy)*/ * from ab join xy on y = a order by 1, 3" ,
110+ types : []plan.JoinType {plan .JoinTypeLookup },
111+ exp : []sql.Row {{0 , 2 , 1 , 0 }, {1 , 2 , 2 , 1 }, {2 , 2 , 0 , 2 }, {3 , 1 , 3 , 3 }},
112+ },
113+ {
114+ q : "select * from ab join xy on x = a and y = a order by 1, 3" ,
115+ types : []plan.JoinType {plan .JoinTypeLookup },
116+ exp : []sql.Row {{3 , 1 , 3 , 3 }},
117+ },
118+ },
119+ },
81120 {
82121 name : "merge join unary index" ,
83122 setup : []string {
@@ -1725,8 +1764,17 @@ join uv d on d.u = c.x`,
17251764}
17261765
17271766func TestJoinPlanning (t * testing.T , harness Harness ) {
1728- for _ , tt := range JoinPlanningTests {
1767+ runJoinPlanningTests (t , harness , JoinPlanningTests )
1768+ }
1769+
1770+ func runJoinPlanningTests (t * testing.T , harness Harness , tests []joinPlanScript ) {
1771+ for _ , tt := range tests {
17291772 t .Run (tt .name , func (t * testing.T ) {
1773+ if sh , ok := harness .(SkippingHarness ); ok {
1774+ if sh .SkipQueryTest (tt .name ) {
1775+ t .Skip (tt .name )
1776+ }
1777+ }
17301778 harness .Setup ([]setup.SetupScript {setup .MydbData [0 ], tt .setup })
17311779 e := mustNewEngine (t , harness )
17321780 defer e .Close ()
@@ -1750,7 +1798,6 @@ func TestJoinPlanning(t *testing.T, harness Harness) {
17501798 })
17511799 }
17521800}
1753-
17541801func evalJoinTypeTest (t * testing.T , harness Harness , e QueryEngine , query string , types []plan.JoinType , skipOld bool ) {
17551802 t .Run (query + " join types" , func (t * testing.T ) {
17561803 if skipOld {
0 commit comments