@intentius/chant-lexicon-sql 0.124.31 → 0.124.32
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/change-set.js +250 -0
- package/dist/clickhouse/access.js +722 -0
- package/dist/clickhouse/apply/apply.js +243 -0
- package/dist/clickhouse/apply/mutations.js +66 -0
- package/dist/clickhouse/apply/statements.js +545 -0
- package/dist/clickhouse/catalog-types.js +7 -0
- package/dist/clickhouse/container.js +152 -0
- package/dist/clickhouse/engine-syntax.js +159 -0
- package/dist/clickhouse/entities.js +593 -0
- package/dist/clickhouse/expressions.js +107 -0
- package/dist/clickhouse/http.js +55 -0
- package/dist/clickhouse/import/generator.js +192 -0
- package/dist/clickhouse/import/inlined.js +207 -0
- package/dist/clickhouse/import/ir.js +160 -0
- package/dist/clickhouse/import/live-export.js +131 -0
- package/dist/clickhouse/import/parser.js +17 -0
- package/dist/clickhouse/live/bind.js +116 -0
- package/dist/clickhouse/live/catalog.js +223 -0
- package/dist/clickhouse/live/describe-resources.js +91 -0
- package/dist/clickhouse/live/undeclarable.js +59 -0
- package/dist/clickhouse/overlays/codecs.js +57 -0
- package/dist/clickhouse/overlays/engines.js +101 -0
- package/dist/clickhouse/overlays/kinds.js +1 -0
- package/dist/clickhouse/overlays/projections.js +26 -0
- package/dist/clickhouse/overlays/skip-indexes.js +40 -0
- package/dist/clickhouse/overlays/ttl.js +34 -0
- package/dist/clickhouse/overlays/types.js +59 -0
- package/dist/clickhouse/ownership.js +83 -0
- package/dist/clickhouse/parser.js +674 -0
- package/dist/clickhouse/plan/commands.js +159 -0
- package/dist/clickhouse/plan/deep.js +345 -0
- package/dist/clickhouse/plan/diff.js +312 -0
- package/dist/clickhouse/plan/disruption.js +73 -0
- package/dist/clickhouse/plan/normalize.js +545 -0
- package/dist/clickhouse/plan/rebuild-handoff.js +57 -0
- package/dist/clickhouse/plan/report.js +26 -0
- package/dist/clickhouse/plan/rules.js +72 -0
- package/dist/clickhouse/plan/schema.js +67 -0
- package/dist/clickhouse/plan/server-format.js +35 -0
- package/dist/clickhouse/rebuild/backfill.js +265 -0
- package/dist/clickhouse/rebuild/engines.js +146 -0
- package/dist/clickhouse/rebuild/observe.js +260 -0
- package/dist/clickhouse/rebuild/op.js +152 -0
- package/dist/clickhouse/rebuild/partitions.js +65 -0
- package/dist/clickhouse/rebuild/receipts.js +120 -0
- package/dist/clickhouse/rebuild/replicas.js +121 -0
- package/dist/clickhouse/rebuild/shards.js +76 -0
- package/dist/clickhouse/rebuild/steps.js +383 -0
- package/dist/clickhouse/rebuild/verify.js +279 -0
- package/dist/clickhouse/row-types.js +151 -0
- package/dist/clickhouse/testing/fake-server.js +47 -0
- package/dist/clickhouse/testing/roundtrip-schema.js +25 -0
- package/dist/clickhouse/testing/writable-server.js +123 -0
- package/dist/clickhouse/tokens.js +23 -0
- package/dist/clickhouse/topology.js +463 -0
- package/dist/clickhouse/type-syntax.js +73 -0
- package/dist/clickhouse.js +25 -0
- package/dist/codegen/classifier-page.js +93 -0
- package/dist/codegen/clickhouse-module.js +249 -0
- package/dist/codegen/coverage-page.js +70 -0
- package/dist/codegen/docs-cli.js +3 -0
- package/dist/codegen/docs.js +222 -0
- package/dist/codegen/generate-cli.js +13 -0
- package/dist/codegen/generate.js +97 -0
- package/dist/codegen/package.js +28 -0
- package/dist/codegen/postgres-classifier-page.js +95 -0
- package/dist/codegen/postgres-module.js +418 -0
- package/dist/codegen/registry.js +52 -0
- package/dist/composites/audit-log-table.js +35 -0
- package/dist/composites/catalog.js +524 -0
- package/dist/composites/cdc-mirror.js +32 -0
- package/dist/composites/clickhouse.js +6 -0
- package/dist/composites/events-table.js +26 -0
- package/dist/composites/index.js +8 -0
- package/dist/composites/join-table.js +25 -0
- package/dist/composites/postgres.js +6 -0
- package/dist/composites/refreshed-view.js +24 -0
- package/dist/composites/replacing-table.js +28 -0
- package/dist/composites/rollup-view.js +29 -0
- package/dist/composites/sharded-table.js +27 -0
- package/dist/composites/soft-delete-table.js +34 -0
- package/dist/composites/tenant-table.js +26 -0
- package/dist/composites/typed.js +8 -0
- package/dist/config.js +206 -0
- package/dist/core/apply.js +93 -0
- package/dist/core/classifier.js +115 -0
- package/dist/core/container.js +69 -0
- package/dist/core/cursor.js +261 -0
- package/dist/core/diff.js +48 -0
- package/dist/core/entity.js +58 -0
- package/dist/core/find-templates.js +118 -0
- package/dist/core/foreign-tables.js +27 -0
- package/dist/core/handoff.js +32 -0
- package/dist/core/index.js +64 -0
- package/dist/core/interpolation.js +191 -0
- package/dist/core/normalize.js +43 -0
- package/dist/core/ownership.js +119 -0
- package/dist/core/receipts.js +22 -0
- package/dist/core/references.js +61 -0
- package/dist/core/statements.js +42 -0
- package/dist/core/template.js +79 -0
- package/dist/core/testing/http-stub.js +21 -0
- package/dist/core/tokens.js +202 -0
- package/dist/core/typed.js +40 -0
- package/dist/core/undeclarable.js +46 -0
- package/dist/coverage.js +161 -0
- package/dist/detect.js +32 -0
- package/dist/dialects.js +18 -0
- package/dist/files/build-root.js +72 -0
- package/dist/files/clickhouse.js +138 -0
- package/dist/files/common.js +58 -0
- package/dist/files/postgres.js +389 -0
- package/dist/generated/clickhouse-types.js +5 -0
- package/dist/generated/clickhouse.js +4361 -0
- package/dist/generated/postgres-types.js +227 -0
- package/dist/generated/postgres.js +3667 -0
- package/dist/import-generator.js +14 -0
- package/dist/import-parser.js +71 -0
- package/dist/index.js +24 -0
- package/dist/init-templates.js +290 -0
- package/dist/integrity.json +2 -2
- package/dist/lint/audit-catalog.js +31 -0
- package/dist/lint/audit-lineage.js +22 -0
- package/dist/lint/post-synth/audit-entries.js +34 -0
- package/dist/lint/post-synth/clickhouse-helpers.js +79 -0
- package/dist/lint/post-synth/clickhouse-type-check.js +162 -0
- package/dist/lint/post-synth/index.js +112 -0
- package/dist/lint/post-synth/postgres-audit-entries.js +35 -0
- package/dist/lint/post-synth/postgres-helpers.js +65 -0
- package/dist/lint/post-synth/postgres-names.js +507 -0
- package/dist/lint/post-synth/sql-helpers.js +23 -0
- package/dist/lint/post-synth/sql101.js +59 -0
- package/dist/lint/post-synth/sql102.js +34 -0
- package/dist/lint/post-synth/sqlch101.js +34 -0
- package/dist/lint/post-synth/sqlch102.js +23 -0
- package/dist/lint/post-synth/sqlch103.js +45 -0
- package/dist/lint/post-synth/sqlch104.js +41 -0
- package/dist/lint/post-synth/sqlch105.js +36 -0
- package/dist/lint/post-synth/sqlch106.js +27 -0
- package/dist/lint/post-synth/sqlch107.js +39 -0
- package/dist/lint/post-synth/sqlch108.js +28 -0
- package/dist/lint/post-synth/sqlch109.js +21 -0
- package/dist/lint/post-synth/sqlch110.js +31 -0
- package/dist/lint/post-synth/sqlch111.js +41 -0
- package/dist/lint/post-synth/sqlch112.js +28 -0
- package/dist/lint/post-synth/sqlch113.js +19 -0
- package/dist/lint/post-synth/sqlch114.js +26 -0
- package/dist/lint/post-synth/sqlch115.js +30 -0
- package/dist/lint/post-synth/sqlch116.js +22 -0
- package/dist/lint/post-synth/sqlch117.js +26 -0
- package/dist/lint/post-synth/sqlch118.js +27 -0
- package/dist/lint/post-synth/sqlch119.js +32 -0
- package/dist/lint/post-synth/sqlch120.js +20 -0
- package/dist/lint/post-synth/sqlch121.js +11 -0
- package/dist/lint/post-synth/sqlch122.js +11 -0
- package/dist/lint/post-synth/sqlch123.js +10 -0
- package/dist/lint/post-synth/sqlch124.js +21 -0
- package/dist/lint/post-synth/sqlch125.js +55 -0
- package/dist/lint/post-synth/sqlch126.js +62 -0
- package/dist/lint/post-synth/sqlch127.js +132 -0
- package/dist/lint/post-synth/sqlpg101.js +25 -0
- package/dist/lint/post-synth/sqlpg102.js +35 -0
- package/dist/lint/post-synth/sqlpg103.js +23 -0
- package/dist/lint/post-synth/sqlpg104.js +23 -0
- package/dist/lint/post-synth/sqlpg105.js +22 -0
- package/dist/lint/post-synth/sqlpg106.js +22 -0
- package/dist/lint/post-synth/sqlpg107.js +22 -0
- package/dist/lint/post-synth/sqlpg108.js +28 -0
- package/dist/lint/post-synth/sqlpg109.js +39 -0
- package/dist/lint/post-synth/sqlpg110.js +38 -0
- package/dist/lint/post-synth/sqlpg111.js +23 -0
- package/dist/lint/post-synth/sqlpg112.js +25 -0
- package/dist/lint/post-synth/sqlpg113.js +29 -0
- package/dist/lint/post-synth/sqlpg114.js +39 -0
- package/dist/lint/post-synth/sqlpg115.js +48 -0
- package/dist/lint/post-synth/sqlpg116.js +26 -0
- package/dist/lint/post-synth/sqlpg117.js +24 -0
- package/dist/lint/post-synth/sqlpg118.js +22 -0
- package/dist/lint/post-synth/sqlpg119.js +41 -0
- package/dist/lint/post-synth/sqlpg120.js +83 -0
- package/dist/lint/post-synth/sqlpg121.js +33 -0
- package/dist/lint/post-synth/sqlpg122.js +27 -0
- package/dist/lint/post-synth/sqlpg123.js +69 -0
- package/dist/lint/post-synth/sqlpg124.js +50 -0
- package/dist/lint/post-synth/sqlpg125.js +41 -0
- package/dist/lint/post-synth/sqlpg126.js +38 -0
- package/dist/lint/rules/index.js +12 -0
- package/dist/lint/rules/postgres-templates.js +27 -0
- package/dist/lint/rules/sqlch001.js +79 -0
- package/dist/lint/rules/sqlch002.js +124 -0
- package/dist/lint/rules/sqlch003.js +69 -0
- package/dist/lint/rules/sqlch004.js +83 -0
- package/dist/lint/rules/sqlpg001.js +68 -0
- package/dist/lint/rules/sqlpg002.js +69 -0
- package/dist/lint/rules/sqlpg003.js +58 -0
- package/dist/lint/rules/sqlpg004.js +77 -0
- package/dist/lint/rules/sqlpg005.js +86 -0
- package/dist/lint/rules/templates.js +25 -0
- package/dist/lint/rules/typed-names.js +132 -0
- package/dist/live-dialect.js +32 -0
- package/dist/lsp/catalog.js +44 -0
- package/dist/lsp/completions.js +136 -0
- package/dist/lsp/hover.js +115 -0
- package/dist/lsp/postgres-catalog.js +176 -0
- package/dist/lsp/postgres-template.js +171 -0
- package/dist/lsp/postgres.js +266 -0
- package/dist/lsp/refs.js +60 -0
- package/dist/lsp/registry.d.ts.map +1 -1
- package/dist/lsp/registry.js +19 -0
- package/dist/lsp/template.js +143 -0
- package/dist/manifest.json +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +293 -0
- package/dist/mcp/postgres.js +117 -0
- package/dist/migration-statements.js +243 -0
- package/dist/op/activities/clickhouse-apply.js +83 -0
- package/dist/op/activities/clickhouse-emulator.js +53 -0
- package/dist/op/activities/clickhouse-rebuild.js +119 -0
- package/dist/op/activities/index.js +26 -0
- package/dist/op/activities/postgres-apply.js +126 -0
- package/dist/op/activities/postgres-emulator.js +70 -0
- package/dist/op/activities/postgres-migration.js +156 -0
- package/dist/op/activities/sql-exec.js +57 -0
- package/dist/op/activity-contracts.js +103 -0
- package/dist/package-cli.js +14 -0
- package/dist/plugin.js +259 -0
- package/dist/postgres/access/acl.js +344 -0
- package/dist/postgres/access/changes.js +30 -0
- package/dist/postgres/access/import.js +61 -0
- package/dist/postgres/access/live.js +96 -0
- package/dist/postgres/apply/apply.js +557 -0
- package/dist/postgres/apply/statements.js +882 -0
- package/dist/postgres/catalog-types.js +18 -0
- package/dist/postgres/container.js +58 -0
- package/dist/postgres/entities.js +1390 -0
- package/dist/postgres/entity-types.js +28 -0
- package/dist/postgres/import/generator.js +283 -0
- package/dist/postgres/import/ir.js +53 -0
- package/dist/postgres/import/live-export.js +83 -0
- package/dist/postgres/keywords.js +32 -0
- package/dist/postgres/live/bind.js +130 -0
- package/dist/postgres/live/catalog-kinds.js +301 -0
- package/dist/postgres/live/catalog.js +644 -0
- package/dist/postgres/live/client.js +151 -0
- package/dist/postgres/live/describe-resources.js +135 -0
- package/dist/postgres/live/undeclarable.js +111 -0
- package/dist/postgres/migrate/backfill.js +170 -0
- package/dist/postgres/migrate/batches.js +122 -0
- package/dist/postgres/migrate/carry.js +518 -0
- package/dist/postgres/migrate/handoff.js +59 -0
- package/dist/postgres/migrate/names.js +61 -0
- package/dist/postgres/migrate/observe.js +360 -0
- package/dist/postgres/migrate/op.js +178 -0
- package/dist/postgres/migrate/receipts.js +117 -0
- package/dist/postgres/migrate/replication.js +106 -0
- package/dist/postgres/migrate/steps.js +514 -0
- package/dist/postgres/overlays/columns.js +31 -0
- package/dist/postgres/overlays/constraints.js +52 -0
- package/dist/postgres/overlays/extension-objects.js +88 -0
- package/dist/postgres/overlays/indexes.js +25 -0
- package/dist/postgres/overlays/kinds.js +2 -0
- package/dist/postgres/overlays/partitioning.js +23 -0
- package/dist/postgres/overlays/relations.js +25 -0
- package/dist/postgres/overlays/storage.js +65 -0
- package/dist/postgres/overlays/type-ddl.js +36 -0
- package/dist/postgres/overlays/types.js +74 -0
- package/dist/postgres/parser.js +1824 -0
- package/dist/postgres/plan/commands.js +137 -0
- package/dist/postgres/plan/deep.js +324 -0
- package/dist/postgres/plan/diff.js +499 -0
- package/dist/postgres/plan/disruption.js +64 -0
- package/dist/postgres/plan/normalize.js +889 -0
- package/dist/postgres/plan/report.js +21 -0
- package/dist/postgres/plan/rules.js +115 -0
- package/dist/postgres/plan/schema.js +105 -0
- package/dist/postgres/plan/server-normalize.js +166 -0
- package/dist/postgres/providers/aurora.js +44 -0
- package/dist/postgres/providers/azure.js +53 -0
- package/dist/postgres/providers/cloud-sql.js +41 -0
- package/dist/postgres/providers/index.js +73 -0
- package/dist/postgres/providers/neon.js +44 -0
- package/dist/postgres/providers/rds.js +47 -0
- package/dist/postgres/providers/supabase.js +45 -0
- package/dist/postgres/providers/types.js +21 -0
- package/dist/postgres/row-types.js +107 -0
- package/dist/postgres/testing/fake-client.js +34 -0
- package/dist/postgres/testing/migration.js +48 -0
- package/dist/postgres/testing/roundtrip-schema.js +64 -0
- package/dist/postgres/testing/server.js +47 -0
- package/dist/postgres/testing/writable-server.js +160 -0
- package/dist/postgres/tokens.js +41 -0
- package/dist/postgres.js +15 -0
- package/dist/read/clickhouse.js +82 -0
- package/dist/read/objects.js +44 -0
- package/dist/read/postgres.js +104 -0
- package/dist/read.js +52 -0
- package/dist/receipts.js +207 -0
- package/dist/serializer.js +172 -0
- package/dist/skill-defs.js +93 -0
- package/dist/spec/catalog.js +191 -0
- package/dist/spec/fetch.d.ts.map +1 -1
- package/dist/spec/fetch.js +90 -0
- package/dist/spec/pin.js +42 -0
- package/dist/spec/postgres-catalog.js +171 -0
- package/dist/spec/postgres-fetch.js +91 -0
- package/dist/spec/postgres-pin.js +82 -0
- package/dist/sql-files.js +206 -0
- package/dist/sql-types-command.js +97 -0
- package/dist/sql-types.js +323 -0
- package/dist/token-source.js +156 -0
- package/dist/validate-cli.js +5 -0
- package/dist/validate.js +151 -0
- package/dist/workspace-outputs.js +191 -0
- package/package.json +7 -7
- package/src/codegen/package.ts +2 -2
- package/src/lint/rules/typescript-7.test.ts +2 -1
- package/src/lsp/catalog.ts +2 -2
- package/src/lsp/postgres-catalog.ts +2 -2
- package/src/lsp/registry.ts +2 -1
- package/src/mcp/index.ts +4 -2
- package/src/spec/fetch.ts +2 -2
- package/src/spec/postgres-fetch.ts +2 -2
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL plans as change-set parts (#3767, the document is #3181).
|
|
3
|
+
*
|
|
4
|
+
* The sql lexicon's declarative plans reach the change set through `chant
|
|
5
|
+
* lifecycle plan`. Two kinds of SQL plan do not, and this module is their
|
|
6
|
+
* adapter:
|
|
7
|
+
*
|
|
8
|
+
* - a versioned plan: the migrations a product (SQL Yodeler) would apply to
|
|
9
|
+
* an environment, each a list of steps in the shape `diffStatements`
|
|
10
|
+
* writes (`./core/statements.ts`). {@link sqlVersionedPlanPart}.
|
|
11
|
+
* - the plan step of the lexicon's own migration Ops, `ClickHouseRebuildOp`
|
|
12
|
+
* and `PostgresMigrationOp`. {@link clickhouseRebuildPart} and
|
|
13
|
+
* {@link postgresMigrationPart}.
|
|
14
|
+
*
|
|
15
|
+
* Each returns a part with planner `sql`, so it composes with every other
|
|
16
|
+
* member's in `composeChangeSet`, and a gate that binds the document gets its
|
|
17
|
+
* Cedar `context.plan` (#3182). A part written to a file as JSON reads back
|
|
18
|
+
* through core's `readChangeSetPart` with `planner: "sql"`.
|
|
19
|
+
*
|
|
20
|
+
* ## Entries
|
|
21
|
+
*
|
|
22
|
+
* One entry per object a plan touches, at the object's server name (`db.name`
|
|
23
|
+
* or `schema.name`), however many steps or migrations touch it. The action
|
|
24
|
+
* and disruption come from the change classes the steps carry, as the
|
|
25
|
+
* dialects' `CHANGE_CLASSES` and `PG_CHANGE_CLASSES` price them:
|
|
26
|
+
*
|
|
27
|
+
* - a `drop` class is a `delete` (`destroy`); a `create` class a `create`;
|
|
28
|
+
* - a `rebuild` or `expand` class, or a step a migration Op makes, is a
|
|
29
|
+
* `replace` (`replace`): the object, or a column of it, is built again;
|
|
30
|
+
* - anything else is an `update`, its disruption the worst class's
|
|
31
|
+
* (`metadata` in-place; `validate`, `concurrently` and `rewrite` rolling).
|
|
32
|
+
* A step marked destructive (a column drop) makes it `destroy`. A class
|
|
33
|
+
* neither dialect knows makes it `unknown`.
|
|
34
|
+
*
|
|
35
|
+
* A step may name its `action` itself, which wins over its classes.
|
|
36
|
+
*
|
|
37
|
+
* ## The import graph
|
|
38
|
+
*
|
|
39
|
+
* Like `@intentius/chant/change-set`, this module bundles small for a tool
|
|
40
|
+
* that runs it in CI with no TypeScript toolchain: it imports chant's plan
|
|
41
|
+
* hashing code and types only. `change-set.test.ts` holds that.
|
|
42
|
+
*/
|
|
43
|
+
import { computePlanDigest } from "@intentius/chant/lifecycle/plan-digest";
|
|
44
|
+
/** The lexicon a SQL part's member and entries name. */
|
|
45
|
+
export const SQL_CHANGE_SET_LEXICON = "sql";
|
|
46
|
+
/**
|
|
47
|
+
* What each change class costs, both dialects together. The same values as
|
|
48
|
+
* `CHANGE_CLASSES.disruption` (ClickHouse) and `PG_CHANGE_CLASSES.disruption`
|
|
49
|
+
* (Postgres), copied so the rule tables stay out of the bundle; the test
|
|
50
|
+
* holds the two together.
|
|
51
|
+
*/
|
|
52
|
+
export const SQL_CLASS_DISRUPTION = {
|
|
53
|
+
create: "in-place",
|
|
54
|
+
metadata: "in-place",
|
|
55
|
+
validate: "rolling",
|
|
56
|
+
concurrently: "rolling",
|
|
57
|
+
rewrite: "rolling",
|
|
58
|
+
rebuild: "replace",
|
|
59
|
+
expand: "replace",
|
|
60
|
+
drop: "destroy",
|
|
61
|
+
};
|
|
62
|
+
const RANK = { "in-place": 0, rolling: 1, unknown: 2, replace: 3, destroy: 4 };
|
|
63
|
+
const worst = (a, b) => (a === undefined || RANK[b] > RANK[a] ? b : a);
|
|
64
|
+
const ACTION_ORDER = ["delete", "replace", "create", "update", "forget", "read", "no-op"];
|
|
65
|
+
const unwrap = (s) => "step" in s && s.step && typeof s.step === "object" ? { ...s.step, ...(s.done ? { done: true } : {}) } : s;
|
|
66
|
+
function gather(steps) {
|
|
67
|
+
const byAddress = new Map();
|
|
68
|
+
for (const step of steps) {
|
|
69
|
+
if (step.done)
|
|
70
|
+
continue;
|
|
71
|
+
let o = byAddress.get(step.name);
|
|
72
|
+
if (!o) {
|
|
73
|
+
o = { address: step.name, type: step.type, classes: [], actions: [], destructive: false, ops: [], manual: [], sql: [], fields: new Map() };
|
|
74
|
+
byAddress.set(step.name, o);
|
|
75
|
+
}
|
|
76
|
+
if (step.action)
|
|
77
|
+
o.actions.push(step.action);
|
|
78
|
+
const changes = step.changes ?? [];
|
|
79
|
+
if (step.kind === "statement") {
|
|
80
|
+
o.classes.push(step.class);
|
|
81
|
+
o.sql.push(step.sql);
|
|
82
|
+
if (step.destructive)
|
|
83
|
+
o.destructive = true;
|
|
84
|
+
}
|
|
85
|
+
else if (step.kind === "op") {
|
|
86
|
+
o.ops.push(step.op);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
o.manual.push(step.detail);
|
|
90
|
+
}
|
|
91
|
+
for (const c of changes) {
|
|
92
|
+
o.classes.push(c.class);
|
|
93
|
+
if (c.destructive)
|
|
94
|
+
o.destructive = true;
|
|
95
|
+
const had = o.fields.get(c.field);
|
|
96
|
+
// The first step's before, the last step's after.
|
|
97
|
+
o.fields.set(c.field, had ? { ...c, ...(had.before !== undefined ? { before: had.before } : {}) } : c);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return [...byAddress.values()];
|
|
101
|
+
}
|
|
102
|
+
function attributesOf(o) {
|
|
103
|
+
const attributes = [...o.fields.values()]
|
|
104
|
+
.sort((a, b) => (a.field < b.field ? -1 : a.field > b.field ? 1 : 0))
|
|
105
|
+
.map((c) => ({
|
|
106
|
+
path: c.field,
|
|
107
|
+
...(c.before !== undefined ? { before: c.before } : {}),
|
|
108
|
+
...(c.after !== undefined ? { after: c.after } : {}),
|
|
109
|
+
...(SQL_CLASS_DISRUPTION[c.class] === "replace" ? { forcesReplacement: true } : {}),
|
|
110
|
+
}));
|
|
111
|
+
if (o.sql.length > 0)
|
|
112
|
+
attributes.push({ path: "sql", after: o.sql });
|
|
113
|
+
if (o.ops.length > 0)
|
|
114
|
+
attributes.push({ path: "op", after: [...new Set(o.ops)] });
|
|
115
|
+
if (o.manual.length > 0)
|
|
116
|
+
attributes.push({ path: "manual", after: o.manual });
|
|
117
|
+
return attributes;
|
|
118
|
+
}
|
|
119
|
+
/** The action and disruption of one object's changes, as the module's header says. */
|
|
120
|
+
export function sqlChangeAction(o) {
|
|
121
|
+
let disruption;
|
|
122
|
+
for (const c of o.classes)
|
|
123
|
+
disruption = worst(disruption, SQL_CLASS_DISRUPTION[c] ?? "unknown");
|
|
124
|
+
if (o.ops.length > 0)
|
|
125
|
+
disruption = worst(disruption, "replace");
|
|
126
|
+
if (o.destructive)
|
|
127
|
+
disruption = worst(disruption, "destroy");
|
|
128
|
+
let action;
|
|
129
|
+
if (o.actions.length > 0)
|
|
130
|
+
action = ACTION_ORDER.find((a) => o.actions.includes(a));
|
|
131
|
+
else if (o.classes.includes("drop"))
|
|
132
|
+
action = "delete";
|
|
133
|
+
else if (o.classes.includes("create"))
|
|
134
|
+
action = "create";
|
|
135
|
+
else if (o.ops.length > 0 || o.classes.some((c) => SQL_CLASS_DISRUPTION[c] === "replace"))
|
|
136
|
+
action = "replace";
|
|
137
|
+
else
|
|
138
|
+
action = "update";
|
|
139
|
+
switch (action) {
|
|
140
|
+
case "create":
|
|
141
|
+
case "read":
|
|
142
|
+
case "no-op":
|
|
143
|
+
case "forget":
|
|
144
|
+
return { action };
|
|
145
|
+
case "delete":
|
|
146
|
+
return { action, disruption: "destroy" };
|
|
147
|
+
case "replace":
|
|
148
|
+
return { action, disruption: worst(disruption, "replace") };
|
|
149
|
+
default:
|
|
150
|
+
return { action, disruption: disruption ?? "unknown" };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function entriesOf(member, lexicon, scope, objects) {
|
|
154
|
+
return objects.map((o) => ({
|
|
155
|
+
member,
|
|
156
|
+
lexicon,
|
|
157
|
+
planner: "sql",
|
|
158
|
+
address: o.address,
|
|
159
|
+
type: o.type,
|
|
160
|
+
...sqlChangeAction(o),
|
|
161
|
+
...(scope !== undefined ? { scope } : {}),
|
|
162
|
+
attributes: attributesOf(o),
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* A versioned plan's part ({@link SqlVersionedPlan}): one entry per object
|
|
167
|
+
* its pending steps touch, `scope` the environment. A refusal makes the
|
|
168
|
+
* member `failed` with no plan digest; its entries stay, for a reader.
|
|
169
|
+
*/
|
|
170
|
+
export function sqlVersionedPlanPart(input) {
|
|
171
|
+
const { plan } = input;
|
|
172
|
+
const lexicon = input.lexicon ?? SQL_CHANGE_SET_LEXICON;
|
|
173
|
+
const migrations = (plan.migrations ?? plan.pending ?? []).map((m) => ({ id: m.id, steps: m.steps.map(unwrap) }));
|
|
174
|
+
const objects = gather(migrations.flatMap((m) => m.steps));
|
|
175
|
+
const refusal = plan.refusal === undefined ? undefined : typeof plan.refusal === "string" ? plan.refusal : plan.refusal.message;
|
|
176
|
+
const planDigest = refusal !== undefined
|
|
177
|
+
? null
|
|
178
|
+
: (plan.digest ??
|
|
179
|
+
computePlanDigest("sql-versioned-plan", {
|
|
180
|
+
dialect: plan.dialect,
|
|
181
|
+
environment: plan.environment ?? null,
|
|
182
|
+
migrations: migrations.map((m) => ({ id: m.id, steps: m.steps.filter((s) => !s.done) })),
|
|
183
|
+
}));
|
|
184
|
+
return {
|
|
185
|
+
member: {
|
|
186
|
+
member: input.member,
|
|
187
|
+
lexicon,
|
|
188
|
+
planner: "sql",
|
|
189
|
+
...(plan.environment !== undefined ? { scope: plan.environment } : {}),
|
|
190
|
+
status: refusal !== undefined ? "failed" : "planned",
|
|
191
|
+
...(refusal !== undefined ? { error: refusal } : {}),
|
|
192
|
+
planDigest,
|
|
193
|
+
holes: plan.holes ?? [],
|
|
194
|
+
},
|
|
195
|
+
entries: entriesOf(input.member, lexicon, plan.environment, objects),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** A change as a plain string, read back as far as its rule and field go. */
|
|
199
|
+
function changeOf(line) {
|
|
200
|
+
const m = /^(\S+)\s+([^\s:]+)/.exec(line);
|
|
201
|
+
return { rule: m?.[1] ?? line, class: "unknown", field: m?.[2] ?? line };
|
|
202
|
+
}
|
|
203
|
+
function opPart(input, op, active, address, type) {
|
|
204
|
+
const { plan } = input;
|
|
205
|
+
const lexicon = input.lexicon ?? SQL_CHANGE_SET_LEXICON;
|
|
206
|
+
const running = plan.state === active;
|
|
207
|
+
const changes = plan.classified ?? plan.changes.map(changeOf);
|
|
208
|
+
const objects = running
|
|
209
|
+
? gather([{ kind: "op", object: address, type, name: address, op, importPath: "", options: {}, declaration: "", changes, detail: "" }])
|
|
210
|
+
: [];
|
|
211
|
+
// Swapped or done: the Op has nothing left to change in the schema; the digest says which.
|
|
212
|
+
const planDigest = running && plan.planDigest ? plan.planDigest : computePlanDigest("sql-op-plan", { op, address, state: plan.state, planDigest: plan.planDigest ?? null });
|
|
213
|
+
return {
|
|
214
|
+
member: {
|
|
215
|
+
member: input.member,
|
|
216
|
+
lexicon,
|
|
217
|
+
planner: "sql",
|
|
218
|
+
...(input.environment !== undefined ? { scope: input.environment } : {}),
|
|
219
|
+
status: "planned",
|
|
220
|
+
planDigest,
|
|
221
|
+
holes: [],
|
|
222
|
+
},
|
|
223
|
+
entries: entriesOf(input.member, lexicon, input.environment, objects),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* The part of a `ClickHouseRebuildOp`'s plan step: while the state is
|
|
228
|
+
* `rebuild`, one `replace` of the table, its plan digest the step's (the
|
|
229
|
+
* value before the verification, not the swap gate's). `swapped` and `done`
|
|
230
|
+
* propose nothing.
|
|
231
|
+
*/
|
|
232
|
+
export function clickhouseRebuildPart(input) {
|
|
233
|
+
const table = input.plan.table;
|
|
234
|
+
if (!table)
|
|
235
|
+
throw new Error("clickhouseRebuildPart: the plan names no table");
|
|
236
|
+
return opPart(input, "ClickHouseRebuildOp", "rebuild", table, "ClickHouse::Table");
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* The part of a `PostgresMigrationOp`'s plan step: while the state is
|
|
240
|
+
* `migrate`, one `replace` of the table (`schema.table`) whose column it
|
|
241
|
+
* expands and contracts, its plan digest the step's. `switched` and `done`
|
|
242
|
+
* propose nothing.
|
|
243
|
+
*/
|
|
244
|
+
export function postgresMigrationPart(input) {
|
|
245
|
+
const migration = input.plan.migration;
|
|
246
|
+
if (!migration)
|
|
247
|
+
throw new Error("postgresMigrationPart: the plan names no migration");
|
|
248
|
+
const table = migration.split(".").slice(0, -1).join(".") || migration;
|
|
249
|
+
return opPart(input, "PostgresMigrationOp", "migrate", table, "Postgres::Table");
|
|
250
|
+
}
|