diff --git a/ChangeLog.md b/ChangeLog.md index 3e7c2c7e..e16aea42 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,7 +10,10 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic - Max за сообщение о проблеме ERROR_SHARING_VIOLATION в режиме MDBX_EXCLUSIVE на Windows. - - Alisher Ashyrov https://t.me/a1is43ras4 за сообщение о проблеме с assert-проверкой и содействие в отладке. + - Alisher Ashyrov за сообщение о проблеме + с assert-проверкой и содействие в отладке. + - Masatoshi Fukunaga за сообщение о проблеме + `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" документации. + - Устранение проблемы `put(MDBX_UPSERT+MDBX_ALLDUPS)` для случая замены + всех значений единственного ключа в subDb. В ходе этой операции subDb + становится полностью пустой, без каких-либо страниц и именно эта + ситуация не была учтена в коде, что приводило к повреждению БД + при фиксации такой транзакции. + Ликвидация технических долгов и мелочи: - Исправление опечаток. diff --git a/src/core.c b/src/core.c index 94adb823..4eb57d6f 100644 --- a/src/core.c +++ b/src/core.c @@ -17275,7 +17275,7 @@ static __hot int cursor_put_nochecklen(MDBX_cursor *mc, const MDBX_val *key, if (unlikely(err != MDBX_SUCCESS)) return err; flags -= MDBX_ALLDUPS; - rc = MDBX_NOTFOUND; + rc = mc->mc_snum ? MDBX_NOTFOUND : MDBX_NO_ROOT; exact = false; } else if (!(flags & (MDBX_RESERVE | MDBX_MULTIPLE))) { /* checking for early exit without dirtying pages */