Skip to content

feat: pattern predicates in WHERE clause (openCypher 9)#32

Merged
dylanbstorey merged 2 commits intomainfrom
feat/pattern-predicates
Mar 21, 2026
Merged

feat: pattern predicates in WHERE clause (openCypher 9)#32
dylanbstorey merged 2 commits intomainfrom
feat/pattern-predicates

Conversation

@dylanbstorey
Copy link
Copy Markdown
Contributor

Summary

  • Pattern predicates: Bare relationship patterns in WHERE clauses now work as implicit existence checks per openCypher 9 spec. WHERE NOT (n)-[:REL]->() is syntactic sugar for WHERE NOT EXISTS((n)-[:REL]->()).
  • Direction fix: Fixed pre-existing bug where EXISTS(pattern) always assumed outgoing direction — incoming (<-) and undirected (-) patterns now generate correct SQL.
  • Bumps version to 0.3.10.

Closes GQLITE-T-0138.

Changes

File Change
cypher_gram.y Two new expr productions for 3- and 5-element pattern predicates; %expect 4→9 (GLR-safe)
transform_expr_predicate.c Direction-aware join generation for EXISTS subqueries
14_pattern_predicates.sql 17 functional tests: all directions, typed/untyped, NOT/AND/OR/XOR, EXISTS equivalence

Test plan

  • 5300 unit test assertions pass (0 failures)
  • All existing functional tests pass
  • 17 new functional tests for pattern predicates pass
  • Original reported query MATCH (n {entity_type: 'Note'}) WHERE NOT (n)-[:BELONGS_TO]->() ... now works

Dylan Bobby Storey added 2 commits March 20, 2026 22:51
Support bare relationship patterns as boolean expressions in WHERE
clauses per the openCypher 9 PatternPredicate spec. Previously required
explicit EXISTS() wrapper; now `WHERE NOT (n)-[:REL]->()` works
directly as syntactic sugar for `WHERE NOT EXISTS((n)-[:REL]->())`.

Also fixes pre-existing bug where EXISTS(pattern) ignored relationship
direction — incoming (<-) and undirected (-) patterns now generate
correct SQL.
@dylanbstorey dylanbstorey merged commit 31c2b3a into main Mar 21, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant