From f0ec2a822f88da69fd1ff607a87713637c79d222 Mon Sep 17 00:00:00 2001 From: Maciej Aszyk Date: Tue, 23 Apr 2024 13:22:10 +0200 Subject: [PATCH] RavenDB-22311 Alphanumerical sorter - index out of range exception fix --- .../AlphaNumericFieldComparator.cs | 4 +-- test/SlowTests/Issues/RavenDB-22311.cs | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 test/SlowTests/Issues/RavenDB-22311.cs diff --git a/src/Raven.Server/Documents/Queries/Sorting/AlphaNumeric/AlphaNumericFieldComparator.cs b/src/Raven.Server/Documents/Queries/Sorting/AlphaNumeric/AlphaNumericFieldComparator.cs index 8adfc58afc8c..072a97784f29 100644 --- a/src/Raven.Server/Documents/Queries/Sorting/AlphaNumeric/AlphaNumericFieldComparator.cs +++ b/src/Raven.Server/Documents/Queries/Sorting/AlphaNumeric/AlphaNumericFieldComparator.cs @@ -150,7 +150,7 @@ private unsafe void ScanNextAlphabeticOrNumericSequence() { CurrentSequenceStartPosition = GetStartPosition(); Span characters = stackalloc char[4]; - var (usedBytes, usedChars) = ReadCharacter(CurrentPositionInString, characters); + var (usedBytes, usedChars) = ReadCharacter(StringBufferOffset, characters); _currentSequenceIsNumber = usedChars == 1 && char.IsDigit(characters[0]); NumberLength = 0; @@ -180,7 +180,7 @@ private unsafe void ScanNextAlphabeticOrNumericSequence() if (CurrentPositionInString < _stringLength) { - (usedBytes, usedChars) = ReadCharacter(CurrentPositionInString, characters); + (usedBytes, usedChars) = ReadCharacter(StringBufferOffset, characters); currentCharacterIsDigit = usedChars == 1 && char.IsDigit(characters[0]); } else diff --git a/test/SlowTests/Issues/RavenDB-22311.cs b/test/SlowTests/Issues/RavenDB-22311.cs new file mode 100644 index 000000000000..fe886ff73b0e --- /dev/null +++ b/test/SlowTests/Issues/RavenDB-22311.cs @@ -0,0 +1,35 @@ +ο»Ώusing System.Linq; +using FastTests; +using Raven.Client.Documents; +using Raven.Client.Documents.Session; +using Tests.Infrastructure; +using Tests.Infrastructure.Entities; +using Xunit; +using Xunit.Abstractions; + +namespace SlowTests.Issues; + +public class RavenDB_22311 : RavenTestBase +{ + public RavenDB_22311(ITestOutputHelper output) : base(output) + { + } + + [RavenFact(RavenTestCategory.Lucene | RavenTestCategory.Querying)] + public void AlphanumericalWillShiftWithGoodOffsetSize() + { + using var store = GetDocumentStore(Options.ForSearchEngine(RavenSearchEngineMode.Lucene)); + using var session = store.OpenSession(); + session.Store(new Order(){Company = "πŸš€1t"}); + session.Store(new Order(){Company = "πŸš€1"}); + session.SaveChanges(); + + var result = session.Query() + .Customize(c => c.WaitForNonStaleResults()) + .OrderBy(x => x.Company, OrderingType.AlphaNumeric) + .ToList(); + + Assert.Equal("πŸš€1", result[0].Company); + Assert.Equal("πŸš€1t", result[1].Company); + } +}