@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,68 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { LintContext, LintDiagnostic, LintRule } from "@intentius/chant/lint/rule";
|
|
3
|
+
import { findTemplates } from "./templates";
|
|
4
|
+
|
|
5
|
+
/** The entity's own members: an interpolation of one of them is never a column. */
|
|
6
|
+
const OWN_MEMBERS = new Set(["kind", "lexicon", "entityType", "props", "sqlName", "dependsOn"]);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Identifiers that hold a ClickHouse entity, as far as one file can tell:
|
|
10
|
+
* bound to a sql tag here, or imported from another file of the project.
|
|
11
|
+
*/
|
|
12
|
+
function entityBindings(source: ts.SourceFile, tagged: Set<ts.Node>): Set<string> {
|
|
13
|
+
const out = new Set<string>();
|
|
14
|
+
for (const stmt of source.statements) {
|
|
15
|
+
if (ts.isImportDeclaration(stmt) && ts.isStringLiteral(stmt.moduleSpecifier) && stmt.moduleSpecifier.text.startsWith(".")) {
|
|
16
|
+
const named = stmt.importClause?.namedBindings;
|
|
17
|
+
if (named && ts.isNamedImports(named)) for (const el of named.elements) out.add(el.name.text);
|
|
18
|
+
}
|
|
19
|
+
if (ts.isVariableStatement(stmt)) {
|
|
20
|
+
for (const d of stmt.declarationList.declarations) {
|
|
21
|
+
if (ts.isIdentifier(d.name) && d.initializer && tagged.has(d.initializer)) out.add(d.name.text);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* SQLCH003: a column written as `${events.kind}` instead of `${events.columns.kind}`.
|
|
30
|
+
*
|
|
31
|
+
* Columns are reached through `.columns`. `kind`, `lexicon`, `entityType`,
|
|
32
|
+
* `props`, `sqlName` and `dependsOn` are the entity's own fields, so
|
|
33
|
+
* `${events.kind}` is the string `"resource"`, which the tag splices in as SQL
|
|
34
|
+
* text: the statement builds and means something else. This rule flags it for
|
|
35
|
+
* an entity the file declares or imports from another project file.
|
|
36
|
+
*/
|
|
37
|
+
export const sqlch003: LintRule = {
|
|
38
|
+
id: "SQLCH003",
|
|
39
|
+
severity: "error",
|
|
40
|
+
category: "correctness",
|
|
41
|
+
description: "A column interpolated without .columns reads the entity's own field instead",
|
|
42
|
+
|
|
43
|
+
check(context: LintContext): LintDiagnostic[] {
|
|
44
|
+
const source = context.sourceFile;
|
|
45
|
+
const found = findTemplates(source);
|
|
46
|
+
if (found.length === 0) return [];
|
|
47
|
+
const entities = entityBindings(source, new Set(found.map((f) => f.node)));
|
|
48
|
+
const out: LintDiagnostic[] = [];
|
|
49
|
+
for (const f of found) {
|
|
50
|
+
for (const expr of f.expressions) {
|
|
51
|
+
if (!ts.isPropertyAccessExpression(expr) || !ts.isIdentifier(expr.expression)) continue;
|
|
52
|
+
const owner = expr.expression.text;
|
|
53
|
+
const member = expr.name.text;
|
|
54
|
+
if (!entities.has(owner) || !OWN_MEMBERS.has(member)) continue;
|
|
55
|
+
const { line, character } = source.getLineAndCharacterOfPosition(expr.getStart(source));
|
|
56
|
+
out.push({
|
|
57
|
+
ruleId: "SQLCH003",
|
|
58
|
+
severity: "error",
|
|
59
|
+
message: `\${${owner}.${member}} is the entity's own "${member}" field, not a column; write \${${owner}.columns.${member}}`,
|
|
60
|
+
file: context.filePath,
|
|
61
|
+
line: line + 1,
|
|
62
|
+
column: character + 1,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
|
|
2
|
+
import { DATABASE_ENGINES, TABLE_ENGINES, CLICKHOUSE_VERSION } from "../../generated/clickhouse";
|
|
3
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQLCH101: a table, materialized view or database names an engine the pinned
|
|
7
|
+
* ClickHouse server does not have.
|
|
8
|
+
*
|
|
9
|
+
* The engine list is the pinned server's own (`system.table_engines`,
|
|
10
|
+
* `system.database_engines`), so a misspelling (`MergTree`) or an engine a
|
|
11
|
+
* release removed fails here, at build, rather than at `CREATE` against a
|
|
12
|
+
* server.
|
|
13
|
+
*/
|
|
14
|
+
export const sqlch101: PostSynthCheck = {
|
|
15
|
+
id: "SQLCH101",
|
|
16
|
+
description: "A ClickHouse object names an engine the pinned server does not have",
|
|
17
|
+
|
|
18
|
+
check(ctx: PostSynthContext): PostSynthDiagnostic[] {
|
|
19
|
+
const out: PostSynthDiagnostic[] = [];
|
|
20
|
+
for (const obj of clickhouseObjects(ctx)) {
|
|
21
|
+
const engine = obj.engine?.name;
|
|
22
|
+
if (!engine) continue;
|
|
23
|
+
const known = obj.type === "ClickHouse::Database" ? engine in DATABASE_ENGINES : engine in TABLE_ENGINES;
|
|
24
|
+
if (known) continue;
|
|
25
|
+
out.push({
|
|
26
|
+
checkId: "SQLCH101",
|
|
27
|
+
severity: "error",
|
|
28
|
+
message: `${obj.export} (${obj.name}) uses engine "${engine}", which ClickHouse ${CLICKHOUSE_VERSION} does not have`,
|
|
29
|
+
entity: obj.export,
|
|
30
|
+
lexicon: "sql",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { checkOf, isTable, keyElements } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH102: a PRIMARY KEY that is not a prefix of ORDER BY.
|
|
6
|
+
*
|
|
7
|
+
* Doc: https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree
|
|
8
|
+
* ("The primary key must be a prefix of the sorting key"); the server refuses
|
|
9
|
+
* the table at CREATE.
|
|
10
|
+
*/
|
|
11
|
+
export const sqlch102 = checkOf({ id: "SQLCH102", description: "A PRIMARY KEY is not a prefix of ORDER BY" }, (ctx, report) => {
|
|
12
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
13
|
+
if (!t.primaryKey || !t.orderBy) continue;
|
|
14
|
+
const pk = keyElements(t.primaryKey).map((e) => e.replace(/\s+/g, ""));
|
|
15
|
+
const ob = keyElements(t.orderBy).map((e) => e.replace(/\s+/g, ""));
|
|
16
|
+
if (pk.every((e, i) => ob[i] === e)) continue;
|
|
17
|
+
report({
|
|
18
|
+
severity: "error",
|
|
19
|
+
message: `${t.export} (${t.name}) has PRIMARY KEY ${t.primaryKey}, which is not a prefix of ORDER BY ${t.orderBy}`,
|
|
20
|
+
entity: t.export,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { baseEngineName, checkOf, columnByName, engineArguments, isNullableType, isTable, typeFamily } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
const VERSION_TYPES = new Set(["UInt8", "UInt16", "UInt32", "UInt64", "UInt128", "UInt256", "Date", "DateTime", "DateTime64"]);
|
|
5
|
+
|
|
6
|
+
/** engine -> the argument positions that name a column, and the types the engine accepts there. */
|
|
7
|
+
const SPECIAL: Record<string, Array<{ role: string; index: number; accepts: (family: string) => boolean; wants: string }>> = {
|
|
8
|
+
ReplacingMergeTree: [
|
|
9
|
+
{ role: "version", index: 0, accepts: (f) => VERSION_TYPES.has(f), wants: "UInt*, Date, DateTime or DateTime64" },
|
|
10
|
+
{ role: "is_deleted", index: 1, accepts: (f) => f === "UInt8", wants: "UInt8" },
|
|
11
|
+
],
|
|
12
|
+
CollapsingMergeTree: [{ role: "sign", index: 0, accepts: (f) => f === "Int8", wants: "Int8" }],
|
|
13
|
+
VersionedCollapsingMergeTree: [
|
|
14
|
+
{ role: "sign", index: 0, accepts: (f) => f === "Int8", wants: "Int8" },
|
|
15
|
+
{ role: "version", index: 1, accepts: (f) => VERSION_TYPES.has(f), wants: "UInt*, Date, DateTime or DateTime64" },
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* SQLCH103: the version, sign or is_deleted column of a Replacing, Collapsing
|
|
21
|
+
* or VersionedCollapsing table has a type the engine does not accept.
|
|
22
|
+
*
|
|
23
|
+
* Docs: https://clickhouse.com/docs/engines/table-engines/mergetree-family/replacingmergetree
|
|
24
|
+
* (version: UInt*, Date, DateTime or DateTime64; is_deleted: UInt8) and
|
|
25
|
+
* .../collapsingmergetree, .../versionedcollapsingmergetree (sign: Int8).
|
|
26
|
+
*/
|
|
27
|
+
export const sqlch103 = checkOf({ id: "SQLCH103", description: "An engine's version, sign or is_deleted column has an unsupported type" }, (ctx, report) => {
|
|
28
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
29
|
+
if (!t.engine) continue;
|
|
30
|
+
const roles = SPECIAL[baseEngineName(t.engine)];
|
|
31
|
+
if (!roles) continue;
|
|
32
|
+
const args = engineArguments(t.engine);
|
|
33
|
+
for (const r of roles) {
|
|
34
|
+
const arg = args[r.index];
|
|
35
|
+
const col = arg ? columnByName(t, arg.replace(/^`|`$/g, "")) : undefined;
|
|
36
|
+
if (!col?.type) continue;
|
|
37
|
+
if (!isNullableType(col.type) && r.accepts(typeFamily(col.type))) continue;
|
|
38
|
+
report({
|
|
39
|
+
severity: "error",
|
|
40
|
+
message: `${t.export} (${t.name}): ${r.role} column ${col.name} is ${col.type}; ${t.engine.name} takes ${r.wants}`,
|
|
41
|
+
entity: t.export,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { baseEngineName, checkOf, engineArguments, isTable, splitTop } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/** The engine arguments that name columns, by base engine. */
|
|
5
|
+
function columnArguments(engine: string, args: string[]): string[] {
|
|
6
|
+
switch (engine) {
|
|
7
|
+
case "ReplacingMergeTree":
|
|
8
|
+
return args.slice(0, 2);
|
|
9
|
+
case "CollapsingMergeTree":
|
|
10
|
+
return args.slice(0, 1);
|
|
11
|
+
case "VersionedCollapsingMergeTree":
|
|
12
|
+
return args.slice(0, 2);
|
|
13
|
+
case "SummingMergeTree":
|
|
14
|
+
case "CoalescingMergeTree":
|
|
15
|
+
return args.flatMap((a) => splitTop(a.trim().replace(/^\(([\s\S]*)\)$/, "$1")));
|
|
16
|
+
default:
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* SQLCH104: an engine argument names a column the table does not declare.
|
|
23
|
+
*
|
|
24
|
+
* Docs: the engine pages under
|
|
25
|
+
* https://clickhouse.com/docs/engines/table-engines/mergetree-family/ (the
|
|
26
|
+
* sign, version, is_deleted and summed columns are columns of the table).
|
|
27
|
+
*/
|
|
28
|
+
export const sqlch104 = checkOf({ id: "SQLCH104", description: "A MergeTree engine argument names a column the table does not declare" }, (ctx, report) => {
|
|
29
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
30
|
+
if (!t.engine || t.columns.length === 0) continue;
|
|
31
|
+
const declared = new Set(t.columns.map((c) => c.name));
|
|
32
|
+
for (const arg of columnArguments(baseEngineName(t.engine), engineArguments(t.engine))) {
|
|
33
|
+
const name = arg.trim().replace(/^`(.*)`$/, "$1");
|
|
34
|
+
if (!/^[A-Za-z_]\w*$/.test(name) || declared.has(name)) continue;
|
|
35
|
+
report({
|
|
36
|
+
severity: "error",
|
|
37
|
+
message: `${t.export} (${t.name}): ${t.engine.name} names column ${name}, which the table does not declare`,
|
|
38
|
+
entity: t.export,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { bareName, checkOf, isTable, keyElements } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH105: ORDER BY, PRIMARY KEY, PARTITION BY or SAMPLE BY lists a bare
|
|
6
|
+
* column name the table does not declare.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree
|
|
9
|
+
* (the keys are expressions over the table's columns). Only a bare name is
|
|
10
|
+
* judged; an expression is left to the server.
|
|
11
|
+
*/
|
|
12
|
+
export const sqlch105 = checkOf({ id: "SQLCH105", description: "A table key clause names a column the table does not declare" }, (ctx, report) => {
|
|
13
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
14
|
+
if (t.columns.length === 0) continue;
|
|
15
|
+
const declared = new Set(t.columns.map((c) => c.name));
|
|
16
|
+
const clauses: Array<[string, string | undefined]> = [
|
|
17
|
+
["ORDER BY", t.orderBy],
|
|
18
|
+
["PRIMARY KEY", t.primaryKey],
|
|
19
|
+
["PARTITION BY", t.partitionBy],
|
|
20
|
+
["SAMPLE BY", t.sampleBy],
|
|
21
|
+
];
|
|
22
|
+
for (const [clause, expr] of clauses) {
|
|
23
|
+
if (!expr) continue;
|
|
24
|
+
for (const element of keyElements(expr)) {
|
|
25
|
+
const name = bareName(element);
|
|
26
|
+
if (name === undefined || declared.has(name)) continue;
|
|
27
|
+
report({
|
|
28
|
+
severity: "error",
|
|
29
|
+
message: `${t.export} (${t.name}): ${clause} names column ${name}, which the table does not declare`,
|
|
30
|
+
entity: t.export,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { checkOf, isTable, mentionedNames } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH106: a data skipping index expression mentions a column the table does
|
|
6
|
+
* not declare.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/optimize/skipping-indexes (an index is
|
|
9
|
+
* defined over an expression of the table's columns). Projections are not
|
|
10
|
+
* checked: their SELECT is a full query, and reading its column names without a
|
|
11
|
+
* SQL parser would guess.
|
|
12
|
+
*/
|
|
13
|
+
export const sqlch106 = checkOf({ id: "SQLCH106", description: "A skip index expression names a column the table does not declare" }, (ctx, report) => {
|
|
14
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
15
|
+
if (t.columns.length === 0) continue;
|
|
16
|
+
const declared = new Set(t.columns.map((c) => c.name));
|
|
17
|
+
for (const index of t.indexes ?? []) {
|
|
18
|
+
const missing = [...new Set(mentionedNames(index.expr))].filter((n) => !declared.has(n));
|
|
19
|
+
if (missing.length === 0) continue;
|
|
20
|
+
report({
|
|
21
|
+
severity: "error",
|
|
22
|
+
message: `${t.export} (${t.name}): index ${index.name} (${index.expr}) names ${missing.join(", ")}, which the table does not declare`,
|
|
23
|
+
entity: t.export,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { bareName, checkOf, isTable, splitTop, typeFamily } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
const DATE_TYPES = new Set(["Date", "Date32", "DateTime", "DateTime64"]);
|
|
5
|
+
const TTL_ACTION = /\s+(DELETE|TO\s+DISK|TO\s+VOLUME|RECOMPRESS|GROUP\s+BY|WHERE)\b[\s\S]*$/i;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SQLCH107: a TTL expression is a bare column, or a column plus an INTERVAL,
|
|
9
|
+
* and that column is not a Date or DateTime.
|
|
10
|
+
*
|
|
11
|
+
* Doc: https://clickhouse.com/docs/guides/developer/ttl ("The TTL expression
|
|
12
|
+
* must evaluate to Date or DateTime"). Only the two plain forms are judged;
|
|
13
|
+
* a function call is left to the server.
|
|
14
|
+
*/
|
|
15
|
+
export const sqlch107 = checkOf({ id: "SQLCH107", description: "A TTL expression is built on a column that is not a Date or DateTime" }, (ctx, report) => {
|
|
16
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
17
|
+
const ttls: Array<{ where: string; expr: string }> = [];
|
|
18
|
+
if (t.ttl) for (const clause of splitTop(t.ttl)) ttls.push({ where: "table TTL", expr: clause.replace(TTL_ACTION, "") });
|
|
19
|
+
for (const c of t.columns) if (c.ttl) ttls.push({ where: `column ${c.name} TTL`, expr: c.ttl.replace(TTL_ACTION, "") });
|
|
20
|
+
for (const { where, expr } of ttls) {
|
|
21
|
+
const plain = /^\s*(`[^`]+`|[A-Za-z_]\w*)\s*(?:[+-]\s*INTERVAL\b[\s\S]*)?$/i.exec(expr);
|
|
22
|
+
if (!plain) continue;
|
|
23
|
+
const name = bareName(plain[1]!);
|
|
24
|
+
const col = name === undefined ? undefined : t.columns.find((c) => c.name === name);
|
|
25
|
+
if (!col?.type) continue;
|
|
26
|
+
const family = typeFamily(col.type);
|
|
27
|
+
if (DATE_TYPES.has(family)) continue;
|
|
28
|
+
report({
|
|
29
|
+
severity: "error",
|
|
30
|
+
message: `${t.export} (${t.name}): ${where} is built on ${col.name}, which is ${col.type}; a TTL expression must be a Date or DateTime`,
|
|
31
|
+
entity: t.export,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { checkOf, isTable } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH108: CREATE OR REPLACE TABLE in a database whose engine is not Atomic
|
|
6
|
+
* (or Replicated, which is Atomic underneath).
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/sql-reference/statements/create/table
|
|
9
|
+
* ("The REPLACE query is supported only for Atomic and Replicated databases"),
|
|
10
|
+
* and https://clickhouse.com/docs/engines/database-engines/atomic for
|
|
11
|
+
* EXCHANGE TABLES. Judged against a database the same build declares.
|
|
12
|
+
*/
|
|
13
|
+
export const sqlch108 = checkOf({ id: "SQLCH108", description: "CREATE OR REPLACE TABLE in a database that is not Atomic" }, (ctx, report) => {
|
|
14
|
+
const objects = clickhouseObjects(ctx);
|
|
15
|
+
const databases = new Map(objects.filter((o) => o.type === "ClickHouse::Database").map((d) => [d.name, d]));
|
|
16
|
+
for (const t of objects.filter(isTable)) {
|
|
17
|
+
if (!t.orReplace || !t.database) continue;
|
|
18
|
+
const db = databases.get(t.database);
|
|
19
|
+
const engine = db?.engine?.name;
|
|
20
|
+
if (!db || !engine || engine === "Atomic" || engine === "Replicated") continue;
|
|
21
|
+
report({
|
|
22
|
+
severity: "error",
|
|
23
|
+
message: `${t.export} (${t.name}) is CREATE OR REPLACE in database ${t.database}, whose engine is ${engine}; REPLACE needs Atomic or Replicated`,
|
|
24
|
+
entity: t.export,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { checkOf, isMaterializedView } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH109: a materialized view selects `*`.
|
|
6
|
+
*
|
|
7
|
+
* Doc: https://clickhouse.com/docs/materialized-view/incremental-materialized-view
|
|
8
|
+
* (the view's columns come from the SELECT, and a materialized view is a
|
|
9
|
+
* trigger on inserts). A star ties the target's columns to whatever the source
|
|
10
|
+
* has today, so adding a source column changes what the view writes.
|
|
11
|
+
*/
|
|
12
|
+
export const sqlch109 = checkOf({ id: "SQLCH109", description: "A materialized view selects *" }, (ctx, report) => {
|
|
13
|
+
for (const v of clickhouseObjects(ctx).filter(isMaterializedView)) {
|
|
14
|
+
if (!(v.lineage ?? []).some((e) => e.expr === "*" || /\.\*$/.test(e.expr))) continue;
|
|
15
|
+
report({
|
|
16
|
+
severity: "warning",
|
|
17
|
+
message: `${v.export} (${v.name}) selects *; list the columns so a new source column does not change what the view writes`,
|
|
18
|
+
entity: v.export,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { checkOf, isMaterializedView, isTable, resolveObject, type TableObject } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH110: a materialized view writes an output column its TO target table
|
|
6
|
+
* does not declare.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/sql-reference/statements/create/view
|
|
9
|
+
* (a materialized view with TO inserts the SELECT's result into the target;
|
|
10
|
+
* columns are matched by name, so a column the target lacks is not stored).
|
|
11
|
+
* Judged only against a target the same build declares, and only when the
|
|
12
|
+
* SELECT lists its columns.
|
|
13
|
+
*/
|
|
14
|
+
export const sqlch110 = checkOf({ id: "SQLCH110", description: "A materialized view writes a column its TO target does not declare" }, (ctx, report) => {
|
|
15
|
+
for (const v of clickhouseObjects(ctx).filter(isMaterializedView)) {
|
|
16
|
+
if (!v.to || (v.lineage ?? []).some((e) => e.expr === "*" || /\.\*$/.test(e.expr))) continue;
|
|
17
|
+
const target = resolveObject(ctx, v.to);
|
|
18
|
+
if (!target || !isTable(target) || (target as TableObject).columns.length === 0) continue;
|
|
19
|
+
const declared = new Set((target as TableObject).columns.map((c) => c.name));
|
|
20
|
+
const outputs = v.columns.length > 0 ? v.columns.map((c) => c.name) : v.lineage.map((e) => e.output);
|
|
21
|
+
const dropped = outputs.filter((n) => !declared.has(n));
|
|
22
|
+
if (dropped.length === 0) continue;
|
|
23
|
+
report({
|
|
24
|
+
severity: "warning",
|
|
25
|
+
message: `${v.export} (${v.name}) selects ${dropped.join(", ")}, which ${target.name} does not declare; ClickHouse matches by name, so the value is not stored`,
|
|
26
|
+
entity: v.export,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { checkOf, isTable, splitTop } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
const MAX_VALUES = 100;
|
|
5
|
+
|
|
6
|
+
/** The literals a CHECK constrains `column` to, for `col IN (...)` and `col = 'a' OR col = 'b'`. */
|
|
7
|
+
function allowedValues(expr: string): { column: string; count: number } | undefined {
|
|
8
|
+
const inList = /^\(?\s*(`[^`]+`|[A-Za-z_]\w*)\s+IN\s*\(([\s\S]*)\)\s*\)?$/i.exec(expr.trim());
|
|
9
|
+
if (inList) return { column: inList[1]!.replace(/`/g, ""), count: splitTop(inList[2]!).length };
|
|
10
|
+
const ors = expr.split(/\s+OR\s+/i);
|
|
11
|
+
const eq = ors.map((p) => /^\(?\s*(`[^`]+`|[A-Za-z_]\w*)\s*=\s*'(?:[^'\\]|\\.)*'\s*\)?$/.exec(p.trim()));
|
|
12
|
+
if (ors.length > 1 && eq.every((m) => m && m[1] === eq[0]![1])) return { column: eq[0]![1]!.replace(/`/g, ""), count: ors.length };
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* SQLCH111: a String column a CHECK constrains to a small set of values is not
|
|
18
|
+
* LowCardinality.
|
|
19
|
+
*
|
|
20
|
+
* Doc: https://clickhouse.com/docs/sql-reference/data-types/lowcardinality
|
|
21
|
+
* (LowCardinality dictionary-encodes a column and speeds up SELECT for fewer
|
|
22
|
+
* than about 10,000 distinct values) and
|
|
23
|
+
* https://clickhouse.com/docs/best-practices/select-data-types.
|
|
24
|
+
*/
|
|
25
|
+
export const sqlch111 = checkOf({ id: "SQLCH111", description: "A String column limited to a few values is not LowCardinality" }, (ctx, report) => {
|
|
26
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
27
|
+
for (const c of t.constraints ?? []) {
|
|
28
|
+
if (c.kind !== "CHECK") continue;
|
|
29
|
+
const found = allowedValues(c.expr);
|
|
30
|
+
if (!found || found.count > MAX_VALUES) continue;
|
|
31
|
+
const col = t.columns.find((x) => x.name === found.column);
|
|
32
|
+
if (!col?.type || !/^String$/i.test(col.type.trim())) continue;
|
|
33
|
+
report({
|
|
34
|
+
severity: "warning",
|
|
35
|
+
message: `${t.export} (${t.name}): column ${col.name} is String but constraint ${c.name} limits it to ${found.count} values; use LowCardinality(String)`,
|
|
36
|
+
entity: t.export,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { checkOf, isTable, typeFamily } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
const FINE_FUNCTIONS =
|
|
5
|
+
/\b(toStartOfSecond|toStartOfMinute|toStartOfFiveMinutes?|toStartOfTenMinutes|toStartOfFifteenMinutes|toStartOfHour|toRelativeSecondNum|toRelativeMinuteNum|toRelativeHourNum|toUnixTimestamp|toYYYYMMDDhhmmss|toStartOfInterval)\s*\(/;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SQLCH112: a PARTITION BY finer than a day.
|
|
9
|
+
*
|
|
10
|
+
* Doc: https://clickhouse.com/docs/best-practices/choosing-a-partitioning-key
|
|
11
|
+
* and the MergeTree page's note that partitioning is not meant to speed up
|
|
12
|
+
* queries and that "you should not partition by too granular": every
|
|
13
|
+
* partition is a separate set of parts, and the server stops inserts when a
|
|
14
|
+
* table has too many (parts_to_throw_insert). Flags a bare DateTime column and
|
|
15
|
+
* the sub-day truncation functions.
|
|
16
|
+
*/
|
|
17
|
+
export const sqlch112 = checkOf({ id: "SQLCH112", description: "A PARTITION BY expression is finer than a day" }, (ctx, report) => {
|
|
18
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
19
|
+
const expr = t.partitionBy?.trim();
|
|
20
|
+
if (!expr) continue;
|
|
21
|
+
const col = t.columns.find((c) => c.name === expr.replace(/^\(|\)$/g, "").trim());
|
|
22
|
+
const bareDateTime = col?.type && ["DateTime", "DateTime64"].includes(typeFamily(col.type));
|
|
23
|
+
if (!bareDateTime && !FINE_FUNCTIONS.test(expr)) continue;
|
|
24
|
+
report({
|
|
25
|
+
severity: "warning",
|
|
26
|
+
message: `${t.export} (${t.name}) partitions by ${expr}, which makes a partition per second, minute or hour; partition by month or day`,
|
|
27
|
+
entity: t.export,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { checkOf, isMergeTree, isTable } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH113: a MergeTree table with neither ORDER BY nor PRIMARY KEY.
|
|
6
|
+
*
|
|
7
|
+
* Doc: https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree
|
|
8
|
+
* ("ORDER BY: required unless PRIMARY KEY is specified"; write
|
|
9
|
+
* `ORDER BY tuple()` to have none). The server refuses the CREATE.
|
|
10
|
+
*/
|
|
11
|
+
export const sqlch113 = checkOf({ id: "SQLCH113", description: "A MergeTree table declares no sort key" }, (ctx, report) => {
|
|
12
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
13
|
+
if (!isMergeTree(t.engine) || t.orderBy || t.primaryKey) continue;
|
|
14
|
+
report({
|
|
15
|
+
severity: "error",
|
|
16
|
+
message: `${t.export} (${t.name}) uses ${t.engine!.name} with no ORDER BY or PRIMARY KEY; add one, or ORDER BY tuple() for none`,
|
|
17
|
+
entity: t.export,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CODECS } from "../../generated/clickhouse";
|
|
2
|
+
import { checkOf, codecNames, isTable } from "./clickhouse-helpers";
|
|
3
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQLCH114: a column CODEC names a codec the pinned server does not have.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/sql-reference/statements/create/table#column-compression-codecs.
|
|
9
|
+
* The list is the pinned server's own (`system.codecs`).
|
|
10
|
+
*/
|
|
11
|
+
export const sqlch114 = checkOf({ id: "SQLCH114", description: "A column codec is not one the pinned server has" }, (ctx, report) => {
|
|
12
|
+
const known = new Set(Object.keys(CODECS).map((n) => n.toLowerCase()));
|
|
13
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
14
|
+
for (const c of t.columns) {
|
|
15
|
+
if (!c.codec) continue;
|
|
16
|
+
for (const name of codecNames(c.codec)) {
|
|
17
|
+
if (known.has(name.toLowerCase())) continue;
|
|
18
|
+
report({
|
|
19
|
+
severity: "error",
|
|
20
|
+
message: `${t.export} (${t.name}): column ${c.name} uses codec ${name}, which the pinned server does not have`,
|
|
21
|
+
entity: t.export,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CODECS } from "../../generated/clickhouse";
|
|
2
|
+
import { checkOf, codecNames, isTable } from "./clickhouse-helpers";
|
|
3
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
4
|
+
|
|
5
|
+
const SENSITIVE = /(^|_)(password|passwd|pwd|secret|api_?key|access_?key|private_?key|token|ssn|social_?security|credit_?card|card_?number|iban)(_|$)/i;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SQLCH115: a column named like a secret or personal data has no COMMENT, no
|
|
9
|
+
* TTL and no encryption codec.
|
|
10
|
+
*
|
|
11
|
+
* Docs: https://clickhouse.com/docs/sql-reference/statements/create/table
|
|
12
|
+
* (column COMMENT, column TTL, and the AES_128_GCM_SIV / AES_256_GCM_SIV
|
|
13
|
+
* encryption codecs). The marker is the author saying the column was
|
|
14
|
+
* considered: a COMMENT stating what it holds, a TTL that bounds how long it
|
|
15
|
+
* is kept, or a codec that encrypts it. The table's own TTL counts for the
|
|
16
|
+
* whole row.
|
|
17
|
+
*/
|
|
18
|
+
export const sqlch115 = checkOf({ id: "SQLCH115", description: "A secret- or PII-named column carries no comment, TTL or encryption" }, (ctx, report) => {
|
|
19
|
+
const encryption = new Set(Object.entries(CODECS).filter(([, s]) => s.encryption).map(([n]) => n.toLowerCase()));
|
|
20
|
+
for (const t of clickhouseObjects(ctx).filter(isTable)) {
|
|
21
|
+
for (const c of t.columns) {
|
|
22
|
+
if (!SENSITIVE.test(c.name) || c.comment || c.ttl || t.ttl) continue;
|
|
23
|
+
if (c.codec && codecNames(c.codec).some((n) => encryption.has(n.toLowerCase()))) continue;
|
|
24
|
+
report({
|
|
25
|
+
severity: "warning",
|
|
26
|
+
message: `${t.export} (${t.name}): column ${c.name} looks like a secret or personal data; add a COMMENT, a TTL or an encryption codec`,
|
|
27
|
+
entity: t.export,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { checkOf, isAnyView } from "./clickhouse-helpers";
|
|
2
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLCH116: a view declared SQL SECURITY DEFINER without a DEFINER.
|
|
6
|
+
*
|
|
7
|
+
* Doc: https://clickhouse.com/docs/sql-reference/statements/create/view#sql-security
|
|
8
|
+
* (the DEFINER clause names the user whose privileges the view's SELECT runs
|
|
9
|
+
* with). Without it the view's access is decided by whoever happened to run
|
|
10
|
+
* the CREATE, so the same declaration grants different access per environment.
|
|
11
|
+
*/
|
|
12
|
+
export const sqlch116 = checkOf({ id: "SQLCH116", description: "A view is SQL SECURITY DEFINER with no DEFINER" }, (ctx, report) => {
|
|
13
|
+
for (const v of clickhouseObjects(ctx).filter(isAnyView)) {
|
|
14
|
+
const security = v.security ?? "";
|
|
15
|
+
if (!/SQL\s+SECURITY\s+DEFINER/i.test(security) || /\bDEFINER\s*=/i.test(security)) continue;
|
|
16
|
+
report({
|
|
17
|
+
severity: "warning",
|
|
18
|
+
message: `${v.export} (${v.name}) is SQL SECURITY DEFINER with no DEFINER = <user>; name the user whose privileges it runs with`,
|
|
19
|
+
entity: v.export,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MERGE_TREE_SETTINGS } from "../../generated/clickhouse";
|
|
2
|
+
import { checkOf, isMergeTree } from "./clickhouse-helpers";
|
|
3
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQLCH117: a MergeTree SETTINGS entry the pinned server marks obsolete.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/operations/settings/merge-tree-settings.
|
|
9
|
+
* `system.merge_tree_settings` flags it with tier Obsolete; the server accepts
|
|
10
|
+
* it and ignores it, so the table does not behave as the setting suggests.
|
|
11
|
+
*/
|
|
12
|
+
export const sqlch117 = checkOf({ id: "SQLCH117", description: "A MergeTree setting is obsolete at the pinned server" }, (ctx, report) => {
|
|
13
|
+
const specs = MERGE_TREE_SETTINGS as Record<string, { obsolete: boolean } | undefined>;
|
|
14
|
+
for (const o of clickhouseObjects(ctx)) {
|
|
15
|
+
if (!isMergeTree(o.engine) && o.type !== "ClickHouse::MaterializedView") continue;
|
|
16
|
+
for (const name of Object.keys((o.settings as Record<string, string> | undefined) ?? {})) {
|
|
17
|
+
if (!specs[name]?.obsolete) continue;
|
|
18
|
+
report({
|
|
19
|
+
severity: "warning",
|
|
20
|
+
message: `${o.export} (${o.name}) sets ${name}, which is obsolete and does nothing at ClickHouse 26.8; remove it`,
|
|
21
|
+
entity: o.export,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MERGE_TREE_SETTINGS } from "../../generated/clickhouse";
|
|
2
|
+
import { checkOf, isMergeTree } from "./clickhouse-helpers";
|
|
3
|
+
import { clickhouseObjects } from "./sql-helpers";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQLCH118: a MergeTree SETTINGS entry the pinned server does not have.
|
|
7
|
+
*
|
|
8
|
+
* Doc: https://clickhouse.com/docs/operations/settings/merge-tree-settings.
|
|
9
|
+
* The list is the pinned server's `system.merge_tree_settings`; an unknown
|
|
10
|
+
* name (usually a typo, or a setting a later release added) fails the CREATE
|
|
11
|
+
* with "Unknown setting".
|
|
12
|
+
*/
|
|
13
|
+
export const sqlch118 = checkOf({ id: "SQLCH118", description: "A MergeTree setting is not one the pinned server has" }, (ctx, report) => {
|
|
14
|
+
const known = MERGE_TREE_SETTINGS as Record<string, unknown>;
|
|
15
|
+
for (const o of clickhouseObjects(ctx)) {
|
|
16
|
+
if (o.type !== "ClickHouse::Table" || !isMergeTree(o.engine)) continue;
|
|
17
|
+
for (const name of Object.keys((o.settings as Record<string, string> | undefined) ?? {})) {
|
|
18
|
+
if (name in known) continue;
|
|
19
|
+
report({
|
|
20
|
+
severity: "error",
|
|
21
|
+
message: `${o.export} (${o.name}) sets ${name}, which ClickHouse 26.8 does not have as a MergeTree setting`,
|
|
22
|
+
entity: o.export,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|