Skip to content

Commit

Permalink
Merge branch 'release-2.0' of https://github.com/pingcap/tidb into 71…
Browse files Browse the repository at this point in the history
…17-2.0
  • Loading branch information
crazycs520 committed Feb 22, 2019
2 parents 5fcd802 + 7aefd50 commit 1be3cfc
Show file tree
Hide file tree
Showing 22 changed files with 692 additions and 145 deletions.
20 changes: 17 additions & 3 deletions ddl/ddl_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,13 +244,27 @@ func buildColumnAndConstraint(ctx sessionctx.Context, offset int,

// checkColumnCantHaveDefaultValue checks the column can have value as default or not.
// Now, TEXT/BLOB/JSON can't have not null value as default.
func checkColumnCantHaveDefaultValue(col *table.Column, value interface{}) (err error) {
func checkColumnCantHaveDefaultValue(ctx sessionctx.Context, col *table.Column, value interface{}) (err error) {
if value != nil && (col.Tp == mysql.TypeJSON ||
col.Tp == mysql.TypeTinyBlob || col.Tp == mysql.TypeMediumBlob ||
col.Tp == mysql.TypeLongBlob || col.Tp == mysql.TypeBlob) {
// TEXT/BLOB/JSON can't have not null default values.
return errBlobCantHaveDefault.GenByArgs(col.Name.O)
}
if value != nil && ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() &&
ctx.GetSessionVars().SQLMode.HasStrictMode() && types.IsTypeTime(col.Tp) {
if vv, ok := value.(string); ok {
t, err := types.ParseTime(nil, vv, col.Tp, 6)
if err != nil {
// Ignores ParseTime error, because ParseTime error has been dealt in getDefaultValue
// Some builtin function like CURRENT_TIMESTAMP() will cause ParseTime error.
return nil
}
if t.Time == types.ZeroTime {
return types.ErrInvalidDefault.GenByArgs(col.Name.O)
}
}
}
return nil
}

Expand Down Expand Up @@ -314,7 +328,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef) (
if err != nil {
return nil, nil, ErrColumnBadNull.Gen("invalid default value - %s", err)
}
if err = checkColumnCantHaveDefaultValue(col, value); err != nil {
if err = checkColumnCantHaveDefaultValue(ctx, col, value); err != nil {
return nil, nil, errors.Trace(err)
}
col.DefaultValue = value
Expand Down Expand Up @@ -1293,7 +1307,7 @@ func setDefaultAndComment(ctx sessionctx.Context, col *table.Column, options []*
if err != nil {
return ErrColumnBadNull.Gen("invalid default value - %s", err)
}
if err = checkColumnCantHaveDefaultValue(col, value); err != nil {
if err = checkColumnCantHaveDefaultValue(ctx, col, value); err != nil {
return errors.Trace(err)
}
col.DefaultValue = value
Expand Down
2 changes: 1 addition & 1 deletion ddl/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*i
w.distinctCheckFlags = append(w.distinctCheckFlags, distinct)
}

batchVals, err := kv.BatchGetValues(txn, w.batchCheckKeys)
batchVals, err := txn.BatchGet(w.batchCheckKeys)
if err != nil {
return errors.Trace(err)
}
Expand Down
29 changes: 29 additions & 0 deletions ddl/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package ddl_test

import (
"fmt"
"github.com/pingcap/tidb/types"

"github.com/juju/errors"
. "github.com/pingcap/check"
Expand Down Expand Up @@ -141,3 +142,31 @@ func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) {
dom, err := session.BootstrapSession(store)
return store, dom, errors.Trace(err)
}

func (s *testIntegrationSuite) TestNoZeroDateMode(c *C) {
tk := testkit.NewTestKit(c, s.store)

defer tk.MustExec("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';")

tk.MustExec("use test;")
tk.MustExec("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION';")

_, err := tk.Exec("create table test_zero_date(agent_start_time date NOT NULL DEFAULT '0000-00-00')")
c.Assert(err, NotNil)
c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err))

_, err = tk.Exec("create table test_zero_date(agent_start_time datetime NOT NULL DEFAULT '0000-00-00 00:00:00')")
c.Assert(err, NotNil)
c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err))

_, err = tk.Exec("create table test_zero_date(agent_start_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00')")
c.Assert(err, NotNil)
c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err))

_, err = tk.Exec("create table test_zero_date(a timestamp default '0000-00-00 00')")
c.Assert(err, NotNil)

_, err = tk.Exec("create table test_zero_date(a timestamp default 0)")
c.Assert(err, NotNil)
c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err))
}
4 changes: 2 additions & 2 deletions executor/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ func (e *RecoverIndexExec) batchMarkDup(txn kv.Transaction, rows []recoverRows)
distinctFlags[i] = distinct
}

values, err := kv.BatchGetValues(txn, e.batchKeys)
values, err := txn.BatchGet(e.batchKeys)
if err != nil {
return errors.Trace(err)
}
Expand Down Expand Up @@ -495,7 +495,7 @@ func (e *CleanupIndexExec) batchGetRecord(txn kv.Transaction) (map[string][]byte
for handle := range e.idxValues {
e.batchKeys = append(e.batchKeys, e.table.RecordKey(handle))
}
values, err := kv.BatchGetValues(txn, e.batchKeys)
values, err := txn.BatchGet(e.batchKeys)
if err != nil {
return nil, errors.Trace(err)
}
Expand Down
4 changes: 2 additions & 2 deletions executor/write.go
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,7 @@ func batchGetOldValues(ctx sessionctx.Context, t table.Table, handles []int64) (
if err != nil {
return nil, errors.Trace(err)
}
values, err := kv.BatchGetValues(txn, batchKeys)
values, err := txn.BatchGet(batchKeys)
if err != nil {
return nil, errors.Trace(err)
}
Expand Down Expand Up @@ -1070,7 +1070,7 @@ func batchGetInsertKeys(ctx sessionctx.Context, t table.Table, newRows [][]types
if err != nil {
return nil, nil, errors.Trace(err)
}
values, err := kv.BatchGetValues(txn, batchKeys)
values, err := txn.BatchGet(batchKeys)
if err != nil {
return nil, nil, errors.Trace(err)
}
Expand Down
11 changes: 11 additions & 0 deletions executor/write_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,17 @@ func (s *testSuite) TestInsert(c *C) {
tk.MustQuery("select * from t").Check(testkit.Rows("0 0", "0 0", "0 0", "1.1 1.1"))
}

func (s *testSuite) TestMultiBatch(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk.MustExec("create table t0 (i int)")
tk.MustExec("insert into t0 values (1), (1)")
tk.MustExec("create table t (i int unique key)")
tk.MustExec("set @@tidb_dml_batch_size = 1")
tk.MustExec("insert ignore into t select * from t0")
tk.MustExec("admin check table t")
}

func (s *testSuite) TestInsertAutoInc(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
Expand Down
Loading

0 comments on commit 1be3cfc

Please sign in to comment.