MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:ingo Date:June 28 2006 12:27pm
Subject:bk commit into 4.1 tree (ingo:1.2521) BUG#17877
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of mydev. When mydev does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2521 06/06/28 14:27:37 ingo@stripped +6 -0
  Bug#17877 - Corrupted spatial index
  
  CHECK TABLE could complain about a fully intact spatial index.
  A wrong comparison operator was used for table checking. 
  The result was that it checked for non-matching spatial keys. 
  This succeeded if at least two different keys were present, 
  but failed if only the matching key was present.
  
  I fixed the key comparison.

  mysql-test/t/gis-rtree.test
    1.13 06/06/28 14:27:33 ingo@stripped +44 -0
    Bug#17877 - Corrupted spatial index
    The test case.

  mysql-test/r/gis-rtree.result
    1.13 06/06/28 14:27:33 ingo@stripped +40 -0
    Bug#17877 - Corrupted spatial index
    The test result.

  myisam/rt_mbr.c
    1.10 06/06/28 14:27:33 ingo@stripped +5 -1
    Bug#17877 - Corrupted spatial index
    Extended the RT_CMP() macro with an assert for an 
    unexpected comparison operator.

  myisam/rt_index.c
    1.17 06/06/28 14:27:33 ingo@stripped +5 -3
    Bug#17877 - Corrupted spatial index
    Included the data pointer in the copy of the search key.
    This is necessary for searching the index entry that points
    to a specific record if the search_flag contains MBR_DATA.

  myisam/mi_key.c
    1.38 06/06/28 14:27:33 ingo@stripped +1 -1
    Bug#17877 - Corrupted spatial index
    Added a missing DBUG_RETURN.

  myisam/mi_check.c
    1.158 06/06/28 14:27:33 ingo@stripped +3 -2
    Bug#17877 - Corrupted spatial index
    Fixed the comparison operator for checking a spatial index.
    Using MBR_EQUAL | MBR_DATA to compare for equality and
    include the data pointer in the comparison. The latter
    finds the index entry that points to the current record.
    This is necessary for non-unique indexes.
    
    The old operator, SEARCH_SAME, is unknown to the rtree
    search functions and handled like MBR_DISJOINT.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ingo
# Host:	chilla.local
# Root:	/home/mydev/mysql-4.1-bug17877

--- 1.157/myisam/mi_check.c	2006-04-29 19:38:37 +02:00
+++ 1.158/myisam/mi_check.c	2006-06-28 14:27:33 +02:00
@@ -1155,12 +1155,13 @@ int chk_data_link(MI_CHECK *param, MI_IN
 	      */
               int search_result= (keyinfo->flag & HA_SPATIAL) ?
                 rtree_find_first(info, key, info->lastkey, key_length,
-                                 SEARCH_SAME) : 
+                                 MBR_EQUAL | MBR_DATA) : 
                 _mi_search(info,keyinfo,info->lastkey,key_length,
                            SEARCH_SAME, info->s->state.key_root[key]);
               if (search_result)
               {
-                mi_check_print_error(param,"Record at: %10s  Can't find key for index: %2d",
+                mi_check_print_error(param,"Record at: %10s  "
+                                     "Can't find key for index: %2d",
                                      llstr(start_recpos,llbuff),key+1);
                 if (error++ > MAXERR || !(param->testflag & T_VERBOSE))
                   goto err2;

--- 1.37/myisam/mi_key.c	2006-03-10 15:03:00 +01:00
+++ 1.38/myisam/mi_key.c	2006-06-28 14:27:33 +02:00
@@ -54,7 +54,7 @@ uint _mi_make_key(register MI_INFO *info
       TODO: nulls processing
     */
 #ifdef HAVE_SPATIAL
-    return sp_make_key(info,keynr,key,record,filepos);
+    DBUG_RETURN(sp_make_key(info,keynr,key,record,filepos));
 #else
     DBUG_ASSERT(0); /* mi_open should check that this never happens*/
 #endif

--- 1.16/myisam/rt_index.c	2005-01-24 15:48:16 +01:00
+++ 1.17/myisam/rt_index.c	2006-06-28 14:27:33 +02:00
@@ -183,9 +183,11 @@ int rtree_find_first(MI_INFO *info, uint
     return -1;
   }
 
-  /* Save searched key */
-  memcpy(info->first_mbr_key, key, keyinfo->keylength -
-	 info->s->base.rec_reflength);
+  /*
+    Save searched key, include data pointer.
+    The data pointer is required if the search_flag contains MBR_DATA.
+  */
+  memcpy(info->first_mbr_key, key, keyinfo->keylength);
   info->last_rkey_length = key_length;
 
   info->rtree_recursion_depth = -1;

--- 1.9/myisam/rt_mbr.c	2004-10-22 17:44:48 +02:00
+++ 1.10/myisam/rt_mbr.c	2006-06-28 14:27:33 +02:00
@@ -52,10 +52,14 @@
     if (EQUAL_CMP(amin, amax, bmin, bmax)) \
       return 1; \
   } \
-  else /* if (nextflag & MBR_DISJOINT) */ \
+  else if (nextflag & MBR_DISJOINT) \
   { \
     if (DISJOINT_CMP(amin, amax, bmin, bmax)) \
       return 1; \
+  }\
+  else /* if unknown comparison operator */ \
+  { \
+    DBUG_ASSERT(0); \
   }
 
 #define RT_CMP_KORR(type, korr_func, len, nextflag) \

--- 1.12/mysql-test/r/gis-rtree.result	2006-05-04 03:12:47 +02:00
+++ 1.13/mysql-test/r/gis-rtree.result	2006-06-28 14:27:33 +02:00
@@ -817,3 +817,43 @@ check table t1 extended;
 Table	Op	Msg_type	Msg_text
 test.t1	check	status	OK
 drop table t1;
+CREATE TABLE t1 (
+c1 geometry NOT NULL default '',
+SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+CHECK TABLE t1 EXTENDED;
+Table	Op	Msg_type	Msg_text
+test.t1	check	status	OK
+DROP TABLE t1;
+CREATE TABLE t1 (
+c1 geometry NOT NULL default '',
+SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-65.7402776999 -96.6686111000,
+                            -65.7372222000 -96.5516666000,
+                            -65.8502777000 -96.5461111000,
+                            -65.8527777000 -96.6627777000,
+                            -65.7402776999 -96.6686111000))'));
+INSERT INTO t1 (c1) VALUES (
+PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+CHECK TABLE t1 EXTENDED;
+Table	Op	Msg_type	Msg_text
+test.t1	check	status	OK
+DROP TABLE t1;

--- 1.12/mysql-test/t/gis-rtree.test	2006-05-12 18:26:46 +02:00
+++ 1.13/mysql-test/t/gis-rtree.test	2006-06-28 14:27:33 +02:00
@@ -188,4 +188,48 @@ check table t1 extended;
 
 drop table t1;
 
+#
+# Bug#17877 - Corrupted spatial index
+#
+CREATE TABLE t1 (
+  c1 geometry NOT NULL default '',
+  SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+  PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+# This showed a missing key.
+CHECK TABLE t1 EXTENDED;
+DROP TABLE t1;
+#
+CREATE TABLE t1 (
+  c1 geometry NOT NULL default '',
+  SPATIAL KEY i1 (c1(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+INSERT INTO t1 (c1) VALUES (
+  PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+INSERT INTO t1 (c1) VALUES (
+  PolygonFromText('POLYGON((-65.7402776999 -96.6686111000,
+                            -65.7372222000 -96.5516666000,
+                            -65.8502777000 -96.5461111000,
+                            -65.8527777000 -96.6627777000,
+                            -65.7402776999 -96.6686111000))'));
+# This is the same as the first insert to get a non-unique key.
+INSERT INTO t1 (c1) VALUES (
+  PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
+                            -18.6055555000 -66.8158332999,
+                            -18.7186111000 -66.8102777000,
+                            -18.7211111000 -66.9269443999,
+                            -18.6086111000 -66.9327777000))'));
+# This showed (and still shows) OK.
+CHECK TABLE t1 EXTENDED;
+DROP TABLE t1;
+
 # End of 4.1 tests
Thread
bk commit into 4.1 tree (ingo:1.2521) BUG#17877ingo28 Jun