v0.1.5: GQL Mutable Projection Stabilization
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, withgraph.gql_explain()for stable plan inspection. - Added mutable GQL support for mapped source tables, including
CREATE,
MERGE,SET,REMOVE, relationshipDELETE, andDETACH DELETEpaths
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 intograph.sync_mode = 'manual'. - Upgrade note: deployments that relied on implicit manual refresh should set
graph.sync_mode = 'manual'before runninggraph.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
NULLor blank
label_columnvalues 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, andmaxignore JSONnullvalues whilecount(*)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), andlength(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..1path-distinct matches. - Stabilized
graph.gql_explain()output around registered table labels and
fixed catalog reads ofregclassfields 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