mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
e971b18f06
Fixed the usage of spatial data (and Point in specific) with non-spatial indexes. Several problems : - The length of the Point class was not updated to include the spatial reference system identifier. Fixed by increasing with 4 bytes. - The storage length of the spatial columns was not accounting for the length that is prepended to it. Fixed by treating the spatial data columns as blobs (and thus increasing the storage length) - When creating the key image for comparison in index read wrong key image was created (the one needed for and r-tree search, not the one for b-tree/other search). Fixed by treating the spatial data columns as blobs (and creating the correct kind of image based on the index type).
46 lines
1.4 KiB
SQL
46 lines
1.4 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
|