inspectkv: add test
This commit is contained in:
@ -17,6 +17,7 @@ import (
|
||||
"testing"
|
||||
|
||||
. "github.com/pingcap/check"
|
||||
"github.com/pingcap/tidb/column"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta"
|
||||
"github.com/pingcap/tidb/meta/autoid"
|
||||
@ -25,6 +26,7 @@ import (
|
||||
"github.com/pingcap/tidb/sessionctx/variable"
|
||||
"github.com/pingcap/tidb/store/localstore"
|
||||
"github.com/pingcap/tidb/store/localstore/goleveldb"
|
||||
"github.com/pingcap/tidb/table"
|
||||
"github.com/pingcap/tidb/table/tables"
|
||||
"github.com/pingcap/tidb/util/mock"
|
||||
"github.com/pingcap/tidb/util/types"
|
||||
@ -38,6 +40,7 @@ var _ = Suite(&testSuite{})
|
||||
|
||||
type testSuite struct {
|
||||
store kv.Storage
|
||||
ctx *mock.Context
|
||||
dbInfo *model.DBInfo
|
||||
tbInfo *model.TableInfo
|
||||
}
|
||||
@ -48,6 +51,10 @@ func (s *testSuite) SetUpSuite(c *C) {
|
||||
s.store, err = driver.Open("memory:test_inspect")
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
s.ctx = mock.NewContext()
|
||||
s.ctx.Store = s.store
|
||||
variable.BindSessionVars(s.ctx)
|
||||
|
||||
txn, err := s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
t := meta.NewMeta(txn)
|
||||
@ -101,7 +108,19 @@ func (s *testSuite) SetUpSuite(c *C) {
|
||||
}
|
||||
|
||||
func (s *testSuite) TearDownSuite(c *C) {
|
||||
s.store.Close()
|
||||
txn, err := s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
t := meta.NewMeta(txn)
|
||||
|
||||
err = t.DropTable(s.dbInfo.ID, s.tbInfo.ID)
|
||||
c.Assert(err, IsNil)
|
||||
err = t.DropDatabase(s.dbInfo.ID)
|
||||
c.Assert(err, IsNil)
|
||||
err = txn.Commit()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
err = s.store.Close()
|
||||
c.Assert(err, IsNil)
|
||||
}
|
||||
|
||||
func (s *testSuite) TestGetDDLInfo(c *C) {
|
||||
@ -133,39 +152,34 @@ func (s *testSuite) TestGetDDLInfo(c *C) {
|
||||
}
|
||||
|
||||
func (s *testSuite) TestScan(c *C) {
|
||||
ctx := mock.NewContext()
|
||||
ctx.Store = s.store
|
||||
variable.BindSessionVars(ctx)
|
||||
|
||||
alloc := autoid.NewAllocator(s.store, s.dbInfo.ID)
|
||||
tb, err := tables.TableFromMeta(alloc, s.tbInfo)
|
||||
c.Assert(err, IsNil)
|
||||
indices := tb.Indices()
|
||||
_, err = tb.AddRecord(ctx, []interface{}{10, 11}, 0)
|
||||
_, err = tb.AddRecord(s.ctx, []interface{}{10, 11}, 0)
|
||||
c.Assert(err, IsNil)
|
||||
ctx.FinishTxn(false)
|
||||
s.ctx.FinishTxn(false)
|
||||
|
||||
record := &RecordData{Handle: int64(1), Values: []interface{}{int64(10), int64(11)}}
|
||||
record1 := &RecordData{Handle: int64(1), Values: []interface{}{int64(10), int64(11)}}
|
||||
record2 := &RecordData{Handle: int64(2), Values: []interface{}{int64(20), int64(21)}}
|
||||
ver, err := s.store.CurrentVersion()
|
||||
c.Assert(err, IsNil)
|
||||
records, _, err := ScanSnapshotTableData(s.store, ver, tb, int64(1), 1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(records, DeepEquals, []*RecordData{record})
|
||||
c.Assert(records, DeepEquals, []*RecordData{record1})
|
||||
|
||||
_, err = tb.AddRecord(ctx, []interface{}{20, 21}, 0)
|
||||
_, err = tb.AddRecord(s.ctx, record2.Values, record2.Handle)
|
||||
c.Assert(err, IsNil)
|
||||
ctx.FinishTxn(false)
|
||||
s.ctx.FinishTxn(false)
|
||||
txn, err := s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
records, nextHandle, err := ScanTableData(txn, tb, int64(1), 1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(records, DeepEquals, []*RecordData{record})
|
||||
c.Assert(records, DeepEquals, []*RecordData{record1})
|
||||
records, nextHandle, err = ScanTableData(txn, tb, nextHandle, 1)
|
||||
c.Assert(err, IsNil)
|
||||
record.Handle = int64(2)
|
||||
record.Values = []interface{}{int64(20), int64(21)}
|
||||
c.Assert(records, DeepEquals, []*RecordData{record})
|
||||
c.Assert(records, DeepEquals, []*RecordData{record2})
|
||||
startHandle := nextHandle
|
||||
records, nextHandle, err = ScanTableData(txn, tb, startHandle, 1)
|
||||
c.Assert(records, IsNil)
|
||||
@ -175,10 +189,10 @@ func (s *testSuite) TestScan(c *C) {
|
||||
idxRow1 := &RecordData{Handle: int64(1), Values: []interface{}{int64(10)}}
|
||||
idxRow2 := &RecordData{Handle: int64(2), Values: []interface{}{int64(20)}}
|
||||
kvIndex := kv.NewKVIndex(tb.IndexPrefix(), indices[0].Name.L, indices[0].ID, indices[0].Unique)
|
||||
idxRows, nextVals, err := ScanIndexData(txn, kvIndex, []interface{}{int64(10)}, 2)
|
||||
idxRows, nextVals, err := ScanIndexData(txn, kvIndex, idxRow1.Values, 2)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1, idxRow2})
|
||||
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, []interface{}{int64(10)}, 1)
|
||||
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, idxRow1.Values, 1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1})
|
||||
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, nextVals, 1)
|
||||
@ -188,4 +202,157 @@ func (s *testSuite) TestScan(c *C) {
|
||||
c.Assert(idxRows, IsNil)
|
||||
c.Assert(nextVals, DeepEquals, []interface{}{nil})
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
s.testTableData(c, tb, []*RecordData{record1, record2})
|
||||
|
||||
s.testIndex(c, tb, tb.Indices()[0])
|
||||
|
||||
err = tb.RemoveRecord(s.ctx, 1, record1.Values)
|
||||
c.Assert(err, IsNil)
|
||||
err = tb.RemoveRecord(s.ctx, 2, record2.Values)
|
||||
c.Assert(err, IsNil)
|
||||
}
|
||||
|
||||
func (s *testSuite) testTableData(c *C, tb table.Table, rs []*RecordData) {
|
||||
txn, err := s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
ret1, ret2, err := DiffTableData(txn, tb, rs, 3, -1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, DeepEquals, []*RecordData{nil, nil})
|
||||
c.Assert(ret2, DeepEquals, rs)
|
||||
|
||||
ret1, ret2, err = DiffTableData(txn, tb, rs, 1, -1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, IsNil)
|
||||
c.Assert(ret2, IsNil)
|
||||
|
||||
isEqual, err := EqualTableData(txn, tb, rs, 1, -1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsTrue)
|
||||
isEqual, err = EqualTableData(txn, tb, rs, 2, -1)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsFalse)
|
||||
}
|
||||
|
||||
func (s *testSuite) testIndex(c *C, tb table.Table, idx *column.IndexedCol) {
|
||||
txn, err := s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
isEqual, err := EqualIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsTrue)
|
||||
|
||||
ret1, ret2, err := DiffIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, IsNil)
|
||||
c.Assert(ret2, IsNil)
|
||||
|
||||
// current index data:
|
||||
// index data (handle, data): (1, 10), (2, 20), (3, 30)
|
||||
// index col data (handle, data): (1, 10), (2, 20), (4, 40)
|
||||
err = idx.X.Create(txn, []interface{}{int64(30)}, 3)
|
||||
c.Assert(err, IsNil)
|
||||
col := tb.Cols()[idx.Columns[0].Offset]
|
||||
key := tb.RecordKey(4, col)
|
||||
err = tb.SetColValue(txn, key, int64(40))
|
||||
c.Assert(err, IsNil)
|
||||
err = txn.Commit()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
txn, err = s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
isEqual, err = EqualIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsFalse)
|
||||
ret1, ret2, err = DiffIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, DeepEquals, []*RecordData{
|
||||
{Handle: int64(3), Values: []interface{}{int64(30)}},
|
||||
nil,
|
||||
})
|
||||
c.Assert(ret2, DeepEquals, []*RecordData{
|
||||
nil,
|
||||
{Handle: int64(4), Values: []interface{}{int64(40)}},
|
||||
})
|
||||
|
||||
// current index data:
|
||||
// index data (handle, data): (1, 10), (2, 20), (3, 30), (5, 50), (7, 70), (8, 80)
|
||||
// index col data (handle, data): (1, 10), (2, 20), (4, 40), (5, 51), (6, 60), (7, 70)
|
||||
err = idx.X.Create(txn, []interface{}{int64(50)}, 5)
|
||||
c.Assert(err, IsNil)
|
||||
err = idx.X.Create(txn, []interface{}{int64(70)}, 7)
|
||||
c.Assert(err, IsNil)
|
||||
err = idx.X.Create(txn, []interface{}{int64(80)}, 8)
|
||||
c.Assert(err, IsNil)
|
||||
col = tb.Cols()[idx.Columns[0].Offset]
|
||||
key = tb.RecordKey(5, col)
|
||||
err = tb.SetColValue(txn, key, int64(51))
|
||||
c.Assert(err, IsNil)
|
||||
col = tb.Cols()[idx.Columns[0].Offset]
|
||||
key = tb.RecordKey(6, col)
|
||||
err = tb.SetColValue(txn, key, int64(60))
|
||||
c.Assert(err, IsNil)
|
||||
col = tb.Cols()[idx.Columns[0].Offset]
|
||||
key = tb.RecordKey(7, col)
|
||||
err = tb.SetColValue(txn, key, int64(70))
|
||||
c.Assert(err, IsNil)
|
||||
err = txn.Commit()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
txn, err = s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
isEqual, err = EqualIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsFalse)
|
||||
ret1, ret2, err = DiffIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, DeepEquals, []*RecordData{
|
||||
{Handle: int64(3), Values: []interface{}{int64(30)}},
|
||||
nil,
|
||||
{Handle: int64(5), Values: []interface{}{int64(50)}},
|
||||
nil,
|
||||
{Handle: int64(8), Values: []interface{}{int64(80)}},
|
||||
})
|
||||
c.Assert(ret2, DeepEquals, []*RecordData{
|
||||
nil,
|
||||
{Handle: int64(4), Values: []interface{}{int64(40)}},
|
||||
{Handle: int64(5), Values: []interface{}{int64(51)}},
|
||||
{Handle: int64(6), Values: []interface{}{int64(60)}},
|
||||
nil,
|
||||
})
|
||||
|
||||
// current index data:
|
||||
// index data (handle, data): (1, 10), (2, 20), (3, 30), (5, 50), (7, 70), (8, 80)
|
||||
// index col data (handle, data): (1, 10), (2, 20), (4, 40), (5, 51), (6, 60), (7, 70), (9, 90)
|
||||
col = tb.Cols()[idx.Columns[0].Offset]
|
||||
key = tb.RecordKey(9, col)
|
||||
err = tb.SetColValue(txn, key, int64(90))
|
||||
c.Assert(err, IsNil)
|
||||
err = txn.Commit()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
txn, err = s.store.Begin()
|
||||
c.Assert(err, IsNil)
|
||||
isEqual, err = EqualIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(isEqual, IsFalse)
|
||||
ret1, ret2, err = DiffIndexData(txn, tb, idx)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(ret1, DeepEquals, []*RecordData{
|
||||
{Handle: int64(3), Values: []interface{}{int64(30)}},
|
||||
nil,
|
||||
{Handle: int64(5), Values: []interface{}{int64(50)}},
|
||||
nil,
|
||||
{Handle: int64(8), Values: []interface{}{int64(80)}},
|
||||
nil,
|
||||
})
|
||||
c.Assert(ret2, DeepEquals, []*RecordData{
|
||||
nil,
|
||||
{Handle: int64(4), Values: []interface{}{int64(40)}},
|
||||
{Handle: int64(5), Values: []interface{}{int64(51)}},
|
||||
{Handle: int64(6), Values: []interface{}{int64(60)}},
|
||||
nil,
|
||||
{Handle: int64(9), Values: []interface{}{int64(90)}},
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user