@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,34 @@
1
+ /** Column clauses: defaults, generated columns and identity. */
2
+
3
+ import { arg, type Clause } from "./kinds";
4
+
5
+ export const COLUMN_CLAUSES: Record<string, Clause> = {
6
+ default: { summary: "DEFAULT expression", args: [arg("expression", "expression")] },
7
+ generated: {
8
+ summary: "GENERATED ALWAYS AS (expression) STORED",
9
+ // VIRTUAL generated columns arrive in 18; before that only STORED is accepted.
10
+ args: [arg("expression", "expression"), arg("storage", "keyword", { optional: true, values: ["STORED", "VIRTUAL"] })],
11
+ },
12
+ identity: {
13
+ summary: "GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [(sequence options)]",
14
+ args: [arg("generation", "keyword", { values: ["ALWAYS", "BY DEFAULT"] }), arg("sequence", "identifier", { optional: true })],
15
+ },
16
+ collate: { summary: "COLLATE collation", args: [arg("collation", "identifier")] },
17
+ compression: { summary: "COMPRESSION method", args: [arg("method", "keyword", { values: ["pglz", "lz4"] })] },
18
+ storage: {
19
+ summary: "STORAGE mode",
20
+ args: [arg("mode", "keyword", { values: ["PLAIN", "EXTERNAL", "EXTENDED", "MAIN", "DEFAULT"] })],
21
+ },
22
+ };
23
+
24
+ /** The options of an identity column's sequence and of `CREATE SEQUENCE`. */
25
+ export const SEQUENCE_OPTIONS: Record<string, readonly ReturnType<typeof arg>[]> = {
26
+ asType: [arg("type", "type")],
27
+ incrementBy: [arg("increment", "number")],
28
+ minValue: [arg("minimum", "number")],
29
+ maxValue: [arg("maximum", "number")],
30
+ start: [arg("start", "number")],
31
+ cache: [arg("cache", "number", { range: [1, Number.MAX_SAFE_INTEGER] })],
32
+ cycle: [arg("cycle", "boolean")],
33
+ ownedBy: [arg("column", "identifier")],
34
+ };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Constraint grammar: the arguments of each table and column constraint.
3
+ * `MATCH`, `ON DELETE` and `DEFERRABLE` are grammar, not catalog.
4
+ */
5
+
6
+ import { arg, type Clause } from "./kinds";
7
+
8
+ export const REFERENTIAL_ACTIONS = ["NO ACTION", "RESTRICT", "CASCADE", "SET NULL", "SET DEFAULT"] as const;
9
+
10
+ const deferral = [
11
+ arg("deferrable", "boolean", { optional: true }),
12
+ arg("initially", "keyword", { optional: true, values: ["DEFERRED", "IMMEDIATE"] }),
13
+ ];
14
+
15
+ export const CONSTRAINTS: Record<string, Clause> = {
16
+ primaryKey: {
17
+ summary: "PRIMARY KEY (columns) [INCLUDE (columns)] [USING INDEX TABLESPACE name]",
18
+ args: [arg("columns", "column", { repeated: true }), arg("include", "column", { optional: true, repeated: true }), ...deferral],
19
+ },
20
+ unique: {
21
+ summary: "UNIQUE [NULLS [NOT] DISTINCT] (columns) [INCLUDE (columns)]",
22
+ args: [
23
+ arg("columns", "column", { repeated: true }),
24
+ arg("nullsNotDistinct", "boolean", { optional: true }),
25
+ arg("include", "column", { optional: true, repeated: true }),
26
+ ...deferral,
27
+ ],
28
+ since: 15,
29
+ },
30
+ check: {
31
+ summary: "CHECK (expression) [NO INHERIT]",
32
+ args: [arg("expression", "expression"), arg("noInherit", "boolean", { optional: true })],
33
+ },
34
+ foreignKey: {
35
+ summary: "FOREIGN KEY (columns) REFERENCES table (columns) [MATCH FULL | SIMPLE] [ON DELETE action] [ON UPDATE action]",
36
+ args: [
37
+ arg("columns", "column", { repeated: true }),
38
+ arg("references", "identifier"),
39
+ arg("referencedColumns", "column", { optional: true, repeated: true }),
40
+ arg("match", "keyword", { optional: true, values: ["FULL", "SIMPLE"] }),
41
+ arg("onDelete", "keyword", { optional: true, values: REFERENTIAL_ACTIONS }),
42
+ arg("onUpdate", "keyword", { optional: true, values: REFERENTIAL_ACTIONS }),
43
+ ...deferral,
44
+ ],
45
+ },
46
+ exclude: {
47
+ summary: "EXCLUDE [USING method] (element WITH operator, ...) [WHERE (predicate)]",
48
+ args: [
49
+ arg("using", "keyword", { optional: true, values: ["gist", "spgist", "btree", "hash"] }),
50
+ arg("elements", "expression", { repeated: true }),
51
+ arg("where", "expression", { optional: true }),
52
+ ...deferral,
53
+ ],
54
+ },
55
+ notNull: { summary: "NOT NULL [NO INHERIT]", args: [arg("noInherit", "boolean", { optional: true })], since: 18 },
56
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Index clauses. Which access method supports which of them is in the catalog
3
+ * (`INDEX_METHOD_PROPERTIES`: `can_include`, `can_unique`, ...); the clause
4
+ * shapes are here.
5
+ */
6
+
7
+ import { arg, type Clause } from "./kinds";
8
+
9
+ export const INDEX_CLAUSES: Record<string, Clause> = {
10
+ key: {
11
+ summary: "{ column | (expression) } [COLLATE collation] [opclass [(parameters)]] [ASC | DESC] [NULLS FIRST | LAST]",
12
+ args: [
13
+ arg("key", "expression"),
14
+ arg("collation", "identifier", { optional: true }),
15
+ arg("opclass", "identifier", { optional: true }),
16
+ arg("order", "keyword", { optional: true, values: ["ASC", "DESC"] }),
17
+ arg("nulls", "keyword", { optional: true, values: ["FIRST", "LAST"] }),
18
+ ],
19
+ },
20
+ using: { summary: "USING method", args: [arg("method", "keyword")] },
21
+ include: { summary: "INCLUDE (columns)", args: [arg("columns", "column", { repeated: true })] },
22
+ where: { summary: "WHERE predicate: a partial index", args: [arg("predicate", "expression")] },
23
+ nullsNotDistinct: { summary: "NULLS [NOT] DISTINCT, on a unique index", args: [arg("notDistinct", "boolean")], since: 15 },
24
+ tablespace: { summary: "TABLESPACE name", args: [arg("tablespace", "identifier")] },
25
+ concurrently: { summary: "CREATE INDEX CONCURRENTLY: not inside a transaction block", args: [arg("concurrently", "boolean")] },
26
+ only: { summary: "ON ONLY parent: an index on a partitioned table's parent without its partitions", args: [arg("only", "boolean")] },
27
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * What kind of value a clause argument takes. The catalog lists names (types,
3
+ * access methods, operator classes); it never says that `varchar`'s one
4
+ * argument is a length or that `ON DELETE` takes one of five actions. The
5
+ * overlays say that, with these.
6
+ */
7
+ export type ArgumentKind =
8
+ /** A column of the table, by name. */
9
+ | "column"
10
+ /** Any expression; in an index key or a check, over the table's columns. */
11
+ | "expression"
12
+ /** A schema-qualified or bare object name. */
13
+ | "identifier"
14
+ /** A string literal. */
15
+ | "string"
16
+ /** A numeric literal. */
17
+ | "number"
18
+ /** A boolean. */
19
+ | "boolean"
20
+ /** A bare keyword from a fixed set (`values`). */
21
+ | "keyword"
22
+ /** A column type. */
23
+ | "type"
24
+ /** A query. */
25
+ | "query";
26
+
27
+ export interface ClauseArgument {
28
+ name: string;
29
+ kind: ArgumentKind;
30
+ optional?: boolean;
31
+ /** The argument repeats, comma separated. */
32
+ repeated?: boolean;
33
+ /** The legal values of a `keyword`. */
34
+ values?: readonly string[];
35
+ /** The inclusive range of a `number`. */
36
+ range?: readonly [number, number];
37
+ }
38
+
39
+ /** A clause that is in some majors and not others. A bound outside 14..18 is a mistake generation reports. */
40
+ export interface Versioned {
41
+ since?: number;
42
+ until?: number;
43
+ }
44
+
45
+ export type Clause = { args: readonly ClauseArgument[]; summary: string } & Versioned;
46
+
47
+ export const arg = (
48
+ name: string,
49
+ kind: ArgumentKind,
50
+ extra: Partial<Omit<ClauseArgument, "name" | "kind">> = {},
51
+ ): ClauseArgument => ({ name, kind, ...extra });
52
+
53
+ export const INT_MAX = 2147483647;
@@ -0,0 +1,26 @@
1
+ /** Partitioning: `PARTITION BY`, partition bounds, `DEFAULT` partitions, `ATTACH` and `DETACH`. */
2
+
3
+ import { arg, type Clause } from "./kinds";
4
+
5
+ export const PARTITION_STRATEGIES = ["RANGE", "LIST", "HASH"] as const;
6
+
7
+ export const PARTITIONING: Record<string, Clause> = {
8
+ partitionBy: {
9
+ summary: "PARTITION BY { RANGE | LIST | HASH } ({ column | (expression) } [COLLATE c] [opclass], ...)",
10
+ args: [arg("strategy", "keyword", { values: PARTITION_STRATEGIES }), arg("keys", "expression", { repeated: true })],
11
+ },
12
+ forValuesRange: { summary: "FOR VALUES FROM (bounds) TO (bounds); MINVALUE and MAXVALUE stand for unbounded", args: [arg("from", "expression", { repeated: true }), arg("to", "expression", { repeated: true })] },
13
+ forValuesList: { summary: "FOR VALUES IN (values)", args: [arg("values", "expression", { repeated: true })] },
14
+ forValuesHash: {
15
+ summary: "FOR VALUES WITH (MODULUS m, REMAINDER r)",
16
+ args: [arg("modulus", "number", { range: [1, 2147483647] }), arg("remainder", "number", { range: [0, 2147483646] })],
17
+ },
18
+ default: { summary: "DEFAULT partition", args: [] },
19
+ attach: { summary: "ALTER TABLE parent ATTACH PARTITION child { FOR VALUES ... | DEFAULT }", args: [arg("partition", "identifier")] },
20
+ detach: {
21
+ summary: "ALTER TABLE parent DETACH PARTITION child [CONCURRENTLY | FINALIZE]",
22
+ args: [arg("partition", "identifier"), arg("mode", "keyword", { optional: true, values: ["CONCURRENTLY", "FINALIZE"] })],
23
+ },
24
+ mergePartitions: { summary: "ALTER TABLE parent MERGE PARTITIONS (children) INTO child", args: [arg("partitions", "identifier", { repeated: true })], since: 18 },
25
+ splitPartition: { summary: "ALTER TABLE parent SPLIT PARTITION child INTO (partitions)", args: [arg("partition", "identifier")], since: 18 },
26
+ };
@@ -0,0 +1,29 @@
1
+ /** Table and relation clauses, views, materialized views and sequences. */
2
+
3
+ import { arg, type Clause } from "./kinds";
4
+
5
+ export const RELATION_CLAUSES: Record<string, Clause> = {
6
+ persistence: { summary: "{ TEMPORARY | UNLOGGED } TABLE", args: [arg("persistence", "keyword", { values: ["TEMPORARY", "UNLOGGED"] })] },
7
+ inherits: { summary: "INHERITS (parents)", args: [arg("parents", "identifier", { repeated: true })] },
8
+ tablespace: { summary: "TABLESPACE name", args: [arg("tablespace", "identifier")] },
9
+ using: { summary: "USING access_method", args: [arg("method", "keyword")] },
10
+ onCommit: { summary: "ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }, temporary tables only", args: [arg("action", "keyword", { values: ["PRESERVE ROWS", "DELETE ROWS", "DROP"] })] },
11
+ withParameters: { summary: "WITH (storage_parameter = value, ...)", args: [arg("parameters", "expression", { repeated: true })] },
12
+ likeSource: { summary: "LIKE source [INCLUDING | EXCLUDING option]", args: [arg("source", "identifier"), arg("options", "keyword", { optional: true, repeated: true, values: ["COMMENTS", "COMPRESSION", "CONSTRAINTS", "DEFAULTS", "GENERATED", "IDENTITY", "INDEXES", "STATISTICS", "STORAGE", "ALL"] })] },
13
+ ofType: { summary: "OF composite_type: a typed table", args: [arg("type", "identifier")] },
14
+ };
15
+
16
+ export const VIEW_CLAUSES: Record<string, Clause> = {
17
+ query: { summary: "AS query", args: [arg("query", "query")] },
18
+ columns: { summary: "(column_names)", args: [arg("columns", "column", { repeated: true })] },
19
+ recursive: { summary: "CREATE RECURSIVE VIEW", args: [arg("recursive", "boolean")] },
20
+ checkOption: { summary: "WITH [CASCADED | LOCAL] CHECK OPTION, on an updatable view", args: [arg("option", "keyword", { values: ["CASCADED", "LOCAL"] })] },
21
+ securityInvoker: { summary: "WITH (security_invoker = true): check permissions as the caller", args: [arg("securityInvoker", "boolean")], since: 15 },
22
+ securityBarrier: { summary: "WITH (security_barrier = true)", args: [arg("securityBarrier", "boolean")] },
23
+ withNoData: { summary: "WITH NO DATA: a materialized view created unpopulated", args: [arg("noData", "boolean")] },
24
+ };
25
+
26
+ export const SEQUENCE_CLAUSES: Record<string, Clause> = {
27
+ persistence: { summary: "[ { TEMPORARY | UNLOGGED } ] SEQUENCE", args: [arg("persistence", "keyword", { values: ["TEMPORARY", "UNLOGGED"] })] },
28
+ options: { summary: "AS type, INCREMENT, MINVALUE, MAXVALUE, START, CACHE, [NO] CYCLE, OWNED BY (see SEQUENCE_OPTIONS)", args: [] },
29
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Storage parameters (`WITH (fillfactor = 70)`): the overlay half.
3
+ *
4
+ * No catalog table lists them; they are compiled into `reloptions.c`.
5
+ * Generation probes the server instead: it tries every `pg_settings` name plus
6
+ * {@link STORAGE_PARAMETER_SEED} as `WITH (name = 1)` on each relation kind
7
+ * and keeps every name the server does not reject as unrecognized. The probe
8
+ * yields names only, so the types and ranges are here, and generation fails
9
+ * when a name the probe found has no entry (a pin move that adds a parameter
10
+ * has to type it in the same commit) or an entry names nothing the probe found.
11
+ */
12
+
13
+ import { INT_MAX } from "./kinds";
14
+
15
+ /** The reloptions that are not `pg_settings` names, so the probe would never try them. */
16
+ export const STORAGE_PARAMETER_SEED: readonly string[] = [
17
+ "fillfactor", "toast_tuple_target", "parallel_workers", "user_catalog_table", "autovacuum_enabled",
18
+ "vacuum_index_cleanup", "vacuum_truncate", "autovacuum_vacuum_threshold", "autovacuum_vacuum_scale_factor",
19
+ "autovacuum_vacuum_max_threshold", "autovacuum_vacuum_insert_threshold", "autovacuum_vacuum_insert_scale_factor",
20
+ "autovacuum_analyze_threshold", "autovacuum_analyze_scale_factor", "autovacuum_vacuum_cost_delay",
21
+ "autovacuum_vacuum_cost_limit", "autovacuum_freeze_min_age", "autovacuum_freeze_max_age",
22
+ "autovacuum_freeze_table_age", "autovacuum_multixact_freeze_min_age", "autovacuum_multixact_freeze_max_age",
23
+ "autovacuum_multixact_freeze_table_age", "log_autovacuum_min_duration", "deduplicate_items", "buffering",
24
+ "fastupdate", "gin_pending_list_limit", "pages_per_range", "autosummarize", "security_barrier",
25
+ "security_invoker", "check_option", "vacuum_cleanup_index_scale_factor", "vacuum_max_eager_freeze_failure_rate",
26
+ ];
27
+
28
+ export type StorageParameterType =
29
+ | { kind: "integer"; range: readonly [number, number] }
30
+ | { kind: "real"; range: readonly [number, number] }
31
+ | { kind: "boolean" }
32
+ | { kind: "enum"; values: readonly string[] };
33
+
34
+ const int = (min: number, max: number): StorageParameterType => ({ kind: "integer", range: [min, max] });
35
+ const real = (min: number, max: number): StorageParameterType => ({ kind: "real", range: [min, max] });
36
+ const bool: StorageParameterType = { kind: "boolean" };
37
+
38
+ /** Keyed by parameter name; the same name has the same type on every relation kind that accepts it. */
39
+ export const STORAGE_PARAMETER_TYPES: Record<string, StorageParameterType> = {
40
+ fillfactor: int(10, 100),
41
+ toast_tuple_target: int(128, 1073741823),
42
+ parallel_workers: int(0, 1024),
43
+ user_catalog_table: bool,
44
+ autovacuum_enabled: bool,
45
+ vacuum_index_cleanup: { kind: "enum", values: ["auto", "on", "off", "true", "false"] },
46
+ vacuum_truncate: bool,
47
+ autovacuum_vacuum_threshold: int(0, INT_MAX),
48
+ autovacuum_vacuum_scale_factor: real(0, 100),
49
+ autovacuum_vacuum_max_threshold: int(-1, INT_MAX),
50
+ autovacuum_vacuum_insert_threshold: int(-1, INT_MAX),
51
+ autovacuum_vacuum_insert_scale_factor: real(0, 100),
52
+ autovacuum_analyze_threshold: int(0, INT_MAX),
53
+ autovacuum_analyze_scale_factor: real(0, 100),
54
+ autovacuum_vacuum_cost_delay: real(-1, 100),
55
+ autovacuum_vacuum_cost_limit: int(-1, 10000),
56
+ autovacuum_freeze_min_age: int(0, 1000000000),
57
+ autovacuum_freeze_max_age: int(100000, 2000000000),
58
+ autovacuum_freeze_table_age: int(0, 2000000000),
59
+ autovacuum_multixact_freeze_min_age: int(0, 1000000000),
60
+ autovacuum_multixact_freeze_max_age: int(10000, 2000000000),
61
+ autovacuum_multixact_freeze_table_age: int(0, 2000000000),
62
+ log_autovacuum_min_duration: int(-1, INT_MAX),
63
+ vacuum_max_eager_freeze_failure_rate: real(0, 1),
64
+ security_barrier: bool,
65
+ security_invoker: bool,
66
+ check_option: { kind: "enum", values: ["local", "cascaded"] },
67
+ deduplicate_items: bool,
68
+ // Accepted and ignored since 14, which removed the feature; kept so a dump from 13 still restores.
69
+ vacuum_cleanup_index_scale_factor: real(0, 10000000000),
70
+ buffering: { kind: "enum", values: ["on", "off", "auto"] },
71
+ fastupdate: bool,
72
+ gin_pending_list_limit: int(64, INT_MAX),
73
+ pages_per_range: int(1, 131072),
74
+ autosummarize: bool,
75
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `CREATE TYPE` and `CREATE DOMAIN`: the forms for new types. The catalog lists
3
+ * the built-ins; the grammar for declaring more is not in it.
4
+ */
5
+
6
+ import { arg, type Clause } from "./kinds";
7
+
8
+ export const TYPE_DDL: Record<string, Clause> = {
9
+ enum: {
10
+ summary: "CREATE TYPE name AS ENUM ('label', ...)",
11
+ args: [arg("labels", "string", { repeated: true })],
12
+ },
13
+ composite: {
14
+ summary: "CREATE TYPE name AS (attribute type [COLLATE c], ...)",
15
+ args: [arg("attributes", "type", { repeated: true })],
16
+ },
17
+ domain: {
18
+ summary: "CREATE DOMAIN name [AS] type [COLLATE c] [DEFAULT expression] [NOT NULL] [CHECK (expression)]",
19
+ args: [
20
+ arg("type", "type"),
21
+ arg("collation", "identifier", { optional: true }),
22
+ arg("default", "expression", { optional: true }),
23
+ arg("notNull", "boolean", { optional: true }),
24
+ arg("check", "expression", { optional: true, repeated: true }),
25
+ ],
26
+ },
27
+ range: {
28
+ summary: "CREATE TYPE name AS RANGE (SUBTYPE = type [, SUBTYPE_OPCLASS, COLLATION, CANONICAL, SUBTYPE_DIFF, MULTIRANGE_TYPE_NAME])",
29
+ args: [
30
+ arg("subtype", "type"),
31
+ arg("subtypeOpclass", "identifier", { optional: true }),
32
+ arg("collation", "identifier", { optional: true }),
33
+ arg("canonical", "identifier", { optional: true }),
34
+ arg("subtypeDiff", "identifier", { optional: true }),
35
+ arg("multirangeTypeName", "identifier", { optional: true }),
36
+ ],
37
+ },
38
+ };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Column type parameters and spellings: the overlay half.
3
+ *
4
+ * `pg_type` lists the types and `format_type()` gives each one's SQL spelling
5
+ * (`int4` is `integer`). The parameters (`varchar(n)`, `numeric(p, s)`,
6
+ * `timestamp(p)`, `interval` fields) and the spellings no catalog row carries
7
+ * (`int`, `decimal`, `serial`) are in no catalog table. A type missing here
8
+ * takes no parameters; generation fails when a key here is not a type at the
9
+ * pins.
10
+ */
11
+
12
+ import { arg, type ClauseArgument } from "./kinds";
13
+
14
+ /** Keyed by the canonical SQL name `format_type()` gives. */
15
+ export const COLUMN_TYPE_PARAMETERS: Record<string, readonly ClauseArgument[]> = {
16
+ "character varying": [arg("length", "number", { optional: true, range: [1, 10485760] })],
17
+ character: [arg("length", "number", { optional: true, range: [1, 10485760] })],
18
+ bit: [arg("length", "number", { optional: true, range: [1, 83886080] })],
19
+ "bit varying": [arg("length", "number", { optional: true, range: [1, 83886080] })],
20
+ numeric: [arg("precision", "number", { optional: true, range: [1, 1000] }), arg("scale", "number", { optional: true, range: [-1000, 1000] })],
21
+ "timestamp without time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
22
+ "timestamp with time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
23
+ "time without time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
24
+ "time with time zone": [arg("precision", "number", { optional: true, range: [0, 6] })],
25
+ interval: [
26
+ arg("fields", "keyword", {
27
+ optional: true,
28
+ values: ["YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND", "YEAR TO MONTH", "DAY TO HOUR", "DAY TO MINUTE", "DAY TO SECOND", "HOUR TO MINUTE", "HOUR TO SECOND", "MINUTE TO SECOND"],
29
+ }),
30
+ arg("precision", "number", { optional: true, range: [0, 6] }),
31
+ ],
32
+ };
33
+
34
+ /** Spellings that are not `format_type()` output, and the canonical name each stands for. */
35
+ export const TYPE_SPELLINGS: Record<string, string> = {
36
+ int: "integer",
37
+ decimal: "numeric",
38
+ float: "double precision",
39
+ varchar: "character varying",
40
+ char: "character",
41
+ varbit: "bit varying",
42
+ timestamp: "timestamp without time zone",
43
+ timestamptz: "timestamp with time zone",
44
+ time: "time without time zone",
45
+ timetz: "time with time zone",
46
+ };
47
+
48
+ /** Pseudo-types that declare a sequence-backed column; each stands for a type plus a default and a sequence. */
49
+ export const SERIAL_TYPES: Record<string, string> = {
50
+ smallserial: "smallint",
51
+ serial: "integer",
52
+ bigserial: "bigint",
53
+ };
54
+
55
+ /** An array suffix: `integer[]`, `text[3]`, `ARRAY`. Dimensions are documentation only to the server. */
56
+ export const ARRAY_SUFFIX = { brackets: "[]", dimensioned: "[n]", keyword: "ARRAY" } as const;
@@ -0,0 +1,214 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { describe, expect, test } from "vitest";
4
+ import { parseStatements, type IndexNode, type SequenceNode, type TableNode, type ViewNode } from "./parser";
5
+ import { SqlSyntaxError, tokenize, tokenizeText, untokenize } from "./tokens";
6
+
7
+ const parse = (sql: string) => parseStatements(tokenizeText(sql, 0));
8
+ const one = <T>(sql: string) => parse(sql)[0] as T;
9
+ const kinds = (sql: string) => tokenizeText(sql, 0).filter((t) => t.kind !== "ws").map((t) => `${t.kind}:${t.text}`);
10
+ const fails = (sql: string): SqlSyntaxError => {
11
+ try {
12
+ parse(sql);
13
+ } catch (err) {
14
+ if (err instanceof SqlSyntaxError) return err;
15
+ throw err;
16
+ }
17
+ throw new Error(`parsed: ${sql}`);
18
+ };
19
+ /** The text an error is located at. */
20
+ const at = (sql: string) => {
21
+ const err = fails(sql);
22
+ return sql.slice(err.offset, err.offset + (err.token?.text.length ?? 1));
23
+ };
24
+
25
+ describe("Postgres's lexical rules", () => {
26
+ test("are lossless: tokens give the raw text back, comments and spacing included", () => {
27
+ const parts = ["CREATE TABLE t (\n a int, -- the key\n /* outer /* inner */ still */ b ", " DEFAULT $$it's -- not$$\n)"];
28
+ expect(untokenize(tokenize(parts), (i) => "${" + i + "}")).toBe(parts.join("${0}"));
29
+ });
30
+
31
+ test("a backslash is ordinary in '...' and escapes only in E'...'", () => {
32
+ expect(kinds(String.raw`'a\'`)).toEqual([String.raw`string:'a\'`]);
33
+ expect(kinds(String.raw`E'a\'b'`)).toEqual([String.raw`string:E'a\'b'`]);
34
+ });
35
+
36
+ test("dollar quotes, prefixed strings, parameters and nested comments are one token each", () => {
37
+ expect(kinds("$tag$ a $$ b $tag$ $1 B'101' X'1F' U&'d\\0061t' /* a /* b */ c */")).toEqual([
38
+ "string:$tag$ a $$ b $tag$",
39
+ "param:$1",
40
+ "string:B'101'",
41
+ "string:X'1F'",
42
+ "string:U&'d\\0061t'",
43
+ "comment:/* a /* b */ c */",
44
+ ]);
45
+ });
46
+
47
+ test("a double quote makes an identifier; a backtick is an operator character", () => {
48
+ expect(kinds('"My Col" `')).toEqual(['qident:"My Col"', "op:`"]);
49
+ });
50
+
51
+ test("numbers never run into names, and an operator does not end in a sign", () => {
52
+ expect(kinds("1e-3 .5 0x1F 1_000 2abc")).toEqual(["number:1e-3", "number:.5", "number:0x1F", "number:1_000", "number:2", "ident:abc"]);
53
+ expect(kinds("a=-30 b<>-1 c@-1")).toEqual(["ident:a", "op:=", "op:-", "number:30", "ident:b", "op:<>", "op:-", "number:1", "ident:c", "op:@-", "number:1"]);
54
+ });
55
+ });
56
+
57
+ describe("CREATE TABLE", () => {
58
+ const node = one<TableNode>(`CREATE UNLOGGED TABLE IF NOT EXISTS App.Orders (
59
+ id bigint GENERATED ALWAYS AS IDENTITY (START WITH 10) PRIMARY KEY,
60
+ "UserId" bigint NOT NULL REFERENCES app.users (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
61
+ status text COLLATE "C" NOT NULL DEFAULT 'placed',
62
+ amount numeric(12, 2) NOT NULL CHECK (amount >= 0),
63
+ total numeric GENERATED ALWAYS AS (amount * 2) STORED,
64
+ tags text[] DEFAULT ARRAY['a', 'b'],
65
+ during tstzrange,
66
+ CONSTRAINT orders_status_ck CHECK (status IN ('placed', 'paid')) NOT VALID,
67
+ UNIQUE NULLS NOT DISTINCT (status, amount) INCLUDE (id) WITH (fillfactor = 90),
68
+ EXCLUDE USING gist (during WITH &&) WHERE (status <> 'cancelled'),
69
+ FOREIGN KEY ("UserId") REFERENCES app.users MATCH FULL ON UPDATE SET NULL ("UserId")
70
+ ) PARTITION BY RANGE (id) WITH (fillfactor = 70, toast.autovacuum_enabled = false) TABLESPACE fast`);
71
+
72
+ test("reads names, folding the unquoted ones", () => {
73
+ expect(node.persistence).toBe("unlogged");
74
+ expect(node.ifNotExists).toBe(true);
75
+ expect(node.name.pieces).toEqual(["app", "orders"]);
76
+ expect(node.columns.map((c) => c.name)).toEqual(["id", "UserId", "status", "amount", "total", "tags", "during"]);
77
+ });
78
+
79
+ test("reads identity, generated, defaults and column constraints", () => {
80
+ const [id, user, status, amount, total] = node.columns;
81
+ expect(id!.generated).toMatchObject({ kind: "identity", always: true });
82
+ expect(id!.constraints.map((c) => c.kind)).toEqual(["PRIMARY KEY"]);
83
+ expect(user!.constraints[0]).toMatchObject({ kind: "FOREIGN KEY", deferrable: true, initiallyDeferred: true });
84
+ expect(status!.notNull).toBe(true);
85
+ expect(status!.collate).toBeDefined();
86
+ expect(amount!.constraints.map((c) => c.kind)).toEqual(["CHECK"]);
87
+ expect(total!.generated).toMatchObject({ kind: "stored", always: true });
88
+ });
89
+
90
+ test("reads every table constraint kind and its attributes", () => {
91
+ expect(node.constraints.map((c) => c.kind)).toEqual(["CHECK", "UNIQUE", "EXCLUDE", "FOREIGN KEY"]);
92
+ expect(node.constraints[0]).toMatchObject({ name: "orders_status_ck", notValid: true });
93
+ expect(node.constraints[1]).toMatchObject({ nullsNotDistinct: true });
94
+ expect(node.constraints[2]).toMatchObject({ using: "gist" });
95
+ expect(node.constraints[3]!.references).toMatchObject({ match: "FULL" });
96
+ expect(node.partitionBy).toBeDefined();
97
+ expect(node.with).toBeDefined();
98
+ });
99
+
100
+ test("partitions, typed tables and LIKE parse", () => {
101
+ expect(one<TableNode>("CREATE TABLE p1 PARTITION OF orders FOR VALUES FROM (1) TO (100)").partitionOf?.pieces).toEqual(["orders"]);
102
+ expect(one<TableNode>("CREATE TABLE p2 PARTITION OF orders DEFAULT").partitionBound).toBeDefined();
103
+ expect(one<TableNode>("CREATE TABLE h PARTITION OF orders FOR VALUES WITH (MODULUS 4, REMAINDER 1)").partitionBound).toBeDefined();
104
+ expect(one<TableNode>("CREATE TABLE t OF some_type (a WITH OPTIONS NOT NULL)").columns[0]!.notNull).toBe(true);
105
+ expect(one<TableNode>("CREATE TABLE t (LIKE src INCLUDING ALL EXCLUDING INDEXES, x int)").like).toHaveLength(1);
106
+ });
107
+ });
108
+
109
+ describe("the grammar gaps the spike listed are closed", () => {
110
+ test("a default is a b_expr: a top-level IN, AND or IS NULL fails at that token", () => {
111
+ expect(at("CREATE TABLE t (a int DEFAULT 1 IN (1, 2))")).toBe("IN");
112
+ expect(at("CREATE TABLE t (a bool DEFAULT true AND false)")).toBe("AND");
113
+ expect(at("CREATE TABLE t (a bool DEFAULT 1 IS NULL)")).toBe("IS");
114
+ expect(() => parse("CREATE TABLE t (a bool DEFAULT (1 IN (1, 2)), b int DEFAULT 1 IS DISTINCT FROM 2)")).not.toThrow();
115
+ });
116
+
117
+ test("LIKE options and ON COMMIT take only their own words", () => {
118
+ expect(at("CREATE TABLE t (LIKE s INCLUDING EVERYTHING)")).toBe("EVERYTHING");
119
+ expect(at("CREATE TEMP TABLE t (a int) ON COMMIT KEEP ROWS")).toBe("KEEP");
120
+ });
121
+
122
+ test("a storage parameter list needs a value after =", () => {
123
+ expect(at("CREATE TABLE t (a int) WITH (fillfactor = )")).toBe(")");
124
+ expect(() => parse("CREATE TABLE t (a int) WITH (fillfactor=-30.1)")).not.toThrow();
125
+ });
126
+
127
+ test("a reserved word is never a type, and a range bound is never empty", () => {
128
+ expect(at("CREATE TABLE t (a ARRAY[4])")).toBe("ARRAY");
129
+ expect(at("CREATE TABLE p PARTITION OF t FOR VALUES FROM () TO (1)")).toBe(")");
130
+ });
131
+
132
+ test("a misspelt key word after an expression fails at the word", () => {
133
+ expect(at("CREATE TABLE t (a text DEFAULT 'x' CHEK (a <> ''))")).toBe("CHEK");
134
+ expect(at("CREATE TABLE t (a bigint PRIMRY KEY)")).toBe("PRIMRY");
135
+ });
136
+
137
+ test("a reserved word as a name needs quotes", () => {
138
+ expect(at("CREATE TABLE foo (with int)")).toBe("with");
139
+ expect(() => parse('CREATE TABLE foo ("with" int)')).not.toThrow();
140
+ });
141
+ });
142
+
143
+ describe("the other statements", () => {
144
+ test("an index: CONCURRENTLY, its elements, and a name that is never qualified", () => {
145
+ const node = one<IndexNode>(
146
+ "CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS users_email ON ONLY app.users USING btree (lower(email) text_pattern_ops, created_at DESC NULLS LAST) INCLUDE (id) WHERE deleted_at IS NULL",
147
+ );
148
+ expect(node).toMatchObject({ unique: true, concurrently: true, ifNotExists: true, only: true, using: "btree" });
149
+ expect(node.elements.map((e) => e.column)).toEqual([undefined, "created_at"]);
150
+ expect(at("CREATE INDEX app.x ON t (a)")).toBe(".");
151
+ expect(one<IndexNode>("CREATE INDEX ON t (a)").name).toBeUndefined();
152
+ });
153
+
154
+ test("views stop their query at WITH CHECK OPTION and WITH NO DATA, not at a CTE", () => {
155
+ const v = one<ViewNode>("CREATE OR REPLACE VIEW v (a, b) WITH (security_barrier) AS WITH x AS (SELECT 1 a, 2 b) SELECT * FROM x WITH LOCAL CHECK OPTION");
156
+ expect(v.columnNames.map((c) => c.name)).toEqual(["a", "b"]);
157
+ expect(v.checkOption).toBeDefined();
158
+ const m = one<ViewNode>("CREATE MATERIALIZED VIEW m AS SELECT 1 WITH NO DATA");
159
+ expect(m).toMatchObject({ materialized: true, withData: false });
160
+ });
161
+
162
+ test("a sequence's options, a domain, an enum, a schema and an extension", () => {
163
+ const s = one<SequenceNode>("CREATE SEQUENCE s AS integer INCREMENT BY 2 NO MINVALUE MAXVALUE 100 START WITH 5 CACHE 10 NO CYCLE OWNED BY t.id");
164
+ expect(s.options.map((o) => o.option)).toEqual(["AS", "INCREMENT", "NO MINVALUE", "MAXVALUE", "START", "CACHE", "NO CYCLE", "OWNED BY"]);
165
+ expect(parse("CREATE DOMAIN d AS text CONSTRAINT c CHECK (VALUE <> '') NOT VALID")[0]!.statement).toBe("domain");
166
+ expect(parse("CREATE TYPE mood AS ENUM ('sad', 'ok')")[0]!.statement).toBe("enum");
167
+ expect(at("CREATE TYPE mood AS (a int)")).toBe("(");
168
+ expect(parse("CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION owner")[0]!.statement).toBe("schema");
169
+ expect(parse("CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public VERSION '1.6' CASCADE")[0]!.statement).toBe("extension");
170
+ });
171
+
172
+ test("COMMENT ON statements follow a CREATE in one template", () => {
173
+ const nodes = parse("CREATE TABLE t (a int); COMMENT ON TABLE t IS 'x'; COMMENT ON COLUMN t.a IS NULL;");
174
+ expect(nodes.map((n) => n.statement)).toEqual(["table", "comment", "comment"]);
175
+ });
176
+ });
177
+
178
+ describe("Postgres's own regression SQL (REL_18_6)", () => {
179
+ const corpus = JSON.parse(readFileSync(join(import.meta.dirname, "testdata", "postgres-regress-corpus.json"), "utf-8")) as {
180
+ accepted: Record<string, string[]>;
181
+ rejected: string[];
182
+ };
183
+
184
+ test("every committed statement of the declared subset parses", () => {
185
+ const failed: string[] = [];
186
+ let n = 0;
187
+ for (const sqls of Object.values(corpus.accepted)) {
188
+ for (const sql of sqls) {
189
+ n++;
190
+ try {
191
+ parse(sql);
192
+ } catch (err) {
193
+ failed.push(`${(err as Error).message}: ${sql.slice(0, 120)}`);
194
+ }
195
+ }
196
+ }
197
+ expect(failed).toEqual([]);
198
+ expect(n).toBe(408);
199
+ });
200
+
201
+ test("every statement the tests write as a syntax error is rejected", () => {
202
+ const accepted = corpus.rejected.filter((sql) => {
203
+ try {
204
+ parse(sql);
205
+ return true;
206
+ } catch (err) {
207
+ if (err instanceof SqlSyntaxError) return false;
208
+ throw err;
209
+ }
210
+ });
211
+ expect(accepted).toEqual([]);
212
+ expect(corpus.rejected.length).toBe(27);
213
+ });
214
+ });