diff --git a/executor/grant.go b/executor/grant.go index cbe15b2c350d0..650ebcc2a1445 100644 --- a/executor/grant.go +++ b/executor/grant.go @@ -126,6 +126,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { // Create internal session to start internal transaction. isCommit := false internalSession, err := e.getSysSession() + internalSession.GetSessionVars().User = e.ctx.GetSessionVars().User if err != nil { return err } diff --git a/executor/grant_test.go b/executor/grant_test.go index 240e9e5e41154..f90f36c3b0c6d 100644 --- a/executor/grant_test.go +++ b/executor/grant_test.go @@ -595,3 +595,18 @@ func TestNonExistTableIllegalGrant(t *testing.T) { // Column level, not existing table, illegal privilege tk.MustGetErrCode("grant create temporary tables (NotExistsCol) on NotExistsD29302.NotExistsT29302 to u29302;", mysql.ErrWrongUsage) } + +func TestIssue38293(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.Session().GetSessionVars().User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} + tk.MustExec("DROP USER IF EXISTS test") + tk.MustExec("CREATE USER test") + defer func() { + tk.MustExec("DROP USER test") + }() + tk.MustExec("GRANT SELECT ON `mysql`.`db` TO test") + tk.MustQuery("SELECT `Grantor` FROM `mysql`.`tables_priv` WHERE User = 'test'").Check(testkit.Rows("root@localhost")) +}