Merge rkalimullin@work.mysql.com:/home/bk/mysql-4.1

into mysql.r18.ru:/usr/home/ram/mysql-4.1
This commit is contained in:
unknown 2002-11-28 14:04:39 +04:00
commit 683d777ad8

View File

@ -336,12 +336,11 @@ void *tree_search_key(TREE *tree, const void *key,
{ {
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;
@ -354,18 +353,25 @@ void *tree_search_key(TREE *tree, const void *key,
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:
case HA_READ_BEFORE_KEY:
last_equal_element= parents; last_equal_element= parents;
cmp= 1; cmp= 1;
break; 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 */
{ {
last_right_step_parent= parents;
element= element->right; element= element->right;
} }
else else
@ -376,6 +382,7 @@ void *tree_search_key(TREE *tree, const void *key,
} }
switch (flag) { switch (flag) {
case HA_READ_KEY_EXACT: case HA_READ_KEY_EXACT:
case HA_READ_PREFIX_LAST:
*last_pos= last_equal_element; *last_pos= last_equal_element;
break; break;
case HA_READ_KEY_OR_NEXT: case HA_READ_KEY_OR_NEXT:
@ -384,6 +391,12 @@ void *tree_search_key(TREE *tree, const void *key,
case HA_READ_AFTER_KEY: case HA_READ_AFTER_KEY:
*last_pos= last_left_step_parent; *last_pos= last_left_step_parent;
break; 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;
default: default:
return NULL; return NULL;
} }