mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #48321 CURRENT_USER() incorrectly replicated for DROP/RENAME USER;
REVOKE/GRANT; ALTER EVENT. The following statements support the CURRENT_USER() where a user is needed. DROP USER RENAME USER CURRENT_USER() ... GRANT ... TO CURRENT_USER() REVOKE ... FROM CURRENT_USER() ALTER DEFINER = CURRENT_USER() EVENT but, When these statements are binlogged, CURRENT_USER() just is binlogged as 'CURRENT_USER()', it is not expanded to the real user name. When slave executes the log event, 'CURRENT_USER()' is expand to the user of slave SQL thread, but SQL thread's user name always NULL. This breaks the replication. After this patch, All above statements are rewritten when they are binlogged. The CURRENT_USER() is expanded to the real user's name and host.
This commit is contained in:
@ -17,16 +17,15 @@ show grants for x@y;
|
||||
Grants for x@y
|
||||
GRANT USAGE ON *.* TO 'x'@'y'
|
||||
GRANT SELECT ON `d1`.`t` TO 'x'@'y'
|
||||
show binlog events;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 106 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 106 Query 1 193 drop database if exists d1
|
||||
master-bin.000001 193 Query 1 272 create database d1
|
||||
master-bin.000001 272 Query 1 370 use `d1`; create table t (s1 int) engine=innodb
|
||||
master-bin.000001 370 Query 1 436 BEGIN
|
||||
master-bin.000001 436 Query 1 521 use `d1`; insert into t values (1)
|
||||
master-bin.000001 521 Xid 1 548 COMMIT /* XID */
|
||||
master-bin.000001 548 Query 1 633 use `d1`; grant select on t to x@y
|
||||
master-bin.000001 # Query # # drop database if exists d1
|
||||
master-bin.000001 # Query # # create database d1
|
||||
master-bin.000001 # Query # # use `d1`; create table t (s1 int) engine=innodb
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `d1`; insert into t values (1)
|
||||
master-bin.000001 # Xid # # COMMIT /* XID */
|
||||
master-bin.000001 # Query # # use `d1`; grant select on t to 'x'@'y'
|
||||
start transaction;
|
||||
insert into t values (2);
|
||||
revoke select on t from x@y;
|
||||
@ -38,19 +37,18 @@ s1
|
||||
show grants for x@y;
|
||||
Grants for x@y
|
||||
GRANT USAGE ON *.* TO 'x'@'y'
|
||||
show binlog events;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 106 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 106 Query 1 193 drop database if exists d1
|
||||
master-bin.000001 193 Query 1 272 create database d1
|
||||
master-bin.000001 272 Query 1 370 use `d1`; create table t (s1 int) engine=innodb
|
||||
master-bin.000001 370 Query 1 436 BEGIN
|
||||
master-bin.000001 436 Query 1 521 use `d1`; insert into t values (1)
|
||||
master-bin.000001 521 Xid 1 548 COMMIT /* XID */
|
||||
master-bin.000001 548 Query 1 633 use `d1`; grant select on t to x@y
|
||||
master-bin.000001 633 Query 1 699 BEGIN
|
||||
master-bin.000001 699 Query 1 784 use `d1`; insert into t values (2)
|
||||
master-bin.000001 784 Xid 1 811 COMMIT /* XID */
|
||||
master-bin.000001 811 Query 1 899 use `d1`; revoke select on t from x@y
|
||||
master-bin.000001 # Query # # drop database if exists d1
|
||||
master-bin.000001 # Query # # create database d1
|
||||
master-bin.000001 # Query # # use `d1`; create table t (s1 int) engine=innodb
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `d1`; insert into t values (1)
|
||||
master-bin.000001 # Xid # # COMMIT /* XID */
|
||||
master-bin.000001 # Query # # use `d1`; grant select on t to 'x'@'y'
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `d1`; insert into t values (2)
|
||||
master-bin.000001 # Xid # # COMMIT /* XID */
|
||||
master-bin.000001 # Query # # use `d1`; revoke select on t from 'x'@'y'
|
||||
drop user x@y;
|
||||
drop database d1;
|
||||
|
@ -251,3 +251,45 @@ DROP EVENT event44331_1;
|
||||
DROP EVENT event44331_2;
|
||||
DROP EVENT event44331_3;
|
||||
DROP EVENT event44331_4;
|
||||
DROP VIEW IF EXISTS events_view;
|
||||
DROP EVENT IF EXISTS event48321_1;
|
||||
DROP EVENT IF EXISTS event48321_2;
|
||||
DROP EVENT IF EXISTS event48321_3;
|
||||
DROP EVENT IF EXISTS event48321_4;
|
||||
CREATE VIEW events_view AS
|
||||
SELECT EVENT_SCHEMA, EVENT_NAME, DEFINER FROM INFORMATION_SCHEMA.EVENTS
|
||||
WHERE EVENT_NAME LIKE 'event48321%';
|
||||
CREATE DEFINER=CURRENT_USER() /*!50000 EVENT event48321_1 */
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
CREATE DEFINER=CURRENT_USER() EVENT event48321_2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
CREATE /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
Comparing tables master:test.events_view and slave:test.events_view
|
||||
ALTER DEFINER=CURRENT_USER() EVENT event48321_1 RENAME TO event48321_4;
|
||||
ALTER DEFINER=CURRENT_USER() EVENT event48321_2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
Comparing tables master:test.events_view and slave:test.events_view
|
||||
ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG; ALTER EVENT event48321_2 ENABLE |
|
||||
Comparing tables master:test.events_view and slave:test.events_view
|
||||
ALTER EVENT event48321_3 ENABLE;
|
||||
Comparing tables master:test.events_view and slave:test.events_view
|
||||
DROP EVENT event48321_4;
|
||||
DROP EVENT event48321_2;
|
||||
DROP EVENT event48321_3;
|
||||
DROP VIEW events_view;
|
||||
|
@ -750,7 +750,7 @@ test_rpl e2 root@localhost SYSTEM RECURRING NULL 1 # # NULL ENABLED 1 latin1 lat
|
||||
USE test_rpl;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
test_rpl e2 @ SYSTEM RECURRING NULL 1 # # NULL SLAVESIDE_DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
test_rpl e2 root@localhost SYSTEM RECURRING NULL 1 # # NULL SLAVESIDE_DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
==========MASTER==========
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
@ -1079,7 +1079,7 @@ master-bin.000001 # Query 1 # BEGIN
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; INSERT INTO t1 VALUES(1, 'test1')
|
||||
master-bin.000001 # Xid 1 # #
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; CREATE DEFINER=`root`@`localhost` EVENT e1 ON SCHEDULE EVERY '1' SECOND COMMENT 'e_second_comment' DO DELETE FROM t1
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; ALTER EVENT e1 RENAME TO e2
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; ALTER DEFINER=`root`@`localhost` EVENT e1 RENAME TO e2
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; DROP EVENT e2
|
||||
master-bin.000001 # Query 1 # BEGIN
|
||||
master-bin.000001 # Query 1 # use `test_rpl`; DELETE FROM t1
|
||||
|
@ -433,9 +433,9 @@ master-bin.000001 # Query 1 # use `mysqltest1`; create table t2 like t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo3`()
|
||||
DETERMINISTIC
|
||||
insert into t1 values (15)
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant CREATE ROUTINE, EXECUTE on mysqltest1.* to "zedjzlcsjhd"@127.0.0.1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant SELECT on mysqltest1.t1 to "zedjzlcsjhd"@127.0.0.1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant SELECT, INSERT on mysqltest1.t2 to "zedjzlcsjhd"@127.0.0.1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant CREATE ROUTINE, EXECUTE on mysqltest1.* to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant SELECT on mysqltest1.t1 to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; grant SELECT, INSERT on mysqltest1.t2 to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` PROCEDURE `foo4`()
|
||||
DETERMINISTIC
|
||||
begin
|
||||
@ -510,7 +510,7 @@ select * from t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop procedure foo
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop function fn1
|
||||
master-bin.000001 # Query 1 # drop database mysqltest1
|
||||
master-bin.000001 # Query 1 # drop user "zedjzlcsjhd"@127.0.0.1
|
||||
master-bin.000001 # Query 1 # DROP USER 'zedjzlcsjhd'@'127.0.0.1'
|
||||
master-bin.000001 # Query 1 # use `test`; drop function if exists f1
|
||||
master-bin.000001 # Query 1 # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
|
||||
READS SQL DATA
|
||||
@ -675,13 +675,13 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `foo3`()
|
||||
insert into t1 values (15)
|
||||
/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
grant CREATE ROUTINE, EXECUTE on mysqltest1.* to "zedjzlcsjhd"@127.0.0.1
|
||||
grant CREATE ROUTINE, EXECUTE on mysqltest1.* to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
grant SELECT on mysqltest1.t1 to "zedjzlcsjhd"@127.0.0.1
|
||||
grant SELECT on mysqltest1.t1 to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
grant SELECT, INSERT on mysqltest1.t2 to "zedjzlcsjhd"@127.0.0.1
|
||||
grant SELECT, INSERT on mysqltest1.t2 to 'zedjzlcsjhd'@'127.0.0.1'
|
||||
/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` PROCEDURE `foo4`()
|
||||
@ -842,7 +842,7 @@ SET TIMESTAMP=t/*!*/;
|
||||
drop database mysqltest1
|
||||
/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
drop user "zedjzlcsjhd"@127.0.0.1
|
||||
DROP USER 'zedjzlcsjhd'@'127.0.0.1'
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -25,9 +25,7 @@ grant select on t to x@y;
|
||||
#
|
||||
rollback;
|
||||
show grants for x@y;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\//
|
||||
show binlog events;
|
||||
--source include/show_binlog_events.inc
|
||||
start transaction;
|
||||
insert into t values (2);
|
||||
revoke select on t from x@y;
|
||||
@ -37,9 +35,7 @@ revoke select on t from x@y;
|
||||
commit;
|
||||
select * from t;
|
||||
show grants for x@y;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\//
|
||||
show binlog events;
|
||||
--source include/show_binlog_events.inc
|
||||
drop user x@y;
|
||||
drop database d1;
|
||||
--sync_slave_with_master
|
||||
|
@ -105,3 +105,85 @@ DROP EVENT event44331_2;
|
||||
DROP EVENT event44331_3;
|
||||
DROP EVENT event44331_4;
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# BUG#48321
|
||||
# This test verifies if the definer is consistent between master and slave,
|
||||
# when the event is created or altered with the DEFINER clause that the
|
||||
# DEFINER is set to CURRENT_USER()
|
||||
#
|
||||
connection master;
|
||||
--disable_warnings
|
||||
DROP VIEW IF EXISTS events_view;
|
||||
DROP EVENT IF EXISTS event48321_1;
|
||||
DROP EVENT IF EXISTS event48321_2;
|
||||
DROP EVENT IF EXISTS event48321_3;
|
||||
DROP EVENT IF EXISTS event48321_4;
|
||||
--enable_warnings
|
||||
|
||||
CREATE VIEW events_view AS
|
||||
SELECT EVENT_SCHEMA, EVENT_NAME, DEFINER FROM INFORMATION_SCHEMA.EVENTS
|
||||
WHERE EVENT_NAME LIKE 'event48321%';
|
||||
let $diff_table_1= master:test.events_view;
|
||||
let $diff_table_2= slave:test.events_view;
|
||||
|
||||
CREATE DEFINER=CURRENT_USER() /*!50000 EVENT event48321_1 */
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
|
||||
CREATE DEFINER=CURRENT_USER() EVENT event48321_2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
|
||||
CREATE /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/diff_tables.inc
|
||||
|
||||
connection master;
|
||||
ALTER DEFINER=CURRENT_USER() EVENT event48321_1 RENAME TO event48321_4;
|
||||
|
||||
ALTER DEFINER=CURRENT_USER() EVENT event48321_2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
|
||||
ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG;
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/diff_tables.inc
|
||||
|
||||
# Two statements in on query
|
||||
connection master;
|
||||
DELIMITER |;
|
||||
ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP
|
||||
ON COMPLETION PRESERVE DISABLE
|
||||
DO SELECT 48321 as BUG; ALTER EVENT event48321_2 ENABLE |
|
||||
DELIMITER ;|
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/diff_tables.inc
|
||||
|
||||
#No Event boday
|
||||
connection master;
|
||||
ALTER EVENT event48321_3 ENABLE;
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/diff_tables.inc
|
||||
|
||||
connection master;
|
||||
DROP EVENT event48321_4;
|
||||
DROP EVENT event48321_2;
|
||||
DROP EVENT event48321_3;
|
||||
DROP VIEW events_view;
|
||||
--source include/master-slave-end.inc
|
||||
|
||||
|
@ -54,8 +54,85 @@ drop user 'not_exist_user1'@'fakehost', 'not_exist_user2'@'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;
|
||||
|
||||
#
|
||||
# BUG#48321
|
||||
#
|
||||
let $action= RENAME;
|
||||
let $statement= RENAME USER \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
let $action= DROP;
|
||||
let $statement= DROP USER \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
--disable_warnings
|
||||
DROP PROCEDURE IF EXISTS f1;
|
||||
--enable_warnings
|
||||
CREATE PROCEDURE p1() SELECT 1;
|
||||
#REVOKE ALL PRIVILEGES
|
||||
let $action= REVOKE;
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
|
||||
let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#REVOKE ALL PRIVILEGES with comment
|
||||
let $action= REVOKE;
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
|
||||
let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM \$users_list /*With comment*/;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#REVOKE ALL PRIVILEGES with comment
|
||||
let $action= REVOKE;
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
|
||||
let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv;
|
||||
#REVOKE ON TABLE
|
||||
let $statement= REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#REVOKE ON CREATE ROUTINE
|
||||
let $diff_columns= Create_routine_priv;
|
||||
let $statement= REVOKE CREATE ROUTINE ON *.* FROM \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#REVOKE ON ROUTINE
|
||||
let $diff_table= mysql.procs_priv;
|
||||
let $diff_columns= Routine_name, Proc_priv;
|
||||
let $statement= REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
let $diff_table= mysql.user;
|
||||
#GRANT ALL PRIVILEGES
|
||||
let $action= GRANT;
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password;
|
||||
let $statement= GRANT ALL PRIVILEGES ON *.* TO \$users_list WITH GRANT OPTION;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#GRANT ALL PRIVILEGES with comment
|
||||
let $action= GRANT;
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password;
|
||||
let $statement= GRANT ALL PRIVILEGES ON *.* TO \$users_list /* With Comment */ WITH GRANT OPTION;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#GRANT ON TABLE
|
||||
let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Password;
|
||||
let $statement= GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#GRANT ON CREATE ROUTINE
|
||||
let $diff_columns= Create_routine_priv;
|
||||
let $statement= GRANT CREATE ROUTINE ON *.* TO \$users_list;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
||||
#GRANT ON ROUTINE
|
||||
let $diff_table= mysql.procs_priv;
|
||||
let $diff_columns= Routine_name, Proc_priv;
|
||||
let $statement= GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO \$users_list;
|
||||
|
||||
DROP PROCEDURE p1;
|
||||
source extra/rpl_tests/rpl_current_user.test;
|
||||
|
Reference in New Issue
Block a user