@intentius/chant-lexicon-sql 0.0.0-stage → 0.112.0
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,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ClickHouse entities: `database`, `table` and `view` tagged templates that
|
|
3
|
+
* parse their DDL at fold time into one Declarable each (chant #3196, #3197).
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { table, view } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
7
|
+
*
|
|
8
|
+
* export const events = table`
|
|
9
|
+
* CREATE TABLE events (user_id UUID, kind LowCardinality(String), ts DateTime)
|
|
10
|
+
* ENGINE = MergeTree ORDER BY (user_id, ts)`;
|
|
11
|
+
*
|
|
12
|
+
* export const activeUsers = view`
|
|
13
|
+
* CREATE MATERIALIZED VIEW active_users
|
|
14
|
+
* ENGINE = AggregatingMergeTree ORDER BY ${events.columns.user_id} AS
|
|
15
|
+
* SELECT ${events.columns.user_id}, count() AS n FROM ${events} GROUP BY ${events.columns.user_id}`;
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The export name is the object's identity in chant; the name in the SQL is the
|
|
19
|
+
* object's name in the database.
|
|
20
|
+
*
|
|
21
|
+
* What an interpolation means is decided by its value:
|
|
22
|
+
*
|
|
23
|
+
* - a `table`, `view` or `database` entity is a reference to that object, and
|
|
24
|
+
* renders as its (database-qualified) name;
|
|
25
|
+
* - `entity.columns.<name>` is a reference to one column, and renders as the
|
|
26
|
+
* column's name;
|
|
27
|
+
* - a string is SQL text, spliced into the statement before it is parsed, so a
|
|
28
|
+
* composite can supply a name, a type, an engine or an expression;
|
|
29
|
+
* - a number or bigint is a numeric literal, a boolean `true`/`false`, `null`
|
|
30
|
+
* is `NULL`;
|
|
31
|
+
* - `literal(value)` is a quoted, escaped string literal, for the case where a
|
|
32
|
+
* string is meant as a value (`DEFAULT ${literal(plan)}`).
|
|
33
|
+
*
|
|
34
|
+
* Anything else, `undefined` included, is refused with the position it was
|
|
35
|
+
* interpolated at. `${events.user_id}` is `undefined` (columns are reached
|
|
36
|
+
* through `.columns`), and the refusal says so.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import type { AttrRef } from "@intentius/chant/attrref";
|
|
40
|
+
import { setInterpolationFields } from "@intentius/chant/provenance";
|
|
41
|
+
import { CLICKHOUSE_LEXICAL, isTrivia, SqlSyntaxError, untokenize } from "./tokens";
|
|
42
|
+
import { parseCreate, unquote, type ColumnNode, type CreateNode, type Span, type StorageNode } from "./parser";
|
|
43
|
+
import { feed, lineage, spanText as text, splice as spliceWith, templateSyntaxError, type TemplateCtx, type TemplateDialect } from "../core/interpolation";
|
|
44
|
+
import { SQL_LEXICON, SqlObject, isColumnRefOf, isSqlObjectOf, makeSqlEntity } from "../core/entity";
|
|
45
|
+
import type { LineageEdge } from "../core/references";
|
|
46
|
+
import { SqlLiteral, SqlTemplateError, describeValue as describe, stripUnset as strip, templateParts } from "../core/template";
|
|
47
|
+
|
|
48
|
+
export { SQL_LEXICON } from "../core/entity";
|
|
49
|
+
export type { LineageEdge } from "../core/references";
|
|
50
|
+
export { SqlLiteral, SqlTemplateError, templateParts, unescapeTemplateDelimiters } from "../core/template";
|
|
51
|
+
|
|
52
|
+
export const CLICKHOUSE_ENTITY_TYPES = {
|
|
53
|
+
database: "ClickHouse::Database",
|
|
54
|
+
table: "ClickHouse::Table",
|
|
55
|
+
view: "ClickHouse::View",
|
|
56
|
+
materializedView: "ClickHouse::MaterializedView",
|
|
57
|
+
} as const;
|
|
58
|
+
|
|
59
|
+
export type ClickHouseEntityType = (typeof CLICKHOUSE_ENTITY_TYPES)[keyof typeof CLICKHOUSE_ENTITY_TYPES];
|
|
60
|
+
|
|
61
|
+
// ── Values ─────────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
/** A column of a table or view, as declared. Expressions are the source text with interpolations rendered. */
|
|
64
|
+
export interface ColumnDef {
|
|
65
|
+
name: string;
|
|
66
|
+
type?: string;
|
|
67
|
+
nullable?: boolean;
|
|
68
|
+
default?: { kind: "DEFAULT" | "MATERIALIZED" | "ALIAS" | "EPHEMERAL"; expr?: string };
|
|
69
|
+
codec?: string;
|
|
70
|
+
ttl?: string;
|
|
71
|
+
comment?: string;
|
|
72
|
+
statistics?: string;
|
|
73
|
+
settings?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface EngineDef {
|
|
77
|
+
name: string;
|
|
78
|
+
/** Each argument's text, as written. Absent when the engine is written without parentheses. */
|
|
79
|
+
args?: string[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
interface StorageProps {
|
|
83
|
+
engine?: EngineDef;
|
|
84
|
+
orderBy?: string;
|
|
85
|
+
primaryKey?: string;
|
|
86
|
+
partitionBy?: string;
|
|
87
|
+
sampleBy?: string;
|
|
88
|
+
ttl?: string;
|
|
89
|
+
settings?: Record<string, string>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface CommonProps {
|
|
93
|
+
/** The object's name in the database, unquoted. */
|
|
94
|
+
name: string;
|
|
95
|
+
/** The database it is created in, when the DDL qualifies it. */
|
|
96
|
+
database?: string;
|
|
97
|
+
onCluster?: string;
|
|
98
|
+
comment?: string;
|
|
99
|
+
/** The statement as it will be sent: the author's text, interpolations rendered. */
|
|
100
|
+
ddl: string;
|
|
101
|
+
/** The template's raw parts, as written, for a source round trip. */
|
|
102
|
+
source: { strings: string[] };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface DatabaseProps extends CommonProps {
|
|
106
|
+
engine?: EngineDef;
|
|
107
|
+
settings?: Record<string, string>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface TableProps extends CommonProps, StorageProps {
|
|
111
|
+
columns: ColumnDef[];
|
|
112
|
+
indexes: Array<{ name: string; expr: string; type: string; granularity?: string }>;
|
|
113
|
+
projections: Array<{ name: string; definition: string }>;
|
|
114
|
+
constraints: Array<{ name: string; kind: "CHECK" | "ASSUME"; expr: string }>;
|
|
115
|
+
orReplace?: boolean;
|
|
116
|
+
ifNotExists?: boolean;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface ViewProps extends CommonProps, StorageProps {
|
|
120
|
+
/** Declared output columns; empty when the view infers them from its SELECT. */
|
|
121
|
+
columns: ColumnDef[];
|
|
122
|
+
/** For a refreshable materialized view, the `REFRESH` clause. */
|
|
123
|
+
refresh?: string;
|
|
124
|
+
append?: boolean;
|
|
125
|
+
/** The target a materialized view writes into: the entity when it is declared, else its name. */
|
|
126
|
+
to?: ClickHouseObject | string;
|
|
127
|
+
populate?: boolean;
|
|
128
|
+
empty?: boolean;
|
|
129
|
+
security?: string;
|
|
130
|
+
select: string;
|
|
131
|
+
/** The tables and views the SELECT reads, as references. */
|
|
132
|
+
reads: ClickHouseObject[];
|
|
133
|
+
/** Per output column of the top-level select list, the columns it reads. */
|
|
134
|
+
lineage: LineageEdge[];
|
|
135
|
+
orReplace?: boolean;
|
|
136
|
+
ifNotExists?: boolean;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* A string as a quoted, escaped ClickHouse string literal. An interpolated
|
|
141
|
+
* plain string is SQL text; wrap it in `literal()` when it is a value.
|
|
142
|
+
*/
|
|
143
|
+
export function literal(value: string | number | boolean | null): SqlLiteral {
|
|
144
|
+
if (value === null) return new SqlLiteral("NULL");
|
|
145
|
+
if (typeof value !== "string") return new SqlLiteral(String(value));
|
|
146
|
+
return new SqlLiteral(`'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── Entities ───────────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
/** The members a ClickHouse entity has besides its props (the shared core's {@link SqlObject}). */
|
|
152
|
+
export abstract class ClickHouseObject extends SqlObject {
|
|
153
|
+
declare readonly entityType: ClickHouseEntityType;
|
|
154
|
+
/** The name the object is referred to by in SQL: `name`, or `database.name`. */
|
|
155
|
+
declare readonly sqlName: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface ClickHouseDatabase extends ClickHouseObject {
|
|
159
|
+
readonly entityType: "ClickHouse::Database";
|
|
160
|
+
readonly props: DatabaseProps;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** A table or a view: something with columns that SQL can reference. */
|
|
164
|
+
export interface ClickHouseRelation extends ClickHouseObject {
|
|
165
|
+
/** One reference per column, by name: `${events.columns.user_id}`. */
|
|
166
|
+
readonly columns: Readonly<Record<string, AttrRef>>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface ClickHouseTable extends ClickHouseRelation {
|
|
170
|
+
readonly entityType: "ClickHouse::Table";
|
|
171
|
+
readonly props: TableProps;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export interface ClickHouseView extends ClickHouseRelation {
|
|
175
|
+
readonly entityType: "ClickHouse::View" | "ClickHouse::MaterializedView";
|
|
176
|
+
readonly props: ViewProps;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function makeEntity(
|
|
180
|
+
entityType: ClickHouseEntityType,
|
|
181
|
+
sqlName: string,
|
|
182
|
+
props: object,
|
|
183
|
+
columnNames: readonly string[] | undefined,
|
|
184
|
+
dependsOn: unknown[],
|
|
185
|
+
): ClickHouseObject {
|
|
186
|
+
return makeSqlEntity(ClickHouseObject.prototype as ClickHouseObject, entityType, sqlName, props, columnNames, dependsOn);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function isClickHouseObject(value: unknown): value is ClickHouseObject {
|
|
190
|
+
return isSqlObjectOf(value, "ClickHouse::");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** A column reference: an AttrRef whose parent is a ClickHouse table or view. */
|
|
194
|
+
export function isColumnRef(value: unknown): value is AttrRef {
|
|
195
|
+
return isColumnRefOf(value, isClickHouseObject);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ── Rendering interpolations ───────────────────────────────────────────
|
|
199
|
+
|
|
200
|
+
/** A name as ClickHouse reads it: bare when it is a plain identifier, backquoted otherwise. */
|
|
201
|
+
export function quoteIdentifier(name: string): string {
|
|
202
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) ? name : `\`${name.replace(/`/g, "``")}\``;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function renderReference(value: unknown): string {
|
|
206
|
+
if (isClickHouseObject(value)) return value.sqlName;
|
|
207
|
+
if (isColumnRef(value)) return quoteIdentifier(value.attribute);
|
|
208
|
+
throw new TypeError(`not a reference: ${describe(value)}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ── Building ───────────────────────────────────────────────────────────
|
|
212
|
+
|
|
213
|
+
/** ClickHouse as the shared template machinery reads it (`../core/interpolation.ts`). */
|
|
214
|
+
export const CLICKHOUSE_TEMPLATES: TemplateDialect = {
|
|
215
|
+
lexical: CLICKHOUSE_LEXICAL,
|
|
216
|
+
isObject: isClickHouseObject,
|
|
217
|
+
isColumnRef,
|
|
218
|
+
renderReference,
|
|
219
|
+
identValue: unquote,
|
|
220
|
+
unnamedOutput: (n) => `_${n}`,
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
type Ctx = TemplateCtx;
|
|
224
|
+
|
|
225
|
+
/** The tag's splice: plain values become SQL text, references stay `ref` tokens. */
|
|
226
|
+
const splice = (tag: string, parts: readonly string[], values: readonly unknown[]) => spliceWith(CLICKHOUSE_TEMPLATES, tag, parts, values);
|
|
227
|
+
|
|
228
|
+
const req = (s: string | undefined): string => s ?? "";
|
|
229
|
+
|
|
230
|
+
/** A `'quoted'` string literal's value. */
|
|
231
|
+
function stringValue(s: string | undefined): string | undefined {
|
|
232
|
+
if (s === undefined) return undefined;
|
|
233
|
+
if (!/^'.*'$/s.test(s)) return s;
|
|
234
|
+
return s.slice(1, -1).replace(/''/g, "'").replace(/\\(.)/g, "$1");
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function columnDef(ctx: Ctx, c: ColumnNode): ColumnDef {
|
|
238
|
+
for (const span of [c.nameSpan, c.type, c.default?.expr, c.codec, c.ttl, c.comment, c.statistics, c.settings]) feed(ctx, span, "columns");
|
|
239
|
+
const def: ColumnDef = { name: c.name || req(text(ctx, c.nameSpan)) };
|
|
240
|
+
const set = <K extends keyof ColumnDef>(k: K, v: ColumnDef[K] | undefined) => {
|
|
241
|
+
if (v !== undefined) def[k] = v;
|
|
242
|
+
};
|
|
243
|
+
set("type", text(ctx, c.type));
|
|
244
|
+
set("nullable", c.nullable);
|
|
245
|
+
if (c.default) {
|
|
246
|
+
const expr = text(ctx, c.default.expr);
|
|
247
|
+
def.default = expr === undefined ? { kind: c.default.kind } : { kind: c.default.kind, expr };
|
|
248
|
+
}
|
|
249
|
+
set("codec", text(ctx, c.codec));
|
|
250
|
+
set("ttl", text(ctx, c.ttl));
|
|
251
|
+
set("comment", stringValue(text(ctx, c.comment)));
|
|
252
|
+
set("statistics", text(ctx, c.statistics));
|
|
253
|
+
set("settings", text(ctx, c.settings));
|
|
254
|
+
return def;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function storageProps(ctx: Ctx, node: StorageNode): StorageProps {
|
|
258
|
+
const out: StorageProps = {};
|
|
259
|
+
if (node.engine) {
|
|
260
|
+
feed(ctx, node.engine.nameSpan, "engine.name");
|
|
261
|
+
const name = node.engine.name || req(text(ctx, node.engine.nameSpan));
|
|
262
|
+
out.engine = node.engine.args ? { name, args: node.engine.args.map((a) => req(text(ctx, a, "engine.args"))) } : { name };
|
|
263
|
+
}
|
|
264
|
+
const put = (k: "orderBy" | "primaryKey" | "partitionBy" | "sampleBy" | "ttl", span: Span | undefined) => {
|
|
265
|
+
const v = text(ctx, span, k);
|
|
266
|
+
if (v !== undefined) out[k] = v;
|
|
267
|
+
};
|
|
268
|
+
put("orderBy", node.orderBy);
|
|
269
|
+
put("primaryKey", node.primaryKey);
|
|
270
|
+
put("partitionBy", node.partitionBy);
|
|
271
|
+
put("sampleBy", node.sampleBy);
|
|
272
|
+
put("ttl", node.ttl);
|
|
273
|
+
feed(ctx, node.settingsClause, "settings");
|
|
274
|
+
if (node.settings) out.settings = Object.fromEntries(node.settings.map((s) => [s.key, req(text(ctx, s.value, "settings"))]));
|
|
275
|
+
return out;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** `name` or `db.name` from a qualified-name span; an interpolated database entity names the database. */
|
|
279
|
+
function qualified(ctx: Ctx, span: Span): { database?: string; name: string } {
|
|
280
|
+
const sig = ctx.tokens.slice(span.from, span.to).filter((t) => !isTrivia(t));
|
|
281
|
+
const pieces: string[] = [];
|
|
282
|
+
const splices: Array<number | undefined> = [];
|
|
283
|
+
for (const t of sig) {
|
|
284
|
+
if (t.kind === "punct" && t.text === ".") continue;
|
|
285
|
+
if (t.kind === "ref") {
|
|
286
|
+
const v = ctx.values[t.part];
|
|
287
|
+
const refPieces = isClickHouseObject(v) && v.entityType === CLICKHOUSE_ENTITY_TYPES.database
|
|
288
|
+
? [(v as ClickHouseDatabase).props.name]
|
|
289
|
+
: renderReference(v).split(".");
|
|
290
|
+
for (const piece of refPieces) {
|
|
291
|
+
pieces.push(piece);
|
|
292
|
+
splices.push(undefined);
|
|
293
|
+
}
|
|
294
|
+
} else {
|
|
295
|
+
pieces.push(unquote(t.text));
|
|
296
|
+
splices.push(t.splice);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const last = pieces.length - 1;
|
|
300
|
+
splices.forEach((splice, i) => {
|
|
301
|
+
if (splice !== undefined) ctx.fed[splice]!.add(i === last ? "name" : "database");
|
|
302
|
+
});
|
|
303
|
+
return pieces.length >= 2 ? { database: pieces[pieces.length - 2], name: pieces[pieces.length - 1]! } : { name: pieces[0] ?? "" };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
type Expect = "database" | "table" | "view";
|
|
307
|
+
|
|
308
|
+
function build(tag: Expect, strings: TemplateStringsArray | readonly string[], values: readonly unknown[]): ClickHouseObject {
|
|
309
|
+
const parts = templateParts(strings);
|
|
310
|
+
const tokens = splice(tag, parts, values);
|
|
311
|
+
let node: CreateNode;
|
|
312
|
+
try {
|
|
313
|
+
node = parseCreate(tokens);
|
|
314
|
+
} catch (err) {
|
|
315
|
+
if (!(err instanceof SqlSyntaxError)) throw err;
|
|
316
|
+
throw templateSyntaxError(tag, parts, err);
|
|
317
|
+
}
|
|
318
|
+
const ctx: Ctx = { d: CLICKHOUSE_TEMPLATES, tokens, values, fed: values.map(() => new Set<string>()) };
|
|
319
|
+
for (const t of tokens) if (t.splice !== undefined) ctx.fed[t.splice]!.add("ddl");
|
|
320
|
+
if (node.statement !== tag) {
|
|
321
|
+
const holds = node.statement === "database" ? "CREATE DATABASE" : node.statement === "table" ? "CREATE TABLE" : "CREATE VIEW";
|
|
322
|
+
throw new SqlTemplateError(tag, `holds a ${holds}; use the ${node.statement} tag`, 0, 0);
|
|
323
|
+
}
|
|
324
|
+
const { database, name } = qualified(ctx, node.name);
|
|
325
|
+
const sqlName = database ? `${quoteIdentifier(database)}.${quoteIdentifier(name)}` : quoteIdentifier(name);
|
|
326
|
+
const ddl = req(untokenize(tokens, (i) => renderReference(values[i])).trim().replace(/;\s*$/, ""));
|
|
327
|
+
const source = { strings: parts };
|
|
328
|
+
const dependsOn = [...new Set(values.filter((v) => isClickHouseObject(v) || isColumnRef(v)))];
|
|
329
|
+
const common = {
|
|
330
|
+
name,
|
|
331
|
+
database,
|
|
332
|
+
onCluster: text(ctx, node.onCluster, "onCluster"),
|
|
333
|
+
comment: stringValue(text(ctx, node.comment, "comment")),
|
|
334
|
+
};
|
|
335
|
+
const done = <T extends ClickHouseObject>(entity: T): T => {
|
|
336
|
+
setInterpolationFields(entity, ctx.fed.map((paths) => [...paths].sort()));
|
|
337
|
+
return entity;
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
if (node.statement === "database") {
|
|
341
|
+
feed(ctx, node.engine?.nameSpan, "engine.name");
|
|
342
|
+
const engine = node.engine
|
|
343
|
+
? node.engine.args
|
|
344
|
+
? { name: node.engine.name, args: node.engine.args.map((a) => req(text(ctx, a, "engine.args"))) }
|
|
345
|
+
: { name: node.engine.name }
|
|
346
|
+
: undefined;
|
|
347
|
+
const settings = node.settings
|
|
348
|
+
? Object.fromEntries(node.settings.map((s) => [s.key, req(text(ctx, s.value, "settings"))]))
|
|
349
|
+
: undefined;
|
|
350
|
+
const props: DatabaseProps = strip({ ...common, engine, settings, ddl, source });
|
|
351
|
+
return done(makeEntity(CLICKHOUSE_ENTITY_TYPES.database, quoteIdentifier(name), props, undefined, dependsOn));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (node.statement === "table") {
|
|
355
|
+
const columns = node.columns.map((c) => columnDef(ctx, c));
|
|
356
|
+
const props: TableProps = strip({
|
|
357
|
+
...common,
|
|
358
|
+
orReplace: node.orReplace,
|
|
359
|
+
ifNotExists: node.ifNotExists,
|
|
360
|
+
columns,
|
|
361
|
+
indexes: node.indexes.map((i) =>
|
|
362
|
+
strip({
|
|
363
|
+
name: i.name,
|
|
364
|
+
expr: req(text(ctx, i.expr, "indexes")),
|
|
365
|
+
type: req(text(ctx, i.type, "indexes")),
|
|
366
|
+
granularity: text(ctx, i.granularity, "indexes"),
|
|
367
|
+
}),
|
|
368
|
+
),
|
|
369
|
+
projections: node.projections.map((p) => ({ name: p.name, definition: req(text(ctx, p.body, "projections")) })),
|
|
370
|
+
constraints: node.constraints.map((c) => ({ name: c.name, kind: c.kind, expr: req(text(ctx, c.expr, "constraints")) })),
|
|
371
|
+
...storageProps(ctx, node),
|
|
372
|
+
ddl,
|
|
373
|
+
source,
|
|
374
|
+
});
|
|
375
|
+
return done(makeEntity(CLICKHOUSE_ENTITY_TYPES.table, sqlName, props, columns.map((c) => c.name), dependsOn));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const lin = lineage<ClickHouseObject>(ctx, node.select);
|
|
379
|
+
let to: ClickHouseObject | string | undefined;
|
|
380
|
+
if (node.to) {
|
|
381
|
+
const target = node.to.refs.length === 1 ? values[node.to.refs[0]!] : undefined;
|
|
382
|
+
to = isClickHouseObject(target) ? target : text(ctx, node.to, "to");
|
|
383
|
+
}
|
|
384
|
+
const columns = node.columns.map((c) => columnDef(ctx, c));
|
|
385
|
+
const props: ViewProps = strip({
|
|
386
|
+
...common,
|
|
387
|
+
orReplace: node.orReplace,
|
|
388
|
+
ifNotExists: node.ifNotExists,
|
|
389
|
+
refresh: text(ctx, node.refresh, "refresh"),
|
|
390
|
+
append: node.append,
|
|
391
|
+
to,
|
|
392
|
+
columns,
|
|
393
|
+
...storageProps(ctx, node),
|
|
394
|
+
populate: node.populate,
|
|
395
|
+
empty: node.empty,
|
|
396
|
+
security: text(ctx, node.security, "security"),
|
|
397
|
+
select: req(text(ctx, node.select, "select")),
|
|
398
|
+
reads: lin.reads,
|
|
399
|
+
lineage: lin.edges,
|
|
400
|
+
ddl,
|
|
401
|
+
source,
|
|
402
|
+
});
|
|
403
|
+
const outputs = columns.length > 0 ? columns.map((c) => c.name) : lin.edges.map((e) => e.output);
|
|
404
|
+
const type = node.materialized ? CLICKHOUSE_ENTITY_TYPES.materializedView : CLICKHOUSE_ENTITY_TYPES.view;
|
|
405
|
+
feed(ctx, node.select, "lineage");
|
|
406
|
+
return done(makeEntity(type, sqlName, props, outputs, dependsOn));
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** `` database`CREATE DATABASE ...` ``: one ClickHouse database, parsed at build time. */
|
|
410
|
+
export function database(strings: TemplateStringsArray, ...values: unknown[]): ClickHouseDatabase {
|
|
411
|
+
return build("database", strings, values) as ClickHouseDatabase;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/** `` table`CREATE TABLE ...` ``: one ClickHouse table, parsed at build time. */
|
|
415
|
+
export function table(strings: TemplateStringsArray, ...values: unknown[]): ClickHouseTable {
|
|
416
|
+
return build("table", strings, values) as ClickHouseTable;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* `` view`CREATE [MATERIALIZED] VIEW ...` ``: one view or materialized view,
|
|
421
|
+
* with the tables it reads and its column lineage.
|
|
422
|
+
*/
|
|
423
|
+
export function view(strings: TemplateStringsArray, ...values: unknown[]): ClickHouseView {
|
|
424
|
+
return build("view", strings, values) as ClickHouseView;
|
|
425
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The smallest ClickHouse client chant needs: one SQL statement over the HTTP
|
|
3
|
+
* interface, rows back as JSON objects.
|
|
4
|
+
*
|
|
5
|
+
* No driver dependency. ClickHouse's HTTP interface takes the statement as the
|
|
6
|
+
* request body and `default_format=JSONEachRow` returns one JSON object per
|
|
7
|
+
* line, which is all generation (and, later, observation and import) reads.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Where a server answers, and as whom. */
|
|
11
|
+
export interface ClickHouseEndpoint {
|
|
12
|
+
/** Base URL of the HTTP interface, e.g. `http://127.0.0.1:8123`. */
|
|
13
|
+
url: string;
|
|
14
|
+
user?: string;
|
|
15
|
+
password?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** A query the server refused, with the server's own message. */
|
|
19
|
+
export class ClickHouseQueryError extends Error {
|
|
20
|
+
constructor(
|
|
21
|
+
readonly status: number,
|
|
22
|
+
readonly serverMessage: string,
|
|
23
|
+
readonly sql: string,
|
|
24
|
+
) {
|
|
25
|
+
super(`ClickHouse answered ${status}: ${serverMessage.trim().split("\n")[0]}`);
|
|
26
|
+
this.name = "ClickHouseQueryError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Per-query options. */
|
|
31
|
+
export interface QueryOptions {
|
|
32
|
+
/**
|
|
33
|
+
* The query's id on the server (`system.processes`, `KILL QUERY`). The
|
|
34
|
+
* server refuses a second query with an id that is still running, which is
|
|
35
|
+
* what a caller that must never run one statement twice at once relies on.
|
|
36
|
+
*/
|
|
37
|
+
queryId?: string;
|
|
38
|
+
/** Server settings for this query alone, e.g. `{ mutations_sync: "2" }`. */
|
|
39
|
+
settings?: Record<string, string>;
|
|
40
|
+
/** Abandons the request. The server may go on running a statement it already started. */
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Run one statement and return its rows. A statement that returns nothing yields `[]`. */
|
|
45
|
+
export async function clickhouseQuery<Row = Record<string, unknown>>(
|
|
46
|
+
endpoint: ClickHouseEndpoint,
|
|
47
|
+
sql: string,
|
|
48
|
+
opts: QueryOptions = {},
|
|
49
|
+
): Promise<Row[]> {
|
|
50
|
+
const headers: Record<string, string> = { "content-type": "text/plain; charset=utf-8" };
|
|
51
|
+
if (endpoint.user !== undefined) headers["X-ClickHouse-User"] = endpoint.user;
|
|
52
|
+
if (endpoint.password !== undefined) headers["X-ClickHouse-Key"] = endpoint.password;
|
|
53
|
+
const params = new URLSearchParams({ default_format: "JSONEachRow", ...(opts.queryId !== undefined ? { query_id: opts.queryId } : {}), ...opts.settings });
|
|
54
|
+
const res = await fetch(`${endpoint.url.replace(/\/$/, "")}/?${params.toString()}`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers,
|
|
57
|
+
body: sql,
|
|
58
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
59
|
+
});
|
|
60
|
+
const text = await res.text();
|
|
61
|
+
if (!res.ok) throw new ClickHouseQueryError(res.status, text, sql);
|
|
62
|
+
return text
|
|
63
|
+
.split("\n")
|
|
64
|
+
.filter((line) => line.length > 0)
|
|
65
|
+
.map((line) => JSON.parse(line) as Row);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** True when the server answers `/ping`. */
|
|
69
|
+
export async function clickhousePing(endpoint: ClickHouseEndpoint): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetch(`${endpoint.url.replace(/\/$/, "")}/ping`);
|
|
72
|
+
return res.ok;
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The import IR as TypeScript: one `schema.ts` holding every imported
|
|
3
|
+
* object as a `database`, `table` or `view` declaration, in dependency order,
|
|
4
|
+
* with references between them interpolated. One file because the references
|
|
5
|
+
* cross databases freely, and declarations in one file reference each other
|
|
6
|
+
* without import cycles.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { GeneratedFile, TypeScriptGenerator } from "@intentius/chant/import/generator";
|
|
10
|
+
import type { TemplateIR } from "@intentius/chant/import/parser";
|
|
11
|
+
import { isTrivia, tokenizeText, type Token } from "../tokens";
|
|
12
|
+
import { parseCreate, unquote, type CreateNode } from "../parser";
|
|
13
|
+
import { CLICKHOUSE_ENTITY_TYPES } from "../entities";
|
|
14
|
+
|
|
15
|
+
interface Item {
|
|
16
|
+
exportName: string;
|
|
17
|
+
type: string;
|
|
18
|
+
database?: string;
|
|
19
|
+
name: string;
|
|
20
|
+
ddl: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const TAG: Record<string, "database" | "table" | "view"> = {
|
|
24
|
+
[CLICKHOUSE_ENTITY_TYPES.database]: "database",
|
|
25
|
+
[CLICKHOUSE_ENTITY_TYPES.table]: "table",
|
|
26
|
+
[CLICKHOUSE_ENTITY_TYPES.view]: "view",
|
|
27
|
+
[CLICKHOUSE_ENTITY_TYPES.materializedView]: "view",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** A backquoted or double-quoted identifier, written bare when it can be and double-quoted otherwise. */
|
|
31
|
+
function identifierText(t: Token): string {
|
|
32
|
+
if (t.kind !== "qident") return t.text;
|
|
33
|
+
const name = unquote(t.text);
|
|
34
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) ? name : `"${name.replace(/"/g, '""')}"`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Text that sits inside a template literal: a backquote and `${` escaped. */
|
|
38
|
+
const templateSafe = (s: string) => s.replace(/\\(?=`|\$\{)/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The template body for one statement, and the exports it references. A
|
|
42
|
+
* qualified name of another imported object becomes `${export}`; the database
|
|
43
|
+
* part of the statement's own name becomes the database's export.
|
|
44
|
+
*/
|
|
45
|
+
function templateBody(item: Item, byQualified: Map<string, Item>, dbExport: Map<string, string>): { body: string; refs: string[] } {
|
|
46
|
+
const tokens = tokenizeText(item.ddl, 0);
|
|
47
|
+
let node: CreateNode | undefined;
|
|
48
|
+
try {
|
|
49
|
+
node = parseCreate(tokens);
|
|
50
|
+
} catch {
|
|
51
|
+
node = undefined;
|
|
52
|
+
}
|
|
53
|
+
const own = node ? { from: node.name.from, to: node.name.to } : undefined;
|
|
54
|
+
const sig: number[] = [];
|
|
55
|
+
tokens.forEach((t, i) => {
|
|
56
|
+
if (!isTrivia(t)) sig.push(i);
|
|
57
|
+
});
|
|
58
|
+
const isName = (t: Token | undefined) => t !== undefined && (t.kind === "ident" || t.kind === "qident");
|
|
59
|
+
const replace = new Map<number, { to: number; text: string; ref: string }>();
|
|
60
|
+
for (let k = 0; k + 2 < sig.length; k++) {
|
|
61
|
+
const a = tokens[sig[k]!]!;
|
|
62
|
+
const dot = tokens[sig[k + 1]!]!;
|
|
63
|
+
const b = tokens[sig[k + 2]!]!;
|
|
64
|
+
if (!isName(a) || dot.kind !== "punct" || dot.text !== "." || !isName(b)) continue;
|
|
65
|
+
const prev = tokens[sig[k - 1] ?? -1];
|
|
66
|
+
if (prev?.kind === "punct" && prev.text === ".") continue;
|
|
67
|
+
const db = unquote(a.text);
|
|
68
|
+
const name = unquote(b.text);
|
|
69
|
+
const inOwnName = own !== undefined && sig[k]! >= own.from && sig[k]! < own.to;
|
|
70
|
+
const target = byQualified.get(`${db}.${name}`);
|
|
71
|
+
if (!inOwnName && target && target !== item) {
|
|
72
|
+
replace.set(sig[k]!, { to: sig[k + 2]! + 1, text: `\${${target.exportName}}`, ref: target.exportName });
|
|
73
|
+
k += 2;
|
|
74
|
+
} else if (inOwnName && dbExport.has(db)) {
|
|
75
|
+
replace.set(sig[k]!, { to: sig[k]! + 1, text: `\${${dbExport.get(db)}}`, ref: dbExport.get(db)! });
|
|
76
|
+
k += 2;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let body = "";
|
|
80
|
+
const refs: string[] = [];
|
|
81
|
+
for (let i = 0; i < tokens.length; ) {
|
|
82
|
+
const r = replace.get(i);
|
|
83
|
+
if (r) {
|
|
84
|
+
body += r.text;
|
|
85
|
+
refs.push(r.ref);
|
|
86
|
+
i = r.to;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const t = tokens[i]!;
|
|
90
|
+
body += t.kind === "qident" ? templateSafe(identifierText(t)) : templateSafe(t.text);
|
|
91
|
+
i++;
|
|
92
|
+
}
|
|
93
|
+
return { body, refs };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function indent(body: string): string {
|
|
97
|
+
const lines = body.split("\n");
|
|
98
|
+
return lines.map((l, i) => (i === 0 || l.length === 0 ? l : ` ${l}`)).join("\n");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export class ClickHouseGenerator implements TypeScriptGenerator {
|
|
102
|
+
readonly ownsLayout = true;
|
|
103
|
+
|
|
104
|
+
constructor(private readonly header?: string) {}
|
|
105
|
+
|
|
106
|
+
generate(ir: TemplateIR): GeneratedFile[] {
|
|
107
|
+
const items: Item[] = ir.resources
|
|
108
|
+
.filter((r) => TAG[r.type])
|
|
109
|
+
.map((r) => ({
|
|
110
|
+
exportName: r.logicalId,
|
|
111
|
+
type: r.type,
|
|
112
|
+
database: r.properties.database as string | undefined,
|
|
113
|
+
name: String(r.properties.name),
|
|
114
|
+
ddl: String(r.properties.ddl),
|
|
115
|
+
}));
|
|
116
|
+
if (items.length === 0) return [];
|
|
117
|
+
|
|
118
|
+
const byQualified = new Map<string, Item>();
|
|
119
|
+
const dbExport = new Map<string, string>();
|
|
120
|
+
for (const it of items) {
|
|
121
|
+
if (it.type === CLICKHOUSE_ENTITY_TYPES.database) dbExport.set(it.name, it.exportName);
|
|
122
|
+
else if (it.database) byQualified.set(`${it.database}.${it.name}`, it);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const bodies = new Map(items.map((it) => [it.exportName, templateBody(it, byQualified, dbExport)]));
|
|
126
|
+
// Declarations reference each other in one file, so each comes after what it references.
|
|
127
|
+
const order: Item[] = [];
|
|
128
|
+
const done = new Set<string>();
|
|
129
|
+
const visiting = new Set<string>();
|
|
130
|
+
const byExport = new Map(items.map((it) => [it.exportName, it]));
|
|
131
|
+
const visit = (it: Item) => {
|
|
132
|
+
if (done.has(it.exportName) || visiting.has(it.exportName)) return;
|
|
133
|
+
visiting.add(it.exportName);
|
|
134
|
+
for (const ref of bodies.get(it.exportName)!.refs) {
|
|
135
|
+
const dep = byExport.get(ref);
|
|
136
|
+
if (dep) visit(dep);
|
|
137
|
+
}
|
|
138
|
+
visiting.delete(it.exportName);
|
|
139
|
+
done.add(it.exportName);
|
|
140
|
+
order.push(it);
|
|
141
|
+
};
|
|
142
|
+
for (const it of items) visit(it);
|
|
143
|
+
|
|
144
|
+
const tags = [...new Set(order.map((it) => TAG[it.type]!))].sort();
|
|
145
|
+
const lines: string[] = [];
|
|
146
|
+
if (this.header) lines.push(...this.header.split("\n").map((l) => `// ${l}`), "");
|
|
147
|
+
lines.push(`import { ${tags.join(", ")} } from "@intentius/chant-lexicon-sql/clickhouse";`, "");
|
|
148
|
+
for (const it of order) {
|
|
149
|
+
lines.push(`export const ${it.exportName} = ${TAG[it.type]}\`\n ${indent(bodies.get(it.exportName)!.body)}\`;`, "");
|
|
150
|
+
}
|
|
151
|
+
return [{ path: "schema.ts", content: `${lines.join("\n").trimEnd()}\n` }];
|
|
152
|
+
}
|
|
153
|
+
}
|