sessionctx/variable: Improve sysvar test coverage, collation normalization (#24472)

This commit is contained in:
Morgan Tocker
2021-05-07 21:18:43 -06:00
committed by GitHub
parent bd011d3c95
commit 82ea46d652
2 changed files with 94 additions and 2 deletions

View File

@ -15,6 +15,7 @@ package variable
import (
"fmt"
"strings"
"testing"
. "github.com/pingcap/check"
@ -227,3 +228,93 @@ func (*testSysVarSuite) TestScope(c *C) {
c.Assert(sv.HasSessionScope(), IsFalse)
c.Assert(sv.HasGlobalScope(), IsFalse)
}
func (*testSysVarSuite) TestBuiltInCase(c *C) {
// All Sysvars should have lower case names.
// This tests builtins.
for name := range GetSysVars() {
c.Assert(name, Equals, strings.ToLower(name))
}
}
func (*testSysVarSuite) TestSQLSelectLimit(c *C) {
sv := GetSysVar(SQLSelectLimit)
vars := NewSessionVars()
val, err := sv.Validate(vars, "-10", ScopeSession)
c.Assert(err, IsNil) // it has autoconvert out of range.
c.Assert(val, Equals, "0")
val, err = sv.Validate(vars, "9999", ScopeSession)
c.Assert(err, IsNil)
c.Assert(val, Equals, "9999")
c.Assert(sv.SetSessionFromHook(vars, "9999"), IsNil) // sets
c.Assert(vars.SelectLimit, Equals, uint64(9999))
}
func (*testSysVarSuite) TestSQLModeVar(c *C) {
sv := GetSysVar(SQLModeVar)
vars := NewSessionVars()
val, err := sv.Validate(vars, "strict_trans_tabLES ", ScopeSession)
c.Assert(err, IsNil)
c.Assert(val, Equals, "STRICT_TRANS_TABLES")
_, err = sv.Validate(vars, "strict_trans_tabLES,nonsense_option", ScopeSession)
c.Assert(err.Error(), Equals, "ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NONSENSE_OPTION'")
val, err = sv.Validate(vars, "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", ScopeSession)
c.Assert(err, IsNil)
c.Assert(val, Equals, "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION")
c.Assert(sv.SetSessionFromHook(vars, val), IsNil) // sets to strict from above
c.Assert(vars.StrictSQLMode, IsTrue)
sqlMode, err := mysql.GetSQLMode(val)
c.Assert(err, IsNil)
c.Assert(vars.SQLMode, Equals, sqlMode)
// Set it to non strict.
val, err = sv.Validate(vars, "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", ScopeSession)
c.Assert(err, IsNil)
c.Assert(val, Equals, "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION")
c.Assert(sv.SetSessionFromHook(vars, val), IsNil) // sets to non-strict from above
c.Assert(vars.StrictSQLMode, IsFalse)
sqlMode, err = mysql.GetSQLMode(val)
c.Assert(err, IsNil)
c.Assert(vars.SQLMode, Equals, sqlMode)
}
func (*testSysVarSuite) TestMaxExecutionTime(c *C) {
sv := GetSysVar(MaxExecutionTime)
vars := NewSessionVars()
val, err := sv.Validate(vars, "-10", ScopeSession)
c.Assert(err, IsNil) // it has autoconvert out of range.
c.Assert(val, Equals, "0")
val, err = sv.Validate(vars, "99999", ScopeSession)
c.Assert(err, IsNil) // it has autoconvert out of range.
c.Assert(val, Equals, "99999")
c.Assert(sv.SetSessionFromHook(vars, "99999"), IsNil) // sets
c.Assert(vars.MaxExecutionTime, Equals, uint64(99999))
}
func (*testSysVarSuite) TestCollationServer(c *C) {
sv := GetSysVar(CollationServer)
vars := NewSessionVars()
val, err := sv.Validate(vars, "LATIN1_bin", ScopeSession)
c.Assert(err, IsNil)
c.Assert(val, Equals, "latin1_bin") // test normalization
_, err = sv.Validate(vars, "BOGUSCOLLation", ScopeSession)
c.Assert(err.Error(), Equals, "[ddl:1273]Unknown collation: 'BOGUSCOLLation'")
c.Assert(sv.SetSessionFromHook(vars, "latin1_bin"), IsNil)
c.Assert(vars.systems[CharacterSetServer], Equals, "latin1") // check it also changes charset.
c.Assert(sv.SetSessionFromHook(vars, "utf8mb4_bin"), IsNil)
c.Assert(vars.systems[CharacterSetServer], Equals, "utf8mb4") // check it also changes charset.
}

View File

@ -111,10 +111,11 @@ func int32ToBoolStr(i int32) string {
}
func checkCollation(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) {
if _, err := collate.GetCollationByName(normalizedValue); err != nil {
coll, err := collate.GetCollationByName(normalizedValue)
if err != nil {
return normalizedValue, errors.Trace(err)
}
return normalizedValue, nil
return coll.Name, nil
}
func checkCharacterSet(normalizedValue string, argName string) (string, error) {