@chkit/clickhouse 0.2.0-beta.11 → 0.2.0-beta.12

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.
Files changed (41) hide show
  1. package/dist/alter-column-statement.d.ts +32 -0
  2. package/dist/alter-column-statement.d.ts.map +1 -0
  3. package/dist/alter-column-statement.js +137 -0
  4. package/dist/alter-column-statement.js.map +1 -0
  5. package/dist/async-insert-guard.d.ts +31 -0
  6. package/dist/async-insert-guard.d.ts.map +1 -0
  7. package/dist/async-insert-guard.js +55 -0
  8. package/dist/async-insert-guard.js.map +1 -0
  9. package/dist/create-table-parser.d.ts +3 -0
  10. package/dist/create-table-parser.d.ts.map +1 -1
  11. package/dist/create-table-parser.js +18 -0
  12. package/dist/create-table-parser.js.map +1 -1
  13. package/dist/ddl-propagation.d.ts +62 -6
  14. package/dist/ddl-propagation.d.ts.map +1 -1
  15. package/dist/ddl-propagation.js +420 -46
  16. package/dist/ddl-propagation.js.map +1 -1
  17. package/dist/e2e-testkit.d.ts +4 -1
  18. package/dist/e2e-testkit.d.ts.map +1 -1
  19. package/dist/e2e-testkit.js +9 -5
  20. package/dist/e2e-testkit.js.map +1 -1
  21. package/dist/exact-json.d.ts +27 -0
  22. package/dist/exact-json.d.ts.map +1 -0
  23. package/dist/exact-json.js +128 -0
  24. package/dist/exact-json.js.map +1 -0
  25. package/dist/index.d.ts +32 -9
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +177 -60
  28. package/dist/index.js.map +1 -1
  29. package/dist/insert-barrier.d.ts +32 -0
  30. package/dist/insert-barrier.d.ts.map +1 -0
  31. package/dist/insert-barrier.js +57 -0
  32. package/dist/insert-barrier.js.map +1 -0
  33. package/dist/replicas.d.ts +21 -0
  34. package/dist/replicas.d.ts.map +1 -0
  35. package/dist/replicas.js +39 -0
  36. package/dist/replicas.js.map +1 -0
  37. package/dist/view-details.d.ts +30 -0
  38. package/dist/view-details.d.ts.map +1 -0
  39. package/dist/view-details.js +73 -0
  40. package/dist/view-details.js.map +1 -0
  41. package/package.json +5 -2
@@ -1,5 +1,11 @@
1
1
  import pRetry from 'p-retry';
2
+ import { parseModifyColumnIntent, parseRenameColumn } from './alter-column-statement.js';
3
+ import { allReplicas, resolveReplicaFanout, stringLiteral } from './replicas.js';
2
4
  const RETRY_OPTIONS = { retries: 20, minTimeout: 500, factor: 1 };
5
+ // Upper bound on a column definition or rename wait, including slow queries.
6
+ const DEFINITION_WAIT_DEADLINE_MS = 30_000;
7
+ // The `system.columns` fields a column definition wait compares.
8
+ const COLUMN_FIELDS = ['type', 'default_kind', 'default_expression', 'comment', 'compression_codec'];
3
9
  // What each ALTER or rename appends to the `<kind>:<database>.<name>` key of the
4
10
  // object it changes. Creates and drops use the bare key.
