mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 01:34:12 +08:00
mdbx: исправление put(MDBX_UPSERT+MDBX_ALLDUPS)
для случая замены всех значений в subDb.
Fixed cursor_put_nochecklen() internals for case when dupsort'ed named subDb contains a single key with multiple values (aka duplicates), which are replaced with a single value by put-operation with the `MDBX_UPSERT+MDBX_ALLDUPS` flags. In this case, the database becomes completely empty, without any pages. However exactly this condition was not considered and thus wasn't handled correctly. Fixes https://gitflic.ru/project/erthink/libmdbx/issue/8 Thanks Masatoshi Fukunaga <https://gitflic.ru/user/mah0x211> for reporting.
This commit is contained in:
parent
209f784ee7
commit
fb827959a9
11
ChangeLog.md
11
ChangeLog.md
@ -10,7 +10,10 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic
|
|||||||
|
|
||||||
- Max <maxc0d3r@protonmail.com> за сообщение о проблеме ERROR_SHARING_VIOLATION
|
- Max <maxc0d3r@protonmail.com> за сообщение о проблеме ERROR_SHARING_VIOLATION
|
||||||
в режиме MDBX_EXCLUSIVE на Windows.
|
в режиме MDBX_EXCLUSIVE на Windows.
|
||||||
- Alisher Ashyrov https://t.me/a1is43ras4 за сообщение о проблеме с assert-проверкой и содействие в отладке.
|
- Alisher Ashyrov <https://t.me/a1is43ras4> за сообщение о проблеме
|
||||||
|
с assert-проверкой и содействие в отладке.
|
||||||
|
- Masatoshi Fukunaga <https://gitflic.ru/user/mah0x211> за сообщение о проблеме
|
||||||
|
`put(MDBX_UPSERT+MDBX_ALLDUPS)` для случая замены всех значений в subDb.
|
||||||
|
|
||||||
Исправления (без корректировок новых функций):
|
Исправления (без корректировок новых функций):
|
||||||
|
|
||||||
@ -31,6 +34,12 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic
|
|||||||
|
|
||||||
- Исправление copy&paste опечатки в разделе "Getting started" документации.
|
- Исправление copy&paste опечатки в разделе "Getting started" документации.
|
||||||
|
|
||||||
|
- Устранение проблемы `put(MDBX_UPSERT+MDBX_ALLDUPS)` для случая замены
|
||||||
|
всех значений единственного ключа в subDb. В ходе этой операции subDb
|
||||||
|
становится полностью пустой, без каких-либо страниц и именно эта
|
||||||
|
ситуация не была учтена в коде, что приводило к повреждению БД
|
||||||
|
при фиксации такой транзакции.
|
||||||
|
|
||||||
Ликвидация технических долгов и мелочи:
|
Ликвидация технических долгов и мелочи:
|
||||||
|
|
||||||
- Исправление опечаток.
|
- Исправление опечаток.
|
||||||
|
@ -17275,7 +17275,7 @@ static __hot int cursor_put_nochecklen(MDBX_cursor *mc, const MDBX_val *key,
|
|||||||
if (unlikely(err != MDBX_SUCCESS))
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
return err;
|
return err;
|
||||||
flags -= MDBX_ALLDUPS;
|
flags -= MDBX_ALLDUPS;
|
||||||
rc = MDBX_NOTFOUND;
|
rc = mc->mc_snum ? MDBX_NOTFOUND : MDBX_NO_ROOT;
|
||||||
exact = false;
|
exact = false;
|
||||||
} else if (!(flags & (MDBX_RESERVE | MDBX_MULTIPLE))) {
|
} else if (!(flags & (MDBX_RESERVE | MDBX_MULTIPLE))) {
|
||||||
/* checking for early exit without dirtying pages */
|
/* checking for early exit without dirtying pages */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user