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

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 (359) hide show
  1. package/README.md +40 -23
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +19 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/core/catalog-export/index.d.ts +11 -0
  21. package/dist/core/catalog-export/index.js +10 -0
  22. package/dist/core/catalog.diff.d.ts +1 -0
  23. package/dist/core/catalog.diff.js +64 -48
  24. package/dist/core/catalog.model.d.ts +14 -1
  25. package/dist/core/catalog.model.js +103 -1
  26. package/dist/core/catalog.snapshot.d.ts +66 -0
  27. package/dist/core/catalog.snapshot.js +206 -0
  28. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  29. package/dist/core/declarative-apply/discover-sql.js +86 -0
  30. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  31. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  32. package/dist/core/declarative-apply/index.d.ts +49 -0
  33. package/dist/core/declarative-apply/index.js +134 -0
  34. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  35. package/dist/core/declarative-apply/round-apply.js +378 -0
  36. package/dist/core/export/file-mapper.d.ts +71 -0
  37. package/dist/core/export/file-mapper.js +474 -0
  38. package/dist/core/export/grouper.d.ts +13 -0
  39. package/dist/core/export/grouper.js +76 -0
  40. package/dist/core/export/index.d.ts +45 -0
  41. package/dist/core/export/index.js +63 -0
  42. package/dist/core/export/types.d.ts +84 -0
  43. package/dist/core/export/types.js +25 -0
  44. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  45. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  46. package/dist/core/integrations/filter/dsl.js +20 -2
  47. package/dist/core/integrations/filter/extractors.js +42 -0
  48. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  49. package/dist/core/integrations/supabase.d.ts +8 -0
  50. package/dist/core/integrations/supabase.js +9 -0
  51. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  52. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  53. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  54. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  55. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  56. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  57. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  58. package/dist/core/objects/base.privilege-diff.js +104 -22
  59. package/dist/core/objects/base.privilege.d.ts +1 -0
  60. package/dist/core/objects/base.privilege.js +9 -2
  61. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  62. package/dist/core/objects/diff-context.d.ts +15 -0
  63. package/dist/core/objects/diff-context.js +1 -0
  64. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  65. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  66. package/dist/core/objects/domain/domain.diff.js +16 -77
  67. package/dist/core/objects/domain/domain.model.js +1 -1
  68. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  69. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  70. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  72. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  73. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  75. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  76. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  77. package/dist/core/objects/language/language.diff.d.ts +2 -5
  78. package/dist/core/objects/language/language.diff.js +7 -39
  79. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  80. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  81. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  82. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  83. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  84. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  85. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  86. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  87. package/dist/core/objects/procedure/procedure.model.js +1 -1
  88. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  89. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  90. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  91. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  92. package/dist/core/objects/publication/publication.diff.js +8 -13
  93. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  94. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  95. package/dist/core/objects/role/role.diff.js +22 -1
  96. package/dist/core/objects/role/role.model.d.ts +4 -3
  97. package/dist/core/objects/role/role.model.js +118 -12
  98. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  99. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  100. package/dist/core/objects/schema/schema.diff.js +16 -77
  101. package/dist/core/objects/schema/schema.model.js +1 -1
  102. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  103. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  104. package/dist/core/objects/sequence/sequence.model.js +1 -1
  105. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  106. package/dist/core/objects/table/changes/table.create.js +3 -0
  107. package/dist/core/objects/table/table.diff.d.ts +2 -8
  108. package/dist/core/objects/table/table.diff.js +26 -157
  109. package/dist/core/objects/table/table.model.d.ts +23 -22
  110. package/dist/core/objects/table/table.model.js +1 -1
  111. package/dist/core/objects/trigger/changes/trigger.create.js +2 -4
  112. package/dist/core/objects/trigger/trigger.model.d.ts +8 -0
  113. package/dist/core/objects/trigger/trigger.model.js +11 -0
  114. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  115. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  116. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  117. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  118. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  119. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  120. package/dist/core/objects/type/enum/enum.model.js +1 -1
  121. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  122. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  123. package/dist/core/objects/type/range/range.diff.js +16 -77
  124. package/dist/core/objects/type/range/range.model.js +1 -1
  125. package/dist/core/objects/view/view.diff.d.ts +2 -8
  126. package/dist/core/objects/view/view.diff.js +16 -158
  127. package/dist/core/objects/view/view.model.d.ts +18 -4
  128. package/dist/core/objects/view/view.model.js +3 -13
  129. package/dist/core/plan/apply.js +9 -26
  130. package/dist/core/plan/create.d.ts +19 -6
  131. package/dist/core/plan/create.js +134 -174
  132. package/dist/core/plan/serialize.js +16 -4
  133. package/dist/core/plan/sql-format/fixtures.js +3 -5
  134. package/dist/core/plan/sql-format/keyword-case.js +26 -1
  135. package/dist/core/plan/ssl-config.d.ts +32 -0
  136. package/dist/core/plan/ssl-config.js +115 -0
  137. package/dist/core/plan/types.d.ts +6 -0
  138. package/dist/core/postgres-config.d.ts +14 -0
  139. package/dist/core/postgres-config.js +53 -2
  140. package/dist/core/sort/graph-builder.js +10 -0
  141. package/dist/core/sort/logical-sort.js +31 -23
  142. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  143. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  144. package/dist/index.d.ts +6 -0
  145. package/dist/index.js +6 -1
  146. package/package.json +21 -4
  147. package/src/cli/app.ts +27 -3
  148. package/src/cli/bin/cli.ts +6 -0
  149. package/src/cli/commands/catalog-export.ts +78 -0
  150. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  151. package/src/cli/commands/declarative-apply.ts +380 -0
  152. package/src/cli/commands/declarative-export.ts +330 -0
  153. package/src/cli/commands/plan.ts +28 -7
  154. package/src/cli/exit-code.test.ts +19 -0
  155. package/src/cli/exit-code.ts +7 -0
  156. package/src/cli/formatters/tree/tree.ts +3 -2
  157. package/src/cli/utils/apply-display.test.ts +348 -0
  158. package/src/cli/utils/apply-display.ts +238 -0
  159. package/src/cli/utils/export-display.test.ts +103 -0
  160. package/src/cli/utils/export-display.ts +275 -0
  161. package/src/cli/utils/integrations.test.ts +44 -0
  162. package/src/cli/utils/resolve-input.test.ts +38 -0
  163. package/src/cli/utils/resolve-input.ts +17 -0
  164. package/src/core/catalog-export/index.ts +20 -0
  165. package/src/core/catalog.diff.ts +79 -78
  166. package/src/core/catalog.model.test.ts +122 -0
  167. package/src/core/catalog.model.ts +127 -1
  168. package/src/core/catalog.snapshot.test.ts +464 -0
  169. package/src/core/catalog.snapshot.ts +289 -0
  170. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  171. package/src/core/declarative-apply/discover-sql.ts +107 -0
  172. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  173. package/src/core/declarative-apply/index.test.ts +67 -0
  174. package/src/core/declarative-apply/index.ts +205 -0
  175. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  176. package/src/core/declarative-apply/round-apply.ts +562 -0
  177. package/src/core/expand-replace-dependencies.test.ts +70 -0
  178. package/src/core/export/file-mapper.test.ts +816 -0
  179. package/src/core/export/file-mapper.ts +574 -0
  180. package/src/core/export/grouper.ts +108 -0
  181. package/src/core/export/index.ts +129 -0
  182. package/src/core/export/types.ts +104 -0
  183. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  184. package/src/core/integrations/filter/dsl.test.ts +211 -0
  185. package/src/core/integrations/filter/dsl.ts +65 -3
  186. package/src/core/integrations/filter/extractors.test.ts +244 -0
  187. package/src/core/integrations/filter/extractors.ts +42 -0
  188. package/src/core/integrations/integration-dsl.ts +10 -0
  189. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  190. package/src/core/integrations/supabase.ts +9 -0
  191. package/src/core/objects/aggregate/aggregate.diff.ts +39 -95
  192. package/src/core/objects/aggregate/aggregate.model.ts +1 -1
  193. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +3 -1
  194. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +5 -2
  195. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +6 -3
  196. package/src/core/objects/aggregate/changes/aggregate.create.ts +1 -1
  197. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +7 -3
  198. package/src/core/objects/aggregate/changes/aggregate.drop.ts +1 -1
  199. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +9 -3
  200. package/src/core/objects/base.privilege-diff.ts +178 -30
  201. package/src/core/objects/base.privilege.ts +9 -2
  202. package/src/core/objects/collation/changes/collation.alter.test.ts +7 -2
  203. package/src/core/objects/collation/changes/collation.create.test.ts +7 -2
  204. package/src/core/objects/collation/changes/collation.drop.test.ts +4 -1
  205. package/src/core/objects/collation/collation.diff.test.ts +9 -12
  206. package/src/core/objects/collation/collation.diff.ts +2 -1
  207. package/src/core/objects/diff-context.ts +16 -0
  208. package/src/core/objects/domain/changes/domain.alter.test.ts +28 -9
  209. package/src/core/objects/domain/changes/domain.create.test.ts +32 -2
  210. package/src/core/objects/domain/changes/domain.create.ts +7 -1
  211. package/src/core/objects/domain/changes/domain.drop.test.ts +4 -1
  212. package/src/core/objects/domain/domain.diff.ts +39 -102
  213. package/src/core/objects/domain/domain.model.ts +1 -1
  214. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +10 -3
  215. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +4 -1
  216. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +4 -1
  217. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +12 -7
  218. package/src/core/objects/event-trigger/event-trigger.diff.ts +2 -1
  219. package/src/core/objects/extension/changes/extension.alter.test.ts +7 -2
  220. package/src/core/objects/extension/changes/extension.create.test.ts +4 -1
  221. package/src/core/objects/extension/changes/extension.drop.test.ts +4 -1
  222. package/src/core/objects/extension/extension.model.test.ts +98 -0
  223. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +16 -5
  224. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +51 -16
  225. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +4 -1
  226. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +111 -4
  227. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +31 -101
  228. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +2 -2
  229. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +46 -15
  230. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +13 -4
  231. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +4 -1
  232. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +39 -102
  233. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +1 -1
  234. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +22 -7
  235. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +19 -6
  236. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +4 -1
  237. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +95 -0
  238. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +31 -101
  239. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +13 -4
  240. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +16 -5
  241. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +10 -3
  242. package/src/core/objects/index/changes/index.alter.test.ts +13 -4
  243. package/src/core/objects/index/changes/index.create.test.ts +4 -1
  244. package/src/core/objects/index/changes/index.drop.test.ts +4 -1
  245. package/src/core/objects/language/changes/language.alter.test.ts +4 -1
  246. package/src/core/objects/language/changes/language.create.test.ts +4 -1
  247. package/src/core/objects/language/changes/language.drop.test.ts +4 -1
  248. package/src/core/objects/language/language.diff.test.ts +86 -4
  249. package/src/core/objects/language/language.diff.ts +17 -49
  250. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +10 -3
  251. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +7 -2
  252. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +4 -1
  253. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +162 -0
  254. package/src/core/objects/materialized-view/materialized-view.diff.ts +41 -191
  255. package/src/core/objects/materialized-view/materialized-view.model.ts +1 -1
  256. package/src/core/objects/procedure/changes/procedure.alter.test.ts +121 -49
  257. package/src/core/objects/procedure/changes/procedure.alter.ts +15 -12
  258. package/src/core/objects/procedure/changes/procedure.create.test.ts +4 -1
  259. package/src/core/objects/procedure/changes/procedure.drop.test.ts +7 -2
  260. package/src/core/objects/procedure/procedure.diff.ts +39 -102
  261. package/src/core/objects/procedure/procedure.model.ts +1 -1
  262. package/src/core/objects/publication/changes/publication.alter.test.ts +15 -21
  263. package/src/core/objects/publication/changes/publication.alter.ts +0 -18
  264. package/src/core/objects/publication/changes/publication.comment.test.ts +5 -2
  265. package/src/core/objects/publication/changes/publication.create.test.ts +5 -2
  266. package/src/core/objects/publication/changes/publication.drop.test.ts +3 -1
  267. package/src/core/objects/publication/changes/publication.types.ts +0 -2
  268. package/src/core/objects/publication/publication.diff.test.ts +24 -19
  269. package/src/core/objects/publication/publication.diff.ts +9 -15
  270. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +31 -14
  271. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +3 -3
  272. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +10 -3
  273. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +4 -1
  274. package/src/core/objects/role/changes/role.alter.test.ts +31 -15
  275. package/src/core/objects/role/changes/role.create.test.ts +6 -2
  276. package/src/core/objects/role/changes/role.drop.test.ts +4 -1
  277. package/src/core/objects/role/role.diff.test.ts +235 -0
  278. package/src/core/objects/role/role.diff.ts +21 -1
  279. package/src/core/objects/role/role.model.ts +122 -14
  280. package/src/core/objects/rule/changes/rule.alter.test.ts +7 -3
  281. package/src/core/objects/rule/changes/rule.comment.test.ts +5 -2
  282. package/src/core/objects/rule/changes/rule.create.test.ts +6 -2
  283. package/src/core/objects/rule/changes/rule.drop.test.ts +3 -1
  284. package/src/core/objects/schema/changes/schema.alter.test.ts +4 -1
  285. package/src/core/objects/schema/changes/schema.create.test.ts +4 -1
  286. package/src/core/objects/schema/changes/schema.drop.test.ts +4 -1
  287. package/src/core/objects/schema/schema.diff.ts +39 -102
  288. package/src/core/objects/schema/schema.model.ts +1 -1
  289. package/src/core/objects/sequence/changes/sequence.alter.test.ts +11 -5
  290. package/src/core/objects/sequence/changes/sequence.create.test.ts +8 -3
  291. package/src/core/objects/sequence/changes/sequence.drop.test.ts +4 -1
  292. package/src/core/objects/sequence/sequence.diff.test.ts +114 -0
  293. package/src/core/objects/sequence/sequence.diff.ts +39 -104
  294. package/src/core/objects/sequence/sequence.model.ts +1 -1
  295. package/src/core/objects/subscription/changes/subscription.alter.test.ts +15 -5
  296. package/src/core/objects/subscription/changes/subscription.comment.test.ts +5 -2
  297. package/src/core/objects/subscription/changes/subscription.create.test.ts +5 -2
  298. package/src/core/objects/subscription/changes/subscription.drop.test.ts +3 -1
  299. package/src/core/objects/subscription/subscription.diff.test.ts +16 -11
  300. package/src/core/objects/subscription/subscription.diff.ts +2 -1
  301. package/src/core/objects/table/changes/table.alter.test.ts +38 -15
  302. package/src/core/objects/table/changes/table.create.test.ts +41 -3
  303. package/src/core/objects/table/changes/table.create.ts +4 -0
  304. package/src/core/objects/table/changes/table.drop.test.ts +3 -1
  305. package/src/core/objects/table/table.diff.test.ts +157 -0
  306. package/src/core/objects/table/table.diff.ts +54 -190
  307. package/src/core/objects/table/table.model.ts +1 -1
  308. package/src/core/objects/trigger/changes/trigger.alter.test.ts +8 -4
  309. package/src/core/objects/trigger/changes/trigger.create.test.ts +5 -1
  310. package/src/core/objects/trigger/changes/trigger.create.ts +7 -4
  311. package/src/core/objects/trigger/changes/trigger.drop.test.ts +5 -1
  312. package/src/core/objects/trigger/trigger.diff.test.ts +1 -0
  313. package/src/core/objects/trigger/trigger.model.ts +12 -0
  314. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +10 -4
  315. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +7 -2
  316. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +4 -1
  317. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +78 -0
  318. package/src/core/objects/type/composite-type/composite-type.diff.ts +39 -101
  319. package/src/core/objects/type/composite-type/composite-type.model.ts +2 -1
  320. package/src/core/objects/type/enum/changes/enum.alter.test.ts +14 -5
  321. package/src/core/objects/type/enum/changes/enum.create.test.ts +4 -1
  322. package/src/core/objects/type/enum/changes/enum.drop.test.ts +4 -1
  323. package/src/core/objects/type/enum/enum.diff.test.ts +181 -0
  324. package/src/core/objects/type/enum/enum.diff.ts +58 -146
  325. package/src/core/objects/type/enum/enum.model.ts +1 -1
  326. package/src/core/objects/type/range/changes/range.alter.test.ts +3 -1
  327. package/src/core/objects/type/range/changes/range.create.test.ts +5 -2
  328. package/src/core/objects/type/range/changes/range.create.ts +6 -2
  329. package/src/core/objects/type/range/changes/range.drop.test.ts +3 -1
  330. package/src/core/objects/type/range/range.diff.test.ts +77 -0
  331. package/src/core/objects/type/range/range.diff.ts +39 -101
  332. package/src/core/objects/type/range/range.model.ts +1 -1
  333. package/src/core/objects/view/changes/view.alter.test.ts +8 -3
  334. package/src/core/objects/view/changes/view.create.test.ts +7 -2
  335. package/src/core/objects/view/changes/view.drop.test.ts +4 -1
  336. package/src/core/objects/view/view.diff.test.ts +82 -0
  337. package/src/core/objects/view/view.diff.ts +41 -191
  338. package/src/core/objects/view/view.model.ts +3 -17
  339. package/src/core/plan/apply.ts +9 -27
  340. package/src/core/plan/create.ts +173 -237
  341. package/src/core/plan/serialize.test.ts +317 -0
  342. package/src/core/plan/serialize.ts +18 -4
  343. package/src/core/plan/sql-format/fixtures.ts +2 -5
  344. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +52 -0
  345. package/src/core/plan/sql-format/format-off.test.ts +14 -17
  346. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +27 -22
  347. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +17 -21
  348. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +25 -20
  349. package/src/core/plan/sql-format/format-pretty-upper.test.ts +23 -20
  350. package/src/core/plan/sql-format/keyword-case.ts +36 -1
  351. package/src/core/plan/ssl-config.ts +172 -0
  352. package/src/core/plan/types.ts +6 -0
  353. package/src/core/postgres-config.ts +71 -2
  354. package/src/core/sort/graph-builder.ts +12 -0
  355. package/src/core/sort/logical-sort.test.ts +371 -0
  356. package/src/core/sort/logical-sort.ts +32 -25
  357. package/src/core/sort/topological-sort.test.ts +275 -0
  358. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  359. package/src/index.ts +26 -2
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
2
3
  import { Procedure, type ProcedureProps } from "../procedure.model.ts";
