List:Commits« Previous MessageNext Message »
From:Andrei Elkin Date:June 9 2008 8:57pm
Subject:Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)
View as plain text  
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
Thread
bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695) Mats Kindahl9 Jun
  • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Andrei Elkin9 Jun
    • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Mats Kindahl9 Jun
      • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Andrei Elkin10 Jun
        • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Mats Kindahl10 Jun
          • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Andrei Elkin10 Jun
            • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Mats Kindahl10 Jun
              • Re: bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2695)Andrei Elkin10 Jun