@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `EventsTable`: an append-only MergeTree events table, partitioned by month and expired by TTL.
|
|
3
|
+
*
|
|
4
|
+
* The table is partitioned by its timestamp (by month unless `partitionBy`
|
|
5
|
+
* says otherwise) and drops rows older than `ttlDays`. It sets
|
|
6
|
+
* `ttl_only_drop_parts`, so expiry drops whole parts once every row in them
|
|
7
|
+
* has expired instead of rewriting parts to remove single rows, which is cheap
|
|
8
|
+
* when the partition and the TTL follow the same column.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Composite } from "@intentius/chant/composite";
|
|
12
|
+
import { table, type ClickHouseTable } from "../clickhouse/entities";
|
|
13
|
+
|
|
14
|
+
export interface EventsTableProps {
|
|
15
|
+
/** The table's name, `name` or `database.name`. */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Every column except the timestamp, as SQL: `user_id UUID, kind LowCardinality(String)`. */
|
|
18
|
+
columns: string;
|
|
19
|
+
/** The sort key. Put the columns queries filter on first: `(kind, user_id, ts)`. */
|
|
20
|
+
orderBy: string;
|
|
21
|
+
/** The timestamp column (default `ts`). TTL and the default partition key read it. */
|
|
22
|
+
timestamp?: string;
|
|
23
|
+
/** The timestamp's type (default `DateTime`): a Date, DateTime or DateTime64. */
|
|
24
|
+
timestampType?: string;
|
|
25
|
+
/** Days a row is kept (default 90). */
|
|
26
|
+
ttlDays?: number;
|
|
27
|
+
/** The partition key (default `toYYYYMM(<timestamp>)`). Keep it no finer than a day. */
|
|
28
|
+
partitionBy?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type EventsTableMembers = {
|
|
32
|
+
table: ClickHouseTable;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** An append-only MergeTree events table, partitioned by its timestamp and expired by TTL. */
|
|
36
|
+
export const EventsTable = Composite<EventsTableProps, EventsTableMembers>((props) => {
|
|
37
|
+
const ts = props.timestamp ?? "ts";
|
|
38
|
+
const events = table`
|
|
39
|
+
CREATE TABLE ${props.name} (
|
|
40
|
+
${props.columns},
|
|
41
|
+
${ts} ${props.timestampType ?? "DateTime"}
|
|
42
|
+
)
|
|
43
|
+
ENGINE = MergeTree
|
|
44
|
+
PARTITION BY ${props.partitionBy ?? `toYYYYMM(${ts})`}
|
|
45
|
+
ORDER BY ${props.orderBy}
|
|
46
|
+
TTL ${ts} + INTERVAL ${props.ttlDays ?? 90} DAY
|
|
47
|
+
SETTINGS ttl_only_drop_parts = 1`;
|
|
48
|
+
return { table: events };
|
|
49
|
+
}, "EventsTable");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql lexicon's composites: tables and views that are usually declared
|
|
3
|
+
* together, built from each dialect's `table`, `index` and `view` tags so every
|
|
4
|
+
* field keeps its provenance. `./clickhouse` and `./postgres` are what the two
|
|
5
|
+
* dialect subpaths export.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export * from "./clickhouse";
|
|
9
|
+
export * from "./postgres";
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `JoinTable`: the table of a many-to-many relation, with both foreign keys indexed.
|
|
3
|
+
*
|
|
4
|
+
* The primary key is `(<leftColumn>, <rightColumn>)`, which also serves
|
|
5
|
+
* lookups from the left side. The reverse index on `(<rightColumn>,
|
|
6
|
+
* <leftColumn>)` serves lookups from the right and keeps deletes of a
|
|
7
|
+
* referenced row off a table scan (SQLPG102). Each foreign key cascades by
|
|
8
|
+
* default, so deleting a row on either side removes its links.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Composite } from "@intentius/chant/composite";
|
|
12
|
+
import { index, table, type PostgresIndex, type PostgresSchema, type PostgresTable } from "../postgres/entities";
|
|
13
|
+
|
|
14
|
+
export interface JoinTableProps {
|
|
15
|
+
/** The table's name, unqualified. The reverse index is `<name>_reverse_idx`. */
|
|
16
|
+
name: string;
|
|
17
|
+
/** The schema the table lives in: the entity, or its name (default `public`). */
|
|
18
|
+
schema?: PostgresSchema | string;
|
|
19
|
+
/** The table on the left of the relation, as the entity. */
|
|
20
|
+
left: PostgresTable;
|
|
21
|
+
/** The column on the left table the key references (default `id`). */
|
|
22
|
+
leftKey?: string;
|
|
23
|
+
/** The join table's column holding the left key: `user_id`. */
|
|
24
|
+
leftColumn: string;
|
|
25
|
+
/** The left column's type (default `bigint`). */
|
|
26
|
+
leftType?: string;
|
|
27
|
+
/** The table on the right of the relation, as the entity. */
|
|
28
|
+
right: PostgresTable;
|
|
29
|
+
/** The column on the right table the key references (default `id`). */
|
|
30
|
+
rightKey?: string;
|
|
31
|
+
/** The join table's column holding the right key: `team_id`. */
|
|
32
|
+
rightColumn: string;
|
|
33
|
+
/** The right column's type (default `bigint`). */
|
|
34
|
+
rightType?: string;
|
|
35
|
+
/** What happens to a link when the row it references is deleted (default `CASCADE`). */
|
|
36
|
+
onDelete?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type JoinTableMembers = {
|
|
40
|
+
table: PostgresTable;
|
|
41
|
+
reverseIndex: PostgresIndex;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** The table of a many-to-many relation: two foreign keys, a composite primary key and the reverse index. */
|
|
45
|
+
export const JoinTable = Composite<JoinTableProps, JoinTableMembers>((props) => {
|
|
46
|
+
const schema = props.schema ?? "public";
|
|
47
|
+
const links = table`
|
|
48
|
+
CREATE TABLE ${schema}.${props.name} (
|
|
49
|
+
${props.leftColumn} ${props.leftType ?? "bigint"} NOT NULL REFERENCES ${props.left} (${props.leftKey ?? "id"}) ON DELETE ${props.onDelete ?? "CASCADE"},
|
|
50
|
+
${props.rightColumn} ${props.rightType ?? "bigint"} NOT NULL REFERENCES ${props.right} (${props.rightKey ?? "id"}) ON DELETE ${props.onDelete ?? "CASCADE"},
|
|
51
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
52
|
+
PRIMARY KEY (${props.leftColumn}, ${props.rightColumn})
|
|
53
|
+
)`;
|
|
54
|
+
const reverse = index`
|
|
55
|
+
CREATE INDEX ${`${props.name}_reverse_idx`} ON ${links} (${props.rightColumn}, ${props.leftColumn})`;
|
|
56
|
+
return { table: links, reverseIndex: reverse };
|
|
57
|
+
}, "JoinTable");
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The Postgres composites, exported at `@intentius/chant-lexicon-sql/postgres`. */
|
|
2
|
+
|
|
3
|
+
export { SoftDeleteTable, type SoftDeleteTableProps, type SoftDeleteTableMembers } from "./soft-delete-table";
|
|
4
|
+
export { AuditLogTable, type AuditLogTableProps, type AuditLogTableMembers } from "./audit-log-table";
|
|
5
|
+
export { JoinTable, type JoinTableProps, type JoinTableMembers } from "./join-table";
|
|
6
|
+
export { TenantTable, type TenantTableProps, type TenantTableMembers } from "./tenant-table";
|
|
7
|
+
export { RefreshedView, type RefreshedViewProps, type RefreshedViewMembers } from "./refreshed-view";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `RefreshedView`: a materialized view with the unique index that lets it refresh concurrently.
|
|
3
|
+
*
|
|
4
|
+
* `REFRESH MATERIALIZED VIEW CONCURRENTLY` needs at least one unique index
|
|
5
|
+
* over plain columns, and without it every refresh takes an ACCESS EXCLUSIVE
|
|
6
|
+
* lock that blocks readers (SQLPG111). The composite declares the view and
|
|
7
|
+
* that index together, so a view cannot be added without one. The view reads
|
|
8
|
+
* `source` by reference, so the build orders them and the view's lineage
|
|
9
|
+
* names the source's columns.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Composite } from "@intentius/chant/composite";
|
|
13
|
+
import { index, view, type PostgresIndex, type PostgresRelation, type PostgresSchema, type PostgresView } from "../postgres/entities";
|
|
14
|
+
|
|
15
|
+
export interface RefreshedViewProps {
|
|
16
|
+
/** The view's name, unqualified. The index is `<name>_key`. */
|
|
17
|
+
name: string;
|
|
18
|
+
/** The schema the view lives in: the entity, or its name (default `public`). */
|
|
19
|
+
schema?: PostgresSchema | string;
|
|
20
|
+
/** The table or view the materialized view reads, as the entity. */
|
|
21
|
+
source: PostgresRelation;
|
|
22
|
+
/** The select list, each computed item aliased: `region, count(*) AS orders, sum(total) AS revenue`. */
|
|
23
|
+
select: string;
|
|
24
|
+
/** The grouping key: `region`. */
|
|
25
|
+
groupBy: string;
|
|
26
|
+
/** The columns of the unique index, which must identify one row of the result (default `groupBy`). */
|
|
27
|
+
uniqueOn?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type RefreshedViewMembers = {
|
|
31
|
+
view: PostgresView;
|
|
32
|
+
uniqueIndex: PostgresIndex;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** A materialized view over a source, with the unique index that allows REFRESH ... CONCURRENTLY. */
|
|
36
|
+
export const RefreshedView = Composite<RefreshedViewProps, RefreshedViewMembers>((props) => {
|
|
37
|
+
const schema = props.schema ?? "public";
|
|
38
|
+
const summary = view`
|
|
39
|
+
CREATE MATERIALIZED VIEW ${schema}.${props.name} AS
|
|
40
|
+
SELECT ${props.select}
|
|
41
|
+
FROM ${props.source}
|
|
42
|
+
GROUP BY ${props.groupBy}`;
|
|
43
|
+
const key = index`
|
|
44
|
+
CREATE UNIQUE INDEX ${`${props.name}_key`} ON ${summary} (${props.uniqueOn ?? props.groupBy})`;
|
|
45
|
+
return { view: summary, uniqueIndex: key };
|
|
46
|
+
}, "RefreshedView");
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ReplacingTable`: a ReplacingMergeTree table with a version column.
|
|
3
|
+
*
|
|
4
|
+
* ReplacingMergeTree keeps one row per sort key. When a merge meets rows with
|
|
5
|
+
* the same key it keeps the one with the highest version, so writing a row
|
|
6
|
+
* again with a higher version is how an update is expressed. Until a merge
|
|
7
|
+
* runs, a query sees every version; read with `FINAL`, or aggregate with
|
|
8
|
+
* `argMax`, when the latest row is what you want.
|
|
9
|
+
*
|
|
10
|
+
* Every field is built from a parameter or fixed by the template, inside the
|
|
11
|
+
* subset `chant build` interprets, so a drift on the table is reported against
|
|
12
|
+
* the parameter that produced the field when the composite is interpreted.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Composite } from "@intentius/chant/composite";
|
|
16
|
+
import { table, type ClickHouseTable } from "../clickhouse/entities";
|
|
17
|
+
|
|
18
|
+
export interface ReplacingTableProps {
|
|
19
|
+
/** The table's name, `name` or `database.name`. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Every column except the version column, as SQL: `id UInt64, email String`. */
|
|
22
|
+
columns: string;
|
|
23
|
+
/** The sort key, which is also the key rows are deduplicated by: `id` or `(tenant_id, id)`. */
|
|
24
|
+
orderBy: string;
|
|
25
|
+
/** The version column (default `version`). The row with the highest version survives a merge. */
|
|
26
|
+
version?: string;
|
|
27
|
+
/** The version column's type (default `UInt64`): a UInt, Date, DateTime or DateTime64. */
|
|
28
|
+
versionType?: string;
|
|
29
|
+
/** A `PARTITION BY` expression. Left out by default: a deduplicating table is usually small enough not to need one. */
|
|
30
|
+
partitionBy?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type ReplacingTableMembers = {
|
|
34
|
+
table: ClickHouseTable;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** A ReplacingMergeTree table that keeps the highest version of each row, with its version column. */
|
|
38
|
+
export const ReplacingTable = Composite<ReplacingTableProps, ReplacingTableMembers>((props) => {
|
|
39
|
+
const version = props.version ?? "version";
|
|
40
|
+
const replacing = table`
|
|
41
|
+
CREATE TABLE ${props.name} (
|
|
42
|
+
${props.columns},
|
|
43
|
+
${version} ${props.versionType ?? "UInt64"}
|
|
44
|
+
)
|
|
45
|
+
ENGINE = ReplacingMergeTree(${version})
|
|
46
|
+
${props.partitionBy ? `PARTITION BY ${props.partitionBy}` : ""}
|
|
47
|
+
ORDER BY ${props.orderBy}`;
|
|
48
|
+
return { table: replacing };
|
|
49
|
+
}, "ReplacingTable");
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `RollupView`: a materialized view that rolls a source table up into its own target table.
|
|
3
|
+
*
|
|
4
|
+
* The target is a SummingMergeTree (or another engine named by `engine`)
|
|
5
|
+
* sorted by the rollup's grouping key. The materialized view writes into it
|
|
6
|
+
* with `TO`, so the target is an ordinary table that can be queried, altered
|
|
7
|
+
* and backfilled on its own, and dropping the view leaves the data. Every
|
|
8
|
+
* column the select list writes has to be one the target declares
|
|
9
|
+
* (SQLCH110), so alias each select item to a target column.
|
|
10
|
+
*
|
|
11
|
+
* The view reads `source` by reference, so it depends on the source and on
|
|
12
|
+
* its target, and the build orders all three.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Composite } from "@intentius/chant/composite";
|
|
16
|
+
import { table, view, type ClickHouseRelation, type ClickHouseTable, type ClickHouseView } from "../clickhouse/entities";
|
|
17
|
+
|
|
18
|
+
export interface RollupViewProps {
|
|
19
|
+
/** The target table's name. The view is `<name>_mv`. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** The table or view the rollup reads, as the entity: `events`. */
|
|
22
|
+
source: ClickHouseRelation;
|
|
23
|
+
/** The target's columns, as SQL: `day Date, kind LowCardinality(String), n UInt64`. */
|
|
24
|
+
columns: string;
|
|
25
|
+
/** The select list, each item aliased to a target column: `toDate(ts) AS day, kind, count() AS n`. */
|
|
26
|
+
select: string;
|
|
27
|
+
/** The grouping key: `day, kind`. */
|
|
28
|
+
groupBy: string;
|
|
29
|
+
/** The target's sort key (default `groupBy` in parentheses). Summing collapses rows that share it. */
|
|
30
|
+
orderBy?: string;
|
|
31
|
+
/** The target's engine (default `SummingMergeTree`). Use `AggregatingMergeTree` for `-State` columns. */
|
|
32
|
+
engine?: string;
|
|
33
|
+
/** The target's partition key. Left out by default. */
|
|
34
|
+
partitionBy?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type RollupViewMembers = {
|
|
38
|
+
table: ClickHouseTable;
|
|
39
|
+
view: ClickHouseView;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** A materialized view that rolls a source table up into a target table it declares beside it. */
|
|
43
|
+
export const RollupView = Composite<RollupViewProps, RollupViewMembers>((props) => {
|
|
44
|
+
const target = table`
|
|
45
|
+
CREATE TABLE ${props.name} (${props.columns})
|
|
46
|
+
ENGINE = ${props.engine ?? "SummingMergeTree"}
|
|
47
|
+
${props.partitionBy ? `PARTITION BY ${props.partitionBy}` : ""}
|
|
48
|
+
ORDER BY ${props.orderBy ?? `(${props.groupBy})`}`;
|
|
49
|
+
const rollup = view`
|
|
50
|
+
CREATE MATERIALIZED VIEW ${`${props.name}_mv`} TO ${target} AS
|
|
51
|
+
SELECT ${props.select}
|
|
52
|
+
FROM ${props.source}
|
|
53
|
+
GROUP BY ${props.groupBy}`;
|
|
54
|
+
return { table: target, view: rollup };
|
|
55
|
+
}, "RollupView");
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ShardedTable`: a ReplicatedMergeTree table on every node of a cluster and the Distributed table that spreads reads and writes across it.
|
|
3
|
+
*
|
|
4
|
+
* Both tables are created `ON CLUSTER`. The local table, `<name>_local`, holds
|
|
5
|
+
* each shard's rows and replicates them within the shard; with no engine
|
|
6
|
+
* arguments it takes the server's default replication path. The Distributed
|
|
7
|
+
* table, `<name>`, holds no data: an insert goes to one shard by the sharding
|
|
8
|
+
* key, and a query runs on every shard and merges the results.
|
|
9
|
+
*
|
|
10
|
+
* The Distributed table reads the local one by reference, so the build creates
|
|
11
|
+
* the local table first. Give `name` without a database: the Distributed
|
|
12
|
+
* engine names its table in the current database.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Composite } from "@intentius/chant/composite";
|
|
16
|
+
import { table, type ClickHouseTable } from "../clickhouse/entities";
|
|
17
|
+
|
|
18
|
+
export interface ShardedTableProps {
|
|
19
|
+
/** The Distributed table's name, unqualified. The local table is `<name>_local`. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** The cluster both tables are created on, as the server's `remote_servers` names it. */
|
|
22
|
+
cluster: string;
|
|
23
|
+
/** The columns, as SQL. Both tables declare the same list. */
|
|
24
|
+
columns: string;
|
|
25
|
+
/** The local table's sort key. */
|
|
26
|
+
orderBy: string;
|
|
27
|
+
/** The expression that picks a shard for an inserted row (default `rand()`). */
|
|
28
|
+
shardingKey?: string;
|
|
29
|
+
/** The local table's partition key. Left out by default. */
|
|
30
|
+
partitionBy?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type ShardedTableMembers = {
|
|
34
|
+
local: ClickHouseTable;
|
|
35
|
+
distributed: ClickHouseTable;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** A ReplicatedMergeTree table on every node of a cluster and the Distributed table over it. */
|
|
39
|
+
export const ShardedTable = Composite<ShardedTableProps, ShardedTableMembers>((props) => {
|
|
40
|
+
const local = table`
|
|
41
|
+
CREATE TABLE ${`${props.name}_local`} ON CLUSTER ${props.cluster} (${props.columns})
|
|
42
|
+
ENGINE = ReplicatedMergeTree
|
|
43
|
+
${props.partitionBy ? `PARTITION BY ${props.partitionBy}` : ""}
|
|
44
|
+
ORDER BY ${props.orderBy}`;
|
|
45
|
+
const distributed = table`
|
|
46
|
+
CREATE TABLE ${props.name} ON CLUSTER ${props.cluster} (${props.columns})
|
|
47
|
+
ENGINE = Distributed(${props.cluster}, currentDatabase(), ${local}, ${props.shardingKey ?? "rand()"})`;
|
|
48
|
+
return { local, distributed };
|
|
49
|
+
}, "ShardedTable");
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SoftDeleteTable`: a table whose rows carry created and updated timestamps and are deleted by marking them.
|
|
3
|
+
*
|
|
4
|
+
* The composite appends `created_at` and `updated_at` (both `timestamptz NOT
|
|
5
|
+
* NULL DEFAULT now()`) and a nullable `deleted_at` to the columns it is
|
|
6
|
+
* given. A row is live while `deleted_at` is null. The `<name>_live` view
|
|
7
|
+
* reads the live rows (it sets `security_invoker`, so row-level security on
|
|
8
|
+
* the table applies to whoever reads the view), and a partial index on the
|
|
9
|
+
* live rows keeps lookups by the key the app uses off the dead ones.
|
|
10
|
+
*
|
|
11
|
+
* Postgres has no column default that follows an update: the app, or a
|
|
12
|
+
* trigger it owns, sets `updated_at`.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Composite } from "@intentius/chant/composite";
|
|
16
|
+
import { index, literal, table, view, type PostgresIndex, type PostgresSchema, type PostgresTable, type PostgresView } from "../postgres/entities";
|
|
17
|
+
|
|
18
|
+
export interface SoftDeleteTableProps {
|
|
19
|
+
/** The table's name, unqualified. The view is `<name>_live`. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** The schema the table, its index and its view live in: the entity, or its name (default `public`). */
|
|
22
|
+
schema?: PostgresSchema | string;
|
|
23
|
+
/** Every column except the three the composite adds, as SQL, with the primary key: `id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, title text NOT NULL`. */
|
|
24
|
+
columns: string;
|
|
25
|
+
/** The column the live-rows index covers: the one the app looks rows up by, as SQL (default `id`). */
|
|
26
|
+
liveKey?: string;
|
|
27
|
+
/** The table's comment, which also covers its columns for SQLPG112 (default: says rows are soft-deleted). */
|
|
28
|
+
comment?: string;
|
|
29
|
+
/** The creation timestamp column (default `created_at`). */
|
|
30
|
+
createdAt?: string;
|
|
31
|
+
/** The update timestamp column (default `updated_at`). */
|
|
32
|
+
updatedAt?: string;
|
|
33
|
+
/** The deletion timestamp column (default `deleted_at`). Null means the row is live. */
|
|
34
|
+
deletedAt?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type SoftDeleteTableMembers = {
|
|
38
|
+
table: PostgresTable;
|
|
39
|
+
live: PostgresView;
|
|
40
|
+
liveIndex: PostgresIndex;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** A table with created and updated timestamps and a soft-delete column, a view of its live rows and an index over them. */
|
|
44
|
+
export const SoftDeleteTable = Composite<SoftDeleteTableProps, SoftDeleteTableMembers>((props) => {
|
|
45
|
+
const schema = props.schema ?? "public";
|
|
46
|
+
const deleted = props.deletedAt ?? "deleted_at";
|
|
47
|
+
const rows = table`
|
|
48
|
+
CREATE TABLE ${schema}.${props.name} (
|
|
49
|
+
${props.columns},
|
|
50
|
+
${props.createdAt ?? "created_at"} timestamptz NOT NULL DEFAULT now(),
|
|
51
|
+
${props.updatedAt ?? "updated_at"} timestamptz NOT NULL DEFAULT now(),
|
|
52
|
+
${deleted} timestamptz
|
|
53
|
+
);
|
|
54
|
+
COMMENT ON TABLE ${schema}.${props.name} IS ${literal(props.comment ?? "Soft-deleted: a row is live while its deletion timestamp is null")}`;
|
|
55
|
+
const live = view`
|
|
56
|
+
CREATE VIEW ${schema}.${`${props.name}_live`} WITH (security_invoker = true) AS
|
|
57
|
+
SELECT * FROM ${rows} WHERE ${deleted} IS NULL`;
|
|
58
|
+
const liveIndex = index`
|
|
59
|
+
CREATE INDEX ${`${props.name}_live_idx`} ON ${rows} (${props.liveKey ?? "id"}) WHERE ${deleted} IS NULL`;
|
|
60
|
+
return { table: rows, live, liveIndex };
|
|
61
|
+
}, "SoftDeleteTable");
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `TenantTable`: a multi-tenant table whose tenant key leads every key and index.
|
|
3
|
+
*
|
|
4
|
+
* The composite adds the tenant column (`NOT NULL`) in front of the columns it
|
|
5
|
+
* is given, makes the primary key `(<tenant>, <primaryKey>)` and creates one
|
|
6
|
+
* index on `(<tenant>, <indexOn>)`. With the tenant first in each, a query
|
|
7
|
+
* scoped to one tenant reads one contiguous range of every index, and no index
|
|
8
|
+
* serves a cross-tenant scan by accident. Row-level security is separate: a
|
|
9
|
+
* policy on the table is what keeps one tenant's role out of another's rows.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Composite } from "@intentius/chant/composite";
|
|
13
|
+
import { index, table, type PostgresIndex, type PostgresSchema, type PostgresTable } from "../postgres/entities";
|
|
14
|
+
|
|
15
|
+
export interface TenantTableProps {
|
|
16
|
+
/** The table's name, unqualified. The index is `<name>_tenant_idx`. */
|
|
17
|
+
name: string;
|
|
18
|
+
/** The schema the table lives in: the entity, or its name (default `public`). */
|
|
19
|
+
schema?: PostgresSchema | string;
|
|
20
|
+
/** Every column except the tenant's, as SQL: `id bigint GENERATED ALWAYS AS IDENTITY, title text NOT NULL`. */
|
|
21
|
+
columns: string;
|
|
22
|
+
/** The columns that, after the tenant, make a row unique: `id`. */
|
|
23
|
+
primaryKey: string;
|
|
24
|
+
/** The columns the secondary index covers after the tenant: `created_at DESC`. */
|
|
25
|
+
indexOn: string;
|
|
26
|
+
/** The tenant column (default `tenant_id`). */
|
|
27
|
+
tenant?: string;
|
|
28
|
+
/** The tenant column's type (default `uuid`). */
|
|
29
|
+
tenantType?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type TenantTableMembers = {
|
|
33
|
+
table: PostgresTable;
|
|
34
|
+
index: PostgresIndex;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** A multi-tenant table with the tenant key first in its primary key and its index. */
|
|
38
|
+
export const TenantTable = Composite<TenantTableProps, TenantTableMembers>((props) => {
|
|
39
|
+
const schema = props.schema ?? "public";
|
|
40
|
+
const tenant = props.tenant ?? "tenant_id";
|
|
41
|
+
const rows = table`
|
|
42
|
+
CREATE TABLE ${schema}.${props.name} (
|
|
43
|
+
${tenant} ${props.tenantType ?? "uuid"} NOT NULL,
|
|
44
|
+
${props.columns},
|
|
45
|
+
PRIMARY KEY (${tenant}, ${props.primaryKey})
|
|
46
|
+
)`;
|
|
47
|
+
const byTenant = index`
|
|
48
|
+
CREATE INDEX ${`${props.name}_tenant_idx`} ON ${rows} (${tenant}, ${props.indexOn})`;
|
|
49
|
+
return { table: rows, index: byTenant };
|
|
50
|
+
}, "TenantTable");
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `sql` namespace in `chant.config.ts`.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import type { ChantConfig } from "@intentius/chant/config";
|
|
6
|
+
* import "@intentius/chant-lexicon-sql"; // brings the `sql` key into ChantConfig
|
|
7
|
+
*
|
|
8
|
+
* export default {
|
|
9
|
+
* lexicons: ["sql"],
|
|
10
|
+
* sql: {
|
|
11
|
+
* dialect: "clickhouse",
|
|
12
|
+
* profiles: {
|
|
13
|
+
* staging: { url: "http://clickhouse.staging:8123", user: { env: "CH_USER" }, password: { env: "CH_PASSWORD" } },
|
|
14
|
+
* prod: { url: "https://clickhouse.example.com:8443", user: { env: "CH_USER" }, password: { env: "CH_PROD_PASSWORD" }, databases: ["analytics"] },
|
|
15
|
+
* },
|
|
16
|
+
* },
|
|
17
|
+
* } satisfies ChantConfig;
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* A profile is keyed by chant environment, as `grafana.profiles.<env>` is:
|
|
21
|
+
* the server `chant import --from <env>`, `chant lifecycle diff <env> --live`
|
|
22
|
+
* and `plan` read. Credentials are named by their environment variable, never
|
|
23
|
+
* written in the config. An environment with no profile falls back to
|
|
24
|
+
* `CLICKHOUSE_URL`, `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD`, or for
|
|
25
|
+
* Postgres `POSTGRES_URL`, `POSTGRES_USER` and `POSTGRES_PASSWORD`. A profile
|
|
26
|
+
* whose `url` is `postgres://` or `postgresql://` is a Postgres server.
|
|
27
|
+
*
|
|
28
|
+
* `dialect` names the database a project's schema is for. Declarations carry
|
|
29
|
+
* their dialect in their own type (a ClickHouse table is `ClickHouse::Table`),
|
|
30
|
+
* so the setting is for the things a declaration cannot answer: which dialect
|
|
31
|
+
* a live environment is read as on import, and which dialect's checks run on
|
|
32
|
+
* output that names none. It defaults to `clickhouse`, the first dialect.
|
|
33
|
+
* `postgres` is the second (#3289). A list (`dialect: ["clickhouse",
|
|
34
|
+
* "postgres"]`) is accepted for a workspace with members of more than one
|
|
35
|
+
* dialect (#3047 question 1); one build still holds one dialect.
|
|
36
|
+
*
|
|
37
|
+
* `provider` (#3282) names the managed Postgres service, on the namespace or
|
|
38
|
+
* on one profile: `sql: { dialect: "postgres", provider: "rds" }`, or
|
|
39
|
+
* `profiles: { prod: { url, provider: "aurora" } }`. A provider's data lives
|
|
40
|
+
* in `@intentius/chant-lexicon-sql/postgres` (`providerData`).
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import { z } from "zod";
|
|
44
|
+
import type { ChantConfig } from "@intentius/chant/config";
|
|
45
|
+
import { PLANNED_SQL_DIALECTS, SQL_DIALECTS } from "./dialects";
|
|
46
|
+
import { POSTGRES_PROVIDERS } from "./postgres/providers/types";
|
|
47
|
+
import { POSTGRES_MAJORS } from "./spec/postgres-pin";
|
|
48
|
+
|
|
49
|
+
const envRef = z.strictObject({ env: z.string() });
|
|
50
|
+
|
|
51
|
+
/** The managed Postgres service an environment runs on (#3282). */
|
|
52
|
+
const providerName = z.enum(POSTGRES_PROVIDERS, {
|
|
53
|
+
error: () => `expected a Postgres provider (${POSTGRES_PROVIDERS.join(", ")})`,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export const sqlProfileSchema = z.strictObject({
|
|
57
|
+
/**
|
|
58
|
+
* Where the server is. ClickHouse: the base URL of its HTTP interface
|
|
59
|
+
* (`http://clickhouse:8123`). Postgres: a connection URL
|
|
60
|
+
* (`postgres://db.internal:5432/shop`), with no password in it; the scheme
|
|
61
|
+
* is what makes a profile a Postgres one.
|
|
62
|
+
*/
|
|
63
|
+
url: z.string(),
|
|
64
|
+
/** The user, named by its environment variable. `default` when omitted. */
|
|
65
|
+
user: envRef.optional(),
|
|
66
|
+
/** The password, named by its environment variable. */
|
|
67
|
+
password: envRef.optional(),
|
|
68
|
+
/**
|
|
69
|
+
* The databases this environment's schema lives in. Import reads these and
|
|
70
|
+
* nothing else; when omitted, every database except the server's own
|
|
71
|
+
* (`system`, `information_schema`, `INFORMATION_SCHEMA`).
|
|
72
|
+
*/
|
|
73
|
+
databases: z.array(z.string()).optional(),
|
|
74
|
+
/** The database an unqualified declaration is created in. `default` when omitted. */
|
|
75
|
+
defaultDatabase: z.string().optional(),
|
|
76
|
+
/**
|
|
77
|
+
* Postgres: the schemas this environment's schema lives in. Import and
|
|
78
|
+
* observation read these and nothing else; when omitted, every schema except
|
|
79
|
+
* the server's own (`pg_catalog`, `information_schema`, `pg_toast`, the temp
|
|
80
|
+
* schemas).
|
|
81
|
+
*/
|
|
82
|
+
schemas: z.array(z.string()).optional(),
|
|
83
|
+
/** Postgres: the schema an unqualified declaration is created in. `public` when omitted. */
|
|
84
|
+
defaultSchema: z.string().optional(),
|
|
85
|
+
/**
|
|
86
|
+
* The managed service this environment's Postgres runs on, when it differs
|
|
87
|
+
* from `sql.provider`. Import reads the provider's own roles, schemas and
|
|
88
|
+
* extensions as foreign.
|
|
89
|
+
*/
|
|
90
|
+
provider: providerName.optional(),
|
|
91
|
+
/**
|
|
92
|
+
* Postgres apply: how long one statement waits for its lock before it
|
|
93
|
+
* fails (`lock_timeout`), in milliseconds, so a change blocked behind a
|
|
94
|
+
* long query fails fast instead of queueing every query behind it. 5000
|
|
95
|
+
* when omitted.
|
|
96
|
+
*/
|
|
97
|
+
lockTimeoutMs: z.number().int().nonnegative().optional(),
|
|
98
|
+
/**
|
|
99
|
+
* Postgres apply: the `statement_timeout` for a statement that changes only
|
|
100
|
+
* the catalog, in milliseconds. 60000 when omitted.
|
|
101
|
+
*/
|
|
102
|
+
statementTimeoutMs: z.number().int().nonnegative().optional(),
|
|
103
|
+
/**
|
|
104
|
+
* Postgres apply: the `statement_timeout` for a statement that reads or
|
|
105
|
+
* rewrites every row (a table rewrite, a constraint validation, a
|
|
106
|
+
* `CONCURRENTLY` index build), in milliseconds. 0, no limit, when omitted.
|
|
107
|
+
*/
|
|
108
|
+
scanTimeoutMs: z.number().int().nonnegative().optional(),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const dialectName = z.enum(SQL_DIALECTS);
|
|
112
|
+
|
|
113
|
+
/** Why a `dialect` value is refused: a planned dialect is "not implemented yet", anything else unknown. */
|
|
114
|
+
function dialectError(input: unknown): string {
|
|
115
|
+
const names = Array.isArray(input) ? input : [input];
|
|
116
|
+
const planned = names.find((n): n is string => typeof n === "string" && (PLANNED_SQL_DIALECTS as readonly string[]).includes(n));
|
|
117
|
+
if (planned !== undefined) {
|
|
118
|
+
return `the ${planned} dialect is not implemented yet; the implemented dialects are ${SQL_DIALECTS.join(", ")}`;
|
|
119
|
+
}
|
|
120
|
+
return `expected a dialect (${SQL_DIALECTS.join(", ")}) or a non-empty list of them`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export const sqlConfigSchema = z.strictObject({
|
|
124
|
+
/** The dialect, or the dialects, the project's schema is for. */
|
|
125
|
+
dialect: z.union([dialectName, z.array(dialectName).min(1)], { error: (iss) => dialectError(iss.input) }).optional(),
|
|
126
|
+
/**
|
|
127
|
+
* The managed Postgres service the project deploys to (`rds`, `aurora`,
|
|
128
|
+
* `cloud-sql`, `azure`, `neon`, `supabase`). SQLPG004 reads it to refuse an
|
|
129
|
+
* extension the provider does not allow. Omit it for a self-hosted server.
|
|
130
|
+
*/
|
|
131
|
+
provider: providerName.optional(),
|
|
132
|
+
/**
|
|
133
|
+
* The Postgres major the project targets. The editor completes and hovers
|
|
134
|
+
* only what that major has (a function added in 18 is not offered at 16);
|
|
135
|
+
* without it, the newest supported major is used.
|
|
136
|
+
*/
|
|
137
|
+
postgresMajor: z
|
|
138
|
+
.number()
|
|
139
|
+
.int()
|
|
140
|
+
.refine((n) => POSTGRES_MAJORS.includes(n), { error: `expected a supported Postgres major (${POSTGRES_MAJORS.join(", ")})` })
|
|
141
|
+
.optional(),
|
|
142
|
+
/** One server per chant environment. */
|
|
143
|
+
profiles: z.record(z.string(), sqlProfileSchema).optional(),
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export type SqlProfile = z.infer<typeof sqlProfileSchema>;
|
|
147
|
+
|
|
148
|
+
export type SqlConfig = z.infer<typeof sqlConfigSchema>;
|
|
149
|
+
|
|
150
|
+
declare module "@intentius/chant/config" {
|
|
151
|
+
interface ChantConfig {
|
|
152
|
+
sql?: SqlConfig;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Compile-time proof that the augmentation above reaches `ChantConfig`. */
|
|
157
|
+
export type SqlConfigNamespace = NonNullable<ChantConfig["sql"]>;
|