Skip to Content
We are live but in Staging 🎉
Feature Status

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

DimensionStatusScope
StorageGABuckets, objects, bucket policy, CORS, presigned URLs, and the S3-compatible byte plane (SigV4 / SigV2).
PipelinesGA (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.
TablesGATable + 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.
VectorPreviewCollection 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.
GraphPreviewCREATE 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.

GuaranteeWhere
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 SQLSTATEType 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 anywhereCrypto-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 stateTransactions
No vector you store can be silently lost — an index build that cannot prove every vector reachable fails instead of servingVector at Scale
A distance you see is the true distance — ANN selects candidates, which are re-ranked at full precisionVector at Scale
A vector acked is a vector searchable — no settle window, no index lagVector at Scale
Combinations that would produce wrong answers are refused with the correct alternative namedANN 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 / DeleteSource for 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_search native tool the *_embedding_search templates call still points at decommissioned Milvus, so today POST /:bucket/search/vector returns a per-collection fail_reason at the search step for every template-backed search. Direct KNN over the Qdrant/Pinecone adapters and dodil data vsearch are unaffected — use those.
  • Pre-embedded vector input on the search route — sending a vector query to POST /:bucket/search/vector returns UNIMPLEMENTED (retired with Milvus, pending a tabled KNN read-path). Use the wire adapters or dodil data vsearch --vector instead. 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_dump are not served (0A000); COPY … FROM STDIN is. Read rows out with a SELECT.
  • Division truncates where pg rounds (2.01 / 21.00) — wrap it in an explicit ROUND(…, s) when the last digit matters.
  • VARCHAR(n) / CHAR(n) lengths are not enforced — use a CHECK constraint, which is.
  • One timestamp vocabulary (timestamptz); no TIMESTAMP WITHOUT TIME ZONE.
  • FOREIGN KEY is enforced on the INSERT side only — the DELETE side and an autocommit UPDATE of an FK column are not checked.

See also