diff --git a/internal/unionstore/memdb_arena.go b/internal/unionstore/memdb_arena.go index e92a98e0..921d80f1 100644 --- a/internal/unionstore/memdb_arena.go +++ b/internal/unionstore/memdb_arena.go @@ -343,7 +343,7 @@ func (l *memdbVlog) getSnapshotValue(addr memdbArenaAddr, snap *MemDBCheckpoint) if result.isNull() { return nil, false } - return l.getValue(addr), true + return l.getValue(result), true } func (l *memdbVlog) selectValueHistory(addr memdbArenaAddr, predicate func(memdbArenaAddr) bool) memdbArenaAddr { diff --git a/internal/unionstore/memdb_test.go b/internal/unionstore/memdb_test.go index e5fe2063..0c2852e5 100644 --- a/internal/unionstore/memdb_test.go +++ b/internal/unionstore/memdb_test.go @@ -37,6 +37,7 @@ package unionstore import ( + "context" "encoding/binary" "fmt" "testing" @@ -860,3 +861,38 @@ func TestUnsetTemporaryFlag(t *testing.T) { require.Nil(err) require.False(flags.HasNeedConstraintCheckInPrewrite()) } + +func TestSnapshotGetIter(t *testing.T) { + assert := assert.New(t) + buffer := newMemDB() + var getters []Getter + var iters []Iterator + for i := 0; i < 100; i++ { + assert.Nil(buffer.Set([]byte{byte(0)}, []byte{byte(i)})) + // getter + getter := buffer.SnapshotGetter() + val, err := getter.Get(context.Background(), []byte{byte(0)}) + assert.Nil(err) + assert.Equal(val, []byte{byte(min(i, 50))}) + getters = append(getters, getter) + // iter + iter := buffer.SnapshotIter(nil, nil) + assert.Nil(err) + assert.Equal(iter.Key(), []byte{byte(0)}) + assert.Equal(iter.Value(), []byte{byte(min(i, 50))}) + iter.Close() + iters = append(iters, buffer.SnapshotIter(nil, nil)) + if i == 50 { + _ = buffer.Staging() + } + } + for _, getter := range getters { + val, err := getter.Get(context.Background(), []byte{byte(0)}) + assert.Nil(err) + assert.Equal(val, []byte{byte(50)}) + } + for _, iter := range iters { + assert.Equal(iter.Key(), []byte{byte(0)}) + assert.Equal(iter.Value(), []byte{byte(50)}) + } +}