@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.
- package/dist/alter-column-statement.d.ts +32 -0
- package/dist/alter-column-statement.d.ts.map +1 -0
- package/dist/alter-column-statement.js +137 -0
- package/dist/alter-column-statement.js.map +1 -0
- package/dist/async-insert-guard.d.ts +31 -0
- package/dist/async-insert-guard.d.ts.map +1 -0
- package/dist/async-insert-guard.js +55 -0
- package/dist/async-insert-guard.js.map +1 -0
- package/dist/create-table-parser.d.ts +3 -0
- package/dist/create-table-parser.d.ts.map +1 -1
- package/dist/create-table-parser.js +18 -0
- package/dist/create-table-parser.js.map +1 -1
- package/dist/ddl-propagation.d.ts +62 -6
- package/dist/ddl-propagation.d.ts.map +1 -1
- package/dist/ddl-propagation.js +420 -46
- package/dist/ddl-propagation.js.map +1 -1
- package/dist/e2e-testkit.d.ts +4 -1
- package/dist/e2e-testkit.d.ts.map +1 -1
- package/dist/e2e-testkit.js +9 -5
- package/dist/e2e-testkit.js.map +1 -1
- package/dist/exact-json.d.ts +27 -0
- package/dist/exact-json.d.ts.map +1 -0
- package/dist/exact-json.js +128 -0
- package/dist/exact-json.js.map +1 -0
- package/dist/index.d.ts +32 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +177 -60
- package/dist/index.js.map +1 -1
- package/dist/insert-barrier.d.ts +32 -0
- package/dist/insert-barrier.d.ts.map +1 -0
- package/dist/insert-barrier.js +57 -0
- package/dist/insert-barrier.js.map +1 -0
- package/dist/replicas.d.ts +21 -0
- package/dist/replicas.d.ts.map +1 -0
- package/dist/replicas.js +39 -0
- package/dist/replicas.js.map +1 -0
- package/dist/view-details.d.ts +30 -0
- package/dist/view-details.d.ts.map +1 -0
- package/dist/view-details.js +73 -0
- package/dist/view-details.js.map +1 -0
- package/package.json +5 -2
package/dist/ddl-propagation.js
CHANGED
|
@@ -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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
},
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
},
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
},
|
|
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
|
|
100
|
-
return {
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
137
|
-
|
|
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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"}
|
package/dist/e2e-testkit.d.ts
CHANGED
|
@@ -12,7 +12,10 @@ export interface LiveEnv {
|
|
|
12
12
|
clickhousePassword: string;
|
|
13
13
|
clickhouseDatabase: string;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
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
|
|
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"}
|
package/dist/e2e-testkit.js
CHANGED
|
@@ -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
|
-
/**
|
|
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:
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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.
|