3
4
  import {
4
5
  AlterProcedureChangeOwner,
@@ -12,7 +13,7 @@ import {
12
13
 
13
14
  describe.concurrent("procedure", () => {
14
15
  describe("alter", () => {
15
- test("change owner", () => {
16
+ test("change owner", async () => {
16
17
  const props: Omit<ProcedureProps, "owner"> = {
17
18
  schema: "public",
18
19
  name: "test_procedure",
@@ -54,12 +55,14 @@ describe.concurrent("procedure", () => {
54
55
  owner: "new_owner",
55
56
  });
56
57
 
58
+ await assertValidSql(change.serialize());
59
+
57
60
  expect(change.serialize()).toBe(
58
- "ALTER PROCEDURE public.test_procedure OWNER TO new_owner",
61
+ "ALTER PROCEDURE public.test_procedure() OWNER TO new_owner",
59
62
  );
60
63
  });
61
64
 
62
- test("change owner (function)", () => {
65
+ test("change owner (function)", async () => {
63
66
  const props: Omit<ProcedureProps, "owner"> = {
64
67
  schema: "public",
65
68
  name: "test_function",
@@ -101,12 +104,56 @@ describe.concurrent("procedure", () => {
101
104
  owner: "new_owner",
102
105
  });
103
106
 
107
+ await assertValidSql(change.serialize());
108
+
109
+ expect(change.serialize()).toBe(
110
+ "ALTER FUNCTION public.test_function() OWNER TO new_owner",
111
+ );
112
+ });
113
+
114
+ test("change owner with argument types (overloaded function)", async () => {
115
+ const procedure = new Procedure({
116
+ schema: "public",
117
+ name: "my_func",
118
+ kind: "f",
119
+ return_type: "void",
120
+ return_type_schema: "pg_catalog",
121
+ language: "plpgsql",
122
+ security_definer: false,
123
+ volatility: "v",
124
+ parallel_safety: "u",
125
+ is_strict: false,
126
+ leakproof: false,
127
+ returns_set: false,
128
+ argument_count: 2,
129
+ argument_default_count: 0,
130
+ argument_names: ["a", "b"],
131
+ argument_types: ["integer", "text"],
132
+ all_argument_types: ["integer", "text"],
133
+ argument_modes: null,
134
+ argument_defaults: null,
135
+ source_code: null,
136
+ binary_path: null,
137
+ sql_body: null,
138
+ definition: "CREATE FUNCTION public.my_func(integer, text) ...",
139
+ config: null,
140
+ execution_cost: 0,
141
+ result_rows: 0,
142
+ comment: null,
143
+ privileges: [],
144
+ owner: "old_owner",
145
+ });
146
+ const change = new AlterProcedureChangeOwner({
147
+ procedure,
148
+ owner: "postgres",
149
+ });
150
+ await assertValidSql(change.serialize());
104
151
  expect(change.serialize()).toBe(
105
- "ALTER FUNCTION public.test_function OWNER TO new_owner",
152
+ "ALTER FUNCTION public.my_func(integer, text) OWNER TO postgres",
106
153
  );
107
154
  });
108
155
 
109
- test("set security definer", () => {
156
+ test("set security definer", async () => {
110
157
  const props: Omit<ProcedureProps, "security_definer"> = {
111
158
  schema: "public",
112
159
  name: "test_function",
@@ -143,12 +190,13 @@ describe.concurrent("procedure", () => {
143
190
  procedure,
144
191
  securityDefiner: true,
145
192
  });
193
+ await assertValidSql(change.serialize());
146
194
  expect(change.serialize()).toBe(
147
- "ALTER FUNCTION public.test_function SECURITY DEFINER",
195
+ "ALTER FUNCTION public.test_function() SECURITY DEFINER",
148
196
  );
149
197
  });
150
198
 
151
- test("unset security definer (invoker)", () => {
199
+ test("unset security definer (invoker)", async () => {
152
200
  const props: Omit<ProcedureProps, "security_definer"> = {
153
201
  schema: "public",
154
202
  name: "test_function",
@@ -185,12 +233,13 @@ describe.concurrent("procedure", () => {
185
233
  procedure,
186
234
  securityDefiner: false,
187
235
  });
236
+ await assertValidSql(change.serialize());
188
237
  expect(change.serialize()).toBe(
189
- "ALTER FUNCTION public.test_function SECURITY INVOKER",
238
+ "ALTER FUNCTION public.test_function() SECURITY INVOKER",
190
239
  );
191
240
  });
192
241
 
193
- test("set and reset config", () => {
242
+ test("set and reset config", async () => {
194
243
  const base: Omit<ProcedureProps, "config"> = {
195
244
  schema: "public",
196
245
  name: "test_function",
@@ -243,18 +292,21 @@ describe.concurrent("procedure", () => {
243
292
  key: "work_mem",
244
293
  value: "64MB",
245
294
  });
295
+ await assertValidSql(change1.serialize());
246
296
  expect(change1.serialize()).toBe(
247
- "ALTER FUNCTION public.test_function RESET search_path",
297
+ "ALTER FUNCTION public.test_function() RESET search_path",
248
298
  );
299
+ await assertValidSql(change2.serialize());
249
300
  expect(change2.serialize()).toBe(
250
- "ALTER FUNCTION public.test_function SET search_path TO pg_temp",
301
+ "ALTER FUNCTION public.test_function() SET search_path TO pg_temp",
251
302
  );
303
+ await assertValidSql(change3.serialize());
252
304
  expect(change3.serialize()).toBe(
253
- "ALTER FUNCTION public.test_function SET work_mem TO '64MB'",
305
+ "ALTER FUNCTION public.test_function() SET work_mem TO '64MB'",
254
306
  );
255
307
  });
256
308
 
257
- test("set config from null (function)", () => {
309
+ test("set config from null (function)", async () => {
258
310
  const base: Omit<ProcedureProps, "config"> = {
259
311
  schema: "public",
260
312
  name: "test_function",
@@ -293,12 +345,13 @@ describe.concurrent("procedure", () => {
293
345
  key: "search_path",
294
346
  value: "public",
295
347
  });
348
+ await assertValidSql(change.serialize());
296
349
  expect(change.serialize()).toBe(
297
- "ALTER FUNCTION public.test_function SET search_path TO public",
350
+ "ALTER FUNCTION public.test_function() SET search_path TO public",
298
351
  );
299
352
  });
300
353
 
301
- test("set volatility", () => {
354
+ test("set volatility", async () => {
302
355
  const base: Omit<ProcedureProps, "volatility"> = {
303
356
  schema: "public",
304
357
  name: "test_function",
@@ -335,12 +388,13 @@ describe.concurrent("procedure", () => {
335
388
  procedure,
336
389
  volatility: "i",
337
390
  });
391
+ await assertValidSql(change.serialize());
338
392
  expect(change.serialize()).toBe(
339
- "ALTER FUNCTION public.test_function IMMUTABLE",
393
+ "ALTER FUNCTION public.test_function() IMMUTABLE",
340
394
  );
341
395
  });
342
396
 
343
- test("set strictness", () => {
397
+ test("set strictness", async () => {
344
398
  const base: Omit<ProcedureProps, "is_strict"> = {
345
399
  schema: "public",
346
400
  name: "test_function",
@@ -377,12 +431,13 @@ describe.concurrent("procedure", () => {
377
431
  procedure,
378
432
  isStrict: true,
379
433
  });
434
+ await assertValidSql(change.serialize());
380
435
  expect(change.serialize()).toBe(
381
- "ALTER FUNCTION public.test_function STRICT",
436
+ "ALTER FUNCTION public.test_function() STRICT",
382
437
  );
383
438
  });
384
439
 
385
- test("unset strictness (called on null input)", () => {
440
+ test("unset strictness (called on null input)", async () => {
386
441
  const base: Omit<ProcedureProps, "is_strict"> = {
387
442
  schema: "public",
388
443
  name: "test_function",
@@ -419,12 +474,13 @@ describe.concurrent("procedure", () => {
419
474
  procedure,
420
475
  isStrict: false,
421
476
  });
477
+ await assertValidSql(change.serialize());
422
478
  expect(change.serialize()).toBe(
423
- "ALTER FUNCTION public.test_function CALLED ON NULL INPUT",
479
+ "ALTER FUNCTION public.test_function() CALLED ON NULL INPUT",
424
480
  );
425
481
  });
426
482
 
427
- test("set leakproof", () => {
483
+ test("set leakproof", async () => {
428
484
  const base: Omit<ProcedureProps, "leakproof"> = {
429
485
  schema: "public",
430
486
  name: "test_function",
@@ -461,12 +517,13 @@ describe.concurrent("procedure", () => {
461
517
  procedure,
462
518
  leakproof: true,
463
519
  });
520
+ await assertValidSql(change.serialize());
464
521
  expect(change.serialize()).toBe(
465
- "ALTER FUNCTION public.test_function LEAKPROOF",
522
+ "ALTER FUNCTION public.test_function() LEAKPROOF",
466
523
  );
467
524
  });
468
525
 
469
- test("unset leakproof", () => {
526
+ test("unset leakproof", async () => {
470
527
  const base: Omit<ProcedureProps, "leakproof"> = {
471
528
  schema: "public",
472
529
  name: "test_function",
@@ -503,12 +560,13 @@ describe.concurrent("procedure", () => {
503
560
  procedure,
504
561
  leakproof: false,
505
562
  });
563
+ await assertValidSql(change.serialize());
506
564
  expect(change.serialize()).toBe(
507
- "ALTER FUNCTION public.test_function NOT LEAKPROOF",
565
+ "ALTER FUNCTION public.test_function() NOT LEAKPROOF",
508
566
  );
509
567
  });
510
568
 
511
- test("set parallel safety", () => {
569
+ test("set parallel safety", async () => {
512
570
  const base: Omit<ProcedureProps, "parallel_safety"> = {
513
571
  schema: "public",
514
572
  name: "test_function",
@@ -545,13 +603,14 @@ describe.concurrent("procedure", () => {
545
603
  procedure,
546
604
  parallelSafety: "r",
547
605
  });
606
+ await assertValidSql(change.serialize());
548
607
  expect(change.serialize()).toBe(
549
- "ALTER FUNCTION public.test_function PARALLEL RESTRICTED",
608
+ "ALTER FUNCTION public.test_function() PARALLEL RESTRICTED",
550
609
  );
551
610
  });
552
611
 
553
612
  // PROCEDURE variants
554
- test("procedure: set security definer", () => {
613
+ test("procedure: set security definer", async () => {
555
614
  const base: Omit<ProcedureProps, "security_definer"> = {
556
615
  schema: "public",
557
616
  name: "test_procedure",
@@ -588,12 +647,13 @@ describe.concurrent("procedure", () => {
588
647
  procedure,
589
648
  securityDefiner: true,
590
649
  });
650
+ await assertValidSql(change.serialize());
591
651
  expect(change.serialize()).toBe(
592
- "ALTER PROCEDURE public.test_procedure SECURITY DEFINER",
652
+ "ALTER PROCEDURE public.test_procedure() SECURITY DEFINER",
593
653
  );
594
654
  });
595
655
 
596
- test("procedure: unset security definer (invoker)", () => {
656
+ test("procedure: unset security definer (invoker)", async () => {
597
657
  const base: Omit<ProcedureProps, "security_definer"> = {
598
658
  schema: "public",
599
659
  name: "test_procedure",
@@ -630,12 +690,13 @@ describe.concurrent("procedure", () => {
630
690
  procedure,
631
691
  securityDefiner: false,
632
692
  });
693
+ await assertValidSql(change.serialize());
633
694
  expect(change.serialize()).toBe(
634
- "ALTER PROCEDURE public.test_procedure SECURITY INVOKER",
695
+ "ALTER PROCEDURE public.test_procedure() SECURITY INVOKER",
635
696
  );
636
697
  });
637
698
 
638
- test("procedure: set and reset config", () => {
699
+ test("procedure: set and reset config", async () => {
639
700
  const base: Omit<ProcedureProps, "config"> = {
640
701
  schema: "public",
641
702
  name: "test_procedure",
@@ -685,18 +746,21 @@ describe.concurrent("procedure", () => {
685
746
  key: "work_mem",
686
747
  value: "64MB",
687
748
  });
749
+ await assertValidSql(change1.serialize());
688
750
  expect(change1.serialize()).toBe(
689
- "ALTER PROCEDURE public.test_procedure RESET search_path",
751
+ "ALTER PROCEDURE public.test_procedure() RESET search_path",
690
752
  );
753
+ await assertValidSql(change2.serialize());
691
754
  expect(change2.serialize()).toBe(
692
- "ALTER PROCEDURE public.test_procedure SET search_path TO pg_temp",
755
+ "ALTER PROCEDURE public.test_procedure() SET search_path TO pg_temp",
693
756
  );
757
+ await assertValidSql(change3.serialize());
694
758
  expect(change3.serialize()).toBe(
695
- "ALTER PROCEDURE public.test_procedure SET work_mem TO '64MB'",
759
+ "ALTER PROCEDURE public.test_procedure() SET work_mem TO '64MB'",
696
760
  );
697
761
  });
698
762
 
699
- test("procedure: reset all config (to null)", () => {
763
+ test("procedure: reset all config (to null)", async () => {
700
764
  const base: Omit<ProcedureProps, "config"> = {
701
765
  schema: "public",
702
766
  name: "test_procedure",
@@ -742,15 +806,17 @@ describe.concurrent("procedure", () => {
742
806
  action: "reset",
743
807
  key: "work_mem",
744
808
  });
809
+ await assertValidSql(change1.serialize());
745
810
  expect(change1.serialize()).toBe(
746
- "ALTER PROCEDURE public.test_procedure RESET search_path",
811
+ "ALTER PROCEDURE public.test_procedure() RESET search_path",
747
812
  );
813
+ await assertValidSql(change2.serialize());
748
814
  expect(change2.serialize()).toBe(
749
- "ALTER PROCEDURE public.test_procedure RESET work_mem",
815
+ "ALTER PROCEDURE public.test_procedure() RESET work_mem",
750
816
  );
751
817
  });
752
818
 
753
- test("procedure: set volatility", () => {
819
+ test("procedure: set volatility", async () => {
754
820
  const base: Omit<ProcedureProps, "volatility"> = {
755
821
  schema: "public",
756
822
  name: "test_procedure",
@@ -787,12 +853,13 @@ describe.concurrent("procedure", () => {
787
853
  procedure,
788
854
  volatility: "s",
789
855
  });
856
+ await assertValidSql(change.serialize());
790
857
  expect(change.serialize()).toBe(
791
- "ALTER PROCEDURE public.test_procedure STABLE",
858
+ "ALTER PROCEDURE public.test_procedure() STABLE",
792
859
  );
793
860
  });
794
861
 
795
- test("procedure: set strictness", () => {
862
+ test("procedure: set strictness", async () => {
796
863
  const base: Omit<ProcedureProps, "is_strict"> = {
797
864
  schema: "public",
798
865
  name: "test_procedure",
@@ -829,12 +896,13 @@ describe.concurrent("procedure", () => {
829
896
  procedure,
830
897
  isStrict: true,
831
898
  });
899
+ await assertValidSql(change.serialize());
832
900
  expect(change.serialize()).toBe(
833
- "ALTER PROCEDURE public.test_procedure STRICT",
901
+ "ALTER PROCEDURE public.test_procedure() STRICT",
834
902
  );
835
903
  });
836
904
 
837
- test("procedure: unset strictness (called on null input)", () => {
905
+ test("procedure: unset strictness (called on null input)", async () => {
838
906
  const base: Omit<ProcedureProps, "is_strict"> = {
839
907
  schema: "public",
840
908
  name: "test_procedure",
@@ -871,12 +939,13 @@ describe.concurrent("procedure", () => {
871
939
  procedure,
872
940
  isStrict: false,
873
941
  });
942
+ await assertValidSql(change.serialize());
874
943
  expect(change.serialize()).toBe(
875
- "ALTER PROCEDURE public.test_procedure CALLED ON NULL INPUT",
944
+ "ALTER PROCEDURE public.test_procedure() CALLED ON NULL INPUT",
876
945
  );
877
946
  });
878
947
 
879
- test("procedure: set leakproof", () => {
948
+ test("procedure: set leakproof", async () => {
880
949
  const base: Omit<ProcedureProps, "leakproof"> = {
881
950
  schema: "public",
882
951
  name: "test_procedure",
@@ -913,12 +982,13 @@ describe.concurrent("procedure", () => {
913
982
  procedure,
914
983
  leakproof: true,
915
984
  });
985
+ await assertValidSql(change.serialize());
916
986
  expect(change.serialize()).toBe(
917
- "ALTER PROCEDURE public.test_procedure LEAKPROOF",
987
+ "ALTER PROCEDURE public.test_procedure() LEAKPROOF",
918
988
  );
919
989
  });
920
990
 
921
- test("procedure: unset leakproof", () => {
991
+ test("procedure: unset leakproof", async () => {
922
992
  const base: Omit<ProcedureProps, "leakproof"> = {
923
993
  schema: "public",
924
994
  name: "test_procedure",
@@ -955,12 +1025,13 @@ describe.concurrent("procedure", () => {
955
1025
  procedure,
956
1026
  leakproof: false,
957
1027
  });
1028
+ await assertValidSql(change.serialize());
958
1029
  expect(change.serialize()).toBe(
959
- "ALTER PROCEDURE public.test_procedure NOT LEAKPROOF",
1030
+ "ALTER PROCEDURE public.test_procedure() NOT LEAKPROOF",
960
1031
  );
961
1032
  });
962
1033
 
963
- test("procedure: set parallel safety", () => {
1034
+ test("procedure: set parallel safety", async () => {
964
1035
  const base: Omit<ProcedureProps, "parallel_safety"> = {
965
1036
  schema: "public",
966
1037
  name: "test_procedure",
@@ -997,8 +1068,9 @@ describe.concurrent("procedure", () => {
997
1068
  procedure,
998
1069
  parallelSafety: "s",
999
1070
  });
1071
+ await assertValidSql(change.serialize());
1000
1072
  expect(change.serialize()).toBe(
1001
- "ALTER PROCEDURE public.test_procedure PARALLEL SAFE",
1073
+ "ALTER PROCEDURE public.test_procedure() PARALLEL SAFE",
1002
1074
  );
1003
1075
  });
1004
1076
  });
@@ -2,6 +2,12 @@ import type { Procedure } from "../procedure.model.ts";
2
2
  import { formatConfigValue } from "../utils.ts";
3
3
  import { AlterProcedureChange } from "./procedure.base.ts";
4
4
 
5
+ /** Build schema.name(args) for ALTER statements so overloaded functions are unambiguous. */
6
+ function procedureSignature(procedure: Procedure): string {
7
+ const args = procedure.argument_types?.join(", ") ?? "";
8
+ return `${procedure.schema}.${procedure.name}(${args})`;
9
+ }
10
+
5
11
  /**
6
12
  * Alter a procedure.
7
13
  *
@@ -60,7 +66,7 @@ export class AlterProcedureChangeOwner extends AlterProcedureChange {
60
66
  return [
61
67
  "ALTER",
62
68
  objectType,
63
- `${this.procedure.schema}.${this.procedure.name}`,
69
+ procedureSignature(this.procedure),
64
70
  "OWNER TO",
65
71
  this.owner,
66
72
  ].join(" ");
@@ -94,7 +100,7 @@ export class AlterProcedureSetSecurity extends AlterProcedureChange {
94
100
  return [
95
101
  "ALTER",
96
102
  objectType,
97
- `${this.procedure.schema}.${this.procedure.name}`,
103
+ procedureSignature(this.procedure),
98
104
  security,
99
105
  ].join(" ");
100
106
  }
@@ -140,7 +146,7 @@ export class AlterProcedureSetConfig extends AlterProcedureChange {
140
146
  const head = [
141
147
  "ALTER",
142
148
  this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
143
- `${this.procedure.schema}.${this.procedure.name}`,
149
+ procedureSignature(this.procedure),
144
150
  ].join(" ");
145
151
  if (this.action === "reset_all") return `${head} RESET ALL`;
146
152
  if (this.action === "reset") return `${head} RESET ${this.key}`;
@@ -180,7 +186,7 @@ export class AlterProcedureSetVolatility extends AlterProcedureChange {
180
186
  return [
181
187
  "ALTER",
182
188
  objectType,
183
- `${this.procedure.schema}.${this.procedure.name}`,
189
+ procedureSignature(this.procedure),
184
190
  volMap[this.volatility],
185
191
  ].join(" ");
186
192
  }
@@ -210,7 +216,7 @@ export class AlterProcedureSetStrictness extends AlterProcedureChange {
210
216
  return [
211
217
  "ALTER",
212
218
  objectType,
213
- `${this.procedure.schema}.${this.procedure.name}`,
219
+ procedureSignature(this.procedure),
214
220
  strictness,
215
221
  ].join(" ");
216
222
  }
@@ -237,12 +243,9 @@ export class AlterProcedureSetLeakproof extends AlterProcedureChange {
237
243
  serialize(): string {
238
244
  const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
239
245
  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
+ return ["ALTER", objectType, procedureSignature(this.procedure), leak].join(
247
+ " ",
248
+ );
246
249
  }
247
250
  }
248
251
 
@@ -274,7 +277,7 @@ export class AlterProcedureSetParallel extends AlterProcedureChange {
274
277
  return [
275
278
  "ALTER",
276
279
  objectType,
277
- `${this.procedure.schema}.${this.procedure.name}`,
280
+ procedureSignature(this.procedure),
278
281
  parallelMap[this.parallelSafety],
279
282
  ].join(" ");
280
283
  }
@@ -1,9 +1,10 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
2
3
  import { Procedure } from "../procedure.model.ts";
3
4
  import { CreateProcedure } from "./procedure.create.ts";
4
5
 
5
6
  describe("procedure", () => {
6
- test("create", () => {
7
+ test("create", async () => {
7
8
  const procedure = new Procedure({
8
9
  schema: "public",
9
10
  name: "test_procedure",
@@ -41,6 +42,8 @@ describe("procedure", () => {
41
42
  procedure,
42
43
  });
43
44
 
45
+ await assertValidSql(change.serialize());
46
+
44
47
  expect(change.serialize()).toBe(
45
48
  "CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$BEGIN RETURN; END;$$",
46
49
  );
@@ -1,9 +1,10 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
2
3
  import { Procedure } from "../procedure.model.ts";
3
4
  import { DropProcedure } from "./procedure.drop.ts";
4
5
 
5
6
  describe("procedure", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const procedure = new Procedure({
8
9
  schema: "public",
9
10
  name: "test_procedure",
@@ -41,10 +42,12 @@ describe("procedure", () => {
41
42
  procedure,
42
43
  });
43
44
 
45
+ await assertValidSql(change.serialize());
46
+
44
47
  expect(change.serialize()).toBe("DROP PROCEDURE public.test_procedure()");
45
48
  });
46
49
 
47
- test("drop function", () => {
50
+ test("drop function", async () => {
48
51
  const fn = new Procedure({
49
52
  schema: "public",
50
53
  name: "test_function",
@@ -80,6 +83,8 @@ describe("procedure", () => {
80
83
 
81
84
  const change = new DropProcedure({ procedure: fn });
82
85
 
86
+ await assertValidSql(change.serialize());
87
+
83
88
  expect(change.serialize()).toBe("DROP FUNCTION public.test_function()");
84
89
  });
85
90
  });