continuo-trino-adapter
Trino (Iceberg connector) engine-adapter library for Continuo python nodes.
TrinoAdapter implements continuo_engine_contract.port.WarehouseAdapter
(from the continuo-engine-contract package) — one class covering both the
data plane (fetch / ensure_table / load) and release-time validation
(ensure_schema / drop_schema / build_empty_from_sql /
build_empty_from_columns / clone_empty_from_prod / check_binds) — and
registers itself under entry-point group continuo_engine.adapters as
trino.
Connection env: TRINO_HOST, TRINO_CATALOG (required); TRINO_PORT (default
8080), TRINO_USER (default continuo), TRINO_HTTP_SCHEME (default http),
TRINO_PASSWORD (optional; requires TRINO_HTTP_SCHEME=https).
The config: vocabulary is the union of the two vocabularies this adapter
inherited from the merge: partitioning, sorted_by, format, and
format_version. format takes the PARQUET / ORC / AVRO allowlist on
every path. location and extra_properties are deliberately absent — see
the adapter module docstring.
No multi-statement transactions
Unlike the postgres runtime adapter, Trino/Iceberg has no multi-statement
transactions, so load() cannot be a single atomic TRUNCATE+INSERT. Two
atomic-replace primitives were verified live (Trino 483 + Iceberg REST catalog)
before choosing one — see the full writeup in continuo_trino_adapter/adapter.py's
module docstring:
CREATE OR REPLACE TABLE t AS SELECT * FROM stageis a single Iceberg metadata commit but silently drops NOT NULL constraints on the replaced table (verified live: a NULL insert into a "NOT NULL" column succeeds afterwards, and this connector/version does not support re-adding NOT NULL viaALTER TABLE ... ALTER COLUMN ... SET NOT NULL). Rejected for this reason.CREATE TABLE stage (LIKE target INCLUDING PROPERTIES)at a fresh sibling Iceberg location + populate + a two-statementALTER TABLE ... RENAME TOswap preserves the target's exact columns, NOT NULL constraints, partitioning, format, and other connector properties (verified live). This is whatload()uses.
The swap's exact atomicity guarantee: nothing under the target name is touched
until every row has been inserted into staging, so a failure before the swap
begins (e.g. a NOT-NULL-violating row) leaves the prior target contents
untouched. The two-statement rename swap itself is not single-statement
atomic — there is a brief window between the two renames during which the
target name refers to neither table. load() makes a best-effort recovery
attempt (rename the private old relation back) if the second rename raises, and
best-effort drops only a private staging relation created by that load. If
recovery itself fails, the logged private old relation remains available for
manual recovery because it contains the original target data.
load() assumes a single writer per table: Continuo's scheduler runs at most
one Job per node at a time. Concurrent load() calls against the same table are
unsupported because their target renames would race. Each load uses UUID-named
private swap relations, so distinct targets cannot collide with each other or
with legitimate user tables.
NOT NULL is supported here
Verified live against Trino 483 + the Iceberg REST catalog: NOT NULL column
constraints in CREATE TABLE are supported and enforced by INSERT
(CONSTRAINT_VIOLATION on a NULL value). ensure_table() emits NOT NULL for
nullable=False columns, same as the postgres adapter.
Type-name mapping
The contract's SQL-type grammar (copied verbatim from the postgres adapter, same
regex) admits spellings Trino does not recognize as type names: TEXT,
DOUBLE PRECISION, NUMERIC(p,s). These are mapped to Trino's own spellings
(VARCHAR, DOUBLE, DECIMAL(p,s)) after the grammar guard has already
rejected anything injection-shaped. Every other grammar token is valid Trino DDL
unchanged.
Identifier quoting
The trino DBAPI has no psycopg2-style sql.Identifier. Catalog, schema, table,
and column names are double-quoted by hand, with every embedded double quote
doubled. This preserves legal delimited identifiers such as sales-prod,
order id, and has"quote without allowing names to escape their quotes.
Verification tier: unit tests are mock-free pure-logic tests (type-grammar
validation, type-name mapping, identifier quoting, location derivation, Arrow
table construction from rows); DDL/swap behavior (schema/table creation,
load-owned swap relations, property and NOT NULL preservation, failure cleanup)
is verified against a live Trino 483 + Iceberg REST stack in
tests/test_integration_runtime_trino.py.
Metadata
Release files for continuo-trino-adapter 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| continuo_trino_adapter-0.2.1.tar.gz | 24.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| continuo_trino_adapter-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.4 kB
Release files / continuo_trino_adapter-0.2.1.tar.gz
| Download URL | continuo_trino_adapter-0.2.1.tar.gz |
|---|---|
| Size | 24.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c0bd7881ad88c645725c1b0f1120c961363a139381cc1bc750ddbc7526455086
|
|
BLAKE2b-256 checksum How to use checksums |
b95fc5822fa7f4559c6d3627f448060315470fa9eee57e31999371a995cedd09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency logRelease files / continuo_trino_adapter-0.2.1-py3-none-any.whl
| Download URL | continuo_trino_adapter-0.2.1-py3-none-any.whl |
|---|---|
| Size | 13.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b3f29e6489166ce225e9ab63e4f94950d0873992a542f9c8418547ab237efb0b
|
|
BLAKE2b-256 checksum How to use checksums |
6958375b5a34a2f260921acbcf4965bf34e7ec01f8c2b151fb8743fb4650983b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency log