func (ts *testSuite) TestUniqueIndexMultipleNullEntries(c *C) { _, err := ts.se.Execute("CREATE TABLE test.t (a int primary key auto_increment, b varchar(255) unique)") c.Assert(err, IsNil) ctx := ts.se.(context.Context) dom := sessionctx.GetDomain(ctx) tb, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) c.Assert(err, IsNil) c.Assert(tb.Meta().ID, Greater, int64(0)) c.Assert(tb.Meta().Name.L, Equals, "t") c.Assert(tb.Meta(), NotNil) c.Assert(tb.Indices(), NotNil) c.Assert(string(tb.FirstKey()), Not(Equals), "") c.Assert(string(tb.IndexPrefix()), Not(Equals), "") c.Assert(string(tb.RecordPrefix()), Not(Equals), "") c.Assert(tables.FindIndexByColName(tb, "b"), NotNil) autoid, err := tb.AllocAutoID() c.Assert(err, IsNil) c.Assert(autoid, Greater, int64(0)) _, err = tb.AddRecord(ctx, types.MakeDatums(1, nil)) c.Assert(err, IsNil) _, err = tb.AddRecord(ctx, types.MakeDatums(2, nil)) c.Assert(err, IsNil) _, err = ts.se.Execute("drop table test.t") c.Assert(err, IsNil) }
func (s *testIndexSuite) testGetIndex(c *C, t table.Table, name string, isExist bool) { index := tables.FindIndexByColName(t, name) if isExist { c.Assert(index, NotNil) } else { c.Assert(index, IsNil) } }
func (ts *testSuite) TestBasic(c *C) { _, err := ts.se.Execute("CREATE TABLE test.t (a int primary key auto_increment, b varchar(255) unique)") c.Assert(err, IsNil) ctx := ts.se.(context.Context) dom := sessionctx.GetDomain(ctx) tb, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) c.Assert(err, IsNil) c.Assert(tb.Meta().ID, Greater, int64(0)) c.Assert(tb.Meta().Name.L, Equals, "t") c.Assert(tb.Meta(), NotNil) c.Assert(tb.Indices(), NotNil) c.Assert(string(tb.FirstKey()), Not(Equals), "") c.Assert(string(tb.IndexPrefix()), Not(Equals), "") c.Assert(string(tb.RecordPrefix()), Not(Equals), "") c.Assert(tables.FindIndexByColName(tb, "b"), NotNil) autoid, err := tb.AllocAutoID() c.Assert(err, IsNil) c.Assert(autoid, Greater, int64(0)) rid, err := tb.AddRecord(ctx, types.MakeDatums(1, "abc")) c.Assert(err, IsNil) c.Assert(rid, Greater, int64(0)) row, err := tb.Row(ctx, rid) c.Assert(err, IsNil) c.Assert(len(row), Equals, 2) c.Assert(row[0].GetInt64(), Equals, int64(1)) _, err = tb.AddRecord(ctx, types.MakeDatums(1, "aba")) c.Assert(err, NotNil) _, err = tb.AddRecord(ctx, types.MakeDatums(2, "abc")) c.Assert(err, NotNil) c.Assert(tb.UpdateRecord(ctx, rid, types.MakeDatums(1, "abc"), types.MakeDatums(1, "cba"), map[int]bool{0: false, 1: true}), IsNil) tb.IterRecords(ctx, tb.FirstKey(), tb.Cols(), func(h int64, data []types.Datum, cols []*table.Column) (bool, error) { return true, nil }) indexCnt := func() int { cnt, err1 := countEntriesWithPrefix(ctx, tb.IndexPrefix()) c.Assert(err1, IsNil) return cnt } // RowWithCols test vals, err := tb.RowWithCols(ctx, 1, tb.Cols()) c.Assert(err, IsNil) c.Assert(vals, HasLen, 2) c.Assert(vals[0].GetInt64(), Equals, int64(1)) cols := []*table.Column{tb.Cols()[1]} vals, err = tb.RowWithCols(ctx, 1, cols) c.Assert(err, IsNil) c.Assert(vals, HasLen, 1) c.Assert(vals[0].GetBytes(), DeepEquals, []byte("cba")) // Make sure there is index data in the storage. c.Assert(indexCnt(), Greater, 0) c.Assert(tb.RemoveRecord(ctx, rid, types.MakeDatums(1, "cba")), IsNil) // Make sure index data is also removed after tb.RemoveRecord(). c.Assert(indexCnt(), Equals, 0) _, err = tb.AddRecord(ctx, types.MakeDatums(1, "abc")) c.Assert(err, IsNil) c.Assert(indexCnt(), Greater, 0) // Make sure index data is also removed after tb.Truncate(). c.Assert(tb.Truncate(ctx), IsNil) c.Assert(indexCnt(), Equals, 0) _, err = ts.se.Execute("drop table test.t") c.Assert(err, IsNil) }
func (s *testIndexSuite) TestIndex(c *C) { defer testleak.AfterTest(c)() tblInfo := testTableInfo(c, s.d, "t1", 3) ctx := testNewContext(c, s.d) defer ctx.RollbackTxn() txn, err := ctx.GetTxn(true) c.Assert(err, IsNil) testCreateTable(c, ctx, s.d, s.dbInfo, tblInfo) t := testGetTable(c, s.d, s.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) } err = ctx.CommitTxn() c.Assert(err, IsNil) i := int64(0) t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(h int64, data []types.Datum, cols []*table.Column) (bool, error) { c.Assert(data[0].GetInt64(), Equals, i) i++ return true, nil }) job := testCreateIndex(c, ctx, s.d, s.dbInfo, tblInfo, true, "c1_uni", "c1") testCheckJobDone(c, s.d, job, true) t = testGetTable(c, s.d, s.dbInfo.ID, tblInfo.ID) index := tables.FindIndexByColName(t, "c1") c.Assert(index, NotNil) h, err := t.AddRecord(ctx, types.MakeDatums(num+1, 1, 1)) c.Assert(err, IsNil) h1, err := t.AddRecord(ctx, types.MakeDatums(num+1, 1, 1)) c.Assert(err, NotNil) c.Assert(h, Equals, h1) h, err = t.AddRecord(ctx, types.MakeDatums(1, 1, 1)) c.Assert(err, NotNil) txn, err = ctx.GetTxn(true) c.Assert(err, IsNil) exist, _, err := index.Exist(txn, types.MakeDatums(1), h) c.Assert(err, IsNil) c.Assert(exist, IsTrue) job = testDropIndex(c, ctx, s.d, s.dbInfo, tblInfo, "c1_uni") testCheckJobDone(c, s.d, job, false) t = testGetTable(c, s.d, s.dbInfo.ID, tblInfo.ID) index1 := tables.FindIndexByColName(t, "c1") c.Assert(index1, IsNil) txn, err = ctx.GetTxn(true) c.Assert(err, IsNil) exist, _, err = index.Exist(txn, types.MakeDatums(1), h) c.Assert(err, IsNil) c.Assert(exist, IsFalse) _, err = t.AddRecord(ctx, types.MakeDatums(1, 1, 1)) c.Assert(err, IsNil) }