Skip to content

v0.12.2

Latest

Choose a tag to compare

@github-actions github-actions released this 11 Aug 20:12

v0.12.2 (2026-08-11)

Documentation

  • docs: multi-source procedural BFS — why it fails at runtime and the options

A property start filter transpiles in procedural mode (cardinality is
data-dependent) and hits the embedded single-seed RAISE_ERROR when it
matches several nodes. Document the architectural reason (no seed column
in frontier/visited/result), the two workarounds (CTE mode; per-seed
loop), and — in the developer notes — the two designs to lift it, with
the real cost being re-A/B of every memory-optimization flag rather than
the rewrite itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> (6ed6450)

Fix

  • fix: silent wrong answers in joins, aggregates, naming + loud error contracts

Fixes the ten defects catalogued in docs_help_dev/testing/test-failures-report.md
(F1-F10), each backed by new tests that failed before and pass after.

Silent wrong answers:

  • Repeated pattern variable ((a)-[:T]->(a), closed cycles) never emitted the
    closing SINK join pair, returning every path instead of every cycle. The
    shared-variable branch in match_tree now binds the node to the preceding
    relationship's far endpoint before skipping the duplicate data source.
  • percentileCont/percentileDisc vanished: the visitor dropped arguments past
    the first (new extra_parameters on the aggregation AST node) and the
    renderer had no pattern (PERCENTILE_CONT({1}) WITHIN GROUP (ORDER BY {0})).
    Pattern-less aggregates now raise instead of emitting the bare operand.
  • LIMIT $n / SKIP $s were silently discarded; _extract_int_value now raises
    TranspilerNotSupportedException for non-literal expressions.
  • RETURN a.name, b.name emitted two columns both named "name"; colliding
    auto-derived aliases are qualified as a_name/b_name (explicit AS untouched).
  • RETURN * / WITH * leaked internal gsql2rsql* columns and anonymous edge
    plumbing; the star now expands to the named variables in scope.

Invalid SQL made valid or loud:

  • size(<string>) renders LENGTH() via type dispatch from the operator's input
    schema (AST data_type is often unset at render time).
  • list + list renders CONCAT(), with list literals as ARRAY(...) operands.
  • WHERE a:Person label predicates raise with a move-into-pattern hint instead
    of rendering a non-boolean WHERE (both grammar paths).
  • Unknown functions raise TranspilerNotSupportedException naming what the
    user wrote (raw_name) instead of leaking NotImplementedError(INVALID).
  • add_edge derives missing source/sink id properties from the descriptor's
    node_id_columns and rejects only when underivable, so hand-built schemas
    can no longer produce dangling join keys.

Documented (not fixed): relationship uniqueness (edge isomorphism) is not
enforced in fixed-length patterns - guarded by a strict xfail; unbounded VLP
depth cap of 10 is now documented and locked by tests.

Test infrastructure: get_base_spark() probes SparkContext liveness so modules
using the shared session survive legacy modules that call spark.stop().

Suites: non-PySpark 1801 passed / 7 skipped / 1 xfailed; PySpark 261 passed /
6 xfailed; pyright and mypy at 0 errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> (41c10d3)

  • fix: actionable errors for unknown edge types + user-facing limitations docs

Planner (data_source.py, recursive_traversal.py):

  • Unknown relationship types (single-hop AND VLP) used to either fail with
    a generic "Failed to bind relationship" (single-hop) or a confusing
    "Internal error: No enriched data for RecursiveTraversalOperator" three
    phases later in Enrichment (VLP) -- the latter reading as a transpiler
    bug when it's a schema/config mismatch. A typo inside an OR list
    ([:OWNS|KNOWS]) silently transpiled, dropping the bad type instead of
    raising.
  • Added validate_edge_verbs_exist()/_describe_available_edge_verbs() in
    data_source.py, called from both binding sites, mirroring the node-type
    diagnostics: lists registered edge types, suggests a case-insensitive
    near-match. Distinguishes "verb exists for no endpoint pair" (typo,
    raises) from "verb exists but not for these endpoints" (silently pruned
    from OR lists -- load-bearing for restricted edge_combinations schemas).
  • get_all_edge_schemas() added to SimpleSQLSchemaProvider.

Docs:

  • New docs/limitations.md (mkdocs nav: User Guide > Limitations):
    user-facing quick-reference table, CTE vs procedural feature matrix,
    schema-binding error guide, parser notes (backticks, unaliased
    projection aliases, != rejection), correctness/performance caveats.
    user-guide.md's inline section now summarizes and links to it.
  • fix_transpiler_bugs skill: new step 7 requiring both limitations docs
    (docs_help_dev/ internal, docs/ user-facing) to be updated whenever a
    fix adds/removes a guardrail or NotSupported path.

Tests: tests/test_unknown_edge_type_errors.py (10 cases: single-hop, VLP,
OR-list typo detection, endpoint-pruning-not-a-typo regression). (554761c)