Commit b8ffd1fb authored by Dmitry Lenev's avatar Dmitry Lenev

Fix for bug #39932 "create table fails if column for FK is in different

case than in corr index".

Server was unable to find existing or explicitly created supporting
index for foreign key if corresponding statement clause used field
names in case different than one used in key specification and created
yet another supporting index.
In cases when name of constraint (and thus name of generated index)
was the same as name of existing/explicitly created index this led
to duplicate key name error.

The problem was that unlike all other code Key_part_spec::operator==()
compared field names in case sensitive fashion. As result routines
responsible for getting rid of redundant generated supporting indexes
for foreign key were not working properly for versions of field names
using different cases.

mysql-test/r/innodb_mysql.result:
  Added test case for bug #39932 "create table fails if column for FK
  is in different case than in corr index".
mysql-test/t/innodb_mysql.test:
  Added test case for bug #39932 "create table fails if column for FK
  is in different case than in corr index".
sql/sql_class.cc:
  Make field name comparison case-insensitive like it is
  in the rest of server.
parent 05f88483
...@@ -2209,3 +2209,23 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -2209,3 +2209,23 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using where 1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using where
DROP TABLE t1; DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
#
# Test for bug #39932 "create table fails if column for FK is in different
# case than in corr index".
#
drop tables if exists t1, t2;
create table t1 (pk int primary key) engine=InnoDB;
# Even although the below statement uses uppercased field names in
# foreign key definition it still should be able to find explicitly
# created supporting index. So it should succeed and should not
# create any additional supporting indexes.
create table t2 (fk int, key x (fk),
constraint x foreign key (FK) references t1 (PK)) engine=InnoDB;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`fk` int(11) DEFAULT NULL,
KEY `x` (`fk`),
CONSTRAINT `x` FOREIGN KEY (`fk`) REFERENCES `t1` (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
drop table t2, t1;
...@@ -462,3 +462,21 @@ EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a; ...@@ -462,3 +462,21 @@ EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a;
DROP TABLE t1; DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # Test for bug #39932 "create table fails if column for FK is in different
--echo # case than in corr index".
--echo #
--disable_warnings
drop tables if exists t1, t2;
--enable_warnings
create table t1 (pk int primary key) engine=InnoDB;
--echo # Even although the below statement uses uppercased field names in
--echo # foreign key definition it still should be able to find explicitly
--echo # created supporting index. So it should succeed and should not
--echo # create any additional supporting indexes.
create table t2 (fk int, key x (fk),
constraint x foreign key (FK) references t1 (PK)) engine=InnoDB;
show create table t2;
drop table t2, t1;
...@@ -91,8 +91,8 @@ extern "C" void free_user_var(user_var_entry *entry) ...@@ -91,8 +91,8 @@ extern "C" void free_user_var(user_var_entry *entry)
bool Key_part_spec::operator==(const Key_part_spec& other) const bool Key_part_spec::operator==(const Key_part_spec& other) const
{ {
return length == other.length && return length == other.length &&
field_name.length == other.field_name.length && !my_strcasecmp(system_charset_info, field_name.str,
!strcmp(field_name.str, other.field_name.str); other.field_name.str);
} }
/** /**
......
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