From c2bc987d4fd1286c7d4ea2e511d4b118aebfc552 Mon Sep 17 00:00:00 2001 From: AndreyDeev Date: Thu, 14 Dec 2023 21:57:48 +0400 Subject: [PATCH] #2146 Add check for Next/Prev length for IndexNode when searching for index in IndexService.Find --- LiteDB/Engine/Services/IndexService.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/LiteDB/Engine/Services/IndexService.cs b/LiteDB/Engine/Services/IndexService.cs index f47a0fad3..6cc600106 100644 --- a/LiteDB/Engine/Services/IndexService.cs +++ b/LiteDB/Engine/Services/IndexService.cs @@ -347,7 +347,7 @@ public IndexNode Find(CollectionIndex index, BsonValue value, bool sibling, int for (int i = index.MaxLevel - 1; i >= 0; i--) { - for (; cur.GetNextPrev((byte)i, order).IsEmpty == false; cur = this.GetNode(cur.GetNextPrev((byte)i, order))) + for (; NextPrevContaintsData(cur, (byte)i, order); cur = this.GetNode(cur.GetNextPrev((byte)i, order))) { var next = this.GetNode(cur.GetNextPrev((byte)i, order)); var diff = next.Key.CompareTo(value, _collation); @@ -368,6 +368,21 @@ public IndexNode Find(CollectionIndex index, BsonValue value, bool sibling, int } return null; + + bool NextPrevContaintsData(IndexNode current, byte level, int orderValue) + { + var nextPrevLength = orderValue == Query.Ascending + ? current.Next.Length + : current.Prev.Length; + + // TODO need to check why some index node stored at this level does not have expected Next and Prev items + if (nextPrevLength <= level) + { + return false; + } + + return current.GetNextPrev(level, order).IsEmpty == false; + } } #endregion