mirror of
https://github.com/MariaDB/server.git
synced 2025-11-25 17:25:02 +03:00
- Server aborts when table doesn't have referenced index.
This is caused by 5f09b53bdb (MDEV-31086).
While iterating the foreign key constraints, we fail to
consider that InnoDB doesn't have referenced index for
it when foreign key check is disabled.
130 lines
5.0 KiB
Plaintext
130 lines
5.0 KiB
Plaintext
--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 # End of 10.4 tests
|