diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c5decad3d8be81a49dccdd4a748dc667994c587..00d2d7309442f1d3e9be2959c1f493d56e893461 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### ### Fixed ### +- [#203](https://gitlab.com/caosdb/caosdb-server/-/issues/203) * Denying a role permission has no effect [#196](https://gitlab.com/caosdb/caosdb-server/-/issues/196). See security diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4 index bcb4645ad7019d61f933793989e5d0afa5521f09..d5e375102d79d395b1f06c62c5aef9537092b0fc 100644 --- a/src/main/java/org/caosdb/server/query/CQLParser.g4 +++ b/src/main/java/org/caosdb/server/query/CQLParser.g4 @@ -133,6 +133,7 @@ entity_filter returns [EntityFilterInterface filter] ( ( LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( filter_expression {$filter = $filter_expression.efi;} | conjunction {$filter = $conjunction.c;} @@ -433,6 +434,7 @@ conjunction returns [Conjunction c] f1 = filter_expression {$c.add($f1.efi);} | LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( f4 = filter_expression {$c.add($f4.efi);} | disjunction {$c.add($disjunction.d);} @@ -473,6 +475,7 @@ disjunction returns [Disjunction d] f1 = filter_expression {$d.add($f1.efi);} | LPAREN WHITE_SPACE? + (HAS_A (PROPERTY)?)? ( f4 = filter_expression {$d.add($f4.efi);} | conjunction {$d.add($conjunction.c);} diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java index fe73e2b2c33749fac6d72a4c5b478eca5d154465..6d8f015d158aafe86baa087d6b56d38c0283ec62 100644 --- a/src/test/java/org/caosdb/server/query/TestCQL.java +++ b/src/test/java/org/caosdb/server/query/TestCQL.java @@ -281,6 +281,8 @@ public class TestCQL { // quotation marks gone rogue String quotation1 = "FIND ENTITY WHICH HAS A PROPERTY LIKE '*with double*' AND A PROPERTY LIKE '*and single*' AND A PROPERTY LIKE '*what\\'s wrong?*' AND A PROPERTY LIKE '*\\'*' AND A PROPERTY LIKE '*nothin\\'*' AND A PROPERTY LIKE '*\"\\'bla*'"; + String issue203a = "FIND WHICH ( HAS pname )"; + String issue203b = "FIND WHICH ( HAS pname1 AND REFERENCES pname2 )"; @Test public void testQuery1() @@ -7013,4 +7015,37 @@ public class TestCQL { assertEquals("POV(null,LIKE ,%nothin'%)", conj.getFilters().get(4).toString()); assertEquals("POV(null,LIKE ,%\"'bla%)", conj.getFilters().get(5).toString()); } + + /** + * Test that brackets around 'has pname' do not cause filter to become subproperty filter. + * + * <p>https://gitlab.com/caosdb/caosdb-server/-/issues/203 + */ + @Test + public void testIssue203() { + // setup 203a + CQLLexer lexer; + lexer = new CQLLexer(CharStreams.fromString(this.issue203a)); + CommonTokenStream tokens = new CommonTokenStream(lexer); + CQLParser parser = new CQLParser(tokens); + CqContext sfq = parser.cq(); + + // here we test that the filter stays a POV and is not falsly interpreted + // as subproperty filter + assertTrue(sfq.filter instanceof POV); + + // setup 203b (with conjunction) + lexer = new CQLLexer(CharStreams.fromString(this.issue203b)); + tokens = new CommonTokenStream(lexer); + parser = new CQLParser(tokens); + sfq = parser.cq(); + Conjunction conj = (Conjunction) sfq.filter; + + // the outer filter should be conjuction + assertTrue(sfq.filter instanceof Conjunction); + // here we test that the filters stays a POV and is not falsly interpreted + // as subproperty filters + assertTrue(conj.getFilters().get(0) instanceof POV); + assertTrue(conj.getFilters().get(1) instanceof POV); + } }