mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 22:34:18 +01:00
137f1e1ed6
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.
335 lines
8.4 KiB
Text
335 lines
8.4 KiB
Text
# t/innodb_mysql.test
|
|
#
|
|
# Last update:
|
|
# 2006-07-26 ML test refactored (MySQL 5.1)
|
|
# main testing code t/innodb_mysql.test -> include/mix1.inc
|
|
#
|
|
|
|
-- source include/have_innodb.inc
|
|
let $engine_type= InnoDB;
|
|
let $other_engine_type= MEMORY;
|
|
# InnoDB does support FOREIGN KEYFOREIGN KEYs
|
|
let $test_foreign_keys= 1;
|
|
set global innodb_support_xa=default;
|
|
set session innodb_support_xa=default;
|
|
--source include/mix1.inc
|
|
|
|
--disable_warnings
|
|
drop table if exists t1, t2, t3;
|
|
--enable_warnings
|
|
#
|
|
# BUG#35850: Performance regression in 5.1.23/5.1.24
|
|
#
|
|
create table t1(a int);
|
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
create table t2 (a int, b int, pk int, key(a,b), primary key(pk)) engine=innodb;
|
|
insert into t2 select @a:=A.a+10*(B.a + 10*C.a),@a, @a from t1 A, t1 B, t1 C;
|
|
--echo this must use key 'a', not PRIMARY:
|
|
--replace_column 9 #
|
|
explain select a from t2 where a=b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# Bug #40360: Binlog related errors with binlog off
|
|
#
|
|
# This bug is triggered when the binlog format is STATEMENT and the
|
|
# binary log is turned off. In this case, no error should be shown for
|
|
# the statement since there are no replication issues.
|
|
|
|
SET SESSION BINLOG_FORMAT=STATEMENT;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
query_vertical select @@session.sql_log_bin, @@session.binlog_format, @@session.tx_isolation;
|
|
CREATE TABLE t1 ( a INT ) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(1);
|
|
DROP TABLE t1;
|
|
|
|
#
|
|
# Bug#37284 Crash in Field_string::type()
|
|
#
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
CREATE TABLE t1 (a char(50)) ENGINE=InnoDB;
|
|
CREATE INDEX i1 on t1 (a(3));
|
|
SELECT * FROM t1 WHERE a = 'abcde';
|
|
DROP TABLE t1;
|
|
|
|
#
|
|
# Bug #37742: HA_EXTRA_KEYREAD flag is set when key contains only prefix of
|
|
# requested column
|
|
#
|
|
|
|
CREATE TABLE foo (a int, b int, c char(10),
|
|
PRIMARY KEY (c(3)),
|
|
KEY b (b)
|
|
) engine=innodb;
|
|
|
|
CREATE TABLE foo2 (a int, b int, c char(10),
|
|
PRIMARY KEY (c),
|
|
KEY b (b)
|
|
) engine=innodb;
|
|
|
|
CREATE TABLE bar (a int, b int, c char(10),
|
|
PRIMARY KEY (c(3)),
|
|
KEY b (b)
|
|
) engine=myisam;
|
|
|
|
INSERT INTO foo VALUES
|
|
(1,2,'abcdefghij'), (2,3,''), (3,4,'klmnopqrst'),
|
|
(4,5,'uvwxyz'), (5,6,'meotnsyglt'), (4,5,'asfdewe');
|
|
|
|
INSERT INTO bar SELECT * FROM foo;
|
|
INSERT INTO foo2 SELECT * FROM foo;
|
|
|
|
--query_vertical EXPLAIN SELECT c FROM bar WHERE b>2;
|
|
--query_vertical EXPLAIN SELECT c FROM foo WHERE b>2;
|
|
--query_vertical EXPLAIN SELECT c FROM foo2 WHERE b>2;
|
|
|
|
--query_vertical EXPLAIN SELECT c FROM bar WHERE c>2;
|
|
--query_vertical EXPLAIN SELECT c FROM foo WHERE c>2;
|
|
--query_vertical EXPLAIN SELECT c FROM foo2 WHERE c>2;
|
|
|
|
DROP TABLE foo, bar, foo2;
|
|
|
|
|
|
#
|
|
# Bug#41348: INSERT INTO tbl SELECT * FROM temp_tbl overwrites locking type of temp table
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1,t3,t2;
|
|
DROP FUNCTION IF EXISTS f1;
|
|
--enable_warnings
|
|
|
|
DELIMITER |;
|
|
CREATE FUNCTION f1() RETURNS VARCHAR(250)
|
|
BEGIN
|
|
return 'hhhhhhh' ;
|
|
END|
|
|
DELIMITER ;|
|
|
|
|
CREATE TABLE t1 (a VARCHAR(20), b VARCHAR(20), c VARCHAR(20)) ENGINE=INNODB;
|
|
|
|
BEGIN WORK;
|
|
|
|
CREATE TEMPORARY TABLE t2 (a VARCHAR(20), b VARCHAR(20), c varchar(20)) ENGINE=INNODB;
|
|
CREATE TEMPORARY TABLE t3 LIKE t2;
|
|
|
|
INSERT INTO t1 VALUES ('a','b',NULL),('c','d',NULL),('e','f',NULL);
|
|
|
|
SET @stmt := CONCAT('INSERT INTO t2 SELECT tbl.a, tbl.b, f1()',' FROM t1 tbl');
|
|
PREPARE stmt1 FROM @stmt;
|
|
|
|
SET @stmt := CONCAT('INSERT INTO t3', ' SELECT * FROM t2');
|
|
PREPARE stmt3 FROM @stmt;
|
|
|
|
EXECUTE stmt1;
|
|
|
|
COMMIT;
|
|
|
|
DEALLOCATE PREPARE stmt1;
|
|
DEALLOCATE PREPARE stmt3;
|
|
|
|
DROP TABLE t1,t3,t2;
|
|
DROP FUNCTION f1;
|
|
|
|
#
|
|
# Bug#37016: TRUNCATE TABLE removes some rows but not all
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1,t2;
|
|
--enable_warnings
|
|
|
|
CREATE TABLE t1 (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
|
|
CREATE TABLE t2 (id INT PRIMARY KEY,
|
|
t1_id INT, INDEX par_ind (t1_id),
|
|
FOREIGN KEY (t1_id) REFERENCES t1(id)) ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
INSERT INTO t2 VALUES (3,2);
|
|
|
|
SET AUTOCOMMIT = 0;
|
|
|
|
START TRANSACTION;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
TRUNCATE TABLE t1;
|
|
SELECT * FROM t1;
|
|
COMMIT;
|
|
SELECT * FROM t1;
|
|
|
|
START TRANSACTION;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
TRUNCATE TABLE t1;
|
|
SELECT * FROM t1;
|
|
ROLLBACK;
|
|
SELECT * FROM t1;
|
|
|
|
SET AUTOCOMMIT = 1;
|
|
|
|
START TRANSACTION;
|
|
SELECT * FROM t1;
|
|
COMMIT;
|
|
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
TRUNCATE TABLE t1;
|
|
SELECT * FROM t1;
|
|
DELETE FROM t2 WHERE id = 3;
|
|
|
|
START TRANSACTION;
|
|
SELECT * FROM t1;
|
|
TRUNCATE TABLE t1;
|
|
ROLLBACK;
|
|
SELECT * FROM t1;
|
|
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);
|
|
|
|
delimiter ||;
|
|
CREATE TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW
|
|
BEGIN
|
|
SET @b:= CONCAT('EXECUTED TRIGGER FOR ROW ',CAST(OLD.i AS CHAR));
|
|
INSERT INTO t2 VALUES (@b);
|
|
END||
|
|
delimiter ;||
|
|
|
|
--echo ** DELETE is prevented by foreign key constrains but errors are silenced.
|
|
--echo ** The AFTER trigger isn't fired.
|
|
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 ** The AFTER trigger was only executed on successful rows:
|
|
SELECT * FROM t2;
|
|
|
|
DROP TRIGGER trg;
|
|
|
|
--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
|