# # BUG#47863 # This test verifies if the session variable 'binlog_format' # is read-only inside a transaction and in sub-statements. # source include/have_innodb.inc; source include/have_binlog_format_row.inc; set @save_binlog_format= @@global.binlog_format; set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates; create table t1 (a int) engine= myisam; create table t2 (a int) engine= innodb; SELECT @@session.binlog_format; SET AUTOCOMMIT=1; --echo # Test that the session variable 'binlog_format' --echo # is writable outside a transaction. set @@session.binlog_format= statement; set @@session.binlog_direct_non_transactional_updates= TRUE; SELECT @@session.binlog_format; SELECT @@session.binlog_direct_non_transactional_updates; begin; --echo # Test that the session variable 'binlog_format' is read-only --echo # inside a transaction with no preceding updates. --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT set @@session.binlog_format= mixed; --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT set @@session.binlog_direct_non_transactional_updates= FALSE; insert into t2 values (1); --echo # Test that the session variable 'binlog_format' is read-only --echo # inside a transaction with preceding transactional updates. --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT set @@session.binlog_format= row; --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT set @@session.binlog_direct_non_transactional_updates= FALSE; commit; begin; insert into t1 values (2); --echo # Test that the session variable 'binlog_format' is read-only --echo # inside a transaction with preceding non-transactional updates. --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT set @@session.binlog_format= statement; --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT set @@session.binlog_direct_non_transactional_updates= FALSE; commit; --echo # Test that the session variable 'binlog_format' is writable --echo # when AUTOCOMMIT=0, before a transaction has started. set AUTOCOMMIT=0; set @@session.binlog_format= row; set @@session.binlog_direct_non_transactional_updates= FALSE; SELECT @@session.binlog_format; SELECT @@session.binlog_direct_non_transactional_updates; insert into t1 values (4); --echo # Test that the session variable 'binlog_format' is read-only inside an --echo # AUTOCOMMIT=0 transaction with preceding non-transactional updates. --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT set @@session.binlog_format= statement; --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT set @@session.binlog_direct_non_transactional_updates= TRUE; SELECT @@session.binlog_format; SELECT @@session.binlog_direct_non_transactional_updates; commit; insert into t2 values (5); --echo # Test that the session variable 'binlog_format' is read-only inside an --echo # AUTOCOMMIT=0 transaction with preceding transactional updates. --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT set @@session.binlog_format= row; --error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT set @@session.binlog_direct_non_transactional_updates= TRUE; SELECT @@session.binlog_format; SELECT @@session.binlog_direct_non_transactional_updates; commit; begin; insert into t2 values (6); --echo # Test that the global variable 'binlog_format' is writable --echo # inside a transaction. SELECT @@global.binlog_format; set @@global.binlog_format= statement; set @@global.binlog_direct_non_transactional_updates= TRUE; SELECT @@global.binlog_format; SELECT @@global.binlog_direct_non_transactional_updates; commit; set @@global.binlog_format= @save_binlog_format; set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct; create table t3(a int, b int) engine= innodb; create table t4(a int) engine= innodb; create table t5(a int) engine= innodb; delimiter |; eval create trigger tr1 after insert on t3 for each row begin insert into t4(a) values(1); set @@session.binlog_format= statement; insert into t4(a) values(2); insert into t5(a) values(3); end | delimiter ;| --echo # Test that the session variable 'binlog_format' is read-only --echo # in sub-statements. --error ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT insert into t3(a,b) values(1,1); SELECT @@session.binlog_format; create table t6(a int, b int) engine= innodb; create table t7(a int) engine= innodb; create table t8(a int) engine= innodb; delimiter |; eval create trigger tr2 after insert on t6 for each row begin insert into t7(a) values(1); set @@global.binlog_direct_non_transactional_updates= FALSE; insert into t7(a) values(2); insert into t8(a) values(3); end | delimiter ;| --echo # Test that the session variable 'binlog_format' is read-only --echo # in sub-statements. --error ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT insert into t6(a,b) values(1,1); SELECT @@session.binlog_direct_non_transactional_updates; drop table t1; drop table t2; drop table t3; drop table t4; drop table t5; drop table t6; drop table t7; drop table t8;