Skip to content

Add envio serve — Hasura-compatible GraphQL server#1386

Open
DZakh wants to merge 31 commits into
mainfrom
claude/rust-graphql-envio-serve-1g12vr
Open

Add envio serve — Hasura-compatible GraphQL server#1386
DZakh wants to merge 31 commits into
mainfrom
claude/rust-graphql-envio-serve-1g12vr

Conversation

@DZakh

@DZakh DZakh commented Jul 7, 2026

Copy link
Copy Markdown
Member

Implements a production-ready GraphQL server (envio serve) that provides Hasura API compatibility over Postgres, enabling local development and testing without Hasura Cloud.

Summary

This PR adds a complete GraphQL execution engine in Rust that:

  • Parses and validates GraphQL queries against a dynamically built schema
  • Compiles queries to SQL that mirrors Hasura v2.43's output exactly
  • Executes queries over Postgres and returns byte-identical JSON responses
  • Supports subscriptions via WebSocket (both graphql-transport-ws and graphql-ws protocols)
  • Implements role-based access control and introspection
  • Includes comprehensive error handling with Hasura-shaped error messages

Key Changes

Core execution pipeline (packages/cli/src/serve/):

  • mod.rs: Server initialization and state management
  • http.rs: HTTP handler for /v1/graphql and health endpoints
  • ws.rs: WebSocket subscription support (both modern and legacy protocols)
  • env_config.rs: Environment configuration with TLS support
  • model.rs: Server model derived from Postgres catalog + indexer metadata
  • project_schema.rs: Version-tolerant project config reading

GraphQL schema & introspection (packages/cli/src/serve/gql/):

  • schema_build.rs: Per-role schema generation matching Hasura's exact shape
  • types.rs: In-memory GraphQL type system
  • introspection.rs: __schema/__type resolution with byte-identical output

Request execution (packages/cli/src/serve/exec/):

  • mod.rs: Request pipeline orchestration
  • error.rs: Hasura-shaped error responses
  • ir.rs: Intermediate representation of validated operations
  • validate/mod.rs: GraphQL parsing, validation, and IR generation
    • args.rs: Argument coercion (select, by_pk, stream)
    • bool_exp.rs: Boolean expression parsing
    • coerce.rs: Scalar type coercion (strict GraphQL semantics)
    • selection.rs: Selection set flattening
    • variables.rs: Variable binding and coercion
    • fragments.rs: Fragment definition tracking
    • prescan.rs: Lexical pre-scan for duplicate detection
  • sql.rs: SQL compilation and execution
    • Generates SQL matching Hasura's structure: row_to_json, json_agg, LEFT OUTER JOIN LATERAL
    • Handles numeric type stringification per Hasura's STRINGIFY_NUMERIC_TYPES
    • Executes prepared statements and returns raw Postgres JSON

Testing & fixtures (packages/e2e-tests/fixtures/differential/):

  • schema.sql: Differential test fixture schema
  • seed.sql: Deterministic test data
  • bench-seed.sql: Benchmark volume data
  • hasura-baseline.json: Recorded Hasura response baseline
  • snapshots/default/: 200+ test case snapshots covering:
    • Basic queries, aliases, fragments, variables
    • Aggregates, nested relationships, filtering
    • Ordering, pagination, distinct-on
    • Error cases (validation, type mismatches, access control)
    • Introspection queries
    • Numeric type handling edge cases

CLI integration:

  • packages/cli/src/cli_args/clap_definitions.rs: Added serve command
  • packages/cli/src/executor/mod.rs: Wired serve command execution
  • packages/cli/src/lib.rs: Exposed serve module
  • packages/cli/Cargo.toml: Added dependencies (tokio, tokio-postgres, graphql-parser, serde_json)
  • packages/cli/test/configs/: Legacy config format test fixtures

CI/CD:

  • .github/workflows/build_and_verify.yml: Added differential benchmark job

Notable Implementation Details

  • Byte-identical serialization: SQL compilation produces JSON that matches Hasura's output exactly, verified against 200+ snapshot tests

https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf

claude and others added 28 commits July 2, 2026 07:14
Fixture DDL + seed derived from scenarios/test_codegen, a replica of the
indexer's Hasura tracking calls with response-limit/aggregate knobs, a
253-case corpus (selects, filters, ordering, relationships, aggregates,
scalars serialization, internal tables, errors, introspection, limits),
and recorded ground-truth snapshots from hasura/graphql-engine v2.43.0.

The differential.test.ts suite runs every case against both Hasura and
envio serve and requires identical responses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Adds the serve module skeleton: minimal version-tolerant config.yaml
reader (only the schema field), lenient schema.graphql relationship
extraction, live pg_catalog introspection, the server model merging
both, per-role GraphQL type registry mirroring Hasura's generated
schema, the execution IR, and the axum HTTP entry. Validation, SQL
planning, introspection resolution and websockets are stubs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Adds per-type where-operator, aggregate, ordering/distinct, variable
coercion, scalar serialization, relationship, and error-shape matrices,
each verified deterministic across two live Hasura runs. Also adds the
per-case benchmark runner (bench.ts + bench-seed.sql) and the
diffServe.ts iteration helper that diffs a running envio serve against
the stored oracle snapshots.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Hand-rolled clients for graphql-transport-ws and legacy graphql-ws,
plus live differential scenarios: live-query updates on data change,
by_pk with variables, queries over ws, error frames (whose shape
differs between the protocols), role gating, and streaming cursors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
The fixtures mirror the actual v2.21.5-tag config shape (networks/
rpc_config keys) that current strict HumanConfig parsing rejects; the
serve config reader must keep accepting them since it only reads the
top-level schema field.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
…trospection

The engine reproduces Hasura v2.43 semantics pinned by the oracle
corpus: a lexical pre-scan for cases graphql-parser can't represent,
Hasura-exact validation errors (paths, aeson-style coercion messages,
Haskell Scientific bounds displays), field merging, fragment/directive/
variable rules, response-limit clamping, and SQL that splices
Postgres-built JSON verbatim (row_to_json rows, json_agg lists,
json_build_object aggregates, LATERAL relationship joins, EXISTS
filters) so serialization is byte-identical - including the
stringified-numerics asymmetries and PG error shapes.

586 of 591 default-phase corpus cases match Hasura exactly; the
remainder need the admin mutation surface, http invalid-json shape,
introspection root key order, and aggregate-nodes response capping.

Also adds the differential CI job running the suite against service
containers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
ws.rs: both Hasura subprotocols (graphql-transport-ws and legacy
graphql-ws) with connection lifecycle, per-protocol error frame shapes,
ka keepalives, 1s live-query polling that pushes only on change, and
streaming cursors advanced via a parallel text-cast probe query.

