You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
6.7 KiB
132 lines
6.7 KiB
package executor_test
|
|
|
|
import (
|
|
"strings"
|
|
|
|
. "github.com/pingcap/check"
|
|
"github.com/pingcap/failpoint"
|
|
"github.com/pingcap/tidb/util/testkit"
|
|
)
|
|
|
|
// TODO: reopen the index merge join in future.
|
|
|
|
//func (s *testSuite9) TestIndexLookupMergeJoinHang(c *C) {
|
|
// c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/IndexMergeJoinMockOOM", `return(true)`), IsNil)
|
|
// defer func() {
|
|
// c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/IndexMergeJoinMockOOM"), IsNil)
|
|
// }()
|
|
//
|
|
// tk := testkit.NewTestKitWithInit(c, s.store)
|
|
// tk.MustExec("drop table if exists t1, t2")
|
|
// tk.MustExec("create table t1 (a int,b int,index idx(a))")
|
|
// tk.MustExec("create table t2 (a int,b int,index idx(a))")
|
|
// tk.MustExec("insert into t1 values (1,1),(2,2),(3,3),(2000,2000)")
|
|
// tk.MustExec("insert into t2 values (1,1),(2,2),(3,3),(2000,2000)")
|
|
// // Do not hang in index merge join when OOM occurs.
|
|
// err := tk.QueryToErr("select /*+ INL_MERGE_JOIN(t1, t2) */ * from t1, t2 where t1.a = t2.a")
|
|
// c.Assert(err, NotNil)
|
|
// c.Assert(err.Error(), Equals, "OOM test index merge join doesn't hang here.")
|
|
//}
|
|
|
|
func (s *testSuite9) TestIssue18068(c *C) {
|
|
c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/testIssue18068", `return(true)`), IsNil)
|
|
defer func() {
|
|
c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/testIssue18068"), IsNil)
|
|
}()
|
|
|
|
tk := testkit.NewTestKitWithInit(c, s.store)
|
|
tk.MustExec("drop table if exists t, s")
|
|
tk.MustExec("create table t (a int, index idx(a))")
|
|
tk.MustExec("create table s (a int, index idx(a))")
|
|
tk.MustExec("insert into t values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1);")
|
|
tk.MustExec("insert into s values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1);")
|
|
tk.MustExec("set @@tidb_index_join_batch_size=1")
|
|
tk.MustExec("set @@tidb_max_chunk_size=32")
|
|
tk.MustExec("set @@tidb_init_chunk_size=1")
|
|
tk.MustExec("set @@tidb_index_lookup_join_concurrency=2")
|
|
|
|
tk.MustExec("select /*+ inl_merge_join(s)*/ 1 from t join s on t.a = s.a limit 1")
|
|
// Do not hang in index merge join when the second and third execute.
|
|
tk.MustExec("select /*+ inl_merge_join(s)*/ 1 from t join s on t.a = s.a limit 1")
|
|
tk.MustExec("select /*+ inl_merge_join(s)*/ 1 from t join s on t.a = s.a limit 1")
|
|
}
|
|
|
|
// TODO: reopen index merge join in future.
|
|
|
|
//func (s *testSuite9) TestIssue18631(c *C) {
|
|
// tk := testkit.NewTestKitWithInit(c, s.store)
|
|
// tk.MustExec("drop table if exists t1, t2")
|
|
// tk.MustExec("create table t1(a int, b int, c int, d int, primary key(a,b,c))")
|
|
// tk.MustExec("create table t2(a int, b int, c int, d int, primary key(a,b,c))")
|
|
// tk.MustExec("insert into t1 values(1,1,1,1),(2,2,2,2),(3,3,3,3)")
|
|
// tk.MustExec("insert into t2 values(1,1,1,1),(2,2,2,2)")
|
|
// firstOperator := tk.MustQuery("explain select /*+ inl_merge_join(t1,t2) */ * from t1 left join t2 on t1.a = t2.a and t1.c = t2.c and t1.b = t2.b order by t1.a desc").Rows()[0][0].(string)
|
|
// c.Assert(strings.Index(firstOperator, plancodec.TypeIndexMergeJoin), Equals, 0)
|
|
// tk.MustQuery("select /*+ inl_merge_join(t1,t2) */ * from t1 left join t2 on t1.a = t2.a and t1.c = t2.c and t1.b = t2.b order by t1.a desc").Check(testkit.Rows(
|
|
// "3 3 3 3 <nil> <nil> <nil> <nil>",
|
|
// "2 2 2 2 2 2 2 2",
|
|
// "1 1 1 1 1 1 1 1"))
|
|
//}
|
|
//
|
|
//func (s *testSuite9) TestIssue20137(c *C) {
|
|
// tk := testkit.NewTestKitWithInit(c, s.store)
|
|
// tk.MustExec("drop table if exists t1, t2")
|
|
// tk.MustExec("create table t1 (id bigint(20) unsigned, primary key(id))")
|
|
// tk.MustExec("create table t2 (id bigint(20) unsigned)")
|
|
// tk.MustExec("insert into t1 values (8738875760185212610)")
|
|
// tk.MustExec("insert into t1 values (9814441339970117597)")
|
|
// tk.MustExec("insert into t2 values (8738875760185212610)")
|
|
// tk.MustExec("insert into t2 values (9814441339970117597)")
|
|
// tk.MustQuery("select /*+ INL_MERGE_JOIN(t1, t2) */ * from t2 left join t1 on t1.id = t2.id order by t1.id").Check(
|
|
// testkit.Rows("8738875760185212610 8738875760185212610", "9814441339970117597 9814441339970117597"))
|
|
//}
|
|
|
|
func (s *testSuiteAgg) TestIndexJoinOnSinglePartitionTable(c *C) {
|
|
// For issue 19145
|
|
tk := testkit.NewTestKitWithInit(c, s.store)
|
|
tk.MustExec("drop table if exists t1, t2")
|
|
tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key (c_int) ) partition by range (c_int) ( partition p0 values less than (10), partition p1 values less than maxvalue )")
|
|
tk.MustExec("create table t2 (c_int int, c_str varchar(40), primary key (c_int) ) partition by range (c_int) ( partition p0 values less than (10), partition p1 values less than maxvalue )")
|
|
tk.MustExec("insert into t1 values (1, 'Alice')")
|
|
tk.MustExec("insert into t2 values (1, 'Bob')")
|
|
|
|
// TODO: reopen index merge join in future.
|
|
|
|
//sql := "select /*+ INL_MERGE_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str"
|
|
//tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob"))
|
|
//rows := s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows())
|
|
//c.Assert(strings.Index(rows[0], "IndexMergeJoin"), Equals, 0)
|
|
|
|
sql := "select /*+ INL_HASH_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str"
|
|
tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob"))
|
|
rows := s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows())
|
|
c.Assert(strings.Index(rows[0], "IndexHashJoin"), Equals, 0)
|
|
|
|
sql = "select /*+ INL_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str"
|
|
tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob"))
|
|
rows = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows())
|
|
c.Assert(strings.Index(rows[0], "IndexJoin"), Equals, 0)
|
|
}
|
|
|
|
func (s *testSuite9) TestIssue20400(c *C) {
|
|
tk := testkit.NewTestKitWithInit(c, s.store)
|
|
tk.MustExec("drop table if exists t, s")
|
|
tk.MustExec("create table s(a int, index(a))")
|
|
tk.MustExec("create table t(a int)")
|
|
tk.MustExec("insert into t values(1)")
|
|
tk.MustQuery("select /*+ hash_join(t,s)*/ * from t left join s on t.a=s.a and t.a>1").Check(
|
|
testkit.Rows("1 <nil>"))
|
|
tk.MustQuery("select /*+ inl_merge_join(t,s)*/ * from t left join s on t.a=s.a and t.a>1").Check(
|
|
testkit.Rows("1 <nil>"))
|
|
}
|
|
|
|
func (s *testSuite9) TestIndexMergeJoinBinding(c *C) {
|
|
tk := testkit.NewTestKitWithInit(c, s.store)
|
|
tk.MustExec("drop table if exists t1, t2")
|
|
tk.MustExec("create table t1(a int, b int, key(b))")
|
|
tk.MustExec("create table t2(a int, b int, key(b))")
|
|
tk.MustExec("create session binding for select * from t1 join t2 on t1.b = t2.b using select /*+ inl_merge_join(t1, t2) */ * from t1 join t2 on t1.b = t2.b")
|
|
rows := tk.MustQuery("explain select * from t1 join t2 on t1.b = t2.b").Rows()
|
|
// TODO: reopen index merge join in future
|
|
c.Assert(strings.Index(rows[0][0].(string), "IndexJoin"), Equals, 0)
|
|
}
|
|
|