@supabase/pg-delta 1.0.0-alpha.3 → 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 (633) hide show
  1. package/README.md +41 -2
  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 +40 -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/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +14 -1
  27. package/dist/core/catalog.model.js +103 -1
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  31. package/dist/core/declarative-apply/discover-sql.js +86 -0
  32. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  33. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  34. package/dist/core/declarative-apply/index.d.ts +49 -0
  35. package/dist/core/declarative-apply/index.js +134 -0
  36. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  37. package/dist/core/declarative-apply/round-apply.js +378 -0
  38. package/dist/core/export/file-mapper.d.ts +71 -0
  39. package/dist/core/export/file-mapper.js +474 -0
  40. package/dist/core/export/grouper.d.ts +13 -0
  41. package/dist/core/export/grouper.js +76 -0
  42. package/dist/core/export/index.d.ts +45 -0
  43. package/dist/core/export/index.js +63 -0
  44. package/dist/core/export/types.d.ts +84 -0
  45. package/dist/core/export/types.js +25 -0
  46. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  47. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  48. package/dist/core/integrations/filter/dsl.js +20 -2
  49. package/dist/core/integrations/filter/extractors.js +42 -0
  50. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  51. package/dist/core/integrations/supabase.d.ts +8 -0
  52. package/dist/core/integrations/supabase.js +9 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  54. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  56. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  57. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  58. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  59. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  60. package/dist/core/objects/base.privilege-diff.js +104 -22
  61. package/dist/core/objects/base.privilege.d.ts +1 -0
  62. package/dist/core/objects/base.privilege.js +9 -2
  63. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  64. package/dist/core/objects/diff-context.d.ts +15 -0
  65. package/dist/core/objects/diff-context.js +1 -0
  66. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  67. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  68. package/dist/core/objects/domain/domain.diff.js +16 -77
  69. package/dist/core/objects/domain/domain.model.js +1 -1
  70. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  72. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  73. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  75. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  76. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  77. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  78. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  79. package/dist/core/objects/language/language.diff.d.ts +2 -5
  80. package/dist/core/objects/language/language.diff.js +7 -39
  81. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  82. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  83. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  84. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  85. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  86. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  87. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  88. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  89. package/dist/core/objects/procedure/procedure.model.js +1 -1
  90. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  91. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  92. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  93. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  94. package/dist/core/objects/publication/publication.diff.js +8 -13
  95. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  96. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  97. package/dist/core/objects/role/role.diff.js +22 -1
  98. package/dist/core/objects/role/role.model.d.ts +4 -3
  99. package/dist/core/objects/role/role.model.js +118 -12
  100. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  101. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  102. package/dist/core/objects/schema/schema.diff.js +16 -77
  103. package/dist/core/objects/schema/schema.model.js +1 -1
  104. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  105. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  106. package/dist/core/objects/sequence/sequence.model.js +1 -1
  107. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  108. package/dist/core/objects/table/changes/table.create.js +3 -0
  109. package/dist/core/objects/table/table.diff.d.ts +2 -8
  110. package/dist/core/objects/table/table.diff.js +26 -157
  111. package/dist/core/objects/table/table.model.d.ts +25 -22
  112. package/dist/core/objects/table/table.model.js +4 -1
  113. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  114. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  115. package/dist/core/objects/trigger/trigger.model.d.ts +9 -0
  116. package/dist/core/objects/trigger/trigger.model.js +14 -0
  117. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  118. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  119. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  120. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  121. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  122. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  123. package/dist/core/objects/type/enum/enum.model.js +1 -1
  124. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  125. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  126. package/dist/core/objects/type/range/range.diff.js +16 -77
  127. package/dist/core/objects/type/range/range.model.js +1 -1
  128. package/dist/core/objects/view/view.diff.d.ts +2 -8
  129. package/dist/core/objects/view/view.diff.js +16 -158
  130. package/dist/core/objects/view/view.model.d.ts +18 -4
  131. package/dist/core/objects/view/view.model.js +3 -13
  132. package/dist/core/plan/apply.js +11 -28
  133. package/dist/core/plan/create.d.ts +19 -6
  134. package/dist/core/plan/create.js +134 -155
  135. package/dist/core/plan/serialize.js +16 -4
  136. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  137. package/dist/core/plan/sql-format/constants.js +11 -0
  138. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  139. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  140. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  141. package/dist/core/plan/sql-format/format-utils.js +274 -0
  142. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  143. package/dist/core/plan/sql-format/formatters.js +737 -0
  144. package/dist/core/plan/sql-format/index.d.ts +2 -0
  145. package/dist/core/plan/sql-format/index.js +98 -0
  146. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  147. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  148. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  149. package/dist/core/plan/sql-format/protect.js +269 -0
  150. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  151. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  152. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  153. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  154. package/dist/core/plan/sql-format/types.d.ts +28 -0
  155. package/dist/core/plan/sql-format/types.js +1 -0
  156. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  157. package/dist/core/plan/sql-format/wrap.js +165 -0
  158. package/dist/core/plan/sql-format.d.ts +2 -0
  159. package/dist/core/plan/sql-format.js +1 -0
  160. package/dist/core/plan/ssl-config.d.ts +32 -0
  161. package/dist/core/plan/ssl-config.js +115 -0
  162. package/dist/core/plan/statements.d.ts +2 -1
  163. package/dist/core/plan/statements.js +6 -2
  164. package/dist/core/plan/types.d.ts +6 -0
  165. package/dist/core/postgres-config.d.ts +29 -0
  166. package/dist/core/postgres-config.js +83 -2
  167. package/dist/core/sort/graph-builder.js +10 -0
  168. package/dist/core/sort/logical-sort.js +31 -23
  169. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  170. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  171. package/dist/index.d.ts +8 -0
  172. package/dist/index.js +7 -1
  173. package/package.json +54 -22
  174. package/src/cli/app.ts +52 -0
  175. package/src/cli/bin/cli.ts +15 -0
  176. package/src/cli/commands/apply.ts +101 -0
  177. package/src/cli/commands/catalog-export.ts +78 -0
  178. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  179. package/src/cli/commands/declarative-apply.ts +380 -0
  180. package/src/cli/commands/declarative-export.ts +330 -0
  181. package/src/cli/commands/plan.ts +216 -0
  182. package/src/cli/commands/sync.ts +185 -0
  183. package/src/cli/exit-code.test.ts +19 -0
  184. package/src/cli/exit-code.ts +7 -0
  185. package/src/cli/formatters/index.ts +5 -0
  186. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  187. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  188. package/src/cli/formatters/tree/tree.ts +238 -0
  189. package/src/cli/utils/apply-display.test.ts +348 -0
  190. package/src/cli/utils/apply-display.ts +238 -0
  191. package/src/cli/utils/export-display.test.ts +103 -0
  192. package/src/cli/utils/export-display.ts +275 -0
  193. package/src/cli/utils/integrations.test.ts +44 -0
  194. package/src/cli/utils/integrations.ts +42 -0
  195. package/src/cli/utils/resolve-input.test.ts +38 -0
  196. package/src/cli/utils/resolve-input.ts +17 -0
  197. package/src/cli/utils.ts +231 -0
  198. package/src/core/catalog-export/index.ts +20 -0
  199. package/src/core/catalog.diff.ts +247 -0
  200. package/src/core/catalog.model.test.ts +122 -0
  201. package/src/core/catalog.model.ts +510 -0
  202. package/src/core/catalog.snapshot.test.ts +464 -0
  203. package/src/core/catalog.snapshot.ts +289 -0
  204. package/src/core/change.types.ts +44 -0
  205. package/src/core/context.ts +26 -0
  206. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  207. package/src/core/declarative-apply/discover-sql.ts +107 -0
  208. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  209. package/src/core/declarative-apply/index.test.ts +67 -0
  210. package/src/core/declarative-apply/index.ts +205 -0
  211. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  212. package/src/core/declarative-apply/round-apply.ts +562 -0
  213. package/src/core/depend.ts +1870 -0
  214. package/src/core/expand-replace-dependencies.test.ts +70 -0
  215. package/src/core/expand-replace-dependencies.ts +380 -0
  216. package/src/core/export/file-mapper.test.ts +816 -0
  217. package/src/core/export/file-mapper.ts +574 -0
  218. package/src/core/export/grouper.ts +108 -0
  219. package/src/core/export/index.ts +129 -0
  220. package/src/core/export/types.ts +104 -0
  221. package/src/core/fingerprint.ts +204 -0
  222. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  223. package/src/core/integrations/filter/dsl.test.ts +211 -0
  224. package/src/core/integrations/filter/dsl.ts +266 -0
  225. package/src/core/integrations/filter/extractors.test.ts +244 -0
  226. package/src/core/integrations/filter/extractors.ts +187 -0
  227. package/src/core/integrations/filter/filter.types.ts +3 -0
  228. package/src/core/integrations/integration-dsl.ts +34 -0
  229. package/src/core/integrations/integration.types.ts +7 -0
  230. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  231. package/src/core/integrations/serialize/dsl.ts +77 -0
  232. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  233. package/src/core/integrations/supabase.ts +130 -0
  234. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  235. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  236. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  237. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  238. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  239. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  240. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  241. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  242. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  243. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  244. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  245. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  246. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  247. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  248. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  249. package/src/core/objects/base.change.ts +62 -0
  250. package/src/core/objects/base.default-privileges.ts +204 -0
  251. package/src/core/objects/base.diff.ts +20 -0
  252. package/src/core/objects/base.model.ts +82 -0
  253. package/src/core/objects/base.privilege-diff.ts +447 -0
  254. package/src/core/objects/base.privilege.ts +191 -0
  255. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  256. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  257. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  258. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  259. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  260. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  261. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  262. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  263. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  264. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  265. package/src/core/objects/collation/collation.diff.ts +127 -0
  266. package/src/core/objects/collation/collation.model.ts +224 -0
  267. package/src/core/objects/diff-context.ts +16 -0
  268. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  269. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  270. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  271. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  272. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  273. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  274. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  275. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  276. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  277. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  278. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  279. package/src/core/objects/domain/domain.diff.ts +295 -0
  280. package/src/core/objects/domain/domain.model.ts +190 -0
  281. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  282. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  283. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  284. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  285. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  286. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  287. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  288. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  289. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  290. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  291. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  292. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  293. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  294. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  295. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  296. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  297. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  298. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  299. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  300. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  301. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  302. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  303. package/src/core/objects/extension/extension.diff.ts +90 -0
  304. package/src/core/objects/extension/extension.model.test.ts +98 -0
  305. package/src/core/objects/extension/extension.model.ts +280 -0
  306. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  307. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  308. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  309. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  310. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  311. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  312. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  313. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  314. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  315. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  316. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  317. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  318. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  319. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  320. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  321. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  322. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  323. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  324. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  325. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  326. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  327. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  328. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  329. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  330. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  331. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  332. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  333. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  334. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  335. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  336. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  337. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  338. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  339. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  340. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  341. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  342. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  343. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  344. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  345. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  346. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  347. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  348. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  349. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  350. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  351. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  352. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  353. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  354. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  355. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  356. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  357. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  358. package/src/core/objects/index/changes/index.alter.ts +144 -0
  359. package/src/core/objects/index/changes/index.base.ts +20 -0
  360. package/src/core/objects/index/changes/index.comment.ts +63 -0
  361. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  362. package/src/core/objects/index/changes/index.create.ts +68 -0
  363. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  364. package/src/core/objects/index/changes/index.drop.ts +34 -0
  365. package/src/core/objects/index/changes/index.types.ts +6 -0
  366. package/src/core/objects/index/changes/utils.ts +16 -0
  367. package/src/core/objects/index/index.diff.test.ts +153 -0
  368. package/src/core/objects/index/index.diff.ts +243 -0
  369. package/src/core/objects/index/index.model.ts +370 -0
  370. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  371. package/src/core/objects/language/changes/language.alter.ts +53 -0
  372. package/src/core/objects/language/changes/language.base.ts +20 -0
  373. package/src/core/objects/language/changes/language.comment.ts +58 -0
  374. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  375. package/src/core/objects/language/changes/language.create.ts +104 -0
  376. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  377. package/src/core/objects/language/changes/language.drop.ts +39 -0
  378. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  379. package/src/core/objects/language/changes/language.types.ts +12 -0
  380. package/src/core/objects/language/language.diff.test.ts +135 -0
  381. package/src/core/objects/language/language.diff.ts +144 -0
  382. package/src/core/objects/language/language.model.ts +150 -0
  383. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  384. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  385. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  386. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  387. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  388. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  389. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  390. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  391. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  392. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  393. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  394. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  395. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  396. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  397. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  398. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  399. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  400. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  401. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  402. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  403. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  404. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  405. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  406. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  407. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  408. package/src/core/objects/procedure/procedure.model.ts +264 -0
  409. package/src/core/objects/procedure/utils.ts +58 -0
  410. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  411. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  412. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  413. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  414. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  415. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  416. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  417. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  418. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  419. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  420. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  421. package/src/core/objects/publication/publication.diff.ts +247 -0
  422. package/src/core/objects/publication/publication.model.ts +206 -0
  423. package/src/core/objects/publication/utils.ts +55 -0
  424. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  425. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  426. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  427. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  428. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  429. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  430. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  431. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  432. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  433. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  434. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  435. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  436. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  437. package/src/core/objects/role/changes/role.alter.ts +110 -0
  438. package/src/core/objects/role/changes/role.base.ts +24 -0
  439. package/src/core/objects/role/changes/role.comment.ts +55 -0
  440. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  441. package/src/core/objects/role/changes/role.create.ts +102 -0
  442. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  443. package/src/core/objects/role/changes/role.drop.ts +34 -0
  444. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  445. package/src/core/objects/role/changes/role.types.ts +12 -0
  446. package/src/core/objects/role/role.diff.test.ts +279 -0
  447. package/src/core/objects/role/role.diff.ts +499 -0
  448. package/src/core/objects/role/role.model.ts +452 -0
  449. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  450. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  451. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  452. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  453. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  454. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  455. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  456. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  457. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  458. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  459. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  460. package/src/core/objects/rule/rule.diff.ts +79 -0
  461. package/src/core/objects/rule/rule.model.ts +173 -0
  462. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  463. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  464. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  465. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  466. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  467. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  468. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  469. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  470. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  471. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  472. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  473. package/src/core/objects/schema/schema.diff.ts +146 -0
  474. package/src/core/objects/schema/schema.model.ts +107 -0
  475. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  476. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  477. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  478. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  479. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  480. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  481. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  482. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  483. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  484. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  485. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  486. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  487. package/src/core/objects/sequence/sequence.model.ts +185 -0
  488. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  489. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  490. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  491. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  492. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  493. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  494. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  495. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  496. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  497. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  498. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  499. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  500. package/src/core/objects/subscription/subscription.model.ts +190 -0
  501. package/src/core/objects/subscription/utils.ts +156 -0
  502. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  503. package/src/core/objects/table/changes/table.alter.ts +806 -0
  504. package/src/core/objects/table/changes/table.base.ts +20 -0
  505. package/src/core/objects/table/changes/table.comment.ts +266 -0
  506. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  507. package/src/core/objects/table/changes/table.create.ts +192 -0
  508. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  509. package/src/core/objects/table/changes/table.drop.ts +45 -0
  510. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  511. package/src/core/objects/table/changes/table.types.ts +12 -0
  512. package/src/core/objects/table/table.diff.test.ts +868 -0
  513. package/src/core/objects/table/table.diff.ts +817 -0
  514. package/src/core/objects/table/table.model.ts +460 -0
  515. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  516. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  517. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  518. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  519. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  520. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  521. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  522. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  523. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  524. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  525. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  526. package/src/core/objects/trigger/trigger.model.ts +264 -0
  527. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  528. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  529. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  530. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  531. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  532. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  533. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  534. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  535. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  536. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  537. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  538. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  539. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  540. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  541. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  542. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  543. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  544. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  545. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  546. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  547. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  548. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  549. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  550. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  551. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  552. package/src/core/objects/type/enum/enum.model.ts +194 -0
  553. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  554. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  555. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  556. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  557. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  558. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  559. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  560. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  561. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  562. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  563. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  564. package/src/core/objects/type/range/range.diff.ts +197 -0
  565. package/src/core/objects/type/range/range.model.ts +187 -0
  566. package/src/core/objects/type/type.types.ts +5 -0
  567. package/src/core/objects/utils.ts +171 -0
  568. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  569. package/src/core/objects/view/changes/view.alter.ts +112 -0
  570. package/src/core/objects/view/changes/view.base.ts +20 -0
  571. package/src/core/objects/view/changes/view.comment.ts +59 -0
  572. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  573. package/src/core/objects/view/changes/view.create.ts +73 -0
  574. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  575. package/src/core/objects/view/changes/view.drop.ts +40 -0
  576. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  577. package/src/core/objects/view/changes/view.types.ts +12 -0
  578. package/src/core/objects/view/view.diff.test.ts +173 -0
  579. package/src/core/objects/view/view.diff.ts +215 -0
  580. package/src/core/objects/view/view.model.ts +262 -0
  581. package/src/core/plan/apply.ts +172 -0
  582. package/src/core/plan/create.ts +368 -0
  583. package/src/core/plan/hierarchy.ts +574 -0
  584. package/src/core/plan/index.ts +29 -0
  585. package/src/core/plan/io.ts +20 -0
  586. package/src/core/plan/risk.ts +48 -0
  587. package/src/core/plan/serialize.test.ts +317 -0
  588. package/src/core/plan/serialize.ts +209 -0
  589. package/src/core/plan/sql-format/constants.ts +13 -0
  590. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  591. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  592. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  593. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  594. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  595. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  596. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  597. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  598. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  599. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  600. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  601. package/src/core/plan/sql-format/format-utils.ts +391 -0
  602. package/src/core/plan/sql-format/formatters.ts +921 -0
  603. package/src/core/plan/sql-format/index.ts +149 -0
  604. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  605. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  606. package/src/core/plan/sql-format/protect.test.ts +127 -0
  607. package/src/core/plan/sql-format/protect.ts +337 -0
  608. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  609. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  610. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  611. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  612. package/src/core/plan/sql-format/types.ts +31 -0
  613. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  614. package/src/core/plan/sql-format/wrap.ts +196 -0
  615. package/src/core/plan/sql-format.ts +2 -0
  616. package/src/core/plan/ssl-config.ts +172 -0
  617. package/src/core/plan/statements.ts +22 -0
  618. package/src/core/plan/types.ts +171 -0
  619. package/src/core/postgres-config.ts +238 -0
  620. package/src/core/sort/custom-constraints.ts +161 -0
  621. package/src/core/sort/debug-visualization.ts +239 -0
  622. package/src/core/sort/dependency-filter.ts +224 -0
  623. package/src/core/sort/graph-builder.ts +235 -0
  624. package/src/core/sort/graph-utils.ts +51 -0
  625. package/src/core/sort/logical-sort.test.ts +371 -0
  626. package/src/core/sort/logical-sort.ts +597 -0
  627. package/src/core/sort/sort-changes.ts +234 -0
  628. package/src/core/sort/topological-sort.test.ts +275 -0
  629. package/src/core/sort/topological-sort.ts +184 -0
  630. package/src/core/sort/types.ts +112 -0
  631. package/src/core/sort/utils.ts +69 -0
  632. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  633. package/src/index.ts +38 -0
