Skip to Content
Status & Limits

Status & Limits

KoldStore is in early development and is not production-ready. Manage, flush, auto-flush, hot/cold query, and changes_since work. Recovery, backup/restore, compaction, schema evolution, PK changes, and export/import are still hardening.

Shared preload is mandatory

shared_preload_libraries must include koldstore. Without it, backends can silently run ordinary heap scans and return hot-only rows after flush.

  • Install → set preload → restartCREATE EXTENSION
  • session_preload_libraries is not enough
  • Removing preload after manage_table is unsupported

Check: SELECT koldstore.preload_status();

UNIQUE and foreign keys

PostgreSQL UNIQUE and FK constraints on managed tables are enforced on the hot heap only. After flush, cold values live in Parquet without a global hot+cold constraint layer.

ConstraintHotColdNormal DML checks cold?
Primary keyYesLogical winner via mergeCold presence via segment index + Parquet
Non-PK UNIQUEYesNoNo
Foreign keysYesNoNo

When hot_row_limit is set, manage_table rejects tables that already have non-PK UNIQUE constraints or foreign keys.

Indexes and extensions

PostgreSQL indexes (including pgvector HNSW/IVFFlat and similar) cover hot rows only. Flushed rows lose heap index entries. There is no automatic Parquet index translation yet. The vector type is not in the v0.1 supported type matrix.

Cold storage availability

If cold storage is unavailable, managed queries that need cold segments fail. KoldStore does not silently return hot-only results. koldstore.enable_merge_scan = off also errors rather than allowing an incorrect heap-only read.

Capture limits

  • WAL-only capture (no trigger mode)
  • Primary-key updates rejected
  • TRUNCATE on async managed tables rejected
  • Bounded mirror lag unless you call wait_for_async_mirror()
  • Scoped physical cold folders still incomplete vs registration templates

Change feed limits

  • Latest-state catch-up, not full event history
  • Positive cursors older than retained cold floor → retention-gap error
  • last_rows ignored when since_seq > 0
  • last_rows must be <= limit_rows

Unmanage, not disable

Use koldstore.unmanage_table(...). Do not set koldstore_enabled = false. Storage binding is immutable after manage.

Not shipped

  • Packaged extension upgrade edges (ALTER EXTENSION … UPDATE)
  • Cold DML helpers and cold-only UPDATE/DELETE that mutate Parquet in place
  • backup_manifest / validate_cold_storage / polished export-import
  • Compaction and schema evolution tooling

When to wait

Prefer waiting if you need global uniqueness across tiers, cold lookups as fast as B-trees, or turnkey PITR that spans heap + object storage out of the box.

When to try

Local or staging workloads that grow forever (messages, audit, AI memory) where shrinking the hot heap and indexes is the main goal, and you can tolerate beta ops boundaries.

Last updated on