Also: comparison-operator descriptions in introspection, Hasura's exact
malformed-body error taxonomy (invalid-json/parse-failed incl. the
lone-surrogate decodeUtf8 case), and aggregate-nodes capping at the
public response limit while aggregates stay uncapped.

587/591 default-phase and 19/19 limited-phase corpus cases match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Scopes envio serve to the read operations HyperIndex exposes (admin
mutations are deliberately out): the full-admin introspection case is
replaced with query_root/subscription_root comparisons, and the two
mutation-execution cases are dropped. Fixes the lone-surrogate body
error mapping (serde reports it as 'unexpected end of hex escape').

The suite now covers 590 default-phase + 19 limited-phase HTTP cases
and 12 WebSocket subscription scenarios across both Hasura protocols,
all byte-identical between engines.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
- Wrong admin secret was returning HTTP 401 with an unquoted message;
  live Hasura actually returns HTTP 200 with header names quoted in the
  message ('invalid "x-hasura-admin-secret"/"x-hasura-access-key"').
  Extended the corpus role type to admin-wrong to pin this.
- Investigated adding WITH TIES to the stream cursor SQL (suggested by
  Hasura's own subscription tests) but reverted it: real Hasura v2.43.0
  loses rows tied with the batch boundary on a single-column cursor
  instead of protecting them, and our original plain-LIMIT
  implementation already reproduced that exactly. Added a regression
  test pinning the real (buggy) behavior so it isn't re-introduced.
- Split bench.ts into --record-baseline (Hasura-only, run once, results
  cached to fixtures/differential/hasura-baseline.json and merged rather
  than overwritten on a --filter re-record) and the default engine-only
  mode, so Rust iteration never needs Hasura/Docker running. Removed the
  embedded oracle-diff from the engine mode - it produced false
  mismatches once bench-seed.sql changed row counts; diffServe.ts is the
  single source of truth for correctness, run separately against the
  small dataset.
- diffServe.ts now runs cases concurrently (~3s for 590 cases instead of
  sequential).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Surfaced by cross-referencing Hasura's own server/tests-py test suite
(Apache-2.0) for coverage gaps; this was the one genuinely missing
operator/edge-case pattern found after sampling boolexp, order_by,
limits, offset, enums, aggregations, and permissions test dirs - the
rest substantially overlaps our existing hand-authored corpus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
…rginal

Confirms the concurrency=6 sweep's apparent regressions were a benchmark-
methodology artifact (mixed heavy/light queries contending for one
shared Postgres instance across concurrent workers), not real engine
issues - verified by isolated single-request timing and a concurrency=1
re-measurement, both showing every flagged case is actually 1.4-3.8x
faster. Defaulted bench.ts to --concurrency 1 and documented the
tradeoff. Only rm-order-object-rel-dangling-nulls-first is measurably
(31%) slower, both engines sub-second - a correlated-subquery ordering
pattern worth a follow-up look, not a correctness issue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
A coverage audit (cross-referencing every CompareOp/aggregate-op/error-
code variant against the corpus) found _cast (CompareOp::CastText,
casting a jsonb column to text for String_comparison_exp matching) was
implemented but never exercised by any test. constraint-violation and
postgres-error error codes were also found uncovered but are correctly
unreachable from envio serve's read-only surface (class-23 constraint
violations only occur on writes; postgres-error requires a connection
failure, not a query condition) - not real gaps.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
…-by perf fix

- ENVIO_PG_SSL_MODE now connects over TLS with the server certificate
  verified against the platform's trusted root CA store (no toggle to
  skip verification); adds a live-handshake test proving both accept
  and reject paths work.
- Add a 3-job CI split: a required fast job diffing against committed
  oracle snapshots (Postgres only, no Hasura), an optional live-Hasura
  confidence job, and an optional benchmark job that records a fresh
  same-machine baseline per run.
- Fix table/column description (GraphQL docstring -> Hasura `comment`)
  propagation: envio serve was bleeding a relationship field's own
  description onto its underlying fk column, which real Hasura never
  does. Added differential coverage (table, column, bool_exp/order_by,
  and stream_cursor_value_input description behavior) recorded against
  live Hasura, and extended the test harness to actually send `comment`
  metadata matching packages/envio/src/Hasura.res.
- Fix slow ORDER BY on nested object-relationship columns by emitting a
  LEFT JOIN instead of a correlated subselect per row (safe: object
  relationships match at most one remote row).
- Dedupe identifier-quoting in sql.rs and drop dead relationship-
  description plumbing that Hasura's own introspection never surfaces.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Splits the 3470-line request validator/planner into exec/validate/
{args,bool_exp,coerce,fragments,prescan,selection,variables}.rs along
its existing section boundaries (mechanical move, no behavior change).
Pulls the self-contained tokenizer/prescan out of mod.rs, and replaces
every `use super::*` in the child modules with explicit imports so
cross-file dependencies are visible at a glance.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Production hardening (each behavior pinned by a docker-gated test in
serve/robustness_tests.rs):
- Bound every Postgres interaction: server-side statement_timeout plus a
  client-side whole-operation timeout (ENVIO_PG_QUERY_TIMEOUT_MS, default
  120s) so a frozen Postgres cannot hang requests; pool wait/connect
  timeouts (ENVIO_PG_POOL_WAIT_TIMEOUT_MS, ENVIO_PG_CONNECT_TIMEOUT_MS)
  so an exhausted pool sheds load instead of queuing forever.
- /healthz now probes the database (bounded SELECT 1) instead of
  unconditionally returning 200, so orchestrators can see outages.
- SIGTERM/Ctrl-C drains in-flight requests (25s bound) instead of
  hard-dropping connections.
- Subscriptions retry transient connection-level failures for a few
  polls and self-heal across Postgres blips instead of dying on the
  first error frame; deterministic query errors still terminate
  immediately, matching Hasura.

Memory (from a dedicated investigation; statement-cache growth measured
and ruled out):
- Cap the default pool at min(2*cores, 10), tunable via
  ENVIO_PG_POOL_MAX_SIZE — peak RSS was dominated by N concurrent
  fully-buffered large responses.
- Write Postgres' response text straight into the output buffer instead
  of an intermediate owned String (-21% peak on mixed load, -35% on
  concurrent large responses).

Review fixes:
- parse_decimal used unchecked exponent arithmetic: a literal like
  1e9223372036854775807 overflowed i64 and panicked under debug
  assertions (user-triggerable). Checked math now falls back to echoing
  the raw literal; regression cases added.
- Transient-vs-deterministic error classification is a structured
  GraphQLError::is_transient_infra() instead of a cross-file string
  match; pool failures carry the postgres-error code.
- The query timeout bounds the whole operation, not each root field, so
  a multi-root query cannot stack N timeout budgets.
