ITS#7913 mdb_cursor_get(*_DUP) cleanup

FIRST_DUP/LAST_DUP should succeed even on non-duplicate values
PREV_DUP should reset cursor's EOF flag.
vl32
Howard Chu 10 years ago
parent 3630066843
commit 8498c6cba2
  1. 13
      libraries/liblmdb/mdb.c

@ -5355,8 +5355,10 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
if (op == MDB_PREV || op == MDB_PREV_DUP) { if (op == MDB_PREV || op == MDB_PREV_DUP) {
rc = mdb_cursor_prev(&mc->mc_xcursor->mx_cursor, data, NULL, MDB_PREV); rc = mdb_cursor_prev(&mc->mc_xcursor->mx_cursor, data, NULL, MDB_PREV);
if (op != MDB_PREV || rc != MDB_NOTFOUND) { if (op != MDB_PREV || rc != MDB_NOTFOUND) {
if (rc == MDB_SUCCESS) if (rc == MDB_SUCCESS) {
MDB_GET_KEY(leaf, key); MDB_GET_KEY(leaf, key);
mc->mc_flags &= ~C_EOF;
}
return rc; return rc;
} }
} else { } else {
@ -5833,6 +5835,15 @@ fetchm:
rc = MDB_INCOMPATIBLE; rc = MDB_INCOMPATIBLE;
break; break;
} }
{
MDB_node *leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
MDB_GET_KEY(leaf, key);
if (data)
rc = mdb_node_read(mc->mc_txn, leaf, data);
break;
}
}
if (!(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)) { if (!(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)) {
rc = EINVAL; rc = EINVAL;
break; break;

Loading…
Cancel
Save