From 6eb02fbe5ed448a2c814dd5563414fb733274329 Mon Sep 17 00:00:00 2001 From: unconsolable Date: Thu, 7 Oct 2021 12:23:22 +0800 Subject: [PATCH] session: support references on column (#28546) --- go.mod | 2 +- go.sum | 4 ++-- session/bootstrap.go | 16 +++++++++++++--- session/bootstrap_test.go | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index af31eb026ff06..845066625d50e 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 github.com/pingcap/kvproto v0.0.0-20210806074406-317f69fb54b4 github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 - github.com/pingcap/parser v0.0.0-20211004011848-db58bac78f2a + github.com/pingcap/parser v0.0.0-20211004012448-687005894c4e github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5 github.com/pingcap/tidb-tools v5.0.3+incompatible github.com/pingcap/tipb v0.0.0-20210802080519-94b831c6db55 diff --git a/go.sum b/go.sum index de9977a6177a3..8e438145e44d6 100644 --- a/go.sum +++ b/go.sum @@ -603,8 +603,8 @@ github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuR github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ= github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/parser v0.0.0-20210525032559-c37778aff307/go.mod h1:xZC8I7bug4GJ5KtHhgAikjTfU4kBv1Sbo3Pf1MZ6lVw= -github.com/pingcap/parser v0.0.0-20211004011848-db58bac78f2a h1:W3BnzcjP9j7EsRHEwRb0zMLSHTjFW14zB/GMk7tlIhg= -github.com/pingcap/parser v0.0.0-20211004011848-db58bac78f2a/go.mod h1:+xcMiiZzdIktT/Nqdfm81dkECJ2EPuoAYywd57py4Pk= +github.com/pingcap/parser v0.0.0-20211004012448-687005894c4e h1:dPMDpj+7ng9qEWoT3n6qjpB1ohz79uTLVM6ILW+ZMT0= +github.com/pingcap/parser v0.0.0-20211004012448-687005894c4e/go.mod h1:+xcMiiZzdIktT/Nqdfm81dkECJ2EPuoAYywd57py4Pk= github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= github.com/pingcap/sysutil v0.0.0-20210315073920-cc0985d983a3/go.mod h1:tckvA041UWP+NqYzrJ3fMgC/Hw9wnmQ/tUkp/JaHly8= github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5 h1:7rvAtZe/ZUzOKzgriNPQoBNvleJXBk4z7L3Z47+tS98= diff --git a/session/bootstrap.go b/session/bootstrap.go index 73c7e23967282..8a1044e59a20a 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -132,7 +132,7 @@ const ( Grantor CHAR(77), Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, Table_priv SET('Select','Insert','Update','Delete','Create','Drop','Grant','Index','Alter','Create View','Show View','Trigger','References'), - Column_priv SET('Select','Insert','Update'), + Column_priv SET('Select','Insert','Update','References'), PRIMARY KEY (Host, DB, User, Table_name));` // CreateColumnPrivTable is the SQL statement creates column scope privilege table in system db. CreateColumnPrivTable = `CREATE TABLE IF NOT EXISTS mysql.columns_priv( @@ -142,7 +142,7 @@ const ( Table_name CHAR(64), Column_name CHAR(64), Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - Column_priv SET('Select','Insert','Update'), + Column_priv SET('Select','Insert','Update','References'), PRIMARY KEY (Host, DB, User, Table_name, Column_name));` // CreateGlobalVariablesTable is the SQL statement creates global variable table in system db. // TODO: MySQL puts GLOBAL_VARIABLES table in INFORMATION_SCHEMA db. @@ -513,11 +513,13 @@ const ( version74 = 74 // version75 update mysql.*.host from char(60) to char(255) version75 = 75 + // version76 update mysql.columns_priv from SET('Select','Insert','Update') to SET('Select','Insert','Update','References') + version76 = 76 ) // currentBootstrapVersion is defined as a variable, so we can modify its value for testing. // please make sure this is the largest version -var currentBootstrapVersion int64 = version75 +var currentBootstrapVersion int64 = version76 var ( bootstrapVersion = []func(Session, int64){ @@ -596,6 +598,7 @@ var ( upgradeToVer73, upgradeToVer74, upgradeToVer75, + upgradeToVer76, } ) @@ -1571,6 +1574,13 @@ func upgradeToVer75(s Session, ver int64) { doReentrantDDL(s, "ALTER TABLE mysql.columns_priv MODIFY COLUMN Host CHAR(255)") } +func upgradeToVer76(s Session, ver int64) { + if ver >= version76 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.columns_priv MODIFY COLUMN Column_priv SET('Select','Insert','Update','References')") +} + func writeOOMAction(s Session) { comment := "oom-action is `log` by default in v3.0.x, `cancel` by default in v4.0.11+" mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index 68b46e75c98ab..23c31c78bf30a 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -845,3 +845,21 @@ func (s *testBootstrapSuite) TestForIssue23387(c *C) { c.Assert(len(rows), Equals, 1) c.Assert(rows[0][0], Equals, "GRANT USAGE ON *.* TO 'quatest'@'%'") } + +func (s *testBootstrapSuite) TestReferencesPrivOnCol(c *C) { + defer testleak.AfterTest(c)() + store, dom := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + defer dom.Close() + se := newSession(c, store, s.dbName) + + defer func() { + mustExecSQL(c, se, "drop user if exists issue28531") + mustExecSQL(c, se, "drop table if exists t1") + }() + + mustExecSQL(c, se, "create user if not exists issue28531") + mustExecSQL(c, se, "drop table if exists t1") + mustExecSQL(c, se, "create table t1 (a int)") + mustExecSQL(c, se, "GRANT select (a), update (a),insert(a), references(a) on t1 to issue28531") +}