diff --git a/infoschema/builder.go b/infoschema/builder.go index d9f53c09c1e87..141574dcf31b9 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -100,19 +100,11 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro // copySortedTables copies sortedTables for old table and new table for later modification. func (b *Builder) copySortedTables(oldTableID, newTableID int64) { - buckets := b.is.sortedTablesBuckets if tableIDIsValid(oldTableID) { - bucketIdx := tableBucketIdx(oldTableID) - oldSortedTables := buckets[bucketIdx] - newSortedTables := make(sortedTables, len(oldSortedTables)) - copy(newSortedTables, oldSortedTables) - buckets[bucketIdx] = newSortedTables + b.copySortedTablesBucket(tableBucketIdx(oldTableID)) } if tableIDIsValid(newTableID) && newTableID != oldTableID { - oldSortedTables := buckets[tableBucketIdx(newTableID)] - newSortedTables := make(sortedTables, len(oldSortedTables), len(oldSortedTables)+1) - copy(newSortedTables, oldSortedTables) - buckets[tableBucketIdx(newTableID)] = newSortedTables + b.copySortedTablesBucket(tableBucketIdx(newTableID)) } } @@ -138,6 +130,16 @@ func (b *Builder) applyDropSchema(schemaID int64) []int64 { return nil } delete(b.is.schemaMap, di.Name.L) + + // Copy the sortedTables that contain the table we are going to drop. + bucketIdxMap := make(map[int]struct{}) + for _, tbl := range di.Tables { + bucketIdxMap[tableBucketIdx(tbl.ID)] = struct{}{} + } + for bucketIdx := range bucketIdxMap { + b.copySortedTablesBucket(bucketIdx) + } + ids := make([]int64, 0, len(di.Tables)) for _, tbl := range di.Tables { b.applyDropTable(di, tbl.ID) @@ -147,6 +149,13 @@ func (b *Builder) applyDropSchema(schemaID int64) []int64 { return ids } +func (b *Builder) copySortedTablesBucket(bucketIdx int) { + oldSortedTables := b.is.sortedTablesBuckets[bucketIdx] + newSortedTables := make(sortedTables, len(oldSortedTables)) + copy(newSortedTables, oldSortedTables) + b.is.sortedTablesBuckets[bucketIdx] = newSortedTables +} + 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 {