mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Bug#57924: crash when creating partitioned table with
multiple columns in the partition key ndb crash if duplicate columns in the partitioning key. Backport from mysql-5.1-telco-7.0, see bug#53354. Changed from case sensitive field name comparision to non case sensitive too. mysql-test/r/partition_error.result: updated result mysql-test/t/partition_error.test: Added test for the error in non-ndb partitioned table. sql/sql_partition.cc: Added check for duplicated field names in the partitioning key.
This commit is contained in:
parent
078ed28181
commit
c574a9c414
5 changed files with 58 additions and 0 deletions
|
@ -1,5 +1,18 @@
|
|||
drop table if exists t1;
|
||||
#
|
||||
# Bug#57924: crash when creating partitioned table with
|
||||
# multiple columns in the partition key
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(a, b, a);
|
||||
ERROR HY000: Field in list of fields for partition function not found in table
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(A, b);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(a, b, A);
|
||||
ERROR HY000: Field in list of fields for partition function not found in table
|
||||
#
|
||||
# Bug#49161: Out of memory; restart server and try again (needed 2 bytes)
|
||||
#
|
||||
CREATE TABLE t1 (a INT) PARTITION BY HASH (a);
|
||||
|
|
|
@ -585,6 +585,8 @@ c127 int,
|
|||
c128 int,
|
||||
primary key using hash(c1)) engine=ndb partition by key(c1);
|
||||
drop table t1;
|
||||
create table `t1` (`a` int, b int, primary key (a,b)) engine=ndb partition by key(`a`,`b`,`a`);
|
||||
ERROR HY000: Field in list of fields for partition function not found in table
|
||||
create table t1 (
|
||||
a1234567890123456789012345678901234567890 int primary key,
|
||||
a12345678901234567890123456789a1234567890 int,
|
||||
|
|
|
@ -547,6 +547,13 @@ c128 int,
|
|||
primary key using hash(c1)) engine=ndb partition by key(c1);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# test bug#53354 - crash when creating partitioned table with multiple columns in the partition key
|
||||
#
|
||||
|
||||
--error ER_FIELD_NOT_FOUND_PART_ERROR
|
||||
create table `t1` (`a` int, b int, primary key (a,b)) engine=ndb partition by key(`a`,`b`,`a`);
|
||||
|
||||
#
|
||||
# test max size of attribute name and truncation
|
||||
#
|
||||
|
|
|
@ -10,6 +10,20 @@ drop table if exists t1;
|
|||
|
||||
let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#57924: crash when creating partitioned table with
|
||||
--echo # multiple columns in the partition key
|
||||
--echo #
|
||||
--error ER_FIELD_NOT_FOUND_PART_ERROR
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(a, b, a);
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(A, b);
|
||||
DROP TABLE t1;
|
||||
--error ER_FIELD_NOT_FOUND_PART_ERROR
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b))
|
||||
PARTITION BY KEY(a, b, A);
|
||||
|
||||
--echo #
|
||||
--echo # Bug#49161: Out of memory; restart server and try again (needed 2 bytes)
|
||||
--echo #
|
||||
|
|
|
@ -761,6 +761,9 @@ static bool handle_list_of_fields(List_iterator<char> it,
|
|||
bool result;
|
||||
char *field_name;
|
||||
bool is_list_empty= TRUE;
|
||||
int fields_handled = 0;
|
||||
char* field_name_array[MAX_KEY];
|
||||
|
||||
DBUG_ENTER("handle_list_of_fields");
|
||||
|
||||
while ((field_name= it++))
|
||||
|
@ -776,6 +779,25 @@ static bool handle_list_of_fields(List_iterator<char> it,
|
|||
result= TRUE;
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
Check for duplicate fields in the list.
|
||||
Assuming that there are not many fields in the partition key list.
|
||||
If there were, it would be better to replace the for-loop
|
||||
with a more efficient algorithm.
|
||||
*/
|
||||
|
||||
field_name_array[fields_handled] = field_name;
|
||||
for (int i = 0; i < fields_handled; ++i)
|
||||
{
|
||||
if (my_strcasecmp(system_charset_info,
|
||||
field_name_array[i], field_name) == 0)
|
||||
{
|
||||
my_error(ER_FIELD_NOT_FOUND_PART_ERROR, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
fields_handled++;
|
||||
}
|
||||
if (is_list_empty)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue