List:Commits« Previous MessageNext Message »
From:Sergey Vojtovich Date:August 30 2007 8:56pm
Subject:bk commit into 4.1 tree (svoj:1.2680) BUG#30590
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of svoj. When svoj 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@stripped, 2007-08-30 23:47:04+05:00, svoj@april.(none) +4 -0
  BUG#30590 - delete from memory table with composite btree primary key
  
  DELETE query against memory table with btree index may remove
  not all matching rows. This happens only when DELETE uses
  index read method to find matching rows. E.g. for queries
  like DELETE FROM t1 WHERE a=1.
  
  Fixed by reverting fix for BUG9719 and applying proper solution.

  heap/hp_delete.c@stripped, 2007-08-30 23:47:03+05:00, svoj@april.(none) +0 -3
    Reverted fix for BUG9719 as it makes queries like
    DELETE FROM t1 WHERE a=1 to remove not all matching
    rows (assuming this is memory table and there is btree
    key over `a`).
    
    This happens because we calculate info->lastkey_len in
    heap_rkey(). When we enter heap_rnext(), info->lastkey_len
    is 0 (set by hp_rb_delete_key()). We need to preserve
    info->lastkey_len in this situation, otherwise
    tree_search_key() will always return smallest value in
    a tree.

  heap/hp_rfirst.c@stripped, 2007-08-30 23:47:03+05:00, svoj@april.(none) +11 -0
    If we're performing index_first on a table that was taken from
    table cache, info->lastkey_len and info->last_find_flag are
    initialized to previous query. Thus we set info->last_find_flag
    and info->lastkey_len to proper values for subsequent heap_rnext()
    calls.
    This is needed for DELETE queries only, otherwise these variables
    are unused.

  mysql-test/r/heap_btree.result@stripped, 2007-08-30 23:47:03+05:00, svoj@april.(none) +7 -0
    A test case for BUG#30590.

  mysql-test/t/heap_btree.test@stripped, 2007-08-30 23:47:03+05:00, svoj@april.(none) +9 -0
    A test case for BUG#30590.

diff -Nrup a/heap/hp_delete.c b/heap/hp_delete.c
--- a/heap/hp_delete.c	2006-08-02 22:06:58 +05:00
+++ b/heap/hp_delete.c	2007-08-30 23:47:03 +05:00
@@ -73,10 +73,7 @@ int hp_rb_delete_key(HP_INFO *info, regi
   int res;
 
   if (flag) 
-  {
     info->last_pos= NULL; /* For heap_rnext/heap_rprev */
-    info->lastkey_len= 0;
-  }
 
   custom_arg.keyseg= keyinfo->seg;
   custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos);
diff -Nrup a/heap/hp_rfirst.c b/heap/hp_rfirst.c
--- a/heap/hp_rfirst.c	2004-11-22 17:53:12 +04:00
+++ b/heap/hp_rfirst.c	2007-08-30 23:47:03 +05:00
@@ -36,6 +36,17 @@ int heap_rfirst(HP_INFO *info, byte *rec
 	     sizeof(byte*));
       info->current_ptr = pos;
       memcpy(record, pos, (size_t)share->reclength);
+      /*
+        If we're performing index_first on a table that was taken from
+        table cache, info->lastkey_len and info->last_find_flag are
+        initialized to previous query. Thus we set info->last_find_flag
+        and info->lastkey_len to proper values for subsequent heap_rnext()
+        calls.
+        This is needed for DELETE queries only, otherwise these variables
+        are unused.
+      */
+      info->last_find_flag= HA_READ_KEY_OR_NEXT;
+      info->lastkey_len= 0;
       info->update = HA_STATE_AKTIV;
     }
     else
diff -Nrup a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result
--- a/mysql-test/r/heap_btree.result	2007-03-28 11:51:10 +05:00
+++ b/mysql-test/r/heap_btree.result	2007-08-30 23:47:03 +05:00
@@ -307,4 +307,11 @@ UNIQUE USING BTREE(c1)
 ) ENGINE= MEMORY DEFAULT CHARSET= utf8;
 INSERT INTO t1 VALUES('1'), ('2');
 DROP TABLE t1;
+CREATE TABLE t1 (a INT, KEY USING BTREE(a)) ENGINE=MEMORY;
+INSERT INTO t1 VALUES(1),(2),(2);
+DELETE FROM t1 WHERE a=2;
+SELECT * FROM t1;
+a
+1
+DROP TABLE t1;
 End of 4.1 tests
diff -Nrup a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test
--- a/mysql-test/t/heap_btree.test	2007-03-28 11:51:10 +05:00
+++ b/mysql-test/t/heap_btree.test	2007-08-30 23:47:03 +05:00
@@ -213,4 +213,13 @@ CREATE TABLE t1 (
 INSERT INTO t1 VALUES('1'), ('2');
 DROP TABLE t1;
 
+#
+# BUG#30590 - delete from memory table with composite btree primary key
+#
+CREATE TABLE t1 (a INT, KEY USING BTREE(a)) ENGINE=MEMORY;
+INSERT INTO t1 VALUES(1),(2),(2);
+DELETE FROM t1 WHERE a=2;
+SELECT * FROM t1;
+DROP TABLE t1;
+
 --echo End of 4.1 tests
Thread
bk commit into 4.1 tree (svoj:1.2680) BUG#30590Sergey Vojtovich30 Aug
  • Re: bk commit into 4.1 tree (svoj:1.2680) BUG#30590Ingo Strüwing3 Sep