@lightdash/warehouses 1.56.0 → 1.57.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/PgQueryStream.d.ts +1 -1
- package/dist/warehouseClients/PgQueryStream.d.ts.map +1 -1
- package/dist/warehouseClients/PgQueryStream.js +2 -1
- package/dist/warehouseClients/PostgresWarehouseClient.d.ts +9 -0
- package/dist/warehouseClients/PostgresWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/PostgresWarehouseClient.js +33 -11
- package/dist/warehouseClients/PostgresWarehouseClient.test.js +24 -0
- package/dist/warehouseClients/RedshiftWarehouseClient.test.d.ts +2 -0
- package/dist/warehouseClients/RedshiftWarehouseClient.test.d.ts.map +1 -0
- package/dist/warehouseClients/RedshiftWarehouseClient.test.js +33 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PgQueryStream.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/PgQueryStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAe,WAAW,EAAE,MAAM,IAAI,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,UAAU,iBAAiB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,cAAM,WAAY,SAAQ,QAAS,YAAW,WAAW;IACrD,MAAM,EAAE,OAAO,CAAC;IAEhB,OAAO,EAAE,OAAO,CAAC;IAEjB,oBAAoB,EAAE,QAAQ,CAAC;IAE/B,aAAa,EAAE,QAAQ,CAAC;IAExB,qBAAqB,EAAE,QAAQ,CAAC;IAEhC,qBAAqB,EAAE,QAAQ,CAAC;IAEhC,mBAAmB,EAAE,QAAQ,CAAC;IAE9B,WAAW,EAAE,QAAQ,CAAC;IAEtB,gBAAgB,EAAE,QAAQ,CAAC;IAE3B,YACI,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,MAAM,GAAE,iBAAsB,EA+BjC;IAEM,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAE1C;IAGM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,QAIxC;IAIM,KAAK,CAAC,IAAI,EAAE,MAAM,QAexB;CACJ;
|
|
1
|
+
{"version":3,"file":"PgQueryStream.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/PgQueryStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAe,WAAW,EAAE,MAAM,IAAI,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,UAAU,iBAAiB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,cAAM,WAAY,SAAQ,QAAS,YAAW,WAAW;IACrD,MAAM,EAAE,OAAO,CAAC;IAEhB,OAAO,EAAE,OAAO,CAAC;IAEjB,oBAAoB,EAAE,QAAQ,CAAC;IAE/B,aAAa,EAAE,QAAQ,CAAC;IAExB,qBAAqB,EAAE,QAAQ,CAAC;IAEhC,qBAAqB,EAAE,QAAQ,CAAC;IAEhC,mBAAmB,EAAE,QAAQ,CAAC;IAE9B,WAAW,EAAE,QAAQ,CAAC;IAEtB,gBAAgB,EAAE,QAAQ,CAAC;IAE3B,YACI,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,MAAM,GAAE,iBAAsB,EA+BjC;IAEM,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAE1C;IAGM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,QAIxC;IAIM,KAAK,CAAC,IAAI,EAAE,MAAM,QAexB;CACJ;eAEc,WAAW"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
6
|
const pg_cursor_1 = __importDefault(require("pg-cursor"));
|
|
6
7
|
const stream_1 = require("stream");
|
|
7
8
|
// Note: this is a copy of the QueryStream class from pg-query-stream with the following changes:
|
|
@@ -54,4 +55,4 @@ class QueryStream extends stream_1.Readable {
|
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
exports.default = QueryStream;
|
|
@@ -56,9 +56,16 @@ export declare class PostgresSqlBuilder extends WarehouseBaseSqlBuilder {
|
|
|
56
56
|
getMetricSql(sql: string, metric: Metric): string;
|
|
57
57
|
concatString(...args: string[]): string;
|
|
58
58
|
}
|
|
59
|
+
type CatalogQueryFilters = {
|
|
60
|
+
databaseFilters: string[];
|
|
61
|
+
schemaFilters: string[];
|
|
62
|
+
tableFilters: string[];
|
|
63
|
+
values: string[] | undefined;
|
|
64
|
+
};
|
|
59
65
|
export declare class PostgresClient<T extends CreatePostgresLikeCredentials> extends WarehouseBaseClient<T> {
|
|
60
66
|
config: pg.PoolConfig;
|
|
61
67
|
constructor(credentials: T, config: pg.PoolConfig);
|
|
68
|
+
protected getCatalogQueryFilters(databases: Set<string>, schemas: Set<string>, tables: Set<string>): CatalogQueryFilters;
|
|
62
69
|
private getSQLWithMetadata;
|
|
63
70
|
static convertQueryResultFields(fields: QueryResult<AnyType>['fields']): WarehouseResults['fields'];
|
|
64
71
|
private static getNoticeError;
|
|
@@ -82,6 +89,8 @@ export declare class PostgresClient<T extends CreatePostgresLikeCredentials> ext
|
|
|
82
89
|
parseError(error: pg.DatabaseError, query?: string): WarehouseQueryError;
|
|
83
90
|
}
|
|
84
91
|
export declare class PostgresWarehouseClient extends PostgresClient<CreatePostgresCredentials> {
|
|
92
|
+
protected getCatalogQueryFilters(databases: Set<string>, schemas: Set<string>, tables: Set<string>): CatalogQueryFilters;
|
|
85
93
|
constructor(credentials: CreatePostgresCredentials);
|
|
86
94
|
}
|
|
95
|
+
export {};
|
|
87
96
|
//# sourceMappingURL=PostgresWarehouseClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/PostgresWarehouseClient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PostgresWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/PostgresWarehouseClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -235,6 +235,14 @@ class PostgresClient extends WarehouseBaseClient_1.default {
|
|
|
235
235
|
super(credentials, new PostgresSqlBuilder(credentials.startOfWeek));
|
|
236
236
|
this.config = config;
|
|
237
237
|
}
|
|
238
|
+
getCatalogQueryFilters(databases, schemas, tables) {
|
|
239
|
+
return {
|
|
240
|
+
databaseFilters: [...databases].map((value) => `'${value}'`),
|
|
241
|
+
schemaFilters: [...schemas].map((value) => `'${value}'`),
|
|
242
|
+
tableFilters: [...tables].map((value) => `'${value}'`),
|
|
243
|
+
values: undefined,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
238
246
|
getSQLWithMetadata(sql, tags) {
|
|
239
247
|
let alteredQuery = sql;
|
|
240
248
|
if (tags) {
|
|
@@ -437,15 +445,18 @@ class PostgresClient extends WarehouseBaseClient_1.default {
|
|
|
437
445
|
}
|
|
438
446
|
async getCatalog(requests) {
|
|
439
447
|
const { databases, schemas, tables } = requests.reduce((acc, { database, schema, table }) => ({
|
|
440
|
-
databases: acc.databases.add(
|
|
441
|
-
schemas: acc.schemas.add(
|
|
442
|
-
tables: acc.tables.add(
|
|
448
|
+
databases: acc.databases.add(database),
|
|
449
|
+
schemas: acc.schemas.add(schema),
|
|
450
|
+
tables: acc.tables.add(table),
|
|
443
451
|
}), {
|
|
444
452
|
databases: new Set(),
|
|
445
453
|
schemas: new Set(),
|
|
446
454
|
tables: new Set(),
|
|
447
455
|
});
|
|
448
|
-
|
|
456
|
+
const { databaseFilters, schemaFilters, tableFilters, values } = this.getCatalogQueryFilters(databases, schemas, tables);
|
|
457
|
+
if (databaseFilters.length <= 0 ||
|
|
458
|
+
schemaFilters.length <= 0 ||
|
|
459
|
+
tableFilters.length <= 0) {
|
|
449
460
|
return {};
|
|
450
461
|
}
|
|
451
462
|
const { rows: pgVersionRows } = await this.runQuery('SELECT version()');
|
|
@@ -462,9 +473,9 @@ class PostgresClient extends WarehouseBaseClient_1.default {
|
|
|
462
473
|
column_name,
|
|
463
474
|
data_type
|
|
464
475
|
FROM information_schema.columns
|
|
465
|
-
WHERE table_catalog IN (${
|
|
466
|
-
AND table_schema IN (${
|
|
467
|
-
AND table_name IN (${
|
|
476
|
+
WHERE table_catalog IN (${databaseFilters})
|
|
477
|
+
AND table_schema IN (${schemaFilters})
|
|
478
|
+
AND table_name IN (${tableFilters})
|
|
468
479
|
${supportsMatviews
|
|
469
480
|
? `
|
|
470
481
|
|
|
@@ -480,13 +491,15 @@ class PostgresClient extends WarehouseBaseClient_1.default {
|
|
|
480
491
|
JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
|
|
481
492
|
JOIN pg_catalog.pg_matviews mv ON n.nspname = mv.schemaname AND c.relname = mv.matviewname
|
|
482
493
|
WHERE c.relkind = 'm'
|
|
483
|
-
AND current_database() IN (${
|
|
484
|
-
AND n.nspname IN (${
|
|
485
|
-
AND c.relname IN (${
|
|
494
|
+
AND current_database() IN (${databaseFilters})
|
|
495
|
+
AND n.nspname IN (${schemaFilters})
|
|
496
|
+
AND c.relname IN (${tableFilters})
|
|
486
497
|
AND a.attnum > 0
|
|
487
498
|
AND NOT a.attisdropped`
|
|
488
499
|
: ''}`;
|
|
489
|
-
const { rows } =
|
|
500
|
+
const { rows } = values === undefined
|
|
501
|
+
? await this.runQuery(query)
|
|
502
|
+
: await this.runQuery(query, {}, undefined, values);
|
|
490
503
|
const catalog = rows.reduce((acc, { table_catalog, table_schema, table_name, column_name, data_type, }) => {
|
|
491
504
|
const match = requests.find(({ database, schema, table }) => database === table_catalog &&
|
|
492
505
|
schema === table_schema &&
|
|
@@ -639,6 +652,15 @@ const getSSLConfigFromMode = ({ sslcert, sslkey, sslmode, sslrootcert, }) => {
|
|
|
639
652
|
}
|
|
640
653
|
};
|
|
641
654
|
class PostgresWarehouseClient extends PostgresClient {
|
|
655
|
+
getCatalogQueryFilters(databases, schemas, tables) {
|
|
656
|
+
const values = [...databases, ...schemas, ...tables];
|
|
657
|
+
return {
|
|
658
|
+
databaseFilters: [...databases].map((_, index) => `$${index + 1}`),
|
|
659
|
+
schemaFilters: [...schemas].map((_, index) => `$${databases.size + index + 1}`),
|
|
660
|
+
tableFilters: [...tables].map((_, index) => `$${databases.size + schemas.size + index + 1}`),
|
|
661
|
+
values,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
642
664
|
constructor(credentials) {
|
|
643
665
|
const ssl = getSSLConfigFromMode(credentials);
|
|
644
666
|
super(credentials, {
|
|
@@ -147,6 +147,30 @@ describe('PostgresWarehouseClient', () => {
|
|
|
147
147
|
const warehouse = new PostgresWarehouseClient_1.PostgresWarehouseClient(PostgresWarehouseClient_mock_1.credentials);
|
|
148
148
|
expect(await warehouse.getCatalog([])).toEqual({});
|
|
149
149
|
});
|
|
150
|
+
it('binds catalog filter values as query parameters', async () => {
|
|
151
|
+
const warehouse = new PostgresWarehouseClient_1.PostgresWarehouseClient(PostgresWarehouseClient_mock_1.credentials);
|
|
152
|
+
const database = "missing') OR (SELECT CAST(current_database() AS integer)=0) OR ('x'='x";
|
|
153
|
+
const runQuery = vi
|
|
154
|
+
.spyOn(warehouse, 'runQuery')
|
|
155
|
+
.mockResolvedValueOnce({
|
|
156
|
+
rows: [{ version: 'PostgreSQL 15.4' }],
|
|
157
|
+
fields: {},
|
|
158
|
+
})
|
|
159
|
+
.mockResolvedValueOnce({ rows: [], fields: {} });
|
|
160
|
+
await warehouse.getCatalog([
|
|
161
|
+
{ database, schema: 'public', table: 'orders' },
|
|
162
|
+
]);
|
|
163
|
+
const catalogQuery = runQuery.mock.calls[1][0];
|
|
164
|
+
expect(catalogQuery).toContain('table_catalog IN ($1)');
|
|
165
|
+
expect(catalogQuery).toContain('table_schema IN ($2)');
|
|
166
|
+
expect(catalogQuery).toContain('table_name IN ($3)');
|
|
167
|
+
expect(catalogQuery).not.toContain(database);
|
|
168
|
+
expect(runQuery.mock.calls[1][3]).toEqual([
|
|
169
|
+
database,
|
|
170
|
+
'public',
|
|
171
|
+
'orders',
|
|
172
|
+
]);
|
|
173
|
+
});
|
|
150
174
|
});
|
|
151
175
|
describe('PostgresWarehouseClient statement timeout', () => {
|
|
152
176
|
const mockPoolWithQuery = (queryMock) => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedshiftWarehouseClient.test.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/RedshiftWarehouseClient.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_1 = require("@lightdash/common");
|
|
4
|
+
const RedshiftWarehouseClient_1 = require("./RedshiftWarehouseClient");
|
|
5
|
+
describe('RedshiftWarehouseClient', () => {
|
|
6
|
+
it('keeps catalog filters in the Redshift query', async () => {
|
|
7
|
+
const warehouse = new RedshiftWarehouseClient_1.RedshiftWarehouseClient({
|
|
8
|
+
type: common_1.WarehouseTypes.REDSHIFT,
|
|
9
|
+
host: 'localhost',
|
|
10
|
+
user: 'analytics',
|
|
11
|
+
password: 'password',
|
|
12
|
+
port: 5439,
|
|
13
|
+
dbname: 'warehouse',
|
|
14
|
+
schema: 'public',
|
|
15
|
+
authenticationType: common_1.RedshiftAuthenticationType.PASSWORD,
|
|
16
|
+
});
|
|
17
|
+
const runQuery = vi
|
|
18
|
+
.spyOn(warehouse, 'runQuery')
|
|
19
|
+
.mockResolvedValueOnce({
|
|
20
|
+
rows: [{ version: 'PostgreSQL 8.0.2' }],
|
|
21
|
+
fields: {},
|
|
22
|
+
})
|
|
23
|
+
.mockResolvedValueOnce({ rows: [], fields: {} });
|
|
24
|
+
await warehouse.getCatalog([
|
|
25
|
+
{ database: 'warehouse', schema: 'public', table: 'orders' },
|
|
26
|
+
]);
|
|
27
|
+
const catalogQuery = runQuery.mock.calls[1][0];
|
|
28
|
+
expect(catalogQuery).toContain("table_catalog IN ('warehouse')");
|
|
29
|
+
expect(catalogQuery).toContain("table_schema IN ('public')");
|
|
30
|
+
expect(catalogQuery).toContain("table_name IN ('orders')");
|
|
31
|
+
expect(runQuery.mock.calls[1][3]).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/warehouses",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.57.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.57.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/big.js": "6.2.2",
|