ingestr v1.1.37 - PostgreSQL CDC Checkpoint Bound


ingestr v1.1.37 was published on 26 August 2026 as a stable tag, not a prerelease. The operator visible fix is PostgreSQL CDC batch checkpointing. Batch runs now persist the emitted barrier LSN, not a protocol cursor that could sit past the slot.

The full release notes and downloads are on the GitHub release page.

ingestr is a CLI that copies tables between sources and destinations. This tag is small. Three commits landed, and two of them change load behavior. The third is a destination URI alias over an existing Oracle writer.

Batch PostgreSQL CDC used to checkpoint max(decoded, emitted) LSN. The replication protocol cursor can sit past the pg_logical_emit_message barrier, so a finished run could store a resume point ahead of the slot. The next run then skipped WAL or fell back to a replacement snapshot. That is a silent gap, not a loud failure.

Commit 8ce2134b07e208f0c995b7f2a1e59f328da03caf (PR 1112) binds the batch checkpoint to the SQL emitted barrier LSN only. checkpointBatchBarrier in pkg/source/postgres_cdc/source.go records that LSN and keeps the slot alive against it. The single table path in pkg/source/postgres_cdc/reader.go and the multi table path in pkg/source/postgres_cdc/multitable_reader.go both stop using CurrentLSN() for the batch resume point. batchCaughtUpLSN is gone from pkg/source/postgres_cdc/batch_barrier.go.

Streaming CDC does not change. Snapshot paths do not change. The cost sits on resume. WAL after the barrier may be delivered again on the next run. Worst case is a duplicate apply of a post barrier in flight commit, not skipped WAL. Incremental merge keys usually absorb that duplicate. An append only destination without a merge key can grow extra rows in that window.

pkg/source/postgres_cdc/batch_barrier_test.go covers the regression where decoded LSN sits past the barrier and the persisted value is still the emitted LSN.

If you run PostgreSQL CDC in batch mode, this is the reason to take the tag. If you only stream, the bound is not on your path.

Commit ec19de7f4f7318c3e5b9d6d90b70108a66e6c64d (PR 1071) adds Oracle Exadata as an explicit destination. It does not add a new write engine.

The change registers exadata, oracle+exadata, and oracle_exadata destination schemes and reuses the existing Oracle implementation. URI normalization keeps RAC, TCPS, and wallet connection options in place.

If a pipeline already targets Exadata through the generic Oracle scheme, nothing forces a rewrite. The new schemes exist so a destination URI can name Exadata without pretending the box is a generic Oracle instance. Connector metadata, docs, unit tests, and Oracle backed conformance coverage landed with the aliases.

Treat this as a URI and catalog change. The loader is the Oracle destination you already run.

Commit c2a562df36aa67b0258a0f1e9eb602052e5d53af (PR 1110) changes how Trino stores JSON.

Default Trino JSON DDL now uses VARCHAR. Iceberg v3 VARIANT is opt in through json_type=variant. JSON DDL, values, nulls, arrays, and schema evolution follow that mode. Pre v3 Iceberg tables are guarded so the loader does not stamp VARIANT onto a catalog that cannot hold it.

That default is a behavior change for new tables. Pipelines that assumed a Trino JSON type will see VARCHAR instead. If you ingest PostgreSQL JSONB into Trino Iceberg, run once without json_type=variant and once with it, then check the column type and Iceberg format version.

Do not flip json_type=variant on a table created under the default mode and expect a silent type rewrite. A table that already has VARCHAR JSON columns will not become VARIANT because you added the query param. Writes that emit VARIANT expressions against VARCHAR columns fail with a type mismatch. The merge added validation for existing variant columns. Keep one JSON mode per table.

No breaking CLI flag is listed. Two load behaviors still change under you.

PostgreSQL CDC batch jobs may reapply a small window of WAL after the barrier. That is the intended trade. Prefer a merge or delete insert load for those tables. Append only targets can see duplicates that the old checkpoint would have skipped.

Trino JSON columns created after this tag default to VARCHAR. Set json_type=variant only on Iceberg v3 catalogs that actually support VARIANT, and only on tables created under that mode.

Exadata URIs are additive. Existing Oracle destinations keep working.

This is a stable tag. There is no candidate caveat in the notes.