diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index 42ee1b155e..eb3ec1f86d 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -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 := "" diff --git a/executor/show.go b/executor/show.go index 349a5ad307..08dbdf6349 100644 --- a/executor/show.go +++ b/executor/show.go @@ -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, diff --git a/plugin/integration_test.go b/plugin/integration_test.go index efd24f3e55..bf6eafc99a 100644 --- a/plugin/integration_test.go +++ b/plugin/integration_test.go @@ -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) + } } } diff --git a/session/session.go b/session/session.go index 7cb5e5001b..daa9b6a442 100644 --- a/session/session.go +++ b/session/session.go @@ -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 } diff --git a/session/session_test.go b/session/session_test.go index 31a932d052..f2ced1e086 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -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 {