diff --git a/core/trino-main/src/main/java/io/trino/likematcher/FjsMatcher.java b/core/trino-main/src/main/java/io/trino/likematcher/FjsMatcher.java index 24fee50d8072..365bff87b28a 100644 --- a/core/trino-main/src/main/java/io/trino/likematcher/FjsMatcher.java +++ b/core/trino-main/src/main/java/io/trino/likematcher/FjsMatcher.java @@ -146,7 +146,7 @@ else if (matchEnd >= inputLimit - 1) { j = kmpShifts[j]; // Continue to match the whole pattern using KMP - while (j > 0) { + while (j >= 0) { int size = findLongestMatch(input, i, pattern, j, Math.min(inputLimit - i, pattern.length - j)); i += size; j += size; diff --git a/core/trino-main/src/test/java/io/trino/likematcher/TestLikeMatcher.java b/core/trino-main/src/test/java/io/trino/likematcher/TestLikeMatcher.java index fa0f9d6c38d2..398cf1daba60 100644 --- a/core/trino-main/src/test/java/io/trino/likematcher/TestLikeMatcher.java +++ b/core/trino-main/src/test/java/io/trino/likematcher/TestLikeMatcher.java @@ -96,6 +96,12 @@ public void test() assertFalse(match("%abaaa%", "ababaa")); + assertTrue(match("%paya%", "papaya")); + assertTrue(match("%paya%", "papapaya")); + assertTrue(match("%paya%", "papapapaya")); + assertTrue(match("%paya%", "papapapapaya")); + assertTrue(match("%paya%", "papapapapapaya")); + // utf-8 LikeMatcher singleOptimized = LikePattern.compile("_", Optional.empty(), true).getMatcher(); LikeMatcher multipleOptimized = LikePattern.compile("_a%b_", Optional.empty(), true).getMatcher(); // prefix and suffix with _a and b_ to avoid optimizations