pipework 0.293.0 → 0.294.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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.294.0
4
+
5
+ - **Fixed: `pipework migrate` repairs the INVALID indexes its own migrations made, and reports the rest** (#1005). A cut `CREATE INDEX CONCURRENTLY` leaves an INVALID index under its name. #1003 dropped it only when a file resumed at that statement, so a cut in a no-transaction file's first statement left no progress mark, the rerun started at 0, and the INVALID index was kept and the file recorded applied (under `IF NOT EXISTS`). Now `migrate` drops an INVALID index of that name before every `CREATE [UNIQUE] INDEX CONCURRENTLY` of a no-transaction file, and refuses to record such a file applied while an index it built is INVALID (the rerun rebuilds it). For damage already in a database, after a run that finishes without error, `migrate` reads every INVALID index and: (a) drops an index an applied migration owns and reruns that migration's own `CREATE` statement, the same repair as #1003, and fails migrate (`InvalidIndexRepairError`, naming the cause, e.g. the duplicate key; the next run does the same, and a pending migration that removes the duplicates runs first) when it cannot be made VALID, the only new non-zero exit; (b) drops a `_ccnew[N]` / `_ccold[N]` leftover whose counterpart, found in the catalog, is an owned VALID index; (c) leaves anything else alone and warns with the `REINDEX INDEX CONCURRENTLY` / `DROP INDEX CONCURRENTLY` statements its owner can run. Indexes on a table with a build running in another session, partitioned parent indexes, extension-owned and system indexes are skipped. `MigrateResult.invalidIndexes` lists each with its case, action, outcome and the printed statements; `invalidIndexReadError` is set when the catalog read failed. `migrate` now holds one session advisory lock per database for the whole run, so a second run at once waits and then finds nothing to apply. `onDropInvalidIndex` / `droppedInvalidIndexes` now also fire for a drop before a first-run build, and the CLI line changes from `resumed "<tag>" at statement N; dropped ...` to `"<tag>" statement N: dropped INVALID index ... before building it again`. An index too big for a deploy window fails that deploy on its first run on this version, like any `CREATE INDEX CONCURRENTLY` migration; run migrate outside the window.
6
+
3
7
  ## 0.293.0
4
8
 
5
9
  - **Fixed: a handler reply that fails its own output schema answers 500 `OUTPUT_VALIDATION_ERROR`, not 422** (#1021). A route whose handler returned something its declared `.output()` schema refuses (an extra key on a `.strict()` object, a union that lacks the returned branch, a `{ status, body }` whose body fails that status's schema) answered 422 `VALIDATION_ERROR` "Invalid input", blaming a caller whose input was valid, so an agent retried with changed input. It now answers 500 `{ error: { code: 'OUTPUT_VALIDATION_ERROR', message } }`, and the server logs `Handler reply failed its output schema` at error level with the route, the request id and each failing path with the schema's message (never the value), and runs `onInternalError` once. The body carries the failing paths under `error.details.issues` only when `exposeErrorDetails` is on. 422 stays for input that fails the input schema. New `OutputValidationError` (`errors.OutputValidation`, exported from the root) carries the issues; `'response'` is no longer a `ValidationSource`. A job whose handler fails its output schema now fails with `OUTPUT_VALIDATION_ERROR`; job retry is unchanged. A union failure is flattened into its branches' issues, each with its full path (the union's own path prefixed), so the log names the field, for example `kind`.
package/REFERENCE.md CHANGED
@@ -920,6 +920,15 @@ An applied migration is immutable: a changed file is refused. The one exception
920
920
 
921
921
  A no-transaction file whose `CREATE INDEX CONCURRENTLY` is cut off (client killed, timeout, lost connection) leaves an INVALID index holding the name, and the progress row keeps the file half applied. When the next run resumes at that statement and it is a `CREATE [UNIQUE] INDEX CONCURRENTLY [IF NOT EXISTS] <name> ON <table>`, `migrate` first looks in `pg_index` for an INVALID index of that name on that table (schema resolved from the table as written, search path included) and, if there is one, runs `DROP INDEX CONCURRENTLY IF EXISTS <schema>.<name>`, then reruns the statement. Only the resumed statement's own index is touched, and a VALID index of that name is left alone (the plain form then fails with "already exists" as before). `MigrateResult.droppedInvalidIndexes` (`{ tag, statement, index }`) and `applyMigrations`'s `onDropInvalidIndex` report it, and the CLI prints `resumed "<tag>" at statement N; dropped INVALID index <name> left by the cut build.` A `pg_dump --schema-only` copy omits invalid indexes, so a dry run on one does not show this case.
922
922
 
923
+ Before every `CREATE [UNIQUE] INDEX CONCURRENTLY` of a no-transaction file (not only a resumed one) `migrate` drops an INVALID index of that name on that table, and it does not record such a file applied while an index the file built is INVALID (the progress mark goes back to that statement, so the rerun rebuilds it).
924
+
925
+ `migrate` holds one session advisory lock per database for the whole run; a second run at once waits, then finds nothing to apply.
926
+
927
+ After a run that finishes without error, `migrate` reads every INVALID index in the database (`pg_index WHERE NOT indisvalid`), except those on a table with a build running in another session (`pg_stat_progress_create_index`), partitioned parent indexes, extension-owned indexes and system schemas, and reports each in `MigrateResult.invalidIndexes` (`{ case, index, table, action, outcome, tag?, statement?, printed, reason? }`):
928
+ - (a) An index an applied migration owns (its schema-qualified name and table match a `CREATE [UNIQUE] INDEX` in an applied file, the latest winning, and no later applied file drops it) is dropped (`DROP INDEX CONCURRENTLY`, with a 30 s `lock_timeout`) and rebuilt with that migration's own `CREATE` statement. If the rebuild fails (for example duplicate rows under a UNIQUE index) `migrate` throws `InvalidIndexRepairError` naming the cause, and the next run does the same; a pending migration that removes the duplicates runs first, so the repair then passes. This is the only case that changes the exit code.
929
+ - (b) A `<name>_ccnew[N]` or `<name>_ccold[N]` leftover of a cut `REINDEX CONCURRENTLY`, whose counterpart (the one index on the table with the same definition, found in the catalog) is an owned, VALID index, is dropped.
930
+ - (c) Anything else (made by hand, by another tool, an unnamed cut build, a leftover of an index no migration owns) is left alone and warned about, with the `REINDEX INDEX CONCURRENTLY` and `DROP INDEX CONCURRENTLY` statements its owner can run (only the drop for a leftover whose counterpart is VALID). `invalidIndexReadError` is set when the catalog read failed and nothing was checked.
931
+
923
932
  ### `pipe.migrateOne`
924
933
 
925
934
  Runs migrations for a single named database.
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAG7E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC,GAAG,MAAM,GAAG,IAAI,CAmBhB;AA6BD,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAQrD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAElD"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAG7E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC,GAAG,MAAM,GAAG,IAAI,CAmBhB;AA4CD,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAQrD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAElD"}
@@ -92,8 +92,23 @@ function reportResumed(result) {
92
92
  `${r.totalStatements} — a previous run stopped mid-file.`);
93
93
  }
