@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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The import generator for every dialect: an IR whose resources are Postgres
|
|
3
|
+
* types goes to the Postgres generator, any other to ClickHouse's. A build
|
|
4
|
+
* holds one dialect, and so does an import.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { GeneratedFile, TypeScriptGenerator } from "@intentius/chant/import/generator";
|
|
8
|
+
import type { TemplateIR } from "@intentius/chant/import/parser";
|
|
9
|
+
import { ClickHouseGenerator } from "./clickhouse/import/generator";
|
|
10
|
+
import { PostgresGenerator } from "./postgres/import/generator";
|
|
11
|
+
|
|
12
|
+
export const sqlTemplateGenerator: TypeScriptGenerator = {
|
|
13
|
+
ownsLayout: true,
|
|
14
|
+
generate(ir: TemplateIR): GeneratedFile[] {
|
|
15
|
+
const postgres = ir.resources.some((r) => r.type.startsWith("Postgres::"));
|
|
16
|
+
return (postgres ? new PostgresGenerator() : new ClickHouseGenerator()).generate(ir);
|
|
17
|
+
},
|
|
18
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// The sql lexicon. Each database dialect is a subpath:
|
|
2
|
+
// @intentius/chant-lexicon-sql/clickhouse
|
|
3
|
+
// @intentius/chant-lexicon-sql/postgres
|
|
4
|
+
// The root exports the plugin, the serializer and the dialect list.
|
|
5
|
+
|
|
6
|
+
export { sqlPlugin } from "./plugin";
|
|
7
|
+
export { sqlSerializer } from "./serializer";
|
|
8
|
+
export { SQL_DIALECTS, type SqlDialect } from "./dialects";
|
|
9
|
+
export { sqlConfigSchema, type SqlConfig } from "./config";
|
|
10
|
+
|
|
11
|
+
// The ClickHouse tags, also exported at the root because the plugin registers
|
|
12
|
+
// them as intrinsics (check-lexicon resolves a registered intrinsic against the
|
|
13
|
+
// root's exports). Declarations import them from the dialect subpath,
|
|
14
|
+
// `@intentius/chant-lexicon-sql/clickhouse`.
|
|
15
|
+
export { database, table, view, literal } from "./clickhouse/entities";
|
|
16
|
+
|
|
17
|
+
// The Postgres tags whose names ClickHouse does not export, for the same reason.
|
|
18
|
+
// A tag folds as the function its file imports, so `table` imported from
|
|
19
|
+
// `@intentius/chant-lexicon-sql/postgres` is Postgres's. Declarations import
|
|
20
|
+
// them from the dialect subpath.
|
|
21
|
+
export { schema, index, sequence, type, domain, extension } from "./postgres/entities";
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { build } from "@intentius/chant/build";
|
|
5
|
+
import { lintCommand } from "@intentius/chant/cli/commands/lint";
|
|
6
|
+
import { runPostSynthChecks } from "@intentius/chant/lint/post-synth";
|
|
7
|
+
import { sqlPlugin } from "./plugin";
|
|
8
|
+
import { postSynthChecks } from "./lint/post-synth";
|
|
9
|
+
import { detectTemplate } from "./detect";
|
|
10
|
+
|
|
11
|
+
const cases: Array<[string | undefined, string[]]> = [
|
|
12
|
+
[undefined, ["shop", "orders", "openOrders"]],
|
|
13
|
+
["events", ["analytics", "events", "hourly", "hourlyMv"]],
|
|
14
|
+
["cdc", ["mirror", "customers", "customersCurrent"]],
|
|
15
|
+
["postgres", ["app", "users", "orders", "ordersUser", "orderTotals"]],
|
|
16
|
+
["postgres-tenant", ["app", "tenants", "projects", "tasks", "tasksProject", "tasksOpen"]],
|
|
17
|
+
["postgres-events", ["analytics", "events", "eventsKind", "events202601", "events202602", "events202603"]],
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
describe("init templates", () => {
|
|
21
|
+
test.each(cases)("%s builds, lints clean and passes every check", async (name, exports) => {
|
|
22
|
+
const set = sqlPlugin.initTemplates!(name);
|
|
23
|
+
const dir = mkdtempSync(join(import.meta.dirname, "..", ".init-template-"));
|
|
24
|
+
try {
|
|
25
|
+
mkdirSync(join(dir, "src"));
|
|
26
|
+
for (const [file, text] of Object.entries(set.src)) writeFileSync(join(dir, "src", file), text);
|
|
27
|
+
for (const [file, text] of Object.entries(set.root ?? {})) writeFileSync(join(dir, file), text);
|
|
28
|
+
const result = await build(join(dir, "src"), [sqlPlugin.serializer]);
|
|
29
|
+
expect(result.errors).toEqual([]);
|
|
30
|
+
|
|
31
|
+
const out = result.outputs.get("sql") as { primary: string; files: Record<string, string> };
|
|
32
|
+
expect(out).toBeTruthy();
|
|
33
|
+
const doc = JSON.parse(out.primary) as { applyOrder: string[] };
|
|
34
|
+
expect([...doc.applyOrder].sort()).toEqual([...exports].sort());
|
|
35
|
+
// Every template's own output is recognized as a sql project.
|
|
36
|
+
expect(detectTemplate(doc)).toBe(true);
|
|
37
|
+
|
|
38
|
+
expect(runPostSynthChecks(postSynthChecks, result)).toEqual([]);
|
|
39
|
+
|
|
40
|
+
const lint = await lintCommand({ path: join(dir, "src"), format: "stylish", fix: false });
|
|
41
|
+
expect(lint.errorCount + lint.warningCount, lint.output).toBe(0);
|
|
42
|
+
} finally {
|
|
43
|
+
rmSync(dir, { recursive: true, force: true });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("an unknown template name falls back to the default", () => {
|
|
48
|
+
expect(sqlPlugin.initTemplates!("nope")).toBe(sqlPlugin.initTemplates!());
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("the events template carries a TTL and a rollup written by a materialized view", () => {
|
|
52
|
+
const src = sqlPlugin.initTemplates!("events").src;
|
|
53
|
+
expect(src["events.ts"]).toContain("TTL ts + INTERVAL 90 DAY");
|
|
54
|
+
expect(src["rollup.ts"]).toContain("CREATE MATERIALIZED VIEW");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("the postgres templates declare a dialect-true document", async () => {
|
|
58
|
+
for (const name of ["postgres", "postgres-tenant", "postgres-events"]) {
|
|
59
|
+
const set = sqlPlugin.initTemplates!(name);
|
|
60
|
+
for (const text of Object.values(set.src)) expect(text).toContain("@intentius/chant-lexicon-sql/postgres");
|
|
61
|
+
}
|
|
62
|
+
expect(sqlPlugin.initTemplates!("postgres-events").src["events.ts"]).toContain("PARTITION BY RANGE (occurred_at)");
|
|
63
|
+
expect(sqlPlugin.initTemplates!("postgres-tenant").src["tasks.ts"]).toContain("(\${tasks.columns.tenant_id}, \${tasks.columns.project_id})");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("the cdc template is a ReplacingMergeTree with a version column", () => {
|
|
67
|
+
expect(sqlPlugin.initTemplates!("cdc").src["customers.ts"]).toContain("ReplacingMergeTree(_version, _deleted)");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe("detectTemplate", () => {
|
|
72
|
+
const build = {
|
|
73
|
+
dialect: "clickhouse",
|
|
74
|
+
applyOrder: ["a", "t"],
|
|
75
|
+
objects: [{ export: "a", type: "ClickHouse::Database" }, { export: "t", type: "ClickHouse::Table" }],
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
test("recognizes a sql build output", () => {
|
|
79
|
+
expect(sqlPlugin.detectTemplate!(build)).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("recognizes a Postgres build output", () => {
|
|
83
|
+
expect(
|
|
84
|
+
sqlPlugin.detectTemplate!({
|
|
85
|
+
dialect: "postgres",
|
|
86
|
+
applyOrder: ["app", "users"],
|
|
87
|
+
objects: [{ export: "app", type: "Postgres::Schema" }, { export: "users", type: "Postgres::Table" }],
|
|
88
|
+
}),
|
|
89
|
+
).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("a document whose types are another dialect's is not claimed", () => {
|
|
93
|
+
expect(sqlPlugin.detectTemplate!({ dialect: "postgres", applyOrder: ["t"], objects: [{ type: "ClickHouse::Table" }] })).toBe(false);
|
|
94
|
+
expect(sqlPlugin.detectTemplate!({ dialect: "mysql", applyOrder: ["t"], objects: [{ type: "MySql::Table" }] })).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test.each([
|
|
98
|
+
["null", null],
|
|
99
|
+
["an array", []],
|
|
100
|
+
["no objects", { dialect: "clickhouse", applyOrder: [], objects: [] }],
|
|
101
|
+
["no dialect", { applyOrder: ["t"], objects: [{ type: "ClickHouse::Table" }] }],
|
|
102
|
+
["an untyped object", { dialect: "clickhouse", applyOrder: ["t"], objects: [{ export: "t" }] }],
|
|
103
|
+
["a dashboard", { panels: [], schemaVersion: 39 }],
|
|
104
|
+
["a prometheus rule file", { groups: [{ name: "g", rules: [{ record: "r", expr: "up" }] }] }],
|
|
105
|
+
])("does not claim %s", (_name, data) => {
|
|
106
|
+
expect(sqlPlugin.detectTemplate!(data)).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant init --lexicon sql` scaffolds, all ClickHouse.
|
|
3
|
+
*
|
|
4
|
+
* - default: a database, one MergeTree table and a view that reads it.
|
|
5
|
+
* - `events`: an events table with a partition key and a TTL, and a rollup
|
|
6
|
+
* (an AggregatingMergeTree target and the materialized view that fills it).
|
|
7
|
+
* - `cdc`: a mirror of an upstream table kept by a CDC feed: a
|
|
8
|
+
* ReplacingMergeTree table with a version column and a delete flag, and a
|
|
9
|
+
* view of the current rows.
|
|
10
|
+
*
|
|
11
|
+
* Each builds with the sql lexicon alone and passes its post-synth checks.
|
|
12
|
+
*/
|
|
13
|
+
import type { InitTemplateSet } from "@intentius/chant/lexicon";
|
|
14
|
+
|
|
15
|
+
const DATABASE = (name: string, comment: string) => `import { database } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
16
|
+
|
|
17
|
+
export const ${name} = database\`
|
|
18
|
+
CREATE DATABASE ${name}
|
|
19
|
+
ENGINE = Atomic
|
|
20
|
+
COMMENT '${comment}'\`;
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
// ── default ────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
const DEFAULT_TABLES = `import { table } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
26
|
+
import { shop } from "./database";
|
|
27
|
+
|
|
28
|
+
// Orders land here. The sort key is the on-disk order of every part, and it
|
|
29
|
+
// cannot be changed in place later, so choose it for the queries you run.
|
|
30
|
+
export const orders = table\`
|
|
31
|
+
CREATE TABLE \${shop}.orders (
|
|
32
|
+
id UInt64,
|
|
33
|
+
customer_id UInt64,
|
|
34
|
+
status LowCardinality(String),
|
|
35
|
+
total Decimal(18, 2),
|
|
36
|
+
created_at DateTime
|
|
37
|
+
)
|
|
38
|
+
ENGINE = MergeTree
|
|
39
|
+
PARTITION BY toYYYYMM(created_at)
|
|
40
|
+
ORDER BY (customer_id, created_at, id)\`;
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const DEFAULT_VIEWS = `import { view } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
44
|
+
import { shop } from "./database";
|
|
45
|
+
import { orders } from "./orders";
|
|
46
|
+
|
|
47
|
+
// Columns are referenced through .columns, which records the view's lineage.
|
|
48
|
+
export const openOrders = view\`
|
|
49
|
+
CREATE VIEW \${shop}.open_orders AS
|
|
50
|
+
SELECT
|
|
51
|
+
\${orders.columns.id} AS id,
|
|
52
|
+
\${orders.columns.customer_id} AS customer_id,
|
|
53
|
+
\${orders.columns.total} AS total
|
|
54
|
+
FROM \${orders}
|
|
55
|
+
WHERE \${orders.columns.status} = 'open'\`;
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
export const DEFAULT_TEMPLATE: InitTemplateSet = {
|
|
59
|
+
src: {
|
|
60
|
+
"database.ts": DATABASE("shop", "Orders and customers"),
|
|
61
|
+
"orders.ts": DEFAULT_TABLES,
|
|
62
|
+
"views.ts": DEFAULT_VIEWS,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// ── events ─────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
const EVENTS_TABLE = `import { table } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
69
|
+
import { analytics } from "./database";
|
|
70
|
+
|
|
71
|
+
// Raw events, kept 90 days. The TTL is a background rewrite when changed
|
|
72
|
+
// (chant sql plan reports it as SQLCH205).
|
|
73
|
+
export const events = table\`
|
|
74
|
+
CREATE TABLE \${analytics}.events (
|
|
75
|
+
user_id UUID,
|
|
76
|
+
kind LowCardinality(String),
|
|
77
|
+
ts DateTime CODEC(Delta, ZSTD(3)),
|
|
78
|
+
props Map(String, String)
|
|
79
|
+
)
|
|
80
|
+
ENGINE = MergeTree
|
|
81
|
+
PARTITION BY toYYYYMM(ts)
|
|
82
|
+
ORDER BY (kind, user_id, ts)
|
|
83
|
+
TTL ts + INTERVAL 90 DAY\`;
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
const EVENTS_ROLLUP = `import { table, view } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
87
|
+
import { analytics } from "./database";
|
|
88
|
+
import { events } from "./events";
|
|
89
|
+
|
|
90
|
+
// Hourly counts and distinct users per kind. The rollup outlives the raw
|
|
91
|
+
// events: it has no TTL.
|
|
92
|
+
export const hourly = table\`
|
|
93
|
+
CREATE TABLE \${analytics}.events_hourly (
|
|
94
|
+
hour DateTime,
|
|
95
|
+
kind LowCardinality(String),
|
|
96
|
+
n SimpleAggregateFunction(sum, UInt64),
|
|
97
|
+
users AggregateFunction(uniq, UUID)
|
|
98
|
+
)
|
|
99
|
+
ENGINE = AggregatingMergeTree
|
|
100
|
+
PARTITION BY toYYYYMM(hour)
|
|
101
|
+
ORDER BY (kind, hour)\`;
|
|
102
|
+
|
|
103
|
+
// The target of a materialized view is fixed when the view is created.
|
|
104
|
+
export const hourlyMv = view\`
|
|
105
|
+
CREATE MATERIALIZED VIEW \${analytics}.events_hourly_mv TO \${hourly} AS
|
|
106
|
+
SELECT
|
|
107
|
+
toStartOfHour(\${events.columns.ts}) AS hour,
|
|
108
|
+
\${events.columns.kind} AS kind,
|
|
109
|
+
count() AS n,
|
|
110
|
+
uniqState(\${events.columns.user_id}) AS users
|
|
111
|
+
FROM \${events}
|
|
112
|
+
GROUP BY hour, kind\`;
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
export const EVENTS_TEMPLATE: InitTemplateSet = {
|
|
116
|
+
src: {
|
|
117
|
+
"database.ts": DATABASE("analytics", "Product analytics"),
|
|
118
|
+
"events.ts": EVENTS_TABLE,
|
|
119
|
+
"rollup.ts": EVENTS_ROLLUP,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// ── cdc ────────────────────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
const CDC_TABLE = `import { table, view } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
126
|
+
import { mirror } from "./database";
|
|
127
|
+
|
|
128
|
+
// A mirror of an upstream customers table. The CDC feed inserts a row per
|
|
129
|
+
// change with a rising _version, and a delete as a row with _deleted = 1.
|
|
130
|
+
// ReplacingMergeTree keeps the highest _version per sort key at merge time,
|
|
131
|
+
// and the engine arguments cannot be changed in place later.
|
|
132
|
+
export const customers = table\`
|
|
133
|
+
CREATE TABLE \${mirror}.customers (
|
|
134
|
+
id UInt64,
|
|
135
|
+
email String,
|
|
136
|
+
plan LowCardinality(String) DEFAULT 'free',
|
|
137
|
+
_version UInt64,
|
|
138
|
+
_deleted UInt8 DEFAULT 0
|
|
139
|
+
)
|
|
140
|
+
ENGINE = ReplacingMergeTree(_version, _deleted)
|
|
141
|
+
ORDER BY id\`;
|
|
142
|
+
|
|
143
|
+
// Merges are eventual, so read through FINAL (or this view) for the current rows.
|
|
144
|
+
export const customersCurrent = view\`
|
|
145
|
+
CREATE VIEW \${mirror}.customers_current AS
|
|
146
|
+
SELECT
|
|
147
|
+
\${customers.columns.id} AS id,
|
|
148
|
+
\${customers.columns.email} AS email,
|
|
149
|
+
\${customers.columns.plan} AS plan
|
|
150
|
+
FROM \${customers} FINAL\`;
|
|
151
|
+
`;
|
|
152
|
+
|
|
153
|
+
export const CDC_TEMPLATE: InitTemplateSet = {
|
|
154
|
+
src: {
|
|
155
|
+
"database.ts": DATABASE("mirror", "Replicated from the upstream database"),
|
|
156
|
+
"customers.ts": CDC_TABLE,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// ── Postgres ───────────────────────────────────────────────────────────
|
|
161
|
+
//
|
|
162
|
+
// `--template postgres`, `postgres-tenant` and `postgres-events`. Each builds
|
|
163
|
+
// with the sql lexicon alone and lints clean.
|
|
164
|
+
|
|
165
|
+
const PG_SCHEMA = (name: string, comment: string) => `import { schema } from "@intentius/chant-lexicon-sql/postgres";
|
|
166
|
+
|
|
167
|
+
export const ${name} = schema\`
|
|
168
|
+
CREATE SCHEMA ${name};
|
|
169
|
+
COMMENT ON SCHEMA ${name} IS '${comment}'\`;
|
|
170
|
+
`;
|
|
171
|
+
|
|
172
|
+
const PG_USERS = `import { table } from "@intentius/chant-lexicon-sql/postgres";
|
|
173
|
+
import { app } from "./schema";
|
|
174
|
+
|
|
175
|
+
export const users = table\`
|
|
176
|
+
CREATE TABLE \${app}.users (
|
|
177
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
178
|
+
email text NOT NULL UNIQUE,
|
|
179
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
180
|
+
);
|
|
181
|
+
COMMENT ON TABLE \${app}.users IS 'One row per account'\`;
|
|
182
|
+
`;
|
|
183
|
+
|
|
184
|
+
const PG_ORDERS = `import { index, table } from "@intentius/chant-lexicon-sql/postgres";
|
|
185
|
+
import { app } from "./schema";
|
|
186
|
+
import { users } from "./users";
|
|
187
|
+
|
|
188
|
+
// The foreign key is a reference: orders is created after users.
|
|
189
|
+
export const orders = table\`
|
|
190
|
+
CREATE TABLE \${app}.orders (
|
|
191
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
192
|
+
user_id bigint NOT NULL REFERENCES \${users} (\${users.columns.id}) ON DELETE CASCADE,
|
|
193
|
+
status text NOT NULL DEFAULT 'placed',
|
|
194
|
+
amount numeric(12, 2) NOT NULL CHECK (amount >= 0),
|
|
195
|
+
placed_at timestamptz NOT NULL DEFAULT now()
|
|
196
|
+
)\`;
|
|
197
|
+
|
|
198
|
+
// Postgres does not index a foreign key for you. An index needs a name: the
|
|
199
|
+
// name is its identity on the server.
|
|
200
|
+
export const ordersUser = index\`
|
|
201
|
+
CREATE INDEX orders_user_id_idx ON \${orders} (\${orders.columns.user_id}, \${orders.columns.placed_at} DESC)\`;
|
|
202
|
+
`;
|
|
203
|
+
|
|
204
|
+
const PG_VIEWS = `import { view } from "@intentius/chant-lexicon-sql/postgres";
|
|
205
|
+
import { app } from "./schema";
|
|
206
|
+
import { orders } from "./orders";
|
|
207
|
+
import { users } from "./users";
|
|
208
|
+
|
|
209
|
+
// Columns are referenced through .columns, which records the view's lineage.
|
|
210
|
+
export const orderTotals = view\`
|
|
211
|
+
CREATE VIEW \${app}.order_totals WITH (security_invoker = true) AS
|
|
212
|
+
SELECT u.\${users.columns.id} AS user_id,
|
|
213
|
+
count(o.\${orders.columns.id}) AS order_count,
|
|
214
|
+
coalesce(sum(o.\${orders.columns.amount}), 0) AS total
|
|
215
|
+
FROM \${users} u
|
|
216
|
+
LEFT JOIN \${orders} o ON o.\${orders.columns.user_id} = u.\${users.columns.id}
|
|
217
|
+
GROUP BY u.\${users.columns.id}\`;
|
|
218
|
+
`;
|
|
219
|
+
|
|
220
|
+
export const POSTGRES_TEMPLATE: InitTemplateSet = {
|
|
221
|
+
src: {
|
|
222
|
+
"schema.ts": PG_SCHEMA("app", "Accounts and orders"),
|
|
223
|
+
"users.ts": PG_USERS,
|
|
224
|
+
"orders.ts": PG_ORDERS,
|
|
225
|
+
"views.ts": PG_VIEWS,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const TENANT_TABLES = `import { table } from "@intentius/chant-lexicon-sql/postgres";
|
|
230
|
+
import { app } from "./schema";
|
|
231
|
+
|
|
232
|
+
export const tenants = table\`
|
|
233
|
+
CREATE TABLE \${app}.tenants (
|
|
234
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
235
|
+
slug text NOT NULL UNIQUE
|
|
236
|
+
)\`;
|
|
237
|
+
|
|
238
|
+
// Every tenant-owned table carries tenant_id and leads its primary key with it,
|
|
239
|
+
// so a tenant's rows sit together and the key doubles as the tenant's index.
|
|
240
|
+
export const projects = table\`
|
|
241
|
+
CREATE TABLE \${app}.projects (
|
|
242
|
+
tenant_id bigint NOT NULL REFERENCES \${tenants} (\${tenants.columns.id}) ON DELETE CASCADE,
|
|
243
|
+
id bigint GENERATED ALWAYS AS IDENTITY,
|
|
244
|
+
name text NOT NULL,
|
|
245
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
246
|
+
PRIMARY KEY (tenant_id, id)
|
|
247
|
+
)\`;
|
|
248
|
+
`;
|
|
249
|
+
|
|
250
|
+
const TENANT_TASKS = `import { index, table } from "@intentius/chant-lexicon-sql/postgres";
|
|
251
|
+
import { app } from "./schema";
|
|
252
|
+
import { projects } from "./tables";
|
|
253
|
+
|
|
254
|
+
// The foreign key carries the tenant too, so a task cannot point at another
|
|
255
|
+
// tenant's project.
|
|
256
|
+
export const tasks = table\`
|
|
257
|
+
CREATE TABLE \${app}.tasks (
|
|
258
|
+
tenant_id bigint NOT NULL,
|
|
259
|
+
id bigint GENERATED ALWAYS AS IDENTITY,
|
|
260
|
+
project_id bigint NOT NULL,
|
|
261
|
+
title text NOT NULL,
|
|
262
|
+
done boolean NOT NULL DEFAULT false,
|
|
263
|
+
PRIMARY KEY (tenant_id, id),
|
|
264
|
+
FOREIGN KEY (tenant_id, project_id) REFERENCES \${projects} (\${projects.columns.tenant_id}, \${projects.columns.id}) ON DELETE CASCADE
|
|
265
|
+
)\`;
|
|
266
|
+
|
|
267
|
+
// Every index leads with the tenant key.
|
|
268
|
+
export const tasksProject = index\`
|
|
269
|
+
CREATE INDEX tasks_project_idx ON \${tasks} (\${tasks.columns.tenant_id}, \${tasks.columns.project_id})\`;
|
|
270
|
+
|
|
271
|
+
export const tasksOpen = index\`
|
|
272
|
+
CREATE INDEX tasks_open_idx ON \${tasks} (\${tasks.columns.tenant_id}, \${tasks.columns.id}) WHERE NOT \${tasks.columns.done}\`;
|
|
273
|
+
`;
|
|
274
|
+
|
|
275
|
+
export const POSTGRES_TENANT_TEMPLATE: InitTemplateSet = {
|
|
276
|
+
src: {
|
|
277
|
+
"schema.ts": PG_SCHEMA("app", "Multi-tenant application data"),
|
|
278
|
+
"tables.ts": TENANT_TABLES,
|
|
279
|
+
"tasks.ts": TENANT_TASKS,
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const PG_EVENTS_TABLE = `import { index, table } from "@intentius/chant-lexicon-sql/postgres";
|
|
284
|
+
import { analytics } from "./schema";
|
|
285
|
+
|
|
286
|
+
// Partitioned by month. A primary key on a partitioned table must include the
|
|
287
|
+
// partition key, hence (id, occurred_at).
|
|
288
|
+
export const events = table\`
|
|
289
|
+
CREATE TABLE \${analytics}.events (
|
|
290
|
+
id bigint GENERATED ALWAYS AS IDENTITY,
|
|
291
|
+
occurred_at timestamptz NOT NULL,
|
|
292
|
+
kind text NOT NULL,
|
|
293
|
+
payload jsonb NOT NULL DEFAULT '{}',
|
|
294
|
+
PRIMARY KEY (id, occurred_at)
|
|
295
|
+
) PARTITION BY RANGE (occurred_at)\`;
|
|
296
|
+
|
|
297
|
+
// An index on the parent is created on every partition.
|
|
298
|
+
export const eventsKind = index\`
|
|
299
|
+
CREATE INDEX events_kind_idx ON \${events} (\${events.columns.kind}, \${events.columns.occurred_at})\`;
|
|
300
|
+
`;
|
|
301
|
+
|
|
302
|
+
const PG_EVENTS_PARTITIONS = `import { table } from "@intentius/chant-lexicon-sql/postgres";
|
|
303
|
+
import { analytics } from "./schema";
|
|
304
|
+
import { events } from "./events";
|
|
305
|
+
|
|
306
|
+
// One partition per month, bounds [from, to). Add the next month ahead of time:
|
|
307
|
+
// a row with no partition is an error.
|
|
308
|
+
export const events202601 = table\`
|
|
309
|
+
CREATE TABLE \${analytics}.events_2026_01 PARTITION OF \${events}
|
|
310
|
+
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01')\`;
|
|
311
|
+
|
|
312
|
+
export const events202602 = table\`
|
|
313
|
+
CREATE TABLE \${analytics}.events_2026_02 PARTITION OF \${events}
|
|
314
|
+
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01')\`;
|
|
315
|
+
|
|
316
|
+
export const events202603 = table\`
|
|
317
|
+
CREATE TABLE \${analytics}.events_2026_03 PARTITION OF \${events}
|
|
318
|
+
FOR VALUES FROM ('2026-03-01') TO ('2026-04-01')\`;
|
|
319
|
+
`;
|
|
320
|
+
|
|
321
|
+
export const POSTGRES_EVENTS_TEMPLATE: InitTemplateSet = {
|
|
322
|
+
src: {
|
|
323
|
+
"schema.ts": PG_SCHEMA("analytics", "Product analytics"),
|
|
324
|
+
"events.ts": PG_EVENTS_TABLE,
|
|
325
|
+
"partitions.ts": PG_EVENTS_PARTITIONS,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql lexicon's chant audit catalog, contributed via `auditCatalog()`.
|
|
3
|
+
*
|
|
4
|
+
* Post-synth checks read the build's JSON output, so they are `yamlBased`. The
|
|
5
|
+
* source-level rules read TypeScript and are constructed with
|
|
6
|
+
* `yamlBased: false`; they are listed for a reader who meets them in a report.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { applyLineage, auditRule, type RuleMeta } from "@intentius/chant/audit/catalog";
|
|
10
|
+
import { sqlPostSynthAuditEntries } from "./post-synth/audit-entries";
|
|
11
|
+
import { postgresPostSynthAuditEntries } from "./post-synth/postgres-audit-entries";
|
|
12
|
+
import { sqlAuditLineage } from "./audit-lineage";
|
|
13
|
+
|
|
14
|
+
function sourceRule(id: string, category: RuleMeta["category"], title: string, remediation: string): RuleMeta {
|
|
15
|
+
return { id, tier: "merge-worthy", fixKind: "guidance", category, title, remediation, yamlBased: false };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const sqlAuditCatalog: Record<string, RuleMeta> = {
|
|
19
|
+
SQLCH001: sourceRule(
|
|
20
|
+
"SQLCH001",
|
|
21
|
+
"correctness",
|
|
22
|
+
"ClickHouse DDL in a database, table or view template does not parse",
|
|
23
|
+
"Fix the statement at the token the message names.",
|
|
24
|
+
),
|
|
25
|
+
SQLCH002: sourceRule(
|
|
26
|
+
"SQLCH002",
|
|
27
|
+
"correctness",
|
|
28
|
+
"A Nullable column in a ClickHouse sort key or primary key",
|
|
29
|
+
"Make the column non-Nullable, drop it from the key, or set allow_nullable_key = 1 on the table.",
|
|
30
|
+
),
|
|
31
|
+
SQLCH003: sourceRule(
|
|
32
|
+
"SQLCH003",
|
|
33
|
+
"correctness",
|
|
34
|
+
"A column interpolated without .columns reads the entity's own field instead",
|
|
35
|
+
"Write ${table.columns.name}.",
|
|
36
|
+
),
|
|
37
|
+
SQLPG001: sourceRule(
|
|
38
|
+
"SQLPG001",
|
|
39
|
+
"correctness",
|
|
40
|
+
"Postgres DDL in a tagged template does not parse, or holds another statement than its tag",
|
|
41
|
+
"Fix the statement at the token the message names, or use the tag for the statement it holds; name every index.",
|
|
42
|
+
),
|
|
43
|
+
SQLPG002: sourceRule(
|
|
44
|
+
"SQLPG002",
|
|
45
|
+
"correctness",
|
|
46
|
+
"A column interpolated without .columns reads the entity's own field instead",
|
|
47
|
+
"Write ${table.columns.name}.",
|
|
48
|
+
),
|
|
49
|
+
SQLPG003: sourceRule(
|
|
50
|
+
"SQLPG003",
|
|
51
|
+
"correctness",
|
|
52
|
+
"A sequence or relation named in a regclass string makes no reference",
|
|
53
|
+
"Interpolate the declared object: nextval(${sequence}) or ${relation}::regclass.",
|
|
54
|
+
),
|
|
55
|
+
SQLPG004: sourceRule(
|
|
56
|
+
"SQLPG004",
|
|
57
|
+
"correctness",
|
|
58
|
+
"A declared extension the configured Postgres provider does not allow",
|
|
59
|
+
"Use an extension the provider lists, or set sql.provider to the service the project deploys to.",
|
|
60
|
+
),
|
|
61
|
+
SQLCH101: auditRule(
|
|
62
|
+
"SQLCH101",
|
|
63
|
+
"merge-worthy",
|
|
64
|
+
"guidance",
|
|
65
|
+
"A ClickHouse object names an engine the pinned server does not have",
|
|
66
|
+
"Use an engine from the pinned server's system.table_engines (or system.database_engines for a database).",
|
|
67
|
+
{ category: "correctness" },
|
|
68
|
+
),
|
|
69
|
+
...sqlPostSynthAuditEntries,
|
|
70
|
+
...postgresPostSynthAuditEntries,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
applyLineage(sqlAuditCatalog, sqlAuditLineage);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prior art for the sql lexicon's audit rules: the tools whose checks cover the
|
|
3
|
+
* same condition, credited per rule. See packages/core/src/audit/prior-art.ts
|
|
4
|
+
* for the registry and the relation vocabulary. Kept by hand.
|
|
5
|
+
*
|
|
6
|
+
* Mapped against #3285's seed list (squawk, strong_migrations,
|
|
7
|
+
* django-pg-zero-downtime-migrations). Those tools are migration linters: the
|
|
8
|
+
* rules that overlap a schema-level check are the type preferences.
|
|
9
|
+
*
|
|
10
|
+
* - squawk (https://squawkhq.com/docs/rules) prefer-identity,
|
|
11
|
+
* prefer-timestamptz, ban-char-field and prefer-text-field.
|
|
12
|
+
* - strong_migrations "Adding a json column": the json type has no equality
|
|
13
|
+
* operator, the same reason SQLPG105 prefers jsonb.
|
|
14
|
+
* - django-pg-zero-downtime-migrations has no rule on a column's type or an
|
|
15
|
+
* index's shape; its rules are about locks, which the lock classifier
|
|
16
|
+
* (SQLPG2xx) covers, so it is not credited here.
|
|
17
|
+
* - The Postgres wiki "Don't Do This" page names serial, timestamp, char(n),
|
|
18
|
+
* money and varchar(n) as types to avoid.
|
|
19
|
+
*
|
|
20
|
+
* SQLPG101-102, 109-118 have no tool credit: the checks come from the
|
|
21
|
+
* Postgres documentation each one cites.
|
|
22
|
+
*/
|
|
23
|
+
import type { Lineage } from "@intentius/chant/audit/catalog";
|
|
24
|
+
|
|
25
|
+
const squawk = (rule: string, relation: Lineage["relation"]): Lineage => ({ tool: "squawk", rule, url: `https://squawkhq.com/docs/${rule}`, relation });
|
|
26
|
+
const wiki = (rule: string, anchor: string): Lineage => ({
|
|
27
|
+
tool: "postgres-wiki-dont-do-this",
|
|
28
|
+
rule,
|
|
29
|
+
url: `https://wiki.postgresql.org/wiki/Don%27t_Do_This#${anchor}`,
|
|
30
|
+
relation: "overlaps",
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const sqlAuditLineage: Record<string, Lineage[]> = {
|
|
34
|
+
SQLPG103: [squawk("prefer-identity", "equivalent"), wiki("Don't use serial", "Don.27t_use_serial")],
|
|
35
|
+
SQLPG104: [squawk("prefer-timestamptz", "equivalent"), wiki("Don't use timestamp (without time zone)", "Don.27t_use_timestamp_.28without_time_zone.29")],
|
|
36
|
+
SQLPG105: [
|
|
37
|
+
{
|
|
38
|
+
tool: "strong_migrations",
|
|
39
|
+
rule: "Adding a json column",
|
|
40
|
+
url: "https://github.com/ankane/strong_migrations#adding-a-json-column",
|
|
41
|
+
relation: "overlaps",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
SQLPG106: [squawk("ban-char-field", "equivalent"), wiki("Don't use char(n)", "Don.27t_use_char.28n.29")],
|
|
45
|
+
SQLPG107: [wiki("Don't use money", "Don.27t_use_money")],
|
|
46
|
+
SQLPG108: [squawk("prefer-text-field", "overlaps"), wiki("Don't use varchar(n) by default", "Don.27t_use_varchar.28n.29_by_default")],
|
|
47
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit metadata for the ClickHouse post-synth checks (SQLCH1xx). Spread into
|
|
3
|
+
* `sqlAuditCatalog` by ../audit-catalog.ts. Deprecation checks are filed under
|
|
4
|
+
* best-practice: the audit categories have no deprecation of their own.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { auditRule, type RuleMeta } from "@intentius/chant/audit/catalog";
|
|
8
|
+
|
|
9
|
+
export const sqlPostSynthAuditEntries: Record<string, RuleMeta> = {
|
|
10
|
+
SQLCH102: auditRule("SQLCH102", "merge-worthy", "guidance", "A PRIMARY KEY that is not a prefix of ORDER BY", "Make the primary key a leading prefix of the sort key, or drop it to use the sort key.", { category: "correctness" }),
|
|
11
|
+
SQLCH103: auditRule("SQLCH103", "merge-worthy", "guidance", "An engine's version, sign or is_deleted column has an unsupported type", "Use UInt*, Date, DateTime or DateTime64 for a version, Int8 for a sign, UInt8 for is_deleted.", { category: "correctness" }),
|
|
12
|
+
SQLCH104: auditRule("SQLCH104", "merge-worthy", "guidance", "A MergeTree engine argument names a column the table does not declare", "Declare the column, or fix the name in the engine arguments.", { category: "correctness" }),
|
|
13
|
+
SQLCH105: auditRule("SQLCH105", "merge-worthy", "guidance", "A table key clause names a column the table does not declare", "Declare the column, or fix the name in ORDER BY, PRIMARY KEY, PARTITION BY or SAMPLE BY.", { category: "correctness" }),
|
|
14
|
+
SQLCH106: auditRule("SQLCH106", "merge-worthy", "guidance", "A skip index expression names a column the table does not declare", "Declare the column, or fix the index expression.", { category: "correctness" }),
|
|
15
|
+
SQLCH107: auditRule("SQLCH107", "merge-worthy", "guidance", "A TTL expression is built on a column that is not a Date or DateTime", "Base the TTL on a Date or DateTime column, or convert it in the expression.", { category: "correctness" }),
|
|
16
|
+
SQLCH108: auditRule("SQLCH108", "merge-worthy", "guidance", "CREATE OR REPLACE TABLE in a database that is not Atomic", "Create the database with ENGINE = Atomic or Replicated, or drop OR REPLACE.", { category: "correctness" }),
|
|
17
|
+
SQLCH109: auditRule("SQLCH109", "report-only", "guidance", "A materialized view selects *", "List the columns the view writes.", { category: "best-practice" }),
|
|
18
|
+
SQLCH110: auditRule("SQLCH110", "report-only", "guidance", "A materialized view writes a column its TO target does not declare", "Add the column to the target table, or drop it from the SELECT.", { category: "correctness" }),
|
|
19
|
+
SQLCH111: auditRule("SQLCH111", "report-only", "guidance", "A String column limited to a few values is not LowCardinality", "Declare the column LowCardinality(String).", { category: "best-practice" }),
|
|
20
|
+
SQLCH112: auditRule("SQLCH112", "report-only", "guidance", "A PARTITION BY expression is finer than a day", "Partition by month (toYYYYMM) or day, and keep the finer time in ORDER BY.", { category: "best-practice" }),
|
|
21
|
+
SQLCH113: auditRule("SQLCH113", "merge-worthy", "guidance", "A MergeTree table declares no sort key", "Add ORDER BY, or ORDER BY tuple() for no sorting.", { category: "correctness" }),
|
|
22
|
+
SQLCH114: auditRule("SQLCH114", "merge-worthy", "guidance", "A column codec is not one the pinned server has", "Use a codec from the pinned server's system.codecs.", { category: "correctness" }),
|
|
23
|
+
SQLCH115: auditRule("SQLCH115", "report-only", "guidance", "A secret- or PII-named column carries no comment, TTL or encryption", "Add a COMMENT saying what it holds, a TTL that bounds retention, or an AES_*_GCM_SIV codec.", { category: "security" }),
|
|
24
|
+
SQLCH116: auditRule("SQLCH116", "report-only", "guidance", "A view is SQL SECURITY DEFINER with no DEFINER", "Write DEFINER = <user> before SQL SECURITY DEFINER.", { category: "security" }),
|
|
25
|
+
SQLCH117: auditRule("SQLCH117", "report-only", "guidance", "A MergeTree setting is obsolete at the pinned server", "Remove the setting; the server ignores it.", { category: "best-practice" }),
|
|
26
|
+
SQLCH118: auditRule("SQLCH118", "merge-worthy", "guidance", "A MergeTree setting is not one the pinned server has", "Fix the setting name, or pick a setting from the pinned server's system.merge_tree_settings.", { category: "correctness" }),
|
|
27
|
+
SQLCH119: auditRule("SQLCH119", "report-only", "guidance", "An object uses a deprecated or experimental engine", "Use the engine that replaced it (Atomic for Ordinary), or accept the experimental engine knowingly.", { category: "best-practice" }),
|
|
28
|
+
SQLCH120: auditRule("SQLCH120", "report-only", "guidance", "A MergeTree engine uses the deprecated positional arguments", "Write a bare MergeTree with ORDER BY, PARTITION BY and SETTINGS.", { category: "best-practice" }),
|
|
29
|
+
};
|