Skip to main content

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 availableWhat 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 latencyWrites 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 availableWhat to use today
Incremental materialized view refreshFull REFRESH MATERIALIZED VIEW
CREATE INDEX CONCURRENTLYCREATE INDEX (builds the index in one statement)
Partition MERGE / SPLITRange, 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 / NOTIFYPoll a table, or use application-side messaging
jsonpath operators (@?, @@)JSONB with its ->, ->>, #>, and containment operators, plus the JSONB functions

Data types​

Not yet availableWhat to use today
tsvector / tsquery as a built-in typeFull-text search through the built-in fts and bm25 packages
INET / CIDRTEXT, or an integer for a packed address
Range typesA pair of columns for the lower and upper bound
EXCLUDE constraintsA UNIQUE constraint or an application-side check
XMLJSONB for structured documents
MONEYNUMERIC(p,s) (exact, up to 38 digits)
NUMERIC values beyond 38 significant digitsNUMERIC(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.