@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,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding a dialect's tags in a source file, for source-level lint rules and
|
|
3
|
+
* the editor (chant #3278). A rule reads a template's raw parts straight from
|
|
4
|
+
* the TypeScript AST and parses them the way the tag does, with every
|
|
5
|
+
* interpolation left a reference: lint cannot know the values.
|
|
6
|
+
*
|
|
7
|
+
* Every dialect exports tags with the same names (`table`, `view`), so a tag
|
|
8
|
+
* is a dialect's by the module it is imported from, never by its name.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import * as ts from "typescript";
|
|
12
|
+
import type { Token } from "./tokens";
|
|
13
|
+
import { unescapeTemplateDelimiters } from "./template";
|
|
14
|
+
|
|
15
|
+
/** Which imports make a tag one dialect's. */
|
|
16
|
+
export interface TemplateSource<Tag extends string = string> {
|
|
17
|
+
/** The dialect, as `sql.dialect` names it. */
|
|
18
|
+
dialect: string;
|
|
19
|
+
/** The module specifiers its tags are imported from. */
|
|
20
|
+
modules: readonly string[];
|
|
21
|
+
/** The tag names it exports. */
|
|
22
|
+
tags: readonly Tag[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface FoundTemplate<Tag extends string = string> {
|
|
26
|
+
node: ts.TaggedTemplateExpression;
|
|
27
|
+
/** The dialect whose module the tag was imported from. */
|
|
28
|
+
dialect: string;
|
|
29
|
+
tag: Tag;
|
|
30
|
+
/** The template's raw parts, backslashes as written. */
|
|
31
|
+
parts: string[];
|
|
32
|
+
/** Source offset of each part's first character. */
|
|
33
|
+
starts: number[];
|
|
34
|
+
/** The source text of each interpolation's expression. */
|
|
35
|
+
expressions: ts.Expression[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Local names bound to the dialects' tags by this file's imports: `{ table as t }` maps `t` to `table`. */
|
|
39
|
+
function tagBindings<Tag extends string>(source: ts.SourceFile, sources: readonly TemplateSource<Tag>[]): Map<string, { dialect: string; tag: Tag }> {
|
|
40
|
+
const out = new Map<string, { dialect: string; tag: Tag }>();
|
|
41
|
+
for (const stmt of source.statements) {
|
|
42
|
+
if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier)) continue;
|
|
43
|
+
// A module may export several dialects' tags (the package root does): a tag is the first source's that names it.
|
|
44
|
+
const from = sources.filter((s) => s.modules.includes((stmt.moduleSpecifier as ts.StringLiteral).text));
|
|
45
|
+
if (from.length === 0) continue;
|
|
46
|
+
const named = stmt.importClause?.namedBindings;
|
|
47
|
+
if (!named || !ts.isNamedImports(named)) continue;
|
|
48
|
+
for (const el of named.elements) {
|
|
49
|
+
const imported = (el.propertyName ?? el.name).text;
|
|
50
|
+
const source = from.find((s) => (s.tags as readonly string[]).includes(imported));
|
|
51
|
+
if (source) out.set(el.name.text, { dialect: source.dialect, tag: imported as Tag });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Every template in `source` whose tag is imported from one of `sources`' modules, in source order. */
|
|
58
|
+
export function findSqlTemplates<Tag extends string>(source: ts.SourceFile, sources: readonly TemplateSource<Tag>[]): FoundTemplate<Tag>[] {
|
|
59
|
+
const bindings = tagBindings(source, sources);
|
|
60
|
+
if (bindings.size === 0) return [];
|
|
61
|
+
const found: FoundTemplate<Tag>[] = [];
|
|
62
|
+
const visit = (node: ts.Node) => {
|
|
63
|
+
if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && bindings.has(node.tag.text)) {
|
|
64
|
+
const t = node.template;
|
|
65
|
+
// As the tag reads them: raw, with `\`` and `\${` undone. An offset after one of those is off by one.
|
|
66
|
+
const parts = (
|
|
67
|
+
ts.isNoSubstitutionTemplateLiteral(t)
|
|
68
|
+
? [t.rawText ?? t.text]
|
|
69
|
+
: [t.head.rawText ?? t.head.text, ...t.templateSpans.map((s) => s.literal.rawText ?? s.literal.text)]
|
|
70
|
+
).map(unescapeTemplateDelimiters);
|
|
71
|
+
// A part's text begins one character after its opening delimiter (` or }).
|
|
72
|
+
const starts = ts.isNoSubstitutionTemplateLiteral(t)
|
|
73
|
+
? [t.getStart(source) + 1]
|
|
74
|
+
: [t.head.getStart(source) + 1, ...t.templateSpans.map((s) => s.literal.getStart(source) + 1)];
|
|
75
|
+
const expressions = ts.isNoSubstitutionTemplateLiteral(t) ? [] : t.templateSpans.map((s) => s.expression);
|
|
76
|
+
const { dialect, tag } = bindings.get(node.tag.text)!;
|
|
77
|
+
found.push({ node, dialect, tag, parts, starts, expressions });
|
|
78
|
+
}
|
|
79
|
+
ts.forEachChild(node, visit);
|
|
80
|
+
};
|
|
81
|
+
visit(source);
|
|
82
|
+
return found;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** 1-based line and column of a template offset. */
|
|
86
|
+
export function templatePosition(source: ts.SourceFile, found: FoundTemplate, part: number, offset: number): { line: number; column: number } {
|
|
87
|
+
const pos = (found.starts[part] ?? found.node.getStart(source)) + offset;
|
|
88
|
+
const { line, character } = source.getLineAndCharacterOfPosition(pos);
|
|
89
|
+
return { line: line + 1, column: character + 1 };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A token's position; an interpolation's is its expression's. */
|
|
93
|
+
export function tokenPosition(source: ts.SourceFile, found: FoundTemplate, token: Token): { line: number; column: number } {
|
|
94
|
+
if (token.kind === "ref") {
|
|
95
|
+
const expr = found.expressions[token.part];
|
|
96
|
+
if (expr) {
|
|
97
|
+
const { line, character } = source.getLineAndCharacterOfPosition(expr.getStart(source));
|
|
98
|
+
return { line: line + 1, column: character + 1 };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return templatePosition(source, found, token.part, token.start);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ── The editor ─────────────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
/** The offset of an LSP position (0-based line and character) in `content`. */
|
|
107
|
+
export function offsetAt(content: string, pos: { line: number; character: number }): number {
|
|
108
|
+
let offset = 0;
|
|
109
|
+
for (let line = 0; line < pos.line; line++) {
|
|
110
|
+
const next = content.indexOf("\n", offset);
|
|
111
|
+
if (next < 0) return content.length;
|
|
112
|
+
offset = next + 1;
|
|
113
|
+
}
|
|
114
|
+
return Math.min(offset + pos.character, content.length);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface Located<Tag extends string = string> {
|
|
118
|
+
source: ts.SourceFile;
|
|
119
|
+
found: FoundTemplate<Tag>;
|
|
120
|
+
/** The template part the cursor is in, or -1 when it is inside an interpolation's expression. */
|
|
121
|
+
part: number;
|
|
122
|
+
/** Offset in that part. */
|
|
123
|
+
offset: number;
|
|
124
|
+
/** The interpolation the cursor is in, when part is -1. */
|
|
125
|
+
expression: number;
|
|
126
|
+
/** Absolute source offset. */
|
|
127
|
+
at: number;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** The template the source offset `at` is inside, and where in it. */
|
|
131
|
+
export function locateIn<Tag extends string>(content: string, at: number, sources: readonly TemplateSource<Tag>[], fileName = "file.ts"): Located<Tag> | undefined {
|
|
132
|
+
const source = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true);
|
|
133
|
+
for (const found of findSqlTemplates(source, sources)) {
|
|
134
|
+
const start = found.node.template.getStart(source);
|
|
135
|
+
const end = found.node.template.getEnd();
|
|
136
|
+
if (at <= start || at >= end) continue;
|
|
137
|
+
for (let i = 0; i < found.parts.length; i++) {
|
|
138
|
+
const from = found.starts[i]!;
|
|
139
|
+
if (at >= from && at <= from + found.parts[i]!.length) {
|
|
140
|
+
return { source, found, part: i, offset: at - from, expression: -1, at };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const expression = found.expressions.findIndex((e) => at >= e.getStart(source) && at <= e.getEnd());
|
|
144
|
+
return { source, found, part: -1, offset: 0, expression, at };
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const WORD = /[A-Za-z0-9_]/;
|
|
150
|
+
|
|
151
|
+
/** The identifier characters around an offset in a part. */
|
|
152
|
+
export function wordAround(text: string, offset: number): { start: number; end: number } {
|
|
153
|
+
let start = offset;
|
|
154
|
+
while (start > 0 && WORD.test(text[start - 1]!)) start--;
|
|
155
|
+
let end = offset;
|
|
156
|
+
while (end < text.length && WORD.test(text[end]!)) end++;
|
|
157
|
+
return { start, end };
|
|
158
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a plan hands a change it refuses to make in place to a migration Op,
|
|
3
|
+
* the same in every dialect.
|
|
4
|
+
*
|
|
5
|
+
* `chant sql plan`, `chant sql diff` and the applier refuse a change the
|
|
6
|
+
* dialect cannot make in place (a ClickHouse sorting-key change, which needs
|
|
7
|
+
* a rebuild). What they hand on is the Op to run instead, one per object: a
|
|
8
|
+
* declaration ready to put in an `*.op.ts` file, reviewed in the pull request
|
|
9
|
+
* like the schema change it carries out. Nothing is written for the user. The
|
|
10
|
+
* Op's own Plan phase classifies the change again against the server.
|
|
11
|
+
*
|
|
12
|
+
* Which Op, and the options a dialect suggests for it (ClickHouse's dual-write
|
|
13
|
+
* mode), are the dialect's.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** One Op to run instead of a refused change. A dialect adds its own suggested options. */
|
|
17
|
+
export interface MigrationOpSuggestion {
|
|
18
|
+
/** The object the Op migrates, qualified as the dialect writes it. */
|
|
19
|
+
table: string;
|
|
20
|
+
/** The Op's suggested name. */
|
|
21
|
+
name: string;
|
|
22
|
+
env: string;
|
|
23
|
+
/** The declaration, ready to paste into an `*.op.ts` file. */
|
|
24
|
+
declaration: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** An Op name for a migration of `table`: `<kind>-<table>`, lower case, runs of other characters as `-`. */
|
|
28
|
+
export function migrationOpName(kind: string, table: string): string {
|
|
29
|
+
return `${kind}-${table.replace(/[^A-Za-z0-9]+/g, "-").toLowerCase()}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The suggestions as report lines: what the Op is, the import it comes from,
|
|
34
|
+
* then one declaration per line.
|
|
35
|
+
*/
|
|
36
|
+
export function renderMigrationOps(ops: readonly MigrationOpSuggestion[], op: { what: string; exportName: string; importPath: string }): string[] {
|
|
37
|
+
if (ops.length === 0) return [];
|
|
38
|
+
return [
|
|
39
|
+
"",
|
|
40
|
+
`Run ${ops.length === 1 ? "it" : "each"} as ${op.what}, declared in an *.op.ts file ` +
|
|
41
|
+
`(import { ${op.exportName} } from "${op.importPath}"), then \`chant run <name>\` until it is done:`,
|
|
42
|
+
...ops.map((o) => ` ${o.declaration}`),
|
|
43
|
+
];
|
|
44
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql lexicon's shared core: what every dialect (`../clickhouse/`, and
|
|
3
|
+
* Postgres next, #3289) builds on, with no database's grammar in it (#3275
|
|
4
|
+
* question 7, #3047 question 1).
|
|
5
|
+
*
|
|
6
|
+
* Belongs here:
|
|
7
|
+
*
|
|
8
|
+
* - the entity base and Declarable plumbing, and column references
|
|
9
|
+
* (`entity.ts`);
|
|
10
|
+
* - the lossless tokenizer, with each dialect's character-level rules as a
|
|
11
|
+
* table (`tokens.ts`), and the parser base: a cursor over significant
|
|
12
|
+
* tokens with expressions kept as token spans (`cursor.ts`);
|
|
13
|
+
* - the tagged-template plumbing: raw parts, what a plain interpolation
|
|
14
|
+
* splices in, `SqlLiteral`, the tag's error (`template.ts`), and splicing,
|
|
15
|
+
* span text, what each spliced value fed, and a view's column lineage
|
|
16
|
+
* (`interpolation.ts`);
|
|
17
|
+
* - finding a dialect's templates in a source file by the module its tags
|
|
18
|
+
* are imported from, for lint and the editor (`find-templates.ts`);
|
|
19
|
+
* - references between objects, column lineage, and the creation order
|
|
20
|
+
* (`references.ts`);
|
|
21
|
+
* - identity and renames between two schemas, and the change-set model
|
|
22
|
+
* (`diff.ts`);
|
|
23
|
+
* - the classifier framework: the rule shape, classes as data per dialect,
|
|
24
|
+
* `classifyDisruption()` over a dialect's rules, the text report
|
|
25
|
+
* (`classifier.ts`);
|
|
26
|
+
* - normalization helpers that are not a database's grammar, such as the
|
|
27
|
+
* `-- previously:` hint (`normalize.ts`);
|
|
28
|
+
* - the ownership trailer on an object's comment (`ownership.ts`);
|
|
29
|
+
* - receipts kept on the server (`receipts.ts`);
|
|
30
|
+
* - the applier's tri-state outcome, its envelope projection and the build
|
|
31
|
+
* output reader (`apply.ts`);
|
|
32
|
+
* - the hand-off from a refused change to a migration Op (`handoff.ts`);
|
|
33
|
+
* - a throwaway server in a container, and test helpers that are not one
|
|
34
|
+
* database's (`container.ts`, `testing/`).
|
|
35
|
+
*
|
|
36
|
+
* Stays in a dialect: its lexical rules and statement grammar, its key words
|
|
37
|
+
* and identifier quoting, `literal()`'s escaping, its entity types and props,
|
|
38
|
+
* its generated types and overlays, its normalization rules, its rule ids
|
|
39
|
+
* and classes and the documentation they cite, the statements its applier
|
|
40
|
+
* sends and how it waits on the server, its client and binding, import and
|
|
41
|
+
* observation over its catalog, and its migration Op.
|
|
42
|
+
*
|
|
43
|
+
* Nothing here is exported from the package root or a dialect subpath on its
|
|
44
|
+
* own: each dialect re-exports what its public surface names.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
export * from "./entity";
|
|
48
|
+
export * from "./tokens";
|
|
49
|
+
export * from "./cursor";
|
|
50
|
+
export * from "./template";
|
|
51
|
+
export * from "./interpolation";
|
|
52
|
+
export * from "./find-templates";
|
|
53
|
+
export * from "./references";
|
|
54
|
+
export * from "./diff";
|
|
55
|
+
export * from "./classifier";
|
|
56
|
+
export * from "./normalize";
|
|
57
|
+
export * from "./ownership";
|
|
58
|
+
export * from "./receipts";
|
|
59
|
+
export * from "./apply";
|
|
60
|
+
export * from "./handoff";
|
|
61
|
+
export * from "./container";
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a tag does with its interpolations, in every dialect (chant #3196,
|
|
3
|
+
* #3212): splice plain values into the token list as SQL text while
|
|
4
|
+
* references stay `ref` tokens, render a span with its references written as
|
|
5
|
+
* names, record which props each spliced value fed, locate a parse error on
|
|
6
|
+
* its template line, and read column lineage off a view's select list.
|
|
7
|
+
*
|
|
8
|
+
* The dialect supplies its tokenizer rules, which values are its objects and
|
|
9
|
+
* column references, how a reference renders, and how a select-list name
|
|
10
|
+
* reads ({@link TemplateDialect}).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { AttrRef } from "@intentius/chant/attrref";
|
|
14
|
+
import { isTrivia, SqlSyntaxError, tokenize, tokenizeText, untokenize, type LexicalRules, type Token } from "./tokens";
|
|
15
|
+
import type { Span } from "./cursor";
|
|
16
|
+
import type { LineageEdge } from "./references";
|
|
17
|
+
import type { SqlObject } from "./entity";
|
|
18
|
+
import { interpolationLine, spliceText, SqlTemplateError } from "./template";
|
|
19
|
+
|
|
20
|
+
/** What a dialect supplies to the shared template machinery. */
|
|
21
|
+
export interface TemplateDialect {
|
|
22
|
+
lexical: LexicalRules;
|
|
23
|
+
/** An entity of this dialect: an interpolation that references an object. */
|
|
24
|
+
isObject(value: unknown): value is SqlObject;
|
|
25
|
+
/** A column reference to one of this dialect's objects. */
|
|
26
|
+
isColumnRef(value: unknown): value is AttrRef;
|
|
27
|
+
/**
|
|
28
|
+
* How a referenced object or column renders in the SQL. `index` is the
|
|
29
|
+
* interpolation's index in the template, for a dialect whose rendering
|
|
30
|
+
* depends on where the reference sits (Postgres writes a sequence inside
|
|
31
|
+
* `nextval(...)` as a `regclass` literal).
|
|
32
|
+
*/
|
|
33
|
+
renderReference(value: unknown, index?: number): string;
|
|
34
|
+
/** A name token's value in a select list (identifier quotes off, and folded where the dialect folds). */
|
|
35
|
+
identValue(text: string): string;
|
|
36
|
+
/** The output name of the `n`th (1-based) select-list item that has none. */
|
|
37
|
+
unnamedOutput(n: number): string;
|
|
38
|
+
/**
|
|
39
|
+
* What lineage reads off a select list beyond ClickHouse's rules, each off
|
|
40
|
+
* unless set (#3278). `aliasWithoutAs`: `expr name` names its output
|
|
41
|
+
* `name`; `keyword` says which bare words are key words, so `CASE ... END`
|
|
42
|
+
* or `a COLLATE "C"` is not read as an alias. `distinctOn`: a
|
|
43
|
+
* `DISTINCT ON (...)` after `SELECT` is not an item. `qualifiedRefs`:
|
|
44
|
+
* `alias.${t.columns.c}` names its output after the column. `outputOf`:
|
|
45
|
+
* the output name of an item with no alias, when the dialect derives one
|
|
46
|
+
* from the expression (Postgres names `count(x)` "count"); undefined falls
|
|
47
|
+
* back to {@link unnamedOutput}.
|
|
48
|
+
*/
|
|
49
|
+
lineage?: {
|
|
50
|
+
aliasWithoutAs?: boolean;
|
|
51
|
+
keyword?(t: Token): "reserved" | "keyword" | undefined;
|
|
52
|
+
distinctOn?: boolean;
|
|
53
|
+
qualifiedRefs?: boolean;
|
|
54
|
+
outputOf?(items: readonly Token[], valueOf: (t: Token) => unknown): string | undefined;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** A template being built: its tokens, the interpolated values, and what each spliced value fed. */
|
|
59
|
+
export interface TemplateCtx {
|
|
60
|
+
d: TemplateDialect;
|
|
61
|
+
tokens: Token[];
|
|
62
|
+
values: readonly unknown[];
|
|
63
|
+
/**
|
|
64
|
+
* Per interpolation, the props paths its spliced text landed in (#3212).
|
|
65
|
+
* Only spliced text counts: an interpolated entity or column is a reference
|
|
66
|
+
* to a sibling, not a value the author typed into this field.
|
|
67
|
+
*/
|
|
68
|
+
fed: Array<Set<string>>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Record that the spliced text inside `span` fed `path`. */
|
|
72
|
+
export function feed(ctx: TemplateCtx, span: Span | undefined, path: string): void {
|
|
73
|
+
if (!span) return;
|
|
74
|
+
for (let i = span.from; i < span.to; i++) {
|
|
75
|
+
const splice = ctx.tokens[i]!.splice;
|
|
76
|
+
if (splice !== undefined) ctx.fed[splice]!.add(path);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Splice every interpolation that is not a reference into the token list as
|
|
82
|
+
* SQL text. References stay `ref` tokens for the parser and the entity to see.
|
|
83
|
+
*/
|
|
84
|
+
export function splice(d: TemplateDialect, tag: string, parts: readonly string[], values: readonly unknown[]): Token[] {
|
|
85
|
+
const out: Token[] = [];
|
|
86
|
+
for (const t of tokenize(parts, d.lexical)) {
|
|
87
|
+
if (t.kind !== "ref") {
|
|
88
|
+
out.push(t);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const value = values[t.part];
|
|
92
|
+
if (d.isObject(value) || d.isColumnRef(value)) {
|
|
93
|
+
out.push(t);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const text = spliceText(value);
|
|
97
|
+
if (typeof text !== "string") {
|
|
98
|
+
throw new SqlTemplateError(
|
|
99
|
+
tag,
|
|
100
|
+
`the interpolation on template line ${interpolationLine(parts, t.part)} is ${text.error}`,
|
|
101
|
+
t.part,
|
|
102
|
+
parts[t.part]!.length,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
for (const s of tokenizeText(text, t.part, d.lexical)) out.push({ ...s, splice: t.part });
|
|
107
|
+
} catch (err) {
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
throw new SqlTemplateError(
|
|
110
|
+
tag,
|
|
111
|
+
`the text interpolated on template line ${interpolationLine(parts, t.part)} does not tokenize: ${message}`,
|
|
112
|
+
t.part,
|
|
113
|
+
parts[t.part]!.length,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** A span's text, interpolations rendered, trimmed. With `path`, the span's spliced text is recorded as feeding it. */
|
|
121
|
+
export function spanText(ctx: TemplateCtx, span: Span | undefined, path?: string): string | undefined {
|
|
122
|
+
if (!span || span.to <= span.from) return undefined;
|
|
123
|
+
if (path) feed(ctx, span, path);
|
|
124
|
+
return untokenize(ctx.tokens.slice(span.from, span.to), (i) => ctx.d.renderReference(ctx.values[i], i)).trim();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** A parse error as the tag reports it: on the template line, or in the interpolated text it came from. */
|
|
128
|
+
export function templateSyntaxError(tag: string, parts: readonly string[], err: SqlSyntaxError): SqlTemplateError {
|
|
129
|
+
const where =
|
|
130
|
+
err.token?.splice !== undefined
|
|
131
|
+
? `in the text interpolated on template line ${interpolationLine(parts, err.token.splice)}`
|
|
132
|
+
: `on template line ${parts.slice(0, err.part).join("${}").split("\n").length + parts[err.part]!.slice(0, err.offset).split("\n").length - 1}`;
|
|
133
|
+
return new SqlTemplateError(tag, `${err.message} (${where})`, err.part, err.offset);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Column-level lineage of a view's SELECT: one edge per item of the top-level
|
|
138
|
+
* select list. FROM, WHERE and GROUP BY stay text; the objects they
|
|
139
|
+
* interpolate land in `reads`. A column written by name inside the SQL is not
|
|
140
|
+
* lineage: only references are (#3047, "no parsing of SQL for names").
|
|
141
|
+
*/
|
|
142
|
+
export function lineage<O extends SqlObject>(ctx: TemplateCtx, select: Span): { edges: LineageEdge[]; reads: O[] } {
|
|
143
|
+
const { d } = ctx;
|
|
144
|
+
const sig: number[] = [];
|
|
145
|
+
for (let i = select.from; i < select.to; i++) if (!isTrivia(ctx.tokens[i]!)) sig.push(i);
|
|
146
|
+
const tok = (i: number) => ctx.tokens[i]!;
|
|
147
|
+
const isKw = (i: number, w: string) => tok(i).kind === "ident" && tok(i).text.toUpperCase() === w;
|
|
148
|
+
let depth = 0;
|
|
149
|
+
let selectAt = -1;
|
|
150
|
+
let fromAt = sig.length;
|
|
151
|
+
const commas: number[] = [];
|
|
152
|
+
for (let k = 0; k < sig.length; k++) {
|
|
153
|
+
const t = tok(sig[k]!);
|
|
154
|
+
if (t.kind === "punct" && t.text === "(") depth++;
|
|
155
|
+
else if (t.kind === "punct" && t.text === ")") depth--;
|
|
156
|
+
else if (depth === 0 && selectAt < 0 && isKw(sig[k]!, "SELECT")) {
|
|
157
|
+
selectAt = k;
|
|
158
|
+
if (sig[k + 1] !== undefined && isKw(sig[k + 1]!, "DISTINCT")) {
|
|
159
|
+
selectAt = k + 1;
|
|
160
|
+
// `DISTINCT ON (a, b)`: the parenthesized list is not a select-list item.
|
|
161
|
+
if (d.lineage?.distinctOn && sig[k + 2] !== undefined && isKw(sig[k + 2]!, "ON") && tok(sig[k + 3] ?? -1)?.text === "(") {
|
|
162
|
+
let nest = 0;
|
|
163
|
+
let j = k + 3;
|
|
164
|
+
for (; j < sig.length; j++) {
|
|
165
|
+
const x = tok(sig[j]!);
|
|
166
|
+
if (x.kind === "punct" && x.text === "(") nest++;
|
|
167
|
+
else if (x.kind === "punct" && x.text === ")" && --nest === 0) break;
|
|
168
|
+
}
|
|
169
|
+
selectAt = j;
|
|
170
|
+
k = j;
|
|
171
|
+
}
|
|
172
|
+
} else if (sig[k + 1] !== undefined && d.lineage?.distinctOn && isKw(sig[k + 1]!, "ALL")) selectAt = k + 1;
|
|
173
|
+
} else if (depth === 0 && selectAt >= 0 && fromAt === sig.length && isKw(sig[k]!, "FROM")) fromAt = k;
|
|
174
|
+
else if (depth === 0 && selectAt >= 0 && fromAt === sig.length && t.kind === "punct" && t.text === ",") commas.push(k);
|
|
175
|
+
}
|
|
176
|
+
const edges: LineageEdge[] = [];
|
|
177
|
+
if (selectAt >= 0) {
|
|
178
|
+
const bounds = [selectAt, ...commas, fromAt];
|
|
179
|
+
for (let b = 0; b + 1 < bounds.length; b++) {
|
|
180
|
+
const items = sig.slice(bounds[b]! + 1, bounds[b + 1]);
|
|
181
|
+
if (items.length === 0) continue;
|
|
182
|
+
let output: string | undefined;
|
|
183
|
+
let exprItems = items;
|
|
184
|
+
const asAt = items.findIndex((i) => isKw(i, "AS"));
|
|
185
|
+
if (asAt >= 0 && asAt === items.length - 2) {
|
|
186
|
+
output = d.identValue(tok(items[asAt + 1]!).text);
|
|
187
|
+
exprItems = items.slice(0, asAt);
|
|
188
|
+
} else if (items.length === 1) {
|
|
189
|
+
const t = tok(items[0]!);
|
|
190
|
+
if (t.kind === "ref" && d.isColumnRef(ctx.values[t.part])) output = (ctx.values[t.part] as AttrRef).attribute;
|
|
191
|
+
else if (t.kind === "ident" || t.kind === "qident") output = d.identValue(t.text);
|
|
192
|
+
} else if (items.length === 3 && tok(items[1]!).text === "." && (tok(items[2]!).kind === "ident" || tok(items[2]!).kind === "qident")) {
|
|
193
|
+
output = d.identValue(tok(items[2]!).text);
|
|
194
|
+
} else if (d.lineage?.qualifiedRefs && items.length === 3 && tok(items[1]!).text === "." && tok(items[2]!).kind === "ref" && d.isColumnRef(ctx.values[tok(items[2]!).part])) {
|
|
195
|
+
// `alias.${t.columns.c}` names its output after the column.
|
|
196
|
+
output = (ctx.values[tok(items[2]!).part] as AttrRef).attribute;
|
|
197
|
+
} else if (d.lineage?.aliasWithoutAs && items.length >= 2) {
|
|
198
|
+
// `expr name`: an alias without AS. The name follows an operand, never an operator or `.`.
|
|
199
|
+
const last = tok(items[items.length - 1]!);
|
|
200
|
+
const before = tok(items[items.length - 2]!);
|
|
201
|
+
const keyword = (t: Token) => (t.kind === "ident" ? d.lineage?.keyword?.(t) : undefined);
|
|
202
|
+
const operandEnd =
|
|
203
|
+
before.kind === "ref" || before.kind === "string" || before.kind === "number" || before.kind === "qident" || before.kind === "param" ||
|
|
204
|
+
(before.kind === "ident" && keyword(before) === undefined) ||
|
|
205
|
+
(before.kind === "punct" && (before.text === ")" || before.text === "]"));
|
|
206
|
+
const label = last.kind === "qident" || (last.kind === "ident" && keyword(last) !== "reserved");
|
|
207
|
+
if (label && operandEnd) {
|
|
208
|
+
output = d.identValue(last.text);
|
|
209
|
+
exprItems = items.slice(0, -1);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (output === undefined && d.lineage?.outputOf) output = d.lineage.outputOf(exprItems.map(tok), (t) => (t.kind === "ref" ? ctx.values[t.part] : undefined));
|
|
213
|
+
const refs = exprItems.filter((i) => tok(i).kind === "ref").map((i) => tok(i).part);
|
|
214
|
+
const exprSpan: Span = { from: exprItems[0]!, to: exprItems[exprItems.length - 1]! + 1, refs };
|
|
215
|
+
edges.push({
|
|
216
|
+
output: output ?? d.unnamedOutput(b + 1),
|
|
217
|
+
expr: spanText(ctx, exprSpan) ?? "",
|
|
218
|
+
from: [...new Set(refs.map((i) => ctx.values[i]).filter((v): v is AttrRef => d.isColumnRef(v)))],
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const reads = [...new Set(select.refs.map((i) => ctx.values[i]).filter((v): v is O => d.isObject(v)))];
|
|
223
|
+
return { edges, reads };
|
|
224
|
+
}
|
|
225
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalization helpers that hold in every dialect. A dialect's normalization
|
|
3
|
+
* undoes what its own server rewrites (quoting, type aliases, default
|
|
4
|
+
* levels), by rule over its own parse; these are the pieces that are not any
|
|
5
|
+
* one database's grammar.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The name in a `-- previously: <name>` comment, when the text holds one: the
|
|
10
|
+
* rename hint, before a `CREATE` for an object or on a column's line for a
|
|
11
|
+
* column. The name may be quoted with backquotes or double quotes.
|
|
12
|
+
*/
|
|
13
|
+
export function previouslyIn(comments: readonly string[]): string | undefined {
|
|
14
|
+
for (const c of comments) {
|
|
15
|
+
const m = /^--\s*previously\s*:\s*([`"]?)([^\s`"]+)\1\s*$/i.exec(c.trim());
|
|
16
|
+
if (m) return m[2];
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Split canonical text (tokens joined by single spaces) on its top-level
|
|
23
|
+
* commas, outside parentheses and brackets.
|
|
24
|
+
*/
|
|
25
|
+
export function splitTopLevel(text: string): string[] {
|
|
26
|
+
const parts: string[] = [];
|
|
27
|
+
let depth = 0;
|
|
28
|
+
let cur: string[] = [];
|
|
29
|
+
for (const tok of text.split(" ")) {
|
|
30
|
+
if (tok === "(" || tok === "[") depth++;
|
|
31
|
+
if (tok === ")" || tok === "]") depth--;
|
|
32
|
+
if (tok === "," && depth === 0) {
|
|
33
|
+
parts.push(cur.join(" "));
|
|
34
|
+
cur = [];
|
|
35
|
+
} else cur.push(tok);
|
|
36
|
+
}
|
|
37
|
+
if (cur.length) parts.push(cur.join(" "));
|
|
38
|
+
return parts.filter((p) => p.length > 0);
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { carriesMarker, hasChantTrailerKey, isChantManaged, markerTrailer, readMarker, readTrailerPairs, stampedComment, stripMarker } from "./ownership";
|
|
3
|
+
|
|
4
|
+
describe("the comment trailer (#3208)", () => {
|
|
5
|
+
test("is appended to the declared comment, never in place of it", () => {
|
|
6
|
+
expect(stampedComment("Raw events", { stack: "shop", env: "prod" })).toBe("Raw events [chant managed-by=chant stack=shop env=prod]");
|
|
7
|
+
expect(stampedComment(undefined, undefined)).toBe("[chant managed-by=chant]");
|
|
8
|
+
expect(stampedComment("Raw events [chant managed-by=chant stack=old]", { stack: "shop" })).toBe("Raw events [chant managed-by=chant stack=shop]");
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test("reads back, and strips to the declared comment", () => {
|
|
12
|
+
const c = stampedComment("a [b] c", { stack: "my shop", env: "prod]" });
|
|
13
|
+
expect(readMarker(c)).toEqual({ managedBy: "chant", stack: "my shop", env: "prod]" });
|
|
14
|
+
expect(stripMarker(c)).toBe("a [b] c");
|
|
15
|
+
expect(isChantManaged(c)).toBe(true);
|
|
16
|
+
expect(isChantManaged("a [b] c")).toBe(false);
|
|
17
|
+
expect(markerTrailer({ stack: "it's" })).not.toContain("'");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("matches this project's stack and env exactly", () => {
|
|
21
|
+
const c = stampedComment("", { stack: "shop", env: "prod" });
|
|
22
|
+
expect(carriesMarker(c, { stack: "shop", env: "prod" })).toBe(true);
|
|
23
|
+
expect(carriesMarker(c, { stack: "shop" })).toBe(false);
|
|
24
|
+
expect(carriesMarker(c, { stack: "other", env: "prod" })).toBe(false);
|
|
25
|
+
expect(carriesMarker("Raw events", { stack: "shop", env: "prod" })).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("carries extra pairs, encoded, after the marker's own", () => {
|
|
29
|
+
const c = stampedComment("x", { stack: "s" }, { migration: "public.users", role: "new" });
|
|
30
|
+
expect(c).toBe("x [chant managed-by=chant stack=s migration=public.users role=new]");
|
|
31
|
+
expect(readTrailerPairs(c)?.get("migration")).toBe("public.users");
|
|
32
|
+
expect(hasChantTrailerKey(c, ["migration"])).toBe(true);
|
|
33
|
+
expect(hasChantTrailerKey(c, ["receipts"])).toBe(false);
|
|
34
|
+
expect(() => markerTrailer(undefined, { "bad key": "v" })).toThrow(/not \[A-Za-z0-9._-\]\+/);
|
|
35
|
+
});
|
|
36
|
+
});
|