mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
e805a0fd9d
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.
62 lines
1.9 KiB
SQL
62 lines
1.9 KiB
SQL
--source include/have_geometry.inc
|
|
|
|
#
|
|
# Spatial objects with keys
|
|
#
|
|
|
|
#
|
|
# Bug #30825: Problems when putting a non-spatial index on a GIS column
|
|
#
|
|
|
|
CREATE TABLE t1 (p POINT);
|
|
CREATE TABLE t2 (p POINT, INDEX(p));
|
|
INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
|
|
INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
|
|
|
|
# no index, returns 1 as expected
|
|
SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
|
|
# with index, returns 1 as expected
|
|
# EXPLAIN shows that the index is not used though
|
|
# due to the "most rows covered anyway, so a scan is more effective" rule
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
|
|
# adding another row to the table so that
|
|
# the "most rows covered" rule doesn't kick in anymore
|
|
# now EXPLAIN shows the index used on the table
|
|
# and we're getting the wrong result again
|
|
INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
|
|
INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
|
|
|
|
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;
|