@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,278 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { makePostSynthCtx } from "@intentius/chant-test-utils";
3
+ import type { PostSynthCheck } from "@intentius/chant/lint/post-synth";
4
+ import type { SerializerResult } from "@intentius/chant/serializer";
5
+ import { sqlSerializer } from "../../serializer";
6
+ import { database, table, view } from "../../clickhouse/entities";
7
+ import { sqlAuditCatalog } from "../audit-catalog";
8
+ import { postSynthChecks } from "./index";
9
+
10
+ type Entities = Record<string, unknown>;
11
+
12
+ function run(id: string, entities: Entities) {
13
+ const check = postSynthChecks.find((c: PostSynthCheck) => c.id === id)!;
14
+ const out = sqlSerializer.serialize(new Map(Object.entries(entities)) as never) as SerializerResult;
15
+ return check.check(makePostSynthCtx("sql", out.primary));
16
+ }
17
+
18
+ const flagged = (id: string, entities: Entities, text: RegExp) => {
19
+ const diags = run(id, entities);
20
+ expect(diags.length).toBeGreaterThan(0);
21
+ expect(diags[0]).toMatchObject({ checkId: id, lexicon: "sql" });
22
+ expect(diags[0]!.message).toMatch(text);
23
+ return diags;
24
+ };
25
+
26
+ describe("registration", () => {
27
+ test("at least 15 ClickHouse post-synth checks, each with an audit entry", () => {
28
+ const ids = postSynthChecks.map((c) => c.id).filter((id) => /^SQLCH1\d\d$/.test(id));
29
+ expect(ids.length).toBeGreaterThanOrEqual(15);
30
+ for (const id of ids) expect(sqlAuditCatalog[id], id).toBeDefined();
31
+ });
32
+
33
+ test("the audit categories cover security and correctness and best practice", () => {
34
+ const cats = new Set(Object.values(sqlAuditCatalog).filter((m) => m.yamlBased).map((m) => m.category));
35
+ expect(cats).toEqual(new Set(["security", "correctness", "best-practice"]));
36
+ });
37
+ });
38
+
39
+ describe("SQLCH102: PRIMARY KEY not a prefix of ORDER BY", () => {
40
+ test("flags a primary key outside the sort key", () => {
41
+ const t = table`CREATE TABLE t (a UInt8, b UInt8) ENGINE = MergeTree PRIMARY KEY b ORDER BY (a, b)`;
42
+ flagged("SQLCH102", { t }, /not a prefix/);
43
+ });
44
+ test("a prefix, and no primary key, are clean", () => {
45
+ const a = table`CREATE TABLE a (a UInt8, b UInt8) ENGINE = MergeTree PRIMARY KEY a ORDER BY (a, b)`;
46
+ const b = table`CREATE TABLE b (a UInt8) ENGINE = MergeTree ORDER BY a`;
47
+ expect(run("SQLCH102", { a, b })).toEqual([]);
48
+ });
49
+ });
50
+
51
+ describe("SQLCH103: engine special column types", () => {
52
+ test("flags a String version column", () => {
53
+ const t = table`CREATE TABLE t (a UInt8, v String) ENGINE = ReplacingMergeTree(v) ORDER BY a`;
54
+ flagged("SQLCH103", { t }, /version column v is String/);
55
+ });
56
+ test("flags a sign that is not Int8", () => {
57
+ const t = table`CREATE TABLE t (a UInt8, s UInt8) ENGINE = CollapsingMergeTree(s) ORDER BY a`;
58
+ flagged("SQLCH103", { t }, /sign column s/);
59
+ });
60
+ test("accepts a DateTime version and an Int8 sign", () => {
61
+ const a = table`CREATE TABLE a (k UInt8, v DateTime) ENGINE = ReplacingMergeTree(v) ORDER BY k`;
62
+ const b = table`CREATE TABLE b (k UInt8, s Int8) ENGINE = CollapsingMergeTree(s) ORDER BY k`;
63
+ expect(run("SQLCH103", { a, b })).toEqual([]);
64
+ });
65
+ });
66
+
67
+ describe("SQLCH104: engine argument names a missing column", () => {
68
+ test("flags a version column the table lacks", () => {
69
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = ReplacingMergeTree(ver) ORDER BY a`;
70
+ flagged("SQLCH104", { t }, /names column ver/);
71
+ });
72
+ test("a declared column is clean", () => {
73
+ const t = table`CREATE TABLE t (a UInt8, ver UInt32) ENGINE = ReplacingMergeTree(ver) ORDER BY a`;
74
+ expect(run("SQLCH104", { t })).toEqual([]);
75
+ });
76
+ });
77
+
78
+ describe("SQLCH105: key clause names a missing column", () => {
79
+ test("flags ORDER BY and PARTITION BY names", () => {
80
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree PARTITION BY month ORDER BY (a, missing)`;
81
+ const diags = run("SQLCH105", { t });
82
+ expect(diags.map((d) => d.message).join("\n")).toMatch(/ORDER BY names column missing[\s\S]*PARTITION BY names column month/);
83
+ });
84
+ test("expressions and declared columns are clean", () => {
85
+ const t = table`CREATE TABLE t (a UInt8, d Date) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY (a, d)`;
86
+ expect(run("SQLCH105", { t })).toEqual([]);
87
+ });
88
+ });
89
+
90
+ describe("SQLCH106: skip index names a missing column", () => {
91
+ test("flags a column the table lacks", () => {
92
+ const t = table`CREATE TABLE t (a String, INDEX i lower(nope) TYPE bloom_filter GRANULARITY 1) ENGINE = MergeTree ORDER BY a`;
93
+ flagged("SQLCH106", { t }, /names nope/);
94
+ });
95
+ test("a declared column inside a call is clean", () => {
96
+ const t = table`CREATE TABLE t (a String, INDEX i lower(a) TYPE bloom_filter GRANULARITY 1) ENGINE = MergeTree ORDER BY a`;
97
+ expect(run("SQLCH106", { t })).toEqual([]);
98
+ });
99
+ });
100
+
101
+ describe("SQLCH107: TTL on a non-date column", () => {
102
+ test("flags a table TTL on a String column", () => {
103
+ const t = table`CREATE TABLE t (a UInt8, s String) ENGINE = MergeTree ORDER BY a TTL s + INTERVAL 1 DAY`;
104
+ flagged("SQLCH107", { t }, /table TTL is built on s/);
105
+ });
106
+ test("flags a column TTL on an integer", () => {
107
+ const t = table`CREATE TABLE t (a UInt8, n UInt32 TTL n DELETE) ENGINE = MergeTree ORDER BY a`;
108
+ expect(run("SQLCH107", { t }).length).toBeGreaterThan(0);
109
+ });
110
+ test("DateTime with an interval and an action is clean", () => {
111
+ const t = table`CREATE TABLE t (a UInt8, d DateTime) ENGINE = MergeTree ORDER BY a TTL d + INTERVAL 1 DAY DELETE`;
112
+ expect(run("SQLCH107", { t })).toEqual([]);
113
+ });
114
+ });
115
+
116
+ describe("SQLCH108: OR REPLACE outside an Atomic database", () => {
117
+ test("flags a replace in an Ordinary database", () => {
118
+ const db = database`CREATE DATABASE app ENGINE = Ordinary`;
119
+ const t = table`CREATE OR REPLACE TABLE app.t (a UInt8) ENGINE = MergeTree ORDER BY a`;
120
+ flagged("SQLCH108", { db, t }, /Atomic or Replicated/);
121
+ });
122
+ test("Atomic is clean", () => {
123
+ const db = database`CREATE DATABASE app ENGINE = Atomic`;
124
+ const t = table`CREATE OR REPLACE TABLE app.t (a UInt8) ENGINE = MergeTree ORDER BY a`;
125
+ expect(run("SQLCH108", { db, t })).toEqual([]);
126
+ });
127
+ });
128
+
129
+ describe("SQLCH109: materialized view selects *", () => {
130
+ test("flags a star", () => {
131
+ const src = table`CREATE TABLE src (a UInt8) ENGINE = MergeTree ORDER BY a`;
132
+ const mv = view`CREATE MATERIALIZED VIEW mv ENGINE = MergeTree ORDER BY a AS SELECT * FROM ${src}`;
133
+ flagged("SQLCH109", { src, mv }, /selects \*/);
134
+ });
135
+ test("a column list is clean", () => {
136
+ const src = table`CREATE TABLE src (a UInt8) ENGINE = MergeTree ORDER BY a`;
137
+ const mv = view`CREATE MATERIALIZED VIEW mv ENGINE = MergeTree ORDER BY a AS SELECT ${src.columns.a} FROM ${src}`;
138
+ expect(run("SQLCH109", { src, mv })).toEqual([]);
139
+ });
140
+ });
141
+
142
+ describe("SQLCH110: view column missing from its TO target", () => {
143
+ test("flags a selected column the target lacks", () => {
144
+ const src = table`CREATE TABLE src (a UInt8, b UInt8) ENGINE = MergeTree ORDER BY a`;
145
+ const tgt = table`CREATE TABLE tgt (a UInt8) ENGINE = MergeTree ORDER BY a`;
146
+ const mv = view`CREATE MATERIALIZED VIEW mv TO ${tgt} AS SELECT ${src.columns.a}, ${src.columns.b} FROM ${src}`;
147
+ flagged("SQLCH110", { src, tgt, mv }, /selects b/);
148
+ });
149
+ test("matching columns are clean", () => {
150
+ const src = table`CREATE TABLE src (a UInt8, b UInt8) ENGINE = MergeTree ORDER BY a`;
151
+ const tgt = table`CREATE TABLE tgt (a UInt8, b UInt8) ENGINE = MergeTree ORDER BY a`;
152
+ const mv = view`CREATE MATERIALIZED VIEW mv TO ${tgt} AS SELECT ${src.columns.a}, ${src.columns.b} FROM ${src}`;
153
+ expect(run("SQLCH110", { src, tgt, mv })).toEqual([]);
154
+ });
155
+ });
156
+
157
+ describe("SQLCH111: String limited to a few values", () => {
158
+ test("flags a CHECK ... IN on a String", () => {
159
+ const t = table`CREATE TABLE t (s String, CONSTRAINT c CHECK s IN ('a', 'b')) ENGINE = MergeTree ORDER BY s`;
160
+ flagged("SQLCH111", { t }, /LowCardinality/);
161
+ });
162
+ test("LowCardinality is clean", () => {
163
+ const t = table`CREATE TABLE t (s LowCardinality(String), CONSTRAINT c CHECK s IN ('a', 'b')) ENGINE = MergeTree ORDER BY s`;
164
+ expect(run("SQLCH111", { t })).toEqual([]);
165
+ });
166
+ });
167
+
168
+ describe("SQLCH112: PARTITION BY finer than a day", () => {
169
+ test("flags a bare DateTime and an hourly truncation", () => {
170
+ const a = table`CREATE TABLE a (d DateTime) ENGINE = MergeTree PARTITION BY d ORDER BY d`;
171
+ const b = table`CREATE TABLE b (d DateTime) ENGINE = MergeTree PARTITION BY toStartOfHour(d) ORDER BY d`;
172
+ expect(run("SQLCH112", { a, b })).toHaveLength(2);
173
+ });
174
+ test("a month is clean", () => {
175
+ const t = table`CREATE TABLE t (d DateTime) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY d`;
176
+ expect(run("SQLCH112", { t })).toEqual([]);
177
+ });
178
+ });
179
+
180
+ describe("SQLCH113: MergeTree with no sort key", () => {
181
+ test("flags a missing ORDER BY", () => {
182
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree`;
183
+ flagged("SQLCH113", { t }, /no ORDER BY/);
184
+ });
185
+ test("ORDER BY tuple() and a non-MergeTree engine are clean", () => {
186
+ const a = table`CREATE TABLE a (a UInt8) ENGINE = MergeTree ORDER BY tuple()`;
187
+ const b = table`CREATE TABLE b (a UInt8) ENGINE = Memory`;
188
+ expect(run("SQLCH113", { a, b })).toEqual([]);
189
+ });
190
+ });
191
+
192
+ describe("SQLCH114: unknown codec", () => {
193
+ test("flags a codec the pin lacks", () => {
194
+ const t = table`CREATE TABLE t (a UInt8 CODEC(Snappy)) ENGINE = MergeTree ORDER BY a`;
195
+ flagged("SQLCH114", { t }, /Snappy/);
196
+ });
197
+ test("known codecs with parameters are clean", () => {
198
+ const t = table`CREATE TABLE t (a UInt8 CODEC(Delta, ZSTD(3))) ENGINE = MergeTree ORDER BY a`;
199
+ expect(run("SQLCH114", { t })).toEqual([]);
200
+ });
201
+ });
202
+
203
+ describe("SQLCH115: secret-named columns", () => {
204
+ test("flags a password column with no marker", () => {
205
+ const t = table`CREATE TABLE t (a UInt8, password String) ENGINE = MergeTree ORDER BY a`;
206
+ flagged("SQLCH115", { t }, /password/);
207
+ });
208
+ test("a comment, a TTL or an encryption codec clears it", () => {
209
+ const a = table`CREATE TABLE a (k UInt8, api_key String COMMENT 'hashed') ENGINE = MergeTree ORDER BY k`;
210
+ const b = table`CREATE TABLE b (k UInt8, secret String CODEC(AES_256_GCM_SIV)) ENGINE = MergeTree ORDER BY k`;
211
+ const c = table`CREATE TABLE c (k UInt8, d DateTime, token String) ENGINE = MergeTree ORDER BY k TTL d + INTERVAL 7 DAY`;
212
+ expect(run("SQLCH115", { a, b, c })).toEqual([]);
213
+ });
214
+ test("an ordinary name is clean", () => {
215
+ const t = table`CREATE TABLE t (a UInt8, tokens_used UInt32, passwords_reset UInt8) ENGINE = MergeTree ORDER BY a`;
216
+ expect(run("SQLCH115", { t })).toEqual([]);
217
+ });
218
+ });
219
+
220
+ describe("SQLCH116: DEFINER view without a definer", () => {
221
+ test("flags SQL SECURITY DEFINER alone", () => {
222
+ const v = view`CREATE VIEW v SQL SECURITY DEFINER AS SELECT 1 AS a`;
223
+ flagged("SQLCH116", { v }, /no DEFINER/);
224
+ });
225
+ test("a named definer is clean", () => {
226
+ const v = view`CREATE VIEW v DEFINER = reporter SQL SECURITY DEFINER AS SELECT 1 AS a`;
227
+ expect(run("SQLCH116", { v })).toEqual([]);
228
+ });
229
+ });
230
+
231
+ describe("SQLCH117: obsolete MergeTree setting", () => {
232
+ test("flags a setting the pin marks obsolete", () => {
233
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS min_rows_for_compact_part = 10`;
234
+ flagged("SQLCH117", { t }, /obsolete/);
235
+ });
236
+ test("a current setting is clean", () => {
237
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS index_granularity = 4096`;
238
+ expect(run("SQLCH117", { t })).toEqual([]);
239
+ });
240
+ });
241
+
242
+ describe("SQLCH118: unknown MergeTree setting", () => {
243
+ test("flags a misspelled setting", () => {
244
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS index_granularty = 4096`;
245
+ flagged("SQLCH118", { t }, /index_granularty/);
246
+ });
247
+ test("a known setting is clean", () => {
248
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a SETTINGS storage_policy = 'default'`;
249
+ expect(run("SQLCH118", { t })).toEqual([]);
250
+ });
251
+ });
252
+
253
+ describe("SQLCH119: deprecated or experimental engine", () => {
254
+ test("flags the Ordinary database engine", () => {
255
+ const db = database`CREATE DATABASE d ENGINE = Ordinary`;
256
+ flagged("SQLCH119", { db }, /deprecated engine Ordinary/);
257
+ });
258
+ test("flags an experimental table engine", () => {
259
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = WindowView`;
260
+ flagged("SQLCH119", { t }, /experimental engine WindowView/);
261
+ });
262
+ test("Atomic and MergeTree are clean", () => {
263
+ const db = database`CREATE DATABASE d ENGINE = Atomic`;
264
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a`;
265
+ expect(run("SQLCH119", { db, t })).toEqual([]);
266
+ });
267
+ });
268
+
269
+ describe("SQLCH120: legacy MergeTree arguments", () => {
270
+ test("flags the positional form", () => {
271
+ const t = table`CREATE TABLE t (d Date, a UInt8) ENGINE = MergeTree(d, (a, d), 8192)`;
272
+ flagged("SQLCH120", { t }, /positional/);
273
+ });
274
+ test("a bare MergeTree is clean", () => {
275
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergeTree ORDER BY a`;
276
+ expect(run("SQLCH120", { t })).toEqual([]);
277
+ });
278
+ });
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Reading the ClickHouse objects in the sql build output for post-synth
3
+ * checks: typed views of the serialized objects and a few scanners for the
4
+ * expression text the parser keeps as written (sort keys, TTLs, index
5
+ * expressions). The scanners are deliberately small: they answer "is this a
6
+ * bare column name" and "which names does this expression mention", not "what
7
+ * does this expression evaluate to".
8
+ */
9
+
10
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
11
+ import { TABLE_ENGINES, TYPE_FAMILIES } from "../../generated/clickhouse";
12
+ import type { ColumnDef, EngineDef } from "../../clickhouse/entities";
13
+ import { clickhouseObjects, type OutputObject } from "./sql-helpers";
14
+
15
+ export interface TableObject extends OutputObject {
16
+ columns: ColumnDef[];
17
+ indexes: Array<{ name: string; expr: string; type: string; granularity?: string }>;
18
+ constraints: Array<{ name: string; kind: "CHECK" | "ASSUME"; expr: string }>;
19
+ orderBy?: string;
20
+ primaryKey?: string;
21
+ partitionBy?: string;
22
+ sampleBy?: string;
23
+ ttl?: string;
24
+ settings?: Record<string, string>;
25
+ orReplace?: boolean;
26
+ }
27
+
28
+ export interface ViewObject extends OutputObject {
29
+ columns: ColumnDef[];
30
+ to?: string;
31
+ select: string;
32
+ lineage: Array<{ output: string; expr: string; from: Array<string | null> }>;
33
+ security?: string;
34
+ }
35
+
36
+ export const isTable = (o: OutputObject): o is TableObject => o.type === "ClickHouse::Table";
37
+ export const isMaterializedView = (o: OutputObject): o is ViewObject => o.type === "ClickHouse::MaterializedView";
38
+ export const isAnyView = (o: OutputObject): o is ViewObject =>
39
+ o.type === "ClickHouse::View" || o.type === "ClickHouse::MaterializedView";
40
+
41
+ export function tablesOf(ctx: PostSynthContext): TableObject[] {
42
+ return clickhouseObjects(ctx).filter(isTable);
43
+ }
44
+
45
+ export function viewsOf(ctx: PostSynthContext): ViewObject[] {
46
+ return clickhouseObjects(ctx).filter(isAnyView);
47
+ }
48
+
49
+ /** The engine's catalog entry, when the pinned server has the engine. */
50
+ export function engineSpec(engine: EngineDef | undefined) {
51
+ return engine ? (TABLE_ENGINES as Record<string, (typeof TABLE_ENGINES)[keyof typeof TABLE_ENGINES]>)[engine.name] : undefined;
52
+ }
53
+
54
+ /** A MergeTree family engine, replicated or not. */
55
+ export function isMergeTree(engine: EngineDef | undefined): boolean {
56
+ return engineSpec(engine)?.mergeTree === true;
57
+ }
58
+
59
+ /** The engine without its `Replicated` prefix: `ReplicatedReplacingMergeTree` is `ReplacingMergeTree`. */
60
+ export function baseEngineName(engine: EngineDef): string {
61
+ const spec = engineSpec(engine) as { replicates?: string } | undefined;
62
+ return spec?.replicates ?? engine.name;
63
+ }
64
+
65
+ /**
66
+ * The engine's own arguments, after the ZooKeeper path and replica name a
67
+ * `Replicated*` engine may lead with.
68
+ */
69
+ export function engineArguments(engine: EngineDef): string[] {
70
+ const args = engine.args ?? [];
71
+ if (baseEngineName(engine) !== engine.name && args.length >= 2 && /^['{]/.test(args[0]!.trim())) return args.slice(2);
72
+ return args;
73
+ }
74
+
75
+ /** Split on commas that are not inside parentheses, brackets or quotes. */
76
+ export function splitTop(text: string, separator = ","): string[] {
77
+ const parts: string[] = [];
78
+ let depth = 0;
79
+ let quote: string | undefined;
80
+ let start = 0;
81
+ for (let i = 0; i < text.length; i++) {
82
+ const c = text[i]!;
83
+ if (quote) {
84
+ if (c === "\\") i++;
85
+ else if (c === quote) quote = undefined;
86
+ continue;
87
+ }
88
+ if (c === "'" || c === '"' || c === "`") quote = c;
89
+ else if (c === "(" || c === "[") depth++;
90
+ else if (c === ")" || c === "]") depth--;
91
+ else if (c === separator && depth === 0) {
92
+ parts.push(text.slice(start, i).trim());
93
+ start = i + 1;
94
+ }
95
+ }
96
+ const last = text.slice(start).trim();
97
+ if (last !== "" || parts.length > 0) parts.push(last);
98
+ return parts.filter((p) => p !== "");
99
+ }
100
+
101
+ /** `(a, b)` is the list `a`, `b`; `a, b` is the same; `tuple()` and `()` are empty. */
102
+ export function keyElements(expr: string): string[] {
103
+ let text = expr.trim();
104
+ if (/^tuple\s*\(\s*\)$/i.test(text) || text === "()") return [];
105
+ if (text.startsWith("(") && closingParen(text, 0) === text.length - 1) text = text.slice(1, -1);
106
+ return splitTop(text).map((e) => e.replace(/\s+(ASC|DESC)$/i, "").replace(/\s+/g, " ").trim());
107
+ }
108
+
109
+ function closingParen(text: string, open: number): number {
110
+ let depth = 0;
111
+ let quote: string | undefined;
112
+ for (let i = open; i < text.length; i++) {
113
+ const c = text[i]!;
114
+ if (quote) {
115
+ if (c === "\\") i++;
116
+ else if (c === quote) quote = undefined;
117
+ } else if (c === "'" || c === '"' || c === "`") quote = c;
118
+ else if (c === "(") depth++;
119
+ else if (c === ")" && --depth === 0) return i;
120
+ }
121
+ return -1;
122
+ }
123
+
124
+ /** The column a bare name refers to: `a` or `` `a b` ``, else undefined. */
125
+ export function bareName(element: string): string | undefined {
126
+ const text = element.trim();
127
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(text)) return text;
128
+ const quoted = /^`((?:[^`]|``)*)`$/.exec(text) ?? /^"((?:[^"]|"")*)"$/.exec(text);
129
+ return quoted ? quoted[1]!.replace(/``|""/g, (m) => m[0]!) : undefined;
130
+ }
131
+
132
+ const WORDS = new Set(
133
+ (
134
+ "AS AND OR NOT IN IS NULL LIKE ILIKE BETWEEN CASE WHEN THEN ELSE END ASC DESC INTERVAL DISTINCT TRUE FALSE " +
135
+ "SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR NANOSECOND MICROSECOND MILLISECOND CAST"
136
+ ).split(" "),
137
+ );
138
+
139
+ /** Names an expression mentions as columns: identifiers that are not calls, literals or keywords. */
140
+ export function mentionedNames(expr: string): string[] {
141
+ const names: string[] = [];
142
+ const re = /'(?:[^'\\]|\\.)*'|`((?:[^`]|``)*)`|"((?:[^"]|"")*)"|\b([A-Za-z_][A-Za-z0-9_]*)\b(\s*\()?|\d[\w.]*/g;
143
+ let m: RegExpExecArray | null;
144
+ let afterDot = false;
145
+ let last = 0;
146
+ while ((m = re.exec(expr)) !== null) {
147
+ afterDot = /\.\s*$/.test(expr.slice(last, m.index));
148
+ last = m.index + m[0].length;
149
+ const name = m[1] ?? m[2] ?? m[3];
150
+ if (name === undefined || m[4] !== undefined || afterDot) continue;
151
+ if (m[3] !== undefined && WORDS.has(m[3].toUpperCase())) continue;
152
+ names.push(name.replace(/``|""/g, (x) => x[0]!));
153
+ }
154
+ return names;
155
+ }
156
+
157
+ /** A type with its `Nullable(...)` and `LowCardinality(...)` wrappers removed. */
158
+ export function unwrapType(type: string | undefined): string {
159
+ let t = (type ?? "").trim();
160
+ for (;;) {
161
+ const m = /^(Nullable|LowCardinality)\s*\(([\s\S]*)\)$/i.exec(t);
162
+ if (!m) return t;
163
+ t = m[2]!.trim();
164
+ }
165
+ }
166
+
167
+ /** The canonical family of a column's type (`BIGINT UNSIGNED` is `UInt64`), or its leading word when unknown. */
168
+ export function typeFamily(type: string | undefined): string {
169
+ const head = /^[A-Za-z_][A-Za-z0-9_ ]*?(?=\s*\(|$)/.exec(unwrapType(type))?.[0]?.trim() ?? "";
170
+ const table = TYPE_FAMILIES as Record<string, { canonical: string } | undefined>;
171
+ return (table[head] ?? table[head.toUpperCase()])?.canonical ?? head;
172
+ }
173
+
174
+ export const isNullableType = (type: string | undefined): boolean => /^Nullable\s*\(/i.test((type ?? "").trim());
175
+
176
+ export function columnByName(table: { columns: ColumnDef[] }, name: string): ColumnDef | undefined {
177
+ return table.columns.find((c) => c.name === name);
178
+ }
179
+
180
+ /** A check over the build's ClickHouse objects, so each check file holds its rule. */
181
+ export function checkOf(
182
+ meta: { id: string; description: string },
183
+ run: (ctx: PostSynthContext, report: (d: Omit<PostSynthDiagnostic, "checkId" | "lexicon">) => void) => void,
184
+ ): PostSynthCheck {
185
+ return {
186
+ ...meta,
187
+ check(ctx) {
188
+ const out: PostSynthDiagnostic[] = [];
189
+ run(ctx, (d) => out.push({ checkId: meta.id, lexicon: "sql", ...d }));
190
+ return out;
191
+ },
192
+ };
193
+ }
194
+
195
+ /** The objects by export name and by SQL name, to resolve a `TO` target. */
196
+ export function resolveObject(ctx: PostSynthContext, ref: string): OutputObject | undefined {
197
+ const all = clickhouseObjects(ctx);
198
+ return all.find((o) => o.export === ref) ?? all.find((o) => o.sqlName === ref || o.name === ref);
199
+ }
200
+
201
+ /** The codec names in a CODEC(...) list: `Delta, ZSTD(3)` is Delta and ZSTD. */
202
+ export function codecNames(codec: string): string[] {
203
+ return splitTop(codec)
204
+ .map((c) => /^[A-Za-z_][\w]*/.exec(c.trim())?.[0])
205
+ .filter((n): n is string => n !== undefined);
206
+ }
@@ -0,0 +1,81 @@
1
+ // Code generated by chant generate. DO NOT EDIT.
2
+ import type { PostSynthCheck } from "@intentius/chant/lint/post-synth";
3
+ import { sqlch101 } from "./sqlch101";
4
+ import { sqlch102 } from "./sqlch102";
5
+ import { sqlch103 } from "./sqlch103";
6
+ import { sqlch104 } from "./sqlch104";
7
+ import { sqlch105 } from "./sqlch105";
8
+ import { sqlch106 } from "./sqlch106";
9
+ import { sqlch107 } from "./sqlch107";
10
+ import { sqlch108 } from "./sqlch108";
11
+ import { sqlch109 } from "./sqlch109";
12
+ import { sqlch110 } from "./sqlch110";
13
+ import { sqlch111 } from "./sqlch111";
14
+ import { sqlch112 } from "./sqlch112";
15
+ import { sqlch113 } from "./sqlch113";
16
+ import { sqlch114 } from "./sqlch114";
17
+ import { sqlch115 } from "./sqlch115";
18
+ import { sqlch116 } from "./sqlch116";
19
+ import { sqlch117 } from "./sqlch117";
20
+ import { sqlch118 } from "./sqlch118";
21
+ import { sqlch119 } from "./sqlch119";
22
+ import { sqlch120 } from "./sqlch120";
23
+ import { sqlpg101 } from "./sqlpg101";
24
+ import { sqlpg102 } from "./sqlpg102";
25
+ import { sqlpg103 } from "./sqlpg103";
26
+ import { sqlpg104 } from "./sqlpg104";
27
+ import { sqlpg105 } from "./sqlpg105";
28
+ import { sqlpg106 } from "./sqlpg106";
29
+ import { sqlpg107 } from "./sqlpg107";
30
+ import { sqlpg108 } from "./sqlpg108";
31
+ import { sqlpg109 } from "./sqlpg109";
32
+ import { sqlpg110 } from "./sqlpg110";
33
+ import { sqlpg111 } from "./sqlpg111";
34
+ import { sqlpg112 } from "./sqlpg112";
35
+ import { sqlpg113 } from "./sqlpg113";
36
+ import { sqlpg114 } from "./sqlpg114";
37
+ import { sqlpg115 } from "./sqlpg115";
38
+ import { sqlpg116 } from "./sqlpg116";
39
+ import { sqlpg117 } from "./sqlpg117";
40
+ import { sqlpg118 } from "./sqlpg118";
41
+
42
+ export const postSynthChecks: PostSynthCheck[] = [
43
+ sqlch101,
44
+ sqlch102,
45
+ sqlch103,
46
+ sqlch104,
47
+ sqlch105,
48
+ sqlch106,
49
+ sqlch107,
50
+ sqlch108,
51
+ sqlch109,
52
+ sqlch110,
53
+ sqlch111,
54
+ sqlch112,
55
+ sqlch113,
56
+ sqlch114,
57
+ sqlch115,
58
+ sqlch116,
59
+ sqlch117,
60
+ sqlch118,
61
+ sqlch119,
62
+ sqlch120,
63
+ sqlpg101,
64
+ sqlpg102,
65
+ sqlpg103,
66
+ sqlpg104,
67
+ sqlpg105,
68
+ sqlpg106,
69
+ sqlpg107,
70
+ sqlpg108,
71
+ sqlpg109,
72
+ sqlpg110,
73
+ sqlpg111,
74
+ sqlpg112,
75
+ sqlpg113,
76
+ sqlpg114,
77
+ sqlpg115,
78
+ sqlpg116,
79
+ sqlpg117,
80
+ sqlpg118,
81
+ ];
@@ -0,0 +1,33 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { makePostSynthCtx } from "@intentius/chant-test-utils";
3
+ import type { SerializerResult } from "@intentius/chant/serializer";
4
+ import { sqlSerializer } from "../../serializer";
5
+ import { database, table } from "../../clickhouse/entities";
6
+ import { sqlch101 } from "./sqlch101";
7
+
8
+ function ctxFor(entities: Array<[string, unknown]>) {
9
+ const out = sqlSerializer.serialize(new Map(entities as never)) as SerializerResult;
10
+ return makePostSynthCtx("sql", out.primary);
11
+ }
12
+
13
+ describe("SQLCH101: an engine the pinned server does not have", () => {
14
+ test("a misspelled table engine is reported against the object", () => {
15
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = MergTree ORDER BY a`;
16
+ const diags = sqlch101.check(ctxFor([["t", t]]));
17
+ expect(diags).toHaveLength(1);
18
+ expect(diags[0]).toMatchObject({ checkId: "SQLCH101", severity: "error", entity: "t" });
19
+ expect(diags[0]!.message).toMatch(/"MergTree"/);
20
+ });
21
+
22
+ test("a database engine is checked against the database engines", () => {
23
+ const db = database`CREATE DATABASE d ENGINE = MergeTree`;
24
+ expect(sqlch101.check(ctxFor([["d", db]]))).toHaveLength(1);
25
+ });
26
+
27
+ test("known engines, and an object with no engine, are clean", () => {
28
+ const t = table`CREATE TABLE t (a UInt8) ENGINE = ReplacingMergeTree ORDER BY a`;
29
+ const db = database`CREATE DATABASE d ENGINE = Atomic`;
30
+ const bare = database`CREATE DATABASE e`;
31
+ expect(sqlch101.check(ctxFor([["t", t], ["d", db], ["e", bare]]))).toEqual([]);
32
+ });
33
+ });
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Audit metadata for the Postgres post-synth checks (SQLPG1xx). Spread into
3
+ * `sqlAuditCatalog` by ../audit-catalog.ts. Deprecation checks are filed under
4
+ * best-practice or correctness: the audit categories have no deprecation of
5
+ * their own.
6
+ */
7
+
8
+ import { auditRule, type RuleMeta } from "@intentius/chant/audit/catalog";
9
+
10
+ export const postgresPostSynthAuditEntries: Record<string, RuleMeta> = {
11
+ SQLPG101: auditRule("SQLPG101", "merge-worthy", "guidance", "A table declares no primary key", "Add a primary key, or a UNIQUE constraint over NOT NULL columns.", { category: "best-practice" }),
12
+ SQLPG102: auditRule("SQLPG102", "report-only", "guidance", "A foreign key's referencing columns have no index", "Create an index whose leading columns are the foreign key's columns.", { category: "best-practice" }),
13
+ SQLPG103: auditRule("SQLPG103", "report-only", "guidance", "A serial column where an identity column is preferred", "Declare the column GENERATED ALWAYS AS IDENTITY.", { category: "best-practice" }),
14
+ SQLPG104: auditRule("SQLPG104", "report-only", "guidance", "A timestamp column without time zone", "Use timestamptz.", { category: "correctness" }),
15
+ SQLPG105: auditRule("SQLPG105", "report-only", "guidance", "A json column where jsonb fits", "Use jsonb unless the exact text must be kept.", { category: "best-practice" }),
16
+ SQLPG106: auditRule("SQLPG106", "report-only", "guidance", "A char(n) column", "Use text, or varchar(n) for a length rule.", { category: "best-practice" }),
17
+ SQLPG107: auditRule("SQLPG107", "report-only", "guidance", "A money column", "Use numeric(p, s) and a currency column.", { category: "correctness" }),
18
+ SQLPG108: auditRule("SQLPG108", "report-only", "guidance", "A varchar(n) column with a habitual length limit", "Use text, with a CHECK where the length is a rule.", { category: "best-practice" }),
19
+ SQLPG109: auditRule("SQLPG109", "report-only", "guidance", "An index duplicates a constraint or another index", "Drop the duplicate index.", { category: "best-practice" }),
20
+ SQLPG110: auditRule("SQLPG110", "report-only", "guidance", "A btree index is a prefix of another index", "Drop the prefix index; the wider one serves the same queries.", { category: "best-practice" }),
21
+ SQLPG111: auditRule("SQLPG111", "report-only", "guidance", "A materialized view has no unique index, so it cannot refresh concurrently", "Add a unique index over plain columns.", { category: "correctness" }),
22
+ SQLPG112: auditRule("SQLPG112", "report-only", "guidance", "A secret- or PII-named column with no comment on it or its table", "Add a COMMENT saying what it holds and how it is protected.", { category: "security" }),
23
+ SQLPG113: auditRule("SQLPG113", "report-only", "guidance", "An object is in the public schema though the project declares schemas", "Qualify the object with a declared schema.", { category: "best-practice" }),
24
+ SQLPG114: auditRule("SQLPG114", "merge-worthy", "guidance", "A storage parameter the object's kind or the target major does not accept", "Fix the parameter name, or use one from the target major's catalog.", { category: "correctness" }),
25
+ SQLPG115: auditRule("SQLPG115", "report-only", "guidance", "A feature newer than the target major", "Avoid the feature, or raise sql.postgresMajor.", { category: "correctness" }),
26
+ SQLPG116: auditRule("SQLPG116", "merge-worthy", "guidance", "An extension the target major no longer ships", "Remove the extension, or set sql.postgresMajor to an older major.", { category: "best-practice" }),
27
+ SQLPG117: auditRule("SQLPG117", "report-only", "guidance", "A view without security_invoker runs with its owner's privileges", "Set security_invoker = true in the view's WITH options.", { category: "security" }),
28
+ SQLPG118: auditRule("SQLPG118", "report-only", "guidance", "A table uses INHERITS where declarative partitioning replaced it", "Use PARTITION BY and PARTITION OF.", { category: "best-practice" }),
29
+ };