Skip to content

feat: PostgreSQL 18 support, current Supabase bases, and wide-table payload apply - #62

Merged
andinux merged 2 commits into
mainfrom
pg-morecols
Sep 11, 2026
Merged

feat: PostgreSQL 18 support, current Supabase bases, and wide-table payload apply#62
andinux merged 2 commits into
mainfrom
pg-morecols

Conversation

@marcobambini

@marcobambini marcobambini commented Sep 11, 2026

Copy link
Copy Markdown
Member

Release 1.1.3. Two independent changes landed together deliberately: merging the wide-table fix on its own would have cut the release immediately and published :17 on the frozen 17.6.1.071 and :15 on 15.8.1.135 — the exact bases the second change retires.

Closes #59.

Wide-table payload apply

PostgreSQL's statement wrapper held bound parameters in fixed 32-slot arrays, so any statement needing more than 32 values failed. That limit was never reachable from user SQL — the dbvm layer only ever runs engine-generated statements — but it was not bounded by a constant either: the merge path binds npks + one per column in the batch, so any synced table wider than ~32 columns hit it. The arrays now grow dynamically and are owned by the statement.

  • values and prepared types are preserved across capacity growth; the full allocated capacity is reset safely
  • test/postgresql/56_many_columns.sql covers INSERT and UPDATE payload apply at 33 and 128 total columns

Current Postgres and Supabase bases

Supabase moved both the PG15 and PG17 lines to an Alpine userland, so :17 builds on 17.6.1.170 and :15 on 15.14.1.170 — the latter also advancing PostgreSQL 15.8 → 15.14.

was now
Supabase PG17 17.6.1.071 (Ubuntu, frozen) 17.6.1.170 (Alpine)
Supabase PG15 15.8.1.135 queued (Ubuntu) 15.14.1.170 (Alpine)
Official postgres 17, 15 18, 17, 15

With both majors on one family the transitional -alpine tag has nothing left to distinguish, so it and the tag_suffix mechanism are removed. The durable rule is now :<major> tracks whatever base Supabase currently ships — which is what #59 asked to settle. That issue's two-release migration plan (publish :17-ubuntu, announce deprecation, then flip) existed to protect existing :17 pins; there are none, so the alias moves in one step. Its naming question is moot for a second reason: it assumed PG15 stays on Ubuntu, and Supabase has since moved it to Alpine too.

PostgreSQL 18

Added to postgres-test, postgres-build (four arch/OS rows) and docker-publish, producing cloudsync-postgresql18-* artifacts and sqlitecloud/sqlite-sync-postgres:18. There are no PG_VERSION_NUM guards in src/postgresql/, so 18 compatibility was the open question — it builds and passes clean. PG19 is still beta3; skipped.

PG18 keeps its data in a major-version subdirectory and refuses to start when a volume is mounted at /var/lib/postgresql/data, even on a clean volume. The compose files and the PostgreSQL quickstart mount the parent /var/lib/postgresql, which works on 15 and 17 as well.

Also

  • .github/workflows/changelog.yml listened for v*.*.* tags, but main.yml creates release tags without the prefix (1.1.2), so the website changelog sync never fired automatically on a release.
  • The orphaned [Unreleased] changelog entries are folded into [1.1.3]; the :15 entry is rewritten, since its Ubuntu-24.04 uid numbers no longer describe the move.
  • docker/README.md claimed the dev container runs PostgreSQL 16, and that the build-from-source flow assumes an Ubuntu base (fixed by fix: make local Supabase build-from-source work on Alpine bases #61).

Tests

Wide-table fix:

  • PostgreSQL 17.11 Docker build and full suite: 0 failures
  • SQLite unit suite rebuilt with 1.1.3: all passed, including memory leak checks
  • network unit tests: passed

Bases and PG18:

  • full suite 477/477, 0 failures on PG18, PG17 and PG15 with the new volume mount
  • CloudSync builds from source and CREATE EXTENSION succeeds on both new Supabase bases — cloudsync_version() = 1.1.3 on PostgreSQL 15.14 and 17.6, postgres uid 100:101 on each
  • make postgres-check-migration: passed; patch release requires no SQL migration

Not covered: the new PG15 Alpine base inside a full self-hosted Supabase stack. Alpine 17 was validated that way on Fly.io (#59); PG15 has only the CREATE EXTENSION smoke test that CI runs.

Publishing effects on merge

This merge cuts release 1.1.3 and publishes to Docker Hub: :15 moves from base 15.8.1.085 to 15.14.1.170, :17 from 17.6.1.071 to 17.6.1.170, and :18 appears for the first time. :17-alpine stops being updated and stays at 1.1.2.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CCE6B54Qtf3UsaCVAJtVQF

…SQL 18 (#63)

Supabase moved both the PG15 and PG17 lines to an Alpine userland, so :17
builds on 17.6.1.170 and :15 on 15.14.1.170 (also PostgreSQL 15.8 -> 15.14),
and :<major> now simply tracks whatever base Supabase ships. The transitional
-alpine tag and the tag_suffix mechanism are removed with it. Closes #59.

Adds PostgreSQL 18: release artifacts, CI tests, and a :18 image. PG18 keeps
its data in a major-version subdirectory and refuses to start when a volume is
mounted at /var/lib/postgresql/data, so the compose files and the quickstart
mount the parent path, which works on every supported major.

Also folds the orphaned [Unreleased] changelog entries into [1.1.3], rewrites
the :15 entry for the new base, and fixes the website changelog workflow, which
listened for v-prefixed tags that this repo never creates.
@andinux andinux changed the title Fix PostgreSQL payload apply for wide tables feat: PostgreSQL 18 support, current Supabase bases, and wide-table payload apply Sep 11, 2026
@andinux
andinux merged commit b7fbcef into main Sep 11, 2026
38 checks passed
@andinux
andinux deleted the pg-morecols branch September 11, 2026 22:43
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.

Ship :17-ubuntu before flipping the :17 Supabase alias to Alpine

2 participants