@@ -230,18 +230,46 @@ func (e *SimpleExec) executeDropUser(s *ast.DropUserStmt) error {
230
230
}
231
231
continue
232
232
}
233
+
234
+ // begin a transaction to delete a user.
235
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), "begin" ); err != nil {
236
+ return errors .Trace (err )
237
+ }
233
238
sql := fmt .Sprintf (`DELETE FROM %s.%s WHERE Host = "%s" and User = "%s";` , mysql .SystemDB , mysql .UserTable , user .Hostname , user .Username )
234
- _ , _ , err = e .ctx .(sqlexec.RestrictedSQLExecutor ).ExecRestrictedSQL (e .ctx , sql )
235
- if err != nil {
239
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), sql ); err != nil {
240
+ failedUsers = append (failedUsers , user .String ())
241
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), "rollback" ); err != nil {
242
+ return errors .Trace (err )
243
+ }
244
+ continue
245
+ }
246
+
247
+ // delete privileges from mysql.db
248
+ sql = fmt .Sprintf (`DELETE FROM %s.%s WHERE Host = "%s" and User = "%s";` , mysql .SystemDB , mysql .DBTable , user .Hostname , user .Username )
249
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), sql ); err != nil {
250
+ failedUsers = append (failedUsers , user .String ())
251
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), "rollback" ); err != nil {
252
+ return errors .Trace (err )
253
+ }
254
+ continue
255
+ }
256
+
257
+ // delete privileges from mysql.tables_priv
258
+ sql = fmt .Sprintf (`DELETE FROM %s.%s WHERE Host = "%s" and User = "%s";` , mysql .SystemDB , mysql .TablePrivTable , user .Hostname , user .Username )
259
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), sql ); err != nil {
260
+ failedUsers = append (failedUsers , user .String ())
261
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), "rollback" ); err != nil {
262
+ return errors .Trace (err )
263
+ }
264
+ continue
265
+ }
266
+
267
+ //TODO: need delete columns_priv once we implement columns_priv functionality.
268
+ if _ , err := e .ctx .(sqlexec.SQLExecutor ).Execute (context .Background (), "commit" ); err != nil {
236
269
failedUsers = append (failedUsers , user .String ())
237
270
}
238
271
}
239
272
if len (failedUsers ) > 0 {
240
- // Commit the transaction even if we returns error
241
- err := e .ctx .Txn ().Commit (sessionctx .SetConnID2Ctx (context .Background (), e .ctx ))
242
- if err != nil {
243
- return errors .Trace (err )
244
- }
245
273
errMsg := "Operation DROP USER failed for " + strings .Join (failedUsers , "," )
246
274
return terror .ClassExecutor .New (CodeCannotUser , errMsg )
247
275
}
0 commit comments