From d94f34b2c0f9575e8fce0b7affff41d756bd1e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Sun, 12 Nov 2023 16:33:13 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20`MDBX=5FGET=5FMULTIPLE`=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20`key`=20=D0=BD?= =?UTF-8?q?=D0=B0=20`NULL`=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/core.c b/src/core.c index 8c679971..72447fc6 100644 --- a/src/core.c +++ b/src/core.c @@ -16909,24 +16909,30 @@ static __hot int cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data, return MDBX_EINVAL; if (unlikely((mc->mc_db->md_flags & MDBX_DUPFIXED) == 0)) return MDBX_INCOMPATIBLE; - rc = (mc->mc_flags & C_INITIALIZED) - ? MDBX_SUCCESS - : cursor_set(mc, key, data, MDBX_SET).err; - if ((mc->mc_xcursor->mx_cursor.mc_flags & (C_INITIALIZED | C_EOF)) != - C_INITIALIZED) + if ((mc->mc_flags & C_INITIALIZED) == 0) { + if (unlikely(!key)) + return MDBX_EINVAL; + rc = cursor_set(mc, key, data, MDBX_SET).err; + if (unlikely(rc != MDBX_SUCCESS)) + break; + } + rc = MDBX_SUCCESS; + if (unlikely(C_INITIALIZED != (mc->mc_xcursor->mx_cursor.mc_flags & + (C_INITIALIZED | C_EOF)))) { + rc = MDBX_NOTFOUND; break; - goto fetchm; + } + goto fetch_multiple; case MDBX_NEXT_MULTIPLE: - if (unlikely(data == NULL)) + if (unlikely(!data)) return MDBX_EINVAL; if (unlikely(!(mc->mc_db->md_flags & MDBX_DUPFIXED))) return MDBX_INCOMPATIBLE; rc = cursor_next(mc, key, data, MDBX_NEXT_DUP); if (rc == MDBX_SUCCESS) { if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) { - MDBX_cursor *mx; - fetchm: - mx = &mc->mc_xcursor->mx_cursor; + fetch_multiple:; + MDBX_cursor *mx = &mc->mc_xcursor->mx_cursor; data->iov_len = page_numkeys(mx->mc_pg[mx->mc_top]) * mx->mc_db->md_xsize; data->iov_base = page_data(mx->mc_pg[mx->mc_top]); @@ -16937,21 +16943,20 @@ static __hot int cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data, } break; case MDBX_PREV_MULTIPLE: - if (data == NULL) + if (unlikely(!data)) return MDBX_EINVAL; if (!(mc->mc_db->md_flags & MDBX_DUPFIXED)) return MDBX_INCOMPATIBLE; rc = MDBX_SUCCESS; - if (!(mc->mc_flags & C_INITIALIZED)) + if ((mc->mc_flags & C_INITIALIZED) == 0) rc = cursor_last(mc, key, data); if (rc == MDBX_SUCCESS) { MDBX_cursor *mx = &mc->mc_xcursor->mx_cursor; + rc = MDBX_NOTFOUND; if (mx->mc_flags & C_INITIALIZED) { rc = cursor_sibling(mx, SIBLING_LEFT); if (rc == MDBX_SUCCESS) - goto fetchm; - } else { - rc = MDBX_NOTFOUND; + goto fetch_multiple; } } break;