@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,150 @@
1
+ /**
2
+ * The ClickHouse applier against the pinned server (#3208): create, then a
3
+ * column added, a TTL changed, a skip index added and a column type changed
4
+ * as a mutation; a sorting-key change refused as a rebuild; the same build
5
+ * applied twice; a prune that drops an owned table and spares one made by
6
+ * hand.
7
+ *
8
+ * Needs Docker; skips cleanly without it.
9
+ */
10
+
11
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
15
+ import { normalizeApply } from "@intentius/chant/apply";
16
+ import { dockerAvailable, startScratchServer, type ScratchServer } from "../../clickhouse/container";
17
+ import { clickhouseQuery } from "../../clickhouse/http";
18
+ import { clickhouseImage } from "../../spec/pin";
19
+ import { planAgainstServer } from "../../clickhouse/plan/commands";
20
+ import { clickhouseApply, toApplyResult } from "./clickhouse-apply";
21
+
22
+ const enabled = await dockerAvailable();
23
+ let server: ScratchServer | undefined;
24
+ const dir = mkdtempSync(join(tmpdir(), "chant-sql-apply-"));
25
+
26
+ beforeAll(async () => {
27
+ if (!enabled) return;
28
+ server = await startScratchServer(clickhouseImage(), { namePrefix: "chant-sql-apply" });
29
+ }, 600_000);
30
+
31
+ afterAll(async () => {
32
+ await server?.stop();
33
+ rmSync(dir, { recursive: true, force: true });
34
+ });
35
+
36
+ interface Obj {
37
+ export: string;
38
+ type: string;
39
+ ddl: string;
40
+ dependsOn?: string[];
41
+ }
42
+
43
+ let builds = 0;
44
+ function buildFile(objects: Obj[]): string {
45
+ const path = join(dir, `schema-${builds++}.json`);
46
+ writeFileSync(path, JSON.stringify({ dialect: "clickhouse", applyOrder: objects.map((o) => o.export), objects: objects.map((o) => ({ dependsOn: [], ...o })) }));
47
+ return path;
48
+ }
49
+
50
+ const DB: Obj = { export: "shop", type: "ClickHouse::Database", ddl: "CREATE DATABASE shop ENGINE = Atomic COMMENT 'The shop'" };
51
+ const eventsV1: Obj = {
52
+ export: "events",
53
+ type: "ClickHouse::Table",
54
+ dependsOn: ["shop"],
55
+ ddl: `CREATE TABLE shop.events
56
+ (
57
+ ts DateTime,
58
+ user_id UInt64,
59
+ kind String
60
+ )
61
+ ENGINE = MergeTree
62
+ ORDER BY (ts, user_id)
63
+ TTL ts + INTERVAL 180 DAY
64
+ COMMENT 'Raw events'`,
65
+ };
66
+ const eventsV2: Obj = {
67
+ ...eventsV1,
68
+ ddl: `CREATE TABLE shop.events
69
+ (
70
+ ts DateTime,
71
+ user_id UInt64,
72
+ region LowCardinality(String) DEFAULT 'eu',
73
+ kind LowCardinality(String),
74
+ INDEX kind_idx kind TYPE set(100) GRANULARITY 4
75
+ )
76
+ ENGINE = MergeTree
77
+ ORDER BY (ts, user_id)
78
+ TTL ts + INTERVAL 90 DAY
79
+ COMMENT 'Raw events'`,
80
+ };
81
+ const OLD: Obj = { export: "old", type: "ClickHouse::Table", dependsOn: ["shop"], ddl: "CREATE TABLE shop.old_events (id UInt64) ENGINE = MergeTree ORDER BY id" };
82
+ const BY_KIND: Obj = {
83
+ export: "byKind",
84
+ type: "ClickHouse::View",
85
+ dependsOn: ["events"],
86
+ ddl: "CREATE VIEW shop.by_kind AS SELECT kind, count() AS n FROM shop.events GROUP BY kind",
87
+ };
88
+
89
+ const deps = () => ({ config: { ownership: { stack: "e2e", env: "test" } }, env: { CLICKHOUSE_URL: server!.endpoint.url }, log: () => undefined });
90
+ const apply = async (objects: Obj[], prune = false) => normalizeApply(toApplyResult(await clickhouseApply({ buildPath: buildFile(objects), environment: "e2e", prune }, undefined, deps())));
91
+ const q = <T = Record<string, unknown>>(sql: string) => clickhouseQuery<T>(server!.endpoint, sql);
92
+ const showCreate = async (name: string) => (await q<{ statement: string }>(`SHOW CREATE TABLE ${name}`))[0]!.statement;
93
+ const actions = (r: ReturnType<typeof normalizeApply>) => Object.fromEntries(r.applied.map((a) => [a.name, a.action]));
94
+
95
+ describe.skipIf(!enabled)("applying to a clickhouse-server", () => {
96
+ test("an empty server gets the declared objects, each marked", async () => {
97
+ const r = await apply([DB, eventsV1, OLD, BY_KIND]);
98
+ expect(actions(r)).toEqual({ shop: "created", "shop.events": "created", "shop.old_events": "created", "shop.by_kind": "created" });
99
+ expect(r.notAttempted).toEqual([]);
100
+ const comments = await q<{ name: string; comment: string }>("SELECT name, comment FROM system.tables WHERE database = 'shop' ORDER BY name");
101
+ expect(comments).toEqual([
102
+ { name: "by_kind", comment: "[chant managed-by=chant stack=e2e env=test]" },
103
+ { name: "events", comment: "Raw events [chant managed-by=chant stack=e2e env=test]" },
104
+ { name: "old_events", comment: "[chant managed-by=chant stack=e2e env=test]" },
105
+ ]);
106
+ await q("INSERT INTO shop.events SELECT now() - number, number, if(number % 2, 'click', 'view') FROM numbers(10000)");
107
+ // A table nobody declared, made by hand in the same database.
108
+ await q("CREATE TABLE shop.handmade (id UInt64) ENGINE = Log COMMENT 'made by hand'");
109
+ }, 120_000);
110
+
111
+ test("a column added, a TTL changed, a skip index added and a type changed as a mutation", async () => {
112
+ const r = await apply([DB, eventsV2, OLD, BY_KIND]);
113
+ expect(actions(r)).toEqual({ shop: "unchanged", "shop.events": "updated", "shop.old_events": "unchanged", "shop.by_kind": "unchanged" });
114
+ const ddl = await showCreate("shop.events");
115
+ expect(ddl).toContain("`region` LowCardinality(String) DEFAULT 'eu'");
116
+ expect(ddl).toContain("`kind` LowCardinality(String)");
117
+ expect(ddl).toContain("INDEX kind_idx kind TYPE set(100) GRANULARITY 4");
118
+ expect(ddl).toContain("TTL ts + toIntervalDay(90)");
119
+ const pending = await q("SELECT mutation_id FROM system.mutations WHERE database = 'shop' AND NOT is_done");
120
+ expect(pending).toEqual([]);
121
+ const mutations = await q<{ command: string }>("SELECT command FROM system.mutations WHERE database = 'shop' AND table = 'events'");
122
+ expect(mutations.some((m) => /MODIFY COLUMN `kind` LowCardinality\(String\)/.test(m.command))).toBe(true);
123
+ // The server now holds the declaration: a plan finds nothing to change but
124
+ // the table made by hand, which no build declares.
125
+ const plan = await planAgainstServer("e2e", buildFile([DB, eventsV2, OLD, BY_KIND]), { config: {}, env: { CLICKHOUSE_URL: server!.endpoint.url } });
126
+ expect(plan.changes.map((c) => [c.object, c.rule])).toEqual([["shop.handmade", "SQLCH250"]]);
127
+ }, 180_000);
128
+
129
+ test("a sorting-key change is refused as a rebuild and nothing is sent for it", async () => {
130
+ const before = await showCreate("shop.events");
131
+ const rebuilt = { ...eventsV2, ddl: eventsV2.ddl.replace("ORDER BY (ts, user_id)", "ORDER BY (user_id, ts)") };
132
+ const r = await apply([DB, rebuilt, OLD, BY_KIND]);
133
+ expect(r.notAttempted).toHaveLength(1);
134
+ expect(r.notAttempted[0]).toMatchObject({ kind: "ClickHouse::Table", name: "shop.events", reason: "unsupported-kind" });
135
+ expect(r.notAttempted[0]!.detail).toMatch(/SQLCH220.*clickhouse\.com\/docs.*ClickHouseRebuildOp\(\{ table: "shop\.events"/);
136
+ expect(await showCreate("shop.events")).toBe(before);
137
+ }, 120_000);
138
+
139
+ test("the same build applied a second time changes nothing", async () => {
140
+ const r = await apply([DB, eventsV2, OLD, BY_KIND]);
141
+ expect(Object.values(actions(r))).toEqual(["unchanged", "unchanged", "unchanged", "unchanged"]);
142
+ }, 120_000);
143
+
144
+ test("a prune drops the owned table the build no longer declares and spares the one made by hand", async () => {
145
+ const r = await apply([DB, eventsV2, BY_KIND], true);
146
+ expect(r.pruned.map((p) => p.name)).toEqual(["shop.old_events"]);
147
+ const names = (await q<{ name: string }>("SELECT name FROM system.tables WHERE database = 'shop' ORDER BY name")).map((t) => t.name);
148
+ expect(names).toEqual(["by_kind", "events", "handmade"]);
149
+ }, 120_000);
150
+ });
@@ -0,0 +1,265 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterAll, describe, expect, test } from "vitest";
5
+ import { describeApplyConformance } from "@intentius/chant-test-utils";
6
+ import { normalizeApply } from "@intentius/chant/apply";
7
+ import { clickhouseApply, resolveMarker, toApplyResult, type ClickHouseApplyDeps } from "./clickhouse-apply";
8
+ import { writableClickHouse, type StoredObject, type WritableServer } from "../../clickhouse/testing/writable-server";
9
+ import { ClickHouseApplyError } from "../../clickhouse/apply/apply";
10
+
11
+ const dirs: string[] = [];
12
+ const servers: WritableServer[] = [];
13
+ afterAll(async () => {
14
+ for (const d of dirs) rmSync(d, { recursive: true, force: true });
15
+ for (const s of servers) await s.close();
16
+ });
17
+
18
+ interface Obj {
19
+ export: string;
20
+ type: string;
21
+ ddl: string;
22
+ dependsOn?: string[];
23
+ }
24
+
25
+ const DB: Obj = { export: "analytics", type: "ClickHouse::Database", ddl: "CREATE DATABASE analytics ENGINE = Atomic" };
26
+ const EVENTS: Obj = {
27
+ export: "events",
28
+ type: "ClickHouse::Table",
29
+ ddl: "CREATE TABLE analytics.events (ts DateTime, user_id UInt64, kind String) ENGINE = MergeTree ORDER BY (ts, user_id) COMMENT 'Raw events'",
30
+ dependsOn: ["analytics"],
31
+ };
32
+ const BY_KIND: Obj = { export: "byKind", type: "ClickHouse::View", ddl: "CREATE VIEW analytics.by_kind AS SELECT kind, count() AS n FROM analytics.events GROUP BY kind", dependsOn: ["events"] };
33
+
34
+ /** A build output the way `chant build -o dist/schema.json` writes it. */
35
+ function buildOutput(objects: Obj[]): string {
36
+ const dir = mkdtempSync(join(tmpdir(), "chant-clickhouse-apply-"));
37
+ dirs.push(dir);
38
+ const path = join(dir, "schema.json");
39
+ writeFileSync(path, JSON.stringify({ dialect: "clickhouse", applyOrder: objects.map((o) => o.export), objects: objects.map((o) => ({ dependsOn: [], ...o })) }));
40
+ return path;
41
+ }
42
+
43
+ async function server(objects: StoredObject[] = []): Promise<WritableServer> {
44
+ const s = await writableClickHouse(objects);
45
+ servers.push(s);
46
+ return s;
47
+ }
48
+
49
+ const OURS = "[chant managed-by=chant stack=shop env=prod]";
50
+ const deps = (s: WritableServer | undefined, extra: Partial<ClickHouseApplyDeps> = {}): ClickHouseApplyDeps => ({
51
+ config: { ownership: { stack: "shop", env: "prod" } },
52
+ env: s ? { CLICKHOUSE_URL: s.url } : {},
53
+ log: () => undefined,
54
+ ...extra,
55
+ });
56
+
57
+ const run = async (s: WritableServer | undefined, objects: Obj[], args: { prune?: boolean } = {}, extra: Partial<ClickHouseApplyDeps> = {}) =>
58
+ toApplyResult(await clickhouseApply({ buildPath: buildOutput(objects), environment: "test", ...args }, undefined, deps(s, extra)));
59
+
60
+ /** A live object as `SHOW CREATE` prints it, marked or not. */
61
+ function live(database: string | undefined, name: string, statement: string, comment?: string): StoredObject {
62
+ const engine = /^CREATE DATABASE/.test(statement) ? "Atomic" : /^CREATE VIEW/.test(statement) ? "View" : "MergeTree";
63
+ return { ...(database ? { database } : {}), name, engine, statement: comment ? `${statement}\nCOMMENT '${comment}'` : statement, ...(comment ? { comment } : {}) };
64
+ }
65
+ const liveDb = (comment = OURS) => live(undefined, "analytics", "CREATE DATABASE analytics\nENGINE = Atomic", comment);
66
+ const liveEvents = (comment = `Raw events ${OURS}`) =>
67
+ live("analytics", "events", "CREATE TABLE analytics.events\n(\n `ts` DateTime,\n `user_id` UInt64,\n `kind` String\n)\nENGINE = MergeTree\nORDER BY (ts, user_id)\nSETTINGS index_granularity = 8192", comment);
68
+
69
+ describe("creating", () => {
70
+ test("an empty server gets every object, each created with chant's marker in its comment", async () => {
71
+ const s = await server();
72
+ const r = normalizeApply(await run(s, [DB, EVENTS, BY_KIND]));
73
+ expect(r.applied.map((a) => [a.name, a.action])).toEqual([
74
+ ["analytics", "created"],
75
+ ["analytics.events", "created"],
76
+ ["analytics.by_kind", "created"],
77
+ ]);
78
+ expect(s.writes[0]).toBe(`CREATE DATABASE analytics ENGINE = Atomic COMMENT '${OURS}'`);
79
+ expect(s.writes[1]).toContain(`COMMENT 'Raw events ${OURS}'`);
80
+ expect(s.writes[2]).toMatch(/GROUP BY kind COMMENT '\[chant managed-by=chant stack=shop env=prod\]'$/);
81
+ });
82
+
83
+ test("without an ownership stack the marker says managed-by alone", async () => {
84
+ const s = await server();
85
+ await run(s, [DB], {}, { config: {} });
86
+ expect(s.writes[0]).toBe("CREATE DATABASE analytics ENGINE = Atomic COMMENT '[chant managed-by=chant]'");
87
+ });
88
+ });
89
+
90
+ describe("updating", () => {
91
+ test("an added column goes in at its declared place", async () => {
92
+ const s = await server([liveDb(), liveEvents()]);
93
+ const withRegion = { ...EVENTS, ddl: EVENTS.ddl.replace("user_id UInt64,", "user_id UInt64, region LowCardinality(String) DEFAULT 'eu',") };
94
+ const r = normalizeApply(await run(s, [DB, withRegion]));
95
+ expect(r.applied.map((a) => [a.name, a.action])).toEqual([
96
+ ["analytics", "unchanged"],
97
+ ["analytics.events", "updated"],
98
+ ]);
99
+ expect(s.writes).toEqual(["ALTER TABLE `analytics`.`events` ADD COLUMN region LowCardinality(String) DEFAULT 'eu' AFTER `user_id`"]);
100
+ });
101
+
102
+ test("a column type change waits on its mutation", async () => {
103
+ const s = await server([liveDb(), liveEvents()]);
104
+ s.mutations.push({ database: "analytics", table: "events", mutation_id: "mutation_7.txt" });
105
+ setTimeout(() => (s.mutations.length = 0), 150);
106
+ const r = normalizeApply(await run(s, [DB, { ...EVENTS, ddl: EVENTS.ddl.replace("kind String", "kind LowCardinality(String)") }]));
107
+ expect(r.applied.find((a) => a.name === "analytics.events")?.action).toBe("updated");
108
+ expect(s.writes).toEqual(["ALTER TABLE `analytics`.`events` MODIFY COLUMN `kind` LowCardinality(String)"]);
109
+ });
110
+
111
+ test("a mutation still running at the timeout fails the apply, naming the mutation", async () => {
112
+ const s = await server([liveDb(), liveEvents()]);
113
+ s.mutations.push({ database: "analytics", table: "events", mutation_id: "mutation_9.txt" });
114
+ const err = await clickhouseApply(
115
+ { buildPath: buildOutput([DB, { ...EVENTS, ddl: EVENTS.ddl.replace("kind String", "kind LowCardinality(String)") }]), environment: "test", mutationTimeoutMs: 300 },
116
+ undefined,
117
+ deps(s),
118
+ ).catch((e: unknown) => e);
119
+ expect(err).toBeInstanceOf(ClickHouseApplyError);
120
+ expect((err as Error).message).toMatch(/mutation_9\.txt was still running/);
121
+ expect((err as ClickHouseApplyError).outcome.applied.map((a) => a.name)).toEqual(["analytics"]);
122
+ });
123
+
124
+ test("a refused rebuild is not attempted, with the restriction and the rebuild Op named", async () => {
125
+ const s = await server([liveDb(), liveEvents()]);
126
+ const r = normalizeApply(await run(s, [DB, { ...EVENTS, ddl: EVENTS.ddl.replace("ORDER BY (ts, user_id)", "ORDER BY (user_id, ts)") }]));
127
+ expect(r.notAttempted).toHaveLength(1);
128
+ expect(r.notAttempted[0]).toMatchObject({ kind: "ClickHouse::Table", name: "analytics.events", reason: "unsupported-kind" });
129
+ expect(r.notAttempted[0]!.detail).toMatch(/SQLCH220 Change the sorting key/);
130
+ expect(r.notAttempted[0]!.detail).toMatch(/clickhouse\.com\/docs/);
131
+ expect(r.notAttempted[0]!.detail).toContain('ClickHouseRebuildOp({ table: "analytics.events"');
132
+ expect(s.writes).toEqual([]);
133
+ });
134
+
135
+ test("a column drop is withheld unless the apply may delete", async () => {
136
+ const s = await server([liveDb(), liveEvents()]);
137
+ const without = { ...EVENTS, ddl: EVENTS.ddl.replace(", kind String", "") };
138
+ const withheld = normalizeApply(await run(s, [DB, without]));
139
+ expect(withheld.notAttempted[0]).toMatchObject({ name: "analytics.events", reason: "filtered" });
140
+ expect(s.writes).toEqual([]);
141
+ await run(s, [DB, without], { prune: true });
142
+ expect(s.writes).toEqual(["ALTER TABLE `analytics`.`events` DROP COLUMN `kind`"]);
143
+ });
144
+
145
+ test("an object whose comment lost the marker is stamped again, its own comment kept", async () => {
146
+ const s = await server([liveDb(), liveEvents("Raw events")]);
147
+ const r = normalizeApply(await run(s, [DB, EVENTS]));
148
+ expect(r.applied.find((a) => a.name === "analytics.events")?.action).toBe("updated");
149
+ expect(s.writes).toEqual([`ALTER TABLE \`analytics\`.\`events\` MODIFY COMMENT 'Raw events ${OURS}'`]);
150
+ });
151
+
152
+ test("a statement the server refuses fails the apply and the objects depending on it are not attempted", async () => {
153
+ const s = await server();
154
+ s.refuse = /CREATE TABLE/;
155
+ const err = (await clickhouseApply({ buildPath: buildOutput([DB, EVENTS, BY_KIND]), environment: "test" }, undefined, deps(s)).catch((e: unknown) => e)) as ClickHouseApplyError;
156
+ expect(err).toBeInstanceOf(ClickHouseApplyError);
157
+ expect(err.outcome.failed.map((f) => f.name)).toEqual(["analytics.events"]);
158
+ expect(err.outcome.notAttempted).toMatchObject([{ name: "analytics.by_kind", reason: "dependency-failed" }]);
159
+ });
160
+ });
161
+
162
+ describe("resolveMarker", () => {
163
+ test("the arguments win over the config, and a parameter-reference env needs ownershipEnv", () => {
164
+ expect(resolveMarker({ stack: "a" }, { ownership: { stack: "b", env: "prod" } })).toEqual({ stack: "a", env: "prod" });
165
+ expect(resolveMarker({}, { ownership: { stack: "b", enabled: false } })).toBeUndefined();
166
+ expect(() => resolveMarker({}, { ownership: { stack: "b", env: { param: "env" } } as never })).toThrow(/ownershipEnv/);
167
+ });
168
+ });
169
+
170
+ describeApplyConformance({
171
+ lexicon: "sql",
172
+ scenarios: [
173
+ {
174
+ name: "a database, a table and a view on an empty server",
175
+ plan: [
176
+ { kind: "ClickHouse::Database", name: "analytics" },
177
+ { kind: "ClickHouse::Table", name: "analytics.events" },
178
+ { kind: "ClickHouse::View", name: "analytics.by_kind" },
179
+ ],
180
+ run: async () => run(await server(), [DB, EVENTS, BY_KIND]),
181
+ expectApplied: ["ClickHouse::Database/analytics", "ClickHouse::Table/analytics.events", "ClickHouse::View/analytics.by_kind"],
182
+ },
183
+ {
184
+ name: "a sorting-key change refused as a rebuild beside an unchanged database",
185
+ plan: [
186
+ { kind: "ClickHouse::Database", name: "analytics" },
187
+ { kind: "ClickHouse::Table", name: "analytics.events" },
188
+ ],
189
+ run: async () => run(await server([liveDb(), liveEvents()]), [DB, { ...EVENTS, ddl: EVENTS.ddl.replace("ORDER BY (ts, user_id)", "ORDER BY ts") }]),
190
+ expectApplied: ["ClickHouse::Database/analytics"],
191
+ expectNotAttempted: ["ClickHouse::Table/analytics.events"],
192
+ },
193
+ {
194
+ name: "no server bound",
195
+ plan: [
196
+ { kind: "ClickHouse::Database", name: "analytics" },
197
+ { kind: "ClickHouse::Table", name: "analytics.events" },
198
+ ],
199
+ run: () => run(undefined, [DB, EVENTS]),
200
+ expectNotAttempted: ["ClickHouse::Database/analytics", "ClickHouse::Table/analytics.events"],
201
+ },
202
+ {
203
+ name: "prune without an ownership stack",
204
+ plan: [{ kind: "ClickHouse::Database", name: "analytics" }],
205
+ run: async () => run(await server([liveDb("[chant managed-by=chant]"), liveEvents("[chant managed-by=chant]")]), [DB], { prune: true }, { config: {} }),
206
+ expectApplied: ["ClickHouse::Database/analytics"],
207
+ expectNotAttempted: ["ClickHouse::Table/analytics.events"],
208
+ },
209
+ ],
210
+ pruneScenarios: [
211
+ {
212
+ name: "an owned orphan table beside one created by hand",
213
+ ownedOrphan: "analytics.events",
214
+ foreign: "analytics.handmade",
215
+ run: async () => {
216
+ const s = await server([liveDb(), liveEvents(), live("analytics", "handmade", "CREATE TABLE analytics.handmade\n(\n `id` UInt64\n)\nENGINE = Log", "made by hand")]);
217
+ return { result: await run(s, [DB], { prune: true }), deletes: s.deletes };
218
+ },
219
+ },
220
+ {
221
+ name: "an owned orphan table beside another stack's",
222
+ ownedOrphan: "analytics.events",
223
+ foreign: "analytics.theirs",
224
+ run: async () => {
225
+ const s = await server([
226
+ liveDb(),
227
+ liveEvents(),
228
+ live("analytics", "theirs", "CREATE TABLE analytics.theirs\n(\n `id` UInt64\n)\nENGINE = Log", "[chant managed-by=chant stack=other env=prod]"),
229
+ ]);
230
+ return { result: await run(s, [DB], { prune: true }), deletes: s.deletes };
231
+ },
232
+ },
233
+ ],
234
+ idempotenceScenarios: [
235
+ {
236
+ name: "the same build applied twice",
237
+ run: async () => {
238
+ const s = await server();
239
+ const first = await run(s, [DB, EVENTS, BY_KIND]);
240
+ const second = await run(s, [DB, EVENTS, BY_KIND]);
241
+ return { first, second };
242
+ },
243
+ },
244
+ ],
245
+ });
246
+
247
+ describe("idempotence", () => {
248
+ test("the second apply sends nothing and reports every object unchanged", async () => {
249
+ const s = await server();
250
+ await run(s, [DB, EVENTS, BY_KIND]);
251
+ const writes = s.writes.length;
252
+ const second = normalizeApply(await run(s, [DB, EVENTS, BY_KIND]));
253
+ expect(second.applied.map((a) => a.action)).toEqual(["unchanged", "unchanged", "unchanged"]);
254
+ expect(s.writes.length).toBe(writes);
255
+ });
256
+
257
+ test("prune keeps a database that still holds an object it does not drop", async () => {
258
+ const s = await server([liveDb(), live("analytics", "handmade", "CREATE TABLE analytics.handmade\n(\n `id` UInt64\n)\nENGINE = Log")]);
259
+ // The build declares only a table in another database, so analytics itself is an owned orphan.
260
+ const other: Obj = { export: "o", type: "ClickHouse::Table", ddl: "CREATE TABLE analytics.other (id UInt64) ENGINE = Log" };
261
+ const r = normalizeApply(await run(s, [other], { prune: true }));
262
+ expect(r.notAttempted).toMatchObject([{ name: "analytics", reason: "not-prunable" }]);
263
+ expect(s.deletes).toEqual([]);
264
+ });
265
+ });
@@ -0,0 +1,113 @@
1
+ /**
2
+ * `clickhouseApply`, the Op activity for the ClickHouse applier (#3208), and
3
+ * `toApplyResult`, its projection onto core's apply envelope (#1446).
4
+ *
5
+ * It reads a build's output (`chant build -o dist/schema.json`), binds the
6
+ * environment's server the way observation and import do
7
+ * (`sql.profiles.<env>`, else `CLICKHOUSE_URL`; ../../clickhouse/live/bind.ts),
8
+ * and hands the declarations to `applyClickHouse`
9
+ * (../../clickhouse/apply/apply.ts), which holds the decisions.
10
+ *
11
+ * The ownership marker is the project's: `ownership.stack` and
12
+ * `ownership.env` from `chant.config.ts`, or `stack` / `ownershipEnv` passed
13
+ * in. Without a stack the apply still runs, stamping only the managed-by
14
+ * marker, and a prune declines (as `not-prunable`) rather than drop another
15
+ * project's tables.
16
+ */
17
+
18
+ import { readFileSync } from "node:fs";
19
+ import type { ChantConfig } from "@intentius/chant/config";
20
+ import type { OwnershipMarker } from "@intentius/chant/ownership";
21
+ import { notAttemptedOutcome, resolveOwnershipMarker } from "../../core/apply";
22
+ import { bindClickHouse, ClickHouseBindingError, classifyClickHouseFailure } from "../../clickhouse/live/bind";
23
+ import { applyClickHouse, declaredObjects, planRefs, type ClickHouseApplyOutcome } from "../../clickhouse/apply/apply";
24
+
25
+ export type { ClickHouseApplyOutcome } from "../../clickhouse/apply/apply";
26
+ export { toApplyResult } from "../../core/apply";
27
+
28
+ export interface ClickHouseApplyArgs {
29
+ /** The build's primary output (`chant build src --lexicon sql -o dist/schema.json`), or a multi-lexicon output holding it under `sql`. */
30
+ buildPath: string;
31
+ /** The chant environment, which selects `sql.profiles.<environment>`. */
32
+ environment?: string;
33
+ /**
34
+ * Drop this project's objects the build no longer declares (only those
35
+ * whose comment carries its marker, stack and env), and allow column drops.
36
+ * Destructive, so off by default.
37
+ */
38
+ prune?: boolean;
39
+ /** Ownership stack. Default: `ownership.stack` in `chant.config.ts`. */
40
+ stack?: string;
41
+ /** Ownership env. Default: `ownership.env` in `chant.config.ts` (a literal; a `{ param }` reference needs this). */
42
+ ownershipEnv?: string;
43
+ /** How long to wait for one table's background rewrite. Default: ten minutes. */
44
+ mutationTimeoutMs?: number;
45
+ /** Project directory for `chant.config.ts`. Default: the working directory. */
46
+ cwd?: string;
47
+ }
48
+
49
+ /** What a test (or an embedding caller) may inject instead of the project's config and the process env. */
50
+ export interface ClickHouseApplyDeps {
51
+ config?: Pick<ChantConfig, "sql" | "ownership">;
52
+ env?: Record<string, string | undefined>;
53
+ log?: (line: string) => void;
54
+ }
55
+
56
+ async function loadConfig(cwd: string): Promise<Pick<ChantConfig, "sql" | "ownership"> | undefined> {
57
+ try {
58
+ const { loadChantConfig } = await import("@intentius/chant/config");
59
+ return (await loadChantConfig(cwd)).config;
60
+ } catch {
61
+ return undefined;
62
+ }
63
+ }
64
+
65
+ /** The marker to stamp and prune by: the arguments, else the project's `ownership` config. */
66
+ export function resolveMarker(args: Pick<ClickHouseApplyArgs, "stack" | "ownershipEnv">, config: Pick<ChantConfig, "ownership"> | undefined): OwnershipMarker | undefined {
67
+ return resolveOwnershipMarker(args, config, "clickhouse apply");
68
+ }
69
+
70
+ /**
71
+ * Apply a sql build to the environment's ClickHouse server. A server that
72
+ * cannot be bound, or refuses the credentials on the first read, returns
73
+ * every declared object as not attempted, with the reason.
74
+ */
75
+ export async function clickhouseApply(args: ClickHouseApplyArgs, signal?: AbortSignal, deps: ClickHouseApplyDeps = {}): Promise<ClickHouseApplyOutcome> {
76
+ const config = deps.config ?? (await loadConfig(args.cwd ?? process.cwd()));
77
+ const marker = resolveMarker(args, config);
78
+ const json = readFileSync(args.buildPath, "utf8");
79
+ const log = deps.log ?? ((line: string) => console.log(line));
80
+ let target;
81
+ try {
82
+ target = await bindClickHouse({ ...(args.environment !== undefined ? { environment: args.environment } : {}), config: config ?? {}, ...(deps.env ? { env: deps.env } : {}) });
83
+ } catch (err) {
84
+ if (!(err instanceof ClickHouseBindingError)) throw err;
85
+ return refused(declaredObjects(json), err.unresolved.reason, err.unresolved.detail);
86
+ }
87
+ const declared = declaredObjects(json, target.defaultDatabase);
88
+ let outcome: ClickHouseApplyOutcome;
89
+ try {
90
+ outcome = await applyClickHouse(target, declared, {
91
+ ...(marker ? { marker } : {}),
92
+ ...(args.prune ? { prune: true } : {}),
93
+ ...(args.mutationTimeoutMs !== undefined ? { mutationTimeoutMs: args.mutationTimeoutMs } : {}),
94
+ ...(signal ? { signal } : {}),
95
+ log,
96
+ });
97
+ } catch (err) {
98
+ // A server that never answered the first read was not written to at all.
99
+ const why = classifyClickHouseFailure(err);
100
+ if (why.reason === "no-credentials" && !(err instanceof Error && err.name === "ClickHouseApplyError")) {
101
+ return { ...refused(declared, "no-credentials", why.detail), target: target.endpoint.url, source: target.source };
102
+ }
103
+ throw err;
104
+ }
105
+ for (const a of outcome.applied) log(`${a.action}: ${a.kind}/${a.name}`);
106
+ for (const p of outcome.pruned) log(`pruned: ${p.kind}/${p.name}`);
107
+ for (const n of outcome.notAttempted) log(`not attempted: ${n.kind}/${n.name}: ${n.reason}${n.detail ? ` (${n.detail})` : ""}`);
108
+ return outcome;
109
+
110
+ function refused(objects: ReturnType<typeof declaredObjects>, reason: "no-binding" | "no-credentials", detail: string): ClickHouseApplyOutcome {
111
+ return notAttemptedOutcome(planRefs(objects), reason, detail);
112
+ }
113
+ }
@@ -0,0 +1,23 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { emulatorLifecycle, emulatorsOf, endpointEnvVars } from "@intentius/chant/op";
3
+ import { CLICKHOUSE_EMULATOR } from "./clickhouse-emulator";
4
+ import { sqlPlugin } from "../../plugin";
5
+ import { clickhouseImage } from "../../spec/pin";
6
+
7
+ describe("the ClickHouse emulator capability (#3208)", () => {
8
+ test("is declared on the plugin, so chant emulator up boots it", () => {
9
+ expect(emulatorsOf(sqlPlugin.emulator)[0]).toEqual(CLICKHOUSE_EMULATOR);
10
+ });
11
+
12
+ test("runs the pinned image by digest, and names CLICKHOUSE_URL as its endpoint", () => {
13
+ expect(CLICKHOUSE_EMULATOR.spec.image).toBe(clickhouseImage());
14
+ expect(CLICKHOUSE_EMULATOR.spec.image).toMatch(/:26\.8\.15\.10@sha256:/);
15
+ expect(endpointEnvVars(CLICKHOUSE_EMULATOR)).toEqual(["CLICKHOUSE_URL"]);
16
+ });
17
+
18
+ test("starts the server reachable as the default user", () => {
19
+ expect(emulatorLifecycle(CLICKHOUSE_EMULATOR.spec).runCommand()).toBe(
20
+ `docker run -d --rm --name chant-clickhouse -p 8123:8123 -e CLICKHOUSE_SKIP_USER_SETUP=1 ${clickhouseImage()}`,
21
+ );
22
+ });
23
+ });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The sql lexicon's emulator capability (#3208): the pinned
3
+ * `clickhouse/clickhouse-server`, the same image and digest generation and
4
+ * the live tests run (../../spec/pin.ts), so `chant emulator up` boots a real
5
+ * server rather than a stand-in.
6
+ *
7
+ * `upstream` is left off on purpose. The freshness check compares the image
8
+ * tag against the repo's latest GitHub release, and ClickHouse's latest
9
+ * release is a monthly one, not the LTS line the pin follows; the lexicon's
10
+ * `upstreamPin` already tracks the LTS tags (`-lts`).
11
+ */
12
+
13
+ import { emulatorLifecycle, type EmulatorCapability, type EmulatorSpec } from "@intentius/chant/op";
14
+ import { clickhouseImage } from "../../spec/pin";
15
+
16
+ export const CLICKHOUSE_EMULATOR_SPEC: EmulatorSpec = {
17
+ name: "chant-clickhouse",
18
+ image: clickhouseImage(),
19
+ containerPort: 8123,
20
+ healthPath: "/ping",
21
+ // The image disables network access for the passwordless default user
22
+ // unless this is set; a local server is reached as `default` with no password.
23
+ runArgs: ["-e", "CLICKHOUSE_SKIP_USER_SETUP=1"],
24
+ };
25
+
26
+ /** `CLICKHOUSE_URL` is the variable binding reads when no `sql.profiles.<env>` names a server. */
27
+ export const CLICKHOUSE_EMULATOR: EmulatorCapability = {
28
+ spec: CLICKHOUSE_EMULATOR_SPEC,
29
+ env: (endpoint) => ({ CLICKHOUSE_URL: endpoint }),
30
+ };
31
+
32
+ const lifecycle = emulatorLifecycle(CLICKHOUSE_EMULATOR_SPEC);
33
+
34
+ /** Boot the pinned ClickHouse server in Docker and return its endpoint. */
35
+ export const clickhouseUp = (args: Parameters<typeof lifecycle.up>[0] = {}, signal?: AbortSignal) => lifecycle.up(args, signal);
36
+ /** Stop and remove it (a no-op when it is gone). */
37
+ export const clickhouseDown = (args: { name?: string } = {}, signal?: AbortSignal) => lifecycle.down(args, signal);