Commit 6831b3f2 authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-26824 Can't add foreign key with empty referenced columns list

create_table_info_t::create_foreign_keys() expects equal number of
iterations through fk->columns and fk->ref_columns. If fk->ref_columns
is empty copy it from fk->columns.
parent 017d1b86
......@@ -896,4 +896,27 @@ create or replace table t1 (a varchar(4096) unique) engine=innodb;
create or replace table t2 (pk int primary key, a varchar(4096) unique, foreign key(a) references t1(a) on update cascade) engine=innodb;
ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
drop table t1;
#
# MDEV-26824 Can't add foreign key with empty referenced columns list
#
create table t2(a int primary key) engine=innodb;
create table t1(a int primary key, b int) engine=innodb;
alter table t2 add foreign key(a) references t1(a, b);
ERROR 42000: Incorrect foreign key definition for 'foreign key without name': Key reference and table reference don't match
create or replace table t1(a tinyint primary key) engine innodb;
alter table t2 add foreign key(a) references t1;
ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
create or replace table t1(b int primary key) engine innodb;
alter table t2 add foreign key(a) references t1;
ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
create or replace table t1(a int primary key, b int) engine innodb;
alter table t2 add foreign key(a) references t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
drop tables t2, t1;
# End of 10.5 tests
......@@ -902,6 +902,24 @@ create or replace table t2 (pk int primary key, a varchar(4096) unique, foreign
drop table t1;
--echo #
--echo # MDEV-26824 Can't add foreign key with empty referenced columns list
--echo #
create table t2(a int primary key) engine=innodb;
create table t1(a int primary key, b int) engine=innodb;
--error ER_WRONG_FK_DEF
alter table t2 add foreign key(a) references t1(a, b);
create or replace table t1(a tinyint primary key) engine innodb;
--error ER_CANT_CREATE_TABLE
alter table t2 add foreign key(a) references t1;
create or replace table t1(b int primary key) engine innodb;
--error ER_CANT_CREATE_TABLE
alter table t2 add foreign key(a) references t1;
create or replace table t1(a int primary key, b int) engine innodb;
alter table t2 add foreign key(a) references t1;
show create table t2;
drop tables t2, t1;
--echo # End of 10.5 tests
--source include/wait_until_count_sessions.inc
......@@ -3809,8 +3809,9 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
Foreign_key *fk_key= (Foreign_key*) key;
if (fk_key->validate(alter_info->create_list))
DBUG_RETURN(TRUE);
if (fk_key->ref_columns.elements &&
fk_key->ref_columns.elements != fk_key->columns.elements)
if (fk_key->ref_columns.elements)
{
if (fk_key->ref_columns.elements != fk_key->columns.elements)
{
my_error(ER_WRONG_FK_DEF, MYF(0),
(fk_key->name.str ? fk_key->name.str :
......@@ -3818,6 +3819,9 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
ER_THD(thd, ER_KEY_REF_DO_NOT_MATCH_TABLE_REF));
DBUG_RETURN(TRUE);
}
}
else
fk_key->ref_columns.append(&fk_key->columns);
continue;
}
(*key_count)++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment