Known Limits
This page covers the architectural and feature-level gaps worth knowing before you commit to Opteryx — the things a query can't do because of how the engine is built, not because of a bug. For numeric ceilings the engine enforces at query time (result size, DECIMAL precision, ARRAY_AGG group size), see Limits instead. For the full picture of what's supported at all, see Compatibility and SQL Conformance.
Single-node only
Opteryx scales up, not out. It runs as one process on one machine — there is no distributed execution, no shuffle across workers, and no cluster to add capacity to. The work that goes into handling larger datasets is single-process efficiency (vectorised operators, pushdown, careful memory management), not a distributed runtime. If a dataset genuinely exceeds what one machine can hold, the fix is a smaller working set or a different engine, not more tuning. See When to Use Opteryx for where that line sits.
Not a transactional store
There is no COMMIT, ROLLBACK, SET TRANSACTION, or isolation level — a query reads the snapshot it resolves at plan time. Each statement is its own atomic commit and there is no way to group several into one. INSERT is experimental and limited to some storage backends; UPDATE, DELETE and MERGE are experimental and need a catalog-backed table. There is no locking: a write built against a version of a table that another writer has since replaced is refused, not queued or retried. Integrity constraints (PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE) are accepted in CREATE TABLE syntax but not enforced. See SQL Conformance for the complete statement-by-statement breakdown.
Storage and file formats
- Storage backends: local disk, Google Cloud Storage, Amazon S3, and plain HTTP(S) are implemented. Azure Blob Storage and MinIO are not — despite references to them in test configuration, there is no corresponding connector.
- File formats: Parquet, JSONL, and Skene (the engine's own native format) are supported as dataset formats; CSV is queryable through
READ_CSVbut is not a dataset format. ORC and Avro are not supported at all.
See Compatibility for the full list, including platform and Python version support.
SQL features not implemented
GROUPING SETSandCUBE—ROLLUPis the supportedGROUP BYgrouping constructWITH RECURSIVEWITH TIME ZONE— timestamps carry no zoneRIGHT SEMI/RIGHT ANTIjoins — swap the relation order and useLEFT SEMI/LEFT ANTIinstead- Cursors (
DECLARE CURSOR,FETCH) — results stream to the client as morsels instead GRANT/REVOKE— access is governed by connection-level policies instead
Not a server by itself
Opteryx Core is an in-process library, not a service — there's no REST, GraphQL, or gRPC server, and no Docker image, Helm chart, or Kubernetes manifests shipped with the project. The hosted opteryx.app provides a server surface (Jobs API, OData, Arrow Flight SQL) separately, if that's what you need instead of embedding the engine.
Related
- Compatibility — verified Python versions, platforms, storage backends, and file formats
- Limits — numeric ceilings enforced at query time
- SQL Conformance — feature-by-feature SQL-92 support
- When to Use Opteryx