Skip to content

Commit

Permalink
sessionctx/variable: remove dependency on context package. (pingcap#2064
Browse files Browse the repository at this point in the history
)

Makes using session variable easier and faster.
Prepare for use session variable to handle data truncated error.
  • Loading branch information
coocood authored Nov 23, 2016
1 parent 308032b commit 0af8520
Show file tree
Hide file tree
Showing 42 changed files with 207 additions and 452 deletions.
3 changes: 1 addition & 2 deletions ast/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/db"
)

var (
Expand Down Expand Up @@ -565,7 +564,7 @@ func (i Ident) Full(ctx context.Context) (full Ident) {
if i.Schema.O != "" {
full.Schema = i.Schema
} else {
full.Schema = model.NewCIStr(db.GetCurrentSchema(ctx))
full.Schema = model.NewCIStr(ctx.GetSessionVars().CurrentDB)
}
return
}
Expand Down
13 changes: 4 additions & 9 deletions bootstrap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,8 @@ import (
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/parser"
"github.com/pingcap/tidb/sessionctx"
"github.com/pingcap/tidb/sessionctx/autocommit"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/testleak"
)
Expand Down Expand Up @@ -88,18 +86,15 @@ func (s *testSessionSuite) TestBootstrap(c *C) {
// Create a new session on store but only do ddl works.
func (s *testSessionSuite) bootstrapWithOnlyDDLWork(store kv.Storage, c *C) {
ss := &session{
values: make(map[fmt.Stringer]interface{}),
store: store,
parser: parser.New(),
values: make(map[fmt.Stringer]interface{}),
store: store,
parser: parser.New(),
sessionVars: variable.NewSessionVars(),
}
ss.SetValue(context.Initing, true)
domain, err := domap.Get(store)
c.Assert(err, IsNil)
sessionctx.BindDomain(ss, domain)
variable.BindSessionVars(ss)
variable.GetSessionVars(ss).SetStatusFlag(mysql.ServerStatusAutocommit, true)
// session implements autocommit.Checker. Bind it to ctx
autocommit.BindAutocommitChecker(ss, ss)
sessionMu.Lock()
defer sessionMu.Unlock()
b, err := checkBootstrapped(ss)
Expand Down
3 changes: 3 additions & 0 deletions context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"fmt"

"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/sessionctx/variable"
)

// Context is an interface for transaction and executive args environment.
Expand All @@ -41,6 +42,8 @@ type Context interface {

// ClearValue clears the value associated with this context for key.
ClearValue(key fmt.Stringer)

GetSessionVars() *variable.SessionVars
}

type basicCtxType int
Expand Down
2 changes: 0 additions & 2 deletions ddl/ddl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/store/localstore"
"github.com/pingcap/tidb/store/localstore/goleveldb"
)
Expand All @@ -43,7 +42,6 @@ func testCreateStore(c *C, name string) kv.Storage {

func testNewContext(c *C, d *ddl) context.Context {
ctx := d.newMockContext()
variable.BindSessionVars(ctx)
return ctx
}

Expand Down
22 changes: 15 additions & 7 deletions ddl/reorg.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,20 @@ import (
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/terror"
)

var _ context.Context = &mockContext{}

// mockContext implements context.Context interface for testing.
type mockContext struct {
store kv.Storage
mux sync.Mutex
m map[fmt.Stringer]interface{}
txn kv.Transaction
store kv.Storage
mux sync.Mutex
m map[fmt.Stringer]interface{}
txn kv.Transaction
sessionVars *variable.SessionVars
}

func (c *mockContext) GetTxn(forceNew bool) (kv.Transaction, error) {
Expand Down Expand Up @@ -102,12 +105,17 @@ func (c *mockContext) ClearValue(key fmt.Stringer) {
delete(c.m, key)
}

func (c *mockContext) GetSessionVars() *variable.SessionVars {
return c.sessionVars
}

func (d *ddl) newMockContext() context.Context {
c := &mockContext{
store: d.store,
m: make(map[fmt.Stringer]interface{}),
store: d.store,
m: make(map[fmt.Stringer]interface{}),
sessionVars: variable.NewSessionVars(),
}

c.sessionVars.SetStatusFlag(mysql.ServerStatusAutocommit, false)
return c
}

Expand Down
20 changes: 9 additions & 11 deletions evaluator/builtin_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,21 @@ import (
"github.com/juju/errors"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/db"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/types"
)

// See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html
func builtinDatabase(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
s := db.GetCurrentSchema(ctx)
if s == "" {
currentDB := ctx.GetSessionVars().CurrentDB
if currentDB == "" {
return d, nil
}
d.SetString(s)
d.SetString(currentDB)
return d, nil
}

func builtinFoundRows(arg []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := variable.GetSessionVars(ctx)
data := ctx.GetSessionVars()
if data == nil {
return d, errors.Errorf("Missing session variable when evalue builtin")
}
Expand All @@ -49,7 +47,7 @@ func builtinFoundRows(arg []types.Datum, ctx context.Context) (d types.Datum, er
// See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user
// TODO: The value of CURRENT_USER() can differ from the value of USER(). We will finish this after we support grant tables.
func builtinCurrentUser(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := variable.GetSessionVars(ctx)
data := ctx.GetSessionVars()
if data == nil {
return d, errors.Errorf("Missing session variable when evalue builtin")
}
Expand All @@ -59,7 +57,7 @@ func builtinCurrentUser(args []types.Datum, ctx context.Context) (d types.Datum,
}

func builtinUser(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := variable.GetSessionVars(ctx)
data := ctx.GetSessionVars()
if data == nil {
return d, errors.Errorf("Missing session variable when evalue builtin")
}
Expand All @@ -69,7 +67,7 @@ func builtinUser(args []types.Datum, ctx context.Context) (d types.Datum, err er
}

func builtinConnectionID(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := variable.GetSessionVars(ctx)
data := ctx.GetSessionVars()
if data == nil {
return d, errors.Errorf("Missing session variable when evalue builtin")
}
Expand All @@ -85,10 +83,10 @@ func builtinLastInsertID(args []types.Datum, ctx context.Context) (d types.Datum
if err != nil {
return d, errors.Trace(err)
}
variable.GetSessionVars(ctx).SetLastInsertID(uint64(id))
ctx.GetSessionVars().SetLastInsertID(uint64(id))
}

d.SetUint64(variable.GetSessionVars(ctx).LastInsertID)
d.SetUint64(ctx.GetSessionVars().LastInsertID)
return
}

Expand Down
19 changes: 4 additions & 15 deletions evaluator/builtin_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ package evaluator
import (
. "github.com/pingcap/check"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/db"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/mock"
"github.com/pingcap/tidb/util/testleak"
"github.com/pingcap/tidb/util/types"
Expand All @@ -29,8 +27,7 @@ func (s *testEvaluatorSuite) TestDatabase(c *C) {
d, err := builtinDatabase(types.MakeDatums(), ctx)
c.Assert(err, IsNil)
c.Assert(d.Kind(), Equals, types.KindNull)

db.BindCurrentSchema(ctx, "test")
ctx.GetSessionVars().CurrentDB = "test"
d, err = builtinDatabase(types.MakeDatums(), ctx)
c.Assert(err, IsNil)
c.Assert(d.GetString(), Equals, "test")
Expand All @@ -40,20 +37,14 @@ func (s *testEvaluatorSuite) TestFoundRows(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
d, err := builtinFoundRows(types.MakeDatums(), ctx)
c.Assert(err, NotNil)

variable.BindSessionVars(ctx)

d, err = builtinFoundRows(types.MakeDatums(), ctx)
c.Assert(err, IsNil)
c.Assert(d.GetUint64(), Equals, uint64(0))
}

func (s *testEvaluatorSuite) TestUser(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
variable.BindSessionVars(ctx)
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
sessionVars.User = "root@localhost"

d, err := builtinUser(types.MakeDatums(), ctx)
Expand All @@ -64,8 +55,7 @@ func (s *testEvaluatorSuite) TestUser(c *C) {
func (s *testEvaluatorSuite) TestCurrentUser(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
variable.BindSessionVars(ctx)
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
sessionVars.User = "root@localhost"

d, err := builtinCurrentUser(types.MakeDatums(), ctx)
Expand All @@ -76,8 +66,7 @@ func (s *testEvaluatorSuite) TestCurrentUser(c *C) {
func (s *testEvaluatorSuite) TestConnectionID(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
variable.BindSessionVars(ctx)
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
sessionVars.ConnectionID = uint64(1)

d, err := builtinConnectionID(types.MakeDatums(), ctx)
Expand Down
7 changes: 3 additions & 4 deletions evaluator/builtin_other.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/parser/opcode"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/types"
)

Expand All @@ -32,7 +31,7 @@ func builtinSleep(args []types.Datum, ctx context.Context) (d types.Datum, err e
return d, errors.Errorf("Missing context when evalue builtin")
}

sessVars := variable.GetSessionVars(ctx)
sessVars := ctx.GetSessionVars()
if args[0].IsNull() {
if sessVars.StrictSQLMode {
return d, errors.New("incorrect arguments to sleep")
Expand Down Expand Up @@ -520,7 +519,7 @@ func CastFuncFactory(tp *types.FieldType) (BuiltinFunc, error) {
}

func builtinSetVar(args []types.Datum, ctx context.Context) (types.Datum, error) {
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
varName, _ := args[0].ToString()
if !args[1].IsNull() {
strVal, err := args[1].ToString()
Expand All @@ -533,7 +532,7 @@ func builtinSetVar(args []types.Datum, ctx context.Context) (types.Datum, error)
}

func builtinGetVar(args []types.Datum, ctx context.Context) (types.Datum, error) {
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
varName, _ := args[0].ToString()
if v, ok := sessionVars.Users[varName]; ok {
return types.NewDatum(v), nil
Expand Down
8 changes: 4 additions & 4 deletions evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -586,8 +586,8 @@ func (e *Evaluator) values(v *ast.ValuesExpr) bool {

func (e *Evaluator) variable(v *ast.VariableExpr) bool {
name := strings.ToLower(v.Name)
sessionVars := variable.GetSessionVars(e.ctx)
globalVars := variable.GetGlobalVarAccessor(e.ctx)
sessionVars := e.ctx.GetSessionVars()
globalVars := sessionVars.GlobalVarsAccessor
if !v.IsSystem {
if v.Value != nil && !v.Value.GetDatum().IsNull() {
strVal, err := v.Value.GetDatum().ToString()
Expand Down Expand Up @@ -627,7 +627,7 @@ func (e *Evaluator) variable(v *ast.VariableExpr) bool {
d.SetString(sysVar.Value)
} else {
// Get global system variable and fill it in session.
globalVal, err := globalVars.GetGlobalSysVar(e.ctx, name)
globalVal, err := globalVars.GetGlobalSysVar(name)
if err != nil {
e.err = errors.Trace(err)
return false
Expand All @@ -643,7 +643,7 @@ func (e *Evaluator) variable(v *ast.VariableExpr) bool {
v.SetDatum(d)
return true
}
value, err := globalVars.GetGlobalSysVar(e.ctx, name)
value, err := globalVars.GetGlobalSysVar(name)
if err != nil {
e.err = errors.Trace(err)
return false
Expand Down
8 changes: 2 additions & 6 deletions evaluator/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/parser"
"github.com/pingcap/tidb/parser/opcode"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/charset"
"github.com/pingcap/tidb/util/mock"
"github.com/pingcap/tidb/util/testleak"
Expand Down Expand Up @@ -83,8 +82,7 @@ func (s *testEvaluatorSuite) TestBetween(c *C) {
func (s *testEvaluatorSuite) TestSleep(c *C) {
defer testleak.AfterTest(c)()
ctx := mock.NewContext()
variable.BindSessionVars(ctx)
sessVars := variable.GetSessionVars(ctx)
sessVars := ctx.GetSessionVars()

// non-strict model
sessVars.StrictSQLMode = false
Expand Down Expand Up @@ -697,7 +695,6 @@ func (s *testEvaluatorSuite) TestLastInsertID(c *C) {
}

ctx := mock.NewContext()
variable.BindSessionVars(ctx)
c.Log(ctx)
for _, ca := range cases {
expr := &ast.FuncCallExpr{
Expand Down Expand Up @@ -952,8 +949,7 @@ func (s *testEvaluatorSuite) TestGetTimeValue(c *C) {
c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00")

ctx := mock.NewContext()
variable.BindSessionVars(ctx)
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
sessionVars.SetSystemVar("timestamp", types.NewStringDatum(""))
v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, mysql.MinFsp)
c.Assert(err, IsNil)
Expand Down
3 changes: 1 addition & 2 deletions evaluator/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/pingcap/tidb/ast"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/types"
)

Expand Down Expand Up @@ -117,7 +116,7 @@ func getSystemTimestamp(ctx context.Context) (time.Time, error) {
}

// check whether use timestamp varibale
sessionVars := variable.GetSessionVars(ctx)
sessionVars := ctx.GetSessionVars()
ts := sessionVars.GetSystemVar("timestamp")
if !ts.IsNull() && ts.GetString() != "" {
timestamp, err := ts.ToInt64()
Expand Down
3 changes: 1 addition & 2 deletions executor/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"github.com/pingcap/tidb/infoschema"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/plan"
"github.com/pingcap/tidb/sessionctx/variable"
)

// recordSet wraps an executor, implements ast.RecordSet interface
Expand Down Expand Up @@ -110,7 +109,7 @@ func (a *statement) Exec(ctx context.Context) (ast.RecordSet, error) {
// In history read mode, we can not do write operations.
switch e.(type) {
case *DeleteExec, *InsertExec, *UpdateExec, *ReplaceExec, *LoadData, *DDLExec:
snapshotTS := variable.GetSnapshotTS(ctx)
snapshotTS := ctx.GetSessionVars().SnapshotTS
if snapshotTS != 0 {
return nil, errors.New("can not execute write statement when 'tidb_snapshot' is set")
}
Expand Down
Loading

0 comments on commit 0af8520

Please sign in to comment.