summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2022-01-12 17:18:38 +0300
committerAleksey Midenkov <midenok@gmail.com>2022-01-12 17:18:38 +0300
commit6831b3f2a0fd656fb41dd9df5f141431988448f1 (patch)
tree209b0a23a95cdcc3d600d01bcec5db0e558fd484
parent017d1b867b12ff36b3b871c3d57719907a905659 (diff)
downloadmariadb-git-6831b3f2a0fd656fb41dd9df5f141431988448f1.tar.gz
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.
-rw-r--r--mysql-test/suite/innodb/r/foreign_key.result23
-rw-r--r--mysql-test/suite/innodb/t/foreign_key.test18
-rw-r--r--sql/sql_table.cc18
3 files changed, 52 insertions, 7 deletions
diff --git a/mysql-test/suite/innodb/r/foreign_key.result b/mysql-test/suite/innodb/r/foreign_key.result
index ff0e025246e..1968661b45a 100644
--- a/mysql-test/suite/innodb/r/foreign_key.result
+++ b/mysql-test/suite/innodb/r/foreign_key.result
@@ -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
diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test
index be248a5bed4..1f25d995827 100644
--- a/mysql-test/suite/innodb/t/foreign_key.test
+++ b/mysql-test/suite/innodb/t/foreign_key.test
@@ -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
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 6d8ceb348dc..6956b41bdc5 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3809,15 +3809,19 @@ 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)
{
- my_error(ER_WRONG_FK_DEF, MYF(0),
- (fk_key->name.str ? fk_key->name.str :
- "foreign key without name"),
- ER_THD(thd, ER_KEY_REF_DO_NOT_MATCH_TABLE_REF));
- DBUG_RETURN(TRUE);
+ 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 :
+ "foreign key without name"),
+ 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)++;