From 99b3465c1ebfb34b462aecf94c4bfb79dac47524 Mon Sep 17 00:00:00 2001 From: Ewan Chou Date: Fri, 9 Dec 2016 12:31:27 +0800 Subject: [PATCH] ddl: allocate column ID and index ID in TableInfo. (#2205) --- ddl/column.go | 7 ++++++- ddl/column_test.go | 8 ++------ ddl/ddl.go | 26 +++----------------------- ddl/ddl_worker_test.go | 4 +--- ddl/foreign_key.go | 2 +- ddl/foreign_key_test.go | 5 +---- ddl/index.go | 14 +++++++++----- ddl/index_test.go | 6 ++---- ddl/table_test.go | 4 +--- model/model.go | 2 ++ 10 files changed, 28 insertions(+), 50 deletions(-) diff --git a/ddl/column.go b/ddl/column.go index bf0b6a59da5ea..12739735377cf 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -77,7 +77,7 @@ func (d *ddl) createColumnInfo(tblInfo *model.TableInfo, colInfo *model.ColumnIn // Insert position is after the mentioned column. position = c.Offset + 1 } - + colInfo.ID = allocateColumnID(tblInfo) colInfo.State = model.StateNone // To support add column asynchronous, we should mark its offset as the last column. // So that we can use origin column offset to get value from row. @@ -453,3 +453,8 @@ func (d *ddl) onModifyColumn(t *meta.Meta, job *model.Job) error { addTableHistoryInfo(job, ver, tblInfo) return nil } + +func allocateColumnID(tblInfo *model.TableInfo) int64 { + tblInfo.MaxColumnID++ + return tblInfo.MaxColumnID +} diff --git a/ddl/column_test.go b/ddl/column_test.go index 6a89b1e46e680..e11333ddb6f62 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -65,11 +65,7 @@ func testCreateColumn(c *C, ctx context.Context, d *ddl, dbInfo *model.DBInfo, t Offset: len(tblInfo.Columns), DefaultValue: defaultValue, } - - var err error - col.ID, err = d.genGlobalID() - c.Assert(err, IsNil) - + col.ID = allocateColumnID(tblInfo) col.FieldType = *types.NewFieldType(mysql.TypeLong) job := &model.Job{ @@ -79,7 +75,7 @@ func testCreateColumn(c *C, ctx context.Context, d *ddl, dbInfo *model.DBInfo, t Args: []interface{}{col, pos, 0}, } - err = d.doDDLJob(ctx, job) + err := d.doDDLJob(ctx, job) c.Assert(err, IsNil) v := getSchemaVer(c, ctx) checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) diff --git a/ddl/ddl.go b/ddl/ddl.go index 5122b9f0a2969..72f81087540f4 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -466,12 +466,6 @@ func (d *ddl) buildColumnAndConstraint(ctx context.Context, offset int, if err != nil { return nil, nil, errors.Trace(err) } - - col.ID, err = d.genGlobalID() - if err != nil { - return nil, nil, errors.Trace(err) - } - return col, cts, nil } @@ -757,6 +751,7 @@ func (d *ddl) buildTableInfo(tableName model.CIStr, cols []*table.Column, constr return nil, errors.Trace(err) } for _, v := range cols { + v.ID = allocateColumnID(tbInfo) tbInfo.Columns = append(tbInfo.Columns, v.ToInfo()) } for _, constr := range constraints { @@ -839,10 +834,7 @@ func (d *ddl) buildTableInfo(tableName model.CIStr, cols []*table.Column, constr // Use btree as default index type. idxInfo.Tp = model.IndexTypeBtree } - idxInfo.ID, err = d.genGlobalID() - if err != nil { - return nil, errors.Trace(err) - } + idxInfo.ID = allocateIndexID(tbInfo) tbInfo.Indices = append(tbInfo.Indices, idxInfo) } return @@ -1275,22 +1267,16 @@ func (d *ddl) CreateIndex(ctx context.Context, ti ast.Ident, unique bool, indexN if err != nil { return errors.Trace(infoschema.ErrTableNotExists) } - indexID, err := d.genGlobalID() - if err != nil { - return errors.Trace(err) - } - // Deal with anonymous index. if len(indexName.L) == 0 { indexName = getAnonymousIndex(t, idxColNames[0].Column.Name) } - job := &model.Job{ SchemaID: schema.ID, TableID: t.Meta().ID, Type: model.ActionAddIndex, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{unique, indexName, indexID, idxColNames}, + Args: []interface{}{unique, indexName, idxColNames}, } err = d.doDDLJob(ctx, job) @@ -1299,13 +1285,7 @@ func (d *ddl) CreateIndex(ctx context.Context, ti ast.Ident, unique bool, indexN } func (d *ddl) buildFKInfo(fkName model.CIStr, keys []*ast.IndexColName, refer *ast.ReferenceDef) (*model.FKInfo, error) { - fkID, err := d.genGlobalID() - if err != nil { - return nil, errors.Trace(err) - } - var fkInfo model.FKInfo - fkInfo.ID = fkID fkInfo.Name = fkName fkInfo.RefTable = refer.Table.Name diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index f0316450dc98a..2f25a1c630177 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -216,9 +216,7 @@ func (s *testDDLSuite) TestColumnError(c *C) { Offset: len(tblInfo.Columns), DefaultValue: 0, } - var err error - col.ID, err = d.genGlobalID() - c.Assert(err, IsNil) + col.ID = allocateColumnID(tblInfo) col.FieldType = *types.NewFieldType(mysql.TypeLong) pos := &ast.ColumnPosition{Tp: ast.ColumnPositionAfter, RelativeColumn: &ast.ColumnName{Name: model.NewCIStr("c5")}} diff --git a/ddl/foreign_key.go b/ddl/foreign_key.go index ef297c3547f80..66b7317de315e 100644 --- a/ddl/foreign_key.go +++ b/ddl/foreign_key.go @@ -33,8 +33,8 @@ func (d *ddl) onCreateForeignKey(t *meta.Meta, job *model.Job) error { job.State = model.JobCancelled return errors.Trace(err) } + fkInfo.ID = allocateIndexID(tblInfo) tblInfo.ForeignKeys = append(tblInfo.ForeignKeys, &fkInfo) - ver, err := updateSchemaVersion(t, job) if err != nil { return errors.Trace(err) diff --git a/ddl/foreign_key_test.go b/ddl/foreign_key_test.go index 066a0d8926baa..3d3561f205b83 100644 --- a/ddl/foreign_key_test.go +++ b/ddl/foreign_key_test.go @@ -57,10 +57,7 @@ func (s *testForeighKeySuite) testCreateForeignKey(c *C, tblInfo *model.TableInf RefKeys[i] = model.NewCIStr(key) } - fkID, err := s.d.genGlobalID() - c.Assert(err, IsNil) fkInfo := &model.FKInfo{ - ID: fkID, Name: FKName, RefTable: RefTable, RefCols: RefKeys, @@ -76,7 +73,7 @@ func (s *testForeighKeySuite) testCreateForeignKey(c *C, tblInfo *model.TableInf Type: model.ActionAddForeignKey, Args: []interface{}{fkInfo}, } - err = s.d.doDDLJob(s.ctx, job) + err := s.d.doDDLJob(s.ctx, job) c.Assert(err, IsNil) return job } diff --git a/ddl/index.go b/ddl/index.go index 2a9045033eafe..07029a96f6184 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -34,7 +34,7 @@ import ( const maxPrefixLength = 767 -func buildIndexInfo(tblInfo *model.TableInfo, unique bool, indexName model.CIStr, indexID int64, +func buildIndexInfo(tblInfo *model.TableInfo, unique bool, indexName model.CIStr, idxColNames []*ast.IndexColName) (*model.IndexInfo, error) { // build offsets idxColumns := make([]*model.IndexColumn, 0, len(idxColNames)) @@ -68,7 +68,6 @@ func buildIndexInfo(tblInfo *model.TableInfo, unique bool, indexName model.CIStr } // create index info idxInfo := &model.IndexInfo{ - ID: indexID, Name: indexName, Columns: idxColumns, Unique: unique, @@ -130,10 +129,9 @@ func (d *ddl) onCreateIndex(t *meta.Meta, job *model.Job) error { var ( unique bool indexName model.CIStr - indexID int64 idxColNames []*ast.IndexColName ) - err = job.DecodeArgs(&unique, &indexName, &indexID, &idxColNames) + err = job.DecodeArgs(&unique, &indexName, &idxColNames) if err != nil { job.State = model.JobCancelled return errors.Trace(err) @@ -153,11 +151,12 @@ func (d *ddl) onCreateIndex(t *meta.Meta, job *model.Job) error { } if indexInfo == nil { - indexInfo, err = buildIndexInfo(tblInfo, unique, indexName, indexID, idxColNames) + indexInfo, err = buildIndexInfo(tblInfo, unique, indexName, idxColNames) if err != nil { job.State = model.JobCancelled return errors.Trace(err) } + indexInfo.ID = allocateIndexID(tblInfo) tblInfo.Indices = append(tblInfo.Indices, indexInfo) } @@ -518,3 +517,8 @@ func (d *ddl) dropTableIndex(indexInfo *model.IndexInfo, job *model.Job) error { _, _, err := d.delKeysWithStartKey(startKey, startKey, ddlJobFlag, job, deleteAll) return errors.Trace(err) } + +func allocateIndexID(tblInfo *model.TableInfo) int64 { + tblInfo.MaxIndexID++ + return tblInfo.MaxIndexID +} diff --git a/ddl/index_test.go b/ddl/index_test.go index f7b4530964371..b0a9c5f42f5c6 100644 --- a/ddl/index_test.go +++ b/ddl/index_test.go @@ -53,16 +53,14 @@ func (s *testIndexSuite) TearDownSuite(c *C) { } func testCreateIndex(c *C, ctx context.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bool, indexName string, colName string) *model.Job { - id, err := d.genGlobalID() - c.Assert(err, IsNil) job := &model.Job{ SchemaID: dbInfo.ID, TableID: tblInfo.ID, Type: model.ActionAddIndex, - Args: []interface{}{unique, model.NewCIStr(indexName), id, []*ast.IndexColName{{Column: &ast.ColumnName{Name: model.NewCIStr(colName)}, Length: types.UnspecifiedLength}}}, + Args: []interface{}{unique, model.NewCIStr(indexName), []*ast.IndexColName{{Column: &ast.ColumnName{Name: model.NewCIStr(colName)}, Length: types.UnspecifiedLength}}}, } - err = d.doDDLJob(ctx, job) + err := d.doDDLJob(ctx, job) c.Assert(err, IsNil) v := getSchemaVer(c, ctx) checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) diff --git a/ddl/table_test.go b/ddl/table_test.go index 90a4e37386674..83e6e2b4f8385 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -58,9 +58,7 @@ func testTableInfo(c *C, d *ddl, name string, num int) *model.TableInfo { } col.FieldType = *types.NewFieldType(mysql.TypeLong) - - col.ID, err = d.genGlobalID() - c.Assert(err, IsNil) + col.ID = allocateColumnID(tblInfo) cols[i] = col } diff --git a/model/model.go b/model/model.go index 3c3cdf6c131d5..b4a37906bf233 100644 --- a/model/model.go +++ b/model/model.go @@ -87,6 +87,8 @@ type TableInfo struct { PKIsHandle bool `json:"pk_is_handle"` Comment string `json:"comment"` AutoIncID int64 `json:"auto_inc_id"` + MaxColumnID int64 `json:"max_col_id"` + MaxIndexID int64 `json:"max_idx_id"` } // Clone clones TableInfo.