// Add create table options into TableInfo. func (d *ddl) handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo, schemaID int64) { for _, op := range options { switch op.Tp { case ast.TableOptionAutoIncrement: tbInfo.AutoIncID = int64(op.UintValue) case ast.TableOptionComment: tbInfo.Comment = op.StrValue case ast.TableOptionCharset: tbInfo.Charset = op.StrValue case ast.TableOptionCollate: tbInfo.Charset = op.StrValue } } }
func (d *ddl) addColumn(tblInfo *model.TableInfo, colInfo *model.ColumnInfo, pos *ColumnPosition) (*model.ColumnInfo, int, error) { // Check column name duplicate. cols := tblInfo.Columns position := len(cols) // Get column position. if pos.Type == ColumnPositionFirst { position = 0 } else if pos.Type == ColumnPositionAfter { c := findCol(cols, pos.RelativeColumn) if c == nil { return nil, 0, errors.Errorf("No such column: %v", pos.RelativeColumn) } // Insert position is after the mentioned column. position = c.Offset + 1 } 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. colInfo.Offset = len(cols) // Insert col into the right place of the column list. newCols := make([]*model.ColumnInfo, 0, len(cols)+1) newCols = append(newCols, cols[:position]...) newCols = append(newCols, colInfo) newCols = append(newCols, cols[position:]...) tblInfo.Columns = newCols return colInfo, position, nil }
func testCreateTable(c *C, ctx context.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { job := &model.Job{ SchemaID: dbInfo.ID, TableID: tblInfo.ID, Type: model.ActionCreateTable, Args: []interface{}{tblInfo}, } err := d.doDDLJob(ctx, job) c.Assert(err, IsNil) v := getSchemaVer(c, ctx) tblInfo.State = model.StatePublic checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) tblInfo.State = model.StateNone return job }
func (d *ddl) createColumnInfo(tblInfo *model.TableInfo, colInfo *model.ColumnInfo, pos *ast.ColumnPosition) (*model.ColumnInfo, int, error) { // Check column name duplicate. cols := tblInfo.Columns position := len(cols) // Get column position. if pos.Tp == ast.ColumnPositionFirst { position = 0 } else if pos.Tp == ast.ColumnPositionAfter { c := findCol(cols, pos.RelativeColumn.Name.L) if c == nil { return nil, 0, infoschema.ErrColumnNotExists.GenByArgs(pos.RelativeColumn, tblInfo.Name) } // 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. colInfo.Offset = len(cols) // Insert col into the right place of the column list. newCols := make([]*model.ColumnInfo, 0, len(cols)+1) newCols = append(newCols, cols[:position]...) newCols = append(newCols, colInfo) newCols = append(newCols, cols[position:]...) tblInfo.Columns = newCols return colInfo, position, nil }
// If create table with auto_increment option, we should rebase tableAutoIncID value. func (d *ddl) handleAutoIncID(tbInfo *model.TableInfo, schemaID int64) error { alloc := autoid.NewAllocator(d.store, schemaID) tbInfo.State = model.StatePublic tb, err := table.TableFromMeta(alloc, tbInfo) if err != nil { return errors.Trace(err) } // The operation of the minus 1 to make sure that the current value doesn't be used, // the next Alloc operation will get this value. // Its behavior is consistent with MySQL. if err = tb.RebaseAutoID(tbInfo.AutoIncID-1, false); err != nil { return errors.Trace(err) } return nil }
func testTruncateTable(c *C, ctx context.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { newTableID, err := d.genGlobalID() c.Assert(err, IsNil) job := &model.Job{ SchemaID: dbInfo.ID, TableID: tblInfo.ID, Type: model.ActionTruncateTable, Args: []interface{}{newTableID}, } err = d.doDDLJob(ctx, job) c.Assert(err, IsNil) v := getSchemaVer(c, ctx) tblInfo.ID = newTableID checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) return job }
func (d *ddl) handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo, schemaID int64) error { for _, op := range options { if op.Tp == ast.TableOptionAutoIncrement { alloc := autoid.NewAllocator(d.store, schemaID) tbInfo.State = model.StatePublic tb, err := table.TableFromMeta(alloc, tbInfo) if err != nil { return errors.Trace(err) } // The operation of the minus 1 to make sure that the current value doesn't be used, // the next Alloc operation will get this value. // Its behavior is consistent with MySQL. if err = tb.RebaseAutoID(int64(op.UintValue-1), false); err != nil { return errors.Trace(err) } } } return nil }