mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Manual merge from mysql-trunk-bugfixing.
Conflicts: - BUILD/SETUP.sh - mysql-test/mysql-test-run.pl - mysql-test/r/partition_error.result - mysql-test/t/disabled.def - mysql-test/t/partition_error.test - sql/share/errmsg-utf8.txt
This commit is contained in:
@ -8,14 +8,14 @@ INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
||||
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
||||
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
The last event before the COMMIT is use `test`; UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c
|
||||
*** Please look in binlog_multi_engine.test if you have a diff here ****
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
||||
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
||||
COMMIT;
|
||||
TRUNCATE t1m;
|
||||
|
@ -412,13 +412,41 @@ master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
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`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
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 # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
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 # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
||||
master-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */
|
||||
reset master;
|
||||
|
53
mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result
Normal file
53
mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result
Normal file
@ -0,0 +1,53 @@
|
||||
SET @old_binlog_format= @@global.binlog_format;
|
||||
INSTALL PLUGIN example SONAME 'ha_example.so';
|
||||
################################################################################
|
||||
# Verifies if ER_BINLOG_STMT_MODE_AND_ROW_ENGINE happens by setting the binlog
|
||||
# format to STATEMENT and the transaction isolation level to READ COMMITTED as
|
||||
# such changes force Innodb to accept changes in the row format.
|
||||
#
|
||||
# When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
# any error should be triggered.
|
||||
#
|
||||
# In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
# ER_BINLOG_STMT_MODE_AND_ROW_ENGINE.
|
||||
################################################################################
|
||||
SET binlog_format = STATEMENT;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
CREATE TABLE t_row (a VARCHAR(100)) ENGINE = InnoDB;
|
||||
ALTER TABLE t_row ADD COLUMN b INT;
|
||||
CREATE TRIGGER trig_row BEFORE INSERT ON t_row FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
CREATE INDEX i ON t_row(a);
|
||||
CREATE TABLE t_row_new ENGINE = InnoDB SELECT * FROM t_row;
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
|
||||
DROP TABLE t_row;
|
||||
|
||||
|
||||
################################################################################
|
||||
# Verifies if ER_BINLOG_ROW_MODE_AND_STMT_ENGINE happens by setting the binlog
|
||||
# format to ROW and using a engine, i.e. EXAMPLE, that only supports STATEMENT.
|
||||
#
|
||||
# When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
# the error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE is not triggered. Note that other
|
||||
# errors are triggered due to restrictions in the engine.
|
||||
#
|
||||
# In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
# ER_BINLOG_ROW_MODE_AND_STMT_ENGINE.
|
||||
################################################################################
|
||||
SET binlog_format = ROW;
|
||||
CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
|
||||
ALTER TABLE t_stmt ADD COLUMN b INT;
|
||||
ERROR 42000: This version of MySQL doesn't yet support 'ALTER TABLE'
|
||||
CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
CREATE INDEX i ON t_stmt(a);
|
||||
ERROR 42000: Too many key parts specified; max 0 parts allowed
|
||||
CREATE TABLE t_stmt_new ENGINE = EXAMPLE SELECT * FROM t_stmt;
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.
|
||||
DROP TABLE t_stmt;
|
||||
|
||||
|
||||
################################################################################
|
||||
# CLEAN UP #
|
||||
################################################################################
|
||||
UNINSTALL PLUGIN example;
|
||||
SET @@global.binlog_format = @old_binlog_format;
|
||||
SET @@session.binlog_format = @old_binlog_format;
|
@ -8,7 +8,7 @@ begin;
|
||||
insert into t1 values(1);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
commit;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
@ -23,7 +23,7 @@ begin;
|
||||
insert into t1 values(2);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
@ -42,7 +42,7 @@ savepoint my_savepoint;
|
||||
insert into t1 values(4);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback to savepoint my_savepoint;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
@ -65,7 +65,7 @@ savepoint my_savepoint;
|
||||
insert into t1 values(6);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback to savepoint my_savepoint;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
@ -95,7 +95,7 @@ begin;
|
||||
insert into t1 values(8);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
select get_lock("a",10);
|
||||
get_lock("a",10)
|
||||
1
|
||||
@ -111,7 +111,7 @@ reset master;
|
||||
insert into t1 values(9);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
@ -127,7 +127,7 @@ insert into t1 values(10);
|
||||
begin;
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
@ -246,7 +246,7 @@ Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
create table t0 (n int);
|
||||
insert t0 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
set autocommit=1;
|
||||
insert into t0 select GET_LOCK("lock1",null);
|
||||
Warnings:
|
||||
@ -418,6 +418,9 @@ master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (100,100)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (101,101)
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE t1,t2
|
||||
reset master;
|
||||
create table t1 (a int) engine=innodb;
|
||||
@ -429,7 +432,7 @@ begin;
|
||||
insert into t1 values(8);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
select get_lock("a",10);
|
||||
get_lock("a",10)
|
||||
1
|
||||
|
@ -67,11 +67,8 @@ Note 1592 Unsafe statement written to the binary log using statement format sinc
|
||||
SELECT sf_bug50192();
|
||||
sf_bug50192()
|
||||
1
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.
|
||||
DROP FUNCTION sf_bug50192;
|
||||
DROP TRIGGER tr_bug50192;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1,5 +1,6 @@
|
||||
set @save_binlog_format= @@global.binlog_format;
|
||||
set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates;
|
||||
set @save_sql_log_bin= @@global.sql_log_bin;
|
||||
create table t1 (a int) engine= myisam;
|
||||
create table t2 (a int) engine= innodb;
|
||||
SELECT @@session.binlog_format;
|
||||
@ -8,116 +9,148 @@ ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
SET AUTOCOMMIT=1;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# writable outside a transaction.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin'
|
||||
# are writable outside a transaction.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
STATEMENT
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
0
|
||||
begin;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with no preceding updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set @@session.binlog_format= mixed;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
insert into t2 values (1);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with preceding transactional updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE and FALSE, respectively.
|
||||
set @@session.binlog_format= row;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
commit;
|
||||
begin;
|
||||
insert into t1 values (2);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format'
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with preceding non-transactional updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set @@session.binlog_format= mixed;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
commit;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# writable when AUTOCOMMIT=0, before a transaction has started.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set AUTOCOMMIT=0;
|
||||
set @@session.binlog_format= row;
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
insert into t1 values (3);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside an AUTOCOMMIT=0 transaction
|
||||
# with preceding non-transactional updates.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
commit;
|
||||
insert into t2 values (4);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside an AUTOCOMMIT=0 transaction with
|
||||
# preceding transactional updates.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
commit;
|
||||
begin;
|
||||
insert into t2 values (5);
|
||||
# Test that the global variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# writable inside a transaction.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE respectively.
|
||||
SELECT @@global.binlog_format;
|
||||
@@global.binlog_format
|
||||
ROW
|
||||
set @@global.binlog_format= statement;
|
||||
set @@global.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@global.sql_log_bin= FALSE;
|
||||
SELECT @@global.binlog_format;
|
||||
@@global.binlog_format
|
||||
STATEMENT
|
||||
SELECT @@global.binlog_direct_non_transactional_updates;
|
||||
@@global.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@global.sql_log_bin;
|
||||
@@global.sql_log_bin
|
||||
0
|
||||
commit;
|
||||
set @@global.binlog_format= @save_binlog_format;
|
||||
set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct;
|
||||
set @@global.sql_log_bin= @save_sql_log_bin;
|
||||
create table t3(a int, b int) engine= innodb;
|
||||
create table t4(a int) engine= innodb;
|
||||
create table t5(a int) engine= innodb;
|
||||
@ -153,6 +186,23 @@ ERROR HY000: Cannot change the binlog direct flag inside a stored function or tr
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
create table t9(a int, b int) engine= innodb;
|
||||
create table t10(a int) engine= innodb;
|
||||
create table t11(a int) engine= innodb;
|
||||
create trigger tr3 after insert on t9 for each row begin
|
||||
insert into t10(a) values(1);
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
insert into t10(a) values(2);
|
||||
insert into t11(a) values(3);
|
||||
end |
|
||||
# Test that the session variable 'sql_log_bin' is
|
||||
# read-only in sub-statements.
|
||||
# Current session value is FALSE.
|
||||
insert into t9(a,b) values(1,1);
|
||||
ERROR HY000: Cannot change the sql_log_bin inside a stored function or trigger
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
@ -161,3 +211,6 @@ drop table t5;
|
||||
drop table t6;
|
||||
drop table t7;
|
||||
drop table t8;
|
||||
drop table t9;
|
||||
drop table t10;
|
||||
drop table t11;
|
||||
|
@ -0,0 +1 @@
|
||||
--innodb $EXAMPLE_PLUGIN_OPT
|
95
mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test
Normal file
95
mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test
Normal file
@ -0,0 +1,95 @@
|
||||
################################################################################
|
||||
# BUG#50479 DDL stmt on row-only/stmt-only tables generate spurious
|
||||
# binlog_format errors
|
||||
#
|
||||
# In the fix of BUG#39934 in 5.1-rep+3, errors are generated when
|
||||
# binlog_format=row and a statement modifies a table restricted to
|
||||
# statement-logging (ER_BINLOG_ROW_MODE_AND_STMT_ENGINE); or if
|
||||
# binlog_format=statement and a statement modifies a table limited to
|
||||
# row-logging (ER_BINLOG_STMT_MODE_AND_ROW_ENGINE).
|
||||
#
|
||||
# In this test case, we check if some DDL statements that lock tables do not
|
||||
# trigger errors as they do not generate rows events and as such are harmless
|
||||
# from the point of view of conflicts between the engine's supported logging
|
||||
# format and the value of binlog_format.
|
||||
#
|
||||
# In particular, we check if:
|
||||
# 1 - ALTER TABLE, CREATE INDEX and CREATE TRIGGER do not generate either
|
||||
# ER_BINLOG_STMT_MODE_AND_ROW_ENGINE or ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
#
|
||||
# 2 - CREATE TABLE ... SELECT generates an error because the command can
|
||||
# generate row events but CREATE TABLE without SELECT does not generate
|
||||
# an error.
|
||||
################################################################################
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_example_plugin.inc
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
SET @old_binlog_format= @@global.binlog_format;
|
||||
INSTALL PLUGIN example SONAME 'ha_example.so';
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # Verifies if ER_BINLOG_STMT_MODE_AND_ROW_ENGINE happens by setting the binlog
|
||||
--echo # format to STATEMENT and the transaction isolation level to READ COMMITTED as
|
||||
--echo # such changes force Innodb to accept changes in the row format.
|
||||
--echo #
|
||||
--echo # When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
--echo # any error should be triggered.
|
||||
--echo #
|
||||
--echo # In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
--echo # ER_BINLOG_STMT_MODE_AND_ROW_ENGINE.
|
||||
--echo ################################################################################
|
||||
SET binlog_format = STATEMENT;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
CREATE TABLE t_row (a VARCHAR(100)) ENGINE = InnoDB;
|
||||
|
||||
ALTER TABLE t_row ADD COLUMN b INT;
|
||||
|
||||
CREATE TRIGGER trig_row BEFORE INSERT ON t_row FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
|
||||
CREATE INDEX i ON t_row(a);
|
||||
|
||||
--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
CREATE TABLE t_row_new ENGINE = InnoDB SELECT * FROM t_row;
|
||||
|
||||
DROP TABLE t_row;
|
||||
|
||||
--echo
|
||||
--echo
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # Verifies if ER_BINLOG_ROW_MODE_AND_STMT_ENGINE happens by setting the binlog
|
||||
--echo # format to ROW and using a engine, i.e. EXAMPLE, that only supports STATEMENT.
|
||||
--echo #
|
||||
--echo # When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
--echo # the error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE is not triggered. Note that other
|
||||
--echo # errors are triggered due to restrictions in the engine.
|
||||
--echo #
|
||||
--echo # In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
--echo # ER_BINLOG_ROW_MODE_AND_STMT_ENGINE.
|
||||
--echo ################################################################################
|
||||
SET binlog_format = ROW;
|
||||
CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
|
||||
|
||||
--error ER_NOT_SUPPORTED_YET
|
||||
ALTER TABLE t_stmt ADD COLUMN b INT;
|
||||
|
||||
CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
|
||||
--error ER_TOO_MANY_KEY_PARTS
|
||||
CREATE INDEX i ON t_stmt(a);
|
||||
|
||||
--error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE
|
||||
CREATE TABLE t_stmt_new ENGINE = EXAMPLE SELECT * FROM t_stmt;
|
||||
|
||||
DROP TABLE t_stmt;
|
||||
|
||||
--echo
|
||||
--echo
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # CLEAN UP #
|
||||
--echo ################################################################################
|
||||
UNINSTALL PLUGIN example;
|
||||
SET @@global.binlog_format = @old_binlog_format;
|
||||
SET @@session.binlog_format = @old_binlog_format;
|
@ -10,107 +10,128 @@ source include/have_binlog_format_row.inc;
|
||||
|
||||
set @save_binlog_format= @@global.binlog_format;
|
||||
set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates;
|
||||
set @save_sql_log_bin= @@global.sql_log_bin;
|
||||
create table t1 (a int) engine= myisam;
|
||||
create table t2 (a int) engine= innodb;
|
||||
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
SET AUTOCOMMIT=1;
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # writable outside a transaction.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin'
|
||||
--echo # are writable outside a transaction.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
begin;
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with no preceding updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
--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;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
|
||||
insert into t2 values (1);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with preceding transactional updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE and FALSE, respectively.
|
||||
--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;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
insert into t1 values (2);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format'
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with preceding non-transactional updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
--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;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
commit;
|
||||
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # writable when AUTOCOMMIT=0, before a transaction has started.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set AUTOCOMMIT=0;
|
||||
set @@session.binlog_format= row;
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
insert into t1 values (3);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside an AUTOCOMMIT=0 transaction
|
||||
--echo # with preceding non-transactional updates.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
--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;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
commit;
|
||||
|
||||
insert into t2 values (4);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside an AUTOCOMMIT=0 transaction with
|
||||
--echo # preceding transactional updates.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
--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;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
insert into t2 values (5);
|
||||
--echo # Test that the global variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # writable inside a transaction.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE respectively.
|
||||
SELECT @@global.binlog_format;
|
||||
set @@global.binlog_format= statement;
|
||||
set @@global.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@global.sql_log_bin= FALSE;
|
||||
SELECT @@global.binlog_format;
|
||||
SELECT @@global.binlog_direct_non_transactional_updates;
|
||||
SELECT @@global.sql_log_bin;
|
||||
commit;
|
||||
|
||||
set @@global.binlog_format= @save_binlog_format;
|
||||
set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct;
|
||||
set @@global.sql_log_bin= @save_sql_log_bin;
|
||||
|
||||
create table t3(a int, b int) engine= innodb;
|
||||
create table t4(a int) engine= innodb;
|
||||
@ -151,6 +172,25 @@ delimiter ;|
|
||||
insert into t6(a,b) values(1,1);
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
|
||||
create table t9(a int, b int) engine= innodb;
|
||||
create table t10(a int) engine= innodb;
|
||||
create table t11(a int) engine= innodb;
|
||||
delimiter |;
|
||||
eval create trigger tr3 after insert on t9 for each row begin
|
||||
insert into t10(a) values(1);
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
insert into t10(a) values(2);
|
||||
insert into t11(a) values(3);
|
||||
end |
|
||||
delimiter ;|
|
||||
|
||||
--echo # Test that the session variable 'sql_log_bin' is
|
||||
--echo # read-only in sub-statements.
|
||||
--echo # Current session value is FALSE.
|
||||
--error ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
insert into t9(a,b) values(1,1);
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
@ -159,3 +199,6 @@ drop table t5;
|
||||
drop table t6;
|
||||
drop table t7;
|
||||
drop table t8;
|
||||
drop table t9;
|
||||
drop table t10;
|
||||
drop table t11;
|
||||
|
@ -9,6 +9,6 @@
|
||||
# Do not use any TAB characters for whitespace.
|
||||
#
|
||||
##############################################################################
|
||||
binlog_truncate_innodb : BUG#42643 2009-02-06 mats Changes to InnoDB requires to complete fix for BUG#36763
|
||||
binlog_unsafe : BUG#50312 2010-01-13 lsoares Warnings for unsafe sub-statement not returned to client
|
||||
|
||||
binlog_truncate_innodb : BUG#42643 2009-02-06 mats Changes to InnoDB requires to complete fix for BUG#36763
|
||||
binlog_unsafe : BUG#50312 2010-01-13 lsoares Warnings for unsafe sub-statement not returned to client
|
||||
binlog_spurious_ddl_errors : BUG#54195 2010-06-03 alik binlog_spurious_ddl_errors.test fails, thus disabled
|
||||
|
Reference in New Issue
Block a user