Commit ab95dad7 authored by istruewing@stella.local's avatar istruewing@stella.local

Merge stella.local:/home2/mydev/mysql-4.1-amain

into  stella.local:/home2/mydev/mysql-4.1-axmrg
parents e7851316 de7e0c9e
...@@ -73,10 +73,7 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, ...@@ -73,10 +73,7 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo,
int res; int res;
if (flag) if (flag)
{
info->last_pos= NULL; /* For heap_rnext/heap_rprev */ info->last_pos= NULL; /* For heap_rnext/heap_rprev */
info->lastkey_len= 0;
}
custom_arg.keyseg= keyinfo->seg; custom_arg.keyseg= keyinfo->seg;
custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos);
......
...@@ -36,6 +36,17 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx) ...@@ -36,6 +36,17 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx)
sizeof(byte*)); sizeof(byte*));
info->current_ptr = pos; info->current_ptr = pos;
memcpy(record, pos, (size_t)share->reclength); 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 is initialized to previous query.
Thus we set info->lastkey_len to proper value for subsequent
heap_rnext() calls.
This is needed for DELETE queries only, otherwise this variable is
not used.
Note that the same workaround may be needed for heap_rlast(), but
for now heap_rlast() is never used for DELETE queries.
*/
info->lastkey_len= 0;
info->update = HA_STATE_AKTIV; info->update = HA_STATE_AKTIV;
} }
else else
......
...@@ -34,11 +34,40 @@ int heap_rnext(HP_INFO *info, byte *record) ...@@ -34,11 +34,40 @@ int heap_rnext(HP_INFO *info, byte *record)
heap_rb_param custom_arg; heap_rb_param custom_arg;
if (info->last_pos) if (info->last_pos)
{
/*
We enter this branch for non-DELETE queries after heap_rkey()
or heap_rfirst(). As last key position (info->last_pos) is available,
we only need to climb the tree using tree_search_next().
*/
pos = tree_search_next(&keyinfo->rb_tree, &info->last_pos, pos = tree_search_next(&keyinfo->rb_tree, &info->last_pos,
offsetof(TREE_ELEMENT, left), offsetof(TREE_ELEMENT, left),
offsetof(TREE_ELEMENT, right)); offsetof(TREE_ELEMENT, right));
}
else if (!info->lastkey_len)
{
/*
We enter this branch only for DELETE queries after heap_rfirst(). E.g.
DELETE FROM t1 WHERE a<10. As last key position is not available
(last key is removed by heap_delete()), we must restart search as it
is done in heap_rfirst().
It should be safe to handle this situation without this branch. That is
branch below should find smallest element in a tree as lastkey_len is
zero. tree_search_edge() is a kind of optimisation here as it should be
faster than tree_search_key().
*/
pos= tree_search_edge(&keyinfo->rb_tree, info->parents,
&info->last_pos, offsetof(TREE_ELEMENT, left));
}
else else
{ {
/*
We enter this branch only for DELETE queries after heap_rkey(). E.g.
DELETE FROM t1 WHERE a=10. As last key position is not available
(last key is removed by heap_delete()), we must restart search as it
is done in heap_rkey().
*/
custom_arg.keyseg = keyinfo->seg; custom_arg.keyseg = keyinfo->seg;
custom_arg.key_length = info->lastkey_len; custom_arg.key_length = info->lastkey_len;
custom_arg.search_flag = SEARCH_SAME | SEARCH_FIND; custom_arg.search_flag = SEARCH_SAME | SEARCH_FIND;
......
...@@ -307,4 +307,11 @@ UNIQUE USING BTREE(c1) ...@@ -307,4 +307,11 @@ UNIQUE USING BTREE(c1)
) ENGINE= MEMORY DEFAULT CHARSET= utf8; ) ENGINE= MEMORY DEFAULT CHARSET= utf8;
INSERT INTO t1 VALUES('1'), ('2'); INSERT INTO t1 VALUES('1'), ('2');
DROP TABLE t1; 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 End of 4.1 tests
...@@ -213,4 +213,13 @@ CREATE TABLE t1 ( ...@@ -213,4 +213,13 @@ CREATE TABLE t1 (
INSERT INTO t1 VALUES('1'), ('2'); INSERT INTO t1 VALUES('1'), ('2');
DROP TABLE t1; 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 --echo End of 4.1 tests
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment