@supabase/pg-delta 0.0.0 → 1.0.0-alpha.1
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.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/cli/app.d.ts +1 -0
- package/dist/cli/app.js +26 -0
- package/dist/cli/bin/cli.d.ts +2 -0
- package/dist/cli/bin/cli.js +7 -0
- package/dist/cli/commands/apply.d.ts +5 -0
- package/dist/cli/commands/apply.js +85 -0
- package/dist/cli/commands/plan.d.ts +5 -0
- package/dist/cli/commands/plan.js +137 -0
- package/dist/cli/commands/sync.d.ts +5 -0
- package/dist/cli/commands/sync.js +141 -0
- package/dist/cli/formatters/index.d.ts +4 -0
- package/dist/cli/formatters/index.js +4 -0
- package/dist/cli/formatters/tree/tree-builder.d.ts +10 -0
- package/dist/cli/formatters/tree/tree-builder.js +333 -0
- package/dist/cli/formatters/tree/tree-renderer.d.ts +45 -0
- package/dist/cli/formatters/tree/tree-renderer.js +303 -0
- package/dist/cli/formatters/tree/tree.d.ts +8 -0
- package/dist/cli/formatters/tree/tree.js +161 -0
- package/dist/cli/utils/integrations.d.ts +14 -0
- package/dist/cli/utils/integrations.js +44 -0
- package/dist/cli/utils.d.ts +64 -0
- package/dist/cli/utils.js +160 -0
- package/dist/core/catalog.diff.d.ts +5 -0
- package/dist/core/catalog.diff.js +147 -0
- package/dist/core/catalog.model.d.ts +93 -0
- package/dist/core/catalog.model.js +254 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +1 -0
- package/dist/core/context.d.ts +11 -0
- package/dist/core/context.js +12 -0
- package/dist/core/depend.d.ts +31 -0
- package/dist/core/depend.js +1833 -0
- package/dist/core/expand-replace-dependencies.d.ts +14 -0
- package/dist/core/expand-replace-dependencies.js +280 -0
- package/dist/core/fingerprint.d.ts +15 -0
- package/dist/core/fingerprint.js +174 -0
- package/dist/core/integrations/filter/dsl.d.ts +97 -0
- package/dist/core/integrations/filter/dsl.js +107 -0
- package/dist/core/integrations/filter/extractors.d.ts +12 -0
- package/dist/core/integrations/filter/extractors.js +136 -0
- package/dist/core/integrations/filter/filter.types.d.ts +2 -0
- package/dist/core/integrations/filter/filter.types.js +1 -0
- package/dist/core/integrations/integration-dsl.d.ts +22 -0
- package/dist/core/integrations/integration-dsl.js +6 -0
- package/dist/core/integrations/integration.types.d.ts +6 -0
- package/dist/core/integrations/integration.types.js +1 -0
- package/dist/core/integrations/serialize/dsl.d.ts +58 -0
- package/dist/core/integrations/serialize/dsl.js +42 -0
- package/dist/core/integrations/serialize/serialize.types.d.ts +2 -0
- package/dist/core/integrations/serialize/serialize.types.js +1 -0
- package/dist/core/integrations/supabase.d.ts +10 -0
- package/dist/core/integrations/supabase.js +114 -0
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +10 -0
- package/dist/core/objects/aggregate/aggregate.diff.js +186 -0
- package/dist/core/objects/aggregate/aggregate.model.d.ts +174 -0
- package/dist/core/objects/aggregate/aggregate.model.js +297 -0
- package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +19 -0
- package/dist/core/objects/aggregate/changes/aggregate.alter.js +25 -0
- package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +17 -0
- package/dist/core/objects/aggregate/changes/aggregate.base.js +13 -0
- package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +23 -0
- package/dist/core/objects/aggregate/changes/aggregate.comment.js +44 -0
- package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +19 -0
- package/dist/core/objects/aggregate/changes/aggregate.create.js +228 -0
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +17 -0
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +26 -0
- package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +62 -0
- package/dist/core/objects/aggregate/changes/aggregate.privilege.js +102 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +6 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.js +1 -0
- package/dist/core/objects/base.change.d.ts +46 -0
- package/dist/core/objects/base.change.js +38 -0
- package/dist/core/objects/base.default-privileges.d.ts +29 -0
- package/dist/core/objects/base.default-privileges.js +167 -0
- package/dist/core/objects/base.diff.d.ts +6 -0
- package/dist/core/objects/base.diff.js +12 -0
- package/dist/core/objects/base.model.d.ts +74 -0
- package/dist/core/objects/base.model.js +47 -0
- package/dist/core/objects/base.privilege-diff.d.ts +54 -0
- package/dist/core/objects/base.privilege-diff.js +216 -0
- package/dist/core/objects/base.privilege.d.ts +27 -0
- package/dist/core/objects/base.privilege.js +169 -0
- package/dist/core/objects/collation/changes/collation.alter.d.ts +45 -0
- package/dist/core/objects/collation/changes/collation.alter.js +52 -0
- package/dist/core/objects/collation/changes/collation.base.d.ts +17 -0
- package/dist/core/objects/collation/changes/collation.base.js +13 -0
- package/dist/core/objects/collation/changes/collation.comment.d.ts +26 -0
- package/dist/core/objects/collation/changes/collation.comment.js +50 -0
- package/dist/core/objects/collation/changes/collation.create.d.ts +32 -0
- package/dist/core/objects/collation/changes/collation.create.js +86 -0
- package/dist/core/objects/collation/changes/collation.drop.d.ts +22 -0
- package/dist/core/objects/collation/changes/collation.drop.js +31 -0
- package/dist/core/objects/collation/changes/collation.types.d.ts +5 -0
- package/dist/core/objects/collation/changes/collation.types.js +1 -0
- package/dist/core/objects/collation/collation.diff.d.ts +13 -0
- package/dist/core/objects/collation/collation.diff.js +85 -0
- package/dist/core/objects/collation/collation.model.d.ts +67 -0
- package/dist/core/objects/collation/collation.model.js +207 -0
- package/dist/core/objects/domain/changes/domain.alter.d.ts +143 -0
- package/dist/core/objects/domain/changes/domain.alter.js +191 -0
- package/dist/core/objects/domain/changes/domain.base.d.ts +17 -0
- package/dist/core/objects/domain/changes/domain.base.js +13 -0
- package/dist/core/objects/domain/changes/domain.comment.d.ts +25 -0
- package/dist/core/objects/domain/changes/domain.comment.js +47 -0
- package/dist/core/objects/domain/changes/domain.create.d.ts +30 -0
- package/dist/core/objects/domain/changes/domain.create.js +92 -0
- package/dist/core/objects/domain/changes/domain.drop.d.ts +22 -0
- package/dist/core/objects/domain/changes/domain.drop.js +28 -0
- package/dist/core/objects/domain/changes/domain.privilege.d.ts +97 -0
- package/dist/core/objects/domain/changes/domain.privilege.js +127 -0
- package/dist/core/objects/domain/changes/domain.types.d.ts +6 -0
- package/dist/core/objects/domain/changes/domain.types.js +1 -0
- package/dist/core/objects/domain/domain.diff.d.ts +18 -0
- package/dist/core/objects/domain/domain.diff.js +244 -0
- package/dist/core/objects/domain/domain.model.d.ts +103 -0
- package/dist/core/objects/domain/domain.model.js +172 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +44 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +51 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +17 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.base.js +13 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +23 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +46 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +25 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.create.js +55 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +22 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +28 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +5 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.js +1 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +13 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.js +81 -0
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +45 -0
- package/dist/core/objects/event-trigger/event-trigger.model.js +89 -0
- package/dist/core/objects/extension/changes/extension.alter.d.ts +44 -0
- package/dist/core/objects/extension/changes/extension.alter.js +51 -0
- package/dist/core/objects/extension/changes/extension.base.d.ts +17 -0
- package/dist/core/objects/extension/changes/extension.base.js +13 -0
- package/dist/core/objects/extension/changes/extension.comment.d.ts +26 -0
- package/dist/core/objects/extension/changes/extension.comment.js +46 -0
- package/dist/core/objects/extension/changes/extension.create.d.ts +25 -0
- package/dist/core/objects/extension/changes/extension.create.js +49 -0
- package/dist/core/objects/extension/changes/extension.drop.d.ts +22 -0
- package/dist/core/objects/extension/changes/extension.drop.js +28 -0
- package/dist/core/objects/extension/changes/extension.types.d.ts +5 -0
- package/dist/core/objects/extension/changes/extension.types.js +1 -0
- package/dist/core/objects/extension/extension.diff.d.ts +10 -0
- package/dist/core/objects/extension/extension.diff.js +65 -0
- package/dist/core/objects/extension/extension.model.d.ts +52 -0
- package/dist/core/objects/extension/extension.model.js +268 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +51 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +61 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +50 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +25 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +78 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +28 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +123 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +221 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +59 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +128 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +5 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +163 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +248 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +50 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +25 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +64 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +31 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +129 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +268 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +117 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +215 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +65 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +84 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +43 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +24 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +62 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +28 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +123 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +209 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +62 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.model.js +118 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +37 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +38 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +24 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +52 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +23 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +34 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +4 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.d.ts +10 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.js +77 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +36 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +85 -0
- package/dist/core/objects/index/changes/index.alter.d.ts +76 -0
- package/dist/core/objects/index/changes/index.alter.js +94 -0
- package/dist/core/objects/index/changes/index.base.d.ts +17 -0
- package/dist/core/objects/index/changes/index.base.js +13 -0
- package/dist/core/objects/index/changes/index.comment.d.ts +26 -0
- package/dist/core/objects/index/changes/index.comment.js +50 -0
- package/dist/core/objects/index/changes/index.create.d.ts +30 -0
- package/dist/core/objects/index/changes/index.create.js +53 -0
- package/dist/core/objects/index/changes/index.drop.d.ts +22 -0
- package/dist/core/objects/index/changes/index.drop.js +28 -0
- package/dist/core/objects/index/changes/index.types.d.ts +5 -0
- package/dist/core/objects/index/changes/index.types.js +1 -0
- package/dist/core/objects/index/changes/utils.d.ts +3 -0
- package/dist/core/objects/index/changes/utils.js +6 -0
- package/dist/core/objects/index/index.diff.d.ts +12 -0
- package/dist/core/objects/index/index.diff.js +182 -0
- package/dist/core/objects/index/index.model.d.ts +150 -0
- package/dist/core/objects/index/index.model.js +340 -0
- package/dist/core/objects/language/changes/language.alter.d.ts +32 -0
- package/dist/core/objects/language/changes/language.alter.js +30 -0
- package/dist/core/objects/language/changes/language.base.d.ts +17 -0
- package/dist/core/objects/language/changes/language.base.js +13 -0
- package/dist/core/objects/language/changes/language.comment.d.ts +26 -0
- package/dist/core/objects/language/changes/language.comment.js +45 -0
- package/dist/core/objects/language/changes/language.create.d.ts +25 -0
- package/dist/core/objects/language/changes/language.create.js +76 -0
- package/dist/core/objects/language/changes/language.drop.d.ts +22 -0
- package/dist/core/objects/language/changes/language.drop.js +31 -0
- package/dist/core/objects/language/changes/language.privilege.d.ts +97 -0
- package/dist/core/objects/language/changes/language.privilege.js +128 -0
- package/dist/core/objects/language/changes/language.types.d.ts +6 -0
- package/dist/core/objects/language/changes/language.types.js +1 -0
- package/dist/core/objects/language/language.diff.d.ts +15 -0
- package/dist/core/objects/language/language.diff.js +117 -0
- package/dist/core/objects/language/language.model.d.ts +62 -0
- package/dist/core/objects/language/language.model.js +128 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +67 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +63 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +17 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.base.js +13 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +53 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +112 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +35 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.create.js +71 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +26 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +42 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +105 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +151 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +6 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.js +1 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +18 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.js +335 -0
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +152 -0
- package/dist/core/objects/materialized-view/materialized-view.model.js +228 -0
- package/dist/core/objects/procedure/changes/procedure.alter.d.ts +143 -0
- package/dist/core/objects/procedure/changes/procedure.alter.js +207 -0
- package/dist/core/objects/procedure/changes/procedure.base.d.ts +17 -0
- package/dist/core/objects/procedure/changes/procedure.base.js +13 -0
- package/dist/core/objects/procedure/changes/procedure.comment.d.ts +26 -0
- package/dist/core/objects/procedure/changes/procedure.comment.js +52 -0
- package/dist/core/objects/procedure/changes/procedure.create.d.ts +42 -0
- package/dist/core/objects/procedure/changes/procedure.create.js +77 -0
- package/dist/core/objects/procedure/changes/procedure.drop.d.ts +23 -0
- package/dist/core/objects/procedure/changes/procedure.drop.js +37 -0
- package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +98 -0
- package/dist/core/objects/procedure/changes/procedure.privilege.js +144 -0
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +6 -0
- package/dist/core/objects/procedure/changes/procedure.types.js +1 -0
- package/dist/core/objects/procedure/procedure.diff.d.ts +18 -0
- package/dist/core/objects/procedure/procedure.diff.js +282 -0
- package/dist/core/objects/procedure/procedure.model.d.ts +132 -0
- package/dist/core/objects/procedure/procedure.model.js +244 -0
- package/dist/core/objects/procedure/utils.d.ts +14 -0
- package/dist/core/objects/procedure/utils.js +55 -0
- package/dist/core/objects/publication/changes/publication.alter.d.ts +88 -0
- package/dist/core/objects/publication/changes/publication.alter.js +176 -0
- package/dist/core/objects/publication/changes/publication.base.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.base.js +13 -0
- package/dist/core/objects/publication/changes/publication.comment.d.ts +23 -0
- package/dist/core/objects/publication/changes/publication.comment.js +46 -0
- package/dist/core/objects/publication/changes/publication.create.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.create.js +61 -0
- package/dist/core/objects/publication/changes/publication.drop.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.drop.js +23 -0
- package/dist/core/objects/publication/changes/publication.types.d.ts +5 -0
- package/dist/core/objects/publication/changes/publication.types.js +1 -0
- package/dist/core/objects/publication/publication.diff.d.ts +5 -0
- package/dist/core/objects/publication/publication.diff.js +161 -0
- package/dist/core/objects/publication/publication.model.d.ts +96 -0
- package/dist/core/objects/publication/publication.model.js +186 -0
- package/dist/core/objects/publication/utils.d.ts +5 -0
- package/dist/core/objects/publication/utils.js +45 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +62 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +90 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.base.d.ts +17 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.base.js +13 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +23 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +51 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +27 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.create.js +79 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +22 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +33 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +5 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.types.js +1 -0
- package/dist/core/objects/rls-policy/rls-policy.diff.d.ts +10 -0
- package/dist/core/objects/rls-policy/rls-policy.diff.js +80 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +52 -0
- package/dist/core/objects/rls-policy/rls-policy.model.js +127 -0
- package/dist/core/objects/role/changes/role.alter.d.ts +78 -0
- package/dist/core/objects/role/changes/role.alter.js +55 -0
- package/dist/core/objects/role/changes/role.base.d.ts +17 -0
- package/dist/core/objects/role/changes/role.base.js +13 -0
- package/dist/core/objects/role/changes/role.comment.d.ts +23 -0
- package/dist/core/objects/role/changes/role.comment.js +42 -0
- package/dist/core/objects/role/changes/role.create.d.ts +38 -0
- package/dist/core/objects/role/changes/role.create.js +83 -0
- package/dist/core/objects/role/changes/role.drop.d.ts +22 -0
- package/dist/core/objects/role/changes/role.drop.js +28 -0
- package/dist/core/objects/role/changes/role.privilege.d.ts +148 -0
- package/dist/core/objects/role/changes/role.privilege.js +283 -0
- package/dist/core/objects/role/changes/role.types.d.ts +6 -0
- package/dist/core/objects/role/changes/role.types.js +1 -0
- package/dist/core/objects/role/role.diff.d.ts +13 -0
- package/dist/core/objects/role/role.diff.js +386 -0
- package/dist/core/objects/role/role.model.d.ts +89 -0
- package/dist/core/objects/role/role.model.js +312 -0
- package/dist/core/objects/rule/changes/rule.alter.d.ts +22 -0
- package/dist/core/objects/rule/changes/rule.alter.js +58 -0
- package/dist/core/objects/rule/changes/rule.base.d.ts +17 -0
- package/dist/core/objects/rule/changes/rule.base.js +13 -0
- package/dist/core/objects/rule/changes/rule.comment.d.ts +22 -0
- package/dist/core/objects/rule/changes/rule.comment.js +51 -0
- package/dist/core/objects/rule/changes/rule.create.d.ts +14 -0
- package/dist/core/objects/rule/changes/rule.create.js +28 -0
- package/dist/core/objects/rule/changes/rule.drop.d.ts +12 -0
- package/dist/core/objects/rule/changes/rule.drop.js +23 -0
- package/dist/core/objects/rule/changes/rule.types.d.ts +5 -0
- package/dist/core/objects/rule/changes/rule.types.js +1 -0
- package/dist/core/objects/rule/rule.diff.d.ts +3 -0
- package/dist/core/objects/rule/rule.diff.js +53 -0
- package/dist/core/objects/rule/rule.model.d.ts +72 -0
- package/dist/core/objects/rule/rule.model.js +156 -0
- package/dist/core/objects/schema/changes/schema.alter.d.ts +32 -0
- package/dist/core/objects/schema/changes/schema.alter.js +25 -0
- package/dist/core/objects/schema/changes/schema.base.d.ts +17 -0
- package/dist/core/objects/schema/changes/schema.base.js +13 -0
- package/dist/core/objects/schema/changes/schema.comment.d.ts +23 -0
- package/dist/core/objects/schema/changes/schema.comment.js +43 -0
- package/dist/core/objects/schema/changes/schema.create.d.ts +27 -0
- package/dist/core/objects/schema/changes/schema.create.js +38 -0
- package/dist/core/objects/schema/changes/schema.drop.d.ts +22 -0
- package/dist/core/objects/schema/changes/schema.drop.js +28 -0
- package/dist/core/objects/schema/changes/schema.privilege.d.ts +97 -0
- package/dist/core/objects/schema/changes/schema.privilege.js +131 -0
- package/dist/core/objects/schema/changes/schema.types.d.ts +6 -0
- package/dist/core/objects/schema/changes/schema.types.js +1 -0
- package/dist/core/objects/schema/schema.diff.d.ts +18 -0
- package/dist/core/objects/schema/schema.diff.js +142 -0
- package/dist/core/objects/schema/schema.model.d.ts +47 -0
- package/dist/core/objects/schema/schema.model.js +91 -0
- package/dist/core/objects/sequence/changes/sequence.alter.d.ts +59 -0
- package/dist/core/objects/sequence/changes/sequence.alter.js +75 -0
- package/dist/core/objects/sequence/changes/sequence.base.d.ts +17 -0
- package/dist/core/objects/sequence/changes/sequence.base.js +13 -0
- package/dist/core/objects/sequence/changes/sequence.comment.d.ts +23 -0
- package/dist/core/objects/sequence/changes/sequence.comment.js +47 -0
- package/dist/core/objects/sequence/changes/sequence.create.d.ts +25 -0
- package/dist/core/objects/sequence/changes/sequence.create.js +78 -0
- package/dist/core/objects/sequence/changes/sequence.drop.d.ts +22 -0
- package/dist/core/objects/sequence/changes/sequence.drop.js +31 -0
- package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +101 -0
- package/dist/core/objects/sequence/changes/sequence.privilege.js +135 -0
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +6 -0
- package/dist/core/objects/sequence/changes/sequence.types.js +1 -0
- package/dist/core/objects/sequence/sequence.diff.d.ts +20 -0
- package/dist/core/objects/sequence/sequence.diff.js +258 -0
- package/dist/core/objects/sequence/sequence.model.d.ts +76 -0
- package/dist/core/objects/sequence/sequence.model.js +169 -0
- package/dist/core/objects/subscription/changes/subscription.alter.d.ts +56 -0
- package/dist/core/objects/subscription/changes/subscription.alter.js +82 -0
- package/dist/core/objects/subscription/changes/subscription.base.d.ts +17 -0
- package/dist/core/objects/subscription/changes/subscription.base.js +13 -0
- package/dist/core/objects/subscription/changes/subscription.comment.d.ts +23 -0
- package/dist/core/objects/subscription/changes/subscription.comment.js +46 -0
- package/dist/core/objects/subscription/changes/subscription.create.d.ts +12 -0
- package/dist/core/objects/subscription/changes/subscription.create.js +52 -0
- package/dist/core/objects/subscription/changes/subscription.drop.d.ts +11 -0
- package/dist/core/objects/subscription/changes/subscription.drop.js +15 -0
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +5 -0
- package/dist/core/objects/subscription/changes/subscription.types.js +1 -0
- package/dist/core/objects/subscription/subscription.diff.d.ts +5 -0
- package/dist/core/objects/subscription/subscription.diff.js +167 -0
- package/dist/core/objects/subscription/subscription.model.d.ts +80 -0
- package/dist/core/objects/subscription/subscription.model.js +166 -0
- package/dist/core/objects/subscription/utils.d.ts +37 -0
- package/dist/core/objects/subscription/utils.js +112 -0
- package/dist/core/objects/table/changes/table.alter.d.ts +357 -0
- package/dist/core/objects/table/changes/table.alter.js +607 -0
- package/dist/core/objects/table/changes/table.base.d.ts +17 -0
- package/dist/core/objects/table/changes/table.base.js +13 -0
- package/dist/core/objects/table/changes/table.comment.d.ts +106 -0
- package/dist/core/objects/table/changes/table.comment.js +175 -0
- package/dist/core/objects/table/changes/table.create.d.ts +33 -0
- package/dist/core/objects/table/changes/table.create.js +145 -0
- package/dist/core/objects/table/changes/table.drop.d.ts +22 -0
- package/dist/core/objects/table/changes/table.drop.js +35 -0
- package/dist/core/objects/table/changes/table.privilege.d.ts +107 -0
- package/dist/core/objects/table/changes/table.privilege.js +150 -0
- package/dist/core/objects/table/changes/table.types.d.ts +6 -0
- package/dist/core/objects/table/changes/table.types.js +1 -0
- package/dist/core/objects/table/table.diff.d.ts +18 -0
- package/dist/core/objects/table/table.diff.js +668 -0
- package/dist/core/objects/table/table.model.d.ts +341 -0
- package/dist/core/objects/table/table.model.js +426 -0
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +29 -0
- package/dist/core/objects/trigger/changes/trigger.alter.js +27 -0
- package/dist/core/objects/trigger/changes/trigger.base.d.ts +17 -0
- package/dist/core/objects/trigger/changes/trigger.base.js +13 -0
- package/dist/core/objects/trigger/changes/trigger.comment.d.ts +23 -0
- package/dist/core/objects/trigger/changes/trigger.comment.js +51 -0
- package/dist/core/objects/trigger/changes/trigger.create.d.ts +41 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +61 -0
- package/dist/core/objects/trigger/changes/trigger.drop.d.ts +22 -0
- package/dist/core/objects/trigger/changes/trigger.drop.js +33 -0
- package/dist/core/objects/trigger/changes/trigger.types.d.ts +5 -0
- package/dist/core/objects/trigger/changes/trigger.types.js +1 -0
- package/dist/core/objects/trigger/trigger.diff.d.ts +11 -0
- package/dist/core/objects/trigger/trigger.diff.js +84 -0
- package/dist/core/objects/trigger/trigger.model.d.ts +92 -0
- package/dist/core/objects/trigger/trigger.model.js +235 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +81 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +123 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +17 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.base.js +13 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +53 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +108 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +23 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.create.js +72 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +22 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +31 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +97 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +131 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +6 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.js +1 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +18 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.js +250 -0
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +148 -0
- package/dist/core/objects/type/composite-type/composite-type.model.js +223 -0
- package/dist/core/objects/type/enum/changes/enum.alter.d.ts +52 -0
- package/dist/core/objects/type/enum/changes/enum.alter.js +60 -0
- package/dist/core/objects/type/enum/changes/enum.base.d.ts +17 -0
- package/dist/core/objects/type/enum/changes/enum.base.js +13 -0
- package/dist/core/objects/type/enum/changes/enum.comment.d.ts +26 -0
- package/dist/core/objects/type/enum/changes/enum.comment.js +47 -0
- package/dist/core/objects/type/enum/changes/enum.create.d.ts +22 -0
- package/dist/core/objects/type/enum/changes/enum.create.js +43 -0
- package/dist/core/objects/type/enum/changes/enum.drop.d.ts +22 -0
- package/dist/core/objects/type/enum/changes/enum.drop.js +28 -0
- package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +97 -0
- package/dist/core/objects/type/enum/changes/enum.privilege.js +131 -0
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +6 -0
- package/dist/core/objects/type/enum/changes/enum.types.js +1 -0
- package/dist/core/objects/type/enum/enum.diff.d.ts +18 -0
- package/dist/core/objects/type/enum/enum.diff.js +268 -0
- package/dist/core/objects/type/enum/enum.model.d.ts +66 -0
- package/dist/core/objects/type/enum/enum.model.js +154 -0
- package/dist/core/objects/type/range/changes/range.alter.d.ts +33 -0
- package/dist/core/objects/type/range/changes/range.alter.js +30 -0
- package/dist/core/objects/type/range/changes/range.base.d.ts +17 -0
- package/dist/core/objects/type/range/changes/range.base.js +13 -0
- package/dist/core/objects/type/range/changes/range.comment.d.ts +26 -0
- package/dist/core/objects/type/range/changes/range.comment.js +47 -0
- package/dist/core/objects/type/range/changes/range.create.d.ts +31 -0
- package/dist/core/objects/type/range/changes/range.create.js +113 -0
- package/dist/core/objects/type/range/changes/range.drop.d.ts +22 -0
- package/dist/core/objects/type/range/changes/range.drop.js +28 -0
- package/dist/core/objects/type/range/changes/range.privilege.d.ts +97 -0
- package/dist/core/objects/type/range/changes/range.privilege.js +131 -0
- package/dist/core/objects/type/range/changes/range.types.d.ts +6 -0
- package/dist/core/objects/type/range/changes/range.types.js +1 -0
- package/dist/core/objects/type/range/range.diff.d.ts +18 -0
- package/dist/core/objects/type/range/range.diff.js +172 -0
- package/dist/core/objects/type/range/range.model.d.ts +81 -0
- package/dist/core/objects/type/range/range.model.js +165 -0
- package/dist/core/objects/type/type.types.d.ts +4 -0
- package/dist/core/objects/type/type.types.js +1 -0
- package/dist/core/objects/utils.d.ts +57 -0
- package/dist/core/objects/utils.js +137 -0
- package/dist/core/objects/view/changes/view.alter.d.ts +62 -0
- package/dist/core/objects/view/changes/view.alter.js +75 -0
- package/dist/core/objects/view/changes/view.base.d.ts +17 -0
- package/dist/core/objects/view/changes/view.base.js +13 -0
- package/dist/core/objects/view/changes/view.comment.d.ts +23 -0
- package/dist/core/objects/view/changes/view.comment.js +46 -0
- package/dist/core/objects/view/changes/view.create.d.ts +27 -0
- package/dist/core/objects/view/changes/view.create.js +57 -0
- package/dist/core/objects/view/changes/view.drop.d.ts +17 -0
- package/dist/core/objects/view/changes/view.drop.js +30 -0
- package/dist/core/objects/view/changes/view.privilege.d.ts +107 -0
- package/dist/core/objects/view/changes/view.privilege.js +150 -0
- package/dist/core/objects/view/changes/view.types.d.ts +6 -0
- package/dist/core/objects/view/changes/view.types.js +1 -0
- package/dist/core/objects/view/view.diff.d.ts +18 -0
- package/dist/core/objects/view/view.diff.js +270 -0
- package/dist/core/objects/view/view.model.d.ts +152 -0
- package/dist/core/objects/view/view.model.js +250 -0
- package/dist/core/plan/apply.d.ts +33 -0
- package/dist/core/plan/apply.js +112 -0
- package/dist/core/plan/create.d.ts +22 -0
- package/dist/core/plan/create.js +228 -0
- package/dist/core/plan/hierarchy.d.ts +19 -0
- package/dist/core/plan/hierarchy.js +488 -0
- package/dist/core/plan/index.d.ts +18 -0
- package/dist/core/plan/index.js +20 -0
- package/dist/core/plan/io.d.ts +12 -0
- package/dist/core/plan/io.js +17 -0
- package/dist/core/plan/risk.d.ts +10 -0
- package/dist/core/plan/risk.js +38 -0
- package/dist/core/plan/serialize.d.ts +26 -0
- package/dist/core/plan/serialize.js +176 -0
- package/dist/core/plan/statements.d.ts +8 -0
- package/dist/core/plan/statements.js +13 -0
- package/dist/core/plan/types.d.ts +142 -0
- package/dist/core/plan/types.js +32 -0
- package/dist/core/postgres-config.d.ts +8 -0
- package/dist/core/postgres-config.js +46 -0
- package/dist/core/sort/custom-constraints.d.ts +9 -0
- package/dist/core/sort/custom-constraints.js +133 -0
- package/dist/core/sort/debug-visualization.d.ts +8 -0
- package/dist/core/sort/debug-visualization.js +145 -0
- package/dist/core/sort/dependency-filter.d.ts +19 -0
- package/dist/core/sort/dependency-filter.js +152 -0
- package/dist/core/sort/graph-builder.d.ts +37 -0
- package/dist/core/sort/graph-builder.js +172 -0
- package/dist/core/sort/graph-utils.d.ts +14 -0
- package/dist/core/sort/graph-utils.js +41 -0
- package/dist/core/sort/logical-sort.d.ts +26 -0
- package/dist/core/sort/logical-sort.js +532 -0
- package/dist/core/sort/sort-changes.d.ts +28 -0
- package/dist/core/sort/sort-changes.js +147 -0
- package/dist/core/sort/topological-sort.d.ts +20 -0
- package/dist/core/sort/topological-sort.js +138 -0
- package/dist/core/sort/types.d.ts +102 -0
- package/dist/core/sort/types.js +1 -0
- package/dist/core/sort/utils.d.ts +23 -0
- package/dist/core/sort/utils.js +51 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +8 -0
- package/package.json +61 -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
|
+
}
|