statistics: add a drop multiple partitions case (#49407)

ref pingcap/tidb#48126
This commit is contained in:
Rustin Liu
2023-12-13 18:21:19 +08:00
committed by GitHub
parent f7d2de06d5
commit 9633ca1fb4
2 changed files with 95 additions and 10 deletions

View File

@ -30,7 +30,7 @@ go_test(
timeout = "short",
srcs = ["ddl_test.go"],
flaky = True,
shard_count = 8,
shard_count = 9,
deps = [
"//pkg/parser/model",
"//pkg/planner/cardinality",

View File

@ -448,23 +448,108 @@ func TestDropAPartition(t *testing.T) {
testKit.MustExec("alter table t drop partition p0")
// Find the drop partition event.
var dropPartitionEvent *util.DDLEvent
for {
event := <-h.DDLEventCh()
if event.GetType() == model.ActionDropTablePartition {
dropPartitionEvent = event
break
}
}
dropPartitionEvent := findEvent(h.DDLEventCh(), model.ActionDropTablePartition)
err = h.HandleDDLEvent(dropPartitionEvent)
require.NoError(t, err)
// Check the global stats meta.
// Because we have dropped a partition, the count should be 3 and the modify count should be 2.
testKit.MustQuery(
fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID),
"select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID,
).Check(
testkit.Rows("3 2"),
)
// Get partition p0's stats update version.
partitionID := pi.Definitions[0].ID
// Get it from stats_meta first.
rows := testKit.MustQuery(
"select version from mysql.stats_meta where table_id = ?", partitionID,
).Rows()
require.Len(t, rows, 1)
version := rows[0][0].(string)
// Check the update version is changed.
rows = testKit.MustQuery(
"select version from mysql.stats_meta where table_id = ?", tableInfo.ID,
).Rows()
require.Len(t, rows, 1)
require.NotEqual(t, version, rows[0][0].(string))
}
func TestDropPartitions(t *testing.T) {
store, do := testkit.CreateMockStoreAndDomain(t)
testKit := testkit.NewTestKit(t, store)
h := do.StatsHandle()
testKit.MustExec("use test")
testKit.MustExec("drop table if exists t")
testKit.MustExec(`
create table t (
a int,
b int,
primary key(a),
index idx(b)
)
partition by range (a) (
partition p0 values less than (6),
partition p1 values less than (11),
partition p2 values less than (16),
partition p3 values less than (21)
)
`)
testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)")
testKit.MustExec("analyze table t")
is := do.InfoSchema()
tbl, err := is.TableByName(
model.NewCIStr("test"), model.NewCIStr("t"),
)
require.NoError(t, err)
tableInfo := tbl.Meta()
pi := tableInfo.GetPartitionInfo()
for _, def := range pi.Definitions {
statsTbl := h.GetPartitionStats(tableInfo, def.ID)
require.False(t, statsTbl.Pseudo)
}
err = h.Update(is)
require.NoError(t, err)
// Get partition p0 and p1's stats update version.
partitionP0ID := pi.Definitions[0].ID
partitionP1ID := pi.Definitions[1].ID
// Get it from stats_meat first.
rows := testKit.MustQuery(
"select version from mysql.stats_meta where table_id in (?, ?) order by table_id",
partitionP0ID, partitionP1ID,
).Rows()
require.Len(t, rows, 2)
versionP0 := rows[0][0].(string)
versionP1 := rows[1][0].(string)
// Drop partition p0 and p1.
testKit.MustExec("alter table t drop partition p0,p1")
// Find the drop partition event.
dropPartitionEvent := findEvent(h.DDLEventCh(), model.ActionDropTablePartition)
err = h.HandleDDLEvent(dropPartitionEvent)
require.NoError(t, err)
// Check the global stats meta.
// Because we have dropped two partitions,
// the count should be 5 - 2 - 1 = 2 and the modify count should be 2 +1 = 3.
testKit.MustQuery(
"select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID,
).Check(
testkit.Rows("2 3"),
)
// Check the update versions are changed.
rows = testKit.MustQuery(
"select version from mysql.stats_meta where table_id in (?, ?) order by table_id",
partitionP0ID, partitionP1ID,
).Rows()
require.Len(t, rows, 2)
require.NotEqual(t, versionP0, rows[0][0].(string))
require.NotEqual(t, versionP1, rows[1][0].(string))
}
func TestExchangeAPartition(t *testing.T) {