From: Date: March 27 2009 4:32pm Subject: bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:2842) Bug#40127 List-Archive: http://lists.mysql.com/commits/70726 X-Bug: 40127 Message-Id: <0KH6006YH8F8VKA0@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_/6RvqrykqkGSPiNHqQTHoA)" --Boundary_(ID_/6RvqrykqkGSPiNHqQTHoA) MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/thek/Development/cpp/mysqlbzr/51-bug40127/ based on revid:gni@stripped 2842 Kristofer Pettersson 2009-03-27 Bug#40127 Multiple table DELETE IGNORE hangs on foreign key constraint violation on 5.0 The server crashes on an assert in net_end_statement indicating that the Diagnostics area wasn't set properly during execution. This happened on a multi table DELETE operation using the IGNORE keyword. The keyword is suppose to allow for execution to continue on a best effort despite some non-fatal errors. Instead execution stopped and no client response was sent which would have led to a protocol error if it hadn't been for the assert. This patch corrects this issue by checking for the existence of an IGNORE option before setting an error state during row-by-row delete iteration. @ mysql-test/r/innodb_mysql.result * Added test case for bug40127 @ mysql-test/t/innodb_mysql.test * Added test case for bug40127 @ sql/sql_delete.cc * IGNORE option wasn't implemented in multi_delete::send_data and multi_delete::do_deletes modified: mysql-test/r/innodb_mysql.result mysql-test/t/innodb_mysql.test sql/sql_delete.cc === modified file 'mysql-test/r/innodb_mysql.result' --- a/mysql-test/r/innodb_mysql.result 2009-02-20 09:50:50 +0000 +++ b/mysql-test/r/innodb_mysql.result 2009-03-27 15:32:41 +0000 @@ -1846,4 +1846,137 @@ id TRUNCATE TABLE t2; DROP TABLE t2; DROP TABLE t1; +# +# Bug#40127 Multiple table DELETE IGNORE hangs on foreign key constraint violation on 5.0 +# +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) ENGINE=InnoDB; +CREATE TABLE t2 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +aid INT UNSIGNED NOT NULL, +PRIMARY KEY (id), +FOREIGN KEY (aid) REFERENCES t1 (id) +) ENGINE=InnoDB; +CREATE TABLE t3 ( +bid INT UNSIGNED NOT NULL, +FOREIGN KEY (bid) REFERENCES t2 (id) +) ENGINE=InnoDB; +CREATE TABLE t4 ( +a INT +) ENGINE=InnoDB; +CREATE TABLE t5 ( +a INT +) ENGINE=InnoDB; +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id, aid) VALUES (1, 1),(2,1),(3,1),(4,1); +INSERT INTO t3 (bid) VALUES (1); +INSERT INTO t4 VALUES (1),(2),(3),(4),(5); +INSERT INTO t5 VALUES (1); +DELETE t5 FROM t4 LEFT JOIN t5 ON t4.a= t5.a; +DELETE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t3`, CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`bid`) REFERENCES `t2` (`id`)) +DELETE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t3`, CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`bid`) REFERENCES `t2` (`id`)) +DELETE IGNORE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; +DROP TABLES t4,t5; +# Bug#40127 Multiple table DELETE IGNORE hangs on foreign key constraint violation on 5.0 +# Testing for any side effects of IGNORE on AFTER DELETE triggers used with +# transactional tables. +# +CREATE TABLE t1 (i INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (a VARCHAR(100)) ENGINE=InnoDB; +CREATE TABLE t3 (i INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t4 (i INT NOT NULL PRIMARY KEY, t1i INT, +FOREIGN KEY (t1i) REFERENCES t1(i)) +ENGINE=InnoDB; +CREATE TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW +BEGIN +SET @b:='EXECUTED TRIGGER'; +INSERT INTO t2 VALUES (@b); +SET @a:= error_happens_here; +END|| +SET @b:=""; +SET @a:=""; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 SELECT * FROM t1; +** An error in a trigger causes rollback of the statement. +DELETE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +ERROR 42S22: Unknown column 'error_happens_here' in 'field list' +SELECT @a,@b; +@a @b + EXECUTED TRIGGER +SELECT * FROM t2; +a +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; +i i +1 1 +2 2 +3 3 +4 4 +** Same happens with the IGNORE option +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +ERROR 42S22: Unknown column 'error_happens_here' in 'field list' +SELECT * FROM t2; +a +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; +i i +1 1 +2 2 +3 3 +4 4 +** +** The following is an attempt to demonstrate +** error handling inside a row iteration. +** +DROP TRIGGER trg; +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 VALUES (1),(2),(3),(4); +INSERT INTO t4 VALUES (3,3),(4,4); +** DELETE is prevented by foreign key constrains but errors are silenced. +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +** Tables are modified by best effort: +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; +i i +3 3 +4 4 +** +** Induce an error midway through an AFTER-trigger +** +TRUNCATE TABLE t4; +TRUNCATE TABLE t1; +TRUNCATE TABLE t3; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 VALUES (1),(2),(3),(4); +CREATE TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW +BEGIN +SET @a:= @a+1; +IF @a > 2 THEN +INSERT INTO t4 VALUES (5,5); +END IF; +END|| +SET @a:=0; +** Errors in the trigger causes the statement to abort. +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t4`, CONSTRAINT `t4_ibfk_1` FOREIGN KEY (`t1i`) REFERENCES `t1` (`i`)) +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; +i i +1 1 +2 2 +3 3 +4 4 +SELECT * FROM t4; +i t1i +DROP TRIGGER trg; +DROP TABLE t4; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; End of 5.1 tests === modified file 'mysql-test/t/innodb_mysql.test' --- a/mysql-test/t/innodb_mysql.test 2009-02-20 09:50:50 +0000 +++ b/mysql-test/t/innodb_mysql.test 2009-03-27 15:32:41 +0000 @@ -185,4 +185,137 @@ TRUNCATE TABLE t2; DROP TABLE t2; DROP TABLE t1; +--echo # +--echo # Bug#40127 Multiple table DELETE IGNORE hangs on foreign key constraint violation on 5.0 +--echo # +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + PRIMARY KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE t2 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + aid INT UNSIGNED NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (aid) REFERENCES t1 (id) +) ENGINE=InnoDB; + +CREATE TABLE t3 ( + bid INT UNSIGNED NOT NULL, + FOREIGN KEY (bid) REFERENCES t2 (id) +) ENGINE=InnoDB; + +CREATE TABLE t4 ( + a INT +) ENGINE=InnoDB; + +CREATE TABLE t5 ( + a INT +) ENGINE=InnoDB; + +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t2 (id, aid) VALUES (1, 1),(2,1),(3,1),(4,1); +INSERT INTO t3 (bid) VALUES (1); + +INSERT INTO t4 VALUES (1),(2),(3),(4),(5); +INSERT INTO t5 VALUES (1); + +DELETE t5 FROM t4 LEFT JOIN t5 ON t4.a= t5.a; + +--error ER_ROW_IS_REFERENCED_2 +DELETE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; +--error ER_ROW_IS_REFERENCED_2 +DELETE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; + +DELETE IGNORE t2, t1 FROM t2 INNER JOIN t1 ON (t2.aid = t1.id) WHERE t2.id = 1; + +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; +DROP TABLES t4,t5; + +--echo # Bug#40127 Multiple table DELETE IGNORE hangs on foreign key constraint violation on 5.0 +--echo # Testing for any side effects of IGNORE on AFTER DELETE triggers used with +--echo # transactional tables. +--echo # +CREATE TABLE t1 (i INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (a VARCHAR(100)) ENGINE=InnoDB; +CREATE TABLE t3 (i INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t4 (i INT NOT NULL PRIMARY KEY, t1i INT, + FOREIGN KEY (t1i) REFERENCES t1(i)) + ENGINE=InnoDB; +delimiter ||; +CREATE TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW +BEGIN + SET @b:='EXECUTED TRIGGER'; + INSERT INTO t2 VALUES (@b); + SET @a:= error_happens_here; +END|| +delimiter ;|| + +SET @b:=""; +SET @a:=""; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 SELECT * FROM t1; +--echo ** An error in a trigger causes rollback of the statement. +--error ER_BAD_FIELD_ERROR +DELETE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +SELECT @a,@b; +SELECT * FROM t2; +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; + +--echo ** Same happens with the IGNORE option +--error ER_BAD_FIELD_ERROR +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +SELECT * FROM t2; +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; + +--echo ** +--echo ** The following is an attempt to demonstrate +--echo ** error handling inside a row iteration. +--echo ** +DROP TRIGGER trg; +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +TRUNCATE TABLE t3; + +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 VALUES (1),(2),(3),(4); +INSERT INTO t4 VALUES (3,3),(4,4); + +--echo ** DELETE is prevented by foreign key constrains but errors are silenced. +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +--echo ** Tables are modified by best effort: +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; + +--echo ** +--echo ** Induce an error midway through an AFTER-trigger +--echo ** +TRUNCATE TABLE t4; +TRUNCATE TABLE t1; +TRUNCATE TABLE t3; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t3 VALUES (1),(2),(3),(4); +delimiter ||; +CREATE TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW +BEGIN + SET @a:= @a+1; + IF @a > 2 THEN + INSERT INTO t4 VALUES (5,5); + END IF; +END|| +delimiter ;|| + +SET @a:=0; +--echo ** Errors in the trigger causes the statement to abort. +--error ER_NO_REFERENCED_ROW_2 +DELETE IGNORE t1 FROM t3 LEFT JOIN t1 ON t1.i=t3.i; +SELECT * FROM t1 LEFT JOIN t3 ON t1.i=t3.i; +SELECT * FROM t4; +DROP TRIGGER trg; +DROP TABLE t4; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; + --echo End of 5.1 tests === modified file 'sql/sql_delete.cc' --- a/sql/sql_delete.cc 2009-02-09 22:51:59 +0000 +++ b/sql/sql_delete.cc 2009-03-27 15:32:41 +0000 @@ -709,6 +709,8 @@ bool multi_delete::send_data(List TABLE_LIST *del_table; DBUG_ENTER("multi_delete::send_data"); + bool ignore= thd->lex->current_select->no_error; + for (del_table= delete_tables; del_table; del_table= del_table->next_local, secure_counter++) @@ -741,8 +743,12 @@ bool multi_delete::send_data(List TRG_ACTION_AFTER, FALSE)) DBUG_RETURN(1); } - else + else if (!ignore) { + /* + If the IGNORE option is used errors caused by ha_delete_row don't + have to stop the iteration. + */ table->file->print_error(error,MYF(0)); DBUG_RETURN(1); } @@ -834,6 +840,11 @@ int multi_delete::do_deletes() { int local_error= 0, counter= 0, tmp_error; bool will_batch; + /* + If the IGNORE option is used all non fatal errors will be translated + to warnings and we should not break the row-by-row iteration + */ + bool ignore= thd->lex->current_select->no_error; DBUG_ENTER("do_deletes"); DBUG_ASSERT(do_delete); @@ -872,18 +883,29 @@ int multi_delete::do_deletes() local_error= 1; break; } - if ((local_error=table->file->ha_delete_row(table->record[0]))) + + local_error= table->file->ha_delete_row(table->record[0]); + if (local_error && !ignore) { - table->file->print_error(local_error,MYF(0)); - break; + table->file->print_error(local_error,MYF(0)); + break; } - deleted++; - if (table->triggers && - table->triggers->process_triggers(thd, TRG_EVENT_DELETE, - TRG_ACTION_AFTER, FALSE)) + + /* + Increase the reported number of deleted rows only if no error occurred + during ha_delete_row. + Also, don't execute the AFTER trigger if the row operation failed. + */ + if (!local_error) { - local_error= 1; - break; + deleted++; + if (table->triggers && + table->triggers->process_triggers(thd, TRG_EVENT_DELETE, + TRG_ACTION_AFTER, FALSE)) + { + local_error= 1; + break; + } } } if (will_batch && (tmp_error= table->file->end_bulk_delete())) --Boundary_(ID_/6RvqrykqkGSPiNHqQTHoA) MIME-version: 1.0 Content-type: text/bzr-bundle; name="bzr/kristofer.pettersson@stripped"; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/kristofer.pettersson@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kristofer.pettersson@stripped\ # 59xqs9ca1prbmmpx # target_branch: file:///home/thek/Development/cpp/mysqlbzr/51-\ # bug40127/ # testament_sha1: 77ab2be77a53f48c827fe0031aec2487f4e11651 # timestamp: 2009-03-27 16:32:54 +0100 # base_revision_id: gni@stripped # # Begin bundle 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 --Boundary_(ID_/6RvqrykqkGSPiNHqQTHoA)--