*: address comments.

This commit is contained in:
qiuyesuifeng
2015-11-04 10:28:29 +08:00
parent ba04f4457f
commit 2fcd8982fc
7 changed files with 34 additions and 13 deletions

View File

@ -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)
}

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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.

View File

@ -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)