pipework 0.286.0 → 0.288.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +1 -1
- package/REFERENCE.md +5 -1
- package/dist/async/jobs/claims.d.ts +5 -1
- package/dist/async/jobs/claims.d.ts.map +1 -1
- package/dist/async/jobs/claims.js.map +1 -1
- package/dist/async/jobs/queue.d.ts.map +1 -1
- package/dist/async/jobs/queue.js +3 -3
- package/dist/async/jobs/queue.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +4 -0
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/data/db/namespace.d.ts +1 -1
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/namespace.js +1 -1
- package/dist/data/db/namespace.js.map +1 -1
- package/dist/data/db/query-label.d.ts +15 -1
- package/dist/data/db/query-label.d.ts.map +1 -1
- package/dist/data/db/query-label.js +26 -1
- package/dist/data/db/query-label.js.map +1 -1
- package/dist/data/db/query-watch.js +2 -2
- package/dist/data/db/query-watch.js.map +1 -1
- package/dist/data/migrate/apply.d.ts +16 -0
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +49 -2
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/run.d.ts +9 -0
- package/dist/data/migrate/run.d.ts.map +1 -1
- package/dist/data/migrate/run.js +3 -0
- package/dist/data/migrate/run.js.map +1 -1
- package/dist/data/query/postgres-js/session.d.ts.map +1 -1
- package/dist/data/query/postgres-js/session.js +2 -1
- package/dist/data/query/postgres-js/session.js.map +1 -1
- package/package.json +1 -1
- package/src/async/jobs/claims.ts +3 -1
- package/src/async/jobs/queue.ts +4 -3
- package/src/cli/commands/migrate.ts +6 -0
- package/src/data/db/namespace.ts +1 -1
- package/src/data/db/query-label.ts +28 -1
- package/src/data/db/query-watch.ts +2 -2
- package/src/data/migrate/apply.ts +62 -2
- package/src/data/migrate/run.ts +13 -0
- package/src/data/query/postgres-js/session.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AASA,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjE;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACxG;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;CACjG;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AASA,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjE;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACxG;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5E;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;CACjG;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA2K5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,EAAE,CA8BjE;AAeD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACpD,eAAe,EAAE,MAAM,GACtB,MAAM,CAiBR;AAYD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIvG;AA6BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
|
-
import postgres from 'postgres';
|
|
4
|
-
import { scanStatements } from './statements.js';
|
|
3
|
+
import postgres, {} from 'postgres';
|
|
4
|
+
import { scanStatements, stripComments } from './statements.js';
|
|
5
5
|
import { stripPragmaLines } from './pragma.js';
|
|
6
6
|
import { listMigrations } from './history.js';
|
|
7
7
|
const NO_TRANSACTION_PRAGMA = '-- pipework:no-transaction';
|
|
@@ -114,6 +114,16 @@ export async function applyMigrations(options) {
|
|
|
114
114
|
if (from > 0)
|
|
115
115
|
options.onResume?.(migration.tag, from + 1, migration.statements.length);
|
|
116
116
|
for (let i = from; i < migration.statements.length; i++) {
|
|
117
|
+
// Only the statement the cut interrupted (the first one run on a
|
|
118
|
+
// resume), and only its own index: a cut CREATE INDEX CONCURRENTLY
|
|
119
|
+
// leaves the name held by an INVALID index, which the plain form
|
|
120
|
+
// fails on ("already exists") and IF NOT EXISTS silently keeps.
|
|
121
|
+
// A valid index of that name is left alone. Issue #1003.
|
|
122
|
+
if (i === from && from > 0) {
|
|
123
|
+
const dropped = await dropInvalidIndexOf(client, migration.statements[i]);
|
|
124
|
+
if (dropped !== null)
|
|
125
|
+
options.onDropInvalidIndex?.(migration.tag, i + 1, dropped);
|
|
126
|
+
}
|
|
117
127
|
await inStatement(migration.tag, i + 1, migration.statements.length, () => client.unsafe(migration.statements[i]));
|
|
118
128
|
// Recorded AFTER the statement it describes: marking first would let
|
|
119
129
|
// a death between the mark and the statement skip work silently,
|
|
@@ -221,6 +231,43 @@ export function resumePoint(migration, recorded, migrationsTable) {
|
|
|
221
231
|
// was missed: nothing left to run, and the caller writes the row.
|
|
222
232
|
return Math.min(recorded.done, migration.statements.length);
|
|
223
233
|
}
|
|
234
|
+
const IDENT = String.raw `"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*`;
|
|
235
|
+
const CREATE_INDEX_CONCURRENTLY_RE = new RegExp(String.raw `^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\s+CONCURRENTLY\s+(?:IF\s+NOT\s+EXISTS\s+)?(${IDENT})\s+ON\s+(?:ONLY\s+)?((?:${IDENT})(?:\s*\.\s*(?:${IDENT}))?)`, 'i');
|
|
236
|
+
function unquoteIdent(token) {
|
|
237
|
+
return token.startsWith('"') ? token.slice(1, -1).replace(/""/g, '"') : token.toLowerCase();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The index name and table a CREATE [UNIQUE] INDEX CONCURRENTLY statement
|
|
241
|
+
* names, or null for any other statement (or an unnamed index). The table is
|
|
242
|
+
* kept as written so Postgres resolves it against the search path itself.
|
|
243
|
+
*/
|
|
244
|
+
export function parseCreateIndexConcurrently(statement) {
|
|
245
|
+
const match = CREATE_INDEX_CONCURRENTLY_RE.exec(stripComments(statement));
|
|
246
|
+
if (match === null)
|
|
247
|
+
return null;
|
|
248
|
+
return { index: unquoteIdent(match[1]), table: match[2] };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Drop the INVALID index a cut CREATE INDEX CONCURRENTLY left under the name
|
|
252
|
+
* this statement is about to create, on the statement's own table. Returns the
|
|
253
|
+
* schema-qualified name dropped, or null when the statement is not such a
|
|
254
|
+
* create or the index is absent or valid. Issue #1003.
|
|
255
|
+
*/
|
|
256
|
+
async function dropInvalidIndexOf(client, statement) {
|
|
257
|
+
const target = parseCreateIndexConcurrently(statement);
|
|
258
|
+
if (target === null)
|
|
259
|
+
return null;
|
|
260
|
+
const found = await client.unsafe(`SELECT n.nspname AS schema, c.relname AS name
|
|
261
|
+
FROM pg_index i
|
|
262
|
+
JOIN pg_class c ON c.oid = i.indexrelid
|
|
263
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
264
|
+
WHERE c.relname = $1 AND NOT i.indisvalid AND i.indrelid = to_regclass($2)`, [target.index, target.table]);
|
|
265
|
+
if (found.length === 0)
|
|
266
|
+
return null;
|
|
267
|
+
const qualified = `${quoteIdent(found[0].schema)}.${quoteIdent(found[0].name)}`;
|
|
268
|
+
await client.unsafe(`DROP INDEX CONCURRENTLY IF EXISTS ${qualified}`);
|
|
269
|
+
return qualified;
|
|
270
|
+
}
|
|
224
271
|
function quoteIdent(name) {
|
|
225
272
|
return `"${name.replace(/"/g, '""')}"`;
|
|
226
273
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,20 @@ export interface MigrateResult {
|
|
|
14
14
|
safetyCheck: MigrationCheckResult;
|
|
15
15
|
/** No-transaction files picked up half applied and finished. Issue #378. */
|
|
16
16
|
resumed: ResumedMigration[];
|
|
17
|
+
/** INVALID indexes a cut CREATE INDEX CONCURRENTLY left, dropped before the resumed statement reran. Issue #1003. */
|
|
18
|
+
droppedInvalidIndexes: DroppedInvalidIndex[];
|
|
17
19
|
/** Notices and warnings raised by migration statements, in arrival order. Issue #970. */
|
|
18
20
|
notices: MigrateNotice[];
|
|
19
21
|
/** Trace/audit tables, columns and day partitions this run provisioned. */
|
|
20
22
|
frameworkTables: FrameworkTablesResult;
|
|
21
23
|
}
|
|
24
|
+
export interface DroppedInvalidIndex {
|
|
25
|
+
tag: string;
|
|
26
|
+
/** 1-based statement that rebuilt it. */
|
|
27
|
+
statement: number;
|
|
28
|
+
/** Schema-qualified, quoted. */
|
|
29
|
+
index: string;
|
|
30
|
+
}
|
|
22
31
|
export interface ResumedMigration {
|
|
23
32
|
tag: string;
|
|
24
33
|
/** 1-based statement the rerun started from. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAGlE,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAM/F,MAAM,WAAW,cAAc;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,EAAE,oBAAoB,CAAA;IACjC,4EAA4E;IAC5E,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,yFAAyF;IACzF,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,2EAA2E;IAC3E,eAAe,EAAE,qBAAqB,CAAA;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,KAAK,EAAE,oBAAoB;IAF7C,SAAkB,IAAI,0BAAyB;gBAE7B,KAAK,EAAE,oBAAoB,EAC3C,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAU3G;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAGlE,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAM/F,MAAM,WAAW,cAAc;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,EAAE,oBAAoB,CAAA;IACjC,4EAA4E;IAC5E,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,qHAAqH;IACrH,qBAAqB,EAAE,mBAAmB,EAAE,CAAA;IAC5C,yFAAyF;IACzF,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,2EAA2E;IAC3E,eAAe,EAAE,qBAAqB,CAAA;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,KAAK,EAAE,oBAAoB;IAF7C,SAAkB,IAAI,0BAAyB;gBAE7B,KAAK,EAAE,oBAAoB,EAC3C,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAU3G;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyErI"}
|
package/dist/data/migrate/run.js
CHANGED
|
@@ -48,12 +48,14 @@ export async function migrateOne(instance, dbConfig, options = {}) {
|
|
|
48
48
|
extensionsCreated = [...dbConfig.extensions];
|
|
49
49
|
}
|
|
50
50
|
const resumed = [];
|
|
51
|
+
const droppedInvalidIndexes = [];
|
|
51
52
|
const notices = [];
|
|
52
53
|
const migrationsRun = await applyMigrations({
|
|
53
54
|
migrationsFolder: dbConfig.migrations,
|
|
54
55
|
migrationsTable: dbConfig.migrationTable,
|
|
55
56
|
connectionUrl: dbConfig.url,
|
|
56
57
|
onResume: (tag, fromStatement, totalStatements) => resumed.push({ tag, fromStatement, totalStatements }),
|
|
58
|
+
onDropInvalidIndex: (tag, statement, index) => droppedInvalidIndexes.push({ tag, statement, index }),
|
|
57
59
|
onNotice: (tag, statement, statements, notice) => {
|
|
58
60
|
const full = { tag, statement, statements, ...notice };
|
|
59
61
|
notices.push(full);
|
|
@@ -74,6 +76,7 @@ export async function migrateOne(instance, dbConfig, options = {}) {
|
|
|
74
76
|
extensions: extensionsCreated,
|
|
75
77
|
safetyCheck,
|
|
76
78
|
resumed,
|
|
79
|
+
droppedInvalidIndexes,
|
|
77
80
|
notices,
|
|
78
81
|
frameworkTables,
|
|
79
82
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAA6B,MAAM,YAAY,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAwB,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAA8B,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/data/query/postgres-js/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAkB,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/data/query/postgres-js/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { PgPreparedQuery, PgSession } from '../pg-core/session.js';
|
|
|
6
6
|
import { fillPlaceholders } from '../sql/sql.js';
|
|
7
7
|
import { tracer } from '../tracing.js';
|
|
8
8
|
import { mapResultRow } from '../utils.js';
|
|
9
|
+
import { withLabelComment } from '../../db/query-label.js';
|
|
9
10
|
import { propagateObserved, throughErrorBoundary } from './driver-error-boundary.js';
|
|
10
11
|
function watched(watch, query, run) {
|
|
11
12
|
return watch === undefined ? run(noteSeen) : watch(query, run);
|
|
@@ -13,7 +14,7 @@ function watched(watch, query, run) {
|
|
|
13
14
|
function noteSeen() { }
|
|
14
15
|
/** Starts the statement and tells the watch which pending query it is, so it can learn the connection it runs on. */
|
|
15
16
|
function startUnsafe(client, query, params, seen) {
|
|
16
|
-
const pending = client.unsafe(query, params);
|
|
17
|
+
const pending = client.unsafe(withLabelComment(query), params);
|
|
17
18
|
seen(pending);
|
|
18
19
|
return pending;
|
|
19
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/data/query/postgres-js/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAc,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAKrF,SAAS,OAAO,CAAI,KAAiC,EAAE,KAAa,EAAE,GAAoD;IACzH,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,KAAU,CAAC;AAE5B,qHAAqH;AACrH,SAAS,WAAW,CAAC,MAAW,EAAE,KAAa,EAAE,MAAiB,EAAE,IAA+B;IAClG,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/data/query/postgres-js/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/async/jobs/claims.ts
CHANGED
|
@@ -11,7 +11,7 @@ export type JobClaimReason = 'completed' | 'failed' | 'shutdown-returned' | 'rea
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* One claim of a job. `releasedAt`, `reason` and `progressMark` are null while the claim is held.
|
|
14
|
-
* A failed claim may also carry keys its caller added through `fail(..., { claim })`, such as `errorClass`; they read
|
|
14
|
+
* A reaped claim carries `error: { name: 'WorkerLost', message }`; a failed claim may also carry keys its caller added through `fail(..., { claim })`, such as `errorClass`; they read
|
|
15
15
|
* as `unknown` through a cast (`(claim as Record<string, unknown>)['errorClass']`), since an index signature here
|
|
16
16
|
* would loosen every typed field.
|
|
17
17
|
*/
|
|
@@ -30,6 +30,8 @@ export interface JobClaim {
|
|
|
30
30
|
* `claimErrorMessageMaxChars`; `code` is the error's own string `code`, else the nearest one on its `cause` chain.
|
|
31
31
|
*/
|
|
32
32
|
readonly error?: { readonly name: string; readonly message: string; readonly code?: string }
|
|
33
|
+
/** Why a `later` claim was deferred: the `JobLaterError` message, cut to `claimErrorMessageMaxChars`; set only when `reason` is 'later'. */
|
|
34
|
+
readonly later?: { readonly message: string }
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
/** The SET fragment that appends the claim being made. */
|
package/src/async/jobs/queue.ts
CHANGED
|
@@ -165,7 +165,7 @@ export interface ReapedJob {
|
|
|
165
165
|
|
|
166
166
|
/** Claim keys the queue owns; `FailOptions.claim` may not set them. */
|
|
167
167
|
const RESERVED_CLAIM_KEYS = [
|
|
168
|
-
'claimedAt', 'workerId', 'workerRelease', 'releasedAt', 'reason', 'progressMark', 'error', 'cancel',
|
|
168
|
+
'claimedAt', 'workerId', 'workerRelease', 'releasedAt', 'reason', 'progressMark', 'error', 'cancel', 'later',
|
|
169
169
|
] as const
|
|
170
170
|
|
|
171
171
|
/** Options of `fail` / `failAttempt`. */
|
|
@@ -900,7 +900,8 @@ export function createQueue(config: QueueConfig = {}): Queue {
|
|
|
900
900
|
await lockPendingKeyOf(tx, jobId)
|
|
901
901
|
const updated = await tx.execute(
|
|
902
902
|
sql`UPDATE ${sql.raw(tableQ)} SET
|
|
903
|
-
${returnToPending('later', sql`jsonb_build_object('reason', 'later', 'message', ${error.message}::text, 'workerId', worker_id)
|
|
903
|
+
${returnToPending('later', sql`jsonb_build_object('reason', 'later', 'message', ${error.message}::text, 'workerId', worker_id)`,
|
|
904
|
+
sql`${JSON.stringify({ later: { message: cutText(error.message, claimErrorMaxChars) } })}::jsonb`)},
|
|
904
905
|
next_retry_at = now() + make_interval(secs => ${delayMs / 1000}::double precision),
|
|
905
906
|
claimed_at = NULL,
|
|
906
907
|
heartbeat_at = NULL,
|
|
@@ -1004,7 +1005,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
|
|
|
1004
1005
|
attemptCount,
|
|
1005
1006
|
maxAttempts: jobMaxAttempts,
|
|
1006
1007
|
flow: flowOf(row),
|
|
1007
|
-
}, errorJson, 'reaped-stale', {})
|
|
1008
|
+
}, errorJson, 'reaped-stale', { error: { name: 'WorkerLost', message: cutText('worker lost: heartbeat timeout', claimErrorMaxChars) } })
|
|
1008
1009
|
reaped.push({
|
|
1009
1010
|
jobId: id,
|
|
1010
1011
|
type: row['job_type'] as string,
|
|
@@ -119,6 +119,12 @@ function reportResumed(result: MigrateResult): void {
|
|
|
119
119
|
`${r.totalStatements} — a previous run stopped mid-file.`,
|
|
120
120
|
)
|
|
121
121
|
}
|
|
122
|
+
for (const d of result.droppedInvalidIndexes) {
|
|
123
|
+
warn(
|
|
124
|
+
`${result.database}: resumed "${d.tag}" at statement ${d.statement}; dropped INVALID index ${d.index} ` +
|
|
125
|
+
`left by the cut build.`,
|
|
126
|
+
)
|
|
127
|
+
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
130
|
function reportFrameworkTables(result: MigrateResult): void {
|
package/src/data/db/namespace.ts
CHANGED
|
@@ -38,7 +38,7 @@ export const pipe = Object.assign(getDb, {
|
|
|
38
38
|
/** Query operators and aggregates — eq, gt, lt, and, or, count, sum, etc. */
|
|
39
39
|
filter,
|
|
40
40
|
|
|
41
|
-
/** Names every statement `fn` starts, in `query:slow`, `query:large` and `query:in-flight` log lines (as `label`, beside the `sql` prefix): `pipe.labelled('servable-footprints', async () => await ...)`. A query builder is lazy: `fn` must await it, not return it, or it runs outside the scope. */
|
|
41
|
+
/** Names every statement `fn` starts, in `query:slow`, `query:large` and `query:in-flight` log lines (as `label`, beside the `sql` prefix) and, as a leading block comment on the SQL sent, in `pg_stat_activity.query`, server logs and `pg_stat_statements` text (the comment does not change the statement's queryid). In the comment the label is made safe: comment delimiters are split with a space, control characters become spaces, and it is cut to 80 characters; the log lines carry it as given. `pipe.labelled('servable-footprints', async () => await ...)`. A query builder is lazy: `fn` must await it, not return it, or it runs outside the scope. */
|
|
42
42
|
labelled,
|
|
43
43
|
|
|
44
44
|
/** Raw statement tag — for a statement pipework does not model. Interpolated values are parameters; `sql.raw` is not. Runs on the caller's connection, so inside a request it is the request transaction. Writes still go through pipe.update / insert / delete, which is what audit hooks. */
|
|
@@ -2,7 +2,34 @@ import { AsyncLocalStorage } from 'node:async_hooks'
|
|
|
2
2
|
|
|
3
3
|
const scope = new AsyncLocalStorage<string>()
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
const COMMENT_LABEL_CHARS = 80
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Makes a label safe to sit inside a `/* ... *\/` comment. Postgres block comments nest, so both `*\/`
|
|
9
|
+
* and `/*` are broken apart by a space (repeated, so `*\/*` cannot recombine), control characters
|
|
10
|
+
* (newlines, NUL) become spaces, and the text is cut to 80 characters so it leaves room in
|
|
11
|
+
* `pg_stat_activity.query` (1024 bytes by default). Returns undefined when nothing printable is left.
|
|
12
|
+
*/
|
|
13
|
+
export function commentSafeLabel(label: string): string | undefined {
|
|
14
|
+
let safe = label.replace(/[\u0000-\u001f\u007f\u2028\u2029]+/g, ' ').trim().slice(0, COMMENT_LABEL_CHARS)
|
|
15
|
+
while (/\*\/|\/\*/.test(safe)) safe = safe.replace(/\*\/|\/\*/g, m => `${m[0]!} ${m[1]!}`)
|
|
16
|
+
safe = safe.trim()
|
|
17
|
+
return safe === '' ? undefined : safe
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* `sqlText` with the enclosing `labelled` label as a leading `/* label *\/` comment, so the label shows in
|
|
22
|
+
* `pg_stat_activity.query`, server logs and `pg_stat_statements` text. Unchanged outside a scope.
|
|
23
|
+
* A comment is chosen over `application_name` because it costs no round trip, needs no transaction
|
|
24
|
+
* and does not change `pg_stat_statements`' queryid (which ignores comments), so labels never split a statement's stats.
|
|
25
|
+
*/
|
|
26
|
+
export function withLabelComment(sqlText: string): string {
|
|
27
|
+
const label = scope.getStore()
|
|
28
|
+
const safe = label === undefined ? undefined : commentSafeLabel(label)
|
|
29
|
+
return safe === undefined ? sqlText : `/* ${safe} */ ${sqlText}`
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Runs `fn` with `label` naming every statement it starts, in slow-query and in-flight-query log lines and as a leading SQL comment (see `withLabelComment`). */
|
|
6
33
|
export function labelled<T>(label: string, fn: () => T): T {
|
|
7
34
|
return scope.run(label, fn)
|
|
8
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import postgres from 'postgres'
|
|
2
2
|
import { createHash } from 'node:crypto'
|
|
3
3
|
import { getLogger } from '../../core/logging/logger.js'
|
|
4
|
-
import { currentQueryLabel } from './query-label.js'
|
|
4
|
+
import { currentQueryLabel, withLabelComment } from './query-label.js'
|
|
5
5
|
import { DrizzleQueryError } from '../query/errors.js'
|
|
6
6
|
import { parameterBytes, setOperationArms } from './query-size.js'
|
|
7
7
|
import type { StatementWatch } from '../query/postgres-js/session.js'
|
|
@@ -129,7 +129,7 @@ export function createStatementWatch(options: StatementWatchOptions): StatementW
|
|
|
129
129
|
WHERE datname = current_database() AND pid <> pg_backend_pid() AND state <> 'idle'
|
|
130
130
|
AND (query = $1 OR (length(query) >= ${String(PG_TRUNCATED_QUERY_LENGTH)} AND left($1, length(query)) = query))
|
|
131
131
|
ORDER BY abs(extract(epoch FROM query_start) - $2::float8) LIMIT 1`,
|
|
132
|
-
[sqlText, startedMs / 1000],
|
|
132
|
+
[withLabelComment(sqlText), startedMs / 1000],
|
|
133
133
|
).then(rows => {
|
|
134
134
|
const row = rows[0]
|
|
135
135
|
return row === undefined
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs'
|
|
2
2
|
import { createHash } from 'node:crypto'
|
|
3
|
-
import postgres from 'postgres'
|
|
4
|
-
import { scanStatements } from './statements.js'
|
|
3
|
+
import postgres, { type Sql } from 'postgres'
|
|
4
|
+
import { scanStatements, stripComments } from './statements.js'
|
|
5
5
|
import { stripPragmaLines } from './pragma.js'
|
|
6
6
|
import { listMigrations } from './history.js'
|
|
7
7
|
|
|
@@ -52,6 +52,13 @@ export interface ApplyOptions {
|
|
|
52
52
|
* Issue #378.
|
|
53
53
|
*/
|
|
54
54
|
onResume?: (tag: string, fromStatement: number, total: number) => void
|
|
55
|
+
/**
|
|
56
|
+
* Called when a resumed no-transaction file's first statement is a
|
|
57
|
+
* CREATE [UNIQUE] INDEX CONCURRENTLY whose index was left INVALID by the cut
|
|
58
|
+
* build, after it was dropped and before the statement reruns. `index` is
|
|
59
|
+
* the schema-qualified name. Issue #1003.
|
|
60
|
+
*/
|
|
61
|
+
onDropInvalidIndex?: (tag: string, statement: number, index: string) => void
|
|
55
62
|
/**
|
|
56
63
|
* Called for each notice or warning a migration file's own statement raises,
|
|
57
64
|
* with the file's tag, the 1-based statement and the file's statement count.
|
|
@@ -193,6 +200,15 @@ export async function applyMigrations(options: ApplyOptions): Promise<number> {
|
|
|
193
200
|
if (from > 0) options.onResume?.(migration.tag, from + 1, migration.statements.length)
|
|
194
201
|
|
|
195
202
|
for (let i = from; i < migration.statements.length; i++) {
|
|
203
|
+
// Only the statement the cut interrupted (the first one run on a
|
|
204
|
+
// resume), and only its own index: a cut CREATE INDEX CONCURRENTLY
|
|
205
|
+
// leaves the name held by an INVALID index, which the plain form
|
|
206
|
+
// fails on ("already exists") and IF NOT EXISTS silently keeps.
|
|
207
|
+
// A valid index of that name is left alone. Issue #1003.
|
|
208
|
+
if (i === from && from > 0) {
|
|
209
|
+
const dropped = await dropInvalidIndexOf(client, migration.statements[i]!)
|
|
210
|
+
if (dropped !== null) options.onDropInvalidIndex?.(migration.tag, i + 1, dropped)
|
|
211
|
+
}
|
|
196
212
|
await inStatement(migration.tag, i + 1, migration.statements.length, () => client.unsafe(migration.statements[i]!))
|
|
197
213
|
// Recorded AFTER the statement it describes: marking first would let
|
|
198
214
|
// a death between the mark and the statement skip work silently,
|
|
@@ -327,6 +343,50 @@ export function resumePoint(
|
|
|
327
343
|
return Math.min(recorded.done, migration.statements.length)
|
|
328
344
|
}
|
|
329
345
|
|
|
346
|
+
const IDENT = String.raw`"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*`
|
|
347
|
+
const CREATE_INDEX_CONCURRENTLY_RE = new RegExp(
|
|
348
|
+
String.raw`^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\s+CONCURRENTLY\s+(?:IF\s+NOT\s+EXISTS\s+)?(${IDENT})\s+ON\s+(?:ONLY\s+)?((?:${IDENT})(?:\s*\.\s*(?:${IDENT}))?)`,
|
|
349
|
+
'i',
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
function unquoteIdent(token: string): string {
|
|
353
|
+
return token.startsWith('"') ? token.slice(1, -1).replace(/""/g, '"') : token.toLowerCase()
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* The index name and table a CREATE [UNIQUE] INDEX CONCURRENTLY statement
|
|
358
|
+
* names, or null for any other statement (or an unnamed index). The table is
|
|
359
|
+
* kept as written so Postgres resolves it against the search path itself.
|
|
360
|
+
*/
|
|
361
|
+
export function parseCreateIndexConcurrently(statement: string): { index: string; table: string } | null {
|
|
362
|
+
const match = CREATE_INDEX_CONCURRENTLY_RE.exec(stripComments(statement))
|
|
363
|
+
if (match === null) return null
|
|
364
|
+
return { index: unquoteIdent(match[1]!), table: match[2]! }
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Drop the INVALID index a cut CREATE INDEX CONCURRENTLY left under the name
|
|
369
|
+
* this statement is about to create, on the statement's own table. Returns the
|
|
370
|
+
* schema-qualified name dropped, or null when the statement is not such a
|
|
371
|
+
* create or the index is absent or valid. Issue #1003.
|
|
372
|
+
*/
|
|
373
|
+
async function dropInvalidIndexOf(client: Sql, statement: string): Promise<string | null> {
|
|
374
|
+
const target = parseCreateIndexConcurrently(statement)
|
|
375
|
+
if (target === null) return null
|
|
376
|
+
const found = await client.unsafe<{ schema: string; name: string }[]>(
|
|
377
|
+
`SELECT n.nspname AS schema, c.relname AS name
|
|
378
|
+
FROM pg_index i
|
|
379
|
+
JOIN pg_class c ON c.oid = i.indexrelid
|
|
380
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
381
|
+
WHERE c.relname = $1 AND NOT i.indisvalid AND i.indrelid = to_regclass($2)`,
|
|
382
|
+
[target.index, target.table],
|
|
383
|
+
)
|
|
384
|
+
if (found.length === 0) return null
|
|
385
|
+
const qualified = `${quoteIdent(found[0]!.schema)}.${quoteIdent(found[0]!.name)}`
|
|
386
|
+
await client.unsafe(`DROP INDEX CONCURRENTLY IF EXISTS ${qualified}`)
|
|
387
|
+
return qualified
|
|
388
|
+
}
|
|
389
|
+
|
|
330
390
|
function quoteIdent(name: string): string {
|
|
331
391
|
return `"${name.replace(/"/g, '""')}"`
|
|
332
392
|
}
|
package/src/data/migrate/run.ts
CHANGED
|
@@ -24,12 +24,22 @@ export interface MigrateResult {
|
|
|
24
24
|
safetyCheck: MigrationCheckResult
|
|
25
25
|
/** No-transaction files picked up half applied and finished. Issue #378. */
|
|
26
26
|
resumed: ResumedMigration[]
|
|
27
|
+
/** INVALID indexes a cut CREATE INDEX CONCURRENTLY left, dropped before the resumed statement reran. Issue #1003. */
|
|
28
|
+
droppedInvalidIndexes: DroppedInvalidIndex[]
|
|
27
29
|
/** Notices and warnings raised by migration statements, in arrival order. Issue #970. */
|
|
28
30
|
notices: MigrateNotice[]
|
|
29
31
|
/** Trace/audit tables, columns and day partitions this run provisioned. */
|
|
30
32
|
frameworkTables: FrameworkTablesResult
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
export interface DroppedInvalidIndex {
|
|
36
|
+
tag: string
|
|
37
|
+
/** 1-based statement that rebuilt it. */
|
|
38
|
+
statement: number
|
|
39
|
+
/** Schema-qualified, quoted. */
|
|
40
|
+
index: string
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
export interface ResumedMigration {
|
|
34
44
|
tag: string
|
|
35
45
|
/** 1-based statement the rerun started from. */
|
|
@@ -99,12 +109,14 @@ export async function migrateOne(instance: Manifold, dbConfig: ResolvedDatabase,
|
|
|
99
109
|
}
|
|
100
110
|
|
|
101
111
|
const resumed: ResumedMigration[] = []
|
|
112
|
+
const droppedInvalidIndexes: DroppedInvalidIndex[] = []
|
|
102
113
|
const notices: MigrateNotice[] = []
|
|
103
114
|
const migrationsRun = await applyMigrations({
|
|
104
115
|
migrationsFolder: dbConfig.migrations!,
|
|
105
116
|
migrationsTable: dbConfig.migrationTable,
|
|
106
117
|
connectionUrl: dbConfig.url,
|
|
107
118
|
onResume: (tag, fromStatement, totalStatements) => resumed.push({ tag, fromStatement, totalStatements }),
|
|
119
|
+
onDropInvalidIndex: (tag, statement, index) => droppedInvalidIndexes.push({ tag, statement, index }),
|
|
108
120
|
onNotice: (tag, statement, statements, notice) => {
|
|
109
121
|
const full: MigrateNotice = { tag, statement, statements, ...notice }
|
|
110
122
|
notices.push(full)
|
|
@@ -133,6 +145,7 @@ export async function migrateOne(instance: Manifold, dbConfig: ResolvedDatabase,
|
|
|
133
145
|
extensions: extensionsCreated,
|
|
134
146
|
safetyCheck,
|
|
135
147
|
resumed,
|
|
148
|
+
droppedInvalidIndexes,
|
|
136
149
|
notices,
|
|
137
150
|
frameworkTables,
|
|
138
151
|
}
|
|
@@ -13,6 +13,7 @@ import type { RelationalSchemaConfig, TablesRelationalConfig } from '../relation
|
|
|
13
13
|
import { fillPlaceholders, type Query } from '../sql/sql.js';
|
|
14
14
|
import { tracer } from '../tracing.js';
|
|
15
15
|
import { type Assume, mapResultRow } from '../utils.js';
|
|
16
|
+
import { withLabelComment } from '../../db/query-label.js';
|
|
16
17
|
import { propagateObserved, throughErrorBoundary } from './driver-error-boundary.js';
|
|
17
18
|
|
|
18
19
|
/** Wraps one statement's execution; installed by the pool to time it and report it while it runs. */
|
|
@@ -26,7 +27,7 @@ function noteSeen(): void {}
|
|
|
26
27
|
|
|
27
28
|
/** Starts the statement and tells the watch which pending query it is, so it can learn the connection it runs on. */
|
|
28
29
|
function startUnsafe(client: Sql, query: string, params: unknown[], seen: (pending: object) => void) {
|
|
29
|
-
const pending = client.unsafe(query, params as any[]);
|
|
30
|
+
const pending = client.unsafe(withLabelComment(query), params as any[]);
|
|
30
31
|
seen(pending);
|
|
31
32
|
return pending;
|
|
32
33
|
}
|