Commit 57321e64 authored by unknown's avatar unknown

support for HA_READ_PREFIX_LAST_OR_PREV, HA_READ_PREFIX_LAST and HA_READ_BEFORE_KEY

parent 5a1b9e1d
...@@ -335,54 +335,67 @@ void *tree_search_key(TREE *tree, const void *key, ...@@ -335,54 +335,67 @@ void *tree_search_key(TREE *tree, const void *key,
enum ha_rkey_function flag, void *custom_arg) enum ha_rkey_function flag, void *custom_arg)
{ {
int cmp; int cmp;
TREE_ELEMENT *element = tree->root; TREE_ELEMENT *element= tree->root;
TREE_ELEMENT **last_left_step_parent = NULL; TREE_ELEMENT **last_left_step_parent= NULL, **last_right_step_parent= NULL;
TREE_ELEMENT **last_equal_element = NULL; TREE_ELEMENT **last_equal_element= NULL;
/* /*
TODO: handle HA_READ_KEY_OR_PREV, HA_READ_BEFORE_KEY, HA_READ_PREFIX, TODO: support for HA_READ_KEY_OR_PREV, HA_READ_PREFIX flags if needed.
HA_READ_PREFIX_LAST flags if needed.
*/ */
*parents = &tree->null_element; *parents = &tree->null_element;
while (element != &tree->null_element) while (element != &tree->null_element)
{ {
*++parents = element; *++parents= element;
if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element), if ((cmp= (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element),
key)) == 0) key)) == 0)
{ {
switch (flag) { switch (flag) {
case HA_READ_KEY_EXACT: case HA_READ_KEY_EXACT:
case HA_READ_KEY_OR_NEXT: case HA_READ_KEY_OR_NEXT:
last_equal_element = parents; case HA_READ_BEFORE_KEY:
cmp = 1; last_equal_element= parents;
break; cmp= 1;
break;
case HA_READ_AFTER_KEY: case HA_READ_AFTER_KEY:
cmp = -1; cmp= -1;
break; break;
case HA_READ_PREFIX_LAST:
case HA_READ_PREFIX_LAST_OR_PREV:
last_equal_element= parents;
cmp= -1;
break;
default: default:
return NULL; return NULL;
} }
} }
if (cmp < 0) /* element < key */ if (cmp < 0) /* element < key */
{ {
element = element->right; last_right_step_parent= parents;
element= element->right;
} }
else else
{ {
last_left_step_parent = parents; last_left_step_parent= parents;
element = element->left; element= element->left;
} }
} }
switch (flag) { switch (flag) {
case HA_READ_KEY_EXACT: case HA_READ_KEY_EXACT:
*last_pos = last_equal_element; case HA_READ_PREFIX_LAST:
*last_pos= last_equal_element;
break; break;
case HA_READ_KEY_OR_NEXT: case HA_READ_KEY_OR_NEXT:
*last_pos = last_equal_element ? last_equal_element : last_left_step_parent; *last_pos= last_equal_element ? last_equal_element : last_left_step_parent;
break; break;
case HA_READ_AFTER_KEY: case HA_READ_AFTER_KEY:
*last_pos = last_left_step_parent; *last_pos= last_left_step_parent;
break;
case HA_READ_PREFIX_LAST_OR_PREV:
*last_pos= last_equal_element ? last_equal_element : last_right_step_parent;
break;
case HA_READ_BEFORE_KEY:
*last_pos= last_right_step_parent;
break; break;
default: default:
return NULL; return NULL;
......
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