From: Mattias Jonsson Date: December 6 2010 11:37am Subject: bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3512) Bug#57924 List-Archive: http://lists.mysql.com/commits/126121 X-Bug: 57924 Message-Id: <201012061137.oB6B4IqM011359@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5100405887967091933==" --===============5100405887967091933== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/b57924-51-bt/ based on revid:mats.kindahl@stripped 3512 Mattias Jonsson 2010-12-06 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. @ 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. modified: mysql-test/r/partition_error.result mysql-test/suite/ndb/r/ndb_basic.result mysql-test/suite/ndb/t/ndb_basic.test mysql-test/t/partition_error.test sql/sql_partition.cc === modified file 'mysql-test/r/partition_error.result' --- a/mysql-test/r/partition_error.result 2010-09-22 19:33:18 +0000 +++ b/mysql-test/r/partition_error.result 2010-12-06 11:37:10 +0000 @@ -1,5 +1,12 @@ 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 +# # Bug#49161: Out of memory; restart server and try again (needed 2 bytes) # CREATE TABLE t1 (a INT) PARTITION BY HASH (a); === modified file 'mysql-test/suite/ndb/r/ndb_basic.result' --- a/mysql-test/suite/ndb/r/ndb_basic.result 2007-10-26 07:06:18 +0000 +++ b/mysql-test/suite/ndb/r/ndb_basic.result 2010-12-06 11:37:10 +0000 @@ -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, === modified file 'mysql-test/suite/ndb/t/ndb_basic.test' --- a/mysql-test/suite/ndb/t/ndb_basic.test 2007-10-26 06:57:10 +0000 +++ b/mysql-test/suite/ndb/t/ndb_basic.test 2010-12-06 11:37:10 +0000 @@ -548,6 +548,13 @@ primary key using hash(c1)) engine=ndb p 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 # === modified file 'mysql-test/t/partition_error.test' --- a/mysql-test/t/partition_error.test 2010-09-22 19:33:18 +0000 +++ b/mysql-test/t/partition_error.test 2010-12-06 11:37:10 +0000 @@ -11,6 +11,14 @@ 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); + +--echo # --echo # Bug#49161: Out of memory; restart server and try again (needed 2 bytes) --echo # CREATE TABLE t1 (a INT) PARTITION BY HASH (a); === modified file 'sql/sql_partition.cc' --- a/sql/sql_partition.cc 2010-11-10 21:14:47 +0000 +++ b/sql/sql_partition.cc 2010-12-06 11:37:10 +0000 @@ -761,6 +761,9 @@ static bool handle_list_of_fields(List_i 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,24 @@ static bool handle_list_of_fields(List_i 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 (strcmp(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) { --===============5100405887967091933== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mattias.jonsson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mattias.jonsson@stripped\ # e36woi0el8g55gqy # target_branch: file:///Users/mattiasj/mysql-bzr/b57924-51-bt/ # testament_sha1: b055fb7043030c82a042ba55905de40f3e2a25dd # timestamp: 2010-12-06 12:37:28 +0100 # source_branch: file:///Users/mattiasj/mysql-bzr/mysql-5.1-telco-7.0/ # base_revision_id: mats.kindahl@stripped\ # 7udci9op4lc6jvtb # # Begin bundle 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 --===============5100405887967091933==--