diff --git a/ddl/column.go b/ddl/column.go index ff9c141f5c..276b0b08d4 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -304,6 +304,12 @@ func (d *ddl) onDropColumn(t *meta.Meta, job *model.Job) error { } } +// How to backfill column data in reorganization state? +// 1. Generate a snapshot with special version. +// 2. Traverse the snapshot, get every row in the table. +// 3. For one row, if the row has been already deleted, skip to next row. +// 4. If not deleted, check whether column data has existed, if existed, skip to next row. +// 5. If column data doesn't exist, backfill the column with default value and then continue to handle next row. func (d *ddl) backfillColumn(t table.Table, columnInfo *model.ColumnInfo, reorgInfo *reorgInfo) error { seekHandle := reorgInfo.Handle version := reorgInfo.SnapshotVer @@ -341,10 +347,13 @@ func (d *ddl) backfillColumnData(t table.Table, columnInfo *model.ColumnInfo, ha } backfillKey := t.RecordKey(handle, &column.Col{ColumnInfo: *columnInfo}) - _, err = txn.Get(backfillKey) + backfillValue, err := txn.Get(backfillKey) if err != nil && !kv.IsErrNotFound(err) { return errors.Trace(err) } + if backfillValue != nil { + return nil + } value, _, err := tables.GetColDefaultValue(nil, columnInfo) if err != nil { diff --git a/ddl/index.go b/ddl/index.go index ebfc1d1d75..8c397656b9 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -332,11 +332,11 @@ func fetchRowColVals(txn kv.Transaction, t table.Table, handle int64, indexInfo const maxBatchSize = 1024 // How to add index in reorganization state? -// 1, Generate a snapshot with special version. -// 2, Traverse the snapshot, get every row in the table. -// 3, For one row, if the row has been already deleted, skip to next row. -// 4, If not deleted, check whether index has existed, if existed, skip to next row. -// 5, If index doesn't exist, create the index and then continue to handle next row. +// 1. Generate a snapshot with special version. +// 2. Traverse the snapshot, get every row in the table. +// 3. For one row, if the row has been already deleted, skip to next row. +// 4. If not deleted, check whether index has existed, if existed, skip to next row. +// 5. If index doesn't exist, create the index and then continue to handle next row. func (d *ddl) addTableIndex(t table.Table, indexInfo *model.IndexInfo, reorgInfo *reorgInfo) error { seekHandle := reorgInfo.Handle version := reorgInfo.SnapshotVer