From: Dmitry Lenev Date: January 31 2011 3:58pm Subject: bzr commit into mysql-5.1 branch (Dmitry.Lenev:3545) Bug#58650 List-Archive: http://lists.mysql.com/commits/130063 X-Bug: 58650 Message-Id: <20110131155831.E2C5F7405D5@bandersnatch> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0711004035==" --===============0711004035== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/dlenev/src/bzr/mysql-5.1-58650/ based on revid:dmitry.lenev@stripped 3545 Dmitry Lenev 2011-01-31 Fix for bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0". Attempt to create InnoDB table with non-nullable column of geometry type having an unique key with length 12 on it and with some other candidate key led to server crash due to assertion failure in both non-debug and debug builds. The problem was that such a non-candidate key could have been sorted as the first key in table/.FRM, before any legit candidate keys. This resulted in assertion failure in InnoDB engine which assumes that primary key should either be the first key in table/.FRM or should not exist at all. The reason behind such an incorrect sorting was an wrong value of Create_field::key_length member for geometry field (which was set to its pack_length == 12) which confused code in mysql_prepare_create_table(), so it would skip marking such key as a key with partial segments. This patch fixes the problem by ensuring that this member gets the same value of Create_field::key_length member as for other blob fields (from which geometry field class is inherited), and as result unique keys on geometry fields are correctly marked as having partial segments. @ mysql-test/include/gis_keys.inc Added test case for bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0". @ mysql-test/r/gis.result Added test case for bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0". @ mysql-test/suite/innodb/r/innodb_gis.result Added test case for bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0". @ mysql-test/suite/innodb_plugin/r/innodb_gis.result Added test case for bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0". @ sql/field.cc Changed Create_field::create_length_to_internal_length() to correctly set Create_field::key_length member for geometry fields. Similar to the blob types key_length for such fields should be the same as length and not field's packed length (which is always 12 for geometry). As result of this change code handling table creation now always correctly identifies btree/unique keys on geometry fields as partial keys, so such keys can't be erroneously treated as candidate keys and sorted in keys array in .FRM before legit candidate keys. This fixes bug #58650 "Failing assertion: primary_key_no == -1 || primary_key_no == 0" in which incorrect candidate key sorting led to assertion failure in InnoDB code. modified: mysql-test/include/gis_keys.inc mysql-test/r/gis.result mysql-test/suite/innodb/r/innodb_gis.result mysql-test/suite/innodb_plugin/r/innodb_gis.result sql/field.cc === modified file 'mysql-test/include/gis_keys.inc' --- a/mysql-test/include/gis_keys.inc 2007-11-01 14:03:09 +0000 +++ b/mysql-test/include/gis_keys.inc 2011-01-31 15:57:44 +0000 @@ -44,3 +44,19 @@ SELECT COUNT(*) FROM t2 IGNORE INDEX(p) DROP TABLE t1, t2; --echo End of 5.0 tests + + +--echo # +--echo # Test for bug #58650 "Failing assertion: primary_key_no == -1 || +--echo # primary_key_no == 0". +--echo # +--disable_warnings +drop table if exists t1; +--enable_warnings +--echo # The minimal test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a)); +drop table t1; +--echo # The original test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12))); +create unique index a on t1(a); +drop table t1; === modified file 'mysql-test/r/gis.result' --- a/mysql-test/r/gis.result 2010-09-09 09:40:17 +0000 +++ b/mysql-test/r/gis.result 2011-01-31 15:57:44 +0000 @@ -960,6 +960,18 @@ COUNT(*) 2 DROP TABLE t1, t2; End of 5.0 tests +# +# Test for bug #58650 "Failing assertion: primary_key_no == -1 || +# primary_key_no == 0". +# +drop table if exists t1; +# The minimal test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a)); +drop table t1; +# The original test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12))); +create unique index a on t1(a); +drop table t1; create table `t1` (`col002` point)engine=myisam; insert into t1 values (),(),(); select min(`col002`) from t1 union select `col002` from t1; === modified file 'mysql-test/suite/innodb/r/innodb_gis.result' --- a/mysql-test/suite/innodb/r/innodb_gis.result 2010-06-03 09:50:32 +0000 +++ b/mysql-test/suite/innodb/r/innodb_gis.result 2011-01-31 15:57:44 +0000 @@ -585,5 +585,17 @@ COUNT(*) 2 DROP TABLE t1, t2; End of 5.0 tests +# +# Test for bug #58650 "Failing assertion: primary_key_no == -1 || +# primary_key_no == 0". +# +drop table if exists t1; +# The minimal test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a)); +drop table t1; +# The original test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12))); +create unique index a on t1(a); +drop table t1; create table t1 (g geometry not null, spatial gk(g)) engine=innodb; ERROR HY000: The used table type doesn't support SPATIAL indexes === modified file 'mysql-test/suite/innodb_plugin/r/innodb_gis.result' --- a/mysql-test/suite/innodb_plugin/r/innodb_gis.result 2010-06-03 09:48:59 +0000 +++ b/mysql-test/suite/innodb_plugin/r/innodb_gis.result 2011-01-31 15:57:44 +0000 @@ -585,5 +585,17 @@ COUNT(*) 2 DROP TABLE t1, t2; End of 5.0 tests +# +# Test for bug #58650 "Failing assertion: primary_key_no == -1 || +# primary_key_no == 0". +# +drop table if exists t1; +# The minimal test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a)); +drop table t1; +# The original test case. +create table t1 (a int not null, b linestring not null, unique key b (b(12))); +create unique index a on t1(a); +drop table t1; create table t1 (g geometry not null, spatial gk(g)) engine=innodb; ERROR HY000: The used table type doesn't support SPATIAL indexes === modified file 'sql/field.cc' --- a/sql/field.cc 2010-12-28 23:47:05 +0000 +++ b/sql/field.cc 2011-01-31 15:57:44 +0000 @@ -9476,6 +9476,7 @@ void Create_field::create_length_to_inte case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VARCHAR: --===============0711004035== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.lenev@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.lenev@stripped # target_branch: file:///home/dlenev/src/bzr/mysql-5.1-58650/ # testament_sha1: a59cd5f1da70d71360c3bc83834faa475f346d81 # timestamp: 2011-01-31 18:58:31 +0300 # base_revision_id: dmitry.lenev@stripped\ # csanweanbny2ua3n # # Begin bundle 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 --===============0711004035==--