@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A throwaway Postgres server for the live tests: the pinned image on a random
|
|
3
|
+
* loopback port, a client for it, and a URL for a second database on it.
|
|
4
|
+
* Always removed with its volume.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import { startScratchContainer } from "../../core/container";
|
|
10
|
+
import { postgresImage, POSTGRES_LATEST_MAJOR } from "../../spec/postgres-pin";
|
|
11
|
+
import { connectPostgres, type PostgresClient, type PostgresEndpoint } from "../live/client";
|
|
12
|
+
|
|
13
|
+
export { dockerAvailable } from "../../core/container";
|
|
14
|
+
|
|
15
|
+
export interface TestPostgres {
|
|
16
|
+
name: string;
|
|
17
|
+
/** The endpoint of database `db` (default `postgres`). */
|
|
18
|
+
endpoint(db?: string): PostgresEndpoint;
|
|
19
|
+
/** A client on database `db`, with the catalog-reading session (empty search_path). */
|
|
20
|
+
connect(db?: string): Promise<PostgresClient>;
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const PASSWORD = "chant";
|
|
25
|
+
const exec = promisify(execFile);
|
|
26
|
+
|
|
27
|
+
export async function startTestPostgres(major = POSTGRES_LATEST_MAJOR): Promise<TestPostgres> {
|
|
28
|
+
let port = "";
|
|
29
|
+
let name = "";
|
|
30
|
+
const endpoint = (db = "postgres"): PostgresEndpoint => ({ url: `postgres://postgres@127.0.0.1:${port}/${db}`, password: PASSWORD });
|
|
31
|
+
const container = await startScratchContainer({
|
|
32
|
+
image: postgresImage(major),
|
|
33
|
+
namePrefix: "chant-sql-pg-test",
|
|
34
|
+
containerPort: 5432,
|
|
35
|
+
env: { POSTGRES_PASSWORD: PASSWORD },
|
|
36
|
+
removeVolumes: true,
|
|
37
|
+
readyTimeoutMs: 120_000,
|
|
38
|
+
notReady: "did not accept a connection",
|
|
39
|
+
onStarted: (n: string) => {
|
|
40
|
+
name = n;
|
|
41
|
+
},
|
|
42
|
+
ready: async (p) => {
|
|
43
|
+
port = p;
|
|
44
|
+
// The image runs a temporary server for initdb and then restarts it: ready is the second "ready" line.
|
|
45
|
+
const logs = await exec("docker", ["logs", name]).then((r) => `${r.stdout}${r.stderr}`, () => "");
|
|
46
|
+
if ((logs.match(/database system is ready to accept connections/g) ?? []).length < 2) return false;
|
|
47
|
+
try {
|
|
48
|
+
const c = await connectPostgres(endpoint());
|
|
49
|
+
await c.query("SELECT 1");
|
|
50
|
+
await c.end();
|
|
51
|
+
return true;
|
|
52
|
+
} catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
return { name: container.name, endpoint, connect: (db) => connectPostgres(endpoint(db)), stop: () => container.stop() };
|
|
58
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fake Postgres server for the applier's unit tests (#3280): a client that
|
|
3
|
+
* keeps the objects it was sent `CREATE` for, their comments set by
|
|
4
|
+
* `COMMENT ON`, and drops them on `DROP`, with transactions that roll back;
|
|
5
|
+
* and a catalog reader over what it keeps, standing in for
|
|
6
|
+
* `../live/catalog.ts`. What it was sent is recorded, so a test asserts on
|
|
7
|
+
* the transport.
|
|
8
|
+
*
|
|
9
|
+
* It parses statements with the dialect's own parser, so what it stores reads
|
|
10
|
+
* back as the declaration it came from. It does not model locks, column
|
|
11
|
+
* changes or dependencies: a test that needs those runs against the pinned
|
|
12
|
+
* server (`../../op/activities/postgres-apply.e2e.test.ts`).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { PostgresClient } from "../live/client";
|
|
16
|
+
import { PostgresQueryError } from "../live/client";
|
|
17
|
+
import type { LivePgObject } from "../live/catalog";
|
|
18
|
+
import { stripMarker } from "../../core/ownership";
|
|
19
|
+
import { tokenizeText } from "../tokens";
|
|
20
|
+
import { parseStatements, type CommentNode, type NameNode } from "../parser";
|
|
21
|
+
import { POSTGRES_ENTITY_TYPES, type PostgresEntityType } from "../entity-types";
|
|
22
|
+
import { quoteIdent } from "../keywords";
|
|
23
|
+
|
|
24
|
+
/** One object the fake holds. */
|
|
25
|
+
export interface StoredPgObject {
|
|
26
|
+
type: PostgresEntityType;
|
|
27
|
+
schema?: string;
|
|
28
|
+
name: string;
|
|
29
|
+
/** The CREATE statement, as sent. */
|
|
30
|
+
create: string;
|
|
31
|
+
/** The comment, chant's trailer included. */
|
|
32
|
+
comment?: string;
|
|
33
|
+
/** Another tool keeps it (an ORM's revision table). */
|
|
34
|
+
foreign?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface WritablePostgres {
|
|
38
|
+
client: PostgresClient;
|
|
39
|
+
/** Reads what the fake holds, as the catalog reader would print it. */
|
|
40
|
+
readLive: () => Promise<LivePgObject[]>;
|
|
41
|
+
objects: StoredPgObject[];
|
|
42
|
+
/** Every statement sent that is not session or transaction control. */
|
|
43
|
+
writes: string[];
|
|
44
|
+
/** The DROP statements sent. */
|
|
45
|
+
deletes: string[];
|
|
46
|
+
/** Transaction control as sent: BEGIN, COMMIT, ROLLBACK. */
|
|
47
|
+
control: string[];
|
|
48
|
+
/** A statement matching this fails with `refuseCode`. */
|
|
49
|
+
refuse?: RegExp;
|
|
50
|
+
refuseCode?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const KIND_WORD: Record<string, string> = {
|
|
54
|
+
[POSTGRES_ENTITY_TYPES.schema]: "SCHEMA",
|
|
55
|
+
[POSTGRES_ENTITY_TYPES.table]: "TABLE",
|
|
56
|
+
[POSTGRES_ENTITY_TYPES.index]: "INDEX",
|
|
57
|
+
[POSTGRES_ENTITY_TYPES.view]: "VIEW",
|
|
58
|
+
[POSTGRES_ENTITY_TYPES.materializedView]: "MATERIALIZED VIEW",
|
|
59
|
+
[POSTGRES_ENTITY_TYPES.sequence]: "SEQUENCE",
|
|
60
|
+
[POSTGRES_ENTITY_TYPES.enum]: "TYPE",
|
|
61
|
+
[POSTGRES_ENTITY_TYPES.domain]: "DOMAIN",
|
|
62
|
+
[POSTGRES_ENTITY_TYPES.extension]: "EXTENSION",
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const flat = (type: string) => type === POSTGRES_ENTITY_TYPES.schema || type === POSTGRES_ENTITY_TYPES.extension;
|
|
66
|
+
const qname = (o: { type: string; schema?: string; name: string }) => (flat(o.type) || !o.schema ? quoteIdent(o.name) : `${quoteIdent(o.schema)}.${quoteIdent(o.name)}`);
|
|
67
|
+
const split = (n: NameNode, defaultSchema = "public"): { schema: string; name: string } =>
|
|
68
|
+
n.pieces.length > 1 ? { schema: n.pieces[0]!, name: n.pieces[1]! } : { schema: defaultSchema, name: n.pieces[0]! };
|
|
69
|
+
const unquote = (s: string) => s.replace(/^'/, "").replace(/'$/, "").replace(/''/g, "'");
|
|
70
|
+
|
|
71
|
+
export function writablePostgres(seed: StoredPgObject[] = []): WritablePostgres {
|
|
72
|
+
let objects = seed.map((o) => ({ ...o }));
|
|
73
|
+
let snapshot: StoredPgObject[] | undefined;
|
|
74
|
+
const server: WritablePostgres = {
|
|
75
|
+
objects,
|
|
76
|
+
writes: [],
|
|
77
|
+
deletes: [],
|
|
78
|
+
control: [],
|
|
79
|
+
readLive: async () =>
|
|
80
|
+
server.objects.map((o, i) => {
|
|
81
|
+
const own = o.comment !== undefined ? stripMarker(o.comment) : "";
|
|
82
|
+
return {
|
|
83
|
+
type: o.type,
|
|
84
|
+
...(flat(o.type) ? {} : { schema: o.schema }),
|
|
85
|
+
name: o.name,
|
|
86
|
+
oid: String(16384 + i),
|
|
87
|
+
...(o.comment !== undefined ? { comment: o.comment } : {}),
|
|
88
|
+
...(o.foreign ? { foreign: o.foreign } : {}),
|
|
89
|
+
statement: [o.create, ...(own ? [`COMMENT ON ${KIND_WORD[o.type]} ${qname(o)} IS '${own.replace(/'/g, "''")}'`] : [])].join(";\n"),
|
|
90
|
+
};
|
|
91
|
+
}),
|
|
92
|
+
client: {
|
|
93
|
+
async query<T>(sql: string): Promise<T[]> {
|
|
94
|
+
const s = sql.trim();
|
|
95
|
+
if (/^BEGIN$/i.test(s)) {
|
|
96
|
+
server.control.push("BEGIN");
|
|
97
|
+
snapshot = server.objects.map((o) => ({ ...o }));
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
if (/^COMMIT$/i.test(s)) {
|
|
101
|
+
server.control.push("COMMIT");
|
|
102
|
+
snapshot = undefined;
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
if (/^ROLLBACK$/i.test(s)) {
|
|
106
|
+
server.control.push("ROLLBACK");
|
|
107
|
+
if (snapshot) server.objects = objects = snapshot;
|
|
108
|
+
snapshot = undefined;
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
if (/^(SET|SELECT|RESET)\b/i.test(s)) return [];
|
|
112
|
+
if (server.refuse?.test(s)) throw new PostgresQueryError(`refused: ${s.split("\n")[0]}`, server.refuseCode ?? "XX000");
|
|
113
|
+
server.writes.push(s);
|
|
114
|
+
const drop = /^DROP\s+(MATERIALIZED VIEW|INDEX(?:\s+CONCURRENTLY)?|TABLE|VIEW|SEQUENCE|TYPE|DOMAIN|EXTENSION|SCHEMA)\s+(.+)$/i.exec(s);
|
|
115
|
+
if (drop) {
|
|
116
|
+
server.deletes.push(s);
|
|
117
|
+
const word = drop[1]!.toUpperCase().replace(/\s+CONCURRENTLY$/, "");
|
|
118
|
+
const at = server.objects.findIndex((o) => KIND_WORD[o.type] === word && qname(o) === drop[2]!.trim());
|
|
119
|
+
if (at >= 0) server.objects.splice(at, 1);
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
let node;
|
|
123
|
+
try {
|
|
124
|
+
node = parseStatements(tokenizeText(s, 0))[0];
|
|
125
|
+
} catch {
|
|
126
|
+
return []; // ALTER and the rest: recorded, not modelled
|
|
127
|
+
}
|
|
128
|
+
if (!node) return [];
|
|
129
|
+
if (node.statement === "comment") {
|
|
130
|
+
const c = node as CommentNode;
|
|
131
|
+
const entry = Object.entries(KIND_WORD).find(([, w]) => w === c.objectType.toUpperCase());
|
|
132
|
+
if (!entry) return [];
|
|
133
|
+
const type = entry[0];
|
|
134
|
+
const n = flat(type) ? { name: c.target.pieces[0]! } : split(c.target);
|
|
135
|
+
const o = server.objects.find((x) => x.type === type && x.name === n.name && (flat(type) || x.schema === (n as { schema: string }).schema));
|
|
136
|
+
const text = c.text ? unquote(/IS\s+('(?:[^']|'')*')\s*$/i.exec(s)?.[1] ?? "") : undefined;
|
|
137
|
+
if (o) {
|
|
138
|
+
if (text === undefined) delete o.comment;
|
|
139
|
+
else o.comment = text;
|
|
140
|
+
}
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const add = (type: PostgresEntityType, schema: string | undefined, name: string) => {
|
|
144
|
+
if (server.objects.some((x) => x.type === type && x.name === name && x.schema === schema)) {
|
|
145
|
+
throw new PostgresQueryError(`relation "${name}" already exists`, "42P07");
|
|
146
|
+
}
|
|
147
|
+
server.objects.push({ type, ...(schema !== undefined ? { schema } : {}), name, create: s.replace(/\bCREATE\s+OR\s+REPLACE\s+/i, "CREATE ") });
|
|
148
|
+
};
|
|
149
|
+
switch (node.statement) {
|
|
150
|
+
case "schema":
|
|
151
|
+
add(POSTGRES_ENTITY_TYPES.schema, undefined, node.name!.pieces[0]!);
|
|
152
|
+
break;
|
|
153
|
+
case "extension":
|
|
154
|
+
add(POSTGRES_ENTITY_TYPES.extension, undefined, node.name.pieces[0]!);
|
|
155
|
+
break;
|
|
156
|
+
case "table":
|
|
157
|
+
case "sequence":
|
|
158
|
+
case "enum":
|
|
159
|
+
case "domain": {
|
|
160
|
+
const n = split(node.name);
|
|
161
|
+
const type = { table: POSTGRES_ENTITY_TYPES.table, sequence: POSTGRES_ENTITY_TYPES.sequence, enum: POSTGRES_ENTITY_TYPES.enum, domain: POSTGRES_ENTITY_TYPES.domain }[node.statement];
|
|
162
|
+
add(type, n.schema, n.name);
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
case "view": {
|
|
166
|
+
const n = split(node.name);
|
|
167
|
+
const type = node.materialized ? POSTGRES_ENTITY_TYPES.materializedView : POSTGRES_ENTITY_TYPES.view;
|
|
168
|
+
if (node.orReplace) {
|
|
169
|
+
const o = server.objects.find((x) => x.type === type && x.name === n.name && x.schema === n.schema);
|
|
170
|
+
if (o) {
|
|
171
|
+
o.create = s.replace(/\bCREATE\s+OR\s+REPLACE\s+/i, "CREATE ");
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
add(type, n.schema, n.name);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case "index":
|
|
179
|
+
add(POSTGRES_ENTITY_TYPES.index, split(node.table).schema, node.name!.pieces[0]!);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
return [];
|
|
183
|
+
},
|
|
184
|
+
async end() {},
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
return server;
|
|
188
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres's lexical rules over the shared lossless tokenizer
|
|
3
|
+
* (`../core/tokens.ts`, chant #3278), from the Postgres 18 reference,
|
|
4
|
+
* "Lexical Structure":
|
|
5
|
+
*
|
|
6
|
+
* - `"` quotes an identifier; a backtick is an operator character.
|
|
7
|
+
* - A backslash is an ordinary character in `'...'` (standard_conforming_strings
|
|
8
|
+
* is on by default since 9.1) and escapes only in an `E'...'` string. `B'...'`,
|
|
9
|
+
* `X'...'`, `N'...'` and `U&'...'` are strings too, each one token.
|
|
10
|
+
* - `$$...$$` and `$tag$...$tag$` are strings; `$1` is a parameter.
|
|
11
|
+
* - Block comments nest.
|
|
12
|
+
* - `( ) , ; . [ ]` are punctuation; `=` is an operator, so `WITH (a = 1)`
|
|
13
|
+
* reads `=` as an `op` token.
|
|
14
|
+
* - A number never runs into a name: `42`, `3.5`, `.5`, `1e-3`, `0x1F`,
|
|
15
|
+
* `0o17`, `0b101`, `1_000`.
|
|
16
|
+
* - A multi-character operator does not end in `+` or `-` unless it holds
|
|
17
|
+
* one of `~ ! @ # % ^ & | \` ?`, so `fillfactor=-30` reads `=` then `-`.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { tokenize as tokenizeWith, tokenizeText as tokenizeTextWith, type LexicalRules, type Token } from "../core/tokens";
|
|
21
|
+
|
|
22
|
+
export { isTrivia, SqlSyntaxError, untokenize, type LexicalRules, type Token, type TokenKind } from "../core/tokens";
|
|
23
|
+
|
|
24
|
+
export const POSTGRES_LEXICAL: LexicalRules = {
|
|
25
|
+
identQuotes: '"',
|
|
26
|
+
backslashEscapes: false,
|
|
27
|
+
punct: "(),;.[]",
|
|
28
|
+
// The operator characters (sql-syntax-lexical, "Operators"), and `:` for the `::` cast.
|
|
29
|
+
opChars: /[+\-*/<>=~!@#%^&|`?:]/,
|
|
30
|
+
prefixedStrings: true,
|
|
31
|
+
dollarQuotes: true,
|
|
32
|
+
nestedComments: true,
|
|
33
|
+
numbers: "sql",
|
|
34
|
+
unicodeIdentifiers: true,
|
|
35
|
+
operatorsEndWithoutSign: true,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Tokenize one string with Postgres's rules. `part` is the part index recorded on each token and on an error. */
|
|
39
|
+
export function tokenizeText(src: string, part: number): Token[] {
|
|
40
|
+
return tokenizeTextWith(src, part, POSTGRES_LEXICAL);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Tokenize a template's parts with Postgres's rules, with a `ref` token for each interpolation between them. */
|
|
44
|
+
export function tokenize(parts: readonly string[]): Token[] {
|
|
45
|
+
return tokenizeWith(parts, POSTGRES_LEXICAL);
|
|
46
|
+
}
|
package/src/postgres.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@intentius/chant-lexicon-sql/postgres`: the Postgres dialect (#3289).
|
|
3
|
+
*
|
|
4
|
+
* Everything here is spec-true to Postgres, not a database-agnostic model:
|
|
5
|
+
* the statements are Postgres's own DDL, parsed at build time into entities,
|
|
6
|
+
* and the names fold and quote as Postgres folds and quotes them.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
schema,
|
|
11
|
+
table,
|
|
12
|
+
index,
|
|
13
|
+
view,
|
|
14
|
+
sequence,
|
|
15
|
+
type,
|
|
16
|
+
domain,
|
|
17
|
+
extension,
|
|
18
|
+
literal,
|
|
19
|
+
SqlLiteral,
|
|
20
|
+
SqlTemplateError,
|
|
21
|
+
PostgresObject,
|
|
22
|
+
POSTGRES_ENTITY_TYPES,
|
|
23
|
+
isPostgresObject,
|
|
24
|
+
isColumnRef,
|
|
25
|
+
quoteIdent,
|
|
26
|
+
type PostgresEntityType,
|
|
27
|
+
type PostgresSchema,
|
|
28
|
+
type PostgresRelation,
|
|
29
|
+
type PostgresTable,
|
|
30
|
+
type PostgresView,
|
|
31
|
+
type PostgresIndex,
|
|
32
|
+
type PostgresSequence,
|
|
33
|
+
type PostgresEnum,
|
|
34
|
+
type PostgresDomain,
|
|
35
|
+
type PostgresExtension,
|
|
36
|
+
type ColumnDef,
|
|
37
|
+
type KeyDef,
|
|
38
|
+
type CheckDef,
|
|
39
|
+
type ForeignKeyDef,
|
|
40
|
+
type ExclusionDef,
|
|
41
|
+
type SchemaProps,
|
|
42
|
+
type TableProps,
|
|
43
|
+
type IndexProps,
|
|
44
|
+
type ViewProps,
|
|
45
|
+
type SequenceProps,
|
|
46
|
+
type EnumProps,
|
|
47
|
+
type DomainProps,
|
|
48
|
+
type ExtensionProps,
|
|
49
|
+
type LineageEdge,
|
|
50
|
+
} from "./postgres/entities";
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
POSTGRES_PROVIDERS,
|
|
54
|
+
COMMON_REFUSED,
|
|
55
|
+
providerData,
|
|
56
|
+
isPostgresProvider,
|
|
57
|
+
providerAllowsExtension,
|
|
58
|
+
isProviderOwned,
|
|
59
|
+
refusedStatement,
|
|
60
|
+
normalizeStatement,
|
|
61
|
+
type PostgresProvider,
|
|
62
|
+
type ProviderData,
|
|
63
|
+
type ProviderSource,
|
|
64
|
+
type RefusedStatement,
|
|
65
|
+
type LiveObjectRef,
|
|
66
|
+
} from "./postgres/providers";
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
PostgresMigrationOp,
|
|
70
|
+
type PostgresMigrationOpConfig,
|
|
71
|
+
type PostgresMigrationOpResources,
|
|
72
|
+
type PostgresMigrationArgs,
|
|
73
|
+
} from "./postgres/migrate/op";
|
|
74
|
+
export { POSTGRES_RECEIPTS_TABLE } from "./postgres/migrate/receipts";
|
|
75
|
+
export * from "./composites/postgres";
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sectioned by the serializer test table in lexicon-authoring/serializer.mdx.
|
|
3
|
+
* Cases 5, 6, 8 and 9 (a derived name, an explicit name, injected defaults)
|
|
4
|
+
* do not apply: a schema object's name is the one its DDL gives, and the
|
|
5
|
+
* serializer adds nothing the DDL does not say.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, expect, test } from "vitest";
|
|
8
|
+
import { DECLARABLE_MARKER, type Declarable } from "@intentius/chant/declarable";
|
|
9
|
+
import type { SerializerResult } from "@intentius/chant/serializer";
|
|
10
|
+
import { CLICKHOUSE_DDL_FILE, POSTGRES_DDL_FILE, sqlSerializer } from "./serializer";
|
|
11
|
+
import { database, table, view } from "./clickhouse/entities";
|
|
12
|
+
import * as pg from "./postgres/entities";
|
|
13
|
+
|
|
14
|
+
const analytics = database`CREATE DATABASE analytics ENGINE = Atomic`;
|
|
15
|
+
const events = table`
|
|
16
|
+
CREATE TABLE ${analytics}.events (user_id UUID, kind LowCardinality(String), ts DateTime)
|
|
17
|
+
ENGINE = MergeTree ORDER BY (user_id, ts)`;
|
|
18
|
+
const byKind = view`
|
|
19
|
+
CREATE VIEW ${analytics}.by_kind AS
|
|
20
|
+
SELECT ${events.columns.kind} AS kind, count() AS n FROM ${events} GROUP BY kind`;
|
|
21
|
+
|
|
22
|
+
const run = (entries: Array<[string, Declarable]>) => sqlSerializer.serialize(new Map(entries)) as SerializerResult;
|
|
23
|
+
const doc = (r: SerializerResult) =>
|
|
24
|
+
JSON.parse(r.primary) as { dialect: string; applyOrder: string[]; objects: Array<Record<string, unknown>> };
|
|
25
|
+
|
|
26
|
+
describe("sql serializer", () => {
|
|
27
|
+
test("1. its name is the lexicon's", () => {
|
|
28
|
+
expect(sqlSerializer.name).toBe("sql");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("2. its rule prefix is SQL", () => {
|
|
32
|
+
expect(sqlSerializer.rulePrefix).toBe("SQL");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("3. an empty build serializes to an empty string", () => {
|
|
36
|
+
expect(sqlSerializer.serialize(new Map())).toBe("");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("4. one table is filed under its export name, with its DDL", () => {
|
|
40
|
+
const d = doc(run([["events", events]]));
|
|
41
|
+
expect(d.dialect).toBe("clickhouse");
|
|
42
|
+
expect(d.objects[0]).toMatchObject({ export: "events", type: "ClickHouse::Table", name: "events", sqlName: "analytics.events" });
|
|
43
|
+
expect(d.objects[0]!.ddl).toMatch(/^CREATE TABLE analytics\.events/);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("7. several objects come out in dependency order, the statements beside them in the same order", () => {
|
|
47
|
+
const r = run([["byKind", byKind], ["events", events], ["analytics", analytics]]);
|
|
48
|
+
expect(doc(r).applyOrder).toEqual(["analytics", "events", "byKind"]);
|
|
49
|
+
const sql = r.files![CLICKHOUSE_DDL_FILE]!;
|
|
50
|
+
expect(sql.indexOf("CREATE DATABASE")).toBeLessThan(sql.indexOf("CREATE TABLE"));
|
|
51
|
+
expect(sql.indexOf("CREATE TABLE")).toBeLessThan(sql.indexOf("CREATE VIEW"));
|
|
52
|
+
expect(r.verbatimFiles).toEqual([CLICKHOUSE_DDL_FILE]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("10. a declarable of another lexicon is not written", () => {
|
|
56
|
+
const other = { [DECLARABLE_MARKER]: true, lexicon: "k8s", entityType: "K8s::Core::ConfigMap", kind: "resource", props: {} } as unknown as Declarable;
|
|
57
|
+
expect(doc(run([["events", events], ["cm", other]])).applyOrder).toEqual(["events"]);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("11. the output is the same whatever order the entities arrive in", () => {
|
|
61
|
+
const a = run([["analytics", analytics], ["events", events], ["byKind", byKind]]);
|
|
62
|
+
const b = run([["byKind", byKind], ["analytics", analytics], ["events", events]]);
|
|
63
|
+
expect(a.primary).toBe(b.primary);
|
|
64
|
+
expect(a.files).toEqual(b.files);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("12. references are written as export names, lineage as export.column", () => {
|
|
68
|
+
const view = doc(run([["analytics", analytics], ["events", events], ["byKind", byKind]])).objects.find((o) => o.export === "byKind")!;
|
|
69
|
+
expect(view.reads).toEqual(["events"]);
|
|
70
|
+
expect(view.dependsOn).toEqual(["analytics", "events.kind", "events"]);
|
|
71
|
+
expect(view.lineage).toEqual([
|
|
72
|
+
{ output: "kind", expr: "kind", from: ["events.kind"] },
|
|
73
|
+
{ output: "n", expr: "count()", from: [] },
|
|
74
|
+
]);
|
|
75
|
+
expect(view.source).toBeUndefined();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("a reference cycle is an error naming it", () => {
|
|
79
|
+
const a = table`CREATE TABLE a (x UInt8) ENGINE = Log`;
|
|
80
|
+
const b = view`CREATE VIEW b AS SELECT * FROM ${a}`;
|
|
81
|
+
// A cycle cannot be written with tags (a reference must exist first), so make one by hand.
|
|
82
|
+
(a.dependsOn as unknown[]).push(b);
|
|
83
|
+
expect(() => run([["a", a], ["b", b]])).toThrow(/reference cycle.*a -> b -> a/);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe("sql serializer, Postgres", () => {
|
|
88
|
+
const app = pg.schema`CREATE SCHEMA app`;
|
|
89
|
+
const users = pg.table`CREATE TABLE ${app}.users (id bigint PRIMARY KEY, email text NOT NULL)`;
|
|
90
|
+
const orders = pg.table`
|
|
91
|
+
CREATE TABLE ${app}.orders (id bigint PRIMARY KEY, user_id bigint REFERENCES ${users} (${users.columns.id}));
|
|
92
|
+
COMMENT ON TABLE ${app}.orders IS 'Placed orders'`;
|
|
93
|
+
const byUser = pg.index`CREATE INDEX orders_user_idx ON ${orders} (${orders.columns.user_id})`;
|
|
94
|
+
|
|
95
|
+
test("4. a Postgres build is its own document, with postgres.sql beside it", () => {
|
|
96
|
+
const r = run([["users", users], ["app", app]]);
|
|
97
|
+
expect(doc(r).dialect).toBe("postgres");
|
|
98
|
+
expect(doc(r).objects[1]).toMatchObject({ export: "users", type: "Postgres::Table", name: "users", schema: "app", sqlName: "app.users" });
|
|
99
|
+
expect(r.files![POSTGRES_DDL_FILE]).toBe("CREATE SCHEMA app;\n\nCREATE TABLE app.users (id bigint PRIMARY KEY, email text NOT NULL);\n");
|
|
100
|
+
expect(r.verbatimFiles).toEqual([POSTGRES_DDL_FILE]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("a Postgres build records the target major: sql.postgresMajor, else the newest pinned", () => {
|
|
104
|
+
const entities = new Map<string, never>([["app", app as never]]);
|
|
105
|
+
const major = (config?: Record<string, unknown>) =>
|
|
106
|
+
(JSON.parse((sqlSerializer.serialize(entities, undefined, { config }) as SerializerResult).primary) as { postgresMajor?: number }).postgresMajor;
|
|
107
|
+
expect(major()).toBe(18);
|
|
108
|
+
expect(major({ sql: { postgresMajor: 14 } })).toBe(14);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("7. an index comes after its table, a table after what it references, comments stay with their object", () => {
|
|
112
|
+
const r = run([["byUser", byUser], ["orders", orders], ["users", users], ["app", app]]);
|
|
113
|
+
expect(doc(r).applyOrder).toEqual(["app", "users", "orders", "byUser"]);
|
|
114
|
+
expect(r.files![POSTGRES_DDL_FILE]).toContain("COMMENT ON TABLE app.orders IS 'Placed orders';\n\nCREATE INDEX");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("12. references nested in props are written as export names", () => {
|
|
118
|
+
const d = doc(run([["app", app], ["users", users], ["orders", orders], ["byUser", byUser]]));
|
|
119
|
+
expect(d.objects.find((o) => o.export === "orders")!.foreignKeys).toEqual([
|
|
120
|
+
{ columns: ["user_id"], references: "users", refTable: "app.users", refColumns: ["id"] },
|
|
121
|
+
]);
|
|
122
|
+
expect(d.objects.find((o) => o.export === "byUser")).toMatchObject({ table: "orders", tableName: "app.orders" });
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("one build holds one dialect", () => {
|
|
126
|
+
expect(() => run([["events", events], ["users", users]])).toThrow(/one build holds one dialect.*ClickHouse \(events\) and Postgres \(users\)/);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql serializer.
|
|
3
|
+
*
|
|
4
|
+
* A build writes two things:
|
|
5
|
+
*
|
|
6
|
+
* - The primary output, one JSON document: the dialect, the order objects
|
|
7
|
+
* must be created in, and each object filed under its export name (its
|
|
8
|
+
* identity in chant) with its type, its parsed definition, the references it
|
|
9
|
+
* makes and its DDL. Post-synth checks, planning and the applier read this.
|
|
10
|
+
* - `clickhouse.sql` (or `postgres.sql`) beside it: every statement, in that
|
|
11
|
+
* order, as it will be sent. Written verbatim.
|
|
12
|
+
*
|
|
13
|
+
* The order is the dependency order of the references: a view after the
|
|
14
|
+
* tables it reads, a materialized view after its target, a table after its
|
|
15
|
+
* database. Ties break by export name, so the output is the same however the
|
|
16
|
+
* files were discovered. A reference cycle is an error naming the cycle.
|
|
17
|
+
*
|
|
18
|
+
* One build holds one dialect: the dialect is the document's, and a project
|
|
19
|
+
* whose declarations are ClickHouse and Postgres both is refused, naming one
|
|
20
|
+
* of each. Two databases of different dialects are two projects (two
|
|
21
|
+
* workspace members, #3047 question 1).
|
|
22
|
+
*
|
|
23
|
+
* A Postgres document also carries `postgresMajor`, the major the project
|
|
24
|
+
* targets (`sql.postgresMajor`, else the newest pinned major). Post-synth
|
|
25
|
+
* checks and the lock classifier read it; ClickHouse output has no such field.
|
|
26
|
+
*
|
|
27
|
+
* Rule ids: `SQL` for rules that hold in every dialect, `SQLCH` for the
|
|
28
|
+
* ClickHouse dialect's (#3199), `SQLPG` for Postgres's (#3289).
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import type { Declarable, Serializer, SerializerResult } from "@intentius/chant";
|
|
32
|
+
import type { SerializeContext } from "@intentius/chant/serializer";
|
|
33
|
+
import { isAttrRefLike } from "@intentius/chant/utils";
|
|
34
|
+
import { isClickHouseObject, type ClickHouseObject } from "./clickhouse/entities";
|
|
35
|
+
import { isPostgresObject, type PostgresObject } from "./postgres/entities";
|
|
36
|
+
import { POSTGRES_LATEST_MAJOR } from "./spec/postgres-pin";
|
|
37
|
+
import { applyOrder, lineageJson, referenceName, type LineageEdge } from "./core/references";
|
|
38
|
+
|
|
39
|
+
export { applyOrder } from "./core/references";
|
|
40
|
+
|
|
41
|
+
/** The file the statements are written to, beside the primary output. */
|
|
42
|
+
export const CLICKHOUSE_DDL_FILE = "clickhouse.sql";
|
|
43
|
+
|
|
44
|
+
/** The Postgres statements' file, beside the primary output. */
|
|
45
|
+
export const POSTGRES_DDL_FILE = "postgres.sql";
|
|
46
|
+
|
|
47
|
+
function objectJson(name: string, obj: ClickHouseObject, names: Map<Declarable, string>): Record<string, unknown> {
|
|
48
|
+
const props = { ...(obj.props as Record<string, unknown>) };
|
|
49
|
+
delete props.source;
|
|
50
|
+
const ddl = props.ddl;
|
|
51
|
+
delete props.ddl;
|
|
52
|
+
if (props.reads) props.reads = (props.reads as unknown[]).map((r) => referenceName(r, names) ?? null);
|
|
53
|
+
if (props.to !== undefined && typeof props.to !== "string") props.to = referenceName(props.to, names) ?? null;
|
|
54
|
+
if (props.lineage) {
|
|
55
|
+
props.lineage = lineageJson(props.lineage as LineageEdge[], names);
|
|
56
|
+
}
|
|
57
|
+
const dependsOn = [...new Set(obj.dependsOn.map((r) => referenceName(r, names)).filter((n) => n !== undefined))];
|
|
58
|
+
return JSON.parse(
|
|
59
|
+
JSON.stringify({ export: name, type: obj.entityType, sqlName: obj.sqlName, ...props, dependsOn, ddl }),
|
|
60
|
+
) as Record<string, unknown>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** A props value with every entity and column reference in it written as its export name (`users`, `users.id`). */
|
|
64
|
+
function postgresJsonValue(v: unknown, names: Map<Declarable, string>): unknown {
|
|
65
|
+
if (isPostgresObject(v) || isAttrRefLike(v)) return referenceName(v, names) ?? null;
|
|
66
|
+
if (Array.isArray(v)) return v.map((x) => postgresJsonValue(x, names));
|
|
67
|
+
if (v !== null && typeof v === "object") return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, postgresJsonValue(x, names)]));
|
|
68
|
+
return v;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function postgresObjectJson(name: string, obj: PostgresObject, names: Map<Declarable, string>): Record<string, unknown> {
|
|
72
|
+
const props = { ...(obj.props as Record<string, unknown>) };
|
|
73
|
+
delete props.source;
|
|
74
|
+
const ddl = props.ddl;
|
|
75
|
+
delete props.ddl;
|
|
76
|
+
const dependsOn = [...new Set(obj.dependsOn.map((r) => referenceName(r, names)).filter((n) => n !== undefined))];
|
|
77
|
+
return JSON.parse(
|
|
78
|
+
JSON.stringify({ export: name, type: obj.entityType, sqlName: obj.sqlName, ...(postgresJsonValue(props, names) as object), dependsOn, ddl }),
|
|
79
|
+
) as Record<string, unknown>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** The Postgres major the build targets: `sql.postgresMajor`, else the newest pinned major. */
|
|
83
|
+
function targetMajor(config: Record<string, unknown> | undefined): number {
|
|
84
|
+
const m = (config?.sql as { postgresMajor?: unknown } | undefined)?.postgresMajor;
|
|
85
|
+
return typeof m === "number" ? m : POSTGRES_LATEST_MAJOR;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function serializePostgres(
|
|
89
|
+
objects: Map<string, PostgresObject>,
|
|
90
|
+
entities: Map<string, Declarable>,
|
|
91
|
+
config?: Record<string, unknown>,
|
|
92
|
+
): SerializerResult {
|
|
93
|
+
const names = new Map<Declarable, string>();
|
|
94
|
+
for (const [name, entity] of entities) names.set(entity, name);
|
|
95
|
+
const order = applyOrder(objects, names);
|
|
96
|
+
const doc = {
|
|
97
|
+
dialect: "postgres",
|
|
98
|
+
postgresMajor: targetMajor(config),
|
|
99
|
+
applyOrder: order,
|
|
100
|
+
objects: order.map((n) => postgresObjectJson(n, objects.get(n)!, names)),
|
|
101
|
+
};
|
|
102
|
+
const ddl = order.map((n) => `${(objects.get(n)!.props as { ddl: string }).ddl};`).join("\n\n");
|
|
103
|
+
return {
|
|
104
|
+
primary: `${JSON.stringify(doc, null, 2)}\n`,
|
|
105
|
+
files: { [POSTGRES_DDL_FILE]: `${ddl}\n` },
|
|
106
|
+
verbatimFiles: [POSTGRES_DDL_FILE],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const sqlSerializer: Serializer = {
|
|
111
|
+
name: "sql",
|
|
112
|
+
rulePrefix: "SQL",
|
|
113
|
+
|
|
114
|
+
serialize(entities: Map<string, Declarable>, _outputs?: unknown, context?: SerializeContext): string | SerializerResult {
|
|
115
|
+
const objects = new Map<string, ClickHouseObject>();
|
|
116
|
+
const postgres = new Map<string, PostgresObject>();
|
|
117
|
+
for (const [name, entity] of entities) {
|
|
118
|
+
if (isClickHouseObject(entity)) objects.set(name, entity);
|
|
119
|
+
else if (isPostgresObject(entity)) postgres.set(name, entity);
|
|
120
|
+
}
|
|
121
|
+
if (objects.size > 0 && postgres.size > 0) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
`sql: one build holds one dialect, and this one declares ClickHouse (${[...objects.keys()][0]}) and Postgres (${[...postgres.keys()][0]}) objects; ` +
|
|
124
|
+
"declare each database in its own project",
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
if (postgres.size > 0) return serializePostgres(postgres, entities, context?.config);
|
|
128
|
+
if (objects.size === 0) return "";
|
|
129
|
+
|
|
130
|
+
const names = new Map<Declarable, string>();
|
|
131
|
+
for (const [name, entity] of entities) names.set(entity, name);
|
|
132
|
+
|
|
133
|
+
const order = applyOrder(objects, names);
|
|
134
|
+
const doc = {
|
|
135
|
+
dialect: "clickhouse",
|
|
136
|
+
applyOrder: order,
|
|
137
|
+
objects: order.map((n) => objectJson(n, objects.get(n)!, names)),
|
|
138
|
+
};
|
|
139
|
+
const ddl = order
|
|
140
|
+
.map((n) => `${(objects.get(n)!.props as { ddl: string }).ddl};`)
|
|
141
|
+
.join("\n\n");
|
|
142
|
+
return {
|
|
143
|
+
primary: `${JSON.stringify(doc, null, 2)}\n`,
|
|
144
|
+
files: { [CLICKHOUSE_DDL_FILE]: `${ddl}\n` },
|
|
145
|
+
verbatimFiles: [CLICKHOUSE_DDL_FILE],
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
};
|