Skip to content

Commit c2bc987

Browse files
author
AndreyDeev
committed
#2146 Add check for Next/Prev length for IndexNode when searching for index in IndexService.Find
1 parent 262415a commit c2bc987

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

LiteDB/Engine/Services/IndexService.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ public IndexNode Find(CollectionIndex index, BsonValue value, bool sibling, int
347347

348348
for (int i = index.MaxLevel - 1; i >= 0; i--)
349349
{
350-
for (; cur.GetNextPrev((byte)i, order).IsEmpty == false; cur = this.GetNode(cur.GetNextPrev((byte)i, order)))
350+
for (; NextPrevContaintsData(cur, (byte)i, order); cur = this.GetNode(cur.GetNextPrev((byte)i, order)))
351351
{
352352
var next = this.GetNode(cur.GetNextPrev((byte)i, order));
353353
var diff = next.Key.CompareTo(value, _collation);
@@ -368,6 +368,21 @@ public IndexNode Find(CollectionIndex index, BsonValue value, bool sibling, int
368368
}
369369

370370
return null;
371+
372+
bool NextPrevContaintsData(IndexNode current, byte level, int orderValue)
373+
{
374+
var nextPrevLength = orderValue == Query.Ascending
375+
? current.Next.Length
376+
: current.Prev.Length;
377+
378+
// TODO need to check why some index node stored at this level does not have expected Next and Prev items
379+
if (nextPrevLength <= level)
380+
{
381+
return false;
382+
}
383+
384+
return current.GetNextPrev(level, order).IsEmpty == false;
385+
}
371386
}
372387

373388
#endregion

0 commit comments

Comments
 (0)