@supabase/pg-delta 0.0.0 → 1.0.0-alpha.0

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 (567) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/cli/app.d.ts +1 -0
  4. package/dist/cli/app.js +26 -0
  5. package/dist/cli/bin/cli.d.ts +2 -0
  6. package/dist/cli/bin/cli.js +7 -0
  7. package/dist/cli/commands/apply.d.ts +5 -0
  8. package/dist/cli/commands/apply.js +85 -0
  9. package/dist/cli/commands/plan.d.ts +5 -0
  10. package/dist/cli/commands/plan.js +137 -0
  11. package/dist/cli/commands/sync.d.ts +5 -0
  12. package/dist/cli/commands/sync.js +141 -0
  13. package/dist/cli/formatters/index.d.ts +4 -0
  14. package/dist/cli/formatters/index.js +4 -0
  15. package/dist/cli/formatters/tree/tree-builder.d.ts +10 -0
  16. package/dist/cli/formatters/tree/tree-builder.js +333 -0
  17. package/dist/cli/formatters/tree/tree-renderer.d.ts +45 -0
  18. package/dist/cli/formatters/tree/tree-renderer.js +303 -0
  19. package/dist/cli/formatters/tree/tree.d.ts +8 -0
  20. package/dist/cli/formatters/tree/tree.js +161 -0
  21. package/dist/cli/utils/integrations.d.ts +13 -0
  22. package/dist/cli/utils/integrations.js +35 -0
  23. package/dist/cli/utils.d.ts +64 -0
  24. package/dist/cli/utils.js +160 -0
  25. package/dist/core/catalog.diff.d.ts +5 -0
  26. package/dist/core/catalog.diff.js +147 -0
  27. package/dist/core/catalog.model.d.ts +93 -0
  28. package/dist/core/catalog.model.js +254 -0
  29. package/dist/core/change.types.d.ts +22 -0
  30. package/dist/core/change.types.js +1 -0
  31. package/dist/core/context.d.ts +11 -0
  32. package/dist/core/context.js +12 -0
  33. package/dist/core/depend.d.ts +31 -0
  34. package/dist/core/depend.js +1833 -0
  35. package/dist/core/expand-replace-dependencies.d.ts +14 -0
  36. package/dist/core/expand-replace-dependencies.js +280 -0
  37. package/dist/core/fingerprint.d.ts +23 -0
  38. package/dist/core/fingerprint.js +174 -0
  39. package/dist/core/index.d.ts +15 -0
  40. package/dist/core/index.js +14 -0
  41. package/dist/core/integrations/filter/dsl.d.ts +97 -0
  42. package/dist/core/integrations/filter/dsl.js +107 -0
  43. package/dist/core/integrations/filter/extractors.d.ts +12 -0
  44. package/dist/core/integrations/filter/extractors.js +136 -0
  45. package/dist/core/integrations/integration-dsl.d.ts +22 -0
  46. package/dist/core/integrations/integration-dsl.js +6 -0
  47. package/dist/core/integrations/integration.types.d.ts +5 -0
  48. package/dist/core/integrations/integration.types.js +1 -0
  49. package/dist/core/integrations/serialize/dsl.d.ts +58 -0
  50. package/dist/core/integrations/serialize/dsl.js +42 -0
  51. package/dist/core/main.d.ts +5 -0
  52. package/dist/core/main.js +44 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +10 -0
  54. package/dist/core/objects/aggregate/aggregate.diff.js +186 -0
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +174 -0
  56. package/dist/core/objects/aggregate/aggregate.model.js +297 -0
  57. package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +19 -0
  58. package/dist/core/objects/aggregate/changes/aggregate.alter.js +25 -0
  59. package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +17 -0
  60. package/dist/core/objects/aggregate/changes/aggregate.base.js +13 -0
  61. package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +23 -0
  62. package/dist/core/objects/aggregate/changes/aggregate.comment.js +44 -0
  63. package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +19 -0
  64. package/dist/core/objects/aggregate/changes/aggregate.create.js +228 -0
  65. package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +17 -0
  66. package/dist/core/objects/aggregate/changes/aggregate.drop.js +26 -0
  67. package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +62 -0
  68. package/dist/core/objects/aggregate/changes/aggregate.privilege.js +102 -0
  69. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +6 -0
  70. package/dist/core/objects/aggregate/changes/aggregate.types.js +1 -0
  71. package/dist/core/objects/base.change.d.ts +46 -0
  72. package/dist/core/objects/base.change.js +38 -0
  73. package/dist/core/objects/base.default-privileges.d.ts +29 -0
  74. package/dist/core/objects/base.default-privileges.js +167 -0
  75. package/dist/core/objects/base.diff.d.ts +6 -0
  76. package/dist/core/objects/base.diff.js +12 -0
  77. package/dist/core/objects/base.model.d.ts +74 -0
  78. package/dist/core/objects/base.model.js +47 -0
  79. package/dist/core/objects/base.privilege-diff.d.ts +54 -0
  80. package/dist/core/objects/base.privilege-diff.js +216 -0
  81. package/dist/core/objects/base.privilege.d.ts +27 -0
  82. package/dist/core/objects/base.privilege.js +169 -0
  83. package/dist/core/objects/collation/changes/collation.alter.d.ts +45 -0
  84. package/dist/core/objects/collation/changes/collation.alter.js +52 -0
  85. package/dist/core/objects/collation/changes/collation.base.d.ts +17 -0
  86. package/dist/core/objects/collation/changes/collation.base.js +13 -0
  87. package/dist/core/objects/collation/changes/collation.comment.d.ts +26 -0
  88. package/dist/core/objects/collation/changes/collation.comment.js +50 -0
  89. package/dist/core/objects/collation/changes/collation.create.d.ts +32 -0
  90. package/dist/core/objects/collation/changes/collation.create.js +86 -0
  91. package/dist/core/objects/collation/changes/collation.drop.d.ts +22 -0
  92. package/dist/core/objects/collation/changes/collation.drop.js +31 -0
  93. package/dist/core/objects/collation/changes/collation.types.d.ts +5 -0
  94. package/dist/core/objects/collation/changes/collation.types.js +1 -0
  95. package/dist/core/objects/collation/collation.diff.d.ts +13 -0
  96. package/dist/core/objects/collation/collation.diff.js +85 -0
  97. package/dist/core/objects/collation/collation.model.d.ts +67 -0
  98. package/dist/core/objects/collation/collation.model.js +207 -0
  99. package/dist/core/objects/domain/changes/domain.alter.d.ts +143 -0
  100. package/dist/core/objects/domain/changes/domain.alter.js +191 -0
  101. package/dist/core/objects/domain/changes/domain.base.d.ts +17 -0
  102. package/dist/core/objects/domain/changes/domain.base.js +13 -0
  103. package/dist/core/objects/domain/changes/domain.comment.d.ts +25 -0
  104. package/dist/core/objects/domain/changes/domain.comment.js +47 -0
  105. package/dist/core/objects/domain/changes/domain.create.d.ts +30 -0
  106. package/dist/core/objects/domain/changes/domain.create.js +92 -0
  107. package/dist/core/objects/domain/changes/domain.drop.d.ts +22 -0
  108. package/dist/core/objects/domain/changes/domain.drop.js +28 -0
  109. package/dist/core/objects/domain/changes/domain.privilege.d.ts +97 -0
  110. package/dist/core/objects/domain/changes/domain.privilege.js +127 -0
  111. package/dist/core/objects/domain/changes/domain.types.d.ts +6 -0
  112. package/dist/core/objects/domain/changes/domain.types.js +1 -0
  113. package/dist/core/objects/domain/domain.diff.d.ts +18 -0
  114. package/dist/core/objects/domain/domain.diff.js +244 -0
  115. package/dist/core/objects/domain/domain.model.d.ts +103 -0
  116. package/dist/core/objects/domain/domain.model.js +172 -0
  117. package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +44 -0
  118. package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +51 -0
  119. package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +17 -0
  120. package/dist/core/objects/event-trigger/changes/event-trigger.base.js +13 -0
  121. package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +23 -0
  122. package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +46 -0
  123. package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +25 -0
  124. package/dist/core/objects/event-trigger/changes/event-trigger.create.js +55 -0
  125. package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +22 -0
  126. package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +28 -0
  127. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +5 -0
  128. package/dist/core/objects/event-trigger/changes/event-trigger.types.js +1 -0
  129. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +13 -0
  130. package/dist/core/objects/event-trigger/event-trigger.diff.js +81 -0
  131. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +45 -0
  132. package/dist/core/objects/event-trigger/event-trigger.model.js +89 -0
  133. package/dist/core/objects/extension/changes/extension.alter.d.ts +44 -0
  134. package/dist/core/objects/extension/changes/extension.alter.js +51 -0
  135. package/dist/core/objects/extension/changes/extension.base.d.ts +17 -0
  136. package/dist/core/objects/extension/changes/extension.base.js +13 -0
  137. package/dist/core/objects/extension/changes/extension.comment.d.ts +26 -0
  138. package/dist/core/objects/extension/changes/extension.comment.js +46 -0
  139. package/dist/core/objects/extension/changes/extension.create.d.ts +25 -0
  140. package/dist/core/objects/extension/changes/extension.create.js +49 -0
  141. package/dist/core/objects/extension/changes/extension.drop.d.ts +22 -0
  142. package/dist/core/objects/extension/changes/extension.drop.js +28 -0
  143. package/dist/core/objects/extension/changes/extension.types.d.ts +5 -0
  144. package/dist/core/objects/extension/changes/extension.types.js +1 -0
  145. package/dist/core/objects/extension/extension.diff.d.ts +10 -0
  146. package/dist/core/objects/extension/extension.diff.js +65 -0
  147. package/dist/core/objects/extension/extension.model.d.ts +52 -0
  148. package/dist/core/objects/extension/extension.model.js +268 -0
  149. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +51 -0
  150. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +61 -0
  151. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.d.ts +17 -0
  152. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.js +13 -0
  153. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +26 -0
  154. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +50 -0
  155. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +25 -0
  156. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +78 -0
  157. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +22 -0
  158. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +28 -0
  159. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +97 -0
  160. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +123 -0
  161. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +6 -0
  162. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.js +1 -0
  163. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +18 -0
  164. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +221 -0
  165. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +59 -0
  166. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +128 -0
  167. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +5 -0
  168. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.js +1 -0
  169. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +163 -0
  170. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +248 -0
  171. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +17 -0
  172. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.js +13 -0
  173. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +26 -0
  174. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +50 -0
  175. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +25 -0
  176. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +64 -0
  177. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +22 -0
  178. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +31 -0
  179. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +97 -0
  180. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +129 -0
  181. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +6 -0
  182. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.js +1 -0
  183. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +18 -0
  184. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +268 -0
  185. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +117 -0
  186. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +215 -0
  187. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +65 -0
  188. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +84 -0
  189. package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.d.ts +17 -0
  190. package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.js +13 -0
  191. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +26 -0
  192. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +43 -0
  193. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +24 -0
  194. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +62 -0
  195. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +22 -0
  196. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +28 -0
  197. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +97 -0
  198. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +123 -0
  199. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +6 -0
  200. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.js +1 -0
  201. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +18 -0
  202. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +209 -0
  203. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +62 -0
  204. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +118 -0
  205. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +37 -0
  206. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +38 -0
  207. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.d.ts +17 -0
  208. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.js +13 -0
  209. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +24 -0
  210. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +52 -0
  211. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +23 -0
  212. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +34 -0
  213. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +4 -0
  214. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.js +1 -0
  215. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.d.ts +10 -0
  216. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.js +77 -0
  217. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +36 -0
  218. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +85 -0
  219. package/dist/core/objects/index/changes/index.alter.d.ts +76 -0
  220. package/dist/core/objects/index/changes/index.alter.js +94 -0
  221. package/dist/core/objects/index/changes/index.base.d.ts +17 -0
  222. package/dist/core/objects/index/changes/index.base.js +13 -0
  223. package/dist/core/objects/index/changes/index.comment.d.ts +26 -0
  224. package/dist/core/objects/index/changes/index.comment.js +50 -0
  225. package/dist/core/objects/index/changes/index.create.d.ts +30 -0
  226. package/dist/core/objects/index/changes/index.create.js +53 -0
  227. package/dist/core/objects/index/changes/index.drop.d.ts +22 -0
  228. package/dist/core/objects/index/changes/index.drop.js +28 -0
  229. package/dist/core/objects/index/changes/index.types.d.ts +5 -0
  230. package/dist/core/objects/index/changes/index.types.js +1 -0
  231. package/dist/core/objects/index/changes/utils.d.ts +3 -0
  232. package/dist/core/objects/index/changes/utils.js +6 -0
  233. package/dist/core/objects/index/index.diff.d.ts +12 -0
  234. package/dist/core/objects/index/index.diff.js +182 -0
  235. package/dist/core/objects/index/index.model.d.ts +150 -0
  236. package/dist/core/objects/index/index.model.js +340 -0
  237. package/dist/core/objects/language/changes/language.alter.d.ts +32 -0
  238. package/dist/core/objects/language/changes/language.alter.js +30 -0
  239. package/dist/core/objects/language/changes/language.base.d.ts +17 -0
  240. package/dist/core/objects/language/changes/language.base.js +13 -0
  241. package/dist/core/objects/language/changes/language.comment.d.ts +26 -0
  242. package/dist/core/objects/language/changes/language.comment.js +45 -0
  243. package/dist/core/objects/language/changes/language.create.d.ts +25 -0
  244. package/dist/core/objects/language/changes/language.create.js +76 -0
  245. package/dist/core/objects/language/changes/language.drop.d.ts +22 -0
  246. package/dist/core/objects/language/changes/language.drop.js +31 -0
  247. package/dist/core/objects/language/changes/language.privilege.d.ts +97 -0
  248. package/dist/core/objects/language/changes/language.privilege.js +128 -0
  249. package/dist/core/objects/language/changes/language.types.d.ts +6 -0
  250. package/dist/core/objects/language/changes/language.types.js +1 -0
  251. package/dist/core/objects/language/language.diff.d.ts +15 -0
  252. package/dist/core/objects/language/language.diff.js +117 -0
  253. package/dist/core/objects/language/language.model.d.ts +62 -0
  254. package/dist/core/objects/language/language.model.js +128 -0
  255. package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +67 -0
  256. package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +63 -0
  257. package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +17 -0
  258. package/dist/core/objects/materialized-view/changes/materialized-view.base.js +13 -0
  259. package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +53 -0
  260. package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +112 -0
  261. package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +35 -0
  262. package/dist/core/objects/materialized-view/changes/materialized-view.create.js +71 -0
  263. package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +26 -0
  264. package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +42 -0
  265. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +105 -0
  266. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +151 -0
  267. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +6 -0
  268. package/dist/core/objects/materialized-view/changes/materialized-view.types.js +1 -0
  269. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +18 -0
  270. package/dist/core/objects/materialized-view/materialized-view.diff.js +335 -0
  271. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +152 -0
  272. package/dist/core/objects/materialized-view/materialized-view.model.js +228 -0
  273. package/dist/core/objects/procedure/changes/procedure.alter.d.ts +143 -0
  274. package/dist/core/objects/procedure/changes/procedure.alter.js +207 -0
  275. package/dist/core/objects/procedure/changes/procedure.base.d.ts +17 -0
  276. package/dist/core/objects/procedure/changes/procedure.base.js +13 -0
  277. package/dist/core/objects/procedure/changes/procedure.comment.d.ts +26 -0
  278. package/dist/core/objects/procedure/changes/procedure.comment.js +52 -0
  279. package/dist/core/objects/procedure/changes/procedure.create.d.ts +42 -0
  280. package/dist/core/objects/procedure/changes/procedure.create.js +77 -0
  281. package/dist/core/objects/procedure/changes/procedure.drop.d.ts +23 -0
  282. package/dist/core/objects/procedure/changes/procedure.drop.js +37 -0
  283. package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +98 -0
  284. package/dist/core/objects/procedure/changes/procedure.privilege.js +144 -0
  285. package/dist/core/objects/procedure/changes/procedure.types.d.ts +6 -0
  286. package/dist/core/objects/procedure/changes/procedure.types.js +1 -0
  287. package/dist/core/objects/procedure/procedure.diff.d.ts +18 -0
  288. package/dist/core/objects/procedure/procedure.diff.js +282 -0
  289. package/dist/core/objects/procedure/procedure.model.d.ts +132 -0
  290. package/dist/core/objects/procedure/procedure.model.js +244 -0
  291. package/dist/core/objects/procedure/utils.d.ts +14 -0
  292. package/dist/core/objects/procedure/utils.js +55 -0
  293. package/dist/core/objects/publication/changes/publication.alter.d.ts +88 -0
  294. package/dist/core/objects/publication/changes/publication.alter.js +176 -0
  295. package/dist/core/objects/publication/changes/publication.base.d.ts +17 -0
  296. package/dist/core/objects/publication/changes/publication.base.js +13 -0
  297. package/dist/core/objects/publication/changes/publication.comment.d.ts +23 -0
  298. package/dist/core/objects/publication/changes/publication.comment.js +46 -0
  299. package/dist/core/objects/publication/changes/publication.create.d.ts +17 -0
  300. package/dist/core/objects/publication/changes/publication.create.js +61 -0
  301. package/dist/core/objects/publication/changes/publication.drop.d.ts +17 -0
  302. package/dist/core/objects/publication/changes/publication.drop.js +23 -0
  303. package/dist/core/objects/publication/changes/publication.types.d.ts +5 -0
  304. package/dist/core/objects/publication/changes/publication.types.js +1 -0
  305. package/dist/core/objects/publication/publication.diff.d.ts +5 -0
  306. package/dist/core/objects/publication/publication.diff.js +161 -0
  307. package/dist/core/objects/publication/publication.model.d.ts +96 -0
  308. package/dist/core/objects/publication/publication.model.js +186 -0
  309. package/dist/core/objects/publication/utils.d.ts +5 -0
  310. package/dist/core/objects/publication/utils.js +45 -0
  311. package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +62 -0
  312. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +90 -0
  313. package/dist/core/objects/rls-policy/changes/rls-policy.base.d.ts +17 -0
  314. package/dist/core/objects/rls-policy/changes/rls-policy.base.js +13 -0
  315. package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +23 -0
  316. package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +51 -0
  317. package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +27 -0
  318. package/dist/core/objects/rls-policy/changes/rls-policy.create.js +79 -0
  319. package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +22 -0
  320. package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +33 -0
  321. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +5 -0
  322. package/dist/core/objects/rls-policy/changes/rls-policy.types.js +1 -0
  323. package/dist/core/objects/rls-policy/rls-policy.diff.d.ts +10 -0
  324. package/dist/core/objects/rls-policy/rls-policy.diff.js +80 -0
  325. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +52 -0
  326. package/dist/core/objects/rls-policy/rls-policy.model.js +127 -0
  327. package/dist/core/objects/role/changes/role.alter.d.ts +78 -0
  328. package/dist/core/objects/role/changes/role.alter.js +55 -0
  329. package/dist/core/objects/role/changes/role.base.d.ts +17 -0
  330. package/dist/core/objects/role/changes/role.base.js +13 -0
  331. package/dist/core/objects/role/changes/role.comment.d.ts +23 -0
  332. package/dist/core/objects/role/changes/role.comment.js +42 -0
  333. package/dist/core/objects/role/changes/role.create.d.ts +38 -0
  334. package/dist/core/objects/role/changes/role.create.js +83 -0
  335. package/dist/core/objects/role/changes/role.drop.d.ts +22 -0
  336. package/dist/core/objects/role/changes/role.drop.js +28 -0
  337. package/dist/core/objects/role/changes/role.privilege.d.ts +148 -0
  338. package/dist/core/objects/role/changes/role.privilege.js +283 -0
  339. package/dist/core/objects/role/changes/role.types.d.ts +6 -0
  340. package/dist/core/objects/role/changes/role.types.js +1 -0
  341. package/dist/core/objects/role/role.diff.d.ts +13 -0
  342. package/dist/core/objects/role/role.diff.js +386 -0
  343. package/dist/core/objects/role/role.model.d.ts +89 -0
  344. package/dist/core/objects/role/role.model.js +312 -0
  345. package/dist/core/objects/rule/changes/rule.alter.d.ts +22 -0
  346. package/dist/core/objects/rule/changes/rule.alter.js +58 -0
  347. package/dist/core/objects/rule/changes/rule.base.d.ts +17 -0
  348. package/dist/core/objects/rule/changes/rule.base.js +13 -0
  349. package/dist/core/objects/rule/changes/rule.comment.d.ts +22 -0
  350. package/dist/core/objects/rule/changes/rule.comment.js +51 -0
  351. package/dist/core/objects/rule/changes/rule.create.d.ts +14 -0
  352. package/dist/core/objects/rule/changes/rule.create.js +28 -0
  353. package/dist/core/objects/rule/changes/rule.drop.d.ts +12 -0
  354. package/dist/core/objects/rule/changes/rule.drop.js +23 -0
  355. package/dist/core/objects/rule/changes/rule.types.d.ts +5 -0
  356. package/dist/core/objects/rule/changes/rule.types.js +1 -0
  357. package/dist/core/objects/rule/rule.diff.d.ts +3 -0
  358. package/dist/core/objects/rule/rule.diff.js +53 -0
  359. package/dist/core/objects/rule/rule.model.d.ts +72 -0
  360. package/dist/core/objects/rule/rule.model.js +156 -0
  361. package/dist/core/objects/schema/changes/schema.alter.d.ts +32 -0
  362. package/dist/core/objects/schema/changes/schema.alter.js +25 -0
  363. package/dist/core/objects/schema/changes/schema.base.d.ts +17 -0
  364. package/dist/core/objects/schema/changes/schema.base.js +13 -0
  365. package/dist/core/objects/schema/changes/schema.comment.d.ts +23 -0
  366. package/dist/core/objects/schema/changes/schema.comment.js +43 -0
  367. package/dist/core/objects/schema/changes/schema.create.d.ts +27 -0
  368. package/dist/core/objects/schema/changes/schema.create.js +38 -0
  369. package/dist/core/objects/schema/changes/schema.drop.d.ts +22 -0
  370. package/dist/core/objects/schema/changes/schema.drop.js +28 -0
  371. package/dist/core/objects/schema/changes/schema.privilege.d.ts +97 -0
  372. package/dist/core/objects/schema/changes/schema.privilege.js +131 -0
  373. package/dist/core/objects/schema/changes/schema.types.d.ts +6 -0
  374. package/dist/core/objects/schema/changes/schema.types.js +1 -0
  375. package/dist/core/objects/schema/schema.diff.d.ts +18 -0
  376. package/dist/core/objects/schema/schema.diff.js +142 -0
  377. package/dist/core/objects/schema/schema.model.d.ts +47 -0
  378. package/dist/core/objects/schema/schema.model.js +91 -0
  379. package/dist/core/objects/sequence/changes/sequence.alter.d.ts +59 -0
  380. package/dist/core/objects/sequence/changes/sequence.alter.js +75 -0
  381. package/dist/core/objects/sequence/changes/sequence.base.d.ts +17 -0
  382. package/dist/core/objects/sequence/changes/sequence.base.js +13 -0
  383. package/dist/core/objects/sequence/changes/sequence.comment.d.ts +23 -0
  384. package/dist/core/objects/sequence/changes/sequence.comment.js +47 -0
  385. package/dist/core/objects/sequence/changes/sequence.create.d.ts +25 -0
  386. package/dist/core/objects/sequence/changes/sequence.create.js +78 -0
  387. package/dist/core/objects/sequence/changes/sequence.drop.d.ts +22 -0
  388. package/dist/core/objects/sequence/changes/sequence.drop.js +31 -0
  389. package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +101 -0
  390. package/dist/core/objects/sequence/changes/sequence.privilege.js +135 -0
  391. package/dist/core/objects/sequence/changes/sequence.types.d.ts +6 -0
  392. package/dist/core/objects/sequence/changes/sequence.types.js +1 -0
  393. package/dist/core/objects/sequence/sequence.diff.d.ts +20 -0
  394. package/dist/core/objects/sequence/sequence.diff.js +258 -0
  395. package/dist/core/objects/sequence/sequence.model.d.ts +76 -0
  396. package/dist/core/objects/sequence/sequence.model.js +169 -0
  397. package/dist/core/objects/subscription/changes/subscription.alter.d.ts +56 -0
  398. package/dist/core/objects/subscription/changes/subscription.alter.js +82 -0
  399. package/dist/core/objects/subscription/changes/subscription.base.d.ts +17 -0
  400. package/dist/core/objects/subscription/changes/subscription.base.js +13 -0
  401. package/dist/core/objects/subscription/changes/subscription.comment.d.ts +23 -0
  402. package/dist/core/objects/subscription/changes/subscription.comment.js +46 -0
  403. package/dist/core/objects/subscription/changes/subscription.create.d.ts +12 -0
  404. package/dist/core/objects/subscription/changes/subscription.create.js +52 -0
  405. package/dist/core/objects/subscription/changes/subscription.drop.d.ts +11 -0
  406. package/dist/core/objects/subscription/changes/subscription.drop.js +15 -0
  407. package/dist/core/objects/subscription/changes/subscription.types.d.ts +5 -0
  408. package/dist/core/objects/subscription/changes/subscription.types.js +1 -0
  409. package/dist/core/objects/subscription/subscription.diff.d.ts +5 -0
  410. package/dist/core/objects/subscription/subscription.diff.js +167 -0
  411. package/dist/core/objects/subscription/subscription.model.d.ts +80 -0
  412. package/dist/core/objects/subscription/subscription.model.js +166 -0
  413. package/dist/core/objects/subscription/utils.d.ts +37 -0
  414. package/dist/core/objects/subscription/utils.js +112 -0
  415. package/dist/core/objects/table/changes/table.alter.d.ts +357 -0
  416. package/dist/core/objects/table/changes/table.alter.js +607 -0
  417. package/dist/core/objects/table/changes/table.base.d.ts +17 -0
  418. package/dist/core/objects/table/changes/table.base.js +13 -0
  419. package/dist/core/objects/table/changes/table.comment.d.ts +106 -0
  420. package/dist/core/objects/table/changes/table.comment.js +175 -0
  421. package/dist/core/objects/table/changes/table.create.d.ts +33 -0
  422. package/dist/core/objects/table/changes/table.create.js +145 -0
  423. package/dist/core/objects/table/changes/table.drop.d.ts +22 -0
  424. package/dist/core/objects/table/changes/table.drop.js +35 -0
  425. package/dist/core/objects/table/changes/table.privilege.d.ts +107 -0
  426. package/dist/core/objects/table/changes/table.privilege.js +150 -0
  427. package/dist/core/objects/table/changes/table.types.d.ts +6 -0
  428. package/dist/core/objects/table/changes/table.types.js +1 -0
  429. package/dist/core/objects/table/table.diff.d.ts +18 -0
  430. package/dist/core/objects/table/table.diff.js +668 -0
  431. package/dist/core/objects/table/table.model.d.ts +341 -0
  432. package/dist/core/objects/table/table.model.js +426 -0
  433. package/dist/core/objects/trigger/changes/trigger.alter.d.ts +29 -0
  434. package/dist/core/objects/trigger/changes/trigger.alter.js +27 -0
  435. package/dist/core/objects/trigger/changes/trigger.base.d.ts +17 -0
  436. package/dist/core/objects/trigger/changes/trigger.base.js +13 -0
  437. package/dist/core/objects/trigger/changes/trigger.comment.d.ts +23 -0
  438. package/dist/core/objects/trigger/changes/trigger.comment.js +51 -0
  439. package/dist/core/objects/trigger/changes/trigger.create.d.ts +41 -0
  440. package/dist/core/objects/trigger/changes/trigger.create.js +61 -0
  441. package/dist/core/objects/trigger/changes/trigger.drop.d.ts +22 -0
  442. package/dist/core/objects/trigger/changes/trigger.drop.js +33 -0
  443. package/dist/core/objects/trigger/changes/trigger.types.d.ts +5 -0
  444. package/dist/core/objects/trigger/changes/trigger.types.js +1 -0
  445. package/dist/core/objects/trigger/trigger.diff.d.ts +11 -0
  446. package/dist/core/objects/trigger/trigger.diff.js +84 -0
  447. package/dist/core/objects/trigger/trigger.model.d.ts +92 -0
  448. package/dist/core/objects/trigger/trigger.model.js +235 -0
  449. package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +81 -0
  450. package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +123 -0
  451. package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +17 -0
  452. package/dist/core/objects/type/composite-type/changes/composite-type.base.js +13 -0
  453. package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +53 -0
  454. package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +108 -0
  455. package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +23 -0
  456. package/dist/core/objects/type/composite-type/changes/composite-type.create.js +72 -0
  457. package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +22 -0
  458. package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +31 -0
  459. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +97 -0
  460. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +131 -0
  461. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +6 -0
  462. package/dist/core/objects/type/composite-type/changes/composite-type.types.js +1 -0
  463. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +18 -0
  464. package/dist/core/objects/type/composite-type/composite-type.diff.js +250 -0
  465. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +148 -0
  466. package/dist/core/objects/type/composite-type/composite-type.model.js +223 -0
  467. package/dist/core/objects/type/enum/changes/enum.alter.d.ts +52 -0
  468. package/dist/core/objects/type/enum/changes/enum.alter.js +60 -0
  469. package/dist/core/objects/type/enum/changes/enum.base.d.ts +17 -0
  470. package/dist/core/objects/type/enum/changes/enum.base.js +13 -0
  471. package/dist/core/objects/type/enum/changes/enum.comment.d.ts +26 -0
  472. package/dist/core/objects/type/enum/changes/enum.comment.js +47 -0
  473. package/dist/core/objects/type/enum/changes/enum.create.d.ts +22 -0
  474. package/dist/core/objects/type/enum/changes/enum.create.js +43 -0
  475. package/dist/core/objects/type/enum/changes/enum.drop.d.ts +22 -0
  476. package/dist/core/objects/type/enum/changes/enum.drop.js +28 -0
  477. package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +97 -0
  478. package/dist/core/objects/type/enum/changes/enum.privilege.js +131 -0
  479. package/dist/core/objects/type/enum/changes/enum.types.d.ts +6 -0
  480. package/dist/core/objects/type/enum/changes/enum.types.js +1 -0
  481. package/dist/core/objects/type/enum/enum.diff.d.ts +18 -0
  482. package/dist/core/objects/type/enum/enum.diff.js +268 -0
  483. package/dist/core/objects/type/enum/enum.model.d.ts +66 -0
  484. package/dist/core/objects/type/enum/enum.model.js +154 -0
  485. package/dist/core/objects/type/range/changes/range.alter.d.ts +33 -0
  486. package/dist/core/objects/type/range/changes/range.alter.js +30 -0
  487. package/dist/core/objects/type/range/changes/range.base.d.ts +17 -0
  488. package/dist/core/objects/type/range/changes/range.base.js +13 -0
  489. package/dist/core/objects/type/range/changes/range.comment.d.ts +26 -0
  490. package/dist/core/objects/type/range/changes/range.comment.js +47 -0
  491. package/dist/core/objects/type/range/changes/range.create.d.ts +31 -0
  492. package/dist/core/objects/type/range/changes/range.create.js +113 -0
  493. package/dist/core/objects/type/range/changes/range.drop.d.ts +22 -0
  494. package/dist/core/objects/type/range/changes/range.drop.js +28 -0
  495. package/dist/core/objects/type/range/changes/range.privilege.d.ts +97 -0
  496. package/dist/core/objects/type/range/changes/range.privilege.js +131 -0
  497. package/dist/core/objects/type/range/changes/range.types.d.ts +6 -0
  498. package/dist/core/objects/type/range/changes/range.types.js +1 -0
  499. package/dist/core/objects/type/range/range.diff.d.ts +18 -0
  500. package/dist/core/objects/type/range/range.diff.js +172 -0
  501. package/dist/core/objects/type/range/range.model.d.ts +81 -0
  502. package/dist/core/objects/type/range/range.model.js +165 -0
  503. package/dist/core/objects/type/type.types.d.ts +4 -0
  504. package/dist/core/objects/type/type.types.js +1 -0
  505. package/dist/core/objects/utils.d.ts +57 -0
  506. package/dist/core/objects/utils.js +137 -0
  507. package/dist/core/objects/view/changes/view.alter.d.ts +62 -0
  508. package/dist/core/objects/view/changes/view.alter.js +75 -0
  509. package/dist/core/objects/view/changes/view.base.d.ts +17 -0
  510. package/dist/core/objects/view/changes/view.base.js +13 -0
  511. package/dist/core/objects/view/changes/view.comment.d.ts +23 -0
  512. package/dist/core/objects/view/changes/view.comment.js +46 -0
  513. package/dist/core/objects/view/changes/view.create.d.ts +27 -0
  514. package/dist/core/objects/view/changes/view.create.js +57 -0
  515. package/dist/core/objects/view/changes/view.drop.d.ts +17 -0
  516. package/dist/core/objects/view/changes/view.drop.js +30 -0
  517. package/dist/core/objects/view/changes/view.privilege.d.ts +107 -0
  518. package/dist/core/objects/view/changes/view.privilege.js +150 -0
  519. package/dist/core/objects/view/changes/view.types.d.ts +6 -0
  520. package/dist/core/objects/view/changes/view.types.js +1 -0
  521. package/dist/core/objects/view/view.diff.d.ts +18 -0
  522. package/dist/core/objects/view/view.diff.js +270 -0
  523. package/dist/core/objects/view/view.model.d.ts +152 -0
  524. package/dist/core/objects/view/view.model.js +250 -0
  525. package/dist/core/plan/apply.d.ts +33 -0
  526. package/dist/core/plan/apply.js +112 -0
  527. package/dist/core/plan/create.d.ts +22 -0
  528. package/dist/core/plan/create.js +228 -0
  529. package/dist/core/plan/hierarchy.d.ts +19 -0
  530. package/dist/core/plan/hierarchy.js +488 -0
  531. package/dist/core/plan/index.d.ts +19 -0
  532. package/dist/core/plan/index.js +21 -0
  533. package/dist/core/plan/io.d.ts +12 -0
  534. package/dist/core/plan/io.js +17 -0
  535. package/dist/core/plan/risk.d.ts +10 -0
  536. package/dist/core/plan/risk.js +38 -0
  537. package/dist/core/plan/serialize.d.ts +26 -0
  538. package/dist/core/plan/serialize.js +176 -0
  539. package/dist/core/plan/statements.d.ts +8 -0
  540. package/dist/core/plan/statements.js +13 -0
  541. package/dist/core/plan/types.d.ts +153 -0
  542. package/dist/core/plan/types.js +32 -0
  543. package/dist/core/postgres-config.d.ts +8 -0
  544. package/dist/core/postgres-config.js +46 -0
  545. package/dist/core/sort/custom-constraints.d.ts +9 -0
  546. package/dist/core/sort/custom-constraints.js +133 -0
  547. package/dist/core/sort/debug-visualization.d.ts +8 -0
  548. package/dist/core/sort/debug-visualization.js +145 -0
  549. package/dist/core/sort/dependency-filter.d.ts +19 -0
  550. package/dist/core/sort/dependency-filter.js +152 -0
  551. package/dist/core/sort/graph-builder.d.ts +37 -0
  552. package/dist/core/sort/graph-builder.js +172 -0
  553. package/dist/core/sort/graph-utils.d.ts +14 -0
  554. package/dist/core/sort/graph-utils.js +41 -0
  555. package/dist/core/sort/logical-sort.d.ts +26 -0
  556. package/dist/core/sort/logical-sort.js +532 -0
  557. package/dist/core/sort/sort-changes.d.ts +28 -0
  558. package/dist/core/sort/sort-changes.js +147 -0
  559. package/dist/core/sort/topological-sort.d.ts +20 -0
  560. package/dist/core/sort/topological-sort.js +138 -0
  561. package/dist/core/sort/types.d.ts +102 -0
  562. package/dist/core/sort/types.js +1 -0
  563. package/dist/core/sort/utils.d.ts +23 -0
  564. package/dist/core/sort/utils.js +51 -0
  565. package/dist/index.d.ts +1 -0
  566. package/dist/index.js +1 -0
  567. package/package.json +58 -12