- Drop dead GraphQLError::parse_failed and a stale allow(dead_code);
  collapse per-field test asserts into single whole-value asserts.

Verified: 40 serve unit tests (incl. 4 robustness chaos tests), clippy
-D warnings, fmt, and the full 629-case live differential suite (HTTP +
both WS protocols) against real Hasura — byte parity preserved.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
…iddleware

- Fix a real clippy drift (collapsible_match) blocking CI on the base commit.
- Rename serve-only pool/timeout tuning env vars from ENVIO_PG_* to
  ENVIO_SERVE_* (ENVIO_PG_HOST/PORT/USER/PASSWORD/DATABASE/SCHEMA/SSL_MODE
  stay ENVIO_PG_* since they're shared with the JS indexer's Env.res).
- Bounded exponential-backoff startup retry (ENVIO_SERVE_STARTUP_RETRY_BUDGET_MS,
  default 60s) when Postgres isn't reachable yet at boot; only retries
  connectivity failures, not real backend errors (bad credentials/database).
- WebSocket dead-client detection: server-driven protocol-level ping with a
  2x-interval dead-peer close (ENVIO_SERVE_WS_PING_INTERVAL_MS), so a
  black-holed client's subscription poll loop stops instead of running
  against Postgres forever in the background. SO_KEEPALIVE (+ tuned
  idle/interval/retries) on the listening socket as a network-level backstop.
- HTTP middleware on the query endpoint: tower ConcurrencyLimitLayer +
  request-timeout layer for load shedding above pool capacity, plus an
  optional per-IP rate limit (ENVIO_SERVE_RATE_LIMIT_PER_SEC).
- healthz polish: configurable probe timeout (ENVIO_SERVE_HEALTHZ_TIMEOUT_MS)
  and a separate /livez (process-only liveness, no DB probe).
- New docker-gated robustness tests for the black-holed-client close and
  startup-retry-then-healthy behaviors; extracted a shared test_support
  module (docker helpers, TestPg) out of robustness_tests/env_config to stop
  duplicating them.

Verified against the local dev Postgres: healthz/livez/query all correct,
WS ping frame observed. Full docker-gated suite deferred to CI (no docker
in this sandbox).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
…tness tests

- exec/sql.rs: emit_stream_select also aggregates each cursor column's
  last-row value (in final sort order) alongside the batch JSON, so
  execute_stream_root reads both from one query result. Halves DB load per
  _stream subscription poll — previously advance_stream_cursor fired a
  second, near-identical query just to read the cursor columns back out.
- exec/mod.rs: add execute_stream_operation (execute_operation's stream
  counterpart), sharing the query-timeout wrapper via a new
  with_query_timeout helper.
- ws.rs: run_subscription now calls execute_stream_operation directly for
  stream roots instead of execute_operation + a second advance_stream_cursor
  query; drop the now-dead probe-building code (advance_stream_cursor,
  clone_bool_exp, clone_compare_op).
- Fix two bugs CI's first real run of the new robustness tests caught:
  the black-holed-client test was calling ws.next() in a loop immediately
  (auto-ponging every server ping, so the connection never went idle)
  instead of actually going quiet first; the startup-retry test never
  applied the differential fixture schema to the freshly-started Postgres,
  so model building failed with "No tables to serve".

Verified against the local dev Postgres: a 3-row-batch stream subscription
over 10 seeded rows returns all rows across 4 polls in correct cursor order
with no duplicates, and stays silent (as designed) once exhausted. Full
docker-gated robustness suite deferred to CI (no docker in this sandbox).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
execute_operation_inner now runs every root field through join_all and
splices the resulting fragments back in the request's original order
(each fragment is computed independently, so completion order doesn't
matter). A query with N table root fields can hold up to N pooled
connections at once instead of serially, bounded by the existing
ENVIO_SERVE_POOL_MAX_SIZE / ENVIO_SERVE_POOL_WAIT_TIMEOUT_MS safety valves.

Verified against the local dev Postgres: a 3-root-field query (two table
roots plus __typename) returns all three fragments correctly ordered.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
…solution

- prescan.rs: f64-overflowing float literals are now rewritten to a unique
  finite per-occurrence sentinel (like the existing oversized-int handling)
  instead of just being recorded in a flat list. coerce.rs's Num::display
  looked up the original text by sign only ("first entry matching +/-"),
  so two distinct out-of-range float literals in the same query with the
  same sign would collapse to whichever text happened to come first --
  wrong error text for the second one. Keying by the sentinel's exact bit
  pattern fixes that; verified with a round-trip test walking the real
  graphql-parser AST to confirm the rewritten literal reparses to the exact
  same f64 bits. Also fixes a latent correctness gap this rewrite exposed:
  the Float/Float8 bounds check only looked at `f.is_infinite()`, which a
  rewritten (now-finite) sentinel would no longer trip -- it now also
  checks the sentinel map so `1e400` still errors instead of silently
  coercing to a huge finite value.
- model.rs: the three call sites resolving a GraphQL field name to its
  (possibly snake_cased) db column -- object-relationship fk columns,
  described scalar fields, array-relationship remote columns -- each
  hand-rolled the same "try original name, then snake_case" lookup.
  Consolidated into one resolve_db_column helper.

Verified against the local dev Postgres: object + array relationship
queries (User -> tokens -> owner/collection) resolve correctly through the
consolidated resolver.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
… blocks

- Extract the near-identical `arg`/`flag` process.argv parsing repeated in
  bench.ts, diffServe.ts, and record.ts into a shared
  packages/e2e-tests/src/differential/cliArgs.ts. (runSql was already a
  single shared helper in hasuraSetup.ts, so no dedup was needed there.)
- Add a `start-envio-serve` composite action (.github/actions/start-envio-serve)
  encapsulating the background-spawn + /healthz-poll sequence duplicated
  across differential-test's two serve starts and differential-benchmark's
  serve start, parameterized by port, working-directory, the two
  Hasura-compat env vars, and whether to kill a prior serve process first.
- Collapse the identical postgres/hasura `services:` blocks repeated across
  scenarios-test, differential-test, differential-test-live,
  differential-benchmark, and e2e-test into YAML anchors defined once on
  scenarios-test (first in file order) and referenced via aliases
  elsewhere — GitHub Actions' YAML parser accepts standard anchors/aliases
  even though composite actions can't encapsulate job-level `services:`.
  Verified by parsing before/after with PyYAML and diffing the resolved
  job objects: services blocks and all other job-level keys are identical.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
