Hi Libing,
The patch looks ok from my viewpoint. I would suggest to clarify the
changeset comment: instead of "But there are some cases...", please say
that row events can be generated for the base table if the temporary
table exists and user executes CREATE TABLE...SELECT that creates the
base table.
Also, I think maybe it would be good to find a reviewer from runtime
team on this one. I'll send a separate email and ask Kostja to find one
and replace me.
/Sven
On 10/15/2010 10:20 AM, Li-Bing.Song@stripped wrote:
> #At file:///home/anders/work/bzrwork1/wt2/mysql-next-mr-bugfixing/ based on
> revid:dao-gang.qu@stripped
>
> 3324 Li-Bing.Song@stripped 2010-10-15
> Bug#55478 Row events wrongly apply on the temporary table of the same name
>
> Rows events were applied wrongly on the temporary table with the same name.
> But rows events are generated only for base tables. As temporary
> table's data never be binlogged on row mode. Normally, base table of the
> same name cannot be updated if a temporary table has the same name.
> But there are some cases which can generate rows events on
> the base table of same name.
>
> After this patch, slave opens only base table when applying a rows event.
>
> modified:
> mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
> mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
> sql/log_event.cc
> === modified file 'mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result'
> --- a/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result 2010-08-20 02:59:58 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result 2010-10-15 08:20:12 +0000
> @@ -71,3 +71,30 @@ slave-bin.000001 # Query # # BEGIN
> slave-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> slave-bin.000001 # Query # # COMMIT
> slave-bin.000001 # Query # # use `test`; DROP TABLE `t3`,`t1` /* generated by
> server */
> +
> +# Bug#55478 Row events wrongly apply on the temporary table of the same name
> +# ==========================================================================
> +# The statement should be binlogged
> +CREATE TEMPORARY TABLE t1(c1 INT);
> +show binlog events in 'master-bin.000001' from<binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE t1(c1 INT)
> +
> +# The statement generates row events on t1. And the rows events should
> +# be inserted into the base table on slave.
> +CREATE TABLE t1 SELECT rand();
> +show binlog events in 'master-bin.000001' 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`; CREATE TABLE `t1` (
> + `rand()` double NOT NULL DEFAULT '0'
> +)
> +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
> +
> +DROP TEMPORARY TABLE t1;
> +# Compare the base table.
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +DROP TABLE t1;
>
> === modified file 'mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test'
> --- a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test 2009-07-26 21:48:24 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test 2010-10-15 08:20:12 +0000
> @@ -146,3 +146,37 @@ DROP TABLE t3, t1;
> -- sync_slave_with_master
>
> -- source include/show_binlog_events.inc
> +
> +--echo
> +--echo # Bug#55478 Row events wrongly apply on the temporary table of the same name
> +--echo # ==========================================================================
> +connection master;
> +
> +let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
> +let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo # The statement should be binlogged
> +CREATE TEMPORARY TABLE t1(c1 INT);
> +
> +source include/show_binlog_events.inc;
> +let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
> +let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # The statement generates row events on t1. And the rows events should
> +--echo # be inserted into the base table on slave.
> +CREATE TABLE t1 SELECT rand();
> +
> +source include/show_binlog_events.inc;
> +
> +--echo
> +DROP TEMPORARY TABLE t1;
> +
> +--echo # Compare the base table.
> +let diff_table= test.t1;
> +source include/rpl_diff_tables.inc;
> +
> +--echo
> +connection master;
> +DROP TABLE t1;
> +source include/master-slave-end.inc;
>
> === modified file 'sql/log_event.cc'
> --- a/sql/log_event.cc 2010-09-24 15:24:54 +0000
> +++ b/sql/log_event.cc 2010-10-15 08:20:12 +0000
> @@ -8439,6 +8439,7 @@ int Table_map_log_event::do_apply_event(
> m_field_metadata, m_field_metadata_size,
> m_null_bits, m_flags);
> table_list->m_tabledef_valid= TRUE;
> + table_list->open_type= OT_BASE_ONLY;
>
> /*
> We record in the slave's information that the table should be
>
>
>
>
>