5
11
  const KEY_SUFFIXES = new Map([
@@ -12,43 +18,206 @@ const KEY_SUFFIXES = new Map([
12
18
  ['alter_table_drop_index', ':index:'],
13
19
  ['alter_table_add_projection', ':projection:'],
14
20
  ['alter_table_drop_projection', ':projection:'],
21
+ ['alter_table_add_constraint', ':constraint:'],
22
+ ['alter_table_drop_constraint', ':constraint:'],
15
23
  ['alter_table_modify_setting', ':setting:'],
16
24
  ['alter_table_reset_setting', ':setting:'],
17
25
  ['alter_table_modify_ttl', ':ttl'],
18
26
  ['alter_table_rename_table', ':rename_table'],
19
27
  ['rename_dictionary', ':rename_dictionary'],
20
28
  ]);
21
- export async function waitForTable(executor, database, tableName) {
22
- await pRetry(async () => {
23
- const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = ${stringLiteral(database)} AND name = ${stringLiteral(tableName)}`);
24
- if (rows.length === 0) {
25
- throw new Error(`waitForTable: ${database}.${tableName} not yet visible`);
26
- }
27
- }, RETRY_OPTIONS);
29
+ export async function waitForTable(executor, database, tableName, options) {
30
+ await waitForSystemRows(executor, {
31
+ source: 'system.tables',
32
+ where: `database = ${stringLiteral(database)} AND name = ${stringLiteral(tableName)}`,
33
+ want: 'present',
34
+ label: `waitForTable: ${database}.${tableName} not yet visible`,
35
+ }, options);
28
36
  }
29
- export async function waitForView(executor, database, viewName) {
30
- await pRetry(async () => {
31
- const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = ${stringLiteral(database)} AND name = ${stringLiteral(viewName)} AND engine LIKE '%View%'`);
32
- if (rows.length === 0) {
33
- throw new Error(`waitForView: ${database}.${viewName} not yet visible`);
34
- }
35
- }, RETRY_OPTIONS);
37
+ export async function waitForView(executor, database, viewName, options) {
38
+ await waitForSystemRows(executor, {
39
+ source: 'system.tables',
40
+ where: `database = ${stringLiteral(database)} AND name = ${stringLiteral(viewName)} AND engine LIKE '%View%'`,
41
+ want: 'present',
42
+ label: `waitForView: ${database}.${viewName} not yet visible`,
43
+ }, options);
36
44
  }
37
- export async function waitForDictionary(executor, database, dictionaryName) {
45
+ /**
46
+ * Waits until the dictionary's catalog row is on every replica.
47
+ *
48
+ * `system.dictionaries` is the wrong signal. It lists each replica's
49
+ * in-memory loader (`ExternalLoader` load results), not the replicated
50
+ * catalog. `CREATE OR REPLACE DICTIONARY` drops that loader entry while the
51
+ * replica reloads, so a replica can omit the dictionary for the whole retry
52
+ * budget after the DDL is already in `system.tables`. A following statement
53
+ * only needs the catalog object.
54
+ *
55
+ * On several replicas the wait holds until every replica stores the same
56
+ * non-nil `uuid`. A replace does not remove the row, and ClickHouse redacts
57
+ * a SOURCE password to `[HIDDEN]` in `create_table_query`, so a password-only
58
+ * replace compares equal to the previous definition. `CREATE OR REPLACE`
59
+ * still assigns one new UUID in the replicated DDL (an `ON CLUSTER` statement
60
+ * and a Replicated database), and every replica that has applied it reports
61
+ * that UUID. `metadata_modification_time` is each replica's metadata-file
62
+ * mtime at second precision: it can stay unchanged across a replace in the
63
+ * same second, and two replicas that have both applied the DDL can disagree.
64
+ */
65
+ export async function waitForDictionary(executor, database, dictionaryName, options) {
66
+ const where = `database = ${stringLiteral(database)} AND name = ${stringLiteral(dictionaryName)} AND engine = 'Dictionary'`;
67
+ const label = `waitForDictionary: ${database}.${dictionaryName} not yet visible`;
68
+ const fanout = await resolveReplicaFanout(executor, options?.cluster);
38
69
  await pRetry(async () => {
39
- const rows = await executor.query(`SELECT 1 AS x FROM system.dictionaries WHERE database = ${stringLiteral(database)} AND name = ${stringLiteral(dictionaryName)}`);
40
- if (rows.length === 0) {
41
- throw new Error(`waitForDictionary: ${database}.${dictionaryName} not yet visible`);
42
- }
70
+ if (!(await dictionaryCatalogVisible(executor, where, fanout)))
71
+ throw new Error(label);
43
72
  }, RETRY_OPTIONS);
44
73
  }
45
- export async function waitForColumn(executor, database, tableName, columnName) {
46
- await pRetry(async () => {
47
- const rows = await executor.query(`SELECT 1 AS x FROM system.columns WHERE database = ${stringLiteral(database)} AND table = ${stringLiteral(tableName)} AND name = ${stringLiteral(columnName)}`);
48
- if (rows.length === 0) {
49
- throw new Error(`waitForColumn: ${database}.${tableName}.${columnName} not yet visible`);
74
+ export async function waitForColumn(executor, database, tableName, columnName, options) {
75
+ await waitForSystemRows(executor, {
76
+ source: 'system.columns',
77
+ where: columnWhere(database, tableName, columnName),
78
+ want: 'present',
79
+ label: `waitForColumn: ${database}.${tableName}.${columnName} not yet visible`,
80
+ }, options);
81
+ }
82
+ export async function waitForColumnAbsent(executor, database, tableName, columnName, options) {
83
+ await waitForSystemRows(executor, {
84
+ source: 'system.columns',
85
+ where: columnWhere(database, tableName, columnName),
86
+ want: 'absent',
87
+ label: `waitForColumnAbsent: ${database}.${tableName}.${columnName} still present`,
88
+ }, options);
89
+ }
90
+ /**
91
+ * Waits until every replica reports the column with one definition, and with
92
+ * what `intent` says the statement set.
93
+ *
94
+ * Agreement: the replica that ran an ALTER has applied it when the statement
95
+ * returns, so once every replica reports the same `type`, `default_kind`,
96
+ * `default_expression`, `comment` and `compression_codec`, all of them have.
97
+ * Each replica formats these values itself, so the comparison is between
98
+ * server-formatted text and never trips over how chkit wrote an expression.
99
+ *
100
+ * Intent: agreement alone passes when every replica kept the old definition,
101
+ * e.g. ObsessionDB ignoring `MODIFY COLUMN ... EPHEMERAL <default>` (#285). So
102
+ * the fields the statement sets are compared too: the default kind and comment
103
+ * verbatim, a removed codec as empty, and the default expression after the
104
+ * server formats it with `formatQuerySingleLine`, the formatter that writes
105
+ * `system.columns.default_expression`. Types and codecs the statement sets are
106
+ * only compared between replicas: ClickHouse rewrites them (`Decimal(10,2)`
107
+ * becomes `Decimal(10, 2)`, `ZSTD` becomes `ZSTD(1)`).
108
+ */
109
+ async function waitForColumnDefinition(executor, database, tableName, columnName, intent, options) {
110
+ const fanout = await resolveReplicaFanout(executor, options?.cluster);
111
+ const expected = await expectedColumnValues(executor, intent);
112
+ const source = fanout ? allReplicas(fanout, 'system.columns') : 'system.columns';
113
+ const sql = `SELECT hostName() AS replica, ${COLUMN_FIELDS.join(', ')} FROM ${source} WHERE ${columnWhere(database, tableName, columnName)}`;
114
+ await waitUntilApplied(`${database}.${tableName}.${columnName} definition`, async () => columnDefinitionMismatch(await executor.query(sql), fanout?.replicas ?? 1, expected));
115
+ }
116
+ /** Waits until no replica lists the old name and every replica lists the new one. */
117
+ async function waitForColumnRename(executor, database, tableName, rename, options) {
118
+ const fanout = await resolveReplicaFanout(executor, options?.cluster);
119
+ const replicas = fanout?.replicas ?? 1;
120
+ const source = fanout ? allReplicas(fanout, 'system.columns') : 'system.columns';
121
+ const sql = `SELECT hostName() AS replica, name FROM ${source} WHERE database = ${stringLiteral(database)} AND table = ${stringLiteral(tableName)} AND name IN (${stringLiteral(rename.from)}, ${stringLiteral(rename.to)})`;
122
+ await waitUntilApplied(`${database}.${tableName} rename of column ${rename.from} to ${rename.to}`, async () => {
123
+ const rows = await executor.query(sql);
124
+ const stale = rows.filter((row) => row.name === rename.from).map((row) => row.replica);
125
+ if (stale.length > 0)
126
+ return `replica ${stale.join(', ')} still lists column ${rename.from}`;
127
+ const renamed = new Set(rows.filter((row) => row.name === rename.to).map((row) => row.replica));
128
+ if (renamed.size < replicas)
129
+ return `column ${rename.to} is listed on ${renamed.size} of ${replicas} replicas`;
130
+ return undefined;
131
+ });
132
+ }
133
+ async function waitForIndex(executor, database, tableName, indexName, want, options) {
134
+ await waitForSystemRows(executor, {
135
+ source: 'system.data_skipping_indices',
136
+ where: `database = ${stringLiteral(database)} AND table = ${stringLiteral(tableName)} AND name = ${stringLiteral(indexName)}`,
137
+ want,
138
+ label: `waitForIndex: ${database}.${tableName}.${indexName} ${want === 'present' ? 'not yet visible' : 'still present'}`,
139
+ }, options);
140
+ }
141
+ /**
142
+ * Waits until every replica's `create_table_query` lists the constraint. There
143
+ * is no system table of constraints. A replica that has not applied the ADD
144
+ * yet would let a following `DROP CONSTRAINT IF EXISTS` (a changed constraint)
145
+ * or `ADD CONSTRAINT IF NOT EXISTS` silently do nothing.
146
+ */
147
+ async function waitForConstraint(executor, database, tableName, constraintName, options) {
148
+ await waitForSystemRows(executor, {
149
+ source: 'system.tables',
150
+ where: constraintWhere(database, tableName, constraintName),
151
+ want: 'present',
152
+ label: `waitForConstraint: ${database}.${tableName}.${constraintName} not yet visible`,
153
+ }, options);
154
+ }
155
+ async function waitForConstraintAbsent(executor, database, tableName, constraintName, options) {
156
+ await waitForSystemRows(executor, {
157
+ source: 'system.tables',
158
+ where: constraintWhere(database, tableName, constraintName),
159
+ want: 'absent',
160
+ label: `waitForConstraintAbsent: ${database}.${tableName}.${constraintName} still present`,
161
+ }, options);
162
+ }
163
+ /**
164
+ * Waits until every replica lists both tables of `EXCHANGE TABLES a AND b`
165
+ * with one uuid each, and the two uuids differ. The replica that ran the
166
+ * statement has swapped them, so once all replicas agree, all have. A
167
+ * statement that runs on a replica that has not applied the swap yet would
168
+ * see the old names: a following DROP of the pre-cutover table would drop the
169
+ * new one.
170
+ *
171
+ * With `clickhouse.cluster` the statement ran `ON CLUSTER`, which returns once
172
+ * every host executed it, and each host may hold its own uuids, so there is
173
+ * nothing to wait for. A single replica has nothing to wait for either.
174
+ */
175
+ export async function waitForExchange(executor, statement, options) {
176
+ if (options?.cluster)
177
+ return;
178
+ const tables = parseExchangeTables(statement);
179
+ if (!tables)
180
+ return;
181
+ const fanout = await resolveReplicaFanout(executor);
182
+ if (!fanout)
183
+ return;
184
+ const [first, second] = tables;
185
+ const where = `(database = ${stringLiteral(first.database)} AND name = ${stringLiteral(first.name)}) OR (database = ${stringLiteral(second.database)} AND name = ${stringLiteral(second.name)})`;
186
+ const sql = `SELECT database, name, count(DISTINCT hostName()) AS replicas, uniqExact(uuid) AS uuids, any(toString(uuid)) AS sample_uuid FROM ${allReplicas(fanout, 'system.tables')} WHERE ${where} GROUP BY database, name`;
187
+ await waitUntilApplied(`EXCHANGE TABLES ${first.database}.${first.name} AND ${second.database}.${second.name}`, async () => {
188
+ const rows = await executor.query(sql);
189
+ if (rows.length < 2)
190
+ return `only ${rows.length} of the 2 tables are listed`;
191
+ for (const row of rows) {
192
+ if (Number(row.replicas) < fanout.replicas)
193
+ return `${row.database}.${row.name} is listed on ${row.replicas} of ${fanout.replicas} replicas`;
194
+ if (Number(row.uuids) !== 1)
195
+ return `replicas disagree on the uuid of ${row.database}.${row.name}`;
50
196
  }
51
- }, RETRY_OPTIONS);
197
+ if (rows[0]?.sample_uuid === rows[1]?.sample_uuid)
198
+ return 'both names report the same uuid';
199
+ return undefined;
200
+ });
201
+ }
202
+ const QUOTED_OR_BARE = String.raw `(?:\`(?:[^\`\\]|\\.)*\`|[^\s.\`;]+)`;
203
+ const EXCHANGE_PATTERN = new RegExp(String.raw `^\s*EXCHANGE\s+TABLES\s+(${QUOTED_OR_BARE})\.(${QUOTED_OR_BARE})\s+AND\s+(${QUOTED_OR_BARE})\.(${QUOTED_OR_BARE})`, 'i');
204
+ /** The two tables of `EXCHANGE TABLES db.a AND db.b`, or undefined. */
205
+ export function parseExchangeTables(statement) {
206
+ const match = EXCHANGE_PATTERN.exec(statement);
207
+ if (!match)
208
+ return undefined;
209
+ const [, db1, t1, db2, t2] = match;
210
+ if (!db1 || !t1 || !db2 || !t2)
211
+ return undefined;
212
+ return [
213
+ { database: unquote(db1), name: unquote(t1) },
214
+ { database: unquote(db2), name: unquote(t2) },
215
+ ];
216
+ }
217
+ function unquote(identifier) {
218
+ if (!identifier.startsWith('`'))
219
+ return identifier;
220
+ return identifier.slice(1, -1).replace(/\\(.)/g, '$1');
52
221
  }
53
222
  /**
54
223
  * Polls a query until its rows satisfy `predicate`, then returns them. Use for
@@ -64,13 +233,13 @@ export async function waitForRows(executor, sql, predicate, label = 'waitForRows
64
233
  return rows;
65
234
  }, RETRY_OPTIONS);
66
235
  }
67
- export async function waitForTableAbsent(executor, database, tableName) {
68
- await pRetry(async () => {
69
- const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE database = ${stringLiteral(database)} AND name = ${stringLiteral(tableName)}`);
70
- if (rows.length > 0) {
71
- throw new Error(`waitForTableAbsent: ${database}.${tableName} still present`);
72
- }
73
- }, RETRY_OPTIONS);
236
+ export async function waitForTableAbsent(executor, database, tableName, options) {
237
+ await waitForSystemRows(executor, {
238
+ source: 'system.tables',
239
+ where: `database = ${stringLiteral(database)} AND name = ${stringLiteral(tableName)}`,
240
+ want: 'absent',
241
+ label: `waitForTableAbsent: ${database}.${tableName} still present`,
242
+ }, options);
74
243
  }
75
244
  /**
76
245
  * Parses an operation key like "table:app.users", "table:app.users:column:name",
@@ -96,46 +265,251 @@ function parseOperationKey(operationType, key) {
96
265
  const at = suffix === undefined ? -1 : rest.lastIndexOf(suffix);
97
266
  if (suffix === undefined || at < 1)
98
267
  return { database, table: rest, column: undefined };
99
- const column = suffix === ':column:' ? rest.slice(at + suffix.length) : undefined;
100
- return { database, table: rest.slice(0, at), column };
268
+ const member = rest.slice(at + suffix.length);
269
+ return {
270
+ database,
271
+ table: rest.slice(0, at),
272
+ column: suffix === ':column:' ? member : undefined,
273
+ constraint: suffix === ':constraint:' ? member : undefined,
274
+ index: suffix === ':index:' ? member : undefined,
275
+ rename: suffix === ':column_rename:' ? member : undefined,
276
+ };
277
+ }
278
+ /**
279
+ * The old and new names of a column rename. The statement names them; without
280
+ * it the key's `<from>:<to>` is split only when it holds exactly one ':'.
281
+ */
282
+ function renamedColumn(member, statement) {
283
+ const parsed = statement === undefined ? undefined : parseRenameColumn(statement);
284
+ if (parsed && `${parsed.from}:${parsed.to}` === member)
285
+ return parsed;
286
+ const parts = member.split(':');
287
+ return parts.length === 2 && parts[0] && parts[1] ? { from: parts[0], to: parts[1] } : undefined;
101
288
  }
102
289
  /**
103
290
  * Waits for DDL propagation based on the operation type and key.
104
291
  * Called after each DDL statement in the migration execution loop.
105
292
  */
106
- export async function waitForDDLPropagation(executor, operationType, operationKey) {
293
+ export async function waitForDDLPropagation(executor, operationType, operationKey, options) {
294
+ // Backfill assertions execute SELECT guards. Their keys identify the guard,
295
+ // not an object changed by DDL, so there is no schema propagation to await.
296
+ if (operationType === 'assert_backfill')
297
+ return;
298
+ // Cutover guards, barriers, copies and the snapshot ALTER change no object
299
+ // in the catalog; the objects a cutover creates and drops use the regular
300
+ // create/drop operation types.
301
+ if (operationType.startsWith('cutover_'))
302
+ return;
303
+ if (operationType === 'exchange_tables') {
304
+ if (options?.statement === undefined)
305
+ return;
306
+ return waitForExchange(executor, options.statement, options);
307
+ }
107
308
  const parsed = parseOperationKey(operationType, operationKey);
108
309
  if (!parsed)
109
310
  return; // database-level ops or unrecognized keys — no wait needed
110
311
  switch (operationType) {
111
312
  case 'create_table':
112
- return waitForTable(executor, parsed.database, parsed.table);
313
+ return waitForTable(executor, parsed.database, parsed.table, options);
113
314
  case 'create_view':
114
315
  case 'create_materialized_view':
115
- return waitForView(executor, parsed.database, parsed.table);
316
+ return waitForView(executor, parsed.database, parsed.table, options);
116
317
  case 'create_dictionary':
117
- return waitForDictionary(executor, parsed.database, parsed.table);
318
+ return waitForDictionary(executor, parsed.database, parsed.table, options);
319
+ // ADD COLUMN IF NOT EXISTS leaves an existing column as it is, so only
320
+ // agreement between replicas is checked; MODIFY also checks what it sets.
118
321
  case 'alter_table_add_column':
119
322
  case 'alter_table_modify_column':
120
323
  if (parsed.column) {
121
- return waitForColumn(executor, parsed.database, parsed.table, parsed.column);
324
+ const intent = operationType === 'alter_table_modify_column' && options?.statement !== undefined
325
+ ? parseModifyColumnIntent(options.statement, parsed.column)
326
+ : {};
327
+ return waitForColumnDefinition(executor, parsed.database, parsed.table, parsed.column, intent, options);
122
328
  }
123
329
  return;
330
+ case 'alter_table_rename_column': {
331
+ const rename = parsed.rename === undefined ? undefined : renamedColumn(parsed.rename, options?.statement);
332
+ if (rename)
333
+ return waitForColumnRename(executor, parsed.database, parsed.table, rename, options);
334
+ return waitForTable(executor, parsed.database, parsed.table, options);
335
+ }
336
+ case 'alter_table_add_index':
337
+ case 'alter_table_drop_index':
338
+ if (parsed.index) {
339
+ const want = operationType === 'alter_table_add_index' ? 'present' : 'absent';
340
+ return waitForIndex(executor, parsed.database, parsed.table, parsed.index, want, options);
341
+ }
342
+ return waitForTable(executor, parsed.database, parsed.table, options);
343
+ case 'alter_table_drop_column':
344
+ if (parsed.column) {
345
+ return waitForColumnAbsent(executor, parsed.database, parsed.table, parsed.column, options);
346
+ }
347
+ return waitForTable(executor, parsed.database, parsed.table, options);
348
+ case 'alter_table_add_constraint':
349
+ if (parsed.constraint) {
350
+ return waitForConstraint(executor, parsed.database, parsed.table, parsed.constraint, options);
351
+ }
352
+ return waitForTable(executor, parsed.database, parsed.table, options);
353
+ case 'alter_table_drop_constraint':
354
+ if (parsed.constraint) {
355
+ return waitForConstraintAbsent(executor, parsed.database, parsed.table, parsed.constraint, options);
356
+ }
357
+ return waitForTable(executor, parsed.database, parsed.table, options);
124
358
  case 'drop_table':
125
359
  case 'drop_view':
126
360
  case 'drop_materialized_view':
127
361
  case 'drop_dictionary':
128
- return waitForTableAbsent(executor, parsed.database, parsed.table);
362
+ return waitForTableAbsent(executor, parsed.database, parsed.table, options);
129
363
  default:
130
- // alter_table_add_index, alter_table_modify_setting,
364
+ // alter_table_add_projection, alter_table_modify_setting,
131
365
  // alter_materialized_view_modify_refresh, etc.
132
366
  // Wait for the table to exist as a basic sanity check.
133
- return waitForTable(executor, parsed.database, parsed.table);
367
+ return waitForTable(executor, parsed.database, parsed.table, options);
368
+ }
369
+ }
370
+ async function waitForSystemRows(executor, wait, options) {
371
+ const fanout = await resolveReplicaFanout(executor, options?.cluster);
372
+ await pRetry(async () => {
373
+ if (!(await systemRowsMatch(executor, wait, fanout)))
374
+ throw new Error(wait.label);
375
+ }, RETRY_OPTIONS);
376
+ }
377
+ async function dictionaryCatalogVisible(executor, where, fanout) {
378
+ if (!fanout) {
379
+ const rows = await executor.query(`SELECT 1 AS x FROM system.tables WHERE ${where}`);
380
+ return rows.length > 0;
381
+ }
382
+ const rows = await executor.query(`SELECT count(DISTINCT hostName()) AS replicas, (min(uuid) = max(uuid) AND min(uuid) != toUUID('00000000-0000-0000-0000-000000000000') AND count(uuid) = count()) AS agreed FROM ${allReplicas(fanout, 'system.tables')} WHERE ${where}`);
383
+ const replicas = Number(rows[0]?.replicas ?? 0);
384
+ return replicas >= fanout.replicas && isAgreed(rows[0]?.agreed);
385
+ }
386
+ function isAgreed(value) {
387
+ return value === true || value === 1 || value === '1';
388
+ }
389
+ async function systemRowsMatch(executor, wait, fanout) {
390
+ if (!fanout) {
391
+ const rows = await executor.query(`SELECT 1 AS x FROM ${wait.source} WHERE ${wait.where}`);
392
+ return wait.want === 'present' ? rows.length > 0 : rows.length === 0;
393
+ }
394
+ const rows = await executor.query(`SELECT count(DISTINCT hostName()) AS replicas FROM ${allReplicas(fanout, wait.source)} WHERE ${wait.where}`);
395
+ const replicas = Number(rows[0]?.replicas ?? 0);
396
+ return wait.want === 'present' ? replicas >= fanout.replicas : replicas === 0;
397
+ }
398
+ function columnWhere(database, tableName, columnName) {
399
+ return `database = ${stringLiteral(database)} AND table = ${stringLiteral(tableName)} AND name = ${stringLiteral(columnName)}`;
400
+ }
401
+ // ClickHouse writes a constraint name bare when it is a plain identifier and
402
+ // backquoted otherwise (`backQuoteIfNeed`), so match either spelling.
403
+ function constraintWhere(database, tableName, constraintName) {
404
+ const quoted = `\`${constraintName.replace(/\\/g, '\\\\').replace(/`/g, '\\`')}\``;
405
+ const spellings = [`CONSTRAINT ${constraintName} `, `CONSTRAINT ${quoted} `];
406
+ const listed = spellings.map((spelling) => `position(create_table_query, ${stringLiteral(spelling)}) > 0`).join(' OR ');
407
+ return `database = ${stringLiteral(database)} AND name = ${stringLiteral(tableName)} AND (${listed})`;
408
+ }
409
+ /**
410
+ * Polls `check` until it reports no mismatch, with the retry budget of the
411
+ * other waits (21 checks, 500 ms apart) and a hard deadline: chkit's queries
412
+ * have no request timeout, so a check that does not return ends the wait at
413
+ * the deadline instead of holding the migration. On timeout the error names
414
+ * what was still different on the last check.
415
+ */
416
+ async function waitUntilApplied(subject, check) {
417
+ const deadline = Date.now() + DEFINITION_WAIT_DEADLINE_MS;
418
+ let checks = 0;
419
+ let detail = '';
420
+ for (;;) {
421
+ checks += 1;
422
+ const outcome = await checkBefore(check, deadline);
423
+ if (outcome.mismatch === undefined && outcome.failure === undefined)
424
+ return;
425
+ detail = outcome.failure ?? outcome.mismatch ?? '';
426
+ if (checks > RETRY_OPTIONS.retries || Date.now() + RETRY_OPTIONS.minTimeout >= deadline)
427
+ break;
428
+ await new Promise((resolve) => setTimeout(resolve, RETRY_OPTIONS.minTimeout));
429
+ }
430
+ throw new Error(`waitForDDLPropagation: ${subject} not applied on every replica after ${checks} checks: ${detail}`);
431
+ }
432
+ async function checkBefore(check, deadline) {
433
+ let timer;
434
+ const expired = new Promise((resolve) => {
435
+ timer = setTimeout(() => resolve({ failure: `a check did not return within the ${DEFINITION_WAIT_DEADLINE_MS / 1000}s deadline` }), Math.max(deadline - Date.now(), 0));
436
+ });
437
+ try {
438
+ return await Promise.race([
439
+ check().then((mismatch) => ({ mismatch }), (error) => ({ failure: error instanceof Error ? error.message : String(error) })),
440
+ expired,
441
+ ]);
442
+ }
443
+ finally {
444
+ clearTimeout(timer);
445
+ }
446
+ }
447
+ /**
448
+ * The `system.columns` values `intent` pins down. The default expression is
449
+ * formatted by the server; when it cannot be formatted (a server without
450
+ * `formatQuerySingleLine`), the expression is left to the agreement check.
451
+ */
452
+ async function expectedColumnValues(executor, intent) {
453
+ const expected = [];
454
+ if (intent.defaultKind !== undefined)
455
+ expected.push({ field: 'default_kind', value: intent.defaultKind });
456
+ if (intent.defaultKind === '')
457
+ expected.push({ field: 'default_expression', value: '' });
458
+ if (intent.typeDefault)
459
+ expected.push({ field: 'default_expression', value: 'defaultValueOfTypeName(', prefix: true });
460
+ if (intent.comment !== undefined)
461
+ expected.push({ field: 'comment', value: intent.comment });
462
+ if (intent.codecRemoved)
463
+ expected.push({ field: 'compression_codec', value: '' });
464
+ if (intent.defaultExpression !== undefined) {
465
+ const formatted = await formatExpression(executor, intent.defaultExpression);
466
+ if (formatted !== undefined)
467
+ expected.push({ field: 'default_expression', value: formatted });
468
+ }
469
+ return expected;
470
+ }
471
+ async function formatExpression(executor, expression) {
472
+ const select = 'SELECT ';
473
+ try {
474
+ const rows = await executor.query(`SELECT formatQuerySingleLine(${stringLiteral(`${select}${expression}`)}) AS formatted`);
475
+ const formatted = rows[0]?.formatted;
476
+ return formatted?.startsWith(select) ? formatted.slice(select.length) : undefined;
477
+ }
478
+ catch {
479
+ return undefined;
480
+ }
481
+ }
482
+ /**
483
+ * Why the replicas' rows do not show the intended definition yet, or
484
+ * undefined when every replica reports it.
485
+ */
486
+ function columnDefinitionMismatch(rows, replicas, expected) {
487
+ const listed = new Set(rows.map((row) => row.replica));
488
+ if (listed.size < replicas) {
489
+ const where = listed.size > 0 ? ` (${[...listed].join(', ')})` : '';
490
+ return `the column is listed on ${listed.size} of ${replicas} replicas${where}`;
491
+ }
492
+ for (const row of rows) {
493
+ const off = expected.find((want) => !matchesExpected(row[want.field], want));
494
+ if (!off)
495
+ continue;
496
+ const sets = off.prefix ? `${JSON.stringify(off.value)}...` : JSON.stringify(off.value);
497
+ const unanimous = rows.length > 1 && rows.every((other) => other[off.field] === row[off.field]);
498
+ return (`replica ${row.replica} reports ${off.field} ${JSON.stringify(row[off.field])}, the statement sets ${sets}` +
499
+ (unanimous ? '; every replica reports the same, so this is not replication lag: the server accepted the statement without applying it' : ''));
500
+ }
501
+ const [first, ...others] = rows;
502
+ if (!first)
503
+ return undefined;
504
+ for (const row of others) {
505
+ const field = COLUMN_FIELDS.find((name) => row[name] !== first[name]);
506
+ if (field) {
507
+ return `replica ${row.replica} reports ${field} ${JSON.stringify(row[field])}, replica ${first.replica} reports ${JSON.stringify(first[field])}`;
508
+ }
134
509
  }
510
+ return undefined;
135
511
  }
136
- // Object names may contain quotes and backslashes (DDL backtick-quotes them),
137
- // so the names compared against system tables are escaped string literals.
138
- function stringLiteral(value) {
139
- return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
512
+ function matchesExpected(actual, want) {
513
+ return want.prefix ? actual.startsWith(want.value) : actual === want.value;
140
514
  }
141
515
  //# sourceMappingURL=ddl-propagation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ddl-propagation.js","sourceRoot":"","sources":["../src/ddl-propagation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ddl-propagation.js","sourceRoot":"","sources":["../src/ddl-propagation.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,10 @@ export interface LiveEnv {
12
12
  clickhousePassword: string;
13
13
  clickhouseDatabase: string;
14
14
  }
15
- /** The ClickHouse in test/infra/docker-compose.yml, which `infra:up` starts. */
15
+ /**
16
+ * The ClickHouse in test/infra/docker-compose.yml, which `infra:up` starts on
17
+ * CHKIT_TEST_PORT (default 8123).
18
+ */
16
19
  export declare const LOCAL_STACK_ENV: LiveEnv;
17
20
  /**
18
21
  * Reads the ClickHouse target from env vars. Without CLICKHOUSE_URL or
@@ -1 +1 @@
1
- {"version":3,"file":"e2e-testkit.d.ts","sourceRoot":"","sources":["../src/e2e-testkit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,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,gFAAgF;AAChF,eAAO,MAAM,eAAe,EAAE,OAK7B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAepC;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,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAChC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAID,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"e2e-testkit.d.ts","sourceRoot":"","sources":["../src/e2e-testkit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,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,eAAO,MAAM,eAAe,EAAE,OAK7B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAepC;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,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAChC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAID,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,sBAAsB,CAAA"}
@@ -8,9 +8,12 @@
8
8
  import { setTimeout as sleep } from 'node:timers/promises';
9
9
  import { quoteIdentifier } from '@chkit/core';
10
10
  import { createClickHouseExecutor, createStatelessClickHouseExecutor, } from './index.js';
11
- /** The ClickHouse in test/infra/docker-compose.yml, which `infra:up` starts. */
11
+ /**
12
+ * The ClickHouse in test/infra/docker-compose.yml, which `infra:up` starts on
13
+ * CHKIT_TEST_PORT (default 8123).
14
+ */
12
15
  export const LOCAL_STACK_ENV = {
13
- clickhouseUrl: 'http://localhost:8123',
16
+ clickhouseUrl: `http://localhost:${process.env.CHKIT_TEST_PORT?.trim() || '8123'}`,
14
17
  clickhouseUser: 'default',
15
18
  clickhousePassword: 'chkit-ci',
16
19
  clickhouseDatabase: 'default',
@@ -73,9 +76,10 @@ export function createPrefix(label) {
73
76
  return `chkit_e2e_${label}_${Date.now()}_${Math.floor(Math.random() * 100000)}_`;
74
77
  }
75
78
  export function createJournalTableName(label) {
76
- const runTag = process.env.GITHUB_RUN_ID?.trim() ||
77
- `${Date.now()}_${Math.floor(Math.random() * 100000)}`;
78
- return `_chkit_migrations_${label}_${runTag}`;
79
+ // The CI run id alone is not unique: the TS and Python suites run at the same
80
+ // time against one server and share labels, so a random suffix always follows.
81
+ const runTag = process.env.GITHUB_RUN_ID?.trim() || `${Date.now()}`;
82
+ return `_chkit_migrations_${label}_${runTag}_${Math.floor(Math.random() * 100000)}`;
79
83
  }
80
84
  /**
81
85
  * Re-reads `read()` until `predicate` accepts its value or `timeoutMs` elapses.