@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.
Files changed (936) hide show
  1. package/README.md +39 -2
  2. package/dist/clickhouse/apply/apply.d.ts +82 -0
  3. package/dist/clickhouse/apply/apply.d.ts.map +1 -0
  4. package/dist/clickhouse/apply/mutations.d.ts +46 -0
  5. package/dist/clickhouse/apply/mutations.d.ts.map +1 -0
  6. package/dist/clickhouse/apply/statements.d.ts +99 -0
  7. package/dist/clickhouse/apply/statements.d.ts.map +1 -0
  8. package/dist/clickhouse/catalog-types.d.ts +76 -0
  9. package/dist/clickhouse/catalog-types.d.ts.map +1 -0
  10. package/dist/clickhouse/container.d.ts +63 -0
  11. package/dist/clickhouse/container.d.ts.map +1 -0
  12. package/dist/clickhouse/engine-syntax.d.ts +43 -0
  13. package/dist/clickhouse/engine-syntax.d.ts.map +1 -0
  14. package/dist/clickhouse/entities.d.ts +183 -0
  15. package/dist/clickhouse/entities.d.ts.map +1 -0
  16. package/dist/clickhouse/http.d.ts +40 -0
  17. package/dist/clickhouse/http.d.ts.map +1 -0
  18. package/dist/clickhouse/import/generator.d.ts +16 -0
  19. package/dist/clickhouse/import/generator.d.ts.map +1 -0
  20. package/dist/clickhouse/import/ir.d.ts +52 -0
  21. package/dist/clickhouse/import/ir.d.ts.map +1 -0
  22. package/dist/clickhouse/import/live-export.d.ts +28 -0
  23. package/dist/clickhouse/import/live-export.d.ts.map +1 -0
  24. package/dist/clickhouse/import/parser.d.ts +10 -0
  25. package/dist/clickhouse/import/parser.d.ts.map +1 -0
  26. package/dist/clickhouse/live/bind.d.ts +56 -0
  27. package/dist/clickhouse/live/bind.d.ts.map +1 -0
  28. package/dist/clickhouse/live/catalog.d.ts +39 -0
  29. package/dist/clickhouse/live/catalog.d.ts.map +1 -0
  30. package/dist/clickhouse/live/describe-resources.d.ts +34 -0
  31. package/dist/clickhouse/live/describe-resources.d.ts.map +1 -0
  32. package/dist/clickhouse/overlays/codecs.d.ts +28 -0
  33. package/dist/clickhouse/overlays/codecs.d.ts.map +1 -0
  34. package/dist/clickhouse/overlays/engines.d.ts +20 -0
  35. package/dist/clickhouse/overlays/engines.d.ts.map +1 -0
  36. package/dist/clickhouse/overlays/kinds.d.ts +38 -0
  37. package/dist/clickhouse/overlays/kinds.d.ts.map +1 -0
  38. package/dist/clickhouse/overlays/projections.d.ts +27 -0
  39. package/dist/clickhouse/overlays/projections.d.ts.map +1 -0
  40. package/dist/clickhouse/overlays/skip-indexes.d.ts +10 -0
  41. package/dist/clickhouse/overlays/skip-indexes.d.ts.map +1 -0
  42. package/dist/clickhouse/overlays/ttl.d.ts +35 -0
  43. package/dist/clickhouse/overlays/ttl.d.ts.map +1 -0
  44. package/dist/clickhouse/overlays/types.d.ts +21 -0
  45. package/dist/clickhouse/overlays/types.d.ts.map +1 -0
  46. package/dist/clickhouse/ownership.d.ts +71 -0
  47. package/dist/clickhouse/ownership.d.ts.map +1 -0
  48. package/dist/clickhouse/parser.d.ts +130 -0
  49. package/dist/clickhouse/parser.d.ts.map +1 -0
  50. package/dist/clickhouse/plan/commands.d.ts +26 -0
  51. package/dist/clickhouse/plan/commands.d.ts.map +1 -0
  52. package/dist/clickhouse/plan/deep.d.ts +32 -0
  53. package/dist/clickhouse/plan/deep.d.ts.map +1 -0
  54. package/dist/clickhouse/plan/diff.d.ts +37 -0
  55. package/dist/clickhouse/plan/diff.d.ts.map +1 -0
  56. package/dist/clickhouse/plan/disruption.d.ts +17 -0
  57. package/dist/clickhouse/plan/disruption.d.ts.map +1 -0
  58. package/dist/clickhouse/plan/normalize.d.ts +97 -0
  59. package/dist/clickhouse/plan/normalize.d.ts.map +1 -0
  60. package/dist/clickhouse/plan/rebuild-handoff.d.ts +38 -0
  61. package/dist/clickhouse/plan/rebuild-handoff.d.ts.map +1 -0
  62. package/dist/clickhouse/plan/report.d.ts +6 -0
  63. package/dist/clickhouse/plan/report.d.ts.map +1 -0
  64. package/dist/clickhouse/plan/rules.d.ts +60 -0
  65. package/dist/clickhouse/plan/rules.d.ts.map +1 -0
  66. package/dist/clickhouse/plan/schema.d.ts +23 -0
  67. package/dist/clickhouse/plan/schema.d.ts.map +1 -0
  68. package/dist/clickhouse/plan/server-format.d.ts +12 -0
  69. package/dist/clickhouse/plan/server-format.d.ts.map +1 -0
  70. package/dist/clickhouse/rebuild/backfill.d.ts +70 -0
  71. package/dist/clickhouse/rebuild/backfill.d.ts.map +1 -0
  72. package/dist/clickhouse/rebuild/observe.d.ts +157 -0
  73. package/dist/clickhouse/rebuild/observe.d.ts.map +1 -0
  74. package/dist/clickhouse/rebuild/op.d.ts +108 -0
  75. package/dist/clickhouse/rebuild/op.d.ts.map +1 -0
  76. package/dist/clickhouse/rebuild/partitions.d.ts +24 -0
  77. package/dist/clickhouse/rebuild/partitions.d.ts.map +1 -0
  78. package/dist/clickhouse/rebuild/receipts.d.ts +76 -0
  79. package/dist/clickhouse/rebuild/receipts.d.ts.map +1 -0
  80. package/dist/clickhouse/rebuild/replicas.d.ts +78 -0
  81. package/dist/clickhouse/rebuild/replicas.d.ts.map +1 -0
  82. package/dist/clickhouse/rebuild/steps.d.ts +151 -0
  83. package/dist/clickhouse/rebuild/steps.d.ts.map +1 -0
  84. package/dist/clickhouse/rebuild/verify.d.ts +51 -0
  85. package/dist/clickhouse/rebuild/verify.d.ts.map +1 -0
  86. package/dist/clickhouse/testing/fake-server.d.ts +27 -0
  87. package/dist/clickhouse/testing/fake-server.d.ts.map +1 -0
  88. package/dist/clickhouse/testing/roundtrip-schema.d.ts +3 -0
  89. package/dist/clickhouse/testing/roundtrip-schema.d.ts.map +1 -0
  90. package/dist/clickhouse/testing/writable-server.d.ts +35 -0
  91. package/dist/clickhouse/testing/writable-server.d.ts.map +1 -0
  92. package/dist/clickhouse/tokens.d.ts +15 -0
  93. package/dist/clickhouse/tokens.d.ts.map +1 -0
  94. package/dist/clickhouse.d.ts +24 -0
  95. package/dist/clickhouse.d.ts.map +1 -0
  96. package/dist/codegen/classifier-page.d.ts +6 -0
  97. package/dist/codegen/classifier-page.d.ts.map +1 -0
  98. package/dist/codegen/clickhouse-module.d.ts +23 -0
  99. package/dist/codegen/clickhouse-module.d.ts.map +1 -0
  100. package/dist/codegen/docs-cli.d.ts +3 -0
  101. package/dist/codegen/docs-cli.d.ts.map +1 -0
  102. package/dist/codegen/docs.d.ts +8 -0
  103. package/dist/codegen/docs.d.ts.map +1 -0
  104. package/dist/codegen/generate-cli.d.ts +3 -0
  105. package/dist/codegen/generate-cli.d.ts.map +1 -0
  106. package/dist/codegen/generate.d.ts +40 -0
  107. package/dist/codegen/generate.d.ts.map +1 -0
  108. package/dist/codegen/package.d.ts +7 -0
  109. package/dist/codegen/package.d.ts.map +1 -0
  110. package/dist/codegen/postgres-classifier-page.d.ts +7 -0
  111. package/dist/codegen/postgres-classifier-page.d.ts.map +1 -0
  112. package/dist/codegen/postgres-module.d.ts +30 -0
  113. package/dist/codegen/postgres-module.d.ts.map +1 -0
  114. package/dist/codegen/registry.d.ts +12 -0
  115. package/dist/codegen/registry.d.ts.map +1 -0
  116. package/dist/composites/audit-log-table.d.ts +31 -0
  117. package/dist/composites/audit-log-table.d.ts.map +1 -0
  118. package/dist/composites/catalog.d.ts +3 -0
  119. package/dist/composites/catalog.d.ts.map +1 -0
  120. package/dist/composites/cdc-mirror.d.ts +32 -0
  121. package/dist/composites/cdc-mirror.d.ts.map +1 -0
  122. package/dist/composites/clickhouse.d.ts +7 -0
  123. package/dist/composites/clickhouse.d.ts.map +1 -0
  124. package/dist/composites/events-table.d.ts +32 -0
  125. package/dist/composites/events-table.d.ts.map +1 -0
  126. package/dist/composites/index.d.ts +9 -0
  127. package/dist/composites/index.d.ts.map +1 -0
  128. package/dist/composites/join-table.d.ts +41 -0
  129. package/dist/composites/join-table.d.ts.map +1 -0
  130. package/dist/composites/postgres.d.ts +7 -0
  131. package/dist/composites/postgres.d.ts.map +1 -0
  132. package/dist/composites/refreshed-view.d.ts +32 -0
  133. package/dist/composites/refreshed-view.d.ts.map +1 -0
  134. package/dist/composites/replacing-table.d.ts +34 -0
  135. package/dist/composites/replacing-table.d.ts.map +1 -0
  136. package/dist/composites/rollup-view.d.ts +39 -0
  137. package/dist/composites/rollup-view.d.ts.map +1 -0
  138. package/dist/composites/sharded-table.d.ts +35 -0
  139. package/dist/composites/sharded-table.d.ts.map +1 -0
  140. package/dist/composites/soft-delete-table.d.ts +40 -0
  141. package/dist/composites/soft-delete-table.d.ts.map +1 -0
  142. package/dist/composites/tenant-table.d.ts +34 -0
  143. package/dist/composites/tenant-table.d.ts.map +1 -0
  144. package/dist/config.d.ts +213 -0
  145. package/dist/config.d.ts.map +1 -0
  146. package/dist/core/apply.d.ts +89 -0
  147. package/dist/core/apply.d.ts.map +1 -0
  148. package/dist/core/classifier.d.ts +88 -0
  149. package/dist/core/classifier.d.ts.map +1 -0
  150. package/dist/core/container.d.ts +45 -0
  151. package/dist/core/container.d.ts.map +1 -0
  152. package/dist/core/cursor.d.ts +67 -0
  153. package/dist/core/cursor.d.ts.map +1 -0
  154. package/dist/core/diff.d.ts +49 -0
  155. package/dist/core/diff.d.ts.map +1 -0
  156. package/dist/core/entity.d.ts +41 -0
  157. package/dist/core/entity.d.ts.map +1 -0
  158. package/dist/core/find-templates.d.ts +69 -0
  159. package/dist/core/find-templates.d.ts.map +1 -0
  160. package/dist/core/handoff.d.ts +36 -0
  161. package/dist/core/handoff.d.ts.map +1 -0
  162. package/dist/core/index.d.ts +61 -0
  163. package/dist/core/index.d.ts.map +1 -0
  164. package/dist/core/interpolation.d.ts +88 -0
  165. package/dist/core/interpolation.d.ts.map +1 -0
  166. package/dist/core/normalize.d.ts +18 -0
  167. package/dist/core/normalize.d.ts.map +1 -0
  168. package/dist/core/ownership.d.ts +60 -0
  169. package/dist/core/ownership.d.ts.map +1 -0
  170. package/dist/core/receipts.d.ts +28 -0
  171. package/dist/core/receipts.d.ts.map +1 -0
  172. package/dist/core/references.d.ts +37 -0
  173. package/dist/core/references.d.ts.map +1 -0
  174. package/dist/core/template.d.ts +41 -0
  175. package/dist/core/template.d.ts.map +1 -0
  176. package/dist/core/testing/http-stub.d.ts +17 -0
  177. package/dist/core/testing/http-stub.d.ts.map +1 -0
  178. package/dist/core/tokens.d.ts +102 -0
  179. package/dist/core/tokens.d.ts.map +1 -0
  180. package/dist/coverage.d.ts +25 -0
  181. package/dist/coverage.d.ts.map +1 -0
  182. package/dist/detect.d.ts +15 -0
  183. package/dist/detect.d.ts.map +1 -0
  184. package/dist/dialects.d.ts +20 -0
  185. package/dist/dialects.d.ts.map +1 -0
  186. package/dist/generated/clickhouse-types.d.ts +4380 -0
  187. package/dist/generated/clickhouse-types.d.ts.map +1 -0
  188. package/dist/generated/clickhouse.d.ts +11 -0
  189. package/dist/generated/clickhouse.d.ts.map +1 -0
  190. package/dist/generated/postgres-types.d.ts +1579 -0
  191. package/dist/generated/postgres-types.d.ts.map +1 -0
  192. package/dist/generated/postgres.d.ts +9 -0
  193. package/dist/generated/postgres.d.ts.map +1 -0
  194. package/dist/import-generator.d.ts +8 -0
  195. package/dist/import-generator.d.ts.map +1 -0
  196. package/dist/index.d.ts +7 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/init-templates.d.ts +20 -0
  199. package/dist/init-templates.d.ts.map +1 -0
  200. package/dist/integrity.json +61 -0
  201. package/dist/lint/audit-catalog.d.ts +10 -0
  202. package/dist/lint/audit-catalog.d.ts.map +1 -0
  203. package/dist/lint/audit-lineage.d.ts +25 -0
  204. package/dist/lint/audit-lineage.d.ts.map +1 -0
  205. package/dist/lint/post-synth/audit-entries.d.ts +8 -0
  206. package/dist/lint/post-synth/audit-entries.d.ts.map +1 -0
  207. package/dist/lint/post-synth/clickhouse-helpers.d.ts +85 -0
  208. package/dist/lint/post-synth/clickhouse-helpers.d.ts.map +1 -0
  209. package/dist/lint/post-synth/index.d.ts +3 -0
  210. package/dist/lint/post-synth/index.d.ts.map +1 -0
  211. package/dist/lint/post-synth/postgres-audit-entries.d.ts +9 -0
  212. package/dist/lint/post-synth/postgres-audit-entries.d.ts.map +1 -0
  213. package/dist/lint/post-synth/postgres-helpers.d.ts +89 -0
  214. package/dist/lint/post-synth/postgres-helpers.d.ts.map +1 -0
  215. package/dist/lint/post-synth/sql-helpers.d.ts +27 -0
  216. package/dist/lint/post-synth/sql-helpers.d.ts.map +1 -0
  217. package/dist/lint/post-synth/sqlch101.d.ts +12 -0
  218. package/dist/lint/post-synth/sqlch101.d.ts.map +1 -0
  219. package/dist/lint/post-synth/sqlch102.d.ts +9 -0
  220. package/dist/lint/post-synth/sqlch102.d.ts.map +1 -0
  221. package/dist/lint/post-synth/sqlch103.d.ts +10 -0
  222. package/dist/lint/post-synth/sqlch103.d.ts.map +1 -0
  223. package/dist/lint/post-synth/sqlch104.d.ts +9 -0
  224. package/dist/lint/post-synth/sqlch104.d.ts.map +1 -0
  225. package/dist/lint/post-synth/sqlch105.d.ts +10 -0
  226. package/dist/lint/post-synth/sqlch105.d.ts.map +1 -0
  227. package/dist/lint/post-synth/sqlch106.d.ts +11 -0
  228. package/dist/lint/post-synth/sqlch106.d.ts.map +1 -0
  229. package/dist/lint/post-synth/sqlch107.d.ts +10 -0
  230. package/dist/lint/post-synth/sqlch107.d.ts.map +1 -0
  231. package/dist/lint/post-synth/sqlch108.d.ts +11 -0
  232. package/dist/lint/post-synth/sqlch108.d.ts.map +1 -0
  233. package/dist/lint/post-synth/sqlch109.d.ts +10 -0
  234. package/dist/lint/post-synth/sqlch109.d.ts.map +1 -0
  235. package/dist/lint/post-synth/sqlch110.d.ts +12 -0
  236. package/dist/lint/post-synth/sqlch110.d.ts.map +1 -0
  237. package/dist/lint/post-synth/sqlch111.d.ts +11 -0
  238. package/dist/lint/post-synth/sqlch111.d.ts.map +1 -0
  239. package/dist/lint/post-synth/sqlch112.d.ts +12 -0
  240. package/dist/lint/post-synth/sqlch112.d.ts.map +1 -0
  241. package/dist/lint/post-synth/sqlch113.d.ts +9 -0
  242. package/dist/lint/post-synth/sqlch113.d.ts.map +1 -0
  243. package/dist/lint/post-synth/sqlch114.d.ts +8 -0
  244. package/dist/lint/post-synth/sqlch114.d.ts.map +1 -0
  245. package/dist/lint/post-synth/sqlch115.d.ts +13 -0
  246. package/dist/lint/post-synth/sqlch115.d.ts.map +1 -0
  247. package/dist/lint/post-synth/sqlch116.d.ts +10 -0
  248. package/dist/lint/post-synth/sqlch116.d.ts.map +1 -0
  249. package/dist/lint/post-synth/sqlch117.d.ts +9 -0
  250. package/dist/lint/post-synth/sqlch117.d.ts.map +1 -0
  251. package/dist/lint/post-synth/sqlch118.d.ts +10 -0
  252. package/dist/lint/post-synth/sqlch118.d.ts.map +1 -0
  253. package/dist/lint/post-synth/sqlch119.d.ts +11 -0
  254. package/dist/lint/post-synth/sqlch119.d.ts.map +1 -0
  255. package/dist/lint/post-synth/sqlch120.d.ts +10 -0
  256. package/dist/lint/post-synth/sqlch120.d.ts.map +1 -0
  257. package/dist/lint/post-synth/sqlpg101.d.ts +12 -0
  258. package/dist/lint/post-synth/sqlpg101.d.ts.map +1 -0
  259. package/dist/lint/post-synth/sqlpg102.d.ts +11 -0
  260. package/dist/lint/post-synth/sqlpg102.d.ts.map +1 -0
  261. package/dist/lint/post-synth/sqlpg103.d.ts +11 -0
  262. package/dist/lint/post-synth/sqlpg103.d.ts.map +1 -0
  263. package/dist/lint/post-synth/sqlpg104.d.ts +10 -0
  264. package/dist/lint/post-synth/sqlpg104.d.ts.map +1 -0
  265. package/dist/lint/post-synth/sqlpg105.d.ts +10 -0
  266. package/dist/lint/post-synth/sqlpg105.d.ts.map +1 -0
  267. package/dist/lint/post-synth/sqlpg106.d.ts +9 -0
  268. package/dist/lint/post-synth/sqlpg106.d.ts.map +1 -0
  269. package/dist/lint/post-synth/sqlpg107.d.ts +10 -0
  270. package/dist/lint/post-synth/sqlpg107.d.ts.map +1 -0
  271. package/dist/lint/post-synth/sqlpg108.d.ts +11 -0
  272. package/dist/lint/post-synth/sqlpg108.d.ts.map +1 -0
  273. package/dist/lint/post-synth/sqlpg109.d.ts +11 -0
  274. package/dist/lint/post-synth/sqlpg109.d.ts.map +1 -0
  275. package/dist/lint/post-synth/sqlpg110.d.ts +12 -0
  276. package/dist/lint/post-synth/sqlpg110.d.ts.map +1 -0
  277. package/dist/lint/post-synth/sqlpg111.d.ts +10 -0
  278. package/dist/lint/post-synth/sqlpg111.d.ts.map +1 -0
  279. package/dist/lint/post-synth/sqlpg112.d.ts +10 -0
  280. package/dist/lint/post-synth/sqlpg112.d.ts.map +1 -0
  281. package/dist/lint/post-synth/sqlpg113.d.ts +11 -0
  282. package/dist/lint/post-synth/sqlpg113.d.ts.map +1 -0
  283. package/dist/lint/post-synth/sqlpg114.d.ts +13 -0
  284. package/dist/lint/post-synth/sqlpg114.d.ts.map +1 -0
  285. package/dist/lint/post-synth/sqlpg115.d.ts +13 -0
  286. package/dist/lint/post-synth/sqlpg115.d.ts.map +1 -0
  287. package/dist/lint/post-synth/sqlpg116.d.ts +11 -0
  288. package/dist/lint/post-synth/sqlpg116.d.ts.map +1 -0
  289. package/dist/lint/post-synth/sqlpg117.d.ts +12 -0
  290. package/dist/lint/post-synth/sqlpg117.d.ts.map +1 -0
  291. package/dist/lint/post-synth/sqlpg118.d.ts +12 -0
  292. package/dist/lint/post-synth/sqlpg118.d.ts.map +1 -0
  293. package/dist/lint/rules/index.d.ts +12 -0
  294. package/dist/lint/rules/index.d.ts.map +1 -0
  295. package/dist/lint/rules/postgres-templates.d.ts +18 -0
  296. package/dist/lint/rules/postgres-templates.d.ts.map +1 -0
  297. package/dist/lint/rules/sqlch001.d.ts +12 -0
  298. package/dist/lint/rules/sqlch001.d.ts.map +1 -0
  299. package/dist/lint/rules/sqlch002.d.ts +11 -0
  300. package/dist/lint/rules/sqlch002.d.ts.map +1 -0
  301. package/dist/lint/rules/sqlch003.d.ts +12 -0
  302. package/dist/lint/rules/sqlch003.d.ts.map +1 -0
  303. package/dist/lint/rules/sqlpg001.d.ts +16 -0
  304. package/dist/lint/rules/sqlpg001.d.ts.map +1 -0
  305. package/dist/lint/rules/sqlpg002.d.ts +12 -0
  306. package/dist/lint/rules/sqlpg002.d.ts.map +1 -0
  307. package/dist/lint/rules/sqlpg003.d.ts +16 -0
  308. package/dist/lint/rules/sqlpg003.d.ts.map +1 -0
  309. package/dist/lint/rules/sqlpg004.d.ts +21 -0
  310. package/dist/lint/rules/sqlpg004.d.ts.map +1 -0
  311. package/dist/lint/rules/templates.d.ts +23 -0
  312. package/dist/lint/rules/templates.d.ts.map +1 -0
  313. package/dist/live-dialect.d.ts +25 -0
  314. package/dist/live-dialect.d.ts.map +1 -0
  315. package/dist/lsp/catalog.d.ts +22 -0
  316. package/dist/lsp/catalog.d.ts.map +1 -0
  317. package/dist/lsp/completions.d.ts +13 -0
  318. package/dist/lsp/completions.d.ts.map +1 -0
  319. package/dist/lsp/hover.d.ts +12 -0
  320. package/dist/lsp/hover.d.ts.map +1 -0
  321. package/dist/lsp/postgres-catalog.d.ts +85 -0
  322. package/dist/lsp/postgres-catalog.d.ts.map +1 -0
  323. package/dist/lsp/postgres-template.d.ts +35 -0
  324. package/dist/lsp/postgres-template.d.ts.map +1 -0
  325. package/dist/lsp/postgres.d.ts +20 -0
  326. package/dist/lsp/postgres.d.ts.map +1 -0
  327. package/dist/lsp/refs.d.ts +8 -0
  328. package/dist/lsp/refs.d.ts.map +1 -0
  329. package/dist/lsp/registry.d.ts +4 -0
  330. package/dist/lsp/registry.d.ts.map +1 -0
  331. package/dist/lsp/template.d.ts +34 -0
  332. package/dist/lsp/template.d.ts.map +1 -0
  333. package/dist/manifest.json +8 -0
  334. package/dist/mcp/index.d.ts +13 -0
  335. package/dist/mcp/index.d.ts.map +1 -0
  336. package/dist/mcp/postgres.d.ts +32 -0
  337. package/dist/mcp/postgres.d.ts.map +1 -0
  338. package/dist/meta.json +67 -0
  339. package/dist/okf/index.md +67 -0
  340. package/dist/okf/rules/SQLCH001.md +11 -0
  341. package/dist/okf/rules/SQLCH002.md +11 -0
  342. package/dist/okf/rules/SQLCH003.md +11 -0
  343. package/dist/okf/rules/SQLCH101.md +15 -0
  344. package/dist/okf/rules/SQLCH102.md +11 -0
  345. package/dist/okf/rules/SQLCH103.md +11 -0
  346. package/dist/okf/rules/SQLCH104.md +11 -0
  347. package/dist/okf/rules/SQLCH105.md +11 -0
  348. package/dist/okf/rules/SQLCH106.md +11 -0
  349. package/dist/okf/rules/SQLCH107.md +11 -0
  350. package/dist/okf/rules/SQLCH108.md +15 -0
  351. package/dist/okf/rules/SQLCH109.md +11 -0
  352. package/dist/okf/rules/SQLCH110.md +11 -0
  353. package/dist/okf/rules/SQLCH111.md +11 -0
  354. package/dist/okf/rules/SQLCH112.md +11 -0
  355. package/dist/okf/rules/SQLCH113.md +11 -0
  356. package/dist/okf/rules/SQLCH114.md +11 -0
  357. package/dist/okf/rules/SQLCH115.md +11 -0
  358. package/dist/okf/rules/SQLCH116.md +11 -0
  359. package/dist/okf/rules/SQLCH117.md +15 -0
  360. package/dist/okf/rules/SQLCH118.md +15 -0
  361. package/dist/okf/rules/SQLCH119.md +15 -0
  362. package/dist/okf/rules/SQLCH120.md +15 -0
  363. package/dist/okf/rules/SQLPG001.md +11 -0
  364. package/dist/okf/rules/SQLPG002.md +11 -0
  365. package/dist/okf/rules/SQLPG003.md +11 -0
  366. package/dist/okf/rules/SQLPG004.md +11 -0
  367. package/dist/okf/rules/SQLPG101.md +11 -0
  368. package/dist/okf/rules/SQLPG102.md +11 -0
  369. package/dist/okf/rules/SQLPG103.md +11 -0
  370. package/dist/okf/rules/SQLPG104.md +11 -0
  371. package/dist/okf/rules/SQLPG105.md +11 -0
  372. package/dist/okf/rules/SQLPG106.md +11 -0
  373. package/dist/okf/rules/SQLPG107.md +11 -0
  374. package/dist/okf/rules/SQLPG108.md +11 -0
  375. package/dist/okf/rules/SQLPG109.md +11 -0
  376. package/dist/okf/rules/SQLPG110.md +11 -0
  377. package/dist/okf/rules/SQLPG111.md +11 -0
  378. package/dist/okf/rules/SQLPG112.md +11 -0
  379. package/dist/okf/rules/SQLPG113.md +24 -0
  380. package/dist/okf/rules/SQLPG114.md +11 -0
  381. package/dist/okf/rules/SQLPG115.md +11 -0
  382. package/dist/okf/rules/SQLPG116.md +15 -0
  383. package/dist/okf/rules/SQLPG117.md +11 -0
  384. package/dist/okf/rules/SQLPG118.md +11 -0
  385. package/dist/okf/types/Database.md +15 -0
  386. package/dist/okf/types/MaterializedView.md +14 -0
  387. package/dist/okf/types/PostgresDomain.md +13 -0
  388. package/dist/okf/types/PostgresEnum.md +13 -0
  389. package/dist/okf/types/PostgresExtension.md +13 -0
  390. package/dist/okf/types/PostgresIndex.md +9 -0
  391. package/dist/okf/types/PostgresMaterializedView.md +13 -0
  392. package/dist/okf/types/PostgresSchema.md +13 -0
  393. package/dist/okf/types/PostgresSequence.md +13 -0
  394. package/dist/okf/types/PostgresTable.md +13 -0
  395. package/dist/okf/types/PostgresView.md +13 -0
  396. package/dist/okf/types/Table.md +15 -0
  397. package/dist/okf/types/View.md +13 -0
  398. package/dist/op/activities/clickhouse-apply.d.ts +56 -0
  399. package/dist/op/activities/clickhouse-apply.d.ts.map +1 -0
  400. package/dist/op/activities/clickhouse-emulator.d.ts +26 -0
  401. package/dist/op/activities/clickhouse-emulator.d.ts.map +1 -0
  402. package/dist/op/activities/clickhouse-rebuild.d.ts +43 -0
  403. package/dist/op/activities/clickhouse-rebuild.d.ts.map +1 -0
  404. package/dist/op/activities/index.d.ts +19 -0
  405. package/dist/op/activities/index.d.ts.map +1 -0
  406. package/dist/op/activities/postgres-apply.d.ts +69 -0
  407. package/dist/op/activities/postgres-apply.d.ts.map +1 -0
  408. package/dist/op/activities/postgres-emulator.d.ts +33 -0
  409. package/dist/op/activities/postgres-emulator.d.ts.map +1 -0
  410. package/dist/op/activities/postgres-migration.d.ts +48 -0
  411. package/dist/op/activities/postgres-migration.d.ts.map +1 -0
  412. package/dist/op/activity-contracts.d.ts +464 -0
  413. package/dist/op/activity-contracts.d.ts.map +1 -0
  414. package/dist/package-cli.d.ts +3 -0
  415. package/dist/package-cli.d.ts.map +1 -0
  416. package/dist/plugin.d.ts +12 -0
  417. package/dist/plugin.d.ts.map +1 -0
  418. package/dist/postgres/apply/apply.d.ts +163 -0
  419. package/dist/postgres/apply/apply.d.ts.map +1 -0
  420. package/dist/postgres/apply/statements.d.ts +138 -0
  421. package/dist/postgres/apply/statements.d.ts.map +1 -0
  422. package/dist/postgres/catalog-types.d.ts +50 -0
  423. package/dist/postgres/catalog-types.d.ts.map +1 -0
  424. package/dist/postgres/container.d.ts +23 -0
  425. package/dist/postgres/container.d.ts.map +1 -0
  426. package/dist/postgres/entities.d.ts +322 -0
  427. package/dist/postgres/entities.d.ts.map +1 -0
  428. package/dist/postgres/entity-types.d.ts +17 -0
  429. package/dist/postgres/entity-types.d.ts.map +1 -0
  430. package/dist/postgres/import/generator.d.ts +28 -0
  431. package/dist/postgres/import/generator.d.ts.map +1 -0
  432. package/dist/postgres/import/ir.d.ts +24 -0
  433. package/dist/postgres/import/ir.d.ts.map +1 -0
  434. package/dist/postgres/import/live-export.d.ts +26 -0
  435. package/dist/postgres/import/live-export.d.ts.map +1 -0
  436. package/dist/postgres/keywords.d.ts +22 -0
  437. package/dist/postgres/keywords.d.ts.map +1 -0
  438. package/dist/postgres/live/bind.d.ts +76 -0
  439. package/dist/postgres/live/bind.d.ts.map +1 -0
  440. package/dist/postgres/live/catalog.d.ts +98 -0
  441. package/dist/postgres/live/catalog.d.ts.map +1 -0
  442. package/dist/postgres/live/client.d.ts +32 -0
  443. package/dist/postgres/live/client.d.ts.map +1 -0
  444. package/dist/postgres/live/describe-resources.d.ts +41 -0
  445. package/dist/postgres/live/describe-resources.d.ts.map +1 -0
  446. package/dist/postgres/migrate/backfill.d.ts +103 -0
  447. package/dist/postgres/migrate/backfill.d.ts.map +1 -0
  448. package/dist/postgres/migrate/batches.d.ts +90 -0
  449. package/dist/postgres/migrate/batches.d.ts.map +1 -0
  450. package/dist/postgres/migrate/carry.d.ts +196 -0
  451. package/dist/postgres/migrate/carry.d.ts.map +1 -0
  452. package/dist/postgres/migrate/handoff.d.ts +46 -0
  453. package/dist/postgres/migrate/handoff.d.ts.map +1 -0
  454. package/dist/postgres/migrate/names.d.ts +55 -0
  455. package/dist/postgres/migrate/names.d.ts.map +1 -0
  456. package/dist/postgres/migrate/observe.d.ts +139 -0
  457. package/dist/postgres/migrate/observe.d.ts.map +1 -0
  458. package/dist/postgres/migrate/op.d.ts +128 -0
  459. package/dist/postgres/migrate/op.d.ts.map +1 -0
  460. package/dist/postgres/migrate/receipts.d.ts +63 -0
  461. package/dist/postgres/migrate/receipts.d.ts.map +1 -0
  462. package/dist/postgres/migrate/replication.d.ts +80 -0
  463. package/dist/postgres/migrate/replication.d.ts.map +1 -0
  464. package/dist/postgres/migrate/steps.d.ts +225 -0
  465. package/dist/postgres/migrate/steps.d.ts.map +1 -0
  466. package/dist/postgres/overlays/columns.d.ts +6 -0
  467. package/dist/postgres/overlays/columns.d.ts.map +1 -0
  468. package/dist/postgres/overlays/constraints.d.ts +8 -0
  469. package/dist/postgres/overlays/constraints.d.ts.map +1 -0
  470. package/dist/postgres/overlays/indexes.d.ts +8 -0
  471. package/dist/postgres/overlays/indexes.d.ts.map +1 -0
  472. package/dist/postgres/overlays/kinds.d.ts +48 -0
  473. package/dist/postgres/overlays/kinds.d.ts.map +1 -0
  474. package/dist/postgres/overlays/partitioning.d.ts +5 -0
  475. package/dist/postgres/overlays/partitioning.d.ts.map +1 -0
  476. package/dist/postgres/overlays/relations.d.ts +6 -0
  477. package/dist/postgres/overlays/relations.d.ts.map +1 -0
  478. package/dist/postgres/overlays/storage.d.ts +28 -0
  479. package/dist/postgres/overlays/storage.d.ts.map +1 -0
  480. package/dist/postgres/overlays/type-ddl.d.ts +7 -0
  481. package/dist/postgres/overlays/type-ddl.d.ts.map +1 -0
  482. package/dist/postgres/overlays/types.d.ts +24 -0
  483. package/dist/postgres/overlays/types.d.ts.map +1 -0
  484. package/dist/postgres/parser.d.ts +216 -0
  485. package/dist/postgres/parser.d.ts.map +1 -0
  486. package/dist/postgres/plan/commands.d.ts +61 -0
  487. package/dist/postgres/plan/commands.d.ts.map +1 -0
  488. package/dist/postgres/plan/deep.d.ts +33 -0
  489. package/dist/postgres/plan/deep.d.ts.map +1 -0
  490. package/dist/postgres/plan/diff.d.ts +45 -0
  491. package/dist/postgres/plan/diff.d.ts.map +1 -0
  492. package/dist/postgres/plan/disruption.d.ts +14 -0
  493. package/dist/postgres/plan/disruption.d.ts.map +1 -0
  494. package/dist/postgres/plan/normalize.d.ts +108 -0
  495. package/dist/postgres/plan/normalize.d.ts.map +1 -0
  496. package/dist/postgres/plan/report.d.ts +6 -0
  497. package/dist/postgres/plan/report.d.ts.map +1 -0
  498. package/dist/postgres/plan/rules.d.ts +84 -0
  499. package/dist/postgres/plan/rules.d.ts.map +1 -0
  500. package/dist/postgres/plan/schema.d.ts +50 -0
  501. package/dist/postgres/plan/schema.d.ts.map +1 -0
  502. package/dist/postgres/plan/server-normalize.d.ts +26 -0
  503. package/dist/postgres/plan/server-normalize.d.ts.map +1 -0
  504. package/dist/postgres/providers/aurora.d.ts +12 -0
  505. package/dist/postgres/providers/aurora.d.ts.map +1 -0
  506. package/dist/postgres/providers/azure.d.ts +14 -0
  507. package/dist/postgres/providers/azure.d.ts.map +1 -0
  508. package/dist/postgres/providers/cloud-sql.d.ts +11 -0
  509. package/dist/postgres/providers/cloud-sql.d.ts.map +1 -0
  510. package/dist/postgres/providers/index.d.ts +35 -0
  511. package/dist/postgres/providers/index.d.ts.map +1 -0
  512. package/dist/postgres/providers/neon.d.ts +13 -0
  513. package/dist/postgres/providers/neon.d.ts.map +1 -0
  514. package/dist/postgres/providers/rds.d.ts +10 -0
  515. package/dist/postgres/providers/rds.d.ts.map +1 -0
  516. package/dist/postgres/providers/supabase.d.ts +12 -0
  517. package/dist/postgres/providers/supabase.d.ts.map +1 -0
  518. package/dist/postgres/providers/types.d.ts +59 -0
  519. package/dist/postgres/providers/types.d.ts.map +1 -0
  520. package/dist/postgres/testing/fake-client.d.ts +38 -0
  521. package/dist/postgres/testing/fake-client.d.ts.map +1 -0
  522. package/dist/postgres/testing/migration.d.ts +25 -0
  523. package/dist/postgres/testing/migration.d.ts.map +1 -0
  524. package/dist/postgres/testing/roundtrip-schema.d.ts +11 -0
  525. package/dist/postgres/testing/roundtrip-schema.d.ts.map +1 -0
  526. package/dist/postgres/testing/server.d.ts +17 -0
  527. package/dist/postgres/testing/server.d.ts.map +1 -0
  528. package/dist/postgres/testing/writable-server.d.ts +45 -0
  529. package/dist/postgres/testing/writable-server.d.ts.map +1 -0
  530. package/dist/postgres/tokens.d.ts +26 -0
  531. package/dist/postgres/tokens.d.ts.map +1 -0
  532. package/dist/postgres.d.ts +13 -0
  533. package/dist/postgres.d.ts.map +1 -0
  534. package/dist/rules/audit-entries.ts +29 -0
  535. package/dist/rules/clickhouse-helpers.ts +206 -0
  536. package/dist/rules/postgres-audit-entries.ts +29 -0
  537. package/dist/rules/postgres-helpers.ts +126 -0
  538. package/dist/rules/postgres-templates.ts +36 -0
  539. package/dist/rules/sql-helpers.ts +53 -0
  540. package/dist/rules/sqlch001.ts +53 -0
  541. package/dist/rules/sqlch002.ts +115 -0
  542. package/dist/rules/sqlch003.ts +68 -0
  543. package/dist/rules/sqlch101.ts +35 -0
  544. package/dist/rules/sqlch102.ts +23 -0
  545. package/dist/rules/sqlch103.ts +45 -0
  546. package/dist/rules/sqlch104.ts +42 -0
  547. package/dist/rules/sqlch105.ts +35 -0
  548. package/dist/rules/sqlch106.ts +27 -0
  549. package/dist/rules/sqlch107.ts +35 -0
  550. package/dist/rules/sqlch108.ts +27 -0
  551. package/dist/rules/sqlch109.ts +21 -0
  552. package/dist/rules/sqlch110.ts +29 -0
  553. package/dist/rules/sqlch111.ts +40 -0
  554. package/dist/rules/sqlch112.ts +30 -0
  555. package/dist/rules/sqlch113.ts +20 -0
  556. package/dist/rules/sqlch114.ts +26 -0
  557. package/dist/rules/sqlch115.ts +31 -0
  558. package/dist/rules/sqlch116.ts +22 -0
  559. package/dist/rules/sqlch117.ts +25 -0
  560. package/dist/rules/sqlch118.ts +26 -0
  561. package/dist/rules/sqlch119.ts +31 -0
  562. package/dist/rules/sqlch120.ts +21 -0
  563. package/dist/rules/sqlpg001.ts +88 -0
  564. package/dist/rules/sqlpg002.ts +68 -0
  565. package/dist/rules/sqlpg003.ts +59 -0
  566. package/dist/rules/sqlpg004.ts +73 -0
  567. package/dist/rules/sqlpg101.ts +24 -0
  568. package/dist/rules/sqlpg102.ts +30 -0
  569. package/dist/rules/sqlpg103.ts +23 -0
  570. package/dist/rules/sqlpg104.ts +23 -0
  571. package/dist/rules/sqlpg105.ts +22 -0
  572. package/dist/rules/sqlpg106.ts +22 -0
  573. package/dist/rules/sqlpg107.ts +22 -0
  574. package/dist/rules/sqlpg108.ts +27 -0
  575. package/dist/rules/sqlpg109.ts +37 -0
  576. package/dist/rules/sqlpg110.ts +33 -0
  577. package/dist/rules/sqlpg111.ts +23 -0
  578. package/dist/rules/sqlpg112.ts +25 -0
  579. package/dist/rules/sqlpg113.ts +28 -0
  580. package/dist/rules/sqlpg114.ts +37 -0
  581. package/dist/rules/sqlpg115.ts +38 -0
  582. package/dist/rules/sqlpg116.ts +25 -0
  583. package/dist/rules/sqlpg117.ts +24 -0
  584. package/dist/rules/sqlpg118.ts +22 -0
  585. package/dist/rules/templates.ts +35 -0
  586. package/dist/serializer.d.ts +37 -0
  587. package/dist/serializer.d.ts.map +1 -0
  588. package/dist/skill-defs.d.ts +3 -0
  589. package/dist/skill-defs.d.ts.map +1 -0
  590. package/dist/spec/catalog.d.ts +125 -0
  591. package/dist/spec/catalog.d.ts.map +1 -0
  592. package/dist/spec/fetch.d.ts +43 -0
  593. package/dist/spec/fetch.d.ts.map +1 -0
  594. package/dist/spec/pin.d.ts +39 -0
  595. package/dist/spec/pin.d.ts.map +1 -0
  596. package/dist/spec/postgres-catalog.d.ts +108 -0
  597. package/dist/spec/postgres-catalog.d.ts.map +1 -0
  598. package/dist/spec/postgres-fetch.d.ts +46 -0
  599. package/dist/spec/postgres-fetch.d.ts.map +1 -0
  600. package/dist/spec/postgres-pin.d.ts +67 -0
  601. package/dist/spec/postgres-pin.d.ts.map +1 -0
  602. package/dist/types/index.d.ts +4386 -0
  603. package/dist/validate-cli.d.ts +3 -0
  604. package/dist/validate-cli.d.ts.map +1 -0
  605. package/dist/validate.d.ts +15 -0
  606. package/dist/validate.d.ts.map +1 -0
  607. package/package.json +74 -4
  608. package/src/clickhouse/apply/apply.ts +288 -0
  609. package/src/clickhouse/apply/mutations.ts +90 -0
  610. package/src/clickhouse/apply/statements.ts +393 -0
  611. package/src/clickhouse/catalog-types.ts +84 -0
  612. package/src/clickhouse/container.ts +176 -0
  613. package/src/clickhouse/engine-syntax.test.ts +53 -0
  614. package/src/clickhouse/engine-syntax.ts +173 -0
  615. package/src/clickhouse/entities.test.ts +188 -0
  616. package/src/clickhouse/entities.ts +425 -0
  617. package/src/clickhouse/http.ts +76 -0
  618. package/src/clickhouse/import/generator.ts +153 -0
  619. package/src/clickhouse/import/import.test.ts +157 -0
  620. package/src/clickhouse/import/ir.ts +171 -0
  621. package/src/clickhouse/import/live-export.ts +53 -0
  622. package/src/clickhouse/import/parser.ts +27 -0
  623. package/src/clickhouse/import/roundtrip.test.ts +90 -0
  624. package/src/clickhouse/live/bind.ts +126 -0
  625. package/src/clickhouse/live/catalog.ts +96 -0
  626. package/src/clickhouse/live/describe-resources.ts +98 -0
  627. package/src/clickhouse/live/live.test.ts +143 -0
  628. package/src/clickhouse/live/roundtrip.e2e.test.ts +93 -0
  629. package/src/clickhouse/overlays/codecs.ts +68 -0
  630. package/src/clickhouse/overlays/engines.ts +108 -0
  631. package/src/clickhouse/overlays/kinds.ts +38 -0
  632. package/src/clickhouse/overlays/projections.ts +36 -0
  633. package/src/clickhouse/overlays/skip-indexes.ts +44 -0
  634. package/src/clickhouse/overlays/ttl.ts +55 -0
  635. package/src/clickhouse/overlays/types.ts +58 -0
  636. package/src/clickhouse/ownership.test.ts +20 -0
  637. package/src/clickhouse/ownership.ts +103 -0
  638. package/src/clickhouse/parser.test.ts +166 -0
  639. package/src/clickhouse/parser.ts +459 -0
  640. package/src/clickhouse/plan/commands.ts +101 -0
  641. package/src/clickhouse/plan/deep.ts +124 -0
  642. package/src/clickhouse/plan/diff.ts +203 -0
  643. package/src/clickhouse/plan/disruption.ts +61 -0
  644. package/src/clickhouse/plan/normalize.ts +352 -0
  645. package/src/clickhouse/plan/plan-wiring.test.ts +77 -0
  646. package/src/clickhouse/plan/plan.e2e.test.ts +77 -0
  647. package/src/clickhouse/plan/plan.test.ts +201 -0
  648. package/src/clickhouse/plan/rebuild-handoff.ts +59 -0
  649. package/src/clickhouse/plan/report.ts +19 -0
  650. package/src/clickhouse/plan/rules.ts +241 -0
  651. package/src/clickhouse/plan/schema.ts +56 -0
  652. package/src/clickhouse/plan/server-format.ts +39 -0
  653. package/src/clickhouse/rebuild/backfill.ts +186 -0
  654. package/src/clickhouse/rebuild/observe.ts +380 -0
  655. package/src/clickhouse/rebuild/op.ts +206 -0
  656. package/src/clickhouse/rebuild/partitions.ts +62 -0
  657. package/src/clickhouse/rebuild/rebuild-replicated.e2e.test.ts +513 -0
  658. package/src/clickhouse/rebuild/rebuild.e2e.test.ts +351 -0
  659. package/src/clickhouse/rebuild/rebuild.test.ts +190 -0
  660. package/src/clickhouse/rebuild/receipts.ts +143 -0
  661. package/src/clickhouse/rebuild/replicas.test.ts +70 -0
  662. package/src/clickhouse/rebuild/replicas.ts +148 -0
  663. package/src/clickhouse/rebuild/steps.ts +382 -0
  664. package/src/clickhouse/rebuild/verify.ts +124 -0
  665. package/src/clickhouse/testdata/NOTICE +5 -0
  666. package/src/clickhouse/testdata/clickhouse-tests-corpus.json +302 -0
  667. package/src/clickhouse/testing/fake-server.ts +65 -0
  668. package/src/clickhouse/testing/roundtrip-schema.ts +25 -0
  669. package/src/clickhouse/testing/writable-server.ts +141 -0
  670. package/src/clickhouse/tokens.ts +28 -0
  671. package/src/clickhouse.ts +63 -0
  672. package/src/codegen/classifier-page.test.ts +16 -0
  673. package/src/codegen/classifier-page.ts +76 -0
  674. package/src/codegen/clickhouse-module.test.ts +63 -0
  675. package/src/codegen/clickhouse-module.ts +269 -0
  676. package/src/codegen/docs-cli.ts +4 -0
  677. package/src/codegen/docs.ts +225 -0
  678. package/src/codegen/generate-cli.ts +13 -0
  679. package/src/codegen/generate.ts +126 -0
  680. package/src/codegen/package.ts +36 -0
  681. package/src/codegen/postgres-classifier-page.ts +81 -0
  682. package/src/codegen/postgres-module.test.ts +77 -0
  683. package/src/codegen/postgres-module.ts +434 -0
  684. package/src/codegen/registry.ts +36 -0
  685. package/src/composites/audit-log-table.ts +54 -0
  686. package/src/composites/catalog.test.ts +61 -0
  687. package/src/composites/catalog.ts +529 -0
  688. package/src/composites/cdc-mirror.ts +54 -0
  689. package/src/composites/clickhouse.ts +7 -0
  690. package/src/composites/composites.test.ts +758 -0
  691. package/src/composites/events-table.ts +49 -0
  692. package/src/composites/index.ts +9 -0
  693. package/src/composites/join-table.ts +57 -0
  694. package/src/composites/postgres.ts +7 -0
  695. package/src/composites/refreshed-view.ts +46 -0
  696. package/src/composites/replacing-table.ts +49 -0
  697. package/src/composites/rollup-view.ts +55 -0
  698. package/src/composites/sharded-table.ts +49 -0
  699. package/src/composites/soft-delete-table.ts +61 -0
  700. package/src/composites/tenant-table.ts +50 -0
  701. package/src/config.ts +157 -0
  702. package/src/core/apply.ts +153 -0
  703. package/src/core/classifier.ts +186 -0
  704. package/src/core/container.ts +93 -0
  705. package/src/core/core.test.ts +254 -0
  706. package/src/core/cursor.ts +189 -0
  707. package/src/core/diff.ts +72 -0
  708. package/src/core/entity.ts +85 -0
  709. package/src/core/find-templates.ts +158 -0
  710. package/src/core/handoff.ts +44 -0
  711. package/src/core/index.ts +61 -0
  712. package/src/core/interpolation.ts +225 -0
  713. package/src/core/normalize.ts +39 -0
  714. package/src/core/ownership.test.ts +36 -0
  715. package/src/core/ownership.ts +133 -0
  716. package/src/core/receipts.ts +29 -0
  717. package/src/core/references.ts +74 -0
  718. package/src/core/template.ts +83 -0
  719. package/src/core/testing/http-stub.ts +33 -0
  720. package/src/core/tokens.ts +252 -0
  721. package/src/coverage.ts +64 -0
  722. package/src/detect.ts +32 -0
  723. package/src/dialects.ts +21 -0
  724. package/src/generated/clickhouse-types.ts +4386 -0
  725. package/src/generated/clickhouse.ts +2476 -0
  726. package/src/generated/index.d.ts +4386 -0
  727. package/src/generated/lexicon-sql.json +67 -0
  728. package/src/generated/postgres-types.ts +1190 -0
  729. package/src/generated/postgres.ts +1039 -0
  730. package/src/import-generator.ts +18 -0
  731. package/src/index.ts +21 -0
  732. package/src/init-templates.test.ts +108 -0
  733. package/src/init-templates.ts +327 -0
  734. package/src/lint/audit-catalog.ts +73 -0
  735. package/src/lint/audit-lineage.ts +47 -0
  736. package/src/lint/post-synth/audit-entries.ts +29 -0
  737. package/src/lint/post-synth/clickhouse-checks.test.ts +278 -0
  738. package/src/lint/post-synth/clickhouse-helpers.ts +206 -0
  739. package/src/lint/post-synth/index.ts +81 -0
  740. package/src/lint/post-synth/post-synth.test.ts +33 -0
  741. package/src/lint/post-synth/postgres-audit-entries.ts +29 -0
  742. package/src/lint/post-synth/postgres-checks.test.ts +257 -0
  743. package/src/lint/post-synth/postgres-helpers.ts +126 -0
  744. package/src/lint/post-synth/sql-helpers.ts +53 -0
  745. package/src/lint/post-synth/sqlch101.ts +35 -0
  746. package/src/lint/post-synth/sqlch102.ts +23 -0
  747. package/src/lint/post-synth/sqlch103.ts +45 -0
  748. package/src/lint/post-synth/sqlch104.ts +42 -0
  749. package/src/lint/post-synth/sqlch105.ts +35 -0
  750. package/src/lint/post-synth/sqlch106.ts +27 -0
  751. package/src/lint/post-synth/sqlch107.ts +35 -0
  752. package/src/lint/post-synth/sqlch108.ts +27 -0
  753. package/src/lint/post-synth/sqlch109.ts +21 -0
  754. package/src/lint/post-synth/sqlch110.ts +29 -0
  755. package/src/lint/post-synth/sqlch111.ts +40 -0
  756. package/src/lint/post-synth/sqlch112.ts +30 -0
  757. package/src/lint/post-synth/sqlch113.ts +20 -0
  758. package/src/lint/post-synth/sqlch114.ts +26 -0
  759. package/src/lint/post-synth/sqlch115.ts +31 -0
  760. package/src/lint/post-synth/sqlch116.ts +22 -0
  761. package/src/lint/post-synth/sqlch117.ts +25 -0
  762. package/src/lint/post-synth/sqlch118.ts +26 -0
  763. package/src/lint/post-synth/sqlch119.ts +31 -0
  764. package/src/lint/post-synth/sqlch120.ts +21 -0
  765. package/src/lint/post-synth/sqlpg101.ts +24 -0
  766. package/src/lint/post-synth/sqlpg102.ts +30 -0
  767. package/src/lint/post-synth/sqlpg103.ts +23 -0
  768. package/src/lint/post-synth/sqlpg104.ts +23 -0
  769. package/src/lint/post-synth/sqlpg105.ts +22 -0
  770. package/src/lint/post-synth/sqlpg106.ts +22 -0
  771. package/src/lint/post-synth/sqlpg107.ts +22 -0
  772. package/src/lint/post-synth/sqlpg108.ts +27 -0
  773. package/src/lint/post-synth/sqlpg109.ts +37 -0
  774. package/src/lint/post-synth/sqlpg110.ts +33 -0
  775. package/src/lint/post-synth/sqlpg111.ts +23 -0
  776. package/src/lint/post-synth/sqlpg112.ts +25 -0
  777. package/src/lint/post-synth/sqlpg113.ts +28 -0
  778. package/src/lint/post-synth/sqlpg114.ts +37 -0
  779. package/src/lint/post-synth/sqlpg115.ts +38 -0
  780. package/src/lint/post-synth/sqlpg116.ts +25 -0
  781. package/src/lint/post-synth/sqlpg117.ts +24 -0
  782. package/src/lint/post-synth/sqlpg118.ts +22 -0
  783. package/src/lint/rules/index.ts +13 -0
  784. package/src/lint/rules/postgres-templates.ts +36 -0
  785. package/src/lint/rules/rules.test.ts +228 -0
  786. package/src/lint/rules/sqlch001.ts +53 -0
  787. package/src/lint/rules/sqlch002.ts +115 -0
  788. package/src/lint/rules/sqlch003.ts +68 -0
  789. package/src/lint/rules/sqlpg001.ts +88 -0
  790. package/src/lint/rules/sqlpg002.ts +68 -0
  791. package/src/lint/rules/sqlpg003.ts +59 -0
  792. package/src/lint/rules/sqlpg004.ts +73 -0
  793. package/src/lint/rules/templates.ts +35 -0
  794. package/src/live-dialect.ts +37 -0
  795. package/src/lsp/catalog.ts +60 -0
  796. package/src/lsp/completions.test.ts +111 -0
  797. package/src/lsp/completions.ts +128 -0
  798. package/src/lsp/diagnostics.test.ts +26 -0
  799. package/src/lsp/hover.test.ts +90 -0
  800. package/src/lsp/hover.ts +113 -0
  801. package/src/lsp/postgres-catalog.ts +234 -0
  802. package/src/lsp/postgres-template.ts +161 -0
  803. package/src/lsp/postgres.test.ts +150 -0
  804. package/src/lsp/postgres.ts +270 -0
  805. package/src/lsp/refs.ts +53 -0
  806. package/src/lsp/registry.ts +19 -0
  807. package/src/lsp/template.ts +166 -0
  808. package/src/mcp/index.ts +304 -0
  809. package/src/mcp/mcp.test.ts +184 -0
  810. package/src/mcp/postgres.ts +125 -0
  811. package/src/op/activities/clickhouse-apply.e2e.test.ts +150 -0
  812. package/src/op/activities/clickhouse-apply.test.ts +265 -0
  813. package/src/op/activities/clickhouse-apply.ts +113 -0
  814. package/src/op/activities/clickhouse-emulator.test.ts +23 -0
  815. package/src/op/activities/clickhouse-emulator.ts +37 -0
  816. package/src/op/activities/clickhouse-rebuild.ts +136 -0
  817. package/src/op/activities/index.ts +50 -0
  818. package/src/op/activities/postgres-apply.e2e.test.ts +184 -0
  819. package/src/op/activities/postgres-apply.test.ts +304 -0
  820. package/src/op/activities/postgres-apply.ts +170 -0
  821. package/src/op/activities/postgres-emulator.test.ts +26 -0
  822. package/src/op/activities/postgres-emulator.ts +44 -0
  823. package/src/op/activities/postgres-migration.ts +182 -0
  824. package/src/op/activity-contracts.ts +210 -0
  825. package/src/package-cli.ts +17 -0
  826. package/src/plugin.test.ts +74 -0
  827. package/src/plugin.ts +242 -0
  828. package/src/postgres/apply/apply.ts +582 -0
  829. package/src/postgres/apply/statements.test.ts +155 -0
  830. package/src/postgres/apply/statements.ts +603 -0
  831. package/src/postgres/catalog-types.ts +59 -0
  832. package/src/postgres/container.ts +72 -0
  833. package/src/postgres/entities.test.ts +170 -0
  834. package/src/postgres/entities.ts +1016 -0
  835. package/src/postgres/entity-types.ts +18 -0
  836. package/src/postgres/import/generator.ts +176 -0
  837. package/src/postgres/import/import.test.ts +71 -0
  838. package/src/postgres/import/ir.ts +67 -0
  839. package/src/postgres/import/live-export.ts +53 -0
  840. package/src/postgres/import/live-warnings.test.ts +45 -0
  841. package/src/postgres/keywords.ts +40 -0
  842. package/src/postgres/live/bind.ts +146 -0
  843. package/src/postgres/live/catalog.ts +581 -0
  844. package/src/postgres/live/client.ts +84 -0
  845. package/src/postgres/live/describe-resources.ts +111 -0
  846. package/src/postgres/live/live.test.ts +198 -0
  847. package/src/postgres/live/roundtrip.e2e.test.ts +111 -0
  848. package/src/postgres/migrate/backfill.ts +233 -0
  849. package/src/postgres/migrate/batches.e2e.test.ts +163 -0
  850. package/src/postgres/migrate/batches.test.ts +36 -0
  851. package/src/postgres/migrate/batches.ts +159 -0
  852. package/src/postgres/migrate/carry.e2e.test.ts +335 -0
  853. package/src/postgres/migrate/carry.test.ts +103 -0
  854. package/src/postgres/migrate/carry.ts +653 -0
  855. package/src/postgres/migrate/handoff.ts +73 -0
  856. package/src/postgres/migrate/kinds.e2e.test.ts +204 -0
  857. package/src/postgres/migrate/migrate.e2e.test.ts +362 -0
  858. package/src/postgres/migrate/migrate.test.ts +322 -0
  859. package/src/postgres/migrate/names.ts +93 -0
  860. package/src/postgres/migrate/observe.ts +521 -0
  861. package/src/postgres/migrate/op.ts +242 -0
  862. package/src/postgres/migrate/receipts.ts +135 -0
  863. package/src/postgres/migrate/replication.ts +151 -0
  864. package/src/postgres/migrate/steps.ts +657 -0
  865. package/src/postgres/overlays/columns.ts +34 -0
  866. package/src/postgres/overlays/constraints.ts +56 -0
  867. package/src/postgres/overlays/indexes.ts +27 -0
  868. package/src/postgres/overlays/kinds.ts +53 -0
  869. package/src/postgres/overlays/partitioning.ts +26 -0
  870. package/src/postgres/overlays/relations.ts +29 -0
  871. package/src/postgres/overlays/storage.ts +75 -0
  872. package/src/postgres/overlays/type-ddl.ts +38 -0
  873. package/src/postgres/overlays/types.ts +56 -0
  874. package/src/postgres/parser.test.ts +214 -0
  875. package/src/postgres/parser.ts +1062 -0
  876. package/src/postgres/plan/commands.ts +124 -0
  877. package/src/postgres/plan/deep.ts +177 -0
  878. package/src/postgres/plan/diff.ts +323 -0
  879. package/src/postgres/plan/disruption.ts +52 -0
  880. package/src/postgres/plan/normalize.test.ts +148 -0
  881. package/src/postgres/plan/normalize.ts +542 -0
  882. package/src/postgres/plan/plan.e2e.test.ts +117 -0
  883. package/src/postgres/plan/plan.test.ts +244 -0
  884. package/src/postgres/plan/report.ts +24 -0
  885. package/src/postgres/plan/rules.ts +276 -0
  886. package/src/postgres/plan/schema.ts +114 -0
  887. package/src/postgres/plan/server-normalize.ts +123 -0
  888. package/src/postgres/providers/aurora.ts +45 -0
  889. package/src/postgres/providers/azure.ts +54 -0
  890. package/src/postgres/providers/cloud-sql.ts +42 -0
  891. package/src/postgres/providers/index.ts +90 -0
  892. package/src/postgres/providers/neon.ts +45 -0
  893. package/src/postgres/providers/providers.test.ts +136 -0
  894. package/src/postgres/providers/rds.ts +48 -0
  895. package/src/postgres/providers/supabase.ts +46 -0
  896. package/src/postgres/providers/types.ts +70 -0
  897. package/src/postgres/testdata/NOTICE +31 -0
  898. package/src/postgres/testdata/postgres-regress-corpus.json +460 -0
  899. package/src/postgres/testing/fake-client.ts +42 -0
  900. package/src/postgres/testing/migration.ts +52 -0
  901. package/src/postgres/testing/roundtrip-schema.ts +46 -0
  902. package/src/postgres/testing/server.ts +58 -0
  903. package/src/postgres/testing/writable-server.ts +188 -0
  904. package/src/postgres/tokens.ts +46 -0
  905. package/src/postgres.ts +75 -0
  906. package/src/serializer.test.ts +128 -0
  907. package/src/serializer.ts +148 -0
  908. package/src/skill-defs.test.ts +81 -0
  909. package/src/skill-defs.ts +102 -0
  910. package/src/skills/chant-sql-plan.md +123 -0
  911. package/src/skills/chant-sql-postgres-migration.md +126 -0
  912. package/src/skills/chant-sql-postgres-plan.md +194 -0
  913. package/src/skills/chant-sql-postgres.md +165 -0
  914. package/src/skills/chant-sql-rebuild.md +68 -0
  915. package/src/skills/chant-sql.md +123 -0
  916. package/src/spec/catalog.e2e.test.ts +29 -0
  917. package/src/spec/catalog.test.ts +56 -0
  918. package/src/spec/catalog.ts +311 -0
  919. package/src/spec/clickhouse-catalog.snapshot.json +5246 -0
  920. package/src/spec/fetch.test.ts +77 -0
  921. package/src/spec/fetch.ts +112 -0
  922. package/src/spec/pin.ts +47 -0
  923. package/src/spec/postgres-catalog-14.snapshot.json +3494 -0
  924. package/src/spec/postgres-catalog-15.snapshot.json +3529 -0
  925. package/src/spec/postgres-catalog-16.snapshot.json +3597 -0
  926. package/src/spec/postgres-catalog-17.snapshot.json +3656 -0
  927. package/src/spec/postgres-catalog-18.snapshot.json +3747 -0
  928. package/src/spec/postgres-catalog.test.ts +43 -0
  929. package/src/spec/postgres-catalog.ts +301 -0
  930. package/src/spec/postgres-fetch.test.ts +75 -0
  931. package/src/spec/postgres-fetch.ts +112 -0
  932. package/src/spec/postgres-pin.test.ts +64 -0
  933. package/src/spec/postgres-pin.ts +101 -0
  934. package/src/typecheck.test.ts +104 -0
  935. package/src/validate-cli.ts +6 -0
  936. package/src/validate.ts +149 -0
