From: Date: January 17 2008 7:54am Subject: bk commit into 5.0 tree (hezx:1.2565) BUG#33862 List-Archive: http://lists.mysql.com/commits/41044 X-Bug: 33862 Message-Id: <200801170654.m0H6s2u6005594@mail.hezx.com> Below is the list of changes that have just been committed into a local 5.0 repository of hezx. When hezx does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2008-01-17 14:53:55+08:00, hezx@stripped +3 -0 BUG#33862 completely failed DROP USER statement gets replicated When create/rename/drop users, the statement will be logged regardless of error, even if no data has been changed, the statement will be logged. When create/rename/drop users, don't write the binlog if the statement make no changes, if the statement do made any changes, log the statement with possible error code. mysql-test/r/rpl_user.result@stripped, 2008-01-17 14:53:51+08:00, hezx@stripped +42 -0 New BitKeeper file ``mysql-test/r/rpl_user.result'' mysql-test/r/rpl_user.result@stripped, 2008-01-17 14:53:51+08:00, hezx@stripped +0 -0 mysql-test/t/rpl_user.test@stripped, 2008-01-17 14:53:51+08:00, hezx@stripped +57 -0 New BitKeeper file ``mysql-test/t/rpl_user.test'' mysql-test/t/rpl_user.test@stripped, 2008-01-17 14:53:51+08:00, hezx@stripped +0 -0 sql/sql_acl.cc@stripped, 2008-01-17 14:53:51+08:00, hezx@stripped +17 -7 when create/rename/drop users, don't write the binlog if the statement make no changes diff -Nrup a/mysql-test/r/rpl_user.result b/mysql-test/r/rpl_user.result --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/mysql-test/r/rpl_user.result 2008-01-17 14:53:51 +08:00 @@ -0,0 +1,42 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +reset master; +delete from mysql.user where Host='fakehost'; +create user 'foo'@'fakehost'; +create user 'foo'@'fakehost'; +ERROR HY000: Operation CREATE USER failed for 'foo'@'fakehost' +create user 'foo'@'fakehost', 'bar'@'fakehost'; +ERROR HY000: Operation CREATE USER failed for 'foo'@'fakehost' +select Host,User from mysql.user where Host='fakehost'; +Host User +fakehost bar +fakehost foo +rename user 'foo'@'fakehost' to 'foofoo'@'fakehost'; +rename user 'not_exist_user'@'fakehost' to 'foobar'@'fakehost'; +ERROR HY000: Operation RENAME USER failed for 'not_exist_user'@'fakehost' +rename user 'not_exist_user'@'fakehost' to 'foobar'@'fakehost', 'bar'@'fakehost' to 'barbar'@'fakehost'; +ERROR HY000: Operation RENAME USER failed for 'not_exist_user'@'fakehost' +select Host,User from mysql.user where Host='fakehost'; +Host User +fakehost barbar +fakehost foofoo +drop user 'foofoo'@'fakehost'; +drop user 'not_exist_user'@'fakehost'; +ERROR HY000: Operation DROP USER failed for 'not_exist_user'@'fakehost' +drop user 'not_exist_user'@'fakehost', 'barbar'@'fakehost'; +ERROR HY000: Operation DROP USER failed for 'not_exist_user'@'fakehost' +select Host,User from mysql.user where Host='fakehost'; +Host User +show binlog events from 98; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 98 Query 1 # use `test`; delete from mysql.user where Host='fakehost' +master-bin.000001 205 Query 1 # use `test`; create user 'foo'@'fakehost' +master-bin.000001 296 Query 1 # use `test`; create user 'foo'@'fakehost', 'bar'@'fakehost' +master-bin.000001 405 Query 1 # use `test`; rename user 'foo'@'fakehost' to 'foofoo'@'fakehost' +master-bin.000001 519 Query 1 # use `test`; rename user 'not_exist_user'@'fakehost' to 'foobar'@'fakehost', 'bar'@'fakehost' to 'barbar'@'fakehost' +master-bin.000001 685 Query 1 # use `test`; drop user 'foofoo'@'fakehost' +master-bin.000001 777 Query 1 # use `test`; drop user 'not_exist_user'@'fakehost', 'barbar'@'fakehost' diff -Nrup a/mysql-test/t/rpl_user.test b/mysql-test/t/rpl_user.test --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/mysql-test/t/rpl_user.test 2008-01-17 14:53:51 +08:00 @@ -0,0 +1,57 @@ +--source include/master-slave.inc +--source include/have_binlog_format_statement.inc + +set @@session.binlog_format='statement'; + +reset master; + +# +# remove all users will be used in the test +# +delete from mysql.user where Host='fakehost'; +sync_slave_with_master; + +# +# Test create user +# +connection master; +create user 'foo'@'fakehost'; +--error ER_CANNOT_USER +create user 'foo'@'fakehost'; +--error ER_CANNOT_USER +create user 'foo'@'fakehost', 'bar'@'fakehost'; + +sync_slave_with_master; +select Host,User from mysql.user where Host='fakehost'; + +# +# Test rename user +# +connection master; +rename user 'foo'@'fakehost' to 'foofoo'@'fakehost'; +--error ER_CANNOT_USER +rename user 'not_exist_user'@'fakehost' to 'foobar'@'fakehost'; +--error ER_CANNOT_USER +rename user 'not_exist_user'@'fakehost' to 'foobar'@'fakehost', 'bar'@'fakehost' to 'barbar'@'fakehost'; + +sync_slave_with_master; +select Host,User from mysql.user where Host='fakehost'; + +# +# Test drop user +# +connection master; +drop user 'foofoo'@'fakehost'; +--error ER_CANNOT_USER +drop user 'not_exist_user'@'fakehost'; +--error ER_CANNOT_USER +drop user 'not_exist_user'@'fakehost', 'barbar'@'fakehost'; + +sync_slave_with_master; +select Host,User from mysql.user where Host='fakehost'; + +# +# show the binlog events on the master +# +connection master; +source include/show_binlog_events.inc; diff -Nrup a/sql/sql_acl.cc b/sql/sql_acl.cc --- a/sql/sql_acl.cc 2007-10-31 20:41:46 +08:00 +++ b/sql/sql_acl.cc 2008-01-17 14:53:51 +08:00 @@ -5333,6 +5333,7 @@ bool mysql_create_user(THD *thd, List user_list(list); TABLE_LIST tables[GRANT_TABLES]; + bool some_users_created= FALSE; DBUG_ENTER("mysql_create_user"); /* CREATE USER may be skipped on replication client. */ @@ -5361,6 +5362,7 @@ bool mysql_create_user(THD *thd, List variables.sql_mode; if (replace_user_table(thd, tables[0].table, *user_name, 0, 0, 1, 0)) { @@ -5371,7 +5373,10 @@ bool mysql_create_user(THD *thd, List lock)); - if (mysql_bin_log.is_open()) + if (result) + my_error(ER_CANNOT_USER, MYF(0), "CREATE USER", wrong_users.c_ptr_safe()); + + if (some_users_created && mysql_bin_log.is_open()) { Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); mysql_bin_log.write(&qinfo); @@ -5379,8 +5384,6 @@ bool mysql_create_user(THD *thd, List user_list(list); TABLE_LIST tables[GRANT_TABLES]; + bool some_users_deleted= FALSE; DBUG_ENTER("mysql_drop_user"); /* DROP USER may be skipped on replication client. */ @@ -5426,7 +5430,9 @@ bool mysql_drop_user(THD *thd, List net.last_errno: %d", thd->net.last_errno)); DBUG_PRINT("info", ("thd->net.last_error: %s", thd->net.last_error)); - if (mysql_bin_log.is_open()) + if (some_users_deleted && mysql_bin_log.is_open()) { Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); mysql_bin_log.write(&qinfo); @@ -5473,6 +5479,7 @@ bool mysql_rename_user(THD *thd, List user_list(list); TABLE_LIST tables[GRANT_TABLES]; + bool some_users_renamed= FALSE; DBUG_ENTER("mysql_rename_user"); /* RENAME USER may be skipped on replication client. */ @@ -5506,7 +5513,9 @@ bool mysql_rename_user(THD *thd, List lock)); - if (mysql_bin_log.is_open()) + if (result) + my_error(ER_CANNOT_USER, MYF(0), "RENAME USER", wrong_users.c_ptr_safe()); + + if (some_users_renamed && mysql_bin_log.is_open()) { Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); mysql_bin_log.write(&qinfo); @@ -5522,8 +5534,6 @@ bool mysql_rename_user(THD *thd, List