#At file:///home/kgeorge/mysql/work/B51357-5.1-bugteam/ based on revid:gshchepa@stripped
3373 Georgi Kodinov 2010-03-04
Bug #51357: crash when using handler commands on spatial indexes
Spatial indexes were not checking for out-of-record condition in
the handler next command when the previous command didn't found
rows.
Fixed by making the rtree index to check for end of rows condition
before re-using the key from the previous search.
Fixed another crash if the tree has changed since the last search.
Added a test case for the other error.
modified:
mysql-test/r/gis-rtree.result
mysql-test/t/gis-rtree.test
storage/myisam/rt_index.c
=== modified file 'mysql-test/r/gis-rtree.result'
--- a/mysql-test/r/gis-rtree.result 2010-02-26 13:16:46 +0000
+++ b/mysql-test/r/gis-rtree.result 2010-03-04 16:13:08 +0000
@@ -1526,4 +1526,26 @@ SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT
1
1
DROP TABLE t1;
+#
+# Bug #51357: crash when using handler commands on spatial indexes
+#
+CREATE TABLE t1(a GEOMETRY NOT NULL,SPATIAL INDEX a(a));
+HANDLER t1 OPEN;
+HANDLER t1 READ a FIRST;
+a
+HANDLER t1 READ a NEXT;
+a
+HANDLER t1 READ a PREV;
+a
+HANDLER t1 READ a LAST;
+a
+HANDLER t1 CLOSE;
+HANDLER t1 OPEN;
+HANDLER t1 READ a FIRST;
+a
+INSERT INTO t1 VALUES (GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
+HANDLER t1 READ a NEXT;
+a
+HANDLER t1 CLOSE;
+DROP TABLE t1;
End of 5.0 tests.
=== modified file 'mysql-test/t/gis-rtree.test'
--- a/mysql-test/t/gis-rtree.test 2010-02-26 13:16:46 +0000
+++ b/mysql-test/t/gis-rtree.test 2010-03-04 16:13:08 +0000
@@ -902,4 +902,26 @@ SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT
DROP TABLE t1;
+--echo #
+--echo # Bug #51357: crash when using handler commands on spatial indexes
+--echo #
+
+CREATE TABLE t1(a GEOMETRY NOT NULL,SPATIAL INDEX a(a));
+HANDLER t1 OPEN;
+HANDLER t1 READ a FIRST;
+HANDLER t1 READ a NEXT;
+HANDLER t1 READ a PREV;
+HANDLER t1 READ a LAST;
+HANDLER t1 CLOSE;
+
+# second crash fixed when the tree has changed since the last search.
+HANDLER t1 OPEN;
+HANDLER t1 READ a FIRST;
+INSERT INTO t1 VALUES (GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
+HANDLER t1 READ a NEXT;
+HANDLER t1 CLOSE;
+
+DROP TABLE t1;
+
+
--echo End of 5.0 tests.
=== modified file 'storage/myisam/rt_index.c'
--- a/storage/myisam/rt_index.c 2009-02-13 16:41:47 +0000
+++ b/storage/myisam/rt_index.c 2010-03-04 16:13:08 +0000
@@ -404,10 +404,16 @@ int rtree_get_first(MI_INFO *info, uint
int rtree_get_next(MI_INFO *info, uint keynr, uint key_length)
{
- my_off_t root;
+ my_off_t root= info->s->state.key_root[keynr];
MI_KEYDEF *keyinfo = info->s->keyinfo + keynr;
- if (!info->buff_used)
+ if (root == HA_OFFSET_ERROR)
+ {
+ my_errno= HA_ERR_END_OF_FILE;
+ return -1;
+ }
+
+ if (!info->buff_used && !info->page_changed)
{
uint k_len = keyinfo->keylength - info->s->base.rec_reflength;
/* rt_PAGE_NEXT_KEY(info->int_keypos) */
@@ -428,16 +434,8 @@ int rtree_get_next(MI_INFO *info, uint k
return 0;
}
- else
- {
- if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR)
- {
- my_errno= HA_ERR_END_OF_FILE;
- return -1;
- }
-
- return rtree_get_req(info, keyinfo, key_length, root, 0);
- }
+
+ return rtree_get_req(info, keyinfo, key_length, root, 0);
}
Attachment: [text/bzr-bundle] bzr/joro@sun.com-20100304161308-ehlanjqqmzhrp5w1.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-bugteam branch (joro:3373) Bug#51357 | Georgi Kodinov | 8 Mar |