mirror of
https://github.com/MariaDB/server.git
synced 2025-04-08 00:05:34 +02:00

Problem:
=======
- InnoDB fails to find the foreign key index for the newly
added foreign key relation. This is caused by commit
5f09b53bdb
(MDEV-31086).
FIX:
===
In check_col_is_in_fk_indexes(), while iterating through
the newly added foreign key relationship, InnoDB should
consider that foreign key relation may not have foreign index
when foreign key check is disabled.
170 lines
6.5 KiB
Text
170 lines
6.5 KiB
Text
--source include/have_innodb.inc
|
|
--echo #
|
|
--echo # MDEV-31086 MODIFY COLUMN can break FK constraints, and
|
|
--echo # lead to unrestorable dumps
|
|
--echo #
|
|
CREATE TABLE t1(
|
|
id SERIAL,
|
|
msg VARCHAR(100) CHARACTER SET utf8mb3,
|
|
KEY(msg))ENGINE=InnoDB;
|
|
|
|
--error ER_CANT_CREATE_TABLE
|
|
CREATE TABLE t2(
|
|
id SERIAL,
|
|
msg varchar(100) CHARACTER SET utf8mb4,
|
|
CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg))ENGINE=InnoDB;
|
|
|
|
CREATE TABLE t2(
|
|
id SERIAL,
|
|
msg varchar(100) CHARACTER SET utf8mb3,
|
|
msg_1 varchar(100) CHARACTER SET utf8mb3,
|
|
INDEX (msg_1),
|
|
INDEX (msg),
|
|
CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg)
|
|
ON DELETE CASCADE)ENGINE=InnoDB;
|
|
|
|
# Changing column used in FK constraint
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=INPLACE;
|
|
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(400) character set utf8mb3, ALGORITHM=INPLACE;
|
|
|
|
# Changing column charset used in FK constraint
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY;
|
|
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE;
|
|
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=COPY;
|
|
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=INPLACE;
|
|
|
|
# Modify the column in the newly added foreign constraint
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
--error ER_CANT_CREATE_TABLE
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY;
|
|
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE;
|
|
|
|
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
--error ER_CANT_CREATE_TABLE
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY;
|
|
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE;
|
|
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(200) CHARACTER SET utf8mb3, ALGORITHM=INPLACE;
|
|
|
|
# Change referenced table column
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
# Change referenced column length
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=INPLACE;
|
|
# Change referenced column character set
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY;
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE;
|
|
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
# Change referenced column length
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY;
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(400) CHARSET utf8mb3, ALGORITHM=INPLACE;
|
|
|
|
# Change referenced column character set
|
|
--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY;
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE;
|
|
|
|
# Correct way to change character set in foreign key constraint
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
ALTER TABLE t2 DROP FOREIGN KEY fk_t1, MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY;
|
|
ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY;
|
|
ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (msg) REFERENCES t1(msg), aLGORITHM=INPLACE;
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
|
|
DROP TABLE t2, t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-31869 Server aborts when table does drop column
|
|
--echo #
|
|
CREATE TABLE t (a VARCHAR(40), b INT, C INT) ENGINE=InnoDB;
|
|
ALTER TABLE t MODIFY a VARCHAR(50), DROP b;
|
|
DROP TABLE t;
|
|
|
|
--echo #
|
|
--echo # MDEV-32060 Server aborts when table doesn't
|
|
--echo # have referenced index
|
|
--echo #
|
|
SET SESSION FOREIGN_KEY_CHECKS = OFF;
|
|
CREATE TABLE t1 (a VARCHAR(16) KEY, FOREIGN KEY(a) REFERENCES t2(b)) ENGINE=InnoDB;
|
|
# Following SQL is allowed in 10.6
|
|
--error ER_CANT_CREATE_TABLE
|
|
CREATE TABLE t2 (b VARCHAR(8)) ENGINE=InnoDB;
|
|
SET SESSION FOREIGN_KEY_CHECKS = ON;
|
|
--error ER_NO_SUCH_TABLE
|
|
ALTER TABLE t2 MODIFY b VARCHAR(16), ADD KEY(b);
|
|
--error ER_BAD_TABLE_ERROR
|
|
DROP TABLE t2, t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-32337 Assertion `pos < table->n_def' failed
|
|
--echo # in dict_table_get_nth_col
|
|
--echo #
|
|
CREATE TABLE t (a INT, va INT AS (a), b INT, vb INT AS (b),
|
|
c INT, vc INT AS (c), vf VARCHAR(16) AS (f),
|
|
f VARCHAR(4)) ENGINE=InnoDB;
|
|
ALTER TABLE t MODIFY f VARCHAR(8);
|
|
# Altering the virtual column is not supported
|
|
--error ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
|
|
ALTER TABLE t MODIFY vf VARCHAR(18);
|
|
DROP TABLE t;
|
|
|
|
--echo #
|
|
--echo # MDEV-32527 Server aborts during alter operation
|
|
--echo # when table doesn't have foreign index
|
|
--echo #
|
|
CREATE TABLE t1 (f1 INT NOT NULL, INDEX(f1)) ENGINE=InnoDB;
|
|
CREATE TABLE t2(f1 INT NOT NULL, f2 VARCHAR(100) DEFAULT NULL,
|
|
INDEX idx(f1, f2),
|
|
FOREIGN KEY(f1) REFERENCES t1(f1))ENGINE=INNODB;
|
|
SET SESSION FOREIGN_KEY_CHECKS = OFF;
|
|
ALTER TABLE t2 DROP INDEX idx;
|
|
ALTER TABLE t2 MODIFY f2 VARCHAR(1023);
|
|
SET SESSION FOREIGN_KEY_CHECKS = ON;
|
|
DROP TABLE t2, t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-32638 MariaDB crashes with foreign_key_checks=0
|
|
--echo # when changing a column and adding a foreign
|
|
--echo # key at the same time
|
|
--echo #
|
|
CREATE TABLE t1(f1 VARCHAR(2) NOT NULL, PRIMARY KEY(f1))ENGINE=InnoDB;
|
|
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,
|
|
f2 VARCHAR(10) NOT NULL DEFAULT '')ENGINE=InnoDB;
|
|
SET SESSION FOREIGN_KEY_CHECKS = OFF;
|
|
ALTER TABLE t2 CHANGE COLUMN f2 f3 VARCHAR(20) NOT NULL,
|
|
ADD CONSTRAINT t2_fk FOREIGN KEY(f3) REFERENCES t1(f1);
|
|
DROP TABLE t2, t1;
|
|
SET SESSION FOREIGN_KEY_CHECKS = ON;
|
|
--echo # End of 10.4 tests
|