From 8ddbd7062ee52b021fa002a160a5fced85302307 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Tue, 20 Nov 2018 11:25:49 +0800 Subject: [PATCH] session: fix bootstrap error in ANSI sql_mode (#8353) --- session/bootstrap_test.go | 27 +++++++++++++++++++++++++++ session/session.go | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index e0d96951f4..451292d768 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -259,6 +259,33 @@ func (s *testBootstrapSuite) TestUpgrade(c *C) { c.Assert(ver, Equals, int64(currentBootstrapVersion)) } +func (s *testBootstrapSuite) TestANSISQLMode(c *C) { + defer testleak.AfterTest(c)() + store, dom := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + se := newSession(c, store, s.dbName) + mustExecSQL(c, se, "USE mysql;") + mustExecSQL(c, se, `set @@global.sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI"`) + mustExecSQL(c, se, `delete from mysql.TiDB where VARIABLE_NAME="tidb_server_version";`) + delete(storeBootstrapped, store.UUID()) + se.Close() + + // Do some clean up, BootstrapSession will not create a new domain otherwise. + dom.Close() + domap.Delete(store) + + // Set ANSI sql_mode and bootstrap again, to cover a bugfix. + // Once we have a SQL like that: + // select variable_value from mysql.tidb where variable_name = "system_tz" + // it fails to execute in the ANSI sql_mode, and makes TiDB cluster fail to bootstrap. + dom1, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer dom1.Close() + se = newSession(c, store, s.dbName) + mustExecSQL(c, se, "select @@global.sql_mode") + se.Close() +} + func (s *testBootstrapSuite) TestOldPasswordUpgrade(c *C) { pwd := "abc" oldpwd := fmt.Sprintf("%X", auth.Sha1Hash([]byte(pwd))) diff --git a/session/session.go b/session/session.go index 07e95fe048..d51c97dd71 100644 --- a/session/session.go +++ b/session/session.go @@ -1104,7 +1104,7 @@ func CreateSession(store kv.Storage) (Session, error) { // loadSystemTZ loads systemTZ from mysql.tidb func loadSystemTZ(se *session) (string, error) { - sql := `select variable_value from mysql.tidb where variable_name = "system_tz"` + sql := `select variable_value from mysql.tidb where variable_name = 'system_tz'` rss, errLoad := se.Execute(context.Background(), sql) if errLoad != nil { return "", errLoad