Skip to content

v0.1.5: GQL Mutable Projection Stabilization

Choose a tag to compare

@evokoa-admin evokoa-admin released this 01 Jun 16:45
· 277 commits to main since this release

v0.1.5: GQL Mutable Projection Stabilization

v0.1.5 introduces pgGraph's GQL surface and the mutable projection path that
lets mapped GQL writes update PostgreSQL source rows while keeping the in-memory
graph view transactionally consistent. This release turns GQL from an internal
planning target into a documented SQL entry point, adds node and relationship
mutability through the overlay engine, and keeps the v0.1.4 installation and
SQL function surface compatible.

Highlights

  • Added graph.gql() as the primary standards-oriented graph query surface for
    pgGraph, with graph.gql_explain() for stable plan inspection.
  • Added mutable GQL support for mapped source tables, including CREATE,
    MERGE, SET, REMOVE, relationship DELETE, and DETACH DELETE paths
    backed by PostgreSQL row changes and transaction-local projection deltas.
  • Preserved PostgreSQL as the source of truth for mutable graph data: GQL writes
    honor table mappings, ACL/RLS checks, tenant scope, rollback behavior, and
    overlay limits.
  • Added transaction lifecycle coverage for GQL create, set/remove, delete, and
    merge race paths in the release gate.
  • Made trigger sync the default sync mode, so a normal graph.build() installs
    source-table sync triggers and topology reads catch up to pending rows by
    default unless operators opt into graph.sync_mode = 'manual'.
  • Upgrade note: deployments that relied on implicit manual refresh should set
    graph.sync_mode = 'manual' before running graph.build(). When trigger
    mode is active, graph.build() emits a warning that sync triggers were
    installed on registered source tables.
  • Fixed mapped dynamic-label edge deletes so rows with NULL or blank
    label_column values fall back to the registered relationship label.
  • Preserved transaction-local nodes for non-tenanted tables even when a session
    tenant scope is active, while still hiding unscoped writes for tenanted tables.
  • Fixed optional aggregate semantics so collect, count(expr), sum, avg,
    min, and max ignore JSON null values while count(*) still counts
    every input row.
  • Cancelled net-neutral transaction edge deltas before overlay-cap accounting,
    avoiding false overlay-limit failures for insert/delete pairs that leave no
    pending edge.
  • Normalized GQL path function names case-insensitively for nodes(path),
    relationships(path), and length(path).
  • Returned typed GQL errors for value-projection invariants instead of relying
    on internal panics.
  • Decoupled variable-length path cardinality from whether the query returns a
    path value, and preserved explicit *1..1 path-distinct matches.
  • Stabilized graph.gql_explain() output around registered table labels and
    fixed catalog reads of regclass fields so explain fixtures no longer drift
    with table OIDs.
  • Updated the playground release gate to rebuild the Docker image and recreate
    the playground container during the full release gate, preventing stale
    extension binaries from passing or failing the fixture suite.

Testing

  • Added regression coverage for dynamic-label delete fallback values,
    non-tenanted transaction-local node visibility under tenant scope, explicit
    single-hop variable-length path cardinality, catalog-backed explain labels,
    and playground release-gate freshness.
  • Spawned a second-opinion Rust review subagent for the GQL/projection changes;
    all findings from that pass were fixed.

Validation

The full pg17 release gate passed, including fmt, clippy, docs, unit tests,
pgrx SQL tests, cargo-deny, fuzz binary checks, package validation, fresh
install smoke, metadata audit, SQLSTATE/ACL boundary tests, backup/restore,
advisory-lock regressions, concurrency, synthetic smoke, rebuilt playground
fixtures, pgbench sync stress, and GQL transaction lifecycle scripts:

PG_VERSION_FEATURE=pg17 ./tests/heavy/run_release_gate.sh