@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.4

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 (463) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/bin/cli.js +0 -0
  3. package/dist/cli/commands/plan.js +21 -0
  4. package/dist/cli/utils.d.ts +2 -0
  5. package/dist/cli/utils.js +1 -1
  6. package/dist/core/objects/table/table.model.d.ts +4 -2
  7. package/dist/core/objects/table/table.model.js +3 -0
  8. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  9. package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
  10. package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
  11. package/dist/core/objects/trigger/trigger.model.js +3 -0
  12. package/dist/core/plan/apply.js +3 -3
  13. package/dist/core/plan/create.js +34 -15
  14. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  15. package/dist/core/plan/sql-format/constants.js +11 -0
  16. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  17. package/dist/core/plan/sql-format/fixtures.js +2449 -0
  18. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  19. package/dist/core/plan/sql-format/format-utils.js +274 -0
  20. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  21. package/dist/core/plan/sql-format/formatters.js +737 -0
  22. package/dist/core/plan/sql-format/index.d.ts +2 -0
  23. package/dist/core/plan/sql-format/index.js +98 -0
  24. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  25. package/dist/core/plan/sql-format/keyword-case.js +868 -0
  26. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  27. package/dist/core/plan/sql-format/protect.js +269 -0
  28. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  29. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  30. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  31. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  32. package/dist/core/plan/sql-format/types.d.ts +28 -0
  33. package/dist/core/plan/sql-format/types.js +1 -0
  34. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  35. package/dist/core/plan/sql-format/wrap.js +165 -0
  36. package/dist/core/plan/sql-format.d.ts +2 -0
  37. package/dist/core/plan/sql-format.js +1 -0
  38. package/dist/core/plan/statements.d.ts +2 -1
  39. package/dist/core/plan/statements.js +6 -2
  40. package/dist/core/postgres-config.d.ts +15 -0
  41. package/dist/core/postgres-config.js +30 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +37 -22
  45. package/src/cli/app.ts +28 -0
  46. package/src/cli/bin/cli.ts +9 -0
  47. package/src/cli/commands/apply.ts +101 -0
  48. package/src/cli/commands/plan.ts +195 -0
  49. package/src/cli/commands/sync.ts +185 -0
  50. package/src/cli/formatters/index.ts +5 -0
  51. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  52. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  53. package/src/cli/formatters/tree/tree.ts +237 -0
  54. package/src/cli/utils/integrations.ts +42 -0
  55. package/src/cli/utils.ts +231 -0
  56. package/src/core/catalog.diff.ts +246 -0
  57. package/src/core/catalog.model.ts +384 -0
  58. package/src/core/change.types.ts +44 -0
  59. package/src/core/context.ts +26 -0
  60. package/src/core/depend.ts +1870 -0
  61. package/src/core/expand-replace-dependencies.ts +380 -0
  62. package/src/core/fingerprint.ts +204 -0
  63. package/src/core/integrations/filter/dsl.ts +204 -0
  64. package/src/core/integrations/filter/extractors.ts +145 -0
  65. package/src/core/integrations/filter/filter.types.ts +3 -0
  66. package/src/core/integrations/integration-dsl.ts +24 -0
  67. package/src/core/integrations/integration.types.ts +7 -0
  68. package/src/core/integrations/serialize/dsl.ts +77 -0
  69. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  70. package/src/core/integrations/supabase.ts +121 -0
  71. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  72. package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
  73. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  74. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
  75. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  76. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  77. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
  78. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  79. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
  80. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  81. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
  82. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  83. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
  84. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  85. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  86. package/src/core/objects/base.change.ts +62 -0
  87. package/src/core/objects/base.default-privileges.ts +204 -0
  88. package/src/core/objects/base.diff.ts +20 -0
  89. package/src/core/objects/base.model.ts +82 -0
  90. package/src/core/objects/base.privilege-diff.ts +299 -0
  91. package/src/core/objects/base.privilege.ts +184 -0
  92. package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
  93. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  94. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  95. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  96. package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
  97. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  98. package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
  99. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  100. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  101. package/src/core/objects/collation/collation.diff.test.ts +100 -0
  102. package/src/core/objects/collation/collation.diff.ts +126 -0
  103. package/src/core/objects/collation/collation.model.ts +224 -0
  104. package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
  105. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  106. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  107. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  108. package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
  109. package/src/core/objects/domain/changes/domain.create.ts +118 -0
  110. package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
  111. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  112. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  113. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  114. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  115. package/src/core/objects/domain/domain.diff.ts +358 -0
  116. package/src/core/objects/domain/domain.model.ts +190 -0
  117. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
  118. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  119. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  120. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  121. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
  122. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  123. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
  124. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  125. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  126. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
  127. package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
  128. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  129. package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
  130. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  131. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  132. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  133. package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
  134. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  135. package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
  136. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  137. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  138. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  139. package/src/core/objects/extension/extension.diff.ts +90 -0
  140. package/src/core/objects/extension/extension.model.ts +280 -0
  141. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
  142. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  143. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  144. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
  146. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
  148. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  149. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  150. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  151. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
  152. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
  153. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  154. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  155. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
  156. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  157. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  158. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  159. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
  160. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  161. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
  162. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  163. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  164. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  165. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  166. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
  167. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  168. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
  169. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  170. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  171. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  172. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
  173. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  174. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
  175. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  176. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  177. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  178. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
  179. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
  180. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  181. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
  182. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  183. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  184. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
  185. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  186. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
  187. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  188. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  189. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  190. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  191. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  192. package/src/core/objects/index/changes/index.alter.test.ts +200 -0
  193. package/src/core/objects/index/changes/index.alter.ts +144 -0
  194. package/src/core/objects/index/changes/index.base.ts +20 -0
  195. package/src/core/objects/index/changes/index.comment.ts +63 -0
  196. package/src/core/objects/index/changes/index.create.test.ts +66 -0
  197. package/src/core/objects/index/changes/index.create.ts +68 -0
  198. package/src/core/objects/index/changes/index.drop.test.ts +44 -0
  199. package/src/core/objects/index/changes/index.drop.ts +34 -0
  200. package/src/core/objects/index/changes/index.types.ts +6 -0
  201. package/src/core/objects/index/changes/utils.ts +16 -0
  202. package/src/core/objects/index/index.diff.test.ts +153 -0
  203. package/src/core/objects/index/index.diff.ts +243 -0
  204. package/src/core/objects/index/index.model.ts +370 -0
  205. package/src/core/objects/language/changes/language.alter.test.ts +33 -0
  206. package/src/core/objects/language/changes/language.alter.ts +53 -0
  207. package/src/core/objects/language/changes/language.base.ts +20 -0
  208. package/src/core/objects/language/changes/language.comment.ts +58 -0
  209. package/src/core/objects/language/changes/language.create.test.ts +27 -0
  210. package/src/core/objects/language/changes/language.create.ts +104 -0
  211. package/src/core/objects/language/changes/language.drop.test.ts +25 -0
  212. package/src/core/objects/language/changes/language.drop.ts +39 -0
  213. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  214. package/src/core/objects/language/changes/language.types.ts +12 -0
  215. package/src/core/objects/language/language.diff.test.ts +53 -0
  216. package/src/core/objects/language/language.diff.ts +176 -0
  217. package/src/core/objects/language/language.model.ts +150 -0
  218. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
  219. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  220. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  221. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  222. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
  223. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  224. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
  225. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  226. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  227. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  228. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
  229. package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
  230. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  231. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
  232. package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
  233. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  234. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  235. package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
  236. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  237. package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
  238. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  239. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  240. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  241. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  242. package/src/core/objects/procedure/procedure.diff.ts +404 -0
  243. package/src/core/objects/procedure/procedure.model.ts +264 -0
  244. package/src/core/objects/procedure/utils.ts +58 -0
  245. package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
  246. package/src/core/objects/publication/changes/publication.alter.ts +243 -0
  247. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  248. package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
  249. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  250. package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
  251. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  252. package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
  253. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  254. package/src/core/objects/publication/changes/publication.types.ts +26 -0
  255. package/src/core/objects/publication/publication.diff.test.ts +292 -0
  256. package/src/core/objects/publication/publication.diff.ts +253 -0
  257. package/src/core/objects/publication/publication.model.ts +206 -0
  258. package/src/core/objects/publication/utils.ts +55 -0
  259. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
  260. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  261. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  262. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  263. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
  264. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  265. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
  266. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  267. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  268. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  269. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  270. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  271. package/src/core/objects/role/changes/role.alter.test.ts +346 -0
  272. package/src/core/objects/role/changes/role.alter.ts +110 -0
  273. package/src/core/objects/role/changes/role.base.ts +24 -0
  274. package/src/core/objects/role/changes/role.comment.ts +55 -0
  275. package/src/core/objects/role/changes/role.create.test.ts +52 -0
  276. package/src/core/objects/role/changes/role.create.ts +102 -0
  277. package/src/core/objects/role/changes/role.drop.test.ts +29 -0
  278. package/src/core/objects/role/changes/role.drop.ts +34 -0
  279. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  280. package/src/core/objects/role/changes/role.types.ts +12 -0
  281. package/src/core/objects/role/role.diff.test.ts +44 -0
  282. package/src/core/objects/role/role.diff.ts +479 -0
  283. package/src/core/objects/role/role.model.ts +344 -0
  284. package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
  285. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  286. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  287. package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
  288. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  289. package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
  290. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  291. package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
  292. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  293. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  294. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  295. package/src/core/objects/rule/rule.diff.ts +79 -0
  296. package/src/core/objects/rule/rule.model.ts +173 -0
  297. package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
  298. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  299. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  300. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  301. package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
  302. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  303. package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
  304. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  305. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  306. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  307. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  308. package/src/core/objects/schema/schema.diff.ts +209 -0
  309. package/src/core/objects/schema/schema.model.ts +107 -0
  310. package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
  311. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  312. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  313. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  314. package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
  315. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  316. package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
  317. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  318. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  319. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  320. package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
  321. package/src/core/objects/sequence/sequence.diff.ts +359 -0
  322. package/src/core/objects/sequence/sequence.model.ts +185 -0
  323. package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
  324. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  325. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  326. package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
  327. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  328. package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
  329. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  330. package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
  331. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  332. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  333. package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
  334. package/src/core/objects/subscription/subscription.diff.ts +241 -0
  335. package/src/core/objects/subscription/subscription.model.ts +190 -0
  336. package/src/core/objects/subscription/utils.ts +156 -0
  337. package/src/core/objects/table/changes/table.alter.test.ts +823 -0
  338. package/src/core/objects/table/changes/table.alter.ts +806 -0
  339. package/src/core/objects/table/changes/table.base.ts +20 -0
  340. package/src/core/objects/table/changes/table.comment.ts +266 -0
  341. package/src/core/objects/table/changes/table.create.test.ts +150 -0
  342. package/src/core/objects/table/changes/table.create.ts +188 -0
  343. package/src/core/objects/table/changes/table.drop.test.ts +34 -0
  344. package/src/core/objects/table/changes/table.drop.ts +45 -0
  345. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  346. package/src/core/objects/table/changes/table.types.ts +12 -0
  347. package/src/core/objects/table/table.diff.test.ts +711 -0
  348. package/src/core/objects/table/table.diff.ts +953 -0
  349. package/src/core/objects/table/table.model.ts +460 -0
  350. package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
  351. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  352. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  353. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  354. package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
  355. package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
  356. package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
  357. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  358. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  359. package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
  360. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  361. package/src/core/objects/trigger/trigger.model.ts +252 -0
  362. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
  363. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  364. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  365. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  366. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
  367. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  368. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
  369. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  370. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  371. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  372. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
  373. package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
  374. package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
  375. package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
  376. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  377. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  378. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  379. package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
  380. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  381. package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
  382. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  383. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  384. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  385. package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
  386. package/src/core/objects/type/enum/enum.diff.ts +396 -0
  387. package/src/core/objects/type/enum/enum.model.ts +194 -0
  388. package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
  389. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  390. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  391. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  392. package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
  393. package/src/core/objects/type/range/changes/range.create.ts +151 -0
  394. package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
  395. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  396. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  397. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  398. package/src/core/objects/type/range/range.diff.test.ts +70 -0
  399. package/src/core/objects/type/range/range.diff.ts +259 -0
  400. package/src/core/objects/type/range/range.model.ts +187 -0
  401. package/src/core/objects/type/type.types.ts +5 -0
  402. package/src/core/objects/utils.ts +171 -0
  403. package/src/core/objects/view/changes/view.alter.test.ts +110 -0
  404. package/src/core/objects/view/changes/view.alter.ts +112 -0
  405. package/src/core/objects/view/changes/view.base.ts +20 -0
  406. package/src/core/objects/view/changes/view.comment.ts +59 -0
  407. package/src/core/objects/view/changes/view.create.test.ts +65 -0
  408. package/src/core/objects/view/changes/view.create.ts +73 -0
  409. package/src/core/objects/view/changes/view.drop.test.ts +34 -0
  410. package/src/core/objects/view/changes/view.drop.ts +40 -0
  411. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  412. package/src/core/objects/view/changes/view.types.ts +12 -0
  413. package/src/core/objects/view/view.diff.test.ts +91 -0
  414. package/src/core/objects/view/view.diff.ts +365 -0
  415. package/src/core/objects/view/view.model.ts +276 -0
  416. package/src/core/plan/apply.ts +190 -0
  417. package/src/core/plan/create.ts +432 -0
  418. package/src/core/plan/hierarchy.ts +574 -0
  419. package/src/core/plan/index.ts +29 -0
  420. package/src/core/plan/io.ts +20 -0
  421. package/src/core/plan/risk.ts +48 -0
  422. package/src/core/plan/serialize.ts +195 -0
  423. package/src/core/plan/sql-format/constants.ts +13 -0
  424. package/src/core/plan/sql-format/fixtures.ts +2806 -0
  425. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  426. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  427. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
  428. package/src/core/plan/sql-format/format-off.test.ts +809 -0
  429. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
  430. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
  431. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
  432. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
  433. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  434. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  435. package/src/core/plan/sql-format/format-utils.ts +391 -0
  436. package/src/core/plan/sql-format/formatters.ts +921 -0
  437. package/src/core/plan/sql-format/index.ts +149 -0
  438. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  439. package/src/core/plan/sql-format/keyword-case.ts +1085 -0
  440. package/src/core/plan/sql-format/protect.test.ts +127 -0
  441. package/src/core/plan/sql-format/protect.ts +337 -0
  442. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  443. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  444. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  445. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  446. package/src/core/plan/sql-format/types.ts +31 -0
  447. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  448. package/src/core/plan/sql-format/wrap.ts +196 -0
  449. package/src/core/plan/sql-format.ts +2 -0
  450. package/src/core/plan/statements.ts +22 -0
  451. package/src/core/plan/types.ts +165 -0
  452. package/src/core/postgres-config.ts +169 -0
  453. package/src/core/sort/custom-constraints.ts +161 -0
  454. package/src/core/sort/debug-visualization.ts +239 -0
  455. package/src/core/sort/dependency-filter.ts +224 -0
  456. package/src/core/sort/graph-builder.ts +223 -0
  457. package/src/core/sort/graph-utils.ts +51 -0
  458. package/src/core/sort/logical-sort.ts +590 -0
  459. package/src/core/sort/sort-changes.ts +234 -0
  460. package/src/core/sort/topological-sort.ts +184 -0
  461. package/src/core/sort/types.ts +112 -0
  462. package/src/core/sort/utils.ts +69 -0
  463. package/src/index.ts +14 -0