@@ -0,0 +1,188 @@
1
+ import {
2
+ formatObjectPrivilegeList,
3
+ getObjectKindPrefix,
4
+ } from "../../base.privilege.ts";
5
+ import { stableId } from "../../utils.ts";
6
+ import type { Procedure } from "../procedure.model.ts";
7
+ import { AlterProcedureChange } from "./procedure.base.ts";
8
+
9
+ export type ProcedurePrivilege =
10
+ | GrantProcedurePrivileges
11
+ | RevokeProcedurePrivileges
12
+ | RevokeGrantOptionProcedurePrivileges;
13
+
14
+ /**
15
+ * Grant privileges on a procedure.
16
+ *
17
+ * @see https://www.postgresql.org/docs/17/sql-grant.html
18
+ *
19
+ * Synopsis
20
+ * ```sql
21
+ * GRANT { EXECUTE | ALL [ PRIVILEGES ] }
22
+ * ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
23
+ * | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
24
+ * TO role_specification [, ...] [ WITH GRANT OPTION ]
25
+ * [ GRANTED BY role_specification ]
26
+ * ```
27
+ */
28
+ export class GrantProcedurePrivileges extends AlterProcedureChange {
29
+ public readonly procedure: Procedure;
30
+ public readonly grantee: string;
31
+ public readonly privileges: { privilege: string; grantable: boolean }[];
32
+ public readonly version: number | undefined;
33
+ public readonly scope = "privilege" as const;
34
+
35
+ constructor(props: {
36
+ procedure: Procedure;
37
+ grantee: string;
38
+ privileges: { privilege: string; grantable: boolean }[];
39
+ version?: number;
40
+ }) {
41
+ super();
42
+ this.procedure = props.procedure;
43
+ this.grantee = props.grantee;
44
+ this.privileges = props.privileges;
45
+ this.version = props.version;
46
+ }
47
+
48
+ get creates() {
49
+ return [stableId.acl(this.procedure.stableId, this.grantee)];
50
+ }
51
+
52
+ get requires() {
53
+ return [this.procedure.stableId, stableId.role(this.grantee)];
54
+ }
55
+
56
+ serialize(): string {
57
+ const hasGrantable = this.privileges.some((p) => p.grantable);
58
+ const hasBase = this.privileges.some((p) => !p.grantable);
59
+ if (hasGrantable && hasBase) {
60
+ throw new Error(
61
+ "GrantProcedurePrivileges expects privileges with uniform grantable flag",
62
+ );
63
+ }
64
+ const withGrant = hasGrantable ? " WITH GRANT OPTION" : "";
65
+ const objectKind = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
66
+ const kindPrefix = getObjectKindPrefix(objectKind);
67
+ const list = this.privileges.map((p) => p.privilege);
68
+ const privSql = formatObjectPrivilegeList(objectKind, list, this.version);
69
+ const procedureName = `${this.procedure.schema}.${this.procedure.name}`;
70
+ const args = this.procedure.argument_types?.join(", ") ?? "";
71
+ // Always include parentheses for privilege statements, even for zero-argument procedures/functions
72
+ const signature = `${procedureName}(${args})`;
73
+ return `GRANT ${privSql} ${kindPrefix} ${signature} TO ${this.grantee}${withGrant}`;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Revoke privileges on a procedure.
79
+ *
80
+ * @see https://www.postgresql.org/docs/17/sql-revoke.html
81
+ *
82
+ * Synopsis
83
+ * ```sql
84
+ * REVOKE [ GRANT OPTION FOR ]
85
+ * { { EXECUTE | ALL [ PRIVILEGES ] } }
86
+ * ON { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
87
+ * FROM role_specification [, ...]
88
+ * [ GRANTED BY role_specification ]
89
+ * [ CASCADE | RESTRICT ]
90
+ * ```
91
+ */
92
+ export class RevokeProcedurePrivileges extends AlterProcedureChange {
93
+ public readonly procedure: Procedure;
94
+ public readonly grantee: string;
95
+ public readonly privileges: { privilege: string; grantable: boolean }[];
96
+ public readonly version: number | undefined;
97
+ public readonly scope = "privilege" as const;
98
+
99
+ constructor(props: {
100
+ procedure: Procedure;
101
+ grantee: string;
102
+ privileges: { privilege: string; grantable: boolean }[];
103
+ version?: number;
104
+ }) {
105
+ super();
106
+ this.procedure = props.procedure;
107
+ this.grantee = props.grantee;
108
+ this.privileges = props.privileges;
109
+ this.version = props.version;
110
+ }
111
+
112
+ get drops() {
113
+ // Return ACL ID for dependency tracking, even though this is an ALTER operation
114
+ // Phase assignment now uses operation type, so this won't affect phase placement
115
+ return [stableId.acl(this.procedure.stableId, this.grantee)];
116
+ }
117
+
118
+ get requires() {
119
+ return [
120
+ stableId.acl(this.procedure.stableId, this.grantee),
121
+ this.procedure.stableId,
122
+ stableId.role(this.grantee),
123
+ ];
124
+ }
125
+
126
+ serialize(): string {
127
+ const objectKind = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
128
+ const kindPrefix = getObjectKindPrefix(objectKind);
129
+ const list = this.privileges.map((p) => p.privilege);
130
+ const privSql = formatObjectPrivilegeList(objectKind, list, this.version);
131
+ const procedureName = `${this.procedure.schema}.${this.procedure.name}`;
132
+ const args = this.procedure.argument_types?.join(", ") ?? "";
133
+ // Always include parentheses for privilege statements, even for zero-argument procedures/functions
134
+ const signature = `${procedureName}(${args})`;
135
+ return `REVOKE ${privSql} ${kindPrefix} ${signature} FROM ${this.grantee}`;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Revoke grant option for privileges on a procedure.
141
+ *
142
+ * This removes the ability to grant the privilege to others, but keeps the privilege itself.
143
+ *
144
+ * @see https://www.postgresql.org/docs/17/sql-revoke.html
145
+ */
146
+ export class RevokeGrantOptionProcedurePrivileges extends AlterProcedureChange {
147
+ public readonly procedure: Procedure;
148
+ public readonly grantee: string;
149
+ public readonly privilegeNames: string[];
150
+ public readonly version: number | undefined;
151
+ public readonly scope = "privilege" as const;
152
+
153
+ constructor(props: {
154
+ procedure: Procedure;
155
+ grantee: string;
156
+ privilegeNames: string[];
157
+ version?: number;
158
+ }) {
159
+ super();
160
+ this.procedure = props.procedure;
161
+ this.grantee = props.grantee;
162
+ this.privilegeNames = [...new Set(props.privilegeNames)].sort();
163
+ this.version = props.version;
164
+ }
165
+
166
+ get requires() {
167
+ return [
168
+ stableId.acl(this.procedure.stableId, this.grantee),
169
+ this.procedure.stableId,
170
+ stableId.role(this.grantee),
171
+ ];
172
+ }
173
+
174
+ serialize(): string {
175
+ const objectKind = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
176
+ const kindPrefix = getObjectKindPrefix(objectKind);
177
+ const privSql = formatObjectPrivilegeList(
178
+ objectKind,
179
+ this.privilegeNames,
180
+ this.version,
181
+ );
182
+ const procedureName = `${this.procedure.schema}.${this.procedure.name}`;
183
+ const args = this.procedure.argument_types?.join(", ") ?? "";
184
+ // Always include parentheses for privilege statements, even for zero-argument procedures/functions
185
+ const signature = `${procedureName}(${args})`;
186
+ return `REVOKE GRANT OPTION FOR ${privSql} ${kindPrefix} ${signature} FROM ${this.grantee}`;
187
+ }
188
+ }
@@ -0,0 +1,12 @@
1
+ import type { AlterProcedure } from "./procedure.alter.ts";
2
+ import type { CommentProcedure } from "./procedure.comment.ts";
3
+ import type { CreateProcedure } from "./procedure.create.ts";
4
+ import type { DropProcedure } from "./procedure.drop.ts";
5
+ import type { ProcedurePrivilege } from "./procedure.privilege.ts";
6
+
7
+ export type ProcedureChange =
8
+ | AlterProcedure
9
+ | CommentProcedure
10
+ | CreateProcedure
11
+ | DropProcedure
12
+ | ProcedurePrivilege;
@@ -0,0 +1,161 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { DefaultPrivilegeState } from "../base.default-privileges.ts";
3
+ import {
4
+ AlterProcedureChangeOwner,
5
+ AlterProcedureSetConfig,
6
+ AlterProcedureSetLeakproof,
7
+ AlterProcedureSetParallel,
8
+ AlterProcedureSetSecurity,
9
+ AlterProcedureSetStrictness,
10
+ AlterProcedureSetVolatility,
11
+ } from "./changes/procedure.alter.ts";
12
+ import { CreateProcedure } from "./changes/procedure.create.ts";
13
+ import { DropProcedure } from "./changes/procedure.drop.ts";
14
+ import { diffProcedures } from "./procedure.diff.ts";
15
+ import { Procedure, type ProcedureProps } from "./procedure.model.ts";
16
+
17
+ const base: ProcedureProps = {
18
+ schema: "public",
19
+ name: "fn1",
20
+ kind: "f",
21
+ return_type: "int4",
22
+ return_type_schema: "pg_catalog",
23
+ language: "sql",
24
+ security_definer: false,
25
+ volatility: "v",
26
+ parallel_safety: "s",
27
+ is_strict: false,
28
+ leakproof: false,
29
+ returns_set: false,
30
+ argument_count: 0,
31
+ argument_default_count: 0,
32
+ argument_names: null,
33
+ argument_types: null,
34
+ all_argument_types: null,
35
+ argument_modes: null,
36
+ argument_defaults: null,
37
+ source_code: null,
38
+ binary_path: null,
39
+ sql_body: null,
40
+ definition:
41
+ "CREATE FUNCTION public.fn1() RETURNS int4 LANGUAGE sql AS $$SELECT NULL::int4$$",
42
+ config: null,
43
+ owner: "o1",
44
+ execution_cost: 0,
45
+ result_rows: 0,
46
+ comment: null,
47
+ privileges: [],
48
+ };
49
+
50
+ const testContext = {
51
+ version: 170000,
52
+ currentUser: "postgres",
53
+ defaultPrivilegeState: new DefaultPrivilegeState({}),
54
+ mainRoles: {},
55
+ };
56
+
57
+ describe.concurrent("procedure.diff", () => {
58
+ test("create and drop", () => {
59
+ const p = new Procedure(base);
60
+ const created = diffProcedures(testContext, {}, { [p.stableId]: p });
61
+ expect(created[0]).toBeInstanceOf(CreateProcedure);
62
+ const dropped = diffProcedures(testContext, { [p.stableId]: p }, {});
63
+ expect(dropped[0]).toBeInstanceOf(DropProcedure);
64
+ });
65
+
66
+ test("alter owner", () => {
67
+ const main = new Procedure(base);
68
+ const branch = new Procedure({ ...base, owner: "o2" });
69
+ const changes = diffProcedures(
70
+ testContext,
71
+ { [main.stableId]: main },
72
+ { [branch.stableId]: branch },
73
+ );
74
+ expect(changes[0]).toBeInstanceOf(AlterProcedureChangeOwner);
75
+ });
76
+
77
+ test("diff emits alter security when security_definer changes", () => {
78
+ const main = new Procedure(base);
79
+ const branch = new Procedure({ ...base, security_definer: true });
80
+ const changes = diffProcedures(
81
+ testContext,
82
+ { [main.stableId]: main },
83
+ { [branch.stableId]: branch },
84
+ );
85
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetSecurity);
86
+ });
87
+
88
+ test("diff emits config set/reset when config changes", () => {
89
+ const main = new Procedure({ ...base, config: ["search_path=public"] });
90
+ const branch = new Procedure({
91
+ ...base,
92
+ config: ["search_path=pg_temp", "work_mem=64MB"],
93
+ });
94
+ const changes = diffProcedures(
95
+ testContext,
96
+ { [main.stableId]: main },
97
+ { [branch.stableId]: branch },
98
+ );
99
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetConfig);
100
+ });
101
+
102
+ test("diff emits volatility change", () => {
103
+ const main = new Procedure(base);
104
+ const branch = new Procedure({ ...base, volatility: "i" });
105
+ const changes = diffProcedures(
106
+ testContext,
107
+ { [main.stableId]: main },
108
+ { [branch.stableId]: branch },
109
+ );
110
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetVolatility);
111
+ });
112
+
113
+ test("diff emits strictness change", () => {
114
+ const main = new Procedure(base);
115
+ const branch = new Procedure({ ...base, is_strict: true });
116
+ const changes = diffProcedures(
117
+ testContext,
118
+ { [main.stableId]: main },
119
+ { [branch.stableId]: branch },
120
+ );
121
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetStrictness);
122
+ });
123
+
124
+ test("diff emits leakproof change", () => {
125
+ const main = new Procedure(base);
126
+ const branch = new Procedure({ ...base, leakproof: true });
127
+ const changes = diffProcedures(
128
+ testContext,
129
+ { [main.stableId]: main },
130
+ { [branch.stableId]: branch },
131
+ );
132
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetLeakproof);
133
+ });
134
+
135
+ test("diff emits parallel safety change", () => {
136
+ const main = new Procedure(base);
137
+ const branch = new Procedure({ ...base, parallel_safety: "r" });
138
+ const changes = diffProcedures(
139
+ testContext,
140
+ { [main.stableId]: main },
141
+ { [branch.stableId]: branch },
142
+ );
143
+ expect(changes[0]).toBeInstanceOf(AlterProcedureSetParallel);
144
+ });
145
+
146
+ test("create or replace when non-alterable property changes", () => {
147
+ const main = new Procedure(base);
148
+ const branch = new Procedure({
149
+ ...base,
150
+ return_type: "text",
151
+ language: "plpgsql",
152
+ });
153
+ const changes = diffProcedures(
154
+ testContext,
155
+ { [main.stableId]: main },
156
+ { [branch.stableId]: branch },
157
+ );
158
+ expect(changes).toHaveLength(1);
159
+ expect(changes[0]).toBeInstanceOf(CreateProcedure);
160
+ });
161
+ });
@@ -0,0 +1,341 @@
1
+ import { diffObjects } from "../base.diff.ts";
2
+ import {
3
+ diffPrivileges,
4
+ emitObjectPrivilegeChanges,
5
+ filterPublicBuiltInDefaults,
6
+ } from "../base.privilege-diff.ts";
7
+ import type { ObjectDiffContext } from "../diff-context.ts";
8
+ import { deepEqual, hasNonAlterableChanges } from "../utils.ts";
9
+ import {
10
+ AlterProcedureChangeOwner,
11
+ AlterProcedureSetConfig,
12
+ AlterProcedureSetLeakproof,
13
+ AlterProcedureSetParallel,
14
+ AlterProcedureSetSecurity,
15
+ AlterProcedureSetStrictness,
16
+ AlterProcedureSetVolatility,
17
+ } from "./changes/procedure.alter.ts";
18
+ import {
19
+ CreateCommentOnProcedure,
20
+ DropCommentOnProcedure,
21
+ } from "./changes/procedure.comment.ts";
22
+ import { CreateProcedure } from "./changes/procedure.create.ts";
23
+ import { DropProcedure } from "./changes/procedure.drop.ts";
24
+ import {
25
+ GrantProcedurePrivileges,
26
+ RevokeGrantOptionProcedurePrivileges,
27
+ RevokeProcedurePrivileges,
28
+ } from "./changes/procedure.privilege.ts";
29
+ import type { ProcedureChange } from "./changes/procedure.types.ts";
30
+ import type { Procedure } from "./procedure.model.ts";
31
+
32
+ /**
33
+ * Diff two sets of procedures from main and branch catalogs.
34
+ *
35
+ * @param ctx - Context containing version, currentUser, and defaultPrivilegeState
36
+ * @param main - The procedures in the main catalog.
37
+ * @param branch - The procedures in the branch catalog.
38
+ * @returns A list of changes to apply to main to make it match branch.
39
+ */
40
+ export function diffProcedures(
41
+ ctx: Pick<
42
+ ObjectDiffContext,
43
+ "version" | "currentUser" | "defaultPrivilegeState"
44
+ >,
45
+ main: Record<string, Procedure>,
46
+ branch: Record<string, Procedure>,
47
+ ): ProcedureChange[] {
48
+ const { created, dropped, altered } = diffObjects(main, branch);
49
+
50
+ const changes: ProcedureChange[] = [];
51
+
52
+ for (const procedureId of created) {
53
+ const proc = branch[procedureId];
54
+ changes.push(new CreateProcedure({ procedure: proc }));
55
+
56
+ // OWNER: If the procedure should be owned by someone other than the current user,
57
+ // emit ALTER FUNCTION/PROCEDURE ... OWNER TO after creation
58
+ if (proc.owner !== ctx.currentUser) {
59
+ changes.push(
60
+ new AlterProcedureChangeOwner({
61
+ procedure: proc,
62
+ owner: proc.owner,
63
+ }),
64
+ );
65
+ }
66
+
67
+ if (proc.comment !== null) {
68
+ changes.push(new CreateCommentOnProcedure({ procedure: proc }));
69
+ }
70
+
71
+ // PRIVILEGES: For created objects, compare against default privileges state
72
+ // The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
73
+ // so objects are created with the default privileges state in effect.
74
+ // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
75
+ // needed to reach the final desired state.
76
+ const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(
77
+ ctx.currentUser,
78
+ "procedure",
79
+ proc.schema ?? "",
80
+ );
81
+ const creatorFilteredDefaults =
82
+ proc.owner !== ctx.currentUser
83
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
84
+ : effectiveDefaults;
85
+ // Filter out PUBLIC's built-in default EXECUTE privilege (PostgreSQL grants it automatically)
86
+ // Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
87
+ // This prevents generating unnecessary "GRANT EXECUTE TO PUBLIC" statements
88
+ const desiredPrivileges = filterPublicBuiltInDefaults(
89
+ "procedure",
90
+ proc.privileges,
91
+ );
92
+ // Filter out owner privileges - owner always has ALL privileges implicitly
93
+ // and shouldn't be compared. Note: we use the final owner (proc.owner), not the
94
+ // current user, because ownership change happens before privilege diffing.
95
+ const privilegeResults = diffPrivileges(
96
+ filterPublicBuiltInDefaults("procedure", creatorFilteredDefaults),
97
+ desiredPrivileges,
98
+ proc.owner,
99
+ );
100
+
101
+ changes.push(
102
+ ...(emitObjectPrivilegeChanges(
103
+ privilegeResults,
104
+ proc,
105
+ proc,
106
+ "procedure",
107
+ {
108
+ Grant: GrantProcedurePrivileges,
109
+ Revoke: RevokeProcedurePrivileges,
110
+ RevokeGrantOption: RevokeGrantOptionProcedurePrivileges,
111
+ },
112
+ ctx.version,
113
+ ) as ProcedureChange[]),
114
+ );
115
+ }
116
+
117
+ for (const procedureId of dropped) {
118
+ changes.push(new DropProcedure({ procedure: main[procedureId] }));
119
+ }
120
+
121
+ for (const procedureId of altered) {
122
+ const mainProcedure = main[procedureId];
123
+ const branchProcedure = branch[procedureId];
124
+
125
+ // Check if non-alterable properties have changed
126
+ // These require dropping and recreating the procedure
127
+ const NON_ALTERABLE_FIELDS: Array<keyof Procedure> = [
128
+ "kind",
129
+ "return_type",
130
+ "return_type_schema",
131
+ "language",
132
+ // The following properties are alterable in SQL, but our generator may choose
133
+ // to replace on changes not covered by explicit ALTER actions. Keep them out here
134
+ // to allow ALTER for those we implement below.
135
+ // security_definer,
136
+ // volatility,
137
+ // parallel_safety,
138
+ // is_strict,
139
+ // leakproof,
140
+ // Returns-set is part of the signature and not alterable
141
+ "returns_set",
142
+ "argument_count",
143
+ "argument_default_count",
144
+ "argument_names",
145
+ "argument_types",
146
+ "all_argument_types",
147
+ "argument_modes",
148
+ "argument_defaults",
149
+ "source_code",
150
+ "binary_path",
151
+ "sql_body",
152
+ // config is alterable via SET/RESET
153
+ ];
154
+ const nonAlterablePropsChanged = hasNonAlterableChanges(
155
+ mainProcedure,
156
+ branchProcedure,
157
+ NON_ALTERABLE_FIELDS,
158
+ {
159
+ argument_names: deepEqual,
160
+ argument_types: deepEqual,
161
+ all_argument_types: deepEqual,
162
+ argument_modes: deepEqual,
163
+ config: deepEqual,
164
+ },
165
+ );
166
+
167
+ if (nonAlterablePropsChanged) {
168
+ // Replace the entire procedure
169
+ changes.push(
170
+ new CreateProcedure({ procedure: branchProcedure, orReplace: true }),
171
+ );
172
+ } else {
173
+ // Only alterable properties changed - check each one
174
+
175
+ // OWNER
176
+ if (mainProcedure.owner !== branchProcedure.owner) {
177
+ changes.push(
178
+ new AlterProcedureChangeOwner({
179
+ procedure: mainProcedure,
180
+ owner: branchProcedure.owner,
181
+ }),
182
+ );
183
+ }
184
+
185
+ // COMMENT
186
+ if (mainProcedure.comment !== branchProcedure.comment) {
187
+ if (branchProcedure.comment === null) {
188
+ changes.push(
189
+ new DropCommentOnProcedure({ procedure: mainProcedure }),
190
+ );
191
+ } else {
192
+ changes.push(
193
+ new CreateCommentOnProcedure({ procedure: branchProcedure }),
194
+ );
195
+ }
196
+ }
197
+
198
+ // SECURITY DEFINER/INVOKER
199
+ if (mainProcedure.security_definer !== branchProcedure.security_definer) {
200
+ changes.push(
201
+ new AlterProcedureSetSecurity({
202
+ procedure: mainProcedure,
203
+ securityDefiner: branchProcedure.security_definer,
204
+ }),
205
+ );
206
+ }
207
+
208
+ // CONFIG SET/RESET
209
+ const toMap = (opts?: string[] | null) => {
210
+ const map = new Map<string, string>();
211
+ for (const opt of opts ?? []) {
212
+ const eq = opt.indexOf("=");
213
+ const key = opt.slice(0, eq).trim();
214
+ const value = opt.slice(eq + 1).trim();
215
+ map.set(key, value);
216
+ }
217
+ return map;
218
+ };
219
+ const mainCfg = toMap(mainProcedure.config);
220
+ const branchCfg = toMap(branchProcedure.config);
221
+ if (branchCfg.size === 0 && mainCfg.size > 0) {
222
+ // Branch has no config at all -> prefer a single RESET ALL
223
+ changes.push(
224
+ new AlterProcedureSetConfig({
225
+ procedure: mainProcedure,
226
+ action: "reset_all",
227
+ }),
228
+ );
229
+ } else {
230
+ for (const [key, oldValue] of mainCfg.entries()) {
231
+ const hasInBranch = branchCfg.has(key);
232
+ const newValue = branchCfg.get(key);
233
+ const changed = hasInBranch ? oldValue !== newValue : true;
234
+ if (changed) {
235
+ changes.push(
236
+ new AlterProcedureSetConfig({
237
+ procedure: mainProcedure,
238
+ action: "reset",
239
+ key,
240
+ }),
241
+ );
242
+ }
243
+ }
244
+ for (const [key, newValue] of branchCfg.entries()) {
245
+ const oldValue = mainCfg.get(key);
246
+ if (oldValue !== newValue) {
247
+ changes.push(
248
+ new AlterProcedureSetConfig({
249
+ procedure: mainProcedure,
250
+ action: "set",
251
+ key,
252
+ value: newValue,
253
+ }),
254
+ );
255
+ }
256
+ }
257
+ }
258
+
259
+ // VOLATILITY
260
+ if (mainProcedure.volatility !== branchProcedure.volatility) {
261
+ changes.push(
262
+ new AlterProcedureSetVolatility({
263
+ procedure: mainProcedure,
264
+ volatility: branchProcedure.volatility,
265
+ }),
266
+ );
267
+ }
268
+
269
+ // STRICTNESS
270
+ if (mainProcedure.is_strict !== branchProcedure.is_strict) {
271
+ changes.push(
272
+ new AlterProcedureSetStrictness({
273
+ procedure: mainProcedure,
274
+ isStrict: branchProcedure.is_strict,
275
+ }),
276
+ );
277
+ }
278
+
279
+ // LEAKPROOF
280
+ if (mainProcedure.leakproof !== branchProcedure.leakproof) {
281
+ changes.push(
282
+ new AlterProcedureSetLeakproof({
283
+ procedure: mainProcedure,
284
+ leakproof: branchProcedure.leakproof,
285
+ }),
286
+ );
287
+ }
288
+
289
+ // PARALLEL
290
+ if (mainProcedure.parallel_safety !== branchProcedure.parallel_safety) {
291
+ changes.push(
292
+ new AlterProcedureSetParallel({
293
+ procedure: mainProcedure,
294
+ parallelSafety: branchProcedure.parallel_safety,
295
+ }),
296
+ );
297
+ }
298
+
299
+ // Note: Procedure renaming would also use ALTER FUNCTION/PROCEDURE ... RENAME TO ...
300
+ // But since our Procedure model uses 'name' as the identity field,
301
+ // a name change would be handled as drop + create by diffObjects()
302
+
303
+ // PRIVILEGES
304
+ // Filter out PUBLIC's built-in default EXECUTE privilege from main catalog
305
+ // (PostgreSQL grants it automatically, so we shouldn't compare it)
306
+ const mainPrivilegesFiltered = filterPublicBuiltInDefaults(
307
+ "procedure",
308
+ mainProcedure.privileges,
309
+ );
310
+ // Filter out PUBLIC's built-in default EXECUTE privilege from branch catalog
311
+ const branchPrivilegesFiltered = filterPublicBuiltInDefaults(
312
+ "procedure",
313
+ branchProcedure.privileges,
314
+ );
315
+ // Filter out owner privileges - owner always has ALL privileges implicitly
316
+ // and shouldn't be compared. Use branch owner as the reference.
317
+ const privilegeResults = diffPrivileges(
318
+ mainPrivilegesFiltered,
319
+ branchPrivilegesFiltered,
320
+ branchProcedure.owner,
321
+ );
322
+
323
+ changes.push(
324
+ ...(emitObjectPrivilegeChanges(
325
+ privilegeResults,
326
+ branchProcedure,
327
+ mainProcedure,
328
+ "procedure",
329
+ {
330
+ Grant: GrantProcedurePrivileges,
331
+ Revoke: RevokeProcedurePrivileges,
332
+ RevokeGrantOption: RevokeGrantOptionProcedurePrivileges,
333
+ },
334
+ ctx.version,
335
+ ) as ProcedureChange[]),
336
+ );
337
+ }
338
+ }
339
+
340
+ return changes;
341
+ }