Skip to content

Commit

Permalink
planner: add more test cases for universal bindings (#49544)
Browse files Browse the repository at this point in the history
ref #48875
  • Loading branch information
qw4990 committed Dec 18, 2023
1 parent f50e894 commit 6645e24
Show file tree
Hide file tree
Showing 3 changed files with 244 additions and 119 deletions.
5 changes: 4 additions & 1 deletion pkg/bindinfo/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,12 @@ go_test(
"main_test.go",
"optimize_test.go",
"session_handle_test.go",
"universal_binding_test.go",
],
embed = [":bindinfo"],
flaky = True,
race = "on",
shard_count = 43,
shard_count = 46,
deps = [
"//pkg/bindinfo/internal",
"//pkg/config",
Expand All @@ -67,11 +68,13 @@ go_test(
"//pkg/parser",
"//pkg/parser/auth",
"//pkg/parser/model",
"//pkg/parser/mysql",
"//pkg/server",
"//pkg/session/types",
"//pkg/sessionctx/variable",
"//pkg/testkit",
"//pkg/testkit/testsetup",
"//pkg/types",
"//pkg/util/hack",
"//pkg/util/parser",
"//pkg/util/stmtsummary",
Expand Down
118 changes: 0 additions & 118 deletions pkg/bindinfo/global_handle_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,124 +254,6 @@ func TestSetBindingStatus(t *testing.T) {
require.Len(t, rows, 0)
}

// for testing, only returns Original_sql, Bind_sql, Default_db, Status, Source, Type, Sql_digest
func showBinding(tk *testkit.TestKit, showStmt string) [][]interface{} {
rows := tk.MustQuery(showStmt).Sort().Rows()
result := make([][]interface{}, len(rows))
for i, r := range rows {
result[i] = append(result[i], r[:4]...)
result[i] = append(result[i], r[8:11]...)
}
return result
}

func TestUniversalBinding(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)

tk.MustExec(`set @@tidb_opt_enable_universal_binding=1`)
tk.MustExec(`use test`)
tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`)
tk.MustExec(`create database test1`)
tk.MustExec(`use test1`)
tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`)
tk.MustExec(`create database test2`)
tk.MustExec(`use test2`)
tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`)

for _, idx := range []string{"a", "b", "c", "d", "e"} {
tk.MustExec(fmt.Sprintf(`create global universal binding using select /*+ use_index(t, %v) */ * from t`, idx))
for _, db := range []string{"test", "test1", "test2"} {
tk.MustExec("use " + db)
tk.MustUseIndex(`select * from t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test1.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test2.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
}
}

for _, idx := range []string{"a", "b", "c", "d", "e"} {
tk.MustExec(fmt.Sprintf(`create universal binding using select /*+ use_index(t, %v) */ * from t`, idx))
for _, db := range []string{"test", "test1", "test2"} {
tk.MustExec("use " + db)
tk.MustUseIndex(`select * from t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test1.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
tk.MustUseIndex(`select * from test2.t`, idx)
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
}
}
}

func TestUniversalBindingPriority(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)

tk.MustExec(`set @@tidb_opt_enable_universal_binding=1`)
tk.MustExec(`use test`)
tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`)

tk.MustExec(`create global universal binding using select /*+ use_index(t, a) */ * from t`)
tk.MustUseIndex(`select * from t`, "a")
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))

// global normal > global universal
tk.MustExec(`create global binding using select /*+ use_index(t, b) */ * from t`)
tk.MustUseIndex(`select * from t`, "b")
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))

// session universal > global normal
tk.MustExec(`create session universal binding using select /*+ use_index(t, c) */ * from t`)
tk.MustUseIndex(`select * from t`, "c")
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))

// session normal > session universal
tk.MustExec(`create session binding using select /*+ use_index(t, d) */ * from t`)
tk.MustUseIndex(`select * from t`, "d")
tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1"))
}

func TestCreateUniversalBinding(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)

tk.MustExec(`use test`)
tk.MustExec(`create table t (a int)`)

tk.MustExec(`create global universal binding using select * from t`)
require.Equal(t, showBinding(tk, "show global bindings"),
[][]interface{}{{"select * from `t`", "SELECT * FROM `t`", "", "enabled", "manual", "u", "e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7"}})
tk.MustExec(`create global binding using select * from t`)
require.Equal(t, showBinding(tk, "show global bindings"),
[][]interface{}{
{"select * from `t`", "SELECT * FROM `t`", "", "enabled", "manual", "u", "e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7"},
{"select * from `test` . `t`", "SELECT * FROM `test`.`t`", "test", "enabled", "manual", "", "8b193b00413fdb910d39073e0d494c96ebf24d1e30b131ecdd553883d0e29b42"}})
tk.MustExec(`drop global binding for sql digest 'e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7'`)
require.Equal(t, showBinding(tk, "show global bindings"),
[][]interface{}{
{"select * from `test` . `t`", "SELECT * FROM `test`.`t`", "test", "enabled", "manual", "", "8b193b00413fdb910d39073e0d494c96ebf24d1e30b131ecdd553883d0e29b42"}})

tk.MustExec(`create session universal binding using select * from t`)
require.Equal(t, showBinding(tk, "show session bindings"),
[][]interface{}{{"select * from `t`", "SELECT * FROM `t`", "", "enabled", "manual", "u", "e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7"}})
tk.MustExec(`create session binding using select * from t`)
require.Equal(t, showBinding(tk, "show session bindings"),
[][]interface{}{
{"select * from `t`", "SELECT * FROM `t`", "", "enabled", "manual", "u", "e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7"},
{"select * from `test` . `t`", "SELECT * FROM `test`.`t`", "test", "enabled", "manual", "", "8b193b00413fdb910d39073e0d494c96ebf24d1e30b131ecdd553883d0e29b42"}})
tk.MustExec(`drop session binding for sql digest 'e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7'`)
require.Equal(t, showBinding(tk, "show session bindings"),
[][]interface{}{
{"select * from `test` . `t`", "SELECT * FROM `test`.`t`", "test", "enabled", "manual", "", "8b193b00413fdb910d39073e0d494c96ebf24d1e30b131ecdd553883d0e29b42"}})
}

func TestSetBindingStatusWithoutBindingInCache(t *testing.T) {
store, dom := testkit.CreateMockStoreAndDomain(t)

Expand Down
Loading

0 comments on commit 6645e24

Please sign in to comment.