@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,335 @@
1
+ /**
2
+ * The migration of a column that indexes, constraints and views use
3
+ * (#3322), against the pinned server.
4
+ *
5
+ * - `integer` to `bigint` on a primary key another table references: the
6
+ * key's index, a partial index, a check and the other table's foreign key
7
+ * are made on the new column before the switch, and a view that reads the
8
+ * column is made again at the switch with its grant; the old column is
9
+ * then dropped with nothing left using it.
10
+ * - A rename of a uniquely indexed `email` to `login`: the unique
11
+ * constraint and an index take the new column's names, readers on the old
12
+ * name keep their index until the contract.
13
+ * - What the Op does not carry (a materialized view, a view the build does
14
+ * not declare) is refused at the Plan, naming it.
15
+ *
16
+ * Needs Docker; skips cleanly without it.
17
+ */
18
+
19
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
20
+ import { tmpdir } from "node:os";
21
+ import { join } from "node:path";
22
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
23
+ import { normalizeApply } from "@intentius/chant/apply";
24
+ import type { OpRunResult } from "@intentius/chant/op";
25
+ import { dockerAvailable, startTestPostgres, type TestPostgres } from "../testing/server";
26
+ import { ApprovingLedger, runMigrationOp, runOutcome } from "../testing/migration";
27
+ import type { PostgresClient } from "../live/client";
28
+ import { planPgAgainstServer } from "../plan/commands";
29
+ import { postgresApply } from "../../op/activities/postgres-apply";
30
+ import { toApplyResult } from "../../op/activities";
31
+ import { postgresMigrationPlan, type PostgresMigrationDeps } from "../../op/activities/postgres-migration";
32
+ import type { PostgresMigrationOpConfig } from "./op";
33
+ import { build } from "@intentius/chant/build";
34
+ import { sqlPlugin, sqlSerializer } from "../../index";
35
+
36
+ const enabled = await dockerAvailable();
37
+ let server: TestPostgres | undefined;
38
+ let admin: PostgresClient | undefined;
39
+ const dir = mkdtempSync(join(tmpdir(), "chant-pg-carry-"));
40
+
41
+ beforeAll(async () => {
42
+ if (!enabled) return;
43
+ server = await startTestPostgres();
44
+ admin = await server.connect();
45
+ }, 600_000);
46
+
47
+ afterAll(async () => {
48
+ await admin?.end();
49
+ await server?.stop();
50
+ rmSync(dir, { recursive: true, force: true });
51
+ });
52
+
53
+ interface Obj {
54
+ export: string;
55
+ type: string;
56
+ ddl: string;
57
+ dependsOn?: string[];
58
+ }
59
+
60
+ function writeBuild(file: string, objects: Obj[]): string {
61
+ writeFileSync(join(dir, file), JSON.stringify({ dialect: "postgres", postgresMajor: 18, applyOrder: objects.map((o) => o.export), objects: objects.map((o) => ({ dependsOn: [], ...o })) }));
62
+ return file;
63
+ }
64
+
65
+ const MARKER = { stack: "e2e", env: "test" };
66
+ const profile = () => ({
67
+ config: { ownership: MARKER, sql: { profiles: { e2e: { url: server!.endpoint().url, password: { env: "PG_E2E_PASSWORD" } } } } },
68
+ env: { PG_E2E_PASSWORD: server!.endpoint().password },
69
+ });
70
+ const deps = (): PostgresMigrationDeps => ({ ...profile(), log: () => undefined });
71
+ const apply = (file: string) => postgresApply({ buildPath: join(dir, file), environment: "e2e" }, undefined, { ...profile(), log: () => undefined });
72
+ const plan = (file: string) => planPgAgainstServer("e2e", join(dir, file), profile());
73
+ const one = async <T>(sql: string): Promise<T> => (await admin!.query<T>(sql))[0]!;
74
+ const all = async <T>(sql: string): Promise<T[]> => admin!.query<T>(sql);
75
+ const columnsOf = async (table: string) =>
76
+ (await all<{ name: string }>(`SELECT attname AS name FROM pg_catalog.pg_attribute WHERE attrelid = '${table}'::regclass AND attnum > 0 AND NOT attisdropped ORDER BY attnum`)).map((r) => r.name);
77
+ const constraintsOf = async (table: string) =>
78
+ all<{ name: string; def: string; validated: boolean }>(
79
+ `SELECT conname AS name, pg_catalog.pg_get_constraintdef(oid) AS def, convalidated AS validated FROM pg_catalog.pg_constraint WHERE conrelid = '${table}'::regclass AND contype <> 'n' ORDER BY conname`,
80
+ );
81
+ const indexesOf = async (table: string) =>
82
+ all<{ name: string; def: string }>(`SELECT c.relname AS name, pg_catalog.pg_get_indexdef(c.oid) AS def FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class c ON c.oid = i.indexrelid WHERE i.indrelid = '${table}'::regclass ORDER BY 1`);
83
+ const outcome = runOutcome;
84
+ const runOp = (config: PostgresMigrationOpConfig, ledger: ApprovingLedger): Promise<OpRunResult> => runMigrationOp(config, ledger.port, deps);
85
+
86
+ const schemaObj = (name: string): Obj => ({ export: name, type: "Postgres::Schema", ddl: `CREATE SCHEMA ${name}` });
87
+
88
+ describe.skipIf(!enabled)("integer to bigint on a primary key another table references", () => {
89
+ const ACCT = schemaObj("acct");
90
+ const accounts = (id: string): Obj => ({
91
+ export: "accounts",
92
+ type: "Postgres::Table",
93
+ dependsOn: ["acct"],
94
+ ddl: `CREATE TABLE acct.accounts (
95
+ id ${id} CONSTRAINT accounts_pkey PRIMARY KEY,
96
+ name text NOT NULL,
97
+ CONSTRAINT accounts_id_check CHECK (id > 0)
98
+ );
99
+ COMMENT ON CONSTRAINT accounts_pkey ON acct.accounts IS 'One per account'`,
100
+ });
101
+ const ENTRIES: Obj = {
102
+ export: "entries",
103
+ type: "Postgres::Table",
104
+ dependsOn: ["acct", "accounts"],
105
+ ddl: "CREATE TABLE acct.entries (id integer PRIMARY KEY, account_id integer NOT NULL REFERENCES acct.accounts (id) ON DELETE CASCADE, amount numeric NOT NULL)",
106
+ };
107
+ const BY_NAME: Obj = { export: "accountsByName", type: "Postgres::Index", dependsOn: ["accounts"], ddl: "CREATE INDEX accounts_name_id_idx ON acct.accounts (name, id) WHERE id > 100" };
108
+ const BALANCES: Obj = {
109
+ export: "balances",
110
+ type: "Postgres::View",
111
+ dependsOn: ["accounts", "entries"],
112
+ ddl: "CREATE VIEW acct.balances AS SELECT a.id, a.name, sum(e.amount) AS balance FROM acct.accounts a JOIN acct.entries e ON e.account_id = a.id GROUP BY a.id, a.name",
113
+ };
114
+ const V1 = [ACCT, accounts("integer"), ENTRIES, BY_NAME, BALANCES];
115
+ const V2 = [ACCT, accounts("bigint"), ENTRIES, BY_NAME, BALANCES];
116
+ const config = (): PostgresMigrationOpConfig => ({
117
+ name: "migrate-accounts-id",
118
+ env: "e2e",
119
+ table: "acct.accounts",
120
+ column: "id",
121
+ build: false,
122
+ path: dir,
123
+ output: "accounts-v2.json",
124
+ retain: "0s",
125
+ batchSize: 400,
126
+ stack: MARKER.stack,
127
+ ownershipEnv: MARKER.env,
128
+ });
129
+ const ledger = new ApprovingLedger();
130
+
131
+ test("carried over, switched and contracted: the key, the index, the check, the other table's foreign key and the view are on the bigint column", async () => {
132
+ expect(normalizeApply(toApplyResult(await apply(writeBuild("accounts-v1.json", V1)))).notAttempted).toEqual([]);
133
+ await admin!.query("INSERT INTO acct.accounts SELECT g, 'a' || g FROM generate_series(1, 1000) g");
134
+ await admin!.query("INSERT INTO acct.entries SELECT g, (g % 1000) + 1, g FROM generate_series(1, 3000) g");
135
+ await admin!.query("CREATE ROLE reporter");
136
+ await admin!.query("GRANT SELECT ON acct.balances TO reporter");
137
+ writeBuild("accounts-v2.json", V2);
138
+ expect((await plan("accounts-v2.json")).changes.map((c) => [c.rule, c.field])).toEqual([["SQLPG207", "columns.id.type"]]);
139
+
140
+ const first = await runOp(config(), ledger);
141
+ expect(first.status).toBe("gated");
142
+ expect(outcome(first, "Change")).toBe("type");
143
+ expect(outcome(first, "CarriedBuilt")).toBe(4);
144
+ expect(String(outcome(first, "Verification"))).toMatch(/1000 row\(s\).*check accounts_id_check, key accounts_pkey, foreign-key entries_account_id_fkey, index accounts_name_id_idx carried over, view\(s\) acct\.balances made again at the switch/);
145
+ // The working copies are there, valid, and out of every plan.
146
+ expect((await indexesOf("acct.accounts")).map((i) => i.def)).toEqual([
147
+ "CREATE INDEX accounts_name_id_idx ON acct.accounts USING btree (name, id) WHERE (id > 100)",
148
+ "CREATE INDEX accounts_name_id_idx__chant_new ON acct.accounts USING btree (name, id__chant_new) WHERE (id__chant_new > 100)",
149
+ "CREATE UNIQUE INDEX accounts_pkey ON acct.accounts USING btree (id)",
150
+ "CREATE UNIQUE INDEX accounts_pkey__chant_new ON acct.accounts USING btree (id__chant_new)",
151
+ ]);
152
+ expect(await constraintsOf("acct.entries")).toEqual([
153
+ { name: "entries_account_id_fkey", def: "FOREIGN KEY (account_id) REFERENCES acct.accounts(id) ON DELETE CASCADE", validated: true },
154
+ { name: "entries_account_id_fkey__chant_new", def: "FOREIGN KEY (account_id) REFERENCES acct.accounts(id__chant_new) ON DELETE CASCADE", validated: true },
155
+ { name: "entries_pkey", def: "PRIMARY KEY (id)", validated: true },
156
+ ]);
157
+ expect((await plan("accounts-v2.json")).changes.map((c) => c.rule)).toEqual(["SQLPG207"]);
158
+ // Writes during the migration: both keys hold, and a cascade goes through both foreign keys.
159
+ await admin!.query("INSERT INTO acct.accounts (id, name) VALUES (5000, 'late')");
160
+ await admin!.query("INSERT INTO acct.entries VALUES (9000, 5000, 1)");
161
+ await expect(admin!.query("INSERT INTO acct.entries VALUES (9001, 7777, 1)")).rejects.toThrow(/violates foreign key constraint/);
162
+ await admin!.query("DELETE FROM acct.accounts WHERE id = 1000");
163
+ expect(await one("SELECT count(*)::int AS n FROM acct.entries WHERE account_id = 1000")).toEqual({ n: 0 });
164
+
165
+ // A second run carries nothing again.
166
+ const again = await runOp(config(), ledger);
167
+ expect(again.status).toBe("gated");
168
+ expect(outcome(again, "CarriedBuilt")).toBe(0);
169
+ expect(again.gate!.planDigest).toBe(first.gate!.planDigest);
170
+
171
+ ledger.approveLast();
172
+ const switched = await runOp(config(), ledger);
173
+ expect(switched.status).toBe("gated");
174
+ expect(switched.gate).toMatchObject({ gate: "approve-migrate-accounts-id-contract" });
175
+ expect(await one("SELECT pg_catalog.format_type(atttypid, atttypmod) AS t FROM pg_catalog.pg_attribute WHERE attrelid = 'acct.accounts'::regclass AND attname = 'id'")).toEqual({ t: "bigint" });
176
+ expect(await constraintsOf("acct.accounts")).toEqual([
177
+ { name: "accounts_id_check", def: "CHECK ((id > 0))", validated: true },
178
+ { name: "accounts_pkey", def: "PRIMARY KEY (id)", validated: true },
179
+ ]);
180
+ expect(await one("SELECT pg_catalog.obj_description(oid, 'pg_constraint') AS c FROM pg_catalog.pg_constraint WHERE conname = 'accounts_pkey'")).toEqual({ c: "One per account" });
181
+ expect(await constraintsOf("acct.entries")).toEqual([
182
+ { name: "entries_account_id_fkey", def: "FOREIGN KEY (account_id) REFERENCES acct.accounts(id) ON DELETE CASCADE", validated: true },
183
+ { name: "entries_pkey", def: "PRIMARY KEY (id)", validated: true },
184
+ ]);
185
+ expect((await indexesOf("acct.accounts")).map((i) => i.def)).toEqual([
186
+ "CREATE INDEX accounts_name_id_idx ON acct.accounts USING btree (name, id) WHERE (id > 100)",
187
+ "CREATE UNIQUE INDEX accounts_pkey ON acct.accounts USING btree (id)",
188
+ ]);
189
+ // The view reads the bigint column, and the reporter can still read it.
190
+ expect(await one("SELECT pg_catalog.format_type(atttypid, atttypmod) AS t FROM pg_catalog.pg_attribute WHERE attrelid = 'acct.balances'::regclass AND attname = 'id'")).toEqual({ t: "bigint" });
191
+ expect(await one("SELECT pg_catalog.has_table_privilege('reporter', 'acct.balances', 'SELECT') AS ok")).toEqual({ ok: true });
192
+ expect(await one("SELECT balance::int AS b FROM acct.balances WHERE id = 5000")).toEqual({ b: 1 });
193
+ expect((await plan("accounts-v2.json")).changes).toEqual([]);
194
+ // The keys hold on the new column: past integer's range, and against a missing account.
195
+ await admin!.query("INSERT INTO acct.accounts (id, name) VALUES (3000000000, 'big')");
196
+ await admin!.query("INSERT INTO acct.entries VALUES (9002, 5000, 2)");
197
+ await expect(admin!.query("INSERT INTO acct.entries VALUES (9003, 7777, 1)")).rejects.toThrow(/violates foreign key constraint "entries_account_id_fkey"/);
198
+ await expect(admin!.query("INSERT INTO acct.accounts (id, name) VALUES (5000, 'again')")).rejects.toThrow(/violates unique constraint "accounts_pkey"/);
199
+
200
+ ledger.approveLast();
201
+ const contracted = await runOp(config(), ledger);
202
+ expect(contracted.status).toBe("ok");
203
+ expect(await columnsOf("acct.accounts")).toEqual(["name", "id"]);
204
+ expect((await plan("accounts-v2.json")).changes).toEqual([]);
205
+ }, 300_000);
206
+ });
207
+
208
+ describe.skipIf(!enabled)("a rename of a uniquely indexed email", () => {
209
+ const PEOPLE_SCHEMA = schemaObj("crm");
210
+ const people = (column: string, hint = ""): Obj => ({
211
+ export: "people",
212
+ type: "Postgres::Table",
213
+ dependsOn: ["crm"],
214
+ ddl: `CREATE TABLE crm.people (
215
+ id bigint PRIMARY KEY,
216
+ ${column} text NOT NULL UNIQUE,${hint}
217
+ name text
218
+ )`,
219
+ });
220
+ const byName = (column: string): Obj => ({ export: "peopleByName", type: "Postgres::Index", dependsOn: ["people"], ddl: `CREATE INDEX people_${column}_name_idx ON crm.people (${column}, name)` });
221
+ const V1 = [PEOPLE_SCHEMA, people("email"), byName("email")];
222
+ const V2 = [PEOPLE_SCHEMA, people("login", " -- previously: email"), byName("login")];
223
+ const config = (): PostgresMigrationOpConfig => ({
224
+ name: "migrate-people-login",
225
+ env: "e2e",
226
+ table: "crm.people",
227
+ column: "login",
228
+ build: false,
229
+ path: dir,
230
+ output: "people-v2.json",
231
+ retain: "0s",
232
+ stack: MARKER.stack,
233
+ ownershipEnv: MARKER.env,
234
+ });
235
+ const ledger = new ApprovingLedger();
236
+
237
+ test("the unique constraint and the index move to login under login's names; old readers keep theirs until the contract", async () => {
238
+ await apply(writeBuild("people-v1.json", V1));
239
+ await admin!.query("INSERT INTO crm.people SELECT g, 'p' || g || '@example.com', 'n' || g FROM generate_series(1, 1500) g");
240
+ writeBuild("people-v2.json", V2);
241
+
242
+ const first = await runOp(config(), ledger);
243
+ expect(first.status).toBe("gated");
244
+ expect(outcome(first, "Change")).toBe("rename");
245
+ expect(String(outcome(first, "Verification"))).toMatch(/key people_email_key \(as people_login_key\), index people_email_name_idx \(as people_login_name_idx\) carried over/);
246
+ // The unique index on login enforces during the migration, whichever name a writer uses.
247
+ await expect(admin!.query("INSERT INTO crm.people (id, email) VALUES (5000, 'p1@example.com')")).rejects.toThrow(/violates unique constraint/);
248
+
249
+ ledger.approveLast();
250
+ const switched = await runOp(config(), ledger);
251
+ expect(switched.status).toBe("gated");
252
+ expect(await constraintsOf("crm.people")).toEqual([
253
+ { name: "people_email_key__chant_old", def: "UNIQUE (email)", validated: true },
254
+ { name: "people_login_key", def: "UNIQUE (login)", validated: true },
255
+ { name: "people_pkey", def: "PRIMARY KEY (id)", validated: true },
256
+ ]);
257
+ expect((await indexesOf("crm.people")).map((i) => i.name)).toEqual(["people_email_key__chant_old", "people_email_name_idx__chant_old", "people_login_key", "people_login_name_idx", "people_pkey"]);
258
+ // The plan sees login with its unique constraint and index, as declared; the kept ones on email are left out.
259
+ expect((await plan("people-v2.json")).changes).toEqual([]);
260
+ await expect(admin!.query("INSERT INTO crm.people (id, login) VALUES (5001, 'p2@example.com')")).rejects.toThrow(/violates unique constraint/);
261
+ await admin!.query("INSERT INTO crm.people (id, email) VALUES (5002, 'old@example.com')");
262
+ expect(await one("SELECT login FROM crm.people WHERE id = 5002")).toEqual({ login: "old@example.com" });
263
+
264
+ ledger.approveLast();
265
+ expect((await runOp(config(), ledger)).status).toBe("ok");
266
+ expect(await columnsOf("crm.people")).toEqual(["id", "name", "login"]);
267
+ expect((await indexesOf("crm.people")).map((i) => i.name)).toEqual(["people_login_key", "people_login_name_idx", "people_pkey"]);
268
+ expect((await plan("people-v2.json")).changes).toEqual([]);
269
+ }, 300_000);
270
+ });
271
+
272
+ describe.skipIf(!enabled)("what the Op does not carry is refused at the Plan", () => {
273
+ const INV = schemaObj("inv");
274
+ const items = (qty: string): Obj => ({ export: "items", type: "Postgres::Table", dependsOn: ["inv"], ddl: `CREATE TABLE inv.items (id bigint PRIMARY KEY, qty ${qty})` });
275
+ const args = (output: string) => ({ table: "inv.items", column: "qty", buildPath: output, environment: "e2e", stack: MARKER.stack, ownershipEnv: MARKER.env, cwd: dir });
276
+
277
+ test("a materialized view, and a view the build does not declare", async () => {
278
+ await apply(writeBuild("items-v1.json", [INV, items("integer")]));
279
+ await admin!.query("CREATE MATERIALIZED VIEW inv.totals AS SELECT sum(qty) AS total FROM inv.items");
280
+ await admin!.query("CREATE VIEW inv.stock AS SELECT id, qty FROM inv.items");
281
+ writeBuild("items-v2.json", [INV, items("bigint")]);
282
+ const refusal = await postgresMigrationPlan(args("items-v2.json"), undefined, deps()).then(
283
+ () => "",
284
+ (e: unknown) => String((e as Error).message),
285
+ );
286
+ expect(refusal).toMatch(/^inv\.items\.qty is used by what the migration Op does not carry over to the new column: /);
287
+ expect(refusal).toContain("view inv.stock reads the column, and the build does not declare it; the switch makes each such view again from its declaration");
288
+ expect(refusal).toContain("materialized view inv.totals reads the column; making it again would scan in the switch's transaction");
289
+ }, 120_000);
290
+ });
291
+
292
+ describe.skipIf(!enabled)("the postgres-column-rename example", () => {
293
+ test("its rename of a unique username to login plans as the Op and runs to the end", async () => {
294
+ const result = await build(join(import.meta.dirname, "../../../examples/postgres-column-rename/src"), [sqlSerializer], undefined, {
295
+ fold: true,
296
+ intrinsics: sqlPlugin.intrinsics!(),
297
+ lexicons: ["sql"],
298
+ });
299
+ expect(result.errors).toEqual([]);
300
+ writeFileSync(join(dir, "example.json"), (result.outputs.get("sql") as { primary: string }).primary);
301
+ // The server as it was before the example's change: the column is still username.
302
+ await admin!.query("CREATE SCHEMA app");
303
+ await admin!.query("CREATE TABLE app.users (id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, username text NOT NULL UNIQUE, created_at timestamptz NOT NULL DEFAULT now())");
304
+ await admin!.query("INSERT INTO app.users (username) SELECT 'user' || g FROM generate_series(1, 300) g");
305
+ const p = await plan("example.json");
306
+ expect(p.migrationOps?.map((o) => [o.table, o.column, o.rule])).toEqual([["app.users", "login", "SQLPG205"]]);
307
+
308
+ const ledger = new ApprovingLedger();
309
+ const c: PostgresMigrationOpConfig = { name: "rename-users-username-to-login", env: "e2e", table: "app.users", column: "login", build: false, path: dir, output: "example.json", retain: "0s", stack: MARKER.stack, ownershipEnv: MARKER.env };
310
+ const statuses: string[] = [];
311
+ let last: OpRunResult | undefined;
312
+ for (let i = 0; i < 4; i++) {
313
+ last = await runOp(c, ledger);
314
+ statuses.push(last.status);
315
+ if (last.status !== "gated") break;
316
+ ledger.approveLast();
317
+ }
318
+ expect(statuses).toEqual(["gated", "gated", "ok"]);
319
+ expect(await columnsOf("app.users")).toEqual(["id", "created_at", "login"]);
320
+ expect(await constraintsOf("app.users")).toEqual([
321
+ { name: "users_login_key", def: "UNIQUE (login)", validated: true },
322
+ { name: "users_pkey", def: "PRIMARY KEY (id)", validated: true },
323
+ ]);
324
+ expect((await plan("example.json")).changes.filter((ch) => ch.object.includes("users"))).toEqual([]);
325
+
326
+ // A finished migration reports done, and no outcome of a step that had nothing to do.
327
+ const done = await runOp(c, ledger);
328
+ expect(done.status).toBe("ok");
329
+ expect(outcome(done, "MigrationState")).toBe("done");
330
+ const names = done.records.flatMap((r) => r.outcomes ?? []);
331
+ expect(names.every((o) => o.value !== undefined)).toBe(true);
332
+ expect(names.map((o) => o.name)).not.toContain("OldColumn");
333
+ expect(names.map((o) => o.name)).not.toContain("RetainUntil");
334
+ }, 300_000);
335
+ });
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Carrying what uses the migrated column over to the new one (#3322), the
3
+ * parts that need no server: the column references rewritten in an index,
4
+ * a check and a foreign key, the names a rename gives, and the switch's
5
+ * statements. `carry.e2e.test.ts` runs them against the pinned server.
6
+ */
7
+
8
+ import { describe, expect, test } from "vitest";
9
+ import { carriedIndexStatement, carriedSwitchStatements, renamedDefault, replaceColumn, replaceInForeignKey, requiresNotNull, type CarriedObject } from "./carry";
10
+
11
+ describe("column references", () => {
12
+ test("only the column: not a qualifier, a function, a cast's type, an access method or a string", () => {
13
+ expect(replaceColumn("CHECK ((id > 0) AND (lower(name) <> 'id') AND (id::text <> t.id))", "id", "id__chant_new")).toBe(
14
+ "CHECK ((id__chant_new > 0) AND (lower(name) <> 'id') AND (id__chant_new::text <> t.id))",
15
+ );
16
+ expect(replaceColumn("x::text", "text", "y")).toBe("x::text");
17
+ expect(replaceColumn('("Email" = email)', "Email", "login")).toBe("(login = email)");
18
+ });
19
+
20
+ test("an index: CONCURRENTLY under its working name, the column replaced in its keys, INCLUDE and WHERE", () => {
21
+ expect(carriedIndexStatement("CREATE INDEX t_a_idx ON d.t USING btree (a, b) INCLUDE (a) WHERE (a > 0)", "t_a_idx__chant_new", "a", "a__chant_new")).toBe(
22
+ "CREATE INDEX CONCURRENTLY t_a_idx__chant_new ON d.t USING btree (a__chant_new, b) INCLUDE (a__chant_new) WHERE (a__chant_new > 0)",
23
+ );
24
+ expect(carriedIndexStatement("CREATE UNIQUE INDEX users_email_key ON app.users USING btree (email) NULLS NOT DISTINCT", "users_email_key__chant_new", "email", "login")).toBe(
25
+ "CREATE UNIQUE INDEX CONCURRENTLY users_email_key__chant_new ON app.users USING btree (login) NULLS NOT DISTINCT",
26
+ );
27
+ });
28
+
29
+ test("a foreign key: the referencing side, the referenced side, or both for one onto its own table", () => {
30
+ const def = "FOREIGN KEY (id) REFERENCES app.users(id) ON DELETE SET NULL (id)";
31
+ expect(replaceInForeignKey(def, "id", "n", { local: false, referenced: true })).toBe("FOREIGN KEY (id) REFERENCES app.users(n) ON DELETE SET NULL (id)");
32
+ expect(replaceInForeignKey(def, "id", "n", { local: true, referenced: false })).toBe("FOREIGN KEY (n) REFERENCES app.users(id) ON DELETE SET NULL (n)");
33
+ expect(replaceInForeignKey(def, "id", "n", { local: true, referenced: true })).toBe("FOREIGN KEY (n) REFERENCES app.users(n) ON DELETE SET NULL (n)");
34
+ });
35
+ });
36
+
37
+ describe("names after a rename", () => {
38
+ test("a name Postgres made from the old column becomes the one it makes from the new; any other is kept", () => {
39
+ expect(renamedDefault("users_email_key", "users", ["email"], ["login"], "key")).toBe("users_login_key");
40
+ expect(renamedDefault("users_tenant_email_key", "users", ["tenant", "email"], ["tenant", "login"], "key")).toBe("users_tenant_login_key");
41
+ expect(renamedDefault("unique_email", "users", ["email"], ["login"], "key")).toBeUndefined();
42
+ expect(renamedDefault(`users_email_key`, "users", ["email"], ["l".repeat(60)], "key")).toBeUndefined();
43
+ });
44
+ });
45
+
46
+ const key = (over: Partial<CarriedObject> = {}): CarriedObject => ({
47
+ kind: "key",
48
+ name: "accounts_pkey",
49
+ table: "acct.accounts",
50
+ tableName: "acct.accounts",
51
+ tableOid: "1",
52
+ schema: "acct",
53
+ working: "accounts_pkey__chant_new",
54
+ target: "accounts_pkey",
55
+ definition: "CREATE UNIQUE INDEX CONCURRENTLY accounts_pkey__chant_new ON acct.accounts USING btree (id__chant_new)",
56
+ primary: true,
57
+ validated: true,
58
+ ...over,
59
+ });
60
+
61
+ describe("the switch", () => {
62
+ const old = (c: CarriedObject) => `old ${c.name}`;
63
+
64
+ test("foreign keys first, then checks, keys and indexes; a type change drops the old ones", () => {
65
+ const fk: CarriedObject = { ...key(), kind: "foreign-key", name: "entries_account_id_fkey", table: "acct.entries", working: "entries_account_id_fkey__chant_new", target: "entries_account_id_fkey", comment: "Each entry's account" };
66
+ delete fk.primary;
67
+ const idx: CarriedObject = { ...key(), kind: "index", name: "accounts_name_id_idx", working: "accounts_name_id_idx__chant_new", target: "accounts_name_id_idx", clustered: true };
68
+ delete idx.primary;
69
+ const { before, after } = carriedSwitchStatements([idx, key({ comment: "One per account", deferral: " DEFERRABLE" }), fk], [], "type", old, undefined);
70
+ expect(before).toEqual([
71
+ "ALTER TABLE acct.entries DROP CONSTRAINT entries_account_id_fkey",
72
+ "ALTER TABLE acct.entries RENAME CONSTRAINT entries_account_id_fkey__chant_new TO entries_account_id_fkey",
73
+ "COMMENT ON CONSTRAINT entries_account_id_fkey ON acct.entries IS 'Each entry''s account'",
74
+ "ALTER TABLE acct.accounts DROP CONSTRAINT accounts_pkey",
75
+ "ALTER TABLE acct.accounts ADD CONSTRAINT accounts_pkey PRIMARY KEY USING INDEX accounts_pkey__chant_new DEFERRABLE",
76
+ "COMMENT ON CONSTRAINT accounts_pkey ON acct.accounts IS 'One per account'",
77
+ "COMMENT ON INDEX acct.accounts_pkey IS NULL",
78
+ "DROP INDEX acct.accounts_name_id_idx",
79
+ "ALTER INDEX acct.accounts_name_id_idx__chant_new RENAME TO accounts_name_id_idx",
80
+ "COMMENT ON INDEX acct.accounts_name_id_idx IS NULL",
81
+ "ALTER TABLE acct.accounts CLUSTER ON accounts_name_id_idx",
82
+ ]);
83
+ expect(after).toEqual([]);
84
+ });
85
+
86
+ test("a rename keeps the old unique constraint and index for readers of the old name, under __chant_old, until the contract", () => {
87
+ const u = key({ primary: false, name: "users_email_key", working: "users_email_key__chant_new", target: "users_login_key", table: "app.users", schema: "app", replicaIdentity: true });
88
+ const { before } = carriedSwitchStatements([u], [], "rename", old, undefined);
89
+ expect(before).toEqual([
90
+ "ALTER TABLE app.users RENAME CONSTRAINT users_email_key TO users_email_key__chant_old",
91
+ "COMMENT ON CONSTRAINT users_email_key__chant_old ON app.users IS 'old users_email_key'",
92
+ "ALTER TABLE app.users ADD CONSTRAINT users_login_key UNIQUE USING INDEX users_email_key__chant_new",
93
+ "COMMENT ON CONSTRAINT users_login_key ON app.users IS NULL",
94
+ "COMMENT ON INDEX app.users_login_key IS NULL",
95
+ "ALTER TABLE app.users REPLICA IDENTITY USING INDEX users_login_key",
96
+ ]);
97
+ });
98
+
99
+ test("a primary key makes the new column NOT NULL whatever the column declares", () => {
100
+ expect(requiresNotNull({ name: "id", type: "bigint" }, [key()])).toBe(true);
101
+ expect(requiresNotNull({ name: "id", type: "bigint" }, [key({ primary: false })])).toBe(false);
102
+ });
103
+ });