Skip to content

Commit

Permalink
executor,ddl: update auto_random_base in 'show create table' after in…
Browse files Browse the repository at this point in the history
…sertion (#18217)
  • Loading branch information
Rustin170506 authored Jul 1, 2020
1 parent 402fd2a commit aa1d2d2
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 23 deletions.
10 changes: 5 additions & 5 deletions ddl/reorg.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand All @@ -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)
}
Expand All @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions executor/ddl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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)")
Expand Down Expand Up @@ -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"))
Expand Down Expand Up @@ -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"))
Expand Down
23 changes: 16 additions & 7 deletions executor/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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 {
Expand Down Expand Up @@ -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() {
Expand Down
38 changes: 35 additions & 3 deletions executor/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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("|",
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit aa1d2d2

Please sign in to comment.