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 → restart →
CREATE EXTENSION session_preload_librariesis not enough- Removing preload after
manage_tableis 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.
| Constraint | Hot | Cold | Normal DML checks cold? |
|---|---|---|---|
| Primary key | Yes | Logical winner via merge | Cold presence via segment index + Parquet |
Non-PK UNIQUE | Yes | No | No |
| Foreign keys | Yes | No | No |
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
TRUNCATEon 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_rowsignored whensince_seq > 0last_rowsmust 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/DELETEthat 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.