Skip to content

Commit 100aa05

Browse files
authored
sysvar: tidb_enable_column_tracking only takes effect when tidb_persist_analyze_options is turned on (#53481)
close #53478
1 parent 3485857 commit 100aa05

File tree

3 files changed

+110
-19
lines changed

3 files changed

+110
-19
lines changed

pkg/executor/test/analyzetest/analyze_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2166,15 +2166,15 @@ func TestShowAanalyzeStatusJobInfo(t *testing.T) {
21662166
tk.MustExec("delete from mysql.analyze_jobs")
21672167
}
21682168
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
2169+
tk.MustExec("set global tidb_persist_analyze_options = 1")
21692170
tk.MustExec("set global tidb_enable_column_tracking = 1")
21702171
tk.MustExec("select * from t where c > 1")
21712172
h := dom.StatsHandle()
21722173
require.NoError(t, h.DumpColStatsUsageToKV())
21732174
tk.MustExec("analyze table t predicate columns with 2 topn, 2 buckets")
21742175
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
21752176
tk.MustExec("analyze table t")
2176-
checkJobInfo("analyze table all columns with 256 buckets, 500 topn, 1 samplerate")
2177-
tk.MustExec("set global tidb_persist_analyze_options = 1")
2177+
checkJobInfo("analyze table columns b, c, d with 2 buckets, 2 topn, 1 samplerate")
21782178
tk.MustExec("analyze table t columns a with 1 topn, 3 buckets")
21792179
checkJobInfo("analyze table columns a, b, d with 3 buckets, 1 topn, 1 samplerate")
21802180
tk.MustExec("analyze table t")

pkg/sessionctx/variable/sysvar.go

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -986,12 +986,24 @@ var defaultSysVars = []*SysVar{
986986
}},
987987
{Scope: ScopeGlobal, Name: SkipNameResolve, Value: Off, Type: TypeBool},
988988
{Scope: ScopeGlobal, Name: DefaultAuthPlugin, Value: mysql.AuthNativePassword, Type: TypeEnum, PossibleValues: []string{mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password, mysql.AuthLDAPSASL, mysql.AuthLDAPSimple}},
989-
{Scope: ScopeGlobal, Name: TiDBPersistAnalyzeOptions, Value: BoolToOnOff(DefTiDBPersistAnalyzeOptions), Type: TypeBool,
989+
{
990+
Scope: ScopeGlobal,
991+
Name: TiDBPersistAnalyzeOptions,
992+
Value: BoolToOnOff(DefTiDBPersistAnalyzeOptions),
993+
Type: TypeBool,
990994
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
991995
return BoolToOnOff(PersistAnalyzeOptions.Load()), nil
992996
},
997+
Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) {
998+
persist := TiDBOptOn(normalizedValue)
999+
if !persist && EnableColumnTracking.Load() {
1000+
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")
1001+
}
1002+
return normalizedValue, nil
1003+
},
9931004
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
994-
PersistAnalyzeOptions.Store(TiDBOptOn(val))
1005+
persist := TiDBOptOn(val)
1006+
PersistAnalyzeOptions.Store(persist)
9951007
return nil
9961008
},
9971009
},
@@ -1133,22 +1145,35 @@ var defaultSysVars = []*SysVar{
11331145
return nil
11341146
},
11351147
},
1136-
{Scope: ScopeGlobal, Name: TiDBEnableColumnTracking, Value: BoolToOnOff(DefTiDBEnableColumnTracking), Type: TypeBool, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
1137-
return BoolToOnOff(EnableColumnTracking.Load()), nil
1138-
}, SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
1139-
v := TiDBOptOn(val)
1140-
// If this is a user initiated statement,
1141-
// we log that column tracking is disabled.
1142-
if s.StmtCtx.StmtType == "Set" && !v {
1143-
// Set the location to UTC to avoid time zone interference.
1144-
disableTime := time.Now().UTC().Format(types.UTCTimeFormat)
1145-
if err := setTiDBTableValue(s, TiDBDisableColumnTrackingTime, disableTime, "Record the last time tidb_enable_column_tracking is set off"); err != nil {
1146-
return err
1148+
{
1149+
Scope: ScopeGlobal, Name: TiDBEnableColumnTracking,
1150+
Value: BoolToOnOff(DefTiDBEnableColumnTracking),
1151+
Type: TypeBool,
1152+
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
1153+
return BoolToOnOff(EnableColumnTracking.Load()), nil
1154+
},
1155+
Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) {
1156+
enabled := TiDBOptOn(normalizedValue)
1157+
persist := PersistAnalyzeOptions.Load()
1158+
if enabled && !persist {
1159+
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")
11471160
}
1148-
}
1149-
EnableColumnTracking.Store(v)
1150-
return nil
1151-
}},
1161+
return normalizedValue, nil
1162+
},
1163+
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
1164+
enabled := TiDBOptOn(val)
1165+
// If this is a user initiated statement,
1166+
// we log that column tracking is disabled.
1167+
if s.StmtCtx.StmtType == "Set" && !enabled {
1168+
// Set the location to UTC to avoid time zone interference.
1169+
disableTime := time.Now().UTC().Format(types.UTCTimeFormat)
1170+
if err := setTiDBTableValue(s, TiDBDisableColumnTrackingTime, disableTime, "Record the last time tidb_enable_column_tracking is set off"); err != nil {
1171+
return err
1172+
}
1173+
}
1174+
EnableColumnTracking.Store(enabled)
1175+
return nil
1176+
}},
11521177
{Scope: ScopeGlobal, Name: RequireSecureTransport, Value: BoolToOnOff(DefRequireSecureTransport), Type: TypeBool,
11531178
GetGlobal: func(_ context.Context, s *SessionVars) (string, error) {
11541179
return BoolToOnOff(tls.RequireSecureTransport.Load()), nil

pkg/sessionctx/variable/sysvar_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,3 +1605,69 @@ func TestTiDBLowResTSOUpdateInterval(t *testing.T) {
16051605
require.NoError(t, err)
16061606
require.Equal(t, "1000", val)
16071607
}
1608+
1609+
func TestSetEnableColumnTrackingAndPersistAnalyzeOptions(t *testing.T) {
1610+
vars := NewSessionVars(nil)
1611+
mock := NewMockGlobalAccessor4Tests()
1612+
mock.SessionVars = vars
1613+
vars.GlobalVarsAccessor = mock
1614+
1615+
// Test EnableColumnTracking
1616+
val, err := mock.GetGlobalSysVar(TiDBEnableColumnTracking)
1617+
require.NoError(t, err)
1618+
require.Equal(t, Off, val)
1619+
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
1620+
require.NoError(t, err)
1621+
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
1622+
require.NoError(t, err)
1623+
require.Equal(t, On, val)
1624+
// Reset back.
1625+
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, Off)
1626+
require.NoError(t, err)
1627+
1628+
// Test PersistAnalyzeOptions
1629+
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
1630+
require.NoError(t, err)
1631+
require.Equal(t, On, val)
1632+
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
1633+
require.NoError(t, err)
1634+
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
1635+
require.NoError(t, err)
1636+
require.Equal(t, Off, val)
1637+
// Reset back
1638+
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, On)
1639+
require.NoError(t, err)
1640+
1641+
// Set EnableColumnTracking to true when PersistAnalyzeOptions is false
1642+
// Set to false first.
1643+
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, Off)
1644+
require.NoError(t, err)
1645+
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
1646+
require.NoError(t, err)
1647+
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
1648+
require.NoError(t, err)
1649+
require.Equal(t, Off, val)
1650+
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
1651+
require.Error(t, err, "enable column tracking requires to persist analyze options")
1652+
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
1653+
require.NoError(t, err)
1654+
require.Equal(t, Off, val)
1655+
1656+
// Set PersistAnalyzeOptions to false when EnableColumnTracking is true
1657+
// Set to true first.
1658+
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, On)
1659+
require.NoError(t, err)
1660+
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
1661+
require.NoError(t, err)
1662+
require.Equal(t, On, val)
1663+
err = mock.SetGlobalSysVar(context.Background(), TiDBEnableColumnTracking, On)
1664+
require.NoError(t, err)
1665+
val, err = mock.GetGlobalSysVar(TiDBEnableColumnTracking)
1666+
require.NoError(t, err)
1667+
require.Equal(t, On, val)
1668+
err = mock.SetGlobalSysVar(context.Background(), TiDBPersistAnalyzeOptions, Off)
1669+
require.Error(t, err, "persist analyze options requires to enable column tracking")
1670+
val, err = mock.GetGlobalSysVar(TiDBPersistAnalyzeOptions)
1671+
require.NoError(t, err)
1672+
require.Equal(t, On, val)
1673+
}

0 commit comments

Comments
 (0)