diff --git a/ddl/reorg.go b/ddl/reorg.go index 9f12e4bd78de2..34cd6438b39bf 100755 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -305,9 +305,9 @@ func getColumnsTypes(columns []*model.ColumnInfo) []*types.FieldType { } // buildDescTableScan builds a desc table scan upon tblInfo. -func (d *ddlCtx) buildDescTableScan(ctx context.Context, startTS uint64, tbl table.PhysicalTable, +func (dc *ddlCtx) buildDescTableScan(ctx context.Context, startTS uint64, tbl table.PhysicalTable, handleCols []*model.ColumnInfo, limit uint64) (distsql.SelectResult, error) { - sctx := newContext(d.store) + sctx := newContext(dc.store) dagPB, err := buildDescTableScanDAG(sctx, tbl, handleCols, limit) if err != nil { return nil, errors.Trace(err) @@ -337,7 +337,7 @@ func (d *ddlCtx) buildDescTableScan(ctx context.Context, startTS uint64, tbl tab } // GetTableMaxHandle gets the max handle of a PhysicalTable. -func (d *ddlCtx) GetTableMaxHandle(startTS uint64, tbl table.PhysicalTable) (maxHandle kv.Handle, emptyTable bool, err error) { +func (dc *ddlCtx) GetTableMaxHandle(startTS uint64, tbl table.PhysicalTable) (maxHandle kv.Handle, emptyTable bool, err error) { var handleCols []*model.ColumnInfo tblInfo := tbl.Meta() switch { @@ -360,7 +360,7 @@ func (d *ddlCtx) GetTableMaxHandle(startTS uint64, tbl table.PhysicalTable) (max ctx := context.Background() // build a desc scan of tblInfo, which limit is 1, we can use it to retrieve the last handle of the table. - result, err := d.buildDescTableScan(ctx, startTS, tbl, handleCols, 1) + result, err := dc.buildDescTableScan(ctx, startTS, tbl, handleCols, 1) if err != nil { return nil, false, errors.Trace(err) } @@ -376,7 +376,7 @@ func (d *ddlCtx) GetTableMaxHandle(startTS uint64, tbl table.PhysicalTable) (max // empty table return nil, true, nil } - sessCtx := newContext(d.store) + sessCtx := newContext(dc.store) row := chk.GetRow(0) if tblInfo.IsCommonHandle { maxHandle, err = buildHandleFromChunkRow(sessCtx.GetSessionVars().StmtCtx, row, handleCols) diff --git a/executor/ddl_test.go b/executor/ddl_test.go index c4f0eb3921239..eec049e51f3d1 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -834,6 +834,14 @@ type testAutoRandomSuite struct { *baseTestSuite } +func (s *testAutoRandomSuite) SetUpTest(c *C) { + testutil.ConfigTestUtils.SetupAutoRandomTestConfig() +} + +func (s *testAutoRandomSuite) TearDownTest(c *C) { + testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() +} + func (s *testAutoRandomSuite) TestAutoRandomBitsData(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -848,8 +856,6 @@ func (s *testAutoRandomSuite) TestAutoRandomBitsData(c *C) { return allHds } - testutil.ConfigTestUtils.SetupAutoRandomTestConfig() - defer testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() tk.MustExec("set @@allow_auto_random_explicit_insert = true") tk.MustExec("create table t (a bigint primary key auto_random(15), b int)") @@ -971,9 +977,6 @@ func (s *testAutoRandomSuite) TestAutoRandomTableOption(c *C) { tk.MustExec("use test") // test table option is auto-random - testutil.ConfigTestUtils.SetupAutoRandomTestConfig() - defer testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() - tk.MustExec("drop table if exists auto_random_table_option") tk.MustExec("create table auto_random_table_option (a bigint auto_random(5) key) auto_random_base = 1000") t, err := domain.GetDomain(tk.Se).InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("auto_random_table_option")) @@ -1042,9 +1045,6 @@ func (s *testAutoRandomSuite) TestFilterDifferentAllocators(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("drop table if exists t1") - testutil.ConfigTestUtils.SetupAutoRandomTestConfig() - defer testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() - tk.MustExec("create table t(a bigint auto_random(5) key, b int auto_increment unique)") tk.MustExec("insert into t values()") tk.MustQuery("select b from t").Check(testkit.Rows("1")) diff --git a/executor/show.go b/executor/show.go index 78186f6184ccd..16263a9c948cc 100644 --- a/executor/show.go +++ b/executor/show.go @@ -719,7 +719,7 @@ func getDefaultCollate(charsetName string) string { } // ConstructResultOfShowCreateTable constructs the result for show create table. -func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.TableInfo, allocator autoid.Allocator, buf *bytes.Buffer) (err error) { +func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.TableInfo, allocators autoid.Allocators, buf *bytes.Buffer) (err error) { if tableInfo.IsView() { fetchShowCreateTable4View(ctx, tableInfo, buf) return nil @@ -903,11 +903,13 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T fmt.Fprintf(buf, " COMPRESSION='%s'", tableInfo.Compression) } - if hasAutoIncID { - autoIncID, err := allocator.NextGlobalAutoID(tableInfo.ID) + incrementAllocator := allocators.Get(autoid.RowIDAllocType) + if hasAutoIncID && incrementAllocator != nil { + autoIncID, err := incrementAllocator.NextGlobalAutoID(tableInfo.ID) if err != nil { return errors.Trace(err) } + // It's compatible with MySQL. if autoIncID > 1 { fmt.Fprintf(buf, " AUTO_INCREMENT=%d", autoIncID) @@ -918,8 +920,16 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T fmt.Fprintf(buf, " /*T![auto_id_cache] AUTO_ID_CACHE=%d */", tableInfo.AutoIdCache) } - if tableInfo.AutoRandID != 0 { - fmt.Fprintf(buf, " /*T![auto_rand_base] AUTO_RANDOM_BASE=%d */", tableInfo.AutoRandID) + randomAllocator := allocators.Get(autoid.AutoRandomType) + if randomAllocator != nil { + autoRandID, err := randomAllocator.NextGlobalAutoID(tableInfo.ID) + if err != nil { + return errors.Trace(err) + } + + if autoRandID > 1 { + fmt.Fprintf(buf, " /*T![auto_rand_base] AUTO_RANDOM_BASE=%d */", autoRandID) + } } if tableInfo.ShardRowIDBits > 0 { @@ -1013,10 +1023,9 @@ func (e *ShowExec) fetchShowCreateTable() error { } tableInfo := tb.Meta() - allocator := tb.Allocators(e.ctx).Get(autoid.RowIDAllocType) var buf bytes.Buffer // TODO: let the result more like MySQL. - if err = ConstructResultOfShowCreateTable(e.ctx, tableInfo, allocator, &buf); err != nil { + if err = ConstructResultOfShowCreateTable(e.ctx, tableInfo, tb.Allocators(e.ctx), &buf); err != nil { return err } if tableInfo.IsView() { diff --git a/executor/show_test.go b/executor/show_test.go index ffe2d5eadf9c6..28a033b9d1941 100644 --- a/executor/show_test.go +++ b/executor/show_test.go @@ -19,6 +19,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -707,9 +708,6 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - testutil.ConfigTestUtils.SetupAutoRandomTestConfig() - defer testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() - // Basic show create table. tk.MustExec("create table auto_random_tbl1 (a bigint primary key auto_random(3), b varchar(255))") tk.MustQuery("show create table `auto_random_tbl1`").Check(testutil.RowsWithSep("|", @@ -808,6 +806,40 @@ func (s *testAutoRandomSuite) TestAutoIdCache(c *C) { )) } +func (s *testAutoRandomSuite) TestAutoRandomBase(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange"), IsNil) + }() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@allow_auto_random_explicit_insert = true") + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a bigint primary key auto_random(5), b int unique key auto_increment) auto_random_base = 100, auto_increment = 100") + tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|", + ""+ + "t CREATE TABLE `t` (\n"+ + " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ + " `b` int(11) NOT NULL AUTO_INCREMENT,\n"+ + " PRIMARY KEY (`a`),\n"+ + " UNIQUE KEY `b` (`b`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=100 /*T![auto_rand_base] AUTO_RANDOM_BASE=100 */", + )) + + tk.MustExec("insert into t(`a`) values (1000)") + tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|", + ""+ + "t CREATE TABLE `t` (\n"+ + " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ + " `b` int(11) NOT NULL AUTO_INCREMENT,\n"+ + " PRIMARY KEY (`a`),\n"+ + " UNIQUE KEY `b` (`b`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=5100 /*T![auto_rand_base] AUTO_RANDOM_BASE=6001 */", + )) +} + func (s *testSuite5) TestShowEscape(c *C) { tk := testkit.NewTestKit(c, s.store)