Skip to content

Commit 3b48207

Browse files
lastDup no key (#68)
1 parent a7260c4 commit 3b48207

2 files changed

Lines changed: 71 additions & 2 deletions

File tree

mdbx/cursor.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ func (c *Cursor) Get(setkey, setval []byte, op uint) (key, val []byte, err error
162162
key = p
163163
}
164164
} else {
165-
key = c.txn.bytes(c.txn.key)
165+
if op != LastDup {
166+
key = c.txn.bytes(c.txn.key)
167+
}
166168
}
167169
val = c.txn.bytes(c.txn.val)
168170

mdbx/cursor_test.go

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,73 @@ func FromHex(in string) []byte {
270270
return out
271271
}
272272

273+
func TestLastDup(t *testing.T) {
274+
env := setup(t)
275+
276+
var dbi DBI
277+
err := env.Update(func(txn *Txn) (err error) {
278+
dbi, err = txn.OpenDBI("testdb", Create|DupSort, nil, nil)
279+
if err != nil {
280+
return err
281+
}
282+
283+
err = txn.Put(dbi, []byte("key1"), []byte("value1.1"), 0)
284+
if err != nil {
285+
return err
286+
}
287+
err = txn.Put(dbi, []byte("key3"), []byte("value3.1"), 0)
288+
if err != nil {
289+
return err
290+
}
291+
err = txn.Put(dbi, []byte("key1"), []byte("value1.3"), 0)
292+
if err != nil {
293+
return err
294+
}
295+
err = txn.Put(dbi, []byte("key3"), []byte("value3.3"), 0)
296+
if err != nil {
297+
return err
298+
}
299+
300+
return nil
301+
})
302+
if err != nil {
303+
t.Fatal(err)
304+
}
305+
306+
err = env.View(func(txn *Txn) error {
307+
txn.RawRead = true
308+
c, err := txn.OpenCursor(dbi)
309+
if err != nil {
310+
return err
311+
}
312+
defer c.Close()
313+
314+
i := 0
315+
for k, _, err := c.Get(nil, nil, First); k != nil; k, _, err = c.Get(nil, nil, NextNoDup) {
316+
if err != nil {
317+
return err
318+
}
319+
i++
320+
_, v, err := c.Get(nil, nil, LastDup)
321+
if err != nil {
322+
return err
323+
}
324+
if i == 1 && string(v) != "value1.3" {
325+
t.Fail()
326+
}
327+
if i == 2 && string(v) != "value3.3" {
328+
t.Fail()
329+
}
330+
}
331+
332+
return nil
333+
})
334+
if err != nil {
335+
t.Fatal(err)
336+
}
337+
338+
}
339+
273340
func TestDupCmpExcludeSuffix32(t *testing.T) {
274341
hash32Bytes := FromHex("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
275342
env := setup(t)
@@ -360,7 +427,7 @@ func TestDupCmpExcludeSuffix32(t *testing.T) {
360427
if !bytes.Equal(v, append([]byte{0}, hash32Bytes...)) {
361428
t.Errorf("unexpected order: %x (not %x)", v, append([]byte{0}, hash32Bytes...))
362429
}
363-
_, v, err = cur.Get(nil, nil, NextDup)
430+
_, v, err = cur.Get(nil, nil, LastDup)
364431
if err != nil {
365432
return err
366433
}

0 commit comments

Comments
 (0)