@chkit/clickhouse 0.1.0-beta.9 → 0.1.1

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.
@@ -0,0 +1,17 @@
1
+ import type { ClickHouseExecutor } from './index.js';
2
+ export declare function waitForTable(executor: ClickHouseExecutor, database: string, tableName: string): Promise<void>;
3
+ export declare function waitForView(executor: ClickHouseExecutor, database: string, viewName: string): Promise<void>;
4
+ export declare function waitForColumn(executor: ClickHouseExecutor, database: string, tableName: string, columnName: string): Promise<void>;
5
+ /**
6
+ * Polls a query until its rows satisfy `predicate`, then returns them. Use for
7
+ * reads that race DDL/DML propagation on managed ClickHouse (e.g. journal rows
8
+ * written by a just-finished migration that aren't yet visible via FINAL).
9
+ */
10
+ export declare function waitForRows<T>(executor: ClickHouseExecutor, sql: string, predicate: (rows: T[]) => boolean, label?: string): Promise<T[]>;
11
+ export declare function waitForTableAbsent(executor: ClickHouseExecutor, database: string, tableName: string): Promise<void>;
12
+ /**
13
+ * Waits for DDL propagation based on the operation type and key.
14
+ * Called after each DDL statement in the migration execution loop.
15
+ */
16
+ export declare function waitForDDLPropagation(executor: ClickHouseExecutor, operationType: string, operationKey: string): Promise<void>;
17
+ //# sourceMappingURL=ddl-propagation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-propagation.d.ts","sourceRoot":"","sources":["../src/ddl-propagation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,OAAO,EACjC,KAAK,SAAgB,GACpB,OAAO,CAAC,CAAC,EAAE,CAAC,CAQd;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAWf;AAwBD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,94 @@
1
+ import pRetry from 'p-retry';
2
+ const RETRY_OPTIONS = { retries: 20, minTimeout: 500, factor: 1 };
3
+ export async function waitForTable(executor, database, tableName) {
4
+ await pRetry(async () => {
5
+ const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = '${database}' AND name = '${tableName}'`);
6
+ if (rows.length === 0) {
7
+ throw new Error(`waitForTable: ${database}.${tableName} not yet visible`);
8
+ }
9
+ }, RETRY_OPTIONS);
10
+ }
11
+ export async function waitForView(executor, database, viewName) {
12
+ await pRetry(async () => {
13
+ const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = '${database}' AND name = '${viewName}' AND engine LIKE '%View%'`);
14
+ if (rows.length === 0) {
15
+ throw new Error(`waitForView: ${database}.${viewName} not yet visible`);
16
+ }
17
+ }, RETRY_OPTIONS);
18
+ }
19
+ export async function waitForColumn(executor, database, tableName, columnName) {
20
+ await pRetry(async () => {
21
+ const rows = await executor.query(`SELECT 1 AS x FROM system.columns WHERE database = '${database}' AND table = '${tableName}' AND name = '${columnName}'`);
22
+ if (rows.length === 0) {
23
+ throw new Error(`waitForColumn: ${database}.${tableName}.${columnName} not yet visible`);
24
+ }
25
+ }, RETRY_OPTIONS);
26
+ }
27
+ /**
28
+ * Polls a query until its rows satisfy `predicate`, then returns them. Use for
29
+ * reads that race DDL/DML propagation on managed ClickHouse (e.g. journal rows
30
+ * written by a just-finished migration that aren't yet visible via FINAL).
31
+ */
32
+ export async function waitForRows(executor, sql, predicate, label = 'waitForRows') {
33
+ return pRetry(async () => {
34
+ const rows = await executor.query(sql);
35
+ if (!predicate(rows)) {
36
+ throw new Error(`${label}: predicate not yet satisfied`);
37
+ }
38
+ return rows;
39
+ }, RETRY_OPTIONS);
40
+ }
41
+ export async function waitForTableAbsent(executor, database, tableName) {
42
+ await pRetry(async () => {
43
+ const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = '${database}' AND name = '${tableName}'`);
44
+ if (rows.length > 0) {
45
+ throw new Error(`waitForTableAbsent: ${database}.${tableName} still present`);
46
+ }
47
+ }, RETRY_OPTIONS);
48
+ }
49
+ /**
50
+ * Parses an operation key like "table:app.users" or "table:app.users:column:name"
51
+ * into its components.
52
+ */
53
+ function parseOperationKey(key) {
54
+ const tableMatch = key.match(/^table:([^.]+)\.([^:]+)/);
55
+ if (!tableMatch)
56
+ return undefined;
57
+ // biome-ignore lint/style/noNonNullAssertion: capture groups guaranteed by regex match
58
+ const database = tableMatch[1];
59
+ // biome-ignore lint/style/noNonNullAssertion: capture groups guaranteed by regex match
60
+ const table = tableMatch[2];
61
+ const columnMatch = key.match(/:column:([^:]+)/);
62
+ return { database, table, column: columnMatch?.[1] };
63
+ }
64
+ /**
65
+ * Waits for DDL propagation based on the operation type and key.
66
+ * Called after each DDL statement in the migration execution loop.
67
+ */
68
+ export async function waitForDDLPropagation(executor, operationType, operationKey) {
69
+ const parsed = parseOperationKey(operationKey);
70
+ if (!parsed)
71
+ return; // database-level ops or unrecognized keys — no wait needed
72
+ switch (operationType) {
73
+ case 'create_table':
74
+ return waitForTable(executor, parsed.database, parsed.table);
75
+ case 'create_view':
76
+ case 'create_materialized_view':
77
+ return waitForView(executor, parsed.database, parsed.table);
78
+ case 'alter_table_add_column':
79
+ case 'alter_table_modify_column':
80
+ if (parsed.column) {
81
+ return waitForColumn(executor, parsed.database, parsed.table, parsed.column);
82
+ }
83
+ return;
84
+ case 'drop_table':
85
+ case 'drop_view':
86
+ case 'drop_materialized_view':
87
+ return waitForTableAbsent(executor, parsed.database, parsed.table);
88
+ default:
89
+ // alter_table_add_index, alter_table_modify_setting, etc.
90
+ // Wait for the table to exist as a basic sanity check.
91
+ return waitForTable(executor, parsed.database, parsed.table);
92
+ }
93
+ }
94
+ //# sourceMappingURL=ddl-propagation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-propagation.js","sourceRoot":"","sources":["../src/ddl-propagation.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAG5B,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;AAEjE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA4B,EAC5B,QAAgB,EAChB,SAAiB;IAEjB,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAC/B,sDAAsD,QAAQ,iBAAiB,SAAS,GAAG,CAC5F,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,IAAI,SAAS,kBAAkB,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC,EAAE,aAAa,CAAC,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAA4B,EAC5B,QAAgB,EAChB,QAAgB;IAEhB,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAC/B,sDAAsD,QAAQ,iBAAiB,QAAQ,4BAA4B,CACpH,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,IAAI,QAAQ,kBAAkB,CAAC,CAAA;QACzE,CAAC;IACH,CAAC,EAAE,aAAa,CAAC,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA4B,EAC5B,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAC/B,uDAAuD,QAAQ,kBAAkB,SAAS,iBAAiB,UAAU,GAAG,CACzH,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,kBAAkB,QAAQ,IAAI,SAAS,IAAI,UAAU,kBAAkB,CACxE,CAAA;QACH,CAAC;IACH,CAAC,EAAE,aAAa,CAAC,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAA4B,EAC5B,GAAW,EACX,SAAiC,EACjC,KAAK,GAAG,aAAa;IAErB,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAI,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,aAAa,CAAC,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA4B,EAC5B,QAAgB,EAChB,SAAiB;IAEjB,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAC/B,sDAAsD,QAAQ,iBAAiB,SAAS,GAAG,CAC5F,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,IAAI,SAAS,gBAAgB,CAC7D,CAAA;QACH,CAAC;IACH,CAAC,EAAE,aAAa,CAAC,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAW;IAOpC,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;IACvD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,uFAAuF;IACvF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAE,CAAA;IAC/B,uFAAuF;IACvF,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAE,CAAA;IAE5B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAChD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAA4B,EAC5B,aAAqB,EACrB,YAAoB;IAEpB,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAM,CAAC,2DAA2D;IAE/E,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAE9D,KAAK,aAAa,CAAC;QACnB,KAAK,0BAA0B;YAC7B,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAE7D,KAAK,wBAAwB,CAAC;QAC9B,KAAK,2BAA2B;YAC9B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,aAAa,CAClB,QAAQ,EACR,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,CACd,CAAA;YACH,CAAC;YACD,OAAM;QAER,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,wBAAwB;YAC3B,OAAO,kBAAkB,CACvB,QAAQ,EACR,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,CACb,CAAA;QAEH;YACE,0DAA0D;YAC1D,uDAAuD;YACvD,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared E2E test utilities for live ClickHouse tests.
3
+ *
4
+ * Hard-fails on missing env — never skips.
5
+ * Uses ClickHouseExecutor so any package that depends on @chkit/clickhouse can import this.
6
+ */
7
+ import { type ClickHouseExecutor } from './index.js';
8
+ export interface LiveEnv {
9
+ clickhouseUrl: string;
10
+ clickhouseUser: string;
11
+ clickhousePassword: string;
12
+ clickhouseDatabase: string;
13
+ }
14
+ /**
15
+ * Reads and validates required ClickHouse env vars.
16
+ * Throws immediately if anything is missing — tests must not silently skip.
17
+ */
18
+ export declare function getRequiredEnv(): LiveEnv;
19
+ /**
20
+ * Creates a ClickHouseExecutor configured for E2E tests from env vars.
21
+ */
22
+ export declare function createLiveExecutor(env: LiveEnv): ClickHouseExecutor;
23
+ /**
24
+ * Use only for live tests that intentionally issue parallel queries through one
25
+ * executor. The default live executor is session-bound and should be used for
26
+ * normal sequential DDL workflows.
27
+ */
28
+ export declare function createStatelessLiveExecutor(env: LiveEnv): ClickHouseExecutor;
29
+ export declare function quoteIdent(value: string): string;
30
+ export declare function createRunTag(): string;
31
+ export declare function createPrefix(label: string): string;
32
+ export declare function createJournalTableName(label: string): string;
33
+ export { waitForTable, waitForView, waitForColumn, waitForRows, } from './ddl-propagation.js';
34
+ //# sourceMappingURL=e2e-testkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-testkit.d.ts","sourceRoot":"","sources":["../src/e2e-testkit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAA;AAMnB,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAiBxC;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAOnE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAO5E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAMD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5D;AAMD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Shared E2E test utilities for live ClickHouse tests.
3
+ *
4
+ * Hard-fails on missing env — never skips.
5
+ * Uses ClickHouseExecutor so any package that depends on @chkit/clickhouse can import this.
6
+ */
7
+ import { createClickHouseExecutor, createStatelessClickHouseExecutor, } from './index.js';
8
+ /**
9
+ * Reads and validates required ClickHouse env vars.
10
+ * Throws immediately if anything is missing — tests must not silently skip.
11
+ */
12
+ export function getRequiredEnv() {
13
+ const clickhouseHost = process.env.CLICKHOUSE_HOST?.trim();
14
+ const clickhouseUrl = process.env.CLICKHOUSE_URL?.trim() || (clickhouseHost ? `https://${clickhouseHost}` : '');
15
+ const clickhouseUser = process.env.CLICKHOUSE_USER?.trim() || 'default';
16
+ const clickhousePassword = process.env.CLICKHOUSE_PASSWORD?.trim() || '';
17
+ const clickhouseDatabase = process.env.CLICKHOUSE_DB?.trim() || 'default';
18
+ if (!clickhouseUrl) {
19
+ throw new Error('Missing CLICKHOUSE_URL or CLICKHOUSE_HOST');
20
+ }
21
+ if (!clickhousePassword) {
22
+ throw new Error('Missing CLICKHOUSE_PASSWORD');
23
+ }
24
+ return { clickhouseUrl, clickhouseUser, clickhousePassword, clickhouseDatabase };
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // ClickHouse executor helpers
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Creates a ClickHouseExecutor configured for E2E tests from env vars.
31
+ */
32
+ export function createLiveExecutor(env) {
33
+ return createClickHouseExecutor({
34
+ url: env.clickhouseUrl,
35
+ username: env.clickhouseUser,
36
+ password: env.clickhousePassword,
37
+ database: env.clickhouseDatabase,
38
+ });
39
+ }
40
+ /**
41
+ * Use only for live tests that intentionally issue parallel queries through one
42
+ * executor. The default live executor is session-bound and should be used for
43
+ * normal sequential DDL workflows.
44
+ */
45
+ export function createStatelessLiveExecutor(env) {
46
+ return createStatelessClickHouseExecutor({
47
+ url: env.clickhouseUrl,
48
+ username: env.clickhouseUser,
49
+ password: env.clickhousePassword,
50
+ database: env.clickhouseDatabase,
51
+ });
52
+ }
53
+ export function quoteIdent(value) {
54
+ return `\`${value.replace(/`/g, '``')}\``;
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Run tags & naming
58
+ // ---------------------------------------------------------------------------
59
+ export function createRunTag() {
60
+ return `${process.pid}_${Date.now()}_${Math.floor(Math.random() * 100000)}`;
61
+ }
62
+ export function createPrefix(label) {
63
+ return `chkit_e2e_${label}_${Date.now()}_${Math.floor(Math.random() * 100000)}_`;
64
+ }
65
+ export function createJournalTableName(label) {
66
+ const runTag = process.env.GITHUB_RUN_ID?.trim() ||
67
+ `${Date.now()}_${Math.floor(Math.random() * 100000)}`;
68
+ return `_chkit_migrations_${label}_${runTag}`;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // State-based polling (re-exported from ddl-propagation for test convenience)
72
+ // ---------------------------------------------------------------------------
73
+ export { waitForTable, waitForView, waitForColumn, waitForRows, } from './ddl-propagation.js';
74
+ //# sourceMappingURL=e2e-testkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-testkit.js","sourceRoot":"","sources":["../src/e2e-testkit.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,56 @@
1
1
  import { type ChxConfig, type ColumnDefinition, type ProjectionDefinition, type SkipIndexDefinition } from '@chkit/core';
2
+ import { type ClickHouseSettings, createClient } from '@clickhouse/client';
3
+ export interface QueryStatus {
4
+ status: 'running' | 'finished' | 'failed' | 'unknown';
5
+ readRows?: number;
6
+ readBytes?: number;
7
+ writtenRows?: number;
8
+ writtenBytes?: number;
9
+ elapsedMs?: number;
10
+ durationMs?: number;
11
+ error?: string;
12
+ }
13
+ export type { ClickHouseSettings };
14
+ export interface ClickHouseInsertParams<T extends Record<string, unknown>> {
15
+ table: string;
16
+ values: T[];
17
+ compressed?: boolean;
18
+ }
19
+ export interface ClickHouseJsonQueryResult<T extends Record<string, unknown> = Record<string, unknown>> {
20
+ data: T[];
21
+ meta: Array<{
22
+ name: string;
23
+ type: string;
24
+ }>;
25
+ rows: number;
26
+ statistics?: {
27
+ elapsed?: number;
28
+ rows_read?: number;
29
+ bytes_read?: number;
30
+ };
31
+ query_id?: string;
32
+ }
2
33
  export interface ClickHouseExecutor {
3
- execute(sql: string): Promise<void>;
4
- query<T>(sql: string): Promise<T[]>;
5
- insert<T extends Record<string, unknown>>(params: {
6
- table: string;
7
- values: T[];
8
- }): Promise<void>;
34
+ command(sql: string): Promise<void>;
35
+ query<T>(sql: string, settings?: ClickHouseSettings): Promise<T[]>;
36
+ queryJson?<T extends Record<string, unknown>>(sql: string, settings?: ClickHouseSettings): Promise<ClickHouseJsonQueryResult<T>>;
37
+ insert<T extends Record<string, unknown>>(params: ClickHouseInsertParams<T>): Promise<void>;
9
38
  listSchemaObjects(): Promise<SchemaObjectRef[]>;
10
39
  listTableDetails(databases: string[]): Promise<IntrospectedTable[]>;
40
+ /** Submit a query asynchronously. ClickHouse accepts the query and processes it server-side.
41
+ * Returns immediately without waiting for completion.
42
+ * @param sql - The SQL to execute
43
+ * @param queryId - Optional deterministic query_id (useful for resumability). Auto-generated if omitted.
44
+ * @returns The query_id assigned to this query. */
45
+ submit(sql: string, queryId?: string): Promise<string>;
46
+ /** Check the status of a previously submitted query.
47
+ * Checks system.processes first (running?), then system.query_log (finished/failed?).
48
+ * @param queryId - The query_id returned by submit()
49
+ * @param options.afterTime - Only consider query_log entries for queries started at or after this ISO timestamp.
50
+ * Useful when resubmitting with the same query_id to ignore stale entries from previous attempts. */
51
+ queryStatus(queryId: string, options?: {
52
+ afterTime?: string;
53
+ }): Promise<QueryStatus>;
11
54
  close(): Promise<void>;
12
55
  }
13
56
  export interface SchemaObjectRef {
@@ -15,6 +58,31 @@ export interface SchemaObjectRef {
15
58
  database: string;
16
59
  name: string;
17
60
  }
61
+ export interface SystemTableRow {
62
+ database: string;
63
+ name: string;
64
+ engine: string;
65
+ create_table_query?: string;
66
+ }
67
+ export interface SystemColumnRow {
68
+ database: string;
69
+ table: string;
70
+ name: string;
71
+ type: string;
72
+ default_kind?: string;
73
+ default_expression?: string;
74
+ comment?: string;
75
+ position: number;
76
+ compression_codec?: string;
77
+ }
78
+ export interface SystemSkippingIndexRow {
79
+ database: string;
80
+ table: string;
81
+ name: string;
82
+ expr: string;
83
+ type: string;
84
+ granularity: number;
85
+ }
18
86
  export interface IntrospectedTable {
19
87
  database: string;
20
88
  name: string;
@@ -29,7 +97,68 @@ export interface IntrospectedTable {
29
97
  projections: ProjectionDefinition[];
30
98
  ttl?: string;
31
99
  }
100
+ type ClickHouseClient = ReturnType<typeof createClient>;
101
+ type ClickHouseConfig = NonNullable<ChxConfig['clickhouse']>;
102
+ type ClickHouseClientOptions = {
103
+ compression?: {
104
+ request?: boolean;
105
+ response?: boolean;
106
+ };
107
+ };
32
108
  export { parseEngineFromCreateTableQuery, parseOrderByFromCreateTableQuery, parsePartitionByFromCreateTableQuery, parsePrimaryKeyFromCreateTableQuery, parseProjectionsFromCreateTableQuery, parseSettingsFromCreateTableQuery, parseTTLFromCreateTableQuery, parseUniqueKeyFromCreateTableQuery, } from './create-table-parser.js';
33
109
  export declare function inferSchemaKindFromEngine(engine: string): SchemaObjectRef['kind'] | null;
34
- export declare function createClickHouseExecutor(config: NonNullable<ChxConfig['clickhouse']>): ClickHouseExecutor;
110
+ export declare function normalizeColumnFromSystemRow(row: SystemColumnRow): ColumnDefinition;
111
+ export declare function normalizeIndexFromSystemRow(row: SystemSkippingIndexRow): SkipIndexDefinition;
112
+ export declare function buildIntrospectedTables(tables: SystemTableRow[], columns: SystemColumnRow[], indexes: SystemSkippingIndexRow[]): IntrospectedTable[];
113
+ /**
114
+ * Builds a clean, user-facing message for a connection-time error, or returns
115
+ * `undefined` when the error is not one we recognize (caller rethrows as-is).
116
+ * Pure so it can be unit-tested without catching thrown errors.
117
+ */
118
+ export declare function formatConnectionError(error: unknown, url: string, username?: string): string | undefined;
119
+ export declare function wrapConnectionError(error: unknown, url: string, username?: string): never;
120
+ export declare function isUnknownDatabaseError(error: unknown): boolean;
121
+ /**
122
+ * Thrown when a ClickHouse query failed mid-flight after the server already
123
+ * committed an HTTP 200 response by emitting progress headers. In that
124
+ * scenario the error is reported via the `x-clickhouse-exception-code`
125
+ * response header rather than as an HTTP error — @clickhouse/client does not
126
+ * surface it as a thrown error, so we must detect it ourselves and throw.
127
+ */
128
+ export declare class ClickHouseStreamedException extends Error {
129
+ readonly code: string;
130
+ readonly exceptionTag: string | undefined;
131
+ readonly query_id: string | undefined;
132
+ constructor(input: {
133
+ code: string;
134
+ exceptionTag: string | undefined;
135
+ query_id: string | undefined;
136
+ sql: string | undefined;
137
+ });
138
+ }
139
+ /**
140
+ * Throws if the response carries a non-zero `x-clickhouse-exception-code`
141
+ * header. This happens when ClickHouse sends progress headers (committing
142
+ * HTTP 200) and then the query errors out — the error is reported in
143
+ * headers, not by HTTP status, and @clickhouse/client does not raise it.
144
+ */
145
+ export declare function assertStreamedQuerySucceeded(input: {
146
+ response_headers: Record<string, string | string[] | undefined> | undefined;
147
+ query_id: string;
148
+ sql: string | undefined;
149
+ }): void;
150
+ export { waitForColumn, waitForDDLPropagation, waitForTable, waitForTableAbsent, waitForView, } from './ddl-propagation.js';
151
+ export declare function createStatelessClickHouseClient(config: ClickHouseConfig, clickhouseSettings?: ClickHouseSettings, options?: ClickHouseClientOptions): ClickHouseClient;
152
+ /**
153
+ * Creates a ClickHouse client that sends one session_id with every request.
154
+ * Use only for workflows that need session state, such as temporary tables or
155
+ * session-level settings. ClickHouse allows only one in-flight query per HTTP
156
+ * session, so callers must serialize all requests made through this client.
157
+ */
158
+ export declare function createSessionClickHouseClient(config: ClickHouseConfig, clickhouseSettings?: ClickHouseSettings, sessionId?: `${string}-${string}-${string}-${string}-${string}`, options?: ClickHouseClientOptions): ClickHouseClient;
159
+ export declare function createExecutorWithClient(config: ClickHouseConfig, client: ClickHouseClient, options?: {
160
+ createCompressedClient?: () => ClickHouseClient;
161
+ }): ClickHouseExecutor;
162
+ export declare function createClickHouseExecutor(config: ClickHouseConfig): ClickHouseExecutor;
163
+ export declare function createStatelessClickHouseExecutor(config: ClickHouseConfig): ClickHouseExecutor;
35
164
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAA;AAYpB,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACnC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC/C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAA;IAC5C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AA6BD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,WAAW,EAAE,oBAAoB,EAAE,CAAA;IACnC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,EAChC,oCAAoC,EACpC,mCAAmC,EACnC,oCAAoC,EACpC,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,GACnC,MAAM,0BAA0B,CAAA;AAEjC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAKxF;AAsCD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,kBAAkB,CA6HzG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,10 @@
1
- import { createClient } from '@clickhouse/client';
2
- import { normalizeSQLFragment, } from '@chkit/core';
1
+ import { createRequire } from 'node:module';
2
+ import { normalizeSQLFragment, parseCodec, } from '@chkit/core';
3
+ import { ClickHouseLogLevel, createClient } from '@clickhouse/client';
4
+ import { getLogger } from '@logtape/logtape';
3
5
  import { parseEngineFromCreateTableQuery, parseOrderByFromCreateTableQuery, parsePartitionByFromCreateTableQuery, parsePrimaryKeyFromCreateTableQuery, parseProjectionsFromCreateTableQuery, parseSettingsFromCreateTableQuery, parseTTLFromCreateTableQuery, parseUniqueKeyFromCreateTableQuery, } from './create-table-parser.js';
6
+ const pkg = createRequire(import.meta.url)('../package.json');
7
+ const CHKIT_APPLICATION_ID = `chkit/${pkg.version}`;
4
8
  export { parseEngineFromCreateTableQuery, parseOrderByFromCreateTableQuery, parsePartitionByFromCreateTableQuery, parsePrimaryKeyFromCreateTableQuery, parseProjectionsFromCreateTableQuery, parseSettingsFromCreateTableQuery, parseTTLFromCreateTableQuery, parseUniqueKeyFromCreateTableQuery, } from './create-table-parser.js';
5
9
  export function inferSchemaKindFromEngine(engine) {
6
10
  if (engine === 'View')
@@ -11,7 +15,7 @@ export function inferSchemaKindFromEngine(engine) {
11
15
  return null;
12
16
  return 'table';
13
17
  }
14
- function normalizeColumnFromSystemRow(row) {
18
+ export function normalizeColumnFromSystemRow(row) {
15
19
  const nullableMatch = row.type.match(/^Nullable\((.+)\)$/);
16
20
  const type = nullableMatch?.[1] ? nullableMatch[1] : row.type;
17
21
  const nullable = Boolean(nullableMatch?.[1]);
@@ -19,64 +23,519 @@ function normalizeColumnFromSystemRow(row) {
19
23
  if (row.default_expression && row.default_kind === 'DEFAULT') {
20
24
  defaultValue = normalizeSQLFragment(row.default_expression);
21
25
  }
26
+ const codecSteps = parseCodec(row.compression_codec);
22
27
  return {
23
28
  name: row.name,
24
29
  type,
25
30
  nullable: nullable || undefined,
26
31
  default: defaultValue,
27
32
  comment: row.comment?.trim() || undefined,
33
+ codec: codecSteps,
28
34
  };
29
35
  }
30
- function normalizeIndexType(value) {
31
- if (value === 'minmax')
32
- return 'minmax';
33
- if (value === 'set')
34
- return 'set';
35
- if (value === 'bloom_filter')
36
- return 'bloom_filter';
37
- if (value === 'tokenbf_v1')
38
- return 'tokenbf_v1';
39
- if (value === 'ngrambf_v1')
40
- return 'ngrambf_v1';
41
- return 'set';
42
- }
43
- function normalizeIndexFromSystemRow(row) {
36
+ function splitArgs(args) {
37
+ if (args === undefined)
38
+ return [];
39
+ return args
40
+ .split(',')
41
+ .map((part) => Number(part.trim()))
42
+ .filter((value) => !Number.isNaN(value));
43
+ }
44
+ function parseIndexType(value) {
45
+ const match = value.match(/^(\w+)\((.+)\)$/);
46
+ const baseName = match?.[1] ?? value;
47
+ const args = splitArgs(match?.[2]);
48
+ switch (baseName) {
49
+ case 'minmax':
50
+ return { type: 'minmax' };
51
+ case 'bloom_filter':
52
+ return args[0] !== undefined
53
+ ? { type: 'bloom_filter', falsePositiveRate: args[0] }
54
+ : { type: 'bloom_filter' };
55
+ case 'tokenbf_v1':
56
+ return {
57
+ type: 'tokenbf_v1',
58
+ sizeBytes: args[0] ?? 0,
59
+ hashFunctions: args[1] ?? 0,
60
+ randomSeed: args[2] ?? 0,
61
+ };
62
+ case 'ngrambf_v1':
63
+ return {
64
+ type: 'ngrambf_v1',
65
+ ngramSize: args[0] ?? 0,
66
+ sizeBytes: args[1] ?? 0,
67
+ hashFunctions: args[2] ?? 0,
68
+ randomSeed: args[3] ?? 0,
69
+ };
70
+ default:
71
+ return { type: 'set', maxRows: args[0] ?? 0 };
72
+ }
73
+ }
74
+ export function normalizeIndexFromSystemRow(row) {
75
+ const parsed = parseIndexType(row.type);
44
76
  return {
45
77
  name: row.name,
46
78
  expression: normalizeSQLFragment(row.expr),
47
- type: normalizeIndexType(row.type),
48
79
  granularity: row.granularity,
80
+ ...parsed,
49
81
  };
50
82
  }
51
- export function createClickHouseExecutor(config) {
52
- const client = createClient({
83
+ export function buildIntrospectedTables(tables, columns, indexes) {
84
+ const tableRows = tables.filter((row) => inferSchemaKindFromEngine(row.engine) === 'table');
85
+ if (tableRows.length === 0)
86
+ return [];
87
+ const columnsByTable = new Map();
88
+ for (const row of columns) {
89
+ const key = `${row.database}.${row.table}`;
90
+ const rows = columnsByTable.get(key);
91
+ if (rows)
92
+ rows.push(row);
93
+ else
94
+ columnsByTable.set(key, [row]);
95
+ }
96
+ const indexesByTable = new Map();
97
+ for (const row of indexes) {
98
+ const key = `${row.database}.${row.table}`;
99
+ const rows = indexesByTable.get(key);
100
+ if (rows)
101
+ rows.push(row);
102
+ else
103
+ indexesByTable.set(key, [row]);
104
+ }
105
+ return tableRows
106
+ .map((row) => {
107
+ const key = `${row.database}.${row.name}`;
108
+ const columnRows = (columnsByTable.get(key) ?? []).sort((a, b) => a.position - b.position);
109
+ const indexRows = indexesByTable.get(key) ?? [];
110
+ return {
111
+ database: row.database,
112
+ name: row.name,
113
+ engine: parseEngineFromCreateTableQuery(row.create_table_query),
114
+ primaryKey: parsePrimaryKeyFromCreateTableQuery(row.create_table_query),
115
+ orderBy: parseOrderByFromCreateTableQuery(row.create_table_query),
116
+ uniqueKey: parseUniqueKeyFromCreateTableQuery(row.create_table_query),
117
+ partitionBy: parsePartitionByFromCreateTableQuery(row.create_table_query),
118
+ columns: columnRows.map(normalizeColumnFromSystemRow),
119
+ settings: parseSettingsFromCreateTableQuery(row.create_table_query),
120
+ indexes: indexRows.map(normalizeIndexFromSystemRow),
121
+ projections: parseProjectionsFromCreateTableQuery(row.create_table_query),
122
+ ttl: parseTTLFromCreateTableQuery(row.create_table_query),
123
+ };
124
+ })
125
+ .sort((a, b) => {
126
+ const dbOrder = a.database.localeCompare(b.database);
127
+ if (dbOrder !== 0)
128
+ return dbOrder;
129
+ return a.name.localeCompare(b.name);
130
+ });
131
+ }
132
+ const NETWORK_ERROR_LABELS = {
133
+ ECONNREFUSED: 'connection refused',
134
+ ENOTFOUND: 'host not found',
135
+ ETIMEDOUT: 'connection timed out',
136
+ ECONNRESET: 'connection reset',
137
+ EHOSTUNREACH: 'host unreachable',
138
+ };
139
+ /**
140
+ * Some @clickhouse/client and Node versions surface a network failure with the
141
+ * reason only in the message (the `.code` is stripped), so a bare match on
142
+ * `.code` misses them and the raw library string leaks. Recover the label from
143
+ * the message as a fallback — e.g. a typo'd host that yields a `getaddrinfo
144
+ * ENOTFOUND` / "Was there a typo" string.
145
+ */
146
+ const NETWORK_MESSAGE_PATTERNS = [
147
+ [/ENOTFOUND|getaddrinfo|EAI_AGAIN|Was there a typo/i, 'host not found'],
148
+ [/ECONNREFUSED/i, 'connection refused'],
149
+ [/ETIMEDOUT|timed out/i, 'connection timed out'],
150
+ [/ECONNRESET/i, 'connection reset'],
151
+ [/EHOSTUNREACH/i, 'host unreachable'],
152
+ ];
153
+ function networkLabelFromError(error) {
154
+ const code = 'code' in error ? String(error.code ?? '') : '';
155
+ if (code && NETWORK_ERROR_LABELS[code])
156
+ return NETWORK_ERROR_LABELS[code];
157
+ for (const [pattern, label] of NETWORK_MESSAGE_PATTERNS) {
158
+ if (pattern.test(error.message))
159
+ return label;
160
+ }
161
+ return undefined;
162
+ }
163
+ /**
164
+ * ClickHouse reports a wrong/missing password with server-side error codes 194
165
+ * (REQUIRED_PASSWORD) or 516 (AUTHENTICATION_FAILED) and a multi-line message
166
+ * that includes Cloud reset URLs and on-disk users.d/ paths — noise that reads
167
+ * as a leaked internal error to someone who just fat-fingered a password.
168
+ */
169
+ function isAuthError(error) {
170
+ const code = String(error.code ?? '');
171
+ const type = String(error.type ?? '');
172
+ if (code === '194' || code === '516')
173
+ return true;
174
+ if (type === 'REQUIRED_PASSWORD' || type === 'AUTHENTICATION_FAILED')
175
+ return true;
176
+ return /authentication failed/i.test(error.message);
177
+ }
178
+ /**
179
+ * Builds a clean, user-facing message for a connection-time error, or returns
180
+ * `undefined` when the error is not one we recognize (caller rethrows as-is).
181
+ * Pure so it can be unit-tested without catching thrown errors.
182
+ */
183
+ export function formatConnectionError(error, url, username) {
184
+ if (!(error instanceof Error))
185
+ return undefined;
186
+ if (isAuthError(error)) {
187
+ const who = username ? `user "${username}"` : 'the configured user';
188
+ return `Authentication failed for ${who} at ${url}. Check CLICKHOUSE_USER / CLICKHOUSE_PASSWORD.`;
189
+ }
190
+ const label = networkLabelFromError(error);
191
+ if (label) {
192
+ const isLocalhostDefault = /^https?:\/\/(localhost|127\.0\.0\.1):8123\/?$/.test(url);
193
+ const envUnset = !process.env.CLICKHOUSE_URL;
194
+ const hint = isLocalhostDefault && envUnset
195
+ ? '\n Hint: CLICKHOUSE_URL is not set — chkit fell back to the default localhost endpoint. Set CLICKHOUSE_URL to point at your ClickHouse instance.'
196
+ : '';
197
+ return `Could not connect to ClickHouse at ${url} (${label})${hint}`;
198
+ }
199
+ return undefined;
200
+ }
201
+ export function wrapConnectionError(error, url, username) {
202
+ const message = formatConnectionError(error, url, username);
203
+ if (message !== undefined)
204
+ throw new Error(message);
205
+ throw error;
206
+ }
207
+ export function isUnknownDatabaseError(error) {
208
+ if (!(error instanceof Error))
209
+ return false;
210
+ if (!('code' in error))
211
+ return false;
212
+ return String(error.code) === '81';
213
+ }
214
+ /**
215
+ * Thrown when a ClickHouse query failed mid-flight after the server already
216
+ * committed an HTTP 200 response by emitting progress headers. In that
217
+ * scenario the error is reported via the `x-clickhouse-exception-code`
218
+ * response header rather than as an HTTP error — @clickhouse/client does not
219
+ * surface it as a thrown error, so we must detect it ourselves and throw.
220
+ */
221
+ export class ClickHouseStreamedException extends Error {
222
+ code;
223
+ exceptionTag;
224
+ query_id;
225
+ constructor(input) {
226
+ const idPart = input.query_id ? ` (query_id ${input.query_id})` : '';
227
+ const tagPart = input.exceptionTag ? `, exception_tag ${input.exceptionTag}` : '';
228
+ const sqlPreview = input.sql
229
+ ? `\n SQL: ${input.sql.length > 200 ? `${input.sql.slice(0, 200)}…` : input.sql}`
230
+ : '';
231
+ super(`ClickHouse query failed with exception code ${input.code}${tagPart}${idPart}.${sqlPreview}`);
232
+ this.name = 'ClickHouseStreamedException';
233
+ this.code = input.code;
234
+ this.exceptionTag = input.exceptionTag;
235
+ this.query_id = input.query_id;
236
+ }
237
+ }
238
+ /**
239
+ * Throws if the response carries a non-zero `x-clickhouse-exception-code`
240
+ * header. This happens when ClickHouse sends progress headers (committing
241
+ * HTTP 200) and then the query errors out — the error is reported in
242
+ * headers, not by HTTP status, and @clickhouse/client does not raise it.
243
+ */
244
+ export function assertStreamedQuerySucceeded(input) {
245
+ const headers = input.response_headers;
246
+ if (!headers)
247
+ return;
248
+ const rawCode = headers['x-clickhouse-exception-code'];
249
+ const code = Array.isArray(rawCode) ? rawCode[0] : rawCode;
250
+ if (!code || code === '0')
251
+ return;
252
+ const rawTag = headers['x-clickhouse-exception-tag'];
253
+ const tag = Array.isArray(rawTag) ? rawTag[0] : rawTag;
254
+ throw new ClickHouseStreamedException({
255
+ code,
256
+ exceptionTag: tag,
257
+ query_id: input.query_id,
258
+ sql: input.sql,
259
+ });
260
+ }
261
+ export { waitForColumn, waitForDDLPropagation, waitForTable, waitForTableAbsent, waitForView, } from './ddl-propagation.js';
262
+ function parseSummaryFromHeaders(headers) {
263
+ const raw = headers['x-clickhouse-summary'];
264
+ if (!raw || typeof raw !== 'string')
265
+ return undefined;
266
+ try {
267
+ return JSON.parse(raw);
268
+ }
269
+ catch {
270
+ return undefined;
271
+ }
272
+ }
273
+ function logProfiling(logger, query, queryId, summary) {
274
+ logger.trace('Query completed: {query}', {
275
+ query,
276
+ queryId,
277
+ readRows: Number(summary?.read_rows ?? 0),
278
+ readBytes: Number(summary?.read_bytes ?? 0),
279
+ writtenRows: Number(summary?.written_rows ?? 0),
280
+ writtenBytes: Number(summary?.written_bytes ?? 0),
281
+ elapsedMs: Number(summary?.elapsed_ns ?? 0) / 1_000_000,
282
+ resultRows: Number(summary?.result_rows ?? 0),
283
+ resultBytes: Number(summary?.result_bytes ?? 0),
284
+ });
285
+ }
286
+ const DEFAULT_CLICKHOUSE_SETTINGS = {
287
+ wait_end_of_query: 1,
288
+ async_insert: 0,
289
+ send_progress_in_http_headers: 1,
290
+ };
291
+ // chkit emits its own clean, one-line connection errors (see wrapConnectionError).
292
+ // The built-in @clickhouse/client DefaultLogger defaults to WARN since v1.18, which
293
+ // logs the full raw server remediation blurb to stderr on any connection ERROR and
294
+ // would otherwise leak it past our clean message. Owning the level (OFF) silences it
295
+ // independent of the resolved client version, since the client does `level ?? DEFAULT`.
296
+ const SILENT_CLIENT_LOG = { level: ClickHouseLogLevel.OFF };
297
+ // @clickhouse/client uses socket.setTimeout under the hood, which is an
298
+ // inactivity timeout. For long-running INSERTs (e.g. INSERT ... SELECT FROM
299
+ // url() in the ClickBench load) ClickHouse stays silent until the operation
300
+ // completes, so any finite timeout eventually trips. 0 disables the idle
301
+ // timeout entirely — TCP keepalive still detects dead connections.
302
+ const NO_REQUEST_TIMEOUT = 0;
303
+ export function createStatelessClickHouseClient(config, clickhouseSettings = DEFAULT_CLICKHOUSE_SETTINGS, options = {}) {
304
+ return createClient({
53
305
  url: config.url,
54
306
  username: config.username,
55
307
  password: config.password,
56
308
  database: config.database,
57
- session_id: crypto.randomUUID(),
58
- clickhouse_settings: {
59
- wait_end_of_query: 1,
60
- async_insert: 0,
61
- },
309
+ application: CHKIT_APPLICATION_ID,
310
+ request_timeout: NO_REQUEST_TIMEOUT,
311
+ clickhouse_settings: clickhouseSettings,
312
+ log: SILENT_CLIENT_LOG,
313
+ ...(options.compression ? { compression: options.compression } : {}),
62
314
  });
315
+ }
316
+ /**
317
+ * Creates a ClickHouse client that sends one session_id with every request.
318
+ * Use only for workflows that need session state, such as temporary tables or
319
+ * session-level settings. ClickHouse allows only one in-flight query per HTTP
320
+ * session, so callers must serialize all requests made through this client.
321
+ */
322
+ export function createSessionClickHouseClient(config, clickhouseSettings = DEFAULT_CLICKHOUSE_SETTINGS, sessionId = crypto.randomUUID(), options = {}) {
323
+ return createClient({
324
+ url: config.url,
325
+ username: config.username,
326
+ password: config.password,
327
+ database: config.database,
328
+ session_id: sessionId,
329
+ application: CHKIT_APPLICATION_ID,
330
+ request_timeout: NO_REQUEST_TIMEOUT,
331
+ clickhouse_settings: clickhouseSettings,
332
+ log: SILENT_CLIENT_LOG,
333
+ ...(options.compression ? { compression: options.compression } : {}),
334
+ });
335
+ }
336
+ export function createExecutorWithClient(config, client, options = {}) {
337
+ const profiler = getLogger(['chkit', 'profiling']);
338
+ const fireAndForgetClient = createStatelessClickHouseClient(config, {
339
+ wait_end_of_query: 0,
340
+ });
341
+ let compressedClient;
63
342
  return {
64
- async execute(sql) {
65
- await client.command({ query: sql });
343
+ async command(sql) {
344
+ try {
345
+ const result = await client.command({
346
+ query: sql,
347
+ http_headers: { 'X-DDL': '1' },
348
+ });
349
+ assertStreamedQuerySucceeded({
350
+ response_headers: result.response_headers,
351
+ query_id: result.query_id,
352
+ sql,
353
+ });
354
+ logProfiling(profiler, sql, result.query_id, result.summary);
355
+ }
356
+ catch (error) {
357
+ if (isUnknownDatabaseError(error)) {
358
+ const fallback = createClient({
359
+ url: config.url,
360
+ username: config.username,
361
+ password: config.password,
362
+ application: CHKIT_APPLICATION_ID,
363
+ request_timeout: NO_REQUEST_TIMEOUT,
364
+ clickhouse_settings: { wait_end_of_query: 1, async_insert: 0 },
365
+ log: SILENT_CLIENT_LOG,
366
+ });
367
+ try {
368
+ const fallbackResult = await fallback.command({
369
+ query: sql,
370
+ http_headers: { 'X-DDL': '1' },
371
+ });
372
+ assertStreamedQuerySucceeded({
373
+ response_headers: fallbackResult.response_headers,
374
+ query_id: fallbackResult.query_id,
375
+ sql,
376
+ });
377
+ }
378
+ finally {
379
+ await fallback.close();
380
+ }
381
+ return;
382
+ }
383
+ wrapConnectionError(error, config.url, config.username);
384
+ }
66
385
  },
67
- async query(sql) {
68
- const result = await client.query({ query: sql, format: 'JSONEachRow' });
69
- return result.json();
386
+ async query(sql, settings) {
387
+ try {
388
+ const result = await client.query({
389
+ query: sql,
390
+ format: 'JSONEachRow',
391
+ http_headers: { 'X-DDL': '1' },
392
+ ...(settings ? { clickhouse_settings: settings } : {}),
393
+ });
394
+ // Check headers before decoding the body. With
395
+ // send_progress_in_http_headers=1, ClickHouse can return HTTP 200
396
+ // then append a plain-text exception block after partial JSON
397
+ // rows — JSON parsing would throw before we ever read the
398
+ // exception-code header.
399
+ assertStreamedQuerySucceeded({
400
+ response_headers: result.response_headers,
401
+ query_id: result.query_id,
402
+ sql,
403
+ });
404
+ const rows = await result.json();
405
+ logProfiling(profiler, sql, result.query_id, parseSummaryFromHeaders(result.response_headers));
406
+ return rows;
407
+ }
408
+ catch (error) {
409
+ wrapConnectionError(error, config.url, config.username);
410
+ }
411
+ },
412
+ async queryJson(sql, settings) {
413
+ try {
414
+ const result = await client.query({
415
+ query: sql,
416
+ format: 'JSON',
417
+ http_headers: { 'X-DDL': '1' },
418
+ ...(settings ? { clickhouse_settings: settings } : {}),
419
+ });
420
+ assertStreamedQuerySucceeded({
421
+ response_headers: result.response_headers,
422
+ query_id: result.query_id,
423
+ sql,
424
+ });
425
+ const payload = (await result.json());
426
+ logProfiling(profiler, sql, result.query_id, parseSummaryFromHeaders(result.response_headers));
427
+ return {
428
+ ...payload,
429
+ query_id: result.query_id,
430
+ };
431
+ }
432
+ catch (error) {
433
+ wrapConnectionError(error, config.url, config.username);
434
+ }
70
435
  },
71
436
  async insert(params) {
72
- await client.insert({
73
- table: params.table,
74
- values: params.values,
75
- format: 'JSONEachRow',
76
- });
437
+ try {
438
+ let insertClient = client;
439
+ if (params.compressed === true) {
440
+ if (!compressedClient) {
441
+ compressedClient =
442
+ options.createCompressedClient?.() ??
443
+ createStatelessClickHouseClient(config, DEFAULT_CLICKHOUSE_SETTINGS, { compression: { request: true } });
444
+ }
445
+ insertClient = compressedClient;
446
+ }
447
+ const result = await insertClient.insert({
448
+ table: params.table,
449
+ values: params.values,
450
+ format: 'JSONEachRow',
451
+ });
452
+ assertStreamedQuerySucceeded({
453
+ response_headers: result.response_headers,
454
+ query_id: result.query_id,
455
+ sql: `INSERT INTO ${params.table}`,
456
+ });
457
+ logProfiling(profiler, `INSERT INTO ${params.table}`, result.query_id, result.summary);
458
+ }
459
+ catch (error) {
460
+ wrapConnectionError(error, config.url, config.username);
461
+ }
462
+ },
463
+ async submit(sql, queryId) {
464
+ const id = queryId ?? crypto.randomUUID();
465
+ try {
466
+ await fireAndForgetClient.command({ query: sql, query_id: id });
467
+ }
468
+ catch (error) {
469
+ wrapConnectionError(error, config.url, config.username);
470
+ }
471
+ return id;
472
+ },
473
+ async queryStatus(queryId, options) {
474
+ try {
475
+ const running = await client.query({
476
+ query: `SELECT read_rows, read_bytes, written_rows, written_bytes, elapsed FROM clusterAllReplicas('cluster', system.processes) WHERE user = currentUser() AND query_id = {qid:String} SETTINGS skip_unavailable_shards = 1`,
477
+ query_params: { qid: queryId },
478
+ format: 'JSONEachRow',
479
+ });
480
+ const runningRows = await running.json();
481
+ const [proc] = runningRows;
482
+ if (proc) {
483
+ return {
484
+ status: 'running',
485
+ readRows: Number(proc.read_rows),
486
+ readBytes: Number(proc.read_bytes),
487
+ writtenRows: Number(proc.written_rows),
488
+ writtenBytes: Number(proc.written_bytes),
489
+ elapsedMs: Math.round(Number(proc.elapsed) * 1000),
490
+ };
491
+ }
492
+ const afterTime = options?.afterTime ?? '1970-01-01T00:00:00Z';
493
+ const log = await client.query({
494
+ query: `SELECT type, written_rows, written_bytes, query_duration_ms, exception
495
+ FROM clusterAllReplicas('cluster', system.query_log)
496
+ WHERE user = currentUser()
497
+ AND query_id = {qid:String}
498
+ AND type IN ('QueryFinish', 'ExceptionWhileProcessing')
499
+ AND is_initial_query = 1
500
+ AND query_start_time >= parseDateTimeBestEffort({after:String})
501
+ ORDER BY event_time DESC
502
+ LIMIT 1
503
+ SETTINGS skip_unavailable_shards = 1`,
504
+ query_params: { qid: queryId, after: afterTime },
505
+ format: 'JSONEachRow',
506
+ });
507
+ const logRows = await log.json();
508
+ if (logRows.length === 0) {
509
+ return { status: 'unknown' };
510
+ }
511
+ const [row] = logRows;
512
+ if (!row) {
513
+ return { status: 'unknown' };
514
+ }
515
+ if (row.type === 'QueryFinish') {
516
+ return {
517
+ status: 'finished',
518
+ writtenRows: Number(row.written_rows),
519
+ writtenBytes: Number(row.written_bytes),
520
+ durationMs: Number(row.query_duration_ms),
521
+ };
522
+ }
523
+ return {
524
+ status: 'failed',
525
+ durationMs: Number(row.query_duration_ms),
526
+ error: row.exception,
527
+ };
528
+ }
529
+ catch (error) {
530
+ wrapConnectionError(error, config.url, config.username);
531
+ }
77
532
  },
78
533
  async close() {
79
- await client.close();
534
+ await Promise.all([
535
+ client.close(),
536
+ fireAndForgetClient.close(),
537
+ compressedClient?.close(),
538
+ ]);
80
539
  },
81
540
  async listSchemaObjects() {
82
541
  const rows = await this.query(`SELECT database, name, engine
@@ -100,69 +559,36 @@ WHERE is_temporary = 0
100
559
  async listTableDetails(databases) {
101
560
  if (databases.length === 0)
102
561
  return [];
103
- const quotedDatabases = databases.map((dbName) => `'${dbName.replace(/'/g, "''")}'`).join(', ');
562
+ const quotedDatabases = databases
563
+ .map((dbName) => `'${dbName.replace(/'/g, "''")}'`)
564
+ .join(', ');
104
565
  const tables = await this.query(`SELECT database, name, engine, create_table_query
105
566
  FROM system.tables
106
567
  WHERE is_temporary = 0
107
568
  AND database IN (${quotedDatabases})`);
108
- const tableRows = tables.filter((row) => inferSchemaKindFromEngine(row.engine) === 'table');
109
- if (tableRows.length === 0)
110
- return [];
111
- const columns = await this.query(`SELECT database, table, name, type, default_kind, default_expression, comment, position
569
+ const columns = await this.query(`SELECT database, table, name, type, default_kind, default_expression, comment, position, compression_codec
112
570
  FROM system.columns
113
571
  WHERE database IN (${quotedDatabases})`);
114
572
  const indexes = await this.query(`SELECT database, table, name, expr, type, granularity
115
573
  FROM system.data_skipping_indices
116
574
  WHERE database IN (${quotedDatabases})`);
117
- const columnsByTable = new Map();
118
- for (const row of columns) {
119
- const key = `${row.database}.${row.table}`;
120
- const rows = columnsByTable.get(key);
121
- if (rows) {
122
- rows.push(row);
123
- }
124
- else {
125
- columnsByTable.set(key, [row]);
126
- }
127
- }
128
- const indexesByTable = new Map();
129
- for (const row of indexes) {
130
- const key = `${row.database}.${row.table}`;
131
- const rows = indexesByTable.get(key);
132
- if (rows) {
133
- rows.push(row);
134
- }
135
- else {
136
- indexesByTable.set(key, [row]);
137
- }
138
- }
139
- return tableRows
140
- .map((row) => {
141
- const key = `${row.database}.${row.name}`;
142
- const columnRows = (columnsByTable.get(key) ?? []).sort((a, b) => a.position - b.position);
143
- const indexRows = indexesByTable.get(key) ?? [];
144
- return {
145
- database: row.database,
146
- name: row.name,
147
- engine: parseEngineFromCreateTableQuery(row.create_table_query),
148
- primaryKey: parsePrimaryKeyFromCreateTableQuery(row.create_table_query),
149
- orderBy: parseOrderByFromCreateTableQuery(row.create_table_query),
150
- uniqueKey: parseUniqueKeyFromCreateTableQuery(row.create_table_query),
151
- partitionBy: parsePartitionByFromCreateTableQuery(row.create_table_query),
152
- columns: columnRows.map(normalizeColumnFromSystemRow),
153
- settings: parseSettingsFromCreateTableQuery(row.create_table_query),
154
- indexes: indexRows.map(normalizeIndexFromSystemRow),
155
- projections: parseProjectionsFromCreateTableQuery(row.create_table_query),
156
- ttl: parseTTLFromCreateTableQuery(row.create_table_query),
157
- };
158
- })
159
- .sort((a, b) => {
160
- const dbOrder = a.database.localeCompare(b.database);
161
- if (dbOrder !== 0)
162
- return dbOrder;
163
- return a.name.localeCompare(b.name);
164
- });
575
+ return buildIntrospectedTables(tables, columns, indexes);
165
576
  },
166
577
  };
167
578
  }
579
+ export function createClickHouseExecutor(config) {
580
+ // Default executor is session-bound so DDL-heavy workflows run through a
581
+ // single ClickHouse HTTP session. Do not issue concurrent queries through it.
582
+ const sessionId = crypto.randomUUID();
583
+ return createExecutorWithClient(config, createSessionClickHouseClient(config, DEFAULT_CLICKHOUSE_SETTINGS, sessionId), {
584
+ createCompressedClient: () => createSessionClickHouseClient(config, DEFAULT_CLICKHOUSE_SETTINGS, sessionId, { compression: { request: true } }),
585
+ });
586
+ }
587
+ export function createStatelessClickHouseExecutor(config) {
588
+ return createExecutorWithClient(config, createStatelessClickHouseClient(config), {
589
+ createCompressedClient: () => createStatelessClickHouseClient(config, DEFAULT_CLICKHOUSE_SETTINGS, {
590
+ compression: { request: true },
591
+ }),
592
+ });
593
+ }
168
594
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@chkit/clickhouse",
3
- "version": "0.1.0-beta.9",
3
+ "version": "0.1.1",
4
+ "description": "ClickHouse client wrapper for chkit",
5
+ "license": "MIT",
6
+ "author": "ObsessionDB",
7
+ "keywords": [
8
+ "clickhouse",
9
+ "database",
10
+ "client"
11
+ ],
4
12
  "homepage": "https://chkit.obsessiondb.com",
13
+ "bugs": {
14
+ "url": "https://github.com/obsessiondb/chkit/issues"
15
+ },
5
16
  "repository": {
6
17
  "type": "git",
7
18
  "url": "https://github.com/obsessiondb/chkit.git",
@@ -15,6 +26,11 @@
15
26
  "source": "./src/index.ts",
16
27
  "types": "./dist/index.d.ts",
17
28
  "default": "./dist/index.js"
29
+ },
30
+ "./e2e-testkit": {
31
+ "source": "./src/e2e-testkit.ts",
32
+ "types": "./dist/e2e-testkit.d.ts",
33
+ "default": "./dist/e2e-testkit.js"
18
34
  }
19
35
  },
20
36
  "files": [
@@ -29,7 +45,9 @@
29
45
  "clean": "rm -rf dist"
30
46
  },
31
47
  "dependencies": {
32
- "@chkit/core": "0.1.0-beta.9",
33
- "@clickhouse/client": "^1.11.0"
48
+ "@chkit/core": "0.1.1",
49
+ "@clickhouse/client": "^1.18.0",
50
+ "@logtape/logtape": "^2.0.5",
51
+ "p-retry": "^7.1.1"
34
52
  }
35
53
  }