@@ -0,0 +1,317 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
2
+ import type { Pool } from "pg";
3
+ import z from "zod";
4
+ import { BasePgModel } from "../base.model.ts";
5
+ import {
6
+ type PrivilegeProps,
7
+ privilegePropsSchema,
8
+ } from "../base.privilege-diff.ts";
9
+
10
+ const AggregateKindSchema = z.enum([
11
+ "n", // normal aggregate
12
+ "o", // ordered-set aggregate
13
+ "h", // hypothetical-set aggregate
14
+ ]);
15
+
16
+ const FunctionParallelSafetySchema = z.enum([
17
+ "u", // UNSAFE
18
+ "s", // SAFE
19
+ "r", // RESTRICTED
20
+ ]);
21
+
22
+ const FunctionArgumentModeSchema = z.enum([
23
+ "i", // IN parameter
24
+ "o", // OUT parameter
25
+ "b", // INOUT parameter
26
+ "v", // VARIADIC parameter
27
+ "t", // TABLE parameter
28
+ ]);
29
+
30
+ const FinalFunctionModifySchema = z.enum([
31
+ "r", // READ_ONLY
32
+ "s", // SHAREABLE
33
+ "w", // READ_WRITE
34
+ ]);
35
+
36
+ const aggregatePropsSchema = z.object({
37
+ schema: z.string(),
38
+ name: z.string(),
39
+ identity_arguments: z.string(),
40
+ kind: z.literal("a"),
41
+ aggkind: AggregateKindSchema,
42
+ num_direct_args: z.number(),
43
+ return_type: z.string(),
44
+ return_type_schema: z.string().nullable(),
45
+ parallel_safety: FunctionParallelSafetySchema,
46
+ is_strict: z.boolean(),
47
+ transition_function: z.string(),
48
+ state_data_type: z.string(),
49
+ state_data_type_schema: z.string().nullable(),
50
+ state_data_space: z.number(),
51
+ final_function: z.string().nullable(),
52
+ final_function_extra_args: z.boolean(),
53
+ final_function_modify: FinalFunctionModifySchema.nullable(),
54
+ combine_function: z.string().nullable(),
55
+ serial_function: z.string().nullable(),
56
+ deserial_function: z.string().nullable(),
57
+ initial_condition: z.string().nullable(),
58
+ moving_transition_function: z.string().nullable(),
59
+ moving_inverse_function: z.string().nullable(),
60
+ moving_state_data_type: z.string().nullable(),
61
+ moving_state_data_type_schema: z.string().nullable(),
62
+ moving_state_data_space: z.number().nullable(),
63
+ moving_final_function: z.string().nullable(),
64
+ moving_final_function_extra_args: z.boolean(),
65
+ moving_final_function_modify: FinalFunctionModifySchema.nullable(),
66
+ moving_initial_condition: z.string().nullable(),
67
+ sort_operator: z.string().nullable(),
68
+ argument_count: z.number(),
69
+ argument_default_count: z.number(),
70
+ argument_names: z.array(z.string()).nullable(),
71
+ argument_types: z.array(z.string()).nullable(),
72
+ all_argument_types: z.array(z.string()).nullable(),
73
+ argument_modes: z.array(FunctionArgumentModeSchema).nullable(),
74
+ argument_defaults: z.string().nullable(),
75
+ owner: z.string(),
76
+ comment: z.string().nullable(),
77
+ privileges: z.array(privilegePropsSchema),
78
+ });
79
+
80
+ type AggregatePrivilegeProps = PrivilegeProps;
81
+ type AggregateProps = z.infer<typeof aggregatePropsSchema>;
82
+
83
+ export class Aggregate extends BasePgModel {
84
+ public readonly schema: AggregateProps["schema"];
85
+ public readonly name: AggregateProps["name"];
86
+ public readonly identityArguments: AggregateProps["identity_arguments"];
87
+ public readonly kind: AggregateProps["kind"];
88
+ public readonly aggkind: AggregateProps["aggkind"];
89
+ public readonly num_direct_args: AggregateProps["num_direct_args"];
90
+ public readonly return_type: AggregateProps["return_type"];
91
+ public readonly return_type_schema: AggregateProps["return_type_schema"];
92
+ public readonly parallel_safety: AggregateProps["parallel_safety"];
93
+ public readonly is_strict: AggregateProps["is_strict"];
94
+ public readonly transition_function: AggregateProps["transition_function"];
95
+ public readonly state_data_type: AggregateProps["state_data_type"];
96
+ public readonly state_data_type_schema: AggregateProps["state_data_type_schema"];
97
+ public readonly state_data_space: AggregateProps["state_data_space"];
98
+ public readonly final_function: AggregateProps["final_function"];
99
+ public readonly final_function_extra_args: AggregateProps["final_function_extra_args"];
100
+ public readonly final_function_modify: AggregateProps["final_function_modify"];
101
+ public readonly combine_function: AggregateProps["combine_function"];
102
+ public readonly serial_function: AggregateProps["serial_function"];
103
+ public readonly deserial_function: AggregateProps["deserial_function"];
104
+ public readonly initial_condition: AggregateProps["initial_condition"];
105
+ public readonly moving_transition_function: AggregateProps["moving_transition_function"];
106
+ public readonly moving_inverse_function: AggregateProps["moving_inverse_function"];
107
+ public readonly moving_state_data_type: AggregateProps["moving_state_data_type"];
108
+ public readonly moving_state_data_type_schema: AggregateProps["moving_state_data_type_schema"];
109
+ public readonly moving_state_data_space: AggregateProps["moving_state_data_space"];
110
+ public readonly moving_final_function: AggregateProps["moving_final_function"];
111
+ public readonly moving_final_function_extra_args: AggregateProps["moving_final_function_extra_args"];
112
+ public readonly moving_final_function_modify: AggregateProps["moving_final_function_modify"];
113
+ public readonly moving_initial_condition: AggregateProps["moving_initial_condition"];
114
+ public readonly sort_operator: AggregateProps["sort_operator"];
115
+ public readonly argument_count: AggregateProps["argument_count"];
116
+ public readonly argument_default_count: AggregateProps["argument_default_count"];
117
+ public readonly argument_names: AggregateProps["argument_names"];
118
+ public readonly argument_types: AggregateProps["argument_types"];
119
+ public readonly all_argument_types: AggregateProps["all_argument_types"];
120
+ public readonly argument_modes: AggregateProps["argument_modes"];
121
+ public readonly argument_defaults: AggregateProps["argument_defaults"];
122
+ public readonly owner: AggregateProps["owner"];
123
+ public readonly comment: AggregateProps["comment"];
124
+ public readonly privileges: AggregatePrivilegeProps[];
125
+
126
+ constructor(props: AggregateProps) {
127
+ super();
128
+
129
+ this.schema = props.schema;
130
+ this.name = props.name;
131
+ this.identityArguments = props.identity_arguments.trim();
132
+ this.kind = props.kind;
133
+ this.aggkind = props.aggkind;
134
+ this.num_direct_args = props.num_direct_args;
135
+ this.return_type = props.return_type;
136
+ this.return_type_schema = props.return_type_schema;
137
+ this.parallel_safety = props.parallel_safety;
138
+ this.is_strict = props.is_strict;
139
+ this.transition_function = props.transition_function;
140
+ this.state_data_type = props.state_data_type;
141
+ this.state_data_type_schema = props.state_data_type_schema;
142
+ this.state_data_space = props.state_data_space;
143
+ this.final_function = props.final_function;
144
+ this.final_function_extra_args = props.final_function_extra_args;
145
+ this.final_function_modify = props.final_function_modify;
146
+ this.combine_function = props.combine_function;
147
+ this.serial_function = props.serial_function;
148
+ this.deserial_function = props.deserial_function;
149
+ this.initial_condition = props.initial_condition;
150
+ this.moving_transition_function = props.moving_transition_function;
151
+ this.moving_inverse_function = props.moving_inverse_function;
152
+ this.moving_state_data_type = props.moving_state_data_type;
153
+ this.moving_state_data_type_schema = props.moving_state_data_type_schema;
154
+ this.moving_state_data_space = props.moving_state_data_space;
155
+ this.moving_final_function = props.moving_final_function;
156
+ this.moving_final_function_extra_args =
157
+ props.moving_final_function_extra_args;
158
+ this.moving_final_function_modify = props.moving_final_function_modify;
159
+ this.moving_initial_condition = props.moving_initial_condition;
160
+ this.sort_operator = props.sort_operator;
161
+ this.argument_count = props.argument_count;
162
+ this.argument_default_count = props.argument_default_count;
163
+ this.argument_names = props.argument_names;
164
+ this.argument_types = props.argument_types;
165
+ this.all_argument_types = props.all_argument_types;
166
+ this.argument_modes = props.argument_modes;
167
+ this.argument_defaults = props.argument_defaults;
168
+ this.owner = props.owner;
169
+ this.comment = props.comment;
170
+ this.privileges = props.privileges;
171
+ }
172
+
173
+ get stableId(): `aggregate:${string}` {
174
+ const normalized = this.identityArguments;
175
+ return `aggregate:${this.schema}.${this.name}(${normalized})`;
176
+ }
177
+
178
+ get identityFields() {
179
+ return {
180
+ schema: this.schema,
181
+ name: this.name,
182
+ identity_arguments: this.identityArguments,
183
+ };
184
+ }
185
+
186
+ get dataFields() {
187
+ return {
188
+ kind: this.kind,
189
+ aggkind: this.aggkind,
190
+ num_direct_args: this.num_direct_args,
191
+ return_type: this.return_type,
192
+ return_type_schema: this.return_type_schema,
193
+ parallel_safety: this.parallel_safety,
194
+ is_strict: this.is_strict,
195
+ transition_function: this.transition_function,
196
+ state_data_type: this.state_data_type,
197
+ state_data_type_schema: this.state_data_type_schema,
198
+ state_data_space: this.state_data_space,
199
+ final_function: this.final_function,
200
+ final_function_extra_args: this.final_function_extra_args,
201
+ final_function_modify: this.final_function_modify,
202
+ combine_function: this.combine_function,
203
+ serial_function: this.serial_function,
204
+ deserial_function: this.deserial_function,
205
+ initial_condition: this.initial_condition,
206
+ moving_transition_function: this.moving_transition_function,
207
+ moving_inverse_function: this.moving_inverse_function,
208
+ moving_state_data_type: this.moving_state_data_type,
209
+ moving_state_data_type_schema: this.moving_state_data_type_schema,
210
+ moving_state_data_space: this.moving_state_data_space,
211
+ moving_final_function: this.moving_final_function,
212
+ moving_final_function_extra_args: this.moving_final_function_extra_args,
213
+ moving_final_function_modify: this.moving_final_function_modify,
214
+ moving_initial_condition: this.moving_initial_condition,
215
+ sort_operator: this.sort_operator,
216
+ argument_count: this.argument_count,
217
+ argument_default_count: this.argument_default_count,
218
+ argument_names: this.argument_names,
219
+ argument_types: this.argument_types,
220
+ all_argument_types: this.all_argument_types,
221
+ argument_modes: this.argument_modes,
222
+ argument_defaults: this.argument_defaults,
223
+ identity_arguments: this.identityArguments,
224
+ owner: this.owner,
225
+ comment: this.comment,
226
+ privileges: this.privileges,
227
+ };
228
+ }
229
+ }
230
+
231
+ export async function extractAggregates(pool: Pool): Promise<Aggregate[]> {
232
+ const { rows: aggregateRows } = await pool.query<AggregateProps>(sql`
233
+ with extension_oids as (
234
+ select
235
+ objid
236
+ from
237
+ pg_depend d
238
+ where
239
+ d.refclassid = 'pg_extension'::regclass
240
+ and d.classid = 'pg_proc'::regclass
241
+ )
242
+ select
243
+ p.pronamespace::regnamespace::text as schema,
244
+ quote_ident(p.proname) as name,
245
+ pg_catalog.pg_get_function_identity_arguments(p.oid) as identity_arguments,
246
+ p.prokind as kind,
247
+ a.aggkind,
248
+ a.aggnumdirectargs as num_direct_args,
249
+ format_type(p.prorettype, null) as return_type,
250
+ rt.typnamespace::regnamespace::text as return_type_schema,
251
+ p.proparallel as parallel_safety,
252
+ p.proisstrict as is_strict,
253
+ a.aggtransfn::regprocedure::text as transition_function,
254
+ format_type(a.aggtranstype, null) as state_data_type,
255
+ st.typnamespace::regnamespace::text as state_data_type_schema,
256
+ a.aggtransspace as state_data_space,
257
+ case when a.aggfinalfn = 0 then null else a.aggfinalfn::regprocedure::text end as final_function,
258
+ a.aggfinalextra as final_function_extra_args,
259
+ nullif(a.aggfinalmodify::text, ' ') as final_function_modify,
260
+ case when a.aggcombinefn = 0 then null else a.aggcombinefn::regprocedure::text end as combine_function,
261
+ case when a.aggserialfn = 0 then null else a.aggserialfn::regprocedure::text end as serial_function,
262
+ case when a.aggdeserialfn = 0 then null else a.aggdeserialfn::regprocedure::text end as deserial_function,
263
+ a.agginitval as initial_condition,
264
+ case when a.aggmtransfn = 0 then null else a.aggmtransfn::regprocedure::text end as moving_transition_function,
265
+ case when a.aggminvtransfn = 0 then null else a.aggminvtransfn::regprocedure::text end as moving_inverse_function,
266
+ case when a.aggmtranstype = 0 then null else format_type(a.aggmtranstype, null) end as moving_state_data_type,
267
+ case when a.aggmtranstype = 0 then null else mt.typnamespace::regnamespace::text end as moving_state_data_type_schema,
268
+ case when a.aggmtransfn = 0 then null else a.aggmtransspace end as moving_state_data_space,
269
+ case when a.aggmfinalfn = 0 then null else a.aggmfinalfn::regprocedure::text end as moving_final_function,
270
+ a.aggmfinalextra as moving_final_function_extra_args,
271
+ nullif(a.aggmfinalmodify::text, ' ') as moving_final_function_modify,
272
+ a.aggminitval as moving_initial_condition,
273
+ case when a.aggsortop = 0 then null else a.aggsortop::regoperator::text end as sort_operator,
274
+ p.pronargs as argument_count,
275
+ p.pronargdefaults as argument_default_count,
276
+ case when p.proargnames is null then null
277
+ else array(select quote_ident(n) from unnest(p.proargnames) as n)
278
+ end as argument_names,
279
+ array(select format_type(oid, null) from unnest(p.proargtypes) as oid) as argument_types,
280
+ array(select format_type(oid, null) from unnest(p.proallargtypes) as oid) as all_argument_types,
281
+ p.proargmodes as argument_modes,
282
+ pg_get_expr(p.proargdefaults, 0) as argument_defaults,
283
+ p.proowner::regrole::text as owner,
284
+ obj_description(p.oid, 'pg_proc') as comment,
285
+ coalesce(
286
+ (
287
+ select json_agg(
288
+ json_build_object(
289
+ 'grantee', case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end,
290
+ 'privilege', x.privilege_type,
291
+ 'grantable', x.is_grantable
292
+ )
293
+ order by x.grantee, x.privilege_type
294
+ )
295
+ from lateral aclexplode(p.proacl) as x(grantor, grantee, privilege_type, is_grantable)
296
+ ), '[]'
297
+ ) as privileges
298
+ from
299
+ pg_catalog.pg_proc p
300
+ inner join pg_catalog.pg_aggregate a on a.aggfnoid = p.oid
301
+ left join pg_catalog.pg_type rt on rt.oid = p.prorettype
302
+ left join pg_catalog.pg_type st on st.oid = a.aggtranstype
303
+ left join pg_catalog.pg_type mt on mt.oid = a.aggmtranstype
304
+ left outer join extension_oids e on p.oid = e.objid
305
+ where
306
+ p.prokind = 'a'
307
+ and not p.pronamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
308
+ and e.objid is null
309
+ order by
310
+ 1, 2, 3
311
+ `);
312
+
313
+ const validatedRows = aggregateRows.map((row: unknown) =>
314
+ aggregatePropsSchema.parse(row),
315
+ );
316
+ return validatedRows.map((row: AggregateProps) => new Aggregate(row));
317
+ }
@@ -0,0 +1,64 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Aggregate } from "../aggregate.model.ts";
3
+ import { AlterAggregateChangeOwner } from "./aggregate.alter.ts";
4
+
5
+ type AggregateProps = ConstructorParameters<typeof Aggregate>[0];
6
+
7
+ const base: AggregateProps = {
8
+ schema: "public",
9
+ name: "agg_sum",
10
+ identity_arguments: "integer",
11
+ kind: "a",
12
+ aggkind: "n",
13
+ num_direct_args: 0,
14
+ return_type: "integer",
15
+ return_type_schema: "pg_catalog",
16
+ parallel_safety: "u",
17
+ is_strict: false,
18
+ transition_function: "pg_catalog.int4pl(integer,integer)",
19
+ state_data_type: "integer",
20
+ state_data_type_schema: "pg_catalog",
21
+ state_data_space: 0,
22
+ final_function: null,
23
+ final_function_extra_args: false,
24
+ final_function_modify: null,
25
+ combine_function: null,
26
+ serial_function: null,
27
+ deserial_function: null,
28
+ initial_condition: null,
29
+ moving_transition_function: null,
30
+ moving_inverse_function: null,
31
+ moving_state_data_type: null,
32
+ moving_state_data_type_schema: null,
33
+ moving_state_data_space: null,
34
+ moving_final_function: null,
35
+ moving_final_function_extra_args: false,
36
+ moving_final_function_modify: null,
37
+ moving_initial_condition: null,
38
+ sort_operator: null,
39
+ argument_count: 1,
40
+ argument_default_count: 0,
41
+ argument_names: null,
42
+ argument_types: ["integer"],
43
+ all_argument_types: null,
44
+ argument_modes: null,
45
+ argument_defaults: null,
46
+ owner: "owner1",
47
+ comment: null,
48
+ privileges: [],
49
+ };
50
+
51
+ describe("aggregate.alter", () => {
52
+ test("serialize owner change", () => {
53
+ const aggregate = new Aggregate(base);
54
+ const change = new AlterAggregateChangeOwner({
55
+ aggregate,
56
+ owner: "owner2",
57
+ });
58
+
59
+ expect(change.requires).toEqual([aggregate.stableId]);
60
+ expect(change.serialize()).toBe(
61
+ "ALTER AGGREGATE public.agg_sum(integer) OWNER TO owner2",
62
+ );
63
+ });
64
+ });
@@ -0,0 +1,32 @@
1
+ import type { Aggregate } from "../aggregate.model.ts";
2
+ import { AlterAggregateChange } from "./aggregate.base.ts";
3
+
4
+ export type AlterAggregate = AlterAggregateChangeOwner;
5
+
6
+ /**
7
+ * ALTER AGGREGATE ... OWNER TO ...
8
+ *
9
+ * @see https://www.postgresql.org/docs/17/sql-alteraggregate.html
10
+ */
11
+ export class AlterAggregateChangeOwner extends AlterAggregateChange {
12
+ public readonly aggregate: Aggregate;
13
+ public readonly owner: string;
14
+ public readonly scope = "object" as const;
15
+
16
+ constructor(props: { aggregate: Aggregate; owner: string }) {
17
+ super();
18
+ this.aggregate = props.aggregate;
19
+ this.owner = props.owner;
20
+ }
21
+
22
+ get requires() {
23
+ return [this.aggregate.stableId];
24
+ }
25
+
26
+ serialize(): string {
27
+ const signature = this.aggregate.identityArguments;
28
+ const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
29
+ const withArgs = signature.length > 0 ? `(${signature})` : "()";
30
+ return `ALTER AGGREGATE ${qualifiedName}${withArgs} OWNER TO ${this.owner}`;
31
+ }
32
+ }
@@ -0,0 +1,20 @@
1
+ import { BaseChange } from "../../base.change.ts";
2
+ import type { Aggregate } from "../aggregate.model.ts";
3
+
4
+ abstract class BaseAggregateChange extends BaseChange {
5
+ abstract readonly aggregate: Aggregate;
6
+ abstract readonly scope: "object" | "comment" | "privilege";
7
+ readonly objectType: "aggregate" = "aggregate";
8
+ }
9
+
10
+ export abstract class CreateAggregateChange extends BaseAggregateChange {
11
+ readonly operation = "create" as const;
12
+ }
13
+
14
+ export abstract class AlterAggregateChange extends BaseAggregateChange {
15
+ readonly operation = "alter" as const;
16
+ }
17
+
18
+ export abstract class DropAggregateChange extends BaseAggregateChange {
19
+ readonly operation = "drop" as const;
20
+ }
@@ -0,0 +1,86 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { stableId } from "../../utils.ts";
3
+ import { Aggregate } from "../aggregate.model.ts";
4
+ import {
5
+ CreateCommentOnAggregate,
6
+ DropCommentOnAggregate,
7
+ } from "./aggregate.comment.ts";
8
+
9
+ type AggregateProps = ConstructorParameters<typeof Aggregate>[0];
10
+
11
+ const base: AggregateProps = {
12
+ schema: "public",
13
+ name: "agg_sum",
14
+ identity_arguments: "integer",
15
+ kind: "a",
16
+ aggkind: "n",
17
+ num_direct_args: 0,
18
+ return_type: "integer",
19
+ return_type_schema: "pg_catalog",
20
+ parallel_safety: "u",
21
+ is_strict: false,
22
+ transition_function: "pg_catalog.int4pl(integer,integer)",
23
+ state_data_type: "integer",
24
+ state_data_type_schema: "pg_catalog",
25
+ state_data_space: 0,
26
+ final_function: null,
27
+ final_function_extra_args: false,
28
+ final_function_modify: null,
29
+ combine_function: null,
30
+ serial_function: null,
31
+ deserial_function: null,
32
+ initial_condition: null,
33
+ moving_transition_function: null,
34
+ moving_inverse_function: null,
35
+ moving_state_data_type: null,
36
+ moving_state_data_type_schema: null,
37
+ moving_state_data_space: null,
38
+ moving_final_function: null,
39
+ moving_final_function_extra_args: false,
40
+ moving_final_function_modify: null,
41
+ moving_initial_condition: null,
42
+ sort_operator: null,
43
+ argument_count: 1,
44
+ argument_default_count: 0,
45
+ argument_names: null,
46
+ argument_types: ["integer"],
47
+ all_argument_types: null,
48
+ argument_modes: null,
49
+ argument_defaults: null,
50
+ owner: "owner1",
51
+ comment: null,
52
+ privileges: [],
53
+ };
54
+
55
+ const makeAggregate = (override: Partial<AggregateProps> = {}) =>
56
+ new Aggregate({
57
+ ...base,
58
+ ...override,
59
+ });
60
+
61
+ describe("aggregate.comment", () => {
62
+ test("create comment serializes and tracks dependencies", () => {
63
+ const aggregate = makeAggregate({ comment: "aggregate's total" });
64
+ const change = new CreateCommentOnAggregate({ aggregate });
65
+
66
+ expect(change.creates).toEqual([stableId.comment(aggregate.stableId)]);
67
+ expect(change.requires).toEqual([aggregate.stableId]);
68
+ expect(change.serialize()).toBe(
69
+ "COMMENT ON AGGREGATE public.agg_sum(integer) IS 'aggregate''s total'",
70
+ );
71
+ });
72
+
73
+ test("drop comment serializes and tracks dependencies", () => {
74
+ const aggregate = makeAggregate({ comment: "some comment" });
75
+ const change = new DropCommentOnAggregate({ aggregate });
76
+
77
+ expect(change.drops).toEqual([stableId.comment(aggregate.stableId)]);
78
+ expect(change.requires).toEqual([
79
+ stableId.comment(aggregate.stableId),
80
+ aggregate.stableId,
81
+ ]);
82
+ expect(change.serialize()).toBe(
83
+ "COMMENT ON AGGREGATE public.agg_sum(integer) IS NULL",
84
+ );
85
+ });
86
+ });
@@ -0,0 +1,62 @@
1
+ import { quoteLiteral } from "../../base.change.ts";
2
+ import { stableId } from "../../utils.ts";
3
+ import type { Aggregate } from "../aggregate.model.ts";
4
+ import {
5
+ CreateAggregateChange,
6
+ DropAggregateChange,
7
+ } from "./aggregate.base.ts";
8
+
9
+ export type CommentAggregate =
10
+ | CreateCommentOnAggregate
11
+ | DropCommentOnAggregate;
12
+
13
+ export class CreateCommentOnAggregate extends CreateAggregateChange {
14
+ public readonly aggregate: Aggregate;
15
+ public readonly scope = "comment" as const;
16
+
17
+ constructor(props: { aggregate: Aggregate }) {
18
+ super();
19
+ this.aggregate = props.aggregate;
20
+ }
21
+
22
+ get creates() {
23
+ return [stableId.comment(this.aggregate.stableId)];
24
+ }
25
+
26
+ get requires() {
27
+ return [this.aggregate.stableId];
28
+ }
29
+
30
+ serialize(): string {
31
+ const signature = this.aggregate.identityArguments;
32
+ const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
33
+ const withArgs = signature.length > 0 ? `(${signature})` : "()";
34
+ // biome-ignore lint/style/noNonNullAssertion: aggregate comment is non-null in this branch
35
+ return `COMMENT ON AGGREGATE ${qualifiedName}${withArgs} IS ${quoteLiteral(this.aggregate.comment!)}`;
36
+ }
37
+ }
38
+
39
+ export class DropCommentOnAggregate extends DropAggregateChange {
40
+ public readonly aggregate: Aggregate;
41
+ public readonly scope = "comment" as const;
42
+
43
+ constructor(props: { aggregate: Aggregate }) {
44
+ super();
45
+ this.aggregate = props.aggregate;
46
+ }
47
+
48
+ get drops() {
49
+ return [stableId.comment(this.aggregate.stableId)];
50
+ }
51
+
52
+ get requires() {
53
+ return [stableId.comment(this.aggregate.stableId), this.aggregate.stableId];
54
+ }
55
+
56
+ serialize(): string {
57
+ const signature = this.aggregate.identityArguments;
58
+ const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
59
+ const withArgs = signature.length > 0 ? `(${signature})` : "()";
60
+ return `COMMENT ON AGGREGATE ${qualifiedName}${withArgs} IS NULL`;
61
+ }
62
+ }
@@ -0,0 +1,101 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Aggregate } from "../aggregate.model.ts";
3
+ import { CreateAggregate } from "./aggregate.create.ts";
4
+
5
+ type AggregateProps = ConstructorParameters<typeof Aggregate>[0];
6
+
7
+ const base: AggregateProps = {
8
+ schema: "public",
9
+ name: "agg_sum",
10
+ identity_arguments: "integer",
11
+ kind: "a",
12
+ aggkind: "n",
13
+ num_direct_args: 0,
14
+ return_type: "integer",
15
+ return_type_schema: "pg_catalog",
16
+ parallel_safety: "u",
17
+ is_strict: false,
18
+ transition_function: "pg_catalog.int4pl(integer,integer)",
19
+ state_data_type: "integer",
20
+ state_data_type_schema: "pg_catalog",
21
+ state_data_space: 0,
22
+ final_function: null,
23
+ final_function_extra_args: false,
24
+ final_function_modify: null,
25
+ combine_function: null,
26
+ serial_function: null,
27
+ deserial_function: null,
28
+ initial_condition: null,
29
+ moving_transition_function: null,
30
+ moving_inverse_function: null,
31
+ moving_state_data_type: null,
32
+ moving_state_data_type_schema: null,
33
+ moving_state_data_space: null,
34
+ moving_final_function: null,
35
+ moving_final_function_extra_args: false,
36
+ moving_final_function_modify: null,
37
+ moving_initial_condition: null,
38
+ sort_operator: null,
39
+ argument_count: 1,
40
+ argument_default_count: 0,
41
+ argument_names: null,
42
+ argument_types: ["integer"],
43
+ all_argument_types: null,
44
+ argument_modes: null,
45
+ argument_defaults: null,
46
+ owner: "owner1",
47
+ comment: null,
48
+ privileges: [],
49
+ };
50
+
51
+ const makeAggregate = (override: Partial<AggregateProps> = {}) =>
52
+ new Aggregate({
53
+ ...base,
54
+ ...override,
55
+ });
56
+
57
+ describe("aggregate.create", () => {
58
+ test("serialize minimal aggregate", () => {
59
+ const aggregate = makeAggregate();
60
+ const change = new CreateAggregate({ aggregate });
61
+
62
+ expect(change.creates).toEqual([aggregate.stableId]);
63
+ expect(change.serialize()).toMatchInlineSnapshot(
64
+ `"CREATE AGGREGATE public.agg_sum(integer) (SFUNC = pg_catalog.int4pl, STYPE = integer)"`,
65
+ );
66
+ });
67
+
68
+ test("serialize aggregate with optional clauses and or replace", () => {
69
+ const aggregate = makeAggregate({
70
+ name: "agg_full",
71
+ transition_function: "public.sum_int8(bigint,bigint)",
72
+ state_data_type: "bigint",
73
+ state_data_space: 8,
74
+ final_function: "public.finalize(bigint)",
75
+ final_function_extra_args: true,
76
+ final_function_modify: "w",
77
+ combine_function: "public.combine(bigint,bigint)",
78
+ serial_function: "public.serialize_state(internal)",
79
+ deserial_function: "public.deserialize_state(bytea,internal)",
80
+ initial_condition: "0",
81
+ moving_transition_function: "public.msum(bigint,bigint)",
82
+ moving_inverse_function: "public.minv(bigint,bigint)",
83
+ moving_state_data_type: "pg_catalog.bigint",
84
+ moving_state_data_space: 16,
85
+ moving_final_function: "public.mfinal(bigint)",
86
+ moving_final_function_extra_args: true,
87
+ moving_final_function_modify: "s",
88
+ moving_initial_condition: "0",
89
+ sort_operator: "pg_catalog.<(integer,integer)",
90
+ parallel_safety: "s",
91
+ is_strict: true,
92
+ aggkind: "h",
93
+ });
94
+
95
+ const change = new CreateAggregate({ aggregate, orReplace: true });
96
+
97
+ expect(change.serialize()).toMatchInlineSnapshot(
98
+ `"CREATE OR REPLACE AGGREGATE public.agg_full(integer) (SFUNC = public.sum_int8, STYPE = bigint, SSPACE = 8, FINALFUNC = public.finalize, FINALFUNC_EXTRA, FINALFUNC_MODIFY = READ_WRITE, COMBINEFUNC = public.combine, SERIALFUNC = public.serialize_state, DESERIALFUNC = public.deserialize_state, INITCOND = '0', MSFUNC = public.msum, MINVFUNC = public.minv, MSTYPE = pg_catalog.bigint, MSSPACE = 16, MFINALFUNC = public.mfinal, MFINALFUNC_EXTRA, MFINALFUNC_MODIFY = SHAREABLE, MINITCOND = '0', SORTOP = OPERATOR(pg_catalog.<), PARALLEL SAFE, STRICT, HYPOTHETICAL)"`,
99
+ );
100
+ });
101
+ });