mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-16 01:24:30 +08:00
mdbx: исправление регресса состояния dupsort-курсора после cursor_put(APPEND)
.
При добавлении нового ключа в append-режиме, в случае когда в текущей (последней) позиции с ключом связаны несколько значений и (соответственно) вложенный dupsort-курсор инициализирован, вставка происходила без сброса вложенного курсора. В результате вложенный курсор логически оставался стоять на multivalue-данных связанных с предыдущей позицией основного курсора, т.е. переходил в неконсистентное состояние. Ошибка проявлялась возвратом неверных значений из mdbx_cursor_count() или срабатывание assert-проверки в отладочных сборках.
This commit is contained in:
parent
c66dac50c3
commit
a845522db7
17
src/cursor.c
17
src/cursor.c
@ -898,13 +898,16 @@ __hot int cursor_put(MDBX_cursor *mc, const MDBX_val *key, MDBX_val *data, unsig
|
|||||||
if (insert_key) {
|
if (insert_key) {
|
||||||
/* The key does not exist */
|
/* The key does not exist */
|
||||||
DEBUG("inserting key at index %i", mc->ki[mc->top]);
|
DEBUG("inserting key at index %i", mc->ki[mc->top]);
|
||||||
if ((mc->tree->flags & MDBX_DUPSORT) && node_size(key, data) > env->leaf_nodemax) {
|
if (mc->tree->flags & MDBX_DUPSORT) {
|
||||||
/* Too big for a node, insert in sub-DB. Set up an empty
|
inner_gone(mc);
|
||||||
* "old sub-page" for convert_to_subtree to expand to a full page. */
|
if (node_size(key, data) > env->leaf_nodemax) {
|
||||||
fp->dupfix_ksize = (mc->tree->flags & MDBX_DUPFIXED) ? (uint16_t)data->iov_len : 0;
|
/* Too big for a node, insert in sub-DB. Set up an empty
|
||||||
fp->lower = fp->upper = 0;
|
* "old sub-page" for convert_to_subtree to expand to a full page. */
|
||||||
old_data.iov_len = PAGEHDRSZ;
|
fp->dupfix_ksize = (mc->tree->flags & MDBX_DUPFIXED) ? (uint16_t)data->iov_len : 0;
|
||||||
goto convert_to_subtree;
|
fp->lower = fp->upper = 0;
|
||||||
|
old_data.iov_len = PAGEHDRSZ;
|
||||||
|
goto convert_to_subtree;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* there's only a key anyway, so this is a no-op */
|
/* there's only a key anyway, so this is a no-op */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user