List:Commits« Previous MessageNext Message »
From:Georgi Kodinov Date:March 8 2010 10:02am
Subject:bzr commit into mysql-5.1-bugteam branch (joro:3373) Bug#51357
View as plain text  
#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#51357Georgi Kodinov8 Mar