From 2fcd8982fca44301fed9ccde1f8538b9f69b5895 Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Wed, 4 Nov 2015 10:28:29 +0800 Subject: [PATCH] *: address comments. --- ddl/column.go | 4 ++-- ddl/ddl.go | 17 +++++++++++++++++ stmt/stmts/insert.go | 8 ++++---- stmt/stmts/replace.go | 2 +- stmt/stmts/stmt_helper_test.go | 2 +- table/table.go | 5 +++++ table/tables/tables.go | 9 ++++----- 7 files changed, 34 insertions(+), 13 deletions(-) diff --git a/ddl/column.go b/ddl/column.go index 1883824ade..cbcf435456 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -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) } diff --git a/ddl/ddl.go b/ddl/ddl.go index e37523f163..bdadbccda5 100644 --- a/ddl/ddl.go +++ b/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 { diff --git a/stmt/stmts/insert.go b/stmt/stmts/insert.go index f54853ee0e..9f3ecabb20 100644 --- a/stmt/stmts/insert.go +++ b/stmt/stmts/insert.go @@ -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) } diff --git a/stmt/stmts/replace.go b/stmt/stmts/replace.go index ce0e46ba69..edd86b1dcf 100644 --- a/stmt/stmts/replace.go +++ b/stmt/stmts/replace.go @@ -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) } diff --git a/stmt/stmts/stmt_helper_test.go b/stmt/stmts/stmt_helper_test.go index 47805d7bd5..a9d50737d2 100644 --- a/stmt/stmts/stmt_helper_test.go +++ b/stmt/stmts/stmt_helper_test.go @@ -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) diff --git a/table/table.go b/table/table.go index 52bb9533b2..bb64a36ae4 100644 --- a/table/table.go +++ b/table/table.go @@ -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. diff --git a/table/tables/tables.go b/table/tables/tables.go index 2e93d8c2da..17f8f97b02 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -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)