diff options
author | unknown <svoj@april.(none)> | 2006-04-19 15:13:50 +0500 |
---|---|---|
committer | unknown <svoj@april.(none)> | 2006-04-19 15:13:50 +0500 |
commit | 4441e34e38acc430a229844a85756891221068a4 (patch) | |
tree | 5bb95b29ccad280aca995617952fa4dd8c747dc3 /heap | |
parent | 8077c693a60bc9b5d0d0fee19712e9dcda5cc5ff (diff) | |
download | mariadb-git-4441e34e38acc430a229844a85756891221068a4.tar.gz |
BUG#18160 - Memory-/HEAP Table endless growing indexes
Updating data in HEAP table with BTREE index results in wrong index_length
counter value, which keeps growing after each update.
When inserting new record into tree counter is incremented by:
sizeof(TREE_ELEMENT) + key_size + tree->size_of_element
But when deleting element from tree it doesn't decrement counter by key_size:
sizeof(TREE_ELEMENT) + tree->size_of_element
This fix makes accurate allocated memory counter for tree. That is
decrease counter by key_size when deleting tree element.
heap/hp_delete.c:
Added size of the key to tree_delete() for accurate allocated memory counter.
include/my_tree.h:
Added size of the key to tree_delete() for accurate allocated memory counter.
myisam/myisamlog.c:
Added size of the key to tree_delete() for accurate allocated memory counter.
mysql-test/r/heap_btree.result:
Testcase for BUG#18160.
mysql-test/t/heap_btree.test:
Testcase for BUG#18160.
mysys/tree.c:
Added size of the key to tree_delete() for accurate allocated memory counter.
Note that this size is optional. If one doesn't need precise counter it is safe
to pass 0 as key_size.
Diffstat (limited to 'heap')
-rw-r--r-- | heap/hp_delete.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/heap/hp_delete.c b/heap/hp_delete.c index 2d94418a1bf..f37db2588f3 100644 --- a/heap/hp_delete.c +++ b/heap/hp_delete.c @@ -79,7 +79,8 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); custom_arg.search_flag= SEARCH_SAME; old_allocated= keyinfo->rb_tree.allocated; - res= tree_delete(&keyinfo->rb_tree, info->recbuf, &custom_arg); + res= tree_delete(&keyinfo->rb_tree, info->recbuf, custom_arg.key_length, + &custom_arg); info->s->index_length-= (old_allocated - keyinfo->rb_tree.allocated); return res; } |