Feature Status
Last validated against dodil-k3, dodil-tables (engine release v0.1.40), and the live CLI on 2026-09-14.
Maturity labels:
- GA — production-ready; covered in full by these docs.
- Preview — usable via the API but still solidifying; shapes may change. Flagged inline with a Preview callout on the relevant page.
- Planned — not yet available.
The always-current signals live closer to the code: API pages carry a Preview callout where relevant, and the SQL CLI Guide carries a consolidated CLI-vs-API gap table. This page is the at-a-glance roll-up — when in doubt, trust the per-page callouts.
By dimension
| Dimension | Status | Scope |
|---|---|---|
| Storage | GA | Buckets, objects, bucket policy, CORS, presigned URLs, and the S3-compatible byte plane (SigV4 / SigV2). |
| Pipelines | GA (internal source) · Preview (external sources) | Internal-S3 ingest, pipelines, rules, templates, and jobs are GA. External sources + their OAuth / credential flows are Preview — see below. |
| Tables | GA | Table + schema CRUD, the Execute / Query SQL surface, keyed DML (Upsert / Delete / WriteStream), maintenance (optimize / vacuum / compact), SQL RESTORE TABLE … TO VERSION AS OF, and template-bound table pipelines. On the Postgres wire: ACID multi-table transactions that see their own writes, enforced PRIMARY KEY / UNIQUE / NOT NULL / CHECK / INSERT-side FOREIGN KEY, and exact type round-trip including crypto-scale decimals. No engine lifecycle — tables are implicit per bucket (the engine plane was retired; capacity is a reservation). There is no Materialize or History RPC. |
| Vector | Preview | Collection lifecycle (a vector-facet pipeline), template-driven ingest, and KNN search over the tabled data plane (dodil data vsearch, Qdrant/Pinecone wire adapters) all work. Not working: dense+BM25 hybrid (no BM25 in the plane — templates pin it off and the tool hard-errors if asked); a pre-embedded vector query on POST /:bucket/search/vector returns UNIMPLEMENTED; the manual / EXTERNAL collection mode was removed (bring your own embeddings via a VECTOR(n) table instead). Vector is implicit per bucket — no engine resource. |
| Graph | Preview | CREATE GRAPH over tables; a Cypher subset over the Bolt wire, plus the graph_* SQL functions and analytics: k-hop, neighbors, shortest path, PageRank, connected components, BFS. The subset now carries property projection, WHERE on properties, ORDER BY / LIMIT / count(*), 2–3 hop chains and typed $name parameters. Analytics are not reachable over Bolt or GraphQL. |
Guarantees that hold across the plane
Re-verified every engine release, each linked to the page that states it.
| Guarantee | Where |
|---|---|
| A value the declared column can hold round-trips exactly on every entry path and read path, or the write is refused loudly with a real SQLSTATE | Type fidelity |
DECIMAL(38,18) stores wei-scale token amounts exactly and DECIMAL(38,0) raw wei; values round-trip exactly on every path, with no float detour anywhere | Crypto-grade numeric precision |
Writes are durable before they ack, atomic across tables in a BEGIN…COMMIT, and conflict-checked (40001) | Transactions |
| A transaction sees its own writes, aggregates included; a read whose exactness cannot be proven is refused, never answered from stale state | Transactions |
| No vector you store can be silently lost — an index build that cannot prove every vector reachable fails instead of serving | Vector at Scale |
| A distance you see is the true distance — ANN selects candidates, which are re-ranked at full precision | Vector at Scale |
| A vector acked is a vector searchable — no settle window, no index lag | Vector at Scale |
| Combinations that would produce wrong answers are refused with the correct alternative named | ANN Indexes · Cypher |
Preview
External sources and the credential / OAuth surface that pairs with them are Preview — available in the API but still solidifying for production. The production ingest channel today is the auto-created internal S3 source, which needs no credential.
- Providers:
GoogleDrive,SharePoint,Confluence,GitHub - RPCs:
CreateSource/UpdateSource/DeleteSourcefor external providers, the full Credentials API, and the OAuth authorize / exchange / refresh flow - Flagged inline on: Pipelines → Sources, Credentials, Pipelines → Concepts
Planned / not yet supported
- Template-driven search read-path on tabled — the
vector_store_searchnative tool the*_embedding_searchtemplates call still points at decommissioned Milvus, so todayPOST /:bucket/search/vectorreturns a per-collectionfail_reasonat the search step for every template-backed search. Direct KNN over the Qdrant/Pinecone adapters anddodil data vsearchare unaffected — use those. - Pre-embedded vector input on the search route — sending a
vectorquery toPOST /:bucket/search/vectorreturnsUNIMPLEMENTED(retired with Milvus, pending a tabled KNN read-path). Use the wire adapters ordodil data vsearch --vectorinstead. See Vector → Search.
Known divergences from Postgres
Small, specific, each with a stated workaround — the full list is on SQL Compatibility.
COPY … TO STDOUT/pg_dumpare not served (0A000);COPY … FROM STDINis. Read rows out with aSELECT.- Division truncates where pg rounds (
2.01 / 2→1.00) — wrap it in an explicitROUND(…, s)when the last digit matters. VARCHAR(n)/CHAR(n)lengths are not enforced — use aCHECKconstraint, which is.- One timestamp vocabulary (
timestamptz); noTIMESTAMP WITHOUT TIME ZONE. FOREIGN KEYis enforced on the INSERT side only — the DELETE side and an autocommitUPDATEof an FK column are not checked.
See also
- Conventions — wire format, auth, pagination
- Auth and Access — auth modes + suspension enforcement
- Operations — day-2 health checks + triage