ClickHouse
| Status | partial |
|---|---|
| Reads | with icebergS3, one table at a time; not through the catalog |
| Writes | no |
| Iceberg v3 | not tested |
| Geometry, geography | not tested |
| Last verified | 2026-09-28 (ClickHouse 25.8 LTS, 26.9) |
Connect
-- Reads through the catalog fail today (see below); this reads a table directly with the READ-ONLY catalog key:
SELECT count(*) FROM icebergS3('https://s3.lakehousebox.com/<handle>--<catalog>/<namespace>/<table>/', '<ro_client_id>', '<ro_client_secret>');
-- The catalog database lists tables but its reads fail (ClickHouse 25.8 LTS and 26.9):
SET allow_experimental_database_iceberg = 1;
CREATE DATABASE <catalog_name>
ENGINE = DataLakeCatalog('https://catalog.lakehousebox.com', '<client_id>', '<client_secret>')
SETTINGS catalog_type = 'rest',
warehouse = 's3://<handle>--<catalog>/',
catalog_credential = '<client_id>:<client_secret>',
oauth_server_uri = 'https://catalog.lakehousebox.com/v1/oauth/tokens',
storage_endpoint = 'https://s3.lakehousebox.com/<handle>--<catalog>';
SHOW TABLES FROM <catalog_name>;
SELECT count(*) FROM <catalog_name>.`<namespace>.<table>`; -- fails: 403 on a doubled key (below)
What works (verified 2026-09-28, ClickHouse 25.8.33 and 26.9.4): the icebergS3 table function with the table's path and the catalog's read-only key (lhbox connect --readonly, catalog_credential) reads the table, filters included. It finds the newest metadata file itself rather than asking the catalog. What does not: ClickHouse's DataLakeCatalog database engine (experimental, allow_experimental_database_iceberg) connects and lists the tables, but every read fails with a 403: it builds the object key from the table path and then the full metadata location again (…/demo/cities/jatorre--…/demo/cities/metadata/v3.metadata.json), whatever storage_endpoint says, path-style or virtual-hosted. The catalog answers the standard location and metadata-location; the doubling is in ClickHouse, and until it is fixed this path is not usable.