ddl, tools, util: migrate pingcap check to testify. (#31313)
close pingcap/tidb#28630, close pingcap/tidb#28631, close pingcap/tidb#28638, close pingcap/tidb#28639, close pingcap/tidb#29104, close pingcap/tidb#29108, close pingcap/tidb#29109, close pingcap/tidb#29111, close pingcap/tidb#29114
This commit is contained in:
@ -19,10 +19,11 @@ import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/tidb/domain/infosync"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
"github.com/pingcap/tidb/meta/autoid"
|
||||
@ -36,64 +37,72 @@ import (
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/pingcap/tidb/util/mock"
|
||||
"github.com/pingcap/tidb/util/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
var _ = Suite(&testColumnChangeSuite{})
|
||||
|
||||
type testColumnChangeSuite struct {
|
||||
type testColumnChangeSuiteToVerify struct {
|
||||
suite.Suite
|
||||
store kv.Storage
|
||||
dbInfo *model.DBInfo
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) SetUpSuite(c *C) {
|
||||
func TestColumnChangeSuite(t *testing.T) {
|
||||
_, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
suite.Run(t, new(testColumnChangeSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuiteToVerify) SetupSuite() {
|
||||
SetWaitTimeWhenErrorOccurred(1 * time.Microsecond)
|
||||
s.store = testCreateStore(c, "test_column_change")
|
||||
s.store = testCreateStore(s.T(), "test_column_change")
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
s.dbInfo, err = testSchemaInfo(d, "test_index_change")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(d), d, s.dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(d), d, s.dbInfo)
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) TearDownSuite(c *C) {
|
||||
func (s *testColumnChangeSuiteToVerify) TearDownSuite() {
|
||||
s.store.Close()
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) TestColumnChange(c *C) {
|
||||
func (s *testColumnChangeSuiteToVerify) TestColumnChange() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
// create table t (c1 int, c2 int);
|
||||
tblInfo, err := testTableInfo(d, "t", 2)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
// insert t values (1, 2);
|
||||
originTable := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
originTable := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
row := types.MakeDatums(1, 2)
|
||||
h, err := originTable.AddRecord(ctx, row)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
var mu sync.Mutex
|
||||
tc := &TestDDLCallback{}
|
||||
@ -154,31 +163,31 @@ func (s *testColumnChangeSuite) TestColumnChange(c *C) {
|
||||
}
|
||||
d.SetHook(tc)
|
||||
defaultValue := int64(3)
|
||||
job := testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultValue)
|
||||
c.Assert(checkErr, IsNil)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job := testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultValue)
|
||||
require.NoError(s.T(), checkErr)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
mu.Lock()
|
||||
tb := publicTable
|
||||
mu.Unlock()
|
||||
s.testColumnDrop(c, ctx, d, tb)
|
||||
s.testAddColumnNoDefault(c, ctx, d, tblInfo)
|
||||
s.testColumnDrop(ctx, d, tb)
|
||||
s.testAddColumnNoDefault(ctx, d, tblInfo)
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C) {
|
||||
func (s *testColumnChangeSuiteToVerify) TestModifyAutoRandColumnWithMetaKeyChanged() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
ids, err := d.genGlobalIDs(1)
|
||||
tableID := ids[0]
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
colInfo := &model.ColumnInfo{
|
||||
Name: model.NewCIStr("a"),
|
||||
Offset: 0,
|
||||
@ -193,7 +202,7 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C)
|
||||
}
|
||||
colInfo.ID = allocateColumnID(tblInfo)
|
||||
ctx := testNewContext(d)
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
|
||||
tc := &TestDDLCallback{}
|
||||
var errCount int32 = 3
|
||||
@ -219,10 +228,10 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C)
|
||||
Args: []interface{}{colInfo, colInfo.Name, ast.ColumnPosition{}, 0, newAutoRandomBits},
|
||||
}
|
||||
err = d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(errCount == 0, IsTrue)
|
||||
c.Assert(genAutoRandErr, IsNil)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
require.NoError(s.T(), err)
|
||||
require.True(s.T(), errCount == 0)
|
||||
require.Nil(s.T(), genAutoRandErr)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
var newTbInfo *model.TableInfo
|
||||
err = kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
t := meta.NewMeta(txn)
|
||||
@ -233,11 +242,11 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(newTbInfo.AutoRandomBits, Equals, newAutoRandomBits)
|
||||
require.NoError(s.T(), err)
|
||||
require.Equal(s.T(), newTbInfo.AutoRandomBits, newAutoRandomBits)
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) testAddColumnNoDefault(c *C, ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo) {
|
||||
func (s *testColumnChangeSuiteToVerify) testAddColumnNoDefault(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo) {
|
||||
tc := &TestDDLCallback{}
|
||||
// set up hook
|
||||
prevState := model.StateNone
|
||||
@ -280,12 +289,12 @@ func (s *testColumnChangeSuite) testAddColumnNoDefault(c *C, ctx sessionctx.Cont
|
||||
}
|
||||
}
|
||||
d.SetHook(tc)
|
||||
job := testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, nil)
|
||||
c.Assert(checkErr, IsNil)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job := testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, nil)
|
||||
require.NoError(s.T(), checkErr)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) testColumnDrop(c *C, ctx sessionctx.Context, d *ddl, tbl table.Table) {
|
||||
func (s *testColumnChangeSuiteToVerify) testColumnDrop(ctx sessionctx.Context, d *ddl, tbl table.Table) {
|
||||
dropCol := tbl.Cols()[2]
|
||||
tc := &TestDDLCallback{}
|
||||
// set up hook
|
||||
@ -307,8 +316,8 @@ func (s *testColumnChangeSuite) testColumnDrop(c *C, ctx sessionctx.Context, d *
|
||||
}
|
||||
}
|
||||
d.SetHook(tc)
|
||||
c.Assert(checkErr, IsNil)
|
||||
testDropColumn(c, ctx, d, s.dbInfo, tbl.Meta(), dropCol.Name.L, false)
|
||||
require.NoError(s.T(), checkErr)
|
||||
testDropColumn(s.T(), ctx, d, s.dbInfo, tbl.Meta(), dropCol.Name.L, false)
|
||||
}
|
||||
|
||||
func seek(t table.PhysicalTable, ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) {
|
||||
@ -333,7 +342,7 @@ func seek(t table.PhysicalTable, ctx sessionctx.Context, h kv.Handle) (kv.Handle
|
||||
return handle, true, nil
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) checkAddWriteOnly(ctx sessionctx.Context, d *ddl, deleteOnlyTable, writeOnlyTable table.Table, h kv.Handle) error {
|
||||
func (s *testColumnChangeSuiteToVerify) checkAddWriteOnly(ctx sessionctx.Context, d *ddl, deleteOnlyTable, writeOnlyTable table.Table, h kv.Handle) error {
|
||||
// WriteOnlyTable: insert t values (2, 3)
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
@ -407,7 +416,7 @@ func touchedSlice(t table.Table) []bool {
|
||||
return touched
|
||||
}
|
||||
|
||||
func (s *testColumnChangeSuite) checkAddPublic(sctx sessionctx.Context, d *ddl, writeOnlyTable, publicTable table.Table) error {
|
||||
func (s *testColumnChangeSuiteToVerify) checkAddPublic(sctx sessionctx.Context, d *ddl, writeOnlyTable, publicTable table.Table) error {
|
||||
ctx := context.TODO()
|
||||
// publicTable Insert t values (4, 4, 4)
|
||||
err := sctx.NewTxn(ctx)
|
||||
|
||||
@ -21,8 +21,8 @@ import (
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/tidb/domain/infosync"
|
||||
"github.com/pingcap/tidb/infoschema"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/parser"
|
||||
@ -39,33 +39,40 @@ import (
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/pingcap/tidb/util/collate"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
var _ = Suite(&testColumnSuite{})
|
||||
|
||||
type testColumnSuite struct {
|
||||
type testColumnSuiteToVerify struct {
|
||||
suite.Suite
|
||||
store kv.Storage
|
||||
dbInfo *model.DBInfo
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) SetUpSuite(c *C) {
|
||||
s.store = testCreateStore(c, "test_column")
|
||||
func TestColumnSuite(t *testing.T) {
|
||||
_, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
suite.Run(t, new(testColumnSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testColumnSuiteToVerify) SetupSuite() {
|
||||
s.store = testCreateStore(s.T(), "test_column")
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
s.dbInfo, err = testSchemaInfo(d, "test_column")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(d), d, s.dbInfo)
|
||||
c.Assert(d.Stop(), IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(d), d, s.dbInfo)
|
||||
require.Nil(s.T(), d.Stop())
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TearDownSuite(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TearDownSuite() {
|
||||
err := s.store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func buildCreateColumnJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName string,
|
||||
@ -89,13 +96,13 @@ func buildCreateColumnJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, colNam
|
||||
return job
|
||||
}
|
||||
|
||||
func testCreateColumn(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo,
|
||||
func testCreateColumn(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo,
|
||||
colName string, pos *ast.ColumnPosition, defaultValue interface{}) *model.Job {
|
||||
job := buildCreateColumnJob(dbInfo, tblInfo, colName, pos, defaultValue)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
@ -126,13 +133,13 @@ func buildCreateColumnsJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, colNa
|
||||
return job
|
||||
}
|
||||
|
||||
func testCreateColumns(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo,
|
||||
func testCreateColumns(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo,
|
||||
colNames []string, positions []*ast.ColumnPosition, defaultValue interface{}) *model.Job {
|
||||
job := buildCreateColumnsJob(dbInfo, tblInfo, colNames, positions, defaultValue)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
@ -147,16 +154,16 @@ func buildDropColumnJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName
|
||||
}
|
||||
}
|
||||
|
||||
func testDropColumn(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName string, isError bool) *model.Job {
|
||||
func testDropColumn(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName string, isError bool) *model.Job {
|
||||
job := buildDropColumnJob(dbInfo, tblInfo, colName)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
if isError {
|
||||
c.Assert(err, NotNil)
|
||||
require.Error(t, err)
|
||||
return nil
|
||||
}
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
@ -176,179 +183,179 @@ func buildDropColumnsJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName
|
||||
return job
|
||||
}
|
||||
|
||||
func testDropColumns(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colNames []string, isError bool) *model.Job {
|
||||
func testDropColumns(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colNames []string, isError bool) *model.Job {
|
||||
job := buildDropColumnsJob(dbInfo, tblInfo, colNames)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
if isError {
|
||||
c.Assert(err, NotNil)
|
||||
require.Error(t, err)
|
||||
return nil
|
||||
}
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestColumnBasic(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestColumnBasic() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
tblInfo, err := testTableInfo(d, "t1", 3)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
num := 10
|
||||
for i := 0; i < num; i++ {
|
||||
_, err := t.AddRecord(ctx, types.MakeDatums(i, 10*i, 100*i))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
i := int64(0)
|
||||
err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) {
|
||||
c.Assert(data, HasLen, 3)
|
||||
c.Assert(data[0].GetInt64(), Equals, i)
|
||||
c.Assert(data[1].GetInt64(), Equals, 10*i)
|
||||
c.Assert(data[2].GetInt64(), Equals, 100*i)
|
||||
require.Len(s.T(), data, 3)
|
||||
require.Equal(s.T(), data[0].GetInt64(), i)
|
||||
require.Equal(s.T(), data[1].GetInt64(), 10*i)
|
||||
require.Equal(s.T(), data[2].GetInt64(), 100*i)
|
||||
i++
|
||||
return true, nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(i, Equals, int64(num))
|
||||
require.NoError(s.T(), err)
|
||||
require.Equal(s.T(), i, int64(num))
|
||||
|
||||
c.Assert(table.FindCol(t.Cols(), "c4"), IsNil)
|
||||
require.Nil(s.T(), table.FindCol(t.Cols(), "c4"))
|
||||
|
||||
job := testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c4", &ast.ColumnPosition{Tp: ast.ColumnPositionAfter, RelativeColumn: &ast.ColumnName{Name: model.NewCIStr("c3")}}, 100)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job := testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c4", &ast.ColumnPosition{Tp: ast.ColumnPositionAfter, RelativeColumn: &ast.ColumnName{Name: model.NewCIStr("c3")}}, 100)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
c.Assert(table.FindCol(t.Cols(), "c4"), NotNil)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
require.NotNil(s.T(), table.FindCol(t.Cols(), "c4"))
|
||||
|
||||
i = int64(0)
|
||||
err = tables.IterRecords(t, ctx, t.Cols(),
|
||||
func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) {
|
||||
c.Assert(data, HasLen, 4)
|
||||
c.Assert(data[0].GetInt64(), Equals, i)
|
||||
c.Assert(data[1].GetInt64(), Equals, 10*i)
|
||||
c.Assert(data[2].GetInt64(), Equals, 100*i)
|
||||
c.Assert(data[3].GetInt64(), Equals, int64(100))
|
||||
require.Len(s.T(), data, 4)
|
||||
require.Equal(s.T(), data[0].GetInt64(), i)
|
||||
require.Equal(s.T(), data[1].GetInt64(), 10*i)
|
||||
require.Equal(s.T(), data[2].GetInt64(), 100*i)
|
||||
require.Equal(s.T(), data[3].GetInt64(), int64(100))
|
||||
i++
|
||||
return true, nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(i, Equals, int64(num))
|
||||
require.NoError(s.T(), err)
|
||||
require.Equal(s.T(), i, int64(num))
|
||||
|
||||
h, err := t.AddRecord(ctx, types.MakeDatums(11, 12, 13, 14))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
values, err := tables.RowWithCols(t, ctx, h, t.Cols())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
c.Assert(values, HasLen, 4)
|
||||
c.Assert(values[3].GetInt64(), Equals, int64(14))
|
||||
require.Len(s.T(), values, 4)
|
||||
require.Equal(s.T(), values[3].GetInt64(), int64(14))
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c4", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c4", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
values, err = tables.RowWithCols(t, ctx, h, t.Cols())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
c.Assert(values, HasLen, 3)
|
||||
c.Assert(values[2].GetInt64(), Equals, int64(13))
|
||||
require.Len(s.T(), values, 3)
|
||||
require.Equal(s.T(), values[2].GetInt64(), int64(13))
|
||||
|
||||
job = testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c4", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, 111)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job = testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c4", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, 111)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
values, err = tables.RowWithCols(t, ctx, h, t.Cols())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
c.Assert(values, HasLen, 4)
|
||||
c.Assert(values[3].GetInt64(), Equals, int64(111))
|
||||
require.Len(s.T(), values, 4)
|
||||
require.Equal(s.T(), values[3].GetInt64(), int64(111))
|
||||
|
||||
job = testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c5", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, 101)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job = testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c5", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, 101)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
values, err = tables.RowWithCols(t, ctx, h, t.Cols())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
c.Assert(values, HasLen, 5)
|
||||
c.Assert(values[4].GetInt64(), Equals, int64(101))
|
||||
require.Len(s.T(), values, 5)
|
||||
require.Equal(s.T(), values[4].GetInt64(), int64(101))
|
||||
|
||||
job = testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c6", &ast.ColumnPosition{Tp: ast.ColumnPositionFirst}, 202)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job = testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c6", &ast.ColumnPosition{Tp: ast.ColumnPositionFirst}, 202)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
cols := t.Cols()
|
||||
c.Assert(cols, HasLen, 6)
|
||||
c.Assert(cols[0].Offset, Equals, 0)
|
||||
c.Assert(cols[0].Name.L, Equals, "c6")
|
||||
c.Assert(cols[1].Offset, Equals, 1)
|
||||
c.Assert(cols[1].Name.L, Equals, "c1")
|
||||
c.Assert(cols[2].Offset, Equals, 2)
|
||||
c.Assert(cols[2].Name.L, Equals, "c2")
|
||||
c.Assert(cols[3].Offset, Equals, 3)
|
||||
c.Assert(cols[3].Name.L, Equals, "c3")
|
||||
c.Assert(cols[4].Offset, Equals, 4)
|
||||
c.Assert(cols[4].Name.L, Equals, "c4")
|
||||
c.Assert(cols[5].Offset, Equals, 5)
|
||||
c.Assert(cols[5].Name.L, Equals, "c5")
|
||||
require.Len(s.T(), cols, 6)
|
||||
require.Equal(s.T(), cols[0].Offset, 0)
|
||||
require.Equal(s.T(), cols[0].Name.L, "c6")
|
||||
require.Equal(s.T(), cols[1].Offset, 1)
|
||||
require.Equal(s.T(), cols[1].Name.L, "c1")
|
||||
require.Equal(s.T(), cols[2].Offset, 2)
|
||||
require.Equal(s.T(), cols[2].Name.L, "c2")
|
||||
require.Equal(s.T(), cols[3].Offset, 3)
|
||||
require.Equal(s.T(), cols[3].Name.L, "c3")
|
||||
require.Equal(s.T(), cols[4].Offset, 4)
|
||||
require.Equal(s.T(), cols[4].Name.L, "c4")
|
||||
require.Equal(s.T(), cols[5].Offset, 5)
|
||||
require.Equal(s.T(), cols[5].Name.L, "c5")
|
||||
|
||||
values, err = tables.RowWithCols(t, ctx, h, cols)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
c.Assert(values, HasLen, 6)
|
||||
c.Assert(values[0].GetInt64(), Equals, int64(202))
|
||||
c.Assert(values[5].GetInt64(), Equals, int64(101))
|
||||
require.Len(s.T(), values, 6)
|
||||
require.Equal(s.T(), values[0].GetInt64(), int64(202))
|
||||
require.Equal(s.T(), values[5].GetInt64(), int64(101))
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c2", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c2", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
t = testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
values, err = tables.RowWithCols(t, ctx, h, t.Cols())
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(values, HasLen, 5)
|
||||
c.Assert(values[0].GetInt64(), Equals, int64(202))
|
||||
c.Assert(values[4].GetInt64(), Equals, int64(101))
|
||||
require.NoError(s.T(), err)
|
||||
require.Len(s.T(), values, 5)
|
||||
require.Equal(s.T(), values[0].GetInt64(), int64(202))
|
||||
require.Equal(s.T(), values[4].GetInt64(), int64(101))
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c1", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c1", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c3", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c3", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c4", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c4", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
job = testCreateIndex(c, ctx, d, s.dbInfo, tblInfo, false, "c5_idx", "c5")
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job = testCreateIndex(s.T(), ctx, d, s.dbInfo, tblInfo, false, "c5_idx", "c5")
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
|
||||
job = testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c5", false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c5", false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
testDropColumn(c, ctx, d, s.dbInfo, tblInfo, "c6", true)
|
||||
testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c6", true)
|
||||
|
||||
testDropTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testDropTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkColumnKVExist(ctx sessionctx.Context, t table.Table, handle kv.Handle, col *table.Column, columnValue interface{}, isExist bool) error {
|
||||
func (s *testColumnSuiteToVerify) checkColumnKVExist(ctx sessionctx.Context, t table.Table, handle kv.Handle, col *table.Column, columnValue interface{}, isExist bool) error {
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -394,7 +401,7 @@ func (s *testColumnSuite) checkColumnKVExist(ctx sessionctx.Context, t table.Tab
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkNoneColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkNoneColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, columnValue interface{}) error {
|
||||
t, err := testGetTableWithError(d, s.dbInfo.ID, tblInfo.ID)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -410,7 +417,7 @@ func (s *testColumnSuite) checkNoneColumn(ctx sessionctx.Context, d *ddl, tblInf
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
t, err := testGetTableWithError(d, s.dbInfo.ID, tblInfo.ID)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -511,7 +518,7 @@ func (s *testColumnSuite) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
t, err := testGetTableWithError(d, s.dbInfo.ID, tblInfo.ID)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -616,7 +623,7 @@ func (s *testColumnSuite) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, t
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkReorganizationColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkReorganizationColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, col *table.Column, row []types.Datum, columnValue interface{}) error {
|
||||
t, err := testGetTableWithError(d, s.dbInfo.ID, tblInfo.ID)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -712,7 +719,7 @@ func (s *testColumnSuite) checkReorganizationColumn(ctx sessionctx.Context, d *d
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, newCol *table.Column, oldRow []types.Datum, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblInfo *model.TableInfo, newCol *table.Column, oldRow []types.Datum, columnValue interface{}) error {
|
||||
t, err := testGetTableWithError(d, s.dbInfo.ID, tblInfo.ID)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
@ -809,7 +816,7 @@ func (s *testColumnSuite) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblI
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) checkAddColumn(state model.SchemaState, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, newCol *table.Column, oldRow []types.Datum, columnValue interface{}) error {
|
||||
func (s *testColumnSuiteToVerify) checkAddColumn(state model.SchemaState, d *ddl, tblInfo *model.TableInfo, handle kv.Handle, newCol *table.Column, oldRow []types.Datum, columnValue interface{}) error {
|
||||
ctx := testNewContext(d)
|
||||
var err error
|
||||
switch state {
|
||||
@ -827,7 +834,7 @@ func (s *testColumnSuite) checkAddColumn(state model.SchemaState, d *ddl, tblInf
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) testGetColumn(t table.Table, name string, isExist bool) error {
|
||||
func (s *testColumnSuiteToVerify) testGetColumn(t table.Table, name string, isExist bool) error {
|
||||
col := table.FindCol(t.Cols(), name)
|
||||
if isExist {
|
||||
if col == nil {
|
||||
@ -841,31 +848,31 @@ func (s *testColumnSuite) testGetColumn(t table.Table, name string, isExist bool
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestAddColumn(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestAddColumn() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo, err := testTableInfo(d, "t", 3)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
oldRow := types.MakeDatums(int64(1), int64(2), int64(3))
|
||||
handle, err := t.AddRecord(ctx, oldRow)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
newColName := "c4"
|
||||
defaultColValue := int64(4)
|
||||
@ -905,56 +912,56 @@ func (s *testColumnSuite) TestAddColumn(c *C) {
|
||||
|
||||
d.SetHook(tc)
|
||||
|
||||
job := testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, newColName, &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultColValue)
|
||||
job := testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, newColName, &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultColValue)
|
||||
|
||||
testCheckJobDone(c, d, job, true)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
mu.Lock()
|
||||
hErr := hookErr
|
||||
ok := checkOK
|
||||
mu.Unlock()
|
||||
c.Assert(hErr, IsNil)
|
||||
c.Assert(ok, IsTrue)
|
||||
require.NoError(s.T(), hErr)
|
||||
require.True(s.T(), ok)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
job = testDropTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestAddColumns(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestAddColumns() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo, err := testTableInfo(d, "t", 3)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
oldRow := types.MakeDatums(int64(1), int64(2), int64(3))
|
||||
handle, err := t.AddRecord(ctx, oldRow)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
newColNames := []string{"c4,c5,c6"}
|
||||
positions := make([]*ast.ColumnPosition, 3)
|
||||
@ -1000,49 +1007,49 @@ func (s *testColumnSuite) TestAddColumns(c *C) {
|
||||
|
||||
d.SetHook(tc)
|
||||
|
||||
job := testCreateColumns(c, ctx, d, s.dbInfo, tblInfo, newColNames, positions, defaultColValue)
|
||||
job := testCreateColumns(s.T(), ctx, d, s.dbInfo, tblInfo, newColNames, positions, defaultColValue)
|
||||
|
||||
testCheckJobDone(c, d, job, true)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
mu.Lock()
|
||||
hErr := hookErr
|
||||
ok := checkOK
|
||||
mu.Unlock()
|
||||
c.Assert(hErr, IsNil)
|
||||
c.Assert(ok, IsTrue)
|
||||
require.NoError(s.T(), hErr)
|
||||
require.True(s.T(), ok)
|
||||
|
||||
job = testDropTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
err = d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestDropColumn(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestDropColumn() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo, err := testTableInfo(d, "t2", 4)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
colName := "c4"
|
||||
defaultColValue := int64(4)
|
||||
row := types.MakeDatums(int64(1), int64(2), int64(3))
|
||||
_, err = t.AddRecord(ctx, append(row, types.NewDatum(defaultColValue)))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
checkOK := false
|
||||
var hookErr error
|
||||
@ -1069,57 +1076,57 @@ func (s *testColumnSuite) TestDropColumn(c *C) {
|
||||
|
||||
d.SetHook(tc)
|
||||
|
||||
job := testDropColumn(c, ctx, d, s.dbInfo, tblInfo, colName, false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job := testDropColumn(s.T(), ctx, d, s.dbInfo, tblInfo, colName, false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
mu.Lock()
|
||||
hErr := hookErr
|
||||
ok := checkOK
|
||||
mu.Unlock()
|
||||
c.Assert(hErr, IsNil)
|
||||
c.Assert(ok, IsTrue)
|
||||
require.NoError(s.T(), hErr)
|
||||
require.True(s.T(), ok)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
job = testDropTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestDropColumns(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestDropColumns() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo, err := testTableInfo(d, "t2", 4)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
colNames := []string{"c3", "c4"}
|
||||
defaultColValue := int64(4)
|
||||
row := types.MakeDatums(int64(1), int64(2), int64(3))
|
||||
_, err = t.AddRecord(ctx, append(row, types.NewDatum(defaultColValue)))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
checkOK := false
|
||||
var hookErr error
|
||||
@ -1148,19 +1155,19 @@ func (s *testColumnSuite) TestDropColumns(c *C) {
|
||||
|
||||
d.SetHook(tc)
|
||||
|
||||
job := testDropColumns(c, ctx, d, s.dbInfo, tblInfo, colNames, false)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job := testDropColumns(s.T(), ctx, d, s.dbInfo, tblInfo, colNames, false)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
mu.Lock()
|
||||
hErr := hookErr
|
||||
ok := checkOK
|
||||
mu.Unlock()
|
||||
c.Assert(hErr, IsNil)
|
||||
c.Assert(ok, IsTrue)
|
||||
require.NoError(s.T(), hErr)
|
||||
require.True(s.T(), ok)
|
||||
|
||||
job = testDropTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
job = testDropTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
testCheckJobDone(s.T(), d, job, false)
|
||||
err = d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func TestModifyColumn(t *testing.T) {
|
||||
@ -1247,51 +1254,51 @@ func TestFieldCase(t *testing.T) {
|
||||
require.EqualError(t, err, infoschema.ErrColumnExists.GenWithStackByArgs("Field").Error())
|
||||
}
|
||||
|
||||
func (s *testColumnSuite) TestAutoConvertBlobTypeByLength(c *C) {
|
||||
func (s *testColumnSuiteToVerify) TestAutoConvertBlobTypeByLength() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
// Close the customized ddl(worker goroutine included) after the test is finished, otherwise, it will
|
||||
// cause go routine in TiDB leak test.
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
sql := fmt.Sprintf("create table t0(c0 Blob(%d), c1 Blob(%d), c2 Blob(%d), c3 Blob(%d))",
|
||||
tinyBlobMaxLength-1, blobMaxLength-1, mediumBlobMaxLength-1, longBlobMaxLength-1)
|
||||
stmt, err := parser.New().ParseOneStmt(sql, "", "")
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo, err := BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
genIDs, err := d.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo.ID = genIDs[0]
|
||||
|
||||
ctx := testNewContext(d)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
c.Assert(t.Cols()[0].Tp, Equals, mysql.TypeTinyBlob)
|
||||
c.Assert(t.Cols()[0].Flen, Equals, tinyBlobMaxLength)
|
||||
c.Assert(t.Cols()[1].Tp, Equals, mysql.TypeBlob)
|
||||
c.Assert(t.Cols()[1].Flen, Equals, blobMaxLength)
|
||||
c.Assert(t.Cols()[2].Tp, Equals, mysql.TypeMediumBlob)
|
||||
c.Assert(t.Cols()[2].Flen, Equals, mediumBlobMaxLength)
|
||||
c.Assert(t.Cols()[3].Tp, Equals, mysql.TypeLongBlob)
|
||||
c.Assert(t.Cols()[3].Flen, Equals, longBlobMaxLength)
|
||||
require.Equal(s.T(), t.Cols()[0].Tp, mysql.TypeTinyBlob)
|
||||
require.Equal(s.T(), t.Cols()[0].Flen, tinyBlobMaxLength)
|
||||
require.Equal(s.T(), t.Cols()[1].Tp, mysql.TypeBlob)
|
||||
require.Equal(s.T(), t.Cols()[1].Flen, blobMaxLength)
|
||||
require.Equal(s.T(), t.Cols()[2].Tp, mysql.TypeMediumBlob)
|
||||
require.Equal(s.T(), t.Cols()[2].Flen, mediumBlobMaxLength)
|
||||
require.Equal(s.T(), t.Cols()[3].Tp, mysql.TypeLongBlob)
|
||||
require.Equal(s.T(), t.Cols()[3].Flen, longBlobMaxLength)
|
||||
|
||||
oldRow := types.MakeDatums([]byte("a"), []byte("a"), []byte("a"), []byte("a"))
|
||||
_, err = t.AddRecord(ctx, oldRow)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
110
ddl/ddl_test.go
110
ddl/ddl_test.go
@ -107,9 +107,9 @@ func testNewDDLAndStart(ctx context.Context, options ...Option) (*ddl, error) {
|
||||
return d, err
|
||||
}
|
||||
|
||||
func testCreateStore(c *C, name string) kv.Storage {
|
||||
func testCreateStore(t *testing.T, name string) kv.Storage {
|
||||
store, err := mockstore.NewMockStore()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
return store
|
||||
}
|
||||
|
||||
@ -125,14 +125,14 @@ func testNewContext(d *ddl) sessionctx.Context {
|
||||
return ctx
|
||||
}
|
||||
|
||||
func getSchemaVer(c *C, ctx sessionctx.Context) int64 {
|
||||
func getSchemaVer(t *testing.T, ctx sessionctx.Context) int64 {
|
||||
err := ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
m := meta.NewMeta(txn)
|
||||
ver, err := m.GetSchemaVersion()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
return ver
|
||||
}
|
||||
|
||||
@ -154,14 +154,14 @@ type historyJobArgs struct {
|
||||
tblIDs map[int64]struct{}
|
||||
}
|
||||
|
||||
func checkEqualTable(c *C, t1, t2 *model.TableInfo) {
|
||||
c.Assert(t1.ID, Equals, t2.ID)
|
||||
c.Assert(t1.Name, Equals, t2.Name)
|
||||
c.Assert(t1.Charset, Equals, t2.Charset)
|
||||
c.Assert(t1.Collate, Equals, t2.Collate)
|
||||
c.Assert(t1.PKIsHandle, DeepEquals, t2.PKIsHandle)
|
||||
c.Assert(t1.Comment, DeepEquals, t2.Comment)
|
||||
c.Assert(t1.AutoIncID, DeepEquals, t2.AutoIncID)
|
||||
func checkEqualTable(t *testing.T, t1, t2 *model.TableInfo) {
|
||||
require.Equal(t, t1.ID, t2.ID)
|
||||
require.Equal(t, t1.Name, t2.Name)
|
||||
require.Equal(t, t1.Charset, t2.Charset)
|
||||
require.Equal(t, t1.Collate, t2.Collate)
|
||||
require.Equal(t, t1.PKIsHandle, t2.PKIsHandle)
|
||||
require.Equal(t, t1.Comment, t2.Comment)
|
||||
require.Equal(t, t1.AutoIncID, t2.AutoIncID)
|
||||
}
|
||||
|
||||
func checkEqualTableT(t *testing.T, t1, t2 *model.TableInfo) {
|
||||
@ -174,27 +174,27 @@ func checkEqualTableT(t *testing.T, t1, t2 *model.TableInfo) {
|
||||
require.EqualValues(t, t1.AutoIncID, t2.AutoIncID)
|
||||
}
|
||||
|
||||
func checkHistoryJob(c *C, job *model.Job) {
|
||||
c.Assert(job.State, Equals, model.JobStateSynced)
|
||||
func checkHistoryJob(t *testing.T, job *model.Job) {
|
||||
require.Equal(t, job.State, model.JobStateSynced)
|
||||
}
|
||||
|
||||
func checkHistoryJobArgs(c *C, ctx sessionctx.Context, id int64, args *historyJobArgs) {
|
||||
func checkHistoryJobArgs(t *testing.T, ctx sessionctx.Context, id int64, args *historyJobArgs) {
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
t := meta.NewMeta(txn)
|
||||
historyJob, err := t.GetHistoryDDLJob(id)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(historyJob.BinlogInfo.FinishedTS, Greater, uint64(0))
|
||||
require.NoError(t, err)
|
||||
tran := meta.NewMeta(txn)
|
||||
historyJob, err := tran.GetHistoryDDLJob(id)
|
||||
require.NoError(t, err)
|
||||
require.Greater(t, historyJob.BinlogInfo.FinishedTS, uint64(0))
|
||||
|
||||
if args.tbl != nil {
|
||||
c.Assert(historyJob.BinlogInfo.SchemaVersion, Equals, args.ver)
|
||||
checkEqualTable(c, historyJob.BinlogInfo.TableInfo, args.tbl)
|
||||
require.Equal(t, historyJob.BinlogInfo.SchemaVersion, args.ver)
|
||||
checkEqualTable(t, historyJob.BinlogInfo.TableInfo, args.tbl)
|
||||
return
|
||||
}
|
||||
|
||||
// for handling schema job
|
||||
c.Assert(historyJob.BinlogInfo.SchemaVersion, Equals, args.ver)
|
||||
c.Assert(historyJob.BinlogInfo.DBInfo, DeepEquals, args.db)
|
||||
require.Equal(t, historyJob.BinlogInfo.SchemaVersion, args.ver)
|
||||
require.Equal(t, historyJob.BinlogInfo.DBInfo, args.db)
|
||||
// only for creating schema job
|
||||
if args.db != nil && len(args.tblIDs) == 0 {
|
||||
return
|
||||
@ -237,26 +237,26 @@ func buildCreateIdxJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bo
|
||||
}
|
||||
}
|
||||
|
||||
func testCreatePrimaryKey(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName string) *model.Job {
|
||||
func testCreatePrimaryKey(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, colName string) *model.Job {
|
||||
job := buildCreateIdxJob(dbInfo, tblInfo, true, "primary", colName)
|
||||
job.Type = model.ActionAddPrimaryKey
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
func testCreateIndex(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bool, indexName string, colName string) *model.Job {
|
||||
func testCreateIndex(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bool, indexName string, colName string) *model.Job {
|
||||
job := buildCreateIdxJob(dbInfo, tblInfo, unique, indexName, colName)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
func testAddColumn(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, args []interface{}) *model.Job {
|
||||
func testAddColumn(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, args []interface{}) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -265,13 +265,13 @@ func testAddColumn(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, t
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
func testAddColumns(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, args []interface{}) *model.Job {
|
||||
func testAddColumns(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, args []interface{}) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -280,9 +280,9 @@ func testAddColumns(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo,
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
@ -300,12 +300,12 @@ func buildDropIdxJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, indexName s
|
||||
}
|
||||
}
|
||||
|
||||
func testDropIndex(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, indexName string) *model.Job {
|
||||
func testDropIndex(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, indexName string) *model.Job {
|
||||
job := buildDropIdxJob(dbInfo, tblInfo, indexName)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
require.NoError(t, err)
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
@ -319,7 +319,7 @@ func buildRebaseAutoIDJobJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, new
|
||||
}
|
||||
}
|
||||
|
||||
func (s *testDDLSuite) TestGetIntervalFromPolicy(c *C) {
|
||||
func (s *testDDLSuiteToVerify) TestGetIntervalFromPolicy() {
|
||||
policy := []time.Duration{
|
||||
1 * time.Second,
|
||||
2 * time.Second,
|
||||
@ -330,18 +330,18 @@ func (s *testDDLSuite) TestGetIntervalFromPolicy(c *C) {
|
||||
)
|
||||
|
||||
val, changed = getIntervalFromPolicy(policy, 0)
|
||||
c.Assert(val, Equals, 1*time.Second)
|
||||
c.Assert(changed, Equals, true)
|
||||
require.Equal(s.T(), val, 1*time.Second)
|
||||
require.Equal(s.T(), changed, true)
|
||||
|
||||
val, changed = getIntervalFromPolicy(policy, 1)
|
||||
c.Assert(val, Equals, 2*time.Second)
|
||||
c.Assert(changed, Equals, true)
|
||||
require.Equal(s.T(), val, 2*time.Second)
|
||||
require.Equal(s.T(), changed, true)
|
||||
|
||||
val, changed = getIntervalFromPolicy(policy, 2)
|
||||
c.Assert(val, Equals, 2*time.Second)
|
||||
c.Assert(changed, Equals, false)
|
||||
require.Equal(s.T(), val, 2*time.Second)
|
||||
require.Equal(s.T(), changed, false)
|
||||
|
||||
val, changed = getIntervalFromPolicy(policy, 3)
|
||||
c.Assert(val, Equals, 2*time.Second)
|
||||
c.Assert(changed, Equals, false)
|
||||
require.Equal(s.T(), val, 2*time.Second)
|
||||
require.Equal(s.T(), changed, false)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -17,40 +17,40 @@ package ddl
|
||||
import (
|
||||
"context"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/failpoint"
|
||||
"github.com/pingcap/tidb/parser/ast"
|
||||
"github.com/pingcap/tidb/parser/model"
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func (s *testColumnChangeSuite) TestFailBeforeDecodeArgs(c *C) {
|
||||
func (s *testColumnChangeSuiteToVerify) TestFailBeforeDecodeArgs() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
// create table t_fail (c1 int, c2 int);
|
||||
tblInfo, err := testTableInfo(d, "t_fail", 2)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
// insert t_fail values (1, 2);
|
||||
originTable := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
originTable := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
row := types.MakeDatums(1, 2)
|
||||
_, err = originTable.AddRecord(ctx, row)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
tc := &TestDDLCallback{}
|
||||
first := true
|
||||
@ -62,17 +62,17 @@ func (s *testColumnChangeSuite) TestFailBeforeDecodeArgs(c *C) {
|
||||
stateCnt++
|
||||
} else if job.SchemaState == model.StateWriteReorganization {
|
||||
if first {
|
||||
c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/errorBeforeDecodeArgs", `return(true)`), IsNil)
|
||||
require.NoError(s.T(), failpoint.Enable("github.com/pingcap/tidb/ddl/errorBeforeDecodeArgs", `return(true)`))
|
||||
first = false
|
||||
} else {
|
||||
c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/errorBeforeDecodeArgs"), IsNil)
|
||||
require.NoError(s.T(), failpoint.Disable("github.com/pingcap/tidb/ddl/errorBeforeDecodeArgs"))
|
||||
}
|
||||
}
|
||||
}
|
||||
d.SetHook(tc)
|
||||
defaultValue := int64(3)
|
||||
job := testCreateColumn(c, ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultValue)
|
||||
job := testCreateColumn(s.T(), ctx, d, s.dbInfo, tblInfo, "c3", &ast.ColumnPosition{Tp: ast.ColumnPositionNone}, defaultValue)
|
||||
// Make sure the schema state only appears once.
|
||||
c.Assert(stateCnt, Equals, 1)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
require.Equal(s.T(), 1, stateCnt)
|
||||
testCheckJobDone(s.T(), d, job, true)
|
||||
}
|
||||
|
||||
@ -16,10 +16,11 @@ package ddl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/tidb/domain/infosync"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/parser/model"
|
||||
"github.com/pingcap/tidb/parser/mysql"
|
||||
@ -27,70 +28,78 @@ import (
|
||||
"github.com/pingcap/tidb/table"
|
||||
"github.com/pingcap/tidb/table/tables"
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
var _ = Suite(&testIndexChangeSuite{})
|
||||
|
||||
type testIndexChangeSuite struct {
|
||||
type testIndexChangeSuiteToVerify struct {
|
||||
suite.Suite
|
||||
store kv.Storage
|
||||
dbInfo *model.DBInfo
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) SetUpSuite(c *C) {
|
||||
s.store = testCreateStore(c, "test_index_change")
|
||||
func TestIndexChangeSuite(t *testing.T) {
|
||||
_, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
suite.Run(t, new(testIndexChangeSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuiteToVerify) SetupSuite() {
|
||||
s.store = testCreateStore(s.T(), "test_index_change")
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
s.dbInfo, err = testSchemaInfo(d, "test_index_change")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(d), d, s.dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(d), d, s.dbInfo)
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) TearDownSuite(c *C) {
|
||||
func (s *testIndexChangeSuiteToVerify) TearDownSuite() {
|
||||
s.store.Close()
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) TestIndexChange(c *C) {
|
||||
func (s *testIndexChangeSuiteToVerify) TestIndexChange() {
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
// create table t (c1 int primary key, c2 int);
|
||||
tblInfo, err := testTableInfo(d, "t", 2)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
tblInfo.Columns[0].Flag = mysql.PriKeyFlag | mysql.NotNullFlag
|
||||
tblInfo.PKIsHandle = true
|
||||
ctx := testNewContext(d)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
testCreateTable(c, ctx, d, s.dbInfo, tblInfo)
|
||||
originTable := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateTable(s.T(), ctx, d, s.dbInfo, tblInfo)
|
||||
originTable := testGetTable(s.T(), d, s.dbInfo.ID, tblInfo.ID)
|
||||
|
||||
// insert t values (1, 1), (2, 2), (3, 3)
|
||||
_, err = originTable.AddRecord(ctx, types.MakeDatums(1, 1))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
_, err = originTable.AddRecord(ctx, types.MakeDatums(2, 2))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
_, err = originTable.AddRecord(ctx, types.MakeDatums(3, 3))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
tc := &TestDDLCallback{}
|
||||
// set up hook
|
||||
@ -141,7 +150,7 @@ func (s *testIndexChangeSuite) TestIndexChange(c *C) {
|
||||
}
|
||||
}
|
||||
d.SetHook(tc)
|
||||
testCreateIndex(c, ctx, d, s.dbInfo, originTable.Meta(), false, "c2", "c2")
|
||||
testCreateIndex(s.T(), ctx, d, s.dbInfo, originTable.Meta(), false, "c2", "c2")
|
||||
// We need to make sure onJobUpdated is called in the first hook.
|
||||
// After testCreateIndex(), onJobUpdated() may not be called when job.state is Sync.
|
||||
// If we skip this check, prevState may wrongly set to StatePublic.
|
||||
@ -151,10 +160,10 @@ func (s *testIndexChangeSuite) TestIndexChange(c *C) {
|
||||
}
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
c.Check(checkErr, IsNil)
|
||||
require.NoError(s.T(), checkErr)
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(txn.Commit(context.Background()), IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
require.Nil(s.T(), txn.Commit(context.Background()))
|
||||
prevState = model.StateNone
|
||||
var noneTable table.Table
|
||||
tc.onJobUpdated = func(job *model.Job) {
|
||||
@ -193,8 +202,8 @@ func (s *testIndexChangeSuite) TestIndexChange(c *C) {
|
||||
}
|
||||
}
|
||||
}
|
||||
testDropIndex(c, ctx, d, s.dbInfo, publicTable.Meta(), "c2")
|
||||
c.Check(checkErr, IsNil)
|
||||
testDropIndex(s.T(), ctx, d, s.dbInfo, publicTable.Meta(), "c2")
|
||||
require.NoError(s.T(), checkErr)
|
||||
}
|
||||
|
||||
func checkIndexExists(ctx sessionctx.Context, tbl table.Table, indexValue interface{}, handle int64, exists bool) error {
|
||||
@ -216,7 +225,7 @@ func checkIndexExists(ctx sessionctx.Context, tbl table.Table, indexValue interf
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) checkAddWriteOnly(d *ddl, ctx sessionctx.Context, delOnlyTbl, writeOnlyTbl table.Table) error {
|
||||
func (s *testIndexChangeSuiteToVerify) checkAddWriteOnly(d *ddl, ctx sessionctx.Context, delOnlyTbl, writeOnlyTbl table.Table) error {
|
||||
// DeleteOnlyTable: insert t values (4, 4);
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
@ -289,7 +298,7 @@ func (s *testIndexChangeSuite) checkAddWriteOnly(d *ddl, ctx sessionctx.Context,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) checkAddPublic(d *ddl, ctx sessionctx.Context, writeTbl, publicTbl table.Table) error {
|
||||
func (s *testIndexChangeSuiteToVerify) checkAddPublic(d *ddl, ctx sessionctx.Context, writeTbl, publicTbl table.Table) error {
|
||||
// WriteOnlyTable: insert t values (6, 6)
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
@ -363,7 +372,7 @@ func (s *testIndexChangeSuite) checkAddPublic(d *ddl, ctx sessionctx.Context, wr
|
||||
return txn.Commit(context.Background())
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) checkDropWriteOnly(d *ddl, ctx sessionctx.Context, publicTbl, writeTbl table.Table) error {
|
||||
func (s *testIndexChangeSuiteToVerify) checkDropWriteOnly(d *ddl, ctx sessionctx.Context, publicTbl, writeTbl table.Table) error {
|
||||
// WriteOnlyTable insert t values (8, 8)
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
@ -407,7 +416,7 @@ func (s *testIndexChangeSuite) checkDropWriteOnly(d *ddl, ctx sessionctx.Context
|
||||
return txn.Commit(context.Background())
|
||||
}
|
||||
|
||||
func (s *testIndexChangeSuite) checkDropDeleteOnly(d *ddl, ctx sessionctx.Context, writeTbl, delTbl table.Table) error {
|
||||
func (s *testIndexChangeSuiteToVerify) checkDropDeleteOnly(d *ddl, ctx sessionctx.Context, writeTbl, delTbl table.Table) error {
|
||||
// WriteOnlyTable insert t values (9, 9)
|
||||
err := ctx.NewTxn(context.Background())
|
||||
if err != nil {
|
||||
|
||||
@ -15,27 +15,28 @@ package ddl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/tidb/infoschema"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
"github.com/pingcap/tidb/parser/model"
|
||||
"github.com/pingcap/tidb/sessionctx"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func testPlacementPolicyInfo(c *C, d *ddl, name string, settings *model.PlacementSettings) *model.PolicyInfo {
|
||||
func testPlacementPolicyInfo(t *testing.T, d *ddl, name string, settings *model.PlacementSettings) *model.PolicyInfo {
|
||||
policy := &model.PolicyInfo{
|
||||
Name: model.NewCIStr(name),
|
||||
PlacementSettings: settings,
|
||||
}
|
||||
genIDs, err := d.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
policy.ID = genIDs[0]
|
||||
return policy
|
||||
}
|
||||
|
||||
func testCreatePlacementPolicy(c *C, ctx sessionctx.Context, d *ddl, policyInfo *model.PolicyInfo) *model.Job {
|
||||
func testCreatePlacementPolicy(t *testing.T, ctx sessionctx.Context, d *ddl, policyInfo *model.PolicyInfo) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaName: policyInfo.Name.L,
|
||||
Type: model.ActionCreatePlacementPolicy,
|
||||
@ -43,79 +44,79 @@ func testCreatePlacementPolicy(c *C, ctx sessionctx.Context, d *ddl, policyInfo
|
||||
Args: []interface{}{policyInfo},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
|
||||
v := getSchemaVer(c, ctx)
|
||||
v := getSchemaVer(t, ctx)
|
||||
policyInfo.State = model.StatePublic
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v})
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v})
|
||||
policyInfo.State = model.StateNone
|
||||
return job
|
||||
}
|
||||
|
||||
func (s *testDDLSuite) TestPlacementPolicyInUse(c *C) {
|
||||
store := testCreateStore(c, "test_placement_policy_in_use")
|
||||
func (s *testDDLSuiteToVerify) TestPlacementPolicyInUse() {
|
||||
store := testCreateStore(s.T(), "test_placement_policy_in_use")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
ctx := context.Background()
|
||||
d, err := testNewDDLAndStart(ctx, WithStore(store))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
sctx := testNewContext(d)
|
||||
|
||||
db1, err := testSchemaInfo(d, "db1")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, sctx, d, db1)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), sctx, d, db1)
|
||||
db1.State = model.StatePublic
|
||||
|
||||
db2, err := testSchemaInfo(d, "db2")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, sctx, d, db2)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), sctx, d, db2)
|
||||
db2.State = model.StatePublic
|
||||
|
||||
policySettings := &model.PlacementSettings{PrimaryRegion: "r1", Regions: "r1,r2"}
|
||||
p1 := testPlacementPolicyInfo(c, d, "p1", policySettings)
|
||||
p2 := testPlacementPolicyInfo(c, d, "p2", policySettings)
|
||||
p3 := testPlacementPolicyInfo(c, d, "p3", policySettings)
|
||||
p4 := testPlacementPolicyInfo(c, d, "p4", policySettings)
|
||||
p5 := testPlacementPolicyInfo(c, d, "p5", policySettings)
|
||||
testCreatePlacementPolicy(c, sctx, d, p1)
|
||||
testCreatePlacementPolicy(c, sctx, d, p2)
|
||||
testCreatePlacementPolicy(c, sctx, d, p3)
|
||||
testCreatePlacementPolicy(c, sctx, d, p4)
|
||||
testCreatePlacementPolicy(c, sctx, d, p5)
|
||||
p1 := testPlacementPolicyInfo(s.T(), d, "p1", policySettings)
|
||||
p2 := testPlacementPolicyInfo(s.T(), d, "p2", policySettings)
|
||||
p3 := testPlacementPolicyInfo(s.T(), d, "p3", policySettings)
|
||||
p4 := testPlacementPolicyInfo(s.T(), d, "p4", policySettings)
|
||||
p5 := testPlacementPolicyInfo(s.T(), d, "p5", policySettings)
|
||||
testCreatePlacementPolicy(s.T(), sctx, d, p1)
|
||||
testCreatePlacementPolicy(s.T(), sctx, d, p2)
|
||||
testCreatePlacementPolicy(s.T(), sctx, d, p3)
|
||||
testCreatePlacementPolicy(s.T(), sctx, d, p4)
|
||||
testCreatePlacementPolicy(s.T(), sctx, d, p5)
|
||||
|
||||
t1, err := testTableInfo(d, "t1", 1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
t1.PlacementPolicyRef = &model.PolicyRefInfo{ID: p1.ID, Name: p1.Name}
|
||||
testCreateTable(c, sctx, d, db1, t1)
|
||||
testCreateTable(s.T(), sctx, d, db1, t1)
|
||||
t1.State = model.StatePublic
|
||||
db1.Tables = append(db1.Tables, t1)
|
||||
|
||||
t2, err := testTableInfo(d, "t2", 1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
t2.PlacementPolicyRef = &model.PolicyRefInfo{ID: p1.ID, Name: p1.Name}
|
||||
testCreateTable(c, sctx, d, db2, t2)
|
||||
testCreateTable(s.T(), sctx, d, db2, t2)
|
||||
t2.State = model.StatePublic
|
||||
db2.Tables = append(db2.Tables, t2)
|
||||
|
||||
t3, err := testTableInfo(d, "t3", 1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
t3.PlacementPolicyRef = &model.PolicyRefInfo{ID: p2.ID, Name: p2.Name}
|
||||
testCreateTable(c, sctx, d, db1, t3)
|
||||
testCreateTable(s.T(), sctx, d, db1, t3)
|
||||
t3.State = model.StatePublic
|
||||
db1.Tables = append(db1.Tables, t3)
|
||||
|
||||
dbP, err := testSchemaInfo(d, "db_p")
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
dbP.PlacementPolicyRef = &model.PolicyRefInfo{ID: p4.ID, Name: p4.Name}
|
||||
dbP.State = model.StatePublic
|
||||
testCreateSchema(c, sctx, d, dbP)
|
||||
testCreateSchema(s.T(), sctx, d, dbP)
|
||||
|
||||
t4 := testTableInfoWithPartition(c, d, "t4", 1)
|
||||
t4 := testTableInfoWithPartition(s.T(), d, "t4", 1)
|
||||
t4.Partition.Definitions[0].PlacementPolicyRef = &model.PolicyRefInfo{ID: p5.ID, Name: p5.Name}
|
||||
testCreateTable(c, sctx, d, db1, t4)
|
||||
testCreateTable(s.T(), sctx, d, db1, t4)
|
||||
t4.State = model.StatePublic
|
||||
db1.Tables = append(db1.Tables, t4)
|
||||
|
||||
@ -125,22 +126,22 @@ func (s *testDDLSuite) TestPlacementPolicyInUse(c *C) {
|
||||
[]*model.PolicyInfo{p1, p2, p3, p4, p5},
|
||||
1,
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
is := builder.Build()
|
||||
|
||||
for _, policy := range []*model.PolicyInfo{p1, p2, p4, p5} {
|
||||
c.Assert(ErrPlacementPolicyInUse.Equal(checkPlacementPolicyNotInUseFromInfoSchema(is, policy)), IsTrue)
|
||||
c.Assert(kv.RunInNewTxn(ctx, sctx.GetStore(), false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
require.True(s.T(), ErrPlacementPolicyInUse.Equal(checkPlacementPolicyNotInUseFromInfoSchema(is, policy)))
|
||||
require.Nil(s.T(), kv.RunInNewTxn(ctx, sctx.GetStore(), false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
m := meta.NewMeta(txn)
|
||||
c.Assert(ErrPlacementPolicyInUse.Equal(checkPlacementPolicyNotInUseFromMeta(m, policy)), IsTrue)
|
||||
require.True(s.T(), ErrPlacementPolicyInUse.Equal(checkPlacementPolicyNotInUseFromMeta(m, policy)))
|
||||
return nil
|
||||
}), IsNil)
|
||||
}))
|
||||
}
|
||||
|
||||
c.Assert(checkPlacementPolicyNotInUseFromInfoSchema(is, p3), IsNil)
|
||||
c.Assert(kv.RunInNewTxn(ctx, sctx.GetStore(), false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
require.Nil(s.T(), checkPlacementPolicyNotInUseFromInfoSchema(is, p3))
|
||||
require.Nil(s.T(), kv.RunInNewTxn(ctx, sctx.GetStore(), false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
m := meta.NewMeta(txn)
|
||||
c.Assert(checkPlacementPolicyNotInUseFromMeta(m, p3), IsNil)
|
||||
require.Nil(s.T(), checkPlacementPolicyNotInUseFromMeta(m, p3))
|
||||
return nil
|
||||
}), IsNil)
|
||||
}))
|
||||
}
|
||||
|
||||
@ -18,12 +18,12 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
"github.com/pingcap/tidb/parser/model"
|
||||
"github.com/pingcap/tidb/table/tables"
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type testCtxKeyType int
|
||||
@ -34,11 +34,11 @@ func (k testCtxKeyType) String() string {
|
||||
|
||||
const testCtxKey testCtxKeyType = 0
|
||||
|
||||
func (s *testDDLSuite) TestReorg(c *C) {
|
||||
store := testCreateStore(c, "test_reorg")
|
||||
func (s *testDDLSuiteToVerify) TestReorg() {
|
||||
store := testCreateStore(s.T(), "test_reorg")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
d, err := testNewDDLAndStart(
|
||||
@ -46,10 +46,10 @@ func (s *testDDLSuite) TestReorg(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
time.Sleep(testLease)
|
||||
@ -57,26 +57,26 @@ func (s *testDDLSuite) TestReorg(c *C) {
|
||||
ctx := testNewContext(d)
|
||||
|
||||
ctx.SetValue(testCtxKey, 1)
|
||||
c.Assert(ctx.Value(testCtxKey), Equals, 1)
|
||||
require.Equal(s.T(), ctx.Value(testCtxKey), 1)
|
||||
ctx.ClearValue(testCtxKey)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Set([]byte("a"), []byte("b"))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Rollback()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Set([]byte("a"), []byte("b"))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
rowCount := int64(10)
|
||||
handle := s.NewHandle().Int(100).Common("a", 100, "string")
|
||||
@ -91,9 +91,9 @@ func (s *testDDLSuite) TestReorg(c *C) {
|
||||
SnapshotVer: 1, // Make sure it is not zero. So the reorgInfo's first is false.
|
||||
}
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
m := meta.NewMeta(txn)
|
||||
e := &meta.Element{ID: 333, TypeKey: meta.IndexElementKey}
|
||||
rInfo := &reorgInfo{
|
||||
@ -102,33 +102,33 @@ func (s *testDDLSuite) TestReorg(c *C) {
|
||||
}
|
||||
mockTbl := tables.MockTableFromMeta(&model.TableInfo{IsCommonHandle: s.IsCommonHandle, CommonHandleVersion: 1})
|
||||
err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, f)
|
||||
c.Assert(err, NotNil)
|
||||
require.Error(s.T(), err)
|
||||
|
||||
// The longest to wait for 5 seconds to make sure the function of f is returned.
|
||||
for i := 0; i < 1000; i++ {
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, f)
|
||||
if err == nil {
|
||||
c.Assert(job.RowCount, Equals, rowCount)
|
||||
c.Assert(d.generalWorker().reorgCtx.rowCount, Equals, int64(0))
|
||||
require.Equal(s.T(), job.RowCount, rowCount)
|
||||
require.Equal(s.T(), d.generalWorker().reorgCtx.rowCount, int64(0))
|
||||
|
||||
// Test whether reorgInfo's Handle is update.
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = ctx.NewTxn(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
m = meta.NewMeta(txn)
|
||||
info, err1 := getReorgInfo(d.ddlCtx, m, job, mockTbl, nil)
|
||||
c.Assert(err1, IsNil)
|
||||
c.Assert(info.StartKey, DeepEquals, kv.Key(handle.Encoded()))
|
||||
c.Assert(info.currElement, DeepEquals, e)
|
||||
require.NoError(s.T(), err1)
|
||||
require.Equal(s.T(), info.StartKey, kv.Key(handle.Encoded()))
|
||||
require.Equal(s.T(), info.currElement, e)
|
||||
_, doneHandle, _ := d.generalWorker().reorgCtx.getRowCountAndKey()
|
||||
c.Assert(doneHandle, IsNil)
|
||||
require.Nil(s.T(), doneHandle)
|
||||
break
|
||||
}
|
||||
}
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
job = &model.Job{
|
||||
ID: 2,
|
||||
@ -151,45 +151,45 @@ func (s *testDDLSuite) TestReorg(c *C) {
|
||||
t := meta.NewMeta(txn)
|
||||
var err1 error
|
||||
_, err1 = getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element})
|
||||
c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err1), IsTrue)
|
||||
c.Assert(job.SnapshotVer, Equals, uint64(0))
|
||||
require.True(s.T(), meta.ErrDDLReorgElementNotExist.Equal(err1))
|
||||
require.Equal(s.T(), job.SnapshotVer, uint64(0))
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
job.SnapshotVer = uint64(1)
|
||||
err = info.UpdateReorgMeta(info.StartKey)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
t := meta.NewMeta(txn)
|
||||
info1, err1 := getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element})
|
||||
c.Assert(err1, IsNil)
|
||||
c.Assert(info1.currElement, DeepEquals, info.currElement)
|
||||
c.Assert(info1.StartKey, DeepEquals, info.StartKey)
|
||||
c.Assert(info1.EndKey, DeepEquals, info.EndKey)
|
||||
c.Assert(info1.PhysicalTableID, Equals, info.PhysicalTableID)
|
||||
require.NoError(s.T(), err1)
|
||||
require.Equal(s.T(), info1.currElement, info.currElement)
|
||||
require.Equal(s.T(), info1.StartKey, info.StartKey)
|
||||
require.Equal(s.T(), info1.EndKey, info.EndKey)
|
||||
require.Equal(s.T(), info1.PhysicalTableID, info.PhysicalTableID)
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, func() error {
|
||||
time.Sleep(4 * testLease)
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, NotNil)
|
||||
require.Error(s.T(), err)
|
||||
txn, err = ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
s.RerunWithCommonHandleEnabled(c, s.TestReorg)
|
||||
require.NoError(s.T(), err)
|
||||
s.RerunWithCommonHandleEnabledWithoutCheck(s.TestReorg)
|
||||
}
|
||||
|
||||
func (s *testDDLSuite) TestReorgOwner(c *C) {
|
||||
store := testCreateStore(c, "test_reorg_owner")
|
||||
func (s *testDDLSuiteToVerify) TestReorgOwner() {
|
||||
store := testCreateStore(s.T(), "test_reorg_owner")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
d1, err := testNewDDLAndStart(
|
||||
@ -197,65 +197,65 @@ func (s *testDDLSuite) TestReorgOwner(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d1.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
ctx := testNewContext(d1)
|
||||
|
||||
testCheckOwner(c, d1, true)
|
||||
testCheckOwner(s.T(), d1, true)
|
||||
|
||||
d2, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d2.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
dbInfo, err := testSchemaInfo(d1, "test_reorg")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, ctx, d1, dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), ctx, d1, dbInfo)
|
||||
|
||||
tblInfo, err := testTableInfo(d1, "t", 3)
|
||||
c.Assert(err, IsNil)
|
||||
testCreateTable(c, ctx, d1, dbInfo, tblInfo)
|
||||
t := testGetTable(c, d1, dbInfo.ID, tblInfo.ID)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateTable(s.T(), ctx, d1, dbInfo, tblInfo)
|
||||
t := testGetTable(s.T(), d1, dbInfo.ID, tblInfo.ID)
|
||||
|
||||
num := 10
|
||||
for i := 0; i < num; i++ {
|
||||
_, err := t.AddRecord(ctx, types.MakeDatums(i, i, i))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
tc := &TestDDLCallback{}
|
||||
tc.onJobRunBefore = func(job *model.Job) {
|
||||
if job.SchemaState == model.StateDeleteReorganization {
|
||||
err = d1.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
}
|
||||
|
||||
d1.SetHook(tc)
|
||||
|
||||
testDropSchema(c, ctx, d1, dbInfo)
|
||||
testDropSchema(s.T(), ctx, d1, dbInfo)
|
||||
|
||||
err = kv.RunInNewTxn(context.Background(), d1.store, false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
t := meta.NewMeta(txn)
|
||||
db, err1 := t.GetDatabase(dbInfo.ID)
|
||||
c.Assert(err1, IsNil)
|
||||
c.Assert(db, IsNil)
|
||||
require.NoError(s.T(), err1)
|
||||
require.Nil(s.T(), db)
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
@ -19,13 +19,16 @@ package ddl
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/tidb/domain/infosync"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/parser/model"
|
||||
"github.com/pingcap/tidb/parser/terror"
|
||||
"github.com/pingcap/tidb/util/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
// this test file include some test that will cause data race, mainly because restartWorkers modify d.ctx
|
||||
@ -54,7 +57,7 @@ func (d *ddl) restartWorkers(ctx context.Context) {
|
||||
}
|
||||
|
||||
// runInterruptedJob should be called concurrently with restartWorkers
|
||||
func runInterruptedJob(c *C, d *ddl, job *model.Job, doneCh chan error) {
|
||||
func runInterruptedJob(d *ddl, job *model.Job, doneCh chan error) {
|
||||
ctx := mock.NewContext()
|
||||
ctx.Store = d.store
|
||||
|
||||
@ -83,9 +86,9 @@ func runInterruptedJob(c *C, d *ddl, job *model.Job, doneCh chan error) {
|
||||
doneCh <- err
|
||||
}
|
||||
|
||||
func testRunInterruptedJob(c *C, d *ddl, job *model.Job) {
|
||||
func testRunInterruptedJob(t *testing.T, d *ddl, job *model.Job) {
|
||||
done := make(chan error, 1)
|
||||
go runInterruptedJob(c, d, job, done)
|
||||
go runInterruptedJob(d, job, done)
|
||||
|
||||
ticker := time.NewTicker(d.lease * 1)
|
||||
defer ticker.Stop()
|
||||
@ -94,21 +97,21 @@ LOOP:
|
||||
select {
|
||||
case <-ticker.C:
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.Nil(t, err)
|
||||
d.restartWorkers(context.Background())
|
||||
time.Sleep(time.Millisecond * 20)
|
||||
case err := <-done:
|
||||
c.Assert(err, IsNil)
|
||||
require.Nil(t, err)
|
||||
break LOOP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *testSchemaSuite) TestSchemaResume(c *C) {
|
||||
store := testCreateStore(c, "test_schema_resume")
|
||||
func TestSchemaResume(t *testing.T) {
|
||||
store := testCreateStore(t, "test_schema_resume")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
d1, err := testNewDDLAndStart(
|
||||
@ -116,39 +119,39 @@ func (s *testSchemaSuite) TestSchemaResume(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := d1.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
testCheckOwner(c, d1, true)
|
||||
testCheckOwner(t, d1, true)
|
||||
|
||||
dbInfo, err := testSchemaInfo(d1, "test_restart")
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
Type: model.ActionCreateSchema,
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
Args: []interface{}{dbInfo},
|
||||
}
|
||||
testRunInterruptedJob(c, d1, job)
|
||||
testCheckSchemaState(c, d1, dbInfo, model.StatePublic)
|
||||
testRunInterruptedJob(t, d1, job)
|
||||
testCheckSchemaState(t, d1, dbInfo, model.StatePublic)
|
||||
|
||||
job = &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
Type: model.ActionDropSchema,
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
testRunInterruptedJob(c, d1, job)
|
||||
testCheckSchemaState(c, d1, dbInfo, model.StateNone)
|
||||
testRunInterruptedJob(t, d1, job)
|
||||
testCheckSchemaState(t, d1, dbInfo, model.StateNone)
|
||||
}
|
||||
|
||||
func (s *testStatSuite) TestStat(c *C) {
|
||||
store := testCreateStore(c, "test_stat")
|
||||
func (s *testStatSuiteToVerify) TestStat() {
|
||||
store := testCreateStore(s.T(), "test_stat")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
d, err := testNewDDLAndStart(
|
||||
@ -156,15 +159,15 @@ func (s *testStatSuite) TestStat(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
dbInfo, err := testSchemaInfo(d, "test_restart")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(d), d, dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(d), d, dbInfo)
|
||||
|
||||
// TODO: Get this information from etcd.
|
||||
// m, err := d.Stats(nil)
|
||||
@ -179,68 +182,74 @@ func (s *testStatSuite) TestStat(c *C) {
|
||||
}
|
||||
|
||||
done := make(chan error, 1)
|
||||
go runInterruptedJob(c, d, job, done)
|
||||
go runInterruptedJob(d, job, done)
|
||||
|
||||
ticker := time.NewTicker(d.lease * 1)
|
||||
defer ticker.Stop()
|
||||
ver := s.getDDLSchemaVer(c, d)
|
||||
ver := s.getDDLSchemaVer(d)
|
||||
LOOP:
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(s.getDDLSchemaVer(c, d), GreaterEqual, ver)
|
||||
require.Nil(s.T(), err)
|
||||
require.GreaterOrEqual(s.T(), s.getDDLSchemaVer(d), ver)
|
||||
d.restartWorkers(context.Background())
|
||||
time.Sleep(time.Millisecond * 20)
|
||||
case err := <-done:
|
||||
// TODO: Get this information from etcd.
|
||||
// m, err := d.Stats(nil)
|
||||
c.Assert(err, IsNil)
|
||||
require.Nil(s.T(), err)
|
||||
break LOOP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var _ = Suite(&testTableSuite{})
|
||||
|
||||
type testTableSuite struct {
|
||||
type testTableSuiteToVerify struct {
|
||||
suite.Suite
|
||||
store kv.Storage
|
||||
dbInfo *model.DBInfo
|
||||
|
||||
d *ddl
|
||||
}
|
||||
|
||||
func (s *testTableSuite) SetUpSuite(c *C) {
|
||||
s.store = testCreateStore(c, "test_table")
|
||||
func TestTableSuite(t *testing.T) {
|
||||
_, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
suite.Run(t, new(testTableSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testTableSuiteToVerify) SetupSuite() {
|
||||
s.store = testCreateStore(s.T(), "test_table")
|
||||
ddl, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(s.store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
s.d = ddl
|
||||
|
||||
s.dbInfo, err = testSchemaInfo(s.d, "test_table")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(s.d), s.d, s.dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(s.d), s.d, s.dbInfo)
|
||||
}
|
||||
|
||||
func (s *testTableSuite) TearDownSuite(c *C) {
|
||||
testDropSchema(c, testNewContext(s.d), s.d, s.dbInfo)
|
||||
func (s *testTableSuiteToVerify) TearDownSuite() {
|
||||
testDropSchema(s.T(), testNewContext(s.d), s.d, s.dbInfo)
|
||||
err := s.d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = s.store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}
|
||||
|
||||
func (s *testTableSuite) TestTableResume(c *C) {
|
||||
func (s *testTableSuiteToVerify) TestTableResume() {
|
||||
d := s.d
|
||||
|
||||
testCheckOwner(c, d, true)
|
||||
testCheckOwner(s.T(), d, true)
|
||||
|
||||
tblInfo, err := testTableInfo(d, "t1", 3)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
job := &model.Job{
|
||||
SchemaID: s.dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -248,8 +257,8 @@ func (s *testTableSuite) TestTableResume(c *C) {
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
Args: []interface{}{tblInfo},
|
||||
}
|
||||
testRunInterruptedJob(c, d, job)
|
||||
testCheckTableState(c, d, s.dbInfo, tblInfo, model.StatePublic)
|
||||
testRunInterruptedJob(s.T(), d, job)
|
||||
testCheckTableState(s.T(), d, s.dbInfo, tblInfo, model.StatePublic)
|
||||
|
||||
job = &model.Job{
|
||||
SchemaID: s.dbInfo.ID,
|
||||
@ -257,6 +266,6 @@ func (s *testTableSuite) TestTableResume(c *C) {
|
||||
Type: model.ActionDropTable,
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
testRunInterruptedJob(c, d, job)
|
||||
testCheckTableState(c, d, s.dbInfo, tblInfo, model.StateNone)
|
||||
testRunInterruptedJob(s.T(), d, job)
|
||||
testCheckTableState(s.T(), d, s.dbInfo, tblInfo, model.StateNone)
|
||||
}
|
||||
|
||||
@ -19,7 +19,6 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/tidb/infoschema"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
@ -31,16 +30,6 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
var _ = Suite(&testSchemaSuite{})
|
||||
|
||||
type testSchemaSuite struct{}
|
||||
|
||||
func (s *testSchemaSuite) SetUpSuite(c *C) {
|
||||
}
|
||||
|
||||
func (s *testSchemaSuite) TearDownSuite(c *C) {
|
||||
}
|
||||
|
||||
func testSchemaInfo(d *ddl, name string) (*model.DBInfo, error) {
|
||||
dbInfo := &model.DBInfo{
|
||||
Name: model.NewCIStr(name),
|
||||
@ -53,7 +42,7 @@ func testSchemaInfo(d *ddl, name string) (*model.DBInfo, error) {
|
||||
return dbInfo, nil
|
||||
}
|
||||
|
||||
func testCreateSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) *model.Job {
|
||||
func testCreateSchema(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
Type: model.ActionCreateSchema,
|
||||
@ -61,11 +50,11 @@ func testCreateSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo
|
||||
Args: []interface{}{dbInfo},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
|
||||
v := getSchemaVer(c, ctx)
|
||||
v := getSchemaVer(t, ctx)
|
||||
dbInfo.State = model.StatePublic
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo})
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo})
|
||||
dbInfo.State = model.StateNone
|
||||
return job
|
||||
}
|
||||
@ -95,11 +84,11 @@ func buildDropSchemaJob(dbInfo *model.DBInfo) *model.Job {
|
||||
}
|
||||
}
|
||||
|
||||
func testDropSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) (*model.Job, int64) {
|
||||
func testDropSchema(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) (*model.Job, int64) {
|
||||
job := buildDropSchemaJob(dbInfo)
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
ver := getSchemaVer(c, ctx)
|
||||
require.NoError(t, err)
|
||||
ver := getSchemaVer(t, ctx)
|
||||
return job, ver
|
||||
}
|
||||
|
||||
@ -111,9 +100,9 @@ func testDropSchemaT(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model
|
||||
return job, ver
|
||||
}
|
||||
|
||||
func isDDLJobDone(c *C, t *meta.Meta) bool {
|
||||
func isDDLJobDone(test *testing.T, t *meta.Meta) bool {
|
||||
job, err := t.GetDDLJobByIdx(0)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(test, err)
|
||||
if job == nil {
|
||||
return true
|
||||
}
|
||||
@ -122,29 +111,29 @@ func isDDLJobDone(c *C, t *meta.Meta) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func testCheckSchemaState(c *C, d *ddl, dbInfo *model.DBInfo, state model.SchemaState) {
|
||||
func testCheckSchemaState(test *testing.T, d *ddl, dbInfo *model.DBInfo, state model.SchemaState) {
|
||||
isDropped := true
|
||||
|
||||
for {
|
||||
err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
t := meta.NewMeta(txn)
|
||||
info, err := t.GetDatabase(dbInfo.ID)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(test, err)
|
||||
|
||||
if state == model.StateNone {
|
||||
isDropped = isDDLJobDone(c, t)
|
||||
isDropped = isDDLJobDone(test, t)
|
||||
if !isDropped {
|
||||
return nil
|
||||
}
|
||||
c.Assert(info, IsNil)
|
||||
require.Nil(test, info)
|
||||
return nil
|
||||
}
|
||||
|
||||
c.Assert(info.Name, DeepEquals, dbInfo.Name)
|
||||
c.Assert(info.State, Equals, state)
|
||||
require.Equal(test, info.Name, dbInfo.Name)
|
||||
require.Equal(test, info.State, state)
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(test, err)
|
||||
|
||||
if isDropped {
|
||||
break
|
||||
@ -152,60 +141,60 @@ func testCheckSchemaState(c *C, d *ddl, dbInfo *model.DBInfo, state model.Schema
|
||||
}
|
||||
}
|
||||
|
||||
func (s *testSchemaSuite) TestSchema(c *C) {
|
||||
store := testCreateStore(c, "test_schema")
|
||||
func TestSchema(t *testing.T) {
|
||||
store := testCreateStore(t, "test_schema")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
d, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
ctx := testNewContext(d)
|
||||
dbInfo, err := testSchemaInfo(d, "test_schema")
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
|
||||
// create a database.
|
||||
job := testCreateSchema(c, ctx, d, dbInfo)
|
||||
testCheckSchemaState(c, d, dbInfo, model.StatePublic)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job := testCreateSchema(t, ctx, d, dbInfo)
|
||||
testCheckSchemaState(t, d, dbInfo, model.StatePublic)
|
||||
testCheckJobDone(t, d, job, true)
|
||||
|
||||
/*** to drop the schema with two tables. ***/
|
||||
// create table t with 100 records.
|
||||
tblInfo1, err := testTableInfo(d, "t", 3)
|
||||
c.Assert(err, IsNil)
|
||||
tJob1 := testCreateTable(c, ctx, d, dbInfo, tblInfo1)
|
||||
testCheckTableState(c, d, dbInfo, tblInfo1, model.StatePublic)
|
||||
testCheckJobDone(c, d, tJob1, true)
|
||||
tbl1 := testGetTable(c, d, dbInfo.ID, tblInfo1.ID)
|
||||
require.NoError(t, err)
|
||||
tJob1 := testCreateTable(t, ctx, d, dbInfo, tblInfo1)
|
||||
testCheckTableState(t, d, dbInfo, tblInfo1, model.StatePublic)
|
||||
testCheckJobDone(t, d, tJob1, true)
|
||||
tbl1 := testGetTable(t, d, dbInfo.ID, tblInfo1.ID)
|
||||
for i := 1; i <= 100; i++ {
|
||||
_, err := tbl1.AddRecord(ctx, types.MakeDatums(i, i, i))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
// create table t1 with 1034 records.
|
||||
tblInfo2, err := testTableInfo(d, "t1", 3)
|
||||
c.Assert(err, IsNil)
|
||||
tJob2 := testCreateTable(c, ctx, d, dbInfo, tblInfo2)
|
||||
testCheckTableState(c, d, dbInfo, tblInfo2, model.StatePublic)
|
||||
testCheckJobDone(c, d, tJob2, true)
|
||||
tbl2 := testGetTable(c, d, dbInfo.ID, tblInfo2.ID)
|
||||
require.NoError(t, err)
|
||||
tJob2 := testCreateTable(t, ctx, d, dbInfo, tblInfo2)
|
||||
testCheckTableState(t, d, dbInfo, tblInfo2, model.StatePublic)
|
||||
testCheckJobDone(t, d, tJob2, true)
|
||||
tbl2 := testGetTable(t, d, dbInfo.ID, tblInfo2.ID)
|
||||
for i := 1; i <= 1034; i++ {
|
||||
_, err := tbl2.AddRecord(ctx, types.MakeDatums(i, i, i))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
job, v := testDropSchema(c, ctx, d, dbInfo)
|
||||
testCheckSchemaState(c, d, dbInfo, model.StateNone)
|
||||
job, v := testDropSchema(t, ctx, d, dbInfo)
|
||||
testCheckSchemaState(t, d, dbInfo, model.StateNone)
|
||||
ids := make(map[int64]struct{})
|
||||
ids[tblInfo1.ID] = struct{}{}
|
||||
ids[tblInfo2.ID] = struct{}{}
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo, tblIDs: ids})
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo, tblIDs: ids})
|
||||
|
||||
// Drop a non-existent database.
|
||||
job = &model.Job{
|
||||
@ -214,24 +203,24 @@ func (s *testSchemaSuite) TestSchema(c *C) {
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
err = d.doDDLJob(ctx, job)
|
||||
c.Assert(terror.ErrorEqual(err, infoschema.ErrDatabaseDropExists), IsTrue, Commentf("err %v", err))
|
||||
require.True(t, terror.ErrorEqual(err, infoschema.ErrDatabaseDropExists), "err %v", err)
|
||||
|
||||
// Drop a database without a table.
|
||||
dbInfo1, err := testSchemaInfo(d, "test1")
|
||||
c.Assert(err, IsNil)
|
||||
job = testCreateSchema(c, ctx, d, dbInfo1)
|
||||
testCheckSchemaState(c, d, dbInfo1, model.StatePublic)
|
||||
testCheckJobDone(c, d, job, true)
|
||||
job, _ = testDropSchema(c, ctx, d, dbInfo1)
|
||||
testCheckSchemaState(c, d, dbInfo1, model.StateNone)
|
||||
testCheckJobDone(c, d, job, false)
|
||||
require.NoError(t, err)
|
||||
job = testCreateSchema(t, ctx, d, dbInfo1)
|
||||
testCheckSchemaState(t, d, dbInfo1, model.StatePublic)
|
||||
testCheckJobDone(t, d, job, true)
|
||||
job, _ = testDropSchema(t, ctx, d, dbInfo1)
|
||||
testCheckSchemaState(t, d, dbInfo1, model.StateNone)
|
||||
testCheckJobDone(t, d, job, false)
|
||||
}
|
||||
|
||||
func (s *testSchemaSuite) TestSchemaWaitJob(c *C) {
|
||||
store := testCreateStore(c, "test_schema_wait")
|
||||
func TestSchemaWaitJob(t *testing.T) {
|
||||
store := testCreateStore(t, "test_schema_wait")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
d1, err := testNewDDLAndStart(
|
||||
@ -239,23 +228,23 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := d1.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
testCheckOwner(c, d1, true)
|
||||
testCheckOwner(t, d1, true)
|
||||
|
||||
d2, err := testNewDDLAndStart(
|
||||
context.Background(),
|
||||
WithStore(store),
|
||||
WithLease(testLease*4),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := d2.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
ctx := testNewContext(d2)
|
||||
|
||||
@ -263,17 +252,17 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) {
|
||||
d2.ownerManager.RetireOwner()
|
||||
|
||||
dbInfo, err := testSchemaInfo(d2, "test_schema")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, ctx, d2, dbInfo)
|
||||
testCheckSchemaState(c, d2, dbInfo, model.StatePublic)
|
||||
require.NoError(t, err)
|
||||
testCreateSchema(t, ctx, d2, dbInfo)
|
||||
testCheckSchemaState(t, d2, dbInfo, model.StatePublic)
|
||||
|
||||
// d2 must not be owner.
|
||||
c.Assert(d2.ownerManager.IsOwner(), IsFalse)
|
||||
require.False(t, d2.ownerManager.IsOwner())
|
||||
|
||||
genIDs, err := d2.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
schemaID := genIDs[0]
|
||||
doDDLJobErr(c, schemaID, 0, model.ActionCreateSchema, []interface{}{dbInfo}, ctx, d2)
|
||||
doDDLJobErr(t, schemaID, 0, model.ActionCreateSchema, []interface{}{dbInfo}, ctx, d2)
|
||||
}
|
||||
|
||||
func testGetSchemaInfoWithError(d *ddl, schemaID int64) (*model.DBInfo, error) {
|
||||
|
||||
@ -16,39 +16,48 @@ package ddl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/failpoint"
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
var _ = Suite(&testStatSuite{})
|
||||
var _ = SerialSuites(&testSerialStatSuite{})
|
||||
|
||||
type testStatSuite struct {
|
||||
type testStatSuiteToVerify struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func (s *testStatSuite) SetUpSuite(c *C) {
|
||||
func TestStatSuite(t *testing.T) {
|
||||
suite.Run(t, new(testStatSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testStatSuite) TearDownSuite(c *C) {
|
||||
func (s *testStatSuiteToVerify) SetupSuite() {
|
||||
}
|
||||
|
||||
type testSerialStatSuite struct {
|
||||
func (s *testStatSuiteToVerify) TearDownSuite() {
|
||||
}
|
||||
|
||||
func (s *testStatSuite) getDDLSchemaVer(c *C, d *ddl) int64 {
|
||||
type testSerialStatSuiteToVerify struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestSerialStatSuite(t *testing.T) {
|
||||
suite.Run(t, new(testSerialStatSuiteToVerify))
|
||||
}
|
||||
|
||||
func (s *testStatSuiteToVerify) getDDLSchemaVer(d *ddl) int64 {
|
||||
m, err := d.Stats(nil)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
v := m[ddlSchemaVersion]
|
||||
return v.(int64)
|
||||
}
|
||||
|
||||
func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) {
|
||||
store := testCreateStore(c, "test_stat")
|
||||
func (s *testSerialStatSuiteToVerify) TestDDLStatsInfo() {
|
||||
store := testCreateStore(s.T(), "test_stat")
|
||||
defer func() {
|
||||
err := store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
d, err := testNewDDLAndStart(
|
||||
@ -56,38 +65,38 @@ func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) {
|
||||
WithStore(store),
|
||||
WithLease(testLease),
|
||||
)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
defer func() {
|
||||
err := d.Stop()
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
}()
|
||||
|
||||
dbInfo, err := testSchemaInfo(d, "test_stat")
|
||||
c.Assert(err, IsNil)
|
||||
testCreateSchema(c, testNewContext(d), d, dbInfo)
|
||||
require.NoError(s.T(), err)
|
||||
testCreateSchema(s.T(), testNewContext(d), d, dbInfo)
|
||||
tblInfo, err := testTableInfo(d, "t", 2)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
ctx := testNewContext(d)
|
||||
testCreateTable(c, ctx, d, dbInfo, tblInfo)
|
||||
testCreateTable(s.T(), ctx, d, dbInfo, tblInfo)
|
||||
|
||||
t := testGetTable(c, d, dbInfo.ID, tblInfo.ID)
|
||||
t := testGetTable(s.T(), d, dbInfo.ID, tblInfo.ID)
|
||||
// insert t values (1, 1), (2, 2), (3, 3)
|
||||
_, err = t.AddRecord(ctx, types.MakeDatums(1, 1))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
_, err = t.AddRecord(ctx, types.MakeDatums(2, 2))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
_, err = t.AddRecord(ctx, types.MakeDatums(3, 3))
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
txn, err := ctx.Txn(true)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
err = txn.Commit(context.Background())
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
job := buildCreateIdxJob(dbInfo, tblInfo, true, "idx", "c1")
|
||||
|
||||
c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum", `return(true)`), IsNil)
|
||||
require.Nil(s.T(), failpoint.Enable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum", `return(true)`))
|
||||
defer func() {
|
||||
c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum"), IsNil)
|
||||
require.Nil(s.T(), failpoint.Disable("github.com/pingcap/tidb/ddl/checkBackfillWorkerNum"))
|
||||
}()
|
||||
|
||||
done := make(chan error, 1)
|
||||
@ -99,12 +108,12 @@ func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) {
|
||||
for !exit {
|
||||
select {
|
||||
case err := <-done:
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(s.T(), err)
|
||||
exit = true
|
||||
case <-TestCheckWorkerNumCh:
|
||||
varMap, err := d.Stats(nil)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(varMap[ddlJobReorgHandle], Equals, "1")
|
||||
require.NoError(s.T(), err)
|
||||
require.Equal(s.T(), varMap[ddlJobReorgHandle], "1")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,8 +18,8 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
"github.com/pingcap/tidb/parser/auth"
|
||||
@ -28,11 +28,12 @@ import (
|
||||
"github.com/pingcap/tidb/sessionctx"
|
||||
"github.com/pingcap/tidb/table"
|
||||
"github.com/pingcap/tidb/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func testTableInfoWith2IndexOnFirstColumn(c *C, d *ddl, name string, num int) *model.TableInfo {
|
||||
func testTableInfoWith2IndexOnFirstColumn(t *testing.T, d *ddl, name string, num int) *model.TableInfo {
|
||||
normalInfo, err := testTableInfo(d, name, num)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
idxs := make([]*model.IndexInfo, 0, 2)
|
||||
for i := range idxs {
|
||||
idx := &model.IndexInfo{
|
||||
@ -79,11 +80,11 @@ func testTableInfo(d *ddl, name string, num int) (*model.TableInfo, error) {
|
||||
}
|
||||
|
||||
// testTableInfoWithPartition creates a test table with num int columns and with no index.
|
||||
func testTableInfoWithPartition(c *C, d *ddl, name string, num int) *model.TableInfo {
|
||||
func testTableInfoWithPartition(t *testing.T, d *ddl, name string, num int) *model.TableInfo {
|
||||
tblInfo, err := testTableInfo(d, name, num)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
genIDs, err := d.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
pid := genIDs[0]
|
||||
tblInfo.Partition = &model.PartitionInfo{
|
||||
Type: model.PartitionTypeRange,
|
||||
@ -100,15 +101,15 @@ func testTableInfoWithPartition(c *C, d *ddl, name string, num int) *model.Table
|
||||
}
|
||||
|
||||
// testTableInfoWithPartitionLessThan creates a test table with num int columns and one partition specified with lessthan.
|
||||
func testTableInfoWithPartitionLessThan(c *C, d *ddl, name string, num int, lessthan string) *model.TableInfo {
|
||||
tblInfo := testTableInfoWithPartition(c, d, name, num)
|
||||
func testTableInfoWithPartitionLessThan(t *testing.T, d *ddl, name string, num int, lessthan string) *model.TableInfo {
|
||||
tblInfo := testTableInfoWithPartition(t, d, name, num)
|
||||
tblInfo.Partition.Definitions[0].LessThan = []string{lessthan}
|
||||
return tblInfo
|
||||
}
|
||||
|
||||
func testAddedNewTablePartitionInfo(c *C, d *ddl, tblInfo *model.TableInfo, partName, lessthan string) *model.PartitionInfo {
|
||||
func testAddedNewTablePartitionInfo(t *testing.T, d *ddl, tblInfo *model.TableInfo, partName, lessthan string) *model.PartitionInfo {
|
||||
genIDs, err := d.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
pid := genIDs[0]
|
||||
// the new added partition should change the partition state to state none at the beginning.
|
||||
return &model.PartitionInfo{
|
||||
@ -124,12 +125,12 @@ func testAddedNewTablePartitionInfo(c *C, d *ddl, tblInfo *model.TableInfo, part
|
||||
}
|
||||
|
||||
// testViewInfo creates a test view with num int columns.
|
||||
func testViewInfo(c *C, d *ddl, name string, num int) *model.TableInfo {
|
||||
func testViewInfo(t *testing.T, d *ddl, name string, num int) *model.TableInfo {
|
||||
tblInfo := &model.TableInfo{
|
||||
Name: model.NewCIStr(name),
|
||||
}
|
||||
genIDs, err := d.genGlobalIDs(1)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
tblInfo.ID = genIDs[0]
|
||||
|
||||
cols := make([]*model.ColumnInfo, num)
|
||||
@ -160,7 +161,7 @@ func testViewInfo(c *C, d *ddl, name string, num int) *model.TableInfo {
|
||||
return tblInfo
|
||||
}
|
||||
|
||||
func testCreateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
func testCreateTable(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -169,16 +170,16 @@ func testCreateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo,
|
||||
Args: []interface{}{tblInfo},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
require.Nil(t, err)
|
||||
|
||||
v := getSchemaVer(c, ctx)
|
||||
v := getSchemaVer(t, ctx)
|
||||
tblInfo.State = model.StatePublic
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
tblInfo.State = model.StateNone
|
||||
return job
|
||||
}
|
||||
|
||||
func testCreateView(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
func testCreateView(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -187,18 +188,18 @@ func testCreateView(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo,
|
||||
Args: []interface{}{tblInfo, false, 0},
|
||||
}
|
||||
|
||||
c.Assert(tblInfo.IsView(), IsTrue)
|
||||
require.True(t, tblInfo.IsView())
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
|
||||
v := getSchemaVer(c, ctx)
|
||||
v := getSchemaVer(t, ctx)
|
||||
tblInfo.State = model.StatePublic
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
tblInfo.State = model.StateNone
|
||||
return job
|
||||
}
|
||||
|
||||
func testDropTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
func testDropTable(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job {
|
||||
job := &model.Job{
|
||||
SchemaID: dbInfo.ID,
|
||||
TableID: tblInfo.ID,
|
||||
@ -206,41 +207,41 @@ func testDropTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, t
|
||||
BinlogInfo: &model.HistoryInfo{},
|
||||
}
|
||||
err := d.doDDLJob(ctx, job)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
|
||||
v := getSchemaVer(c, ctx)
|
||||
checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
v := getSchemaVer(t, ctx)
|
||||
checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo})
|
||||
return job
|
||||
}
|
||||
|
||||
func testCheckTableState(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) {
|
||||
func testCheckTableState(test *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) {
|
||||
err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error {
|
||||
t := meta.NewMeta(txn)
|
||||
info, err := t.GetTable(dbInfo.ID, tblInfo.ID)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(test, err)
|
||||
|
||||
if state == model.StateNone {
|
||||
c.Assert(info, IsNil)
|
||||
require.NoError(test, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
c.Assert(info.Name, DeepEquals, tblInfo.Name)
|
||||
c.Assert(info.State, Equals, state)
|
||||
require.Equal(test, info.Name, tblInfo.Name)
|
||||
require.Equal(test, info.State, state)
|
||||
return nil
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(test, err)
|
||||
}
|
||||
|
||||
func testGetTable(c *C, d *ddl, schemaID int64, tableID int64) table.Table {
|
||||
func testGetTable(t *testing.T, d *ddl, schemaID int64, tableID int64) table.Table {
|
||||
tbl, err := testGetTableWithError(d, schemaID, tableID)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
return tbl
|
||||
}
|
||||
|
||||
// for drop indexes
|
||||
func createTestTableForDropIndexes(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, name string, num int) *model.TableInfo {
|
||||
func createTestTableForDropIndexes(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, name string, num int) *model.TableInfo {
|
||||
tableInfo, err := testTableInfo(d, name, num)
|
||||
c.Assert(err, IsNil)
|
||||
require.NoError(t, err)
|
||||
var idxs []*model.IndexInfo
|
||||
for i := 0; i < num; i++ {
|
||||
idxName := model.NewCIStr(fmt.Sprintf("i%d", i+1))
|
||||
@ -252,6 +253,6 @@ func createTestTableForDropIndexes(c *C, ctx sessionctx.Context, d *ddl, dbInfo
|
||||
idxs = append(idxs, idx)
|
||||
}
|
||||
tableInfo.Indices = idxs
|
||||
testCreateTable(c, ctx, d, dbInfo, tableInfo)
|
||||
testCreateTable(t, ctx, d, dbInfo, tableInfo)
|
||||
return tableInfo
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ set -euo pipefail
|
||||
|
||||
exitCode=0
|
||||
|
||||
list=$(find . -name "*_test.go" -not -path "./vendor/*" -print0 | xargs -0 grep -E "type test(.*)Suite" | awk -F ':| ' '{print $1" "$3}')
|
||||
list=$(find . -name "*_test.go" -not -path "./vendor/*" -print0 | xargs -0 grep -E "type test(.*)Suite\s+" | awk -F ':| ' '{print $1" "$3}')
|
||||
while read -r file testSuite; do
|
||||
# TODO: ugly regex
|
||||
# TODO: check code comment
|
||||
|
||||
@ -151,6 +151,15 @@ func (chs *CommonHandleSuite) RerunWithCommonHandleEnabled(c *check.C, f func(*c
|
||||
}
|
||||
}
|
||||
|
||||
// RerunWithCommonHandleEnabledWithoutCheck runs a test function with IsCommonHandle enabled but without check.
|
||||
func (chs *CommonHandleSuite) RerunWithCommonHandleEnabledWithoutCheck(f func()) {
|
||||
if !chs.IsCommonHandle {
|
||||
chs.IsCommonHandle = true
|
||||
f()
|
||||
chs.IsCommonHandle = false
|
||||
}
|
||||
}
|
||||
|
||||
// NewHandle create a handle according to CommonHandleSuite.IsCommonHandle.
|
||||
func (chs *CommonHandleSuite) NewHandle() *commonHandleSuiteNewHandleBuilder {
|
||||
return &commonHandleSuiteNewHandleBuilder{isCommon: chs.IsCommonHandle}
|
||||
|
||||
Reference in New Issue
Block a user