Skip to content

fix: SyntaxError validation — path variable conflicts, unicode escapes, MERGE var-length (#258)#398

Merged
DecisionNerd merged 2 commits into
mainfrom
fix/258-syntax-error-validation
May 1, 2026
Merged

fix: SyntaxError validation — path variable conflicts, unicode escapes, MERGE var-length (#258)#398
DecisionNerd merged 2 commits into
mainfrom
fix/258-syntax-error-validation

Conversation

@DecisionNerd
Copy link
Copy Markdown
Owner

@DecisionNerd DecisionNerd commented May 1, 2026

Summary

  • Raises VariableAlreadyBound when a path variable name (e.g. p) is reused as a node or relationship variable within the same MATCH pattern (MATCH p = (p)-[]->(), MATCH p = ()-[p]->())
  • Raises InvalidUnicodeLiteral for malformed \uXXXX escape sequences in string literals (RETURN '\uH')
  • Raises CreatingVarLength when a variable-length relationship appears in MERGE (MERGE ()-[*]-())
  • Removes lru_cache from _decode_cypher_string since it now raises exceptions

Test plan

  • All 14 previously-failing TCK scenarios now pass
  • Full TCK: 3,823/3,885 passing (+14 net, no regressions)
  • Full unit + integration suite clean (4,257 passed)
  • Ruff lint + format clean

Closes #258

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved parsing of Unicode escape sequences (\uXXXX and \UXXXXXXXX) with validation
    • Added detection for variable name conflicts in query patterns
    • Enhanced validation to prevent unsupported variable-length relationships in merge operations

…s, MERGE var-length (#258)

- Raise VariableAlreadyBound when a path variable name (p = ...) is also
  used as a node or relationship variable within the same pattern
  (e.g. MATCH p = (p)-[]->() or MATCH p = ()-[p]->())
- Raise InvalidUnicodeLiteral for malformed \\uXXXX escape sequences in
  string literals (e.g. RETURN '\\uH')
- Raise CreatingVarLength when a variable-length relationship appears in
  MERGE (e.g. MERGE ()-[*]-())
- Remove lru_cache from _decode_cypher_string since it now raises

Fixes 14 TCK scenarios: 3,823/3,885 passing (+14 vs prior state)

Closes #258

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 1, 2026

Warning

Rate limit exceeded

@DecisionNerd has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 46 minutes and 13 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 07abcdbb-b439-4aa8-891d-10f3dd084bed

📥 Commits

Reviewing files that changed from the base of the PR and between d395ca9 and 6f8f1fb.

⛔ Files ignored due to path filters (1)
  • README.md is excluded by !**/*.md
📒 Files selected for processing (1)
  • src/graphforge/parser/parser.py

Walkthrough

The changes add compile-time validation for two openCypher specification requirements: detecting when a path variable name collides with node or relationship variables in the same MATCH pattern, and validating unicode escape sequences in string literals while rejecting variable-length relationships in MERGE operations.

Changes

Cohort / File(s) Summary
Unicode String Validation
src/graphforge/parser/parser.py
Modified _decode_cypher_string to validate and decode unicode escape sequences (\uXXXX and \UXXXXXXXX), verifying hex character validity and raising SyntaxError with InvalidUnicodeLiteral for invalid escapes; removed @lru_cache decorator.
Pattern and Merge Validation
src/graphforge/planner/planner.py
Added compile-time validation in plan() to detect variable name collisions between path variables and node/relationship anchors in MATCH patterns (raising VariableAlreadyBound), and extended _validate_merge_patterns to reject variable-length relationships (raising CreatingVarLength).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the three main changes: path variable conflict validation, unicode escape handling, and MERGE variable-length relationship rejection.
Description check ✅ Passed The description provides a clear summary of changes and test results, but lacks explicit coverage of required template sections like detailed test commands and comprehensive checklist completion.
Linked Issues check ✅ Passed The PR directly addresses all three coding requirements from issue #258: VariableAlreadyBound validation for path variable conflicts, InvalidUnicodeLiteral for malformed unicode escapes, and CreatingVarLength rejection for variable-length MERGE relationships.
Out of Scope Changes check ✅ Passed All changes are directly aligned with issue #258 objectives: unicode escape validation in parser.py and path variable/MERGE validation in planner.py with lru_cache removal as a necessary consequence.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/258-syntax-error-validation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 46 minutes and 13 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/graphforge/parser/parser.py`:
- Around line 74-85: The unicode escape handling block in parser.py (the branch
where nxt in ("u","U") that builds hex_part and calls chr()) currently validates
hex digits but not the Unicode scalar range; add an explicit check after parsing
hex_part (before calling chr()) to ensure the integer value is <= 0x10FFFF (and
>= 0), and if out of range raise the same SyntaxError("InvalidUnicodeLiteral:
Invalid unicode escape '\\{nxt}{hex_part}'"); keep updating
result.append(chr(codepoint)) and advancing i as before.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 59c78fc2-d4f9-4b7f-a8e4-444ea914be91

📥 Commits

Reviewing files that changed from the base of the PR and between 1791ee8 and d395ca9.

📒 Files selected for processing (2)
  • src/graphforge/parser/parser.py
  • src/graphforge/planner/planner.py

Comment thread src/graphforge/parser/parser.py
@codecov
Copy link
Copy Markdown

codecov Bot commented May 1, 2026

❌ 39 Tests Failed:

Tests completed Failed Passed Skipped
8095 39 8056 38
View the top 3 failed test(s) by shortest run time
tests.tck.test_features::test_forwarding_a_property_to_express_a_join
Stack Traces | 0.136s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function execute_setup_query_colon at 0x7f7ff777e8e0>
        kwargs     = {'docstring': 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})', 'tck_context':...0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': None, ...}}
        request    = <FixtureRequest for <Function test_forwarding_a_property_to_express_a_join>>
tests/tck/conftest.py:237: in execute_setup_query_colon
    tck_context["graph"].execute(docstring)
        docstring  = 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})'
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': None, ...}
src/graphforge/api.py:305: in execute
    return self._execute_single_ast(ast, parameters=parameters)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        parameters = None
        query      = 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})'
        self       = <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>
src/graphforge/api.py:331: in _execute_single_ast
    operators = self.planner.plan(ast)
                ^^^^^^^^^^^^^^^^^^^^^^
        UnionQuery = <class 'graphforge.ast.query.UnionQuery'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        parameters = None
        self       = <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>
.../graphforge/planner/planner.py:126: in plan
    return self._plan_simple_query(ast.clauses)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        TypeContext = <class 'graphforge.planner.types.TypeContext'>
        VariableType = <enum 'VariableType'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        has_with   = False
        outer_scope_vars = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f7ff5a846e0>
.../graphforge/planner/planner.py:329: in _plan_simple_query
    self._validate_create_patterns(create.patterns)
        _absorbed_where_indices = set()
        _ci        = 0
        _clauses_list = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        call_clauses = []
        clause     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num'...tern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])
        clauses    = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        create     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num'...tern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])
        create_clauses = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        has_following_clauses = False
        limit_clause = None
        match_clauses = []
        merge_clauses = []
        operators  = []
        optional_match_clauses = []
        order_by_clause = None
        return_clause = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f7ff5a846e0>
        skip_clause = None
        unwind_clauses = []
        where_clause = None
.../graphforge/planner/planner.py:2300: in _validate_create_patterns
    self._validate_expr_variables_in_scope(prop_expr)
        already_bound = False
        bound_in_create = {'a'}
        bound_rel_in_create = set()
        is_standalone_node = True
        node_parts = [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]
        part       = NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})
        parts      = [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]
        pattern    = {'parts': [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})], 'path_variable': None}
        patterns   = [{'parts': [NodePattern(variable='a', labels=[['End']], properties={'num': Literal(value=42), 'id': Literal(value=0)})...bels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})], 'path_variable': None}]
        prop_expr  = PropertyAccess(variable='a', base=None, property='id')
        rel_parts  = []
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f7ff5a846e0>
.../graphforge/planner/planner.py:2850: in _validate_expr_variables_in_scope
    _check(expr, locally_bound)
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f7ff5345ee0>
        expr       = PropertyAccess(variable='a', base=None, property='id')
        locally_bound = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f7ff5a846e0>
.../graphforge/planner/planner.py:2769: in _check
    raise SyntaxError(f"UndefinedVariable: Variable `{e.variable}` is not defined")
E   SyntaxError: UndefinedVariable: Variable `a` is not defined
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f7ff5345ee0>
        e          = PropertyAccess(variable='a', base=None, property='id')
        lb         = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f7ff5a846e0>
tests.tck.test_features::test_handle_dependencies_across_with_with_skip
Stack Traces | 0.263s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function execute_setup_query_colon at 0x7f5a2d24a8e0>
        kwargs     = {'docstring': "CREATE (a {name: 'A', num: 0, id: 0}),\n       ({name: 'B', num: a.id, id: 1}),\n       ({name: 'C', nu...0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': None, ...}}
        request    = <FixtureRequest for <Function test_handle_dependencies_across_with_with_skip>>
tests/tck/conftest.py:237: in execute_setup_query_colon
    tck_context["graph"].execute(docstring)
        docstring  = "CREATE (a {name: 'A', num: 0, id: 0}),\n       ({name: 'B', num: a.id, id: 1}),\n       ({name: 'C', num: 0, id: 2})"
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': None, ...}
src/graphforge/api.py:305: in execute
    return self._execute_single_ast(ast, parameters=parameters)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], pro...riable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])])
        parameters = None
        query      = "CREATE (a {name: 'A', num: 0, id: 0}),\n       ({name: 'B', num: a.id, id: 1}),\n       ({name: 'C', num: 0, id: 2})"
        self       = <graphforge.api.GraphForge object at 0x7f5a27b723c0>
src/graphforge/api.py:331: in _execute_single_ast
    operators = self.planner.plan(ast)
                ^^^^^^^^^^^^^^^^^^^^^^
        UnionQuery = <class 'graphforge.ast.query.UnionQuery'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], pro...riable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])])
        parameters = None
        self       = <graphforge.api.GraphForge object at 0x7f5a27b723c0>
.../graphforge/planner/planner.py:126: in plan
    return self._plan_simple_query(ast.clauses)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        TypeContext = <class 'graphforge.planner.types.TypeContext'>
        VariableType = <enum 'VariableType'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], pro...riable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])])
        has_with   = False
        outer_scope_vars = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:329: in _plan_simple_query
    self._validate_create_patterns(create.patterns)
        _absorbed_where_indices = set()
        _ci        = 0
        _clauses_list = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], properties={'name': Lit...ariable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])]
        call_clauses = []
        clause     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], properties={'name': Lite...variable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])
        clauses    = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], properties={'name': Lit...ariable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])]
        create     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], properties={'name': Lite...variable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])
        create_clauses = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[], properties={'name': Lit...ariable=None, labels=[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})]}])]
        has_following_clauses = False
        limit_clause = None
        match_clauses = []
        merge_clauses = []
        operators  = []
        optional_match_clauses = []
        order_by_clause = None
        return_clause = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
        skip_clause = None
        unwind_clauses = []
        where_clause = None
.../graphforge/planner/planner.py:2300: in _validate_create_patterns
    self._validate_expr_variables_in_scope(prop_expr)
        already_bound = False
        bound_in_create = {'a'}
        bound_rel_in_create = set()
        is_standalone_node = True
        node_parts = [NodePattern(variable=None, labels=[], properties={'name': Literal(value='B'), 'num': PropertyAccess(variable='a', base=None, property='id'), 'id': Literal(value=1)})]
        part       = NodePattern(variable=None, labels=[], properties={'name': Literal(value='B'), 'num': PropertyAccess(variable='a', base=None, property='id'), 'id': Literal(value=1)})
        parts      = [NodePattern(variable=None, labels=[], properties={'name': Literal(value='B'), 'num': PropertyAccess(variable='a', base=None, property='id'), 'id': Literal(value=1)})]
        pattern    = {'parts': [NodePattern(variable=None, labels=[], properties={'name': Literal(value='B'), 'num': PropertyAccess(variable='a', base=None, property='id'), 'id': Literal(value=1)})], 'path_variable': None}
        patterns   = [{'parts': [NodePattern(variable='a', labels=[], properties={'name': Literal(value='A'), 'num': Literal(value=0), 'id'...[], properties={'name': Literal(value='C'), 'num': Literal(value=0), 'id': Literal(value=2)})], 'path_variable': None}]
        prop_expr  = PropertyAccess(variable='a', base=None, property='id')
        rel_parts  = []
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:2850: in _validate_expr_variables_in_scope
    _check(expr, locally_bound)
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f5a26bad6c0>
        expr       = PropertyAccess(variable='a', base=None, property='id')
        locally_bound = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:2769: in _check
    raise SyntaxError(f"UndefinedVariable: Variable `{e.variable}` is not defined")
E   SyntaxError: UndefinedVariable: Variable `a` is not defined
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f5a26bad6c0>
        e          = PropertyAccess(variable='a', base=None, property='id')
        lb         = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
tests.tck.test_features::test_handle_dependencies_across_with_with_limit
Stack Traces | 0.275s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function execute_setup_query_colon at 0x7f5a2d24a8e0>
        kwargs     = {'docstring': 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})', 'tck_context':...0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': None, ...}}
        request    = <FixtureRequest for <Function test_handle_dependencies_across_with_with_limit>>
tests/tck/conftest.py:237: in execute_setup_query_colon
    tck_context["graph"].execute(docstring)
        docstring  = 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})'
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': None, ...}
src/graphforge/api.py:305: in execute
    return self._execute_single_ast(ast, parameters=parameters)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        parameters = None
        query      = 'CREATE (a:End {num: 42, id: 0}),\n       (:End {num: 3}),\n       (:Begin {num: a.id})'
        self       = <graphforge.api.GraphForge object at 0x7f5a27b723c0>
src/graphforge/api.py:331: in _execute_single_ast
    operators = self.planner.plan(ast)
                ^^^^^^^^^^^^^^^^^^^^^^
        UnionQuery = <class 'graphforge.ast.query.UnionQuery'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        parameters = None
        self       = <graphforge.api.GraphForge object at 0x7f5a27b723c0>
.../graphforge/planner/planner.py:126: in plan
    return self._plan_simple_query(ast.clauses)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        TypeContext = <class 'graphforge.planner.types.TypeContext'>
        VariableType = <enum 'VariableType'>
        ast        = CypherQuery(clauses=[CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End'...rn(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])])
        has_with   = False
        outer_scope_vars = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:329: in _plan_simple_query
    self._validate_create_patterns(create.patterns)
        _absorbed_where_indices = set()
        _ci        = 0
        _clauses_list = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        call_clauses = []
        clause     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num'...tern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])
        clauses    = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        create     = CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num'...tern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])
        create_clauses = [CreateClause(patterns=[{'path_variable': None, 'parts': [NodePattern(variable='a', labels=[['End']], properties={'num...ern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]}])]
        has_following_clauses = False
        limit_clause = None
        match_clauses = []
        merge_clauses = []
        operators  = []
        optional_match_clauses = []
        order_by_clause = None
        return_clause = None
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
        skip_clause = None
        unwind_clauses = []
        where_clause = None
.../graphforge/planner/planner.py:2300: in _validate_create_patterns
    self._validate_expr_variables_in_scope(prop_expr)
        already_bound = False
        bound_in_create = {'a'}
        bound_rel_in_create = set()
        is_standalone_node = True
        node_parts = [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]
        part       = NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})
        parts      = [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})]
        pattern    = {'parts': [NodePattern(variable=None, labels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})], 'path_variable': None}
        patterns   = [{'parts': [NodePattern(variable='a', labels=[['End']], properties={'num': Literal(value=42), 'id': Literal(value=0)})...bels=[['Begin']], properties={'num': PropertyAccess(variable='a', base=None, property='id')})], 'path_variable': None}]
        prop_expr  = PropertyAccess(variable='a', base=None, property='id')
        rel_parts  = []
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:2850: in _validate_expr_variables_in_scope
    _check(expr, locally_bound)
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f5a2688d4e0>
        expr       = PropertyAccess(variable='a', base=None, property='id')
        locally_bound = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
.../graphforge/planner/planner.py:2769: in _check
    raise SyntaxError(f"UndefinedVariable: Variable `{e.variable}` is not defined")
E   SyntaxError: UndefinedVariable: Variable `a` is not defined
        CaseExpression = <class 'graphforge.ast.expression.CaseExpression'>
        ExtractExpression = <class 'graphforge.ast.expression.ExtractExpression'>
        FilterExpression = <class 'graphforge.ast.expression.FilterExpression'>
        ListComprehension = <class 'graphforge.ast.expression.ListComprehension'>
        PatternComprehension = <class 'graphforge.ast.expression.PatternComprehension'>
        PatternPredicate = <class 'graphforge.ast.expression.PatternPredicate'>
        PropertyAccess = <class 'graphforge.ast.expression.PropertyAccess'>
        QuantifierExpression = <class 'graphforge.ast.expression.QuantifierExpression'>
        ReduceExpression = <class 'graphforge.ast.expression.ReduceExpression'>
        SubqueryExpression = <class 'graphforge.ast.expression.SubqueryExpression'>
        _check     = <function QueryPlanner._validate_expr_variables_in_scope.<locals>._check at 0x7f5a2688d4e0>
        e          = PropertyAccess(variable='a', base=None, property='id')
        lb         = frozenset()
        self       = <graphforge.planner.planner.QueryPlanner object at 0x7f5a275b06e0>
tests.tck.test_features::test_unwind_does_not_remove_variables_from_scope
Stack Traces | 1.48s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f11743839c0>
        kwargs     = {'datatable': [['a', 'b2'], ['(:S)', '(:E)']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x... 'result': {'error': 'VariableTypeConflict: Variable `b2` already bound to type scalar, cannot be used as node'}, ...}}
        request    = <FixtureRequest for <Function test_unwind_does_not_remove_variables_from_scope>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `b2` already bound to type scalar, cannot be used as node
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `b2` already bound to type scalar, cannot be used as node'}
        datatable  = [['a', 'b2'], ['(:S)', '(:E)']]
        expected   = [{'a': {'_node_pattern': '(:S)'}, 'b2': {'_node_pattern': '(:E)'}}]
        result     = {'error': 'VariableTypeConflict: Variable `b2` already bound to type scalar, cannot be used as node'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0..., 'result': {'error': 'VariableTypeConflict: Variable `b2` already bound to type scalar, cannot be used as node'}, ...}
View the full list of 35 ❄️ flaky test(s)
tests.tck.test_features::test_collect_and_extract_using_a_list_comprehension

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.554s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f5d2b64b9c0>
        kwargs     = {'datatable': [['n.name', 'oldNames'], ["'newName'", "['original']"]], 'tck_context': {'_pool': <tests.tck.conftest._I...DS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}, ...}}
        request    = <FixtureRequest for <Function test_collect_and_extract_using_a_list_comprehension>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches 'R' in the current parser context, at line 6 col 1
E     
E     RETURN n.name, oldNames
E     ^
E     Expected one of: 
E     	* IN
E     	* STARTS
E     	* REMOVE
E     	* IS
E     	* POW_OP
E     	* CONTAINS
E     	* ADD_OP
E     	* CALL
E     	* COMP_OP
E     	* DELETE
E     	* CREATE
E     	* AND
E     	* WITH
E     	* OPTIONAL
E     	* ENDS
E     	* XOR
E     	* SET
E     	* UNWIND
E     	* COMMA
E     	* MERGE
E     	* DETACH
E     	* MATCH
E     	* MULT_OP
E     	* OR
E     	* LSQB
E     
E   assert 'error' not in {'error': "No terminal matches 'R' in the current parser context, at line 6 col 1\n\nRETURN n.name, oldNames\n^\nExpected one of: \n\t* IN\n\t* STARTS\n\t* REMOVE\n\t* IS\n\t* POW_OP\n\t* CONTAINS\n\t* ADD_OP\n\t* CALL\n\t* COMP_OP\n\t* DELETE\n\t* CREATE\n\t* AND\n\t* WITH\n\t* OPTIONAL\n\t* ENDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}
        datatable  = [['n.name', 'oldNames'], ["'newName'", "['original']"]]
        expected   = [{'n.name': CypherString('newName'), 'oldNames': {'_list_literal': "['original']"}}]
        result     = {'error': "No terminal matches 'R' in the current parser context, at line 6 col 1\n\nRETURN n.name, oldNames\n^\nExpec...n\t* ENDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0...NDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}, ...}
tests.tck.test_features::test_collect_and_filter_using_a_list_comprehension

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.572s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f5d2b64b9c0>
        kwargs     = {'datatable': [['n.name', 'size(noopFiltered)'], ["'newName'", '1']], 'tck_context': {'_pool': <tests.tck.conftest._In...DS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}, ...}}
        request    = <FixtureRequest for <Function test_collect_and_filter_using_a_list_comprehension>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches 'R' in the current parser context, at line 6 col 1
E     
E     RETURN n.name, size(noopFiltered)
E     ^
E     Expected one of: 
E     	* IN
E     	* STARTS
E     	* REMOVE
E     	* IS
E     	* POW_OP
E     	* CONTAINS
E     	* ADD_OP
E     	* CALL
E     	* COMP_OP
E     	* DELETE
E     	* CREATE
E     	* AND
E     	* WITH
E     	* OPTIONAL
E     	* ENDS
E     	* XOR
E     	* SET
E     	* UNWIND
E     	* COMMA
E     	* MERGE
E     	* DETACH
E     	* MATCH
E     	* MULT_OP
E     	* OR
E     	* LSQB
E     
E   assert 'error' not in {'error': "No terminal matches 'R' in the current parser context, at line 6 col 1\n\nRETURN n.name, size(noopFiltered)\n^\nExpected one of: \n\t* IN\n\t* STARTS\n\t* REMOVE\n\t* IS\n\t* POW_OP\n\t* CONTAINS\n\t* ADD_OP\n\t* CALL\n\t* COMP_OP\n\t* DELETE\n\t* CREATE\n\t* AND\n\t* WITH\n\t* OPTIONAL\n\t* ENDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}
        datatable  = [['n.name', 'size(noopFiltered)'], ["'newName'", '1']]
        expected   = [{'n.name': CypherString('newName'), 'size(noopFiltered)': CypherInt(1)}]
        result     = {'error': "No terminal matches 'R' in the current parser context, at line 6 col 1\n\nRETURN n.name, size(noopFiltered)...n\t* ENDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0...NDS\n\t* XOR\n\t* SET\n\t* UNWIND\n\t* COMMA\n\t* MERGE\n\t* DETACH\n\t* MATCH\n\t* MULT_OP\n\t* OR\n\t* LSQB\n"}, ...}
tests.tck.test_features::test_copying_properties_from_literal_map_with_on_create

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.914s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_ignoring_list_order_colon at 0x7f3c4d57bf60>
        kwargs     = {'datatable': [['keyValue'], ["['name->bar', 'name2->baz']"]], 'tck_context': {'_pool': <tests.tck.conftest._InstanceP... 0x7f3c47fca3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}}
        request    = <FixtureRequest for <Function test_copying_properties_from_literal_map_with_on_create>>
tests/tck/conftest.py:505: in verify_result_ignoring_list_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got EdgeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got EdgeRef'}
        datatable  = [['keyValue'], ["['name->bar', 'name2->baz']"]]
        expected   = [{'keyValue': {'_list_literal': "['name->bar', 'name2->baz']"}}]
        result     = {'error': 'Subscript operation requires list or map, got EdgeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': <graphforge.api.GraphForge object at 0x7f3c47fca3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}
tests.tck.test_features::test_copying_properties_from_literal_map_with_on_match

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.25s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_ignoring_list_order_colon at 0x7f7ff777ff60>
        kwargs     = {'datatable': [['keyValue'], ["['name->baz', 'name2->baz']"]], 'tck_context': {'_pool': <tests.tck.conftest._InstanceP... 0x7f7ff61fe3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}}
        request    = <FixtureRequest for <Function test_copying_properties_from_literal_map_with_on_match>>
tests/tck/conftest.py:505: in verify_result_ignoring_list_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got EdgeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got EdgeRef'}
        datatable  = [['keyValue'], ["['name->baz', 'name2->baz']"]]
        expected   = [{'keyValue': {'_list_literal': "['name->baz', 'name2->baz']"}}]
        result     = {'error': 'Subscript operation requires list or map, got EdgeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}
tests.tck.test_features::test_copying_properties_from_node_with_on_create

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.57s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_empty_result at 0x7f3c4d5905e0>
        kwargs     = {'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': <graphforge.api.GraphForge object at 0x7f3c47fca3c0>, 'parameters': {}, 'result': {'error': 'SET r = requires a map, got NodeRef'}, ...}}
        request    = <FixtureRequest for <Function test_copying_properties_from_node_with_on_create>>
tests/tck/conftest.py:556: in verify_empty_result
    pytest.fail(f"Query failed: {result['error']}")
E   Failed: Query failed: SET r = requires a map, got NodeRef
        result     = {'error': 'SET r = requires a map, got NodeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': <graphforge.api.GraphForge object at 0x7f3c47fca3c0>, 'parameters': {}, 'result': {'error': 'SET r = requires a map, got NodeRef'}, ...}
tests.tck.test_features::test_copying_properties_from_node_with_on_match

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.886s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_empty_result at 0x7f7ff77945e0>
        kwargs     = {'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': {'error': 'SET r = requires a map, got NodeRef'}, ...}}
        request    = <FixtureRequest for <Function test_copying_properties_from_node_with_on_match>>
tests/tck/conftest.py:556: in verify_empty_result
    pytest.fail(f"Query failed: {result['error']}")
E   Failed: Query failed: SET r = requires a map, got NodeRef
        result     = {'error': 'SET r = requires a map, got NodeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': {'error': 'SET r = requires a map, got NodeRef'}, ...}
tests.tck.test_features::test_create_an_empty_list_if_range_direction_and_step_direction_are_inconsistent

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.49s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f2542f6f9c0>
        kwargs     = {'datatable': [['okay'], ['true']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f25419ee27...rge.api.GraphForge object at 0x7f25419ee3c0>, 'parameters': {}, 'result': {'error': 'Unknown function: COLLECT'}, ...}}
        request    = <FixtureRequest for <Function test_create_an_empty_list_if_range_direction_and_step_direction_are_inconsistent>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Unknown function: COLLECT
E   assert 'error' not in {'error': 'Unknown function: COLLECT'}
        datatable  = [['okay'], ['true']]
        expected   = [{'okay': CypherBool(True)}]
        result     = {'error': 'Unknown function: COLLECT'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f25419ee270>, 'graph': <graphforge.api.GraphForge object at 0x7f25419ee3c0>, 'parameters': {}, 'result': {'error': 'Unknown function: COLLECT'}, ...}
tests.tck.test_features::test_creating_nodes_from_an_unwound_parameter_list

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 0.872s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_in_order at 0x7f1174383d80>
        kwargs     = {'datatable': [['x'], ['1'], ['2']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a2...0>, 'parameters': {'events': [{'id': 1, 'year': 2016}, {'id': 2, 'year': 2016}]}, 'result': {'error': "'event'"}, ...}}
        request    = <FixtureRequest for <Function test_creating_nodes_from_an_unwound_parameter_list>>
tests/tck/conftest.py:486: in verify_result_in_order
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: 'event'
E   assert 'error' not in {'error': "'event'"}
        datatable  = [['x'], ['1'], ['2']]
        expected   = [{'x': CypherInt(1)}, {'x': CypherInt(2)}]
        result     = {'error': "'event'"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0...c0>, 'parameters': {'events': [{'id': 1, 'year': 2016}, {'id': 2, 'year': 2016}]}, 'result': {'error': "'event'"}, ...}
tests.tck.test_features::test_execute_nname_in_read_queries

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.381s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7fcc7f16f9c0>
        kwargs     = {'datatable': [['value'], ["'Apa'"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea... 0x7fcc7dbea3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}}
        request    = <FixtureRequest for <Function test_execute_nname_in_read_queries>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got NodeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got NodeRef'}
        datatable  = [['value'], ["'Apa'"]]
        expected   = [{'value': CypherString('Apa')}]
        result     = {'error': 'Subscript operation requires list or map, got NodeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea270>, 'graph': <graphforge.api.GraphForge object at 0x7fcc7dbea3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}
tests.tck.test_features::test_execute_nname_in_update_queries

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.268s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7fcc7f16f9c0>
        kwargs     = {'datatable': [['value'], ["'Apa'"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea... 0x7fcc7dbea3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}}
        request    = <FixtureRequest for <Function test_execute_nname_in_update_queries>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got NodeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got NodeRef'}
        datatable  = [['value'], ["'Apa'"]]
        expected   = [{'value': CypherString('Apa')}]
        result     = {'error': 'Subscript operation requires list or map, got NodeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea270>, 'graph': <graphforge.api.GraphForge object at 0x7fcc7dbea3c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}
tests.tck.test_features::test_fail_if_more_complex_expression_even_if_projected_are_used_inside_expression_which_contains_an_aggregation_expression

Flake rate in main: 93.84% (Passed 22 times, Failed 335 times)

Stack Traces | 0.654s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_compile_error_with_code at 0x7f283998cfe0>
        kwargs     = {'error_code': 'AmbiguousAggregationExpression', 'error_type': 'SyntaxError', 'tck_context': {'_pool': <tests.tck.conf...t 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0x7f28383f23c0>, 'parameters': {}, 'result': [], ...}}
        request    = <FixtureRequest for <Function test_fail_if_more_complex_expression_even_if_projected_are_used_inside_expression_which_contains_an_aggregation_expression>>
tests/tck/conftest.py:604: in verify_compile_error_with_code
    pytest.fail(f"Expected {error_type} with code {error_code} but query succeeded")
E   Failed: Expected SyntaxError with code AmbiguousAggregationExpression but query succeeded
        error_code = 'AmbiguousAggregationExpression'
        error_type = 'SyntaxError'
        result     = []
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0x7f28383f23c0>, 'parameters': {}, 'result': [], ...}
tests.tck.test_features::test_fail_on_merging_node_with_null_property

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.11s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_runtime_error_with_code at 0x7f5a2d2611c0>
        kwargs     = {'error_code': 'MergeReadOwnWrites', 'error_type': 'SemanticError', 'tck_context': {'_pool': <tests.tck.conftest._Inst...t 0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': [], ...}}
        request    = <FixtureRequest for <Function test_fail_on_merging_node_with_null_property>>
tests/tck/conftest.py:619: in verify_runtime_error_with_code
    pytest.fail(f"Expected {error_type} with code {error_code} but query succeeded")
E   Failed: Expected SemanticError with code MergeReadOwnWrites but query succeeded
        error_code = 'MergeReadOwnWrites'
        error_type = 'SemanticError'
        result     = []
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5a27b72270>, 'graph': <graphforge.api.GraphForge object at 0x7f5a27b723c0>, 'parameters': {}, 'result': [], ...}
tests.tck.test_features::test_fail_on_merging_relationship_with_null_property

Flake rate in main: 97.76% (Passed 8 times, Failed 349 times)

Stack Traces | 0.279s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_runtime_error_with_code at 0x7f7ff77951c0>
        kwargs     = {'error_code': 'MergeReadOwnWrites', 'error_type': 'SemanticError', 'tck_context': {'_pool': <tests.tck.conftest._Inst...t 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': [], ...}}
        request    = <FixtureRequest for <Function test_fail_on_merging_relationship_with_null_property>>
tests/tck/conftest.py:619: in verify_runtime_error_with_code
    pytest.fail(f"Expected {error_type} with code {error_code} but query succeeded")
E   Failed: Expected SemanticError with code MergeReadOwnWrites but query succeeded
        error_code = 'MergeReadOwnWrites'
        error_type = 'SemanticError'
        result     = []
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': [], ...}
tests.tck.test_features::test_failing_when_comparing_to_an_undefined_variable

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.656s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_compile_error_with_code at 0x7f5d2b660fe0>
        kwargs     = {'error_code': 'UndefinedVariable', 'error_type': 'SyntaxError', 'tck_context': {'_pool': <tests.tck.conftest._Instanc...t 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0x7f5d2a0ca3c0>, 'parameters': {}, 'result': [], ...}}
        request    = <FixtureRequest for <Function test_failing_when_comparing_to_an_undefined_variable>>
tests/tck/conftest.py:604: in verify_compile_error_with_code
    pytest.fail(f"Expected {error_type} with code {error_code} but query succeeded")
E   Failed: Expected SyntaxError with code UndefinedVariable but query succeeded
        error_code = 'UndefinedVariable'
        error_type = 'SyntaxError'
        result     = []
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0x7f5d2a0ca3c0>, 'parameters': {}, 'result': [], ...}
tests.tck.test_features::test_filter_node_with_node_label_predicate_on_multi_variables_with_multiple_bindings_after_match_and_optional_match

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 1.66s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f11743839c0>
        kwargs     = {'datatable': [['a.name'], ["'A'"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a2...rs': {}, 'result': [{'a.name': CypherString('A')}, {'a.name': CypherString('A')}, {'a.name': CypherString('A')}], ...}}
        request    = <FixtureRequest for <Function test_filter_node_with_node_label_predicate_on_multi_variables_with_multiple_bindings_after_match_and_optional_match>>
tests/tck/conftest.py:445: in verify_result_any_order_colon
    assert len(result) == len(expected), f"Expected {len(expected)} rows, got {len(result)}"
E   AssertionError: Expected 1 rows, got 3
E   assert 3 == 1
E    +  where 3 = len([{'a.name': CypherString('A')}, {'a.name': CypherString('A')}, {'a.name': CypherString('A')}])
E    +  and   1 = len([{'a.name': CypherString('A')}])
        datatable  = [['a.name'], ["'A'"]]
        expected   = [{'a.name': CypherString('A')}]
        result     = [{'a.name': CypherString('A')}, {'a.name': CypherString('A')}, {'a.name': CypherString('A')}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0...ers': {}, 'result': [{'a.name': CypherString('A')}, {'a.name': CypherString('A')}, {'a.name': CypherString('A')}], ...}
tests.tck.test_features::test_handle_constants_and_parameters_inside_an_expression_which_contains_an_aggregation_expression

Flake rate in main: 99.44% (Passed 2 times, Failed 356 times)

Stack Traces | 0.558s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f7ff777f9c0>
        kwargs     = {'datatable': [['$age + avg(person.age) - 1000'], ['null']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePoo...ect at 0x7f7ff61fe3c0>, 'parameters': {'age': 38}, 'result': [{'38 + avg(person.age) - 1000': CypherNull(None)}], ...}}
        request    = <FixtureRequest for <Function test_handle_constants_and_parameters_inside_an_expression_which_contains_an_aggregation_expression>>
tests/tck/conftest.py:453: in verify_result_any_order_colon
    assert exp_row in actual_rows, f"Expected row not found: {exp_row}"
E   AssertionError: Expected row not found: {'$age + avg(person.age) - 1000': None}
E   assert {'$age + avg(person.age) - 1000': None} in [{'38 + avg(person.age) - 1000': None}]
        actual_rows = [{'38 + avg(person.age) - 1000': None}]
        datatable  = [['$age + avg(person.age) - 1000'], ['null']]
        exp_row    = {'$age + avg(person.age) - 1000': None}
        expected   = [{'$age + avg(person.age) - 1000': CypherNull(None)}]
        expected_rows = [{'$age + avg(person.age) - 1000': None}]
        result     = [{'38 + avg(person.age) - 1000': CypherNull(None)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {'age': 38}, 'result': [{'38 + avg(person.age) - 1000': CypherNull(None)}], ...}
tests.tck.test_features::test_join_nodes_on_nonequality_of_properties__optional_match_on_two_relationships_and_where

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 1.48s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f11743839c0>
        kwargs     = {'datatable': [['x', 'y', 'z'], ['(:X {val: 1})', '(:Y {val: 2})', '(:Z {val: 3})'], ['(:X {val: 4})', 'null', 'null']...70>, 'graph': <graphforge.api.GraphForge object at 0x7f116ed8a3c0>, 'parameters': {}, 'result': {'error': "'z'"}, ...}}
        request    = <FixtureRequest for <Function test_join_nodes_on_nonequality_of_properties__optional_match_on_two_relationships_and_where>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: 'z'
E   assert 'error' not in {'error': "'z'"}
        datatable  = [['x', 'y', 'z'], ['(:X {val: 1})', '(:Y {val: 2})', '(:Z {val: 3})'], ['(:X {val: 4})', 'null', 'null'], ['(:X {val: 6})', 'null', 'null']]
        expected   = [{'x': {'_node_pattern': '(:X {val: 1})'}, 'y': {'_node_pattern': '(:Y {val: 2})'}, 'z': {'_node_pattern': '(:Z {val: ...None), 'z': CypherNull(None)}, {'x': {'_node_pattern': '(:X {val: 6})'}, 'y': CypherNull(None), 'z': CypherNull(None)}]
        result     = {'error': "'z'"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0x7f116ed8a3c0>, 'parameters': {}, 'result': {'error': "'z'"}, ...}
tests.tck.test_features::test_match_after_optional_match

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.64s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f3c4d57b9c0>
        kwargs     = {'datatable': [['d']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': ..., 'result': {'error': 'VariableTypeConflict: Variable `x` already bound to type scalar, cannot be used as node'}, ...}}
        request    = <FixtureRequest for <Function test_match_after_optional_match>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `x` already bound to type scalar, cannot be used as node
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `x` already bound to type scalar, cannot be used as node'}
        datatable  = [['d']]
        expected   = []
        result     = {'error': 'VariableTypeConflict: Variable `x` already bound to type scalar, cannot be used as node'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': <graphforge.api.GraphForge object at 0...}, 'result': {'error': 'VariableTypeConflict: Variable `x` already bound to type scalar, cannot be used as node'}, ...}
tests.tck.test_features::test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 1.21s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f11743839c0>
        kwargs     = {'datatable': [['first', 'second'], ['(:A)', '(:C)']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool obje...': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}}
        request    = <FixtureRequest for <Function test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        datatable  = [['first', 'second'], ['(:A)', '(:C)']]
        expected   = [{'first': {'_node_pattern': '(:A)'}, 'second': {'_node_pattern': '(:C)'}}]
        result     = {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0...t': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}
tests.tck.test_features::test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list_with_bound_nodes

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.21s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f28399779c0>
        kwargs     = {'datatable': [['first', 'second'], ['(:A)', '(:C)']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool obje...': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}}
        request    = <FixtureRequest for <Function test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list_with_bound_nodes>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        datatable  = [['first', 'second'], ['(:A)', '(:C)']]
        expected   = [{'first': {'_node_pattern': '(:A)'}, 'second': {'_node_pattern': '(:C)'}}]
        result     = {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0...t': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}
tests.tck.test_features::test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list_with_bound_nodes_wrong_direction

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.36s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f28399779c0>
        kwargs     = {'datatable': [['first', 'second']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f22...': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}}
        request    = <FixtureRequest for <Function test_matching_relationships_into_a_list_and_matching_variable_length_using_the_list_with_bound_nodes_wrong_direction>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        datatable  = [['first', 'second']]
        expected   = []
        result     = {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0...t': {'error': 'VariableTypeConflict: Variable `rs` already bound to type scalar, cannot be used as relationship'}, ...}
tests.tck.test_features::test_matching_two_relationships

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 1.06s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f3c4d57b9c0>
        kwargs     = {'datatable': [['count(r)'], ['2']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca2...: <graphforge.api.GraphForge object at 0x7f3c47fca3c0>, 'parameters': {}, 'result': [{'count(r)': CypherInt(1)}], ...}}
        request    = <FixtureRequest for <Function test_matching_two_relationships>>
tests/tck/conftest.py:453: in verify_result_any_order_colon
    assert exp_row in actual_rows, f"Expected row not found: {exp_row}"
E   AssertionError: Expected row not found: {'count(r)': 2}
E   assert {'count(r)': 2} in [{'count(r)': 1}]
        actual_rows = [{'count(r)': 1}]
        datatable  = [['count(r)'], ['2']]
        exp_row    = {'count(r)': 2}
        expected   = [{'count(r)': CypherInt(2)}]
        expected_rows = [{'count(r)': 2}]
        result     = [{'count(r)': CypherInt(1)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f3c47fca270>, 'graph': <graphforge.api.GraphForge object at 0x7f3c47fca3c0>, 'parameters': {}, 'result': [{'count(r)': CypherInt(1)}], ...}
tests.tck.test_features::test_matching_variable_length_patterns_including_a_bound_relationship

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 1.49s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f11743839c0>
        kwargs     = {'datatable': [['c'], ['32']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0x7f116ed8a3c0>, 'parameters': {}, 'result': [{'c': CypherInt(84)}], ...}}
        request    = <FixtureRequest for <Function test_matching_variable_length_patterns_including_a_bound_relationship>>
tests/tck/conftest.py:453: in verify_result_any_order_colon
    assert exp_row in actual_rows, f"Expected row not found: {exp_row}"
E   AssertionError: Expected row not found: {'c': 32}
E   assert {'c': 32} in [{'c': 84}]
        actual_rows = [{'c': 84}]
        datatable  = [['c'], ['32']]
        exp_row    = {'c': 32}
        expected   = [{'c': CypherInt(32)}]
        expected_rows = [{'c': 32}]
        result     = [{'c': CypherInt(84)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f116ed8a270>, 'graph': <graphforge.api.GraphForge object at 0x7f116ed8a3c0>, 'parameters': {}, 'result': [{'c': CypherInt(84)}], ...}
tests.tck.test_features::test_min_over_mixed_values

Flake rate in main: 100.00% (Passed 0 times, Failed 338 times)

Stack Traces | 0.297s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f32d334f9c0>
        kwargs     = {'datatable': [['min(x)'], ['[1, 2]']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f32d1d...<graphforge.api.GraphForge object at 0x7f32d1dce3c0>, 'parameters': {}, 'result': [{'min(x)': CypherFloat(0.2)}], ...}}
        request    = <FixtureRequest for <Function test_min_over_mixed_values>>
tests/tck/conftest.py:453: in verify_result_any_order_colon
    assert exp_row in actual_rows, f"Expected row not found: {exp_row}"
E   AssertionError: Expected row not found: {'min(x)': (1, 2)}
E   assert {'min(x)': (1, 2)} in [{'min(x)': 0.2}]
        actual_rows = [{'min(x)': 0.2}]
        datatable  = [['min(x)'], ['[1, 2]']]
        exp_row    = {'min(x)': (1, 2)}
        expected   = [{'min(x)': {'_list_literal': '[1, 2]'}}]
        expected_rows = [{'min(x)': (1, 2)}]
        result     = [{'min(x)': CypherFloat(0.2)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f32d1dce270>, 'graph': <graphforge.api.GraphForge object at 0x7f32d1dce3c0>, 'parameters': {}, 'result': [{'min(x)': CypherFloat(0.2)}], ...}
tests.tck.test_features::test_nodes_on_null_path

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.462s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f842f37b9c0>
        kwargs     = {'datatable': [['nodes(p)', 'nodes(null)'], ['null', 'null']], 'tck_context': {'_pool': <tests.tck.conftest._InstanceP..., 'result': {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}, ...}}
        request    = <FixtureRequest for <Function test_nodes_on_null_path>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}
        datatable  = [['nodes(p)', 'nodes(null)'], ['null', 'null']]
        expected   = [{'nodes(null)': CypherNull(None), 'nodes(p)': CypherNull(None)}]
        result     = {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f842ddf6270>, 'graph': <graphforge.api.GraphForge object at 0...}, 'result': {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}, ...}
tests.tck.test_features::test_relationships_on_null_path

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.808s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f842f37b9c0>
        kwargs     = {'datatable': [['relationships(p)', 'relationships(null)'], ['null', 'null']], 'tck_context': {'_pool': <tests.tck.con..., 'result': {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}, ...}}
        request    = <FixtureRequest for <Function test_relationships_on_null_path>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node
E   assert 'error' not in {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}
        datatable  = [['relationships(p)', 'relationships(null)'], ['null', 'null']]
        expected   = [{'relationships(null)': CypherNull(None), 'relationships(p)': CypherNull(None)}]
        result     = {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f842ddf6270>, 'graph': <graphforge.api.GraphForge object at 0...}, 'result': {'error': 'VariableTypeConflict: Variable `a` already bound to type scalar, cannot be used as node'}, ...}
tests.tck.test_features::test_remove_two_labels_from_a_node_with_three_labels

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.279s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f28399779c0>
        kwargs     = {'datatable': [['labels(n)'], ["['L2']"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28...TE\n\t* RETURN\n\t* SEMICOLON\n\t* OPTIONAL\n\t* SKIP\n\t* SET\n\t* LIMIT\n\t* REMOVE\n\t* UNWIND\n\t* UNION\n"}, ...}}
        request    = <FixtureRequest for <Function test_remove_two_labels_from_a_node_with_three_labels>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches ':' in the current parser context, at line 2 col 12
E     
E     REMOVE n:L1:L3
E                ^
E     Expected one of: 
E     	* COMMA
E     	* CREATE
E     	* CALL
E     	* MERGE
E     	* ORDER
E     	* DETACH
E     	* WITH
E     	* MATCH
E     	* DELETE
E     	* RETURN
E     	* SEMICOLON
E     	* OPTIONAL
E     	* SKIP
E     	* SET
E     	* LIMIT
E     	* REMOVE
E     	* UNWIND
E     	* UNION
E     
E   assert 'error' not in {'error': "No terminal matches ':' in the current parser context, at line 2 col 12\n\nREMOVE n:L1:L3\n           ^\nExpected one of: \n\t* COMMA\n\t* CREATE\n\t* CALL\n\t* MERGE\n\t* ORDER\n\t* DETACH\n\t* WITH\n\t* MATCH\n\t* DELETE\n\t* RETURN\n\t* SEMICOLON\n\t* OPTIONAL\n\t* SKIP\n\t* SET\n\t* LIMIT\n\t* REMOVE\n\t* UNWIND\n\t* UNION\n"}
        datatable  = [['labels(n)'], ["['L2']"]]
        expected   = [{'labels(n)': {'_list_literal': "['L2']"}}]
        result     = {'error': "No terminal matches ':' in the current parser context, at line 2 col 12\n\nREMOVE n:L1:L3\n           ^\nEx...t* DELETE\n\t* RETURN\n\t* SEMICOLON\n\t* OPTIONAL\n\t* SKIP\n\t* SET\n\t* LIMIT\n\t* REMOVE\n\t* UNWIND\n\t* UNION\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0...ETE\n\t* RETURN\n\t* SEMICOLON\n\t* OPTIONAL\n\t* SKIP\n\t* SET\n\t* LIMIT\n\t* REMOVE\n\t* UNWIND\n\t* UNION\n"}, ...}
tests.tck.test_features::test_singlelabels_expression_on_relationships

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.959s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7fcc7f16f9c0>
        kwargs     = {'datatable': [['r', 'result'], ['[:T1]', 'false'], ['[:T2]', 'true'], ['[:t2]', 'false'], ['[:T3]', 'false'], ['[:T4]...t=8), 'result': CypherBool(False)}, {'r': EdgeRef(id=5, type='T4', src=9, dst=10), 'result': CypherBool(False)}], ...}}
        request    = <FixtureRequest for <Function test_singlelabels_expression_on_relationships>>
tests/tck/conftest.py:453: in verify_result_any_order_colon
    assert exp_row in actual_rows, f"Expected row not found: {exp_row}"
E   AssertionError: Expected row not found: {'r': {'type': 'T2', 'properties': {}}, 'result': True}
E   assert {'r': {'properties': {}, 'type': 'T2'}, 'result': True} in [{'r': {'properties': {}, 'type': 'T1'}, 'result': False}, {'r': {'properties': {}, 'type': 'T2'}, 'result': False}, {'r': {'properties': {}, 'type': 't2'}, 'result': False}, {'r': {'properties': {}, 'type': 'T3'}, 'result': False}, {'r': {'properties': {}, 'type': 'T4'}, 'result': False}]
        actual_rows = [{'r': {'properties': {}, 'type': 'T1'}, 'result': False}, {'r': {'properties': {}, 'type': 'T2'}, 'result': False}, {...e}, {'r': {'properties': {}, 'type': 'T3'}, 'result': False}, {'r': {'properties': {}, 'type': 'T4'}, 'result': False}]
        datatable  = [['r', 'result'], ['[:T1]', 'false'], ['[:T2]', 'true'], ['[:t2]', 'false'], ['[:T3]', 'false'], ['[:T4]', 'false']]
        exp_row    = {'r': {'properties': {}, 'type': 'T2'}, 'result': True}
        expected   = [{'r': {'_rel_pattern': ':T1'}, 'result': CypherBool(False)}, {'r': {'_rel_pattern': ':T2'}, 'result': CypherBool(True...r': {'_rel_pattern': ':T3'}, 'result': CypherBool(False)}, {'r': {'_rel_pattern': ':T4'}, 'result': CypherBool(False)}]
        expected_rows = [{'r': {'properties': {}, 'type': 'T1'}, 'result': False}, {'r': {'properties': {}, 'type': 'T2'}, 'result': True}, {'...e}, {'r': {'properties': {}, 'type': 'T3'}, 'result': False}, {'r': {'properties': {}, 'type': 'T4'}, 'result': False}]
        result     = [{'r': EdgeRef(id=1, type='T1', src=1, dst=2), 'result': CypherBool(False)}, {'r': EdgeRef(id=2, type='T2', src=3, dst...c=7, dst=8), 'result': CypherBool(False)}, {'r': EdgeRef(id=5, type='T4', src=9, dst=10), 'result': CypherBool(False)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea270>, 'graph': <graphforge.api.GraphForge object at 0...st=8), 'result': CypherBool(False)}, {'r': EdgeRef(id=5, type='T4', src=9, dst=10), 'result': CypherBool(False)}], ...}
tests.tck.test_features::test_statically_access_a_field_of_a_map_resulting_from_an_expression

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.211s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f6d5cc7f9c0>
        kwargs     = {'datatable': [['(list[1]).missing', '(list[1]).notMissing', '(list[1]).existing'], ['null', 'null', '42']], 'tck_cont...TS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}}
        request    = <FixtureRequest for <Function test_statically_access_a_field_of_a_map_resulting_from_an_expression>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches '.' in the current parser context, at line 2 col 17
E     
E     RETURN (list[1]).missing, (list[1]).notMissing, (list[1]
E                     ^
E     Expected one of: 
E     	* ENDS
E     	* REMOVE
E     	* UNWIND
E     	* SKIP
E     	* COMMA
E     	* COMP_OP
E     	* MERGE
E     	* OR
E     	* LSQB
E     	* UNION
E     	* MATCH
E     	* AS
E     	* ADD_OP
E     	* DELETE
E     	* WITH
E     	* SEMICOLON
E     	* DETACH
E     	* CONTAINS
E     	* ORDER
E     	* IN
E     	* MULT_OP
E     	* STARTS
E     	* RETURN
E     	* SET
E     	* IS
E     	* CREATE
E     	* LIMIT
E     	* POW_OP
E     	* XOR
E     	* AND
E     	* CALL
E     	* OPTIONAL
E     
E   assert 'error' not in {'error': "No terminal matches '.' in the current parser context, at line 2 col 17\n\nRETURN (list[1]).missing, (list[1]).notMissing, (list[1]\n                ^\nExpected one of: \n\t* ENDS\n\t* REMOVE\n\t* UNWIND\n\t* SKIP\n\t* COMMA\n\t* COMP_OP\n\t* MERGE\n\t* OR\n\t* LSQB\n\t* UNION\n\t* MATCH\n\t* AS\n\t* ADD_OP\n\t* DELETE\n\t* WITH\n\t* SEMICOLON\n\t* DETACH\n\t* CONTAINS\n\t* ORDER\n\t* IN\n\t* MULT_OP\n\t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        datatable  = [['(list[1]).missing', '(list[1]).notMissing', '(list[1]).existing'], ['null', 'null', '42']]
        expected   = [{'(list[1]).existing': CypherInt(42), '(list[1]).missing': CypherNull(None), '(list[1]).notMissing': CypherNull(None)}]
        result     = {'error': "No terminal matches '.' in the current parser context, at line 2 col 17\n\nRETURN (list[1]).missing, (list[...t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f6d576aa270>, 'graph': <graphforge.api.GraphForge object at 0...RTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}
tests.tck.test_features::test_statically_access_a_property_of_a_node_resulting_from_an_expression

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.396s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f6d5cc7f9c0>
        kwargs     = {'datatable': [['(list[1]).missing', '(list[1]).missingToo', '(list[1]).existing'], ['null', 'null', '42']], 'tck_cont...TS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}}
        request    = <FixtureRequest for <Function test_statically_access_a_property_of_a_node_resulting_from_an_expression>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches '.' in the current parser context, at line 3 col 17
E     
E     RETURN (list[1]).missing, (list[1]).missingToo, (list[1]
E                     ^
E     Expected one of: 
E     	* ENDS
E     	* REMOVE
E     	* UNWIND
E     	* SKIP
E     	* COMMA
E     	* COMP_OP
E     	* MERGE
E     	* OR
E     	* LSQB
E     	* UNION
E     	* MATCH
E     	* AS
E     	* ADD_OP
E     	* DELETE
E     	* WITH
E     	* SEMICOLON
E     	* DETACH
E     	* CONTAINS
E     	* ORDER
E     	* IN
E     	* MULT_OP
E     	* STARTS
E     	* RETURN
E     	* SET
E     	* IS
E     	* CREATE
E     	* LIMIT
E     	* POW_OP
E     	* XOR
E     	* AND
E     	* CALL
E     	* OPTIONAL
E     
E   assert 'error' not in {'error': "No terminal matches '.' in the current parser context, at line 3 col 17\n\nRETURN (list[1]).missing, (list[1]).missingToo, (list[1]\n                ^\nExpected one of: \n\t* ENDS\n\t* REMOVE\n\t* UNWIND\n\t* SKIP\n\t* COMMA\n\t* COMP_OP\n\t* MERGE\n\t* OR\n\t* LSQB\n\t* UNION\n\t* MATCH\n\t* AS\n\t* ADD_OP\n\t* DELETE\n\t* WITH\n\t* SEMICOLON\n\t* DETACH\n\t* CONTAINS\n\t* ORDER\n\t* IN\n\t* MULT_OP\n\t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        datatable  = [['(list[1]).missing', '(list[1]).missingToo', '(list[1]).existing'], ['null', 'null', '42']]
        expected   = [{'(list[1]).existing': CypherInt(42), '(list[1]).missing': CypherNull(None), '(list[1]).missingToo': CypherNull(None)}]
        result     = {'error': "No terminal matches '.' in the current parser context, at line 3 col 17\n\nRETURN (list[1]).missing, (list[...t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f6d576aa270>, 'graph': <graphforge.api.GraphForge object at 0...RTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}
tests.tck.test_features::test_statically_access_a_property_of_a_relationship_resulting_from_an_expression

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.514s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f6d5cc7f9c0>
        kwargs     = {'datatable': [['(list[1]).missing', '(list[1]).missingToo', '(list[1]).existing'], ['null', 'null', '42']], 'tck_cont...TS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}}
        request    = <FixtureRequest for <Function test_statically_access_a_property_of_a_relationship_resulting_from_an_expression>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: No terminal matches '.' in the current parser context, at line 3 col 17
E     
E     RETURN (list[1]).missing, (list[1]).missingToo, (list[1]
E                     ^
E     Expected one of: 
E     	* ENDS
E     	* REMOVE
E     	* UNWIND
E     	* SKIP
E     	* COMMA
E     	* COMP_OP
E     	* MERGE
E     	* OR
E     	* LSQB
E     	* UNION
E     	* MATCH
E     	* AS
E     	* ADD_OP
E     	* DELETE
E     	* WITH
E     	* SEMICOLON
E     	* DETACH
E     	* CONTAINS
E     	* ORDER
E     	* IN
E     	* MULT_OP
E     	* STARTS
E     	* RETURN
E     	* SET
E     	* IS
E     	* CREATE
E     	* LIMIT
E     	* POW_OP
E     	* XOR
E     	* AND
E     	* CALL
E     	* OPTIONAL
E     
E   assert 'error' not in {'error': "No terminal matches '.' in the current parser context, at line 3 col 17\n\nRETURN (list[1]).missing, (list[1]).missingToo, (list[1]\n                ^\nExpected one of: \n\t* ENDS\n\t* REMOVE\n\t* UNWIND\n\t* SKIP\n\t* COMMA\n\t* COMP_OP\n\t* MERGE\n\t* OR\n\t* LSQB\n\t* UNION\n\t* MATCH\n\t* AS\n\t* ADD_OP\n\t* DELETE\n\t* WITH\n\t* SEMICOLON\n\t* DETACH\n\t* CONTAINS\n\t* ORDER\n\t* IN\n\t* MULT_OP\n\t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        datatable  = [['(list[1]).missing', '(list[1]).missingToo', '(list[1]).existing'], ['null', 'null', '42']]
        expected   = [{'(list[1]).existing': CypherInt(42), '(list[1]).missing': CypherNull(None), '(list[1]).missingToo': CypherNull(None)}]
        result     = {'error': "No terminal matches '.' in the current parser context, at line 3 col 17\n\nRETURN (list[1]).missing, (list[...t* STARTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f6d576aa270>, 'graph': <graphforge.api.GraphForge object at 0...RTS\n\t* RETURN\n\t* SET\n\t* IS\n\t* CREATE\n\t* LIMIT\n\t* POW_OP\n\t* XOR\n\t* AND\n\t* CALL\n\t* OPTIONAL\n"}, ...}
tests.tck.test_features::test_updating_one_property_with_on_create

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.892s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f28399779c0>
        kwargs     = {'datatable': [['keyValue'], ["['name->foo']"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at ... 0x7f28383f23c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}}
        request    = <FixtureRequest for <Function test_updating_one_property_with_on_create>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got EdgeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got EdgeRef'}
        datatable  = [['keyValue'], ["['name->foo']"]]
        expected   = [{'keyValue': {'_list_literal': "['name->foo']"}}]
        result     = {'error': 'Subscript operation requires list or map, got EdgeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f28383f2270>, 'graph': <graphforge.api.GraphForge object at 0x7f28383f23c0>, 'parameters': {}, 'result': {'error': 'Subscript operation requires list or map, got EdgeRef'}, ...}
tests.tck.test_features::test_use_dynamic_property_lookup_based_on_parameters_when_there_is_lhs_type_information

Flake rate in main: 100.00% (Passed 0 times, Failed 378 times)

Stack Traces | 0.393s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7fcc7f16f9c0>
        kwargs     = {'datatable': [['value'], ["'Apa'"]], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea...c0>, 'parameters': {'idx': 'name'}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}}
        request    = <FixtureRequest for <Function test_use_dynamic_property_lookup_based_on_parameters_when_there_is_lhs_type_information>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: Subscript operation requires list or map, got NodeRef
E   assert 'error' not in {'error': 'Subscript operation requires list or map, got NodeRef'}
        datatable  = [['value'], ["'Apa'"]]
        expected   = [{'value': CypherString('Apa')}]
        result     = {'error': 'Subscript operation requires list or map, got NodeRef'}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7fcc7dbea270>, 'graph': <graphforge.api.GraphForge object at 0...3c0>, 'parameters': {'idx': 'name'}, 'result': {'error': 'Subscript operation requires list or map, got NodeRef'}, ...}
tests.tck.test_features::test_using_a_list_comprehension_in_a_where

Flake rate in main: 100.00% (Passed 0 times, Failed 358 times)

Stack Traces | 0.942s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_result_any_order_colon at 0x7f5d2b64b9c0>
        kwargs     = {'datatable': [['b'], ['(:C)']], 'tck_context': {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0x7f5d2a0ca3c0>, 'parameters': {}, 'result': {'error': "'b'"}, ...}}
        request    = <FixtureRequest for <Function test_using_a_list_comprehension_in_a_where>>
tests/tck/conftest.py:444: in verify_result_any_order_colon
    assert "error" not in result, f"Query error: {result.get('error')}"
E   AssertionError: Query error: 'b'
E   assert 'error' not in {'error': "'b'"}
        datatable  = [['b'], ['(:C)']]
        expected   = [{'b': {'_node_pattern': '(:C)'}}]
        result     = {'error': "'b'"}
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f5d2a0ca270>, 'graph': <graphforge.api.GraphForge object at 0x7f5d2a0ca3c0>, 'parameters': {}, 'result': {'error': "'b'"}, ...}
tests.tck.test_features::test_using_rand_in_aggregations

Flake rate in main: 100.00% (Passed 0 times, Failed 357 times)

Stack Traces | 0.158s run time
.venv/lib/python3.13.../site-packages/_pytest/fixtures.py:915: in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^
        fixturefunc = <function verify_compile_error_with_code at 0x7f7ff7794fe0>
        kwargs     = {'error_code': 'NonConstantExpression', 'error_type': 'SyntaxError', 'tck_context': {'_pool': <tests.tck.conftest._Ins...aphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': [{'count(rand())': CypherInt(1)}], ...}}
        request    = <FixtureRequest for <Function test_using_rand_in_aggregations>>
tests/tck/conftest.py:604: in verify_compile_error_with_code
    pytest.fail(f"Expected {error_type} with code {error_code} but query succeeded")
E   Failed: Expected SyntaxError with code NonConstantExpression but query succeeded
        error_code = 'NonConstantExpression'
        error_type = 'SyntaxError'
        result     = [{'count(rand())': CypherInt(1)}]
        tck_context = {'_pool': <tests.tck.conftest._InstancePool object at 0x7f7ff61fe270>, 'graph': <graphforge.api.GraphForge object at 0x7f7ff61fe3c0>, 'parameters': {}, 'result': [{'count(rand())': CypherInt(1)}], ...}

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

- Add 0x10FFFF upper-bound check on \uXXXX codepoint before calling chr(),
  raising InvalidUnicodeLiteral instead of letting Python raise ValueError
- Move Full OpenCypher* footnote to bottom of Why GraphForge? section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@DecisionNerd DecisionNerd merged commit a49e37b into main May 1, 2026
32 checks passed
@DecisionNerd DecisionNerd deleted the fix/258-syntax-error-validation branch May 1, 2026 20:14
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.

fix: missing SyntaxError validation — same-variable pattern reuse, unicode escapes

1 participant