From 9d9ca950a87f21d0e67f50ba6a268d5d2c1e3de1 Mon Sep 17 00:00:00 2001 From: Preetam Jinka Date: Sat, 28 Jan 2017 01:37:48 -0500 Subject: [PATCH] Fix seek bug (#24) --- cursor.go | 4 ++-- lm2_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/cursor.go b/cursor.go index cc822b2..85711f6 100644 --- a/cursor.go +++ b/cursor.go @@ -142,7 +142,7 @@ func (c *Cursor) Seek(key string) { c.first = true for rec != nil { rec.lock.RLock() - if rec.Key > key { + if rec.Key >= key { if (rec.Deleted > 0 && rec.Deleted <= c.snapshot) || (rec.Offset >= c.snapshot) { oldRec := rec rec = c.collection.nextRecord(rec) @@ -159,7 +159,7 @@ func (c *Cursor) Seek(key string) { oldRec.lock.RUnlock() continue } - if rec.Key <= key { + if rec.Key < key { c.current = rec } oldRec := rec diff --git a/lm2_test.go b/lm2_test.go index b199365..3570c9b 100644 --- a/lm2_test.go +++ b/lm2_test.go @@ -610,3 +610,49 @@ func TestDeleteInFirstUpdate(t *testing.T) { t.Fatal(err) } } + +func TestSeekOverwrittenKey(t *testing.T) { + c, err := NewCollection("/tmp/test_seekoverwrittenkey.lm2", 100) + if err != nil { + t.Fatal(err) + } + defer c.Destroy() + + wb := NewWriteBatch() + wb.Set("committed", "0") + wb.Delete("pending") + _, err = c.Update(wb) + if err != nil { + t.Fatal(err) + } + + wb = NewWriteBatch() + wb.Set("1", "a") + wb.Set("pending", "1") + _, err = c.Update(wb) + if err != nil { + t.Fatal(err) + } + + wb = NewWriteBatch() + wb.Set("committed", "1") + wb.Delete("pending") + _, err = c.Update(wb) + if err != nil { + t.Fatal(err) + } + + cur, err := c.NewCursor() + if err != nil { + t.Fatal(err) + } + + cur.Seek("committed") + if !cur.Next() { + t.Fatal("expected cur.Next() to return true") + } + + if cur.Key() != "committed" { + t.Fatalf("expected cur.Key() to be %s, got %s", "committed", cur.Key()) + } +}