Current Limitations
ScramDB runs transactions, analytics, and AI on one live copy of your data. The core SQL surface, the distributed serializable cluster, point-in-time recovery, database branching, GPU acceleration, and the polyglot UDF runtime all ship today. This page lists what is not available yet, and what to use in its place.
We keep this list honest. If a feature is here, it is genuinely not ready. If a feature is not on this page, assume it works.
Storage and I/Oβ
ScramDB ships an io_uring storage backend as an opt-in alternative to the default file backend. Select it with backend = "io_uring" in the [storage.io] configuration table. Leaving backend unset (or set to "auto", the default) still runs on the file backend.
| Not yet available | What to use today |
|---|---|
| NVMe passthrough (raw-namespace I/O) | The default file backend, or the opt-in io_uring backend for a faster I/O path. A backend = "nvme_passthrough" value is accepted in configuration but currently runs on the file backend underneath; there is no raw-namespace I/O path yet |
| Fully tuned single-row write latency | Writes are correct and durable now; OLTP write-latency tuning is ongoing |
| Cold storage tiering to object storage (S3, GCS, Azure) | The [storage.cold_config] keys parse and validate, but the cold tier is forced off at startup and no writeback runs. Use backup and restore for durable off-box copies. See Storage Tiering |
GPU metrics on the Prometheus /metrics endpoint | [gpu] metrics_enabled has no observable effect yet. The rest of /metrics works; see Observability |
SQL featuresβ
| Not yet available | What to use today |
|---|---|
| Incremental materialized view refresh | Full REFRESH MATERIALIZED VIEW |
CREATE INDEX CONCURRENTLY | CREATE INDEX (builds the index in one statement) |
Partition MERGE / SPLIT | Range, list, and hash partitioning with CREATE TABLE ... PARTITION BY, plus ATTACH / DETACH PARTITION |
WITH HOLD cursors (cursors that outlive their transaction) | Cursors inside a transaction (DECLARE / FETCH / CLOSE) |
LISTEN / NOTIFY | Poll a table, or use application-side messaging |
jsonpath operators (@?, @@) | JSONB with its ->, ->>, #>, and containment operators, plus the JSONB functions |
Data typesβ
| Not yet available | What to use today |
|---|---|
tsvector / tsquery as a built-in type | Full-text search through the built-in fts and bm25 packages |
INET / CIDR | TEXT, or an integer for a packed address |
| Range types | A pair of columns for the lower and upper bound |
EXCLUDE constraints | A UNIQUE constraint or an application-side check |
XML | JSONB for structured documents |
MONEY | NUMERIC(p,s) (exact, up to 38 digits) |
NUMERIC values beyond 38 significant digits | NUMERIC(p,s) up to 38 digits. A DECLARATION above 38 (NUMERIC(210,10), common in ported schemas) is accepted with its bound clamped to 38, because a declared precision is a maximum constraint on values rather than a storage promise. A VALUE that genuinely needs more than 38 digits is rejected at insert, never silently truncated or wrapped. |
Operationsβ
ScramDB has no built-in connection pooler. Point your application's own connection pool (built into most PostgreSQL drivers and frameworks) at ScramDB, and keep the number of concurrent connections sensible.