// NewDomain creates a new domain. Should not create multiple domains for the same store. func NewDomain(store kv.Storage, lease time.Duration) (d *Domain, err error) { d = &Domain{ store: store, SchemaValidity: &schemaValidityInfo{}, exit: make(chan struct{}), } d.infoHandle, err = infoschema.NewHandle(d.store) if err != nil { return nil, errors.Trace(err) } d.ddl = ddl.NewDDL(d.store, d.infoHandle, &ddlCallback{do: d}, lease) if err = d.Reload(); err != nil { return nil, errors.Trace(err) } d.SchemaValidity.SetExpireInfo(false, 0) variable.RegisterStatistics(d) // Only when the store is local that the lease value is 0. // If the store is local, it doesn't need loadSchemaInLoop and checkValidityInLoop. if lease > 0 { go d.checkValidityInLoop(lease) } // Local store needs to get the change information for every DDL state in each session. go d.loadSchemaInLoop(lease) return d, nil }
func (p *testShowSuit) SetUpSuite(c *C) { nc := mock.NewContext() p.ctx = nc variable.BindSessionVars(p.ctx) variable.BindGlobalVarAccessor(p.ctx, nc) variable.RegisterStatistics(p.ms) p.dbName = "testshowplan" p.store = newStore(c, p.dbName) p.txn, _ = p.store.Begin() se := newSession(c, p.store, p.dbName) p.createDBSQL = fmt.Sprintf("create database if not exists %s;", p.dbName) p.dropDBSQL = fmt.Sprintf("drop database if exists %s;", p.dbName) p.useDBSQL = fmt.Sprintf("use %s;", p.dbName) p.createTableSQL = `CREATE TABLE test(id INT NOT NULL DEFAULT 1, name varchar(255), PRIMARY KEY(id));` mustExecSQL(c, se, p.createDBSQL) mustExecSQL(c, se, p.useDBSQL) mustExecSQL(c, se, p.createTableSQL) p.createSystemDBSQL = fmt.Sprintf("create database if not exists %s;", mysql.SystemDB) p.createUserTableSQL = tidb.CreateUserTable p.createDBPrivTableSQL = tidb.CreateDBPrivTable p.createTablePrivTableSQL = tidb.CreateTablePrivTable p.createColumnPrivTableSQL = tidb.CreateColumnPrivTable mustExecSQL(c, se, p.createSystemDBSQL) mustExecSQL(c, se, p.createUserTableSQL) mustExecSQL(c, se, p.createDBPrivTableSQL) mustExecSQL(c, se, p.createTablePrivTableSQL) mustExecSQL(c, se, p.createColumnPrivTableSQL) }
func (s *testSuite) TestShow(c *C) { defer testleak.AfterTest(c)() tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") testSQL := `drop table if exists show_test` tk.MustExec(testSQL) testSQL = `create table show_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int comment "c1_comment", c2 int, c3 int default 1) ENGINE=InnoDB AUTO_INCREMENT=28934 DEFAULT CHARSET=utf8 COMMENT "table_comment";` tk.MustExec(testSQL) testSQL = "show columns from show_test;" result := tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 4) testSQL = "show create table show_test;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) row := result.Rows()[0] // For issue https://github.com/pingcap/tidb/issues/1061 expectedRow := []interface{}{ "show_test", "CREATE TABLE `show_test` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `c1` int(11) DEFAULT NULL COMMENT 'c1_comment',\n `c2` int(11) DEFAULT NULL,\n `c3` int(11) DEFAULT '1',\n PRIMARY KEY (`id`) \n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=28934 COMMENT='table_comment'"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } testSQL = "SHOW VARIABLES LIKE 'character_set_results';" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) // Test case for index type and comment tk.MustExec(`create table show_index (c int, index cIdx using hash (c) comment "index_comment_for_cIdx");`) testSQL = "SHOW index from show_index;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) expectedRow = []interface{}{ "show_index", int64(1), "cIdx", int64(1), "c", "utf8_bin", int64(0), nil, nil, "YES", "HASH", "", "index_comment_for_cIdx"} row = result.Rows()[0] c.Check(row, HasLen, len(expectedRow)) for i, r := range row { c.Check(r, Equals, expectedRow[i]) } // For show like with escape testSQL = `show tables like 'show\_test'` result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) var ss stats variable.RegisterStatistics(ss) testSQL = "show status like 'character_set_results';" result = tk.MustQuery(testSQL) c.Check(result.Rows(), NotNil) tk.MustQuery("SHOW PROCEDURE STATUS WHERE Db='test'").Check(testkit.Rows()) tk.MustQuery("SHOW TRIGGERS WHERE Trigger ='test'").Check(testkit.Rows()) }
// NewDomain creates a new domain. func NewDomain(store kv.Storage, lease time.Duration) (d *Domain, err error) { d = &Domain{ store: store, leaseCh: make(chan time.Duration, 1), } d.infoHandle = infoschema.NewHandle(d.store) d.ddl = ddl.NewDDL(d.store, d.infoHandle, &ddlCallback{do: d}, lease) d.mustReload() variable.RegisterStatistics(d) go d.loadSchemaInLoop(lease) return d, nil }
func newDDL(store kv.Storage, infoHandle *infoschema.Handle, hook Callback, lease time.Duration) *ddl { if hook == nil { hook = &BaseCallback{} } d := &ddl{ infoHandle: infoHandle, hook: hook, store: store, lease: lease, uuid: uuid.NewV4().String(), jobCh: make(chan struct{}, 1), jobDoneCh: make(chan struct{}, 1), } d.start() variable.RegisterStatistics(d) return d }
// NewDomain creates a new domain. func NewDomain(store kv.Storage, lease time.Duration) (d *Domain, err error) { d = &Domain{store: store} d.infoHandle, err = infoschema.NewHandle(d.store) if err != nil { return nil, errors.Trace(err) } d.ddl = ddl.NewDDL(d.store, d.infoHandle, &ddlCallback{do: d}, lease) d.mustReload() variable.RegisterStatistics(d) // Only when the store is local that the lease value is 0. // If the store is local, it doesn't need loadSchemaInLoop. if lease > 0 { d.leaseCh = make(chan time.Duration, 1) go d.loadSchemaInLoop(lease) } return d, nil }
func (s *testSuite) TestShow(c *C) { defer func() { s.cleanEnv(c) testleak.AfterTest(c)() }() tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") testSQL := `drop table if exists show_test` tk.MustExec(testSQL) testSQL = `create table SHOW_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int comment "c1_comment", c2 int, c3 int default 1) ENGINE=InnoDB AUTO_INCREMENT=28934 DEFAULT CHARSET=utf8 COMMENT "table_comment";` tk.MustExec(testSQL) testSQL = "show columns from show_test;" result := tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 4) testSQL = "show create table show_test;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) row := result.Rows()[0] // For issue https://github.com/pingcap/tidb/issues/1061 expectedRow := []interface{}{ "SHOW_test", "CREATE TABLE `SHOW_test` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `c1` int(11) DEFAULT NULL COMMENT 'c1_comment',\n `c2` int(11) DEFAULT NULL,\n `c3` int(11) DEFAULT '1',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=28934 COMMENT='table_comment'"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } // For issue https://github.com/pingcap/tidb/issues/1918 testSQL = `create table ptest( a int primary key, b double NOT NULL DEFAULT 2.0, c varchar(10) NOT NULL, d time unique, e timestamp NULL );` tk.MustExec(testSQL) testSQL = "show create table ptest;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) row = result.Rows()[0] expectedRow = []interface{}{ "ptest", "CREATE TABLE `ptest` (\n `a` int(11) NOT NULL,\n `b` double NOT NULL DEFAULT '2.0',\n `c` varchar(10) NOT NULL,\n `d` time DEFAULT NULL,\n `e` timestamp NULL DEFAULT NULL,\n PRIMARY KEY (`a`),\n UNIQUE KEY `d` (`d`)\n) ENGINE=InnoDB"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } testSQL = "SHOW VARIABLES LIKE 'character_set_results';" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) // Test case for index type and comment tk.MustExec(`create table show_index (id int, c int, primary key (id), index cIdx using hash (c) comment "index_comment_for_cIdx");`) testSQL = "SHOW index from show_index;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 2) expectedRow = []interface{}{ "show_index", int64(0), "PRIMARY", int64(1), "id", "utf8_bin", int64(0), nil, nil, "", "BTREE", "", ""} row = result.Rows()[0] c.Check(row, HasLen, len(expectedRow)) for i, r := range row { c.Check(r, Equals, expectedRow[i]) } expectedRow = []interface{}{ "show_index", int64(1), "cIdx", int64(1), "c", "utf8_bin", int64(0), nil, nil, "YES", "HASH", "", "index_comment_for_cIdx"} row = result.Rows()[1] c.Check(row, HasLen, len(expectedRow)) for i, r := range row { c.Check(r, Equals, expectedRow[i]) } // For show like with escape testSQL = `show tables like 'show\_test'` result = tk.MustQuery(testSQL) rows := result.Rows() c.Check(rows, HasLen, 1) c.Check(rows[0], DeepEquals, []interface{}{"SHOW_test"}) var ss stats variable.RegisterStatistics(ss) testSQL = "show status like 'character_set_results';" result = tk.MustQuery(testSQL) c.Check(result.Rows(), NotNil) tk.MustQuery("SHOW PROCEDURE STATUS WHERE Db='test'").Check(testkit.Rows()) tk.MustQuery("SHOW TRIGGERS WHERE Trigger ='test'").Check(testkit.Rows()) tk.MustQuery("SHOW processlist;").Check(testkit.Rows()) tk.MustQuery("SHOW EVENTS WHERE Db = 'test'").Check(testkit.Rows()) // Test show create database testSQL = `create database show_test_DB` tk.MustExec(testSQL) testSQL = "show create database show_test_DB;" result = tk.MustQuery(testSQL) c.Check(result.Rows(), HasLen, 1) row = result.Rows()[0] expectedRow = []interface{}{ "show_test_DB", "CREATE DATABASE `show_test_DB` /* !40100 DEFAULT CHARACTER SET utf8 */"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } }