@intentius/chant-lexicon-sql 0.0.0-stage → 0.112.1
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/README.md +39 -2
- package/dist/clickhouse/apply/apply.d.ts +82 -0
- package/dist/clickhouse/apply/apply.d.ts.map +1 -0
- package/dist/clickhouse/apply/mutations.d.ts +46 -0
- package/dist/clickhouse/apply/mutations.d.ts.map +1 -0
- package/dist/clickhouse/apply/statements.d.ts +99 -0
- package/dist/clickhouse/apply/statements.d.ts.map +1 -0
- package/dist/clickhouse/catalog-types.d.ts +76 -0
- package/dist/clickhouse/catalog-types.d.ts.map +1 -0
- package/dist/clickhouse/container.d.ts +63 -0
- package/dist/clickhouse/container.d.ts.map +1 -0
- package/dist/clickhouse/engine-syntax.d.ts +43 -0
- package/dist/clickhouse/engine-syntax.d.ts.map +1 -0
- package/dist/clickhouse/entities.d.ts +183 -0
- package/dist/clickhouse/entities.d.ts.map +1 -0
- package/dist/clickhouse/http.d.ts +40 -0
- package/dist/clickhouse/http.d.ts.map +1 -0
- package/dist/clickhouse/import/generator.d.ts +16 -0
- package/dist/clickhouse/import/generator.d.ts.map +1 -0
- package/dist/clickhouse/import/ir.d.ts +52 -0
- package/dist/clickhouse/import/ir.d.ts.map +1 -0
- package/dist/clickhouse/import/live-export.d.ts +28 -0
- package/dist/clickhouse/import/live-export.d.ts.map +1 -0
- package/dist/clickhouse/import/parser.d.ts +10 -0
- package/dist/clickhouse/import/parser.d.ts.map +1 -0
- package/dist/clickhouse/live/bind.d.ts +56 -0
- package/dist/clickhouse/live/bind.d.ts.map +1 -0
- package/dist/clickhouse/live/catalog.d.ts +39 -0
- package/dist/clickhouse/live/catalog.d.ts.map +1 -0
- package/dist/clickhouse/live/describe-resources.d.ts +34 -0
- package/dist/clickhouse/live/describe-resources.d.ts.map +1 -0
- package/dist/clickhouse/overlays/codecs.d.ts +28 -0
- package/dist/clickhouse/overlays/codecs.d.ts.map +1 -0
- package/dist/clickhouse/overlays/engines.d.ts +20 -0
- package/dist/clickhouse/overlays/engines.d.ts.map +1 -0
- package/dist/clickhouse/overlays/kinds.d.ts +38 -0
- package/dist/clickhouse/overlays/kinds.d.ts.map +1 -0
- package/dist/clickhouse/overlays/projections.d.ts +27 -0
- package/dist/clickhouse/overlays/projections.d.ts.map +1 -0
- package/dist/clickhouse/overlays/skip-indexes.d.ts +10 -0
- package/dist/clickhouse/overlays/skip-indexes.d.ts.map +1 -0
- package/dist/clickhouse/overlays/ttl.d.ts +35 -0
- package/dist/clickhouse/overlays/ttl.d.ts.map +1 -0
- package/dist/clickhouse/overlays/types.d.ts +21 -0
- package/dist/clickhouse/overlays/types.d.ts.map +1 -0
- package/dist/clickhouse/ownership.d.ts +71 -0
- package/dist/clickhouse/ownership.d.ts.map +1 -0
- package/dist/clickhouse/parser.d.ts +130 -0
- package/dist/clickhouse/parser.d.ts.map +1 -0
- package/dist/clickhouse/plan/commands.d.ts +26 -0
- package/dist/clickhouse/plan/commands.d.ts.map +1 -0
- package/dist/clickhouse/plan/deep.d.ts +32 -0
- package/dist/clickhouse/plan/deep.d.ts.map +1 -0
- package/dist/clickhouse/plan/diff.d.ts +37 -0
- package/dist/clickhouse/plan/diff.d.ts.map +1 -0
- package/dist/clickhouse/plan/disruption.d.ts +17 -0
- package/dist/clickhouse/plan/disruption.d.ts.map +1 -0
- package/dist/clickhouse/plan/normalize.d.ts +97 -0
- package/dist/clickhouse/plan/normalize.d.ts.map +1 -0
- package/dist/clickhouse/plan/rebuild-handoff.d.ts +38 -0
- package/dist/clickhouse/plan/rebuild-handoff.d.ts.map +1 -0
- package/dist/clickhouse/plan/report.d.ts +6 -0
- package/dist/clickhouse/plan/report.d.ts.map +1 -0
- package/dist/clickhouse/plan/rules.d.ts +60 -0
- package/dist/clickhouse/plan/rules.d.ts.map +1 -0
- package/dist/clickhouse/plan/schema.d.ts +23 -0
- package/dist/clickhouse/plan/schema.d.ts.map +1 -0
- package/dist/clickhouse/plan/server-format.d.ts +12 -0
- package/dist/clickhouse/plan/server-format.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/backfill.d.ts +70 -0
- package/dist/clickhouse/rebuild/backfill.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/observe.d.ts +157 -0
- package/dist/clickhouse/rebuild/observe.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/op.d.ts +108 -0
- package/dist/clickhouse/rebuild/op.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/partitions.d.ts +24 -0
- package/dist/clickhouse/rebuild/partitions.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/receipts.d.ts +76 -0
- package/dist/clickhouse/rebuild/receipts.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/replicas.d.ts +78 -0
- package/dist/clickhouse/rebuild/replicas.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/steps.d.ts +151 -0
- package/dist/clickhouse/rebuild/steps.d.ts.map +1 -0
- package/dist/clickhouse/rebuild/verify.d.ts +51 -0
- package/dist/clickhouse/rebuild/verify.d.ts.map +1 -0
- package/dist/clickhouse/testing/fake-server.d.ts +27 -0
- package/dist/clickhouse/testing/fake-server.d.ts.map +1 -0
- package/dist/clickhouse/testing/roundtrip-schema.d.ts +3 -0
- package/dist/clickhouse/testing/roundtrip-schema.d.ts.map +1 -0
- package/dist/clickhouse/testing/writable-server.d.ts +35 -0
- package/dist/clickhouse/testing/writable-server.d.ts.map +1 -0
- package/dist/clickhouse/tokens.d.ts +15 -0
- package/dist/clickhouse/tokens.d.ts.map +1 -0
- package/dist/clickhouse.d.ts +24 -0
- package/dist/clickhouse.d.ts.map +1 -0
- package/dist/codegen/classifier-page.d.ts +6 -0
- package/dist/codegen/classifier-page.d.ts.map +1 -0
- package/dist/codegen/clickhouse-module.d.ts +23 -0
- package/dist/codegen/clickhouse-module.d.ts.map +1 -0
- package/dist/codegen/docs-cli.d.ts +3 -0
- package/dist/codegen/docs-cli.d.ts.map +1 -0
- package/dist/codegen/docs.d.ts +8 -0
- package/dist/codegen/docs.d.ts.map +1 -0
- package/dist/codegen/generate-cli.d.ts +3 -0
- package/dist/codegen/generate-cli.d.ts.map +1 -0
- package/dist/codegen/generate.d.ts +40 -0
- package/dist/codegen/generate.d.ts.map +1 -0
- package/dist/codegen/package.d.ts +7 -0
- package/dist/codegen/package.d.ts.map +1 -0
- package/dist/codegen/postgres-classifier-page.d.ts +7 -0
- package/dist/codegen/postgres-classifier-page.d.ts.map +1 -0
- package/dist/codegen/postgres-module.d.ts +30 -0
- package/dist/codegen/postgres-module.d.ts.map +1 -0
- package/dist/codegen/registry.d.ts +12 -0
- package/dist/codegen/registry.d.ts.map +1 -0
- package/dist/composites/audit-log-table.d.ts +31 -0
- package/dist/composites/audit-log-table.d.ts.map +1 -0
- package/dist/composites/catalog.d.ts +3 -0
- package/dist/composites/catalog.d.ts.map +1 -0
- package/dist/composites/cdc-mirror.d.ts +32 -0
- package/dist/composites/cdc-mirror.d.ts.map +1 -0
- package/dist/composites/clickhouse.d.ts +7 -0
- package/dist/composites/clickhouse.d.ts.map +1 -0
- package/dist/composites/events-table.d.ts +32 -0
- package/dist/composites/events-table.d.ts.map +1 -0
- package/dist/composites/index.d.ts +9 -0
- package/dist/composites/index.d.ts.map +1 -0
- package/dist/composites/join-table.d.ts +41 -0
- package/dist/composites/join-table.d.ts.map +1 -0
- package/dist/composites/postgres.d.ts +7 -0
- package/dist/composites/postgres.d.ts.map +1 -0
- package/dist/composites/refreshed-view.d.ts +32 -0
- package/dist/composites/refreshed-view.d.ts.map +1 -0
- package/dist/composites/replacing-table.d.ts +34 -0
- package/dist/composites/replacing-table.d.ts.map +1 -0
- package/dist/composites/rollup-view.d.ts +39 -0
- package/dist/composites/rollup-view.d.ts.map +1 -0
- package/dist/composites/sharded-table.d.ts +35 -0
- package/dist/composites/sharded-table.d.ts.map +1 -0
- package/dist/composites/soft-delete-table.d.ts +40 -0
- package/dist/composites/soft-delete-table.d.ts.map +1 -0
- package/dist/composites/tenant-table.d.ts +34 -0
- package/dist/composites/tenant-table.d.ts.map +1 -0
- package/dist/config.d.ts +213 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/core/apply.d.ts +89 -0
- package/dist/core/apply.d.ts.map +1 -0
- package/dist/core/classifier.d.ts +88 -0
- package/dist/core/classifier.d.ts.map +1 -0
- package/dist/core/container.d.ts +45 -0
- package/dist/core/container.d.ts.map +1 -0
- package/dist/core/cursor.d.ts +67 -0
- package/dist/core/cursor.d.ts.map +1 -0
- package/dist/core/diff.d.ts +49 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/entity.d.ts +41 -0
- package/dist/core/entity.d.ts.map +1 -0
- package/dist/core/find-templates.d.ts +69 -0
- package/dist/core/find-templates.d.ts.map +1 -0
- package/dist/core/handoff.d.ts +36 -0
- package/dist/core/handoff.d.ts.map +1 -0
- package/dist/core/index.d.ts +61 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/interpolation.d.ts +88 -0
- package/dist/core/interpolation.d.ts.map +1 -0
- package/dist/core/normalize.d.ts +18 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/ownership.d.ts +60 -0
- package/dist/core/ownership.d.ts.map +1 -0
- package/dist/core/receipts.d.ts +28 -0
- package/dist/core/receipts.d.ts.map +1 -0
- package/dist/core/references.d.ts +37 -0
- package/dist/core/references.d.ts.map +1 -0
- package/dist/core/template.d.ts +41 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/testing/http-stub.d.ts +17 -0
- package/dist/core/testing/http-stub.d.ts.map +1 -0
- package/dist/core/tokens.d.ts +102 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/coverage.d.ts +25 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/detect.d.ts +15 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/dialects.d.ts +20 -0
- package/dist/dialects.d.ts.map +1 -0
- package/dist/generated/clickhouse-types.d.ts +4380 -0
- package/dist/generated/clickhouse-types.d.ts.map +1 -0
- package/dist/generated/clickhouse.d.ts +11 -0
- package/dist/generated/clickhouse.d.ts.map +1 -0
- package/dist/generated/postgres-types.d.ts +1579 -0
- package/dist/generated/postgres-types.d.ts.map +1 -0
- package/dist/generated/postgres.d.ts +9 -0
- package/dist/generated/postgres.d.ts.map +1 -0
- package/dist/import-generator.d.ts +8 -0
- package/dist/import-generator.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/init-templates.d.ts +20 -0
- package/dist/init-templates.d.ts.map +1 -0
- package/dist/integrity.json +61 -0
- package/dist/lint/audit-catalog.d.ts +10 -0
- package/dist/lint/audit-catalog.d.ts.map +1 -0
- package/dist/lint/audit-lineage.d.ts +25 -0
- package/dist/lint/audit-lineage.d.ts.map +1 -0
- package/dist/lint/post-synth/audit-entries.d.ts +8 -0
- package/dist/lint/post-synth/audit-entries.d.ts.map +1 -0
- package/dist/lint/post-synth/clickhouse-helpers.d.ts +85 -0
- package/dist/lint/post-synth/clickhouse-helpers.d.ts.map +1 -0
- package/dist/lint/post-synth/index.d.ts +3 -0
- package/dist/lint/post-synth/index.d.ts.map +1 -0
- package/dist/lint/post-synth/postgres-audit-entries.d.ts +9 -0
- package/dist/lint/post-synth/postgres-audit-entries.d.ts.map +1 -0
- package/dist/lint/post-synth/postgres-helpers.d.ts +89 -0
- package/dist/lint/post-synth/postgres-helpers.d.ts.map +1 -0
- package/dist/lint/post-synth/sql-helpers.d.ts +27 -0
- package/dist/lint/post-synth/sql-helpers.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch101.d.ts +12 -0
- package/dist/lint/post-synth/sqlch101.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch102.d.ts +9 -0
- package/dist/lint/post-synth/sqlch102.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch103.d.ts +10 -0
- package/dist/lint/post-synth/sqlch103.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch104.d.ts +9 -0
- package/dist/lint/post-synth/sqlch104.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch105.d.ts +10 -0
- package/dist/lint/post-synth/sqlch105.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch106.d.ts +11 -0
- package/dist/lint/post-synth/sqlch106.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch107.d.ts +10 -0
- package/dist/lint/post-synth/sqlch107.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch108.d.ts +11 -0
- package/dist/lint/post-synth/sqlch108.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch109.d.ts +10 -0
- package/dist/lint/post-synth/sqlch109.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch110.d.ts +12 -0
- package/dist/lint/post-synth/sqlch110.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch111.d.ts +11 -0
- package/dist/lint/post-synth/sqlch111.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch112.d.ts +12 -0
- package/dist/lint/post-synth/sqlch112.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch113.d.ts +9 -0
- package/dist/lint/post-synth/sqlch113.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch114.d.ts +8 -0
- package/dist/lint/post-synth/sqlch114.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch115.d.ts +13 -0
- package/dist/lint/post-synth/sqlch115.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch116.d.ts +10 -0
- package/dist/lint/post-synth/sqlch116.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch117.d.ts +9 -0
- package/dist/lint/post-synth/sqlch117.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch118.d.ts +10 -0
- package/dist/lint/post-synth/sqlch118.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch119.d.ts +11 -0
- package/dist/lint/post-synth/sqlch119.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch120.d.ts +10 -0
- package/dist/lint/post-synth/sqlch120.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg101.d.ts +12 -0
- package/dist/lint/post-synth/sqlpg101.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg102.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg102.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg103.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg103.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg104.d.ts +10 -0
- package/dist/lint/post-synth/sqlpg104.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg105.d.ts +10 -0
- package/dist/lint/post-synth/sqlpg105.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg106.d.ts +9 -0
- package/dist/lint/post-synth/sqlpg106.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg107.d.ts +10 -0
- package/dist/lint/post-synth/sqlpg107.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg108.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg108.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg109.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg109.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg110.d.ts +12 -0
- package/dist/lint/post-synth/sqlpg110.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg111.d.ts +10 -0
- package/dist/lint/post-synth/sqlpg111.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg112.d.ts +10 -0
- package/dist/lint/post-synth/sqlpg112.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg113.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg113.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg114.d.ts +13 -0
- package/dist/lint/post-synth/sqlpg114.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg115.d.ts +13 -0
- package/dist/lint/post-synth/sqlpg115.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg116.d.ts +11 -0
- package/dist/lint/post-synth/sqlpg116.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg117.d.ts +12 -0
- package/dist/lint/post-synth/sqlpg117.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlpg118.d.ts +12 -0
- package/dist/lint/post-synth/sqlpg118.d.ts.map +1 -0
- package/dist/lint/rules/index.d.ts +12 -0
- package/dist/lint/rules/index.d.ts.map +1 -0
- package/dist/lint/rules/postgres-templates.d.ts +18 -0
- package/dist/lint/rules/postgres-templates.d.ts.map +1 -0
- package/dist/lint/rules/sqlch001.d.ts +12 -0
- package/dist/lint/rules/sqlch001.d.ts.map +1 -0
- package/dist/lint/rules/sqlch002.d.ts +11 -0
- package/dist/lint/rules/sqlch002.d.ts.map +1 -0
- package/dist/lint/rules/sqlch003.d.ts +12 -0
- package/dist/lint/rules/sqlch003.d.ts.map +1 -0
- package/dist/lint/rules/sqlpg001.d.ts +16 -0
- package/dist/lint/rules/sqlpg001.d.ts.map +1 -0
- package/dist/lint/rules/sqlpg002.d.ts +12 -0
- package/dist/lint/rules/sqlpg002.d.ts.map +1 -0
- package/dist/lint/rules/sqlpg003.d.ts +16 -0
- package/dist/lint/rules/sqlpg003.d.ts.map +1 -0
- package/dist/lint/rules/sqlpg004.d.ts +21 -0
- package/dist/lint/rules/sqlpg004.d.ts.map +1 -0
- package/dist/lint/rules/templates.d.ts +23 -0
- package/dist/lint/rules/templates.d.ts.map +1 -0
- package/dist/live-dialect.d.ts +25 -0
- package/dist/live-dialect.d.ts.map +1 -0
- package/dist/lsp/catalog.d.ts +22 -0
- package/dist/lsp/catalog.d.ts.map +1 -0
- package/dist/lsp/completions.d.ts +13 -0
- package/dist/lsp/completions.d.ts.map +1 -0
- package/dist/lsp/hover.d.ts +12 -0
- package/dist/lsp/hover.d.ts.map +1 -0
- package/dist/lsp/postgres-catalog.d.ts +85 -0
- package/dist/lsp/postgres-catalog.d.ts.map +1 -0
- package/dist/lsp/postgres-template.d.ts +35 -0
- package/dist/lsp/postgres-template.d.ts.map +1 -0
- package/dist/lsp/postgres.d.ts +20 -0
- package/dist/lsp/postgres.d.ts.map +1 -0
- package/dist/lsp/refs.d.ts +8 -0
- package/dist/lsp/refs.d.ts.map +1 -0
- package/dist/lsp/registry.d.ts +4 -0
- package/dist/lsp/registry.d.ts.map +1 -0
- package/dist/lsp/template.d.ts +34 -0
- package/dist/lsp/template.d.ts.map +1 -0
- package/dist/manifest.json +8 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/postgres.d.ts +32 -0
- package/dist/mcp/postgres.d.ts.map +1 -0
- package/dist/meta.json +67 -0
- package/dist/okf/index.md +67 -0
- package/dist/okf/rules/SQLCH001.md +11 -0
- package/dist/okf/rules/SQLCH002.md +11 -0
- package/dist/okf/rules/SQLCH003.md +11 -0
- package/dist/okf/rules/SQLCH101.md +15 -0
- package/dist/okf/rules/SQLCH102.md +11 -0
- package/dist/okf/rules/SQLCH103.md +11 -0
- package/dist/okf/rules/SQLCH104.md +11 -0
- package/dist/okf/rules/SQLCH105.md +11 -0
- package/dist/okf/rules/SQLCH106.md +11 -0
- package/dist/okf/rules/SQLCH107.md +11 -0
- package/dist/okf/rules/SQLCH108.md +15 -0
- package/dist/okf/rules/SQLCH109.md +11 -0
- package/dist/okf/rules/SQLCH110.md +11 -0
- package/dist/okf/rules/SQLCH111.md +11 -0
- package/dist/okf/rules/SQLCH112.md +11 -0
- package/dist/okf/rules/SQLCH113.md +11 -0
- package/dist/okf/rules/SQLCH114.md +11 -0
- package/dist/okf/rules/SQLCH115.md +11 -0
- package/dist/okf/rules/SQLCH116.md +11 -0
- package/dist/okf/rules/SQLCH117.md +15 -0
- package/dist/okf/rules/SQLCH118.md +15 -0
- package/dist/okf/rules/SQLCH119.md +15 -0
- package/dist/okf/rules/SQLCH120.md +15 -0
- package/dist/okf/rules/SQLPG001.md +11 -0
- package/dist/okf/rules/SQLPG002.md +11 -0
- package/dist/okf/rules/SQLPG003.md +11 -0
- package/dist/okf/rules/SQLPG004.md +11 -0
- package/dist/okf/rules/SQLPG101.md +11 -0
- package/dist/okf/rules/SQLPG102.md +11 -0
- package/dist/okf/rules/SQLPG103.md +11 -0
- package/dist/okf/rules/SQLPG104.md +11 -0
- package/dist/okf/rules/SQLPG105.md +11 -0
- package/dist/okf/rules/SQLPG106.md +11 -0
- package/dist/okf/rules/SQLPG107.md +11 -0
- package/dist/okf/rules/SQLPG108.md +11 -0
- package/dist/okf/rules/SQLPG109.md +11 -0
- package/dist/okf/rules/SQLPG110.md +11 -0
- package/dist/okf/rules/SQLPG111.md +11 -0
- package/dist/okf/rules/SQLPG112.md +11 -0
- package/dist/okf/rules/SQLPG113.md +24 -0
- package/dist/okf/rules/SQLPG114.md +11 -0
- package/dist/okf/rules/SQLPG115.md +11 -0
- package/dist/okf/rules/SQLPG116.md +15 -0
- package/dist/okf/rules/SQLPG117.md +11 -0
- package/dist/okf/rules/SQLPG118.md +11 -0
- package/dist/okf/types/Database.md +15 -0
- package/dist/okf/types/MaterializedView.md +14 -0
- package/dist/okf/types/PostgresDomain.md +13 -0
- package/dist/okf/types/PostgresEnum.md +13 -0
- package/dist/okf/types/PostgresExtension.md +13 -0
- package/dist/okf/types/PostgresIndex.md +9 -0
- package/dist/okf/types/PostgresMaterializedView.md +13 -0
- package/dist/okf/types/PostgresSchema.md +13 -0
- package/dist/okf/types/PostgresSequence.md +13 -0
- package/dist/okf/types/PostgresTable.md +13 -0
- package/dist/okf/types/PostgresView.md +13 -0
- package/dist/okf/types/Table.md +15 -0
- package/dist/okf/types/View.md +13 -0
- package/dist/op/activities/clickhouse-apply.d.ts +56 -0
- package/dist/op/activities/clickhouse-apply.d.ts.map +1 -0
- package/dist/op/activities/clickhouse-emulator.d.ts +26 -0
- package/dist/op/activities/clickhouse-emulator.d.ts.map +1 -0
- package/dist/op/activities/clickhouse-rebuild.d.ts +43 -0
- package/dist/op/activities/clickhouse-rebuild.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +19 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/postgres-apply.d.ts +69 -0
- package/dist/op/activities/postgres-apply.d.ts.map +1 -0
- package/dist/op/activities/postgres-emulator.d.ts +33 -0
- package/dist/op/activities/postgres-emulator.d.ts.map +1 -0
- package/dist/op/activities/postgres-migration.d.ts +48 -0
- package/dist/op/activities/postgres-migration.d.ts.map +1 -0
- package/dist/op/activity-contracts.d.ts +464 -0
- package/dist/op/activity-contracts.d.ts.map +1 -0
- package/dist/package-cli.d.ts +3 -0
- package/dist/package-cli.d.ts.map +1 -0
- package/dist/plugin.d.ts +12 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/postgres/apply/apply.d.ts +163 -0
- package/dist/postgres/apply/apply.d.ts.map +1 -0
- package/dist/postgres/apply/statements.d.ts +138 -0
- package/dist/postgres/apply/statements.d.ts.map +1 -0
- package/dist/postgres/catalog-types.d.ts +50 -0
- package/dist/postgres/catalog-types.d.ts.map +1 -0
- package/dist/postgres/container.d.ts +23 -0
- package/dist/postgres/container.d.ts.map +1 -0
- package/dist/postgres/entities.d.ts +322 -0
- package/dist/postgres/entities.d.ts.map +1 -0
- package/dist/postgres/entity-types.d.ts +17 -0
- package/dist/postgres/entity-types.d.ts.map +1 -0
- package/dist/postgres/import/generator.d.ts +28 -0
- package/dist/postgres/import/generator.d.ts.map +1 -0
- package/dist/postgres/import/ir.d.ts +24 -0
- package/dist/postgres/import/ir.d.ts.map +1 -0
- package/dist/postgres/import/live-export.d.ts +26 -0
- package/dist/postgres/import/live-export.d.ts.map +1 -0
- package/dist/postgres/keywords.d.ts +22 -0
- package/dist/postgres/keywords.d.ts.map +1 -0
- package/dist/postgres/live/bind.d.ts +76 -0
- package/dist/postgres/live/bind.d.ts.map +1 -0
- package/dist/postgres/live/catalog.d.ts +98 -0
- package/dist/postgres/live/catalog.d.ts.map +1 -0
- package/dist/postgres/live/client.d.ts +32 -0
- package/dist/postgres/live/client.d.ts.map +1 -0
- package/dist/postgres/live/describe-resources.d.ts +41 -0
- package/dist/postgres/live/describe-resources.d.ts.map +1 -0
- package/dist/postgres/migrate/backfill.d.ts +103 -0
- package/dist/postgres/migrate/backfill.d.ts.map +1 -0
- package/dist/postgres/migrate/batches.d.ts +90 -0
- package/dist/postgres/migrate/batches.d.ts.map +1 -0
- package/dist/postgres/migrate/carry.d.ts +196 -0
- package/dist/postgres/migrate/carry.d.ts.map +1 -0
- package/dist/postgres/migrate/handoff.d.ts +46 -0
- package/dist/postgres/migrate/handoff.d.ts.map +1 -0
- package/dist/postgres/migrate/names.d.ts +55 -0
- package/dist/postgres/migrate/names.d.ts.map +1 -0
- package/dist/postgres/migrate/observe.d.ts +139 -0
- package/dist/postgres/migrate/observe.d.ts.map +1 -0
- package/dist/postgres/migrate/op.d.ts +128 -0
- package/dist/postgres/migrate/op.d.ts.map +1 -0
- package/dist/postgres/migrate/receipts.d.ts +63 -0
- package/dist/postgres/migrate/receipts.d.ts.map +1 -0
- package/dist/postgres/migrate/replication.d.ts +80 -0
- package/dist/postgres/migrate/replication.d.ts.map +1 -0
- package/dist/postgres/migrate/steps.d.ts +225 -0
- package/dist/postgres/migrate/steps.d.ts.map +1 -0
- package/dist/postgres/overlays/columns.d.ts +6 -0
- package/dist/postgres/overlays/columns.d.ts.map +1 -0
- package/dist/postgres/overlays/constraints.d.ts +8 -0
- package/dist/postgres/overlays/constraints.d.ts.map +1 -0
- package/dist/postgres/overlays/indexes.d.ts +8 -0
- package/dist/postgres/overlays/indexes.d.ts.map +1 -0
- package/dist/postgres/overlays/kinds.d.ts +48 -0
- package/dist/postgres/overlays/kinds.d.ts.map +1 -0
- package/dist/postgres/overlays/partitioning.d.ts +5 -0
- package/dist/postgres/overlays/partitioning.d.ts.map +1 -0
- package/dist/postgres/overlays/relations.d.ts +6 -0
- package/dist/postgres/overlays/relations.d.ts.map +1 -0
- package/dist/postgres/overlays/storage.d.ts +28 -0
- package/dist/postgres/overlays/storage.d.ts.map +1 -0
- package/dist/postgres/overlays/type-ddl.d.ts +7 -0
- package/dist/postgres/overlays/type-ddl.d.ts.map +1 -0
- package/dist/postgres/overlays/types.d.ts +24 -0
- package/dist/postgres/overlays/types.d.ts.map +1 -0
- package/dist/postgres/parser.d.ts +216 -0
- package/dist/postgres/parser.d.ts.map +1 -0
- package/dist/postgres/plan/commands.d.ts +61 -0
- package/dist/postgres/plan/commands.d.ts.map +1 -0
- package/dist/postgres/plan/deep.d.ts +33 -0
- package/dist/postgres/plan/deep.d.ts.map +1 -0
- package/dist/postgres/plan/diff.d.ts +45 -0
- package/dist/postgres/plan/diff.d.ts.map +1 -0
- package/dist/postgres/plan/disruption.d.ts +14 -0
- package/dist/postgres/plan/disruption.d.ts.map +1 -0
- package/dist/postgres/plan/normalize.d.ts +108 -0
- package/dist/postgres/plan/normalize.d.ts.map +1 -0
- package/dist/postgres/plan/report.d.ts +6 -0
- package/dist/postgres/plan/report.d.ts.map +1 -0
- package/dist/postgres/plan/rules.d.ts +84 -0
- package/dist/postgres/plan/rules.d.ts.map +1 -0
- package/dist/postgres/plan/schema.d.ts +50 -0
- package/dist/postgres/plan/schema.d.ts.map +1 -0
- package/dist/postgres/plan/server-normalize.d.ts +26 -0
- package/dist/postgres/plan/server-normalize.d.ts.map +1 -0
- package/dist/postgres/providers/aurora.d.ts +12 -0
- package/dist/postgres/providers/aurora.d.ts.map +1 -0
- package/dist/postgres/providers/azure.d.ts +14 -0
- package/dist/postgres/providers/azure.d.ts.map +1 -0
- package/dist/postgres/providers/cloud-sql.d.ts +11 -0
- package/dist/postgres/providers/cloud-sql.d.ts.map +1 -0
- package/dist/postgres/providers/index.d.ts +35 -0
- package/dist/postgres/providers/index.d.ts.map +1 -0
- package/dist/postgres/providers/neon.d.ts +13 -0
- package/dist/postgres/providers/neon.d.ts.map +1 -0
- package/dist/postgres/providers/rds.d.ts +10 -0
- package/dist/postgres/providers/rds.d.ts.map +1 -0
- package/dist/postgres/providers/supabase.d.ts +12 -0
- package/dist/postgres/providers/supabase.d.ts.map +1 -0
- package/dist/postgres/providers/types.d.ts +59 -0
- package/dist/postgres/providers/types.d.ts.map +1 -0
- package/dist/postgres/testing/fake-client.d.ts +38 -0
- package/dist/postgres/testing/fake-client.d.ts.map +1 -0
- package/dist/postgres/testing/migration.d.ts +25 -0
- package/dist/postgres/testing/migration.d.ts.map +1 -0
- package/dist/postgres/testing/roundtrip-schema.d.ts +11 -0
- package/dist/postgres/testing/roundtrip-schema.d.ts.map +1 -0
- package/dist/postgres/testing/server.d.ts +17 -0
- package/dist/postgres/testing/server.d.ts.map +1 -0
- package/dist/postgres/testing/writable-server.d.ts +45 -0
- package/dist/postgres/testing/writable-server.d.ts.map +1 -0
- package/dist/postgres/tokens.d.ts +26 -0
- package/dist/postgres/tokens.d.ts.map +1 -0
- package/dist/postgres.d.ts +13 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/rules/audit-entries.ts +29 -0
- package/dist/rules/clickhouse-helpers.ts +206 -0
- package/dist/rules/postgres-audit-entries.ts +29 -0
- package/dist/rules/postgres-helpers.ts +126 -0
- package/dist/rules/postgres-templates.ts +36 -0
- package/dist/rules/sql-helpers.ts +53 -0
- package/dist/rules/sqlch001.ts +53 -0
- package/dist/rules/sqlch002.ts +115 -0
- package/dist/rules/sqlch003.ts +68 -0
- package/dist/rules/sqlch101.ts +35 -0
- package/dist/rules/sqlch102.ts +23 -0
- package/dist/rules/sqlch103.ts +45 -0
- package/dist/rules/sqlch104.ts +42 -0
- package/dist/rules/sqlch105.ts +35 -0
- package/dist/rules/sqlch106.ts +27 -0
- package/dist/rules/sqlch107.ts +35 -0
- package/dist/rules/sqlch108.ts +27 -0
- package/dist/rules/sqlch109.ts +21 -0
- package/dist/rules/sqlch110.ts +29 -0
- package/dist/rules/sqlch111.ts +40 -0
- package/dist/rules/sqlch112.ts +30 -0
- package/dist/rules/sqlch113.ts +20 -0
- package/dist/rules/sqlch114.ts +26 -0
- package/dist/rules/sqlch115.ts +31 -0
- package/dist/rules/sqlch116.ts +22 -0
- package/dist/rules/sqlch117.ts +25 -0
- package/dist/rules/sqlch118.ts +26 -0
- package/dist/rules/sqlch119.ts +31 -0
- package/dist/rules/sqlch120.ts +21 -0
- package/dist/rules/sqlpg001.ts +88 -0
- package/dist/rules/sqlpg002.ts +68 -0
- package/dist/rules/sqlpg003.ts +59 -0
- package/dist/rules/sqlpg004.ts +73 -0
- package/dist/rules/sqlpg101.ts +24 -0
- package/dist/rules/sqlpg102.ts +30 -0
- package/dist/rules/sqlpg103.ts +23 -0
- package/dist/rules/sqlpg104.ts +23 -0
- package/dist/rules/sqlpg105.ts +22 -0
- package/dist/rules/sqlpg106.ts +22 -0
- package/dist/rules/sqlpg107.ts +22 -0
- package/dist/rules/sqlpg108.ts +27 -0
- package/dist/rules/sqlpg109.ts +37 -0
- package/dist/rules/sqlpg110.ts +33 -0
- package/dist/rules/sqlpg111.ts +23 -0
- package/dist/rules/sqlpg112.ts +25 -0
- package/dist/rules/sqlpg113.ts +28 -0
- package/dist/rules/sqlpg114.ts +37 -0
- package/dist/rules/sqlpg115.ts +38 -0
- package/dist/rules/sqlpg116.ts +25 -0
- package/dist/rules/sqlpg117.ts +24 -0
- package/dist/rules/sqlpg118.ts +22 -0
- package/dist/rules/templates.ts +35 -0
- package/dist/serializer.d.ts +37 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/skill-defs.d.ts +3 -0
- package/dist/skill-defs.d.ts.map +1 -0
- package/dist/spec/catalog.d.ts +125 -0
- package/dist/spec/catalog.d.ts.map +1 -0
- package/dist/spec/fetch.d.ts +43 -0
- package/dist/spec/fetch.d.ts.map +1 -0
- package/dist/spec/pin.d.ts +39 -0
- package/dist/spec/pin.d.ts.map +1 -0
- package/dist/spec/postgres-catalog.d.ts +108 -0
- package/dist/spec/postgres-catalog.d.ts.map +1 -0
- package/dist/spec/postgres-fetch.d.ts +46 -0
- package/dist/spec/postgres-fetch.d.ts.map +1 -0
- package/dist/spec/postgres-pin.d.ts +67 -0
- package/dist/spec/postgres-pin.d.ts.map +1 -0
- package/dist/types/index.d.ts +4386 -0
- package/dist/validate-cli.d.ts +3 -0
- package/dist/validate-cli.d.ts.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/package.json +74 -4
- package/src/clickhouse/apply/apply.ts +288 -0
- package/src/clickhouse/apply/mutations.ts +90 -0
- package/src/clickhouse/apply/statements.ts +393 -0
- package/src/clickhouse/catalog-types.ts +84 -0
- package/src/clickhouse/container.ts +176 -0
- package/src/clickhouse/engine-syntax.test.ts +53 -0
- package/src/clickhouse/engine-syntax.ts +173 -0
- package/src/clickhouse/entities.test.ts +188 -0
- package/src/clickhouse/entities.ts +425 -0
- package/src/clickhouse/http.ts +76 -0
- package/src/clickhouse/import/generator.ts +153 -0
- package/src/clickhouse/import/import.test.ts +157 -0
- package/src/clickhouse/import/ir.ts +171 -0
- package/src/clickhouse/import/live-export.ts +53 -0
- package/src/clickhouse/import/parser.ts +27 -0
- package/src/clickhouse/import/roundtrip.test.ts +90 -0
- package/src/clickhouse/live/bind.ts +126 -0
- package/src/clickhouse/live/catalog.ts +96 -0
- package/src/clickhouse/live/describe-resources.ts +98 -0
- package/src/clickhouse/live/live.test.ts +143 -0
- package/src/clickhouse/live/roundtrip.e2e.test.ts +93 -0
- package/src/clickhouse/overlays/codecs.ts +68 -0
- package/src/clickhouse/overlays/engines.ts +108 -0
- package/src/clickhouse/overlays/kinds.ts +38 -0
- package/src/clickhouse/overlays/projections.ts +36 -0
- package/src/clickhouse/overlays/skip-indexes.ts +44 -0
- package/src/clickhouse/overlays/ttl.ts +55 -0
- package/src/clickhouse/overlays/types.ts +58 -0
- package/src/clickhouse/ownership.test.ts +20 -0
- package/src/clickhouse/ownership.ts +103 -0
- package/src/clickhouse/parser.test.ts +166 -0
- package/src/clickhouse/parser.ts +459 -0
- package/src/clickhouse/plan/commands.ts +101 -0
- package/src/clickhouse/plan/deep.ts +124 -0
- package/src/clickhouse/plan/diff.ts +203 -0
- package/src/clickhouse/plan/disruption.ts +61 -0
- package/src/clickhouse/plan/normalize.ts +352 -0
- package/src/clickhouse/plan/plan-wiring.test.ts +77 -0
- package/src/clickhouse/plan/plan.e2e.test.ts +77 -0
- package/src/clickhouse/plan/plan.test.ts +201 -0
- package/src/clickhouse/plan/rebuild-handoff.ts +59 -0
- package/src/clickhouse/plan/report.ts +19 -0
- package/src/clickhouse/plan/rules.ts +241 -0
- package/src/clickhouse/plan/schema.ts +56 -0
- package/src/clickhouse/plan/server-format.ts +39 -0
- package/src/clickhouse/rebuild/backfill.ts +186 -0
- package/src/clickhouse/rebuild/observe.ts +380 -0
- package/src/clickhouse/rebuild/op.ts +206 -0
- package/src/clickhouse/rebuild/partitions.ts +62 -0
- package/src/clickhouse/rebuild/rebuild-replicated.e2e.test.ts +513 -0
- package/src/clickhouse/rebuild/rebuild.e2e.test.ts +351 -0
- package/src/clickhouse/rebuild/rebuild.test.ts +190 -0
- package/src/clickhouse/rebuild/receipts.ts +143 -0
- package/src/clickhouse/rebuild/replicas.test.ts +70 -0
- package/src/clickhouse/rebuild/replicas.ts +148 -0
- package/src/clickhouse/rebuild/steps.ts +382 -0
- package/src/clickhouse/rebuild/verify.ts +124 -0
- package/src/clickhouse/testdata/NOTICE +5 -0
- package/src/clickhouse/testdata/clickhouse-tests-corpus.json +302 -0
- package/src/clickhouse/testing/fake-server.ts +65 -0
- package/src/clickhouse/testing/roundtrip-schema.ts +25 -0
- package/src/clickhouse/testing/writable-server.ts +141 -0
- package/src/clickhouse/tokens.ts +28 -0
- package/src/clickhouse.ts +63 -0
- package/src/codegen/classifier-page.test.ts +16 -0
- package/src/codegen/classifier-page.ts +76 -0
- package/src/codegen/clickhouse-module.test.ts +63 -0
- package/src/codegen/clickhouse-module.ts +269 -0
- package/src/codegen/docs-cli.ts +4 -0
- package/src/codegen/docs.ts +225 -0
- package/src/codegen/generate-cli.ts +13 -0
- package/src/codegen/generate.ts +126 -0
- package/src/codegen/package.ts +36 -0
- package/src/codegen/postgres-classifier-page.ts +81 -0
- package/src/codegen/postgres-module.test.ts +77 -0
- package/src/codegen/postgres-module.ts +434 -0
- package/src/codegen/registry.ts +36 -0
- package/src/composites/audit-log-table.ts +54 -0
- package/src/composites/catalog.test.ts +61 -0
- package/src/composites/catalog.ts +529 -0
- package/src/composites/cdc-mirror.ts +54 -0
- package/src/composites/clickhouse.ts +7 -0
- package/src/composites/composites.test.ts +758 -0
- package/src/composites/events-table.ts +49 -0
- package/src/composites/index.ts +9 -0
- package/src/composites/join-table.ts +57 -0
- package/src/composites/postgres.ts +7 -0
- package/src/composites/refreshed-view.ts +46 -0
- package/src/composites/replacing-table.ts +49 -0
- package/src/composites/rollup-view.ts +55 -0
- package/src/composites/sharded-table.ts +49 -0
- package/src/composites/soft-delete-table.ts +61 -0
- package/src/composites/tenant-table.ts +50 -0
- package/src/config.ts +157 -0
- package/src/core/apply.ts +153 -0
- package/src/core/classifier.ts +186 -0
- package/src/core/container.ts +93 -0
- package/src/core/core.test.ts +254 -0
- package/src/core/cursor.ts +189 -0
- package/src/core/diff.ts +72 -0
- package/src/core/entity.ts +85 -0
- package/src/core/find-templates.ts +158 -0
- package/src/core/handoff.ts +44 -0
- package/src/core/index.ts +61 -0
- package/src/core/interpolation.ts +225 -0
- package/src/core/normalize.ts +39 -0
- package/src/core/ownership.test.ts +36 -0
- package/src/core/ownership.ts +133 -0
- package/src/core/receipts.ts +29 -0
- package/src/core/references.ts +74 -0
- package/src/core/template.ts +83 -0
- package/src/core/testing/http-stub.ts +33 -0
- package/src/core/tokens.ts +252 -0
- package/src/coverage.ts +64 -0
- package/src/detect.ts +32 -0
- package/src/dialects.ts +21 -0
- package/src/generated/clickhouse-types.ts +4386 -0
- package/src/generated/clickhouse.ts +2476 -0
- package/src/generated/index.d.ts +4386 -0
- package/src/generated/lexicon-sql.json +67 -0
- package/src/generated/postgres-types.ts +1190 -0
- package/src/generated/postgres.ts +1039 -0
- package/src/import-generator.ts +18 -0
- package/src/index.ts +21 -0
- package/src/init-templates.test.ts +108 -0
- package/src/init-templates.ts +327 -0
- package/src/lint/audit-catalog.ts +73 -0
- package/src/lint/audit-lineage.ts +47 -0
- package/src/lint/post-synth/audit-entries.ts +29 -0
- package/src/lint/post-synth/clickhouse-checks.test.ts +278 -0
- package/src/lint/post-synth/clickhouse-helpers.ts +206 -0
- package/src/lint/post-synth/index.ts +81 -0
- package/src/lint/post-synth/post-synth.test.ts +33 -0
- package/src/lint/post-synth/postgres-audit-entries.ts +29 -0
- package/src/lint/post-synth/postgres-checks.test.ts +257 -0
- package/src/lint/post-synth/postgres-helpers.ts +126 -0
- package/src/lint/post-synth/sql-helpers.ts +53 -0
- package/src/lint/post-synth/sqlch101.ts +35 -0
- package/src/lint/post-synth/sqlch102.ts +23 -0
- package/src/lint/post-synth/sqlch103.ts +45 -0
- package/src/lint/post-synth/sqlch104.ts +42 -0
- package/src/lint/post-synth/sqlch105.ts +35 -0
- package/src/lint/post-synth/sqlch106.ts +27 -0
- package/src/lint/post-synth/sqlch107.ts +35 -0
- package/src/lint/post-synth/sqlch108.ts +27 -0
- package/src/lint/post-synth/sqlch109.ts +21 -0
- package/src/lint/post-synth/sqlch110.ts +29 -0
- package/src/lint/post-synth/sqlch111.ts +40 -0
- package/src/lint/post-synth/sqlch112.ts +30 -0
- package/src/lint/post-synth/sqlch113.ts +20 -0
- package/src/lint/post-synth/sqlch114.ts +26 -0
- package/src/lint/post-synth/sqlch115.ts +31 -0
- package/src/lint/post-synth/sqlch116.ts +22 -0
- package/src/lint/post-synth/sqlch117.ts +25 -0
- package/src/lint/post-synth/sqlch118.ts +26 -0
- package/src/lint/post-synth/sqlch119.ts +31 -0
- package/src/lint/post-synth/sqlch120.ts +21 -0
- package/src/lint/post-synth/sqlpg101.ts +24 -0
- package/src/lint/post-synth/sqlpg102.ts +30 -0
- package/src/lint/post-synth/sqlpg103.ts +23 -0
- package/src/lint/post-synth/sqlpg104.ts +23 -0
- package/src/lint/post-synth/sqlpg105.ts +22 -0
- package/src/lint/post-synth/sqlpg106.ts +22 -0
- package/src/lint/post-synth/sqlpg107.ts +22 -0
- package/src/lint/post-synth/sqlpg108.ts +27 -0
- package/src/lint/post-synth/sqlpg109.ts +37 -0
- package/src/lint/post-synth/sqlpg110.ts +33 -0
- package/src/lint/post-synth/sqlpg111.ts +23 -0
- package/src/lint/post-synth/sqlpg112.ts +25 -0
- package/src/lint/post-synth/sqlpg113.ts +28 -0
- package/src/lint/post-synth/sqlpg114.ts +37 -0
- package/src/lint/post-synth/sqlpg115.ts +38 -0
- package/src/lint/post-synth/sqlpg116.ts +25 -0
- package/src/lint/post-synth/sqlpg117.ts +24 -0
- package/src/lint/post-synth/sqlpg118.ts +22 -0
- package/src/lint/rules/index.ts +13 -0
- package/src/lint/rules/postgres-templates.ts +36 -0
- package/src/lint/rules/rules.test.ts +228 -0
- package/src/lint/rules/sqlch001.ts +53 -0
- package/src/lint/rules/sqlch002.ts +115 -0
- package/src/lint/rules/sqlch003.ts +68 -0
- package/src/lint/rules/sqlpg001.ts +88 -0
- package/src/lint/rules/sqlpg002.ts +68 -0
- package/src/lint/rules/sqlpg003.ts +59 -0
- package/src/lint/rules/sqlpg004.ts +73 -0
- package/src/lint/rules/templates.ts +35 -0
- package/src/live-dialect.ts +37 -0
- package/src/lsp/catalog.ts +60 -0
- package/src/lsp/completions.test.ts +111 -0
- package/src/lsp/completions.ts +128 -0
- package/src/lsp/diagnostics.test.ts +26 -0
- package/src/lsp/hover.test.ts +90 -0
- package/src/lsp/hover.ts +113 -0
- package/src/lsp/postgres-catalog.ts +234 -0
- package/src/lsp/postgres-template.ts +161 -0
- package/src/lsp/postgres.test.ts +150 -0
- package/src/lsp/postgres.ts +270 -0
- package/src/lsp/refs.ts +53 -0
- package/src/lsp/registry.ts +19 -0
- package/src/lsp/template.ts +166 -0
- package/src/mcp/index.ts +304 -0
- package/src/mcp/mcp.test.ts +184 -0
- package/src/mcp/postgres.ts +125 -0
- package/src/op/activities/clickhouse-apply.e2e.test.ts +150 -0
- package/src/op/activities/clickhouse-apply.test.ts +265 -0
- package/src/op/activities/clickhouse-apply.ts +113 -0
- package/src/op/activities/clickhouse-emulator.test.ts +23 -0
- package/src/op/activities/clickhouse-emulator.ts +37 -0
- package/src/op/activities/clickhouse-rebuild.ts +136 -0
- package/src/op/activities/index.ts +50 -0
- package/src/op/activities/postgres-apply.e2e.test.ts +184 -0
- package/src/op/activities/postgres-apply.test.ts +304 -0
- package/src/op/activities/postgres-apply.ts +170 -0
- package/src/op/activities/postgres-emulator.test.ts +26 -0
- package/src/op/activities/postgres-emulator.ts +44 -0
- package/src/op/activities/postgres-migration.ts +182 -0
- package/src/op/activity-contracts.ts +210 -0
- package/src/package-cli.ts +17 -0
- package/src/plugin.test.ts +74 -0
- package/src/plugin.ts +242 -0
- package/src/postgres/apply/apply.ts +582 -0
- package/src/postgres/apply/statements.test.ts +155 -0
- package/src/postgres/apply/statements.ts +603 -0
- package/src/postgres/catalog-types.ts +59 -0
- package/src/postgres/container.ts +72 -0
- package/src/postgres/entities.test.ts +170 -0
- package/src/postgres/entities.ts +1016 -0
- package/src/postgres/entity-types.ts +18 -0
- package/src/postgres/import/generator.ts +176 -0
- package/src/postgres/import/import.test.ts +71 -0
- package/src/postgres/import/ir.ts +67 -0
- package/src/postgres/import/live-export.ts +53 -0
- package/src/postgres/import/live-warnings.test.ts +45 -0
- package/src/postgres/keywords.ts +40 -0
- package/src/postgres/live/bind.ts +146 -0
- package/src/postgres/live/catalog.ts +581 -0
- package/src/postgres/live/client.ts +84 -0
- package/src/postgres/live/describe-resources.ts +111 -0
- package/src/postgres/live/live.test.ts +198 -0
- package/src/postgres/live/roundtrip.e2e.test.ts +111 -0
- package/src/postgres/migrate/backfill.ts +233 -0
- package/src/postgres/migrate/batches.e2e.test.ts +163 -0
- package/src/postgres/migrate/batches.test.ts +36 -0
- package/src/postgres/migrate/batches.ts +159 -0
- package/src/postgres/migrate/carry.e2e.test.ts +335 -0
- package/src/postgres/migrate/carry.test.ts +103 -0
- package/src/postgres/migrate/carry.ts +653 -0
- package/src/postgres/migrate/handoff.ts +73 -0
- package/src/postgres/migrate/kinds.e2e.test.ts +204 -0
- package/src/postgres/migrate/migrate.e2e.test.ts +362 -0
- package/src/postgres/migrate/migrate.test.ts +322 -0
- package/src/postgres/migrate/names.ts +93 -0
- package/src/postgres/migrate/observe.ts +521 -0
- package/src/postgres/migrate/op.ts +242 -0
- package/src/postgres/migrate/receipts.ts +135 -0
- package/src/postgres/migrate/replication.ts +151 -0
- package/src/postgres/migrate/steps.ts +657 -0
- package/src/postgres/overlays/columns.ts +34 -0
- package/src/postgres/overlays/constraints.ts +56 -0
- package/src/postgres/overlays/indexes.ts +27 -0
- package/src/postgres/overlays/kinds.ts +53 -0
- package/src/postgres/overlays/partitioning.ts +26 -0
- package/src/postgres/overlays/relations.ts +29 -0
- package/src/postgres/overlays/storage.ts +75 -0
- package/src/postgres/overlays/type-ddl.ts +38 -0
- package/src/postgres/overlays/types.ts +56 -0
- package/src/postgres/parser.test.ts +214 -0
- package/src/postgres/parser.ts +1062 -0
- package/src/postgres/plan/commands.ts +124 -0
- package/src/postgres/plan/deep.ts +177 -0
- package/src/postgres/plan/diff.ts +323 -0
- package/src/postgres/plan/disruption.ts +52 -0
- package/src/postgres/plan/normalize.test.ts +148 -0
- package/src/postgres/plan/normalize.ts +542 -0
- package/src/postgres/plan/plan.e2e.test.ts +117 -0
- package/src/postgres/plan/plan.test.ts +244 -0
- package/src/postgres/plan/report.ts +24 -0
- package/src/postgres/plan/rules.ts +276 -0
- package/src/postgres/plan/schema.ts +114 -0
- package/src/postgres/plan/server-normalize.ts +123 -0
- package/src/postgres/providers/aurora.ts +45 -0
- package/src/postgres/providers/azure.ts +54 -0
- package/src/postgres/providers/cloud-sql.ts +42 -0
- package/src/postgres/providers/index.ts +90 -0
- package/src/postgres/providers/neon.ts +45 -0
- package/src/postgres/providers/providers.test.ts +136 -0
- package/src/postgres/providers/rds.ts +48 -0
- package/src/postgres/providers/supabase.ts +46 -0
- package/src/postgres/providers/types.ts +70 -0
- package/src/postgres/testdata/NOTICE +31 -0
- package/src/postgres/testdata/postgres-regress-corpus.json +460 -0
- package/src/postgres/testing/fake-client.ts +42 -0
- package/src/postgres/testing/migration.ts +52 -0
- package/src/postgres/testing/roundtrip-schema.ts +46 -0
- package/src/postgres/testing/server.ts +58 -0
- package/src/postgres/testing/writable-server.ts +188 -0
- package/src/postgres/tokens.ts +46 -0
- package/src/postgres.ts +75 -0
- package/src/serializer.test.ts +128 -0
- package/src/serializer.ts +148 -0
- package/src/skill-defs.test.ts +81 -0
- package/src/skill-defs.ts +102 -0
- package/src/skills/chant-sql-plan.md +123 -0
- package/src/skills/chant-sql-postgres-migration.md +126 -0
- package/src/skills/chant-sql-postgres-plan.md +194 -0
- package/src/skills/chant-sql-postgres.md +165 -0
- package/src/skills/chant-sql-rebuild.md +68 -0
- package/src/skills/chant-sql.md +123 -0
- package/src/spec/catalog.e2e.test.ts +29 -0
- package/src/spec/catalog.test.ts +56 -0
- package/src/spec/catalog.ts +311 -0
- package/src/spec/clickhouse-catalog.snapshot.json +5246 -0
- package/src/spec/fetch.test.ts +77 -0
- package/src/spec/fetch.ts +112 -0
- package/src/spec/pin.ts +47 -0
- package/src/spec/postgres-catalog-14.snapshot.json +3494 -0
- package/src/spec/postgres-catalog-15.snapshot.json +3529 -0
- package/src/spec/postgres-catalog-16.snapshot.json +3597 -0
- package/src/spec/postgres-catalog-17.snapshot.json +3656 -0
- package/src/spec/postgres-catalog-18.snapshot.json +3747 -0
- package/src/spec/postgres-catalog.test.ts +43 -0
- package/src/spec/postgres-catalog.ts +301 -0
- package/src/spec/postgres-fetch.test.ts +75 -0
- package/src/spec/postgres-fetch.ts +112 -0
- package/src/spec/postgres-pin.test.ts +64 -0
- package/src/spec/postgres-pin.ts +101 -0
- package/src/typecheck.test.ts +104 -0
- package/src/validate-cli.ts +6 -0
- package/src/validate.ts +149 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { diffPgSchemas, type PgSchemaDiff } from "./diff";
|
|
3
|
+
import { diffObject, keyedByQualifiedName, renameHints, type PgSchemaObject } from "./schema";
|
|
4
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { diffPgBuildFiles } from "./commands";
|
|
8
|
+
import { renderPgDiff } from "./report";
|
|
9
|
+
import { classifyPgDisruption } from "./disruption";
|
|
10
|
+
import { PG_CLASSIFIER_RULES } from "./rules";
|
|
11
|
+
|
|
12
|
+
const TYPES: Record<string, string> = {
|
|
13
|
+
table: "Postgres::Table",
|
|
14
|
+
index: "Postgres::Index",
|
|
15
|
+
view: "Postgres::View",
|
|
16
|
+
materialized: "Postgres::MaterializedView",
|
|
17
|
+
sequence: "Postgres::Sequence",
|
|
18
|
+
type: "Postgres::Enum",
|
|
19
|
+
domain: "Postgres::Domain",
|
|
20
|
+
schema: "Postgres::Schema",
|
|
21
|
+
extension: "Postgres::Extension",
|
|
22
|
+
};
|
|
23
|
+
const obj = (key: string, kind: keyof typeof TYPES, ddl: string): PgSchemaObject => ({ key, canonical: { ...diffObject(TYPES[kind]!, ddl, "public"), exportName: key } });
|
|
24
|
+
const diff = (before: PgSchemaObject[], after: PgSchemaObject[]): PgSchemaDiff => diffPgSchemas(before, after);
|
|
25
|
+
const rules = (d: PgSchemaDiff) => d.changes.map((c) => [c.field, c.rule, c.class]);
|
|
26
|
+
|
|
27
|
+
const ORDERS = "CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) NOT NULL, note varchar(20), status text)";
|
|
28
|
+
const table = (ddl: string) => obj("orders", "table", ddl);
|
|
29
|
+
|
|
30
|
+
describe("columns", () => {
|
|
31
|
+
test("adding a column: metadata, a rewrite for a volatile default or stored generated column, expand for NOT NULL with no default", () => {
|
|
32
|
+
const d = diff(
|
|
33
|
+
[table(ORDERS)],
|
|
34
|
+
[
|
|
35
|
+
table(`CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) NOT NULL, note varchar(20), status text,
|
|
36
|
+
a int, b timestamptz NOT NULL DEFAULT now(), c uuid DEFAULT gen_random_uuid(), d numeric GENERATED ALWAYS AS (amount * 2) STORED,
|
|
37
|
+
e numeric GENERATED ALWAYS AS (amount * 3), f bigint GENERATED ALWAYS AS IDENTITY, g int NOT NULL)`),
|
|
38
|
+
],
|
|
39
|
+
);
|
|
40
|
+
expect(rules(d)).toEqual([
|
|
41
|
+
["columns.a", "SQLPG201", "metadata"],
|
|
42
|
+
["columns.b", "SQLPG201", "metadata"],
|
|
43
|
+
["columns.c", "SQLPG202", "rewrite"],
|
|
44
|
+
["columns.d", "SQLPG202", "rewrite"],
|
|
45
|
+
["columns.e", "SQLPG201", "metadata"],
|
|
46
|
+
["columns.f", "SQLPG202", "rewrite"],
|
|
47
|
+
["columns.g", "SQLPG203", "expand"],
|
|
48
|
+
]);
|
|
49
|
+
expect(d.refused.map((c) => c.field)).toEqual(["columns.g"]);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("a type change is metadata when binary-coercible, a rewrite within a kind, expand across kinds", () => {
|
|
53
|
+
const d = diff(
|
|
54
|
+
[table(ORDERS)],
|
|
55
|
+
[table("CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(14,2) NOT NULL, note text, status integer)")],
|
|
56
|
+
);
|
|
57
|
+
expect(rules(d)).toEqual([
|
|
58
|
+
["columns.amount.type", "SQLPG206", "metadata"],
|
|
59
|
+
["columns.note.type", "SQLPG206", "metadata"],
|
|
60
|
+
["columns.status.type", "SQLPG208", "expand"],
|
|
61
|
+
]);
|
|
62
|
+
expect(rules(diff([table("CREATE TABLE app.orders (id integer)")], [table("CREATE TABLE app.orders (id bigint)")]))).toEqual([
|
|
63
|
+
["columns.id.type", "SQLPG207", "rewrite"],
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("serial is an integer column with an owned sequence: never qualified, classified by the integer types", () => {
|
|
68
|
+
const col = (t: string) => table(`CREATE TABLE app.orders (id ${t} PRIMARY KEY)`);
|
|
69
|
+
const d = diff([col("serial")], [col("bigserial")]);
|
|
70
|
+
expect(rules(d)).toEqual([["columns.id.type", "SQLPG207", "rewrite"]]);
|
|
71
|
+
expect(d.changes[0]!.before).toBe("serial");
|
|
72
|
+
expect(d.changes[0]!.after).toBe("bigserial");
|
|
73
|
+
expect(d.changes[0]!.note).toContain("sequence is widened to bigint");
|
|
74
|
+
expect(rules(diff([col("smallserial")], [col("serial")]))).toEqual([["columns.id.type", "SQLPG207", "rewrite"]]);
|
|
75
|
+
expect(rules(diff([col("serial")], [col("serial")]))).toEqual([]);
|
|
76
|
+
expect(rules(diff([col("serial")], [col("integer")]))).toEqual([["columns.id.default", "SQLPG209", "metadata"]]);
|
|
77
|
+
expect(rules(diff([col("integer")], [col("bigserial")]))).toEqual([["columns.id.type", "SQLPG207", "rewrite"]]);
|
|
78
|
+
expect(rules(diff([col("serial")], [col("text")]))).toEqual([["columns.id.type", "SQLPG208", "expand"]]);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("NOT NULL, defaults, comments, and a rename with and without the hint", () => {
|
|
82
|
+
expect(rules(diff([table(ORDERS)], [table("CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) DEFAULT 0, note varchar(20) NOT NULL, status text)")]))).toEqual([
|
|
83
|
+
["columns.amount.default", "SQLPG209", "metadata"],
|
|
84
|
+
["columns.amount.notNull", "SQLPG211", "metadata"],
|
|
85
|
+
["columns.note.notNull", "SQLPG210", "rewrite"],
|
|
86
|
+
]);
|
|
87
|
+
const renamed = diff([table(ORDERS)], [table(`CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) NOT NULL, note varchar(20),
|
|
88
|
+
state text -- previously: status
|
|
89
|
+
)`)]);
|
|
90
|
+
expect(rules(renamed)).toEqual([["columns.state", "SQLPG205", "expand"]]);
|
|
91
|
+
const unhinted = diff([table(ORDERS)], [table("CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) NOT NULL, note varchar(20), state text)")]);
|
|
92
|
+
expect(rules(unhinted)).toEqual([
|
|
93
|
+
["columns.state", "SQLPG201", "metadata"],
|
|
94
|
+
["columns.status", "SQLPG204", "metadata"],
|
|
95
|
+
]);
|
|
96
|
+
expect(unhinted.hints[0]).toMatch(/-- previously: status/);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("SET NOT NULL proven by a valid check is metadata", () => {
|
|
100
|
+
const before = table("CREATE TABLE app.orders (note text, CONSTRAINT note_nn CHECK (note IS NOT NULL))");
|
|
101
|
+
const after = table("CREATE TABLE app.orders (note text NOT NULL, CONSTRAINT note_nn CHECK (note IS NOT NULL))");
|
|
102
|
+
expect(rules(diff([before], [after]))).toEqual([["columns.note.notNull", "SQLPG210", "metadata"]]);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe("constraints", () => {
|
|
107
|
+
const base = "CREATE TABLE app.orders (id bigint, user_id bigint, amount numeric";
|
|
108
|
+
test("added NOT VALID is metadata; validated, a check is a rewrite and a foreign key a validate; removing NOT VALID validates", () => {
|
|
109
|
+
const before = table(`${base})`);
|
|
110
|
+
const d = diff(
|
|
111
|
+
[before],
|
|
112
|
+
[table(`${base}, CONSTRAINT a CHECK (amount > 0), CONSTRAINT b CHECK (amount < 100) NOT VALID, CONSTRAINT c FOREIGN KEY (user_id) REFERENCES app.users (id), UNIQUE (id), EXCLUDE USING gist (id WITH =))`)],
|
|
113
|
+
);
|
|
114
|
+
expect(rules(d)).toEqual([
|
|
115
|
+
["constraints.unique", "SQLPG221", "concurrently"],
|
|
116
|
+
["constraints.a", "SQLPG218", "rewrite"],
|
|
117
|
+
["constraints.b", "SQLPG217", "metadata"],
|
|
118
|
+
["constraints.c", "SQLPG219", "validate"],
|
|
119
|
+
["constraints.exclude", "SQLPG222", "rewrite"],
|
|
120
|
+
]);
|
|
121
|
+
const validated = diff([table(`${base}, CONSTRAINT b CHECK (amount < 100) NOT VALID)`)], [table(`${base}, CONSTRAINT b CHECK (amount < 100))`)]);
|
|
122
|
+
expect(rules(validated)).toEqual([["constraints.b", "SQLPG220", "validate"]]);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("an unnamed constraint matches the server's named one by what it says, and a dropped one is metadata", () => {
|
|
126
|
+
const declared = table(`${base}, CHECK (amount IN (1, 2)))`);
|
|
127
|
+
const live = table(`${base}, CONSTRAINT orders_amount_check CHECK ((amount = ANY (ARRAY[1, 2]))))`);
|
|
128
|
+
expect(diff([live], [declared]).changes).toEqual([]);
|
|
129
|
+
expect(rules(diff([live], [table(`${base})`)]))).toEqual([["constraints.orders_amount_check", "SQLPG223", "metadata"]]);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("objects", () => {
|
|
134
|
+
test("an index on an existing table needs CONCURRENTLY; on a new table it is part of the create", () => {
|
|
135
|
+
const users = table(ORDERS);
|
|
136
|
+
const conc = obj("byStatus", "index", "CREATE INDEX CONCURRENTLY by_status ON app.orders (status)");
|
|
137
|
+
const plain = obj("byNote", "index", "CREATE INDEX by_note ON app.orders (note)");
|
|
138
|
+
expect(rules(diff([users], [users, conc, plain]))).toEqual([
|
|
139
|
+
["index", "SQLPG240", "concurrently"],
|
|
140
|
+
["index", "SQLPG241", "concurrently"],
|
|
141
|
+
]);
|
|
142
|
+
expect(rules(diff([], [users, plain])).map((r) => r[1])).toEqual(["SQLPG200", "SQLPG200"]);
|
|
143
|
+
expect(rules(diff([users, plain], [users]))).toEqual([["index", "SQLPG242", "concurrently"]]);
|
|
144
|
+
expect(rules(diff([plain], [obj("byNote", "index", "CREATE INDEX by_note ON app.orders (note DESC)")]))).toEqual([["elements", "SQLPG243", "concurrently"]]);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("a view that keeps its columns is replaced; one that drops a column is expand; a materialized view is rebuilt", () => {
|
|
148
|
+
const v = (q: string) => obj("v", "view", `CREATE VIEW app.v AS ${q}`);
|
|
149
|
+
expect(rules(diff([v("SELECT id, note FROM app.orders")], [v("SELECT id, note, status FROM app.orders")]))).toEqual([["query", "SQLPG250", "metadata"]]);
|
|
150
|
+
expect(rules(diff([v("SELECT id, note FROM app.orders")], [v("SELECT id FROM app.orders")]))).toEqual([["query", "SQLPG251", "expand"]]);
|
|
151
|
+
const m = (q: string) => obj("m", "materialized", `CREATE MATERIALIZED VIEW app.m AS ${q}`);
|
|
152
|
+
expect(rules(diff([m("SELECT 1 AS a")], [m("SELECT 2 AS a")]))).toEqual([["query", "SQLPG252", "rewrite"]]);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("enum labels added are metadata; removed or reordered are expand", () => {
|
|
156
|
+
const e = (labels: string) => obj("s", "type", `CREATE TYPE app.s AS ENUM (${labels})`);
|
|
157
|
+
expect(rules(diff([e("'a', 'c'")], [e("'a', 'b', 'c'")]))).toEqual([["labels", "SQLPG260", "metadata"]]);
|
|
158
|
+
expect(rules(diff([e("'a', 'c'")], [e("'c', 'a'")]))).toEqual([["labels", "SQLPG261", "expand"]]);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("renames: an export renamed in SQL is a rename (expand); an index rename is metadata; a dropped table destroys data", () => {
|
|
162
|
+
expect(rules(diff([table(ORDERS)], [table(ORDERS.replace("app.orders", "app.purchases"))]))).toEqual([["name", "SQLPG228", "expand"]]);
|
|
163
|
+
const i = (n: string) => obj("i", "index", `CREATE INDEX ${n} ON app.orders (note)`);
|
|
164
|
+
expect(rules(diff([i("a")], [i("b")]))).toEqual([["name", "SQLPG229", "metadata"]]);
|
|
165
|
+
const dropped = diff([table(ORDERS)], []);
|
|
166
|
+
expect(dropped.changes[0]).toMatchObject({ rule: "SQLPG270", class: "drop", destructive: true });
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("against a server, -- previously: matches a renamed object by its old qualified name", () => {
|
|
170
|
+
const live = keyedByQualifiedName([table(ORDERS)]);
|
|
171
|
+
const declared = keyedByQualifiedName([table(`-- previously: orders\n${ORDERS.replace("app.orders", "app.purchases")}`)]);
|
|
172
|
+
expect(rules(diffPgSchemas(live, declared))).toEqual([["name", "SQLPG228", "expand"]]);
|
|
173
|
+
expect(renameHints("-- previously: orders\nCREATE TABLE t (\n a int -- previously: b\n)")).toEqual({ previously: "orders", columns: { a: "b" } });
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("another tool's table is never proposed for a drop", () => {
|
|
177
|
+
const prisma = { key: "relation public._prisma_migrations", canonical: { ...diffObject("Postgres::Table", "CREATE TABLE public._prisma_migrations (id text)", "public"), foreign: "Prisma Migrate" } };
|
|
178
|
+
const d = diffPgSchemas([prisma], []);
|
|
179
|
+
expect(d.changes).toEqual([]);
|
|
180
|
+
expect(d.hints[0]).toMatch(/kept by Prisma Migrate/);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe("the major (sql.postgresMajor)", () => {
|
|
185
|
+
test("a stored generated expression is a rewrite from 17 and expand before; a table's access method is expand before 15", () => {
|
|
186
|
+
const g = (e: string) => table(`CREATE TABLE app.orders (a int, b int GENERATED ALWAYS AS (${e}) STORED)`);
|
|
187
|
+
expect(diffPgSchemas([g("a * 2")], [g("a * 3")]).changes[0]).toMatchObject({ rule: "SQLPG212", class: "rewrite" });
|
|
188
|
+
expect(diffPgSchemas([g("a * 2")], [g("a * 3")], { major: 16 }).changes[0]).toMatchObject({ rule: "SQLPG212", class: "expand" });
|
|
189
|
+
const am = (m: string) => table(`CREATE TABLE app.orders (a int) USING ${m}`);
|
|
190
|
+
expect(diffPgSchemas([am("heap")], [am("columnar")], { major: 14 }).changes[0]).toMatchObject({ rule: "SQLPG226", class: "expand" });
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe("the major a build records (chant sql diff)", () => {
|
|
195
|
+
const build = (expr: string, postgresMajor?: number) => {
|
|
196
|
+
const ddl = `CREATE TABLE app.orders (a int, b int GENERATED ALWAYS AS (${expr}) STORED)`;
|
|
197
|
+
const doc = { dialect: "postgres", ...(postgresMajor === undefined ? {} : { postgresMajor }), applyOrder: ["orders"], objects: [{ export: "orders", type: "Postgres::Table", name: "orders", ddl }] };
|
|
198
|
+
const file = join(mkdtempSync(join(tmpdir(), "pg-major-")), "schema.json");
|
|
199
|
+
writeFileSync(file, JSON.stringify(doc));
|
|
200
|
+
return file;
|
|
201
|
+
};
|
|
202
|
+
const cls = (before: string, after: string, config?: number) => diffPgBuildFiles(before, after, config).changes[0]!.class;
|
|
203
|
+
|
|
204
|
+
test("the recorded major decides: SET EXPRESSION is a rewrite at 18 and expand and contract at 14", () => {
|
|
205
|
+
expect(cls(build("a * 2", 18), build("a * 3", 18))).toBe("rewrite");
|
|
206
|
+
expect(cls(build("a * 2", 14), build("a * 3", 14))).toBe("expand");
|
|
207
|
+
});
|
|
208
|
+
test("the recorded major wins over the config, and the config answers for a build with none", () => {
|
|
209
|
+
expect(cls(build("a * 2", 18), build("a * 3", 18), 14)).toBe("rewrite");
|
|
210
|
+
expect(cls(build("a * 2", 14), build("a * 3", 14), 18)).toBe("expand");
|
|
211
|
+
expect(cls(build("a * 2"), build("a * 3"), 14)).toBe("expand");
|
|
212
|
+
expect(cls(build("a * 2"), build("a * 3"))).toBe("rewrite");
|
|
213
|
+
});
|
|
214
|
+
test("the newer build's major wins over the older one's", () => {
|
|
215
|
+
expect(cls(build("a * 2", 14), build("a * 3", 18))).toBe("rewrite");
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe("the report, disruption and the rule table", () => {
|
|
220
|
+
test("the report names the class, the rule, the lock and the citation, and the refusal", () => {
|
|
221
|
+
const text = renderPgDiff(diff([table(ORDERS)], [table("CREATE TABLE app.orders (id bigint PRIMARY KEY, amount numeric(12,2) NOT NULL, note varchar(20), status integer)")]));
|
|
222
|
+
expect(text).toContain("[EXPAND AND CONTRACT] columns.status.type: text -> integer");
|
|
223
|
+
expect(text).toContain("https://www.postgresql.org/docs/18/sql-altertable.html");
|
|
224
|
+
expect(text).toMatch(/Refused: 1 change/);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("classifyDisruption maps paths onto rules, unknown where a path alone cannot say", () => {
|
|
228
|
+
const v = classifyPgDisruption({
|
|
229
|
+
environment: "prod",
|
|
230
|
+
changes: [
|
|
231
|
+
{ name: "t", type: "Postgres::Table", deltas: [{ path: "comment" } as never] },
|
|
232
|
+
{ name: "u", type: "Postgres::Table", deltas: [{ path: "columns[1].type" } as never] },
|
|
233
|
+
{ name: "c", type: "ClickHouse::Table", deltas: [{ path: "comment" } as never] },
|
|
234
|
+
],
|
|
235
|
+
});
|
|
236
|
+
expect(v.t).toMatchObject({ disruption: "in-place" });
|
|
237
|
+
expect(v.u).toMatchObject({ disruption: "unknown" });
|
|
238
|
+
expect(v.c).toBeUndefined();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("every rule cites the Postgres 18 documentation", () => {
|
|
242
|
+
for (const r of Object.values(PG_CLASSIFIER_RULES)) expect(r.cite).toMatch(/^https:\/\/www\.postgresql\.org\/docs\/18\//);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** A Postgres schema diff as text (the shared core's report, with the refusal of expand-and-contract changes). */
|
|
2
|
+
|
|
3
|
+
import { renderChangeSet } from "../../core/classifier";
|
|
4
|
+
import { PG_CHANGE_CLASSES, PG_CLASSIFIER_RULES } from "./rules";
|
|
5
|
+
import type { PgSchemaDiff } from "./diff";
|
|
6
|
+
import { renderMigrationOpSuggestions } from "../migrate/handoff";
|
|
7
|
+
|
|
8
|
+
export function renderPgDiff(diff: PgSchemaDiff, opts: { title?: string } = {}): string {
|
|
9
|
+
const rewrites = diff.changes.filter((c) => c.class === "rewrite").length;
|
|
10
|
+
const trailer = [
|
|
11
|
+
...(rewrites > 0
|
|
12
|
+
? ["", `Warning: ${rewrites} change(s) rewrite or read a table under ACCESS EXCLUSIVE, which blocks its reads and writes until done; the rule names the form that does not.`]
|
|
13
|
+
: []),
|
|
14
|
+
...(diff.refused.length > 0
|
|
15
|
+
? [
|
|
16
|
+
"",
|
|
17
|
+
`Refused: ${diff.refused.length} change(s) keep no old reader working when made in place. Each runs as expand and contract ` +
|
|
18
|
+
"(add the new, write both, backfill, move readers, drop the old), as a migration Op, not as one statement.",
|
|
19
|
+
...renderMigrationOpSuggestions(diff.migrationOps ?? []),
|
|
20
|
+
]
|
|
21
|
+
: []),
|
|
22
|
+
];
|
|
23
|
+
return renderChangeSet(diff, { ...(opts.title ? { title: opts.title } : {}), rules: PG_CLASSIFIER_RULES, classes: PG_CHANGE_CLASSES, trailer });
|
|
24
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Postgres change classifier's rules (#3279, #3275 question 3): every way
|
|
3
|
+
* a declared Postgres object can change, the class of change it is on the
|
|
4
|
+
* server, and the restriction behind the class, cited from the Postgres 18
|
|
5
|
+
* documentation (the pinned major), with the differences across the
|
|
6
|
+
* supported majors 14 to 18 stated where there are any.
|
|
7
|
+
*
|
|
8
|
+
* The classes are by the lock a change takes and whether it reads or
|
|
9
|
+
* rewrites the table ("Explicit Locking", `ALTER TABLE`'s Notes):
|
|
10
|
+
*
|
|
11
|
+
* - `metadata`: a catalog change under a brief lock; no row is read or
|
|
12
|
+
* written. Most `ALTER TABLE` forms take `ACCESS EXCLUSIVE` even so, which
|
|
13
|
+
* queues behind every running query, so the applier (#3280) sets a
|
|
14
|
+
* `lock_timeout`.
|
|
15
|
+
* - `validate`: every row is read to check a constraint, under a lock weaker
|
|
16
|
+
* than `ACCESS EXCLUSIVE` (`SHARE UPDATE EXCLUSIVE` for `VALIDATE
|
|
17
|
+
* CONSTRAINT`, so reads and writes go on).
|
|
18
|
+
* - `concurrently`: an index build, which blocks writes for its whole run
|
|
19
|
+
* unless it is `CONCURRENTLY`, and `CONCURRENTLY` cannot run inside a
|
|
20
|
+
* transaction block.
|
|
21
|
+
* - `rewrite`: the table is rewritten, or read in full, under `ACCESS
|
|
22
|
+
* EXCLUSIVE`, blocking reads and writes for the duration.
|
|
23
|
+
* - `expand`: no in-place change keeps old readers working (a rename, a type
|
|
24
|
+
* change with no cast in place, a change of partitioning): it is made as
|
|
25
|
+
* expand and contract, by the migration Op (#3281). A plan refuses it.
|
|
26
|
+
*
|
|
27
|
+
* Creating and dropping whole objects are classed `create` and `drop`.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { classifierRule, type ChangeClasses, type ClassifierRule as SqlClassifierRule } from "../../core/classifier";
|
|
31
|
+
|
|
32
|
+
export type PgChangeClass = "metadata" | "validate" | "concurrently" | "rewrite" | "expand" | "create" | "drop";
|
|
33
|
+
|
|
34
|
+
export type PgClassifierRule = SqlClassifierRule<PgChangeClass>;
|
|
35
|
+
|
|
36
|
+
export const PG_CHANGE_CLASSES: ChangeClasses<PgChangeClass> = {
|
|
37
|
+
order: ["create", "metadata", "validate", "concurrently", "rewrite", "expand", "drop"],
|
|
38
|
+
label: {
|
|
39
|
+
create: "create",
|
|
40
|
+
metadata: "metadata only",
|
|
41
|
+
validate: "validates under a weaker lock",
|
|
42
|
+
concurrently: "needs CONCURRENTLY",
|
|
43
|
+
rewrite: "ACCESS EXCLUSIVE rewrite or scan",
|
|
44
|
+
expand: "EXPAND AND CONTRACT",
|
|
45
|
+
drop: "drop",
|
|
46
|
+
},
|
|
47
|
+
disruption: { create: "in-place", metadata: "in-place", validate: "rolling", concurrently: "rolling", rewrite: "rolling", expand: "replace", drop: "destroy" },
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const DOCS = "https://www.postgresql.org/docs/18";
|
|
51
|
+
const ALTER_TABLE = `${DOCS}/sql-altertable.html`;
|
|
52
|
+
const LOCKING = `${DOCS}/explicit-locking.html`;
|
|
53
|
+
const CREATE_INDEX = `${DOCS}/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY`;
|
|
54
|
+
|
|
55
|
+
const rule = (id: string, cls: PgChangeClass, title: string, restriction: string, cite: string): PgClassifierRule => classifierRule(id, cls, title, restriction, cite);
|
|
56
|
+
|
|
57
|
+
export const PG_CLASSIFIER_RULES = {
|
|
58
|
+
SQLPG200: rule("SQLPG200", "create", "Create an object", "A new object is created; nothing existing changes. A table created in the same plan as its indexes needs no CONCURRENTLY.", `${DOCS}/sql-createtable.html`),
|
|
59
|
+
SQLPG201: rule(
|
|
60
|
+
"SQLPG201",
|
|
61
|
+
"metadata",
|
|
62
|
+
"Add a column",
|
|
63
|
+
"ADD COLUMN with no default, or with a non-volatile default, changes only the catalog under ACCESS EXCLUSIVE: the default is stored once and read for existing rows (since 11, so in every supported major). A NOT NULL column needs that default.",
|
|
64
|
+
ALTER_TABLE,
|
|
65
|
+
),
|
|
66
|
+
SQLPG202: rule(
|
|
67
|
+
"SQLPG202",
|
|
68
|
+
"rewrite",
|
|
69
|
+
"Add a column whose value has to be computed for every row",
|
|
70
|
+
"ADD COLUMN with a volatile default (clock_timestamp(), random(), gen_random_uuid(), nextval()), a STORED generated column or an identity column rewrites the whole table under ACCESS EXCLUSIVE. A VIRTUAL generated column (18) does not.",
|
|
71
|
+
ALTER_TABLE,
|
|
72
|
+
),
|
|
73
|
+
SQLPG203: rule(
|
|
74
|
+
"SQLPG203",
|
|
75
|
+
"expand",
|
|
76
|
+
"Add a NOT NULL column with no default",
|
|
77
|
+
"ADD COLUMN ... NOT NULL with no default fails on a table that has rows. Add it nullable, backfill it, then set NOT NULL.",
|
|
78
|
+
ALTER_TABLE,
|
|
79
|
+
),
|
|
80
|
+
SQLPG204: rule("SQLPG204", "metadata", "Drop a column", "DROP COLUMN only hides the column in the catalog under ACCESS EXCLUSIVE; its space is reclaimed as rows are rewritten. The data is gone.", ALTER_TABLE),
|
|
81
|
+
SQLPG205: rule(
|
|
82
|
+
"SQLPG205",
|
|
83
|
+
"expand",
|
|
84
|
+
"Rename a column",
|
|
85
|
+
"RENAME COLUMN is a catalog change, but every reader still using the old name fails the moment it runs: add the new column, write both, move readers, drop the old.",
|
|
86
|
+
ALTER_TABLE,
|
|
87
|
+
),
|
|
88
|
+
SQLPG206: rule(
|
|
89
|
+
"SQLPG206",
|
|
90
|
+
"metadata",
|
|
91
|
+
"Change a column's type without a rewrite",
|
|
92
|
+
"ALTER COLUMN TYPE to a binary-coercible type (varchar(n) to a longer varchar or to text, numeric(p,s) to a wider precision or to unconstrained numeric, cidr to inet) needs no rewrite; indexes on the column may still be rebuilt. ACCESS EXCLUSIVE, briefly.",
|
|
93
|
+
ALTER_TABLE,
|
|
94
|
+
),
|
|
95
|
+
SQLPG207: rule(
|
|
96
|
+
"SQLPG207",
|
|
97
|
+
"rewrite",
|
|
98
|
+
"Change a column's type with a rewrite",
|
|
99
|
+
"ALTER COLUMN TYPE that is not binary-coercible (integer to bigint, a shorter varchar, real to double precision) rewrites the table and rebuilds its indexes under ACCESS EXCLUSIVE.",
|
|
100
|
+
ALTER_TABLE,
|
|
101
|
+
),
|
|
102
|
+
SQLPG208: rule(
|
|
103
|
+
"SQLPG208",
|
|
104
|
+
"expand",
|
|
105
|
+
"Change a column's type across kinds",
|
|
106
|
+
"A type change between kinds (text to integer, a type to an enum) needs a USING expression and breaks readers that expect the old type: add the new column, backfill, move readers, drop the old.",
|
|
107
|
+
ALTER_TABLE,
|
|
108
|
+
),
|
|
109
|
+
SQLPG209: rule("SQLPG209", "metadata", "Change a column's default", "SET DEFAULT and DROP DEFAULT change only the catalog; existing rows keep their values.", ALTER_TABLE),
|
|
110
|
+
SQLPG210: rule(
|
|
111
|
+
"SQLPG210",
|
|
112
|
+
"rewrite",
|
|
113
|
+
"Set NOT NULL",
|
|
114
|
+
"SET NOT NULL reads the whole table under ACCESS EXCLUSIVE, unless a valid CHECK (column IS NOT NULL) constraint already proves it (since 12). Declare that check NOT VALID, validate it, then set NOT NULL; 18 can also add NOT NULL ... NOT VALID.",
|
|
115
|
+
ALTER_TABLE,
|
|
116
|
+
),
|
|
117
|
+
SQLPG211: rule("SQLPG211", "metadata", "Drop NOT NULL", "DROP NOT NULL changes only the catalog.", ALTER_TABLE),
|
|
118
|
+
SQLPG212: rule(
|
|
119
|
+
"SQLPG212",
|
|
120
|
+
"rewrite",
|
|
121
|
+
"Change a generated column's expression",
|
|
122
|
+
"ALTER COLUMN SET EXPRESSION (17 and later) rewrites a STORED generated column under ACCESS EXCLUSIVE; on 14 to 16 the column has to be dropped and added. A VIRTUAL column (18) changes only the catalog.",
|
|
123
|
+
ALTER_TABLE,
|
|
124
|
+
),
|
|
125
|
+
SQLPG213: rule("SQLPG213", "metadata", "Change a column's identity", "ADD, SET and DROP IDENTITY change the column's sequence and the catalog, not the rows.", ALTER_TABLE),
|
|
126
|
+
SQLPG214: rule("SQLPG214", "rewrite", "Change a column's collation", "A collation change is ALTER COLUMN TYPE with COLLATE: the column's indexes are rebuilt under ACCESS EXCLUSIVE.", ALTER_TABLE),
|
|
127
|
+
SQLPG215: rule("SQLPG215", "metadata", "Change a column's storage or compression", "SET STORAGE and SET COMPRESSION apply to values written afterwards; existing values are not rewritten.", ALTER_TABLE),
|
|
128
|
+
SQLPG216: rule("SQLPG216", "metadata", "Change a comment", "COMMENT ON changes only the catalog.", `${DOCS}/sql-comment.html`),
|
|
129
|
+
SQLPG217: rule(
|
|
130
|
+
"SQLPG217",
|
|
131
|
+
"metadata",
|
|
132
|
+
"Add a constraint NOT VALID",
|
|
133
|
+
"ADD CONSTRAINT ... NOT VALID checks new rows only and reads none of the existing ones; a foreign key takes SHARE ROW EXCLUSIVE on both tables, briefly. Validate it as a separate step.",
|
|
134
|
+
ALTER_TABLE,
|
|
135
|
+
),
|
|
136
|
+
SQLPG218: rule(
|
|
137
|
+
"SQLPG218",
|
|
138
|
+
"rewrite",
|
|
139
|
+
"Add a CHECK constraint",
|
|
140
|
+
"ADD CONSTRAINT ... CHECK reads every row under ACCESS EXCLUSIVE. Declare it NOT VALID, then remove NOT VALID to validate it under SHARE UPDATE EXCLUSIVE (SQLPG220).",
|
|
141
|
+
ALTER_TABLE,
|
|
142
|
+
),
|
|
143
|
+
SQLPG219: rule(
|
|
144
|
+
"SQLPG219",
|
|
145
|
+
"validate",
|
|
146
|
+
"Add a foreign key",
|
|
147
|
+
"ADD FOREIGN KEY reads every row under SHARE ROW EXCLUSIVE on both tables, which blocks writes to them for the scan. Declare it NOT VALID, then remove NOT VALID to validate it under SHARE UPDATE EXCLUSIVE (SQLPG220).",
|
|
148
|
+
ALTER_TABLE,
|
|
149
|
+
),
|
|
150
|
+
SQLPG220: rule(
|
|
151
|
+
"SQLPG220",
|
|
152
|
+
"validate",
|
|
153
|
+
"Validate a constraint",
|
|
154
|
+
"VALIDATE CONSTRAINT reads every row under SHARE UPDATE EXCLUSIVE, so reads and writes go on (ROW SHARE on a foreign key's referenced table).",
|
|
155
|
+
LOCKING,
|
|
156
|
+
),
|
|
157
|
+
SQLPG221: rule(
|
|
158
|
+
"SQLPG221",
|
|
159
|
+
"concurrently",
|
|
160
|
+
"Add a primary key or unique constraint",
|
|
161
|
+
"ADD PRIMARY KEY or UNIQUE builds its index under ACCESS EXCLUSIVE. Build the unique index CONCURRENTLY first, then ADD CONSTRAINT ... USING INDEX, which changes only the catalog.",
|
|
162
|
+
ALTER_TABLE,
|
|
163
|
+
),
|
|
164
|
+
SQLPG222: rule("SQLPG222", "rewrite", "Add an exclusion constraint", "ADD CONSTRAINT ... EXCLUDE builds its index under ACCESS EXCLUSIVE; there is no concurrent form.", ALTER_TABLE),
|
|
165
|
+
SQLPG223: rule("SQLPG223", "metadata", "Drop a constraint", "DROP CONSTRAINT changes the catalog under ACCESS EXCLUSIVE, briefly; a primary key's or unique constraint's index goes with it.", ALTER_TABLE),
|
|
166
|
+
SQLPG224: rule(
|
|
167
|
+
"SQLPG224",
|
|
168
|
+
"metadata",
|
|
169
|
+
"Change storage parameters",
|
|
170
|
+
"SET and RESET of storage parameters change the catalog; fillfactor and the autovacuum parameters take only SHARE UPDATE EXCLUSIVE. Rows are not rewritten; a new fillfactor applies to pages written afterwards.",
|
|
171
|
+
ALTER_TABLE,
|
|
172
|
+
),
|
|
173
|
+
SQLPG225: rule("SQLPG225", "rewrite", "Make a table LOGGED or UNLOGGED", "SET LOGGED and SET UNLOGGED rewrite the table under ACCESS EXCLUSIVE.", ALTER_TABLE),
|
|
174
|
+
SQLPG226: rule("SQLPG226", "rewrite", "Change a table's access method or tablespace", "SET ACCESS METHOD (15 and later) and SET TABLESPACE rewrite the table under ACCESS EXCLUSIVE.", ALTER_TABLE),
|
|
175
|
+
SQLPG227: rule(
|
|
176
|
+
"SQLPG227",
|
|
177
|
+
"expand",
|
|
178
|
+
"Change partitioning or inheritance",
|
|
179
|
+
"A table's partition key, its parent or bound, INHERITS and OF type cannot be altered in place: a new table is filled and swapped in. DETACH PARTITION CONCURRENTLY (14 and later) and ATTACH PARTITION, which takes SHARE UPDATE EXCLUSIVE on the parent, are the steps.",
|
|
180
|
+
`${DOCS}/ddl-partitioning.html`,
|
|
181
|
+
),
|
|
182
|
+
SQLPG228: rule(
|
|
183
|
+
"SQLPG228",
|
|
184
|
+
"expand",
|
|
185
|
+
"Rename an object or move it to another schema",
|
|
186
|
+
"RENAME and SET SCHEMA are catalog changes, but every reader still using the old name fails at once: create the new name (a view over the old object works), move readers, drop the old.",
|
|
187
|
+
ALTER_TABLE,
|
|
188
|
+
),
|
|
189
|
+
SQLPG229: rule("SQLPG229", "metadata", "Rename an index", "ALTER INDEX ... RENAME changes only the catalog; nothing reads an index by name.", `${DOCS}/sql-alterindex.html`),
|
|
190
|
+
SQLPG240: rule(
|
|
191
|
+
"SQLPG240",
|
|
192
|
+
"concurrently",
|
|
193
|
+
"Create an index CONCURRENTLY",
|
|
194
|
+
"CREATE INDEX CONCURRENTLY builds the index without blocking writes (SHARE UPDATE EXCLUSIVE), in two scans, and cannot run inside a transaction block; a failed build leaves an INVALID index to drop.",
|
|
195
|
+
CREATE_INDEX,
|
|
196
|
+
),
|
|
197
|
+
SQLPG241: rule(
|
|
198
|
+
"SQLPG241",
|
|
199
|
+
"concurrently",
|
|
200
|
+
"Create an index without CONCURRENTLY",
|
|
201
|
+
"CREATE INDEX on an existing table takes SHARE, which blocks every write to the table until the build ends. Declare it CONCURRENTLY.",
|
|
202
|
+
CREATE_INDEX,
|
|
203
|
+
),
|
|
204
|
+
SQLPG242: rule(
|
|
205
|
+
"SQLPG242",
|
|
206
|
+
"concurrently",
|
|
207
|
+
"Drop an index",
|
|
208
|
+
"DROP INDEX takes ACCESS EXCLUSIVE on the table; DROP INDEX CONCURRENTLY waits for running queries instead, and cannot run inside a transaction block.",
|
|
209
|
+
`${DOCS}/sql-dropindex.html`,
|
|
210
|
+
),
|
|
211
|
+
SQLPG243: rule(
|
|
212
|
+
"SQLPG243",
|
|
213
|
+
"concurrently",
|
|
214
|
+
"Change an index",
|
|
215
|
+
"An index's definition cannot be altered: it is dropped and created, both CONCURRENTLY to keep writes going (SQLPG240, SQLPG242).",
|
|
216
|
+
CREATE_INDEX,
|
|
217
|
+
),
|
|
218
|
+
SQLPG250: rule(
|
|
219
|
+
"SQLPG250",
|
|
220
|
+
"metadata",
|
|
221
|
+
"Change a view's query, keeping its columns",
|
|
222
|
+
"CREATE OR REPLACE VIEW replaces the query under ACCESS EXCLUSIVE on the view when the new query keeps the old columns, by name, in order, and only appends new ones.",
|
|
223
|
+
`${DOCS}/sql-createview.html`,
|
|
224
|
+
),
|
|
225
|
+
SQLPG251: rule(
|
|
226
|
+
"SQLPG251",
|
|
227
|
+
"expand",
|
|
228
|
+
"Change a view's columns",
|
|
229
|
+
"A view whose columns are removed, renamed or reordered cannot be replaced: it is dropped and created, and every view and reader on top of it with it.",
|
|
230
|
+
`${DOCS}/sql-createview.html`,
|
|
231
|
+
),
|
|
232
|
+
SQLPG252: rule(
|
|
233
|
+
"SQLPG252",
|
|
234
|
+
"rewrite",
|
|
235
|
+
"Change a materialized view's query",
|
|
236
|
+
"A materialized view's query cannot be altered: it is dropped and created, and its rows are computed again, with every view on top of it dropped too.",
|
|
237
|
+
`${DOCS}/sql-creatematerializedview.html`,
|
|
238
|
+
),
|
|
239
|
+
SQLPG253: rule("SQLPG253", "metadata", "Change a view's options", "ALTER VIEW ... SET (check_option, security_barrier, security_invoker) changes only the catalog.", `${DOCS}/sql-alterview.html`),
|
|
240
|
+
SQLPG260: rule(
|
|
241
|
+
"SQLPG260",
|
|
242
|
+
"metadata",
|
|
243
|
+
"Add an enum label",
|
|
244
|
+
"ALTER TYPE ... ADD VALUE changes only the catalog; since 12 it can run in a transaction block, but the new label cannot be used in that transaction.",
|
|
245
|
+
`${DOCS}/sql-altertype.html`,
|
|
246
|
+
),
|
|
247
|
+
SQLPG261: rule(
|
|
248
|
+
"SQLPG261",
|
|
249
|
+
"expand",
|
|
250
|
+
"Remove or reorder enum labels",
|
|
251
|
+
"An enum label cannot be removed and labels cannot be reordered in place: a new type is created, columns are moved to it, and the old one is dropped.",
|
|
252
|
+
`${DOCS}/sql-altertype.html`,
|
|
253
|
+
),
|
|
254
|
+
SQLPG262: rule(
|
|
255
|
+
"SQLPG262",
|
|
256
|
+
"validate",
|
|
257
|
+
"Add a domain constraint",
|
|
258
|
+
"ALTER DOMAIN ADD CONSTRAINT (and SET NOT NULL) checks every column of the domain's type in every table; ADD CONSTRAINT ... NOT VALID skips existing rows and VALIDATE CONSTRAINT checks them later.",
|
|
259
|
+
`${DOCS}/sql-alterdomain.html`,
|
|
260
|
+
),
|
|
261
|
+
SQLPG263: rule("SQLPG263", "metadata", "Change a domain's default or drop its constraint", "ALTER DOMAIN SET DEFAULT, DROP NOT NULL and DROP CONSTRAINT change only the catalog.", `${DOCS}/sql-alterdomain.html`),
|
|
262
|
+
SQLPG264: rule("SQLPG264", "expand", "Change a domain's data type", "A domain's underlying type cannot be altered: a new domain is created and columns are moved to it.", `${DOCS}/sql-alterdomain.html`),
|
|
263
|
+
SQLPG265: rule("SQLPG265", "metadata", "Change a sequence's options", "ALTER SEQUENCE changes the sequence's own row; tables are not touched. A sequence's AS type bounds its values.", `${DOCS}/sql-altersequence.html`),
|
|
264
|
+
SQLPG266: rule(
|
|
265
|
+
"SQLPG266",
|
|
266
|
+
"metadata",
|
|
267
|
+
"Change an extension's version or schema",
|
|
268
|
+
"ALTER EXTENSION UPDATE runs the extension's update script, which may itself alter objects; SET SCHEMA moves its objects.",
|
|
269
|
+
`${DOCS}/sql-alterextension.html`,
|
|
270
|
+
),
|
|
271
|
+
SQLPG267: rule("SQLPG267", "metadata", "Change a schema's owner", "ALTER SCHEMA ... OWNER TO changes only the catalog.", `${DOCS}/sql-alterschema.html`),
|
|
272
|
+
SQLPG268: rule("SQLPG268", "expand", "Change an object's kind", "A view and a materialized view, or a table and either, are different kinds of object: the old one is dropped and the new one created.", `${DOCS}/sql-createview.html`),
|
|
273
|
+
SQLPG270: rule("SQLPG270", "drop", "Drop an object", "The object and, for a table, a materialized view or a sequence, its data are gone.", `${DOCS}/sql-droptable.html`),
|
|
274
|
+
} as const satisfies Record<string, PgClassifierRule>;
|
|
275
|
+
|
|
276
|
+
export type PgClassifierRuleId = keyof typeof PG_CLASSIFIER_RULES;
|