@intentius/chant-lexicon-sql 0.0.0-stage → 0.112.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,513 @@
1
+ /**
2
+ * The rebuild migration on a Replicated database (#3249): two replicas of the
3
+ * pinned server, Keeper embedded in the first, a `Replicated` database and
4
+ * `ReplicatedMergeTree` tables.
5
+ *
6
+ * - Through its gates, with the runs moving between replicas: created and
7
+ * filled on one, re-run on the other (which reads the first one's receipts
8
+ * and copies nothing again), swapped there, dropped back on the first. The
9
+ * EXCHANGE, the dependent view's DETACH and ATTACH and the drop reach every
10
+ * replica, and a plan on either finds the declaration.
11
+ * - An interrupted backfill resumed on the other replica: the copy still
12
+ * running on the first replica under the partition's query id is killed
13
+ * from the second, the partition it left half copied and the one killed
14
+ * before its receipt are cleared and copied again (not dropped as repeated
15
+ * blocks), and the verification finds every row once.
16
+ * - A replica down (#3270), last because it restarts a container: with a
17
+ * part on the stopped replica alone, the backfill waits, then stops naming
18
+ * it, and onFailure drops the new table without waiting for it; restarted,
19
+ * the part reaches the other replica. Then stopped in the middle of a
20
+ * backfill: the run goes on with the live replica through both gates, and
21
+ * the restarted replica catches up from Keeper with every row and the
22
+ * declaration, and plans no change.
23
+ *
24
+ * Runs the Op through core's local executor with an in-memory gate ledger.
25
+ * Needs Docker; skips cleanly without it.
26
+ */
27
+
28
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
29
+ import { tmpdir } from "node:os";
30
+ import { join } from "node:path";
31
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
32
+ import { normalizeApply } from "@intentius/chant/apply";
33
+ import { memoryGateLedgerPort, runOpLocally, loadProfiles, OpRunFailure, type ActivityFn, type GateLedgerPort, type OpConfig, type OpRunResult } from "@intentius/chant/op";
34
+ import { dockerAvailable, startScratchCluster, type ScratchCluster } from "../container";
35
+ import { clickhouseQuery, type ClickHouseEndpoint } from "../http";
36
+ import { clickhouseImage } from "../../spec/pin";
37
+ import { planAgainstServer } from "../plan/commands";
38
+ import { clickhouseApply, toApplyResult } from "../../op/activities/clickhouse-apply";
39
+ import * as rebuildActivities from "../../op/activities/clickhouse-rebuild";
40
+ import type { ClickHouseRebuildDeps } from "../../op/activities/clickhouse-rebuild";
41
+ import { ClickHouseRebuildOp, type ClickHouseRebuildOpConfig } from "./op";
42
+ import { clickhouseReceiptStore, REPLICATED_RECEIPTS_TABLE, type ClickHouseReceiptStore } from "./receipts";
43
+
44
+ const enabled = await dockerAvailable();
45
+ let cluster: ScratchCluster | undefined;
46
+ const dir = mkdtempSync(join(tmpdir(), "chant-sql-rebuild-replicated-"));
47
+
48
+ beforeAll(async () => {
49
+ if (!enabled) return;
50
+ cluster = await startScratchCluster(clickhouseImage(), { replicas: 2, namePrefix: "chant-sql-rebuild-repl" });
51
+ }, 600_000);
52
+
53
+ afterAll(async () => {
54
+ await cluster?.stop();
55
+ rmSync(dir, { recursive: true, force: true });
56
+ });
57
+
58
+ interface Obj {
59
+ export: string;
60
+ type: string;
61
+ ddl: string;
62
+ dependsOn?: string[];
63
+ }
64
+
65
+ function writeBuild(file: string, objects: Obj[]): string {
66
+ writeFileSync(join(dir, file), JSON.stringify({ dialect: "clickhouse", applyOrder: objects.map((o) => o.export), objects: objects.map((o) => ({ dependsOn: [], ...o })) }));
67
+ return file;
68
+ }
69
+
70
+ const MARKER = { stack: "e2e", env: "test" };
71
+ const r1 = (): ClickHouseEndpoint => cluster!.replicas[0]!;
72
+ const r2 = (): ClickHouseEndpoint => cluster!.replicas[1]!;
73
+ const deps = (at: ClickHouseEndpoint) => ({ config: { ownership: MARKER }, env: { CLICKHOUSE_URL: at.url }, log: () => undefined });
74
+ const q = <T = Record<string, unknown>>(at: ClickHouseEndpoint, sql: string) => clickhouseQuery<T>(at, sql);
75
+ /** Rows of a table on one replica, once it has fetched what the others wrote. */
76
+ async function count(at: ClickHouseEndpoint, table: string, where = ""): Promise<number> {
77
+ await q(at, `SYSTEM SYNC REPLICA ${table} LIGHTWEIGHT`);
78
+ return Number((await q<{ n: string }>(at, `SELECT count() AS n FROM ${table}${where ? ` WHERE ${where}` : ""}`))[0]!.n);
79
+ }
80
+ /**
81
+ * A replica that has just started again: wait until it has replayed the
82
+ * database's log. It answers queries before it is back in Keeper as a
83
+ * database replica, and says it is read-only until then.
84
+ */
85
+ async function catchUp(at: ClickHouseEndpoint, database: string): Promise<void> {
86
+ const deadline = Date.now() + 120_000;
87
+ for (;;) {
88
+ try {
89
+ await q(at, `SYSTEM SYNC DATABASE REPLICA ${database}`);
90
+ return;
91
+ } catch (err) {
92
+ console.log(`catchUp ${database}: ${(err as Error).message}`, JSON.stringify(await q(at, "SELECT * FROM system.database_replicas").catch((e: unknown) => String(e))));
93
+ if (Date.now() > deadline) throw err;
94
+ await new Promise((r) => setTimeout(r, 1000));
95
+ }
96
+ }
97
+ }
98
+ async function exists(at: ClickHouseEndpoint, database: string, name: string): Promise<boolean> {
99
+ await q(at, `SYSTEM SYNC DATABASE REPLICA ${database}`);
100
+ return Number((await q<{ n: string }>(at, `SELECT count() AS n FROM system.tables WHERE database = '${database}' AND name = '${name}'`))[0]!.n) > 0;
101
+ }
102
+ const showCreate = async (at: ClickHouseEndpoint, name: string) => (await q<{ statement: string }>(at, `SHOW CREATE TABLE ${name}`))[0]!.statement;
103
+
104
+ function activities(at: ClickHouseEndpoint, extra: Partial<ClickHouseRebuildDeps> = {}): Map<string, ActivityFn> {
105
+ const map = new Map<string, ActivityFn>();
106
+ for (const [name, fn] of Object.entries(rebuildActivities)) {
107
+ if (typeof fn !== "function" || !name.startsWith("clickhouseRebuild")) continue;
108
+ map.set(name, ((args: Record<string, unknown>, signal?: AbortSignal) =>
109
+ (fn as (a: unknown, s?: AbortSignal, d?: unknown) => Promise<unknown>)(args, signal, { ...deps(at), ...extra })) as ActivityFn);
110
+ }
111
+ return map;
112
+ }
113
+
114
+ /** One run of the Op against one replica. */
115
+ async function runOp(at: ClickHouseEndpoint, config: ClickHouseRebuildOpConfig, gates: GateLedgerPort, extra: Partial<ClickHouseRebuildDeps> = {}): Promise<OpRunResult> {
116
+ const { op } = ClickHouseRebuildOp(config);
117
+ const props = (op as unknown as { props: OpConfig }).props;
118
+ return runOpLocally(props, activities(at, extra), await loadProfiles(), undefined, { gates, now: new Date().toISOString() });
119
+ }
120
+
121
+ class Ledger {
122
+ private pending: unknown[] = [];
123
+ private resolutions: unknown[] = [];
124
+ port = memoryGateLedgerPort();
125
+
126
+ approveLast(): void {
127
+ const last = this.port.appended.at(-1)!;
128
+ this.pending.push(...this.port.appended);
129
+ this.resolutions.push({
130
+ version: 1,
131
+ kind: "resolution",
132
+ op: last.op,
133
+ gate: last.gate,
134
+ resolvedBy: "e2e",
135
+ timestamp: new Date(Date.parse(last.timestamp) + 1000).toISOString(),
136
+ ...(last.planDigest ? { planDigest: last.planDigest } : {}),
137
+ });
138
+ this.port = memoryGateLedgerPort({ pending: this.pending as never, resolutions: this.resolutions as never });
139
+ }
140
+ }
141
+
142
+ const outcome = (r: OpRunResult, name: string) => r.records.flatMap((x) => x.outcomes ?? []).find((o) => o.name === name)?.value;
143
+
144
+ const DB_DDL = "CREATE DATABASE shop ENGINE = Replicated('/clickhouse/databases/shop', '{shard}', '{replica}')";
145
+ const DB: Obj = { export: "shop", type: "ClickHouse::Database", ddl: DB_DDL };
146
+
147
+ /** The applier makes the database on the first replica; each other replica joins it with the same statement. */
148
+ async function joinDatabase(at: ClickHouseEndpoint): Promise<void> {
149
+ await q(at, DB_DDL.replace("CREATE DATABASE", "CREATE DATABASE IF NOT EXISTS"));
150
+ await q(at, "SYSTEM SYNC DATABASE REPLICA shop");
151
+ }
152
+
153
+ const eventsDdl = (orderBy: string) => `CREATE TABLE shop.events
154
+ (
155
+ ts DateTime,
156
+ user_id UInt64,
157
+ kind LowCardinality(String)
158
+ )
159
+ ENGINE = ReplicatedMergeTree
160
+ PARTITION BY toYYYYMM(ts)
161
+ ORDER BY ${orderBy}
162
+ COMMENT 'Raw events'`;
163
+ const EVENTS_V1: Obj = { export: "events", type: "ClickHouse::Table", dependsOn: ["shop"], ddl: eventsDdl("(ts, user_id)") };
164
+ const EVENTS_V2: Obj = { ...EVENTS_V1, ddl: eventsDdl("(user_id, ts)") };
165
+ const DAILY: Obj = {
166
+ export: "daily",
167
+ type: "ClickHouse::Table",
168
+ dependsOn: ["shop"],
169
+ ddl: "CREATE TABLE shop.daily (day Date, n UInt64) ENGINE = ReplicatedSummingMergeTree ORDER BY day",
170
+ };
171
+ const DAILY_MV: Obj = {
172
+ export: "dailyMv",
173
+ type: "ClickHouse::MaterializedView",
174
+ dependsOn: ["events", "daily"],
175
+ ddl: "CREATE MATERIALIZED VIEW shop.daily_mv TO shop.daily AS SELECT toDate(ts) AS day, count() AS n FROM shop.events GROUP BY day",
176
+ };
177
+
178
+ describe.skipIf(!enabled)("a sorting-key change on a Replicated database, rebuilt through its gates across replicas", () => {
179
+ const config = (): ClickHouseRebuildOpConfig => ({
180
+ name: "rebuild-events",
181
+ env: "e2e",
182
+ table: "shop.events",
183
+ dualWrite: { mode: "materialized-view", cutoverColumn: "ts", cutoverDelay: "2s" },
184
+ build: false,
185
+ path: dir,
186
+ output: "events-v2.json",
187
+ retain: "0s",
188
+ stack: MARKER.stack,
189
+ ownershipEnv: MARKER.env,
190
+ });
191
+ const ledger = new Ledger();
192
+
193
+ test("the plan on either replica finds only the sorting key, and the applier refuses it", async () => {
194
+ const v1 = writeBuild("events-v1.json", [DB, EVENTS_V1, DAILY, DAILY_MV]);
195
+ const applied = normalizeApply(toApplyResult(await clickhouseApply({ buildPath: join(dir, v1), environment: "e2e" }, undefined, deps(r1()))));
196
+ expect(applied.notAttempted).toEqual([]);
197
+ await joinDatabase(r2());
198
+ expect(await exists(r2(), "shop", "daily_mv")).toBe(true);
199
+ await q(r1(), "INSERT INTO shop.events SELECT toDateTime('2026-01-01 00:00:00') + number * 6480, number % 50, if(number % 3 = 0, 'click', 'view') FROM numbers(1600)");
200
+
201
+ const v2 = writeBuild("events-v2.json", [DB, EVENTS_V2, DAILY, DAILY_MV]);
202
+ for (const at of [r1(), r2()]) {
203
+ // ENGINE = ReplicatedMergeTree reads back with the default Keeper path and replica filled in; that is no change.
204
+ const plan = await planAgainstServer("e2e", join(dir, v2), { config: {}, env: { CLICKHOUSE_URL: at.url } });
205
+ expect(plan.changes.map((c) => c.rule)).toEqual(["SQLCH220"]);
206
+ expect(plan.rebuildOps).toEqual([expect.objectContaining({ table: "shop.events" })]);
207
+ }
208
+ const refused = normalizeApply(toApplyResult(await clickhouseApply({ buildPath: join(dir, v2), environment: "e2e" }, undefined, deps(r2()))));
209
+ expect(refused.notAttempted).toEqual([expect.objectContaining({ name: "shop.events", reason: "unsupported-kind" })]);
210
+ }, 180_000);
211
+
212
+ test("filled on one replica, re-run on the other: the receipts replicate and nothing is copied twice", async () => {
213
+ const r = await runOp(r1(), config(), ledger.port);
214
+ expect(r.status).toBe("gated");
215
+ expect(r.gate).toMatchObject({ gate: "approve-rebuild-events" });
216
+ expect(outcome(r, "VerifiedRows")).toBe(1600);
217
+ expect(outcome(r, "VerifiedPartitions")).toBe(4);
218
+ // The new table, the dual-write view and the receipts are on both replicas, rows and all.
219
+ expect(await count(r2(), "shop.events__chant_new")).toBe(1600);
220
+ expect(await exists(r2(), "shop", "events__chant_dual")).toBe(true);
221
+ expect(await count(r2(), `shop.${REPLICATED_RECEIPTS_TABLE}`)).toBe(4);
222
+ expect(await q(r1(), "SELECT name FROM system.databases WHERE name = 'chant_receipts'")).toEqual([]);
223
+
224
+ // A write on the second replica reaches the new table through its copy of the dual-write view.
225
+ await q(r2(), "INSERT INTO shop.events VALUES (now() + 3600, 7, 'click')");
226
+ expect(await count(r1(), "shop.events__chant_new")).toBe(1601);
227
+
228
+ // The second replica reads the receipts the first one wrote: the four
229
+ // partitions are skipped, the new one (after the cut-over) copies nothing,
230
+ // and the gate stands as it was.
231
+ const again = await runOp(r2(), config(), ledger.port);
232
+ expect(again.status).toBe("gated");
233
+ expect(outcome(again, "Skipped")).toBe(4);
234
+ expect(outcome(again, "Copied")).toBe(1);
235
+ expect(again.gate!.planDigest).toBe(r.gate!.planDigest);
236
+ expect(await count(r1(), "shop.events__chant_new")).toBe(1601);
237
+ }, 300_000);
238
+
239
+ test("approved, the swap on the second replica reaches the first, view and all", async () => {
240
+ ledger.approveLast();
241
+ const r = await runOp(r2(), config(), ledger.port);
242
+ expect(r.status).toBe("gated");
243
+ expect(r.gate).toMatchObject({ gate: "approve-rebuild-events-drop" });
244
+ expect(outcome(r, "Dependents")).toEqual(["shop.daily_mv"]);
245
+
246
+ for (const at of [r1(), r2()]) {
247
+ await q(at, "SYSTEM SYNC DATABASE REPLICA shop");
248
+ expect(await showCreate(at, "shop.events")).toMatch(/ReplicatedMergeTree[\s\S]*ORDER BY \(user_id, ts\)/);
249
+ expect(await count(at, "shop.events")).toBe(1601);
250
+ expect(await count(at, "shop.events__chant_old")).toBe(1601);
251
+ expect(await exists(at, "shop", "events__chant_dual")).toBe(false);
252
+ expect(await exists(at, "shop", "events__chant_new")).toBe(false);
253
+ expect(await exists(at, "shop", "daily_mv")).toBe(true);
254
+ const [{ comment }] = await q<{ comment: string }>(at, "SELECT comment FROM system.tables WHERE database = 'shop' AND name = 'events'");
255
+ expect(comment).toBe("Raw events [chant managed-by=chant stack=e2e env=test]");
256
+ }
257
+
258
+ // The view, detached and attached again on every replica, reads the new table on each.
259
+ const before = Number((await q<{ n: string }>(r2(), "SELECT sum(n) AS n FROM shop.daily"))[0]!.n);
260
+ await q(r1(), "INSERT INTO shop.events VALUES (now(), 8, 'view')");
261
+ await q(r2(), "INSERT INTO shop.events VALUES (now(), 9, 'view')");
262
+ await q(r2(), "SYSTEM SYNC REPLICA shop.daily LIGHTWEIGHT");
263
+ expect(Number((await q<{ n: string }>(r2(), "SELECT sum(n) AS n FROM shop.daily"))[0]!.n)).toBe(before + 2);
264
+ }, 300_000);
265
+
266
+ test("approved again, the drop on the first replica leaves the declaration on both", async () => {
267
+ ledger.approveLast();
268
+ const r = await runOp(r1(), config(), ledger.port);
269
+ expect(r.status).toBe("ok");
270
+ expect(outcome(r, "Dropped")).toBe(true);
271
+ for (const at of [r1(), r2()]) {
272
+ expect(await exists(at, "shop", "events__chant_old")).toBe(false);
273
+ const plan = await planAgainstServer("e2e", join(dir, "events-v2.json"), { config: {}, env: { CLICKHOUSE_URL: at.url } });
274
+ expect(plan.changes).toEqual([]);
275
+ }
276
+ const done = await runOp(r2(), config(), ledger.port);
277
+ expect(done.status).toBe("ok");
278
+ expect(outcome(done, "RebuildState")).toBe("done");
279
+ }, 300_000);
280
+ });
281
+
282
+ describe.skipIf(!enabled)("an interrupted backfill resumes on the other replica", () => {
283
+ const viewsDdl = (orderBy: string) =>
284
+ `CREATE TABLE shop.page_views (day Date, page String, n UInt32) ENGINE = ReplicatedMergeTree PARTITION BY day ORDER BY ${orderBy}`;
285
+ const V1: Obj = { export: "pageViews", type: "ClickHouse::Table", dependsOn: ["shop"], ddl: viewsDdl("(day, page)") };
286
+ const V2: Obj = { ...V1, ddl: viewsDdl("(page, day)") };
287
+ const args = () => ({
288
+ table: "shop.page_views",
289
+ buildPath: "views-v2.json",
290
+ environment: "e2e",
291
+ dualWrite: { mode: "app" as const },
292
+ stack: MARKER.stack,
293
+ ownershipEnv: MARKER.env,
294
+ cwd: dir,
295
+ });
296
+
297
+ test("stopped, killed before a receipt, a copy left running on the first replica: the second kills it and finishes, every row once", async () => {
298
+ await clickhouseApply({ buildPath: join(dir, writeBuild("views-v1.json", [DB, V1])), environment: "e2e" }, undefined, deps(r1()));
299
+ await joinDatabase(r2());
300
+ await q(r1(), "INSERT INTO shop.page_views SELECT toDate('2026-03-01') + number % 6, concat('/p/', toString(number % 11)), number FROM numbers(6000)");
301
+ writeBuild("views-v2.json", [DB, V2]);
302
+ await rebuildActivities.clickhouseRebuildCreate(args(), undefined, deps(r1()));
303
+
304
+ // On the first replica: interrupted after the second partition.
305
+ const stop = new AbortController();
306
+ let done = 0;
307
+ const interrupted = await rebuildActivities
308
+ .clickhouseRebuildBackfill(args(), stop.signal, { ...deps(r1()), backfill: { afterPartition: () => void (++done === 2 && stop.abort()) } })
309
+ .then(
310
+ () => undefined,
311
+ (e: unknown) => e,
312
+ );
313
+ expect(interrupted).toBeDefined();
314
+
315
+ // Then killed between the third partition's INSERT and its receipt.
316
+ const real = clickhouseReceiptStore(r1(), MARKER, { replicatedIn: "shop" });
317
+ const crashing: ClickHouseReceiptStore = {
318
+ ...real,
319
+ write: async () => {
320
+ throw new Error("killed before the receipt");
321
+ },
322
+ };
323
+ await expect(rebuildActivities.clickhouseRebuildBackfill(args(), undefined, { ...deps(r1()), backfill: { receipts: crashing } })).rejects.toThrow(/killed before the receipt/);
324
+ expect(await count(r1(), "shop.page_views__chant_new")).toBe(3000);
325
+
326
+ // And the fourth partition's copy still running on the first replica
327
+ // under its query id, its client gone, a block at a time.
328
+ const [{ uuid }] = await q<{ uuid: string }>(r1(), "SELECT toString(uuid) AS uuid FROM system.tables WHERE database = 'shop' AND name = 'page_views__chant_new'");
329
+ const fourth = "20260304";
330
+ const params = new URLSearchParams({
331
+ query_id: `chant-rebuild-${uuid}-${fourth}`,
332
+ max_block_size: "10",
333
+ min_insert_block_size_rows: "10",
334
+ min_insert_block_size_bytes: "1",
335
+ max_insert_block_size: "10",
336
+ });
337
+ const running = fetch(`${r1().url}/?${params}`, {
338
+ method: "POST",
339
+ body: "INSERT INTO shop.page_views__chant_new (day, page, n) SELECT toDate('2026-03-04'), '/stray', number FROM numbers(1000) WHERE sleepEachRow(0.05) = 0",
340
+ }).then((res) => res.text());
341
+ for (let i = 0; (await count(r1(), "shop.page_views__chant_new", "day = '2026-03-04'")) === 0; i++) {
342
+ if (i > 100) throw new Error("the stray copy wrote nothing");
343
+ await new Promise((r) => setTimeout(r, 100));
344
+ }
345
+
346
+ // Resumed on the second replica: two partitions skipped by the receipts
347
+ // the first replica wrote, the third and the fourth cleared and copied
348
+ // again, two more copied.
349
+ const resumed = await rebuildActivities.clickhouseRebuildBackfill(args(), undefined, deps(r2()));
350
+ expect(resumed).toMatchObject({ partitions: 6, skipped: 2, cleared: 2, copied: 4 });
351
+ expect(await running).toMatch(/QUERY_WAS_CANCELLED/);
352
+ for (const at of [r1(), r2()]) {
353
+ expect(await count(at, "shop.page_views__chant_new")).toBe(6000);
354
+ expect(await count(at, "shop.page_views__chant_new", "page = '/stray'")).toBe(0);
355
+ }
356
+
357
+ const verified = await rebuildActivities.clickhouseRebuildVerify(args(), undefined, deps(r1()));
358
+ expect(verified).toMatchObject({ partitions: 6, rows: 6000 });
359
+ await q(r1(), `SYSTEM SYNC REPLICA shop.${REPLICATED_RECEIPTS_TABLE} LIGHTWEIGHT`);
360
+ const receipts = await q<{ address: string }>(r1(), `SELECT DISTINCT address FROM shop.${REPLICATED_RECEIPTS_TABLE} WHERE address LIKE 'e2e/test/rebuild/shop.page_views/%'`);
361
+ expect(receipts).toHaveLength(6);
362
+
363
+ // The receipts table is chant's bookkeeping, not part of the declared schema.
364
+ const plan = await planAgainstServer("e2e", join(dir, "views-v2.json"), { config: {}, env: { CLICKHOUSE_URL: r2().url } });
365
+ expect(plan.changes.map((c) => c.object)).not.toContain(`shop.${REPLICATED_RECEIPTS_TABLE}`);
366
+
367
+ const dropped = await rebuildActivities.clickhouseRebuildCompensate(args(), undefined, deps(r2()));
368
+ expect(dropped.dropped).toEqual(["shop.page_views__chant_new"]);
369
+ expect(await exists(r1(), "shop", "page_views__chant_new")).toBe(false);
370
+ }, 300_000);
371
+ });
372
+
373
+ describe.skipIf(!enabled)("a table that does not replicate its rows is refused", () => {
374
+ const plainDdl = (orderBy: string) => `CREATE TABLE shop.plain (id UInt64, url String) ENGINE = MergeTree ORDER BY ${orderBy}`;
375
+ const V1: Obj = { export: "plain", type: "ClickHouse::Table", dependsOn: ["shop"], ddl: plainDdl("id") };
376
+ const V2: Obj = { ...V1, ddl: plainDdl("(url, id)") };
377
+
378
+ test("a MergeTree in a Replicated database keeps its rows per replica, so the plan refuses it and makes nothing", async () => {
379
+ await clickhouseApply({ buildPath: join(dir, writeBuild("plain-v1.json", [DB, V1])), environment: "e2e" }, undefined, deps(r1()));
380
+ writeBuild("plain-v2.json", [DB, V2]);
381
+ const args = { table: "shop.plain", buildPath: "plain-v2.json", environment: "e2e", dualWrite: { mode: "app" as const }, stack: MARKER.stack, ownershipEnv: MARKER.env, cwd: dir };
382
+ await expect(rebuildActivities.clickhouseRebuildPlan(args, undefined, deps(r2()))).rejects.toThrow(
383
+ /shop\.plain is in a Replicated database and the table is MergeTree, which keeps a separate set of rows on each replica/,
384
+ );
385
+ expect(await exists(r1(), "shop", "plain__chant_new")).toBe(false);
386
+ }, 120_000);
387
+ });
388
+
389
+ describe.skipIf(!enabled)("a replica down (#3270)", () => {
390
+ const clicksDdl = (orderBy: string) => `CREATE TABLE depot.clicks
391
+ (
392
+ ts DateTime,
393
+ user_id UInt64,
394
+ page String
395
+ )
396
+ ENGINE = ReplicatedMergeTree
397
+ PARTITION BY toYYYYMM(ts)
398
+ ORDER BY ${orderBy}`;
399
+ const V1: Obj = { export: "clicks", type: "ClickHouse::Table", dependsOn: ["depot"], ddl: clicksDdl("(ts, user_id)") };
400
+ const V2: Obj = { ...V1, ddl: clicksDdl("(user_id, ts)") };
401
+ const PER_DAY: Obj = {
402
+ export: "clicksDaily",
403
+ type: "ClickHouse::Table",
404
+ dependsOn: ["depot"],
405
+ ddl: "CREATE TABLE depot.clicks_daily (day Date, n UInt64) ENGINE = ReplicatedSummingMergeTree ORDER BY day",
406
+ };
407
+ const PER_DAY_MV: Obj = {
408
+ export: "clicksDailyMv",
409
+ type: "ClickHouse::MaterializedView",
410
+ dependsOn: ["clicks", "clicksDaily"],
411
+ ddl: "CREATE MATERIALIZED VIEW depot.clicks_daily_mv TO depot.clicks_daily AS SELECT toDate(ts) AS day, count() AS n FROM depot.clicks GROUP BY day",
412
+ };
413
+ const config = (extra: Partial<ClickHouseRebuildOpConfig> = {}): ClickHouseRebuildOpConfig => ({
414
+ name: "rebuild-clicks",
415
+ env: "e2e",
416
+ table: "depot.clicks",
417
+ dualWrite: { mode: "materialized-view", cutoverColumn: "ts", cutoverDelay: "2s" },
418
+ build: false,
419
+ path: dir,
420
+ output: "clicks-v2.json",
421
+ retain: "0s",
422
+ stack: MARKER.stack,
423
+ ownershipEnv: MARKER.env,
424
+ ...extra,
425
+ });
426
+ const ledger = new Ledger();
427
+ // Its own database, so the plans below read only these tables.
428
+ const DEPOT_DDL = "CREATE DATABASE depot ENGINE = Replicated('/clickhouse/databases/depot', '{shard}', '{replica}')";
429
+ const DEPOT: Obj = { export: "depot", type: "ClickHouse::Database", ddl: DEPOT_DDL };
430
+ const stepError = (err: unknown, fn: string) => (err as OpRunFailure).result.records.find((r) => r.fn === fn && r.status === "fail")?.error ?? "";
431
+
432
+ test("a part on the stopped replica alone: the backfill waits, stops naming it, and onFailure goes on without it", async () => {
433
+ await clickhouseApply({ buildPath: join(dir, writeBuild("clicks-v1.json", [DEPOT, V1, PER_DAY, PER_DAY_MV])), environment: "e2e" }, undefined, deps(r1()));
434
+ await q(r2(), DEPOT_DDL.replace("CREATE DATABASE", "CREATE DATABASE IF NOT EXISTS"));
435
+ await q(r2(), "SYSTEM SYNC DATABASE REPLICA depot");
436
+ writeBuild("clicks-v2.json", [DEPOT, V2, PER_DAY, PER_DAY_MV]);
437
+ await q(r1(), "INSERT INTO depot.clicks SELECT toDateTime('2026-01-01 00:00:00') + number * 6480, number % 50, concat('/p/', toString(number % 7)) FROM numbers(1600)");
438
+ expect(await count(r2(), "depot.clicks")).toBe(1600);
439
+
440
+ // Forty rows written on r2 that r1 has not fetched when r2 stops.
441
+ await q(r1(), "SYSTEM STOP FETCHES depot.clicks");
442
+ await q(r2(), "INSERT INTO depot.clicks SELECT toDateTime('2026-02-10 00:00:00') + number * 60, 1000 + number, '/late' FROM numbers(40)");
443
+ await cluster!.stopReplica(1);
444
+ await q(r1(), "SYSTEM START FETCHES depot.clicks");
445
+
446
+ // Create and Dual write go on without r2 (it is skipped once Keeper sees it
447
+ // inactive); the backfill cannot read r2's part and stops; onFailure's
448
+ // drops go on without r2 too.
449
+ const failed = await runOp(r1(), config({ replicaTimeout: "3s" }), ledger.port).then(
450
+ () => undefined,
451
+ (e: unknown) => e,
452
+ );
453
+ expect(failed).toBeInstanceOf(OpRunFailure);
454
+ expect(stepError(failed, "clickhouseRebuildBackfill")).toMatch(
455
+ /depot\.clicks: waited \d+s for replica r1 to fetch what the other replicas wrote, and 1 part\(s\) are still to fetch: 202602_\S+ from r2.*Those rows are on r2 alone/,
456
+ );
457
+ expect((failed as OpRunFailure).result.records.find((r) => r.fn === "clickhouseRebuildCompensate")?.status).toBe("ok");
458
+ expect(await q(r1(), "SELECT name FROM system.tables WHERE database = 'depot' AND name LIKE 'clicks\\_\\_chant%'")).toEqual([]);
459
+ expect(Number((await q<{ n: string }>(r1(), "SELECT count() AS n FROM depot.clicks"))[0]!.n)).toBe(1600);
460
+
461
+ // Back up: r1 fetches the part, and r2 replays the create and the drops from the database's log.
462
+ await cluster!.startReplica(1);
463
+ expect(await count(r1(), "depot.clicks")).toBe(1640);
464
+ await catchUp(r2(), "depot");
465
+ expect(await q(r2(), "SELECT name FROM system.tables WHERE database = 'depot' AND name LIKE 'clicks\\_\\_chant%'")).toEqual([]);
466
+ }, 300_000);
467
+
468
+ test("stopped mid-backfill, the run goes on with the live replica through both gates, and the replica catches up when it is back", async () => {
469
+ let stopped = false;
470
+ const stopAfterFirst = {
471
+ backfill: {
472
+ afterPartition: async () => {
473
+ if (stopped) return;
474
+ stopped = true;
475
+ await cluster!.stopReplica(1);
476
+ },
477
+ },
478
+ };
479
+ const r = await runOp(r1(), config(), ledger.port, stopAfterFirst);
480
+ expect(stopped).toBe(true);
481
+ expect(r.status).toBe("gated");
482
+ expect(r.gate).toMatchObject({ gate: "approve-rebuild-clicks" });
483
+ expect(outcome(r, "VerifiedRows")).toBe(1640);
484
+ expect(outcome(r, "Copied")).toBe(4);
485
+
486
+ // Approved with r2 still down: EXCHANGE, the view's DETACH PERMANENTLY and ATTACH, the drop.
487
+ ledger.approveLast();
488
+ const swapped = await runOp(r1(), config(), ledger.port);
489
+ expect(swapped.status).toBe("gated");
490
+ expect(swapped.gate).toMatchObject({ gate: "approve-rebuild-clicks-drop" });
491
+ expect(outcome(swapped, "Dependents")).toEqual(["depot.clicks_daily_mv"]);
492
+ ledger.approveLast();
493
+ const dropped = await runOp(r1(), config(), ledger.port);
494
+ expect(dropped.status).toBe("ok");
495
+ expect(outcome(dropped, "Dropped")).toBe(true);
496
+
497
+ // Back up: r2 replays the database's log and fetches the new table's parts.
498
+ await cluster!.startReplica(1);
499
+ await catchUp(r2(), "depot");
500
+ for (const at of [r1(), r2()]) {
501
+ expect(await showCreate(at, "depot.clicks")).toMatch(/ORDER BY \(user_id, ts\)/);
502
+ expect(await count(at, "depot.clicks")).toBe(1640);
503
+ expect(await count(at, "depot.clicks", "page = '/late'")).toBe(40);
504
+ expect(await q(at, "SELECT name FROM system.tables WHERE database = 'depot' AND name LIKE 'clicks\\_\\_chant%'")).toEqual([]);
505
+ const plan = await planAgainstServer("e2e", join(dir, "clicks-v2.json"), { config: {}, env: { CLICKHOUSE_URL: at.url } });
506
+ expect(plan.changes).toEqual([]);
507
+ }
508
+ // The view, re-attached while r2 was down, counts an insert on r2.
509
+ await q(r2(), "INSERT INTO depot.clicks VALUES (now(), 1, '/after')");
510
+ await q(r1(), "SYSTEM SYNC REPLICA depot.clicks_daily LIGHTWEIGHT");
511
+ expect(Number((await q<{ n: string }>(r1(), "SELECT sum(n) AS n FROM depot.clicks_daily WHERE day = today()"))[0]!.n)).toBeGreaterThanOrEqual(1);
512
+ }, 300_000);
513
+ });