mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
Merge following commit from 5.5:
commit ef92aaf9ec
Author: Jan Lindström <jan.lindstrom@mariadb.com>
Date: Wed Jun 22 22:37:28 2016 +0300
MDEV-10083: Orphan ibd file when playing with foreign keys
Analysis: row_drop_table_for_mysql did not allow dropping
referenced table even in case when actual creating of the
referenced table was not successfull if foreign_key_checks=1.
Fix: Allow dropping referenced table even if foreign_key_checks=1
if actual table create returned error.
This commit is contained in:
89
mysql-test/suite/innodb/r/innodb-fkcheck.result
Normal file
89
mysql-test/suite/innodb/r/innodb-fkcheck.result
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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;
|
115
mysql-test/suite/innodb/t/innodb-fkcheck.test
Normal file
115
mysql-test/suite/innodb/t/innodb-fkcheck.test
Normal file
@@ -0,0 +1,115 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# MDEV-10083: Orphan ibd file when playing with foreign keys
|
||||
#
|
||||
--disable_query_log
|
||||
SET @start_global_fpt = @@global.innodb_file_per_table;
|
||||
SET @start_global_fkc = @@global.foreign_key_checks;
|
||||
--enable_query_log
|
||||
|
||||
set global innodb_file_per_table = 1;
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
||||
--enable_warnings
|
||||
|
||||
let $MYSQLD_DATADIR = `select @@datadir`;
|
||||
|
||||
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;
|
||||
|
||||
set foreign_key_checks = 0;
|
||||
|
||||
DROP TABLE IF EXISTS b;
|
||||
|
||||
show create table c;
|
||||
|
||||
#
|
||||
# Note that column b has different type in parent table
|
||||
#
|
||||
--error 1005
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
DROP TABLE IF EXISTS 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;
|
||||
|
||||
set foreign_key_checks = 1;
|
||||
|
||||
show create table c;
|
||||
show create table d;
|
||||
|
||||
#
|
||||
# Table c column b used on foreign key has different type
|
||||
# compared referenced column b in table b, but this
|
||||
# create still produced b.ibd file. This is because
|
||||
# we row_drop_table_for_mysql was called and referenced
|
||||
# table is not allowed to be dropped even in case
|
||||
# when actual create is not successfull.
|
||||
#
|
||||
--error 1005
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
set foreign_key_checks=0;
|
||||
|
||||
drop table c;
|
||||
drop table d;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
create table b(id int) engine=innodb;
|
||||
show warnings;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
--disable_query_log
|
||||
SET @@global.innodb_file_per_table = @start_global_fpt;
|
||||
SET @@global.foreign_key_checks = @start_global_fkc;
|
||||
--enable_query_log
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
||||
--enable_warnings
|
Reference in New Issue
Block a user