@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,77 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterAll, describe, expect, test, vi } from "vitest";
|
|
5
|
+
import { classifyDisruption } from "./disruption";
|
|
6
|
+
import { inDeclaredVocabulary } from "./deep";
|
|
7
|
+
import { canonicalObject } from "./normalize";
|
|
8
|
+
import { runDiff } from "./commands";
|
|
9
|
+
import { table } from "../entities";
|
|
10
|
+
|
|
11
|
+
describe("classifyDisruption", () => {
|
|
12
|
+
const q = (paths: string[]) => ({ name: "t", type: "ClickHouse::Table", deltas: paths.map((path) => ({ path, oldValue: 1, newValue: 2 })) });
|
|
13
|
+
const run = (paths: string[]) => classifyDisruption({ environment: "e", changes: [q(paths)] }).t!;
|
|
14
|
+
|
|
15
|
+
test("metadata is in-place, a rewrite rolling, a rebuild replace", () => {
|
|
16
|
+
expect(run(["comment", "indexes[0].name"]).disruption).toBe("in-place");
|
|
17
|
+
expect(run(["ttl"]).disruption).toBe("rolling");
|
|
18
|
+
expect(run(["ttl", "partitionBy"])).toMatchObject({ disruption: "replace", because: ["partitionBy"] });
|
|
19
|
+
expect(run(["settings.index_granularity"]).disruption).toBe("replace");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("a column type or sorting-key change is unknown without the whole definition", () => {
|
|
23
|
+
expect(run(["columns[2].type"]).disruption).toBe("unknown");
|
|
24
|
+
expect(run(["orderBy"]).disruption).toBe("unknown");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("another lexicon's entry is left alone", () => {
|
|
28
|
+
expect(classifyDisruption({ environment: "e", changes: [{ name: "x", type: "K8s::Core::Pod", deltas: [] }] })).toEqual({});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("the deep read in the declaration's vocabulary", () => {
|
|
33
|
+
const declared = table`CREATE TABLE t (ts DateTime CODEC(Delta, ZSTD), n UInt8) ENGINE = MergeTree ORDER BY ts TTL ts + INTERVAL 1 DAY`;
|
|
34
|
+
const shown = "CREATE TABLE default.t\n(\n `ts` DateTime CODEC(Delta(4), ZSTD(1)),\n `n` UInt8\n)\nENGINE = MergeTree\nORDER BY ts\nTTL ts + toIntervalDay(1)\nSETTINGS index_granularity = 8192";
|
|
35
|
+
const strings = Object.assign([shown], { raw: [shown] }) as unknown as TemplateStringsArray;
|
|
36
|
+
const live = table(strings).props as unknown as Record<string, unknown>;
|
|
37
|
+
const props = declared.props as unknown as Record<string, unknown>;
|
|
38
|
+
|
|
39
|
+
test("a field the server only reformatted reads as declared", () => {
|
|
40
|
+
const out = inDeclaredVocabulary(props, live, canonicalObject(String(props.ddl)), canonicalObject(shown));
|
|
41
|
+
expect(out.ttl).toBe(props.ttl);
|
|
42
|
+
expect(out.columns).toEqual(props.columns);
|
|
43
|
+
expect(out.settings).toBeUndefined();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("a field that really differs keeps the server's value", () => {
|
|
47
|
+
const changed = shown.replace("toIntervalDay(1)", "toIntervalDay(2)");
|
|
48
|
+
const s2 = Object.assign([changed], { raw: [changed] }) as unknown as TemplateStringsArray;
|
|
49
|
+
const out = inDeclaredVocabulary(props, table(s2).props as unknown as Record<string, unknown>, canonicalObject(String(props.ddl)), canonicalObject(changed));
|
|
50
|
+
expect(out.ttl).toBe("ts + toIntervalDay(2)");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe("chant sql diff", () => {
|
|
55
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-sql-diff-"));
|
|
56
|
+
afterAll(() => rmSync(dir, { recursive: true, force: true }));
|
|
57
|
+
const write = (name: string, ddl: string) => {
|
|
58
|
+
const file = join(dir, name);
|
|
59
|
+
writeFileSync(file, JSON.stringify({ dialect: "clickhouse", applyOrder: ["events"], objects: [{ export: "events", ddl }] }));
|
|
60
|
+
return file;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
test("exits 2 on a rebuild, 0 otherwise, and prints the classification", async () => {
|
|
64
|
+
const base = write("base.json", "CREATE TABLE events (id UInt64, ts DateTime) ENGINE = MergeTree ORDER BY id");
|
|
65
|
+
const head = write("head.json", "CREATE TABLE events (id UInt64, ts DateTime) ENGINE = MergeTree ORDER BY (ts, id)");
|
|
66
|
+
const add = write("add.json", "CREATE TABLE events (id UInt64, ts DateTime, x String) ENGINE = MergeTree ORDER BY id");
|
|
67
|
+
const log = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
68
|
+
try {
|
|
69
|
+
expect(await runDiff({ verb: "diff", rawArgs: [base, head] })).toBe(2);
|
|
70
|
+
expect(String(log.mock.calls.at(-1)?.[0])).toMatch(/SQLCH220/);
|
|
71
|
+
expect(await runDiff({ verb: "diff", rawArgs: [base, add, "--json"] })).toBe(0);
|
|
72
|
+
expect(JSON.parse(String(log.mock.calls.at(-1)?.[0])).changes[0].rule).toBe("SQLCH201");
|
|
73
|
+
} finally {
|
|
74
|
+
log.mockRestore();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning against a live server (#3197): the getting-started example applied
|
|
3
|
+
* to a pinned server plans with no changes, its deep read reports no drift,
|
|
4
|
+
* and a change made on the server is reported and classified.
|
|
5
|
+
*
|
|
6
|
+
* Needs Docker; skips cleanly without it.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { afterAll, beforeAll, describe, expect, test } from "vitest";
|
|
13
|
+
import { build } from "@intentius/chant/build";
|
|
14
|
+
import type { SerializerResult } from "@intentius/chant/serializer";
|
|
15
|
+
import { dockerAvailable, startScratchServer, type ScratchServer } from "../container";
|
|
16
|
+
import { clickhouseQuery } from "../http";
|
|
17
|
+
import { clickhouseImage } from "../../spec/pin";
|
|
18
|
+
import { splitStatements } from "../import/ir";
|
|
19
|
+
import { planAgainstServer } from "./commands";
|
|
20
|
+
import { observeResourcesDeep, sqlDeepNormalizationHooks } from "./deep";
|
|
21
|
+
import { sqlPlugin } from "../../plugin";
|
|
22
|
+
import { CLICKHOUSE_DDL_FILE, sqlSerializer } from "../../serializer";
|
|
23
|
+
|
|
24
|
+
const enabled = await dockerAvailable();
|
|
25
|
+
let server: ScratchServer | undefined;
|
|
26
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-sql-plan-"));
|
|
27
|
+
const buildFile = join(dir, "schema.json");
|
|
28
|
+
let entities = new Map<string, { entityType: string; props: Record<string, unknown> }>();
|
|
29
|
+
|
|
30
|
+
beforeAll(async () => {
|
|
31
|
+
if (!enabled) return;
|
|
32
|
+
server = await startScratchServer(clickhouseImage(), { namePrefix: "chant-sql-plan" });
|
|
33
|
+
const src = join(import.meta.dirname, "..", "..", "..", "examples", "getting-started", "src");
|
|
34
|
+
const result = await build(src, [sqlSerializer], undefined, { fold: true, intrinsics: sqlPlugin.intrinsics!(), lexicons: ["sql"] });
|
|
35
|
+
const out = result.outputs.get("sql") as SerializerResult;
|
|
36
|
+
writeFileSync(buildFile, out.primary);
|
|
37
|
+
for (const stmt of splitStatements(out.files![CLICKHOUSE_DDL_FILE]!)) await clickhouseQuery(server.endpoint, stmt);
|
|
38
|
+
entities = new Map(
|
|
39
|
+
[...result.entities].map(([k, v]) => [k, { entityType: v.entityType, props: (v as unknown as { props: Record<string, unknown> }).props }]),
|
|
40
|
+
);
|
|
41
|
+
}, 600_000);
|
|
42
|
+
|
|
43
|
+
afterAll(async () => {
|
|
44
|
+
await server?.stop();
|
|
45
|
+
rmSync(dir, { recursive: true, force: true });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const env = () => ({ config: {}, env: { CLICKHOUSE_URL: server!.endpoint.url } });
|
|
49
|
+
|
|
50
|
+
/** The props a deep diff compares: the declaration's, less what the hooks prune. */
|
|
51
|
+
function compared(props: Record<string, unknown>): Record<string, unknown> {
|
|
52
|
+
return Object.fromEntries(Object.entries(props).filter(([k]) => !sqlDeepNormalizationHooks.prune!({ pattern: k } as never)));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe.skipIf(!enabled)("planning the getting-started example against a server", () => {
|
|
56
|
+
test("applied as declared, it plans with no changes and reads back with no drift", async () => {
|
|
57
|
+
const diff = await planAgainstServer("e2e", buildFile, env());
|
|
58
|
+
expect(diff.changes).toEqual([]);
|
|
59
|
+
|
|
60
|
+
const deep = await observeResourcesDeep({ environment: "e2e", entityNames: [...entities.keys()], entities, ...env() });
|
|
61
|
+
expect(deep.unobserved ?? {}).toEqual({});
|
|
62
|
+
for (const [name, e] of entities) {
|
|
63
|
+
expect(compared(deep.resources[name]!.properties), name).toEqual(JSON.parse(JSON.stringify(compared(e.props))));
|
|
64
|
+
}
|
|
65
|
+
}, 120_000);
|
|
66
|
+
|
|
67
|
+
test("a change made on the server is drift, classified", async () => {
|
|
68
|
+
await clickhouseQuery(server!.endpoint, "ALTER TABLE analytics.events MODIFY TTL ts + INTERVAL 90 DAY");
|
|
69
|
+
await clickhouseQuery(server!.endpoint, "ALTER TABLE analytics.users ADD COLUMN extra String");
|
|
70
|
+
const diff = await planAgainstServer("e2e", buildFile, env());
|
|
71
|
+
expect(diff.changes.map((c) => [c.object, c.field, c.rule])).toEqual([
|
|
72
|
+
["events (analytics.events)", "ttl", "SQLCH205"],
|
|
73
|
+
["users (analytics.users)", "columns.extra", "SQLCH202"],
|
|
74
|
+
]);
|
|
75
|
+
expect(diff.rebuilds).toEqual([]);
|
|
76
|
+
}, 120_000);
|
|
77
|
+
});
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { canonicalCodec, canonicalExpression, canonicalObject, canonicalTtl, canonicalType } from "./normalize";
|
|
3
|
+
import { diffSchemas, type SchemaObject } from "./diff";
|
|
4
|
+
import { renderDiff } from "./report";
|
|
5
|
+
import { CLASSIFIER_RULES } from "./rules";
|
|
6
|
+
|
|
7
|
+
const DECLARED_EVENTS = `CREATE TABLE analytics.events (
|
|
8
|
+
user_id UUID,
|
|
9
|
+
kind LowCardinality(String),
|
|
10
|
+
ts DateTime CODEC(Delta, ZSTD),
|
|
11
|
+
props Map(String, String),
|
|
12
|
+
n Nullable(UInt32) DEFAULT 1 COMMENT 'c',
|
|
13
|
+
INDEX k kind TYPE bloom_filter(0.01) GRANULARITY 4
|
|
14
|
+
)
|
|
15
|
+
ENGINE = MergeTree
|
|
16
|
+
PARTITION BY toYYYYMM(ts)
|
|
17
|
+
ORDER BY (user_id, kind, ts)
|
|
18
|
+
TTL ts + INTERVAL 180 DAY DELETE
|
|
19
|
+
SETTINGS index_granularity = 8192
|
|
20
|
+
COMMENT 'events table'`;
|
|
21
|
+
|
|
22
|
+
// What clickhouse-server 26.8.15.10 prints for DECLARED_EVENTS.
|
|
23
|
+
const SHOWN_EVENTS = `CREATE TABLE analytics.events
|
|
24
|
+
(
|
|
25
|
+
\`user_id\` UUID,
|
|
26
|
+
\`kind\` LowCardinality(String),
|
|
27
|
+
\`ts\` DateTime CODEC(Delta(4), ZSTD(1)),
|
|
28
|
+
\`props\` Map(String, String),
|
|
29
|
+
\`n\` Nullable(UInt32) DEFAULT 1 COMMENT 'c',
|
|
30
|
+
INDEX k kind TYPE bloom_filter(0.01) GRANULARITY 4
|
|
31
|
+
)
|
|
32
|
+
ENGINE = MergeTree
|
|
33
|
+
PARTITION BY toYYYYMM(ts)
|
|
34
|
+
ORDER BY (user_id, kind, ts)
|
|
35
|
+
TTL ts + toIntervalDay(180)
|
|
36
|
+
SETTINGS index_granularity = 8192
|
|
37
|
+
COMMENT 'events table'`;
|
|
38
|
+
|
|
39
|
+
const DECLARED_MV = "CREATE MATERIALIZED VIEW analytics.daily_mv TO analytics.daily AS SELECT toDate(ts) AS day, kind, uniqState(user_id) AS users FROM analytics.events GROUP BY day, kind";
|
|
40
|
+
const SHOWN_MV = `CREATE MATERIALIZED VIEW analytics.daily_mv TO analytics.daily
|
|
41
|
+
(
|
|
42
|
+
\`day\` Date,
|
|
43
|
+
\`kind\` LowCardinality(String),
|
|
44
|
+
\`users\` AggregateFunction(uniq, UUID)
|
|
45
|
+
)
|
|
46
|
+
AS SELECT
|
|
47
|
+
toDate(ts) AS day,
|
|
48
|
+
kind,
|
|
49
|
+
uniqState(user_id) AS users
|
|
50
|
+
FROM analytics.events
|
|
51
|
+
GROUP BY
|
|
52
|
+
day,
|
|
53
|
+
kind`;
|
|
54
|
+
|
|
55
|
+
const obj = (key: string, ddl: string): SchemaObject => ({ key, canonical: canonicalObject(ddl) });
|
|
56
|
+
|
|
57
|
+
describe("normalization", () => {
|
|
58
|
+
test("what the server prints for a declaration compares equal to the declaration", () => {
|
|
59
|
+
const noText = (o: ReturnType<typeof canonicalObject>) => ({ ...o, columns: o.columns.map(({ text: _, ...c }) => c) });
|
|
60
|
+
expect(noText(canonicalObject(SHOWN_EVENTS))).toEqual(noText(canonicalObject(DECLARED_EVENTS)));
|
|
61
|
+
const shown = canonicalObject(SHOWN_MV);
|
|
62
|
+
const declared = canonicalObject(DECLARED_MV);
|
|
63
|
+
expect(shown.select).toBe(declared.select);
|
|
64
|
+
expect(shown.to).toBe(declared.to);
|
|
65
|
+
expect(diffSchemas([obj("e", SHOWN_EVENTS), obj("m", SHOWN_MV)], [obj("e", DECLARED_EVENTS), obj("m", DECLARED_MV)]).changes).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("the server's rewrites are undone", () => {
|
|
69
|
+
expect(canonicalExpression("ts + INTERVAL 1 DAY")).toBe(canonicalExpression("ts + toIntervalDay(1)"));
|
|
70
|
+
expect(canonicalExpression("ts+interval 2 hours")).toBe(canonicalExpression("ts + toIntervalHour(2)"));
|
|
71
|
+
expect(canonicalExpression("(id)")).toBe("id");
|
|
72
|
+
expect(canonicalExpression("tuple()")).toBe("");
|
|
73
|
+
expect(canonicalExpression("analytics.events", "analytics")).toBe("events");
|
|
74
|
+
expect(canonicalType("int")).toBe("Int32");
|
|
75
|
+
expect(canonicalType("Nullable(BIGINT)")).toBe("Nullable ( Int64 )");
|
|
76
|
+
expect(canonicalCodec("Delta(8), ZSTD(1)")).toBe(canonicalCodec("Delta, ZSTD"));
|
|
77
|
+
expect(canonicalCodec("ZSTD(3)")).not.toBe(canonicalCodec("ZSTD"));
|
|
78
|
+
expect(canonicalTtl("d + INTERVAL 1 MONTH DELETE, d + INTERVAL 1 WEEK TO VOLUME 'cold'")).toBe(
|
|
79
|
+
canonicalTtl("d + toIntervalMonth(1), d + toIntervalWeek(1) TO VOLUME 'cold'"),
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("a Replicated*MergeTree with no arguments is the one the server prints with its default Keeper path and replica", () => {
|
|
84
|
+
const shown = (engine: string) => canonicalObject(`CREATE TABLE t (a UInt8, v UInt8) ENGINE = ${engine} ORDER BY a`).engine;
|
|
85
|
+
expect(shown("ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')")).toBe(shown("ReplicatedMergeTree"));
|
|
86
|
+
expect(shown("ReplicatedReplacingMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}', v)")).toBe(shown("ReplicatedReplacingMergeTree(v)"));
|
|
87
|
+
expect(shown("ReplicatedMergeTree('/clickhouse/tables/{shard}/t', '{replica}')")).not.toBe(shown("ReplicatedMergeTree"));
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("a setting at its default is not part of the definition", () => {
|
|
91
|
+
expect(canonicalObject("CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS index_granularity = 8192").settings).toEqual({});
|
|
92
|
+
expect(canonicalObject("CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS min_bytes_for_wide_part = '0'").settings).toEqual({ min_bytes_for_wide_part: "0" });
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const BASE = "CREATE TABLE events (id UInt64, kind String, ts DateTime, n UInt32) ENGINE = MergeTree PARTITION BY toYYYYMM(ts) ORDER BY (id, ts)";
|
|
97
|
+
|
|
98
|
+
function classify(after: string, before = BASE) {
|
|
99
|
+
return diffSchemas([obj("events", before)], [obj("events", after)]).changes.map((c) => [c.field, c.rule, c.class]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
describe("classifying a change", () => {
|
|
103
|
+
test("adding a column is metadata only", () => {
|
|
104
|
+
expect(classify(BASE.replace("n UInt32)", "n UInt32, extra String)"))).toEqual([["columns.extra", "SQLCH201", "metadata"]]);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("dropping a column destroys its data; a key column cannot be dropped", () => {
|
|
108
|
+
const d = diffSchemas([obj("events", BASE)], [obj("events", BASE.replace(", n UInt32", ""))]).changes;
|
|
109
|
+
expect(d.map((c) => [c.rule, c.destructive])).toEqual([["SQLCH202", true]]);
|
|
110
|
+
expect(classify(BASE.replace("kind String, ", "").replace("(id, ts)", "(id, ts)"))[0]).toEqual(["columns.kind", "SQLCH202", "metadata"]);
|
|
111
|
+
expect(classify(BASE.replace("id UInt64, ", "").replace("(id, ts)", "ts"))).toContainEqual(["columns.id", "SQLCH213", "rebuild"]);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("a type change rewrites in the background, or needs a rebuild for a key column", () => {
|
|
115
|
+
expect(classify(BASE.replace("n UInt32", "n UInt64"))).toEqual([["columns.n.type", "SQLCH210", "rewrite"]]);
|
|
116
|
+
expect(classify(BASE.replace("ts DateTime", "ts DateTime64(3)"))).toEqual([["columns.ts.type", "SQLCH211", "rebuild"]]);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("a renamed column says so with previously; in a key it is a rebuild", () => {
|
|
120
|
+
expect(classify(BASE.replace("kind String,", "event_kind String, -- previously: kind\n"))).toEqual([["columns.event_kind", "SQLCH212", "metadata"]]);
|
|
121
|
+
expect(classify(BASE.replace("id UInt64,", "user_id UInt64, -- previously: id\n").replace("(id, ts)", "(user_id, ts)"))).toContainEqual([
|
|
122
|
+
"columns.user_id",
|
|
123
|
+
"SQLCH213",
|
|
124
|
+
"rebuild",
|
|
125
|
+
]);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("without the hint a rename is a drop and an add, and a hint says so", () => {
|
|
129
|
+
const d = diffSchemas([obj("events", BASE)], [obj("events", BASE.replace("kind String", "event_kind String"))]);
|
|
130
|
+
expect(d.changes.map((c) => c.rule).sort()).toEqual(["SQLCH201", "SQLCH202"]);
|
|
131
|
+
expect(d.hints[0]).toMatch(/-- previously: kind/);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("the sorting key: appending a new column keeping the primary key is an ALTER, anything else a rebuild", () => {
|
|
135
|
+
expect(classify(BASE.replace("n UInt32)", "n UInt32, k2 String)").replace("ORDER BY (id, ts)", "PRIMARY KEY (id, ts) ORDER BY (id, ts, k2)"))).toEqual([
|
|
136
|
+
["columns.k2", "SQLCH201", "metadata"],
|
|
137
|
+
["orderBy", "SQLCH216", "metadata"],
|
|
138
|
+
]);
|
|
139
|
+
expect(classify(BASE.replace("(id, ts)", "(ts, id)"))).toEqual([["orderBy", "SQLCH220", "rebuild"]]);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("the partition key, the engine and the primary key need a rebuild", () => {
|
|
143
|
+
expect(classify(BASE.replace("toYYYYMM(ts)", "toDate(ts)"))).toEqual([["partitionBy", "SQLCH222", "rebuild"]]);
|
|
144
|
+
expect(classify(BASE.replace("ENGINE = MergeTree", "ENGINE = ReplacingMergeTree(ts)"))).toEqual([["engine", "SQLCH223", "rebuild"]]);
|
|
145
|
+
expect(classify(BASE.replace("ORDER BY", "PRIMARY KEY id ORDER BY"))).toEqual([["primaryKey", "SQLCH221", "rebuild"]]);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("TTL rewrites; settings change in place unless fixed at creation; indexes and comments are metadata", () => {
|
|
149
|
+
expect(classify(`${BASE} TTL ts + INTERVAL 1 DAY`)).toEqual([["ttl", "SQLCH205", "rewrite"]]);
|
|
150
|
+
expect(classify(`${BASE} SETTINGS merge_with_ttl_timeout = 3600`)).toEqual([["settings.merge_with_ttl_timeout", "SQLCH206", "metadata"]]);
|
|
151
|
+
expect(classify(`${BASE} SETTINGS index_granularity = 1024`)).toEqual([["settings.index_granularity", "SQLCH218", "rebuild"]]);
|
|
152
|
+
expect(classify(BASE.replace("n UInt32)", "n UInt32, INDEX ix kind TYPE set(10) GRANULARITY 1)"))).toEqual([["indexes.ix", "SQLCH204", "metadata"]]);
|
|
153
|
+
expect(classify(`${BASE} COMMENT 'x'`)).toEqual([["comment", "SQLCH203", "metadata"]]);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("a renamed table under the same export is a RENAME", () => {
|
|
157
|
+
expect(classify(BASE.replace("CREATE TABLE events", "CREATE TABLE raw_events"))).toEqual([["name", "SQLCH230", "metadata"]]);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("views: a plain view's query is replaced; a materialized view's query is modified, its target fixed", () => {
|
|
161
|
+
const v = "CREATE VIEW v AS SELECT id FROM events";
|
|
162
|
+
expect(classify("CREATE VIEW v AS SELECT id, ts FROM events", v)).toEqual([["select", "SQLCH240", "metadata"]]);
|
|
163
|
+
const mv = "CREATE MATERIALIZED VIEW m TO dst AS SELECT id FROM events";
|
|
164
|
+
expect(classify("CREATE MATERIALIZED VIEW m TO dst AS SELECT id + 1 AS id FROM events", mv)).toEqual([["select", "SQLCH241", "metadata"]]);
|
|
165
|
+
expect(classify("CREATE MATERIALIZED VIEW m TO dst2 AS SELECT id FROM events", mv)).toEqual([["to", "SQLCH242", "rebuild"]]);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("objects appear and disappear; a table becoming a view is a rebuild", () => {
|
|
169
|
+
const d = diffSchemas([obj("a", BASE)], [obj("b", "CREATE VIEW b AS SELECT 1")]);
|
|
170
|
+
expect(d.changes.map((c) => [c.object, c.rule])).toEqual([
|
|
171
|
+
["b", "SQLCH200"],
|
|
172
|
+
["a", "SQLCH250"],
|
|
173
|
+
]);
|
|
174
|
+
expect(classify("CREATE VIEW events AS SELECT 1")).toEqual([["kind", "SQLCH224", "rebuild"]]);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("against a server, previously before the statement matches the old name", () => {
|
|
178
|
+
const live = [{ key: "default.events", canonical: canonicalObject(BASE) }];
|
|
179
|
+
const declared = [{ key: "default.raw_events", canonical: canonicalObject(`-- previously: events\n${BASE.replace("TABLE events", "TABLE raw_events")}`) }];
|
|
180
|
+
expect(diffSchemas(live, declared).changes.map((c) => c.rule)).toEqual(["SQLCH230"]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe("the rules", () => {
|
|
185
|
+
test("every rule names a class, a restriction and a ClickHouse documentation page", () => {
|
|
186
|
+
for (const [id, r] of Object.entries(CLASSIFIER_RULES)) {
|
|
187
|
+
expect(r.id).toBe(id);
|
|
188
|
+
expect(r.restriction.length).toBeGreaterThan(20);
|
|
189
|
+
expect(r.cite).toMatch(/^https:\/\/clickhouse\.com\/docs\//);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("a rebuild is refused in the report", () => {
|
|
194
|
+
const d = diffSchemas([obj("events", BASE)], [obj("events", BASE.replace("(id, ts)", "(ts, id)"))]);
|
|
195
|
+
expect(d.rebuilds).toHaveLength(1);
|
|
196
|
+
const text = renderDiff(d);
|
|
197
|
+
expect(text).toMatch(/\[REBUILD\] orderBy/);
|
|
198
|
+
expect(text).toMatch(/Refused: 1 change\(s\) need a rebuild/);
|
|
199
|
+
expect(text).toContain("https://clickhouse.com/docs/sql-reference/statements/alter/order-by");
|
|
200
|
+
});
|
|
201
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a plan hands a rebuild to the rebuild migration Op (#3198).
|
|
3
|
+
*
|
|
4
|
+
* `chant sql plan`, `chant sql diff` and the applier refuse a rebuild in
|
|
5
|
+
* place. What they hand on is the Op to run instead, one per table: a
|
|
6
|
+
* `ClickHouseRebuildOp` declaration ready to put in an `*.op.ts` file, with
|
|
7
|
+
* the table's `database.name` filled in and a dual-write mode suggested from
|
|
8
|
+
* the declared columns (materialized-view mode on the first time column,
|
|
9
|
+
* otherwise app mode). The Op's own Plan phase then classifies the same
|
|
10
|
+
* change again against the server, so what it runs is what the plan refused,
|
|
11
|
+
* read fresh.
|
|
12
|
+
*
|
|
13
|
+
* Nothing is written for the user: the Op is a declaration, reviewed in the
|
|
14
|
+
* pull request like the schema change it carries out. The hand-off's shape is
|
|
15
|
+
* the shared core's (`../../core/handoff.ts`); the Op and the dual-write
|
|
16
|
+
* suggestion are ClickHouse's.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { CanonicalObject } from "./normalize";
|
|
20
|
+
import type { SchemaDiff } from "./diff";
|
|
21
|
+
import { migrationOpName, renderMigrationOps, type MigrationOpSuggestion } from "../../core/handoff";
|
|
22
|
+
|
|
23
|
+
export interface RebuildOpSuggestion extends MigrationOpSuggestion {
|
|
24
|
+
/** `database.name`, the Op's `table`. */
|
|
25
|
+
table: string;
|
|
26
|
+
dualWrite: { mode: "materialized-view"; cutoverColumn: string } | { mode: "app" };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const TIME_TYPE = /^(?:Nullable\s*\(\s*)?(?:Date|Date32|DateTime|DateTime64)\b/;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* One suggestion per object the diff refuses as a rebuild. `declared` maps
|
|
33
|
+
* the diff's object keys to the declared definitions.
|
|
34
|
+
*/
|
|
35
|
+
export function rebuildOpSuggestions(diff: SchemaDiff, declared: ReadonlyMap<string, CanonicalObject>, env: string): RebuildOpSuggestion[] {
|
|
36
|
+
const out: RebuildOpSuggestion[] = [];
|
|
37
|
+
for (const key of [...new Set(diff.rebuilds.map((c) => c.object))]) {
|
|
38
|
+
const c = declared.get(key);
|
|
39
|
+
if (!c || c.kind !== "table") continue;
|
|
40
|
+
const table = `${c.database ?? "default"}.${c.name}`;
|
|
41
|
+
const time = c.columns.find((col) => !col.nullable && TIME_TYPE.test(col.type) && (!col.defaultKind || col.defaultKind === "DEFAULT"));
|
|
42
|
+
const dualWrite: RebuildOpSuggestion["dualWrite"] = time ? { mode: "materialized-view", cutoverColumn: time.name } : { mode: "app" };
|
|
43
|
+
const name = migrationOpName("rebuild", table);
|
|
44
|
+
const dw = dualWrite.mode === "app" ? `{ mode: "app" }` : `{ mode: "materialized-view", cutoverColumn: ${JSON.stringify(dualWrite.cutoverColumn)} }`;
|
|
45
|
+
out.push({
|
|
46
|
+
table,
|
|
47
|
+
name,
|
|
48
|
+
env,
|
|
49
|
+
dualWrite,
|
|
50
|
+
declaration: `export const { op } = ClickHouseRebuildOp({ name: ${JSON.stringify(name)}, env: ${JSON.stringify(env)}, table: ${JSON.stringify(table)}, dualWrite: ${dw} });`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The suggestions as text, for the report. */
|
|
57
|
+
export function renderRebuildOps(ops: readonly RebuildOpSuggestion[]): string[] {
|
|
58
|
+
return renderMigrationOps(ops, { what: "the rebuild migration Op", exportName: "ClickHouseRebuildOp", importPath: "@intentius/chant-lexicon-sql/clickhouse" });
|
|
59
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A schema diff as text, for a terminal or a pull request (the shared core's report, with ClickHouse's refusal). */
|
|
2
|
+
|
|
3
|
+
import { renderChangeSet } from "../../core/classifier";
|
|
4
|
+
import { CHANGE_CLASSES, CLASSIFIER_RULES } from "./rules";
|
|
5
|
+
import type { SchemaDiff } from "./diff";
|
|
6
|
+
import { renderRebuildOps } from "./rebuild-handoff";
|
|
7
|
+
|
|
8
|
+
export function renderDiff(diff: SchemaDiff, opts: { title?: string } = {}): string {
|
|
9
|
+
const trailer =
|
|
10
|
+
diff.rebuilds.length > 0
|
|
11
|
+
? [
|
|
12
|
+
"",
|
|
13
|
+
`Refused: ${diff.rebuilds.length} change(s) need a rebuild, which ClickHouse cannot make to the existing table. ` +
|
|
14
|
+
"A rebuild runs as its own migration (create the new table, backfill, verify, swap), not in place.",
|
|
15
|
+
...renderRebuildOps(diff.rebuildOps ?? []),
|
|
16
|
+
]
|
|
17
|
+
: [];
|
|
18
|
+
return renderChangeSet(diff, { ...(opts.title ? { title: opts.title } : {}), rules: CLASSIFIER_RULES, classes: CHANGE_CLASSES, trailer });
|
|
19
|
+
}
|