diff options
author | bar@gw.udmsearch.izhnet.ru <> | 2002-04-25 13:36:55 +0500 |
---|---|---|
committer | bar@gw.udmsearch.izhnet.ru <> | 2002-04-25 13:36:55 +0500 |
commit | eab2893dac4f2447baf6b1b2b4f70869e974bf44 (patch) | |
tree | 5b8a058772659a40e41e2025e66f79531e604613 /heap/hp_update.c | |
parent | c917658988937899e0c21defd4951b51b6d9ff92 (diff) | |
download | mariadb-git-eab2893dac4f2447baf6b1b2b4f70869e974bf44.tar.gz |
RB-Tree indexes support in HEAP tables
Renamed _hp_func -> hp_func
mi_key_cmp moved to /mysys/my_handler.c
New tests for HEAP tables
Diffstat (limited to 'heap/hp_update.c')
-rw-r--r-- | heap/hp_update.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/heap/hp_update.c b/heap/hp_update.c index 8cf3e4d4b8d..dd47e04ebc2 100644 --- a/heap/hp_update.c +++ b/heap/hp_update.c @@ -20,7 +20,7 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) { - uint key; + HP_KEYDEF *keydef, *end, *p_lastinx; byte *pos; HP_SHARE *share=info->s; DBUG_ENTER("heap_update"); @@ -28,19 +28,20 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) test_active(info); pos=info->current_ptr; - if (info->opt_flag & READ_CHECK_USED && _hp_rectest(info,old)) + if (info->opt_flag & READ_CHECK_USED && hp_rectest(info,old)) DBUG_RETURN(my_errno); /* Record changed */ if (--(share->records) < share->blength >> 1) share->blength>>= 1; share->changed=1; - for (key=0 ; key < share->keys ; key++) + p_lastinx = share->keydef + info->lastinx; + for (keydef = share->keydef, end = keydef + share->keys; keydef < end; + keydef++) { - if (_hp_rec_key_cmp(share->keydef+key,old,heap_new)) + if (hp_rec_key_cmp(keydef, old, heap_new)) { - if (_hp_delete_key(info,share->keydef+key,old,pos,key == - (uint) info->lastinx) || - _hp_write_key(share,share->keydef+key,heap_new,pos)) - goto err; + if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) || + (*keydef->write_key)(info, keydef, heap_new, pos)) + goto err; } } @@ -51,16 +52,27 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) err: if (my_errno == HA_ERR_FOUND_DUPP_KEY) { - info->errkey=key; - do + info->errkey = keydef - share->keydef; + if (keydef->algorithm == HA_KEY_ALG_BTREE) { - if (_hp_rec_key_cmp(share->keydef+key,old,heap_new)) + /* we don't need to delete non-inserted key from rb-tree */ + if ((*keydef->write_key)(info, keydef, old, pos)) { - if (_hp_delete_key(info,share->keydef+key,heap_new,pos,0) || - _hp_write_key(share,share->keydef+key,old,pos)) + if (++(share->records) == share->blength) share->blength+= share->blength; + DBUG_RETURN(my_errno); + } + keydef--; + } + while (keydef >= share->keydef) + { + if (hp_rec_key_cmp(keydef, old, heap_new)) + { + if ((*keydef->delete_key)(info, keydef, heap_new, pos, 0) || + (*keydef->write_key)(info, keydef, old, pos)) break; } - } while (key-- > 0); + keydef--; + } } if (++(share->records) == share->blength) share->blength+= share->blength; DBUG_RETURN(my_errno); |