Skip to content

Commit

Permalink
planner: add some test cases about partition table dynamic-mode and p…
Browse files Browse the repository at this point in the history
…lan-cache (#24422)
  • Loading branch information
qw4990 authored May 7, 2021
1 parent 437a5f6 commit 3e0947f
Showing 1 changed file with 145 additions and 0 deletions.
145 changes: 145 additions & 0 deletions planner/core/prepare_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ import (
"context"
"fmt"
"math"
"math/rand"
"strconv"
"strings"
"time"

. "github.com/pingcap/check"
Expand All @@ -31,6 +33,7 @@ import (
"github.com/pingcap/tidb/session"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/hint"
"github.com/pingcap/tidb/util/israce"
"github.com/pingcap/tidb/util/kvcache"
"github.com/pingcap/tidb/util/testkit"
"github.com/pingcap/tidb/util/testleak"
Expand Down Expand Up @@ -1193,3 +1196,145 @@ func (s *testPlanSerialSuite) TestIssue23671(c *C) {
tk.MustQuery("execute s1 using @a, @b, @c").Check(testkit.Rows("1 1", "2 2"))
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))
}

func (s *testPlanSerialSuite) TestPartitionTable(c *C) {
if israce.RaceEnabled {
c.Skip("exhaustive types test, skip race test")
}

// enable plan cache
store, dom, err := newStoreWithBootstrap()
c.Assert(err, IsNil)
tk := testkit.NewTestKit(c, store)
orgEnable := core.PreparedPlanCacheEnabled()
defer func() {
dom.Close()
err = store.Close()
c.Assert(err, IsNil)
core.SetPreparedPlanCache(orgEnable)
}()
core.SetPreparedPlanCache(true)
tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{
PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64),
})
c.Assert(err, IsNil)

// enable partition table dynamic mode
tk.MustExec("create database test_plan_cache")
tk.MustExec("use test_plan_cache")
tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'")

type testcase struct {
t1Create string
t2Create string
rowGener func() string
varGener func() string
query string
}
randDateTime := func() string {
return fmt.Sprintf("%v-%v-%v %v:%v:%v",
1950+rand.Intn(100), 1+rand.Intn(12), 1+rand.Intn(28), // date
rand.Intn(24), rand.Intn(60), rand.Intn(60)) // time
}
randDate := func() string {
return fmt.Sprintf("%v-%v-%v", 1950+rand.Intn(100), 1+rand.Intn(12), 1+rand.Intn(28))
}
testcases := []testcase{
{ // hash partition + int
"create table t1(a int, b int) partition by hash(a) partitions 20",
"create table t2(a int, b int)",
func() string { return fmt.Sprintf("(%v, %v)", rand.Intn(100000000), rand.Intn(100000000)) },
func() string { return fmt.Sprintf("%v", rand.Intn(100000000)) },
`select * from %v where a > ?`,
},
{ // range partition + int
`create table t1(a int, b int) partition by range(a) (
partition p0 values less than (20000000),
partition p1 values less than (40000000),
partition p2 values less than (60000000),
partition p3 values less than (80000000),
partition p4 values less than (100000000))`,
`create table t2(a int, b int)`,
func() string { return fmt.Sprintf("(%v, %v)", rand.Intn(100000000), rand.Intn(100000000)) },
func() string { return fmt.Sprintf("%v", rand.Intn(100000000)) },
`select * from %v where a > ?`,
},
{ // range partition + varchar
`create table t1(a varchar(10), b varchar(10)) partition by range columns(a) (
partition p0 values less than ('200'),
partition p1 values less than ('400'),
partition p2 values less than ('600'),
partition p3 values less than ('800'),
partition p4 values less than ('9999'))`,
`create table t2(a varchar(10), b varchar(10))`,
func() string { return fmt.Sprintf(`("%v", "%v")`, rand.Intn(1000), rand.Intn(1000)) },
func() string { return fmt.Sprintf(`"%v"`, rand.Intn(1000)) },
`select * from %v where a > ?`,
},
{ // range partition + datetime
`create table t1(a datetime, b datetime) partition by range columns(a) (
partition p0 values less than ('1970-01-01 00:00:00'),
partition p1 values less than ('1990-01-01 00:00:00'),
partition p2 values less than ('2010-01-01 00:00:00'),
partition p3 values less than ('2030-01-01 00:00:00'),
partition p4 values less than ('2060-01-01 00:00:00'))`,
`create table t2(a datetime, b datetime)`,
func() string { return fmt.Sprintf(`("%v", "%v")`, randDateTime(), randDateTime()) },
func() string { return fmt.Sprintf(`"%v"`, randDateTime()) },
`select * from %v where a > ?`,
},
{ // range partition + date
`create table t1(a date, b date) partition by range columns(a) (
partition p0 values less than ('1970-01-01'),
partition p1 values less than ('1990-01-01'),
partition p2 values less than ('2010-01-01'),
partition p3 values less than ('2030-01-01'),
partition p4 values less than ('2060-01-01'))`,
`create table t2(a date, b date)`,
func() string { return fmt.Sprintf(`("%v", "%v")`, randDate(), randDate()) },
func() string { return fmt.Sprintf(`"%v"`, randDate()) },
`select * from %v where a > ?`,
},
{ // list partition + int
`create table t1(a int, b int) partition by list(a) (
partition p0 values in (0, 1, 2, 3, 4),
partition p1 values in (5, 6, 7, 8, 9),
partition p2 values in (10, 11, 12, 13, 14),
partition p3 values in (15, 16, 17, 18, 19))`,
`create table t2(a int, b int)`,
func() string { return fmt.Sprintf("(%v, %v)", rand.Intn(20), rand.Intn(20)) },
func() string { return fmt.Sprintf("%v", rand.Intn(20)) },
`select * from %v where a > ?`,
},
}
for _, tc := range testcases {
// create tables and insert some records
tk.MustExec("drop table if exists t1")
tk.MustExec("drop table if exists t2")
tk.MustExec(tc.t1Create)
tk.MustExec(tc.t2Create)
vals := make([]string, 0, 2048)
for i := 0; i < 2048; i++ {
vals = append(vals, tc.rowGener())
}
tk.MustExec(fmt.Sprintf("insert into t1 values %s", strings.Join(vals, ",")))
tk.MustExec(fmt.Sprintf("insert into t2 values %s", strings.Join(vals, ",")))

// the first query, @last_plan_from_cache should be zero
tk.MustExec(fmt.Sprintf(`prepare stmt1 from "%s"`, fmt.Sprintf(tc.query, "t1")))
tk.MustExec(fmt.Sprintf(`prepare stmt2 from "%s"`, fmt.Sprintf(tc.query, "t2")))
tk.MustExec(fmt.Sprintf("set @a=%v", tc.varGener()))
result1 := tk.MustQuery("execute stmt1 using @a").Sort().Rows()
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))
tk.MustQuery("execute stmt2 using @a").Sort().Check(result1)
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))

for i := 0; i < 100; i++ {
tk.MustExec(fmt.Sprintf("set @a=%v", tc.varGener()))
result1 := tk.MustQuery("execute stmt1 using @a").Sort().Rows()
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1"))
tk.MustQuery("execute stmt2 using @a").Sort().Check(result1)
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1"))
}
}
}

0 comments on commit 3e0947f

Please sign in to comment.