diff --git a/CHANGELOG.md b/CHANGELOG.md index a4d71f73495699c50b38ba204b3a8275e57a9546..67af84911a224574ba417931ea35813446777bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Wrong url returned by FileSystem resource behind proxy. * `NullPointerException` in GRPC API converters when executing SELECT query on NULL values. +* Fix parsing of decimal numbers. Fixes https://gitlab.com/linkahead/linkahead-server/-/issues/239 ### Security ### diff --git a/README_SETUP.md b/README_SETUP.md index acb3a79ad256fbba6a0d0a69887bb7c7ba7b28b9..e3b6e3bc3e8a69c2ff1e162476819ec76b93dbe9 100644 --- a/README_SETUP.md +++ b/README_SETUP.md @@ -163,6 +163,9 @@ sources (if you called `make run` previously). `$ make test` +You can run single unit test with +`mvn test -X -Dtest=TestCQL#testDecimalNumber` + ## Setup Eclipse diff --git a/src/main/java/org/caosdb/server/query/CQLLexer.g4 b/src/main/java/org/caosdb/server/query/CQLLexer.g4 index be6dcfa99d2f9c48cba8a0f7fccb7f97b277e01d..f21caf26f0f19d0433b1cdef2d5975d472791e99 100644 --- a/src/main/java/org/caosdb/server/query/CQLLexer.g4 +++ b/src/main/java/org/caosdb/server/query/CQLLexer.g4 @@ -433,7 +433,7 @@ WHITE_SPACE_f: /** */ WHITE_SPACE: - [ \t\n\r]+ + WHITE_SPACE_f ; /** */ @@ -529,9 +529,9 @@ COLON: /** Matches signed and unsigned numbers with decimal points, also numbers in scientific notation. */ DECIMAL_NUMBER: - ((HYPHEN_f | PLUS ) WHITE_SPACE_f?)? - ( NUM_f? DOT NUM_f WHITE_SPACE_f? E_NOTATION_f? - | NUM_f WHITE_SPACE_f? E_NOTATION_f + ((HYPHEN_f | PLUS ) WHITE_SPACE_f?)? + ( NUM_f? DOT NUM_f (WHITE_SPACE_f? E_NOTATION_f)? + | NUM_f (WHITE_SPACE_f? E_NOTATION_f)? ) ; diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java index 8d7a7e8fb219f286d6cdaffc4b28240a7b2897d5..5cf62325230794e90381625cb978a2579d0aab3f 100644 --- a/src/test/java/org/caosdb/server/query/TestCQL.java +++ b/src/test/java/org/caosdb/server/query/TestCQL.java @@ -36,6 +36,7 @@ import java.util.regex.Matcher; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.Vocabulary; import org.antlr.v4.runtime.tree.ParseTree; import org.caosdb.server.CaosDBServer; import org.caosdb.server.database.access.Access; @@ -7103,4 +7104,32 @@ public class TestCQL { assertTrue(conj.getFilters().get(0) instanceof POV); assertTrue(conj.getFilters().get(1) instanceof POV); } + + @Test + public void testDecimalNumber() { + // This should always be DEC, WHITESPACE, AND repeat + final String text = + "1.2123e+3 AND 1.21234E+3 AND 1.21234E-3 AND 1.21234E3 AND 16.0 AND 1.2 AND -1.2 AND +1.2 AND 1.2 AND - 1.2 AND + 1.2 AND 2e-323 AND 2E-323 AND 2E- 323 AND 2 e -323 AND + 1.2123e+323"; + CQLLexer lexer = new CQLLexer(CharStreams.fromString(text)); + final CommonTokenStream tokens = new CommonTokenStream(lexer); + Vocabulary vocab = lexer.getVocabulary(); + + final CQLParser parser = new CQLParser(tokens); + final CqContext sfq = parser.cq(); + int no = 0; + for (final Token t : tokens.getTokens()) { + if (no % 3 == 0) { + assertEquals(vocab.getSymbolicName(t.getType()), "DECIMAL_NUMBER"); + } + if (no % 3 == 1) { + if (vocab.getSymbolicName(t.getType()) != "EOF") { + assertEquals(vocab.getSymbolicName(t.getType()), "WHITE_SPACE"); + } + } + if (no % 3 == 2) { + assertEquals(vocab.getSymbolicName(t.getType()), "AND"); + } + no = no + 1; + } + } }