@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,287 @@
1
+ import type { Procedure } from "../procedure.model.ts";
2
+ import { formatConfigValue } from "../utils.ts";
3
+ import { AlterProcedureChange } from "./procedure.base.ts";
4
+
5
+ /**
6
+ * Alter a procedure.
7
+ *
8
+ * @see https://www.postgresql.org/docs/17/sql-alterfunction.html
9
+ *
10
+ * Synopsis
11
+ * ```sql
12
+ * ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
13
+ * action [, ... ] [ RESTRICT ]
14
+ * ALTER PROCEDURE name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
15
+ * action [, ... ] [ RESTRICT ]
16
+ * where action is one of:
17
+ * [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
18
+ * SET configuration_parameter { TO | = } { value | DEFAULT }
19
+ * SET configuration_parameter FROM CURRENT
20
+ * RESET configuration_parameter
21
+ * RESET ALL
22
+ * [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
23
+ * SET configuration_parameter { TO | = } { value | DEFAULT }
24
+ * SET configuration_parameter FROM CURRENT
25
+ * RESET configuration_parameter
26
+ * RESET ALL
27
+ * ```
28
+ */
29
+
30
+ export type AlterProcedure =
31
+ | AlterProcedureChangeOwner
32
+ | AlterProcedureSetConfig
33
+ | AlterProcedureSetLeakproof
34
+ | AlterProcedureSetParallel
35
+ | AlterProcedureSetSecurity
36
+ | AlterProcedureSetStrictness
37
+ | AlterProcedureSetVolatility;
38
+
39
+ /**
40
+ * ALTER FUNCTION/PROCEDURE ... OWNER TO ...
41
+ */
42
+ export class AlterProcedureChangeOwner extends AlterProcedureChange {
43
+ public readonly procedure: Procedure;
44
+ public readonly owner: string;
45
+ public readonly scope = "object" as const;
46
+
47
+ constructor(props: { procedure: Procedure; owner: string }) {
48
+ super();
49
+ this.procedure = props.procedure;
50
+ this.owner = props.owner;
51
+ }
52
+
53
+ get requires() {
54
+ return [this.procedure.stableId];
55
+ }
56
+
57
+ serialize(): string {
58
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
59
+
60
+ return [
61
+ "ALTER",
62
+ objectType,
63
+ `${this.procedure.schema}.${this.procedure.name}`,
64
+ "OWNER TO",
65
+ this.owner,
66
+ ].join(" ");
67
+ }
68
+ }
69
+
70
+ /**
71
+ * ALTER FUNCTION/PROCEDURE ... SECURITY { INVOKER | DEFINER }
72
+ */
73
+ export class AlterProcedureSetSecurity extends AlterProcedureChange {
74
+ public readonly procedure: Procedure;
75
+ public readonly securityDefiner: boolean;
76
+ public readonly scope = "object" as const;
77
+
78
+ constructor(props: { procedure: Procedure; securityDefiner: boolean }) {
79
+ super();
80
+ this.procedure = props.procedure;
81
+ this.securityDefiner = props.securityDefiner;
82
+ }
83
+
84
+ get requires() {
85
+ return [this.procedure.stableId];
86
+ }
87
+
88
+ serialize(): string {
89
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
90
+ const security = this.securityDefiner
91
+ ? "SECURITY DEFINER"
92
+ : "SECURITY INVOKER"; // INVOKER is default; only emitted when changed via diff
93
+
94
+ return [
95
+ "ALTER",
96
+ objectType,
97
+ `${this.procedure.schema}.${this.procedure.name}`,
98
+ security,
99
+ ].join(" ");
100
+ }
101
+ }
102
+
103
+ /**
104
+ * ALTER FUNCTION/PROCEDURE ... SET/RESET configuration_parameter
105
+ * Emits individual RESET for removed keys and SET for added/changed keys.
106
+ */
107
+ export class AlterProcedureSetConfig extends AlterProcedureChange {
108
+ public readonly procedure: Procedure;
109
+ public readonly action: "set" | "reset" | "reset_all";
110
+ public readonly key?: string;
111
+ public readonly value?: string;
112
+ public readonly scope = "object" as const;
113
+
114
+ constructor(props: {
115
+ procedure: Procedure;
116
+ action: "set";
117
+ key: string;
118
+ value: string;
119
+ });
120
+ constructor(props: { procedure: Procedure; action: "reset"; key: string });
121
+ constructor(props: { procedure: Procedure; action: "reset_all" });
122
+ constructor(props: {
123
+ procedure: Procedure;
124
+ action: "set" | "reset" | "reset_all";
125
+ key?: string;
126
+ value?: string;
127
+ }) {
128
+ super();
129
+ this.procedure = props.procedure;
130
+ this.action = props.action;
131
+ this.key = props.key;
132
+ this.value = props.value;
133
+ }
134
+
135
+ get requires() {
136
+ return [this.procedure.stableId];
137
+ }
138
+
139
+ serialize(): string {
140
+ const head = [
141
+ "ALTER",
142
+ this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
143
+ `${this.procedure.schema}.${this.procedure.name}`,
144
+ ].join(" ");
145
+ if (this.action === "reset_all") return `${head} RESET ALL`;
146
+ if (this.action === "reset") return `${head} RESET ${this.key}`;
147
+ const formatted = formatConfigValue(
148
+ this.key as string,
149
+ this.value as string,
150
+ );
151
+ return `${head} SET ${this.key} TO ${formatted}`;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * ALTER FUNCTION/PROCEDURE ... { IMMUTABLE | STABLE | VOLATILE }
157
+ */
158
+ export class AlterProcedureSetVolatility extends AlterProcedureChange {
159
+ public readonly procedure: Procedure;
160
+ public readonly volatility: string;
161
+ public readonly scope = "object" as const;
162
+
163
+ constructor(props: { procedure: Procedure; volatility: string }) {
164
+ super();
165
+ this.procedure = props.procedure;
166
+ this.volatility = props.volatility;
167
+ }
168
+
169
+ get requires() {
170
+ return [this.procedure.stableId];
171
+ }
172
+
173
+ serialize(): string {
174
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
175
+ const volMap: Record<string, string> = {
176
+ i: "IMMUTABLE",
177
+ s: "STABLE",
178
+ v: "VOLATILE",
179
+ };
180
+ return [
181
+ "ALTER",
182
+ objectType,
183
+ `${this.procedure.schema}.${this.procedure.name}`,
184
+ volMap[this.volatility],
185
+ ].join(" ");
186
+ }
187
+ }
188
+
189
+ /**
190
+ * ALTER FUNCTION/PROCEDURE ... { STRICT | CALLED ON NULL INPUT }
191
+ */
192
+ export class AlterProcedureSetStrictness extends AlterProcedureChange {
193
+ public readonly procedure: Procedure;
194
+ public readonly isStrict: boolean;
195
+ public readonly scope = "object" as const;
196
+
197
+ constructor(props: { procedure: Procedure; isStrict: boolean }) {
198
+ super();
199
+ this.procedure = props.procedure;
200
+ this.isStrict = props.isStrict;
201
+ }
202
+
203
+ get requires() {
204
+ return [this.procedure.stableId];
205
+ }
206
+
207
+ serialize(): string {
208
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
209
+ const strictness = this.isStrict ? "STRICT" : "CALLED ON NULL INPUT";
210
+ return [
211
+ "ALTER",
212
+ objectType,
213
+ `${this.procedure.schema}.${this.procedure.name}`,
214
+ strictness,
215
+ ].join(" ");
216
+ }
217
+ }
218
+
219
+ /**
220
+ * ALTER FUNCTION/PROCEDURE ... { LEAKPROOF | NOT LEAKPROOF }
221
+ */
222
+ export class AlterProcedureSetLeakproof extends AlterProcedureChange {
223
+ public readonly procedure: Procedure;
224
+ public readonly leakproof: boolean;
225
+ public readonly scope = "object" as const;
226
+
227
+ constructor(props: { procedure: Procedure; leakproof: boolean }) {
228
+ super();
229
+ this.procedure = props.procedure;
230
+ this.leakproof = props.leakproof;
231
+ }
232
+
233
+ get requires() {
234
+ return [this.procedure.stableId];
235
+ }
236
+
237
+ serialize(): string {
238
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
239
+ const leak = this.leakproof ? "LEAKPROOF" : "NOT LEAKPROOF";
240
+ return [
241
+ "ALTER",
242
+ objectType,
243
+ `${this.procedure.schema}.${this.procedure.name}`,
244
+ leak,
245
+ ].join(" ");
246
+ }
247
+ }
248
+
249
+ /**
250
+ * ALTER FUNCTION/PROCEDURE ... PARALLEL { UNSAFE | RESTRICTED | SAFE }
251
+ */
252
+ export class AlterProcedureSetParallel extends AlterProcedureChange {
253
+ public readonly procedure: Procedure;
254
+ public readonly parallelSafety: string;
255
+ public readonly scope = "object" as const;
256
+
257
+ constructor(props: { procedure: Procedure; parallelSafety: string }) {
258
+ super();
259
+ this.procedure = props.procedure;
260
+ this.parallelSafety = props.parallelSafety;
261
+ }
262
+
263
+ get requires() {
264
+ return [this.procedure.stableId];
265
+ }
266
+
267
+ serialize(): string {
268
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
269
+ const parallelMap: Record<string, string> = {
270
+ u: "PARALLEL UNSAFE",
271
+ s: "PARALLEL SAFE",
272
+ r: "PARALLEL RESTRICTED",
273
+ };
274
+ return [
275
+ "ALTER",
276
+ objectType,
277
+ `${this.procedure.schema}.${this.procedure.name}`,
278
+ parallelMap[this.parallelSafety],
279
+ ].join(" ");
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Replace a procedure by dropping and recreating it.
285
+ * This is used when properties that cannot be altered via ALTER FUNCTION/PROCEDURE change.
286
+ */
287
+ // NOTE: ReplaceProcedure removed. Non-alterable changes are emitted as Drop + Create in procedure.diff.ts.
@@ -0,0 +1,20 @@
1
+ import { BaseChange } from "../../base.change.ts";
2
+ import type { Procedure } from "../procedure.model.ts";
3
+
4
+ abstract class BaseProcedureChange extends BaseChange {
5
+ abstract readonly procedure: Procedure;
6
+ abstract readonly scope: "object" | "comment" | "privilege";
7
+ readonly objectType: "procedure" = "procedure";
8
+ }
9
+
10
+ export abstract class CreateProcedureChange extends BaseProcedureChange {
11
+ readonly operation = "create" as const;
12
+ }
13
+
14
+ export abstract class AlterProcedureChange extends BaseProcedureChange {
15
+ readonly operation = "alter" as const;
16
+ }
17
+
18
+ export abstract class DropProcedureChange extends BaseProcedureChange {
19
+ readonly operation = "drop" as const;
20
+ }
@@ -0,0 +1,70 @@
1
+ import { quoteLiteral } from "../../base.change.ts";
2
+ import { stableId } from "../../utils.ts";
3
+ import type { Procedure } from "../procedure.model.ts";
4
+ import {
5
+ CreateProcedureChange,
6
+ DropProcedureChange,
7
+ } from "./procedure.base.ts";
8
+
9
+ export type CommentProcedure =
10
+ | CreateCommentOnProcedure
11
+ | DropCommentOnProcedure;
12
+
13
+ /**
14
+ * Create/drop comments on procedures/functions.
15
+ */
16
+ export class CreateCommentOnProcedure extends CreateProcedureChange {
17
+ public readonly procedure: Procedure;
18
+ public readonly scope = "comment" as const;
19
+
20
+ constructor(props: { procedure: Procedure }) {
21
+ super();
22
+ this.procedure = props.procedure;
23
+ }
24
+
25
+ get creates() {
26
+ return [stableId.comment(this.procedure.stableId)];
27
+ }
28
+
29
+ get requires() {
30
+ return [this.procedure.stableId];
31
+ }
32
+
33
+ serialize(): string {
34
+ return [
35
+ "COMMENT ON",
36
+ this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
37
+ `${this.procedure.schema}.${this.procedure.name}(${(this.procedure.argument_types ?? []).join(",")})`,
38
+ "IS",
39
+ // biome-ignore lint/style/noNonNullAssertion: procedure comment is not nullable in this case
40
+ quoteLiteral(this.procedure.comment!),
41
+ ].join(" ");
42
+ }
43
+ }
44
+
45
+ export class DropCommentOnProcedure extends DropProcedureChange {
46
+ public readonly procedure: Procedure;
47
+ public readonly scope = "comment" as const;
48
+
49
+ constructor(props: { procedure: Procedure }) {
50
+ super();
51
+ this.procedure = props.procedure;
52
+ }
53
+
54
+ get drops() {
55
+ return [stableId.comment(this.procedure.stableId)];
56
+ }
57
+
58
+ get requires() {
59
+ return [stableId.comment(this.procedure.stableId), this.procedure.stableId];
60
+ }
61
+
62
+ serialize(): string {
63
+ return [
64
+ "COMMENT ON",
65
+ this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
66
+ `${this.procedure.schema}.${this.procedure.name}(${(this.procedure.argument_types ?? []).join(",")})`,
67
+ "IS NULL",
68
+ ].join(" ");
69
+ }
70
+ }
@@ -0,0 +1,48 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Procedure } from "../procedure.model.ts";
3
+ import { CreateProcedure } from "./procedure.create.ts";
4
+
5
+ describe("procedure", () => {
6
+ test("create", () => {
7
+ const procedure = new Procedure({
8
+ schema: "public",
9
+ name: "test_procedure",
10
+ kind: "p",
11
+ return_type: "void",
12
+ return_type_schema: "pg_catalog",
13
+ language: "plpgsql",
14
+ security_definer: false,
15
+ volatility: "v",
16
+ parallel_safety: "u",
17
+ is_strict: false,
18
+ leakproof: false,
19
+ returns_set: false,
20
+ argument_count: 0,
21
+ argument_default_count: 0,
22
+ argument_names: null,
23
+ argument_types: null,
24
+ all_argument_types: null,
25
+ argument_modes: null,
26
+ argument_defaults: null,
27
+ source_code: "BEGIN RETURN; END;",
28
+ definition:
29
+ "CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$BEGIN RETURN; END;$$",
30
+ binary_path: null,
31
+ sql_body: null,
32
+ config: null,
33
+ owner: "test",
34
+ execution_cost: 0,
35
+ result_rows: 0,
36
+ comment: null,
37
+ privileges: [],
38
+ });
39
+
40
+ const change = new CreateProcedure({
41
+ procedure,
42
+ });
43
+
44
+ expect(change.serialize()).toBe(
45
+ "CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$BEGIN RETURN; END;$$",
46
+ );
47
+ });
48
+ });
@@ -0,0 +1,92 @@
1
+ import { parseTypeString, stableId } from "../../utils.ts";
2
+ import type { Procedure } from "../procedure.model.ts";
3
+ import { CreateProcedureChange } from "./procedure.base.ts";
4
+
5
+ /**
6
+ * Create a procedure.
7
+ *
8
+ * @see https://www.postgresql.org/docs/17/sql-createfunction.html
9
+ *
10
+ * Synopsis
11
+ * ```sql
12
+ * CREATE [ OR REPLACE ] FUNCTION
13
+ * name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
14
+ * [ RETURNS rettype
15
+ * | RETURNS TABLE ( column_name column_type [, ...] ) ]
16
+ * { LANGUAGE lang_name
17
+ * | TRANSFORM { FOR TYPE type_name } [, ... ]
18
+ * | WINDOW
19
+ * | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
20
+ * | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
21
+ * | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
22
+ * | PARALLEL { UNSAFE | RESTRICTED | SAFE }
23
+ * | COST execution_cost
24
+ * | ROWS result_rows
25
+ * | SUPPORT support_function
26
+ * | SET configuration_parameter { TO value | = value | FROM CURRENT }
27
+ * | AS 'definition'
28
+ * | AS 'obj_file', 'link_symbol'
29
+ * | sql_body
30
+ * } ...
31
+ * ```
32
+ */
33
+ export class CreateProcedure extends CreateProcedureChange {
34
+ public readonly procedure: Procedure;
35
+ public readonly orReplace: boolean;
36
+ public readonly scope = "object" as const;
37
+
38
+ constructor(props: { procedure: Procedure; orReplace?: boolean }) {
39
+ super();
40
+ this.procedure = props.procedure;
41
+ this.orReplace = props.orReplace ?? false;
42
+ }
43
+
44
+ get creates() {
45
+ return [this.procedure.stableId];
46
+ }
47
+
48
+ get requires() {
49
+ const dependencies = new Set<string>();
50
+
51
+ // Schema dependency
52
+ dependencies.add(stableId.schema(this.procedure.schema));
53
+
54
+ // Owner dependency
55
+ dependencies.add(stableId.role(this.procedure.owner));
56
+
57
+ // Language dependency (if user-defined)
58
+ // Note: Most languages are built-in (plpgsql, sql, etc.), but custom languages
59
+ // can be created. We can't reliably determine if a language is user-defined
60
+ // from just the name, so we rely on pg_depend for language dependencies.
61
+
62
+ // Return type dependency (if user-defined)
63
+ const returnType = parseTypeString(this.procedure.return_type);
64
+ if (returnType) {
65
+ dependencies.add(stableId.type(returnType.schema, returnType.name));
66
+ }
67
+
68
+ // Argument type dependencies (if user-defined)
69
+ if (this.procedure.argument_types) {
70
+ for (const argType of this.procedure.argument_types) {
71
+ const parsedType = parseTypeString(argType);
72
+ if (parsedType) {
73
+ dependencies.add(stableId.type(parsedType.schema, parsedType.name));
74
+ }
75
+ }
76
+ }
77
+
78
+ return Array.from(dependencies);
79
+ }
80
+
81
+ serialize(): string {
82
+ // Use the server-generated CREATE statement for functions/procedures
83
+ // Normalize trailing semicolon and OR REPLACE clause according to flag
84
+ let definition = this.procedure.definition.trim();
85
+ definition = definition.replace(/;\s*$/, "");
86
+ definition = definition.replace(
87
+ /^CREATE\s+(?:OR\s+REPLACE\s+)?/i,
88
+ `CREATE ${this.orReplace ? "OR REPLACE " : ""}`,
89
+ );
90
+ return definition;
91
+ }
92
+ }
@@ -0,0 +1,85 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Procedure } from "../procedure.model.ts";
3
+ import { DropProcedure } from "./procedure.drop.ts";
4
+
5
+ describe("procedure", () => {
6
+ test("drop", () => {
7
+ const procedure = new Procedure({
8
+ schema: "public",
9
+ name: "test_procedure",
10
+ kind: "p",
11
+ return_type: "void",
12
+ return_type_schema: "pg_catalog",
13
+ language: "plpgsql",
14
+ security_definer: false,
15
+ volatility: "v",
16
+ parallel_safety: "u",
17
+ is_strict: false,
18
+ leakproof: false,
19
+ returns_set: false,
20
+ argument_count: 0,
21
+ argument_default_count: 0,
22
+ argument_names: null,
23
+ argument_types: null,
24
+ all_argument_types: null,
25
+ argument_modes: null,
26
+ argument_defaults: null,
27
+ source_code: "BEGIN RETURN; END;",
28
+ definition:
29
+ "CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$BEGIN RETURN; END;$$",
30
+ binary_path: null,
31
+ sql_body: null,
32
+ config: null,
33
+ owner: "test",
34
+ execution_cost: 0,
35
+ result_rows: 0,
36
+ comment: null,
37
+ privileges: [],
38
+ });
39
+
40
+ const change = new DropProcedure({
41
+ procedure,
42
+ });
43
+
44
+ expect(change.serialize()).toBe("DROP PROCEDURE public.test_procedure()");
45
+ });
46
+
47
+ test("drop function", () => {
48
+ const fn = new Procedure({
49
+ schema: "public",
50
+ name: "test_function",
51
+ kind: "f",
52
+ return_type: "int4",
53
+ return_type_schema: "pg_catalog",
54
+ language: "sql",
55
+ security_definer: false,
56
+ volatility: "v",
57
+ parallel_safety: "u",
58
+ is_strict: false,
59
+ leakproof: false,
60
+ returns_set: false,
61
+ argument_count: 0,
62
+ argument_default_count: 0,
63
+ argument_names: null,
64
+ argument_types: null,
65
+ all_argument_types: null,
66
+ argument_modes: null,
67
+ argument_defaults: null,
68
+ source_code: null,
69
+ binary_path: null,
70
+ sql_body: "SELECT 1",
71
+ definition:
72
+ "CREATE FUNCTION public.test_function() RETURNS int4 LANGUAGE sql AS $$SELECT 1$$",
73
+ config: null,
74
+ owner: "test",
75
+ execution_cost: 0,
76
+ result_rows: 0,
77
+ comment: null,
78
+ privileges: [],
79
+ });
80
+
81
+ const change = new DropProcedure({ procedure: fn });
82
+
83
+ expect(change.serialize()).toBe("DROP FUNCTION public.test_function()");
84
+ });
85
+ });
@@ -0,0 +1,49 @@
1
+ import type { Procedure } from "../procedure.model.ts";
2
+ import { formatFunctionArguments } from "../utils.ts";
3
+ import { DropProcedureChange } from "./procedure.base.ts";
4
+
5
+ /**
6
+ * Drop a procedure.
7
+ *
8
+ * @see https://www.postgresql.org/docs/17/sql-dropfunction.html
9
+ *
10
+ * Synopsis
11
+ * ```sql
12
+ * DROP FUNCTION [ IF EXISTS ] name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] [ CASCADE | RESTRICT ]
13
+ * DROP PROCEDURE [ IF EXISTS ] name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] [ CASCADE | RESTRICT ]
14
+ * ```
15
+ */
16
+ export class DropProcedure extends DropProcedureChange {
17
+ public readonly procedure: Procedure;
18
+ public readonly scope = "object" as const;
19
+
20
+ constructor(props: { procedure: Procedure }) {
21
+ super();
22
+ this.procedure = props.procedure;
23
+ }
24
+
25
+ get drops() {
26
+ return [this.procedure.stableId];
27
+ }
28
+
29
+ get requires() {
30
+ return [this.procedure.stableId];
31
+ }
32
+
33
+ serialize(): string {
34
+ const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
35
+
36
+ // Build argument list
37
+ const args = formatFunctionArguments(
38
+ this.procedure.argument_names,
39
+ this.procedure.argument_types,
40
+ this.procedure.argument_modes,
41
+ );
42
+
43
+ return [
44
+ "DROP",
45
+ objectType,
46
+ `${this.procedure.schema}.${this.procedure.name}(${args})`,
47
+ ].join(" ");
48
+ }
49
+ }