mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
e572c745dc
ha_innobase::referenced_by_foreign_key(): Protect the check with dict_sys.freeze(), to prevent races with TRUNCATE TABLE. The test innodb.instant_alter_crash has been adjusted for this additional locking. dict_table_is_referenced_by_foreign_key(): Removed (merged to the only caller). create_table_info_t::create_table(): Ignore missing indexes for FOREIGN KEY constraints if foreign_key_checks=0. create_table_info_t::create_table_update_dict(): Rewritten as a static function. Do not return any error. ha_innobase::create(): When trx!=nullptr and we are operating on a persistent table, do not rollback, commit, or release the data dictionary latch. ha_innobase::truncate(): Protect the entire critical section with an exclusive dict_sys.latch, so that ha_innobase::referenced_by_foreign_key() on referenced tables will return a consistent result. In case of a failure, invoke dict_load_foreigns() to restore also any FOREIGN KEY constraints. ha_innobase::free_foreign_key_create_info(): Define inline. lock_release(): Disregard innodb_evict_tables_on_commit_debug=ON when dict_sys.locked() holds. It would hold when fts_load_stopword() is invoked by create_table_info_t::create_table_update_dict(). dict_sys_t::locked(): Return whether the current thread is holding the exclusive dict_sys.latch. dict_sys_t::frozen_not_locked(): Return whether any thread is holding a shared dict_sys.latch. In the test main.mysql_upgrade, the InnoDB persistent statistics will no longer be recalculated in ha_innobase::open() as part of CHECK TABLE ... FOR UPGRADE. They were deleted earlier in the test. Tested by: Matthias Leich
97 lines
2.7 KiB
Text
97 lines
2.7 KiB
Text
set global innodb_file_per_table = 1;
|
|
drop table if exists b;
|
|
drop database if exists bug_fk;
|
|
create database bug_fk;
|
|
use bug_fk;
|
|
CREATE TABLE b (
|
|
b int unsigned NOT NULL,
|
|
d1 datetime NOT NULL,
|
|
PRIMARY KEY (b,d1)
|
|
) ENGINE=InnoDB;
|
|
CREATE TABLE c (
|
|
b int unsigned NOT NULL,
|
|
d1 datetime NOT NULL,
|
|
d2 datetime NOT NULL,
|
|
PRIMARY KEY (b,d1),
|
|
CONSTRAINT b_fk FOREIGN KEY (b) REFERENCES b (b)
|
|
) ENGINE=InnoDB;
|
|
show warnings;
|
|
Level Code Message
|
|
set foreign_key_checks = 0;
|
|
DROP TABLE IF EXISTS b;
|
|
show create table c;
|
|
Table Create Table
|
|
c CREATE TABLE `c` (
|
|
`b` int(10) unsigned NOT NULL,
|
|
`d1` datetime NOT NULL,
|
|
`d2` datetime NOT NULL,
|
|
PRIMARY KEY (`b`,`d1`),
|
|
CONSTRAINT `b_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
CREATE TABLE b (
|
|
b bigint unsigned NOT NULL,
|
|
d1 date NOT NULL,
|
|
PRIMARY KEY (b,d1)
|
|
) ENGINE=InnoDB;
|
|
DROP TABLE b;
|
|
set foreign_key_checks = 1;
|
|
CREATE TABLE b (
|
|
b bigint unsigned NOT NULL,
|
|
d1 date NOT NULL,
|
|
PRIMARY KEY (b,d1)
|
|
) ENGINE=InnoDB;
|
|
ERROR HY000: Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
show warnings;
|
|
Level Code Message
|
|
Error 1005 Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
Warning 1215 Cannot add foreign key constraint for `b`
|
|
set foreign_key_checks = 0;
|
|
DROP TABLE IF EXISTS d;
|
|
Warnings:
|
|
Note 1051 Unknown table 'bug_fk.d'
|
|
CREATE TABLE d (
|
|
b bigint unsigned NOT NULL,
|
|
d1 date NOT NULL,
|
|
PRIMARY KEY (b,d1),
|
|
CONSTRAINT bd_fk FOREIGN KEY (b) REFERENCES b (b)
|
|
) ENGINE=InnoDB;
|
|
show warnings;
|
|
Level Code Message
|
|
set foreign_key_checks = 1;
|
|
show create table c;
|
|
Table Create Table
|
|
c CREATE TABLE `c` (
|
|
`b` int(10) unsigned NOT NULL,
|
|
`d1` datetime NOT NULL,
|
|
`d2` datetime NOT NULL,
|
|
PRIMARY KEY (`b`,`d1`),
|
|
CONSTRAINT `b_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
show create table d;
|
|
Table Create Table
|
|
d CREATE TABLE `d` (
|
|
`b` bigint(20) unsigned NOT NULL,
|
|
`d1` date NOT NULL,
|
|
PRIMARY KEY (`b`,`d1`),
|
|
CONSTRAINT `bd_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
CREATE TABLE b (
|
|
b bigint unsigned NOT NULL,
|
|
d1 date NOT NULL,
|
|
PRIMARY KEY (b,d1)
|
|
) ENGINE=InnoDB;
|
|
ERROR HY000: Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
show warnings;
|
|
Level Code Message
|
|
Error 1005 Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
Warning 1215 Cannot add foreign key constraint for `b`
|
|
set foreign_key_checks=0;
|
|
drop table c;
|
|
drop table d;
|
|
create table b(id int) engine=innodb;
|
|
show warnings;
|
|
Level Code Message
|
|
b.frm
|
|
b.ibd
|
|
drop table if exists b;
|
|
drop database if exists bug_fk;
|