From 98f4c68dd9e4c29900b1fe4ca0785e67222066bc Mon Sep 17 00:00:00 2001 From: Adam J Esslinger Date: Thu, 22 Oct 2026 11:55:10 -0400 Subject: [PATCH] chore: release 1.0.0-rc.11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps version to 1.0.0-rc.11 in Cargo.toml, Cargo.lock, .tabularium, and CHANGELOG.md. ### Included since rc.10 **Fixed:** - Transaction-pooler result-set queries on non-builtin column types no longer hang or error (#160, #163) — pinned one-shot transaction path for pooler_mode=transaction: BEGIN pins the backend, DEALLOCATE ALL clears stale statements, prepare resolves column types while pinned, unnamed query_typed runs the data fetch, one-shot client is discarded so its type cache dies with the connection; bounded by a 90s plugin-side timeout - One-shot pool path skips the redundant startup-script preflight (post_create hook already validates the script with the same error shape) - pooler_mode is trimmed before the transaction comparison (matching startup_script), so whitespace can't silently bypass the pinned path **Changed:** - format_query_error now emits pooler guidance on all 26000/42P05 errors, not only when pooler_mode=transaction is set — is_transaction_pooler selects the phrasing (definitive vs conditional), so older hosts that can't send the field still see the hint **Security:** - Bumped rustls-webpki (0.103.15 -> 0.103.16) and webpki-root-certs (1.0.9 -> 1.0.10) to clear the emSign root-cert advisories; cargo audit now reports zero vulnerabilities **Dependencies:** - tokio 1.53.2 -> 1.53.3 (#161); sha2 0.11.0 -> 0.11.1 (#162) --- .tabularium | 2 +- CHANGELOG.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.tabularium b/.tabularium index 221dbd7..b1b2b5d 100644 --- a/.tabularium +++ b/.tabularium @@ -2,7 +2,7 @@ "$schema": "https://registry.tabularis.dev/manifest.schema.json?kind=driver", "id": "postgresql", "name": "PostgreSQL", - "version": "1.0.0-rc.10", + "version": "1.0.0-rc.11", "description": "Full-featured PostgreSQL driver for Tabularis: browse schemas, tables, views, routines, and triggers; run queries with EXPLAIN plans; edit rows with type-aware binding for enums, JSON, arrays, UUIDs; generate DDL for tables, columns, indexes, and foreign keys.", "category": "database", "tags": ["driver", "postgresql", "postgres", "sql", "relational", "database-driver"], diff --git a/CHANGELOG.md b/CHANGELOG.md index 705327b..74315dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,61 @@ ## [Unreleased] +## [1.0.0-rc.11] - 2026-10-22 + +### Fixed + +- Querying a table with a non-builtin PostgreSQL type (custom `enum`, + composite, domain, range, or extension type like `citext` / Supabase + `auth.uid`) no longer hangs or errors behind a transaction-mode pooler + (PgBouncer `pool_mode = transaction`, Supavisor) — the rc.9/rc.10 + regression (#160, #163). Result-set queries on connections marked + Pooler Mode = "Transaction" now take a pinned one-shot transaction path: + `BEGIN` pins the backend, `DEALLOCATE ALL` clears stale server-side + prepared statements, `prepare` resolves every result column's type + while pinned (before the data fetch drains anything), and the #149 + unnamed-protocol `query_typed` runs the data fetch — so tokio-postgres's + internal cached `typeinfo_statement` no longer collides across pooler + backend reassignment. The one-shot client is discarded after each call, + so its private type-cache handle (which `DEALLOCATE ALL` can't clear) + dies with the connection. The whole sequence is bounded by a 90s + plugin-side timeout (below the host's 120s call timeout) so a Supavisor + stall surfaces as an actionable error instead of the opaque host timeout. + +- The one-shot pool path skips the redundant startup-script preflight — + the `post_create` hook already validates the script on the real + connection with the same error shape, so the preflight would just open a + second throwaway connection per query for nothing. Only affects the + `pooler_mode = transaction` + `startup_script` intersection. + +- `pooler_mode` is now trimmed before the transaction comparison (matching + how `startup_script` is normalized in `build_pool`), so a hand-edited + `connections.json` with surrounding whitespace can't silently bypass the + pinned path. + +### Changed + +- `format_query_error` now emits the `max_prepared_statements > 0` + + `pooler_mode` guidance on **all** 26000/42P05 errors, not only when + `pooler_mode = transaction` is set. `is_transaction_pooler` now selects + the phrasing (definitive when the host declared a transaction pooler, + conditional when it didn't), so users on older hosts that can't send the + field still see the hint. + +### Security + +- Bumped `rustls-webpki` (0.103.15 → 0.103.16) and `webpki-root-certs` + (1.0.9 → 1.0.10) to clear the emSign root-cert advisories. `cargo audit` + now reports zero vulnerabilities (only the pre-existing `chacha20` + yanked-crate warning remains). The existing `rustls` 0.23.46 and + `rustls-platform-verifier` 0.7.1 floors already accept the patched + versions, so no `Cargo.toml` change was needed. + +### Dependencies + +- `tokio` 1.53.2 → 1.53.3 (#161). +- `sha2` 0.11.0 → 0.11.1 (#162). + ## [1.0.0-rc.10] - 2026-10-16 ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 1b27f3c..73a3a1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -739,7 +739,7 @@ dependencies = [ [[package]] name = "postgresql-plugin" -version = "1.0.0-rc.10" +version = "1.0.0-rc.11" dependencies = [ "async-trait", "base64 0.23.1", diff --git a/Cargo.toml b/Cargo.toml index b64c90b..31845cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "postgresql-plugin" -version = "1.0.0-rc.10" +version = "1.0.0-rc.11" edition = "2021" description = "PostgreSQL plugin driver for Tabularis" license = "Apache-2.0"