@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 {
3
4
  ForeignDataWrapper,
4
5
  type ForeignDataWrapperProps,
@@ -10,7 +11,7 @@ import {
10
11
 
11
12
  describe.concurrent("foreign-data-wrapper", () => {
12
13
  describe("alter", () => {
13
- test("change owner", () => {
14
+ test("change owner", async () => {
14
15
  const props: ForeignDataWrapperProps = {
15
16
  name: "test_fdw",
16
17
  owner: "old_owner",
@@ -26,12 +27,14 @@ describe.concurrent("foreign-data-wrapper", () => {
26
27
  owner: "new_owner",
27
28
  });
28
29
 
30
+ await assertValidSql(change.serialize());
31
+
29
32
  expect(change.serialize()).toBe(
30
33
  "ALTER FOREIGN DATA WRAPPER test_fdw OWNER TO new_owner",
31
34
  );
32
35
  });
33
36
 
34
- test("set options ADD", () => {
37
+ test("set options ADD", async () => {
35
38
  const props: ForeignDataWrapperProps = {
36
39
  name: "test_fdw",
37
40
  owner: "test",
@@ -50,12 +53,14 @@ describe.concurrent("foreign-data-wrapper", () => {
50
53
  ],
51
54
  });
52
55
 
56
+ await assertValidSql(change.serialize());
57
+
53
58
  expect(change.serialize()).toBe(
54
59
  "ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD host 'localhost', ADD port '5432')",
55
60
  );
56
61
  });
57
62
 
58
- test("set options SET", () => {
63
+ test("set options SET", async () => {
59
64
  const props: ForeignDataWrapperProps = {
60
65
  name: "test_fdw",
61
66
  owner: "test",
@@ -71,12 +76,14 @@ describe.concurrent("foreign-data-wrapper", () => {
71
76
  options: [{ action: "SET", option: "host", value: "newhost" }],
72
77
  });
73
78
 
79
+ await assertValidSql(change.serialize());
80
+
74
81
  expect(change.serialize()).toBe(
75
82
  "ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (SET host 'newhost')",
76
83
  );
77
84
  });
78
85
 
79
- test("set options DROP", () => {
86
+ test("set options DROP", async () => {
80
87
  const props: ForeignDataWrapperProps = {
81
88
  name: "test_fdw",
82
89
  owner: "test",
@@ -92,12 +99,14 @@ describe.concurrent("foreign-data-wrapper", () => {
92
99
  options: [{ action: "DROP", option: "host" }],
93
100
  });
94
101
 
102
+ await assertValidSql(change.serialize());
103
+
95
104
  expect(change.serialize()).toBe(
96
105
  "ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (DROP host)",
97
106
  );
98
107
  });
99
108
 
100
- test("set options mixed ADD/SET/DROP", () => {
109
+ test("set options mixed ADD/SET/DROP", async () => {
101
110
  const props: ForeignDataWrapperProps = {
102
111
  name: "test_fdw",
103
112
  owner: "test",
@@ -117,6 +126,8 @@ describe.concurrent("foreign-data-wrapper", () => {
117
126
  ],
118
127
  });
119
128
 
129
+ await assertValidSql(change.serialize());
130
+
120
131
  expect(change.serialize()).toBe(
121
132
  "ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
122
133
  );
@@ -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 { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
3
4
  import { CreateForeignDataWrapper } from "./foreign-data-wrapper.create.ts";
4
5
 
5
6
  describe("foreign-data-wrapper", () => {
6
- test("create basic", () => {
7
+ test("create basic", async () => {
7
8
  const fdw = new ForeignDataWrapper({
8
9
  name: "test_fdw",
9
10
  owner: "test",
@@ -18,16 +19,18 @@ describe("foreign-data-wrapper", () => {
18
19
  foreignDataWrapper: fdw,
19
20
  });
20
21
 
22
+ await assertValidSql(change.serialize());
23
+
21
24
  expect(change.serialize()).toBe(
22
25
  "CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER NO VALIDATOR",
23
26
  );
24
27
  });
25
28
 
26
- test("create with handler", () => {
29
+ test("create with handler", async () => {
27
30
  const fdw = new ForeignDataWrapper({
28
31
  name: "test_fdw",
29
32
  owner: "test",
30
- handler: "public.handler_func()",
33
+ handler: "public.handler_func",
31
34
  validator: null,
32
35
  options: null,
33
36
  comment: null,
@@ -38,17 +41,19 @@ describe("foreign-data-wrapper", () => {
38
41
  foreignDataWrapper: fdw,
39
42
  });
40
43
 
44
+ await assertValidSql(change.serialize());
45
+
41
46
  expect(change.serialize()).toBe(
42
- "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func() NO VALIDATOR",
47
+ "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func NO VALIDATOR",
43
48
  );
44
49
  });
45
50
 
46
- test("create with validator", () => {
51
+ test("create with validator", async () => {
47
52
  const fdw = new ForeignDataWrapper({
48
53
  name: "test_fdw",
49
54
  owner: "test",
50
55
  handler: null,
51
- validator: "public.validator_func()",
56
+ validator: "public.validator_func",
52
57
  options: null,
53
58
  comment: null,
54
59
  privileges: [],
@@ -58,17 +63,19 @@ describe("foreign-data-wrapper", () => {
58
63
  foreignDataWrapper: fdw,
59
64
  });
60
65
 
66
+ await assertValidSql(change.serialize());
67
+
61
68
  expect(change.serialize()).toBe(
62
- "CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER VALIDATOR public.validator_func()",
69
+ "CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER VALIDATOR public.validator_func",
63
70
  );
64
71
  });
65
72
 
66
- test("create with handler and validator", () => {
73
+ test("create with handler and validator", async () => {
67
74
  const fdw = new ForeignDataWrapper({
68
75
  name: "test_fdw",
69
76
  owner: "test",
70
- handler: "public.handler_func()",
71
- validator: "public.validator_func()",
77
+ handler: "public.handler_func",
78
+ validator: "public.validator_func",
72
79
  options: null,
73
80
  comment: null,
74
81
  privileges: [],
@@ -78,12 +85,14 @@ describe("foreign-data-wrapper", () => {
78
85
  foreignDataWrapper: fdw,
79
86
  });
80
87
 
88
+ await assertValidSql(change.serialize());
89
+
81
90
  expect(change.serialize()).toBe(
82
- "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func() VALIDATOR public.validator_func()",
91
+ "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func VALIDATOR public.validator_func",
83
92
  );
84
93
  });
85
94
 
86
- test("create with options", () => {
95
+ test("create with options", async () => {
87
96
  const fdw = new ForeignDataWrapper({
88
97
  name: "test_fdw",
89
98
  owner: "test",
@@ -98,17 +107,19 @@ describe("foreign-data-wrapper", () => {
98
107
  foreignDataWrapper: fdw,
99
108
  });
100
109
 
110
+ await assertValidSql(change.serialize());
111
+
101
112
  expect(change.serialize()).toBe(
102
113
  "CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER NO VALIDATOR OPTIONS (host 'localhost', port '5432')",
103
114
  );
104
115
  });
105
116
 
106
- test("create with all properties", () => {
117
+ test("create with all properties", async () => {
107
118
  const fdw = new ForeignDataWrapper({
108
119
  name: "test_fdw",
109
120
  owner: "test",
110
- handler: "public.handler_func()",
111
- validator: "public.validator_func()",
121
+ handler: "public.handler_func",
122
+ validator: "public.validator_func",
112
123
  options: ["host", "localhost", "port", "5432"],
113
124
  comment: null,
114
125
  privileges: [],
@@ -118,8 +129,32 @@ describe("foreign-data-wrapper", () => {
118
129
  foreignDataWrapper: fdw,
119
130
  });
120
131
 
132
+ await assertValidSql(change.serialize());
133
+
134
+ expect(change.serialize()).toBe(
135
+ "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func VALIDATOR public.validator_func OPTIONS (host 'localhost', port '5432')",
136
+ );
137
+ });
138
+
139
+ test("create with schema-qualified handler (no function args in output)", async () => {
140
+ const fdw = new ForeignDataWrapper({
141
+ name: "test_fdw",
142
+ owner: "test",
143
+ handler: "extensions.iceberg_fdw_handler",
144
+ validator: "extensions.iceberg_fdw_validator",
145
+ options: null,
146
+ comment: null,
147
+ privileges: [],
148
+ });
149
+
150
+ const change = new CreateForeignDataWrapper({
151
+ foreignDataWrapper: fdw,
152
+ });
153
+
154
+ await assertValidSql(change.serialize());
155
+
121
156
  expect(change.serialize()).toBe(
122
- "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func() VALIDATOR public.validator_func() OPTIONS (host 'localhost', port '5432')",
157
+ "CREATE FOREIGN DATA WRAPPER test_fdw HANDLER extensions.iceberg_fdw_handler VALIDATOR extensions.iceberg_fdw_validator",
123
158
  );
124
159
  });
125
160
  });
@@ -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 { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
3
4
  import { DropForeignDataWrapper } from "./foreign-data-wrapper.drop.ts";
4
5
 
5
6
  describe("foreign-data-wrapper", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const fdw = new ForeignDataWrapper({
8
9
  name: "test_fdw",
9
10
  owner: "test",
@@ -18,6 +19,8 @@ describe("foreign-data-wrapper", () => {
18
19
  foreignDataWrapper: fdw,
19
20
  });
20
21
 
22
+ await assertValidSql(change.serialize());
23
+
21
24
  expect(change.serialize()).toBe("DROP FOREIGN DATA WRAPPER test_fdw");
22
25
  });
23
26
  });
@@ -4,8 +4,17 @@ import {
4
4
  AlterForeignDataWrapperChangeOwner,
5
5
  AlterForeignDataWrapperSetOptions,
6
6
  } from "./changes/foreign-data-wrapper.alter.ts";
7
+ import {
8
+ CreateCommentOnForeignDataWrapper,
9
+ DropCommentOnForeignDataWrapper,
10
+ } from "./changes/foreign-data-wrapper.comment.ts";
7
11
  import { CreateForeignDataWrapper } from "./changes/foreign-data-wrapper.create.ts";
8
12
  import { DropForeignDataWrapper } from "./changes/foreign-data-wrapper.drop.ts";
13
+ import {
14
+ GrantForeignDataWrapperPrivileges,
15
+ RevokeForeignDataWrapperPrivileges,
16
+ RevokeGrantOptionForeignDataWrapperPrivileges,
17
+ } from "./changes/foreign-data-wrapper.privilege.ts";
9
18
  import { diffForeignDataWrappers } from "./foreign-data-wrapper.diff.ts";
10
19
  import {
11
20
  ForeignDataWrapper,
@@ -117,7 +126,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
117
126
  const main = new ForeignDataWrapper({
118
127
  name: "fdw1",
119
128
  owner: "o1",
120
- handler: "public.old_handler()",
129
+ handler: "public.old_handler",
121
130
  validator: null,
122
131
  options: null,
123
132
  comment: null,
@@ -126,7 +135,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
126
135
  const branch = new ForeignDataWrapper({
127
136
  name: "fdw1",
128
137
  owner: "o1",
129
- handler: "public.new_handler()",
138
+ handler: "public.new_handler",
130
139
  validator: null,
131
140
  options: null,
132
141
  comment: null,
@@ -150,7 +159,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
150
159
  name: "fdw1",
151
160
  owner: "o1",
152
161
  handler: null,
153
- validator: "public.old_validator()",
162
+ validator: "public.old_validator",
154
163
  options: null,
155
164
  comment: null,
156
165
  privileges: [],
@@ -159,7 +168,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
159
168
  name: "fdw1",
160
169
  owner: "o1",
161
170
  handler: null,
162
- validator: "public.new_validator()",
171
+ validator: "public.new_validator",
163
172
  options: null,
164
173
  comment: null,
165
174
  privileges: [],
@@ -176,4 +185,102 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
176
185
  true,
177
186
  );
178
187
  });
188
+
189
+ test("created with privileges emits grant", () => {
190
+ const fdw = new ForeignDataWrapper({
191
+ name: "fdw1",
192
+ owner: "o1",
193
+ handler: null,
194
+ validator: null,
195
+ options: null,
196
+ comment: null,
197
+ privileges: [
198
+ { grantee: "role_usage", privilege: "USAGE", grantable: false },
199
+ ],
200
+ });
201
+ const changes = diffForeignDataWrappers(
202
+ testContext,
203
+ {},
204
+ { [fdw.stableId]: fdw },
205
+ );
206
+ expect(changes[0]).toBeInstanceOf(CreateForeignDataWrapper);
207
+ expect(
208
+ changes.some((c) => c instanceof GrantForeignDataWrapperPrivileges),
209
+ ).toBe(true);
210
+ });
211
+
212
+ test("altered comment emits create/drop comment", () => {
213
+ const base: ForeignDataWrapperProps = {
214
+ name: "fdw1",
215
+ owner: "o1",
216
+ handler: null,
217
+ validator: null,
218
+ options: null,
219
+ comment: null,
220
+ privileges: [],
221
+ };
222
+ const main = new ForeignDataWrapper(base);
223
+ const withComment = new ForeignDataWrapper({
224
+ ...base,
225
+ comment: "my fdw",
226
+ });
227
+
228
+ const addComment = diffForeignDataWrappers(
229
+ testContext,
230
+ { [main.stableId]: main },
231
+ { [withComment.stableId]: withComment },
232
+ );
233
+ expect(addComment[0]).toBeInstanceOf(CreateCommentOnForeignDataWrapper);
234
+
235
+ const dropComment = diffForeignDataWrappers(
236
+ testContext,
237
+ { [withComment.stableId]: withComment },
238
+ { [main.stableId]: main },
239
+ );
240
+ expect(dropComment[0]).toBeInstanceOf(DropCommentOnForeignDataWrapper);
241
+ });
242
+
243
+ test("altered privileges emit grant, revoke, and revoke grant option", () => {
244
+ const base: ForeignDataWrapperProps = {
245
+ name: "fdw1",
246
+ owner: "o1",
247
+ handler: null,
248
+ validator: null,
249
+ options: null,
250
+ comment: null,
251
+ privileges: [],
252
+ };
253
+ const main = new ForeignDataWrapper({
254
+ ...base,
255
+ privileges: [
256
+ { grantee: "role_usage", privilege: "USAGE", grantable: false },
257
+ { grantee: "role_with_option", privilege: "USAGE", grantable: true },
258
+ { grantee: "role_removed", privilege: "USAGE", grantable: false },
259
+ ],
260
+ });
261
+ const branch = new ForeignDataWrapper({
262
+ ...base,
263
+ privileges: [
264
+ { grantee: "role_usage", privilege: "USAGE", grantable: true },
265
+ { grantee: "role_with_option", privilege: "USAGE", grantable: false },
266
+ { grantee: "role_new", privilege: "USAGE", grantable: false },
267
+ ],
268
+ });
269
+ const changes = diffForeignDataWrappers(
270
+ testContext,
271
+ { [main.stableId]: main },
272
+ { [branch.stableId]: branch },
273
+ );
274
+ expect(
275
+ changes.some((c) => c instanceof GrantForeignDataWrapperPrivileges),
276
+ ).toBe(true);
277
+ expect(
278
+ changes.some((c) => c instanceof RevokeForeignDataWrapperPrivileges),
279
+ ).toBe(true);
280
+ expect(
281
+ changes.some(
282
+ (c) => c instanceof RevokeGrantOptionForeignDataWrapperPrivileges,
283
+ ),
284
+ ).toBe(true);
285
+ });
179
286
  });
@@ -1,11 +1,10 @@
1
- import type { DefaultPrivilegeState } from "../../base.default-privileges.ts";
2
1
  import { diffObjects } from "../../base.diff.ts";
3
2
  import {
4
3
  diffPrivileges,
4
+ emitObjectPrivilegeChanges,
5
5
  filterPublicBuiltInDefaults,
6
- groupPrivilegesByGrantable,
7
6
  } from "../../base.privilege-diff.ts";
8
- import type { Role } from "../../role/role.model.ts";
7
+ import type { ObjectDiffContext } from "../../diff-context.ts";
9
8
  import {
10
9
  AlterForeignDataWrapperChangeOwner,
11
10
  AlterForeignDataWrapperSetOptions,
@@ -33,12 +32,7 @@ import type { ForeignDataWrapper } from "./foreign-data-wrapper.model.ts";
33
32
  * @returns A list of changes to apply to main to make it match branch.
34
33
  */
35
34
  export function diffForeignDataWrappers(
36
- ctx: {
37
- version: number;
38
- currentUser: string;
39
- defaultPrivilegeState: DefaultPrivilegeState;
40
- mainRoles: Record<string, Role>;
41
- },
35
+ ctx: Pick<ObjectDiffContext, "version" | "currentUser">,
42
36
  main: Record<string, ForeignDataWrapper>,
43
37
  branch: Record<string, ForeignDataWrapper>,
44
38
  ): ForeignDataWrapperChange[] {
@@ -87,54 +81,22 @@ export function diffForeignDataWrappers(
87
81
  effectiveDefaults,
88
82
  desiredPrivileges,
89
83
  createdFdw.owner,
90
- ctx.mainRoles,
91
84
  );
92
85
 
93
- // Generate grant changes
94
- for (const [grantee, result] of privilegeResults) {
95
- if (result.grants.length > 0) {
96
- const grantGroups = groupPrivilegesByGrantable(result.grants);
97
- for (const [grantable, list] of grantGroups) {
98
- void grantable;
99
- changes.push(
100
- new GrantForeignDataWrapperPrivileges({
101
- foreignDataWrapper: createdFdw,
102
- grantee,
103
- privileges: list,
104
- version: ctx.version,
105
- }),
106
- );
107
- }
108
- }
109
-
110
- // Generate revoke changes
111
- if (result.revokes.length > 0) {
112
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
113
- for (const [grantable, list] of revokeGroups) {
114
- void grantable;
115
- changes.push(
116
- new RevokeForeignDataWrapperPrivileges({
117
- foreignDataWrapper: createdFdw,
118
- grantee,
119
- privileges: list,
120
- version: ctx.version,
121
- }),
122
- );
123
- }
124
- }
125
-
126
- // Generate revoke grant option changes
127
- if (result.revokeGrantOption.length > 0) {
128
- changes.push(
129
- new RevokeGrantOptionForeignDataWrapperPrivileges({
130
- foreignDataWrapper: createdFdw,
131
- grantee,
132
- privilegeNames: result.revokeGrantOption,
133
- version: ctx.version,
134
- }),
135
- );
136
- }
137
- }
86
+ changes.push(
87
+ ...(emitObjectPrivilegeChanges(
88
+ privilegeResults,
89
+ createdFdw,
90
+ createdFdw,
91
+ "foreignDataWrapper",
92
+ {
93
+ Grant: GrantForeignDataWrapperPrivileges,
94
+ Revoke: RevokeForeignDataWrapperPrivileges,
95
+ RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
96
+ },
97
+ ctx.version,
98
+ ) as ForeignDataWrapperChange[]),
99
+ );
138
100
  }
139
101
 
140
102
  for (const fdwId of dropped) {
@@ -228,54 +190,22 @@ export function diffForeignDataWrappers(
228
190
  mainPrivilegesFiltered,
229
191
  branchPrivilegesFiltered,
230
192
  branchFdw.owner,
231
- ctx.mainRoles,
232
193
  );
233
194
 
234
- for (const [grantee, result] of privilegeResults) {
235
- // Generate grant changes
236
- if (result.grants.length > 0) {
237
- const grantGroups = groupPrivilegesByGrantable(result.grants);
238
- for (const [grantable, list] of grantGroups) {
239
- void grantable;
240
- changes.push(
241
- new GrantForeignDataWrapperPrivileges({
242
- foreignDataWrapper: branchFdw,
243
- grantee,
244
- privileges: list,
245
- version: ctx.version,
246
- }),
247
- );
248
- }
249
- }
250
-
251
- // Generate revoke changes
252
- if (result.revokes.length > 0) {
253
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
254
- for (const [grantable, list] of revokeGroups) {
255
- void grantable;
256
- changes.push(
257
- new RevokeForeignDataWrapperPrivileges({
258
- foreignDataWrapper: mainFdw,
259
- grantee,
260
- privileges: list,
261
- version: ctx.version,
262
- }),
263
- );
264
- }
265
- }
266
-
267
- // Generate revoke grant option changes
268
- if (result.revokeGrantOption.length > 0) {
269
- changes.push(
270
- new RevokeGrantOptionForeignDataWrapperPrivileges({
271
- foreignDataWrapper: mainFdw,
272
- grantee,
273
- privilegeNames: result.revokeGrantOption,
274
- version: ctx.version,
275
- }),
276
- );
277
- }
278
- }
195
+ changes.push(
196
+ ...(emitObjectPrivilegeChanges(
197
+ privilegeResults,
198
+ branchFdw,
199
+ mainFdw,
200
+ "foreignDataWrapper",
201
+ {
202
+ Grant: GrantForeignDataWrapperPrivileges,
203
+ Revoke: RevokeForeignDataWrapperPrivileges,
204
+ RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
205
+ },
206
+ ctx.version,
207
+ ) as ForeignDataWrapperChange[]),
208
+ );
279
209
 
280
210
  // Note: FDW renaming would also use ALTER FOREIGN DATA WRAPPER ... RENAME TO ...
281
211
  // But since our ForeignDataWrapper model uses 'name' as the identity field,
@@ -93,11 +93,11 @@ export async function extractForeignDataWrappers(
93
93
  fdw.fdwowner::regrole::text as owner,
94
94
  case
95
95
  when fdw.fdwhandler = 0 then null
96
- else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname) || '(' || pg_get_function_identity_arguments(fdw.fdwhandler) || ')'
96
+ else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname)
97
97
  end as handler,
98
98
  case
99
99
  when fdw.fdwvalidator = 0 then null
100
- else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname) || '(' || pg_get_function_identity_arguments(fdw.fdwvalidator) || ')'
100
+ else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname)
101
101
  end as validator,
102
102
  coalesce(fdw.fdwoptions, array[]::text[]) as options,
103
103
  obj_description(fdw.oid, 'pg_foreign_data_wrapper') as comment,