diff --git a/iterator.go b/iterator.go index d03908892..b49c35c91 100644 --- a/iterator.go +++ b/iterator.go @@ -228,8 +228,11 @@ func (iter *Iterator) Next() { } node, err := iter.t.next() - // TODO: double-check if this error is correctly handled. + // If an error occurred or no more nodes, update iterator state accordingly if node == nil || err != nil { + if err != nil { + iter.err = err + } iter.t = nil iter.valid = false return diff --git a/iterator_test.go b/iterator_test.go index 06262d502..92f6cc723 100644 --- a/iterator_test.go +++ b/iterator_test.go @@ -381,3 +381,31 @@ func syncMapCount(m *sync.Map) int { }) return count } + +func TestIterator_Next_ErrorHandling(t *testing.T) { + db := dbm.NewMemDB() + ndb := newNodeDB(db, 0, DefaultOptions(), NewNopLogger()) + tree := &ImmutableTree{ndb: ndb} + + // Create a branch node with a left child key that does not exist in the DB + node := &Node{ + key: []byte("err"), + leftNodeKey: []byte("missing"), // triggers GetNode error + rightNodeKey: nil, + subtreeHeight: 1, + } + tree.root = node + + iter := &Iterator{ + start: nil, + end: nil, + valid: true, + t: node.newTraversal(tree, nil, nil, true, false, false), + } + + iter.Next() + + require.False(t, iter.Valid(), "iterator should be invalid after error") + require.Error(t, iter.Error(), "iterator should have error set") + require.Contains(t, iter.Error().Error(), "node does not have a nodeKey") +}