1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

Bug#6252 - Duplicate columns in keys should fail

Added check for duplicate column in key
  Added tests and fixed tests which exploit bug


mysql-test/r/delete.result:
  Fix test as it exploited Bug#6252
mysql-test/r/innodb.result:
  Test for Bug#6126
mysql-test/r/key.result:
  Test for Bug#6126/6252
mysql-test/r/type_blob.result:
  Fix test as it exploited Bug#6252
mysql-test/t/delete.test:
  Fix test as it exploited Bug#6252
mysql-test/t/innodb.test:
  Test for Bug#6126
mysql-test/t/key.test:
  Test for Bug#6126/6252
mysql-test/t/type_blob.test:
  Fix test as it exploited Bug#6252
sql/sql_table.cc:
  Bug#6252 - Duplicate columns in keys should fail
    Added check for duplicate column.
This commit is contained in:
unknown
2004-11-22 18:07:04 +00:00
parent 12c0a34205
commit 1dc1ad9c9a
9 changed files with 151 additions and 13 deletions

View File

@ -16,12 +16,34 @@ SET AUTOCOMMIT=0;
DELETE from t1; DELETE from t1;
SET AUTOCOMMIT=1; SET AUTOCOMMIT=1;
drop table t1; drop table t1;
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); create table t1 (
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23); a bigint not null,
b bigint not null default 0,
c bigint not null default 0,
d bigint not null default 0,
e bigint not null default 0,
f bigint not null default 0,
g bigint not null default 0,
h bigint not null default 0,
i bigint not null default 0,
j bigint not null default 0,
primary key (a,b,c,d,e,f,g,h,i,j));
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
delete from t1 where a=26; delete from t1 where a=26;
drop table t1; drop table t1;
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); create table t1 (
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27); a bigint not null,
b bigint not null default 0,
c bigint not null default 0,
d bigint not null default 0,
e bigint not null default 0,
f bigint not null default 0,
g bigint not null default 0,
h bigint not null default 0,
i bigint not null default 0,
j bigint not null default 0,
primary key (a,b,c,d,e,f,g,h,i,j));
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
delete from t1 where a=27; delete from t1 where a=27;
drop table t1; drop table t1;
CREATE TABLE `t1` ( CREATE TABLE `t1` (

View File

@ -1630,3 +1630,21 @@ show status like "binlog_cache_disk_use";
Variable_name Value Variable_name Value
Binlog_cache_disk_use 1 Binlog_cache_disk_use 1
drop table t1; drop table t1;
create table t1 (c char(10), index (c,c)) engine=innodb;
ERROR 42S21: Duplicate column name 'c'
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1)) engine=innodb;
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2)) engine=innodb;
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1)) engine=innodb;
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10)) engine=innodb;
alter table t1 add key (c1,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c2,c1,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c1,c2,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c1,c1,c2);
ERROR 42S21: Duplicate column name 'c1'
drop table t1;

View File

@ -307,3 +307,21 @@ test.t1 check status OK
drop table t1; drop table t1;
create table t1 (c char(10), index (c(0))); create table t1 (c char(10), index (c(0)));
ERROR HY000: Key part 'c' length cannot be 0 ERROR HY000: Key part 'c' length cannot be 0
create table t1 (c char(10), index (c,c));
ERROR 42S21: Duplicate column name 'c'
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1));
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2));
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1));
ERROR 42S21: Duplicate column name 'c1'
create table t1 (c1 char(10), c2 char(10));
alter table t1 add key (c1,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c2,c1,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c1,c2,c1);
ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c1,c1,c2);
ERROR 42S21: Duplicate column name 'c1'
drop table t1;

View File

@ -682,8 +682,8 @@ id txt
3 NULL 3 NULL
1 Chevy 1 Chevy
drop table t1; drop table t1;
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, PRIMARY KEY (i), KEY (c(1),c(1))); CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, d varchar(1) NOT NULL DEFAULT ' ', PRIMARY KEY (i), KEY (c(1),d));
INSERT t1 VALUES (1,''),(2,''),(3,'asdfh'),(4,''); INSERT t1 (i, c) VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
select max(i) from t1 where c = ''; select max(i) from t1 where c = '';
max(i) max(i)
4 4

View File

