From: Alfranio Correia Date: December 29 2009 12:17pm Subject: Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271) Bug#49132 List-Archive: http://lists.mysql.com/commits/95786 Message-Id: <4B39F36A.3010808@sun.com> MIME-Version: 1.0 Content-Type: text/plain; CHARSET=US-ASCII Content-Transfer-Encoding: 7BIT Hi all, Daogang Qu wrote: > Libing Song wrote: >> Hi Daogang, >> >> >> Nice Work. Please find my review comments below. >> >> STATUS >> ------ >> Not approved. >> >> REQUIRED CHANGES >> ---------------- >> >> RC1. I think the following patch is better. >> >> === modified file 'sql/sql_class.h' >> --- sql/sql_class.h 2009-12-02 13:49:21 +0000 >> +++ sql/sql_class.h 2009-12-29 09:29:10 +0000 >> @@ -2213,7 +2213,8 @@ >> ("temporary_tables: %s, in_sub_stmt: %s, system_thread: >> %s", >> YESNO(temporary_tables), YESNO(in_sub_stmt), >> show_system_thread(system_thread))); >> - if ((temporary_tables == NULL) && (in_sub_stmt == 0) && >> + if ((temporary_tables == NULL || !current_stmt_binlog_row_based) >> > Good. Maybe the following is better: > > - if ((temporary_tables == NULL) && (in_sub_stmt == 0) && > + if ((temporary_tables == NULL || (!current_stmt_binlog_row_based && > + variables.binlog_format == BINLOG_FORMAT_ROW)) && (in_sub_stmt > == 0) && > (system_thread != SYSTEM_THREAD_NDBCLUSTER_BINLOG)) Although I said in the IRC that it was possible to restore the correct value in the reset_current_stmt_binlog_row_based, I was wrong. It is not possible. Consider for instance the following example: --source include/master-slave.inc --source include/have_binlog_format_mixed.inc CREATE TABLE t (a int); INSERT INTO t VALUES(1), (2); CREATE TEMPORARY TABLE tt (a int, b int) SELECT *, UUID() from t; INSERT INTO t VALUES(3), (4); DELIMITER |; CREATE PROCEDURE p1() BEGIN SELECT 1 ; END | DELIMITER ;| INSERT INTO tt(a) VALUES(1), (2); INSERT INTO t VALUES(5), (6); DROP TABLE t; SHOW BINLOG EVENTS; sync_slave_with_master; exit; WRONG RESULT: ------------- Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 4 Format_desc 1 106 Server ver: 5.1.42-debug-log, Binlog ver: 4 master-bin.000001 106 Query 1 191 use `test`; CREATE TABLE t (a int) master-bin.000001 191 Query 1 282 use `test`; INSERT INTO t VALUES(1), (2) master-bin.000001 282 Query 1 350 BEGIN master-bin.000001 350 Table_map 1 390 table_id: 23 (test.t) master-bin.000001 390 Write_rows 1 429 table_id: 23 flags: STMT_END_F master-bin.000001 429 Query 1 498 COMMIT master-bin.000001 498 Query 1 633 use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`() BEGIN SELECT 1 ; END master-bin.000001 633 Query 1 728 use `test`; INSERT INTO tt(a) VALUES(1), (2) master-bin.000001 728 Query 1 819 use `test`; INSERT INTO t VALUES(5), (6) master-bin.000001 819 Query 1 894 use `test`; DROP TABLE t master-bin.000001 894 Query 1 1004 use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `tt` RIGHT RESULT: ------------- master-bin.000001 4 Format_desc 1 106 Server ver: 5.1.42-debug-log, Binlog ver: 4 master-bin.000001 106 Query 1 191 use `test`; CREATE TABLE t (a int) master-bin.000001 191 Query 1 282 use `test`; INSERT INTO t VALUES(1), (2) master-bin.000001 282 Query 1 350 BEGIN master-bin.000001 350 Table_map 1 390 table_id: 23 (test.t) master-bin.000001 390 Write_rows 1 429 table_id: 23 flags: STMT_END_F master-bin.000001 429 Query 1 498 COMMIT master-bin.000001 498 Query 1 633 use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`() BEGIN SELECT 1 ; END master-bin.000001 282 Query 1 350 BEGIN master-bin.000001 350 Table_map 1 390 table_id: 23 (test.t) master-bin.000001 390 Write_rows 1 429 table_id: 23 flags: STMT_END_F master-bin.000001 429 Query 1 498 COMMIT master-bin.000001 894 Query 1 1004 use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `tt` It is not possible to figure out what is the current value. In this case, after creating the procedure current_stmt_binlog_row_based should be TRUE. So, either 1 - we create a "global" variable to save the current value and restore it when necessary. 2 - we create a "local" variable to save the current value and restore it. 3 - we force the current_stmt_binlog_row_based to be TRUE if there is a temporary table and the format is MIXED. Note that the current patch and several other places in the code are wrong as the value should be saved and restored. Cheers. > > > What's your opinion? > > > Best Regards, > > Daogang >> + && (in_sub_stmt == 0) && >> (system_thread != SYSTEM_THREAD_NDBCLUSTER_BINLOG)) >> { >> current_stmt_binlog_row_based= >> >> REQUESTS >> -------- >> n/a >> >> SUGGESTIONS >> ----------- >> n/a >> >> DETAILS ------- >> On Tue, 2009-12-29 at 08:55 +0000, Dao-Gang.Qu@stripped wrote: >> >>> #At file:///home/daogangqu/mysql/bzrwork/bug49132/mysql-5.1-bugteam/ >>> based on revid:alexey.kopytov@stripped >>> >>> 3271 Dao-Gang.Qu@stripped 2009-12-29 >>> Bug #49132 Replication failure on temporary table + DDL >>> In RBR, DDL statement will change binlog format to non >>> row-based format, and then manipulating a temporary table can >>> not reset binlog format to row-based format rightly. So that >>> the manipulated statement is binlogged with statement-based >>> format. >>> To fix the problem, restore the state of binlog format >>> after the DDL statement is binlogged. >>> @ mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result >>> Correct the test result, all the above binlog event >>> should be row-based after the bug49132 is fixed IN RBR. >>> @ mysql-test/suite/rpl/r/rpl_failure_on_tmp_table_and_DDL.result >>> Test result of the bug#49132. >>> @ mysql-test/suite/rpl/t/rpl_failure_on_tmp_table_and_DDL.test >>> Added the test file to verify if executing DDL statement >>> before trying to manipulate a temporary table causes >>> row-based replication to break with error 'table does not >>> exist'. >>> >>> added: >>> mysql-test/suite/rpl/r/rpl_failure_on_tmp_table_and_DDL.result >>> mysql-test/suite/rpl/t/rpl_failure_on_tmp_table_and_DDL.test >>> modified: >>> mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result >>> sql/events.cc >>> sql/sp.cc >>> sql/sql_acl.cc >>> === modified file >>> 'mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result' >>> --- >>> a/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result >>> 2009-10-06 10:25:36 +0000 >>> +++ >>> b/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result >>> 2009-12-29 08:54:57 +0000 >>> @@ -772,8 +772,11 @@ insert into t2 values (bug27417(2)); >>> ERROR 23000: Duplicate entry '2' for key 'PRIMARY' >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> -master-bin.000001 # Intvar # # INSERT_ID=3 >>> -master-bin.000001 # Query # # use `test`; insert into >>> t2 values (bug27417(2)) >>> +master-bin.000001 # Query # # BEGIN >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> +master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 3 */; >>> count(*) >>> 3 >>> @@ -787,8 +790,11 @@ count(*) >>> 2 >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> -master-bin.000001 # Intvar # # INSERT_ID=4 >>> -master-bin.000001 # Query # # use `test`; delete from >>> t2 where a=bug27417(3) >>> +master-bin.000001 # Query # # BEGIN >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> +master-bin.000001 # Query # # COMMIT >>> select count(*) from t1 /* must be 5 */; >>> count(*) >>> 5 >>> @@ -810,8 +816,9 @@ ERROR 23000: Duplicate entry '1' for key >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Intvar # # INSERT_ID=1 >>> -master-bin.000001 # Query # # use `test`; insert into >>> t2 values (bug27417(1)) >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 1 */; >>> count(*) >>> @@ -825,8 +832,10 @@ ERROR 23000: Duplicate entry '2' for key >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Intvar # # INSERT_ID=2 >>> -master-bin.000001 # Query # # use `test`; insert into >>> t2 select bug27417(1) union select bug27417(2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 2 */; >>> count(*) >>> @@ -838,8 +847,13 @@ update t3 set b=b+bug27417(1); >>> ERROR 23000: Duplicate entry '4' for key 'b' >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> -master-bin.000001 # Intvar # # INSERT_ID=4 >>> -master-bin.000001 # Query # # use `test`; update t3 >>> set b=b+bug27417(1) >>> +master-bin.000001 # Query # # BEGIN >>> +master-bin.000001 # Table_map # # table_id: # (test.t3) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # >>> +master-bin.000001 # Update_rows # # table_id: # >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> +master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 2 */; >>> count(*) >>> 2 >>> @@ -853,8 +867,9 @@ ERROR 23000: Duplicate entry '2' for key >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Intvar # # INSERT_ID=6 >>> -master-bin.000001 # Query # # use `test`; UPDATE >>> t4,t3 SET t4.a=t3.a + bug27417(1) /* top level non-ta table */ >>> +master-bin.000001 # Table_map # # table_id: # (test.t4) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 4 */; >>> count(*) >>> @@ -869,7 +884,7 @@ UPDATE t3,t4 SET t3.a=t4.a + bug27417(1) >>> ERROR 23000: Duplicate entry '2' for key 'PRIMARY' >>> select count(*) from t1 /* must be 1 */; >>> count(*) >>> -1 >>> +2 >>> drop table t4; >>> delete from t1; >>> delete from t2; >>> @@ -884,8 +899,10 @@ ERROR 23000: Duplicate entry '1' for key >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Intvar # # INSERT_ID=9 >>> -master-bin.000001 # Query # # use `test`; delete from t2 >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t3) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 1 */; >>> count(*) >>> @@ -904,7 +921,11 @@ ERROR 23000: Duplicate entry '1' for key >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Query # # use `test`; delete t2.* >>> from t2,t5 where t2.a=t5.a + 1 >>> +master-bin.000001 # Table_map # # table_id: # (test.t2) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Delete_rows # # table_id: # >>> +master-bin.000001 # Write_rows # # table_id: # >>> +master-bin.000001 # Delete_rows # # table_id: # >>> flags: STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> select count(*) from t1 /* must be 1 */; >>> count(*) >>> @@ -924,12 +945,11 @@ count(*) >>> show binlog events from ; >>> Log_name Pos Event_type Server_id End_log_pos Info >>> master-bin.000001 # Query # # BEGIN >>> -master-bin.000001 # Intvar # # INSERT_ID=10 >>> -master-bin.000001 # User var # # @`b`=_latin1 0x3135 >>> COLLATE latin1_swedish_ci >>> -master-bin.000001 # Begin_load_query # # >>> ;file_id=#;block_len=# >>> -master-bin.000001 # Intvar # # INSERT_ID=10 >>> -master-bin.000001 # User var # # @`b`=_latin1 0x3135 >>> COLLATE latin1_swedish_ci >>> -master-bin.000001 # Execute_load_query # # use >>> `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE >>> `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES >>> TERMINATED BY '\n' (a, @b) SET b=((@b) + `bug27417`(2)) ;file_id=# >>> +master-bin.000001 # Table_map # # table_id: # (test.t4) >>> +master-bin.000001 # Table_map # # table_id: # (test.t1) >>> +master-bin.000001 # Write_rows # # table_id: # >>> +master-bin.000001 # Write_rows # # table_id: # >>> +master-bin.000001 # Write_rows # # table_id: # flags: >>> STMT_END_F >>> master-bin.000001 # Query # # ROLLBACK >>> drop trigger trg_del_t2; >>> drop table t1,t2,t3,t4,t5; >>> >>> === added file >>> 'mysql-test/suite/rpl/r/rpl_failure_on_tmp_table_and_DDL.result' >>> --- >>> a/mysql-test/suite/rpl/r/rpl_failure_on_tmp_table_and_DDL.result >>> 1970-01-01 00:00:00 +0000 >>> +++ >>> b/mysql-test/suite/rpl/r/rpl_failure_on_tmp_table_and_DDL.result >>> 2009-12-29 08:54:57 +0000 >>> @@ -0,0 +1,109 @@ >>> +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; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE EVENT e1 ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing"; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER EVENT e1 ON SCHEDULE EVERY 20 HOUR DO SELECT "nothing"; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP EVENT IF EXISTS e1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE PROCEDURE p1() BEGIN SELECT 1 ; END | >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER PROCEDURE p1 SQL SECURITY INVOKER; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP PROCEDURE p1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE FUNCTION f1() RETURNS INT RETURN 123; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER FUNCTION f1 SQL SECURITY INVOKER; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP FUNCTION f1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (b int); >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP TABLE t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE DATABASE mysqltest1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP DATABASE mysqltest1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (a int); >>> +CREATE TABLE t3 (a int); >>> +CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW INSERT INTO t2 >>> VALUES(22); >>> +insert into t3 values (1); >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +drop table t2, t3; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (a int); >>> +CREATE VIEW v2 AS SELECT * FROM t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP VIEW v2; >>> +drop table t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE USER test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +create table t2 (a int, b int); >>> +grant select on t2 to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +create procedure stamp() insert into t2 values (1,2); >>> +grant execute on procedure stamp to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +DROP PROCEDURE stamp; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +grant usage on *.* to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +revoke all privileges on t2 from test_1@localhost; >>> +revoke usage on *.* from test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +RENAME USER test_1@localhost TO test_2@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +drop user test_2@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +drop table t2; >>> >>> === added file >>> 'mysql-test/suite/rpl/t/rpl_failure_on_tmp_table_and_DDL.test' >>> --- a/mysql-test/suite/rpl/t/rpl_failure_on_tmp_table_and_DDL.test >>> 1970-01-01 00:00:00 +0000 >>> +++ b/mysql-test/suite/rpl/t/rpl_failure_on_tmp_table_and_DDL.test >>> 2009-12-29 08:54:57 +0000 >>> @@ -0,0 +1,164 @@ >>> +# >>> +# Bug#49132 >>> +# This test verify if executing DDL statement before trying to +# >>> manipulate a temporary table causes row-based replication to +# break >>> with error 'table does not exist'. >>> +# >>> +--source include/master-slave.inc >>> +--source include/have_binlog_format_row.inc >>> + >>> +# CREATE EVENT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE EVENT e1 ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing"; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# ALTER EVENT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER EVENT e1 ON SCHEDULE EVERY 20 HOUR DO SELECT "nothing"; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP EVENT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP EVENT IF EXISTS e1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE PROCEDURE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DELIMITER |; >>> +CREATE PROCEDURE p1() BEGIN SELECT 1 ; END | >>> +DELIMITER ;| >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# Alter PROCEDURE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER PROCEDURE p1 SQL SECURITY INVOKER; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> + >>> +# DROP PROCEDURE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP PROCEDURE p1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE FUNCTION when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE FUNCTION f1() RETURNS INT RETURN 123; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# ALTER FUNCTION when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +ALTER FUNCTION f1 SQL SECURITY INVOKER; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP FUNCTION when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP FUNCTION f1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE TABLE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (b int); >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP TABLE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP TABLE t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE DATABASE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE DATABASE mysqltest1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP DATABASE when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP DATABASE mysqltest1; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE TRIGGER when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (a int); >>> +CREATE TABLE t3 (a int); >>> +CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW INSERT INTO t2 >>> VALUES(22); >>> +insert into t3 values (1); >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +drop table t2, t3; >>> + >>> +# CREATE VIEW when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE TABLE t2 (a int); >>> +CREATE VIEW v2 AS SELECT * FROM t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP VIEW when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +DROP VIEW v2; >>> +drop table t2; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# CREATE USER when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +CREATE USER test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# TABLE GRANT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +create table t2 (a int, b int); >>> +grant select on t2 to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# ROUTINE GRANT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +create procedure stamp() insert into t2 values (1,2); >>> +grant execute on procedure stamp to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> +DROP PROCEDURE stamp; >>> + >>> +# MYSQL GRANT when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +grant usage on *.* to test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# REVOKE PRIVILEGES when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +revoke all privileges on t2 from test_1@localhost; >>> +revoke usage on *.* from test_1@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# RENAME USER when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +RENAME USER test_1@localhost TO test_2@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +# DROP USER when a temporary table is open. >>> +CREATE TEMPORARY TABLE t1 (a int); >>> +drop user test_2@localhost; >>> +insert into t1 values (1); >>> +DROP TEMPORARY TABLE t1; >>> + >>> +drop table t2; >>> + >>> +--sync_slave_with_master >>> + >>> >>> === modified file 'sql/events.cc' >>> --- a/sql/events.cc 2009-10-16 10:29:42 +0000 >>> +++ b/sql/events.cc 2009-12-29 08:54:57 +0000 >>> @@ -479,6 +479,9 @@ Events::create_event(THD *thd, Event_par >>> } >>> } >>> pthread_mutex_unlock(&LOCK_event_metadata); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> DBUG_RETURN(ret); >>> } >>> @@ -600,6 +603,9 @@ Events::update_event(THD *thd, Event_par >>> } >>> } >>> pthread_mutex_unlock(&LOCK_event_metadata); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> DBUG_RETURN(ret); >>> } >>> @@ -674,6 +680,9 @@ Events::drop_event(THD *thd, LEX_STRING >>> write_bin_log(thd, TRUE, thd->query(), thd->query_length()); >>> } >>> pthread_mutex_unlock(&LOCK_event_metadata); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; DBUG_RETURN(ret); >>> } >>> >>> >>> === modified file 'sql/sp.cc' >>> --- a/sql/sp.cc 2009-12-02 11:17:08 +0000 >>> +++ b/sql/sp.cc 2009-12-29 08:54:57 +0000 >>> @@ -1118,6 +1118,9 @@ done: >>> thd->variables.sql_mode= saved_mode; >>> >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(ret); >>> } >>> >>> @@ -1171,6 +1174,9 @@ sp_drop_routine(THD *thd, int type, sp_n >>> } >>> >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(ret); >>> } >>> >>> @@ -1241,6 +1247,9 @@ sp_update_routine(THD *thd, int type, sp >>> } >>> >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(ret); >>> } >>> >>> >>> === modified file 'sql/sql_acl.cc' >>> --- a/sql/sql_acl.cc 2009-12-06 23:12:11 +0000 >>> +++ b/sql/sql_acl.cc 2009-12-29 08:54:57 +0000 >>> @@ -3083,7 +3083,12 @@ int mysql_table_grant(THD *thd, TABLE_LI >>> */ >>> tables[0].updating= tables[1].updating= tables[2].updating= 1; >>> if (!(thd->spcont || rpl_filter->tables_ok(0, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(FALSE); >>> + } >>> } >>> #endif >>> >>> @@ -3096,6 +3101,9 @@ int mysql_table_grant(THD *thd, TABLE_LI >>> if (simple_open_n_lock_tables(thd,tables)) >>> { // Should never happen >>> close_thread_tables(thd); /* purecov: deadcode */ >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(TRUE); /* purecov: deadcode */ >>> } >>> >>> @@ -3222,6 +3230,9 @@ int mysql_table_grant(THD *thd, TABLE_LI >>> >>> /* Tables are automatically closed */ >>> thd->lex->restore_backup_query_tables_list(&backup); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result); >>> } >>> >>> @@ -3300,13 +3311,21 @@ bool mysql_routine_grant(THD *thd, TABLE >>> */ >>> tables[0].updating= tables[1].updating= 1; >>> if (!(thd->spcont || rpl_filter->tables_ok(0, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(FALSE); >>> + } >>> } >>> #endif >>> >>> if (simple_open_n_lock_tables(thd,tables)) >>> { // Should never happen >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(TRUE); >>> } >>> >>> @@ -3382,6 +3401,9 @@ bool mysql_routine_grant(THD *thd, TABLE >>> } >>> >>> rw_unlock(&LOCK_grant); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> /* Tables are automatically closed */ >>> DBUG_RETURN(result); >>> @@ -3439,13 +3461,21 @@ bool mysql_grant(THD *thd, const char *d >>> */ >>> tables[0].updating= tables[1].updating= 1; >>> if (!(thd->spcont || rpl_filter->tables_ok(0, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(FALSE); >>> + } >>> } >>> #endif >>> >>> if (simple_open_n_lock_tables(thd,tables)) >>> { // This should never happen >>> close_thread_tables(thd); /* purecov: deadcode */ >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(TRUE); /* purecov: deadcode */ >>> } >>> >>> @@ -3505,6 +3535,9 @@ bool mysql_grant(THD *thd, const char *d >>> >>> if (!result) >>> my_ok(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> DBUG_RETURN(result); >>> } >>> @@ -5672,7 +5705,12 @@ bool mysql_create_user(THD *thd, List >> >>> /* CREATE USER may be skipped on replication client. */ >>> if ((result= open_grant_tables(thd, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result != 1); >>> + } >>> >>> rw_wrlock(&LOCK_grant); >>> VOID(pthread_mutex_lock(&acl_cache->lock)); >>> @@ -5715,6 +5753,9 @@ bool mysql_create_user(THD *thd, List >> >>> rw_unlock(&LOCK_grant); >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result); >>> } >>> >>> @@ -5752,7 +5793,12 @@ bool mysql_drop_user(THD *thd, List >> >>> /* DROP USER may be skipped on replication client. */ >>> if ((result= open_grant_tables(thd, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result != 1); >>> + } >>> >>> thd->variables.sql_mode&= ~MODE_PAD_CHAR_TO_FULL_LENGTH; >>> >>> @@ -5789,6 +5835,9 @@ bool mysql_drop_user(THD *thd, List >> rw_unlock(&LOCK_grant); >>> close_thread_tables(thd); >>> thd->variables.sql_mode= old_sql_mode; >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result); >>> } >>> >>> @@ -5826,7 +5875,12 @@ bool mysql_rename_user(THD *thd, List >> >>> /* RENAME USER may be skipped on replication client. */ >>> if ((result= open_grant_tables(thd, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result != 1); >>> + } >>> >>> rw_wrlock(&LOCK_grant); >>> VOID(pthread_mutex_lock(&acl_cache->lock)); >>> @@ -5873,6 +5927,9 @@ bool mysql_rename_user(THD *thd, List >> >>> rw_unlock(&LOCK_grant); >>> close_thread_tables(thd); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result); >>> } >>> >>> @@ -5907,7 +5964,12 @@ bool mysql_revoke_all(THD *thd, List >> thd->clear_current_stmt_binlog_row_based(); >>> >>> if ((result= open_grant_tables(thd, tables))) >>> + { >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> DBUG_RETURN(result != 1); >>> + } >>> >>> rw_wrlock(&LOCK_grant); >>> VOID(pthread_mutex_lock(&acl_cache->lock)); >>> @@ -6058,6 +6120,9 @@ bool mysql_revoke_all(THD *thd, List >> >>> if (result) >>> my_message(ER_REVOKE_GRANTS, ER(ER_REVOKE_GRANTS), MYF(0)); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> DBUG_RETURN(result); >>> } >>> @@ -6193,6 +6258,9 @@ bool sp_revoke_privileges(THD *thd, cons >>> close_thread_tables(thd); >>> >>> thd->pop_internal_handler(); >>> + /* Restore the state of binlog format */ >>> + if (thd->variables.binlog_format == BINLOG_FORMAT_ROW) >>> + thd->current_stmt_binlog_row_based= TRUE; >>> >>> DBUG_RETURN(error_handler.has_errors()); >>> } >>> >>> >> >> >> > >