@@ -0,0 +1,1833 @@
1
+ /**
2
+ * Extract dependencies for privileges and memberships so that GRANT/REVOKE
3
+ * operations are properly ordered with respect to their target objects/roles.
4
+ *
5
+ * Encodes edges like:
6
+ * - acl:<target>::grantee:<role> -> <target>
7
+ * - acl:<target>::grantee:<role> -> role:<role>
8
+ * - aclcol:table:<schema>.<name>::grantee:<role> -> table:<schema>.<name>
9
+ * - aclcol:... -> role:<role>
10
+ * - defacl:<grantor>:<objtype>:<scope>:grantee:<grantee> -> role:<grantor>
11
+ * - defacl:... -> role:<grantee>
12
+ * - defacl:... -> schema:<schema> (when scoped to a schema)
13
+ * - membership:<role>-><member> -> role:<role>
14
+ * - membership:<role>-><member> -> role:<member>
15
+ */
16
+ async function extractPrivilegeAndMembershipDepends(sql) {
17
+ const rows = await sql `
18
+ with
19
+ -- OBJECT PRIVILEGES (relations)
20
+ extension_rel_oids as (
21
+ select objid from pg_depend d
22
+ where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_class'::regclass
23
+ ),
24
+ rel_acls as (
25
+ select
26
+ c.relkind,
27
+ c.relnamespace::regnamespace::text as schema_name,
28
+ c.relname as relname,
29
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
30
+ from pg_catalog.pg_class c
31
+ join lateral aclexplode(c.relacl) as x(grantor, grantee, privilege_type, is_grantable) on true
32
+ left join extension_rel_oids e on e.objid = c.oid
33
+ where c.relkind in ('r','p','v','m','S','f')
34
+ and not c.relnamespace::regnamespace::text like any(array['pg\\_%','information\\_schema'])
35
+ and e.objid is null
36
+ ),
37
+ rel_targets as (
38
+ select
39
+ case
40
+ when relkind in ('r','p') then format('table:%I.%I', schema_name, relname)
41
+ when relkind = 'v' then format('view:%I.%I', schema_name, relname)
42
+ when relkind = 'm' then format('materializedView:%I.%I', schema_name, relname)
43
+ when relkind = 'S' then format('sequence:%I.%I', schema_name, relname)
44
+ when relkind = 'f' then format('foreignTable:%I.%I', schema_name, relname)
45
+ else null
46
+ end as target_stable_id,
47
+ schema_name as target_schema,
48
+ grantee
49
+ from rel_acls
50
+ ),
51
+
52
+ -- OBJECT PRIVILEGES (schemas)
53
+ extension_ns_oids as (
54
+ select objid from pg_depend d
55
+ where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_namespace'::regclass
56
+ ),
57
+ ns_acls as (
58
+ select
59
+ format('schema:%I', n.nspname) as schema_stable_id,
60
+ n.nspname as schema_name,
61
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
62
+ from pg_catalog.pg_namespace n
63
+ join lateral aclexplode(n.nspacl) as x(grantor, grantee, privilege_type, is_grantable) on true
64
+ left join extension_ns_oids e on e.objid = n.oid
65
+ where not n.nspname like any(array['pg\\_%','information\\_schema'])
66
+ and e.objid is null
67
+ ),
68
+
69
+ -- OBJECT PRIVILEGES (languages)
70
+ extension_lang_oids as (
71
+ select objid from pg_depend d
72
+ where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_language'::regclass
73
+ ),
74
+ lang_acls as (
75
+ select
76
+ format('language:%I', l.lanname) as language_stable_id,
77
+ NULL::text as language_schema,
78
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
79
+ from pg_catalog.pg_language l
80
+ join lateral aclexplode(l.lanacl) as x(grantor, grantee, privilege_type, is_grantable) on true
81
+ left join extension_lang_oids e on e.objid = l.oid
82
+ where l.lanname not in ('internal','c')
83
+ ),
84
+
85
+ -- OBJECT PRIVILEGES (routines)
86
+ extension_proc_oids as (
87
+ select objid from pg_depend d
88
+ where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_proc'::regclass
89
+ ),
90
+ proc_acls as (
91
+ select
92
+ p.pronamespace::regnamespace::text as schema_name,
93
+ p.proname as procname,
94
+ p.prokind,
95
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee,
96
+ (select coalesce(string_agg(format_type(oid, null), ',' order by ord), '') from unnest(p.proargtypes) with ordinality as t(oid, ord)) as arg_types,
97
+ trim(pg_catalog.pg_get_function_identity_arguments(p.oid)) as identity_arguments
98
+ from pg_catalog.pg_proc p
99
+ join lateral aclexplode(p.proacl) as x(grantor, grantee, privilege_type, is_grantable) on true
100
+ left join extension_proc_oids e on e.objid = p.oid
101
+ join pg_language l on l.oid = p.prolang
102
+ where not p.pronamespace::regnamespace::text like any(array['pg\\_%','information\\_schema'])
103
+ and e.objid is null
104
+ and l.lanname not in ('c','internal')
105
+ ),
106
+ proc_targets as (
107
+ select
108
+ case
109
+ when prokind = 'a' then format('aggregate:%I.%I(%s)', schema_name, procname, identity_arguments)
110
+ else format('procedure:%I.%I(%s)', schema_name, procname, arg_types)
111
+ end as target_stable_id,
112
+ schema_name,
113
+ grantee
114
+ from proc_acls
115
+ ),
116
+
117
+ -- OBJECT PRIVILEGES (types/domains)
118
+ extension_type_oids as (
119
+ select objid from pg_depend d
120
+ where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_type'::regclass
121
+ ),
122
+ type_acls as (
123
+ select
124
+ t.typtype,
125
+ t.typnamespace::regnamespace::text as schema_name,
126
+ t.typname as type_name,
127
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
128
+ from pg_catalog.pg_type t
129
+ join lateral aclexplode(t.typacl) as x(grantor, grantee, privilege_type, is_grantable) on true
130
+ left join extension_type_oids e on e.objid = t.oid
131
+ where not t.typnamespace::regnamespace::text like any(array['pg\\_%','information\\_schema'])
132
+ and e.objid is null
133
+ and t.typtype in ('d','e','r','c')
134
+ ),
135
+ type_targets as (
136
+ select
137
+ (case
138
+ when typtype = 'd' then format('domain:%I.%I', schema_name, type_name)
139
+ when typtype = 'e' then format('type:%I.%I', schema_name, type_name)
140
+ when typtype = 'r' then format('type:%I.%I', schema_name, type_name)
141
+ when typtype = 'c' then format('type:%I.%I', schema_name, type_name)
142
+ else null
143
+ end) as target_stable_id,
144
+ schema_name,
145
+ grantee
146
+ from type_acls
147
+ ),
148
+
149
+ -- COLUMN PRIVILEGES
150
+ rels as (
151
+ select c.oid,
152
+ c.relkind,
153
+ c.relnamespace::regnamespace::text as schema_name,
154
+ c.relname as relname
155
+ from pg_catalog.pg_class c
156
+ left join pg_depend de on de.classid='pg_class'::regclass and de.objid=c.oid and de.refclassid='pg_extension'::regclass
157
+ where c.relkind in ('r','p','v','m','f')
158
+ and not c.relnamespace::regnamespace::text like any(array['pg\\_%','information\\_schema'])
159
+ and de.objid is null
160
+ ),
161
+ col_acls as (
162
+ select
163
+ format('table:%I.%I', r.schema_name, r.relname) as table_stable_id,
164
+ r.schema_name as table_schema,
165
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
166
+ from rels r
167
+ join pg_attribute a on a.attrelid = r.oid and a.attnum > 0 and not a.attisdropped
168
+ join lateral aclexplode(a.attacl) as x(grantor, grantee, privilege_type, is_grantable) on true
169
+ ),
170
+
171
+ -- DEFAULT PRIVILEGES
172
+ defacls as (
173
+ select
174
+ format(
175
+ 'defacl:%s:%s:%s:grantee:%s',
176
+ d.defaclrole::regrole::text,
177
+ d.defaclobjtype::text,
178
+ coalesce(format('schema:%s', d.defaclnamespace::regnamespace::text), 'global'),
179
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end
180
+ ) as defacl_stable_id,
181
+ format('role:%s', d.defaclrole::regrole::text) as grantor_role_stable_id,
182
+ format('role:%s', case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end) as grantee_role_stable_id,
183
+ case
184
+ when d.defaclnamespace = 0 then null
185
+ else format('schema:%s', d.defaclnamespace::regnamespace::text)
186
+ end as schema_stable_id,
187
+ case
188
+ when d.defaclnamespace = 0 then null
189
+ else d.defaclnamespace::regnamespace::text
190
+ end as schema_name
191
+ from pg_default_acl d
192
+ cross join lateral aclexplode(coalesce(d.defaclacl, ARRAY[]::aclitem[])) as x(grantor, grantee, privilege_type, is_grantable)
193
+ ),
194
+
195
+ -- OBJECT PRIVILEGES (Foreign Data Wrappers)
196
+ fdw_acls as (
197
+ select
198
+ format('foreignDataWrapper:%I', fdw.fdwname) as fdw_stable_id,
199
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
200
+ from pg_catalog.pg_foreign_data_wrapper fdw
201
+ join lateral aclexplode(fdw.fdwacl) as x(grantor, grantee, privilege_type, is_grantable) on true
202
+ where not fdw.fdwname like any(array['pg\\_%'])
203
+ ),
204
+
205
+ -- OBJECT PRIVILEGES (Servers)
206
+ server_acls as (
207
+ select
208
+ format('server:%I', srv.srvname) as server_stable_id,
209
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
210
+ from pg_catalog.pg_foreign_server srv
211
+ join pg_catalog.pg_foreign_data_wrapper fdw on fdw.oid = srv.srvfdw
212
+ join lateral aclexplode(srv.srvacl) as x(grantor, grantee, privilege_type, is_grantable) on true
213
+ where not fdw.fdwname like any(array['pg\\_%'])
214
+ ),
215
+
216
+ -- OBJECT PRIVILEGES (Foreign Tables)
217
+ foreign_table_acls as (
218
+ select
219
+ c.relnamespace::regnamespace::text as schema_name,
220
+ c.relname as relname,
221
+ case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end as grantee
222
+ from pg_catalog.pg_class c
223
+ join pg_foreign_table ft on ft.ftrelid = c.oid
224
+ join pg_foreign_server srv on srv.oid = ft.ftserver
225
+ join pg_foreign_data_wrapper fdw on fdw.oid = srv.srvfdw
226
+ join lateral aclexplode(c.relacl) as x(grantor, grantee, privilege_type, is_grantable) on true
227
+ left join extension_rel_oids e on e.objid = c.oid
228
+ where c.relkind = 'f'
229
+ and not c.relnamespace::regnamespace::text like any(array['pg\\_%','information\\_schema'])
230
+ and e.objid is null
231
+ and not fdw.fdwname like any(array['pg\\_%'])
232
+ ),
233
+ foreign_table_targets as (
234
+ select
235
+ format('foreignTable:%I.%I', schema_name, relname) as target_stable_id,
236
+ schema_name as target_schema,
237
+ grantee
238
+ from foreign_table_acls
239
+ ),
240
+
241
+ -- ROLE MEMBERSHIPS
242
+ memberships as (
243
+ select quote_ident(r.rolname) as role_name, m.rolname as member_name
244
+ from pg_auth_members am
245
+ join pg_roles r on r.oid = am.roleid
246
+ join pg_roles m on m.oid = am.member
247
+ )
248
+
249
+ select distinct
250
+ dependent_stable_id,
251
+ referenced_stable_id,
252
+ deptype
253
+ from (
254
+ select distinct
255
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
256
+ target_stable_id as referenced_stable_id,
257
+ 'n'::char as deptype,
258
+ target_schema as dep_schema,
259
+ target_schema as ref_schema
260
+ from rel_targets
261
+ where target_stable_id is not null
262
+
263
+ union all
264
+ select distinct
265
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
266
+ format('role:%s', grantee) as referenced_stable_id,
267
+ 'n'::char as deptype,
268
+ target_schema as dep_schema,
269
+ NULL::text as ref_schema
270
+ from rel_targets
271
+ where target_stable_id is not null
272
+
273
+ union all
274
+ select distinct
275
+ format('acl:%s::grantee:%s', schema_stable_id, grantee) as dependent_stable_id,
276
+ schema_stable_id as referenced_stable_id,
277
+ 'n'::char as deptype,
278
+ schema_name as dep_schema,
279
+ schema_name as ref_schema
280
+ from ns_acls
281
+
282
+ union all
283
+ select distinct
284
+ format('acl:%s::grantee:%s', schema_stable_id, grantee) as dependent_stable_id,
285
+ format('role:%s', grantee) as referenced_stable_id,
286
+ 'n'::char as deptype,
287
+ schema_name as dep_schema,
288
+ NULL::text as ref_schema
289
+ from ns_acls
290
+
291
+ union all
292
+ select distinct
293
+ format('acl:%s::grantee:%s', language_stable_id, grantee) as dependent_stable_id,
294
+ language_stable_id as referenced_stable_id,
295
+ 'n'::char as deptype,
296
+ NULL::text as dep_schema,
297
+ NULL::text as ref_schema
298
+ from lang_acls
299
+
300
+ union all
301
+ select distinct
302
+ format('acl:%s::grantee:%s', language_stable_id, grantee) as dependent_stable_id,
303
+ format('role:%s', grantee) as referenced_stable_id,
304
+ 'n'::char as deptype,
305
+ NULL::text as dep_schema,
306
+ NULL::text as ref_schema
307
+ from lang_acls
308
+
309
+ union all
310
+ select distinct
311
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
312
+ target_stable_id as referenced_stable_id,
313
+ 'n'::char as deptype,
314
+ schema_name as dep_schema,
315
+ schema_name as ref_schema
316
+ from proc_targets
317
+
318
+ union all
319
+ select distinct
320
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
321
+ format('role:%s', grantee) as referenced_stable_id,
322
+ 'n'::char as deptype,
323
+ schema_name as dep_schema,
324
+ NULL::text as ref_schema
325
+ from proc_targets
326
+
327
+ union all
328
+ select distinct
329
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
330
+ target_stable_id as referenced_stable_id,
331
+ 'n'::char as deptype,
332
+ schema_name as dep_schema,
333
+ schema_name as ref_schema
334
+ from type_targets
335
+ where target_stable_id is not null
336
+
337
+ union all
338
+ select distinct
339
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
340
+ format('role:%s', grantee) as referenced_stable_id,
341
+ 'n'::char as deptype,
342
+ schema_name as dep_schema,
343
+ NULL::text as ref_schema
344
+ from type_targets
345
+ where target_stable_id is not null
346
+
347
+ union all
348
+ select distinct
349
+ format('aclcol:%s::grantee:%s', table_stable_id, grantee) as dependent_stable_id,
350
+ table_stable_id as referenced_stable_id,
351
+ 'n'::char as deptype,
352
+ table_schema as dep_schema,
353
+ table_schema as ref_schema
354
+ from col_acls
355
+
356
+ union all
357
+ select distinct
358
+ format('aclcol:%s::grantee:%s', table_stable_id, grantee) as dependent_stable_id,
359
+ format('role:%s', grantee) as referenced_stable_id,
360
+ 'n'::char as deptype,
361
+ table_schema as dep_schema,
362
+ NULL::text as ref_schema
363
+ from col_acls
364
+
365
+ union all
366
+ select distinct
367
+ defacl_stable_id as dependent_stable_id,
368
+ grantor_role_stable_id as referenced_stable_id,
369
+ 'n'::char as deptype,
370
+ schema_name as dep_schema,
371
+ NULL::text as ref_schema
372
+ from defacls
373
+
374
+ union all
375
+ select distinct
376
+ defacl_stable_id as dependent_stable_id,
377
+ grantee_role_stable_id as referenced_stable_id,
378
+ 'n'::char as deptype,
379
+ schema_name as dep_schema,
380
+ NULL::text as ref_schema
381
+ from defacls
382
+
383
+ union all
384
+ select distinct
385
+ defacl_stable_id as dependent_stable_id,
386
+ schema_stable_id as referenced_stable_id,
387
+ 'n'::char as deptype,
388
+ schema_name as dep_schema,
389
+ schema_name as ref_schema
390
+ from defacls
391
+ where schema_stable_id is not null
392
+
393
+ union all
394
+ select distinct
395
+ format('membership:%s->%s', role_name, member_name) as dependent_stable_id,
396
+ format('role:%s', role_name) as referenced_stable_id,
397
+ 'n'::char as deptype,
398
+ NULL::text as dep_schema,
399
+ NULL::text as ref_schema
400
+ from memberships
401
+
402
+ union all
403
+ select distinct
404
+ format('membership:%s->%s', role_name, member_name) as dependent_stable_id,
405
+ format('role:%s', member_name) as referenced_stable_id,
406
+ 'n'::char as deptype,
407
+ NULL::text as dep_schema,
408
+ NULL::text as ref_schema
409
+ from memberships
410
+
411
+ union all
412
+ select distinct
413
+ format('acl:%s::grantee:%s', fdw_stable_id, grantee) as dependent_stable_id,
414
+ fdw_stable_id as referenced_stable_id,
415
+ 'n'::char as deptype,
416
+ NULL::text as dep_schema,
417
+ NULL::text as ref_schema
418
+ from fdw_acls
419
+
420
+ union all
421
+ select distinct
422
+ format('acl:%s::grantee:%s', fdw_stable_id, grantee) as dependent_stable_id,
423
+ format('role:%s', grantee) as referenced_stable_id,
424
+ 'n'::char as deptype,
425
+ NULL::text as dep_schema,
426
+ NULL::text as ref_schema
427
+ from fdw_acls
428
+
429
+ union all
430
+ select distinct
431
+ format('acl:%s::grantee:%s', server_stable_id, grantee) as dependent_stable_id,
432
+ server_stable_id as referenced_stable_id,
433
+ 'n'::char as deptype,
434
+ NULL::text as dep_schema,
435
+ NULL::text as ref_schema
436
+ from server_acls
437
+
438
+ union all
439
+ select distinct
440
+ format('acl:%s::grantee:%s', server_stable_id, grantee) as dependent_stable_id,
441
+ format('role:%s', grantee) as referenced_stable_id,
442
+ 'n'::char as deptype,
443
+ NULL::text as dep_schema,
444
+ NULL::text as ref_schema
445
+ from server_acls
446
+
447
+ union all
448
+ select distinct
449
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
450
+ target_stable_id as referenced_stable_id,
451
+ 'n'::char as deptype,
452
+ target_schema as dep_schema,
453
+ target_schema as ref_schema
454
+ from foreign_table_targets
455
+ where target_stable_id is not null
456
+
457
+ union all
458
+ select distinct
459
+ format('acl:%s::grantee:%s', target_stable_id, grantee) as dependent_stable_id,
460
+ format('role:%s', grantee) as referenced_stable_id,
461
+ 'n'::char as deptype,
462
+ target_schema as dep_schema,
463
+ NULL::text as ref_schema
464
+ from foreign_table_targets
465
+ where target_stable_id is not null
466
+ ) all_rows
467
+ where dependent_stable_id <> referenced_stable_id
468
+ and NOT (
469
+ COALESCE(dep_schema, '') LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
470
+ )
471
+ `;
472
+ return rows;
473
+ }
474
+ /**
475
+ * Extract all dependencies from pg_depend, joining with pg_class for class names and applying user object filters.
476
+ * @param sql - The SQL client.
477
+ * @param params - Object containing arrays of OIDs for filtering (user_oids, user_namespace_oids, etc.)
478
+ * @returns Array of dependency objects with class names.
479
+ */
480
+ export async function extractDepends(sql) {
481
+ const dependsRows = await sql `
482
+ WITH ids AS (
483
+ -- only the objects that actually show up in dependencies (both sides)
484
+ SELECT DISTINCT classid, objid, objsubid FROM pg_depend WHERE deptype IN ('n','a')
485
+ UNION
486
+ SELECT DISTINCT refclassid, refobjid, refobjsubid FROM pg_depend WHERE deptype IN ('n','a')
487
+ ),
488
+ objects AS (
489
+ /* Schemas */
490
+ SELECT 'pg_namespace'::regclass AS classid, n.oid AS objid, 0::int2 AS objsubid,
491
+ n.nspname AS schema_name,
492
+ format('schema:%I', n.nspname) AS stable_id
493
+ FROM pg_namespace n
494
+ JOIN ids i ON i.classid = 'pg_namespace'::regclass AND i.objid = n.oid AND COALESCE(i.objsubid,0) = 0
495
+
496
+ UNION ALL
497
+ /* Tables / Views / MViews / Sequences / Indexes / Composite types (pg_class) */
498
+ SELECT 'pg_class'::regclass, c.oid, 0::int2,
499
+ ns.nspname,
500
+ CASE
501
+ WHEN ns.nspname IN ('information_schema','pg_catalog','pg_toast') THEN
502
+ CASE c.relkind
503
+ WHEN 'r' THEN format('systemTable:%I.%I', ns.nspname, c.relname)
504
+ WHEN 'v' THEN format('systemView:%I.%I', ns.nspname, c.relname)
505
+ WHEN 'S' THEN format('systemSequence:%I.%I', ns.nspname, c.relname)
506
+ WHEN 'i' THEN format('systemIndex:%I.%I.%I', ns.nspname, tbl.relname, c.relname)
507
+ ELSE format('systemObject:%I.%I:%s', ns.nspname, c.relname, c.relkind::text)
508
+ END
509
+ ELSE
510
+ CASE c.relkind
511
+ WHEN 'r' THEN format('table:%I.%I', ns.nspname, c.relname)
512
+ WHEN 'p' THEN format('table:%I.%I', ns.nspname, c.relname)
513
+ WHEN 'v' THEN format('view:%I.%I', ns.nspname, c.relname)
514
+ WHEN 'm' THEN format('materializedView:%I.%I', ns.nspname, c.relname)
515
+ WHEN 'S' THEN format('sequence:%I.%I', ns.nspname, c.relname)
516
+ WHEN 'f' THEN format('foreignTable:%I.%I', ns.nspname, c.relname)
517
+ WHEN 'i' THEN format('index:%I.%I.%I', ns.nspname, tbl.relname, c.relname)
518
+ WHEN 'c' THEN format('type:%I.%I', ns.nspname, c.relname)
519
+ ELSE format('unknown:%s.%s', 'pg_class', c.oid::text)
520
+ END
521
+ END AS stable_id
522
+ FROM pg_class c
523
+ JOIN pg_namespace ns ON ns.oid = c.relnamespace
524
+ LEFT JOIN pg_index idx ON idx.indexrelid = c.oid
525
+ LEFT JOIN pg_class tbl ON tbl.oid = idx.indrelid
526
+ JOIN ids i ON i.classid = 'pg_class'::regclass AND i.objid = c.oid AND COALESCE(i.objsubid,0) = 0
527
+
528
+ UNION ALL
529
+ /* Columns (so refobjsubid > 0 resolves to a column stable id) */
530
+ SELECT 'pg_class'::regclass, a.attrelid, a.attnum,
531
+ ns.nspname,
532
+ format('column:%I.%I.%I', ns.nspname, c.relname, a.attname)
533
+ FROM pg_attribute a
534
+ JOIN pg_class c ON c.oid = a.attrelid
535
+ JOIN pg_namespace ns ON ns.oid = c.relnamespace
536
+ JOIN ids i ON i.classid = 'pg_class'::regclass AND i.objid = a.attrelid AND i.objsubid = a.attnum
537
+ WHERE a.attnum > 0 AND NOT a.attisdropped
538
+
539
+ UNION ALL
540
+ /* Types (map row types back to their owning relation when applicable) */
541
+ SELECT 'pg_type'::regclass, t.oid, 0::int2,
542
+ COALESCE(rns.nspname, ns.nspname) AS schema_name, -- prefer owning rel's schema if present
543
+ CASE t.typtype
544
+ WHEN 'd' THEN format('domain:%I.%I', ns.nspname, t.typname)
545
+ WHEN 'e' THEN format('type:%I.%I', ns.nspname, t.typname)
546
+ WHEN 'r' THEN format('type:%I.%I', ns.nspname, t.typname)
547
+ WHEN 'm' THEN format('multirange:%I.%I', ns.nspname, t.typname)
548
+
549
+ WHEN 'c' THEN
550
+ CASE
551
+ /* Row type owned by a table / partitioned table / foreign table */
552
+ WHEN r.oid IS NOT NULL AND r.relkind IN ('r','p','f') THEN
553
+ CASE
554
+ WHEN rns.nspname IN ('information_schema','pg_catalog','pg_toast')
555
+ THEN format('systemTable:%I.%I', rns.nspname, r.relname)
556
+ ELSE format('table:%I.%I', rns.nspname, r.relname)
557
+ END
558
+
559
+ /* Row type owned by a view */
560
+ WHEN r.oid IS NOT NULL AND r.relkind = 'v' THEN
561
+ CASE
562
+ WHEN rns.nspname IN ('information_schema','pg_catalog','pg_toast')
563
+ THEN format('systemView:%I.%I', rns.nspname, r.relname)
564
+ ELSE format('view:%I.%I', rns.nspname, r.relname)
565
+ END
566
+
567
+ /* Row type owned by a materialized view */
568
+ WHEN r.oid IS NOT NULL AND r.relkind = 'm' THEN
569
+ CASE
570
+ /* your pg_class system-branch uses systemObject for relkind m */
571
+ WHEN rns.nspname IN ('information_schema','pg_catalog','pg_toast')
572
+ THEN format('systemObject:%I.%I:%s', rns.nspname, r.relname, 'm')
573
+ ELSE format('materializedView:%I.%I', rns.nspname, r.relname)
574
+ END
575
+
576
+ /* Standalone composite type */
577
+ ELSE format('type:%I.%I', ns.nspname, t.typname)
578
+ END
579
+
580
+ WHEN 'p' THEN format('pseudoType:%I.%I', ns.nspname, t.typname)
581
+ ELSE format('type:%I.%I', ns.nspname, t.typname)
582
+ END AS stable_id
583
+ FROM pg_type t
584
+ JOIN pg_namespace ns ON ns.oid = t.typnamespace
585
+ LEFT JOIN pg_class r ON r.oid = t.typrelid
586
+ LEFT JOIN pg_namespace rns ON rns.oid = r.relnamespace
587
+ JOIN ids i ON i.classid = 'pg_type'::regclass AND i.objid = t.oid AND COALESCE(i.objsubid,0) = 0
588
+
589
+ UNION ALL
590
+ /* Constraints on domain */
591
+ SELECT 'pg_constraint'::regclass, c.oid, 0::int2,
592
+ ns.nspname,
593
+ format('constraint:%I.%I.%I', ns.nspname, ty.typname, c.conname)
594
+ FROM pg_constraint c
595
+ JOIN pg_type ty ON ty.oid = c.contypid
596
+ JOIN pg_namespace ns ON ns.oid = ty.typnamespace
597
+ JOIN ids i ON i.classid = 'pg_constraint'::regclass AND i.objid = c.oid AND COALESCE(i.objsubid,0) = 0
598
+ WHERE c.contypid <> 0
599
+
600
+ UNION ALL
601
+ /* Constraints on table */
602
+ SELECT 'pg_constraint'::regclass, c.oid, 0::int2,
603
+ ns.nspname,
604
+ format('constraint:%I.%I.%I', ns.nspname, tbl.relname, c.conname)
605
+ FROM pg_constraint c
606
+ JOIN pg_class tbl ON tbl.oid = c.conrelid
607
+ JOIN pg_namespace ns ON ns.oid = tbl.relnamespace
608
+ JOIN ids i ON i.classid = 'pg_constraint'::regclass AND i.objid = c.oid AND COALESCE(i.objsubid,0) = 0
609
+ WHERE c.conrelid <> 0
610
+
611
+ UNION ALL
612
+ /* RLS policies */
613
+ SELECT 'pg_policy'::regclass, p.oid, 0::int2,
614
+ ns.nspname,
615
+ format('rlsPolicy:%I.%I.%I', ns.nspname, tbl.relname, p.polname)
616
+ FROM pg_policy p
617
+ JOIN pg_class tbl ON tbl.oid = p.polrelid
618
+ JOIN pg_namespace ns ON ns.oid = tbl.relnamespace
619
+ JOIN ids i ON i.classid = 'pg_policy'::regclass AND i.objid = p.oid AND COALESCE(i.objsubid,0) = 0
620
+
621
+ UNION ALL
622
+ /* Functions/Procedures/Aggregates: types-only signature */
623
+ SELECT 'pg_proc'::regclass, p.oid, 0::int2,
624
+ ns.nspname,
625
+ CASE
626
+ WHEN p.prokind = 'a' THEN format(
627
+ 'aggregate:%I.%I(%s)',
628
+ ns.nspname,
629
+ p.proname,
630
+ trim(pg_catalog.pg_get_function_identity_arguments(p.oid))
631
+ )
632
+ ELSE format(
633
+ 'procedure:%I.%I(%s)',
634
+ ns.nspname,
635
+ p.proname,
636
+ COALESCE((
637
+ SELECT string_agg(format_type(t.oid, NULL), ',' ORDER BY ord)
638
+ FROM unnest(p.proargtypes) WITH ORDINALITY AS t(oid, ord)
639
+ ), '')
640
+ )
641
+ END
642
+ FROM pg_proc p
643
+ JOIN pg_namespace ns ON ns.oid = p.pronamespace
644
+ JOIN ids i ON i.classid = 'pg_proc'::regclass AND i.objid = p.oid AND COALESCE(i.objsubid,0) = 0
645
+
646
+ UNION ALL
647
+ /* Triggers */
648
+ SELECT 'pg_trigger'::regclass, tg.oid, 0::int2,
649
+ ns.nspname,
650
+ format('trigger:%I.%I.%I', ns.nspname, tbl.relname, tg.tgname)
651
+ FROM pg_trigger tg
652
+ JOIN pg_class tbl ON tbl.oid = tg.tgrelid
653
+ JOIN pg_namespace ns ON ns.oid = tbl.relnamespace
654
+ JOIN ids i ON i.classid = 'pg_trigger'::regclass AND i.objid = tg.oid AND COALESCE(i.objsubid,0) = 0
655
+
656
+ UNION ALL
657
+ /* Rewrite rules */
658
+ SELECT 'pg_rewrite'::regclass, r.oid, 0::int2,
659
+ ns.nspname,
660
+ format('rule:%I.%I.%I', ns.nspname, tbl.relname, r.rulename)
661
+ FROM pg_rewrite r
662
+ JOIN pg_class tbl ON tbl.oid = r.ev_class
663
+ JOIN pg_namespace ns ON ns.oid = tbl.relnamespace
664
+ JOIN ids i ON i.classid = 'pg_rewrite'::regclass AND i.objid = r.oid AND COALESCE(i.objsubid,0) = 0
665
+
666
+ UNION ALL
667
+ /* Full-text search objects */
668
+ SELECT 'pg_ts_config'::regclass, c.oid, 0::int2, ns.nspname, format('tsConfig:%I.%I', ns.nspname, c.cfgname)
669
+ FROM pg_ts_config c
670
+ JOIN pg_namespace ns ON ns.oid = c.cfgnamespace
671
+ JOIN ids i ON i.classid = 'pg_ts_config'::regclass AND i.objid = c.oid AND COALESCE(i.objsubid,0) = 0
672
+
673
+ UNION ALL
674
+ SELECT 'pg_ts_dict'::regclass, d.oid, 0::int2, ns.nspname, format('tsDict:%I.%I', ns.nspname, d.dictname)
675
+ FROM pg_ts_dict d
676
+ JOIN pg_namespace ns ON ns.oid = d.dictnamespace
677
+ JOIN ids i ON i.classid = 'pg_ts_dict'::regclass AND i.objid = d.oid AND COALESCE(i.objsubid,0) = 0
678
+
679
+ UNION ALL
680
+ SELECT 'pg_ts_template'::regclass, t.oid, 0::int2, ns.nspname, format('tsTemplate:%I.%I', ns.nspname, t.tmplname)
681
+ FROM pg_ts_template t
682
+ JOIN pg_namespace ns ON ns.oid = t.tmplnamespace
683
+ JOIN ids i ON i.classid = 'pg_ts_template'::regclass AND i.objid = t.oid AND COALESCE(i.objsubid,0) = 0
684
+
685
+ UNION ALL
686
+ /* Column defaults (attrdef) → column stable id */
687
+ SELECT 'pg_attrdef'::regclass, ad.oid, 0::int2,
688
+ ns.nspname,
689
+ format('column:%I.%I.%I', ns.nspname, tbl.relname, col.attname)
690
+ FROM pg_attrdef ad
691
+ JOIN pg_class tbl ON tbl.oid = ad.adrelid
692
+ JOIN pg_namespace ns ON ns.oid = tbl.relnamespace
693
+ JOIN pg_attribute col
694
+ ON col.attrelid = ad.adrelid AND col.attnum = ad.adnum AND col.attnum > 0 AND NOT col.attisdropped
695
+ JOIN ids i ON i.classid = 'pg_attrdef'::regclass AND i.objid = ad.oid AND COALESCE(i.objsubid,0) = 0
696
+
697
+ UNION ALL
698
+ /* Default ACLs */
699
+ SELECT 'pg_default_acl'::regclass, da.oid, 0::int2,
700
+ ns.nspname,
701
+ format('defaultAcl:%I.%s', ns.nspname, da.defaclobjtype::text)
702
+ FROM pg_default_acl da
703
+ JOIN pg_namespace ns ON ns.oid = da.defaclnamespace
704
+ JOIN ids i ON i.classid = 'pg_default_acl'::regclass AND i.objid = da.oid AND COALESCE(i.objsubid,0) = 0
705
+
706
+ UNION ALL
707
+ /* Publications */
708
+ SELECT 'pg_publication'::regclass, p.oid, 0::int2,
709
+ NULL::text,
710
+ format('publication:%I', p.pubname)
711
+ FROM pg_publication p
712
+ JOIN ids i ON i.classid = 'pg_publication'::regclass AND i.objid = p.oid AND COALESCE(i.objsubid,0) = 0
713
+
714
+ UNION ALL
715
+ /* Publication–table membership rows (collapse to publication stable id) */
716
+ SELECT 'pg_publication_rel'::regclass, pr.oid, 0::int2,
717
+ NULL::text AS schema_name, -- publication isn’t really “in” a schema
718
+ format('publication:%I', pub.pubname) AS stable_id
719
+ FROM pg_publication_rel pr
720
+ JOIN pg_publication pub ON pub.oid = pr.prpubid
721
+ JOIN ids i ON i.classid = 'pg_publication_rel'::regclass
722
+ AND i.objid = pr.oid
723
+ AND COALESCE(i.objsubid,0) = 0
724
+
725
+ UNION ALL
726
+ /* Language (no schema), Event trigger, Extension */
727
+ SELECT 'pg_language'::regclass, l.oid, 0::int2, NULL::text, format('language:%I', l.lanname)
728
+ FROM pg_language l
729
+ JOIN ids i ON i.classid = 'pg_language'::regclass AND i.objid = l.oid AND COALESCE(i.objsubid,0) = 0
730
+
731
+ UNION ALL
732
+ SELECT 'pg_event_trigger'::regclass, et.oid, 0::int2, NULL::text, format('eventTrigger:%I', et.evtname)
733
+ FROM pg_event_trigger et
734
+ JOIN ids i ON i.classid = 'pg_event_trigger'::regclass AND i.objid = et.oid AND COALESCE(i.objsubid,0) = 0
735
+
736
+ UNION ALL
737
+ SELECT 'pg_extension'::regclass, e.oid, 0::int2, NULL::text, format('extension:%I', e.extname)
738
+ FROM pg_extension e
739
+ JOIN ids i ON i.classid = 'pg_extension'::regclass AND i.objid = e.oid AND COALESCE(i.objsubid,0) = 0
740
+
741
+ UNION ALL
742
+ /* Subscriptions (cluster-wide; scope to current database) */
743
+ SELECT 'pg_subscription'::regclass, s.oid, 0::int2,
744
+ NULL::text,
745
+ format('subscription:%I', s.subname)
746
+ FROM pg_subscription s
747
+ JOIN ids i
748
+ ON i.classid = 'pg_subscription'::regclass
749
+ AND i.objid = s.oid
750
+ AND COALESCE(i.objsubid,0) = 0
751
+ WHERE s.subdbid = (SELECT oid FROM pg_database WHERE datname = current_database())
752
+
753
+ UNION ALL
754
+ /* Foreign Data Wrappers */
755
+ SELECT 'pg_foreign_data_wrapper'::regclass, fdw.oid, 0::int2,
756
+ NULL::text,
757
+ format('foreignDataWrapper:%I', fdw.fdwname)
758
+ FROM pg_foreign_data_wrapper fdw
759
+ JOIN ids i ON i.classid = 'pg_foreign_data_wrapper'::regclass AND i.objid = fdw.oid AND COALESCE(i.objsubid,0) = 0
760
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
761
+
762
+ UNION ALL
763
+ /* Foreign Servers */
764
+ SELECT 'pg_foreign_server'::regclass, srv.oid, 0::int2,
765
+ NULL::text,
766
+ format('server:%I', srv.srvname)
767
+ FROM pg_foreign_server srv
768
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
769
+ JOIN ids i ON i.classid = 'pg_foreign_server'::regclass AND i.objid = srv.oid AND COALESCE(i.objsubid,0) = 0
770
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
771
+
772
+ UNION ALL
773
+ /* User Mappings */
774
+ SELECT 'pg_user_mapping'::regclass, um.oid, 0::int2,
775
+ NULL::text,
776
+ format('userMapping:%I:%s', srv.srvname, CASE WHEN um.umuser = 0 THEN 'PUBLIC' ELSE um.umuser::regrole::text END)
777
+ FROM pg_user_mapping um
778
+ JOIN pg_foreign_server srv ON srv.oid = um.umserver
779
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
780
+ JOIN ids i ON i.classid = 'pg_user_mapping'::regclass AND i.objid = um.oid AND COALESCE(i.objsubid,0) = 0
781
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
782
+ ),
783
+ base AS (
784
+ SELECT DISTINCT
785
+ COALESCE(dep.stable_id, format('unknown:%s.%s', (d.classid::regclass)::text, d.objid::text)) AS dependent_stable_id,
786
+ COALESCE(ref.stable_id, format('unknown:%s.%s', (d.refclassid::regclass)::text, d.refobjid::text)) AS referenced_stable_id,
787
+ d.deptype,
788
+ dep.schema_name AS dep_schema,
789
+ ref.schema_name AS ref_schema
790
+ FROM pg_depend d
791
+ LEFT JOIN objects dep
792
+ ON dep.classid = d.classid AND dep.objid = d.objid AND dep.objsubid = COALESCE(NULLIF(d.objsubid,0),0)
793
+ LEFT JOIN objects ref
794
+ ON ref.classid = d.refclassid AND ref.objid = d.refobjid AND ref.objsubid = COALESCE(NULLIF(d.refobjsubid,0),0)
795
+ WHERE d.deptype IN ('n','a')
796
+ ),
797
+ comment_deps AS (
798
+ -- Table comments
799
+ SELECT DISTINCT
800
+ format('comment:%s', format('table:%I.%I', n.nspname, c.relname)) AS dependent_stable_id,
801
+ format('table:%I.%I', n.nspname, c.relname) AS referenced_stable_id,
802
+ 'a'::"char" AS deptype,
803
+ n.nspname AS dep_schema,
804
+ n.nspname AS ref_schema
805
+ FROM pg_description d
806
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid = 0
807
+ JOIN pg_namespace n ON c.relnamespace = n.oid
808
+ WHERE c.relkind IN ('r','p')
809
+
810
+ UNION ALL
811
+
812
+ -- Foreign table comments
813
+ SELECT DISTINCT
814
+ format('comment:%s', format('foreignTable:%I.%I', n.nspname, c.relname)) AS dependent_stable_id,
815
+ format('foreignTable:%I.%I', n.nspname, c.relname) AS referenced_stable_id,
816
+ 'a'::"char" AS deptype,
817
+ n.nspname AS dep_schema,
818
+ n.nspname AS ref_schema
819
+ FROM pg_description d
820
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid = 0
821
+ JOIN pg_namespace n ON c.relnamespace = n.oid
822
+ JOIN pg_foreign_table ft ON ft.ftrelid = c.oid
823
+ JOIN pg_foreign_server srv ON srv.oid = ft.ftserver
824
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
825
+ WHERE c.relkind = 'f'
826
+ AND NOT n.nspname LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
827
+ AND NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
828
+
829
+ UNION ALL
830
+
831
+ -- Materialized view comments
832
+ SELECT DISTINCT
833
+ format(
834
+ 'comment:%s',
835
+ format('materializedView:%I.%I', n.nspname, c.relname)
836
+ ) AS dependent_stable_id,
837
+ format('materializedView:%I.%I', n.nspname, c.relname) AS referenced_stable_id,
838
+ 'a'::"char" AS deptype,
839
+ n.nspname AS dep_schema,
840
+ n.nspname AS ref_schema
841
+ FROM pg_description d
842
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid = 0
843
+ JOIN pg_namespace n ON c.relnamespace = n.oid
844
+ WHERE c.relkind = 'm'
845
+
846
+ UNION ALL
847
+
848
+ -- Composite type comments
849
+ SELECT DISTINCT
850
+ format(
851
+ 'comment:%s',
852
+ format('type:%I.%I', n.nspname, t.relname)
853
+ ) AS dependent_stable_id,
854
+ format('type:%I.%I', n.nspname, t.relname) AS referenced_stable_id,
855
+ 'a'::"char" AS deptype,
856
+ n.nspname AS dep_schema,
857
+ n.nspname AS ref_schema
858
+ FROM pg_description d
859
+ JOIN pg_type ty
860
+ ON d.classoid = 'pg_type'::regclass
861
+ AND d.objoid = ty.oid
862
+ AND d.objsubid = 0
863
+ JOIN pg_class t
864
+ ON t.reltype = ty.oid
865
+ JOIN pg_namespace n
866
+ ON n.oid = t.relnamespace
867
+ WHERE t.relkind = 'c'
868
+
869
+ UNION ALL
870
+
871
+ -- Domain comments
872
+ SELECT DISTINCT
873
+ format(
874
+ 'comment:%s',
875
+ format('domain:%I.%I', t.typnamespace::regnamespace::text, t.typname)
876
+ ) AS dependent_stable_id,
877
+ format('domain:%I.%I', t.typnamespace::regnamespace::text, t.typname) AS referenced_stable_id,
878
+ 'a'::"char" AS deptype,
879
+ t.typnamespace::regnamespace::text AS dep_schema,
880
+ t.typnamespace::regnamespace::text AS ref_schema
881
+ FROM pg_description d
882
+ JOIN pg_type t ON d.classoid = 'pg_type'::regclass AND d.objoid = t.oid AND t.typtype = 'd' AND d.objsubid = 0
883
+
884
+
885
+ UNION ALL
886
+
887
+ -- Collation comments
888
+ SELECT DISTINCT
889
+ format(
890
+ 'comment:%s',
891
+ format('collation:%I.%I', n.nspname, c.collname)
892
+ ) AS dependent_stable_id,
893
+ format('collation:%I.%I', n.nspname, c.collname) AS referenced_stable_id,
894
+ 'a'::"char" AS deptype,
895
+ n.nspname AS dep_schema,
896
+ n.nspname AS ref_schema
897
+ FROM pg_description d
898
+ JOIN pg_collation c ON d.classoid = 'pg_collation'::regclass AND d.objoid = c.oid AND d.objsubid = 0
899
+ JOIN pg_namespace n ON c.collnamespace = n.oid
900
+
901
+
902
+ UNION ALL
903
+
904
+ -- Enum type comments
905
+ SELECT DISTINCT
906
+ format(
907
+ 'comment:%s',
908
+ format('type:%I.%I', t.typnamespace::regnamespace::text, t.typname)
909
+ ) AS dependent_stable_id,
910
+ format('type:%I.%I', t.typnamespace::regnamespace::text, t.typname) AS referenced_stable_id,
911
+ 'a'::"char" AS deptype,
912
+ t.typnamespace::regnamespace::text AS dep_schema,
913
+ t.typnamespace::regnamespace::text AS ref_schema
914
+ FROM pg_description d
915
+ JOIN pg_type t ON d.classoid = 'pg_type'::regclass AND d.objoid = t.oid AND t.typtype = 'e' AND d.objsubid = 0
916
+
917
+
918
+ UNION ALL
919
+
920
+ -- Range type comments
921
+ SELECT DISTINCT
922
+ format(
923
+ 'comment:%s',
924
+ format('type:%I.%I', t.typnamespace::regnamespace::text, t.typname)
925
+ ) AS dependent_stable_id,
926
+ format('type:%I.%I', t.typnamespace::regnamespace::text, t.typname) AS referenced_stable_id,
927
+ 'a'::"char" AS deptype,
928
+ t.typnamespace::regnamespace::text AS dep_schema,
929
+ t.typnamespace::regnamespace::text AS ref_schema
930
+ FROM pg_description d
931
+ JOIN pg_type t ON d.classoid = 'pg_type'::regclass AND d.objoid = t.oid AND t.typtype = 'r' AND d.objsubid = 0
932
+
933
+
934
+ UNION ALL
935
+
936
+ -- Column comments (reference table as the owning object)
937
+ SELECT DISTINCT
938
+ format(
939
+ 'comment:%s',
940
+ format('column:%I.%I.%I', n.nspname, c.relname, a.attname)
941
+ ) AS dependent_stable_id,
942
+ format('column:%I.%I.%I', n.nspname, c.relname, a.attname) AS referenced_stable_id,
943
+ 'a'::"char" AS deptype,
944
+ n.nspname AS dep_schema,
945
+ n.nspname AS ref_schema
946
+ FROM pg_description d
947
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid > 0
948
+ JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = d.objsubid AND a.attnum > 0 AND NOT a.attisdropped
949
+ JOIN pg_namespace n ON c.relnamespace = n.oid
950
+ WHERE c.relkind IN ('r','p')
951
+
952
+ UNION ALL
953
+
954
+ -- Index comments
955
+ SELECT DISTINCT
956
+ format(
957
+ 'comment:%s',
958
+ format('index:%I.%I.%I', n.nspname, tbl.relname, c.relname)
959
+ ) AS dependent_stable_id,
960
+ format('index:%I.%I.%I', n.nspname, tbl.relname, c.relname) AS referenced_stable_id,
961
+ 'a'::"char" AS deptype,
962
+ n.nspname AS dep_schema,
963
+ n.nspname AS ref_schema
964
+ FROM pg_description d
965
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid = 0
966
+ JOIN pg_namespace n ON c.relnamespace = n.oid
967
+ LEFT JOIN pg_index idx ON idx.indexrelid = c.oid
968
+ LEFT JOIN pg_class tbl ON tbl.oid = idx.indrelid
969
+ WHERE c.relkind = 'i'
970
+
971
+ UNION ALL
972
+
973
+ -- Materialized view column comments (reference materialized view as the owning object)
974
+ SELECT DISTINCT
975
+ format(
976
+ 'comment:%s',
977
+ format('column:%I.%I.%I', n.nspname, c.relname, a.attname)
978
+ ) AS dependent_stable_id,
979
+ format('column:%I.%I.%I', n.nspname, c.relname, a.attname) AS referenced_stable_id,
980
+ 'a'::"char" AS deptype,
981
+ n.nspname AS dep_schema,
982
+ n.nspname AS ref_schema
983
+ FROM pg_description d
984
+ JOIN pg_class c ON d.classoid = 'pg_class'::regclass AND d.objoid = c.oid AND d.objsubid > 0
985
+ JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = d.objsubid AND a.attnum > 0 AND NOT a.attisdropped
986
+ JOIN pg_namespace n ON c.relnamespace = n.oid
987
+ WHERE c.relkind = 'm'
988
+
989
+ UNION ALL
990
+
991
+ -- Composite type attribute comments
992
+ SELECT DISTINCT
993
+ format(
994
+ 'comment:%s',
995
+ format('%s:%s', format('type:%I.%I', n.nspname, t.relname), a.attname)
996
+ ) AS dependent_stable_id,
997
+ format('%s:%s', format('type:%I.%I', n.nspname, t.relname), a.attname) AS referenced_stable_id,
998
+ 'a'::"char" AS deptype,
999
+ n.nspname AS dep_schema,
1000
+ n.nspname AS ref_schema
1001
+ FROM pg_description d
1002
+ JOIN pg_class t ON d.classoid = 'pg_class'::regclass AND d.objoid = t.oid AND t.relkind = 'c'
1003
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = d.objsubid AND a.attnum > 0 AND NOT a.attisdropped
1004
+ JOIN pg_namespace n ON t.relnamespace = n.oid
1005
+
1006
+
1007
+ UNION ALL
1008
+
1009
+ -- Language comments
1010
+ SELECT DISTINCT
1011
+ format('comment:%s', format('language:%I', l.lanname)) AS dependent_stable_id,
1012
+ format('language:%I', l.lanname) AS referenced_stable_id,
1013
+ 'a'::"char" AS deptype,
1014
+ NULL::text AS dep_schema,
1015
+ NULL::text AS ref_schema
1016
+ FROM pg_description d
1017
+ JOIN pg_language l ON d.classoid = 'pg_language'::regclass AND d.objoid = l.oid AND d.objsubid = 0
1018
+ WHERE l.lanname NOT IN ('internal', 'c')
1019
+ UNION ALL
1020
+
1021
+ -- Event trigger comments
1022
+ SELECT DISTINCT
1023
+ format('comment:%s', format('eventTrigger:%I', et.evtname)) AS dependent_stable_id,
1024
+ format('eventTrigger:%I', et.evtname) AS referenced_stable_id,
1025
+ 'a'::"char" AS deptype,
1026
+ NULL::text AS dep_schema,
1027
+ NULL::text AS ref_schema
1028
+ FROM pg_description d
1029
+ JOIN pg_event_trigger et ON d.classoid = 'pg_event_trigger'::regclass AND d.objoid = et.oid AND d.objsubid = 0
1030
+
1031
+ UNION ALL
1032
+
1033
+ -- Publication comments
1034
+ SELECT DISTINCT
1035
+ format('comment:%s', format('publication:%I', p.pubname)) AS dependent_stable_id,
1036
+ format('publication:%I', p.pubname) AS referenced_stable_id,
1037
+ 'a'::"char" AS deptype,
1038
+ NULL::text AS dep_schema,
1039
+ NULL::text AS ref_schema
1040
+ FROM pg_description d
1041
+ JOIN pg_publication p
1042
+ ON d.classoid = 'pg_publication'::regclass
1043
+ AND d.objoid = p.oid
1044
+ AND d.objsubid = 0
1045
+
1046
+ UNION ALL
1047
+
1048
+ -- Subscription comments
1049
+ SELECT DISTINCT
1050
+ format('comment:%s', format('subscription:%I', s.subname)) AS dependent_stable_id,
1051
+ format('subscription:%I', s.subname) AS referenced_stable_id,
1052
+ 'a'::"char" AS deptype,
1053
+ NULL::text AS dep_schema,
1054
+ NULL::text AS ref_schema
1055
+ FROM pg_description d
1056
+ JOIN pg_subscription s
1057
+ ON d.classoid = 'pg_subscription'::regclass
1058
+ AND d.objoid = s.oid
1059
+ AND d.objsubid = 0
1060
+ WHERE s.subdbid = (SELECT oid FROM pg_database WHERE datname = current_database())
1061
+
1062
+ UNION ALL
1063
+
1064
+ -- Extension comments
1065
+ SELECT DISTINCT
1066
+ format('comment:%s', format('extension:%I', e.extname)) AS dependent_stable_id,
1067
+ format('extension:%I', e.extname) AS referenced_stable_id,
1068
+ 'a'::"char" AS deptype,
1069
+ NULL::text AS dep_schema,
1070
+ NULL::text AS ref_schema
1071
+ FROM pg_description d
1072
+ JOIN pg_extension e ON d.classoid = 'pg_extension'::regclass AND d.objoid = e.oid AND d.objsubid = 0
1073
+
1074
+ UNION ALL
1075
+
1076
+ -- Procedure/function/aggregate comments
1077
+ SELECT DISTINCT
1078
+ CASE
1079
+ WHEN p.prokind = 'a' THEN format(
1080
+ 'comment:%s',
1081
+ format(
1082
+ 'aggregate:%I.%I(%s)',
1083
+ p.pronamespace::regnamespace::text,
1084
+ p.proname,
1085
+ trim(pg_catalog.pg_get_function_identity_arguments(p.oid))
1086
+ )
1087
+ )
1088
+ ELSE format(
1089
+ 'comment:%s',
1090
+ format(
1091
+ 'procedure:%I.%I(%s)',
1092
+ p.pronamespace::regnamespace::text,
1093
+ p.proname,
1094
+ coalesce(
1095
+ (select string_agg(format_type(oid, null), ',' order by ord) from unnest(p.proargtypes) with ordinality as t(oid, ord)),
1096
+ ''
1097
+ )
1098
+ )
1099
+ )
1100
+ END AS dependent_stable_id,
1101
+ CASE
1102
+ WHEN p.prokind = 'a' THEN format(
1103
+ 'aggregate:%I.%I(%s)',
1104
+ p.pronamespace::regnamespace::text,
1105
+ p.proname,
1106
+ trim(pg_catalog.pg_get_function_identity_arguments(p.oid))
1107
+ )
1108
+ ELSE format(
1109
+ 'procedure:%I.%I(%s)',
1110
+ p.pronamespace::regnamespace::text,
1111
+ p.proname,
1112
+ coalesce(
1113
+ (select string_agg(format_type(oid, null), ',' order by ord) from unnest(p.proargtypes) with ordinality as t(oid, ord)),
1114
+ ''
1115
+ )
1116
+ )
1117
+ END AS referenced_stable_id,
1118
+ 'a'::"char" AS deptype,
1119
+ p.pronamespace::regnamespace::text AS dep_schema,
1120
+ p.pronamespace::regnamespace::text AS ref_schema
1121
+ FROM pg_description d
1122
+ JOIN pg_proc p ON d.classoid = 'pg_proc'::regclass AND d.objoid = p.oid AND d.objsubid = 0
1123
+
1124
+
1125
+ UNION ALL
1126
+
1127
+ -- RLS policy comments
1128
+ SELECT DISTINCT
1129
+ format(
1130
+ 'comment:%s',
1131
+ format('rlsPolicy:%I.%I.%I', ns.nspname, tc.relname, pol.polname)
1132
+ ) AS dependent_stable_id,
1133
+ format('rlsPolicy:%I.%I.%I', ns.nspname, tc.relname, pol.polname) AS referenced_stable_id,
1134
+ 'a'::"char" AS deptype,
1135
+ ns.nspname AS dep_schema,
1136
+ ns.nspname AS ref_schema
1137
+ FROM pg_description d
1138
+ JOIN pg_policy pol ON d.classoid = 'pg_policy'::regclass AND d.objoid = pol.oid AND d.objsubid = 0
1139
+ JOIN pg_class tc ON pol.polrelid = tc.oid
1140
+ JOIN pg_namespace ns ON tc.relnamespace = ns.oid
1141
+
1142
+
1143
+ UNION ALL
1144
+
1145
+ -- Role comments
1146
+ SELECT DISTINCT
1147
+ format('comment:%s', format('role:%I', r.rolname)) AS dependent_stable_id,
1148
+ format('role:%I', r.rolname) AS referenced_stable_id,
1149
+ 'a'::"char" AS deptype,
1150
+ NULL::text AS dep_schema,
1151
+ NULL::text AS ref_schema
1152
+ FROM pg_description d
1153
+ JOIN pg_roles r ON d.classoid = 'pg_authid'::regclass AND d.objoid = r.oid AND d.objsubid = 0
1154
+
1155
+ UNION ALL
1156
+
1157
+ -- Constraint comments
1158
+ SELECT DISTINCT
1159
+ format(
1160
+ 'comment:%s',
1161
+ format('constraint:%I.%I.%I', ns.nspname, tbl.relname, con.conname)
1162
+ ) AS dependent_stable_id,
1163
+ format('constraint:%I.%I.%I', ns.nspname, tbl.relname, con.conname) AS referenced_stable_id,
1164
+ 'a'::"char" AS deptype,
1165
+ ns.nspname AS dep_schema,
1166
+ ns.nspname AS ref_schema
1167
+ FROM pg_description d
1168
+ JOIN pg_constraint con ON d.classoid = 'pg_constraint'::regclass AND d.objoid = con.oid
1169
+ JOIN pg_class tbl ON con.conrelid = tbl.oid
1170
+ JOIN pg_namespace ns ON tbl.relnamespace = ns.oid
1171
+ WHERE con.conrelid <> 0
1172
+
1173
+ UNION ALL
1174
+
1175
+ -- Foreign Data Wrapper comments
1176
+ SELECT DISTINCT
1177
+ format('comment:%s', format('foreignDataWrapper:%I', fdw.fdwname)) AS dependent_stable_id,
1178
+ format('foreignDataWrapper:%I', fdw.fdwname) AS referenced_stable_id,
1179
+ 'a'::"char" AS deptype,
1180
+ NULL::text AS dep_schema,
1181
+ NULL::text AS ref_schema
1182
+ FROM pg_description d
1183
+ JOIN pg_foreign_data_wrapper fdw
1184
+ ON d.classoid = 'pg_foreign_data_wrapper'::regclass
1185
+ AND d.objoid = fdw.oid
1186
+ AND d.objsubid = 0
1187
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1188
+
1189
+ UNION ALL
1190
+
1191
+ -- Server comments
1192
+ SELECT DISTINCT
1193
+ format('comment:%s', format('server:%I', srv.srvname)) AS dependent_stable_id,
1194
+ format('server:%I', srv.srvname) AS referenced_stable_id,
1195
+ 'a'::"char" AS deptype,
1196
+ NULL::text AS dep_schema,
1197
+ NULL::text AS ref_schema
1198
+ FROM pg_description d
1199
+ JOIN pg_foreign_server srv
1200
+ ON d.classoid = 'pg_foreign_server'::regclass
1201
+ AND d.objoid = srv.oid
1202
+ AND d.objsubid = 0
1203
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1204
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1205
+ ),
1206
+ type_usage_deps AS (
1207
+ -- Composite type attribute dependencies on user-defined types (domain/enum/range/multirange/composite)
1208
+ SELECT DISTINCT
1209
+ format('type:%I.%I', ns.nspname, comp.relname) AS dependent_stable_id,
1210
+ CASE ref_t.typtype
1211
+ WHEN 'd' THEN format('domain:%I.%I', refns.nspname, ref_t.typname)
1212
+ WHEN 'e' THEN format('type:%I.%I', refns.nspname, ref_t.typname)
1213
+ WHEN 'r' THEN format('type:%I.%I', refns.nspname, ref_t.typname)
1214
+ WHEN 'm' THEN format('multirange:%I.%I', refns.nspname, ref_t.typname)
1215
+ WHEN 'c' THEN format('type:%I.%I', refns.nspname, ref_comp.relname)
1216
+ ELSE NULL
1217
+ END AS referenced_stable_id,
1218
+ 'n'::"char" AS deptype,
1219
+ ns.nspname AS dep_schema,
1220
+ refns.nspname AS ref_schema
1221
+ FROM pg_class comp
1222
+ JOIN pg_namespace ns ON ns.oid = comp.relnamespace
1223
+ JOIN pg_attribute a ON a.attrelid = comp.oid AND a.attnum > 0 AND NOT a.attisdropped
1224
+ JOIN pg_type ref_t ON ref_t.oid = a.atttypid
1225
+ JOIN pg_namespace refns ON refns.oid = ref_t.typnamespace
1226
+ LEFT JOIN pg_class ref_comp ON ref_comp.oid = ref_t.typrelid
1227
+ WHERE comp.relkind = 'c'
1228
+ AND NOT refns.nspname LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
1229
+ AND (
1230
+ ref_t.typtype IN ('d','e','r','m')
1231
+ OR (ref_t.typtype = 'c' AND ref_comp.relkind = 'c')
1232
+ )
1233
+ AND CASE ref_t.typtype
1234
+ WHEN 'c' THEN ref_comp.relname IS NOT NULL
1235
+ ELSE true
1236
+ END
1237
+ ),
1238
+ view_rewrite_rel_deps AS (
1239
+ SELECT DISTINCT
1240
+ COALESCE(
1241
+ dep_view.stable_id,
1242
+ CASE v.relkind
1243
+ WHEN 'v' THEN format('view:%I.%I', v_ns.nspname, v.relname)
1244
+ WHEN 'm' THEN format('materializedView:%I.%I', v_ns.nspname, v.relname)
1245
+ ELSE format('unknown:%s.%s', 'pg_class', v.oid::text)
1246
+ END
1247
+ ) AS dependent_stable_id,
1248
+ COALESCE(
1249
+ ref_obj.stable_id,
1250
+ CASE
1251
+ WHEN ref_attr.attnum IS NOT NULL THEN format('column:%I.%I.%I', ref_ns.nspname, ref_rel.relname, ref_attr.attname)
1252
+ WHEN ref_rel.relkind IN ('r','p','f') THEN format('table:%I.%I', ref_ns.nspname, ref_rel.relname)
1253
+ WHEN ref_rel.relkind = 'v' THEN format('view:%I.%I', ref_ns.nspname, ref_rel.relname)
1254
+ WHEN ref_rel.relkind = 'm' THEN format('materializedView:%I.%I', ref_ns.nspname, ref_rel.relname)
1255
+ ELSE format('unknown:%s.%s', 'pg_class', COALESCE(ref_rel.oid::text, d.refobjid::text))
1256
+ END
1257
+ ) AS referenced_stable_id,
1258
+ d.deptype,
1259
+ COALESCE(dep_view.schema_name, v_ns.nspname) AS dep_schema,
1260
+ COALESCE(ref_obj.schema_name, ref_ns.nspname) AS ref_schema
1261
+ FROM pg_depend d
1262
+ JOIN pg_rewrite r ON r.oid = d.objid
1263
+ JOIN pg_class v ON r.ev_class = v.oid
1264
+ JOIN pg_namespace v_ns ON v.relnamespace = v_ns.oid
1265
+ LEFT JOIN objects dep_view
1266
+ ON dep_view.classid = 'pg_class'::regclass
1267
+ AND dep_view.objid = v.oid
1268
+ AND dep_view.objsubid = 0
1269
+ LEFT JOIN pg_class ref_rel ON ref_rel.oid = d.refobjid
1270
+ LEFT JOIN pg_namespace ref_ns ON ref_rel.relnamespace = ref_ns.oid
1271
+ LEFT JOIN pg_attribute ref_attr
1272
+ ON ref_attr.attrelid = ref_rel.oid
1273
+ AND ref_attr.attnum = d.refobjsubid
1274
+ AND d.refobjsubid <> 0
1275
+ LEFT JOIN objects ref_obj
1276
+ ON ref_obj.classid = d.refclassid
1277
+ AND ref_obj.objid = d.refobjid
1278
+ AND ref_obj.objsubid = COALESCE(NULLIF(d.refobjsubid,0),0)
1279
+ WHERE d.classid = 'pg_rewrite'::regclass
1280
+ AND d.refclassid = 'pg_class'::regclass
1281
+ AND v.relkind IN ('v','m')
1282
+ AND d.deptype = 'n'
1283
+ AND (d.refobjsubid = 0 OR (ref_attr.attnum > 0 AND NOT ref_attr.attisdropped))
1284
+ AND ref_rel.oid IS NOT NULL
1285
+ AND (
1286
+ ref_attr.attnum IS NOT NULL
1287
+ OR ref_rel.relkind IN ('r','p','f','v','m')
1288
+ )
1289
+ ),
1290
+ view_rewrite_proc_deps AS (
1291
+ SELECT DISTINCT
1292
+ COALESCE(
1293
+ dep_view.stable_id,
1294
+ CASE v.relkind
1295
+ WHEN 'v' THEN format('view:%I.%I', v_ns.nspname, v.relname)
1296
+ WHEN 'm' THEN format('materializedView:%I.%I', v_ns.nspname, v.relname)
1297
+ ELSE format('unknown:%s.%s', 'pg_class', v.oid::text)
1298
+ END
1299
+ ) AS dependent_stable_id,
1300
+ COALESCE(
1301
+ ref_proc_obj.stable_id,
1302
+ CASE
1303
+ WHEN ref_proc.prokind = 'a' THEN format(
1304
+ 'aggregate:%I.%I(%s)',
1305
+ ref_proc_ns.nspname,
1306
+ ref_proc.proname,
1307
+ trim(pg_catalog.pg_get_function_identity_arguments(ref_proc.oid))
1308
+ )
1309
+ ELSE format(
1310
+ 'procedure:%I.%I(%s)',
1311
+ ref_proc_ns.nspname,
1312
+ ref_proc.proname,
1313
+ COALESCE(
1314
+ (
1315
+ SELECT string_agg(format_type(oid, NULL), ',' ORDER BY ord)
1316
+ FROM unnest(ref_proc.proargtypes) WITH ORDINALITY AS t(oid, ord)
1317
+ ),
1318
+ ''
1319
+ )
1320
+ )
1321
+ END
1322
+ ) AS referenced_stable_id,
1323
+ d.deptype,
1324
+ COALESCE(dep_view.schema_name, v_ns.nspname) AS dep_schema,
1325
+ COALESCE(ref_proc_obj.schema_name, ref_proc_ns.nspname) AS ref_schema
1326
+ FROM pg_depend d
1327
+ JOIN pg_rewrite r ON r.oid = d.objid
1328
+ JOIN pg_class v ON r.ev_class = v.oid
1329
+ JOIN pg_namespace v_ns ON v.relnamespace = v_ns.oid
1330
+ LEFT JOIN objects dep_view
1331
+ ON dep_view.classid = 'pg_class'::regclass
1332
+ AND dep_view.objid = v.oid
1333
+ AND dep_view.objsubid = 0
1334
+ JOIN pg_proc ref_proc ON ref_proc.oid = d.refobjid
1335
+ JOIN pg_namespace ref_proc_ns ON ref_proc_ns.oid = ref_proc.pronamespace
1336
+ LEFT JOIN objects ref_proc_obj
1337
+ ON ref_proc_obj.classid = 'pg_proc'::regclass
1338
+ AND ref_proc_obj.objid = ref_proc.oid
1339
+ AND ref_proc_obj.objsubid = 0
1340
+ WHERE d.classid = 'pg_rewrite'::regclass
1341
+ AND d.refclassid = 'pg_proc'::regclass
1342
+ AND v.relkind IN ('v','m')
1343
+ AND d.deptype = 'n'
1344
+ ),
1345
+ constraint_deps AS (
1346
+ SELECT DISTINCT
1347
+ format('constraint:%I.%I.%I', fk_ns.nspname, fk_table.relname, fk_con.conname) AS dependent_stable_id,
1348
+ format('constraint:%I.%I.%I', ref_ns.nspname, ref_table.relname, ref_con.conname) AS referenced_stable_id,
1349
+ 'n'::"char" AS deptype,
1350
+ fk_ns.nspname AS dep_schema,
1351
+ ref_ns.nspname AS ref_schema
1352
+ FROM pg_constraint fk_con
1353
+ JOIN pg_class fk_table ON fk_con.conrelid = fk_table.oid
1354
+ JOIN pg_namespace fk_ns ON fk_table.relnamespace = fk_ns.oid
1355
+ JOIN pg_class ref_table ON fk_con.confrelid = ref_table.oid
1356
+ JOIN pg_namespace ref_ns ON ref_table.relnamespace = ref_ns.oid
1357
+ JOIN pg_constraint ref_con ON (
1358
+ ref_con.conrelid = fk_con.confrelid
1359
+ AND ref_con.contype IN ('p', 'u')
1360
+ AND ref_con.conkey = fk_con.confkey
1361
+ )
1362
+ WHERE fk_con.contype = 'f'
1363
+ ),
1364
+ index_schema_deps AS (
1365
+ -- Indexes depend on their schema (ensure schema exists before indexes)
1366
+ SELECT DISTINCT
1367
+ format('index:%I.%I.%I', ns.nspname, tbl.relname, idx_rel.relname) AS dependent_stable_id,
1368
+ format('schema:%I', ns.nspname) AS referenced_stable_id,
1369
+ 'n'::"char" AS deptype,
1370
+ ns.nspname AS dep_schema,
1371
+ ns.nspname AS ref_schema
1372
+ FROM pg_class idx_rel
1373
+ JOIN pg_index idx ON idx.indexrelid = idx_rel.oid
1374
+ JOIN pg_class tbl ON tbl.oid = idx.indrelid
1375
+ JOIN pg_namespace ns ON ns.oid = idx_rel.relnamespace
1376
+ WHERE idx_rel.relkind = 'i'
1377
+ ),
1378
+ index_table_deps AS (
1379
+ -- Indexes depend on their owning table
1380
+ SELECT DISTINCT
1381
+ format('index:%I.%I.%I', ns.nspname, tbl.relname, idx_rel.relname) AS dependent_stable_id,
1382
+ format('table:%I.%I', ns.nspname, tbl.relname) AS referenced_stable_id,
1383
+ 'n'::"char" AS deptype,
1384
+ ns.nspname AS dep_schema,
1385
+ ns.nspname AS ref_schema
1386
+ FROM pg_class idx_rel
1387
+ JOIN pg_index idx ON idx.indexrelid = idx_rel.oid
1388
+ JOIN pg_class tbl ON tbl.oid = idx.indrelid
1389
+ JOIN pg_namespace ns ON ns.oid = idx_rel.relnamespace
1390
+ WHERE idx_rel.relkind = 'i'
1391
+ ),
1392
+ ownership_deps AS (
1393
+ -- Schema ownership dependencies
1394
+ SELECT DISTINCT
1395
+ format('schema:%I', n.nspname) AS dependent_stable_id,
1396
+ format('role:%s', n.nspowner::regrole::text) AS referenced_stable_id,
1397
+ 'n'::"char" AS deptype,
1398
+ n.nspname AS dep_schema,
1399
+ NULL::text AS ref_schema
1400
+ FROM pg_namespace n
1401
+
1402
+ UNION ALL
1403
+
1404
+ -- Table ownership dependencies
1405
+ SELECT DISTINCT
1406
+ format('table:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1407
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1408
+ 'n'::"char" AS deptype,
1409
+ n.nspname AS dep_schema,
1410
+ NULL::text AS ref_schema
1411
+ FROM pg_class c
1412
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1413
+ WHERE c.relkind IN ('r','p')
1414
+
1415
+ UNION ALL
1416
+
1417
+ -- View ownership dependencies
1418
+ SELECT DISTINCT
1419
+ format('view:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1420
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1421
+ 'n'::"char" AS deptype,
1422
+ n.nspname AS dep_schema,
1423
+ NULL::text AS ref_schema
1424
+ FROM pg_class c
1425
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1426
+ WHERE c.relkind = 'v'
1427
+
1428
+ UNION ALL
1429
+
1430
+ -- Materialized view ownership dependencies
1431
+ SELECT DISTINCT
1432
+ format('materializedView:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1433
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1434
+ 'n'::"char" AS deptype,
1435
+ n.nspname AS dep_schema,
1436
+ NULL::text AS ref_schema
1437
+ FROM pg_class c
1438
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1439
+ WHERE c.relkind = 'm'
1440
+
1441
+ UNION ALL
1442
+
1443
+ -- Sequence ownership dependencies
1444
+ SELECT DISTINCT
1445
+ format('sequence:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1446
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1447
+ 'n'::"char" AS deptype,
1448
+ n.nspname AS dep_schema,
1449
+ NULL::text AS ref_schema
1450
+ FROM pg_class c
1451
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1452
+ WHERE c.relkind = 'S'
1453
+
1454
+ UNION ALL
1455
+
1456
+ -- Composite type ownership dependencies
1457
+ SELECT DISTINCT
1458
+ format('type:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1459
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1460
+ 'n'::"char" AS deptype,
1461
+ n.nspname AS dep_schema,
1462
+ NULL::text AS ref_schema
1463
+ FROM pg_class c
1464
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1465
+ WHERE c.relkind = 'c'
1466
+
1467
+ UNION ALL
1468
+
1469
+ -- Function/procedure/aggregate ownership dependencies
1470
+ SELECT DISTINCT
1471
+ CASE
1472
+ WHEN p.prokind = 'a' THEN format(
1473
+ 'aggregate:%I.%I(%s)',
1474
+ n.nspname,
1475
+ p.proname,
1476
+ trim(pg_catalog.pg_get_function_identity_arguments(p.oid))
1477
+ )
1478
+ ELSE format(
1479
+ 'procedure:%I.%I(%s)',
1480
+ n.nspname,
1481
+ p.proname,
1482
+ COALESCE(
1483
+ (
1484
+ SELECT string_agg(format_type(oid, NULL), ',' ORDER BY ord)
1485
+ FROM unnest(p.proargtypes) WITH ORDINALITY AS t(oid, ord)
1486
+ ),
1487
+ ''
1488
+ )
1489
+ )
1490
+ END AS dependent_stable_id,
1491
+ format('role:%s', p.proowner::regrole::text) AS referenced_stable_id,
1492
+ 'n'::"char" AS deptype,
1493
+ n.nspname AS dep_schema,
1494
+ NULL::text AS ref_schema
1495
+ FROM pg_proc p
1496
+ JOIN pg_namespace n ON p.pronamespace = n.oid
1497
+
1498
+ UNION ALL
1499
+
1500
+ -- Domain ownership dependencies
1501
+ SELECT DISTINCT
1502
+ format('domain:%I.%I', n.nspname, t.typname) AS dependent_stable_id,
1503
+ format('role:%s', t.typowner::regrole::text) AS referenced_stable_id,
1504
+ 'n'::"char" AS deptype,
1505
+ n.nspname AS dep_schema,
1506
+ NULL::text AS ref_schema
1507
+ FROM pg_type t
1508
+ JOIN pg_namespace n ON t.typnamespace = n.oid
1509
+ WHERE t.typtype = 'd'
1510
+
1511
+ UNION ALL
1512
+
1513
+ -- Enum ownership dependencies
1514
+ SELECT DISTINCT
1515
+ format('type:%I.%I', n.nspname, t.typname) AS dependent_stable_id,
1516
+ format('role:%s', t.typowner::regrole::text) AS referenced_stable_id,
1517
+ 'n'::"char" AS deptype,
1518
+ n.nspname AS dep_schema,
1519
+ NULL::text AS ref_schema
1520
+ FROM pg_type t
1521
+ JOIN pg_namespace n ON t.typnamespace = n.oid
1522
+ WHERE t.typtype = 'e'
1523
+
1524
+ UNION ALL
1525
+
1526
+ -- Range type ownership dependencies
1527
+ SELECT DISTINCT
1528
+ format('type:%I.%I', n.nspname, t.typname) AS dependent_stable_id,
1529
+ format('role:%s', t.typowner::regrole::text) AS referenced_stable_id,
1530
+ 'n'::"char" AS deptype,
1531
+ n.nspname AS dep_schema,
1532
+ NULL::text AS ref_schema
1533
+ FROM pg_type t
1534
+ JOIN pg_namespace n ON t.typnamespace = n.oid
1535
+ WHERE t.typtype = 'r'
1536
+
1537
+ UNION ALL
1538
+
1539
+ -- Multirange type ownership dependencies
1540
+ SELECT DISTINCT
1541
+ format('multirange:%I.%I', n.nspname, t.typname) AS dependent_stable_id,
1542
+ format('role:%s', t.typowner::regrole::text) AS referenced_stable_id,
1543
+ 'n'::"char" AS deptype,
1544
+ n.nspname AS dep_schema,
1545
+ NULL::text AS ref_schema
1546
+ FROM pg_type t
1547
+ JOIN pg_namespace n ON t.typnamespace = n.oid
1548
+ WHERE t.typtype = 'm'
1549
+
1550
+ UNION ALL
1551
+
1552
+ -- Base type ownership dependencies
1553
+ SELECT DISTINCT
1554
+ format('type:%I.%I', n.nspname, t.typname) AS dependent_stable_id,
1555
+ format('role:%s', t.typowner::regrole::text) AS referenced_stable_id,
1556
+ 'n'::"char" AS deptype,
1557
+ n.nspname AS dep_schema,
1558
+ NULL::text AS ref_schema
1559
+ FROM pg_type t
1560
+ JOIN pg_namespace n ON t.typnamespace = n.oid
1561
+ WHERE t.typtype = 'b'
1562
+
1563
+ UNION ALL
1564
+
1565
+ -- Trigger ownership dependencies (triggers inherit owner from their table)
1566
+ SELECT DISTINCT
1567
+ format('trigger:%I.%I.%I', tn.nspname, tc.relname, tg.tgname) AS dependent_stable_id,
1568
+ format('role:%s', tc.relowner::regrole::text) AS referenced_stable_id,
1569
+ 'n'::"char" AS deptype,
1570
+ tn.nspname AS dep_schema,
1571
+ NULL::text AS ref_schema
1572
+ FROM pg_trigger tg
1573
+ JOIN pg_class tc ON tg.tgrelid = tc.oid
1574
+ JOIN pg_namespace tn ON tc.relnamespace = tn.oid
1575
+ WHERE NOT tg.tgisinternal
1576
+
1577
+ UNION ALL
1578
+
1579
+ -- RLS Policy ownership dependencies (policies inherit owner from their table)
1580
+ SELECT DISTINCT
1581
+ format('rlsPolicy:%I.%I.%I', tn.nspname, tc.relname, pol.polname) AS dependent_stable_id,
1582
+ format('role:%s', tc.relowner::regrole::text) AS referenced_stable_id,
1583
+ 'n'::"char" AS deptype,
1584
+ tn.nspname AS dep_schema,
1585
+ NULL::text AS ref_schema
1586
+ FROM pg_policy pol
1587
+ JOIN pg_class tc ON pol.polrelid = tc.oid
1588
+ JOIN pg_namespace tn ON tc.relnamespace = tn.oid
1589
+
1590
+
1591
+ UNION ALL
1592
+
1593
+ -- Language ownership dependencies
1594
+ SELECT DISTINCT
1595
+ format('language:%I', l.lanname) AS dependent_stable_id,
1596
+ format('role:%s', l.lanowner::regrole::text) AS referenced_stable_id,
1597
+ 'n'::"char" AS deptype,
1598
+ NULL::text AS dep_schema,
1599
+ NULL::text AS ref_schema
1600
+ FROM pg_language l
1601
+ WHERE l.lanname NOT IN ('internal', 'c', 'sql')
1602
+
1603
+ UNION ALL
1604
+
1605
+ -- Event trigger ownership dependencies
1606
+ SELECT DISTINCT
1607
+ format('eventTrigger:%I', et.evtname) AS dependent_stable_id,
1608
+ format('role:%s', et.evtowner::regrole::text) AS referenced_stable_id,
1609
+ 'n'::"char" AS deptype,
1610
+ NULL::text AS dep_schema,
1611
+ NULL::text AS ref_schema
1612
+ FROM pg_event_trigger et
1613
+
1614
+ UNION ALL
1615
+
1616
+ -- Extension ownership dependencies
1617
+ SELECT DISTINCT
1618
+ format('extension:%I', e.extname) AS dependent_stable_id,
1619
+ format('role:%s', e.extowner::regrole::text) AS referenced_stable_id,
1620
+ 'n'::"char" AS deptype,
1621
+ NULL::text AS dep_schema,
1622
+ NULL::text AS ref_schema
1623
+ FROM pg_extension e
1624
+ WHERE e.extname <> 'plpgsql'
1625
+
1626
+ UNION ALL
1627
+
1628
+ -- Subscription ownership dependencies
1629
+ SELECT DISTINCT
1630
+ format('subscription:%I', s.subname) AS dependent_stable_id,
1631
+ format('role:%s', s.subowner::regrole::text) AS referenced_stable_id,
1632
+ 'n'::"char" AS deptype,
1633
+ NULL::text AS dep_schema,
1634
+ NULL::text AS ref_schema
1635
+ FROM pg_subscription s
1636
+ WHERE s.subdbid = (SELECT oid FROM pg_database WHERE datname = current_database())
1637
+
1638
+ UNION ALL
1639
+
1640
+ -- Publication ownership dependencies
1641
+ SELECT DISTINCT
1642
+ format('publication:%I', p.pubname) AS dependent_stable_id,
1643
+ format('role:%s', p.pubowner::regrole::text) AS referenced_stable_id,
1644
+ 'n'::"char" AS deptype,
1645
+ NULL::text AS dep_schema,
1646
+ NULL::text AS ref_schema
1647
+ FROM pg_publication p
1648
+
1649
+ UNION ALL
1650
+
1651
+ -- Collation ownership dependencies
1652
+ SELECT DISTINCT
1653
+ format('collation:%I.%I', n.nspname, c.collname) AS dependent_stable_id,
1654
+ format('role:%s', c.collowner::regrole::text) AS referenced_stable_id,
1655
+ 'n'::"char" AS deptype,
1656
+ n.nspname AS dep_schema,
1657
+ NULL::text AS ref_schema
1658
+ FROM pg_collation c
1659
+ JOIN pg_namespace n ON c.collnamespace = n.oid
1660
+
1661
+ UNION ALL
1662
+
1663
+ -- Foreign Data Wrapper ownership dependencies
1664
+ SELECT DISTINCT
1665
+ format('foreignDataWrapper:%I', fdw.fdwname) AS dependent_stable_id,
1666
+ format('role:%s', fdw.fdwowner::regrole::text) AS referenced_stable_id,
1667
+ 'n'::"char" AS deptype,
1668
+ NULL::text AS dep_schema,
1669
+ NULL::text AS ref_schema
1670
+ FROM pg_foreign_data_wrapper fdw
1671
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1672
+
1673
+ UNION ALL
1674
+
1675
+ -- Server ownership dependencies
1676
+ SELECT DISTINCT
1677
+ format('server:%I', srv.srvname) AS dependent_stable_id,
1678
+ format('role:%s', srv.srvowner::regrole::text) AS referenced_stable_id,
1679
+ 'n'::"char" AS deptype,
1680
+ NULL::text AS dep_schema,
1681
+ NULL::text AS ref_schema
1682
+ FROM pg_foreign_server srv
1683
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1684
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1685
+
1686
+ UNION ALL
1687
+
1688
+ -- Foreign Table ownership dependencies
1689
+ SELECT DISTINCT
1690
+ format('foreignTable:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1691
+ format('role:%s', c.relowner::regrole::text) AS referenced_stable_id,
1692
+ 'n'::"char" AS deptype,
1693
+ n.nspname AS dep_schema,
1694
+ NULL::text AS ref_schema
1695
+ FROM pg_class c
1696
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1697
+ JOIN pg_foreign_table ft ON ft.ftrelid = c.oid
1698
+ JOIN pg_foreign_server srv ON srv.oid = ft.ftserver
1699
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1700
+ WHERE c.relkind = 'f'
1701
+ AND NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1702
+ ),
1703
+ publication_deps AS (
1704
+ SELECT DISTINCT
1705
+ format('publication:%I', pub.pubname) AS dependent_stable_id,
1706
+ format('table:%I.%I', ns.nspname, cls.relname) AS referenced_stable_id,
1707
+ 'n'::"char" AS deptype,
1708
+ NULL::text AS dep_schema,
1709
+ ns.nspname AS ref_schema
1710
+ FROM pg_publication pub
1711
+ JOIN pg_publication_rel pr ON pr.prpubid = pub.oid
1712
+ JOIN pg_class cls ON cls.oid = pr.prrelid
1713
+ JOIN pg_namespace ns ON ns.oid = cls.relnamespace
1714
+ WHERE NOT ns.nspname LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
1715
+ ),
1716
+ publication_schema_deps AS (
1717
+ SELECT DISTINCT
1718
+ format('publication:%I', pub.pubname) AS dependent_stable_id,
1719
+ format('schema:%I', ns.nspname) AS referenced_stable_id,
1720
+ 'n'::"char" AS deptype,
1721
+ NULL::text AS dep_schema,
1722
+ ns.nspname AS ref_schema
1723
+ FROM pg_publication pub
1724
+ JOIN pg_publication_namespace pn ON pn.pnpubid = pub.oid
1725
+ JOIN pg_namespace ns ON ns.oid = pn.pnnspid
1726
+ WHERE NOT ns.nspname LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
1727
+ ),
1728
+ fdw_deps AS (
1729
+ -- Servers depend on their Foreign Data Wrapper
1730
+ SELECT DISTINCT
1731
+ format('server:%I', srv.srvname) AS dependent_stable_id,
1732
+ format('foreignDataWrapper:%I', fdw.fdwname) AS referenced_stable_id,
1733
+ 'n'::"char" AS deptype,
1734
+ NULL::text AS dep_schema,
1735
+ NULL::text AS ref_schema
1736
+ FROM pg_foreign_server srv
1737
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1738
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1739
+
1740
+ UNION ALL
1741
+
1742
+ -- User Mappings depend on their Server
1743
+ SELECT DISTINCT
1744
+ format('userMapping:%I:%s', srv.srvname, CASE WHEN um.umuser = 0 THEN 'PUBLIC' ELSE um.umuser::regrole::text END) AS dependent_stable_id,
1745
+ format('server:%I', srv.srvname) AS referenced_stable_id,
1746
+ 'n'::"char" AS deptype,
1747
+ NULL::text AS dep_schema,
1748
+ NULL::text AS ref_schema
1749
+ FROM pg_user_mapping um
1750
+ JOIN pg_foreign_server srv ON srv.oid = um.umserver
1751
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1752
+ WHERE NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1753
+
1754
+ UNION ALL
1755
+
1756
+ -- Foreign Tables depend on their Server
1757
+ SELECT DISTINCT
1758
+ format('foreignTable:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1759
+ format('server:%I', srv.srvname) AS referenced_stable_id,
1760
+ 'n'::"char" AS deptype,
1761
+ n.nspname AS dep_schema,
1762
+ NULL::text AS ref_schema
1763
+ FROM pg_class c
1764
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1765
+ JOIN pg_foreign_table ft ON ft.ftrelid = c.oid
1766
+ JOIN pg_foreign_server srv ON srv.oid = ft.ftserver
1767
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1768
+ WHERE c.relkind = 'f'
1769
+ AND NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1770
+
1771
+ UNION ALL
1772
+
1773
+ -- Foreign Tables depend on their Schema
1774
+ SELECT DISTINCT
1775
+ format('foreignTable:%I.%I', n.nspname, c.relname) AS dependent_stable_id,
1776
+ format('schema:%I', n.nspname) AS referenced_stable_id,
1777
+ 'n'::"char" AS deptype,
1778
+ n.nspname AS dep_schema,
1779
+ n.nspname AS ref_schema
1780
+ FROM pg_class c
1781
+ JOIN pg_namespace n ON c.relnamespace = n.oid
1782
+ JOIN pg_foreign_table ft ON ft.ftrelid = c.oid
1783
+ JOIN pg_foreign_server srv ON srv.oid = ft.ftserver
1784
+ JOIN pg_foreign_data_wrapper fdw ON fdw.oid = srv.srvfdw
1785
+ WHERE c.relkind = 'f'
1786
+ AND NOT fdw.fdwname LIKE ANY (ARRAY['pg\\_%'])
1787
+ ),
1788
+ all_rows AS (
1789
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM base
1790
+ UNION ALL
1791
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM comment_deps
1792
+ UNION ALL
1793
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM type_usage_deps
1794
+ UNION ALL
1795
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM view_rewrite_rel_deps
1796
+ UNION ALL
1797
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM view_rewrite_proc_deps
1798
+ UNION ALL
1799
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM constraint_deps
1800
+ UNION ALL
1801
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM index_schema_deps
1802
+ UNION ALL
1803
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM index_table_deps
1804
+ UNION ALL
1805
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM ownership_deps
1806
+ UNION ALL
1807
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM publication_deps
1808
+ UNION ALL
1809
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM publication_schema_deps
1810
+ UNION ALL
1811
+ SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM fdw_deps
1812
+ )
1813
+ SELECT DISTINCT
1814
+ dependent_stable_id,
1815
+ referenced_stable_id,
1816
+ deptype
1817
+ FROM all_rows
1818
+ -- In some corner case (composite type) we can have the same stable ids in the case where an internal object depends on it's parent type
1819
+ -- eg: compositeType contains internal columns but we don't distinct them from the parent type itself in our stable ids
1820
+ WHERE dependent_stable_id <> referenced_stable_id
1821
+ -- filter rows where dependent object is part of Postgres internals
1822
+ AND NOT (
1823
+ COALESCE(dep_schema, '') LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
1824
+ )
1825
+ ORDER BY dependent_stable_id, referenced_stable_id;
1826
+ `;
1827
+ // Extract privilege and membership dependencies
1828
+ const privilegeDepends = await extractPrivilegeAndMembershipDepends(sql);
1829
+ // Combine all dependency sources and remove duplicates
1830
+ const allDepends = new Set([...dependsRows, ...privilegeDepends]);
1831
+ return Array.from(allDepends).sort((a, b) => a.dependent_stable_id.localeCompare(b.dependent_stable_id) ||
1832
+ a.referenced_stable_id.localeCompare(b.referenced_stable_id));
1833
+ }