diff --git a/basex-core/src/main/java/org/basex/query/QueryParser.java b/basex-core/src/main/java/org/basex/query/QueryParser.java index 1dc05acbca..c519a944cf 100644 --- a/basex-core/src/main/java/org/basex/query/QueryParser.java +++ b/basex-core/src/main/java/org/basex/query/QueryParser.java @@ -4689,10 +4689,8 @@ private Expr[] ftRange(final boolean i, final Itr min) throws QueryException { private Expr ftAdditive(final boolean i) throws QueryException { if(!i) return additive(); skipWs(); - token.reset(); - while(digit(current())) token.add(consume()); - if(token.isEmpty()) throw error(INTEXP); - return Itr.get(toLong(token.toArray())); + if(!digit(current())) throw error(INTEXP); + return numericLiteral(Long.MAX_VALUE, false, false); } /** diff --git a/basex-core/src/test/java/org/basex/query/ft/FTIndexQueryTest.java b/basex-core/src/test/java/org/basex/query/ft/FTIndexQueryTest.java index ce96aa5fe7..32f789c049 100644 --- a/basex-core/src/test/java/org/basex/query/ft/FTIndexQueryTest.java +++ b/basex-core/src/test/java/org/basex/query/ft/FTIndexQueryTest.java @@ -79,7 +79,16 @@ private static void assertQuery(final String qu) { { "//w[text() contains text 'glad' using wildcards" + thes, "l.cky" }, { "//w[text() contains text 'happy glad' any word" + thes, "lucky\nl.cky" }, { "//w[text() contains text { 'stil.*' } using wildcards ftor { 'happy' }" + thes, - "lucky\na still life\nstill\nstillleben" } + "lucky\na still life\nstill\nstillleben" }, + // GH-2785: underscores in integer literals + { "//w[text() contains text 'happy' using thesaurus at '" + db + + "' from 0_1 to 1_0 levels]", "lucky" }, + { "//w[text() contains text 'happy' using thesaurus at '" + db + + "' exactly 0_1 levels]", "lucky" }, + { "//w[text() contains text 'happy' using thesaurus at '" + db + + "' at least 0_1 levels]", "lucky" }, + { "//w[text() contains text 'happy' using thesaurus at '" + db + + "' at most 1_0 levels]", "lucky" } }; for(final String[] query : queries) { final String qu = query[0] + " ! string()"; diff --git a/basex-core/src/test/java/org/basex/query/ft/FTQueryTest.java b/basex-core/src/test/java/org/basex/query/ft/FTQueryTest.java index f7896a29e0..8b74c30c68 100644 --- a/basex-core/src/test/java/org/basex/query/ft/FTQueryTest.java +++ b/basex-core/src/test/java/org/basex/query/ft/FTQueryTest.java @@ -1,5 +1,6 @@ package org.basex.query.ft; +import static org.basex.query.QueryError.*; import static org.basex.query.func.Function.*; import org.basex.*; @@ -95,6 +96,17 @@ public final class FTQueryTest extends SandboxTest { query("'a' contains text 'b' using fuzzy 10 errors", true); } + /** Integer separators in full-text ranges. */ + @Test public void gh2785() { + query("'fox' contains text 'cat' using fuzzy 1_0 errors", true); + query("'fox' contains text 'cat' using fuzzy 1 errors", false); + query("'fox' contains text 'cat' using fuzzy 1__0 errors", true); + error("'fox' contains text 'cat' using fuzzy 1_ errors", NUMBER_X); + error("'fox' contains text 'cat' using fuzzy _1 errors", QUERYEND_X); + error("'fox' contains text 'cat' using fuzzy errors", QUERYEND_X); + error("'fox' contains text 'cat' using fuzzy 99999999999999999999 errors", RANGE_X); + } + /** Fuzzy search: handling many similar terms. */ @Test public void gh2014() { query(_DB_CREATE.args(NAME, " aaaa aabc aaabbbbbaaad",