@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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a live server's schema: the databases and the tables, views and
|
|
3
|
+
* materialized views in them, from `system.databases`, `system.tables` and
|
|
4
|
+
* `SHOW CREATE`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { clickhouseQuery } from "../http";
|
|
8
|
+
import type { ClickHouseTarget } from "./bind";
|
|
9
|
+
import { CLICKHOUSE_ENTITY_TYPES, type ClickHouseEntityType } from "../entities";
|
|
10
|
+
import { isChantWorkingObject, stripMarkerFromStatement } from "../ownership";
|
|
11
|
+
|
|
12
|
+
/** The server's own databases, never part of a declared schema. */
|
|
13
|
+
export const SYSTEM_DATABASES = new Set(["system", "information_schema", "INFORMATION_SCHEMA"]);
|
|
14
|
+
|
|
15
|
+
export interface LiveObject {
|
|
16
|
+
type: ClickHouseEntityType;
|
|
17
|
+
database?: string;
|
|
18
|
+
name: string;
|
|
19
|
+
/** The engine `system.tables` / `system.databases` report: `MergeTree`, `View`, `MaterializedView`, `Atomic`. */
|
|
20
|
+
engine: string;
|
|
21
|
+
uuid?: string;
|
|
22
|
+
/** The object's comment as the server holds it, chant's ownership trailer included (`../ownership.ts`). */
|
|
23
|
+
comment?: string;
|
|
24
|
+
/** `SHOW CREATE` as the server prints it, less chant's ownership trailer, so it reads as the declaration. */
|
|
25
|
+
statement: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const quote = (s: string) => `'${s.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
|
|
29
|
+
const ident = (s: string) => `\`${s.replace(/`/g, "``")}\``;
|
|
30
|
+
|
|
31
|
+
/** The entity type a `system.tables` engine stands for. */
|
|
32
|
+
export function entityTypeOfEngine(engine: string): ClickHouseEntityType {
|
|
33
|
+
if (engine === "View") return CLICKHOUSE_ENTITY_TYPES.view;
|
|
34
|
+
if (engine === "MaterializedView") return CLICKHOUSE_ENTITY_TYPES.materializedView;
|
|
35
|
+
return CLICKHOUSE_ENTITY_TYPES.table;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Every object in the target's databases, sorted by database then name.
|
|
40
|
+
* A materialized view's inner table (`.inner_id.<uuid>`, `.inner.<name>`)
|
|
41
|
+
* belongs to its view and is left out, as are temporary tables and
|
|
42
|
+
* dictionaries (not declared in slice 1).
|
|
43
|
+
*
|
|
44
|
+
* So are chant's own working objects (`../ownership.ts`
|
|
45
|
+
* `isChantWorkingObject`): a rebuild migration's new, dual-write and retained
|
|
46
|
+
* tables, and the effect receipts database. None of them is a declaration, so
|
|
47
|
+
* a plan, an import or a prune that saw them would propose dropping, importing
|
|
48
|
+
* or pruning the very objects a rebuild in progress depends on.
|
|
49
|
+
*/
|
|
50
|
+
export async function readLiveSchema(target: ClickHouseTarget, opts: { withStatements?: boolean } = {}): Promise<LiveObject[]> {
|
|
51
|
+
const q = <T>(sql: string) => clickhouseQuery<T>(target.endpoint, sql);
|
|
52
|
+
const scope = target.databases
|
|
53
|
+
? `IN (${target.databases.map(quote).join(", ")})`
|
|
54
|
+
: `NOT IN (${[...SYSTEM_DATABASES].map(quote).join(", ")})`;
|
|
55
|
+
|
|
56
|
+
const databases = await q<{ name: string; engine: string; uuid: string; comment: string }>(
|
|
57
|
+
`SELECT name, engine, toString(uuid) AS uuid, comment FROM system.databases WHERE name ${scope} ORDER BY name`,
|
|
58
|
+
);
|
|
59
|
+
const tables = await q<{ database: string; name: string; engine: string; uuid: string; comment: string }>(
|
|
60
|
+
`SELECT database, name, engine, toString(uuid) AS uuid, comment FROM system.tables ` +
|
|
61
|
+
`WHERE database ${scope} AND NOT is_temporary AND name NOT LIKE '.inner%' AND engine != 'Dictionary' ` +
|
|
62
|
+
`ORDER BY database, name`,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const working = new Set(databases.filter((d) => isChantWorkingObject(d.comment)).map((d) => d.name));
|
|
66
|
+
const out: LiveObject[] = [];
|
|
67
|
+
const statement = async (kind: "DATABASE" | "TABLE", what: string) =>
|
|
68
|
+
opts.withStatements === false
|
|
69
|
+
? ""
|
|
70
|
+
: stripMarkerFromStatement((await q<{ statement: string }>(`SHOW CREATE ${kind} ${what}`))[0]?.statement ?? "");
|
|
71
|
+
|
|
72
|
+
for (const d of databases) {
|
|
73
|
+
if (working.has(d.name)) continue;
|
|
74
|
+
out.push({
|
|
75
|
+
type: CLICKHOUSE_ENTITY_TYPES.database,
|
|
76
|
+
name: d.name,
|
|
77
|
+
engine: d.engine,
|
|
78
|
+
...(d.uuid && !/^0{8}-/.test(d.uuid) ? { uuid: d.uuid } : {}),
|
|
79
|
+
...(d.comment ? { comment: d.comment } : {}),
|
|
80
|
+
statement: await statement("DATABASE", ident(d.name)),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
for (const t of tables) {
|
|
84
|
+
if (working.has(t.database) || isChantWorkingObject(t.comment)) continue;
|
|
85
|
+
out.push({
|
|
86
|
+
type: entityTypeOfEngine(t.engine),
|
|
87
|
+
database: t.database,
|
|
88
|
+
name: t.name,
|
|
89
|
+
engine: t.engine,
|
|
90
|
+
...(t.uuid && !/^0{8}-/.test(t.uuid) ? { uuid: t.uuid } : {}),
|
|
91
|
+
...(t.comment ? { comment: t.comment } : {}),
|
|
92
|
+
statement: await statement("TABLE", `${ident(t.database)}.${ident(t.name)}`),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `describeResources()` for the ClickHouse dialect: which declared databases,
|
|
3
|
+
* tables and views exist on the environment's server.
|
|
4
|
+
*
|
|
5
|
+
* One read of `system.databases` and `system.tables` per run, then a lookup
|
|
6
|
+
* per declared entity, so N entities are two queries, not N. An object the
|
|
7
|
+
* catalog does not list is absent, and the `queried` address says which
|
|
8
|
+
* server and name were asked. A server that cannot be reached, or refuses the
|
|
9
|
+
* credentials, leaves every entity unobserved with that reason: never absent.
|
|
10
|
+
*
|
|
11
|
+
* Ownership is read from chant's marker, the trailer the applier appends to
|
|
12
|
+
* the object's comment (`../ownership.ts`): `owned` when the comment carries
|
|
13
|
+
* it, `foreign` when it does not. With `owned: true` a foreign object is
|
|
14
|
+
* withheld as `filtered`, which says it exists and is not chant's, never that
|
|
15
|
+
* it is absent.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
observeEntities,
|
|
20
|
+
type DeclaredEntity,
|
|
21
|
+
type DescribeResourcesResult,
|
|
22
|
+
type EntityObservation,
|
|
23
|
+
type ObserverAdapter,
|
|
24
|
+
} from "@intentius/chant/observation";
|
|
25
|
+
import { bindClickHouse, classifyClickHouseFailure, type BindOptions, type ClickHouseTarget } from "./bind";
|
|
26
|
+
import { readLiveSchema, type LiveObject } from "./catalog";
|
|
27
|
+
import { CLICKHOUSE_ENTITY_TYPES } from "../entities";
|
|
28
|
+
import { isChantManaged, readMarker, stripMarker } from "../ownership";
|
|
29
|
+
|
|
30
|
+
interface Bound {
|
|
31
|
+
target: ClickHouseTarget;
|
|
32
|
+
byKey: Map<string, LiveObject>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const keyOf = (database: string | undefined, name: string) => `${database ?? ""}.${name}`;
|
|
36
|
+
|
|
37
|
+
/** The database and name a declared entity is created as. */
|
|
38
|
+
export function declaredAddress(entity: DeclaredEntity, defaultDatabase: string): { database?: string; name: string } {
|
|
39
|
+
const name = String(entity.props.name ?? "");
|
|
40
|
+
if (entity.type === CLICKHOUSE_ENTITY_TYPES.database) return { name };
|
|
41
|
+
return { database: typeof entity.props.database === "string" ? entity.props.database : defaultDatabase, name };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function adapter(options: BindOptions & { owned?: boolean }): ObserverAdapter<Bound> {
|
|
45
|
+
return {
|
|
46
|
+
async bind() {
|
|
47
|
+
const target = await bindClickHouse(options);
|
|
48
|
+
const byKey = new Map<string, LiveObject>();
|
|
49
|
+
for (const o of await readLiveSchema(target, { withStatements: false })) {
|
|
50
|
+
byKey.set(o.type === CLICKHOUSE_ENTITY_TYPES.database ? keyOf(undefined, o.name) : keyOf(o.database, o.name), o);
|
|
51
|
+
}
|
|
52
|
+
return { target, byKey };
|
|
53
|
+
},
|
|
54
|
+
classifyBindFailure: (err) => classifyClickHouseFailure(err),
|
|
55
|
+
async read({ target, byKey }, entity): Promise<EntityObservation> {
|
|
56
|
+
if (!entity.type.startsWith("ClickHouse::")) {
|
|
57
|
+
return { unobserved: { reason: "unsupported-kind", detail: entity.type } };
|
|
58
|
+
}
|
|
59
|
+
const { database, name } = declaredAddress(entity, target.defaultDatabase);
|
|
60
|
+
const queried = `${target.endpoint.url} ${database ? `${database}.` : ""}${name}`;
|
|
61
|
+
const live = byKey.get(keyOf(database, name));
|
|
62
|
+
if (!live) return { absent: true, queried };
|
|
63
|
+
const owned = isChantManaged(live.comment);
|
|
64
|
+
if (options.owned && !owned) {
|
|
65
|
+
return { unobserved: { reason: "filtered", detail: "the object's comment carries no chant ownership marker and owned was requested" }, queried };
|
|
66
|
+
}
|
|
67
|
+
const marker = readMarker(live.comment);
|
|
68
|
+
const comment = live.comment ? stripMarker(live.comment) : "";
|
|
69
|
+
return {
|
|
70
|
+
present: {
|
|
71
|
+
type: live.type,
|
|
72
|
+
physicalId: live.uuid ?? (database ? `${database}.${name}` : name),
|
|
73
|
+
status: live.engine,
|
|
74
|
+
attributes: { engine: live.engine, ...(live.uuid ? { uuid: live.uuid } : {}), ...(comment ? { comment } : {}) },
|
|
75
|
+
ownership: owned ? "owned" : "foreign",
|
|
76
|
+
...(owned && marker?.stack ? { marker: { stack: marker.stack, ...(marker.env ? { env: marker.env } : {}) } } : {}),
|
|
77
|
+
},
|
|
78
|
+
queried,
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function describeResources(
|
|
85
|
+
options: {
|
|
86
|
+
environment: string;
|
|
87
|
+
entityNames: string[];
|
|
88
|
+
entities: Map<string, { entityType: string; props: Record<string, unknown> }>;
|
|
89
|
+
/** Withhold objects that do not carry chant's ownership marker. */
|
|
90
|
+
owned?: boolean;
|
|
91
|
+
} & Omit<BindOptions, "environment">,
|
|
92
|
+
): Promise<DescribeResourcesResult> {
|
|
93
|
+
const declared: DeclaredEntity[] = options.entityNames.map((name) => {
|
|
94
|
+
const entity = options.entities.get(name);
|
|
95
|
+
return { name, type: entity?.entityType ?? "", props: entity?.props ?? {} };
|
|
96
|
+
});
|
|
97
|
+
return observeEntities(declared, adapter(options));
|
|
98
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, test } from "vitest";
|
|
2
|
+
import { describeObservationConformance } from "@intentius/chant-test-utils";
|
|
3
|
+
import { normalizeObservation } from "@intentius/chant/observation";
|
|
4
|
+
import { resolveClickHouseTarget, isUnresolvedTarget } from "./bind";
|
|
5
|
+
import { describeResources } from "./describe-resources";
|
|
6
|
+
import { fakeClickHouse, type FakeServer } from "../testing/fake-server";
|
|
7
|
+
import { database, table, view } from "../entities";
|
|
8
|
+
import { SQL_OWNERSHIP_CHANNEL } from "../ownership";
|
|
9
|
+
|
|
10
|
+
const analytics = database`CREATE DATABASE analytics ENGINE = Atomic`;
|
|
11
|
+
const events = table`CREATE TABLE ${analytics}.events (id UInt64) ENGINE = MergeTree ORDER BY id`;
|
|
12
|
+
const missing = table`CREATE TABLE ${analytics}.missing (id UInt64) ENGINE = Log`;
|
|
13
|
+
const inDefault = table`CREATE TABLE plain (id UInt64) ENGINE = Log`;
|
|
14
|
+
const byId = view`CREATE VIEW analytics.by_id AS SELECT id FROM ${events}`;
|
|
15
|
+
|
|
16
|
+
const LIVE = [
|
|
17
|
+
{ name: "analytics", engine: "Atomic", statement: "CREATE DATABASE analytics\nENGINE = Atomic" },
|
|
18
|
+
{
|
|
19
|
+
database: "analytics",
|
|
20
|
+
name: "events",
|
|
21
|
+
engine: "MergeTree",
|
|
22
|
+
comment: "Raw events [chant managed-by=chant stack=shop env=prod]",
|
|
23
|
+
statement: "CREATE TABLE analytics.events\n(\n `id` UInt64\n)\nENGINE = MergeTree\nORDER BY id\nSETTINGS index_granularity = 8192\nCOMMENT 'Raw events [chant managed-by=chant stack=shop env=prod]'",
|
|
24
|
+
},
|
|
25
|
+
{ database: "analytics", name: "by_id", engine: "View", statement: "CREATE VIEW analytics.by_id\n(\n `id` UInt64\n)\nAS SELECT id\nFROM analytics.events" },
|
|
26
|
+
{ database: "default", name: "plain", engine: "Log", statement: "CREATE TABLE default.plain\n(\n `id` UInt64\n)\nENGINE = Log" },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const entities = new Map(
|
|
30
|
+
Object.entries({ analytics, events, missing, inDefault, byId }).map(([k, v]) => [k, { entityType: v.entityType, props: v.props as unknown as Record<string, unknown> }]),
|
|
31
|
+
);
|
|
32
|
+
const entityNames = [...entities.keys()];
|
|
33
|
+
|
|
34
|
+
let ok: FakeServer;
|
|
35
|
+
let refused: FakeServer;
|
|
36
|
+
beforeAll(async () => {
|
|
37
|
+
ok = await fakeClickHouse(LIVE);
|
|
38
|
+
refused = await fakeClickHouse([], { fail: { status: 516, body: "Code: 516. DB::Exception: default: Authentication failed. (AUTHENTICATION_FAILED)" } });
|
|
39
|
+
});
|
|
40
|
+
afterAll(async () => {
|
|
41
|
+
await ok.close();
|
|
42
|
+
await refused.close();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const run = (url: string | undefined, owned?: boolean) =>
|
|
46
|
+
describeResources({ environment: "test", entityNames, entities, config: {}, env: url ? { CLICKHOUSE_URL: url } : {}, ...(owned ? { owned } : {}) });
|
|
47
|
+
|
|
48
|
+
describe("binding an environment to a server", () => {
|
|
49
|
+
test("a profile is the server, its credentials read from the variables it names", () => {
|
|
50
|
+
const t = resolveClickHouseTarget({
|
|
51
|
+
environment: "prod",
|
|
52
|
+
config: { sql: { profiles: { prod: { url: "https://ch:8443/", user: { env: "U" }, password: { env: "P" }, databases: ["analytics"] } } } },
|
|
53
|
+
env: { U: "reader", P: "pw" },
|
|
54
|
+
});
|
|
55
|
+
expect(t).toEqual({
|
|
56
|
+
endpoint: { url: "https://ch:8443", user: "reader", password: "pw" },
|
|
57
|
+
source: "sql.profiles.prod",
|
|
58
|
+
databases: ["analytics"],
|
|
59
|
+
defaultDatabase: "default",
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("a credential variable the profile names but nobody set is no-credentials", () => {
|
|
64
|
+
const t = resolveClickHouseTarget({ environment: "prod", config: { sql: { profiles: { prod: { url: "x", password: { env: "P" } } } } }, env: {} });
|
|
65
|
+
expect(isUnresolvedTarget(t) && t.reason).toBe("no-credentials");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("no profile and no CLICKHOUSE_URL is no-binding", () => {
|
|
69
|
+
const t = resolveClickHouseTarget({ environment: "dev", config: {}, env: {} });
|
|
70
|
+
expect(isUnresolvedTarget(t) && t.reason).toBe("no-binding");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe("describeResources", () => {
|
|
75
|
+
test("reports present objects with their engine, an undeclared-on-server one absent, and where it asked", async () => {
|
|
76
|
+
const r = normalizeObservation(await run(ok.url));
|
|
77
|
+
expect(Object.keys(r.resources).sort()).toEqual(["analytics", "byId", "events", "inDefault"]);
|
|
78
|
+
expect(r.resources.events).toMatchObject({ type: "ClickHouse::Table", status: "MergeTree", ownership: "owned" });
|
|
79
|
+
expect(r.resources.byId).toMatchObject({ type: "ClickHouse::View", status: "View", ownership: "foreign" });
|
|
80
|
+
expect(r.unobserved).toEqual({});
|
|
81
|
+
expect(r.queried?.missing).toBe(`${ok.url} analytics.missing`);
|
|
82
|
+
expect(r.queried?.inDefault).toBe(`${ok.url} default.plain`);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("an owned object carries the marker's stack and env, and its comment without the trailer (#3208)", async () => {
|
|
86
|
+
const r = normalizeObservation(await run(ok.url));
|
|
87
|
+
expect(r.resources.events!.marker).toEqual({ stack: "shop", env: "prod" });
|
|
88
|
+
expect(r.resources.events!.attributes).toMatchObject({ comment: "Raw events" });
|
|
89
|
+
expect(r.resources.byId!.marker).toBeUndefined();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("owned withholds a foreign object as filtered, never as absent (#3208)", async () => {
|
|
93
|
+
const r = normalizeObservation(await run(ok.url, true));
|
|
94
|
+
expect(Object.keys(r.resources)).toEqual(["events"]);
|
|
95
|
+
expect(Object.fromEntries(Object.entries(r.unobserved).map(([k, v]) => [k, v.reason]))).toEqual({
|
|
96
|
+
analytics: "filtered",
|
|
97
|
+
inDefault: "filtered",
|
|
98
|
+
byId: "filtered",
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("reads the catalog in two queries, whatever the number of entities", async () => {
|
|
103
|
+
const before = ok.queries.length;
|
|
104
|
+
await run(ok.url);
|
|
105
|
+
expect(ok.queries.length - before).toBe(2);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describeObservationConformance({
|
|
110
|
+
lexicon: "sql",
|
|
111
|
+
ownershipChannel: SQL_OWNERSHIP_CHANNEL,
|
|
112
|
+
scenarios: [
|
|
113
|
+
{
|
|
114
|
+
name: "owned: only what carries chant's marker",
|
|
115
|
+
declared: entityNames,
|
|
116
|
+
owned: true,
|
|
117
|
+
run: () => run(ok.url, true),
|
|
118
|
+
expectPresent: ["events"],
|
|
119
|
+
expectAbsent: ["missing"],
|
|
120
|
+
expectUnobserved: ["analytics", "inDefault", "byId"],
|
|
121
|
+
expectMarker: { events: { stack: "shop", env: "prod" } },
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "a server holding some of the declared schema",
|
|
125
|
+
declared: entityNames,
|
|
126
|
+
run: () => run(ok.url),
|
|
127
|
+
expectPresent: ["analytics", "events", "inDefault", "byId"],
|
|
128
|
+
expectAbsent: ["missing"],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "a server that refuses the credentials",
|
|
132
|
+
declared: entityNames,
|
|
133
|
+
run: () => run(refused.url),
|
|
134
|
+
expectUnobserved: entityNames,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "no server bound",
|
|
138
|
+
declared: entityNames,
|
|
139
|
+
run: () => run(undefined),
|
|
140
|
+
expectUnobserved: entityNames,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live round trip (#3197): a schema on one server is imported as chant
|
|
3
|
+
* declarations, built, and applied to a second, empty server; both servers'
|
|
4
|
+
* catalogs then print the same `SHOW CREATE` for every object, and exporting
|
|
5
|
+
* the second gives back the same declarations.
|
|
6
|
+
*
|
|
7
|
+
* Needs Docker; skips cleanly without it. Two throwaway
|
|
8
|
+
* `clickhouse/clickhouse-server` containers at the pin, removed afterwards
|
|
9
|
+
* even on failure.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { afterAll, beforeAll, describe, expect, test } from "vitest";
|
|
15
|
+
import { build } from "@intentius/chant/build";
|
|
16
|
+
import type { SerializerResult } from "@intentius/chant/serializer";
|
|
17
|
+
import { dockerAvailable, startScratchServer, type ScratchServer } from "../container";
|
|
18
|
+
import { clickhouseQuery } from "../http";
|
|
19
|
+
import { clickhouseImage } from "../../spec/pin";
|
|
20
|
+
import { exportResources } from "../import/live-export";
|
|
21
|
+
import { ClickHouseGenerator } from "../import/generator";
|
|
22
|
+
import { splitStatements } from "../import/ir";
|
|
23
|
+
import { readLiveSchema } from "./catalog";
|
|
24
|
+
import { describeResources } from "./describe-resources";
|
|
25
|
+
import { SCHEMA } from "../testing/roundtrip-schema";
|
|
26
|
+
import { sqlPlugin } from "../../plugin";
|
|
27
|
+
import { CLICKHOUSE_DDL_FILE, sqlSerializer } from "../../serializer";
|
|
28
|
+
|
|
29
|
+
const enabled = await dockerAvailable();
|
|
30
|
+
const projectDir = join(import.meta.dirname, "..", "..", "..", `.roundtrip-tmp-${process.pid}`);
|
|
31
|
+
let source: ScratchServer | undefined;
|
|
32
|
+
let target: ScratchServer | undefined;
|
|
33
|
+
|
|
34
|
+
beforeAll(async () => {
|
|
35
|
+
if (!enabled) return;
|
|
36
|
+
[source, target] = await Promise.all([
|
|
37
|
+
startScratchServer(clickhouseImage(), { namePrefix: "chant-sql-rt-source" }),
|
|
38
|
+
startScratchServer(clickhouseImage(), { namePrefix: "chant-sql-rt-target" }),
|
|
39
|
+
]);
|
|
40
|
+
for (const stmt of SCHEMA) await clickhouseQuery(source.endpoint, stmt);
|
|
41
|
+
}, 600_000);
|
|
42
|
+
|
|
43
|
+
afterAll(async () => {
|
|
44
|
+
await Promise.all([source?.stop(), target?.stop()]);
|
|
45
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/** Every object's SHOW CREATE, keyed by `db.name`, with the UUIDs servers mint left out. */
|
|
49
|
+
async function catalog(server: ScratchServer): Promise<Record<string, string>> {
|
|
50
|
+
const objects = await readLiveSchema({ endpoint: server.endpoint, source: "test", defaultDatabase: "default" });
|
|
51
|
+
return Object.fromEntries(
|
|
52
|
+
objects.map((o) => [`${o.database ?? ""}.${o.name}`, o.statement.replace(/ UUID '[0-9a-f-]+'/g, "")]),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe.skipIf(!enabled)("import, build, apply, and the catalog is unchanged", () => {
|
|
57
|
+
test("the round trip", async () => {
|
|
58
|
+
const env = (s: ScratchServer) => ({ CLICKHOUSE_URL: s.endpoint.url });
|
|
59
|
+
|
|
60
|
+
// Import: the source server's schema as declarations.
|
|
61
|
+
const exported = await exportResources({ environment: "rt", config: {}, env: env(source!) });
|
|
62
|
+
const [file] = new ClickHouseGenerator().generate(exported);
|
|
63
|
+
mkdirSync(join(projectDir, "src"), { recursive: true });
|
|
64
|
+
writeFileSync(join(projectDir, "chant.config.ts"), 'export default { lexicons: ["sql"] };\n');
|
|
65
|
+
writeFileSync(join(projectDir, "src", file!.path), file!.content);
|
|
66
|
+
|
|
67
|
+
// Build: the declarations fold to the statements.
|
|
68
|
+
const result = await build(join(projectDir, "src"), [sqlSerializer], undefined, {
|
|
69
|
+
fold: true,
|
|
70
|
+
intrinsics: sqlPlugin.intrinsics!(),
|
|
71
|
+
lexicons: ["sql"],
|
|
72
|
+
});
|
|
73
|
+
expect(result.errors).toEqual([]);
|
|
74
|
+
const out = result.outputs.get("sql") as SerializerResult;
|
|
75
|
+
|
|
76
|
+
// Apply: run the statements, in the order the build wrote them, on the empty server.
|
|
77
|
+
for (const stmt of splitStatements(out.files![CLICKHOUSE_DDL_FILE]!)) await clickhouseQuery(target!.endpoint, stmt);
|
|
78
|
+
|
|
79
|
+
// The catalog is unchanged.
|
|
80
|
+
expect(await catalog(target!)).toEqual(await catalog(source!));
|
|
81
|
+
|
|
82
|
+
// Exporting the applied server gives back the same declarations.
|
|
83
|
+
const again = await exportResources({ environment: "rt", config: {}, env: env(target!) });
|
|
84
|
+
expect(new ClickHouseGenerator().generate(again)[0]!.content).toBe(file!.content);
|
|
85
|
+
|
|
86
|
+
// Every declared object is present: nothing to create.
|
|
87
|
+
const entities = new Map(
|
|
88
|
+
[...result.entities].map(([k, v]) => [k, { entityType: v.entityType, props: (v as unknown as { props: Record<string, unknown> }).props }]),
|
|
89
|
+
);
|
|
90
|
+
const observed = await describeResources({ environment: "rt", entityNames: [...entities.keys()], entities, config: {}, env: env(target!) });
|
|
91
|
+
expect(Object.keys(observed).length === 0 ? [] : Object.keys((observed as { resources?: object }).resources ?? observed).sort()).toEqual([...entities.keys()].sort());
|
|
92
|
+
}, 600_000);
|
|
93
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec parameters and chaining: the overlay half.
|
|
3
|
+
*
|
|
4
|
+
* `system.codecs` gives the 17 names and their flags (compression, generic,
|
|
5
|
+
* encryption, time series, experimental). The parameters (`ZSTD(level)`,
|
|
6
|
+
* `Delta(bytes)`) and the order a chain like `CODEC(Delta, ZSTD(3))` must
|
|
7
|
+
* follow are in no table.
|
|
8
|
+
*
|
|
9
|
+
* Every codec at the pin has an entry, and generation fails when one does not,
|
|
10
|
+
* so a codec a pin move adds is a decision rather than a silent `string`.
|
|
11
|
+
* `"unknown"` is that decision for the experimental codecs whose parameters
|
|
12
|
+
* are not documented: they are accepted as written and not checked.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { ArgumentOverlay } from "./kinds";
|
|
16
|
+
|
|
17
|
+
export interface CodecOverlay {
|
|
18
|
+
/** Positional parameters, all optional unless marked otherwise; `"unknown"` when undocumented. */
|
|
19
|
+
parameters: readonly (ArgumentOverlay & { name: string })[] | "unknown";
|
|
20
|
+
/**
|
|
21
|
+
* Where the codec sits in a chain. A `preprocessing` codec transforms values
|
|
22
|
+
* for the compression codec that must follow it; `encryption` comes last;
|
|
23
|
+
* `internal` is never written by hand.
|
|
24
|
+
*/
|
|
25
|
+
role: "preprocessing" | "compression" | "encryption" | "none" | "internal";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const WIDTH: ArgumentOverlay & { name: string } = {
|
|
29
|
+
name: "bytes",
|
|
30
|
+
kind: "number",
|
|
31
|
+
optional: true,
|
|
32
|
+
note: "1, 2, 4 or 8; the column type's width when omitted.",
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const CODEC_OVERLAY: Record<string, CodecOverlay> = {
|
|
36
|
+
NONE: { parameters: [], role: "none" },
|
|
37
|
+
LZ4: { parameters: [], role: "compression" },
|
|
38
|
+
LZ4HC: {
|
|
39
|
+
parameters: [{ name: "level", kind: "number", optional: true, range: [0, 12], note: "9 when omitted or 0." }],
|
|
40
|
+
role: "compression",
|
|
41
|
+
},
|
|
42
|
+
ZSTD: {
|
|
43
|
+
parameters: [{ name: "level", kind: "number", optional: true, range: [1, 22], note: "1 when omitted." }],
|
|
44
|
+
role: "compression",
|
|
45
|
+
},
|
|
46
|
+
Delta: { parameters: [WIDTH], role: "preprocessing" },
|
|
47
|
+
DoubleDelta: { parameters: [WIDTH], role: "compression" },
|
|
48
|
+
Gorilla: { parameters: [WIDTH], role: "compression" },
|
|
49
|
+
GCD: { parameters: [], role: "preprocessing" },
|
|
50
|
+
T64: {
|
|
51
|
+
parameters: [{ name: "variant", kind: "keyword", optional: true, values: ["'byte'", "'bit'"] }],
|
|
52
|
+
role: "compression",
|
|
53
|
+
},
|
|
54
|
+
FPC: {
|
|
55
|
+
parameters: [
|
|
56
|
+
{ name: "level", kind: "number", optional: true, range: [1, 28], note: "12 when omitted." },
|
|
57
|
+
{ name: "float_size", kind: "number", optional: true, note: "4 or 8; the column type's width when omitted." },
|
|
58
|
+
],
|
|
59
|
+
role: "compression",
|
|
60
|
+
},
|
|
61
|
+
AES_128_GCM_SIV: { parameters: [], role: "encryption" },
|
|
62
|
+
AES_256_GCM_SIV: { parameters: [], role: "encryption" },
|
|
63
|
+
ALP: { parameters: "unknown", role: "compression" },
|
|
64
|
+
SZ3: { parameters: "unknown", role: "compression" },
|
|
65
|
+
ZXC: { parameters: "unknown", role: "compression" },
|
|
66
|
+
Quantized: { parameters: "unknown", role: "preprocessing" },
|
|
67
|
+
Multiple: { parameters: "unknown", role: "internal" },
|
|
68
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine arguments: the overlay half (chant #3195).
|
|
3
|
+
*
|
|
4
|
+
* The generator reads each engine's argument names, positions and optionality
|
|
5
|
+
* from the server's `syntax` line (`engine-syntax.ts`). This table adds what
|
|
6
|
+
* that line cannot say: whether `ver` is a column, `cluster` a name, `min_time`
|
|
7
|
+
* a number. Keys are the argument names exactly as the syntax line spells
|
|
8
|
+
* them, and generation fails when one no longer appears there, so a pin move
|
|
9
|
+
* that renames or drops an argument is caught rather than mistyped.
|
|
10
|
+
*
|
|
11
|
+
* Covered: the MergeTree family and its Replicated twins, and the engines a
|
|
12
|
+
* schema commonly declares beside them (Distributed, Buffer, Join, Merge,
|
|
13
|
+
* Dictionary, File, URL, Alias, KeeperMap, EmbeddedRocksDB, GenerateRandom).
|
|
14
|
+
* Integration engines (S3, Kafka, the lake engines, the database bridges) keep
|
|
15
|
+
* their arguments untyped: they are connection strings and credentials, which
|
|
16
|
+
* lint has no business guessing at.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ArgumentOverlay } from "./kinds";
|
|
20
|
+
|
|
21
|
+
const REPLICATED: Record<string, ArgumentOverlay> = {
|
|
22
|
+
zoo_path: {
|
|
23
|
+
kind: "string",
|
|
24
|
+
optional: true,
|
|
25
|
+
note: "May be omitted together with replica_name when the server sets default_replica_path and default_replica_name.",
|
|
26
|
+
},
|
|
27
|
+
replica_name: { kind: "string", optional: true, note: "Omitted together with zoo_path." },
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const SIGN: ArgumentOverlay = { kind: "column", note: "An Int8 column holding 1 for a state row and -1 for a cancel row." };
|
|
31
|
+
const VERSION: ArgumentOverlay = { kind: "column", note: "An unsigned integer, date or datetime column." };
|
|
32
|
+
const SUMMED: ArgumentOverlay = { kind: "columns", note: "Numeric columns to sum; every numeric column outside the sort key when omitted." };
|
|
33
|
+
const REPLACING: Record<string, ArgumentOverlay> = {
|
|
34
|
+
ver: { kind: "column", note: "The version column: the row with the highest version wins; the last inserted when omitted." },
|
|
35
|
+
is_deleted: { kind: "column", note: "A UInt8 column; 1 marks a deleted row. Requires ver." },
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const ENGINE_ARGUMENTS: Record<string, Record<string, ArgumentOverlay>> = {
|
|
39
|
+
ReplacingMergeTree: REPLACING,
|
|
40
|
+
SummingMergeTree: { columns: SUMMED },
|
|
41
|
+
CoalescingMergeTree: { columns: SUMMED },
|
|
42
|
+
CollapsingMergeTree: { sign: SIGN },
|
|
43
|
+
VersionedCollapsingMergeTree: { sign: SIGN, version: VERSION },
|
|
44
|
+
GraphiteMergeTree: { config_section: { kind: "string", note: "The graphite_rollup section of the server config." } },
|
|
45
|
+
|
|
46
|
+
ReplicatedMergeTree: REPLICATED,
|
|
47
|
+
ReplicatedAggregatingMergeTree: REPLICATED,
|
|
48
|
+
ReplicatedReplacingMergeTree: { ...REPLICATED, ...REPLACING },
|
|
49
|
+
ReplicatedSummingMergeTree: { ...REPLICATED, columns: SUMMED },
|
|
50
|
+
ReplicatedCoalescingMergeTree: { ...REPLICATED, columns: SUMMED },
|
|
51
|
+
ReplicatedCollapsingMergeTree: { ...REPLICATED, sign: SIGN },
|
|
52
|
+
ReplicatedVersionedCollapsingMergeTree: { ...REPLICATED, sign: SIGN, version: VERSION },
|
|
53
|
+
ReplicatedGraphiteMergeTree: { ...REPLICATED, config_section: { kind: "string" } },
|
|
54
|
+
|
|
55
|
+
Distributed: {
|
|
56
|
+
cluster: { kind: "identifier", note: "A cluster named in the server's remote_servers config." },
|
|
57
|
+
database: { kind: "identifier" },
|
|
58
|
+
table: { kind: "identifier" },
|
|
59
|
+
sharding_key: { kind: "expression", note: "Required for INSERTs into a cluster of more than one shard." },
|
|
60
|
+
policy_name: { kind: "string", note: "A storage policy for the files queued for sending." },
|
|
61
|
+
},
|
|
62
|
+
Buffer: {
|
|
63
|
+
database: { kind: "identifier" },
|
|
64
|
+
table: { kind: "identifier" },
|
|
65
|
+
num_buckets: { kind: "number", range: [1, 1000], note: "Independent buffers; 16 is the documented default." },
|
|
66
|
+
min_time: { kind: "number" },
|
|
67
|
+
max_time: { kind: "number" },
|
|
68
|
+
min_rows: { kind: "number" },
|
|
69
|
+
max_rows: { kind: "number" },
|
|
70
|
+
min_bytes: { kind: "number" },
|
|
71
|
+
max_bytes: { kind: "number" },
|
|
72
|
+
flush_time: { kind: "number" },
|
|
73
|
+
flush_rows: { kind: "number" },
|
|
74
|
+
flush_bytes: { kind: "number" },
|
|
75
|
+
},
|
|
76
|
+
Join: {
|
|
77
|
+
join_strictness: { kind: "keyword", values: ["ANY", "ALL", "SEMI", "ANTI"] },
|
|
78
|
+
join_type: { kind: "keyword", values: ["INNER", "LEFT", "RIGHT", "FULL", "CROSS"] },
|
|
79
|
+
k1: { kind: "column" },
|
|
80
|
+
k2: { kind: "column" },
|
|
81
|
+
},
|
|
82
|
+
Merge: {
|
|
83
|
+
db_name: { kind: "expression", note: "A database name, or REGEXP('pattern')." },
|
|
84
|
+
tables_regexp: { kind: "string" },
|
|
85
|
+
},
|
|
86
|
+
Dictionary: { dictionary_name: { kind: "identifier" } },
|
|
87
|
+
File: {
|
|
88
|
+
format: { kind: "identifier", note: "An input/output format name from system.formats." },
|
|
89
|
+
"path|fd": { kind: "string" },
|
|
90
|
+
},
|
|
91
|
+
URL: {
|
|
92
|
+
url: { kind: "string" },
|
|
93
|
+
format: { kind: "identifier", note: "A format name from system.formats." },
|
|
94
|
+
compression: { kind: "string" },
|
|
95
|
+
},
|
|
96
|
+
Alias: { target_db: { kind: "identifier" }, target_table: { kind: "identifier" } },
|
|
97
|
+
KeeperMap: { root_path: { kind: "string" }, keys_limit: { kind: "number" } },
|
|
98
|
+
EmbeddedRocksDB: {
|
|
99
|
+
ttl: { kind: "number" },
|
|
100
|
+
rocksdb_dir: { kind: "string" },
|
|
101
|
+
read_only: { kind: "number", range: [0, 1] },
|
|
102
|
+
},
|
|
103
|
+
GenerateRandom: {
|
|
104
|
+
random_seed: { kind: "number" },
|
|
105
|
+
max_string_length: { kind: "number" },
|
|
106
|
+
max_array_length: { kind: "number" },
|
|
107
|
+
},
|
|
108
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What kind of value an argument or parameter takes. The catalog names an
|
|
3
|
+
* argument (`ver`, `cluster`); it never says whether `ver` is a column and
|
|
4
|
+
* `cluster` a name, which is what these say.
|
|
5
|
+
*/
|
|
6
|
+
export type ArgumentKind =
|
|
7
|
+
/** One column of the table, by name. */
|
|
8
|
+
| "column"
|
|
9
|
+
/** A column, or a tuple of columns. */
|
|
10
|
+
| "columns"
|
|
11
|
+
/** Any expression over the table's columns. */
|
|
12
|
+
| "expression"
|
|
13
|
+
/** A database, table, cluster or dictionary name. */
|
|
14
|
+
| "identifier"
|
|
15
|
+
/** A string literal. */
|
|
16
|
+
| "string"
|
|
17
|
+
/** A numeric literal. */
|
|
18
|
+
| "number"
|
|
19
|
+
/** A bare keyword from a fixed set (`values`). */
|
|
20
|
+
| "keyword"
|
|
21
|
+
/** A column type (`Nullable(T)`'s `T`). */
|
|
22
|
+
| "type"
|
|
23
|
+
/** An aggregate function name with its parameters (`AggregateFunction(uniq, UUID)`'s `uniq`). */
|
|
24
|
+
| "function"
|
|
25
|
+
/** A codec, as written inside `CODEC(...)`. */
|
|
26
|
+
| "codec";
|
|
27
|
+
|
|
28
|
+
export interface ArgumentOverlay {
|
|
29
|
+
kind: ArgumentKind;
|
|
30
|
+
/** Overrides the syntax line's optionality, with `note` saying why. */
|
|
31
|
+
optional?: boolean;
|
|
32
|
+
/** The legal values of a `keyword`. */
|
|
33
|
+
values?: readonly string[];
|
|
34
|
+
/** The inclusive range of a `number`. */
|
|
35
|
+
range?: readonly [number, number];
|
|
36
|
+
/** Where the overlay knows something the syntax line does not. */
|
|
37
|
+
note?: string;
|
|
38
|
+
}
|