Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*: add a variable to control whether we can write _tidb_rowid #8218

Merged
merged 3 commits into from
Nov 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions executor/insert_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ func (e *InsertValues) initInsertColumns() error {
}
for _, col := range cols {
if col.Name.L == model.ExtraHandleName.L {
if !e.ctx.GetSessionVars().AllowWriteRowID {
return errors.Errorf("insert, update and replace statements for _tidb_rowid are not supported.")
}
e.hasExtraHandle = true
break
}
Expand Down
40 changes: 38 additions & 2 deletions executor/rowid_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ import (
)

func (s *testSuite) TestExportRowID(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk := testkit.NewTestKitWithInit(c, s.store)
tk.Se.GetSessionVars().AllowWriteRowID = true
defer func() {
tk.Se.GetSessionVars().AllowWriteRowID = false
}()

tk.MustExec("drop table if exists t")
tk.MustExec("create table t (a int, b int)")
tk.MustExec("insert t values (1, 7), (1, 8), (1, 9)")
Expand Down Expand Up @@ -49,4 +53,36 @@ func (s *testSuite) TestExportRowID(c *C) {
c.Assert(err, NotNil)
_, err = tk.Exec("delete from s where _tidb_rowid = 1")
c.Assert(err, NotNil)

// Make sure "AllowWriteRowID" is a session variable.
tk1 := testkit.NewTestKit(c, s.store)
tk1.MustExec("use test")
_, err = tk1.Exec("insert into t (a, _tidb_rowid) values(10, 1);")
c.Assert(err.Error(), Equals, "insert, update and replace statements for _tidb_rowid are not supported.")
}

func (s *testSuite) TestNotAllowWriteRowID(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk.MustExec("create table tt(id binary(10), c int, primary key(id));")
tk.MustExec("insert tt values (1, 10);")
// select statement
tk.MustQuery("select *, _tidb_rowid from tt").
Check(testkit.Rows("1\x00\x00\x00\x00\x00\x00\x00\x00\x00 10 1"))
// insert statement
_, err := tk.Exec("insert into tt (id, c, _tidb_rowid) values(30000,10,1);")
c.Assert(err.Error(), Equals, "insert, update and replace statements for _tidb_rowid are not supported.")
// replace statement
_, err = tk.Exec("replace into tt (id, c, _tidb_rowid) values(30000,10,1);")
c.Assert(err.Error(), Equals, "insert, update and replace statements for _tidb_rowid are not supported.")
// update statement
_, err = tk.Exec("update tt set id = 2, _tidb_rowid = 1 where _tidb_rowid = 1")
c.Assert(err.Error(), Equals, "insert, update and replace statements for _tidb_rowid are not supported.")
tk.MustExec("update tt set id = 2 where _tidb_rowid = 1")
tk.MustExec("admin check table tt;")
tk.MustExec("drop table tt")
// There is currently no real support for inserting, updating, and replacing _tidb_rowid statements.
// After we support it, the following operations must be passed.
// tk.MustExec("insert into tt (id, c, _tidb_rowid) values(30000,10,1);")
// tk.MustExec("admin check table tt;")
}
8 changes: 6 additions & 2 deletions executor/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/pingcap/tidb/expression"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/sessionctx"
"github.com/pingcap/tidb/table"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/util/chunk"
Expand Down Expand Up @@ -46,7 +47,7 @@ type UpdateExec struct {
}

func (e *UpdateExec) exec(schema *expression.Schema) ([]types.Datum, error) {
assignFlag, err := e.getUpdateColumns(schema.Len())
assignFlag, err := e.getUpdateColumns(e.ctx, schema.Len())
if err != nil {
return nil, errors.Trace(err)
}
Expand Down Expand Up @@ -230,9 +231,12 @@ func (e *UpdateExec) Open(ctx context.Context) error {
return e.SelectExec.Open(ctx)
}

func (e *UpdateExec) getUpdateColumns(schemaLen int) ([]bool, error) {
func (e *UpdateExec) getUpdateColumns(ctx sessionctx.Context, schemaLen int) ([]bool, error) {
assignFlag := make([]bool, schemaLen)
for _, v := range e.OrderedList {
if !ctx.GetSessionVars().AllowWriteRowID && v.Col.ColName.L == model.ExtraHandleName.L {
return nil, errors.Errorf("insert, update and replace statements for _tidb_rowid are not supported.")
}
idx := v.Col.Index
assignFlag[idx] = true
}
Expand Down
6 changes: 6 additions & 0 deletions sessionctx/variable/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ type SessionVars struct {
// AllowInSubqueryUnFolding can be set to true to fold in subquery
AllowInSubqueryUnFolding bool

// AllowWriteRowID can be set to false to forbid write data to _tidb_rowid.
// This variable is currently not recommended to be turned on.
AllowWriteRowID bool

// CurrInsertValues is used to record current ValuesExpr's values.
// See http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
CurrInsertValues chunk.Row
Expand Down Expand Up @@ -536,6 +540,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error {
s.AllowAggPushDown = TiDBOptOn(val)
case TiDBOptInSubqUnFolding:
s.AllowInSubqueryUnFolding = TiDBOptOn(val)
case TiDBOptWriteRowID:
s.AllowWriteRowID = TiDBOptOn(val)
case TiDBIndexLookupConcurrency:
s.IndexLookupConcurrency = tidbOptPositiveInt32(val, DefIndexLookupConcurrency)
case TiDBIndexLookupJoinConcurrency:
Expand Down
1 change: 1 addition & 0 deletions sessionctx/variable/sysvar.go
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,7 @@ var defaultSysVars = []*SysVar{
/* TiDB specific variables */
{ScopeSession, TiDBSnapshot, ""},
{ScopeSession, TiDBOptAggPushDown, boolToIntStr(DefOptAggPushDown)},
{ScopeSession, TiDBOptWriteRowID, boolToIntStr(DefOptWriteRowID)},
{ScopeGlobal | ScopeSession, TiDBBuildStatsConcurrency, strconv.Itoa(DefBuildStatsConcurrency)},
{ScopeGlobal, TiDBAutoAnalyzeRatio, strconv.FormatFloat(DefAutoAnalyzeRatio, 'f', -1, 64)},
{ScopeGlobal, TiDBAutoAnalyzeStartTime, DefAutoAnalyzeStartTime},
Expand Down
4 changes: 4 additions & 0 deletions sessionctx/variable/tidb_vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ const (
// tidb_opt_agg_push_down is used to enable/disable the optimizer rule of aggregation push down.
TiDBOptAggPushDown = "tidb_opt_agg_push_down"

// tidb_opt_write_row_id is used to enable/disable the operations of insert、replace and update to _tidb_rowid.
TiDBOptWriteRowID = "tidb_opt_write_row_id"

// Auto analyze will run if (table modify count)/(table row count) is greater than this value.
TiDBAutoAnalyzeRatio = "tidb_auto_analyze_ratio"

Expand Down Expand Up @@ -215,6 +218,7 @@ const (
DefSkipUTF8Check = false
DefOptAggPushDown = false
DefOptInSubqUnfolding = false
DefOptWriteRowID = false
DefBatchInsert = false
DefBatchDelete = false
DefCurretTS = 0
Expand Down
1 change: 1 addition & 0 deletions sessionctx/variable/varsutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func (s *testVarsutilSuite) TestNewSessionVars(c *C) {
c.Assert(vars.MemQuotaIndexLookupReader, Equals, int64(DefTiDBMemQuotaIndexLookupReader))
c.Assert(vars.MemQuotaIndexLookupJoin, Equals, int64(DefTiDBMemQuotaIndexLookupJoin))
c.Assert(vars.MemQuotaNestedLoopApply, Equals, int64(DefTiDBMemQuotaNestedLoopApply))
c.Assert(vars.AllowWriteRowID, Equals, DefOptWriteRowID)

assertFieldsGreaterThanZero(c, reflect.ValueOf(vars.Concurrency))
assertFieldsGreaterThanZero(c, reflect.ValueOf(vars.MemQuota))
Expand Down