Skip to content

Commit

Permalink
ddl: reject alter auto_random_base on a non auto_random table (#17714) (
Browse files Browse the repository at this point in the history
  • Loading branch information
sre-bot authored Jun 10, 2020
1 parent b5b4da0 commit ef315c1
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 7 deletions.
21 changes: 14 additions & 7 deletions ddl/ddl_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2209,20 +2209,27 @@ func (d *ddl) RebaseAutoID(ctx sessionctx.Context, ident ast.Ident, newBase int6
if err != nil {
return errors.Trace(err)
}
autoIncID, err := t.Allocators(ctx).Get(tp).NextGlobalAutoID(t.Meta().ID)
var actionType model.ActionType
switch tp {
case autoid.AutoRandomType:
if t.Meta().AutoRandomBits == 0 {
return errors.Trace(ErrInvalidAutoRandom.GenWithStackByArgs(autoid.AutoRandomRebaseNotApplicable))
}
actionType = model.ActionRebaseAutoRandomBase
case autoid.RowIDAllocType:
actionType = model.ActionRebaseAutoID
}

autoID, err := t.Allocators(ctx).Get(tp).NextGlobalAutoID(t.Meta().ID)
if err != nil {
return errors.Trace(err)
}
// If newBase < autoIncID, we need to do a rebase before returning.
// If newBase < autoID, we need to do a rebase before returning.
// Assume there are 2 TiDB servers: TiDB-A with allocator range of 0 ~ 30000; TiDB-B with allocator range of 30001 ~ 60000.
// If the user sends SQL `alter table t1 auto_increment = 100` to TiDB-B,
// and TiDB-B finds 100 < 30001 but returns without any handling,
// then TiDB-A may still allocate 99 for auto_increment column. This doesn't make sense for the user.
newBase = mathutil.MaxInt64(newBase, autoIncID)
actionType := model.ActionRebaseAutoID
if tp == autoid.AutoRandomType {
actionType = model.ActionRebaseAutoRandomBase
}
newBase = mathutil.MaxInt64(newBase, autoID)
job := &model.Job{
SchemaID: schema.ID,
TableID: t.Meta().ID,
Expand Down
6 changes: 6 additions & 0 deletions executor/ddl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,12 @@ func (s *testAutoRandomSuite) TestAutoRandomTableOption(c *C) {
c.Assert(orderedHandles[i], Equals, i+3000000)
}
tk.MustExec("drop table alter_table_auto_random_option")

// Alter auto_random_base on non auto_random table.
tk.MustExec("create table alter_auto_random_normal (a int)")
_, err = tk.Exec("alter table alter_auto_random_normal auto_random_base = 100")
c.Assert(err, NotNil)
c.Assert(strings.Contains(err.Error(), autoid.AutoRandomRebaseNotApplicable), IsTrue, Commentf(err.Error()))
}

// Test filter different kind of allocators.
Expand Down
6 changes: 6 additions & 0 deletions meta/autoid/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,10 @@ const (
AutoRandomNonPositive = "the value of auto_random should be positive"
// AutoRandomAvailableAllocTimesNote is reported when a table containing auto_random is created.
AutoRandomAvailableAllocTimesNote = "Available implicit allocation times: %d"
// AutoRandomExplicitInsertDisabledErrMsg is reported when auto_random column value is explicitly specified, but the session var 'allow_auto_random_explicit_insert' is false.
AutoRandomExplicitInsertDisabledErrMsg = "Explicit insertion on auto_random column is disabled. Try to set @@allow_auto_random_explicit_insert = true."
// AutoRandomOnNonBigIntColumn is reported when define auto random to non bigint column
AutoRandomOnNonBigIntColumn = "auto_random option must be defined on `bigint` column, but not on `%s` column"
// AutoRandomRebaseNotApplicable is reported when alter auto_random base on a non auto_random table.
AutoRandomRebaseNotApplicable = "alter auto_random_base of a non auto_random table"
)

0 comments on commit ef315c1

Please sign in to comment.