Skip to content

Commit

Permalink
sysvar: tidb_enable_column_tracking only takes effect when tidb_persi…
Browse files Browse the repository at this point in the history
…st_analyze_options is turned on (#53481)

close #53478
  • Loading branch information
Rustin170506 committed May 23, 2024
1 parent 3485857 commit 100aa05
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 19 deletions.
4 changes: 2 additions & 2 deletions pkg/executor/test/analyzetest/analyze_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2166,15 +2166,15 @@ func TestShowAanalyzeStatusJobInfo(t *testing.T) {
tk.MustExec("delete from mysql.analyze_jobs")
}
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
tk.MustExec("set global tidb_persist_analyze_options = 1")
tk.MustExec("set global tidb_enable_column_tracking = 1")
tk.MustExec("select * from t where c > 1")
h := dom.StatsHandle()
require.NoError(t, h.DumpColStatsUsageToKV())
tk.MustExec("analyze table t predicate columns with 2 topn, 2 buckets")
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
tk.MustExec("analyze table t")
checkJobInfo("analyze table all columns with 256 buckets, 500 topn, 1 samplerate")
tk.MustExec("set global tidb_persist_analyze_options = 1")
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
tk.MustExec("analyze table t columns a with 1 topn, 3 buckets")
checkJobInfo("analyze table columns a, b, d with 3 buckets, 1 topn, 1 samplerate")
tk.MustExec("analyze table t")
Expand Down
59 changes: 42 additions & 17 deletions pkg/sessionctx/variable/sysvar.go
Original file line number Diff line number Diff line change
Expand Up @@ -986,12 +986,24 @@ var defaultSysVars = []*SysVar{
}},
{Scope: ScopeGlobal, Name: SkipNameResolve, Value: Off, Type: TypeBool},
{Scope: ScopeGlobal, Name: DefaultAuthPlugin, Value: mysql.AuthNativePassword, Type: TypeEnum, PossibleValues: []string{mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password, mysql.AuthLDAPSASL, mysql.AuthLDAPSimple}},
{Scope: ScopeGlobal, Name: TiDBPersistAnalyzeOptions, Value: BoolToOnOff(DefTiDBPersistAnalyzeOptions), Type: TypeBool,
{
Scope: ScopeGlobal,
Name: TiDBPersistAnalyzeOptions,
Value: BoolToOnOff(DefTiDBPersistAnalyzeOptions),
Type: TypeBool,
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
return BoolToOnOff(PersistAnalyzeOptions.Load()), nil
},
Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) {
persist := TiDBOptOn(normalizedValue)
if !persist && EnableColumnTracking.Load() {
return "", errors.Errorf("tidb_persist_analyze_options option cannot be set to OFF when tidb_enable_column_tracking is ON, as this will result in the loss of column tracking information")
}
return normalizedValue, nil
},
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
PersistAnalyzeOptions.Store(TiDBOptOn(val))
persist := TiDBOptOn(val)
PersistAnalyzeOptions.Store(persist)
return nil
},
},
Expand Down Expand Up @@ -1133,22 +1145,35 @@ var defaultSysVars = []*SysVar{
return nil
},
},
{Scope: ScopeGlobal, Name: TiDBEnableColumnTracking, Value: BoolToOnOff(DefTiDBEnableColumnTracking), Type: TypeBool, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
return BoolToOnOff(EnableColumnTracking.Load()), nil
}, SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
v := TiDBOptOn(val)
// If this is a user initiated statement,
// we log that column tracking is disabled.
if s.StmtCtx.StmtType == "Set" && !v {
// Set the location to UTC to avoid time zone interference.
disableTime := time.Now().UTC().Format(types.UTCTimeFormat)
if err := setTiDBTableValue(s, TiDBDisableColumnTrackingTime, disableTime, "Record the last time tidb_enable_column_tracking is set off"); err != nil {
return err
{
Scope: ScopeGlobal, Name: TiDBEnableColumnTracking,
Value: BoolToOnOff(DefTiDBEnableColumnTracking),
Type: TypeBool,
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
return BoolToOnOff(EnableColumnTracking.Load()), nil
},
Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) {
enabled := TiDBOptOn(normalizedValue)
persist := PersistAnalyzeOptions.Load()
if enabled && !persist {
return "", errors.Errorf("tidb_enable_column_tracking option cannot be set to ON when tidb_persist_analyze_options is set to OFF, as this will prevent the preservation of column tracking information")
}
}
EnableColumnTracking.Store(v)
return nil
}},
return normalizedValue, nil
},
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
enabled := TiDBOptOn(val)
// If this is a user initiated statement,
// we log that column tracking is disabled.
if s.StmtCtx.StmtType == "Set" && !enabled {
// Set the location to UTC to avoid time zone interference.
disableTime := time.Now().UTC().Format(types.UTCTimeFormat)
if err := setTiDBTableValue(s, TiDBDisableColumnTrackingTime, disableTime, "Record the last time tidb_enable_column_tracking is set off"); err != nil {
return err
}
}
EnableColumnTracking.Store(enabled)
return nil
}},
{Scope: ScopeGlobal, Name: RequireSecureTransport, Value: BoolToOnOff(DefRequireSecureTransport), Type: TypeBool,
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
return BoolToOnOff(tls.RequireSecureTransport.Load()), nil
Expand Down
66 changes: 66 additions & 0 deletions pkg/sessionctx/variable/sysvar_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1605,3 +1605,69 @@ func TestTiDBLowResTSOUpdateInterval(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "1000", val)
}

func TestSetEnableColumnTrackingAndPersistAnalyzeOptions(t *testing.T) {
vars := NewSessionVars(nil)
mock := NewMockGlobalAccessor4Tests()
mock.SessionVars = vars
vars.GlobalVarsAccessor = mock

// Test EnableColumnTracking
val, err := mock.GetGlobalSysVar(TiDBEnableColumnTracking)
require.NoError(t, err)
require.Equal(t, Off, val)
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
require.NoError(t, err)
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
require.NoError(t, err)
require.Equal(t, On, val)
// Reset back.
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, Off)
require.NoError(t, err)

// Test PersistAnalyzeOptions
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
require.NoError(t, err)
require.Equal(t, On, val)
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
require.NoError(t, err)
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
require.NoError(t, err)
require.Equal(t, Off, val)
// Reset back
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, On)
require.NoError(t, err)

// Set EnableColumnTracking to true when PersistAnalyzeOptions is false
// Set to false first.
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, Off)
require.NoError(t, err)
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
require.NoError(t, err)
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
require.NoError(t, err)
require.Equal(t, Off, val)
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
require.Error(t, err, "enable column tracking requires to persist analyze options")
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
require.NoError(t, err)
require.Equal(t, Off, val)

// Set PersistAnalyzeOptions to false when EnableColumnTracking is true
// Set to true first.
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, On)
require.NoError(t, err)
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
require.NoError(t, err)
require.Equal(t, On, val)
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
require.NoError(t, err)
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
require.NoError(t, err)
require.Equal(t, On, val)
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
require.Error(t, err, "persist analyze options requires to enable column tracking")
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
require.NoError(t, err)
require.Equal(t, On, val)
}

0 comments on commit 100aa05

Please sign in to comment.