Hi Alfranio,
Please find my review comments below. Let me know If I
misinterpreted the purpose of the patch.
Regards,
Luís
STATUS
------
Not approved.
REQUIRED CHANGES
----------------
R1. Maybe it's just me, but I find the commit message
unclear. I think there is different behavior for STMT and
MIXED/ROW when N-statements are involved and this should be
clear. Can you please rewrite it?
R2.
As I read it there are two problems reported:
1. MIXED/ROW: T-statements are not truncated even though
they could be (they are written to the transactional
cache and binlogging is deferred until transaction
COMMIT/ROLLBACK. OTOH, N-statements are written to
the non-transactional cache and binlogged upon
statement COMMIT/ROLLBACK. Therefore, we can clear
transactional cache without affecting N-statements
logging).
2. STMT: T-statements and N-statements are written to
the transactional cache and are both deferred until
transaction COMMIT/ROLLBACK. However, if a SAVEPOINT
is set, there are only T-statements *after* the
savepoint and a ROLLBACK to the savepoint is issued,
then the transactional changes are not removed from
cache back until the savepoint.
After investigating a bit, I came up with the following
test case, that showed me that this patch does not
address issue #2. Please check the some comments inline
the test case.
==== TEST CASE
-- source include/have_log_bin.inc
-- source include/have_innodb.inc
CREATE TABLE nt (a int);
CREATE TABLE tt (a int) engine=InnoDB;
SET AUTOCOMMIT=0;
# case #1
BEGIN;
INSERT INTO tt VALUES (1);
INSERT INTO nt VALUES (2);
SAVEPOINT s1;
INSERT INTO tt VALUES (3)
INSERT INTO nt VALUES (4);
ROLLBACK TO SAVEPOINT s1;
COMMIT;
#
# ROW: logging of INSERT 3 should *not* be done
# STMT: logging of INSERT 3 and INSERT 4 *should* be done.
#
#### Your patch fixes the above case (case #1) for ROW and STMT
# case #2
BEGIN;
INSERT INTO tt VALUES (10);
INSERT INTO nt VALUES (20);
SAVEPOINT s1;
INSERT INTO tt VALUES (30);
ROLLBACK TO SAVEPOINT s1;
COMMIT;
#
# ROW: logging of INSERT 30 should *not* be done
# STMT: logging of INSERT 30 should *not* be done
#
-- exit
#### Your patch *does not* fix the above for STMT.
==== END OF TEST CASE
I think that case #2 is not a big deal, but should be fixed
as part of part of this bug report, wouldn't you say?
R3. Please, to make bazaar bundles useful, don't commit on top
of your own local revisions. I tried to merge the bundle on
a vanilla mysql-5.1-rep+3 latest tree and it failed:
"bzr: ERROR: Your branch does not have all of the revisions
required in order to merge this merge directive and the target location
specified in the merge directive is not a branch:
file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-47327/mysql-5.1-rep%2B3/"
REQUESTS
--------
n/a
SUGGESTIONS
-----------
n/a
DETAILS
-------
n/a
On Tue, 2009-11-03 at 19:19 +0000, Alfranio Correia wrote:
> #At
> file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-47327/mysql-5.1-rep%2B3/
> based on revid:alfranio.correia@stripped
>
> 3117 Alfranio Correia 2009-11-03
> BUG#47327 ROLLBACK TO SAVEPOINT binlogged if trx contains non-trx updates
> before savepoint
>
> When a ROLLBACK is issued, and there is no updates to non-transactional
> tables,
> then the transaction cache is cleared and not written to the binlog. However,
> if the transaction contains updates to non-transactional tables, then the
> transaction cache is written to the binlog, followed by a ROLLBACK.
> However, this happens even when the non-transactional changes were written to
> the binlog through the non-transaction cache and as such the transaction cache
> does not contain non-transactional.
>
> When a ROLLBACK TO SAVEPOINT is issued, and the transaction cache does not
> contain updates to non-transactional tables, then the transaction cache is
> cleared from the savepoint to the end. However, if the transaction cache
> contains updates to non-transactional tables, then the transaction cache is
> not
> cleared, even if the non-transactional updates are outside the scope of the
> savepoint.
>
> To fix the problem, we keep the track of the content of the transaction cache,
> in order to truncate it and avoid writing unnecessary data to the binary log
> when it does not have updates to non-transactional.
>
> modified:
> mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result
> mysql-test/suite/rpl/r/rpl_mixed_mixing_engines.result
> mysql-test/suite/rpl/r/rpl_row_mixing_engines.result
> mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result
> sql/log.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-11-03
> 19:02:56 +0000
> +++ b/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result 2009-11-03
> 19:19:41 +0000
> @@ -53,10 +53,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.t1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; savepoint my_savepoint
> -master-bin.000001 # Table_map # # table_id: # (test.t1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; rollback to savepoint my_savepoint
> master-bin.000001 # Xid # # COMMIT /* XID */
> delete from t1;
> delete from t2;
> @@ -84,10 +80,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.t1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; savepoint my_savepoint
> -master-bin.000001 # Table_map # # table_id: # (test.t1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; rollback to savepoint my_savepoint
> master-bin.000001 # Table_map # # table_id: # (test.t1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> master-bin.000001 # Xid # # COMMIT /* XID */
>
> === modified file 'mysql-test/suite/rpl/r/rpl_mixed_mixing_engines.result'
> --- a/mysql-test/suite/rpl/r/rpl_mixed_mixing_engines.result 2009-11-03 19:02:56
> +0000
> +++ b/mysql-test/suite/rpl/r/rpl_mixed_mixing_engines.result 2009-11-03 19:19:41
> +0000
> @@ -10762,9 +10762,6 @@ COMMIT;
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 4)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T S1 T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -10774,9 +10771,6 @@ master-bin.000001 # Query # # use `test`
> master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 4)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T S1 T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
> @@ -10815,9 +10809,6 @@ COMMIT;
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (319, 2)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (319, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B T N S1 T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -10828,9 +10819,6 @@ master-bin.000001 # Write_rows # # table
> master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (319, 2)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (319, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B T N S1 T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
> @@ -10869,9 +10857,6 @@ COMMIT;
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (320, 2)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (320, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B T S1 N T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -10882,9 +10867,6 @@ master-bin.000001 # Write_rows # # table
> master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (320, 2)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (320, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B T S1 N T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
>
> === modified file 'mysql-test/suite/rpl/r/rpl_row_mixing_engines.result'
> --- a/mysql-test/suite/rpl/r/rpl_row_mixing_engines.result 2009-11-03 19:02:56 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_row_mixing_engines.result 2009-11-03 19:19:41 +0000
> @@ -12240,10 +12240,6 @@ Log_name Pos Event_type Server_id End_lo
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T S1 T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -12255,10 +12251,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T S1 T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
> @@ -12298,10 +12290,6 @@ Log_name Pos Event_type Server_id End_lo
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B T N S1 T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -12313,10 +12301,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B T N S1 T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
> @@ -12356,10 +12340,6 @@ Log_name Pos Event_type Server_id End_lo
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B T S1 N T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -12371,10 +12351,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Table_map # # table_id: # (test.tt_1)
> -master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B T S1 N T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
>
> === modified file 'mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result'
> --- a/mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result 2009-11-03 19:02:56 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result 2009-11-03 19:19:41 +0000
> @@ -5527,18 +5527,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (189, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES
> (189, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (189, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5561,20 +5555,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',190), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',190), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T-proc R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES
> (190, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',190), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',190), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T-proc R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5597,18 +5583,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (191, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T-trig R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES
> (191, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (191, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T-trig R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5633,18 +5613,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(192,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T-func R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES
> (192, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(192,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T-func R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5667,18 +5641,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (193, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-trig T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> (193, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (193, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-trig T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5701,18 +5669,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (194, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-trig T-trig R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> (194, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (194, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-trig T-trig R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5737,18 +5699,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(195,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-trig T-func R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> (195, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(195,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-trig T-func R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5771,20 +5727,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',196), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',196), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-trig T-proc R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> (196, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',196), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',196), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-trig T-proc R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5809,18 +5757,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (197, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-func T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(197,2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (197, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-func T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5845,18 +5787,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (198, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-func T-trig R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(198,2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (198, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-func T-trig R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5883,18 +5819,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(199,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-func T-func R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(199,2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(199,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-func T-func R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5919,20 +5849,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',200), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',200), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-func T-proc R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_nt_5_suc`(200,2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',200), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',200), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-func T-proc R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -5960,9 +5882,6 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (201, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-proc T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> @@ -5972,9 +5891,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',201), NAME_CONST('in_stmt_id',1) + 1)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (201, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-proc T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -6002,10 +5918,6 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',202), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',202), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-proc T-proc R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> @@ -6015,10 +5927,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',202), NAME_CONST('in_stmt_id',1) + 1)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',202), NAME_CONST('in_stmt_id',1))
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',202), NAME_CONST('in_stmt_id',1) + 1)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-proc T-proc R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -6046,9 +5954,6 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (203, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-proc T-trig R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> @@ -6058,9 +5963,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',203), NAME_CONST('in_stmt_id',1) + 1)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_5(trans_id, stmt_id) VALUES
> (203, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-proc T-trig R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -6090,9 +5992,6 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(204,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N-proc T-func R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> @@ -6102,9 +6001,6 @@ master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_5(trans_id, stmt_id) VALUES
> ( NAME_CONST('p_trans_id',204), NAME_CONST('in_stmt_id',1) + 1)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; SELECT `test`.`fc_i_tt_5_suc`(204,4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N-proc T-func R << -e-e-e-e-e-e-e-e-e-e-e-
>
>
> @@ -6582,18 +6478,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (219, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B tN T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id, info)
> SELECT 219, 2, COUNT(*) FROM tt_1
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (219, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B tN T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -6842,18 +6732,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (227, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B tNe T R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id, info)
> SELECT 227, 2, COUNT(*) FROM tt_1 UNION SELECT 219, 2, COUNT(*) FROM tt_1
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (227, 4)
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B tNe T R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -9390,18 +9274,12 @@ ROLLBACK;
> Warnings:
> Warning 1196 Some non-transactional changed tables couldn't be rolled back
> Log_name Pos Event_type Server_id End_log_pos Info
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id, info)
> SELECT 304, 4, COUNT(*) FROM nt_1
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> R << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N nT R << -b-b-b-b-b-b-b-b-b-b-b-
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO nt_1(trans_id, stmt_id) VALUES
> (304, 2)
> master-bin.000001 # Query # # COMMIT
> -master-bin.000001 # Query # # BEGIN
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id, info)
> SELECT 304, 4, COUNT(*) FROM nt_1
> -master-bin.000001 # Query # # ROLLBACK
> -e-e-e-e-e-e-e-e-e-e-e- >> B N nT R << -e-e-e-e-e-e-e-e-e-e-e-
>
> -b-b-b-b-b-b-b-b-b-b-b- >> B << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -9906,9 +9784,6 @@ COMMIT;
> Log_name Pos Event_type Server_id End_log_pos Info
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 4)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> C << -e-e-e-e-e-e-e-e-e-e-e-
> -b-b-b-b-b-b-b-b-b-b-b- >> B N T S1 T R1 C << -b-b-b-b-b-b-b-b-b-b-b-
> @@ -9918,9 +9793,6 @@ master-bin.000001 # Query # # use `test`
> master-bin.000001 # Query # # COMMIT
> master-bin.000001 # Query # # BEGIN
> master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 4)
> -master-bin.000001 # Query # # use `test`; SAVEPOINT s1
> -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(trans_id, stmt_id) VALUES
> (318, 7)
> -master-bin.000001 # Query # # use `test`; ROLLBACK TO s1
> master-bin.000001 # Xid # # COMMIT /* XID */
> -e-e-e-e-e-e-e-e-e-e-e- >> B N T S1 T R1 C << -e-e-e-e-e-e-e-e-e-e-e-
>
>
> === modified file 'sql/log.cc'
> --- a/sql/log.cc 2009-11-03 19:02:56 +0000
> +++ b/sql/log.cc 2009-11-03 19:19:41 +0000
> @@ -272,7 +272,7 @@ private:
>
> class binlog_cache_mngr {
> public:
> - binlog_cache_mngr() {}
> + binlog_cache_mngr(): pos_stmt_committed(0), has_stmt_committed(FALSE) {}
>
> void reset_cache(binlog_cache_data* cache_data)
> {
> @@ -289,12 +289,49 @@ public:
> return (is_transactional ? &trx_cache.cache_log :
> &stmt_cache.cache_log);
> }
>
> + void calc_pos_stmt_committed()
> + {
> + pos_stmt_committed= (has_stmt_committed ? pos_stmt_committed :
> + trx_cache.get_byte_position());
> + has_stmt_committed= TRUE;
> + }
> +
> + void recalc_pos_stmt_committed()
> + {
> + if (has_stmt_committed)
> + {
> + my_off_t pos= trx_cache.get_byte_position();
> + has_stmt_committed= pos > pos_stmt_committed ? TRUE : FALSE;
> + pos_stmt_committed= pos > pos_stmt_committed ? pos_stmt_committed : 0;
> + }
> + }
> +
> + my_off_t get_pos_stmt_committed()
> + {
> + return (pos_stmt_committed);
> + }
> +
> + bool is_stmt_committed()
> + {
> + return (has_stmt_committed);
> + }
> +
> + void clear_stmt_committed()
> + {
> + pos_stmt_committed= 0;
> + has_stmt_committed= FALSE;
> + }
> +
> binlog_cache_data stmt_cache;
>
> binlog_cache_data trx_cache;
>
> private:
>
> + my_off_t pos_stmt_committed;
> +
> + bool has_stmt_committed;
> +
> binlog_cache_mngr& operator=(const binlog_cache_mngr& info);
> binlog_cache_mngr(const binlog_cache_mngr& info);
> };
> @@ -1443,6 +1480,7 @@ binlog_flush_trx_cache(THD *thd, binlog_
> error= mysql_bin_log.write(thd, &cache_mngr->trx_cache.cache_log, end_ev,
> cache_mngr->trx_cache.has_incident());
> cache_mngr->reset_cache(&cache_mngr->trx_cache);
> + cache_mngr->clear_stmt_committed();
>
> /*
> We need to step the table map version after writing the
> @@ -1489,7 +1527,7 @@ binlog_truncate_trx_cache(THD *thd, binl
> all ? "all" : "stmt"));
> /*
> If rolling back an entire transaction or a single statement not
> - inside a transaction, we reset the transaction cache.
> + inside a transaction, we reset the transactional cache.
> */
> thd->binlog_remove_pending_rows_event(TRUE, is_transactional);
> if (all || !thd->in_multi_stmt_transaction())
> @@ -1498,6 +1536,7 @@ binlog_truncate_trx_cache(THD *thd, binl
> error= mysql_bin_log.write_incident(thd, TRUE);
>
> cache_mngr->reset_cache(&cache_mngr->trx_cache);
> + cache_mngr->clear_stmt_committed();
>
> thd->clear_binlog_table_maps();
> }
> @@ -1506,7 +1545,10 @@ binlog_truncate_trx_cache(THD *thd, binl
> transaction cache to remove the statement.
> */
> else
> + {
> cache_mngr->trx_cache.restore_prev_position();
> + cache_mngr->recalc_pos_stmt_committed();
> + }
>
> /*
> We need to step the table map version on a rollback to ensure that a new
> @@ -1615,6 +1657,7 @@ static int binlog_commit(handlerton *hto
> we're here because cache_log was flushed in MYSQL_BIN_LOG::log_xid()
> */
> cache_mngr->reset_cache(&cache_mngr->trx_cache);
> + cache_mngr->clear_stmt_committed();
> DBUG_RETURN(0);
> }
>
> @@ -1680,6 +1723,7 @@ static int binlog_rollback(handlerton *h
> we're here because cache_log was flushed in MYSQL_BIN_LOG::log_xid()
> */
> cache_mngr->reset_cache(&cache_mngr->trx_cache);
> + cache_mngr->clear_stmt_committed();
> DBUG_RETURN(0);
> }
>
> @@ -1710,10 +1754,11 @@ static int binlog_rollback(handlerton *h
> . the OPTION_KEEP_LOG is activate.
> */
> if (thd->variables.binlog_format == BINLOG_FORMAT_STMT &&
> - ((all && thd->transaction.all.modified_non_trans_table) ||
> - (!all && thd->transaction.stmt.modified_non_trans_table
> &&
> - !thd->in_multi_stmt_transaction()) ||
> - (thd->options & OPTION_KEEP_LOG)))
> + ((all && thd->transaction.all.modified_non_trans_table
> &&
> + cache_mngr->is_stmt_committed()) ||
> + (!all && thd->transaction.stmt.modified_non_trans_table
> &&
> + cache_mngr->is_stmt_committed() &&
> !thd->in_multi_stmt_transaction()) ||
> + (thd->options & OPTION_KEEP_LOG)))
> {
> Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, FALSE, TRUE, 0);
> error= binlog_flush_trx_cache(thd, cache_mngr, &qev);
> @@ -1724,7 +1769,7 @@ static int binlog_rollback(handlerton *h
> */
> else if (all || (!all &&
> (!thd->transaction.stmt.modified_non_trans_table ||
> - !thd->in_multi_stmt_transaction() ||
> + !thd->in_multi_stmt_transaction() ||
> thd->variables.binlog_format != BINLOG_FORMAT_STMT)))
> error= binlog_truncate_trx_cache(thd, cache_mngr, all);
> }
> @@ -1733,7 +1778,7 @@ static int binlog_rollback(handlerton *h
> This is part of the stmt rollback.
> */
> if (!all)
> - cache_mngr->trx_cache.set_prev_position(MY_OFF_T_UNDEF);
> + cache_mngr->trx_cache.set_prev_position(MY_OFF_T_UNDEF);
> DBUG_RETURN(error);
> }
>
> @@ -1818,12 +1863,15 @@ static int binlog_savepoint_rollback(han
> {
> DBUG_ENTER("binlog_savepoint_rollback");
>
> + binlog_cache_mngr *const cache_mngr=
> + (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
> +
> /*
> Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some
> non-transactional table. Otherwise, truncate the binlog cache starting
> from the SAVEPOINT command.
> */
> - if (unlikely(thd->transaction.all.modified_non_trans_table ||
> + if (unlikely(cache_mngr->is_stmt_committed() ||
> (thd->options & OPTION_KEEP_LOG)))
> {
> int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
> @@ -4276,6 +4324,9 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
> {
> file= &cache_mngr->trx_cache.cache_log;
> cache_data= &cache_mngr->trx_cache;
> + if (thd->variables.binlog_format == BINLOG_FORMAT_STMT &&
> + thd->transaction.stmt.modified_non_trans_table)
> + cache_mngr->calc_pos_stmt_committed();
> }
>
> thd->binlog_start_trans_and_stmt();
>
--
Luís