*: use session time_zone for is.tables and show table status (#32449)

ref pingcap/tidb#26642
This commit is contained in:
Mattias Jonsson
2022-02-28 23:09:45 +01:00
committed by GitHub
parent f9a324829b
commit 584ae75df5
5 changed files with 41 additions and 5 deletions

View File

@ -512,13 +512,17 @@ func (e *memtableRetriever) setDataFromTables(ctx context.Context, sctx sessionc
var rows [][]types.Datum
createTimeTp := mysql.TypeDatetime
loc := sctx.GetSessionVars().TimeZone
if loc == nil {
loc = time.Local
}
for _, schema := range schemas {
for _, table := range schema.Tables {
collation := table.Collate
if collation == "" {
collation = mysql.DefaultCollationName
}
createTime := types.NewTime(types.FromGoTime(table.GetUpdateTime()), createTimeTp, types.DefaultFsp)
createTime := types.NewTime(types.FromGoTime(table.GetUpdateTime().In(loc)), createTimeTp, types.DefaultFsp)
createOptions := ""

View File

@ -500,7 +500,7 @@ func (e *ShowExec) fetchShowTableStatus(ctx context.Context) error {
snapshot = e.ctx.GetSessionVars().SnapshotTS
}
rows, _, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionWithSnapshot(snapshot)},
rows, _, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionWithSnapshot(snapshot), sqlexec.ExecOptionUseCurSession},
`SELECT table_name, engine, version, row_format, table_rows,
avg_row_length, data_length, max_data_length, index_length,
data_free, auto_increment, create_time, update_time, check_time,

View File

@ -50,6 +50,7 @@ func TestAuditLogNormal(t *testing.T) {
tables string
cmd string
event plugin.GeneralEvent
resCnt int
}
tests := []normalTest{
@ -507,6 +508,7 @@ func TestAuditLogNormal(t *testing.T) {
{
sql: "SHOW TABLE STATUS LIKE 't1'",
stmtType: "Show",
resCnt: 3, // Start + SHOW TABLE + Internal SELECT .. FROM IS.TABLES in current session
},
{
sql: "SHOW TABLES",
@ -696,12 +698,18 @@ func TestAuditLogNormal(t *testing.T) {
query := append([]byte{mysql.ComQuery}, []byte(test.sql)...)
err := conn.Dispatch(context.Background(), query)
require.NoError(t, err, errMsg)
require.Equal(t, 2, len(testResults), errMsg)
resultCount := test.resCnt
if resultCount == 0 {
resultCount = 2
}
require.Equal(t, resultCount, len(testResults), errMsg)
result := testResults[0]
// TODO: currently, result.text is wrong.
require.Equal(t, "Query", result.cmd, errMsg)
require.Equal(t, plugin.Starting, result.event, errMsg)
result = testResults[1]
result = testResults[resultCount-1]
require.Equal(t, "Query", result.cmd, errMsg)
if test.text == "" {
require.Equal(t, test.sql, result.text, errMsg)
} else {
@ -713,6 +721,11 @@ func TestAuditLogNormal(t *testing.T) {
require.Equal(t, test.tables, result.tables, errMsg)
require.Equal(t, "Query", result.cmd, errMsg)
require.Equal(t, plugin.Completed, result.event, errMsg)
for i := 1; i < resultCount-1; i++ {
result = testResults[i]
require.Equal(t, "Query", result.cmd, errMsg)
require.Equal(t, plugin.Completed, result.event, errMsg)
}
}
}

View File

@ -1672,12 +1672,18 @@ func (s *session) useCurrentSession(execOption sqlexec.ExecOption) (*session, fu
if execOption.AnalyzeVer != 0 {
s.sessionVars.AnalyzeVersion = execOption.AnalyzeVer
}
prevSQL := s.sessionVars.StmtCtx.OriginalSQL
prevStmtType := s.sessionVars.StmtCtx.StmtType
prevTables := s.sessionVars.StmtCtx.Tables
return s, func() {
s.sessionVars.AnalyzeVersion = prevStatsVer
if err := s.sessionVars.SetSystemVar(variable.TiDBSnapshot, ""); err != nil {
logutil.BgLogger().Error("set tidbSnapshot error", zap.Error(err))
}
s.sessionVars.SnapshotInfoschema = nil
s.sessionVars.StmtCtx.OriginalSQL = prevSQL
s.sessionVars.StmtCtx.StmtType = prevStmtType
s.sessionVars.StmtCtx.Tables = prevTables
}, nil
}

View File

@ -2132,17 +2132,30 @@ func (s *testSessionSuite2) TestDeletePanic(c *C) {
func (s *testSessionSuite2) TestInformationSchemaCreateTime(c *C) {
tk := testkit.NewTestKitWithInit(c, s.store)
tk.MustExec("create table t (c int)")
tk.MustExec(`set @@time_zone = 'Asia/Shanghai'`)
ret := tk.MustQuery("select create_time from information_schema.tables where table_name='t';")
// Make sure t1 is greater than t.
time.Sleep(time.Second)
tk.MustExec("alter table t modify c int default 11")
ret1 := tk.MustQuery("select create_time from information_schema.tables where table_name='t';")
ret2 := tk.MustQuery("show table status like 't'")
c.Assert(ret1.Rows()[0][0].(string), Equals, ret2.Rows()[0][11].(string))
t, err := types.ParseDatetime(nil, ret.Rows()[0][0].(string))
c.Assert(err, IsNil)
t1, err := types.ParseDatetime(nil, ret1.Rows()[0][0].(string))
c.Assert(err, IsNil)
r := t1.Compare(t)
c.Assert(r, Equals, 1)
// Check that time_zone changes makes the create_time different
tk.MustExec(`set @@time_zone = 'Europe/Amsterdam'`)
ret = tk.MustQuery(`select create_time from information_schema.tables where table_name='t'`)
ret2 = tk.MustQuery(`show table status like 't'`)
c.Assert(ret.Rows()[0][0].(string), Equals, ret2.Rows()[0][11].(string))
t, err = types.ParseDatetime(nil, ret.Rows()[0][0].(string))
c.Assert(err, IsNil)
// Asia/Shanghai 2022-02-17 17:40:05 > Europe/Amsterdam 2022-02-17 10:40:05
r = t1.Compare(t)
c.Assert(r, Equals, 1)
}
type testSchemaSuiteBase struct {