bench.ts only ever ran at concurrency=1; production traffic is
concurrent. soakLoad.ts fires a worker pool against a mixed sample of
the bench-flagged corpus for a configurable duration and asserts the
server stays healthy: zero 5xx, no RSS growth trend (leak), no fd
growth trend (leak), and no p99 latency drift over time. RSS/fd are
sampled from /proc directly; latency stats use reservoir sampling so
memory stays bounded on multi-hour runs. Defaults to a 60s smoke run;
--duration 2h --spawn is the real acceptance soak.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
…+ TS harness

- bench-report.md: rerun the full differential bench sweep against
  cargo build --release --lib instead of the debug build the prior numbers
  were from. Geomean speedup x4.81 (was x3.85 debug), peak envio RSS 533MB
  (was 931MB debug). Full differential parity (596/596 default phase,
  19/19 limited) reconfirmed on the release binary before benchmarking.
  Also ran a 45s RSS-load smoke test against the release binary via the new
  soak harness; documented the result and that the real 2h acceptance run
  hasn't been executed yet (impractical in an interactive session).
- soakLoad.ts: concurrent load-test harness (16-64 concurrency, configurable
  duration) asserting no RSS growth trend, no fd leaks, stable p99, 0 5xx
  over a run -- `pnpm soak:differential -- --duration 2h --concurrency 48
  --spawn` is the real acceptance test.
- cliArgs.ts: shared CLI arg-parsing helper, replacing near-identical
  process.argv parsing duplicated across bench.ts/diffServe.ts/record.ts.
- CI: new start-envio-serve composite action replacing the duplicated
  background-spawn + /healthz-poll step blocks in differential-test and
  differential-benchmark; collapsed the byte-identical postgres/hasura
  services: blocks duplicated across 5 jobs into YAML anchors/aliases.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
.claude/worktrees/ is scratch space for isolated background-agent checkouts,
never meant to be repo content -- was showing up as untracked files.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERWncww5ZmCZ661f4sjexS
Re-records hasura-baseline.json (and its report) against the exact
machine window the pending release-build engine sweep will run in —
the committed baseline dates from a different (debug-build) session,
and machine load drifts enough between sessions that comparing across
windows isn't fair (see the module doc comment in bench.ts). The
engine-side release numbers land in a follow-up commit once that sweep
finishes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
Same-window recording against a release build (cargo build --release),
with an explicit contention check: verified via ps aux that exactly
one envio serve process existed throughout both the baseline recording
and the engine sweep.

That check exists because an earlier same-session attempt was
discarded after discovering a stray duplicate envio serve process
(orphaned from an earlier restart, 37+ minutes of accumulated
background CPU) that had been silently competing for CPU and Postgres
connections the whole time — it inflated the reported envio-side CPU
time roughly 140x (1038s -> 7.4s once killed) and skewed the recorded
geomean. That run's numbers were never committed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
`arguments: null` on a non-count aggregate predicate (bool_and/bool_or)
skipped column population but still passed the required-field check,
so sql.rs emitted invalid syntax like `bool_and(*)` instead of a clean
validation error. Only count's `arguments` is a genuinely nullable
list (null means count(*)); bool_and/bool_or's is a single non-null
column enum and should reject null the same way coerce_enum already
does for every other enum-typed field.

