@lightdash/warehouses 1.27.0 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/warehouseClients/DuckdbWarehouseClient.d.ts +3 -1
- package/dist/warehouseClients/DuckdbWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/DuckdbWarehouseClient.js +33 -10
- package/dist/warehouseClients/DuckdbWarehouseClient.test.js +57 -2
- package/package.json +2 -2
|
@@ -82,7 +82,9 @@ export declare class DuckdbWarehouseClient extends WarehouseBaseClient<CreateDuc
|
|
|
82
82
|
private static hardenInstance;
|
|
83
83
|
private static applyResourceLimits;
|
|
84
84
|
private static usesS3CredentialChain;
|
|
85
|
-
private static
|
|
85
|
+
private static getBundledExtensionPath;
|
|
86
|
+
private loadExtension;
|
|
87
|
+
private loadAwsExtensionForCredentialChain;
|
|
86
88
|
private static bootstrapQuerySession;
|
|
87
89
|
private static bootstrapSharedInstance;
|
|
88
90
|
private static getOrCreateSharedInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DuckdbWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/DuckdbWarehouseClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DuckdbWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/DuckdbWarehouseClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -383,10 +383,35 @@ class DuckdbWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
383
383
|
static usesS3CredentialChain(s3Config) {
|
|
384
384
|
return !(s3Config.accessKey && s3Config.secretKey);
|
|
385
385
|
}
|
|
386
|
-
static async
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
386
|
+
static async getBundledExtensionPath(extension) {
|
|
387
|
+
// Production images bundle signed extensions under the embedded DuckDB
|
|
388
|
+
// version to avoid runtime downloads. Local development has no bundled
|
|
389
|
+
// files and intentionally falls back to INSTALL/LOAD below.
|
|
390
|
+
const extensionPath = path_1.default.resolve(__dirname, '..', 'duckdbExtensions', (0, node_api_1.version)(), `${extension}.duckdb_extension`);
|
|
391
|
+
try {
|
|
392
|
+
await promises_1.default.access(extensionPath, fs_1.default.constants.R_OK);
|
|
393
|
+
return extensionPath;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
return undefined;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
async loadExtension(db, extension) {
|
|
400
|
+
const extensionPath = await DuckdbWarehouseClient.getBundledExtensionPath(extension);
|
|
401
|
+
if (!extensionPath) {
|
|
402
|
+
await db.run(`INSTALL ${extension};`);
|
|
403
|
+
await db.run(`LOAD ${extension};`);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// A bundled file should be valid because Docker verifies the version at
|
|
407
|
+
// build time. Surface load failures instead of hiding corruption or an
|
|
408
|
+
// ABI mismatch behind a network install.
|
|
409
|
+
await db.run(`LOAD '${DuckdbWarehouseClient.escapeDuckdbString(extensionPath)}';`);
|
|
410
|
+
}
|
|
411
|
+
async loadAwsExtensionForCredentialChain(db) {
|
|
412
|
+
if (this.s3Config &&
|
|
413
|
+
DuckdbWarehouseClient.usesS3CredentialChain(this.s3Config)) {
|
|
414
|
+
await this.loadExtension(db, 'aws');
|
|
390
415
|
}
|
|
391
416
|
}
|
|
392
417
|
static async bootstrapQuerySession(db, client) {
|
|
@@ -395,9 +420,8 @@ class DuckdbWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
395
420
|
if (!client.ducklakeConfig) {
|
|
396
421
|
// For DuckLake mode, httpfs and the ducklake/postgres/mysql/azure
|
|
397
422
|
// extensions are autoloaded by ATTACH — no explicit INSTALL/LOAD.
|
|
398
|
-
await
|
|
399
|
-
await
|
|
400
|
-
await DuckdbWarehouseClient.loadAwsExtensionForCredentialChain(db, client.s3Config);
|
|
423
|
+
await client.loadExtension(db, 'httpfs');
|
|
424
|
+
await client.loadAwsExtensionForCredentialChain(db);
|
|
401
425
|
}
|
|
402
426
|
const httpfsMs = performance.now() - httpfsStart;
|
|
403
427
|
await db.run('SET enable_http_metadata_cache = true;');
|
|
@@ -800,9 +824,8 @@ class DuckdbWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
800
824
|
/** Bootstrap for isolated instances — no shared locks needed. */
|
|
801
825
|
async bootstrapIsolatedSession(db, tempDir) {
|
|
802
826
|
if (!this.ducklakeConfig) {
|
|
803
|
-
await
|
|
804
|
-
await
|
|
805
|
-
await DuckdbWarehouseClient.loadAwsExtensionForCredentialChain(db, this.s3Config);
|
|
827
|
+
await this.loadExtension(db, 'httpfs');
|
|
828
|
+
await this.loadAwsExtensionForCredentialChain(db);
|
|
806
829
|
}
|
|
807
830
|
await db.run(`SET temp_directory = '${tempDir}';`);
|
|
808
831
|
if (this.ducklakeConfig) {
|
|
@@ -63,6 +63,7 @@ vi.mock('@duckdb/node-api', () => ({
|
|
|
63
63
|
DuckDBInstance: {
|
|
64
64
|
create: (...args) => createInstanceMock(...args),
|
|
65
65
|
},
|
|
66
|
+
version: () => 'v1.5.2',
|
|
66
67
|
}));
|
|
67
68
|
const getMockStreamResult = (chunks, columnTypeIds) => {
|
|
68
69
|
const columnNames = Object.keys(chunks[0]?.[0] || {});
|
|
@@ -270,6 +271,60 @@ describe('DuckdbWarehouseClient', () => {
|
|
|
270
271
|
expect(secretSql).not.toContain('KEY_ID');
|
|
271
272
|
expect(secretSql).not.toContain("SECRET '");
|
|
272
273
|
});
|
|
274
|
+
it('should load bundled extensions without runtime installs', async () => {
|
|
275
|
+
const accessMock = vi.spyOn(promises_1.default, 'access').mockResolvedValue();
|
|
276
|
+
try {
|
|
277
|
+
const runMock = vi.fn();
|
|
278
|
+
const streamMock = vi.fn(async () => getMockStreamResult([[{ val: 1 }]], [DUCKDB_TYPE_IDS.INTEGER]));
|
|
279
|
+
createInstanceMock.mockResolvedValue(createMockConnection(streamMock, runMock));
|
|
280
|
+
const client = DuckdbWarehouseClient_1.DuckdbWarehouseClient.createForPreAggregate({
|
|
281
|
+
type: 'duckdb_s3',
|
|
282
|
+
s3Config: {
|
|
283
|
+
endpoint: 's3.eu-west-1.amazonaws.com',
|
|
284
|
+
region: 'eu-west-1',
|
|
285
|
+
forcePathStyle: false,
|
|
286
|
+
useSsl: true,
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
await client.runQuery('SELECT 1 AS val');
|
|
290
|
+
expect(runMock).toHaveBeenCalledWith(expect.stringContaining("duckdbExtensions/v1.5.2/httpfs.duckdb_extension';"));
|
|
291
|
+
expect(runMock).toHaveBeenCalledWith(expect.stringContaining("duckdbExtensions/v1.5.2/aws.duckdb_extension';"));
|
|
292
|
+
expect(runMock).not.toHaveBeenCalledWith('INSTALL httpfs;');
|
|
293
|
+
expect(runMock).not.toHaveBeenCalledWith('INSTALL aws;');
|
|
294
|
+
}
|
|
295
|
+
finally {
|
|
296
|
+
accessMock.mockRestore();
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
it('should surface bundled extension load failures', async () => {
|
|
300
|
+
const accessMock = vi.spyOn(promises_1.default, 'access').mockResolvedValue();
|
|
301
|
+
try {
|
|
302
|
+
const loadError = new Error('Invalid bundled extension');
|
|
303
|
+
const runMock = vi.fn(async (sql) => {
|
|
304
|
+
if (sql.includes('httpfs.duckdb_extension')) {
|
|
305
|
+
throw loadError;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
const streamMock = vi.fn(async () => getMockStreamResult([[{ val: 1 }]], [DUCKDB_TYPE_IDS.INTEGER]));
|
|
309
|
+
createInstanceMock.mockResolvedValue(createMockConnection(streamMock, runMock));
|
|
310
|
+
const client = DuckdbWarehouseClient_1.DuckdbWarehouseClient.createForPreAggregate({
|
|
311
|
+
type: 'duckdb_s3',
|
|
312
|
+
s3Config: {
|
|
313
|
+
endpoint: 'localhost:9000',
|
|
314
|
+
region: 'us-east-1',
|
|
315
|
+
accessKey: 'key',
|
|
316
|
+
secretKey: 'secret',
|
|
317
|
+
forcePathStyle: true,
|
|
318
|
+
useSsl: false,
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
await expect(client.runQuery('SELECT 1 AS val')).rejects.toThrow(loadError);
|
|
322
|
+
expect(runMock).not.toHaveBeenCalledWith('INSTALL httpfs;');
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
accessMock.mockRestore();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
273
328
|
it('should use static DuckDB S3 credentials when configured', async () => {
|
|
274
329
|
const runMock = vi.fn();
|
|
275
330
|
const streamMock = vi.fn(async () => getMockStreamResult([[{ val: 1 }]], [DUCKDB_TYPE_IDS.INTEGER]));
|
|
@@ -825,7 +880,7 @@ describe('DuckdbWarehouseClient', () => {
|
|
|
825
880
|
const catalogIdx = stmts.findIndex((s) => /__lightdash_ducklake_catalog/.test(s));
|
|
826
881
|
const dataIdx = stmts.findIndex((s) => /__lightdash_ducklake_data/.test(s));
|
|
827
882
|
const duckLakeSecretIdx = stmts.findIndex((s) => /SECRET __lightdash_ducklake\s/.test(s));
|
|
828
|
-
const attachIdx = stmts.findIndex((s) =>
|
|
883
|
+
const attachIdx = stmts.findIndex((s) => s.startsWith("ATTACH 'ducklake:__lightdash_ducklake'"));
|
|
829
884
|
expect(catalogIdx).toBeGreaterThanOrEqual(0);
|
|
830
885
|
expect(dataIdx).toBeGreaterThan(catalogIdx);
|
|
831
886
|
expect(duckLakeSecretIdx).toBeGreaterThan(dataIdx);
|
|
@@ -862,7 +917,7 @@ describe('DuckdbWarehouseClient', () => {
|
|
|
862
917
|
expect(joined).not.toMatch(/__lightdash_ducklake_catalog/);
|
|
863
918
|
expect(joined).not.toMatch(/__lightdash_ducklake_data/);
|
|
864
919
|
expect(joined).not.toMatch(/SECRET __lightdash_ducklake\s/);
|
|
865
|
-
expect(stmts.some((s) =>
|
|
920
|
+
expect(stmts.some((s) => s.startsWith("ATTACH 'ducklake:sqlite:/tmp/ducklake.sqlite' AS \"ducklake\" (DATA_PATH '/tmp/ducklake-data', READ_ONLY);"))).toBe(true);
|
|
866
921
|
});
|
|
867
922
|
it('rejects user SQL that contains ATTACH even in DuckLake mode', async () => {
|
|
868
923
|
const runMock = captureRunMock();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/warehouses",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.29.0",
|
|
4
4
|
"description": "Warehouse connectors for Lightdash",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"snowflake-sdk": "2.3.4",
|
|
30
30
|
"ssh2": "1.14.0",
|
|
31
31
|
"trino-client": "0.2.9",
|
|
32
|
-
"@lightdash/common": "1.
|
|
32
|
+
"@lightdash/common": "1.29.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/big.js": "6.2.2",
|