List:Commits« Previous MessageNext Message »
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
View as plain text  
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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <binlog_start>;
>>>  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 <L
>>>  
>>>    /* 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 <L
>>>  
>>>    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 <LEX
>>>  
>>>    /* 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 <LEX
>>>    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 <L
>>>  
>>>    /* 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 <L
>>>  
>>>    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 <L
>>>    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 <L
>>>  
>>>    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());
>>>  }
>>>
>>>     
>>
>>
>>   
> 
> 
Thread
bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271) Bug#49132Dao-Gang.Qu29 Dec
  • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Libing Song29 Dec
    • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Daogang Qu29 Dec
      • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Alfranio Correia29 Dec
        • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Daogang Qu30 Dec
          • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Alfranio Correia30 Dec
        • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132He Zhenxing30 Dec
          • Re: bzr commit into mysql-5.1-bugteam branch (Dao-Gang.Qu:3271)Bug#49132Alfranio Correia30 Dec