diff --git a/executor/set_test.go b/executor/set_test.go index 015292f5d8308..35c61825ac494 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -141,37 +141,48 @@ func (s *testSuite) TestSetVar(c *C) { tk.MustExec("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED") tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-COMMITTED")) tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-COMMITTED")) - tk.MustExec("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") - tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) - tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) - tk.MustExec("SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE") - tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("SERIALIZABLE")) - tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("SERIALIZABLE")) + // error + _, err = tk.Exec("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-COMMITTED")) + tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-COMMITTED")) + // Fails + _, err = tk.Exec("SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("REPEATABLE-READ")) + tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("REPEATABLE-READ")) // test synonyms variables tk.MustExec("SET SESSION tx_isolation = 'READ-COMMITTED'") tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-COMMITTED")) tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-COMMITTED")) - tk.MustExec("SET SESSION tx_isolation = 'READ-UNCOMMITTED'") - tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) - tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) + _, err = tk.Exec("SET SESSION tx_isolation = 'READ-UNCOMMITTED'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-COMMITTED")) + tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-COMMITTED")) - tk.MustExec("SET SESSION transaction_isolation = 'SERIALIZABLE'") - tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("SERIALIZABLE")) - tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("SERIALIZABLE")) + // fails + _, err = tk.Exec("SET SESSION transaction_isolation = 'SERIALIZABLE'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@session.tx_isolation").Check(testkit.Rows("READ-COMMITTED")) + tk.MustQuery("select @@session.transaction_isolation").Check(testkit.Rows("READ-COMMITTED")) - tk.MustExec("SET GLOBAL transaction_isolation = 'SERIALIZABLE'") - tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("SERIALIZABLE")) - tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("SERIALIZABLE")) + // fails + _, err = tk.Exec("SET GLOBAL transaction_isolation = 'SERIALIZABLE'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("REPEATABLE-READ")) + tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("REPEATABLE-READ")) - tk.MustExec("SET GLOBAL transaction_isolation = 'READ-UNCOMMITTED'") - tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) - tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("READ-UNCOMMITTED")) + _, err = tk.Exec("SET GLOBAL transaction_isolation = 'READ-UNCOMMITTED'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("REPEATABLE-READ")) + tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("REPEATABLE-READ")) - tk.MustExec("SET GLOBAL tx_isolation = 'SERIALIZABLE'") - tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("SERIALIZABLE")) - tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("SERIALIZABLE")) + _, err = tk.Exec("SET GLOBAL tx_isolation = 'SERIALIZABLE'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) + tk.MustQuery("select @@global.tx_isolation").Check(testkit.Rows("REPEATABLE-READ")) + tk.MustQuery("select @@global.transaction_isolation").Check(testkit.Rows("REPEATABLE-READ")) tk.MustExec("SET SESSION tx_read_only = 1") tk.MustExec("SET SESSION tx_read_only = 0") @@ -553,7 +564,6 @@ func (s *testSuite) TestValidateSetVar(c *C) { result = tk.MustQuery("select @@tx_isolation;") result.Check(testkit.Rows("REPEATABLE-READ")) - tk.MustExec("set @@tx_isolation='SERIALIZABLE'") - result = tk.MustQuery("select @@tx_isolation;") - result.Check(testkit.Rows("SERIALIZABLE")) + _, err = tk.Exec("set @@tx_isolation='SERIALIZABLE'") + c.Assert(terror.ErrorEqual(err, variable.ErrUnsupportedValueForVar), IsTrue, Commentf("err %v", err)) } diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 384c588698057..bc1ea077ebc68 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -582,6 +582,10 @@ func (s *SessionVars) WithdrawAllPreparedStmt() { func (s *SessionVars) SetSystemVar(name string, val string) error { switch name { case TxnIsolationOneShot: + switch val { + case "SERIALIZABLE", "READ-UNCOMMITTED": + return ErrUnsupportedValueForVar.GenWithStackByArgs(name, val) + } s.TxnIsolationLevelOneShot.State = 1 s.TxnIsolationLevelOneShot.Value = val case TimeZone: diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index 4d55292c61ff3..c5f3aa3c1e1d9 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -394,6 +394,10 @@ func ValidateSetSystemVar(vars *SessionVars, name string, value string) (string, if !exists { return "", ErrWrongValueForVar.GenWithStackByArgs(name, value) } + switch upVal { + case "SERIALIZABLE", "READ-UNCOMMITTED": + return "", ErrUnsupportedValueForVar.GenWithStackByArgs(name, value) + } return upVal, nil } return value, nil