Skip to main content

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 stage is 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 via ALTER 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-statement ALTER TABLE ... RENAME TO swap preserves the target's exact columns, NOT NULL constraints, partitioning, format, and other connector properties (verified live). This is what load() 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)

Source distribution for continuo-trino-adapter 0.2.1
File Size Uploaded
continuo_trino_adapter-0.2.1.tar.gz 24.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for continuo-trino-adapter 0.2.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page