mirror of
https://github.com/MariaDB/server.git
synced 2025-11-15 09:02:33 +03:00
Merge branch '10.1' into 10.2
This commit is contained in:
@@ -51,3 +51,76 @@ c d
|
||||
6 30
|
||||
drop table t2, t1;
|
||||
drop user foo;
|
||||
create table t1 (f1 int primary key) engine=innodb;
|
||||
create table t2 (f2 int primary key) engine=innodb;
|
||||
create table t3 (f3 int primary key, foreign key (f3) references t2(f2)) engine=innodb;
|
||||
insert into t1 values (1),(2),(3),(4),(5);
|
||||
insert into t2 values (1),(2),(3),(4),(5);
|
||||
insert into t3 values (1),(2),(3),(4),(5);
|
||||
connect con1,localhost,root;
|
||||
set debug_sync='alter_table_before_rename_result_table signal g1 wait_for g2';
|
||||
alter table t2 add constraint foreign key (f2) references t1(f1) on delete cascade on update cascade;
|
||||
connection default;
|
||||
set debug_sync='before_execute_sql_command wait_for g1';
|
||||
update t1 set f1 = f1 + 100000 limit 2;
|
||||
connect con2,localhost,root;
|
||||
kill query UPDATE;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
ERROR 70100: Query execution was interrupted
|
||||
set debug_sync='now signal g2';
|
||||
connection con1;
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`f2` int(11) NOT NULL,
|
||||
PRIMARY KEY (`f2`),
|
||||
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
disconnect con1;
|
||||
connection default;
|
||||
select * from t2 where f2 not in (select f1 from t1);
|
||||
f2
|
||||
select * from t3 where f3 not in (select f2 from t2);
|
||||
f3
|
||||
drop table t3;
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
set debug_sync='reset';
|
||||
create table t1 (a int primary key, b int) engine=innodb;
|
||||
create table t2 (c int primary key, d int,
|
||||
foreign key (d) references t1 (a) on update cascade) engine=innodb;
|
||||
insert t1 values (1,1),(2,2),(3,3);
|
||||
insert t2 values (4,1),(5,2),(6,3);
|
||||
flush table t2 with read lock;
|
||||
connect con1,localhost,root;
|
||||
delete from t1 where a=2;
|
||||
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`d`) REFERENCES `t1` (`a`) ON UPDATE CASCADE)
|
||||
update t1 set a=10 where a=1;
|
||||
connection default;
|
||||
unlock tables;
|
||||
connection con1;
|
||||
connection default;
|
||||
lock table t2 write;
|
||||
connection con1;
|
||||
delete from t1 where a=2;
|
||||
connection default;
|
||||
unlock tables;
|
||||
connection con1;
|
||||
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`d`) REFERENCES `t1` (`a`) ON UPDATE CASCADE)
|
||||
connection default;
|
||||
unlock tables;
|
||||
disconnect con1;
|
||||
create user foo;
|
||||
grant select,update on test.t1 to foo;
|
||||
connect foo,localhost,foo;
|
||||
update t1 set a=30 where a=3;
|
||||
disconnect foo;
|
||||
connection default;
|
||||
select * from t2;
|
||||
c d
|
||||
5 2
|
||||
4 10
|
||||
6 30
|
||||
drop table t2, t1;
|
||||
drop user foo;
|
||||
|
||||
@@ -317,3 +317,22 @@ engine=innodb;
|
||||
insert into t1 values(1, 1);
|
||||
insert into t2(f1) values(1);
|
||||
drop table t2, t1;
|
||||
SET FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE staff (
|
||||
staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
store_id TINYINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (staff_id),
|
||||
KEY idx_fk_store_id (store_id),
|
||||
CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE store (
|
||||
store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
manager_staff_id TINYINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (store_id),
|
||||
UNIQUE KEY idx_unique_manager (manager_staff_id),
|
||||
CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
SET FOREIGN_KEY_CHECKS=DEFAULT;
|
||||
LOCK TABLE staff WRITE;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLES staff, store;
|
||||
|
||||
@@ -2,18 +2,15 @@ set global innodb_table_locks=1;
|
||||
select @@innodb_table_locks;
|
||||
@@innodb_table_locks
|
||||
1
|
||||
connect con1,localhost,root,,;
|
||||
connect con2,localhost,root,,;
|
||||
drop table if exists t1;
|
||||
set @@innodb_table_locks=1;
|
||||
connection con1;
|
||||
connect con1,localhost,root,,;
|
||||
create table t1 (id integer, x integer) engine=INNODB;
|
||||
insert into t1 values(0, 0);
|
||||
set autocommit=0;
|
||||
SELECT * from t1 where id = 0 FOR UPDATE;
|
||||
id x
|
||||
0 0
|
||||
connection con2;
|
||||
connect con2,localhost,root,,;
|
||||
set autocommit=0;
|
||||
lock table t1 write;
|
||||
connection con1;
|
||||
@@ -116,13 +113,49 @@ Warnings:
|
||||
Warning 1062 Duplicate entry '3' for key 'PRIMARY'
|
||||
SELECT * FROM t1 FOR UPDATE;
|
||||
connection con2;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
COMMIT;
|
||||
connection con1;
|
||||
a b
|
||||
3 1
|
||||
COMMIT;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-11080 InnoDB: Failing assertion:
|
||||
# table->n_waiting_or_granted_auto_inc_locks > 0
|
||||
#
|
||||
CREATE TABLE t1 (pk INTEGER AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
BEGIN;
|
||||
connection con1;
|
||||
BEGIN;
|
||||
DELETE FROM t2;
|
||||
connection default;
|
||||
LOCK TABLE t2 READ;;
|
||||
connection con1;
|
||||
SET innodb_lock_wait_timeout= 1, lock_wait_timeout= 2;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
COMMIT;
|
||||
connection default;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# MDEV-16709 InnoDB: Error: trx already had an AUTO-INC lock
|
||||
#
|
||||
CREATE TABLE t1 (pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB
|
||||
PARTITION BY key (pk) PARTITIONS 2;
|
||||
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1),(2),(3),(4),(5),(6);
|
||||
CREATE TABLE t3 (b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t3 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
connection con1;
|
||||
INSERT t1 SELECT NULL FROM t2;
|
||||
connection default;
|
||||
INSERT t1 SELECT NULL FROM t3;
|
||||
connection con1;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
|
||||
--enable_connect_log
|
||||
|
||||
--echo #
|
||||
--echo # Bug #19471516 SERVER CRASHES WHEN EXECUTING ALTER TABLE
|
||||
@@ -70,3 +73,87 @@ connection default;
|
||||
select * from t2;
|
||||
drop table t2, t1;
|
||||
drop user foo;
|
||||
|
||||
#
|
||||
# MDEV-16465 Invalid (old?) table or database name or hang in ha_innobase::delete_table and log semaphore wait upon concurrent DDL with foreign keys
|
||||
#
|
||||
create table t1 (f1 int primary key) engine=innodb;
|
||||
create table t2 (f2 int primary key) engine=innodb;
|
||||
create table t3 (f3 int primary key, foreign key (f3) references t2(f2)) engine=innodb;
|
||||
insert into t1 values (1),(2),(3),(4),(5);
|
||||
insert into t2 values (1),(2),(3),(4),(5);
|
||||
insert into t3 values (1),(2),(3),(4),(5);
|
||||
connect con1,localhost,root;
|
||||
set debug_sync='alter_table_before_rename_result_table signal g1 wait_for g2';
|
||||
send alter table t2 add constraint foreign key (f2) references t1(f1) on delete cascade on update cascade;
|
||||
connection default;
|
||||
let $conn=`select connection_id()`;
|
||||
set debug_sync='before_execute_sql_command wait_for g1';
|
||||
send update t1 set f1 = f1 + 100000 limit 2;
|
||||
connect con2,localhost,root;
|
||||
let $wait_condition= select 1 from information_schema.processlist where state='Waiting for table metadata lock' and info like 'update t1 %';
|
||||
source include/wait_condition.inc;
|
||||
--replace_result $conn UPDATE
|
||||
eval kill query $conn;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
error ER_QUERY_INTERRUPTED;
|
||||
reap;
|
||||
set debug_sync='now signal g2';
|
||||
connection con1;
|
||||
reap;
|
||||
show create table t2;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
select * from t2 where f2 not in (select f1 from t1);
|
||||
select * from t3 where f3 not in (select f2 from t2);
|
||||
drop table t3;
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
set debug_sync='reset';
|
||||
|
||||
#
|
||||
# FK and prelocking:
|
||||
# child table accesses (reads and writes) wait for locks.
|
||||
#
|
||||
create table t1 (a int primary key, b int) engine=innodb;
|
||||
create table t2 (c int primary key, d int,
|
||||
foreign key (d) references t1 (a) on update cascade) engine=innodb;
|
||||
insert t1 values (1,1),(2,2),(3,3);
|
||||
insert t2 values (4,1),(5,2),(6,3);
|
||||
flush table t2 with read lock; # this takes MDL_SHARED_NO_WRITE
|
||||
connect (con1,localhost,root);
|
||||
--error ER_ROW_IS_REFERENCED_2
|
||||
delete from t1 where a=2;
|
||||
send update t1 set a=10 where a=1;
|
||||
connection default;
|
||||
let $wait_condition= select 1 from information_schema.processlist where state='Waiting for table metadata lock';
|
||||
source include/wait_condition.inc;
|
||||
unlock tables;
|
||||
connection con1;
|
||||
reap;
|
||||
connection default;
|
||||
lock table t2 write; # this takes MDL_SHARED_NO_READ_WRITE
|
||||
connection con1;
|
||||
send delete from t1 where a=2;
|
||||
connection default;
|
||||
let $wait_condition= select 1 from information_schema.processlist where state='Waiting for table metadata lock';
|
||||
source include/wait_condition.inc;
|
||||
unlock tables;
|
||||
connection con1;
|
||||
--error ER_ROW_IS_REFERENCED_2
|
||||
reap;
|
||||
connection default;
|
||||
unlock tables;
|
||||
disconnect con1;
|
||||
|
||||
# but privileges should not be checked
|
||||
create user foo;
|
||||
grant select,update on test.t1 to foo;
|
||||
connect(foo,localhost,foo);
|
||||
update t1 set a=30 where a=3;
|
||||
disconnect foo;
|
||||
connection default;
|
||||
select * from t2;
|
||||
drop table t2, t1;
|
||||
drop user foo;
|
||||
|
||||
@@ -289,3 +289,27 @@ insert into t2(f1) values(1);
|
||||
drop table t2, t1;
|
||||
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
||||
#
|
||||
# MDEV-12669 Circular foreign keys cause a loop and OOM upon LOCK TABLE
|
||||
#
|
||||
SET FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE staff (
|
||||
staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
store_id TINYINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (staff_id),
|
||||
KEY idx_fk_store_id (store_id),
|
||||
CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE store (
|
||||
store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
manager_staff_id TINYINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (store_id),
|
||||
UNIQUE KEY idx_unique_manager (manager_staff_id),
|
||||
CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB;
|
||||
SET FOREIGN_KEY_CHECKS=DEFAULT;
|
||||
|
||||
LOCK TABLE staff WRITE;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLES staff, store;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_partition.inc
|
||||
|
||||
#
|
||||
# Check and select innodb lock type
|
||||
@@ -12,26 +13,15 @@ select @@innodb_table_locks;
|
||||
# Testing of explicit table locks with enforced table locks
|
||||
#
|
||||
|
||||
connect (con1,localhost,root,,);
|
||||
connect (con2,localhost,root,,);
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Testing of explicit table locks with enforced table locks
|
||||
#
|
||||
|
||||
set @@innodb_table_locks=1;
|
||||
|
||||
connection con1;
|
||||
connect (con1,localhost,root,,);
|
||||
create table t1 (id integer, x integer) engine=INNODB;
|
||||
insert into t1 values(0, 0);
|
||||
set autocommit=0;
|
||||
SELECT * from t1 where id = 0 FOR UPDATE;
|
||||
|
||||
connection con2;
|
||||
connect (con2,localhost,root,,);
|
||||
set autocommit=0;
|
||||
|
||||
# The following statement should hang because con1 is locking the page
|
||||
@@ -166,14 +156,66 @@ let $wait_condition=
|
||||
where state = 'Sending data' and
|
||||
info = 'SELECT * FROM t1 FOR UPDATE';
|
||||
--source include/wait_condition.inc
|
||||
disconnect con2;
|
||||
|
||||
connection default;
|
||||
COMMIT;
|
||||
connection con1;
|
||||
reap;
|
||||
COMMIT;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-11080 InnoDB: Failing assertion:
|
||||
--echo # table->n_waiting_or_granted_auto_inc_locks > 0
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (pk INTEGER AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
|
||||
BEGIN;
|
||||
|
||||
connection con1;
|
||||
BEGIN;
|
||||
DELETE FROM t2;
|
||||
connection default;
|
||||
--send LOCK TABLE t2 READ;
|
||||
connection con1;
|
||||
SET innodb_lock_wait_timeout= 1, lock_wait_timeout= 2;
|
||||
--error 0,ER_LOCK_WAIT_TIMEOUT
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
COMMIT;
|
||||
|
||||
connection default;
|
||||
reap;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-16709 InnoDB: Error: trx already had an AUTO-INC lock
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB
|
||||
PARTITION BY key (pk) PARTITIONS 2;
|
||||
|
||||
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1),(2),(3),(4),(5),(6);
|
||||
|
||||
CREATE TABLE t3 (b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t3 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
|
||||
connection con1;
|
||||
send INSERT t1 SELECT NULL FROM t2;
|
||||
|
||||
connection default;
|
||||
--error 0,ER_DUP_ENTRY,ER_LOCK_DEADLOCK
|
||||
INSERT t1 SELECT NULL FROM t3;
|
||||
|
||||
connection con1;
|
||||
--error 0,ER_DUP_ENTRY,ER_LOCK_DEADLOCK
|
||||
reap;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
Reference in New Issue
Block a user