94
94
  for (const d of result.droppedInvalidIndexes) {
95
- warn(`${result.database}: resumed "${d.tag}" at statement ${d.statement}; dropped INVALID index ${d.index} ` +
96
- `left by the cut build.`);
95
+ warn(`${result.database}: "${d.tag}" statement ${d.statement}: dropped INVALID index ${d.index} ` +
96
+ `left by a cut build before building it again.`);
97
+ }
98
+ for (const i of result.invalidIndexes) {
99
+ if (i.case === 'a' && i.outcome === 'repaired') {
100
+ warn(`${result.database}: rebuilt INVALID index ${i.index} with the statement from "${i.tag}".`);
101
+ }
102
+ else if (i.case === 'b' && i.outcome === 'repaired') {
103
+ warn(`${result.database}: dropped INVALID leftover ${i.index}; ${i.reason}.`);
104
+ }
105
+ else {
106
+ warn(`${result.database}: INVALID index ${i.index} on ${i.table} was left alone: ${i.reason}. ` +
107
+ `Its owner can run: ${i.printed.join(' ; ')}`);
108
+ }
109
+ }
110
+ if (result.invalidIndexReadError !== null) {
111
+ warn(`${result.database}: could not check for INVALID indexes: ${result.invalidIndexReadError}`);
97
112
  }
