See also: ROADMAP.md
v1.1.0 — PostgreSQL 17 Support
Release Theme
This release adds PostgreSQL 17 as a supported target alongside
PostgreSQL 18. PGlite is built on PostgreSQL 17, so this is a hard
prerequisite for the PGlite proof of concept (v0.29.0). The pgrx 0.17.x
framework already supports PG 17 — the work is enabling the feature flag,
adapting version-sensitive code paths, expanding the CI matrix, and
validating the full test suite against a PG 17 instance.
Cargo & Build System
| Item |
Description |
Effort |
Ref |
|---|
| PG17-1 |
Add pg17 feature to Cargo.toml. Define pg17 = ["pgrx/pg17", "pgrx-tests/pg17"] feature. Keep default = ["pg18"]. |
1h |
— |
| PG17-2 |
Broaden #[cfg] guards in src/dag.rs. Three #[cfg(feature = "pg18")] blocks must become #[cfg(any(feature = "pg17", feature = "pg18"))]. |
1–2h |
— |
| PG17-3 |
Guard NodeTag numeric assertions. src/dvm/parser/mod.rs asserts specific NodeTag integer values (e.g., T_GroupingSet = 107) that shift between PG versions. Gate behind #[cfg(feature = "pg18")] or use per-version value tables. |
2–4h |
— |
| PG17-4 |
Audit pg_sys::* API surface. Verify that every pg_sys call compiles and behaves correctly on PG 17 bindings. Focus on catalog struct field names, WAL decoder types, and any PG 18-only additions. |
4–8h |
— |
CI & Infrastructure
| Item |
Description |
Effort |
Ref |
|---|
| PG17-5 |
CI matrix expansion. Add PG 17 build + unit test job to ci.yml. Use postgres:17 Docker image for integration and light E2E tests. |
4–8h |
— |
| PG17-6 |
justfile parameterisation. Add pg17 variants for build, test, and package recipes (e.g., just build-pg17, just test-e2e-pg17). |
2–4h |
— |
| PG17-7 |
tests/Dockerfile.e2e PG version parameter. Accept a build arg for the base PostgreSQL image version so the same Dockerfile works for PG 17 and PG 18. |
2–4h |
— |
| PG17-8 |
Scripts parameterisation. Update run_unit_tests.sh, run_light_e2e_tests.sh, run_e2e_tests.sh to accept a PG version argument instead of hardcoding pg18. |
2–4h |
— |
Testing & Validation
| Item |
Description |
Effort |
Ref |
|---|
| PG17-9 |
Full E2E suite against PG 17. Run the complete E2E test suite against a PG 17 instance. Fix any parser or catalog incompatibilities that surface. |
1–2d |
— |
| PG17-10 |
TPC-H validation on PG 17. Run TPC-H benchmark queries on PG 17 to verify differential refresh correctness for complex queries. |
4–8h |
— |
| PG17-11 |
Upgrade path test. Verify ALTER EXTENSION pg_trickle UPDATE from 0.25.0 to 0.26.0 works on both PG 17 and PG 18. |
2–4h |
— |
Documentation
| Item |
Description |
Effort |
Ref |
|---|
| PG17-12 |
Update docs and README. Change “PostgreSQL 18 extension” to “PostgreSQL 17/18 extension” in README.md, INSTALL.md, src/lib.rs doc comments, and ARCHITECTURE.md. |
1–2h |
— |
| PG17-13 |
Docker Hub image variants. Publish images tagged with both PG versions (e.g., :0.25.0-pg17, :0.25.0-pg18). |
2–4h |
— |
PostgreSQL 18/19 Feature Integration
Low-hanging PostgreSQL feature opportunities identified in plans/sql/PLAN_POSTGRESQL_FEATURES.md. These are quick wins with minimal code effort or documentation-only updates.
Documentation-Only Items (Zero Code)
| Item |
Description |
Effort |
Ref |
|---|
| PGFEAT-1 |
Document extension_control_path in INSTALL.md. Add extension_control_path GUC as an alternative to the default sharedir for non-standard installations (NixOS, custom Kubernetes init containers). |
30min |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-2 |
Update CONFIGURATION.md for idle replication slot timeout. Document PG 18’s idle_replication_slot_timeout GUC and its interaction with pg_trickle’s WAL-mode CDC. Add health check note. |
1h |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-3 |
Verify & document logical replication of generated columns. Confirm WAL decoder correctly handles stored generated columns in change buffer schemas. Add E2E test and documentation note. |
1–2h |
PLAN_POSTGRESQL_FEATURES.md |
Code Changes (Low Effort)
| Item |
Description |
Effort |
Ref |
|---|
| PGFEAT-4 |
Add NOT ENFORCED constraints to storage tables. Add NOT ENFORCED foreign keys and check constraints during CREATE EXTENSION and stream table creation to document relationships (FK to source) and invariants (__pgt_count > 0) without runtime overhead. |
2–3h |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-5 |
AIO subsystem benchmarking. Re-run E2E refresh benchmarks on PG 18 with io_method = io_uring (Linux) enabled. Document recommended settings in CONFIGURATION.md and BENCHMARK.md. |
3–4h |
PLAN_POSTGRESQL_FEATURES.md |
Additional PostgreSQL 18 Features
| Item |
Description |
Effort |
Ref |
|---|
| PGFEAT-6 |
PG_MODULE_MAGIC_EXT support. Adopt PG_MODULE_MAGIC_EXT in lib.rs to expose pg_trickle’s version via the standard PostgreSQL interface. Enables third-party monitoring tools (pgwatch, Datadog, cloud providers) to discover pg_trickle version. Requires pgrx 0.17.x support first (verify). |
1h |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-7 |
Skip Scan index optimization evaluation. Evaluate multi-column B-tree indexes on change buffer tables (source_relid, change_lsn) to enable skip scan for multi-source delta lookups. Run EXPLAIN benchmarks on existing delta queries to quantify benefit. Create indexes if beneficial. |
2–3h |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-8 |
OLD/NEW in MERGE RETURNING integration. Refactor build_merge_sql() in src/refresh.rs to use MERGE ... RETURNING OLD.*, NEW.* for capturing displaced rows in a single round-trip. Eliminates separate pre-refresh snapshots for ST-to-ST change buffers. Improves full-refresh delta computation performance. |
4–6h |
PLAN_POSTGRESQL_FEATURES.md |
| PGFEAT-9 |
Virtual generated columns CDC support. Verify and test that pg_trickle’s trigger-based CDC correctly excludes virtual generated columns from change buffer schemas. Update resolve_referenced_column_defs() function if needed. Add E2E tests with virtual generated column sources and storage tables. |
4–6h |
PLAN_POSTGRESQL_FEATURES.md |
PostgreSQL feature integration subtotal: ~4–5 hours (PGFEAT-1 through PGFEAT-5) + ~10–18 hours (PGFEAT-6 through PGFEAT-9, optional but recommended)
v1.1.0 total: ~2–4 days (PG 17 support) + ~14–23 hours (PostgreSQL feature integration, all items)
Exit criteria:
- [ ] PG17-1: cargo build --features pg17 --no-default-features compiles cleanly
- [ ] PG17-2/PG17-3: cargo clippy --features pg17 --no-default-features passes with zero warnings
- [ ] PG17-4: No pg_sys compile errors on PG 17 bindings
- [ ] PG17-5: CI runs unit + integration + light E2E tests on PG 17
- [ ] PG17-9: Full E2E suite passes on PG 17 with zero failures
- [ ] PG17-10: TPC-H differential refresh matches full refresh on PG 17
- [ ] PG17-11: Extension upgrade path works on both PG 17 and PG 18
- [ ] PG17-12: Documentation reflects PG 17/18 dual support
- [ ] PGFEAT-1: INSTALL.md documents extension_control_path alternative
- [ ] PGFEAT-2: CONFIGURATION.md documents idle_replication_slot_timeout interaction
- [ ] PGFEAT-3: WAL decoder tested with stored generated columns; E2E test passes
- [ ] PGFEAT-4: Storage tables have NOT ENFORCED FK and CHECK constraints; no runtime overhead
- [ ] PGFEAT-5: E2E refresh benchmarks run with io_method = io_uring; CONFIGURATION.md updated with recommended settings
- [ ] PGFEAT-6: PG_MODULE_MAGIC_EXT integrated (once pgrx supports it); version discoverable via pg_get_loaded_modules()
- [ ] PGFEAT-7: Skip scan index optimization evaluated; benchmarks quantify benefit; indexes created if beneficial
- [ ] PGFEAT-8: MERGE ... RETURNING OLD.*, NEW.* integrated in build_merge_sql(); ST-to-ST change buffer performance improved
- [ ] PGFEAT-9: Virtual generated columns correctly excluded from CDC change buffer schemas; E2E tests pass with virtual column sources
- [ ] Extension upgrade path tested (1.0.0 → 1.1.0)
- [ ] just check-version-sync passes