*: use session time_zone for is.tables and show table status (#32449)
ref pingcap/tidb#26642
This commit is contained in:
@ -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 := ""
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user