// Copyright 2018 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // See the License for the specific language governing permissions and // limitations under the License. package ddl_test import ( "fmt" "github.com/hanchuanchuan/goInception/ddl" "github.com/hanchuanchuan/goInception/domain" "github.com/hanchuanchuan/goInception/infoschema" "github.com/hanchuanchuan/goInception/kv" "github.com/hanchuanchuan/goInception/session" "github.com/hanchuanchuan/goInception/sessionctx" "github.com/hanchuanchuan/goInception/sessionctx/stmtctx" "github.com/hanchuanchuan/goInception/store/mockstore" "github.com/hanchuanchuan/goInception/terror" "github.com/hanchuanchuan/goInception/types" "github.com/hanchuanchuan/goInception/util/mock" "github.com/hanchuanchuan/goInception/util/testkit" "github.com/hanchuanchuan/goInception/util/testleak" . "github.com/pingcap/check" "github.com/pingcap/errors" ) var _ = Suite(&testIntegrationSuite{}) type testIntegrationSuite struct { store kv.Storage dom *domain.Domain ctx sessionctx.Context } func (s *testIntegrationSuite) TearDownTest(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") r := tk.MustQuery("show tables") for _, tb := range r.Rows() { tableName := tb[0] tk.MustExec(fmt.Sprintf("drop table %v", tableName)) } } func (s *testIntegrationSuite) SetUpSuite(c *C) { var err error testleak.BeforeTest() s.store, s.dom, err = newStoreWithBootstrap() c.Assert(err, IsNil) s.ctx = mock.NewContext() } func (s *testIntegrationSuite) TearDownSuite(c *C) { s.dom.Close() s.store.Close() testleak.AfterTest(c)() } func (s *testIntegrationSuite) TestInvalidDefault(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test;") _, err := tk.Exec("create table t(c1 decimal default 1.7976931348623157E308)") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err)) _, err = tk.Exec("create table t( c1 varchar(2) default 'TiDB');") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, types.ErrInvalidDefault), IsTrue, Commentf("err %v", err)) } // for issue #3848 func (s *testIntegrationSuite) TestInvalidNameWhenCreateTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test;") _, err := tk.Exec("create table t(xxx.t.a bigint)") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, ddl.ErrWrongDBName), IsTrue, Commentf("err %v", err)) _, err = tk.Exec("create table t(test.tttt.a bigint)") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, ddl.ErrWrongTableName), IsTrue, Commentf("err %v", err)) _, err = tk.Exec("create table t(t.tttt.a bigint)") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, ddl.ErrWrongDBName), IsTrue, Commentf("err %v", err)) } // for issue #6879 func (s *testIntegrationSuite) TestCreateTableIfNotExists(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test;") tk.MustExec("create table t1(a bigint)") tk.MustExec("create table t(a bigint)") // Test duplicate create-table with `LIKE` clause tk.MustExec("create table if not exists t like t1;") warnings := tk.Se.GetSessionVars().StmtCtx.GetWarnings() c.Assert(len(warnings), GreaterEqual, 1) lastWarn := warnings[len(warnings)-1] c.Assert(terror.ErrorEqual(infoschema.ErrTableExists, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) c.Assert(lastWarn.Level, Equals, stmtctx.WarnLevelNote) // Test duplicate create-table without `LIKE` clause tk.MustExec("create table if not exists t(b bigint, c varchar(60));") warnings = tk.Se.GetSessionVars().StmtCtx.GetWarnings() c.Assert(len(warnings), GreaterEqual, 1) lastWarn = warnings[len(warnings)-1] c.Assert(terror.ErrorEqual(infoschema.ErrTableExists, lastWarn.Err), IsTrue) } func (s *testIntegrationSuite) TestUniquekeyNullValue(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test") tk.MustExec("create table t(a int primary key, b varchar(255))") tk.MustExec("insert into t values(1, NULL)") tk.MustExec("insert into t values(2, NULL)") tk.MustExec("alter table t add unique index b(b);") res := tk.MustQuery("select count(*) from t use index(b);") res.Check(testkit.Rows("2")) tk.MustExec("admin check table t") tk.MustExec("admin check index t b") } func (s *testIntegrationSuite) TestEndIncluded(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test") tk.MustExec("create table t(a int, b int)") for i := 0; i < ddl.DefaultTaskHandleCnt+1; i++ { tk.MustExec("insert into t values(1, 1)") } tk.MustExec("alter table t add index b(b);") tk.MustExec("admin check index t b") tk.MustExec("admin check table t") } func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { store, err := mockstore.NewMockTikvStore() if err != nil { return nil, nil, errors.Trace(err) } session.SetSchemaLease(0) session.SetStatsLease(0) dom, err := session.BootstrapSession(store) return store, dom, errors.Trace(err) }