mdbx: fix LEAF2-pages handling in mdb_cursor_count().

This commit is contained in:
Leo Yuriev 2017-01-31 18:30:32 +03:00
parent 7bf9d381ee
commit d3518bf75b
2 changed files with 12 additions and 23 deletions

11
mdb.c
View File

@ -7914,17 +7914,14 @@ mdb_cursor_count(MDB_cursor *mc, size_t *countp)
return MDB_NOTFOUND; return MDB_NOTFOUND;
} }
if (mc->mc_xcursor == NULL || IS_LEAF2(mp)) {
*countp = 1; *countp = 1;
} else { if (mc->mc_xcursor != NULL) {
MDB_node *leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]); MDB_node *leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
*countp = 1; mdb_cassert(mc, mc->mc_xcursor && (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED));
else if (unlikely(!(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)))
return EINVAL;
else
*countp = mc->mc_xcursor->mx_db.md_entries; *countp = mc->mc_xcursor->mx_db.md_entries;
} }
}
#else #else
if (unlikely(mc->mc_xcursor == NULL)) if (unlikely(mc->mc_xcursor == NULL))
return MDB_INCOMPATIBLE; return MDB_INCOMPATIBLE;

18
mdbx.c
View File

@ -547,24 +547,16 @@ mdbx_get_ex(MDB_txn *txn, MDB_dbi dbi,
} }
if (values_count) { if (values_count) {
if (mc.mc_xcursor == NULL)
*values_count = 1; *values_count = 1;
else { if (mc.mc_xcursor != NULL) {
MDB_page *mp = mc.mc_pg[mc.mc_top]; MDB_node *leaf = NODEPTR(mc.mc_pg[mc.mc_top], mc.mc_ki[mc.mc_top]);
if (IS_LEAF2(mp)) if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
*values_count = 1; mdb_tassert(txn, mc.mc_xcursor == &mx
else { && (mx.mx_cursor.mc_flags & C_INITIALIZED));
MDB_node *leaf = NODEPTR(mp, mc.mc_ki[mc.mc_top]);
if (!F_ISSET(leaf->mn_flags, F_DUPDATA))
*values_count = 1;
else {
mdb_tassert(txn, mc.mc_xcursor == &mx);
mdb_tassert(txn, mx.mx_cursor.mc_flags & C_INITIALIZED);
*values_count = mx.mx_db.md_entries; *values_count = mx.mx_db.md_entries;
} }
} }
} }
}
return MDB_SUCCESS; return MDB_SUCCESS;
} }