|
|
|
@ -33,11 +33,40 @@ int heap_rnext(HP_INFO *info, uchar *record) |
|
|
|
heap_rb_param custom_arg; |
|
|
|
|
|
|
|
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, |
|
|
|
offsetof(TREE_ELEMENT, left), |
|
|
|
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 |
|
|
|
{ |
|
|
|
/* |
|
|
|
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.key_length = info->lastkey_len; |
|
|
|
custom_arg.search_flag = SEARCH_SAME | SEARCH_FIND; |
|
|
|
|