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:
@ -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` (
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user