mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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.
This commit is contained in:
@ -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)++;
|
||||
|
Reference in New Issue
Block a user