Commit be044e88 authored by unknown's avatar unknown

better fix for bug#3749 - do not consider already removed keys in key removal process


mysql-test/r/innodb.result:
  tests for bug#3749
mysql-test/t/innodb.test:
  tests for bug#3749
parent 3e7249e0
...@@ -1540,4 +1540,27 @@ t2 CREATE TABLE `t2` ( ...@@ -1540,4 +1540,27 @@ t2 CREATE TABLE `t2` (
drop table t2; drop table t2;
create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb;
ERROR HY000: Can't create table './test/t2.frm' (errno: 150) ERROR HY000: Can't create table './test/t2.frm' (errno: 150)
drop table t1; create table t2 (a int auto_increment primary key, b int, index(b), foreign key (b) references t1(id), unique(b)) engine=innodb;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL auto_increment,
`b` int(11) default NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `b_2` (`b`),
KEY `b` (`b`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
drop table t2;
create table t2 (a int auto_increment primary key, b int, foreign key (b) references t1(id), foreign key (b) references t1(id), unique(b)) engine=innodb;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL auto_increment,
`b` int(11) default NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `b` (`b`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`id`),
CONSTRAINT `t2_ibfk_2` FOREIGN KEY (`b`) REFERENCES `t1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
drop table t2, t1;
...@@ -1086,4 +1086,14 @@ drop table t2; ...@@ -1086,4 +1086,14 @@ drop table t2;
--error 1005 --error 1005
create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb;
drop table t1; # bug#3749
create table t2 (a int auto_increment primary key, b int, index(b), foreign key (b) references t1(id), unique(b)) engine=innodb;
show create table t2;
drop table t2;
create table t2 (a int auto_increment primary key, b int, foreign key (b) references t1(id), foreign key (b) references t1(id), unique(b)) engine=innodb;
show create table t2;
drop table t2, t1;
...@@ -688,28 +688,21 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -688,28 +688,21 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
'generated', and a generated key is a prefix of the other key. Then we 'generated', and a generated key is a prefix of the other key. Then we
do not need the generated shorter key. do not need the generated shorter key.
*/ */
if ((key2->type != Key::FOREIGN_KEY && !foreign_key_prefix(key, key2))) if (key2->name != ignore_key && key2->type != Key::FOREIGN_KEY &&
!foreign_key_prefix(key, key2))
{ {
/* TO DO: issue warning message */ /* TODO: issue warning message */
/* mark that the generated key should be ignored */ /* mark that the generated key should be ignored */
if (!key2->generated || if (!key2->generated ||
(key->generated && key->columns.elements < (key->generated && key->columns.elements <
key2->columns.elements)) key2->columns.elements))
key->name= ignore_key; key->name= ignore_key;
else else
{
/*
Remove the previous, generated key if it has not yet been
removed. Note that if we have several identical generated keys,
the last one will remain and others get removed here.
*/
if (key2->name != ignore_key)
{ {
key2->name= ignore_key; key2->name= ignore_key;
key_parts-= key2->columns.elements; key_parts-= key2->columns.elements;
(*key_count)--; (*key_count)--;
} }
}
break; break;
} }
} }
......
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