41 changed files with 721 additions and 339 deletions
-
22mysql-test/include/binlog_inject_error.inc
-
30mysql-test/r/innodb-autoinc-44030.result
-
29mysql-test/r/innodb-autoinc.result
-
108mysql-test/suite/binlog/r/binlog_write_error.result
-
101mysql-test/suite/binlog/t/binlog_write_error.test
-
2mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result
-
6mysql-test/suite/rpl/r/rpl_sp.result
-
1mysql-test/t/disabled.def
-
34mysql-test/t/innodb-autoinc-44030.test
-
26mysql-test/t/innodb-autoinc.test
-
6mysql-test/t/innodb.test
-
9sql/events.cc
-
4sql/log.cc
-
6sql/log_event.cc
-
15sql/log_event_old.cc
-
10sql/mysql_priv.h
-
2sql/repl_failsafe.cc
-
41sql/rpl_injector.cc
-
13sql/sp.cc
-
1sql/sp_head.cc
-
25sql/sql_acl.cc
-
18sql/sql_base.cc
-
2sql/sql_class.h
-
37sql/sql_db.cc
-
12sql/sql_delete.cc
-
51sql/sql_insert.cc
-
32sql/sql_load.cc
-
23sql/sql_parse.cc
-
5sql/sql_partition.cc
-
9sql/sql_rename.cc
-
13sql/sql_repl.cc
-
2sql/sql_show.cc
-
62sql/sql_table.cc
-
4sql/sql_tablespace.cc
-
2sql/sql_trigger.cc
-
16sql/sql_udf.cc
-
7sql/sql_update.cc
-
8sql/sql_view.cc
-
231storage/innobase/handler/ha_innodb.cc
-
3storage/innobase/handler/ha_innodb.h
-
32storage/innobase/row/row0mysql.c
@ -0,0 +1,22 @@ |
|||
# |
|||
# === Name |
|||
# |
|||
# binlog_inject_error.inc |
|||
# |
|||
# === Description |
|||
# |
|||
# Inject binlog write error when running the query, verifies that the |
|||
# query is ended with the proper error (ER_ERROR_ON_WRITE). |
|||
# |
|||
# === Usage |
|||
# |
|||
# let query= 'CREATE TABLE t1 (a INT)'; |
|||
# source include/binlog_inject_error.inc; |
|||
# |
|||
|
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
--echo $query; |
|||
--replace_regex /(errno: .*)/(errno: #)/ |
|||
--error ER_ERROR_ON_WRITE |
|||
--eval $query |
|||
SET GLOBAL debug=''; |
|||
@ -0,0 +1,30 @@ |
|||
drop table if exists t1; |
|||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1; |
|||
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; |
|||
INSERT INTO t1 VALUES (null); |
|||
INSERT INTO t1 VALUES (null); |
|||
ALTER TABLE t1 CHANGE c1 d1 INT NOT NULL AUTO_INCREMENT; |
|||
SELECT * FROM t1; |
|||
d1 |
|||
1 |
|||
2 |
|||
SELECT * FROM t1; |
|||
d1 |
|||
1 |
|||
2 |
|||
INSERT INTO t1 VALUES(null); |
|||
Got one of the listed errors |
|||
ALTER TABLE t1 AUTO_INCREMENT = 3; |
|||
SHOW CREATE TABLE t1; |
|||
Table Create Table |
|||
t1 CREATE TABLE `t1` ( |
|||
`d1` int(11) NOT NULL AUTO_INCREMENT, |
|||
PRIMARY KEY (`d1`) |
|||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
|||
INSERT INTO t1 VALUES(null); |
|||
SELECT * FROM t1; |
|||
d1 |
|||
1 |
|||
2 |
|||
3 |
|||
DROP TABLE t1; |
|||
@ -0,0 +1,108 @@ |
|||
# |
|||
# Initialization |
|||
# |
|||
DROP TABLE IF EXISTS t1, t2; |
|||
DROP FUNCTION IF EXISTS f1; |
|||
DROP FUNCTION IF EXISTS f2; |
|||
DROP PROCEDURE IF EXISTS p1; |
|||
DROP PROCEDURE IF EXISTS p2; |
|||
DROP TRIGGER IF EXISTS tr1; |
|||
DROP TRIGGER IF EXISTS tr2; |
|||
DROP VIEW IF EXISTS v1, v2; |
|||
# |
|||
# Test injecting binlog write error when executing queries |
|||
# |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE TABLE t1 (a INT); |
|||
CREATE TABLE t1 (a INT); |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
INSERT INTO t1 VALUES (1),(2),(3); |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
INSERT INTO t1 VALUES (4),(5),(6); |
|||
INSERT INTO t1 VALUES (4),(5),(6); |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
UPDATE t1 set a=a+1; |
|||
UPDATE t1 set a=a+1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DELETE FROM t1; |
|||
DELETE FROM t1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100); |
|||
CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100); |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP TRIGGER tr1; |
|||
DROP TRIGGER tr1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
ALTER TABLE t1 ADD (b INT); |
|||
ALTER TABLE t1 ADD (b INT); |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE VIEW v1 AS SELECT a FROM t1; |
|||
CREATE VIEW v1 AS SELECT a FROM t1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP VIEW v1; |
|||
DROP VIEW v1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1; |
|||
CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP PROCEDURE p1; |
|||
DROP PROCEDURE p1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP TABLE t1; |
|||
DROP TABLE t1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE FUNCTION f1() RETURNS INT return 1; |
|||
CREATE FUNCTION f1() RETURNS INT return 1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP FUNCTION f1; |
|||
DROP FUNCTION f1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
CREATE USER user1; |
|||
CREATE USER user1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1; |
|||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
SET GLOBAL debug='d,injecting_fault_writing'; |
|||
DROP USER user1; |
|||
DROP USER user1; |
|||
ERROR HY000: Error writing file 'master-bin' ((errno: #) |
|||
SET GLOBAL debug=''; |
|||
# |
|||
# Cleanup |
|||
# |
|||
DROP TABLE IF EXISTS t1, t2; |
|||
DROP FUNCTION IF EXISTS f1; |
|||
DROP PROCEDURE IF EXISTS p1; |
|||
DROP TRIGGER IF EXISTS tr1; |
|||
DROP VIEW IF EXISTS v1, v2; |
|||
@ -0,0 +1,101 @@ |
|||
# |
|||
# === Name === |
|||
# |
|||
# binlog_write_error.test |
|||
# |
|||
# === Description === |
|||
# |
|||
# This test case check if the error of writing binlog file is properly |
|||
# reported and handled when executing statements. |
|||
# |
|||
# === Related Bugs === |
|||
# |
|||
# BUG#37148 |
|||
# |
|||
|
|||
source include/have_log_bin.inc; |
|||
source include/have_debug.inc; |
|||
|
|||
--echo # |
|||
--echo # Initialization |
|||
--echo # |
|||
|
|||
disable_warnings; |
|||
DROP TABLE IF EXISTS t1, t2; |
|||
DROP FUNCTION IF EXISTS f1; |
|||
DROP FUNCTION IF EXISTS f2; |
|||
DROP PROCEDURE IF EXISTS p1; |
|||
DROP PROCEDURE IF EXISTS p2; |
|||
DROP TRIGGER IF EXISTS tr1; |
|||
DROP TRIGGER IF EXISTS tr2; |
|||
DROP VIEW IF EXISTS v1, v2; |
|||
enable_warnings; |
|||
|
|||
--echo # |
|||
--echo # Test injecting binlog write error when executing queries |
|||
--echo # |
|||
|
|||
let $query= CREATE TABLE t1 (a INT); |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
INSERT INTO t1 VALUES (1),(2),(3); |
|||
|
|||
let $query= INSERT INTO t1 VALUES (4),(5),(6); |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= UPDATE t1 set a=a+1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DELETE FROM t1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100); |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP TRIGGER tr1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= ALTER TABLE t1 ADD (b INT); |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= CREATE VIEW v1 AS SELECT a FROM t1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP VIEW v1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP PROCEDURE p1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP TABLE t1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= CREATE FUNCTION f1() RETURNS INT return 1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP FUNCTION f1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= CREATE USER user1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
let $query= DROP USER user1; |
|||
source include/binlog_inject_error.inc; |
|||
|
|||
--echo # |
|||
--echo # Cleanup |
|||
--echo # |
|||
|
|||
disable_warnings; |
|||
DROP TABLE IF EXISTS t1, t2; |
|||
DROP FUNCTION IF EXISTS f1; |
|||
DROP PROCEDURE IF EXISTS p1; |
|||
DROP TRIGGER IF EXISTS tr1; |
|||
DROP VIEW IF EXISTS v1, v2; |
|||
enable_warnings; |
|||
@ -0,0 +1,34 @@ |
|||
-- source include/have_innodb.inc |
|||
# embedded server ignores 'delayed', so skip this |
|||
-- source include/not_embedded.inc |
|||
|
|||
--disable_warnings |
|||
drop table if exists t1; |
|||
--enable_warnings |
|||
|
|||
# |
|||
# 44030: Error: (1500) Couldn't read the MAX(ID) autoinc value from |
|||
# the index (PRIMARY) |
|||
# This test requires a restart of the server |
|||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1; |
|||
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; |
|||
INSERT INTO t1 VALUES (null); |
|||
INSERT INTO t1 VALUES (null); |
|||
ALTER TABLE t1 CHANGE c1 d1 INT NOT NULL AUTO_INCREMENT; |
|||
SELECT * FROM t1; |
|||
# Restart the server |
|||
-- source include/restart_mysqld.inc |
|||
# The MySQL and InnoDB data dictionaries should now be out of sync. |
|||
# The select should print message to the error log |
|||
SELECT * FROM t1; |
|||
# MySQL have made a change (http://lists.mysql.com/commits/75268) that no |
|||
# longer results in the two data dictionaries being out of sync. If they |
|||
# revert their changes then this check for ER_AUTOINC_READ_FAILED will need |
|||
# to be enabled. Also, see http://bugs.mysql.com/bug.php?id=47621. |
|||
-- error ER_AUTOINC_READ_FAILED,1467 |
|||
INSERT INTO t1 VALUES(null); |
|||
ALTER TABLE t1 AUTO_INCREMENT = 3; |
|||
SHOW CREATE TABLE t1; |
|||
INSERT INTO t1 VALUES(null); |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue