Skip to content

Commit d25aa31

Browse files
authored
create system variable interface (#2375)
1 parent 025d6bf commit d25aa31

File tree

16 files changed

+1055
-880
lines changed

16 files changed

+1055
-880
lines changed

enginetest/enginetests.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -903,18 +903,29 @@ func setSecureFilePriv() error {
903903

904904
func TestLoadData(t *testing.T, harness Harness) {
905905
harness.Setup(setup.MydbData)
906+
e := mustNewEngine(t, harness)
907+
defer e.Close()
906908

907909
require.NoError(t, setSecureFilePriv())
908-
TestQuery(t, harness, "select @@secure_file_priv != '';", []sql.Row{{true}}, nil, nil)
910+
TestQueryWithEngine(t, harness, e, queries.QueryTest{
911+
Query: "select @@global.secure_file_priv != '';",
912+
Expected: []sql.Row{{true}},
913+
})
909914

910915
for _, script := range queries.LoadDataScripts {
911916
TestScript(t, harness, script)
912917
}
913918
}
914919

915920
func TestLoadDataErrors(t *testing.T, harness Harness) {
921+
e := mustNewEngine(t, harness)
922+
defer e.Close()
923+
916924
require.NoError(t, setSecureFilePriv())
917-
TestQuery(t, harness, "select @@secure_file_priv != '';", []sql.Row{{true}}, nil, nil)
925+
TestQueryWithEngine(t, harness, e, queries.QueryTest{
926+
Query: "select @@global.secure_file_priv != '';",
927+
Expected: []sql.Row{{true}},
928+
})
918929

919930
for _, script := range queries.LoadDataErrorScripts {
920931
TestScript(t, harness, script)
@@ -923,9 +934,14 @@ func TestLoadDataErrors(t *testing.T, harness Harness) {
923934

924935
func TestLoadDataFailing(t *testing.T, harness Harness) {
925936
t.Skip()
937+
e := mustNewEngine(t, harness)
938+
defer e.Close()
926939

927940
require.NoError(t, setSecureFilePriv())
928-
TestQuery(t, harness, "select @@secure_file_priv != '';", []sql.Row{{true}}, nil, nil)
941+
TestQueryWithEngine(t, harness, e, queries.QueryTest{
942+
Query: "select @@global.secure_file_priv != '';",
943+
Expected: []sql.Row{{true}},
944+
})
929945

930946
for _, script := range queries.LoadDataFailingScripts {
931947
TestScript(t, harness, script)
@@ -942,7 +958,10 @@ func TestSelectIntoFile(t *testing.T, harness Harness) {
942958
require.NoError(t, err, nil)
943959

944960
require.NoError(t, setSecureFilePriv())
945-
TestQuery(t, harness, "select @@secure_file_priv != '';", []sql.Row{{true}}, nil, nil)
961+
TestQueryWithEngine(t, harness, e, queries.QueryTest{
962+
Query: "select @@global.secure_file_priv != '';",
963+
Expected: []sql.Row{{true}},
964+
})
946965

947966
tests := []struct {
948967
file string

memory/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func (s *Session) PersistGlobal(sysVarName string, value interface{}) error {
196196
if !ok {
197197
return sql.ErrUnknownSystemVariable.New(sysVarName)
198198
}
199-
val, _, err := sysVar.Type.Convert(value)
199+
val, _, err := sysVar.GetType().Convert(value)
200200
if err != nil {
201201
return err
202202
}

server/server_config_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
func TestConfigWithDefaults(t *testing.T) {
3030
tests := []struct {
3131
Name string
32-
Scope sql.SystemVariableScope
32+
Scope sql.MysqlSVScopeType
3333
Type sql.SystemVariableType
3434
ConfigField string
3535
Default interface{}
@@ -63,13 +63,15 @@ func TestConfigWithDefaults(t *testing.T) {
6363
for _, test := range tests {
6464
t.Run(fmt.Sprintf("server config var: %s", test.Name), func(t *testing.T) {
6565
variables.InitSystemVariables()
66-
sql.SystemVariables.AddSystemVariables([]sql.SystemVariable{{
67-
Name: test.Name,
68-
Scope: test.Scope,
69-
Dynamic: true,
70-
Type: test.Type,
71-
Default: test.Default,
72-
}})
66+
sql.SystemVariables.AddSystemVariables([]sql.SystemVariable{
67+
&sql.MysqlSystemVariable{
68+
Name: test.Name,
69+
Scope: sql.GetMysqlScope(test.Scope),
70+
Dynamic: true,
71+
Type: test.Type,
72+
Default: test.Default,
73+
},
74+
})
7375
serverConf := Config{}
7476
serverConf, err := serverConf.NewConfig()
7577
assert.NoError(t, err)

sql/base_session.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func (s *BaseSession) GetAllSessionVariables() map[string]interface{} {
125125
defer s.mu.RUnlock()
126126

127127
for k, v := range s.systemVars {
128-
if sysType, ok := v.Var.Type.(SetType); ok {
128+
if sysType, ok := v.Var.GetType().(SetType); ok {
129129
if sv, ok := v.Val.(uint64); ok {
130130
if svStr, err := sysType.BitsToString(sv); err == nil {
131131
m[k] = svStr
@@ -152,16 +152,16 @@ func (s *BaseSession) SetSessionVariable(ctx *Context, sysVarName string, value
152152
if !ok {
153153
return ErrUnknownSystemVariable.New(sysVarName)
154154
}
155-
return s.setSessVar(ctx, sv, value)
155+
return s.setSessVar(ctx, sv, value, false)
156156
} else {
157157
return ErrUnknownSystemVariable.New(sysVarName)
158158
}
159159
}
160160

161-
if !sysVar.Var.Dynamic || sysVar.Var.ValueFunction != nil {
161+
if sysVar.Var.IsReadOnly() {
162162
return ErrSystemVariableReadOnly.New(sysVarName)
163163
}
164-
return s.setSessVar(ctx, sysVar.Var, value)
164+
return s.setSessVar(ctx, sysVar.Var, value, false)
165165
}
166166

167167
// InitSessionVariable implements the Session interface and is used to initialize variables (Including read-only variables)
@@ -171,36 +171,33 @@ func (s *BaseSession) InitSessionVariable(ctx *Context, sysVarName string, value
171171
return ErrUnknownSystemVariable.New(sysVarName)
172172
}
173173

174-
val, ok := s.systemVars[sysVar.Name]
175-
if ok && val.Val != sysVar.Default {
174+
sysVarName = strings.ToLower(sysVarName)
175+
val, ok := s.systemVars[sysVarName]
176+
if ok && val.Val != sysVar.GetDefault() {
176177
return ErrSystemVariableReinitialized.New(sysVarName)
177178
}
178179

179-
return s.setSessVar(ctx, sysVar, value)
180+
return s.setSessVar(ctx, sysVar, value, true)
180181
}
181182

182-
func (s *BaseSession) setSessVar(ctx *Context, sysVar SystemVariable, value interface{}) error {
183-
if sysVar.Scope == SystemVariableScope_Global {
184-
return ErrSystemVariableGlobalOnly.New(sysVar.Name)
185-
}
186-
convertedVal, _, err := sysVar.Type.Convert(value)
187-
if err != nil {
188-
return err
189-
}
183+
func (s *BaseSession) setSessVar(ctx *Context, sysVar SystemVariable, value interface{}, init bool) error {
190184
s.mu.Lock()
191185
defer s.mu.Unlock()
192-
svv := SystemVarValue{
193-
Var: sysVar,
194-
Val: convertedVal,
195-
}
196-
197-
if sysVar.NotifyChanged != nil {
198-
err := sysVar.NotifyChanged(SystemVariableScope_Session, svv)
186+
var svv SystemVarValue
187+
var err error
188+
if init {
189+
svv, err = sysVar.InitValue(value, false)
190+
if err != nil {
191+
return err
192+
}
193+
} else {
194+
svv, err = sysVar.SetValue(value, false)
199195
if err != nil {
200196
return err
201197
}
202198
}
203-
s.systemVars[sysVar.Name] = svv
199+
sysVarName := strings.ToLower(sysVar.GetName())
200+
s.systemVars[sysVarName] = svv
204201
return nil
205202
}
206203

@@ -220,7 +217,7 @@ func (s *BaseSession) GetSessionVariable(ctx *Context, sysVarName string) (inter
220217
return nil, ErrUnknownSystemVariable.New(sysVarName)
221218
}
222219
// TODO: this is duplicated from within variables.globalSystemVariables, suggesting the need for an interface
223-
if sysType, ok := sysVar.Var.Type.(SetType); ok {
220+
if sysType, ok := sysVar.Var.GetType().(SetType); ok {
224221
if sv, ok := sysVar.Val.(uint64); ok {
225222
return sysType.BitsToString(sv)
226223
}

0 commit comments

Comments
 (0)