@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.4
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/README.md +22 -0
- package/dist/cli/bin/cli.js +0 -0
- package/dist/cli/commands/plan.js +21 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/objects/table/table.model.d.ts +4 -2
- package/dist/core/objects/table/table.model.js +3 -0
- package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
- package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
- package/dist/core/objects/trigger/trigger.model.js +3 -0
- package/dist/core/plan/apply.js +3 -3
- package/dist/core/plan/create.js +34 -15
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2449 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +868 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/postgres-config.d.ts +15 -0
- package/dist/core/postgres-config.js +30 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/package.json +37 -22
- package/src/cli/app.ts +28 -0
- package/src/cli/bin/cli.ts +9 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/plan.ts +195 -0
- package/src/cli/commands/sync.ts +185 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +237 -0
- package/src/cli/utils/integrations.ts +42 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog.diff.ts +246 -0
- package/src/core/catalog.model.ts +384 -0
- package/src/core/change.types.ts +44 -0
- package/src/core/context.ts +26 -0
- package/src/core/depend.ts +1870 -0
- package/src/core/expand-replace-dependencies.ts +380 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/integrations/filter/dsl.ts +204 -0
- package/src/core/integrations/filter/extractors.ts +145 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/integration-dsl.ts +24 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/serialize/dsl.ts +77 -0
- package/src/core/integrations/serialize/serialize.types.ts +3 -0
- package/src/core/integrations/supabase.ts +121 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
- package/src/core/objects/base.change.ts +62 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.ts +82 -0
- package/src/core/objects/base.privilege-diff.ts +299 -0
- package/src/core/objects/base.privilege.ts +184 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
- package/src/core/objects/collation/changes/collation.alter.ts +79 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +68 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
- package/src/core/objects/collation/changes/collation.create.ts +106 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
- package/src/core/objects/collation/changes/collation.drop.ts +37 -0
- package/src/core/objects/collation/changes/collation.types.ts +10 -0
- package/src/core/objects/collation/collation.diff.test.ts +100 -0
- package/src/core/objects/collation/collation.diff.ts +126 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
- package/src/core/objects/domain/changes/domain.alter.ts +286 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +59 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
- package/src/core/objects/domain/changes/domain.create.ts +118 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
- package/src/core/objects/domain/changes/domain.drop.ts +34 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
- package/src/core/objects/domain/changes/domain.types.ts +12 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +358 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
- package/src/core/objects/extension/changes/extension.alter.ts +78 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +64 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
- package/src/core/objects/extension/changes/extension.create.ts +63 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
- package/src/core/objects/extension/changes/extension.drop.ts +34 -0
- package/src/core/objects/extension/changes/extension.types.ts +10 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +200 -0
- package/src/core/objects/index/changes/index.alter.ts +144 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +63 -0
- package/src/core/objects/index/changes/index.create.test.ts +66 -0
- package/src/core/objects/index/changes/index.create.ts +68 -0
- package/src/core/objects/index/changes/index.drop.test.ts +44 -0
- package/src/core/objects/index/changes/index.drop.ts +34 -0
- package/src/core/objects/index/changes/index.types.ts +6 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.ts +370 -0
- package/src/core/objects/language/changes/language.alter.test.ts +33 -0
- package/src/core/objects/language/changes/language.alter.ts +53 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +58 -0
- package/src/core/objects/language/changes/language.create.test.ts +27 -0
- package/src/core/objects/language/changes/language.create.ts +104 -0
- package/src/core/objects/language/changes/language.drop.test.ts +25 -0
- package/src/core/objects/language/changes/language.drop.ts +39 -0
- package/src/core/objects/language/changes/language.privilege.ts +172 -0
- package/src/core/objects/language/changes/language.types.ts +12 -0
- package/src/core/objects/language/language.diff.test.ts +53 -0
- package/src/core/objects/language/language.diff.ts +176 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
- package/src/core/objects/procedure/procedure.diff.ts +404 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
- package/src/core/objects/publication/changes/publication.alter.ts +243 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
- package/src/core/objects/publication/changes/publication.comment.ts +64 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
- package/src/core/objects/publication/changes/publication.create.ts +82 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
- package/src/core/objects/publication/changes/publication.drop.ts +29 -0
- package/src/core/objects/publication/changes/publication.types.ts +26 -0
- package/src/core/objects/publication/publication.diff.test.ts +292 -0
- package/src/core/objects/publication/publication.diff.ts +253 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
- package/src/core/objects/role/changes/role.alter.test.ts +346 -0
- package/src/core/objects/role/changes/role.alter.ts +110 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +55 -0
- package/src/core/objects/role/changes/role.create.test.ts +52 -0
- package/src/core/objects/role/changes/role.create.ts +102 -0
- package/src/core/objects/role/changes/role.drop.test.ts +29 -0
- package/src/core/objects/role/changes/role.drop.ts +34 -0
- package/src/core/objects/role/changes/role.privilege.ts +376 -0
- package/src/core/objects/role/changes/role.types.ts +12 -0
- package/src/core/objects/role/role.diff.test.ts +44 -0
- package/src/core/objects/role/role.diff.ts +479 -0
- package/src/core/objects/role/role.model.ts +344 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
- package/src/core/objects/rule/changes/rule.alter.ts +72 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
- package/src/core/objects/rule/changes/rule.comment.ts +62 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
- package/src/core/objects/rule/changes/rule.create.ts +42 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
- package/src/core/objects/rule/changes/rule.drop.ts +29 -0
- package/src/core/objects/rule/changes/rule.types.ts +12 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
- package/src/core/objects/schema/changes/schema.alter.ts +45 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +56 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
- package/src/core/objects/schema/changes/schema.drop.ts +34 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
- package/src/core/objects/schema/changes/schema.types.ts +12 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +209 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
- package/src/core/objects/sequence/sequence.diff.ts +359 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
- package/src/core/objects/subscription/subscription.diff.ts +241 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +823 -0
- package/src/core/objects/table/changes/table.alter.ts +806 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +266 -0
- package/src/core/objects/table/changes/table.create.test.ts +150 -0
- package/src/core/objects/table/changes/table.create.ts +188 -0
- package/src/core/objects/table/changes/table.drop.test.ts +34 -0
- package/src/core/objects/table/changes/table.drop.ts +45 -0
- package/src/core/objects/table/changes/table.privilege.ts +200 -0
- package/src/core/objects/table/changes/table.types.ts +12 -0
- package/src/core/objects/table/table.diff.test.ts +711 -0
- package/src/core/objects/table/table.diff.ts +953 -0
- package/src/core/objects/table/table.model.ts +460 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
- package/src/core/objects/trigger/trigger.diff.ts +116 -0
- package/src/core/objects/trigger/trigger.model.ts +252 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
- package/src/core/objects/type/enum/enum.diff.ts +396 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
- package/src/core/objects/type/range/changes/range.alter.ts +51 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +64 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
- package/src/core/objects/type/range/changes/range.create.ts +151 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
- package/src/core/objects/type/range/changes/range.drop.ts +34 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
- package/src/core/objects/type/range/changes/range.types.ts +12 -0
- package/src/core/objects/type/range/range.diff.test.ts +70 -0
- package/src/core/objects/type/range/range.diff.ts +259 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +5 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +110 -0
- package/src/core/objects/view/changes/view.alter.ts +112 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +59 -0
- package/src/core/objects/view/changes/view.create.test.ts +65 -0
- package/src/core/objects/view/changes/view.create.ts +73 -0
- package/src/core/objects/view/changes/view.drop.test.ts +34 -0
- package/src/core/objects/view/changes/view.drop.ts +40 -0
- package/src/core/objects/view/changes/view.privilege.ts +200 -0
- package/src/core/objects/view/changes/view.types.ts +12 -0
- package/src/core/objects/view/view.diff.test.ts +91 -0
- package/src/core/objects/view/view.diff.ts +365 -0
- package/src/core/objects/view/view.model.ts +276 -0
- package/src/core/plan/apply.ts +190 -0
- package/src/core/plan/create.ts +432 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.ts +195 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2806 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
- package/src/core/plan/sql-format/format-off.test.ts +809 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1085 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +165 -0
- package/src/core/postgres-config.ts +169 -0
- package/src/core/sort/custom-constraints.ts +161 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +223 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.ts +590 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/index.ts +14 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
2
|
+
import type { Pool } from "pg";
|
|
3
|
+
import z from "zod";
|
|
4
|
+
import { BasePgModel } from "../base.model.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* All properties exposed by CREATE EXTENSION statement are included in diff output.
|
|
8
|
+
* https://www.postgresql.org/docs/current/sql-createextension.html
|
|
9
|
+
*
|
|
10
|
+
* ALTER EXTENSION statement can be generated for changes to the following properties:
|
|
11
|
+
* - version (limited to available ones), schema (only if relocatable)
|
|
12
|
+
* https://www.postgresql.org/docs/current/sql-alterextension.html
|
|
13
|
+
*
|
|
14
|
+
* Adding or dropping member objects are not supported. For eg. pgmq allows detaching
|
|
15
|
+
* user defined queues by removing its entry from pg_depend. If the detached table
|
|
16
|
+
* lives in an excluded schema like pg_catalog, it will not be diffed.
|
|
17
|
+
*
|
|
18
|
+
* The extension's configuration tables are not diffed.
|
|
19
|
+
* - extconfig, extcondition
|
|
20
|
+
* https://www.postgresql.org/docs/current/catalog-pg-extension.html
|
|
21
|
+
*/
|
|
22
|
+
const extensionPropsSchema = z.object({
|
|
23
|
+
name: z.string(),
|
|
24
|
+
schema: z.string(),
|
|
25
|
+
relocatable: z.boolean(),
|
|
26
|
+
version: z.string(),
|
|
27
|
+
owner: z.string(),
|
|
28
|
+
comment: z.string().nullable(),
|
|
29
|
+
members: z.array(z.string()),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export type ExtensionProps = z.infer<typeof extensionPropsSchema>;
|
|
33
|
+
|
|
34
|
+
export class Extension extends BasePgModel {
|
|
35
|
+
public readonly name: ExtensionProps["name"];
|
|
36
|
+
public readonly schema: ExtensionProps["schema"];
|
|
37
|
+
public readonly relocatable: ExtensionProps["relocatable"];
|
|
38
|
+
public readonly version: ExtensionProps["version"];
|
|
39
|
+
public readonly owner: ExtensionProps["owner"];
|
|
40
|
+
public readonly comment: ExtensionProps["comment"];
|
|
41
|
+
public readonly members: ExtensionProps["members"];
|
|
42
|
+
|
|
43
|
+
constructor(props: ExtensionProps) {
|
|
44
|
+
super();
|
|
45
|
+
|
|
46
|
+
// Identity fields
|
|
47
|
+
this.name = props.name;
|
|
48
|
+
|
|
49
|
+
// Data fields
|
|
50
|
+
this.schema = props.schema;
|
|
51
|
+
this.relocatable = props.relocatable;
|
|
52
|
+
this.version = props.version;
|
|
53
|
+
this.owner = props.owner;
|
|
54
|
+
this.comment = props.comment;
|
|
55
|
+
this.members = props.members;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get stableId(): `extension:${string}` {
|
|
59
|
+
// Extension names are unique per database; schema is relocatable
|
|
60
|
+
return `extension:${this.name}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
get identityFields() {
|
|
64
|
+
return {
|
|
65
|
+
name: this.name,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
get dataFields() {
|
|
70
|
+
return {
|
|
71
|
+
schema: this.schema,
|
|
72
|
+
relocatable: this.relocatable,
|
|
73
|
+
version: this.version,
|
|
74
|
+
owner: this.owner,
|
|
75
|
+
comment: this.comment,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// TODO: fetch extension dependencies so we can determine when to use CASCADE on creation
|
|
81
|
+
export async function extractExtensions(pool: Pool): Promise<Extension[]> {
|
|
82
|
+
const { rows: extensionRows } = await pool.query<ExtensionProps>(sql`
|
|
83
|
+
with extension_rows as (
|
|
84
|
+
select
|
|
85
|
+
e.oid,
|
|
86
|
+
quote_ident(e.extname) as name,
|
|
87
|
+
e.extnamespace::regnamespace::text as schema,
|
|
88
|
+
e.extrelocatable as relocatable,
|
|
89
|
+
e.extversion as version,
|
|
90
|
+
e.extowner::regrole::text as owner,
|
|
91
|
+
obj_description(e.oid, 'pg_extension') as comment
|
|
92
|
+
from
|
|
93
|
+
pg_catalog.pg_extension e
|
|
94
|
+
), extension_members_raw as (
|
|
95
|
+
select
|
|
96
|
+
er.oid as extension_oid,
|
|
97
|
+
d.classid,
|
|
98
|
+
d.objid,
|
|
99
|
+
d.objsubid
|
|
100
|
+
from
|
|
101
|
+
extension_rows er
|
|
102
|
+
join pg_depend d on d.refclassid = 'pg_extension'::regclass
|
|
103
|
+
and d.refobjid = er.oid
|
|
104
|
+
where
|
|
105
|
+
d.deptype = 'e'
|
|
106
|
+
), ids as (
|
|
107
|
+
select distinct
|
|
108
|
+
classid,
|
|
109
|
+
objid,
|
|
110
|
+
coalesce(nullif(objsubid, 0), 0)::int2 as objsubid
|
|
111
|
+
from extension_members_raw
|
|
112
|
+
), objects as (
|
|
113
|
+
select 'pg_namespace'::regclass as classid, n.oid as objid, 0::int2 as objsubid,
|
|
114
|
+
format('schema:%I', n.nspname) as stable_id
|
|
115
|
+
from pg_namespace n
|
|
116
|
+
join ids i on i.classid = 'pg_namespace'::regclass and i.objid = n.oid and i.objsubid = 0
|
|
117
|
+
|
|
118
|
+
union all
|
|
119
|
+
|
|
120
|
+
select 'pg_class'::regclass, c.oid, 0::int2,
|
|
121
|
+
case c.relkind
|
|
122
|
+
when 'r' then format('table:%I.%I', ns.nspname, c.relname)
|
|
123
|
+
when 'p' then format('table:%I.%I', ns.nspname, c.relname)
|
|
124
|
+
when 'v' then format('view:%I.%I', ns.nspname, c.relname)
|
|
125
|
+
when 'm' then format('materializedView:%I.%I', ns.nspname, c.relname)
|
|
126
|
+
when 'S' then format('sequence:%I.%I', ns.nspname, c.relname)
|
|
127
|
+
when 'i' then format('index:%I.%I.%I', ns.nspname, tbl.relname, c.relname)
|
|
128
|
+
when 'c' then format('type:%I.%I', ns.nspname, c.relname)
|
|
129
|
+
else format('unknown:%s.%s', 'pg_class', c.oid::text)
|
|
130
|
+
end as stable_id
|
|
131
|
+
from pg_class c
|
|
132
|
+
join pg_namespace ns on ns.oid = c.relnamespace
|
|
133
|
+
left join pg_index idx on idx.indexrelid = c.oid
|
|
134
|
+
left join pg_class tbl on tbl.oid = idx.indrelid
|
|
135
|
+
join ids i on i.classid = 'pg_class'::regclass and i.objid = c.oid and i.objsubid = 0
|
|
136
|
+
|
|
137
|
+
union all
|
|
138
|
+
|
|
139
|
+
select 'pg_class'::regclass, a.attrelid, a.attnum,
|
|
140
|
+
format('column:%I.%I.%I', ns.nspname, c.relname, a.attname) as stable_id
|
|
141
|
+
from pg_attribute a
|
|
142
|
+
join pg_class c on c.oid = a.attrelid
|
|
143
|
+
join pg_namespace ns on ns.oid = c.relnamespace
|
|
144
|
+
join ids i on i.classid = 'pg_class'::regclass and i.objid = a.attrelid and i.objsubid = a.attnum
|
|
145
|
+
where a.attnum > 0 and not a.attisdropped
|
|
146
|
+
|
|
147
|
+
union all
|
|
148
|
+
|
|
149
|
+
select 'pg_type'::regclass, t.oid, 0::int2,
|
|
150
|
+
case t.typtype
|
|
151
|
+
when 'd' then format('domain:%I.%I', ns.nspname, t.typname)
|
|
152
|
+
when 'e' then format('type:%I.%I', ns.nspname, t.typname)
|
|
153
|
+
when 'r' then format('type:%I.%I', ns.nspname, t.typname)
|
|
154
|
+
when 'm' then format('multirange:%I.%I', ns.nspname, t.typname)
|
|
155
|
+
when 'c' then
|
|
156
|
+
case
|
|
157
|
+
when r.oid is not null and r.relkind in ('r','p','f') then format('table:%I.%I', rns.nspname, r.relname)
|
|
158
|
+
when r.oid is not null and r.relkind = 'v' then format('view:%I.%I', rns.nspname, r.relname)
|
|
159
|
+
when r.oid is not null and r.relkind = 'm' then format('materializedView:%I.%I', rns.nspname, r.relname)
|
|
160
|
+
else format('type:%I.%I', ns.nspname, t.typname)
|
|
161
|
+
end
|
|
162
|
+
when 'p' then format('pseudoType:%I.%I', ns.nspname, t.typname)
|
|
163
|
+
else format('type:%I.%I', ns.nspname, t.typname)
|
|
164
|
+
end as stable_id
|
|
165
|
+
from pg_type t
|
|
166
|
+
join pg_namespace ns on ns.oid = t.typnamespace
|
|
167
|
+
left join pg_class r on r.oid = t.typrelid
|
|
168
|
+
left join pg_namespace rns on rns.oid = r.relnamespace
|
|
169
|
+
join ids i on i.classid = 'pg_type'::regclass and i.objid = t.oid and i.objsubid = 0
|
|
170
|
+
|
|
171
|
+
union all
|
|
172
|
+
|
|
173
|
+
select 'pg_constraint'::regclass, c.oid, 0::int2,
|
|
174
|
+
case
|
|
175
|
+
when c.contypid <> 0 then format('constraint:%I.%I.%I', ns.nspname, ty.typname, c.conname)
|
|
176
|
+
when c.conrelid <> 0 then format('constraint:%I.%I.%I', tbl_ns.nspname, tbl.relname, c.conname)
|
|
177
|
+
else format('constraint:%s', c.oid::text)
|
|
178
|
+
end as stable_id
|
|
179
|
+
from pg_constraint c
|
|
180
|
+
left join pg_type ty on ty.oid = c.contypid
|
|
181
|
+
left join pg_namespace ns on ns.oid = ty.typnamespace
|
|
182
|
+
left join pg_class tbl on tbl.oid = c.conrelid
|
|
183
|
+
left join pg_namespace tbl_ns on tbl_ns.oid = tbl.relnamespace
|
|
184
|
+
join ids i on i.classid = 'pg_constraint'::regclass and i.objid = c.oid and i.objsubid = 0
|
|
185
|
+
|
|
186
|
+
union all
|
|
187
|
+
|
|
188
|
+
select 'pg_proc'::regclass, p.oid, 0::int2,
|
|
189
|
+
format(
|
|
190
|
+
'procedure:%I.%I(%s)',
|
|
191
|
+
ns.nspname,
|
|
192
|
+
p.proname,
|
|
193
|
+
coalesce((select string_agg(format_type(oid, null), ',' order by ord)
|
|
194
|
+
from unnest(p.proargtypes) with ordinality as t(oid, ord)), '')
|
|
195
|
+
) as stable_id
|
|
196
|
+
from pg_proc p
|
|
197
|
+
join pg_namespace ns on ns.oid = p.pronamespace
|
|
198
|
+
join ids i on i.classid = 'pg_proc'::regclass and i.objid = p.oid and i.objsubid = 0
|
|
199
|
+
|
|
200
|
+
union all
|
|
201
|
+
|
|
202
|
+
select 'pg_trigger'::regclass, tg.oid, 0::int2,
|
|
203
|
+
format('trigger:%I.%I.%I', ns.nspname, tbl.relname, tg.tgname) as stable_id
|
|
204
|
+
from pg_trigger tg
|
|
205
|
+
join pg_class tbl on tbl.oid = tg.tgrelid
|
|
206
|
+
join pg_namespace ns on ns.oid = tbl.relnamespace
|
|
207
|
+
join ids i on i.classid = 'pg_trigger'::regclass and i.objid = tg.oid and i.objsubid = 0
|
|
208
|
+
|
|
209
|
+
union all
|
|
210
|
+
|
|
211
|
+
select 'pg_collation'::regclass, c.oid, 0::int2,
|
|
212
|
+
format('collation:%I.%I', ns.nspname, c.collname) as stable_id
|
|
213
|
+
from pg_collation c
|
|
214
|
+
join pg_namespace ns on ns.oid = c.collnamespace
|
|
215
|
+
join ids i on i.classid = 'pg_collation'::regclass and i.objid = c.oid and i.objsubid = 0
|
|
216
|
+
|
|
217
|
+
union all
|
|
218
|
+
|
|
219
|
+
select 'pg_event_trigger'::regclass, et.oid, 0::int2,
|
|
220
|
+
format('eventTrigger:%I', et.evtname) as stable_id
|
|
221
|
+
from pg_event_trigger et
|
|
222
|
+
join ids i on i.classid = 'pg_event_trigger'::regclass and i.objid = et.oid and i.objsubid = 0
|
|
223
|
+
|
|
224
|
+
union all
|
|
225
|
+
|
|
226
|
+
select 'pg_ts_config'::regclass, cfg.oid, 0::int2,
|
|
227
|
+
format('tsConfig:%I.%I', ns.nspname, cfg.cfgname) as stable_id
|
|
228
|
+
from pg_ts_config cfg
|
|
229
|
+
join pg_namespace ns on ns.oid = cfg.cfgnamespace
|
|
230
|
+
join ids i on i.classid = 'pg_ts_config'::regclass and i.objid = cfg.oid and i.objsubid = 0
|
|
231
|
+
|
|
232
|
+
union all
|
|
233
|
+
|
|
234
|
+
select 'pg_ts_dict'::regclass, dict.oid, 0::int2,
|
|
235
|
+
format('tsDict:%I.%I', ns.nspname, dict.dictname) as stable_id
|
|
236
|
+
from pg_ts_dict dict
|
|
237
|
+
join pg_namespace ns on ns.oid = dict.dictnamespace
|
|
238
|
+
join ids i on i.classid = 'pg_ts_dict'::regclass and i.objid = dict.oid and i.objsubid = 0
|
|
239
|
+
|
|
240
|
+
union all
|
|
241
|
+
|
|
242
|
+
select 'pg_ts_template'::regclass, tmpl.oid, 0::int2,
|
|
243
|
+
format('tsTemplate:%I.%I', ns.nspname, tmpl.tmplname) as stable_id
|
|
244
|
+
from pg_ts_template tmpl
|
|
245
|
+
join pg_namespace ns on ns.oid = tmpl.tmplnamespace
|
|
246
|
+
join ids i on i.classid = 'pg_ts_template'::regclass and i.objid = tmpl.oid and i.objsubid = 0
|
|
247
|
+
), extension_members as (
|
|
248
|
+
select
|
|
249
|
+
em.extension_oid,
|
|
250
|
+
obj.stable_id
|
|
251
|
+
from extension_members_raw em
|
|
252
|
+
join objects obj
|
|
253
|
+
on obj.classid = em.classid
|
|
254
|
+
and obj.objid = em.objid
|
|
255
|
+
and obj.objsubid = coalesce(nullif(em.objsubid, 0), 0)
|
|
256
|
+
)
|
|
257
|
+
select
|
|
258
|
+
er.name,
|
|
259
|
+
er.schema,
|
|
260
|
+
er.relocatable,
|
|
261
|
+
er.version,
|
|
262
|
+
er.owner,
|
|
263
|
+
er.comment,
|
|
264
|
+
coalesce(
|
|
265
|
+
(
|
|
266
|
+
select json_agg(em.stable_id order by em.stable_id)
|
|
267
|
+
from extension_members em
|
|
268
|
+
where em.extension_oid = er.oid
|
|
269
|
+
), '[]'::json
|
|
270
|
+
) as members
|
|
271
|
+
from extension_rows er
|
|
272
|
+
order by
|
|
273
|
+
er.name
|
|
274
|
+
`);
|
|
275
|
+
// Validate and parse each row using the Zod schema
|
|
276
|
+
const validatedRows = extensionRows.map((row: unknown) =>
|
|
277
|
+
extensionPropsSchema.parse(row),
|
|
278
|
+
);
|
|
279
|
+
return validatedRows.map((row: ExtensionProps) => new Extension(row));
|
|
280
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import {
|
|
3
|
+
ForeignDataWrapper,
|
|
4
|
+
type ForeignDataWrapperProps,
|
|
5
|
+
} from "../foreign-data-wrapper.model.ts";
|
|
6
|
+
import {
|
|
7
|
+
AlterForeignDataWrapperChangeOwner,
|
|
8
|
+
AlterForeignDataWrapperSetOptions,
|
|
9
|
+
} from "./foreign-data-wrapper.alter.ts";
|
|
10
|
+
|
|
11
|
+
describe.concurrent("foreign-data-wrapper", () => {
|
|
12
|
+
describe("alter", () => {
|
|
13
|
+
test("change owner", () => {
|
|
14
|
+
const props: ForeignDataWrapperProps = {
|
|
15
|
+
name: "test_fdw",
|
|
16
|
+
owner: "old_owner",
|
|
17
|
+
handler: null,
|
|
18
|
+
validator: null,
|
|
19
|
+
options: null,
|
|
20
|
+
comment: null,
|
|
21
|
+
privileges: [],
|
|
22
|
+
};
|
|
23
|
+
const fdw = new ForeignDataWrapper(props);
|
|
24
|
+
const change = new AlterForeignDataWrapperChangeOwner({
|
|
25
|
+
foreignDataWrapper: fdw,
|
|
26
|
+
owner: "new_owner",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
expect(change.serialize()).toBe(
|
|
30
|
+
"ALTER FOREIGN DATA WRAPPER test_fdw OWNER TO new_owner",
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("set options ADD", () => {
|
|
35
|
+
const props: ForeignDataWrapperProps = {
|
|
36
|
+
name: "test_fdw",
|
|
37
|
+
owner: "test",
|
|
38
|
+
handler: null,
|
|
39
|
+
validator: null,
|
|
40
|
+
options: null,
|
|
41
|
+
comment: null,
|
|
42
|
+
privileges: [],
|
|
43
|
+
};
|
|
44
|
+
const fdw = new ForeignDataWrapper(props);
|
|
45
|
+
const change = new AlterForeignDataWrapperSetOptions({
|
|
46
|
+
foreignDataWrapper: fdw,
|
|
47
|
+
options: [
|
|
48
|
+
{ action: "ADD", option: "host", value: "localhost" },
|
|
49
|
+
{ action: "ADD", option: "port", value: "5432" },
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
expect(change.serialize()).toBe(
|
|
54
|
+
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD host 'localhost', ADD port '5432')",
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("set options SET", () => {
|
|
59
|
+
const props: ForeignDataWrapperProps = {
|
|
60
|
+
name: "test_fdw",
|
|
61
|
+
owner: "test",
|
|
62
|
+
handler: null,
|
|
63
|
+
validator: null,
|
|
64
|
+
options: null,
|
|
65
|
+
comment: null,
|
|
66
|
+
privileges: [],
|
|
67
|
+
};
|
|
68
|
+
const fdw = new ForeignDataWrapper(props);
|
|
69
|
+
const change = new AlterForeignDataWrapperSetOptions({
|
|
70
|
+
foreignDataWrapper: fdw,
|
|
71
|
+
options: [{ action: "SET", option: "host", value: "newhost" }],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
expect(change.serialize()).toBe(
|
|
75
|
+
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (SET host 'newhost')",
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("set options DROP", () => {
|
|
80
|
+
const props: ForeignDataWrapperProps = {
|
|
81
|
+
name: "test_fdw",
|
|
82
|
+
owner: "test",
|
|
83
|
+
handler: null,
|
|
84
|
+
validator: null,
|
|
85
|
+
options: null,
|
|
86
|
+
comment: null,
|
|
87
|
+
privileges: [],
|
|
88
|
+
};
|
|
89
|
+
const fdw = new ForeignDataWrapper(props);
|
|
90
|
+
const change = new AlterForeignDataWrapperSetOptions({
|
|
91
|
+
foreignDataWrapper: fdw,
|
|
92
|
+
options: [{ action: "DROP", option: "host" }],
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(change.serialize()).toBe(
|
|
96
|
+
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (DROP host)",
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("set options mixed ADD/SET/DROP", () => {
|
|
101
|
+
const props: ForeignDataWrapperProps = {
|
|
102
|
+
name: "test_fdw",
|
|
103
|
+
owner: "test",
|
|
104
|
+
handler: null,
|
|
105
|
+
validator: null,
|
|
106
|
+
options: null,
|
|
107
|
+
comment: null,
|
|
108
|
+
privileges: [],
|
|
109
|
+
};
|
|
110
|
+
const fdw = new ForeignDataWrapper(props);
|
|
111
|
+
const change = new AlterForeignDataWrapperSetOptions({
|
|
112
|
+
foreignDataWrapper: fdw,
|
|
113
|
+
options: [
|
|
114
|
+
{ action: "ADD", option: "new_option", value: "new_value" },
|
|
115
|
+
{ action: "SET", option: "existing_option", value: "updated_value" },
|
|
116
|
+
{ action: "DROP", option: "old_option" },
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
expect(change.serialize()).toBe(
|
|
121
|
+
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.ts";
|
|
2
|
+
import { stableId } from "../../../utils.ts";
|
|
3
|
+
import type { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
|
|
4
|
+
import { AlterForeignDataWrapperChange } from "./foreign-data-wrapper.base.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Alter a foreign data wrapper.
|
|
8
|
+
*
|
|
9
|
+
* @see https://www.postgresql.org/docs/17/sql-alterforeigndatawrapper.html
|
|
10
|
+
*
|
|
11
|
+
* Synopsis
|
|
12
|
+
* ```sql
|
|
13
|
+
* ALTER FOREIGN DATA WRAPPER name
|
|
14
|
+
* [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) ]
|
|
15
|
+
* ALTER FOREIGN DATA WRAPPER name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export type AlterForeignDataWrapper =
|
|
20
|
+
| AlterForeignDataWrapperChangeOwner
|
|
21
|
+
| AlterForeignDataWrapperSetOptions;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* ALTER FOREIGN DATA WRAPPER ... OWNER TO ...
|
|
25
|
+
*/
|
|
26
|
+
export class AlterForeignDataWrapperChangeOwner extends AlterForeignDataWrapperChange {
|
|
27
|
+
public readonly foreignDataWrapper: ForeignDataWrapper;
|
|
28
|
+
public readonly owner: string;
|
|
29
|
+
public readonly scope = "object" as const;
|
|
30
|
+
|
|
31
|
+
constructor(props: {
|
|
32
|
+
foreignDataWrapper: ForeignDataWrapper;
|
|
33
|
+
owner: string;
|
|
34
|
+
}) {
|
|
35
|
+
super();
|
|
36
|
+
this.foreignDataWrapper = props.foreignDataWrapper;
|
|
37
|
+
this.owner = props.owner;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get requires() {
|
|
41
|
+
return [this.foreignDataWrapper.stableId, stableId.role(this.owner)];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
serialize(): string {
|
|
45
|
+
return [
|
|
46
|
+
"ALTER FOREIGN DATA WRAPPER",
|
|
47
|
+
this.foreignDataWrapper.name,
|
|
48
|
+
"OWNER TO",
|
|
49
|
+
this.owner,
|
|
50
|
+
].join(" ");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* ALTER FOREIGN DATA WRAPPER ... OPTIONS ( ADD | SET | DROP ... )
|
|
56
|
+
*/
|
|
57
|
+
export class AlterForeignDataWrapperSetOptions extends AlterForeignDataWrapperChange {
|
|
58
|
+
public readonly foreignDataWrapper: ForeignDataWrapper;
|
|
59
|
+
public readonly options: Array<{
|
|
60
|
+
action: "ADD" | "SET" | "DROP";
|
|
61
|
+
option: string;
|
|
62
|
+
value?: string;
|
|
63
|
+
}>;
|
|
64
|
+
public readonly scope = "object" as const;
|
|
65
|
+
|
|
66
|
+
constructor(props: {
|
|
67
|
+
foreignDataWrapper: ForeignDataWrapper;
|
|
68
|
+
options: Array<{
|
|
69
|
+
action: "ADD" | "SET" | "DROP";
|
|
70
|
+
option: string;
|
|
71
|
+
value?: string;
|
|
72
|
+
}>;
|
|
73
|
+
}) {
|
|
74
|
+
super();
|
|
75
|
+
this.foreignDataWrapper = props.foreignDataWrapper;
|
|
76
|
+
this.options = props.options;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get requires() {
|
|
80
|
+
return [this.foreignDataWrapper.stableId];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
serialize(): string {
|
|
84
|
+
const optionParts: string[] = [];
|
|
85
|
+
for (const opt of this.options) {
|
|
86
|
+
if (opt.action === "DROP") {
|
|
87
|
+
optionParts.push(`DROP ${opt.option}`);
|
|
88
|
+
} else {
|
|
89
|
+
const value = opt.value !== undefined ? quoteLiteral(opt.value) : "''";
|
|
90
|
+
optionParts.push(`${opt.action} ${opt.option} ${value}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return [
|
|
95
|
+
"ALTER FOREIGN DATA WRAPPER",
|
|
96
|
+
this.foreignDataWrapper.name,
|
|
97
|
+
"OPTIONS",
|
|
98
|
+
`(${optionParts.join(", ")})`,
|
|
99
|
+
].join(" ");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseChange } from "../../../base.change.ts";
|
|
2
|
+
import type { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
|
|
3
|
+
|
|
4
|
+
abstract class BaseForeignDataWrapperChange extends BaseChange {
|
|
5
|
+
abstract readonly foreignDataWrapper: ForeignDataWrapper;
|
|
6
|
+
abstract readonly scope: "object" | "comment" | "privilege";
|
|
7
|
+
readonly objectType: "foreign_data_wrapper" = "foreign_data_wrapper";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export abstract class CreateForeignDataWrapperChange extends BaseForeignDataWrapperChange {
|
|
11
|
+
readonly operation = "create" as const;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export abstract class AlterForeignDataWrapperChange extends BaseForeignDataWrapperChange {
|
|
15
|
+
readonly operation = "alter" as const;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export abstract class DropForeignDataWrapperChange extends BaseForeignDataWrapperChange {
|
|
19
|
+
readonly operation = "drop" as const;
|
|
20
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.ts";
|
|
2
|
+
import { stableId } from "../../../utils.ts";
|
|
3
|
+
import type { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
|
|
4
|
+
import {
|
|
5
|
+
CreateForeignDataWrapperChange,
|
|
6
|
+
DropForeignDataWrapperChange,
|
|
7
|
+
} from "./foreign-data-wrapper.base.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Create/drop comments on foreign data wrappers.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export type CommentForeignDataWrapper =
|
|
14
|
+
| CreateCommentOnForeignDataWrapper
|
|
15
|
+
| DropCommentOnForeignDataWrapper;
|
|
16
|
+
|
|
17
|
+
export class CreateCommentOnForeignDataWrapper extends CreateForeignDataWrapperChange {
|
|
18
|
+
public readonly foreignDataWrapper: ForeignDataWrapper;
|
|
19
|
+
public readonly scope = "comment" as const;
|
|
20
|
+
|
|
21
|
+
constructor(props: { foreignDataWrapper: ForeignDataWrapper }) {
|
|
22
|
+
super();
|
|
23
|
+
this.foreignDataWrapper = props.foreignDataWrapper;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get creates() {
|
|
27
|
+
return [stableId.comment(this.foreignDataWrapper.stableId)];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get requires() {
|
|
31
|
+
return [this.foreignDataWrapper.stableId];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
serialize(): string {
|
|
35
|
+
return [
|
|
36
|
+
"COMMENT ON FOREIGN DATA WRAPPER",
|
|
37
|
+
this.foreignDataWrapper.name,
|
|
38
|
+
"IS",
|
|
39
|
+
// biome-ignore lint/style/noNonNullAssertion: comment is not nullable in this case
|
|
40
|
+
quoteLiteral(this.foreignDataWrapper.comment!),
|
|
41
|
+
].join(" ");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class DropCommentOnForeignDataWrapper extends DropForeignDataWrapperChange {
|
|
46
|
+
public readonly foreignDataWrapper: ForeignDataWrapper;
|
|
47
|
+
public readonly scope = "comment" as const;
|
|
48
|
+
|
|
49
|
+
constructor(props: { foreignDataWrapper: ForeignDataWrapper }) {
|
|
50
|
+
super();
|
|
51
|
+
this.foreignDataWrapper = props.foreignDataWrapper;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get drops() {
|
|
55
|
+
return [stableId.comment(this.foreignDataWrapper.stableId)];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get requires() {
|
|
59
|
+
return [
|
|
60
|
+
stableId.comment(this.foreignDataWrapper.stableId),
|
|
61
|
+
this.foreignDataWrapper.stableId,
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
serialize(): string {
|
|
66
|
+
return [
|
|
67
|
+
"COMMENT ON FOREIGN DATA WRAPPER",
|
|
68
|
+
this.foreignDataWrapper.name,
|
|
69
|
+
"IS NULL",
|
|
70
|
+
].join(" ");
|
|
71
|
+
}
|
|
72
|
+
}
|