@@ -54,12 +54,14 @@ type SourceDumpPrivilegeChecker struct {
5454 checkTables []filter.Table
5555 consistency string
5656 dumpWholeInstance bool
57+ version string
5758}
5859
5960// NewSourceDumpPrivilegeChecker returns a RealChecker.
6061func NewSourceDumpPrivilegeChecker (
6162 db * sql.DB ,
6263 dbinfo * dbutil.DBConfig ,
64+ version string ,
6365 checkTables []filter.Table ,
6466 consistency string ,
6567 dumpWholeInstance bool ,
@@ -70,6 +72,7 @@ func NewSourceDumpPrivilegeChecker(
7072 checkTables : checkTables ,
7173 consistency : consistency ,
7274 dumpWholeInstance : dumpWholeInstance ,
75+ version : version ,
7376 }
7477}
7578
@@ -107,7 +110,7 @@ func (pc *SourceDumpPrivilegeChecker) Check(ctx context.Context) *Result {
107110 dumpRequiredPrivs [mysql .LockTablesPriv ] = priv {needGlobal : true }
108111 }
109112
110- err2 := verifyPrivilegesWithResult (result , grants , dumpRequiredPrivs )
113+ err2 := verifyPrivilegesWithResult (result , grants , dumpRequiredPrivs , pc . version )
111114 if err2 != nil {
112115 result .Errors = append (result .Errors , err2 )
113116 result .Instruction = "Please grant the required privileges to the account."
@@ -126,13 +129,14 @@ func (pc *SourceDumpPrivilegeChecker) Name() string {
126129
127130// SourceReplicatePrivilegeChecker checks replication privileges of source DB.
128131type SourceReplicatePrivilegeChecker struct {
129- db * sql.DB
130- dbinfo * dbutil.DBConfig
132+ db * sql.DB
133+ dbinfo * dbutil.DBConfig
134+ version string
131135}
132136
133137// NewSourceReplicationPrivilegeChecker returns a RealChecker.
134- func NewSourceReplicationPrivilegeChecker (db * sql.DB , dbinfo * dbutil.DBConfig ) RealChecker {
135- return & SourceReplicatePrivilegeChecker {db : db , dbinfo : dbinfo }
138+ func NewSourceReplicationPrivilegeChecker (db * sql.DB , dbinfo * dbutil.DBConfig , version string ) RealChecker {
139+ return & SourceReplicatePrivilegeChecker {db : db , dbinfo : dbinfo , version : version }
136140}
137141
138142// Check implements the RealChecker interface.
@@ -154,7 +158,7 @@ func (pc *SourceReplicatePrivilegeChecker) Check(ctx context.Context) *Result {
154158 mysql .ReplicationSlavePriv : {needGlobal : true },
155159 mysql .ReplicationClientPriv : {needGlobal : true },
156160 }
157- err2 := verifyPrivilegesWithResult (result , grants , replRequiredPrivs )
161+ err2 := verifyPrivilegesWithResult (result , grants , replRequiredPrivs , pc . version )
158162 if err2 != nil {
159163 result .Errors = append (result .Errors , err2 )
160164 result .State = StateFailure
@@ -169,12 +173,13 @@ func (pc *SourceReplicatePrivilegeChecker) Name() string {
169173}
170174
171175type TargetPrivilegeChecker struct {
172- db * sql.DB
173- dbinfo * dbutil.DBConfig
176+ db * sql.DB
177+ dbinfo * dbutil.DBConfig
178+ version string
174179}
175180
176- func NewTargetPrivilegeChecker (db * sql.DB , dbinfo * dbutil.DBConfig ) RealChecker {
177- return & TargetPrivilegeChecker {db : db , dbinfo : dbinfo }
181+ func NewTargetPrivilegeChecker (db * sql.DB , dbinfo * dbutil.DBConfig , version string ) RealChecker {
182+ return & TargetPrivilegeChecker {db : db , dbinfo : dbinfo , version : version }
178183}
179184
180185func (t * TargetPrivilegeChecker ) Name () string {
@@ -203,7 +208,7 @@ func (t *TargetPrivilegeChecker) Check(ctx context.Context) *Result {
203208 mysql .DropPriv : {needGlobal : true },
204209 mysql .IndexPriv : {needGlobal : true },
205210 }
206- err2 := verifyPrivilegesWithResult (result , grants , replRequiredPrivs )
211+ err2 := verifyPrivilegesWithResult (result , grants , replRequiredPrivs , t . version )
207212 if err2 != nil {
208213 result .Errors = append (result .Errors , err2 )
209214 // because we cannot be very precisely sure about which table
@@ -217,8 +222,9 @@ func verifyPrivilegesWithResult(
217222 result * Result ,
218223 grants []string ,
219224 requiredPriv map [mysql.PrivilegeType ]priv ,
225+ version string ,
220226) * Error {
221- lackedPriv , err := VerifyPrivileges (grants , requiredPriv )
227+ lackedPriv , err := VerifyPrivileges (grants , requiredPriv , version )
222228 if err != nil {
223229 // nolint
224230 return NewError ("%s" , err .Error ())
@@ -284,12 +290,19 @@ func LackedPrivilegesAsStr(lackPriv map[mysql.PrivilegeType]priv) string {
284290func VerifyPrivileges (
285291 grants []string ,
286292 lackPrivs map [mysql.PrivilegeType ]priv ,
293+ version string ,
287294) (map [mysql.PrivilegeType ]priv , error ) {
288295 if len (grants ) == 0 {
289296 return nil , errors .New ("there is no such grant defined for current user on host '%%'" )
290297 }
291298
292299 p := parser .New ()
300+
301+ // Support for BINLOG MONITOR and other MariaDB things
302+ if strings .Contains (version , "MariaDB" ) {
303+ p .SetMariaDB (true )
304+ }
305+
293306 for _ , grant := range grants {
294307 if len (lackPrivs ) == 0 {
295308 break
0 commit comments