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 (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 }