@@ -0,0 +1,257 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { makePostSynthCtx } from "@intentius/chant-test-utils";
3
+ import type { PostSynthCheck } from "@intentius/chant/lint/post-synth";
4
+ import type { SerializerResult } from "@intentius/chant/serializer";
5
+ import { sqlSerializer } from "../../serializer";
6
+ import { table as chTable } from "../../clickhouse/entities";
7
+ import { extension, index, schema, table, view } from "../../postgres/entities";
8
+ import { sqlAuditCatalog } from "../audit-catalog";
9
+ import { postSynthChecks } from "./index";
10
+
11
+ type Entities = Record<string, unknown>;
12
+
13
+ function run(id: string, entities: Entities, major?: number) {
14
+ const check = postSynthChecks.find((c: PostSynthCheck) => c.id === id)!;
15
+ const config = major === undefined ? undefined : { sql: { postgresMajor: major } };
16
+ const out = sqlSerializer.serialize(new Map(Object.entries(entities)) as never, undefined, { config }) as SerializerResult;
17
+ return check.check(makePostSynthCtx("sql", out.primary));
18
+ }
19
+
20
+ const flagged = (id: string, entities: Entities, text: RegExp) => {
21
+ const diags = run(id, entities);
22
+ expect(diags.length).toBeGreaterThan(0);
23
+ expect(diags[0]).toMatchObject({ checkId: id, lexicon: "sql" });
24
+ expect(diags[0]!.message).toMatch(text);
25
+ return diags;
26
+ };
27
+
28
+ const clean = (id: string, entities: Entities) => expect(run(id, entities)).toEqual([]);
29
+
30
+ describe("registration", () => {
31
+ const ids = postSynthChecks.map((c) => c.id).filter((id) => /^SQLPG1\d\d$/.test(id));
32
+ test("at least 15 Postgres post-synth checks, each with an audit entry", () => {
33
+ expect(ids.length).toBeGreaterThanOrEqual(15);
34
+ for (const id of ids) expect(sqlAuditCatalog[id], id).toBeDefined();
35
+ });
36
+ test("the Postgres audit entries cover security, correctness and best practice", () => {
37
+ const cats = new Set(ids.map((id) => sqlAuditCatalog[id]!.category));
38
+ expect(cats).toEqual(new Set(["security", "correctness", "best-practice"]));
39
+ });
40
+ test("lineage credits name registered tools", () => {
41
+ expect(sqlAuditCatalog.SQLPG103!.lineage?.[0]).toMatchObject({ tool: "squawk", rule: "prefer-identity" });
42
+ expect(sqlAuditCatalog.SQLPG105!.lineage?.[0]).toMatchObject({ tool: "strong_migrations" });
43
+ });
44
+ test("a ClickHouse build is not read by the Postgres checks", () => {
45
+ const ch = chTable`CREATE TABLE ch (a UInt8) ENGINE = MergeTree ORDER BY a`;
46
+ for (const id of ids) expect(run(id, { ch }), id).toEqual([]);
47
+ });
48
+ });
49
+
50
+ describe("SQLPG101: no primary key", () => {
51
+ test("flags a table with none", () => {
52
+ flagged("SQLPG101", { t: table`CREATE TABLE t (a int)` }, /no primary key/);
53
+ });
54
+ test("a primary key, or a unique over NOT NULL columns, is clean", () => {
55
+ clean("SQLPG101", {
56
+ a: table`CREATE TABLE a (id int PRIMARY KEY)`,
57
+ b: table`CREATE TABLE b (k int NOT NULL, UNIQUE (k))`,
58
+ });
59
+ });
60
+ });
61
+
62
+ describe("SQLPG102: foreign key without an index", () => {
63
+ test("flags an unindexed referencing column", () => {
64
+ const u = table`CREATE TABLE u (id bigint PRIMARY KEY)`;
65
+ const o = table`CREATE TABLE o (id bigint PRIMARY KEY, uid bigint REFERENCES ${u} (${u.columns.id}))`;
66
+ flagged("SQLPG102", { u, o }, /foreign key on \(uid\)/);
67
+ });
68
+ test("an index leading with the column covers it", () => {
69
+ const u = table`CREATE TABLE u (id bigint PRIMARY KEY)`;
70
+ const o = table`CREATE TABLE o (id bigint PRIMARY KEY, uid bigint REFERENCES ${u} (${u.columns.id}))`;
71
+ const i = index`CREATE INDEX o_uid_idx ON ${o} (${o.columns.uid})`;
72
+ clean("SQLPG102", { u, o, i });
73
+ });
74
+ });
75
+
76
+ describe("SQLPG103: serial", () => {
77
+ test("flags bigserial", () => flagged("SQLPG103", { t: table`CREATE TABLE t (id bigserial PRIMARY KEY)` }, /identity/));
78
+ test("identity is clean", () => clean("SQLPG103", { t: table`CREATE TABLE t (id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY)` }));
79
+ });
80
+
81
+ describe("SQLPG104: timestamp without time zone", () => {
82
+ test("flags timestamp(3)", () => flagged("SQLPG104", { t: table`CREATE TABLE t (at timestamp(3))` }, /timestamptz/));
83
+ test("timestamptz is clean", () => clean("SQLPG104", { t: table`CREATE TABLE t (at timestamptz, b timestamp with time zone)` }));
84
+ });
85
+
86
+ describe("SQLPG105: json", () => {
87
+ test("flags json", () => flagged("SQLPG105", { t: table`CREATE TABLE t (j json)` }, /jsonb/));
88
+ test("jsonb is clean", () => clean("SQLPG105", { t: table`CREATE TABLE t (j jsonb)` }));
89
+ });
90
+
91
+ describe("SQLPG106: char(n)", () => {
92
+ test("flags char(3)", () => flagged("SQLPG106", { t: table`CREATE TABLE t (c char(3))` }, /pads/));
93
+ test("varchar and text are clean", () => clean("SQLPG106", { t: table`CREATE TABLE t (c varchar(3), d text)` }));
94
+ });
95
+
96
+ describe("SQLPG107: money", () => {
97
+ test("flags money", () => flagged("SQLPG107", { t: table`CREATE TABLE t (m money)` }, /lc_monetary/));
98
+ test("numeric is clean", () => clean("SQLPG107", { t: table`CREATE TABLE t (m numeric(12, 2))` }));
99
+ });
100
+
101
+ describe("SQLPG108: habitual varchar limit", () => {
102
+ test("flags varchar(255)", () => flagged("SQLPG108", { t: table`CREATE TABLE t (c varchar(255))` }, /varchar\(255\)/));
103
+ test("a limit that is a rule is clean", () => clean("SQLPG108", { t: table`CREATE TABLE t (c varchar(2), d character varying(37))` }));
104
+ });
105
+
106
+ describe("SQLPG109: duplicate index", () => {
107
+ test("flags an index over a primary key's columns", () => {
108
+ const t = table`CREATE TABLE t (id int PRIMARY KEY, a int)`;
109
+ const i = index`CREATE INDEX t_id_idx ON ${t} (${t.columns.id})`;
110
+ flagged("SQLPG109", { t, i }, /primary key/);
111
+ });
112
+ test("flags two identical indexes", () => {
113
+ const t = table`CREATE TABLE t (id int PRIMARY KEY, a int)`;
114
+ const i = index`CREATE INDEX t_a_1 ON ${t} (${t.columns.a})`;
115
+ const j = index`CREATE INDEX t_a_2 ON ${t} (${t.columns.a})`;
116
+ flagged("SQLPG109", { t, i, j }, /duplicates/);
117
+ });
118
+ test("a partial index on the same column is not a duplicate", () => {
119
+ const t = table`CREATE TABLE t (id int PRIMARY KEY, a int)`;
120
+ const i = index`CREATE INDEX t_a_1 ON ${t} (${t.columns.a})`;
121
+ const j = index`CREATE INDEX t_a_2 ON ${t} (${t.columns.a}) WHERE a > 0`;
122
+ clean("SQLPG109", { t, i, j });
123
+ });
124
+ });
125
+
126
+ describe("SQLPG110: prefix index", () => {
127
+ test("flags an index that is a prefix of another", () => {
128
+ const t = table`CREATE TABLE t (id int PRIMARY KEY, a int, b int)`;
129
+ const i = index`CREATE INDEX t_a ON ${t} (${t.columns.a})`;
130
+ const j = index`CREATE INDEX t_ab ON ${t} (${t.columns.a}, ${t.columns.b})`;
131
+ flagged("SQLPG110", { t, i, j }, /prefix of t_ab/);
132
+ });
133
+ test("a different leading column is clean", () => {
134
+ const t = table`CREATE TABLE t (id int PRIMARY KEY, a int, b int)`;
135
+ const i = index`CREATE INDEX t_b ON ${t} (${t.columns.b})`;
136
+ const j = index`CREATE INDEX t_ab ON ${t} (${t.columns.a}, ${t.columns.b})`;
137
+ clean("SQLPG110", { t, i, j });
138
+ });
139
+ });
140
+
141
+ describe("SQLPG111: materialized view without a unique index", () => {
142
+ test("flags one with none", () => {
143
+ flagged("SQLPG111", { mv: view`CREATE MATERIALIZED VIEW mv AS SELECT 1 AS a` }, /CONCURRENTLY/);
144
+ });
145
+ test("a unique index over columns is clean", () => {
146
+ const mv = view`CREATE MATERIALIZED VIEW mv AS SELECT 1 AS a`;
147
+ const i = index`CREATE UNIQUE INDEX mv_a ON ${mv} (${mv.columns.a})`;
148
+ clean("SQLPG111", { mv, i });
149
+ });
150
+ });
151
+
152
+ describe("SQLPG112: sensitive column without a comment", () => {
153
+ test("flags an email column", () => {
154
+ flagged("SQLPG112", { t: table`CREATE TABLE t (id int PRIMARY KEY, email text)` }, /t\.email/);
155
+ });
156
+ test("a table or column comment is clean", () => {
157
+ clean("SQLPG112", {
158
+ a: table`CREATE TABLE a (email text); COMMENT ON TABLE a IS 'Accounts, emails hashed'`,
159
+ b: table`CREATE TABLE b (email text); COMMENT ON COLUMN b.email IS 'Login address, masked in exports'`,
160
+ c: table`CREATE TABLE c (name text)`,
161
+ });
162
+ });
163
+ });
164
+
165
+ describe("SQLPG113: public schema", () => {
166
+ test("flags an unqualified table when a schema is declared", () => {
167
+ flagged("SQLPG113", { app: schema`CREATE SCHEMA app`, t: table`CREATE TABLE t (id int)` }, /public schema/);
168
+ });
169
+ test("qualified, or no schema declared, is clean", () => {
170
+ const app = schema`CREATE SCHEMA app`;
171
+ clean("SQLPG113", { app, t: table`CREATE TABLE ${app}.t (id int)` });
172
+ clean("SQLPG113", { t: table`CREATE TABLE t (id int)` });
173
+ });
174
+ });
175
+
176
+ describe("SQLPG114: storage parameters", () => {
177
+ test("flags an unknown parameter", () => {
178
+ flagged("SQLPG114", { t: table`CREATE TABLE t (id int) WITH (fillfactr = 70)` }, /not a Postgres 18 storage parameter/);
179
+ });
180
+ test("the message names the target major", () => {
181
+ expect(run("SQLPG114", { t: table`CREATE TABLE t (id int) WITH (fillfactr = 70)` }, 14)[0]!.message).toMatch(/not a Postgres 14 storage parameter/);
182
+ });
183
+ test("flags a parameter for another relation kind", () => {
184
+ const t = table`CREATE TABLE t (id int)`;
185
+ const i = index`CREATE INDEX t_id ON ${t} (${t.columns.id}) WITH (fillfactor = 70, buffering = on)`;
186
+ flagged("SQLPG114", { t, i }, /buffering/);
187
+ });
188
+ test("known parameters are clean", () => {
189
+ const t = table`CREATE TABLE t (id int) WITH (fillfactor = 70, autovacuum_enabled = false)`;
190
+ const i = index`CREATE INDEX t_id ON ${t} (${t.columns.id}) WITH (fillfactor = 80)`;
191
+ clean("SQLPG114", { t, i });
192
+ });
193
+ });
194
+
195
+ describe("SQLPG115: features newer than the target major", () => {
196
+ test("flags a storage parameter newer than 14, NULLS NOT DISTINCT (15) and a virtual column (18)", () => {
197
+ const v = view`CREATE MATERIALIZED VIEW v WITH (autovacuum_vacuum_max_threshold = 10) AS SELECT 1 AS a`;
198
+ const t = table`CREATE TABLE t (a int, b int GENERATED ALWAYS AS (a + 1) VIRTUAL, UNIQUE NULLS NOT DISTINCT (a))`;
199
+ const msgs = run("SQLPG115", { v, t }, 14).map((d) => d.message).join("\n");
200
+ expect(msgs).toMatch(/autovacuum_vacuum_max_threshold.*needs Postgres 18/);
201
+ expect(msgs).toMatch(/virtual generated column b.*Postgres 18/);
202
+ expect(msgs).toMatch(/NULLS NOT DISTINCT.*Postgres 15/);
203
+ });
204
+ test("flags NOT ENFORCED", () => {
205
+ const t = table`CREATE TABLE t (a int, CONSTRAINT pos CHECK (a > 0) NOT ENFORCED)`;
206
+ expect(run("SQLPG115", { t }, 14)[0]!.message).toMatch(/NOT ENFORCED.*Postgres 18; Postgres 14 refuses/);
207
+ });
208
+ test("a project targeting 18 (or with no target) is not flagged for 18 features", () => {
209
+ const v = view`CREATE MATERIALIZED VIEW v WITH (autovacuum_vacuum_max_threshold = 10) AS SELECT 1 AS a`;
210
+ const t = table`CREATE TABLE t (a int, b int GENERATED ALWAYS AS (a + 1) VIRTUAL, UNIQUE NULLS NOT DISTINCT (a), CONSTRAINT pos CHECK (a > 0) NOT ENFORCED)`;
211
+ expect(run("SQLPG115", { v, t }, 18)).toEqual([]);
212
+ expect(run("SQLPG115", { v, t })).toEqual([]);
213
+ });
214
+ test("at 16 only the 17 and 18 features are flagged, not NULLS NOT DISTINCT (15)", () => {
215
+ const t = table`CREATE TABLE t (a int, UNIQUE NULLS NOT DISTINCT (a), CONSTRAINT pos CHECK (a > 0) NOT ENFORCED)`;
216
+ const msgs = run("SQLPG115", { t }, 16).map((d) => d.message).join("\n");
217
+ expect(msgs).toMatch(/NOT ENFORCED/);
218
+ expect(msgs).not.toMatch(/NULLS NOT DISTINCT/);
219
+ });
220
+ test("features every major has are clean", () => {
221
+ clean("SQLPG115", { t: table`CREATE TABLE t (a int, b int GENERATED ALWAYS AS (a + 1) STORED) WITH (fillfactor = 70)` });
222
+ });
223
+ });
224
+
225
+ describe("SQLPG116: removed extension", () => {
226
+ test("flags adminpack, gone after 16", () => {
227
+ flagged("SQLPG116", { e: extension`CREATE EXTENSION adminpack` }, /adminpack.*last in 16/);
228
+ });
229
+ test("a shipped extension is clean", () => clean("SQLPG116", { e: extension`CREATE EXTENSION pg_trgm` }));
230
+ test("an extension dropped after 16 is fine at 14 and 16, flagged at 17 and 18", () => {
231
+ const e = extension`CREATE EXTENSION adminpack`;
232
+ expect(run("SQLPG116", { e }, 14)).toEqual([]);
233
+ expect(run("SQLPG116", { e }, 16)).toEqual([]);
234
+ expect(run("SQLPG116", { e }, 17)[0]!.message).toMatch(/Postgres 17 does not ship/);
235
+ expect(run("SQLPG116", { e }, 18)[0]!.message).toMatch(/Postgres 18 does not ship/);
236
+ });
237
+ });
238
+
239
+ describe("SQLPG117: view without security_invoker", () => {
240
+ test("flags a plain view", () => {
241
+ flagged("SQLPG117", { v: view`CREATE VIEW v AS SELECT 1 AS a` }, /security_invoker/);
242
+ });
243
+ test("security_invoker = true is clean", () => {
244
+ clean("SQLPG117", { v: view`CREATE VIEW v WITH (security_invoker = true) AS SELECT 1 AS a` });
245
+ });
246
+ });
247
+
248
+ describe("SQLPG118: INHERITS", () => {
249
+ test("flags an inheriting table", () => {
250
+ const p = table`CREATE TABLE p (id int)`;
251
+ flagged("SQLPG118", { p, c: table`CREATE TABLE c (x int) INHERITS (${p})` }, /INHERITS/);
252
+ });
253
+ test("a partition is clean", () => {
254
+ const p = table`CREATE TABLE p (id int) PARTITION BY RANGE (id)`;
255
+ clean("SQLPG118", { p, c: table`CREATE TABLE c PARTITION OF ${p} FOR VALUES FROM (1) TO (10)` });
256
+ });
257
+ });
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Reading the Postgres objects in the sql build output for post-synth checks:
3
+ * typed views of the serialized objects and the small scanners the checks
4
+ * share. Expressions are kept as written; the scanners answer narrow questions
5
+ * ("is this a bare column"), not what an expression evaluates to.
6
+ */
7
+
8
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
9
+ import { POSTGRES_MAJORS, VERSION_RANGES } from "../../generated/postgres";
10
+ import type { VersionRange } from "../../postgres/catalog-types";
11
+ import type { ColumnDef, KeyDef } from "../../postgres/entities";
12
+ import { postgresMajorOf, postgresObjects, type OutputObject } from "./sql-helpers";
13
+
14
+ export interface PgTable extends OutputObject {
15
+ sqlName: string;
16
+ like: string[];
17
+ schema?: string;
18
+ comment?: string;
19
+ columns: Array<ColumnDef & { comment?: string }>;
20
+ primaryKey?: KeyDef;
21
+ uniques: KeyDef[];
22
+ checks: Array<{ name?: string; expr: string; notEnforced?: boolean }>;
23
+ foreignKeys: Array<{ name?: string; columns: string[]; refTable: string; refColumns: string[] }>;
24
+ exclusions: unknown[];
25
+ inherits: unknown[];
26
+ partitionOf?: unknown;
27
+ ofType?: unknown;
28
+ persistence?: string;
29
+ with?: string;
30
+ }
31
+
32
+ export interface PgIndex extends OutputObject {
33
+ sqlName: string;
34
+ schema?: string;
35
+ table: string;
36
+ tableName: string;
37
+ unique?: boolean;
38
+ method?: string;
39
+ elements: Array<{ expr: string; column?: string }>;
40
+ include?: string;
41
+ where?: string;
42
+ with?: string;
43
+ }
44
+
45
+ export interface PgView extends OutputObject {
46
+ sqlName: string;
47
+ schema?: string;
48
+ query: string;
49
+ with?: string;
50
+ }
51
+
52
+ export const isTable = (o: OutputObject): o is PgTable => o.type === "Postgres::Table";
53
+ export const isIndex = (o: OutputObject): o is PgIndex => o.type === "Postgres::Index";
54
+ export const isView = (o: OutputObject): o is PgView => o.type === "Postgres::View";
55
+ export const isMaterializedView = (o: OutputObject): o is PgView => o.type === "Postgres::MaterializedView";
56
+
57
+ export const tablesOf = (ctx: PostSynthContext): PgTable[] => postgresObjects(ctx).filter(isTable);
58
+ export const indexesOf = (ctx: PostSynthContext): PgIndex[] => postgresObjects(ctx).filter(isIndex);
59
+
60
+ /** The major the build targets (`postgresMajor` in the output), else the newest pinned. */
61
+ export const targetMajor = (ctx: PostSynthContext): number => postgresMajorOf(ctx, PINNED_MAJOR);
62
+
63
+ /** The newest and oldest majors the lexicon carries a catalog for. */
64
+ export const PINNED_MAJOR: number = POSTGRES_MAJORS[POSTGRES_MAJORS.length - 1]!;
65
+ export const OLDEST_MAJOR: number = POSTGRES_MAJORS[0]!;
66
+
67
+ /** The version range the generated catalog records for `name` in `table`, if it is not in every major. */
68
+ export function rangeOf(table: keyof typeof VERSION_RANGES, name: string): VersionRange | undefined {
69
+ return (VERSION_RANGES[table] as Record<string, VersionRange | undefined>)[name];
70
+ }
71
+
72
+ /** A column type's leading words, lower-cased, without a length or array suffix: `timestamp(3)[]` is `timestamp`. */
73
+ export function baseType(type: string | undefined): string {
74
+ return (type ?? "").toLowerCase().replace(/\[.*$/, "").replace(/\(.*?\)/g, "").replace(/\s+/g, " ").trim();
75
+ }
76
+
77
+ /** The `name = value` pairs of a `(a = 1, b)` storage parameter list, names lower-cased. */
78
+ export function storageParams(text: string | undefined): Map<string, string> {
79
+ const out = new Map<string, string>();
80
+ const inner = (text ?? "").trim().replace(/^\(/, "").replace(/\)$/, "");
81
+ for (const part of inner.split(",")) {
82
+ const [k, ...v] = part.split("=");
83
+ const name = k!.trim().toLowerCase();
84
+ if (name) out.set(name, v.join("=").trim());
85
+ }
86
+ return out;
87
+ }
88
+
89
+ /** The leading bare-column elements of an index, in order; stops at the first expression. */
90
+ export function leadingColumns(index: PgIndex): string[] {
91
+ const out: string[] = [];
92
+ for (const e of index.elements) {
93
+ if (!e.column) break;
94
+ out.push(e.column);
95
+ }
96
+ return out;
97
+ }
98
+
99
+ /** A check over the build's Postgres objects, so each check file holds its rule. */
100
+ export function checkOf(
101
+ meta: { id: string; description: string },
102
+ run: (ctx: PostSynthContext, report: (d: Omit<PostSynthDiagnostic, "checkId" | "lexicon">) => void) => void,
103
+ ): PostSynthCheck {
104
+ return {
105
+ ...meta,
106
+ check(ctx) {
107
+ const out: PostSynthDiagnostic[] = [];
108
+ run(ctx, (d) => out.push({ checkId: meta.id, lexicon: "sql", ...d }));
109
+ return out;
110
+ },
111
+ };
112
+ }
113
+
114
+ /** A table that owns its columns: not a partition, not typed (`OF type`), not temporary. */
115
+ export const ownsColumns = (t: PgTable): boolean => t.partitionOf === undefined && t.ofType === undefined && t.persistence !== "temporary";
116
+
117
+ /** The catalog's relation kind for a storage-parameter list on this object, as `STORAGE_PARAMETERS.targets` spells it. */
118
+ export function storageTarget(o: OutputObject): string | undefined {
119
+ switch (o.type) {
120
+ case "Postgres::Table": return "table";
121
+ case "Postgres::View": return "view";
122
+ case "Postgres::MaterializedView": return "materialized view";
123
+ case "Postgres::Index": return `index:${(o.method as string | undefined) ?? "btree"}`;
124
+ default: return undefined;
125
+ }
126
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Reading the sql lexicon's build output in a post-synth check: the JSON
3
+ * document the serializer writes (`dialect`, `applyOrder`, `objects`).
4
+ */
5
+
6
+ import type { PostSynthContext } from "@intentius/chant/lint/post-synth";
7
+
8
+ export interface OutputObject {
9
+ export: string;
10
+ type: string;
11
+ name: string;
12
+ database?: string;
13
+ engine?: { name: string; args?: string[] };
14
+ [key: string]: unknown;
15
+ }
16
+
17
+ /** Every schema object in the build's sql output, ClickHouse dialect. */
18
+ export function clickhouseObjects(ctx: PostSynthContext): OutputObject[] {
19
+ const out: OutputObject[] = [];
20
+ for (const doc of ctx.docs ?? []) {
21
+ if (doc.error || doc.lexicon !== "sql" || doc.format !== "json") continue;
22
+ const value = doc.value as { dialect?: unknown; objects?: unknown };
23
+ if (value?.dialect !== "clickhouse" || !Array.isArray(value.objects)) continue;
24
+ out.push(...(value.objects as OutputObject[]));
25
+ }
26
+ return out;
27
+ }
28
+
29
+ /** Every schema object in the build's sql output, Postgres dialect. */
30
+ export function postgresObjects(ctx: PostSynthContext): OutputObject[] {
31
+ const out: OutputObject[] = [];
32
+ for (const doc of ctx.docs ?? []) {
33
+ if (doc.error || doc.lexicon !== "sql" || doc.format !== "json") continue;
34
+ const value = doc.value as { dialect?: unknown; objects?: unknown };
35
+ if (value?.dialect !== "postgres" || !Array.isArray(value.objects)) continue;
36
+ out.push(...(value.objects as OutputObject[]));
37
+ }
38
+ return out;
39
+ }
40
+
41
+ /**
42
+ * The Postgres major the build targets, as the serializer recorded it
43
+ * (`sql.postgresMajor`, else the newest pinned major). `fallback` answers for
44
+ * output that carries none.
45
+ */
46
+ export function postgresMajorOf(ctx: PostSynthContext, fallback: number): number {
47
+ for (const doc of ctx.docs ?? []) {
48
+ if (doc.error || doc.lexicon !== "sql" || doc.format !== "json") continue;
49
+ const value = doc.value as { dialect?: unknown; postgresMajor?: unknown };
50
+ if (value?.dialect === "postgres" && typeof value.postgresMajor === "number") return value.postgresMajor;
51
+ }
52
+ return fallback;
53
+ }
@@ -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
+ });