diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 8185789a939..eec95cbd32a 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -624,6 +624,25 @@ GRANT USAGE ON *.* TO 'mysqltest_7'@'' IDENTIFIED BY PASSWORD '*2FB071A056F9BB74 drop user mysqltest_7@; show grants for mysqltest_7@; ERROR 42000: There is no such grant defined for user 'mysqltest_7' on host '' +create database mysqltest; +use mysqltest; +create table t1(f1 int); +GRANT DELETE ON mysqltest.t1 TO mysqltest1@'%'; +GRANT SELECT ON mysqltest.t1 TO mysqltest1@'192.%'; +show grants for mysqltest1@'192.%'; +Grants for mysqltest1@192.% +GRANT USAGE ON *.* TO 'mysqltest1'@'192.%' +GRANT SELECT ON `mysqltest`.`t1` TO 'mysqltest1'@'192.%' +show grants for mysqltest1@'%'; +Grants for mysqltest1@% +GRANT USAGE ON *.* TO 'mysqltest1'@'%' +GRANT DELETE ON `mysqltest`.`t1` TO 'mysqltest1'@'%' +delete from mysql.user where user='mysqltest1'; +delete from mysql.db where user='mysqltest1'; +delete from mysql.tables_priv where user='mysqltest1'; +flush privileges; +drop database mysqltest; +use test; create table t1 (a int); create table t2 as select * from mysql.user where user=''; delete from mysql.user where user=''; @@ -834,21 +853,3 @@ insert into mysql.user select * from t2; flush privileges; drop table t2; drop table t1; -create database mysqltest; -use mysqltest; -create table t1(f1 int); -GRANT DELETE ON mysqltest.t1 TO mysqltest1@'%'; -GRANT SELECT ON mysqltest.t1 TO mysqltest1@'192.%'; -show grants for mysqltest1@'192.%'; -Grants for mysqltest1@192.% -GRANT USAGE ON *.* TO 'mysqltest1'@'192.%' -GRANT SELECT ON `mysqltest`.`t1` TO 'mysqltest1'@'192.%' -show grants for mysqltest1@'%'; -Grants for mysqltest1@% -GRANT USAGE ON *.* TO 'mysqltest1'@'%' -GRANT DELETE ON `mysqltest`.`t1` TO 'mysqltest1'@'%' -delete from mysql.user where user='mysqltest1'; -delete from mysql.db where user='mysqltest1'; -delete from mysql.tables_priv where user='mysqltest1'; -flush privileges; -drop database mysqltest; diff --git a/mysql-test/t/grant.test b/mysql-test/t/grant.test index 97a6b9235dc..1de5a7bbb2e 100644 --- a/mysql-test/t/grant.test +++ b/mysql-test/t/grant.test @@ -532,7 +532,7 @@ drop database mysqltest; # # Bug #16297 In memory grant tables not flushed when users's hostname is "" # - +use test; create table t1 (a int); # Backup anonymous users and remove them. (They get in the way of diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 1cf326e2bc3..244e2d45393 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2273,7 +2273,8 @@ static GRANT_NAME *name_hash_search(HASH *name_hash, { if (exact) { - if ((host && + if (!grant_name->host.hostname || + (host && !my_strcasecmp(system_charset_info, host, grant_name->host.hostname)) || (ip && !strcmp(ip, grant_name->host.hostname))) @@ -4956,6 +4957,9 @@ static int handle_grant_struct(uint struct_no, bool drop, } if (! user) user= ""; + if (! host) + host= ""; + #ifdef EXTRA_DEBUG DBUG_PRINT("loop",("scan struct: %u index: %u user: '%s' host: '%s'", struct_no, idx, user, host));