func (b *Builder) applyCreateTable(m *meta.Meta, roDBInfo *model.DBInfo, tableID int64, alloc autoid.Allocator) error { tblInfo, err := m.GetTable(roDBInfo.ID, tableID) if err != nil { return errors.Trace(err) } if tblInfo == nil { // When we apply an old schema diff, the table may has been dropped already, so we need to fall back to // full load. return ErrTableNotExists } if alloc == nil { alloc = autoid.NewAllocator(b.handle.store, roDBInfo.ID) } tbl, err := tables.TableFromMeta(alloc, tblInfo) if err != nil { return errors.Trace(err) } tableNames := b.is.schemaMap[roDBInfo.Name.L] tableNames.tables[tblInfo.Name.L] = tbl bucketIdx := tableBucketIdx(tableID) sortedTables := b.is.sortedTablesBuckets[bucketIdx] sortedTables = append(sortedTables, tbl) sort.Sort(sortedTables) b.is.sortedTablesBuckets[bucketIdx] = sortedTables return nil }
func (p *testIndexSuit) SetUpSuite(c *C) { store, err := tidb.NewStore(tidb.EngineGoLevelDBMemory) c.Assert(err, IsNil) p.store = store se, _ := tidb.CreateSession(store) p.ctx = se.(context.Context) tbInfo := &model.TableInfo{ ID: 2, Name: model.NewCIStr("t2"), State: model.StatePublic, Columns: []*model.ColumnInfo{ { ID: 0, Name: model.NewCIStr("id"), Offset: 0, DefaultValue: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong), State: model.StatePublic, }, { ID: 1, Name: model.NewCIStr("name"), Offset: 1, DefaultValue: nil, FieldType: *types.NewFieldType(mysql.TypeVarchar), State: model.StatePublic, }, }, Indices: []*model.IndexInfo{ { Name: model.NewCIStr("id"), Table: model.NewCIStr("t2"), Columns: []*model.IndexColumn{ { Name: model.NewCIStr("id"), Offset: 0, Length: 0, }, }, Unique: false, Primary: false, State: model.StatePublic, }, }, } p.tbl, err = tables.TableFromMeta(&simpleAllocator{}, tbInfo) c.Assert(err, IsNil) var i int64 for i = 0; i < 10; i++ { p.tbl.AddRecord(p.ctx, []interface{}{i * 10, "hello"}) } }
func (b *Builder) createSchemaTablesForDB(di *model.DBInfo) error { schTbls := &schemaTables{ dbInfo: di, tables: make(map[string]table.Table, len(di.Tables)), } b.is.schemaMap[di.Name.L] = schTbls for _, t := range di.Tables { alloc := autoid.NewAllocator(b.handle.store, di.ID) var tbl table.Table tbl, err := tables.TableFromMeta(alloc, t) if err != nil { return errors.Trace(err) } schTbls.tables[t.Name.L] = tbl sortedTables := b.is.sortedTablesBuckets[tableBucketIdx(t.ID)] b.is.sortedTablesBuckets[tableBucketIdx(t.ID)] = append(sortedTables, tbl) } return nil }
func (b *Builder) applyCreateTable(m *meta.Meta, roDBInfo *model.DBInfo, tableID int64, alloc autoid.Allocator) error { tblInfo, err := m.GetTable(roDBInfo.ID, tableID) if err != nil { return errors.Trace(err) } if tblInfo == nil { // When we apply an old schema diff, the table may has been dropped already, so we need to fall back to // full load. return ErrTableNotExists } if alloc == nil { alloc = autoid.NewAllocator(b.handle.store, roDBInfo.ID) } tbl, err := tables.TableFromMeta(alloc, tblInfo) if err != nil { return errors.Trace(err) } b.is.tables[tblInfo.ID] = tbl tn := makeTableName(roDBInfo.Name.L, tblInfo.Name.L) b.is.tableNameToID[string(tn)] = tblInfo.ID return nil }
func (p *testFromSuit) SetUpSuite(c *C) { store, err := tidb.NewStore(tidb.EngineGoLevelDBMemory) c.Assert(err, IsNil) p.vars = map[string]interface{}{} p.txn, _ = store.Begin() tbInfo := &model.TableInfo{ ID: 1, Name: model.NewCIStr("t"), State: model.StatePublic, Columns: []*model.ColumnInfo{ { ID: 0, Name: model.NewCIStr("id"), Offset: 0, DefaultValue: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong), State: model.StatePublic, }, { ID: 1, Name: model.NewCIStr("name"), Offset: 1, DefaultValue: nil, FieldType: *types.NewFieldType(mysql.TypeVarchar), State: model.StatePublic, }, }, } p.tbl, err = tables.TableFromMeta(&simpleAllocator{}, tbInfo) c.Assert(err, IsNil) variable.BindSessionVars(p) var i int64 for i = 0; i < 10; i++ { _, err = p.tbl.AddRecord(p, []interface{}{i * 10, "hello"}) c.Assert(err, IsNil) } }
func (s *testSuite) TestScan(c *C) { defer testleak.AfterTest(c)() 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(s.ctx, types.MakeDatums(10, 11)) c.Assert(err, IsNil) s.ctx.CommitTxn() record1 := &RecordData{Handle: int64(1), Values: types.MakeDatums(int64(10), int64(11))} record2 := &RecordData{Handle: int64(2), Values: types.MakeDatums(int64(20), int64(21))} ver, err := s.store.CurrentVersion() c.Assert(err, IsNil) records, _, err := ScanSnapshotTableRecord(s.store, ver, tb, int64(1), 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record1}) _, err = tb.AddRecord(s.ctx, record2.Values) c.Assert(err, IsNil) s.ctx.CommitTxn() txn, err := s.store.Begin() c.Assert(err, IsNil) records, nextHandle, err := ScanTableRecord(txn, tb, int64(1), 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record1}) records, nextHandle, err = ScanTableRecord(txn, tb, nextHandle, 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record2}) startHandle := nextHandle records, nextHandle, err = ScanTableRecord(txn, tb, startHandle, 1) c.Assert(err, IsNil) c.Assert(records, IsNil) c.Assert(nextHandle, Equals, startHandle) idxRow1 := &RecordData{Handle: int64(1), Values: types.MakeDatums(int64(10))} idxRow2 := &RecordData{Handle: int64(2), Values: types.MakeDatums(int64(20))} kvIndex := tables.NewIndex(tb.Meta(), indices[0].Meta()) 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, idxRow1.Values, 1) c.Assert(err, IsNil) c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1}) idxRows, nextVals, err = ScanIndexData(txn, kvIndex, nextVals, 1) c.Assert(err, IsNil) c.Assert(idxRows, DeepEquals, []*RecordData{idxRow2}) idxRows, nextVals, err = ScanIndexData(txn, kvIndex, nextVals, 1) c.Assert(idxRows, IsNil) c.Assert(nextVals, DeepEquals, types.MakeDatums(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) TestScan(c *C) { 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(s.ctx, []interface{}{10, 11}) c.Assert(err, IsNil) s.ctx.FinishTxn(false) 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 := ScanSnapshotTableRecord(s.store, ver, tb, int64(1), 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record1}) _, err = tb.AddRecord(s.ctx, record2.Values) c.Assert(err, IsNil) s.ctx.FinishTxn(false) txn, err := s.store.Begin() c.Assert(err, IsNil) records, nextHandle, err := ScanTableRecord(txn, tb, int64(1), 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record1}) records, nextHandle, err = ScanTableRecord(txn, tb, nextHandle, 1) c.Assert(err, IsNil) c.Assert(records, DeepEquals, []*RecordData{record2}) startHandle := nextHandle records, nextHandle, err = ScanTableRecord(txn, tb, startHandle, 1) c.Assert(err, IsNil) c.Assert(records, IsNil) c.Assert(nextHandle, Equals, startHandle) 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, idxRow1.Values, 2) c.Assert(err, IsNil) c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1, idxRow2}) 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) c.Assert(err, IsNil) c.Assert(idxRows, DeepEquals, []*RecordData{idxRow2}) idxRows, nextVals, err = ScanIndexData(txn, kvIndex, nextVals, 1) 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) }