Repository navigation
ci: SupaForge on real-world sample databases - #161
Merged
Merged
Conversation
The version matrix failed one night (2026-10-28) on a dropped connection fetching it — curl exit 56 — not on anything SupaForge did. Every workflow that installs the PostgreSQL 18 client now retries the fetch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chinook, AdventureWorks, Pagila (PostgreSQL 18 with pgvector) and GitLab's schema, pinned to exact upstream revisions, between two servers started in containers: across PostgreSQL 15, 17 and 18 and onto Supabase's image. Each run clones the source, syncs its schema into an empty database, applies a migration's worth of drift with --prove, and restores a snapshot; every step must leave a re-scan with nothing to fix, and between servers of the same major the catalog state and a clone's rows must equal the source's. The synthetic corpus missed every bug this found: domains written unquoted, arrays and pgvector columns losing their modifiers, partitioned tables gaining a column, partitions outside their parent's schema, a partitioned table's own sequence created twice, and virtual generated columns stored. Those are listed in known-gaps.json against DBDiff#285, along with clone not carrying privileges; the job fails on any other failure and on a listed one that passes. Nightly, on demand, and on pull requests touching the script, its gaps or the lockfile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t Supabase's platform objects as a gap The first run showed two things the local runs could not. GitLab's schema takes about 10,500 locks in one transaction and a default server holds about 7,000 (SupaForge warned, then the apply failed as it said it would), so its servers get max_locks_per_transaction=256. And a Supabase target synced from plain PostgreSQL reports Supabase's own extensions and realtime publication as extra, with no fix, so the re-scan is never clean. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A nightly job (also on demand, and on PRs that touch it or the lockfile) running SupaForge on public sample databases, pinned to exact upstream revisions:
uuidv7(), pgvector + HNSW, virtual generated column, 55 partitionsstructure.sqlEach run checks four things:
diff --apply --prove.Every step must leave a re-scan with nothing to fix. Between same-major servers the catalog state (
@akal/pg-conformancestate.sql) and the clone's rows must also equal the source's.Why: the synthetic corpus missed every bug this turned up. They are all in DBDiff/DBDiff#285, and are listed in
test/real-world/known-gaps.jsonagainst it. The job fails on any unlisted failure and on a listed one that passes, so the DBDiff bump that ships #285 must clear them. Also listed: clone runspg_dump --no-acl, so a clone doesn't carry privileges (Pagila'sGRANT ALL ON SCHEMA public TO PUBLIC). That's a design question, not a regression.Also in this PR: the PostgreSQL apt-key fetch now retries in every workflow. The version matrix failed one night on a dropped connection there (
curl: (56)).The gap list is seeded from local runs. This PR's own run confirms it for the CI-only pairs (AdventureWorks needs Ruby, and the Supabase image).
🤖 Generated with Claude Code