@ -29,12 +29,34 @@ drop table t1;
# (This assumes a block size of 1024) # (This assumes a block size of 1024)
# #
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); create table t1 (
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23); a bigint not null,
b bigint not null default 0,
c bigint not null default 0,
d bigint not null default 0,
e bigint not null default 0,
f bigint not null default 0,
g bigint not null default 0,
h bigint not null default 0,
i bigint not null default 0,
j bigint not null default 0,
primary key (a,b,c,d,e,f,g,h,i,j));
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
delete from t1 where a=26; delete from t1 where a=26;
drop table t1; drop table t1;
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); create table t1 (
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27); a bigint not null,
b bigint not null default 0,
c bigint not null default 0,
d bigint not null default 0,
e bigint not null default 0,
f bigint not null default 0,
g bigint not null default 0,
h bigint not null default 0,
i bigint not null default 0,
j bigint not null default 0,
primary key (a,b,c,d,e,f,g,h,i,j));
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
delete from t1 where a=27; delete from t1 where a=27;
drop table t1; drop table t1;

View File

@ -1158,3 +1158,25 @@ show status like "binlog_cache_use";
show status like "binlog_cache_disk_use"; show status like "binlog_cache_disk_use";
drop table t1; drop table t1;
#
# Bug #6126: Duplicate columns in keys gives misleading error message
#
--error 1060
create table t1 (c char(10), index (c,c)) engine=innodb;
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1)) engine=innodb;
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2)) engine=innodb;
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1)) engine=innodb;
create table t1 (c1 char(10), c2 char(10)) engine=innodb;
--error 1060
alter table t1 add key (c1,c1);
--error 1060
alter table t1 add key (c2,c1,c1);
--error 1060
alter table t1 add key (c1,c2,c1);
--error 1060
alter table t1 add key (c1,c1,c2);
drop table t1;

View File

@ -297,3 +297,26 @@ drop table t1;
--error 1105 --error 1105
create table t1 (c char(10), index (c(0))); create table t1 (c char(10), index (c(0)));
#
# Bug #6126: Duplicate columns in keys should fail
# Bug #6252: (dup)
#
--error 1060
create table t1 (c char(10), index (c,c));
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1));
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2));
--error 1060
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1));
create table t1 (c1 char(10), c2 char(10));
--error 1060
alter table t1 add key (c1,c1);
--error 1060
alter table t1 add key (c2,c1,c1);
--error 1060
alter table t1 add key (c1,c2,c1);
--error 1060
alter table t1 add key (c1,c1,c2);
drop table t1;

View File

@ -369,8 +369,8 @@ explain select * from t1 where txt='Chevy' or txt is NULL order by txt;
select * from t1 where txt='Chevy' or txt is NULL order by txt; select * from t1 where txt='Chevy' or txt is NULL order by txt;
drop table t1; drop table t1;
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, PRIMARY KEY (i), KEY (c(1),c(1))); CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, d varchar(1) NOT NULL DEFAULT ' ', PRIMARY KEY (i), KEY (c(1),d));
INSERT t1 VALUES (1,''),(2,''),(3,'asdfh'),(4,''); INSERT t1 (i, c) VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
select max(i) from t1 where c = ''; select max(i) from t1 where c = '';
drop table t1; drop table t1;

View File

@ -835,7 +835,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
#endif #endif
} }
List_iterator<key_part_spec> cols(key->columns); List_iterator<key_part_spec> cols(key->columns), cols2(key->columns);
CHARSET_INFO *ft_key_charset=0; // for FULLTEXT CHARSET_INFO *ft_key_charset=0; // for FULLTEXT
for (uint column_nr=0 ; (column=cols++) ; column_nr++) for (uint column_nr=0 ; (column=cols++) ; column_nr++)
{ {
@ -853,6 +853,19 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
column->field_name); column->field_name);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
for (uint dup_nr= 0; dup_nr < column_nr; dup_nr++)
{
key_part_spec *dup_column= cols2++;
if (!my_strcasecmp(system_charset_info,
column->field_name, dup_column->field_name))
{
my_printf_error(ER_DUP_FIELDNAME,
ER(ER_DUP_FIELDNAME),MYF(0),
column->field_name);
DBUG_RETURN(-1);
}
}
cols2.rewind();
/* for fulltext keys keyseg length is 1 for blobs (it's ignored in /* for fulltext keys keyseg length is 1 for blobs (it's ignored in
ft code anyway, and 0 (set to column width later) for char's. ft code anyway, and 0 (set to column width later) for char's.
it has to be correct col width for char's, as char data are not it has to be correct col width for char's, as char data are not