Adds a docker-gated regression test in robustness_tests.rs covering
both the count+null (still valid) and bool_and+null (now rejected)
cases against a real server.
…d) (#1383)

* Correct aggregate bool_exp null-arguments fix to match Hasura exactly

The previous fix only rejected a null `arguments` for bool_and/bool_or,
assuming count's `arguments: null` was a valid count(*) alias. Verified
live against Hasura 2.43.0 (fresh Postgres + Hasura containers, the
committed differential fixture, and a throwaway boolean column added to
Token) and that assumption was wrong: Hasura rejects an explicit
`arguments: null` for every op, including count — "expected a list, but
found null". Omitting the `arguments` key entirely is the actual
count(*) equivalent, and that path was already correct.

- bool_exp.rs: count's arguments now goes through the existing
  `expect_list` helper (already used elsewhere in this file for the
  same null-rejection message), instead of a bespoke null-skip.
- robustness_tests.rs: the regression test now asserts full response
  bodies against the exact strings/paths captured live from Hasura for
  all three cases (arguments omitted, arguments: null on count,
  arguments: null on bool_and), not just an error code.

* Fix 3 more null-literal validation gaps found by sweeping the same pattern

Systematically searched every is_null() shortcut in the validator for the
same shape as the aggregate bool_exp arguments bug (a null check skips a
coercion call that would otherwise reject the value), then verified each
candidate live against Hasura 2.43.0 rather than assuming. Confirmed and
fixed three more real gaps; ruled out ~9 other candidates that looked
similar but are genuinely accepted by Hasura (distinct_on: null, offset:
null, order_by: null and its nested/aggregate forms, includeDeprecated:
null) so those were left unchanged.

Fixed, all using the coercion helper each site already had available:
- bool_exp.rs: aggregate bool_exp `distinct: null` now goes through
  coerce_bool_strict instead of silently defaulting to false.
- mod.rs: aggregate selection `count(columns: null)` now goes through
  expect_list instead of silently acting as count(*); `count(distinct:
  null)` now goes through coerce_bool_strict instead of defaulting to
  false.
- args.rs: a json/jsonb field's `path: null` now goes through
  coerce_string_strict instead of silently returning the whole value.

Each fix's regression test asserts the exact response body captured live
from Hasura for that query, and each was confirmed to fail without the
fix before being confirmed to pass with it.

* Fix _stream cursor validation to reject empty/null cursor lists

coerce_stream_args required the cursor argument to be present, but never
checked that the resulting cursor list was non-empty after filtering out
null elements. cursor: [], cursor: [null], and cursor: null all silently
produced an empty cursor, which sql.rs then compiled with no ORDER BY —
an unbounded, non-deterministic _stream poll instead of an error.

Verified live against Hasura 2.43.0 over both WS subprotocols:
- cursor: null -> "expected a list, but found null" (same expect_list
  helper already used for every other "explicit null on a list argument"
  case in this codebase)
- cursor: [] and cursor: [null] -> "one streaming column field is
  expected" once nulls are filtered out and nothing valid remains

Added to packages/e2e-tests/src/differential/subscriptions.test.ts,
which already runs this exact category of live WS comparison test
(subscriptions can't be exercised over plain HTTP, so this couldn't be a
Rust-only regression test like the earlier fixes in this PR). Confirmed
each new case fails without the fix (envio serve just polls the same
unordered batch forever instead of erroring) and passes with it.

* Eliminate the _stream cursor double-query race

advance_stream_cursor fired a second, near-identical query after the
batch query to read back the cursor columns' values for the last row,
purely because the client-facing selection might not include them. A
row inserted or deleted between the two queries could desync the
cursor from what was actually sent to the client (skipped or
duplicated rows on the next poll) — a real, if narrow, race window.

Fixes it by construction rather than narrowing the window: emit_stream_
select now aggregates each cursor column's last-row value in the same
query as the batch JSON, via array_agg(col::text ORDER BY <same order
as the batch>)[count(*)] — the same ORDER BY drives both aggregates, so
"last element of the array" is guaranteed to be the same row the batch
JSON's last element came from, read atomically in one round trip. This
also halves DB load per _stream poll (one query instead of two) and
deletes ~150 lines of now-dead probe-building code (advance_stream_
cursor, clone_bool_exp, clone_compare_op).

This exact fix already exists, independently authored and smoke-tested,
on a sibling branch (claude/envio-production-ready-vvfw6h, commit
65b60b8) that forked from the same base commit as this branch while
doing unrelated hardening work. Diffed that commit in isolation from
its parent (excluding an unrelated WS-dead-client-detection commit that
sits between the fork point and it in that branch's history) and
applied it here after confirming these three files were byte-identical
to the shared ancestor. Reviewed the SQL-aggregation logic by hand
before applying rather than taking it on faith.

Verified in this session:
- cargo clippy -D warnings and the full serve:: unit suite (33 tests)
  pass, including the existing stream_cursor_bound test (already
  updated by that commit to assert the new one-query SQL shape).
- Re-running the live differential WS suite (cursor advancement +
  tie-breaking behavior against real Hasura) to confirm no regression
  from the SQL rewrite; results to follow.

* Fix clippy::collapsible_match flagged by a newer stable toolchain

CI's cargo-test job failed: dtolnay/rust-toolchain@stable resolved to
1.96.1, which flags this pattern (a single-arm null-check inside a
match arm's body) as collapsible into a match guard. My sandbox was on
a stale 1.94.1 toolchain that doesn't have this lint refinement, so it
passed locally right up until I checked CI. Updated the sandbox
toolchain to match (rustup update stable -> 1.96.1) and reproduced the
failure before fixing it, rather than guessing from the CI log alone.

Pre-existing code (not touched by any commit in this PR before now) -
just happened to sit in the same function I edited for the cursor
validation fix. Verified: cargo clippy -D warnings clean on 1.96.1, and
the full `cargo test --no-default-features` (whole crate, matching
CI's exact command) passes: 400 passed, 0 failed.

---------

Co-authored-by: Claude <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 694 files, which is 394 over the limit of 300.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5b3efbad-07f9-457f-ac34-90fe3f0f9a30

📥 Commits

Reviewing files that changed from the base of the PR and between 93ff8a0 and e3a147d.

⛔ Files ignored due to path filters (3)
  • Cargo.lock is excluded by !**/*.lock
  • packages/cli/src/cli_args/snapshots/envio__cli_args__clap_definitions__test__envio_help_snapshot.snap is excluded by !**/*.snap
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (694)
  • .github/actions/start-envio-serve/action.yml
  • .github/workflows/build_and_verify.yml
  • .gitignore
  • packages/cli/Cargo.toml
  • packages/cli/CommandLineHelp.md
  • packages/cli/src/cli_args/clap_definitions.rs
  • packages/cli/src/executor/mod.rs
  • packages/cli/src/lib.rs
  • packages/cli/src/serve/env_config.rs
  • packages/cli/src/serve/exec/error.rs
  • packages/cli/src/serve/exec/ir.rs
  • packages/cli/src/serve/exec/mod.rs
  • packages/cli/src/serve/exec/sql.rs
  • packages/cli/src/serve/exec/validate/args.rs
  • packages/cli/src/serve/exec/validate/bool_exp.rs
  • packages/cli/src/serve/exec/validate/coerce.rs
  • packages/cli/src/serve/exec/validate/fragments.rs
  • packages/cli/src/serve/exec/validate/mod.rs
  • packages/cli/src/serve/exec/validate/prescan.rs
  • packages/cli/src/serve/exec/validate/selection.rs
  • packages/cli/src/serve/exec/validate/variables.rs
  • packages/cli/src/serve/gql/introspection.rs
  • packages/cli/src/serve/gql/mod.rs
  • packages/cli/src/serve/gql/schema_build.rs
  • packages/cli/src/serve/gql/types.rs
  • packages/cli/src/serve/http.rs
  • packages/cli/src/serve/mod.rs
  • packages/cli/src/serve/model.rs
  • packages/cli/src/serve/pg_catalog.rs
  • packages/cli/src/serve/project_schema.rs
  • packages/cli/src/serve/robustness_tests.rs
  • packages/cli/src/serve/test_support.rs
  • packages/cli/src/serve/ws.rs
  • packages/cli/test/configs/serve-legacy-2.21.5-custom-schema.yaml
  • packages/cli/test/configs/serve-legacy-2.21.5.yaml
  • packages/e2e-tests/bench-report.md
  • packages/e2e-tests/fixtures/differential/bench-seed.sql
  • packages/e2e-tests/fixtures/differential/hasura-baseline.json
  • packages/e2e-tests/fixtures/differential/schema.sql
  • packages/e2e-tests/fixtures/differential/seed.sql
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-aliases.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-count-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-count-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-count-distinct-false.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-count-distinct.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-count-with-where.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-empty-set.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-min-max-int.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-min-max-numeric.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-min-max-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-min-max-timestamp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-nested-array-relationship.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-nested-public-role-denied.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-nested-with-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-nodes-only.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-nodes.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-public-role-denied.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-stddev-variance.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-sum-avg-int-float.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-sum-avg-numeric.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-typename.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-with-distinct-on.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/agg-with-limit-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-agg-variables-where.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-chainmeta-float4-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-count-distinct-no-columns.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-count-distinct-no-nulls.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-count-distinct-with-nulls.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-count-multi-columns-distinct.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-count-multi-columns.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-empty-count-variants.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-empty-minmax-mixed-types.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-empty-numeric-all-operators.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-empty-with-nodes.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-avg-timestamp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-count-distinct-wrong-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-count-unknown-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-min-bool.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-sum-jsonb.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-sum-text-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-error-variance-enum.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-float8-avg-nan.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-float8-minmax-infinity.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-float8-sum-infinity-nan.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-meta-float4-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-meta-int-sum-nullable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-meta-minmax-timestamptz.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-minmax-enum.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-minmax-text-columns.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-minmax-text-unicode-empty.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-minmax-timestamptz.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-minmax-user-mixed.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-nested-agg-empty-owner.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-nested-agg-where-order-nodes.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-nested-count-distinct.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-nested-full-combo.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-bigint-avg-vs-int-avg.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-bigint-minmax.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-bigint-stddev-variance.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-bigint-sum.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-count-distinct-text-and-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-raw-int-sum-overflows-int32.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-root-distinct-on-aggregate.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-scalars-bigdecimal-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-scalars-bigint-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-scalars-float8-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-scalars-int-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-scalars-optint-null-handling.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-sim-int-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-single-row-stddev-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-token-numeric-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-user-avg-precision.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/am-user-int-full-matrix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-63-char-table.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-admin-role.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-alias-two-roots-same-table.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-aliases.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-by-pk-hit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-by-pk-miss.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-by-pk-special-chars.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-empty-table.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-fragment-spread.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-inline-fragment.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-multiple-root-fields.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-named-operation.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-nested-fragments.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-operation-name-selection.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-restricted-field-name.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-same-field-twice.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-select-all-users.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-select-no-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-skip-include-false.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-skip-include.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-typename-by-pk.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-typename-root.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-variables-default-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-variables-null-optional.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/basic-variables-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/distinct-on-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/distinct-on-enum-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/distinct-on-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/distinct-on-multiple-columns.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/distinct-on-with-limit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-distinct-on-unknown-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-limit-as-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-limit-as-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-order-by-as-enum-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-order-by-as-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-where-as-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-arg-where-as-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-body-lone-surrogate-in-query.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-by-pk-extra-unknown-arg.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-by-pk-id-null-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-comments-only-query.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-deep-nesting-40-levels.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-directive-skip-on-query-operation.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-duplicate-argument-name.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-duplicate-key-in-input-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-duplicate-variable-definition.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-empty-selection-braces-field.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-empty-selection-braces-root.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-float-literal-overflow.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-fragment-on-enum-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-fragment-on-scalar-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-inline-fragment-unknown-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-inline-fragment-wrong-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-int-literal-overflow-int32.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-int-literal-overflow-int64.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-null-literal-limit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-null-literal-where.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-opname-empty-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-string-bad-unicode-escape.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-string-lone-surrogate-escape.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-string-unknown-escape.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-subscription-multiple-root-fields.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-arg-aggregate-count.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-arg-on-scalar-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-field-aggregate-body.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-field-aggregate-wrapper.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-field-array-rel.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-field-object-rel.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-field-root-typo.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-unknown-operation-type-keyword.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-var-string-decl-used-as-int.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-var-wrong-name-used.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/em-whitespace-only-query.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-admin-secret-wrong.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-aggregate-public-not-exposed.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-by-pk-missing-arg.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-by-pk-wrong-arg-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-directive-unknown.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-distinct-on-without-matching-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-duplicate-operation-names.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-empty-query.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-enum-as-string-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-eq-null-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-float-for-int-filter.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-fragment-cycle.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-fragment-undefined.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-fragment-unknown-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-fragment-unused.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-int-overflow-filter.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-invalid-enum-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-jsonb-path-invalid.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-like-on-int-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-limit-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-missing-required-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-multiple-anonymous-operations.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-multiple-ops-no-operation-name.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-mutation-public.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-negative-limit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-negative-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-no-selection-set.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-null-for-required-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-operation-name-not-found.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-scalar-with-selection.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-skip-missing-if.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-subscription-over-http.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-syntax.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-undeclared-variable-used.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unknown-argument.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unknown-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unknown-op-in-bool-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unknown-root-field.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unknown-variable-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-unused-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-variable-wrong-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/error-where-wrong-type.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-chain-metadata-no-by-pk.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-chain-metadata-view.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-meta-aggregate-admin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-meta-float4-precision.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-meta-view.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-meta-where-ready.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-no-relationships-on-internal-tables.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-bigint-filter.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-by-pk-miss.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-by-pk.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-full.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-jsonb-filter.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/internal-raw-events-jsonb-path.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-admin-query-root.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-admin-subscription-root.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-aggregate-types-admin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-aggregate-types-hidden-public.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-deprecated-flag.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-descriptions-bool-exp-and-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-descriptions-stream-cursor-value-input.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-descriptions.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-full-public.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-mixed-with-data.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-stream-cursor-types.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-bool-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-comparison-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-entity.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-missing.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-order-by-enum.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-pg-enum-scalar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-type-select-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-typename-meta.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/introspection-typename-on-typed-queries.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/limit-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/limit-larger-than-rows.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/limit-offset-combo.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/limit-zero.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/offset-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/offset-beyond-rows.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/offset-without-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-distinct-extra-order-keys.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-distinct-multi-prefix-swapped.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-distinct-no-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-distinct-same-column-twice.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-error-distinct-not-first-in-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-error-distinct-unknown-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-error-order-array-rel-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-error-order-duplicate-key-in-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-error-order-unknown-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-introspect-token-aggregate-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-introspect-user-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-array-rel-aggregate-count-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-array-rel-aggregate-max.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-bigint-raw-events-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-bigint-raw-events-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-bool-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-by-empty-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-by-empty-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-by-list-with-empty-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-by-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-by-variable-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-bigint.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-enum.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-float.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-int.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-text.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-directions-opt-timestamp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-enum-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-float-special-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-int-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-int-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-jsonb-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-jsonb-desc-raw-events.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-mixed-list-with-multikey-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-multi-conflicting-flipped.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-multi-conflicting.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-multi-list-respects-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-numeric-bigdecimal-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-numeric-bigint-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-object-keys-blocknumber-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-object-keys-logindex-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-object-rel-nested-aggregate.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-object-rel-owner-id.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-object-rel-two-levels.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-optfloat-nan-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-optfloat-nan-desc-nulls-last.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-same-column-twice-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-text-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/om-order-timestamp-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-bool.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-enum-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-float-with-special.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-numeric.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-object-relationship-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-relationship-nested.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-by-timestamp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-default-nulls-asc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-default-nulls-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-desc-nulls-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-desc-nulls-last.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-multi-key-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-multi-key-single-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-nulls-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/order-nulls-last.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-abcd-chain.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-aliases-multiple-same-relationship.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-array-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-array-distinct-on.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-array-empty.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-array-nested-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-array-nested-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-circular-nesting.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-deep-nesting.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-derived-from-id-typed-key.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-fragment-on-relationship.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-object-basic.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-object-dangling.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-object-nullable-fk.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-order-parent-by-child-aggregate-count.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-order-parent-by-child-aggregate-max.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-typename-in-nested.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rel-where-on-parent-and-child.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-agg-order-count-asc-empty-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-agg-order-max-nulls-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-agg-order-min-asc-nulls-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-agg-order-sum-desc-nulls-last.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-alias-conflict-rel-vs-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-alias-swap-column-and-rel.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-alias-user-gravatar-shadow.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-child-all-args-collection-tokens.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-child-all-args-user-tokens.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-child-window-beyond-rows.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-cross-and-inside-rel.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-cross-and-parent-child.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-cross-not-inside-rel.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-cross-or-three-branches.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-cross-or-two-rel-paths.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-a-b.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-b-c-all-rows.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-d-via-rel-vs-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-gravatar-owner.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-token-collection.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-token-owner.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-dangling-user-gravatar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-deep-self-nesting-depth7.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-deep-where-self-referential.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-exists-b-a-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-exists-bare-vs-predicate.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-exists-c-d-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-exists-collection-tokens-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-exists-user-tokens-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-multihop-a-b-a-siblings.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-multihop-a-b-c-d.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-multihop-b-both-directions.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-multihop-c-both-directions.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-multihop-d-plain-column-filter.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-exists-a-b-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-exists-gravatar-pair.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-exists-vs-fk-not-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-not-exists-b-c.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-not-exists-gravatar-owner.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-not-exists-token-collection.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-object-not-exists-token-owner.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-order-object-rel-dangling-nulls-first.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-same-table-b-self-join.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-same-table-token-and-sibling.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/rm-same-table-two-paths.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-all-non-array-full.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-all-types-full.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-bigdecimal-trailing-zeros.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-empty-arrays.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-float-special-values.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-contained-in.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-contains.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-has-key.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-has-keys-all.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-has-keys-any.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-path-arg.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-path-index.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-path-missing.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-jsonb-variants.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-numeric-array-precision.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-numeric-precision-monsters.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-string-arrays-escaping.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-timestamp-precision.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-unicode-strings.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/scalars-where-on-array-column-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-arrays-alltypes-string-vs-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-arrays-numeric-precision-string-vs-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-bypk-special-chars-full.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-bypk-special-chars-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-field-order-interleaved.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-field-order-reverse-schema.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-alias-three-paths.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-dollar-root.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-empty-string-error.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-key.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-missing-nested.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-nested-index.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-no-dollar-prefix.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-on-json-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-on-scalar-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-root-index.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-unicode-key.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-json-path-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-1.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-array-edge.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-empty-arrays.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-json-bool.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-json-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-json-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-json-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-alltypes-all-json-unicode.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-bigdecimal-bd-1.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-bigdecimal-bd-2.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-bigdecimal-bd-3.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-bigdecimal-bd-4.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-bigdecimal-bd-5.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-1.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-empty.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-extremes.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-neg-inf.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-nulls.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-quotes.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-special-float.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-nonarray-scalar-unicode.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-precision-prec-1.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-precision-prec-2.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-precision-prec-nulls.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-epoch.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-future.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-micro.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-milli.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-pre-epoch.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-row-timestamp-ts-zoned.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-typename-only-by-pk.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/ss-typename-only-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/variables-limit-offset-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-admin-mutation-insert-unknown-table.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-alias-duplicate-root-different-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-default-bool-exp-used.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-default-int-overridden.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-default-null-override.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-directive-include-fragment-spread-false.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-directive-include-fragment-spread.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-directive-skip-inline-fragment.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-boolean-string-in-include-directive.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-directive-include-on-operation.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-enum-scalar-invalid-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-extra-undeclared-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-id-type-variable.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-int-var-float-json.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-int-var-string-json.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-numeric-var-bool.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-opname-with-anonymous-op.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-same-alias-conflicting-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-error-string-list-int-element.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-fragment-chain-deep.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-opname-query-beside-mutation-public.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-opname-selects-op-with-vars.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-typename-aggregate-admin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-typename-nested-everywhere.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-bool-exp-token.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-boolean-string-in-where-coerced.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-enum-scalar-accounttype.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-float8-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-float8-string-coerced.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-int-limit-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-jsonb-object-contains.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-jsonb-unicode-contains.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-missing-variables-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-nested-relationship-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-null-for-nullable-args.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-numeric-as-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-numeric-as-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-numeric-decimal-number.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-order-by-enum-in-object-default.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-order-by-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-select-column-distinct-on.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-select-column-single-value-coercion.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-string-list-in.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-string-list-single-value-coercion.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-string-where.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/vr-var-timestamptz-string.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-and-empty-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-and-explicit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-and-implicit.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-array-relationship.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-bool-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-empty-bool-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-empty-string-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-enum-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-enum-in.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-enum-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-float-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-float-gt.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-ilike.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-int-comparisons.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-int-negative.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-iregex.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-is-null-false.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-is-null-true.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-like-escape-chars.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-like.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-multiple-ops-same-column.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-nested-and-or-not.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-nilike.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-niregex.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-nlike.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-not.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-nsimilar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-numeric-eq-int-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-numeric-eq-string-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-numeric-gt-huge.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-numeric-in-mixed.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-numeric-negative.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-object-relationship.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-or-empty-list.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-or.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-regex.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-relationship-is-null-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-relationship-nested-two-levels.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-similar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-gt-lt.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-gte-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-in-empty.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-in.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-string-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-timestamp-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-timestamp-range.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-timestamp-zoned-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-unicode-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-variables-bool-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/where-variables-nested-exp.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-contains-contained-in.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-in-database-error.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-array-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-eq-unquoted-64bit-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-in-nin-mixed-literals.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bigint-lt-lte-int-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bool-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bool-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bool-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bool-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-bool-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-enum-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-enum-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-enum-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-enum-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-enum-lt-lte-declaration-order.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-eq-infinity-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-eq-nan.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-eq-zero-matches-neg-zero.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-gt-gte-dbl-max.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-float-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-in-duplicate-values.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-in-single-value.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-eq-int32-max.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-eq-int32-min.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-int-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-is-null-false-with-like.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-is-null-true-with-eq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-jsonb-cast-string-eq-scalar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-jsonb-cast-string-like.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-jsonb-eq-empty-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-jsonb-eq-nested-object.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-jsonb-eq-object-literal.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-eq-76-digits.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-eq-neq-trailing-zero.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-eq-tiny-fraction.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-numeric-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-ilike-nilike.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-iregex-niregex.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-like-nlike.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-nin-empty.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-regex-nregex.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-text-similar-nsimilar.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-eq-neq.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-eq-normalized-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-gt-gte.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-in-nin.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-is-null.json
  • packages/e2e-tests/fixtures/differential/snapshots/default/wm-ts-lt-lte.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/introspection-full-public-limited.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-admin-not-capped.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-by-pk-unaffected.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-meta-aggregate-enabled.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-nested-relationship-capped.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-public-aggregate-count-exceeds-limit.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-public-aggregate-enabled.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-public-aggregate-not-enabled-table.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-public-nested-aggregate-enabled.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-raw-events-capped.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-response-limit-caps-rows.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-response-limit-explicit-higher.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-response-limit-explicit-lower.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/limits-response-limit-with-offset.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/om-introspect-token-aggregate-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/om-introspect-user-order-by.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/om-order-array-rel-aggregate-count-desc.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/om-order-array-rel-aggregate-max.json
  • packages/e2e-tests/fixtures/differential/snapshots/limited/om-order-object-rel-nested-aggregate.json
  • packages/e2e-tests/package.json
  • packages/e2e-tests/soak-report.md
  • packages/e2e-tests/src/differential/README.md
  • packages/e2e-tests/src/differential/bench.ts
  • packages/e2e-tests/src/differential/cliArgs.ts
  • packages/e2e-tests/src/differential/corpus.ts
  • packages/e2e-tests/src/differential/corpus/01-basic.ts
  • packages/e2e-tests/src/differential/corpus/02-where.ts
  • packages/e2e-tests/src/differential/corpus/03-order-pagination.ts
  • packages/e2e-tests/src/differential/corpus/04-relationships.ts
  • packages/e2e-tests/src/differential/corpus/05-scalars.ts
  • packages/e2e-tests/src/differential/corpus/06-aggregates.ts
  • packages/e2e-tests/src/differential/corpus/07-internal-tables.ts
  • packages/e2e-tests/src/differential/corpus/08-errors.ts
  • packages/e2e-tests/src/differential/corpus/09-introspection.ts
  • packages/e2e-tests/src/differential/corpus/10-limits.ts
  • packages/e2e-tests/src/differential/corpus/11-where-matrix.ts
  • packages/e2e-tests/src/differential/corpus/12-aggregate-matrix.ts
  • packages/e2e-tests/src/differential/corpus/13-order-distinct-matrix.ts
  • packages/e2e-tests/src/differential/corpus/14-variables-and-request.ts
  • packages/e2e-tests/src/differential/corpus/15-scalar-serialization.ts
  • packages/e2e-tests/src/differential/corpus/16-relationship-matrix.ts
  • packages/e2e-tests/src/differential/corpus/17-error-matrix.ts
  • packages/e2e-tests/src/differential/corpus/index.ts
  • packages/e2e-tests/src/differential/diffServe.ts
  • packages/e2e-tests/src/differential/differential.test.ts
  • packages/e2e-tests/src/differential/env.ts
  • packages/e2e-tests/src/differential/fixtureModel.ts
  • packages/e2e-tests/src/differential/hasuraSetup.ts
  • packages/e2e-tests/src/differential/record.ts
  • packages/e2e-tests/src/differential/runner.ts
  • packages/e2e-tests/src/differential/serveProcess.ts
  • packages/e2e-tests/src/differential/setupBenchDataset.ts
  • packages/e2e-tests/src/differential/soakLoad.ts
  • packages/e2e-tests/src/differential/subscriptions.test.ts
  • packages/e2e-tests/src/differential/wsClient.ts
  • packages/e2e-tests/vitest.config.ts
  • packages/e2e-tests/vitest.differential.config.ts
  • scenarios/test_codegen/schema.graphql

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

… dead-client detection, concurrent execution

Pulls in the useful changes from claude/envio-production-ready-vvfw6h
(closed PR #1375) that we hadn't independently written ourselves:

- HTTP middleware: per-IP rate limiting (ENVIO_SERVE_RATE_LIMIT_PER_SEC)
  and a request-level timeout/concurrency-limit layer with clean 503s on
  overload, both previously untested -- added rate_limiter unit tests and
  two new robustness_tests.rs integration tests covering them end-to-end.
- WebSocket dead-client detection: a silent (black-holed) subscriber is
  closed within 30s instead of leaking its Postgres poll loop forever.
- Startup retry: `envio serve` started before Postgres is reachable
  retries within ENVIO_SERVE_STARTUP_RETRY_BUDGET_MS and becomes healthy
  once Postgres comes up, instead of crashing on a cold-start race.
- Concurrent root-field execution: independent root fields in one
  operation now run via `join_all` instead of sequentially.
- env var rename: serve-only tuning vars moved from ENVIO_PG_* to
  ENVIO_SERVE_* (shared vars with the JS indexer's Env.res stay ENVIO_PG_*).
- test_support.rs: shared docker-container test helpers, deduping what
  env_config.rs's TLS test and robustness_tests.rs each rolled themselves.
- inf_float_originals: per-occurrence sentinel keying so two distinct
  oversized float literals sharing a sign no longer collapse to one
  reported original (coexists with this branch's separate i64-overflow
  fix in the same coercion path).
- model.rs: resolve_db_column() consolidates the three previously
  triplicated original-name/snake_case column-resolution call sites.
- CI: build_and_verify.yml dedups repeated postgres/hasura service
  blocks via YAML anchors and a new start-envio-serve composite action.
- e2e-tests: cliArgs.ts (shared CLI parsing) and soakLoad.ts (concurrent
  soak/load harness: RSS growth, fd leaks, p99 drift, 5xx rate).

Both merge conflicts in exec/mod.rs and robustness_tests.rs were between
convergent/independent implementations of the same behavior (stream-cursor
fold, new test functions landing at the same point in the file) -- resolved
by keeping one canonical copy of each plus whatever each side added on top.
bench-report.md's conflict was left as our committed version; it's
generated data, not hand-merged.

Verified: cargo check/test/fmt clean; all 50 serve unit+robustness tests
pass against live Postgres/docker containers; full differential suite
(596 default-phase + 19 limited-phase cases) matches the Hasura oracle
snapshots one-to-one with zero regressions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
…dant with Envoy)

Envoy already sits in front of envio serve and handles per-client rate
limiting, request timeouts, and concurrency shedding at the proxy layer,
so duplicating that logic in-process was redundant surface area. Removes:

- the per-IP fixed-window RateLimiter and its axum middleware
  (ENVIO_SERVE_RATE_LIMIT_PER_SEC)
- the tower ConcurrencyLimitLayer + TimeoutLayer stack on the query POST
  route and its overload-to-HTTP-status error mapping
  (ENVIO_SERVE_MAX_CONCURRENT_REQUESTS, ENVIO_SERVE_REQUEST_TIMEOUT_MS)
- the now-unused `tower` direct dependency (axum still pulls its own
  compatible copy transitively)
- the corresponding ServeState/ServeEnv fields, unit tests, and the two
  robustness_tests.rs integration tests added to cover this middleware

The client-side GraphQL query timeout (ENVIO_SERVE_QUERY_TIMEOUT_MS) is
unaffected -- that bounds the Postgres round-trip itself and has nothing
to do with the HTTP-layer concerns Envoy now owns exclusively.

Verified: cargo check/test/fmt/clippy clean (serve-scoped); all 46
remaining serve tests pass against live Postgres/docker containers; full
differential suite (596 default + 19 limited-phase cases) still matches
the Hasura oracle one-to-one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WM4FUnFYvEvWsBykmGg6Qf
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.

2 participants