Skip to content

Commit 9b3bde7

Browse files
committed
fix: update DuckDB catalog compatibility for DuckLake 1.0 and Quack
- DuckLake 1.0 ships native Spark (MotherDuck) and Trino clients, so databricks.ducklake and trino.ducklake move from none → partial - duckdb.ducklake also moves to partial so cross-engine pairs resolve correctly in the UI (was silently blocked by the none write-side) - duckdb__duckdb pair override: remove the two outdated "single-engine only" statements; add Quack multi-writer note (beta v1.5, GA v2.0) - duckdb REST write: replace vague "still maturing" with specific constraints (v1.4.2 for standard SQL, no UPDATE/DELETE on partitioned/sorted tables, merge-on-read only); add source URL - Update test invariant: "ducklake none for all engines" → scoped to engines without a DuckLake client + new partial assertion for duckdb/ trino/databricks
1 parent 6a92f45 commit 9b3bde7

2 files changed

Lines changed: 45 additions & 10 deletions

File tree

src/data/compatibility.test.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,16 @@ describe('known facts', () => {
162162
}
163163
});
164164

165-
it('ducklake is none by default for all engines', () => {
166-
for (const engine of ENGINES) {
167-
expect(engineCatalogRules[engine].ducklake.support).toBe('none');
165+
it('ducklake is none for engines without a DuckLake client', () => {
166+
const noClient = ENGINES.filter(e => !(['duckdb', 'trino', 'databricks'] as string[]).includes(e));
167+
for (const engine of noClient) {
168+
expect(engineCatalogRules[engine].ducklake.support, `${engine} should have no ducklake support`).toBe('none');
169+
}
170+
});
171+
172+
it('ducklake is partial for engines with a DuckLake client', () => {
173+
for (const engine of ['duckdb', 'trino', 'databricks'] as const) {
174+
expect(engineCatalogRules[engine].ducklake.support, `${engine} should have partial ducklake support`).toBe('partial');
168175
}
169176
});
170177

src/data/compatibility.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,24 @@ export const engineCatalogRules: Record<EngineId, EngineRule> = {
7272
hive: { support: 'full', limitations: [] },
7373
s3tables: { support: 'none', limitations: [] },
7474
unity: { support: 'full', limitations: [] },
75-
ducklake: { support: 'none', limitations: [] },
75+
ducklake: { support: 'partial', limitations: [
76+
'Requires the DuckLake Spark client (maintained by MotherDuck)',
77+
'DuckDB-backed catalog must be served via Quack for remote access — local DuckDB file not directly accessible',
78+
], sourceUrls: [
79+
'https://ducklake.select/',
80+
'https://motherduck.com/blog/announcing-ducklake-1-0-on-motherduck/',
81+
]},
7682
vendor_bridge: { support: 'none', limitations: [] },
7783
},
7884
duckdb: {
7985
glue: { support: 'none', limitations: [] },
8086
rest: { support: 'partial', limitations: [
81-
'DuckDB Iceberg REST catalog write support added in v1.4.0 — still maturing',
87+
'REST catalog write added in v1.4.0; standard SQL syntax (INSERT/UPDATE/DELETE) requires v1.4.2+',
88+
'UPDATE and DELETE only supported on non-partitioned, non-sorted tables',
89+
'Merge-on-read semantics only — no copy-on-write',
8290
'Not recommended for production write workloads',
91+
], sourceUrls: [
92+
'https://duckdb.org/2025/11/28/iceberg-writes-in-duckdb',
8393
]},
8494
hive: { support: 'none', limitations: [] },
8595
s3tables: { support: 'partial', limitations: [
@@ -91,7 +101,13 @@ export const engineCatalogRules: Record<EngineId, EngineRule> = {
91101
'Known issues with HTTP 500 errors on some commit operations',
92102
'Not recommended for production write workloads',
93103
]},
94-
ducklake: { support: 'none', limitations: [] },
104+
ducklake: { support: 'partial', limitations: [
105+
'Requires the ducklake extension: INSTALL ducklake; LOAD ducklake;',
106+
'Local DuckDB file catalog is single-writer; a Quack catalog server is required for concurrent or cross-engine writers',
107+
], sourceUrls: [
108+
'https://ducklake.select/',
109+
'https://duckdb.org/2026/05/12/quack-remote-protocol',
110+
]},
95111
vendor_bridge: { support: 'none', limitations: [] },
96112
},
97113
redshift: {
@@ -120,7 +136,12 @@ export const engineCatalogRules: Record<EngineId, EngineRule> = {
120136
'Trino connects to Unity Catalog via Iceberg REST, but write requires security mode adjustments and is not GA in OSS Trino',
121137
'Writes via Unity Catalog Iceberg REST create Managed Iceberg tables only — existing Delta tables are read-only via this interface',
122138
]},
123-
ducklake: { support: 'none', limitations: [] },
139+
ducklake: { support: 'partial', limitations: [
140+
'Requires a DuckLake Trino connector',
141+
'DuckDB-backed catalog must be served via Quack for remote access — local DuckDB file not directly accessible',
142+
], sourceUrls: [
143+
'https://ducklake.select/',
144+
]},
124145
vendor_bridge: { support: 'none', limitations: [] },
125146
},
126147
athena: {
@@ -189,8 +210,12 @@ export const pairOverrides: Partial<Record<PairKey, EngineRule>> = {
189210
'duckdb__duckdb': {
190211
glue: { support: 'none', limitations: [] },
191212
rest: { support: 'partial', limitations: [
192-
'DuckDB REST catalog write support added in v1.4.0 — still maturing',
213+
'REST catalog write added in v1.4.0; standard SQL syntax (INSERT/UPDATE/DELETE) requires v1.4.2+',
214+
'UPDATE and DELETE only supported on non-partitioned, non-sorted tables',
215+
'Merge-on-read semantics only — no copy-on-write',
193216
'Not recommended for production workloads',
217+
], sourceUrls: [
218+
'https://duckdb.org/2025/11/28/iceberg-writes-in-duckdb',
194219
]},
195220
hive: { support: 'none', limitations: [] },
196221
s3tables: { support: 'partial', limitations: [
@@ -203,9 +228,12 @@ export const pairOverrides: Partial<Record<PairKey, EngineRule>> = {
203228
'Not recommended for production write workloads',
204229
]},
205230
ducklake: { support: 'partial', limitations: [
206-
'DuckLake stores catalog metadata in a DuckDB database file — not accessible by other engines',
207231
'Requires the ducklake extension: INSTALL ducklake; LOAD ducklake;',
208-
'Designed for single-engine local use cases — not suitable for cross-platform sharing',
232+
'Local DuckDB file catalog is single-writer only',
233+
'Concurrent multi-writer access requires a Quack catalog server (beta in v1.5, GA planned with DuckDB v2.0)',
234+
], sourceUrls: [
235+
'https://ducklake.select/2026/04/13/ducklake-10/',
236+
'https://duckdb.org/2026/05/12/quack-remote-protocol',
209237
]},
210238
vendor_bridge: { support: 'none', limitations: [] },
211239
},

0 commit comments

Comments
 (0)