98
113
  }
99
114
  function reportFrameworkTables(result) {
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAA;AAUlF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA8B;IAC1D,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAA;IACtF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IAClG,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;IAEzE,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,QAAQ,CACN,2DAA2D;YAC3D,wCAAwC,CACzC,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC7C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,QAAQ,CAAC,SAAS,CAAC,CAAA;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAEpD,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7E,QAAQ,CACN,iEAAiE;YACjE,oFAAoF;YACpF,qCAAqC,CACtC,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QACjD,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;IAEhD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,uBAAuB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;YAC/F,aAAa,CAAC,MAAM,CAAC,CAAA;YACrB,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAC7B,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,aAAa,qBAAqB,CAAC,CAAA;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,4BAA4B,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;YAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,aAAa,CAAC,MAAM,CAAC,CAAA;gBACrB,qBAAqB,CAAC,MAAM,CAAC,CAAA;gBAC7B,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,aAAa,qBAAqB,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC3C,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;IAChC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAGlC;IACC,MAAM,IAAI,GAAG;QACX,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI;QAChE,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI;KAC/D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;IAExC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAElC,OAAO,CACL,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,0BAA0B;QACjF,qEAAqE;QACrE,uEAAuE;QACvE,wEAAwE;QACxE,uBAAuB;QACvB,uEAAuE;QACvE,gEAAgE;QAChE,sCAAsC;QACtC,2CAA2C,CAC5C,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,SAAS,aAAa,CAAC,MAAqB;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CACF,GAAG,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,aAAa,MAAM;YAC9E,GAAG,CAAC,CAAC,eAAe,qCAAqC,CAC1D,CAAA;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC7C,IAAI,CACF,GAAG,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,SAAS,2BAA2B,CAAC,CAAC,KAAK,GAAG;YACvG,wBAAwB,CACzB,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAqB;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAA;IAChC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAAE,OAAM;IACtC,IAAI,CACF,GAAG,MAAM,CAAC,QAAQ,8BAA8B,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC1G,iBAAiB,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACrF,GAAG,CAAC,CAAC,iBAAiB,CAAC,MAAM,yBAAyB,CACvD,CAAA;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,YAAY,CAAC,CAAgB;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;QAC9G,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtB,IAAI,GAAG,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,OAAO,IAAI,CAAA;IAC3F,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,IAAI,eAAe,CAAC,CAAC,MAAM,IAAI,CAAA;IAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,IAAI,CAAA;IACxD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAgB;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,14 @@ export declare function parseCreateIndexConcurrently(statement: string): {
99
99
  index: string;
100
100
  table: string;
101
101
  } | null;
102
+ /**
103
+ * Like `parseCreateIndexConcurrently`, for a CREATE [UNIQUE] INDEX with or
104
+ * without CONCURRENTLY. Null for any other statement or an unnamed index.
105
+ */
106
+ export declare function parseCreateIndex(statement: string): {
107
+ index: string;
108
+ table: string;
109
+ } | null;
102
110
  /**
103
111
  * Rewrite every `CREATE TABLE` (including the `IF NOT EXISTS` form) to
104
112
  * `CREATE UNLOGGED TABLE`. Used only when applying schema to a test database —
@@ -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;;;;;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
+ {"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,CA+L5E;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;AAgBD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIvG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI3F;AAuCD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -114,16 +114,15 @@ 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
+ // Before every CREATE INDEX CONCURRENTLY, not only a resumed one: a
118
+ // cut build leaves the name held by an INVALID index, which the plain
119
+ // form fails on ("already exists") and IF NOT EXISTS silently keeps,
120
+ // and a cut in a file's first statement leaves no progress mark, so
121
+ // the rerun starts at 0. Only the statement's own index; a VALID
122
+ // index of that name is left alone. Issues #1003, #1005.
123
+ const dropped = await dropInvalidIndexOf(client, migration.statements[i]);
124
+ if (dropped !== null)
125
+ options.onDropInvalidIndex?.(migration.tag, i + 1, dropped);
127
126
  await inStatement(migration.tag, i + 1, migration.statements.length, () => client.unsafe(migration.statements[i]));
128
127
  // Recorded AFTER the statement it describes: marking first would let
129
128
  // a death between the mark and the statement skip work silently,
@@ -134,6 +133,23 @@ export async function applyMigrations(options) {
134
133
  ON CONFLICT (tag) DO UPDATE SET statements_done = EXCLUDED.statements_done, updated_at = now()`, [migration.tag, migration.hash, i + 1]);
135
134
  options.onStatement?.(migration.tag, i + 1, migration.statements.length, applied + 1, migrations.length);
136
135
  }
136
+ // Never record a file applied while an index it built is INVALID.
137
+ // The progress mark goes back to that statement, so the rerun drops
138
+ // the index and builds it again. Issue #1005.
139
+ for (const [i, statement] of migration.statements.entries()) {
140
+ // Only builds the rerun can repair: `CREATE INDEX ... ON ONLY parent` is
141
+ // INVALID until every partition's index attaches, and no rerun fixes that.
142
+ const target = parseCreateIndexConcurrently(statement);
143
+ if (target === null)
144
+ continue;
145
+ if (await isInvalidIndex(client, target)) {
146
+ await client.unsafe(`INSERT INTO ${progress} (tag, hash, statements_done) VALUES ($1, $2, $3)
147
+ ON CONFLICT (tag) DO UPDATE SET statements_done = EXCLUDED.statements_done, updated_at = now()`, [migration.tag, migration.hash, i]);
148
+ throw new Error(`Migration "${migration.tag}" statement ${i + 1} built index ${target.index} on ${target.table}, ` +
149
+ `but the index is INVALID, so the migration is not recorded as applied. The next run drops it ` +
150
+ `and builds it again.`);
151
+ }
152
+ }
137
153
  await client.unsafe(`INSERT INTO ${table} ("hash", "created_at", "tag") VALUES ($1, $2, $3)`, [migration.hash, migration.folderMillis, migration.tag]);
138
154
  await client.unsafe(`DELETE FROM ${progress} WHERE tag = $1`, [migration.tag]);
139
155
  }
@@ -232,6 +248,7 @@ export function resumePoint(migration, recorded, migrationsTable) {
232
248
  return Math.min(recorded.done, migration.statements.length);
233
249
  }
234
250
  const IDENT = String.raw `"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*`;
251
+ const CREATE_INDEX_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');
235
252
  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
253
  function unquoteIdent(token) {
237
254
  return token.startsWith('"') ? token.slice(1, -1).replace(/""/g, '"') : token.toLowerCase();
@@ -247,6 +264,22 @@ export function parseCreateIndexConcurrently(statement) {
247
264
  return null;
248
265
  return { index: unquoteIdent(match[1]), table: match[2] };
249
266
  }
267
+ /**
268
+ * Like `parseCreateIndexConcurrently`, for a CREATE [UNIQUE] INDEX with or
269
+ * without CONCURRENTLY. Null for any other statement or an unnamed index.
270
+ */
271
+ export function parseCreateIndex(statement) {
272
+ const match = CREATE_INDEX_RE.exec(stripComments(statement));
273
+ if (match === null)
274
+ return null;
275
+ return { index: unquoteIdent(match[1]), table: match[2] };
276
+ }
277
+ /** True when an index of this name on this table exists and is INVALID. */
278
+ async function isInvalidIndex(client, target) {
279
+ const found = await client.unsafe(`SELECT 1 AS one FROM pg_index i JOIN pg_class c ON c.oid = i.indexrelid
280
+ WHERE c.relname = $1 AND NOT i.indisvalid AND i.indrelid = to_regclass($2)`, [target.index, target.table]);
281
+ return found.length > 0;
282
+ }
250
283
  /**
251
284
  * Drop the INVALID index a cut CREATE INDEX CONCURRENTLY left under the name
252
285
  * this statement is about to create, on the statement's own table. Returns the
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { migrateAll, migrateOne, UnsafeMigrationError, type MigrateResult, type MigrateOptions } from './run.js';
1
+ export { migrateAll, migrateOne, UnsafeMigrationError, InvalidIndexRepairError, type InvalidIndex, type MigrateResult, type MigrateOptions } from './run.js';
2
2
  export { checkMigrations, formatCheckResult, type MigrationCheckResult, type FileHazards, type MigrationHazard, type Severity } from './check.js';
3
3
  export { hasPragma, PRAGMA_FOR, type PragmaKind } from './pragma.js';
4
4
  export { readAppliedState, type AppliedState } from './applied.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAC5J,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA"}
@@ -1,4 +1,4 @@
1
- export { migrateAll, migrateOne, UnsafeMigrationError } from './run.js';
1
+ export { migrateAll, migrateOne, UnsafeMigrationError, InvalidIndexRepairError } from './run.js';
2
2
  export { checkMigrations, formatCheckResult } from './check.js';
3
3
  export { hasPragma, PRAGMA_FOR } from './pragma.js';
4
4
  export { readAppliedState } from './applied.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAA2C,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAoF,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAuB,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,uBAAuB,EAA8D,MAAM,UAAU,CAAA;AAC5J,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAoF,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAuB,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * What migrate does with an INVALID index met in a database it migrated.
3
+ * Issue #1005.
4
+ *
5
+ * - `a`: an index a migration owns. Dropped and rebuilt with the migration's
6
+ * own CREATE statement.
7
+ * - `b`: a `_ccnew` / `_ccold` leftover of an owned index whose counterpart is
8
+ * VALID. Dropped.
9
+ * - `c`: anything else. Nothing is touched; the statements to run are printed.
10
+ */
11
+ export interface InvalidIndex {
12
+ case: 'a' | 'b' | 'c';
13
+ /** Schema-qualified, quoted. */
14
+ index: string;
15
+ /** Schema-qualified, quoted. */
16
+ table: string;
17
+ /** What migrate did: rebuilt (a), dropped the leftover (b), or nothing (c). */
18
+ action: 'rebuilt' | 'dropped' | 'none';
19
+ outcome: 'repaired' | 'failed' | 'warned';
20
+ /** For (a): the tag of the migration whose CREATE was rerun. */
21
+ tag?: string;
22
+ /** For (a): the statement rerun. */
23
+ statement?: string;
24
+ /** For (c) and a failed (a): the statements its owner can run. */
25
+ printed: string[];
26
+ /** Why migrate left it alone, or what failed. */
27
+ reason?: string;
28
+ }
29
+ export interface InvalidIndexReport {
30
+ indexes: InvalidIndex[];
31
+ /** Set when the catalog read failed; nothing was checked. */
32
+ readError: string | null;
33
+ }
34
+ export declare class InvalidIndexRepairError extends Error {
35
+ readonly indexes: InvalidIndex[];
36
+ readonly name = "InvalidIndexRepairError";
37
+ constructor(indexes: InvalidIndex[], message: string);
38
+ }
39
+ export interface RepairOptions {
40
+ migrationsFolder: string;
41
+ migrationsTable: string;
42
+ connectionUrl: string;
43
+ }
44
+ /**
45
+ * Repair the INVALID indexes the applied migrations made, and report the rest.
46
+ * Called once per database after `applyMigrations` finished without error,
47
+ * while the run's advisory lock is held. Throws `InvalidIndexRepairError` when
48
+ * an owned index cannot be made VALID. Issue #1005.
49
+ */
50
+ export declare function repairInvalidIndexes(options: RepairOptions): Promise<InvalidIndexReport>;
51
+ //# sourceMappingURL=invalid-indexes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-indexes.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/invalid-indexes.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACrB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACtC,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACzC,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,OAAO,EAAE,YAAY,EAAE;IAFzC,SAAkB,IAAI,6BAA4B;gBAEhC,OAAO,EAAE,YAAY,EAAE,EACvC,OAAO,EAAE,MAAM;CAIlB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;CACtB;AA4GD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgI9F"}
@@ -0,0 +1,219 @@
1
+ import postgres, {} from 'postgres';
2
+ import { stripComments } from './statements.js';
3
+ import { parseCreateIndex, readMigrations } from './apply.js';
4
+ export class InvalidIndexRepairError extends Error {
5
+ indexes;
6
+ name = 'InvalidIndexRepairError';
7
+ constructor(indexes, message) {
8
+ super(message);
9
+ this.indexes = indexes;
10
+ }
11
+ }
12
+ const LOCK_TIMEOUT = '30s';
13
+ const LEFTOVER_RE = /_cc(?:new|old)\d*$/;
14
+ const IDENT = String.raw `"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*`;
15
+ const DROP_INDEX_RE = new RegExp(String.raw `^\s*DROP\s+INDEX\s+(?:CONCURRENTLY\s+)?(?:IF\s+EXISTS\s+)?((?:(?:${IDENT})(?:\s*\.\s*(?:${IDENT}))?\s*,?\s*)+)`, 'i');
16
+ function quoteIdent(name) {
17
+ return `"${name.replace(/"/g, '""')}"`;
18
+ }
19
+ function unquoteIdent(token) {
20
+ return token.startsWith('"') ? token.slice(1, -1).replace(/""/g, '"') : token.toLowerCase();
21
+ }
22
+ /** The (schema?, name) pairs a DROP INDEX statement names; empty for any other statement. */
23
+ function parseDropIndex(statement) {
24
+ const match = DROP_INDEX_RE.exec(stripComments(statement));
25
+ if (match === null)
26
+ return [];
27
+ const tokens = match[1].match(new RegExp(`(?:${IDENT})(?:\\s*\\.\\s*(?:${IDENT}))?`, 'g')) ?? [];
28
+ return tokens.map((token) => {
29
+ const parts = token.match(new RegExp(IDENT, 'g'));
30
+ return parts.length === 2
31
+ ? { schema: unquoteIdent(parts[0]), name: unquoteIdent(parts[1]) }
32
+ : { schema: null, name: unquoteIdent(parts[0]) };
33
+ });
34
+ }
35
+ /** An index definition with its own name removed, so a leftover compares equal to its counterpart. */
36
+ function nameless(def) {
37
+ return def.replace(/^(CREATE (?:UNIQUE )?INDEX )(?:"(?:[^"]|"")+"|\S+)( ON )/, '$1$2');
38
+ }
39
+ const INVALID_INDEXES = `
40
+ SELECT i.indexrelid::text AS oid, i.indrelid::text AS "tableOid", n.nspname AS schema, c.relname AS name,
41
+ tn.nspname AS "tableSchema", t.relname AS "table", pg_get_indexdef(i.indexrelid) AS def
42
+ FROM pg_index i
43
+ JOIN pg_class c ON c.oid = i.indexrelid
44
+ JOIN pg_namespace n ON n.oid = c.relnamespace
45
+ JOIN pg_class t ON t.oid = i.indrelid
46
+ JOIN pg_namespace tn ON tn.oid = t.relnamespace
47
+ WHERE NOT i.indisvalid
48
+ AND c.relkind = 'i'
49
+ AND n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\_%'
50
+ AND NOT EXISTS (SELECT 1 FROM pg_depend d
51
+ WHERE d.classid = 'pg_class'::regclass AND d.objid = i.indexrelid AND d.deptype = 'e')
52
+ AND NOT EXISTS (SELECT 1 FROM pg_stat_progress_create_index p WHERE p.relid = i.indrelid)
53
+ ORDER BY n.nspname, c.relname`;
54
+ async function building(client, tableOid) {
55
+ const rows = await client.unsafe(`SELECT 1 FROM pg_stat_progress_create_index WHERE relid = $1::oid`, [tableOid]);
56
+ return rows.length > 0;
57
+ }
58
+ /** The applied migrations' CREATE INDEX statements that still stand, keyed by table oid and index name. */
59
+ async function ownedIndexes(client, options) {
60
+ const applied = new Set((await client.unsafe(`SELECT tag FROM ${quoteIdent(options.migrationsTable)} WHERE tag IS NOT NULL`)).map((r) => r.tag));
61
+ const owned = new Map();
62
+ for (const migration of readMigrations(options)) {
63
+ if (!applied.has(migration.tag))
64
+ continue;
65
+ for (const statement of migration.statements) {
66
+ const create = parseCreateIndex(statement);
67
+ if (create !== null) {
68
+ const [table] = await client.unsafe(`SELECT c.oid::text AS oid, n.nspname AS schema FROM pg_class c
69
+ JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.oid = to_regclass($1)`, [create.table]);
70
+ if (table !== undefined)
71
+ owned.set(`${table.oid}:${create.index}`, { tag: migration.tag, statement, schema: table.schema });
72
+ continue;
73
+ }
74
+ for (const dropped of parseDropIndex(statement)) {
75
+ for (const [key, owner] of owned) {
76
+ if (key.endsWith(`:${dropped.name}`) && (dropped.schema === null || dropped.schema === owner.schema)) {
77
+ owned.delete(key);
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return owned;
84
+ }
85
+ /**
86
+ * Repair the INVALID indexes the applied migrations made, and report the rest.
87
+ * Called once per database after `applyMigrations` finished without error,
88
+ * while the run's advisory lock is held. Throws `InvalidIndexRepairError` when
89
+ * an owned index cannot be made VALID. Issue #1005.
90
+ */
91
+ export async function repairInvalidIndexes(options) {
92
+ const client = postgres(options.connectionUrl, { max: 1, onnotice: () => { } });
93
+ try {
94
+ let rows;
95
+ let owned;
96
+ try {
97
+ rows = await client.unsafe(INVALID_INDEXES);
98
+ owned = rows.length === 0 ? new Map() : await ownedIndexes(client, options);
99
+ }
100
+ catch (err) {
101
+ return { indexes: [], readError: err instanceof Error ? err.message : String(err) };
102
+ }
103
+ const qualified = (schema, name) => `${quoteIdent(schema)}.${quoteIdent(name)}`;
104
+ const results = [];
105
+ const failures = [];
106
+ const ownedKey = (r) => `${r.tableOid}:${r.name}`;
107
+ const printed = (r, rebuild) => [
108
+ ...(rebuild ? [`REINDEX INDEX CONCURRENTLY ${qualified(r.schema, r.name)}`] : []),
109
+ `DROP INDEX CONCURRENTLY ${qualified(r.schema, r.name)}`,
110
+ ];
111
+ // (a) owned: drop and rerun the migration's own CREATE.
112
+ const leftovers = [];
113
+ for (const row of rows) {
114
+ const owner = owned.get(ownedKey(row));
115
+ if (owner === undefined) {
116
+ if (LEFTOVER_RE.test(row.name))
117
+ leftovers.push(row);
118
+ else {
119
+ results.push({
120
+ case: 'c', index: qualified(row.schema, row.name), table: qualified(row.tableSchema, row.table),
121
+ action: 'none', outcome: 'warned', printed: printed(row, true),
122
+ reason: 'no applied migration owns this index',
123
+ });
124
+ }
125
+ continue;
126
+ }
127
+ // Another session may have started a build on the table since the read.
128
+ if (await building(client, row.tableOid))
129
+ continue;
130
+ const entry = {
131
+ case: 'a', index: qualified(row.schema, row.name), table: qualified(row.tableSchema, row.table),
132
+ action: 'rebuilt', outcome: 'repaired', tag: owner.tag, statement: owner.statement, printed: [],
133
+ };
134
+ try {
135
+ await client.unsafe(`SET lock_timeout = '${LOCK_TIMEOUT}'`);
136
+ try {
137
+ await client.unsafe(`DROP INDEX CONCURRENTLY IF EXISTS ${entry.index}`);
138
+ }
139
+ finally {
140
+ await client.unsafe('RESET lock_timeout');
141
+ }
142
+ await client.unsafe(owner.statement);
143
+ }
144
+ catch (err) {
145
+ const detail = err instanceof Error ? err.message : String(err);
146
+ const extra = err.detail;
147
+ entry.outcome = 'failed';
148
+ entry.reason = typeof extra === 'string' ? `${detail} (${extra})` : detail;
149
+ entry.printed = printed(row, true);
150
+ failures.push(`${entry.index} (rerunning "${owner.tag}"): ${entry.reason}`);
151
+ }
152
+ results.push(entry);
153
+ }
154
+ // (b) / (c) leftovers, classified against the table's indexes as they stand after (a).
155
+ const byTable = new Map();
156
+ for (const row of leftovers) {
157
+ if (!byTable.has(row.tableOid)) {
158
+ byTable.set(row.tableOid, await client.unsafe(`SELECT c.relname AS name, n.nspname AS schema, i.indisvalid AS valid, pg_get_indexdef(i.indexrelid) AS def
159
+ FROM pg_index i JOIN pg_class c ON c.oid = i.indexrelid
160
+ JOIN pg_namespace n ON n.oid = c.relnamespace WHERE i.indrelid = $1::oid`, [row.tableOid]));
161
+ }
162
+ }
163
+ for (const row of leftovers) {
164
+ const own = nameless(row.def);
165
+ const matches = byTable.get(row.tableOid).filter((o) => o.name !== row.name && nameless(o.def) === own);
166
+ const counterpart = matches.length === 1 ? matches[0] : undefined;
167
+ const base = { index: qualified(row.schema, row.name), table: qualified(row.tableSchema, row.table) };
168
+ if (counterpart === undefined) {
169
+ results.push({
170
+ case: 'c', ...base, action: 'none', outcome: 'warned', printed: printed(row, true),
171
+ reason: matches.length === 0
172
+ ? 'a leftover of an index build or rebuild, and no index on the table matches it'
173
+ : 'a leftover of an index build or rebuild, and more than one index on the table matches it',
174
+ });
175
+ continue;
176
+ }
177
+ const counterpartOwned = owned.has(`${row.tableOid}:${counterpart.name}`);
178
+ if (!counterpartOwned || !counterpart.valid) {
179
+ results.push({
180
+ case: 'c', ...base, action: 'none', outcome: 'warned', printed: printed(row, !counterpart.valid),
181
+ reason: counterpartOwned
182
+ ? `a leftover of ${qualified(counterpart.schema, counterpart.name)}, which is not valid`
183
+ : `a leftover of ${qualified(counterpart.schema, counterpart.name)}, which no applied migration owns`,
184
+ });
185
+ continue;
186
+ }
187
+ if (await building(client, row.tableOid))
188
+ continue;
189
+ const entry = { case: 'b', ...base, action: 'dropped', outcome: 'repaired', printed: [],
190
+ reason: `a leftover of ${qualified(counterpart.schema, counterpart.name)}, which stays in use` };
191
+ try {
192
+ await client.unsafe(`SET lock_timeout = '${LOCK_TIMEOUT}'`);
193
+ try {
194
+ await client.unsafe(`DROP INDEX CONCURRENTLY IF EXISTS ${base.index}`);
195
+ }
196
+ finally {
197
+ await client.unsafe('RESET lock_timeout');
198
+ }
199
+ }
200
+ catch (err) {
201
+ entry.outcome = 'failed';
202
+ entry.action = 'none';
203
+ entry.reason = err instanceof Error ? err.message : String(err);
204
+ entry.printed = printed(row, false);
205
+ }
206
+ results.push(entry);
207
+ }
208
+ if (failures.length > 0) {
209
+ throw new InvalidIndexRepairError(results, `migrate could not make ${failures.length} INVALID ${failures.length === 1 ? 'index' : 'indexes'} ` +
210
+ `its migrations built valid:\n ${failures.join('\n ')}\n` +
211
+ `The next run drops each and builds it again; fix the cause first (for a UNIQUE index, the duplicate rows).`);
212
+ }
213
+ return { indexes: results, readError: null };
214
+ }
215
+ finally {
216
+ await client.end();
217
+ }
218
+ }
219
+ //# sourceMappingURL=invalid-indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-indexes.js","sourceRoot":"","sources":["../../../src/data/migrate/invalid-indexes.ts"],"names":[],"mappings":"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"}