Mats,
I wonder if this is the most recent commit ...
But that's the lattest that I found in commits@.
> #At bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-6.0-falcon/
>
> 2695 Mats Kindahl 2008-06-09
> Bug #37221: SET AUTOCOMMIT=1 does not commit binary log
>
> When setting AUTOCOMMIT=1 after starting a transaction, the binary log
> did not commit the outstanding transaction. The reason was that the binary
> log commit function saw the values of the new settings, deciding that there
> were nothing to commit.
>
The problem description left unattended although you agreed on the last review mail:
> A SET AUTOCOMMIT=1 does not commit a transaction started with BEGIN and
> therefore there is nothing in binlog, either engine. This contradicts
> to the current docs.
>
> B If a Falcon transaction is started with SET AUTOCOMMIT= 0 committing with
> SET AUTOCOMMIT=1 to engine works but nothing in binlog, as you are
> reporting.
>
> I think both issues comprise the whole problem.
Agree.
But what worse, the server code patch leaves the same flaw letting A.
> Fixed the problem by moving the implicit commit to before the thread option
> flags were changed, so that the binary log sees the old values of the flags
> instead of the values they will take after the statement.
> added:
> mysql-test/extra/binlog_tests/implicit.test
> mysql-test/suite/binlog/r/binlog_implicit_commit.result
> mysql-test/suite/binlog/t/binlog_implicit_commit.test
> mysql-test/suite/falcon/r/rpl_falcon_bug_37221.result
> mysql-test/suite/falcon/t/rpl_falcon_bug_37221.test
> modified:
> sql/set_var.cc
>
> per-file comments:
> mysql-test/extra/binlog_tests/implicit.test
> Test file for checking implicit commits inside and outside transaction.
> mysql-test/suite/binlog/r/binlog_implicit_commit.result
> Adding result file.
> mysql-test/suite/binlog/t/binlog_implicit_commit.test
> Adding test file to check that SET AUTOCOMMIT and LOCK/UNLOCK TABLES does an
> implicit commit.
> mysql-test/suite/falcon/r/rpl_falcon_bug_37221.result
> Result file.
> mysql-test/suite/falcon/t/rpl_falcon_bug_37221.test
> Adding test to ensure that Falcon bug is fixed.
> sql/set_var.cc
> Adding code to commit pending transaction before changing option flags.
> === added file 'mysql-test/extra/binlog_tests/implicit.test'
As a rule, a new file needs some comments. Could you please provide a
modest heading description for this file?
> --- a/mysql-test/extra/binlog_tests/implicit.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/extra/binlog_tests/implicit.test 2008-06-09 16:58:19 +0000
> @@ -0,0 +1,28 @@
> +# First part: outside a transaction
> +RESET MASTER;
> +eval $prepare;
> +
> +INSERT INTO t1 VALUES (1);
> +source include/show_binlog_events.inc;
> +eval $statement;
> +source include/show_binlog_events.inc;
> +if (`select '$cleanup' != ''`) {
> + eval $cleanup;
> +}
> +
> +# Second part: inside a transaction
> +RESET MASTER;
> +eval $prepare;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +source include/show_binlog_events.inc;
> +eval $statement;
> +source include/show_binlog_events.inc;
> +INSERT INTO t1 VALUES (3);
> +source include/show_binlog_events.inc;
> +COMMIT;
> +source include/show_binlog_events.inc;
> +if (`select '$cleanup' != ''`) {
> + eval $cleanup;
> +}
> +
>
> === added file 'mysql-test/suite/binlog/r/binlog_implicit_commit.result'
> --- a/mysql-test/suite/binlog/r/binlog_implicit_commit.result 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/binlog/r/binlog_implicit_commit.result 2008-06-09 16:58:19
> +0000
> @@ -0,0 +1,345 @@
> +CREATE TABLE t1 (id INT) ENGINE = InnoDB;
> +SET BINLOG_FORMAT = STATEMENT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (3)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (3)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (3)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (3)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
> +master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (3)
> +master-bin.000001 # Xid # # COMMIT /* XID */
> +COMMIT;
> +SET BINLOG_FORMAT = ROW;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 1;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Table_map # # table_id: # (test.t1)
> +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Table_map # # table_id: # (test.t1)
> +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 1;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +SET AUTOCOMMIT = 0;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +INSERT INTO t1 VALUES (3);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +master-bin.000001 # Table_map # # table_id: # (test.t1)
> +master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
> +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 */
> +COMMIT;
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +LOCK TABLES t1 WRITE;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +INSERT INTO t1 VALUES (2);
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +UNLOCK TABLES;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +master-bin.000001 # Query # # use `test`; BEGIN
> +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 */
> +DROP TABLE t1;
>
> === added file 'mysql-test/suite/binlog/t/binlog_implicit_commit.test'
> --- a/mysql-test/suite/binlog/t/binlog_implicit_commit.test 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/binlog/t/binlog_implicit_commit.test 2008-06-09 16:58:19
> +0000
> @@ -0,0 +1,63 @@
> +# The purpose of this test is to test that setting autocommit does a
> +# commit of outstanding transactions and nothing is left pending in
> +# the transaction cache.
> +
> +source include/have_log_bin.inc;
> +source include/have_innodb.inc;
> +
> +# We need a transactional engine, so let's use InnoDB
> +CREATE TABLE t1 (id INT) ENGINE = InnoDB;
> +
> +# Testing SET AUTOCOMMIT
> +SET BINLOG_FORMAT = STATEMENT;
> +
> +let $cleanup = COMMIT;
> +
> +let $prepare = SET AUTOCOMMIT = 0;
> +let $statement = SET AUTOCOMMIT = 1;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 1;
> +let $statement = SET AUTOCOMMIT = 1;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 0;
> +let $statement = SET AUTOCOMMIT = 0;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 1;
> +let $statement = SET AUTOCOMMIT = 0;
> +source extra/binlog_tests/implicit.test;
> +
> +SET BINLOG_FORMAT = ROW;
> +let $prepare = SET AUTOCOMMIT = 0;
> +let $statement = SET AUTOCOMMIT = 1;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 1;
> +let $statement = SET AUTOCOMMIT = 1;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 0;
> +let $statement = SET AUTOCOMMIT = 0;
> +source extra/binlog_tests/implicit.test;
> +
> +let $prepare = SET AUTOCOMMIT = 1;
> +let $statement = SET AUTOCOMMIT = 0;
> +source extra/binlog_tests/implicit.test;
> +
> +RESET MASTER;
> +SET AUTOCOMMIT = 0;
> +INSERT INTO t1 VALUES (1);
> +source include/show_binlog_events.inc;
> +LOCK TABLES t1 WRITE;
> +source include/show_binlog_events.inc;
> +INSERT INTO t1 VALUES (2);
> +source include/show_binlog_events.inc;
> +UNLOCK TABLES;
> +source include/show_binlog_events.inc;
> +COMMIT;
> +source include/show_binlog_events.inc;
> +
> +# Cleaning up
> +DROP TABLE t1;
>
> === added file 'mysql-test/suite/falcon/r/rpl_falcon_bug_37221.result'
> --- a/mysql-test/suite/falcon/r/rpl_falcon_bug_37221.result 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/falcon/r/rpl_falcon_bug_37221.result 2008-06-09 16:58:19
> +0000
> @@ -0,0 +1,38 @@
> +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;
> +[master]
> +SET BINLOG_FORMAT = 'ROW';
> +CREATE TABLE IF NOT EXISTS t1 (id INT) ENGINE = Falcon;
> +SET AUTOCOMMIT=0;
> +INSERT INTO t1 VALUES (1);
> +SET AUTOCOMMIT=1;
> +SELECT * FROM t1;
> +id
> +1
> +[slave]
> +SELECT * FROM t1;
> +id
> +1
> +[master]
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +SET AUTOCOMMIT=1;
> +[slave]
> +SELECT * FROM t1 /* Should not contain 2 */;
> +id
> +1
> +[master]
> +INSERT INTO t1 VALUES (3);
> +COMMIT;
> +[slave]
> +SELECT * FROM t1 /* Should contain 2 and 3 */;
> +id
> +1
> +2
> +3
> +[master]
> +DROP TABLE t1;
>
Could you please provide a
modest heading description for this file?
> === added file 'mysql-test/suite/falcon/t/rpl_falcon_bug_37221.test'
> --- a/mysql-test/suite/falcon/t/rpl_falcon_bug_37221.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/falcon/t/rpl_falcon_bug_37221.test 2008-06-09 16:58:19 +0000
> @@ -0,0 +1,47 @@
> +source include/master-slave.inc;
> +
> +--echo [master]
> +connection master;
> +SET BINLOG_FORMAT = 'ROW';
> +
> +CREATE TABLE IF NOT EXISTS t1 (id INT) ENGINE = Falcon;
> +
> +# When switching to AUTOCOMMIT=1, there is an implicit commit if we
> +# are outside a real transaction.
> +
> +SET AUTOCOMMIT=0;
> +INSERT INTO t1 VALUES (1);
> +SET AUTOCOMMIT=1;
> +SELECT * FROM t1;
> +--echo [slave]
> +sync_slave_with_master;
> +SELECT * FROM t1;
> +
> +# When inside a transaction, AUTOCOMMIT=1 should not commit the
> +# transaction. This is hard to test for sure (since delays might cause
> +# the transaction to not propagate fast enough), but it will not cause
> +# any false negatives (just false positives).
> +
> +--echo [master]
> +connection master;
> +BEGIN;
> +INSERT INTO t1 VALUES (2);
> +SET AUTOCOMMIT=1;
> +
> +--echo [slave]
> +connection slave;
> +SELECT * FROM t1 /* Should not contain 2 */;
> +
> +--echo [master]
> +connection master;
> +INSERT INTO t1 VALUES (3);
> +COMMIT;
> +
> +--echo [slave]
> +sync_slave_with_master;
> +SELECT * FROM t1 /* Should contain 2 and 3 */;
> +
> +--echo [master]
> +connection master;
> +DROP TABLE t1;
> +sync_slave_with_master;
>
> === modified file 'sql/set_var.cc'
> --- a/sql/set_var.cc 2008-05-21 10:17:29 +0000
> +++ b/sql/set_var.cc 2008-06-09 16:58:19 +0000
> @@ -2970,6 +2970,15 @@ static bool set_option_autocommit(THD *t
>
> ulonglong org_options= thd->options;
>
> + /*
> + If we are setting AUTOCOMMIT=1 and it was not already 1, then we
> + need to commit any outstanding transactions.
> + */
> + if (var->save_result.ulong_value != 0 &&
> + (thd->options & OPTION_NOT_AUTOCOMMIT) &&
> + ha_commit(thd))
> + return 1;
> +
Strange, nothing has chanded since the previous patch regarding to
begin; ... ; set autocommit=1
committing transaction. It can not commit.
> if (var->save_result.ulong_value != 0)
> thd->options&= ~((sys_var_thd_bit*) var->var)->bit_flag;
> else
> @@ -2983,8 +2992,6 @@ static bool set_option_autocommit(THD *t
> thd->options&= ~(ulonglong) (OPTION_BEGIN | OPTION_KEEP_LOG);
> thd->transaction.all.modified_non_trans_table= FALSE;
> thd->server_status|= SERVER_STATUS_AUTOCOMMIT;
> - if (ha_commit(thd))
> - return 1;
> }
> else
> {
>
cheers,
Andrei