*: address comments.
This commit is contained in:
@ -244,12 +244,12 @@ func (d *ddl) backfillColumnData(t table.Table, columnInfo *model.ColumnInfo, ha
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
value, _, err := tables.EvalColumnDefaultValue(nil, columnInfo)
|
||||
value, _, err := tables.GetColDefaultValue(nil, columnInfo)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
err = t.(*tables.Table).SetColValue(txn, backfillKey, value)
|
||||
err = t.SetColValue(txn, backfillKey, value)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
17
ddl/ddl.go
17
ddl/ddl.go
@ -454,8 +454,25 @@ func (d *ddl) AlterTable(ctx context.Context, ident table.Ident, specs []*AlterS
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkColumnConstraint(constraints []*coldef.ConstraintOpt) error {
|
||||
for _, constraint := range constraints {
|
||||
switch constraint.Tp {
|
||||
case coldef.ConstrAutoIncrement, coldef.ConstrForeignKey, coldef.ConstrPrimaryKey, coldef.ConstrUniq, coldef.ConstrUniqKey:
|
||||
return errors.Errorf("unsupported add column constraint - %s", constraint)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddColumn will add a new column to the table.
|
||||
func (d *ddl) AddColumn(ctx context.Context, ti table.Ident, spec *AlterSpecification) error {
|
||||
// Check whether the added column constraints are supported.
|
||||
err := checkColumnConstraint(spec.Column.Constraints)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
is := d.infoHandle.Get()
|
||||
schema, ok := is.SchemaByName(ti.Schema)
|
||||
if !ok {
|
||||
|
||||
@ -195,10 +195,10 @@ func (s *InsertValues) getColumns(tableCols []*column.Col) ([]*column.Col, error
|
||||
return cols, nil
|
||||
}
|
||||
|
||||
func (s *InsertValues) evalColumnDefaultValues(ctx context.Context, cols []*column.Col) (map[interface{}]interface{}, error) {
|
||||
func (s *InsertValues) getColumnDefaultValues(ctx context.Context, cols []*column.Col) (map[interface{}]interface{}, error) {
|
||||
defaultValMap := map[interface{}]interface{}{}
|
||||
for _, col := range cols {
|
||||
if value, ok, err := tables.EvalColumnDefaultValue(ctx, &col.ColumnInfo); ok {
|
||||
if value, ok, err := tables.GetColDefaultValue(ctx, &col.ColumnInfo); ok {
|
||||
if err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
}
|
||||
@ -249,7 +249,7 @@ func (s *InsertIntoStmt) Exec(ctx context.Context) (_ rset.Recordset, err error)
|
||||
return nil, errors.Trace(err)
|
||||
}
|
||||
|
||||
defaultValMap, err := s.evalColumnDefaultValues(ctx, t.Cols())
|
||||
defaultValMap, err := s.getColumnDefaultValues(ctx, t.Cols())
|
||||
if err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
}
|
||||
@ -408,7 +408,7 @@ func (s *InsertValues) initDefaultValues(ctx context.Context, t table.Table, row
|
||||
variable.GetSessionVars(ctx).SetLastInsertID(uint64(id))
|
||||
} else {
|
||||
var value interface{}
|
||||
value, _, err = tables.EvalColumnDefaultValue(ctx, &c.ColumnInfo)
|
||||
value, _, err = tables.GetColDefaultValue(ctx, &c.ColumnInfo)
|
||||
if err != nil {
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
@ -78,7 +78,7 @@ func (s *ReplaceIntoStmt) Exec(ctx context.Context) (_ rset.Recordset, err error
|
||||
return nil, errors.Trace(err)
|
||||
}
|
||||
|
||||
evalMap, err := s.evalColumnDefaultValues(ctx, t.Cols())
|
||||
evalMap, err := s.getColumnDefaultValues(ctx, t.Cols())
|
||||
if err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ func (f *mockFormatter) Format(format string, args ...interface{}) (n int, errno
|
||||
return f.Write([]byte(data))
|
||||
}
|
||||
|
||||
func (s *testStmtSuite) TestEvalColumnDefaultValue(c *C) {
|
||||
func (s *testStmtSuite) TestGetColDefaultValue(c *C) {
|
||||
testSQL := `drop table if exists helper_test;
|
||||
create table helper_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int not null, c2 timestamp, c3 int default 1);`
|
||||
mustExec(c, s.testDB, testSQL)
|
||||
|
||||
@ -22,6 +22,7 @@ import (
|
||||
|
||||
"github.com/pingcap/tidb/column"
|
||||
"github.com/pingcap/tidb/context"
|
||||
"github.com/pingcap/tidb/kv"
|
||||
"github.com/pingcap/tidb/meta/autoid"
|
||||
"github.com/pingcap/tidb/model"
|
||||
"github.com/pingcap/tidb/sessionctx/db"
|
||||
@ -107,6 +108,10 @@ type Table interface {
|
||||
// LockRow locks a row.
|
||||
// If update is true, set row lock key to current txn.
|
||||
LockRow(ctx context.Context, h int64, update bool) error
|
||||
|
||||
// SetColValue sets the column value.
|
||||
// If the column untouched, we don't need to do this.
|
||||
SetColValue(txn kv.Transaction, key []byte, data interface{}) error
|
||||
}
|
||||
|
||||
// TableFromMeta builds a table.Table from *model.TableInfo.
|
||||
|
||||
@ -310,8 +310,7 @@ func (t *Table) setOnUpdateData(ctx context.Context, touched map[int]bool, data
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetColValue sets the column value.
|
||||
// If the column untouched, we don't need to do this.
|
||||
// SetColValue implements table.Table SetColValue interface.
|
||||
func (t *Table) SetColValue(txn kv.Transaction, key []byte, data interface{}) error {
|
||||
v, err := t.EncodeValue(data)
|
||||
if err != nil {
|
||||
@ -426,7 +425,7 @@ func (t *Table) AddRecord(ctx context.Context, r []interface{}) (recordID int64,
|
||||
var value interface{}
|
||||
key := t.RecordKey(recordID, col)
|
||||
if col.State == model.StateWriteOnly {
|
||||
value, _, err = EvalColumnDefaultValue(ctx, &col.ColumnInfo)
|
||||
value, _, err = GetColDefaultValue(ctx, &col.ColumnInfo)
|
||||
if err != nil {
|
||||
return 0, errors.Trace(err)
|
||||
}
|
||||
@ -668,8 +667,8 @@ func (t *Table) AllocAutoID() (int64, error) {
|
||||
return t.alloc.Alloc(t.ID)
|
||||
}
|
||||
|
||||
// EvalColumnDefaultValue evals default value of the column.
|
||||
func EvalColumnDefaultValue(ctx context.Context, col *model.ColumnInfo) (interface{}, bool, error) {
|
||||
// GetColDefaultValue evals default value of the column.
|
||||
func GetColDefaultValue(ctx context.Context, col *model.ColumnInfo) (interface{}, bool, error) {
|
||||
// Check no default value flag.
|
||||
if mysql.HasNoDefaultValueFlag(col.Flag) && col.Tp != mysql.TypeEnum {
|
||||
return nil, false, errors.Errorf("Field '%s' doesn't have a default value", col.Name)
|
||||
|
||||
Reference in New Issue
Block a user