@malloydata/db-snowflake 0.0.376 → 0.0.377
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/snowflake_connection.d.ts +6 -6
- package/dist/snowflake_connection.js +13 -15
- package/dist/snowflake_connection.js.map +1 -1
- package/dist/snowflake_connection.spec.js +95 -0
- package/dist/snowflake_connection.spec.js.map +1 -1
- package/dist/snowflake_sample_strategy.spec.js +72 -0
- package/dist/snowflake_sample_strategy.spec.js.map +1 -1
- package/dist/snowflake_table_name.d.ts +19 -0
- package/dist/snowflake_table_name.js +80 -0
- package/dist/snowflake_table_name.js.map +1 -0
- package/package.json +2 -2
- package/src/snowflake_connection.spec.ts +131 -1
- package/src/snowflake_connection.ts +13 -15
- package/src/snowflake_sample_strategy.spec.ts +87 -0
- package/src/snowflake_table_name.ts +94 -0
- package/dist/snowflake_executor.spec.d.ts +0 -1
- package/dist/snowflake_executor.spec.js +0 -89
- package/dist/snowflake_executor.spec.js.map +0 -1
- package/dist/snowflake_setup.spec.d.ts +0 -1
- package/dist/snowflake_setup.spec.js +0 -76
- package/dist/snowflake_setup.spec.js.map +0 -1
- package/src/snowflake_executor.spec.ts +0 -103
- package/src/snowflake_setup.spec.ts +0 -56
|
@@ -77,15 +77,15 @@ export declare class SnowflakeConnection extends BaseConnection implements Conne
|
|
|
77
77
|
/**
|
|
78
78
|
* Cheap metadata probe: ask INFORMATION_SCHEMA.TABLES for the row count
|
|
79
79
|
* and byte size of tablePath. Returns undefined when the name doesn't
|
|
80
|
-
* parse as a two- or three-part identifier
|
|
81
|
-
*
|
|
82
|
-
*
|
|
80
|
+
* parse as a two- or three-part identifier, when the probe query fails,
|
|
81
|
+
* or when the row has no numeric BYTES (views and external tables
|
|
82
|
+
* typically report NULL).
|
|
83
83
|
*
|
|
84
84
|
* Two-part `schema.table` names use the current database's
|
|
85
85
|
* INFORMATION_SCHEMA; three-part `db.schema.table` names address
|
|
86
|
-
* INFORMATION_SCHEMA in the named database.
|
|
87
|
-
*
|
|
88
|
-
*
|
|
86
|
+
* INFORMATION_SCHEMA in the named database. Identifiers are parsed
|
|
87
|
+
* with Snowflake's quoting rules so bare parts case-fold to upper and
|
|
88
|
+
* quoted parts are compared verbatim against the catalog.
|
|
89
89
|
*/
|
|
90
90
|
private probeTableSize;
|
|
91
91
|
/**
|
|
@@ -28,6 +28,7 @@ const malloy_1 = require("@malloydata/malloy");
|
|
|
28
28
|
const connection_1 = require("@malloydata/malloy/connection");
|
|
29
29
|
const snowflake_executor_1 = require("./snowflake_executor");
|
|
30
30
|
const snowflake_variant_schema_1 = require("./snowflake_variant_schema");
|
|
31
|
+
const snowflake_table_name_1 = require("./snowflake_table_name");
|
|
31
32
|
function pickSampleStrategy(probe, fullScanMaxBytes) {
|
|
32
33
|
if (probe === undefined)
|
|
33
34
|
return 'tablesample-then-limit';
|
|
@@ -243,30 +244,27 @@ class SnowflakeConnection extends connection_1.BaseConnection {
|
|
|
243
244
|
/**
|
|
244
245
|
* Cheap metadata probe: ask INFORMATION_SCHEMA.TABLES for the row count
|
|
245
246
|
* and byte size of tablePath. Returns undefined when the name doesn't
|
|
246
|
-
* parse as a two- or three-part identifier
|
|
247
|
-
*
|
|
248
|
-
*
|
|
247
|
+
* parse as a two- or three-part identifier, when the probe query fails,
|
|
248
|
+
* or when the row has no numeric BYTES (views and external tables
|
|
249
|
+
* typically report NULL).
|
|
249
250
|
*
|
|
250
251
|
* Two-part `schema.table` names use the current database's
|
|
251
252
|
* INFORMATION_SCHEMA; three-part `db.schema.table` names address
|
|
252
|
-
* INFORMATION_SCHEMA in the named database.
|
|
253
|
-
*
|
|
254
|
-
*
|
|
253
|
+
* INFORMATION_SCHEMA in the named database. Identifiers are parsed
|
|
254
|
+
* with Snowflake's quoting rules so bare parts case-fold to upper and
|
|
255
|
+
* quoted parts are compared verbatim against the catalog.
|
|
255
256
|
*/
|
|
256
257
|
async probeTableSize(tablePath) {
|
|
257
258
|
var _a, _b;
|
|
258
|
-
const
|
|
259
|
-
if (
|
|
259
|
+
const parsed = (0, snowflake_table_name_1.parseSnowflakeTableName)(tablePath);
|
|
260
|
+
if (parsed === undefined || parsed.schema === undefined)
|
|
260
261
|
return undefined;
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
return undefined;
|
|
264
|
-
const [db, schema, table] = parts.length === 3 ? parts : [undefined, parts[0], parts[1]];
|
|
265
|
-
const dbQualifier = db !== undefined ? `${db}.` : '';
|
|
262
|
+
const quoteLit = (s) => s.replace(/'/g, "''");
|
|
263
|
+
const dbQualifier = parsed.database ? `${parsed.database.sql}.` : '';
|
|
266
264
|
const rows = await this.executor.tryBatch(`select row_count as rc, bytes as by
|
|
267
265
|
from ${dbQualifier}information_schema.tables
|
|
268
|
-
where
|
|
269
|
-
and
|
|
266
|
+
where table_schema = '${quoteLit(parsed.schema.literal)}'
|
|
267
|
+
and table_name = '${quoteLit(parsed.table.literal)}'
|
|
270
268
|
limit 1`, {}, this.schemaSampleTimeoutMs);
|
|
271
269
|
if (!rows || rows.length === 0)
|
|
272
270
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake_connection.js","sourceRoot":"","sources":["../src/snowflake_connection.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;
|
|
1
|
+
{"version":3,"file":"snowflake_connection.js","sourceRoot":"","sources":["../src/snowflake_connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,12 +54,17 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
54
54
|
return result;
|
|
55
55
|
};
|
|
56
56
|
})();
|
|
57
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
58
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
59
|
+
};
|
|
57
60
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
61
|
const malloy = __importStar(require("@malloydata/malloy"));
|
|
59
62
|
const test_1 = require("@malloydata/malloy/test");
|
|
60
63
|
require("@malloydata/malloy/test/matchers");
|
|
64
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
61
65
|
const snowflake_connection_1 = require("./snowflake_connection");
|
|
62
66
|
const snowflake_executor_1 = require("./snowflake_executor");
|
|
67
|
+
const [describeSnowflakeExecutor] = (0, test_1.describeIfDatabaseAvailable)(['snowflake']);
|
|
63
68
|
describe('db:Snowflake', () => {
|
|
64
69
|
const connOptions = snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
65
70
|
snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
@@ -412,4 +417,94 @@ describe('numeric value reading', () => {
|
|
|
412
417
|
});
|
|
413
418
|
});
|
|
414
419
|
});
|
|
420
|
+
class SnowflakeExecutorTestSetup {
|
|
421
|
+
constructor(executor) {
|
|
422
|
+
this.executor_ = executor;
|
|
423
|
+
}
|
|
424
|
+
async runBatch(sqlText) {
|
|
425
|
+
let ret = [];
|
|
426
|
+
await (async () => {
|
|
427
|
+
const rows = await this.executor_.batch(sqlText);
|
|
428
|
+
return rows;
|
|
429
|
+
})().then((rows) => {
|
|
430
|
+
ret = rows;
|
|
431
|
+
});
|
|
432
|
+
return ret;
|
|
433
|
+
}
|
|
434
|
+
async runStreaming(sqlText, queryOptions) {
|
|
435
|
+
const rows = [];
|
|
436
|
+
await (async () => {
|
|
437
|
+
for await (const row of await this.executor_.stream(sqlText, queryOptions)) {
|
|
438
|
+
rows.push(row);
|
|
439
|
+
}
|
|
440
|
+
})();
|
|
441
|
+
return rows;
|
|
442
|
+
}
|
|
443
|
+
async done() {
|
|
444
|
+
await this.executor_.done();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
describeSnowflakeExecutor('db:SnowflakeExecutor', () => {
|
|
448
|
+
let db;
|
|
449
|
+
let query;
|
|
450
|
+
beforeAll(() => {
|
|
451
|
+
const connOptions = snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
452
|
+
snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
453
|
+
const executor = new snowflake_executor_1.SnowflakeExecutor(connOptions);
|
|
454
|
+
db = new SnowflakeExecutorTestSetup(executor);
|
|
455
|
+
query = `
|
|
456
|
+
select
|
|
457
|
+
*
|
|
458
|
+
from
|
|
459
|
+
(
|
|
460
|
+
values
|
|
461
|
+
(1, 'one'),
|
|
462
|
+
(2, 'two'),
|
|
463
|
+
(3, 'three'),
|
|
464
|
+
(4, 'four'),
|
|
465
|
+
(5, 'five')
|
|
466
|
+
);
|
|
467
|
+
`;
|
|
468
|
+
});
|
|
469
|
+
afterAll(async () => {
|
|
470
|
+
await db.done();
|
|
471
|
+
});
|
|
472
|
+
it('verifies batch execute', async () => {
|
|
473
|
+
const rows = await db.runBatch(query);
|
|
474
|
+
expect(rows.length).toBe(5);
|
|
475
|
+
});
|
|
476
|
+
it('verifies stream iterable', async () => {
|
|
477
|
+
const rows = await db.runStreaming(query, { rowLimit: 2 });
|
|
478
|
+
expect(rows.length).toBe(2);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
describe('setupSQL', () => {
|
|
482
|
+
const connOptions = snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
483
|
+
snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
484
|
+
const uid = crypto_1.default.randomBytes(4).toString('hex');
|
|
485
|
+
const connections = [];
|
|
486
|
+
function makeConn(name, setupSQL) {
|
|
487
|
+
const conn = new snowflake_connection_1.SnowflakeConnection(name, { connOptions, setupSQL });
|
|
488
|
+
connections.push(conn);
|
|
489
|
+
return conn;
|
|
490
|
+
}
|
|
491
|
+
afterAll(async () => {
|
|
492
|
+
await Promise.all(connections.map(c => c.close()));
|
|
493
|
+
});
|
|
494
|
+
it('runs a single setup statement', async () => {
|
|
495
|
+
const conn = makeConn('snowflake_setup_single', `SET setup_test_${uid} = 42`);
|
|
496
|
+
const result = await conn.runSQL(`SELECT $setup_test_${uid} AS V`);
|
|
497
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(42);
|
|
498
|
+
});
|
|
499
|
+
it('runs multiple semicolon-newline-separated statements', async () => {
|
|
500
|
+
const conn = makeConn('snowflake_setup_multi', [`SET setup_a_${uid} = 10`, `SET setup_b_${uid} = 20`].join(';\n'));
|
|
501
|
+
const result = await conn.runSQL(`SELECT $setup_a_${uid} + $setup_b_${uid} AS V`);
|
|
502
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(30);
|
|
503
|
+
});
|
|
504
|
+
it('handles multi-line statements', async () => {
|
|
505
|
+
const conn = makeConn('snowflake_setup_multiline', `SET\n setup_ml_${uid} = 99`);
|
|
506
|
+
const result = await conn.runSQL(`SELECT $setup_ml_${uid} AS V`);
|
|
507
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(99);
|
|
508
|
+
});
|
|
509
|
+
});
|
|
415
510
|
//# sourceMappingURL=snowflake_connection.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake_connection.spec.js","sourceRoot":"","sources":["../src/snowflake_connection.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snowflake_connection.spec.js","sourceRoot":"","sources":["../src/snowflake_connection.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
const snowflake_connection_1 = require("./snowflake_connection");
|
|
8
|
+
const snowflake_table_name_1 = require("./snowflake_table_name");
|
|
8
9
|
describe('pickSampleStrategy', () => {
|
|
9
10
|
const threshold = 100000000;
|
|
10
11
|
test('no probe → best-effort tablesample-then-limit', () => {
|
|
@@ -22,4 +23,75 @@ describe('pickSampleStrategy', () => {
|
|
|
22
23
|
expect((0, snowflake_connection_1.pickSampleStrategy)({ bytes: 1, rowCount: 1 }, 0)).toBe('tablesample-only');
|
|
23
24
|
});
|
|
24
25
|
});
|
|
26
|
+
describe('parseSnowflakeTableName', () => {
|
|
27
|
+
test('single bare identifier', () => {
|
|
28
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('aircraft')).toEqual({
|
|
29
|
+
table: { literal: 'AIRCRAFT', sql: 'AIRCRAFT', quoted: false },
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
test('two-part bare name uppercases both parts', () => {
|
|
33
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('malloytest.aircraft')).toEqual({
|
|
34
|
+
schema: { literal: 'MALLOYTEST', sql: 'MALLOYTEST', quoted: false },
|
|
35
|
+
table: { literal: 'AIRCRAFT', sql: 'AIRCRAFT', quoted: false },
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
test('three-part bare name', () => {
|
|
39
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('db.sch.t')).toEqual({
|
|
40
|
+
database: { literal: 'DB', sql: 'DB', quoted: false },
|
|
41
|
+
schema: { literal: 'SCH', sql: 'SCH', quoted: false },
|
|
42
|
+
table: { literal: 'T', sql: 'T', quoted: false },
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
test('quoted identifier preserves case', () => {
|
|
46
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('"MyDb"."schema"."t"')).toEqual({
|
|
47
|
+
database: { literal: 'MyDb', sql: '"MyDb"', quoted: true },
|
|
48
|
+
schema: { literal: 'schema', sql: '"schema"', quoted: true },
|
|
49
|
+
table: { literal: 't', sql: '"t"', quoted: true },
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
test('quoted identifier allows embedded dots', () => {
|
|
53
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('"a.b"."c.d"')).toEqual({
|
|
54
|
+
schema: { literal: 'a.b', sql: '"a.b"', quoted: true },
|
|
55
|
+
table: { literal: 'c.d', sql: '"c.d"', quoted: true },
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
test('doubled double-quote is a literal quote', () => {
|
|
59
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('"a""b"')).toEqual({
|
|
60
|
+
table: { literal: 'a"b', sql: '"a""b"', quoted: true },
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
test('mixes quoted and bare parts', () => {
|
|
64
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('MYDB."mixed"')).toEqual({
|
|
65
|
+
schema: { literal: 'MYDB', sql: 'MYDB', quoted: false },
|
|
66
|
+
table: { literal: 'mixed', sql: '"mixed"', quoted: true },
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
test('tolerates surrounding whitespace and whitespace around dots', () => {
|
|
70
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)(' sch . t ')).toEqual({
|
|
71
|
+
schema: { literal: 'SCH', sql: 'SCH', quoted: false },
|
|
72
|
+
table: { literal: 'T', sql: 'T', quoted: false },
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
test('returns undefined for empty input', () => {
|
|
76
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('')).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
test('returns undefined for four-part name', () => {
|
|
79
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('a.b.c.d')).toBeUndefined();
|
|
80
|
+
});
|
|
81
|
+
test('returns undefined for trailing dot', () => {
|
|
82
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('sch.')).toBeUndefined();
|
|
83
|
+
});
|
|
84
|
+
test('returns undefined for leading dot', () => {
|
|
85
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('.t')).toBeUndefined();
|
|
86
|
+
});
|
|
87
|
+
test('returns undefined for unterminated quoted identifier', () => {
|
|
88
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('"oops')).toBeUndefined();
|
|
89
|
+
});
|
|
90
|
+
test('returns undefined for identifier starting with a digit', () => {
|
|
91
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('1foo')).toBeUndefined();
|
|
92
|
+
});
|
|
93
|
+
test('returns undefined for identifier containing a dash', () => {
|
|
94
|
+
expect((0, snowflake_table_name_1.parseSnowflakeTableName)('foo-bar')).toBeUndefined();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
25
97
|
//# sourceMappingURL=snowflake_sample_strategy.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake_sample_strategy.spec.js","sourceRoot":"","sources":["../src/snowflake_sample_strategy.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,iEAA0D;
|
|
1
|
+
{"version":3,"file":"snowflake_sample_strategy.spec.js","sourceRoot":"","sources":["../src/snowflake_sample_strategy.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface SnowflakeIdentPart {
|
|
2
|
+
/** Normalized catalog value — suitable for a SQL string literal. */
|
|
3
|
+
literal: string;
|
|
4
|
+
/** Re-emission form — suitable for a SQL identifier position. */
|
|
5
|
+
sql: string;
|
|
6
|
+
quoted: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface ParsedSnowflakeTableName {
|
|
9
|
+
database?: SnowflakeIdentPart;
|
|
10
|
+
schema?: SnowflakeIdentPart;
|
|
11
|
+
table: SnowflakeIdentPart;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse a Snowflake table reference into 1-3 identifier parts. Returns
|
|
15
|
+
* undefined when the input is not a well-formed `[db.][schema.]table`
|
|
16
|
+
* reference — callers should treat that as "unknown shape" and skip
|
|
17
|
+
* metadata-driven optimizations rather than guessing.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSnowflakeTableName(src: string): ParsedSnowflakeTableName | undefined;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright Contributors to the Malloy project
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.parseSnowflakeTableName = parseSnowflakeTableName;
|
|
8
|
+
// Parses Snowflake table references of the form
|
|
9
|
+
// [database.][schema.]table
|
|
10
|
+
// where each part is either a bare identifier (case-insensitive, stored
|
|
11
|
+
// upper-cased in Snowflake's catalog) or a double-quoted identifier
|
|
12
|
+
// (case-sensitive, with `""` as the in-string escape for a literal `"`).
|
|
13
|
+
//
|
|
14
|
+
// The parser exists so the INFORMATION_SCHEMA.TABLES size probe can compare
|
|
15
|
+
// `table_schema` / `table_name` against the correct catalog value:
|
|
16
|
+
// bare names must be upper-cased, quoted names must be passed through
|
|
17
|
+
// verbatim. The old `split('.')` + regex approach got this wrong for
|
|
18
|
+
// quoted names and names with embedded dots.
|
|
19
|
+
const internal_1 = require("@malloydata/malloy/internal");
|
|
20
|
+
class SnowflakeTableNameParser extends internal_1.TinyParser {
|
|
21
|
+
constructor(input) {
|
|
22
|
+
super(input, {
|
|
23
|
+
space: /^\s+/,
|
|
24
|
+
char: /^\./,
|
|
25
|
+
qstr: /^"(?:[^"]|"")*"/,
|
|
26
|
+
ident: /^[A-Za-z_][A-Za-z0-9_$]*/,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
parts() {
|
|
30
|
+
const out = [this.readPart()];
|
|
31
|
+
while (this.match('.')) {
|
|
32
|
+
out.push(this.readPart());
|
|
33
|
+
}
|
|
34
|
+
if (!this.eof()) {
|
|
35
|
+
throw this.parseError(`Unexpected ${this.peek().type}`);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
readPart() {
|
|
40
|
+
const quoted = this.match('qstr');
|
|
41
|
+
if (quoted) {
|
|
42
|
+
// qstr strips outer quotes; `""` inside is the Snowflake escape.
|
|
43
|
+
const literal = quoted.text.replace(/""/g, '"');
|
|
44
|
+
return {
|
|
45
|
+
literal,
|
|
46
|
+
sql: `"${literal.replace(/"/g, '""')}"`,
|
|
47
|
+
quoted: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const ident = this.match('ident');
|
|
51
|
+
if (ident) {
|
|
52
|
+
const literal = ident.text.toUpperCase();
|
|
53
|
+
return { literal, sql: literal, quoted: false };
|
|
54
|
+
}
|
|
55
|
+
throw this.parseError('Expected identifier');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse a Snowflake table reference into 1-3 identifier parts. Returns
|
|
60
|
+
* undefined when the input is not a well-formed `[db.][schema.]table`
|
|
61
|
+
* reference — callers should treat that as "unknown shape" and skip
|
|
62
|
+
* metadata-driven optimizations rather than guessing.
|
|
63
|
+
*/
|
|
64
|
+
function parseSnowflakeTableName(src) {
|
|
65
|
+
let parts;
|
|
66
|
+
try {
|
|
67
|
+
parts = new SnowflakeTableNameParser(src).parts();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
if (parts.length < 1 || parts.length > 3)
|
|
73
|
+
return undefined;
|
|
74
|
+
if (parts.length === 1)
|
|
75
|
+
return { table: parts[0] };
|
|
76
|
+
if (parts.length === 2)
|
|
77
|
+
return { schema: parts[0], table: parts[1] };
|
|
78
|
+
return { database: parts[0], schema: parts[1], table: parts[2] };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=snowflake_table_name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snowflake_table_name.js","sourceRoot":"","sources":["../src/snowflake_table_name.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA6EH,0DAaC;AAxFD,gDAAgD;AAChD,8BAA8B;AAC9B,wEAAwE;AACxE,oEAAoE;AACpE,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,sEAAsE;AACtE,qEAAqE;AACrE,6CAA6C;AAE7C,0DAAuD;AAgBvD,MAAM,wBAAyB,SAAQ,qBAAU;IAC/C,YAAY,KAAa;QACvB,KAAK,CAAC,KAAK,EAAE;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,0BAA0B;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,QAAQ;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,iEAAiE;YACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO;gBACP,GAAG,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;gBACvC,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC/C,CAAC;CACF;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,GAAW;IAEX,IAAI,KAA2B,CAAC;IAChC,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC;IACnE,OAAO,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC;AACjE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@malloydata/db-snowflake",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.377",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"prepublishOnly": "npm run build"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@malloydata/malloy": "0.0.
|
|
25
|
+
"@malloydata/malloy": "0.0.377",
|
|
26
26
|
"generic-pool": "^3.9.0",
|
|
27
27
|
"snowflake-sdk": "2.3.1",
|
|
28
28
|
"toml": "^3.0.0"
|
|
@@ -22,11 +22,19 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import * as malloy from '@malloydata/malloy';
|
|
25
|
-
import {
|
|
25
|
+
import type {QueryData, RunSQLOptions} from '@malloydata/malloy';
|
|
26
|
+
import {
|
|
27
|
+
createTestRuntime,
|
|
28
|
+
describeIfDatabaseAvailable,
|
|
29
|
+
mkTestModel,
|
|
30
|
+
} from '@malloydata/malloy/test';
|
|
26
31
|
import '@malloydata/malloy/test/matchers';
|
|
32
|
+
import crypto from 'crypto';
|
|
27
33
|
import {SnowflakeConnection} from './snowflake_connection';
|
|
28
34
|
import {SnowflakeExecutor} from './snowflake_executor';
|
|
29
35
|
|
|
36
|
+
const [describeSnowflakeExecutor] = describeIfDatabaseAvailable(['snowflake']);
|
|
37
|
+
|
|
30
38
|
describe('db:Snowflake', () => {
|
|
31
39
|
const connOptions =
|
|
32
40
|
SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
@@ -422,3 +430,125 @@ describe('numeric value reading', () => {
|
|
|
422
430
|
);
|
|
423
431
|
});
|
|
424
432
|
});
|
|
433
|
+
|
|
434
|
+
class SnowflakeExecutorTestSetup {
|
|
435
|
+
private executor_: SnowflakeExecutor;
|
|
436
|
+
constructor(executor: SnowflakeExecutor) {
|
|
437
|
+
this.executor_ = executor;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
async runBatch(sqlText: string): Promise<QueryData> {
|
|
441
|
+
let ret: QueryData = [];
|
|
442
|
+
await (async () => {
|
|
443
|
+
const rows = await this.executor_.batch(sqlText);
|
|
444
|
+
return rows;
|
|
445
|
+
})().then((rows: QueryData) => {
|
|
446
|
+
ret = rows;
|
|
447
|
+
});
|
|
448
|
+
return ret;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
async runStreaming(sqlText: string, queryOptions?: RunSQLOptions) {
|
|
452
|
+
const rows: QueryData = [];
|
|
453
|
+
await (async () => {
|
|
454
|
+
for await (const row of await this.executor_.stream(
|
|
455
|
+
sqlText,
|
|
456
|
+
queryOptions
|
|
457
|
+
)) {
|
|
458
|
+
rows.push(row);
|
|
459
|
+
}
|
|
460
|
+
})();
|
|
461
|
+
return rows;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
async done() {
|
|
465
|
+
await this.executor_.done();
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
describeSnowflakeExecutor('db:SnowflakeExecutor', () => {
|
|
470
|
+
let db: SnowflakeExecutorTestSetup;
|
|
471
|
+
let query: string;
|
|
472
|
+
|
|
473
|
+
beforeAll(() => {
|
|
474
|
+
const connOptions =
|
|
475
|
+
SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
476
|
+
SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
477
|
+
const executor = new SnowflakeExecutor(connOptions);
|
|
478
|
+
db = new SnowflakeExecutorTestSetup(executor);
|
|
479
|
+
query = `
|
|
480
|
+
select
|
|
481
|
+
*
|
|
482
|
+
from
|
|
483
|
+
(
|
|
484
|
+
values
|
|
485
|
+
(1, 'one'),
|
|
486
|
+
(2, 'two'),
|
|
487
|
+
(3, 'three'),
|
|
488
|
+
(4, 'four'),
|
|
489
|
+
(5, 'five')
|
|
490
|
+
);
|
|
491
|
+
`;
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
afterAll(async () => {
|
|
495
|
+
await db.done();
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
it('verifies batch execute', async () => {
|
|
499
|
+
const rows = await db.runBatch(query);
|
|
500
|
+
expect(rows.length).toBe(5);
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it('verifies stream iterable', async () => {
|
|
504
|
+
const rows = await db.runStreaming(query, {rowLimit: 2});
|
|
505
|
+
expect(rows.length).toBe(2);
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
describe('setupSQL', () => {
|
|
510
|
+
const connOptions =
|
|
511
|
+
SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
512
|
+
SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
513
|
+
const uid = crypto.randomBytes(4).toString('hex');
|
|
514
|
+
const connections: SnowflakeConnection[] = [];
|
|
515
|
+
|
|
516
|
+
function makeConn(name: string, setupSQL: string): SnowflakeConnection {
|
|
517
|
+
const conn = new SnowflakeConnection(name, {connOptions, setupSQL});
|
|
518
|
+
connections.push(conn);
|
|
519
|
+
return conn;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
afterAll(async () => {
|
|
523
|
+
await Promise.all(connections.map(c => c.close()));
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
it('runs a single setup statement', async () => {
|
|
527
|
+
const conn = makeConn(
|
|
528
|
+
'snowflake_setup_single',
|
|
529
|
+
`SET setup_test_${uid} = 42`
|
|
530
|
+
);
|
|
531
|
+
const result = await conn.runSQL(`SELECT $setup_test_${uid} AS V`);
|
|
532
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(42);
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
it('runs multiple semicolon-newline-separated statements', async () => {
|
|
536
|
+
const conn = makeConn(
|
|
537
|
+
'snowflake_setup_multi',
|
|
538
|
+
[`SET setup_a_${uid} = 10`, `SET setup_b_${uid} = 20`].join(';\n')
|
|
539
|
+
);
|
|
540
|
+
const result = await conn.runSQL(
|
|
541
|
+
`SELECT $setup_a_${uid} + $setup_b_${uid} AS V`
|
|
542
|
+
);
|
|
543
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(30);
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it('handles multi-line statements', async () => {
|
|
547
|
+
const conn = makeConn(
|
|
548
|
+
'snowflake_setup_multiline',
|
|
549
|
+
`SET\n setup_ml_${uid} = 99`
|
|
550
|
+
);
|
|
551
|
+
const result = await conn.runSQL(`SELECT $setup_ml_${uid} AS V`);
|
|
552
|
+
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(99);
|
|
553
|
+
});
|
|
554
|
+
});
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
seedTopLevelShape,
|
|
49
49
|
} from './snowflake_variant_schema';
|
|
50
50
|
import type {NestedColumn} from './snowflake_variant_schema';
|
|
51
|
+
import {parseSnowflakeTableName} from './snowflake_table_name';
|
|
51
52
|
import type {ConnectionOptions} from 'snowflake-sdk';
|
|
52
53
|
import type {Options as PoolOptions} from 'generic-pool';
|
|
53
54
|
|
|
@@ -423,31 +424,28 @@ export class SnowflakeConnection
|
|
|
423
424
|
/**
|
|
424
425
|
* Cheap metadata probe: ask INFORMATION_SCHEMA.TABLES for the row count
|
|
425
426
|
* and byte size of tablePath. Returns undefined when the name doesn't
|
|
426
|
-
* parse as a two- or three-part identifier
|
|
427
|
-
*
|
|
428
|
-
*
|
|
427
|
+
* parse as a two- or three-part identifier, when the probe query fails,
|
|
428
|
+
* or when the row has no numeric BYTES (views and external tables
|
|
429
|
+
* typically report NULL).
|
|
429
430
|
*
|
|
430
431
|
* Two-part `schema.table` names use the current database's
|
|
431
432
|
* INFORMATION_SCHEMA; three-part `db.schema.table` names address
|
|
432
|
-
* INFORMATION_SCHEMA in the named database.
|
|
433
|
-
*
|
|
434
|
-
*
|
|
433
|
+
* INFORMATION_SCHEMA in the named database. Identifiers are parsed
|
|
434
|
+
* with Snowflake's quoting rules so bare parts case-fold to upper and
|
|
435
|
+
* quoted parts are compared verbatim against the catalog.
|
|
435
436
|
*/
|
|
436
437
|
private async probeTableSize(
|
|
437
438
|
tablePath: string
|
|
438
439
|
): Promise<TableSizeProbe | undefined> {
|
|
439
|
-
const
|
|
440
|
-
if (
|
|
441
|
-
const
|
|
442
|
-
|
|
443
|
-
const [db, schema, table] =
|
|
444
|
-
parts.length === 3 ? parts : [undefined, parts[0], parts[1]];
|
|
445
|
-
const dbQualifier = db !== undefined ? `${db}.` : '';
|
|
440
|
+
const parsed = parseSnowflakeTableName(tablePath);
|
|
441
|
+
if (parsed === undefined || parsed.schema === undefined) return undefined;
|
|
442
|
+
const quoteLit = (s: string) => s.replace(/'/g, "''");
|
|
443
|
+
const dbQualifier = parsed.database ? `${parsed.database.sql}.` : '';
|
|
446
444
|
const rows = await this.executor.tryBatch(
|
|
447
445
|
`select row_count as rc, bytes as by
|
|
448
446
|
from ${dbQualifier}information_schema.tables
|
|
449
|
-
where
|
|
450
|
-
and
|
|
447
|
+
where table_schema = '${quoteLit(parsed.schema.literal)}'
|
|
448
|
+
and table_name = '${quoteLit(parsed.table.literal)}'
|
|
451
449
|
limit 1`,
|
|
452
450
|
{},
|
|
453
451
|
this.schemaSampleTimeoutMs
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {pickSampleStrategy} from './snowflake_connection';
|
|
7
|
+
import {parseSnowflakeTableName} from './snowflake_table_name';
|
|
7
8
|
|
|
8
9
|
describe('pickSampleStrategy', () => {
|
|
9
10
|
const threshold = 100_000_000;
|
|
@@ -41,3 +42,89 @@ describe('pickSampleStrategy', () => {
|
|
|
41
42
|
);
|
|
42
43
|
});
|
|
43
44
|
});
|
|
45
|
+
|
|
46
|
+
describe('parseSnowflakeTableName', () => {
|
|
47
|
+
test('single bare identifier', () => {
|
|
48
|
+
expect(parseSnowflakeTableName('aircraft')).toEqual({
|
|
49
|
+
table: {literal: 'AIRCRAFT', sql: 'AIRCRAFT', quoted: false},
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('two-part bare name uppercases both parts', () => {
|
|
54
|
+
expect(parseSnowflakeTableName('malloytest.aircraft')).toEqual({
|
|
55
|
+
schema: {literal: 'MALLOYTEST', sql: 'MALLOYTEST', quoted: false},
|
|
56
|
+
table: {literal: 'AIRCRAFT', sql: 'AIRCRAFT', quoted: false},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('three-part bare name', () => {
|
|
61
|
+
expect(parseSnowflakeTableName('db.sch.t')).toEqual({
|
|
62
|
+
database: {literal: 'DB', sql: 'DB', quoted: false},
|
|
63
|
+
schema: {literal: 'SCH', sql: 'SCH', quoted: false},
|
|
64
|
+
table: {literal: 'T', sql: 'T', quoted: false},
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('quoted identifier preserves case', () => {
|
|
69
|
+
expect(parseSnowflakeTableName('"MyDb"."schema"."t"')).toEqual({
|
|
70
|
+
database: {literal: 'MyDb', sql: '"MyDb"', quoted: true},
|
|
71
|
+
schema: {literal: 'schema', sql: '"schema"', quoted: true},
|
|
72
|
+
table: {literal: 't', sql: '"t"', quoted: true},
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('quoted identifier allows embedded dots', () => {
|
|
77
|
+
expect(parseSnowflakeTableName('"a.b"."c.d"')).toEqual({
|
|
78
|
+
schema: {literal: 'a.b', sql: '"a.b"', quoted: true},
|
|
79
|
+
table: {literal: 'c.d', sql: '"c.d"', quoted: true},
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('doubled double-quote is a literal quote', () => {
|
|
84
|
+
expect(parseSnowflakeTableName('"a""b"')).toEqual({
|
|
85
|
+
table: {literal: 'a"b', sql: '"a""b"', quoted: true},
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('mixes quoted and bare parts', () => {
|
|
90
|
+
expect(parseSnowflakeTableName('MYDB."mixed"')).toEqual({
|
|
91
|
+
schema: {literal: 'MYDB', sql: 'MYDB', quoted: false},
|
|
92
|
+
table: {literal: 'mixed', sql: '"mixed"', quoted: true},
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('tolerates surrounding whitespace and whitespace around dots', () => {
|
|
97
|
+
expect(parseSnowflakeTableName(' sch . t ')).toEqual({
|
|
98
|
+
schema: {literal: 'SCH', sql: 'SCH', quoted: false},
|
|
99
|
+
table: {literal: 'T', sql: 'T', quoted: false},
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('returns undefined for empty input', () => {
|
|
104
|
+
expect(parseSnowflakeTableName('')).toBeUndefined();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('returns undefined for four-part name', () => {
|
|
108
|
+
expect(parseSnowflakeTableName('a.b.c.d')).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('returns undefined for trailing dot', () => {
|
|
112
|
+
expect(parseSnowflakeTableName('sch.')).toBeUndefined();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('returns undefined for leading dot', () => {
|
|
116
|
+
expect(parseSnowflakeTableName('.t')).toBeUndefined();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('returns undefined for unterminated quoted identifier', () => {
|
|
120
|
+
expect(parseSnowflakeTableName('"oops')).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('returns undefined for identifier starting with a digit', () => {
|
|
124
|
+
expect(parseSnowflakeTableName('1foo')).toBeUndefined();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('returns undefined for identifier containing a dash', () => {
|
|
128
|
+
expect(parseSnowflakeTableName('foo-bar')).toBeUndefined();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Contributors to the Malloy project
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Parses Snowflake table references of the form
|
|
7
|
+
// [database.][schema.]table
|
|
8
|
+
// where each part is either a bare identifier (case-insensitive, stored
|
|
9
|
+
// upper-cased in Snowflake's catalog) or a double-quoted identifier
|
|
10
|
+
// (case-sensitive, with `""` as the in-string escape for a literal `"`).
|
|
11
|
+
//
|
|
12
|
+
// The parser exists so the INFORMATION_SCHEMA.TABLES size probe can compare
|
|
13
|
+
// `table_schema` / `table_name` against the correct catalog value:
|
|
14
|
+
// bare names must be upper-cased, quoted names must be passed through
|
|
15
|
+
// verbatim. The old `split('.')` + regex approach got this wrong for
|
|
16
|
+
// quoted names and names with embedded dots.
|
|
17
|
+
|
|
18
|
+
import {TinyParser} from '@malloydata/malloy/internal';
|
|
19
|
+
|
|
20
|
+
export interface SnowflakeIdentPart {
|
|
21
|
+
/** Normalized catalog value — suitable for a SQL string literal. */
|
|
22
|
+
literal: string;
|
|
23
|
+
/** Re-emission form — suitable for a SQL identifier position. */
|
|
24
|
+
sql: string;
|
|
25
|
+
quoted: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ParsedSnowflakeTableName {
|
|
29
|
+
database?: SnowflakeIdentPart;
|
|
30
|
+
schema?: SnowflakeIdentPart;
|
|
31
|
+
table: SnowflakeIdentPart;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class SnowflakeTableNameParser extends TinyParser {
|
|
35
|
+
constructor(input: string) {
|
|
36
|
+
super(input, {
|
|
37
|
+
space: /^\s+/,
|
|
38
|
+
char: /^\./,
|
|
39
|
+
qstr: /^"(?:[^"]|"")*"/,
|
|
40
|
+
ident: /^[A-Za-z_][A-Za-z0-9_$]*/,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
parts(): SnowflakeIdentPart[] {
|
|
45
|
+
const out: SnowflakeIdentPart[] = [this.readPart()];
|
|
46
|
+
while (this.match('.')) {
|
|
47
|
+
out.push(this.readPart());
|
|
48
|
+
}
|
|
49
|
+
if (!this.eof()) {
|
|
50
|
+
throw this.parseError(`Unexpected ${this.peek().type}`);
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private readPart(): SnowflakeIdentPart {
|
|
56
|
+
const quoted = this.match('qstr');
|
|
57
|
+
if (quoted) {
|
|
58
|
+
// qstr strips outer quotes; `""` inside is the Snowflake escape.
|
|
59
|
+
const literal = quoted.text.replace(/""/g, '"');
|
|
60
|
+
return {
|
|
61
|
+
literal,
|
|
62
|
+
sql: `"${literal.replace(/"/g, '""')}"`,
|
|
63
|
+
quoted: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const ident = this.match('ident');
|
|
67
|
+
if (ident) {
|
|
68
|
+
const literal = ident.text.toUpperCase();
|
|
69
|
+
return {literal, sql: literal, quoted: false};
|
|
70
|
+
}
|
|
71
|
+
throw this.parseError('Expected identifier');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Parse a Snowflake table reference into 1-3 identifier parts. Returns
|
|
77
|
+
* undefined when the input is not a well-formed `[db.][schema.]table`
|
|
78
|
+
* reference — callers should treat that as "unknown shape" and skip
|
|
79
|
+
* metadata-driven optimizations rather than guessing.
|
|
80
|
+
*/
|
|
81
|
+
export function parseSnowflakeTableName(
|
|
82
|
+
src: string
|
|
83
|
+
): ParsedSnowflakeTableName | undefined {
|
|
84
|
+
let parts: SnowflakeIdentPart[];
|
|
85
|
+
try {
|
|
86
|
+
parts = new SnowflakeTableNameParser(src).parts();
|
|
87
|
+
} catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
if (parts.length < 1 || parts.length > 3) return undefined;
|
|
91
|
+
if (parts.length === 1) return {table: parts[0]};
|
|
92
|
+
if (parts.length === 2) return {schema: parts[0], table: parts[1]};
|
|
93
|
+
return {database: parts[0], schema: parts[1], table: parts[2]};
|
|
94
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright 2023 Google LLC
|
|
4
|
-
*
|
|
5
|
-
* Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
-
* a copy of this software and associated documentation files
|
|
7
|
-
* (the "Software"), to deal in the Software without restriction,
|
|
8
|
-
* including without limitation the rights to use, copy, modify, merge,
|
|
9
|
-
* publish, distribute, sublicense, and/or sell copies of the Software,
|
|
10
|
-
* and to permit persons to whom the Software is furnished to do so,
|
|
11
|
-
* subject to the following conditions:
|
|
12
|
-
*
|
|
13
|
-
* The above copyright notice and this permission notice shall be
|
|
14
|
-
* included in all copies or substantial portions of the Software.
|
|
15
|
-
*
|
|
16
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
-
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
-
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
19
|
-
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
20
|
-
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
-
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
22
|
-
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
*/
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const snowflake_executor_1 = require("./snowflake_executor");
|
|
26
|
-
const test_1 = require("@malloydata/malloy/test");
|
|
27
|
-
const [describe] = (0, test_1.describeIfDatabaseAvailable)(['snowflake']);
|
|
28
|
-
class SnowflakeExecutorTestSetup {
|
|
29
|
-
constructor(executor) {
|
|
30
|
-
this.executor_ = executor;
|
|
31
|
-
}
|
|
32
|
-
async runBatch(sqlText) {
|
|
33
|
-
let ret = [];
|
|
34
|
-
await (async () => {
|
|
35
|
-
const rows = await this.executor_.batch(sqlText);
|
|
36
|
-
return rows;
|
|
37
|
-
})().then((rows) => {
|
|
38
|
-
ret = rows;
|
|
39
|
-
});
|
|
40
|
-
return ret;
|
|
41
|
-
}
|
|
42
|
-
async runStreaming(sqlText, queryOptions) {
|
|
43
|
-
const rows = [];
|
|
44
|
-
await (async () => {
|
|
45
|
-
for await (const row of await this.executor_.stream(sqlText, queryOptions)) {
|
|
46
|
-
rows.push(row);
|
|
47
|
-
}
|
|
48
|
-
})();
|
|
49
|
-
return rows;
|
|
50
|
-
}
|
|
51
|
-
async done() {
|
|
52
|
-
await this.executor_.done();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
describe('db:SnowflakeExecutor', () => {
|
|
56
|
-
let db;
|
|
57
|
-
let query;
|
|
58
|
-
beforeAll(() => {
|
|
59
|
-
const connOptions = snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
60
|
-
snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
61
|
-
const executor = new snowflake_executor_1.SnowflakeExecutor(connOptions);
|
|
62
|
-
db = new SnowflakeExecutorTestSetup(executor);
|
|
63
|
-
query = `
|
|
64
|
-
select
|
|
65
|
-
*
|
|
66
|
-
from
|
|
67
|
-
(
|
|
68
|
-
values
|
|
69
|
-
(1, 'one'),
|
|
70
|
-
(2, 'two'),
|
|
71
|
-
(3, 'three'),
|
|
72
|
-
(4, 'four'),
|
|
73
|
-
(5, 'five')
|
|
74
|
-
);
|
|
75
|
-
`;
|
|
76
|
-
});
|
|
77
|
-
afterAll(async () => {
|
|
78
|
-
await db.done();
|
|
79
|
-
});
|
|
80
|
-
it('verifies batch execute', async () => {
|
|
81
|
-
const rows = await db.runBatch(query);
|
|
82
|
-
expect(rows.length).toBe(5);
|
|
83
|
-
});
|
|
84
|
-
it('verifies stream iterable', async () => {
|
|
85
|
-
const rows = await db.runStreaming(query, { rowLimit: 2 });
|
|
86
|
-
expect(rows.length).toBe(2);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
//# sourceMappingURL=snowflake_executor.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake_executor.spec.js","sourceRoot":"","sources":["../src/snowflake_executor.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AAEH,6DAAuD;AAEvD,kDAAoE;AAEpE,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAA,kCAA2B,EAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAE9D,MAAM,0BAA0B;IAE9B,YAAY,QAA2B;QACrC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,GAAG,GAAc,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAe,EAAE,EAAE;YAC5B,GAAG,GAAG,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,YAA4B;QAC9D,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CACjD,OAAO,EACP,YAAY,CACb,EAAE,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,EAA8B,CAAC;IACnC,IAAI,KAAa,CAAC;IAElB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GACf,sCAAiB,CAAC,2BAA2B,EAAE;YAC/C,sCAAiB,CAAC,4BAA4B,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,sCAAiB,CAAC,WAAW,CAAC,CAAC;QACpD,EAAE,GAAG,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,GAAG;;;;;;;;;;;;KAYP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright Contributors to the Malloy project
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
-
};
|
|
42
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
const malloy = __importStar(require("@malloydata/malloy"));
|
|
44
|
-
const snowflake_connection_1 = require("./snowflake_connection");
|
|
45
|
-
const snowflake_executor_1 = require("./snowflake_executor");
|
|
46
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
47
|
-
describe('setupSQL', () => {
|
|
48
|
-
const connOptions = snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
49
|
-
snowflake_executor_1.SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
50
|
-
const uid = crypto_1.default.randomBytes(4).toString('hex');
|
|
51
|
-
const connections = [];
|
|
52
|
-
function makeConn(name, setupSQL) {
|
|
53
|
-
const conn = new snowflake_connection_1.SnowflakeConnection(name, { connOptions, setupSQL });
|
|
54
|
-
connections.push(conn);
|
|
55
|
-
return conn;
|
|
56
|
-
}
|
|
57
|
-
afterAll(async () => {
|
|
58
|
-
await Promise.all(connections.map(c => c.close()));
|
|
59
|
-
});
|
|
60
|
-
it('runs a single setup statement', async () => {
|
|
61
|
-
const conn = makeConn('snowflake_setup_single', `SET setup_test_${uid} = 42`);
|
|
62
|
-
const result = await conn.runSQL(`SELECT $setup_test_${uid} AS V`);
|
|
63
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(42);
|
|
64
|
-
});
|
|
65
|
-
it('runs multiple semicolon-newline-separated statements', async () => {
|
|
66
|
-
const conn = makeConn('snowflake_setup_multi', [`SET setup_a_${uid} = 10`, `SET setup_b_${uid} = 20`].join(';\n'));
|
|
67
|
-
const result = await conn.runSQL(`SELECT $setup_a_${uid} + $setup_b_${uid} AS V`);
|
|
68
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(30);
|
|
69
|
-
});
|
|
70
|
-
it('handles multi-line statements', async () => {
|
|
71
|
-
const conn = makeConn('snowflake_setup_multiline', `SET\n setup_ml_${uid} = 99`);
|
|
72
|
-
const result = await conn.runSQL(`SELECT $setup_ml_${uid} AS V`);
|
|
73
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(99);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
//# sourceMappingURL=snowflake_setup.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake_setup.spec.js","sourceRoot":"","sources":["../src/snowflake_setup.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2DAA6C;AAC7C,iEAA2D;AAC3D,6DAAuD;AACvD,oDAA4B;AAE5B,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,MAAM,WAAW,GACf,sCAAiB,CAAC,2BAA2B,EAAE;QAC/C,sCAAiB,CAAC,4BAA4B,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,gBAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,WAAW,GAA0B,EAAE,CAAC;IAE9C,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;QAC9C,MAAM,IAAI,GAAG,IAAI,0CAAmB,CAAC,IAAI,EAAE,EAAC,WAAW,EAAE,QAAQ,EAAC,CAAC,CAAC;QACpE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,QAAQ,CACnB,wBAAwB,EACxB,kBAAkB,GAAG,OAAO,CAC7B,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,OAAO,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAI,GAAG,QAAQ,CACnB,uBAAuB,EACvB,CAAC,eAAe,GAAG,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACnE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAC9B,mBAAmB,GAAG,eAAe,GAAG,OAAO,CAChD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,QAAQ,CACnB,2BAA2B,EAC3B,mBAAmB,GAAG,OAAO,CAC9B,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,GAAG,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2023 Google LLC
|
|
3
|
-
*
|
|
4
|
-
* Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
-
* a copy of this software and associated documentation files
|
|
6
|
-
* (the "Software"), to deal in the Software without restriction,
|
|
7
|
-
* including without limitation the rights to use, copy, modify, merge,
|
|
8
|
-
* publish, distribute, sublicense, and/or sell copies of the Software,
|
|
9
|
-
* and to permit persons to whom the Software is furnished to do so,
|
|
10
|
-
* subject to the following conditions:
|
|
11
|
-
*
|
|
12
|
-
* The above copyright notice and this permission notice shall be
|
|
13
|
-
* included in all copies or substantial portions of the Software.
|
|
14
|
-
*
|
|
15
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
-
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
-
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
18
|
-
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
19
|
-
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
20
|
-
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
21
|
-
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import {SnowflakeExecutor} from './snowflake_executor';
|
|
25
|
-
import type {QueryData, RunSQLOptions} from '@malloydata/malloy';
|
|
26
|
-
import {describeIfDatabaseAvailable} from '@malloydata/malloy/test';
|
|
27
|
-
|
|
28
|
-
const [describe] = describeIfDatabaseAvailable(['snowflake']);
|
|
29
|
-
|
|
30
|
-
class SnowflakeExecutorTestSetup {
|
|
31
|
-
private executor_: SnowflakeExecutor;
|
|
32
|
-
constructor(executor: SnowflakeExecutor) {
|
|
33
|
-
this.executor_ = executor;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async runBatch(sqlText: string): Promise<QueryData> {
|
|
37
|
-
let ret: QueryData = [];
|
|
38
|
-
await (async () => {
|
|
39
|
-
const rows = await this.executor_.batch(sqlText);
|
|
40
|
-
return rows;
|
|
41
|
-
})().then((rows: QueryData) => {
|
|
42
|
-
ret = rows;
|
|
43
|
-
});
|
|
44
|
-
return ret;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async runStreaming(sqlText: string, queryOptions?: RunSQLOptions) {
|
|
48
|
-
const rows: QueryData = [];
|
|
49
|
-
await (async () => {
|
|
50
|
-
for await (const row of await this.executor_.stream(
|
|
51
|
-
sqlText,
|
|
52
|
-
queryOptions
|
|
53
|
-
)) {
|
|
54
|
-
rows.push(row);
|
|
55
|
-
}
|
|
56
|
-
})();
|
|
57
|
-
return rows;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async done() {
|
|
61
|
-
await this.executor_.done();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
describe('db:SnowflakeExecutor', () => {
|
|
66
|
-
let db: SnowflakeExecutorTestSetup;
|
|
67
|
-
let query: string;
|
|
68
|
-
|
|
69
|
-
beforeAll(() => {
|
|
70
|
-
const connOptions =
|
|
71
|
-
SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
72
|
-
SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
73
|
-
const executor = new SnowflakeExecutor(connOptions);
|
|
74
|
-
db = new SnowflakeExecutorTestSetup(executor);
|
|
75
|
-
query = `
|
|
76
|
-
select
|
|
77
|
-
*
|
|
78
|
-
from
|
|
79
|
-
(
|
|
80
|
-
values
|
|
81
|
-
(1, 'one'),
|
|
82
|
-
(2, 'two'),
|
|
83
|
-
(3, 'three'),
|
|
84
|
-
(4, 'four'),
|
|
85
|
-
(5, 'five')
|
|
86
|
-
);
|
|
87
|
-
`;
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
afterAll(async () => {
|
|
91
|
-
await db.done();
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('verifies batch execute', async () => {
|
|
95
|
-
const rows = await db.runBatch(query);
|
|
96
|
-
expect(rows.length).toBe(5);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('verifies stream iterable', async () => {
|
|
100
|
-
const rows = await db.runStreaming(query, {rowLimit: 2});
|
|
101
|
-
expect(rows.length).toBe(2);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Contributors to the Malloy project
|
|
3
|
-
* SPDX-License-Identifier: MIT
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as malloy from '@malloydata/malloy';
|
|
7
|
-
import {SnowflakeConnection} from './snowflake_connection';
|
|
8
|
-
import {SnowflakeExecutor} from './snowflake_executor';
|
|
9
|
-
import crypto from 'crypto';
|
|
10
|
-
|
|
11
|
-
describe('setupSQL', () => {
|
|
12
|
-
const connOptions =
|
|
13
|
-
SnowflakeExecutor.getConnectionOptionsFromEnv() ||
|
|
14
|
-
SnowflakeExecutor.getConnectionOptionsFromToml();
|
|
15
|
-
const uid = crypto.randomBytes(4).toString('hex');
|
|
16
|
-
const connections: SnowflakeConnection[] = [];
|
|
17
|
-
|
|
18
|
-
function makeConn(name: string, setupSQL: string): SnowflakeConnection {
|
|
19
|
-
const conn = new SnowflakeConnection(name, {connOptions, setupSQL});
|
|
20
|
-
connections.push(conn);
|
|
21
|
-
return conn;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
afterAll(async () => {
|
|
25
|
-
await Promise.all(connections.map(c => c.close()));
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('runs a single setup statement', async () => {
|
|
29
|
-
const conn = makeConn(
|
|
30
|
-
'snowflake_setup_single',
|
|
31
|
-
`SET setup_test_${uid} = 42`
|
|
32
|
-
);
|
|
33
|
-
const result = await conn.runSQL(`SELECT $setup_test_${uid} AS V`);
|
|
34
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(42);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('runs multiple semicolon-newline-separated statements', async () => {
|
|
38
|
-
const conn = makeConn(
|
|
39
|
-
'snowflake_setup_multi',
|
|
40
|
-
[`SET setup_a_${uid} = 10`, `SET setup_b_${uid} = 20`].join(';\n')
|
|
41
|
-
);
|
|
42
|
-
const result = await conn.runSQL(
|
|
43
|
-
`SELECT $setup_a_${uid} + $setup_b_${uid} AS V`
|
|
44
|
-
);
|
|
45
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(30);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('handles multi-line statements', async () => {
|
|
49
|
-
const conn = makeConn(
|
|
50
|
-
'snowflake_setup_multiline',
|
|
51
|
-
`SET\n setup_ml_${uid} = 99`
|
|
52
|
-
);
|
|
53
|
-
const result = await conn.runSQL(`SELECT $setup_ml_${uid} AS V`);
|
|
54
|
-
expect(malloy.API.rowDataToNumber(result.rows[0]['V'])).toBe(99);
|
|
55
|
-
});
|
|
56
|
-
});
|