@supabase/pg-delta 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +48 -3
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +240 -0
- package/dist/cli/commands/plan.js +47 -16
- package/dist/cli/commands/sync.js +8 -12
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/integrations.d.ts +30 -6
- package/dist/cli/utils/integrations.js +98 -6
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +71 -49
- package/dist/core/catalog.model.d.ts +14 -1
- package/dist/core/catalog.model.js +103 -1
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/change-utils.d.ts +9 -0
- package/dist/core/change-utils.js +71 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +37 -1
- package/dist/core/connection-url.d.ts +32 -0
- package/dist/core/connection-url.js +77 -0
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/depend.js +25 -0
- package/dist/core/expand-replace-dependencies.d.ts +8 -2
- package/dist/core/expand-replace-dependencies.js +116 -10
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +66 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +82 -41
- package/dist/core/integrations/filter/dsl.js +127 -61
- package/dist/core/integrations/filter/flatten.d.ts +51 -0
- package/dist/core/integrations/filter/flatten.js +116 -0
- package/dist/core/integrations/integration-dsl.d.ts +27 -1
- package/dist/core/integrations/integration.types.d.ts +26 -1
- package/dist/core/integrations/integration.types.js +31 -1
- package/dist/core/integrations/merge.d.ts +20 -0
- package/dist/core/integrations/merge.js +60 -0
- package/dist/core/integrations/serialize/dsl.d.ts +8 -12
- package/dist/core/integrations/serialize/dsl.js +2 -2
- package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +69 -8
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
- package/dist/core/objects/aggregate/aggregate.model.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +3 -2
- package/dist/core/objects/aggregate/changes/aggregate.comment.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.create.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +4 -3
- package/dist/core/objects/aggregate/changes/aggregate.privilege.js +3 -3
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
- package/dist/core/objects/base.change.d.ts +12 -1
- package/dist/core/objects/base.change.js +10 -0
- package/dist/core/objects/base.model.d.ts +4 -1
- package/dist/core/objects/base.model.js +5 -2
- package/dist/core/objects/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/changes/collation.alter.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.alter.js +2 -2
- package/dist/core/objects/collation/changes/collation.comment.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.comment.js +2 -2
- package/dist/core/objects/collation/changes/collation.create.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.create.js +1 -1
- package/dist/core/objects/collation/changes/collation.drop.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.drop.js +1 -1
- package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.alter.d.ts +9 -8
- package/dist/core/objects/domain/changes/domain.alter.js +8 -8
- package/dist/core/objects/domain/changes/domain.comment.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.comment.js +2 -2
- package/dist/core/objects/domain/changes/domain.create.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.create.js +12 -4
- package/dist/core/objects/domain/changes/domain.drop.d.ts +2 -1
- package/dist/core/objects/domain/changes/domain.drop.js +1 -1
- package/dist/core/objects/domain/changes/domain.privilege.d.ts +4 -3
- package/dist/core/objects/domain/changes/domain.privilege.js +3 -3
- package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.create.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/extension/changes/extension.alter.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.alter.js +2 -2
- package/dist/core/objects/extension/changes/extension.comment.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.comment.js +2 -2
- package/dist/core/objects/extension/changes/extension.create.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.create.js +4 -2
- package/dist/core/objects/extension/changes/extension.drop.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.drop.js +1 -1
- package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +10 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +9 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
- package/dist/core/objects/index/changes/index.alter.d.ts +4 -3
- package/dist/core/objects/index/changes/index.alter.js +3 -3
- package/dist/core/objects/index/changes/index.comment.d.ts +3 -2
- package/dist/core/objects/index/changes/index.comment.js +2 -2
- package/dist/core/objects/index/changes/index.create.d.ts +2 -1
- package/dist/core/objects/index/changes/index.create.js +1 -1
- package/dist/core/objects/index/changes/index.drop.d.ts +2 -1
- package/dist/core/objects/index/changes/index.drop.js +1 -1
- package/dist/core/objects/index/changes/index.types.d.ts +1 -0
- package/dist/core/objects/index/index.model.js +12 -2
- package/dist/core/objects/language/changes/language.alter.d.ts +2 -1
- package/dist/core/objects/language/changes/language.alter.js +1 -1
- package/dist/core/objects/language/changes/language.comment.d.ts +3 -2
- package/dist/core/objects/language/changes/language.comment.js +2 -2
- package/dist/core/objects/language/changes/language.create.d.ts +2 -1
- package/dist/core/objects/language/changes/language.create.js +1 -1
- package/dist/core/objects/language/changes/language.drop.d.ts +2 -1
- package/dist/core/objects/language/changes/language.drop.js +1 -1
- package/dist/core/objects/language/changes/language.privilege.d.ts +4 -3
- package/dist/core/objects/language/changes/language.privilege.js +3 -3
- package/dist/core/objects/language/changes/language.types.d.ts +1 -0
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +3 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +2 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +5 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +4 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.create.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +4 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +3 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
- package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.alter.d.ts +8 -7
- package/dist/core/objects/procedure/changes/procedure.alter.js +19 -19
- package/dist/core/objects/procedure/changes/procedure.comment.d.ts +3 -2
- package/dist/core/objects/procedure/changes/procedure.comment.js +2 -2
- package/dist/core/objects/procedure/changes/procedure.create.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.create.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.drop.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.drop.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +4 -3
- package/dist/core/objects/procedure/changes/procedure.privilege.js +3 -3
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +57 -97
- package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
- package/dist/core/objects/procedure/procedure.model.js +1 -1
- package/dist/core/objects/publication/changes/publication.alter.d.ts +9 -16
- package/dist/core/objects/publication/changes/publication.alter.js +12 -21
- package/dist/core/objects/publication/changes/publication.comment.d.ts +3 -2
- package/dist/core/objects/publication/changes/publication.comment.js +2 -2
- package/dist/core/objects/publication/changes/publication.create.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.create.js +1 -1
- package/dist/core/objects/publication/changes/publication.drop.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.drop.js +1 -1
- package/dist/core/objects/publication/changes/publication.types.d.ts +3 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +4 -3
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +6 -6
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +3 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +2 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.create.js +24 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +1 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +51 -2
- package/dist/core/objects/rls-policy/rls-policy.model.js +122 -1
- package/dist/core/objects/role/changes/role.alter.d.ts +3 -2
- package/dist/core/objects/role/changes/role.alter.js +2 -2
- package/dist/core/objects/role/changes/role.comment.d.ts +3 -2
- package/dist/core/objects/role/changes/role.comment.js +2 -2
- package/dist/core/objects/role/changes/role.create.d.ts +2 -1
- package/dist/core/objects/role/changes/role.create.js +1 -1
- package/dist/core/objects/role/changes/role.drop.d.ts +2 -1
- package/dist/core/objects/role/changes/role.drop.js +1 -1
- package/dist/core/objects/role/changes/role.privilege.d.ts +6 -5
- package/dist/core/objects/role/changes/role.privilege.js +5 -5
- package/dist/core/objects/role/changes/role.types.d.ts +1 -0
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +4 -3
- package/dist/core/objects/role/role.model.js +118 -12
- package/dist/core/objects/rule/changes/rule.alter.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.alter.js +2 -2
- package/dist/core/objects/rule/changes/rule.comment.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.comment.js +2 -2
- package/dist/core/objects/rule/changes/rule.create.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.create.js +1 -1
- package/dist/core/objects/rule/changes/rule.drop.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.drop.js +1 -1
- package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
- package/dist/core/objects/rule/rule.model.d.ts +1 -1
- package/dist/core/objects/schema/changes/schema.alter.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.alter.js +1 -1
- package/dist/core/objects/schema/changes/schema.comment.d.ts +3 -2
- package/dist/core/objects/schema/changes/schema.comment.js +2 -2
- package/dist/core/objects/schema/changes/schema.create.d.ts +3 -5
- package/dist/core/objects/schema/changes/schema.drop.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.drop.js +1 -1
- package/dist/core/objects/schema/changes/schema.privilege.d.ts +4 -3
- package/dist/core/objects/schema/changes/schema.privilege.js +3 -3
- package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
- package/dist/core/objects/schema/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.alter.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.alter.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.comment.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.comment.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.create.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.create.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.drop.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.drop.js +11 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +4 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.js +3 -3
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
- package/dist/core/objects/sequence/sequence.diff.d.ts +5 -8
- package/dist/core/objects/sequence/sequence.diff.js +42 -85
- package/dist/core/objects/sequence/sequence.model.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.alter.d.ts +7 -6
- package/dist/core/objects/subscription/changes/subscription.alter.js +6 -6
- package/dist/core/objects/subscription/changes/subscription.comment.d.ts +3 -2
- package/dist/core/objects/subscription/changes/subscription.comment.js +2 -2
- package/dist/core/objects/subscription/changes/subscription.create.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.create.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.drop.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.drop.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/table/changes/table.alter.d.ts +65 -22
- package/dist/core/objects/table/changes/table.alter.js +111 -23
- package/dist/core/objects/table/changes/table.comment.d.ts +7 -6
- package/dist/core/objects/table/changes/table.comment.js +6 -6
- package/dist/core/objects/table/changes/table.create.d.ts +2 -1
- package/dist/core/objects/table/changes/table.create.js +4 -1
- package/dist/core/objects/table/changes/table.drop.d.ts +16 -3
- package/dist/core/objects/table/changes/table.drop.js +24 -1
- package/dist/core/objects/table/changes/table.privilege.d.ts +4 -3
- package/dist/core/objects/table/changes/table.privilege.js +3 -3
- package/dist/core/objects/table/changes/table.types.d.ts +1 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +80 -160
- package/dist/core/objects/table/table.model.d.ts +29 -22
- package/dist/core/objects/table/table.model.js +6 -1
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.alter.js +24 -1
- package/dist/core/objects/trigger/changes/trigger.comment.d.ts +3 -2
- package/dist/core/objects/trigger/changes/trigger.comment.js +2 -2
- package/dist/core/objects/trigger/changes/trigger.create.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.create.js +5 -6
- package/dist/core/objects/trigger/changes/trigger.drop.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.drop.js +1 -1
- package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
- package/dist/core/objects/trigger/trigger.diff.js +7 -2
- package/dist/core/objects/trigger/trigger.model.d.ts +10 -1
- package/dist/core/objects/trigger/trigger.model.js +19 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.create.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +4 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +3 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
- package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
- package/dist/core/objects/type/enum/changes/enum.alter.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.alter.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.comment.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.comment.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.create.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.create.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.drop.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.drop.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +4 -3
- package/dist/core/objects/type/enum/changes/enum.privilege.js +3 -3
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.js +1 -1
- package/dist/core/objects/type/range/changes/range.alter.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.alter.js +1 -1
- package/dist/core/objects/type/range/changes/range.comment.d.ts +3 -2
- package/dist/core/objects/type/range/changes/range.comment.js +2 -2
- package/dist/core/objects/type/range/changes/range.create.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.create.js +7 -4
- package/dist/core/objects/type/range/changes/range.drop.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.drop.js +1 -1
- package/dist/core/objects/type/range/changes/range.privilege.d.ts +4 -3
- package/dist/core/objects/type/range/changes/range.privilege.js +3 -3
- package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.js +1 -1
- package/dist/core/objects/type/type.types.d.ts +1 -0
- package/dist/core/objects/view/changes/view.alter.d.ts +4 -3
- package/dist/core/objects/view/changes/view.alter.js +3 -3
- package/dist/core/objects/view/changes/view.comment.d.ts +3 -2
- package/dist/core/objects/view/changes/view.comment.js +2 -2
- package/dist/core/objects/view/changes/view.create.d.ts +2 -1
- package/dist/core/objects/view/changes/view.create.js +1 -1
- package/dist/core/objects/view/changes/view.drop.d.ts +2 -1
- package/dist/core/objects/view/changes/view.drop.js +1 -1
- package/dist/core/objects/view/changes/view.privilege.d.ts +4 -3
- package/dist/core/objects/view/changes/view.privilege.js +3 -3
- package/dist/core/objects/view/changes/view.types.d.ts +1 -0
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +37 -168
- package/dist/core/objects/view/view.model.d.ts +18 -4
- package/dist/core/objects/view/view.model.js +3 -13
- package/dist/core/plan/apply.js +11 -28
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +154 -171
- package/dist/core/plan/serialize.js +16 -4
- 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 +2455 -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 +893 -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/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/plan/types.d.ts +9 -6
- package/dist/core/post-diff-cycle-breaking.d.ts +29 -0
- package/dist/core/post-diff-cycle-breaking.js +209 -0
- package/dist/core/postgres-config.d.ts +89 -3
- package/dist/core/postgres-config.js +273 -4
- package/dist/core/sort/custom-constraints.js +65 -1
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -1
- package/package.json +59 -22
- package/src/cli/app.ts +52 -0
- package/src/cli/bin/cli.ts +15 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +322 -0
- package/src/cli/commands/plan.ts +210 -0
- package/src/cli/commands/sync.ts +178 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -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 +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +251 -0
- package/src/cli/utils/integrations.ts +170 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +253 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +488 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change-utils.test.ts +61 -0
- package/src/core/change-utils.ts +73 -0
- package/src/core/change.types.ts +94 -0
- package/src/core/connection-url.test.ts +142 -0
- package/src/core/connection-url.ts +82 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1895 -0
- package/src/core/expand-replace-dependencies.test.ts +552 -0
- package/src/core/expand-replace-dependencies.ts +536 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +579 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +138 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +450 -0
- package/src/core/integrations/filter/dsl.ts +305 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/filter/flatten.test.ts +282 -0
- package/src/core/integrations/filter/flatten.ts +150 -0
- package/src/core/integrations/integration-dsl.ts +50 -0
- package/src/core/integrations/integration.types.ts +65 -0
- package/src/core/integrations/merge.test.ts +128 -0
- package/src/core/integrations/merge.ts +72 -0
- package/src/core/integrations/serialize/dsl.test.ts +110 -0
- package/src/core/integrations/serialize/dsl.ts +71 -0
- package/src/core/integrations/serialize/serialize.types.ts +40 -0
- package/src/core/integrations/supabase.ts +180 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +63 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +330 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +147 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +13 -0
- package/src/core/objects/base.change.ts +74 -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.test.ts +43 -0
- package/src/core/objects/base.model.ts +85 -0
- package/src/core/objects/base.privilege-diff.ts +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +80 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +69 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +107 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
- package/src/core/objects/collation/changes/collation.drop.ts +38 -0
- package/src/core/objects/collation/changes/collation.types.ts +11 -0
- package/src/core/objects/collation/collation.diff.test.ts +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +287 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +60 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +141 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
- package/src/core/objects/domain/changes/domain.drop.ts +35 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +172 -0
- package/src/core/objects/domain/changes/domain.types.ts +13 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +83 -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 +67 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +73 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +35 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +11 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +79 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +65 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +50 -0
- package/src/core/objects/extension/changes/extension.create.ts +66 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
- package/src/core/objects/extension/changes/extension.drop.ts +35 -0
- package/src/core/objects/extension/changes/extension.types.ts +11 -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.test.ts +98 -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 +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +102 -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 +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +173 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -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 +11 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +342 -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 +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +38 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +182 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +13 -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 +343 -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 +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +127 -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 +61 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +35 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +165 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -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 +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +70 -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 +96 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +67 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +41 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +9 -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 +209 -0
- package/src/core/objects/index/changes/index.alter.ts +145 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +64 -0
- package/src/core/objects/index/changes/index.create.test.ts +69 -0
- package/src/core/objects/index/changes/index.create.ts +69 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -0
- package/src/core/objects/index/changes/index.drop.ts +35 -0
- package/src/core/objects/index/changes/index.types.ts +7 -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.test.ts +83 -0
- package/src/core/objects/index/index.model.ts +379 -0
- package/src/core/objects/language/changes/language.alter.test.ts +36 -0
- package/src/core/objects/language/changes/language.alter.ts +54 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +59 -0
- package/src/core/objects/language/changes/language.create.test.ts +30 -0
- package/src/core/objects/language/changes/language.create.ts +105 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -0
- package/src/core/objects/language/changes/language.drop.ts +40 -0
- package/src/core/objects/language/changes/language.privilege.ts +173 -0
- package/src/core/objects/language/changes/language.types.ts +13 -0
- package/src/core/objects/language/language.diff.test.ts +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +114 -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 +177 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +94 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +61 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +213 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +13 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +291 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +71 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +93 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +50 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +189 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +13 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +284 -0
- package/src/core/objects/procedure/procedure.diff.ts +371 -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 +221 -0
- package/src/core/objects/publication/changes/publication.alter.ts +232 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +65 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +83 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +30 -0
- package/src/core/objects/publication/changes/publication.types.ts +25 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -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 +283 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +129 -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 +70 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +209 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +33 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +40 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +11 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +81 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +273 -0
- package/src/core/objects/role/changes/role.alter.test.ts +362 -0
- package/src/core/objects/role/changes/role.alter.ts +111 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +56 -0
- package/src/core/objects/role/changes/role.create.test.ts +56 -0
- package/src/core/objects/role/changes/role.create.ts +103 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -0
- package/src/core/objects/role/changes/role.drop.ts +35 -0
- package/src/core/objects/role/changes/role.privilege.ts +377 -0
- package/src/core/objects/role/changes/role.types.ts +13 -0
- package/src/core/objects/role/role.diff.test.ts +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +73 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +43 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
- package/src/core/objects/rule/changes/rule.drop.ts +30 -0
- package/src/core/objects/rule/changes/rule.types.ts +13 -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 +31 -0
- package/src/core/objects/schema/changes/schema.alter.ts +46 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +57 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +35 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +176 -0
- package/src/core/objects/schema/changes/schema.types.ts +13 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +116 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +61 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +112 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +50 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +180 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +13 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +429 -0
- package/src/core/objects/sequence/sequence.diff.ts +326 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +111 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +65 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +21 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +23 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -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 +899 -0
- package/src/core/objects/table/changes/table.alter.ts +910 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +267 -0
- package/src/core/objects/table/changes/table.create.test.ts +188 -0
- package/src/core/objects/table/changes/table.create.ts +193 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -0
- package/src/core/objects/table/changes/table.drop.ts +87 -0
- package/src/core/objects/table/changes/table.privilege.ts +201 -0
- package/src/core/objects/table/changes/table.types.ts +13 -0
- package/src/core/objects/table/table.diff.test.ts +1146 -0
- package/src/core/objects/table/table.diff.ts +889 -0
- package/src/core/objects/table/table.model.ts +462 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +77 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +65 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +89 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +40 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +11 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +121 -0
- package/src/core/objects/trigger/trigger.model.ts +268 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +175 -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 +146 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +96 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +38 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +176 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +13 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +92 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +65 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +57 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +35 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +176 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +13 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +52 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +65 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +156 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
- package/src/core/objects/type/range/changes/range.drop.ts +35 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +176 -0
- package/src/core/objects/type/range/changes/range.types.ts +13 -0
- package/src/core/objects/type/range/range.diff.test.ts +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +6 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +113 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +60 -0
- package/src/core/objects/view/changes/view.create.test.ts +70 -0
- package/src/core/objects/view/changes/view.create.ts +74 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -0
- package/src/core/objects/view/changes/view.drop.ts +41 -0
- package/src/core/objects/view/changes/view.privilege.ts +201 -0
- package/src/core/objects/view/changes/view.types.ts +13 -0
- package/src/core/objects/view/view.diff.test.ts +269 -0
- package/src/core/objects/view/view.diff.ts +230 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +368 -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.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2811 -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 +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -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 +1120 -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/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +168 -0
- package/src/core/post-diff-cycle-breaking.test.ts +459 -0
- package/src/core/post-diff-cycle-breaking.ts +317 -0
- package/src/core/postgres-config.test.ts +336 -0
- package/src/core/postgres-config.ts +458 -0
- package/src/core/sort/custom-constraints.ts +235 -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 +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +573 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -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/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +41 -0
- package/src/typedoc.ts +253 -0
- package/dist/core/integrations/filter/extractors.d.ts +0 -12
- package/dist/core/integrations/filter/extractors.js +0 -136
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Round-based declarative schema apply engine.
|
|
3
|
+
*
|
|
4
|
+
* Applies SQL statements to a database using iterative rounds:
|
|
5
|
+
* 1. Try each pending statement
|
|
6
|
+
* 2. On dependency errors, defer to next round
|
|
7
|
+
* 3. Repeat until all applied or no progress (stuck)
|
|
8
|
+
* 4. Optional final validation pass for function bodies
|
|
9
|
+
*/
|
|
10
|
+
import debug from "debug";
|
|
11
|
+
const debugApply = debug("pg-delta:declarative-apply");
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Dependency error classification
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* SQLSTATE codes that indicate a missing dependency (object not yet created).
|
|
17
|
+
* Mirrors pg-topo's isDependencyErrorCode.
|
|
18
|
+
*/
|
|
19
|
+
const DEPENDENCY_ERROR_CODES = new Set([
|
|
20
|
+
"42P01", // undefined_table
|
|
21
|
+
"42703", // undefined_column
|
|
22
|
+
"42704", // undefined_object
|
|
23
|
+
"42883", // undefined_function
|
|
24
|
+
"3F000", // invalid_schema_name
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Detect errors caused by environment/capability limitations rather than
|
|
28
|
+
* schema bugs. These statements are skipped permanently (not retried).
|
|
29
|
+
*
|
|
30
|
+
* Strategy: SQLSTATE codes are the primary gate (fast, stable). For codes
|
|
31
|
+
* reused across unrelated error conditions (e.g. 42710 = "duplicate object"
|
|
32
|
+
* covers both roles and extensions), the error message is used as a secondary
|
|
33
|
+
* disambiguator. Messages are lowercased before matching to handle
|
|
34
|
+
* case-sensitivity differences across PG versions.
|
|
35
|
+
*/
|
|
36
|
+
function isEnvironmentCapabilityError(code, message, statementClass) {
|
|
37
|
+
// Feature not supported
|
|
38
|
+
if (code === "0A000")
|
|
39
|
+
return true;
|
|
40
|
+
// Extension not available
|
|
41
|
+
if (code === "58P01" &&
|
|
42
|
+
message.includes("extension") &&
|
|
43
|
+
(message.includes("control file") || message.includes("is not available"))) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// Subscription / logical replication not available
|
|
47
|
+
if (statementClass === "CREATE_SUBSCRIPTION" &&
|
|
48
|
+
(code === "58P01" ||
|
|
49
|
+
message.includes("walreceiver") ||
|
|
50
|
+
message.includes("logical replication"))) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
// Event trigger requires superuser
|
|
54
|
+
if (statementClass === "CREATE_EVENT_TRIGGER" &&
|
|
55
|
+
(code === "42501" || message.includes("must be superuser"))) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
// Language does not exist (e.g. plv8)
|
|
59
|
+
if ((statementClass === "CREATE_FUNCTION" ||
|
|
60
|
+
statementClass === "CREATE_PROCEDURE") &&
|
|
61
|
+
message.includes("language") &&
|
|
62
|
+
message.includes("does not exist")) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// Role already exists
|
|
66
|
+
if (statementClass === "CREATE_ROLE" &&
|
|
67
|
+
(code === "42710" || code === "23505") &&
|
|
68
|
+
message.includes("role") &&
|
|
69
|
+
(message.includes("already exists") ||
|
|
70
|
+
message.includes("duplicate key") ||
|
|
71
|
+
message.includes("pg_authid_rolname_index"))) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Extension already exists
|
|
75
|
+
if (statementClass === "CREATE_EXTENSION" &&
|
|
76
|
+
code === "42710" &&
|
|
77
|
+
message.includes("extension") &&
|
|
78
|
+
message.includes("already exists")) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// Sequence ownership constraint
|
|
82
|
+
if (code === "55000" &&
|
|
83
|
+
message.includes("sequence must have same owner as table it is linked to")) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// Publication replica identity
|
|
87
|
+
if (code === "55000" &&
|
|
88
|
+
message.includes("does not have a replica identity") &&
|
|
89
|
+
message.includes("publishes updates")) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
function isDependencyError(code) {
|
|
95
|
+
return code !== undefined && DEPENDENCY_ERROR_CODES.has(code);
|
|
96
|
+
}
|
|
97
|
+
function parsePgPosition(pos) {
|
|
98
|
+
if (pos === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
if (typeof pos === "number" && Number.isInteger(pos) && pos > 0)
|
|
101
|
+
return pos;
|
|
102
|
+
if (typeof pos === "string") {
|
|
103
|
+
const n = Number.parseInt(pos, 10);
|
|
104
|
+
if (Number.isInteger(n) && n > 0)
|
|
105
|
+
return n;
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Core round-based apply
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
/**
|
|
113
|
+
* Apply SQL statements to a database using iterative rounds.
|
|
114
|
+
*
|
|
115
|
+
* Algorithm:
|
|
116
|
+
* 1. Optionally set check_function_bodies = off
|
|
117
|
+
* 2. For each round, iterate over pending statements:
|
|
118
|
+
* - On success: mark as applied
|
|
119
|
+
* - On dependency error: defer to next round
|
|
120
|
+
* - On environment error: skip permanently with warning
|
|
121
|
+
* - On other error: mark as failed
|
|
122
|
+
* 3. If a round makes no progress (0 applied), stop (stuck)
|
|
123
|
+
* 4. If finalValidation is true, re-run CREATE FUNCTION/PROCEDURE
|
|
124
|
+
* with check_function_bodies = on
|
|
125
|
+
*/
|
|
126
|
+
export async function roundApply(options) {
|
|
127
|
+
const { pool, statements, maxRounds = 100, disableCheckFunctionBodies = true, finalValidation = true, onRoundComplete, } = options;
|
|
128
|
+
const rounds = [];
|
|
129
|
+
const allErrors = [];
|
|
130
|
+
let totalApplied = 0;
|
|
131
|
+
let totalSkipped = 0;
|
|
132
|
+
// Track which statements still need to be applied
|
|
133
|
+
let pending = [...statements];
|
|
134
|
+
// Track statements that failed with non-dependency errors
|
|
135
|
+
const hardFailed = [];
|
|
136
|
+
// Track skipped (environment) statements
|
|
137
|
+
const skipped = [];
|
|
138
|
+
// Track applied function/procedure statements for final validation
|
|
139
|
+
const appliedFunctions = [];
|
|
140
|
+
const client = await pool.connect();
|
|
141
|
+
try {
|
|
142
|
+
// Disable function body checks to avoid false failures from
|
|
143
|
+
// functions referencing not-yet-created objects
|
|
144
|
+
if (disableCheckFunctionBodies) {
|
|
145
|
+
await client.query("SET check_function_bodies = off");
|
|
146
|
+
}
|
|
147
|
+
for (let round = 1; round <= maxRounds && pending.length > 0; round++) {
|
|
148
|
+
debugApply("round %d: %d pending", round, pending.length);
|
|
149
|
+
const roundErrors = [];
|
|
150
|
+
const deferred = [];
|
|
151
|
+
let appliedThisRound = 0;
|
|
152
|
+
let failedThisRound = 0;
|
|
153
|
+
for (const stmt of pending) {
|
|
154
|
+
try {
|
|
155
|
+
await client.query(stmt.sql);
|
|
156
|
+
appliedThisRound++;
|
|
157
|
+
totalApplied++;
|
|
158
|
+
// Track functions for final validation
|
|
159
|
+
if (stmt.statementClass === "CREATE_FUNCTION" ||
|
|
160
|
+
stmt.statementClass === "CREATE_PROCEDURE") {
|
|
161
|
+
appliedFunctions.push(stmt);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const pgErr = err;
|
|
166
|
+
const code = pgErr.code ?? "";
|
|
167
|
+
const message = (pgErr.message ?? "").toLowerCase();
|
|
168
|
+
// Check if this is an environment/capability limitation
|
|
169
|
+
if (isEnvironmentCapabilityError(code, message, stmt.statementClass)) {
|
|
170
|
+
debugApply("skipped %s: %s", stmt.id, pgErr.message ?? code ?? "environment/capability");
|
|
171
|
+
skipped.push(stmt);
|
|
172
|
+
totalSkipped++;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Check if this is a dependency error (retryable)
|
|
176
|
+
if (isDependencyError(code)) {
|
|
177
|
+
debugApply("deferred %s: %s - %s", stmt.id, code, pgErr.message ?? "Unknown error");
|
|
178
|
+
if (pgErr.detail)
|
|
179
|
+
debugApply(" detail: %s", pgErr.detail);
|
|
180
|
+
if (pgErr.hint)
|
|
181
|
+
debugApply(" hint: %s", pgErr.hint);
|
|
182
|
+
deferred.push(stmt);
|
|
183
|
+
roundErrors.push({
|
|
184
|
+
statement: stmt,
|
|
185
|
+
code,
|
|
186
|
+
message: pgErr.message ?? "Unknown error",
|
|
187
|
+
isDependencyError: true,
|
|
188
|
+
position: parsePgPosition(pgErr.position),
|
|
189
|
+
detail: pgErr.detail,
|
|
190
|
+
hint: pgErr.hint,
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Hard failure - non-dependency, non-environment error
|
|
195
|
+
failedThisRound++;
|
|
196
|
+
debugApply("failed %s: %s - %s", stmt.id, code, pgErr.message ?? "Unknown error");
|
|
197
|
+
if (pgErr.detail)
|
|
198
|
+
debugApply(" detail: %s", pgErr.detail);
|
|
199
|
+
if (pgErr.hint)
|
|
200
|
+
debugApply(" hint: %s", pgErr.hint);
|
|
201
|
+
const stmtError = {
|
|
202
|
+
statement: stmt,
|
|
203
|
+
code,
|
|
204
|
+
message: pgErr.message ?? "Unknown error",
|
|
205
|
+
isDependencyError: false,
|
|
206
|
+
position: parsePgPosition(pgErr.position),
|
|
207
|
+
detail: pgErr.detail,
|
|
208
|
+
hint: pgErr.hint,
|
|
209
|
+
};
|
|
210
|
+
roundErrors.push(stmtError);
|
|
211
|
+
hardFailed.push(stmtError);
|
|
212
|
+
allErrors.push(stmtError);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (debugApply.enabled && deferred.length > 0) {
|
|
216
|
+
debugApply("Round %d complete: %d applied, %d deferred, %d failed", round, appliedThisRound, deferred.length, failedThisRound);
|
|
217
|
+
for (const e of roundErrors.filter((er) => er.isDependencyError)) {
|
|
218
|
+
debugApply(" deferred %s: %s - %s", e.statement.id, e.code, e.message);
|
|
219
|
+
if (e.detail)
|
|
220
|
+
debugApply(" detail: %s", e.detail);
|
|
221
|
+
if (e.hint)
|
|
222
|
+
debugApply(" hint: %s", e.hint);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const roundResult = {
|
|
226
|
+
round,
|
|
227
|
+
applied: appliedThisRound,
|
|
228
|
+
deferred: deferred.length,
|
|
229
|
+
failed: failedThisRound,
|
|
230
|
+
errors: roundErrors,
|
|
231
|
+
};
|
|
232
|
+
rounds.push(roundResult);
|
|
233
|
+
onRoundComplete?.(roundResult);
|
|
234
|
+
// No progress this round - we're stuck
|
|
235
|
+
if (appliedThisRound === 0 && deferred.length > 0) {
|
|
236
|
+
// Collect the latest error for each stuck statement
|
|
237
|
+
const stuckStatements = deferred.map((stmt) => {
|
|
238
|
+
const lastError = roundErrors.find((e) => e.statement.id === stmt.id);
|
|
239
|
+
return (lastError ?? {
|
|
240
|
+
statement: stmt,
|
|
241
|
+
code: "UNKNOWN",
|
|
242
|
+
message: "Deferred without a recorded error",
|
|
243
|
+
isDependencyError: true,
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
status: "stuck",
|
|
248
|
+
totalRounds: round,
|
|
249
|
+
totalApplied,
|
|
250
|
+
totalSkipped,
|
|
251
|
+
stuckStatements,
|
|
252
|
+
errors: hardFailed.length > 0 ? hardFailed : undefined,
|
|
253
|
+
rounds,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
pending = deferred;
|
|
257
|
+
}
|
|
258
|
+
// If we exhausted maxRounds but still have pending, report stuck
|
|
259
|
+
if (pending.length > 0) {
|
|
260
|
+
return {
|
|
261
|
+
status: "stuck",
|
|
262
|
+
totalRounds: maxRounds,
|
|
263
|
+
totalApplied,
|
|
264
|
+
totalSkipped,
|
|
265
|
+
stuckStatements: pending.map((stmt) => ({
|
|
266
|
+
statement: stmt,
|
|
267
|
+
code: "MAX_ROUNDS",
|
|
268
|
+
message: `Exceeded maximum rounds (${maxRounds})`,
|
|
269
|
+
isDependencyError: true,
|
|
270
|
+
})),
|
|
271
|
+
errors: hardFailed.length > 0 ? hardFailed : undefined,
|
|
272
|
+
rounds,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Final validation pass: re-run functions with check_function_bodies = on
|
|
276
|
+
let validationErrors;
|
|
277
|
+
if (finalValidation && appliedFunctions.length > 0) {
|
|
278
|
+
validationErrors = await validateFunctionBodies(client, appliedFunctions);
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
status: hardFailed.length > 0
|
|
282
|
+
? "error"
|
|
283
|
+
: validationErrors && validationErrors.length > 0
|
|
284
|
+
? "error"
|
|
285
|
+
: "success",
|
|
286
|
+
totalRounds: rounds.length,
|
|
287
|
+
totalApplied,
|
|
288
|
+
totalSkipped,
|
|
289
|
+
errors: hardFailed.length > 0 ? hardFailed : undefined,
|
|
290
|
+
validationErrors: validationErrors && validationErrors.length > 0
|
|
291
|
+
? validationErrors
|
|
292
|
+
: undefined,
|
|
293
|
+
rounds,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
if (disableCheckFunctionBodies) {
|
|
298
|
+
try {
|
|
299
|
+
// Restore check_function_bodies for the connection being returned to the pool.
|
|
300
|
+
// validateFunctionBodies uses SET LOCAL inside a rolled-back transaction so it
|
|
301
|
+
// never changes the session-level value, but the SET at the start of rounds still
|
|
302
|
+
// needs to be undone here.
|
|
303
|
+
await client.query("SET check_function_bodies = on");
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Best-effort restore; connection is being released anyway
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
client.release();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Rewrite a CREATE FUNCTION/PROCEDURE statement to use OR REPLACE for
|
|
314
|
+
* idempotent re-execution during validation. Handles leading line-comments,
|
|
315
|
+
* block comments (pg-topo annotations), and avoids double-adding OR REPLACE.
|
|
316
|
+
*/
|
|
317
|
+
export function rewriteAsOrReplace(sql) {
|
|
318
|
+
return sql.replace(/^((?:(?:\s*--[^\n]*\n)|(?:\s*\/\*[\s\S]*?\*\/\s*))*\s*CREATE\s+)(?!OR\s+REPLACE\b)(FUNCTION|PROCEDURE)/i, "$1OR REPLACE $2");
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Re-run CREATE FUNCTION/PROCEDURE statements with check_function_bodies = on
|
|
322
|
+
* using CREATE OR REPLACE to validate function bodies after all objects exist.
|
|
323
|
+
*
|
|
324
|
+
* Runs entirely inside a transaction that is always rolled back, so:
|
|
325
|
+
* - SET LOCAL search_path and check_function_bodies are transaction-scoped and
|
|
326
|
+
* never leak to the caller's session.
|
|
327
|
+
* - The CREATE OR REPLACE changes are undone, leaving the DB exactly as it was
|
|
328
|
+
* after the main apply rounds.
|
|
329
|
+
* - SAVEPOINTs around each statement prevent an aborted-transaction error from
|
|
330
|
+
* blocking validation of the remaining functions.
|
|
331
|
+
*/
|
|
332
|
+
async function validateFunctionBodies(client, functions) {
|
|
333
|
+
const errors = [];
|
|
334
|
+
await client.query("BEGIN");
|
|
335
|
+
try {
|
|
336
|
+
// Auto-detect all user schemas so unqualified names in function bodies
|
|
337
|
+
// resolve correctly, regardless of the session's default search_path.
|
|
338
|
+
const { rows } = await client.query(`
|
|
339
|
+
SELECT string_agg(quote_ident(nspname), ', ' ORDER BY nspname) AS schemas
|
|
340
|
+
FROM pg_namespace
|
|
341
|
+
WHERE nspname NOT LIKE 'pg_%'
|
|
342
|
+
AND nspname <> 'information_schema'
|
|
343
|
+
`);
|
|
344
|
+
const detectedSchemas = rows[0]?.schemas;
|
|
345
|
+
if (detectedSchemas) {
|
|
346
|
+
debugApply("validation search_path: %s, pg_catalog", detectedSchemas);
|
|
347
|
+
await client.query(`SET LOCAL search_path = ${detectedSchemas}, pg_catalog`);
|
|
348
|
+
}
|
|
349
|
+
await client.query("SET LOCAL check_function_bodies = on");
|
|
350
|
+
for (const stmt of functions) {
|
|
351
|
+
const replaceSql = rewriteAsOrReplace(stmt.sql);
|
|
352
|
+
await client.query("SAVEPOINT validate_fn");
|
|
353
|
+
try {
|
|
354
|
+
await client.query(replaceSql);
|
|
355
|
+
await client.query("RELEASE SAVEPOINT validate_fn");
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
await client.query("ROLLBACK TO SAVEPOINT validate_fn");
|
|
359
|
+
const pgErr = err;
|
|
360
|
+
errors.push({
|
|
361
|
+
statement: stmt,
|
|
362
|
+
code: pgErr.code ?? "",
|
|
363
|
+
message: pgErr.message ?? "Unknown validation error",
|
|
364
|
+
isDependencyError: false,
|
|
365
|
+
position: parsePgPosition(pgErr.position),
|
|
366
|
+
detail: pgErr.detail,
|
|
367
|
+
hint: pgErr.hint,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
// Always roll back: undoes all CREATE OR REPLACE changes and reverts the
|
|
374
|
+
// SET LOCAL search_path / check_function_bodies so nothing leaks.
|
|
375
|
+
await client.query("ROLLBACK");
|
|
376
|
+
}
|
|
377
|
+
return errors;
|
|
378
|
+
}
|
package/dist/core/depend.js
CHANGED
|
@@ -1390,6 +1390,29 @@ export async function extractDepends(pool) {
|
|
|
1390
1390
|
JOIN pg_namespace ns ON ns.oid = idx_rel.relnamespace
|
|
1391
1391
|
WHERE idx_rel.relkind = 'i'
|
|
1392
1392
|
),
|
|
1393
|
+
index_extension_deps AS (
|
|
1394
|
+
-- Indexes depend on extensions that provide their operator classes
|
|
1395
|
+
-- (e.g. gin_trgm_ops from pg_trgm). Without this, CREATE INDEX can be
|
|
1396
|
+
-- ordered before CREATE EXTENSION when schemas sort alphabetically.
|
|
1397
|
+
SELECT DISTINCT
|
|
1398
|
+
format('index:%I.%I.%I', ns.nspname, tbl.relname, idx_rel.relname) AS dependent_stable_id,
|
|
1399
|
+
format('extension:%I', ext.extname) AS referenced_stable_id,
|
|
1400
|
+
'n'::"char" AS deptype,
|
|
1401
|
+
ns.nspname AS dep_schema,
|
|
1402
|
+
NULL::text AS ref_schema
|
|
1403
|
+
FROM pg_class idx_rel
|
|
1404
|
+
JOIN pg_index idx ON idx.indexrelid = idx_rel.oid
|
|
1405
|
+
JOIN pg_class tbl ON tbl.oid = idx.indrelid
|
|
1406
|
+
JOIN pg_namespace ns ON ns.oid = idx_rel.relnamespace
|
|
1407
|
+
JOIN LATERAL unnest(idx.indclass) WITH ORDINALITY AS oc(oid, ord) ON true
|
|
1408
|
+
JOIN pg_opclass opcl ON opcl.oid = oc.oid
|
|
1409
|
+
JOIN pg_depend d ON d.classid = 'pg_opclass'::regclass
|
|
1410
|
+
AND d.objid = opcl.oid
|
|
1411
|
+
AND d.refclassid = 'pg_extension'::regclass
|
|
1412
|
+
AND d.deptype = 'e'
|
|
1413
|
+
JOIN pg_extension ext ON ext.oid = d.refobjid
|
|
1414
|
+
WHERE idx_rel.relkind IN ('i', 'I')
|
|
1415
|
+
),
|
|
1393
1416
|
ownership_deps AS (
|
|
1394
1417
|
-- Schema ownership dependencies
|
|
1395
1418
|
SELECT DISTINCT
|
|
@@ -1803,6 +1826,8 @@ export async function extractDepends(pool) {
|
|
|
1803
1826
|
UNION ALL
|
|
1804
1827
|
SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM index_table_deps
|
|
1805
1828
|
UNION ALL
|
|
1829
|
+
SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM index_extension_deps
|
|
1830
|
+
UNION ALL
|
|
1806
1831
|
SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM ownership_deps
|
|
1807
1832
|
UNION ALL
|
|
1808
1833
|
SELECT dependent_stable_id, referenced_stable_id, deptype, dep_schema, ref_schema FROM publication_deps
|
|
@@ -5,10 +5,16 @@ import type { Change } from "./change.types.ts";
|
|
|
5
5
|
* replaced so that destructive drops succeed. Uses dependency edges from pg_depend
|
|
6
6
|
* (already captured in Catalog.depends) plus change metadata (creates/drops/requires).
|
|
7
7
|
*
|
|
8
|
-
* New changes are appended; ordering
|
|
8
|
+
* New changes are appended; ordering and any multi-statement cycle normalization
|
|
9
|
+
* are handled later by post-diff helpers and the sorter.
|
|
9
10
|
*/
|
|
11
|
+
interface ExpandReplaceDependenciesResult {
|
|
12
|
+
changes: Change[];
|
|
13
|
+
replacedTableIds: ReadonlySet<string>;
|
|
14
|
+
}
|
|
10
15
|
export declare function expandReplaceDependencies({ changes, mainCatalog, branchCatalog, }: {
|
|
11
16
|
changes: Change[];
|
|
12
17
|
mainCatalog: Catalog;
|
|
13
18
|
branchCatalog: Catalog;
|
|
14
|
-
}):
|
|
19
|
+
}): ExpandReplaceDependenciesResult;
|
|
20
|
+
export {};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { CreateDomain } from "./objects/domain/changes/domain.create.js";
|
|
2
2
|
import { DropDomain } from "./objects/domain/changes/domain.drop.js";
|
|
3
|
+
import { CreateIndex } from "./objects/index/changes/index.create.js";
|
|
4
|
+
import { DropIndex } from "./objects/index/changes/index.drop.js";
|
|
3
5
|
import { CreateMaterializedView } from "./objects/materialized-view/changes/materialized-view.create.js";
|
|
4
6
|
import { DropMaterializedView } from "./objects/materialized-view/changes/materialized-view.drop.js";
|
|
5
7
|
import { CreateProcedure } from "./objects/procedure/changes/procedure.create.js";
|
|
@@ -14,15 +16,9 @@ import { CreateEnum } from "./objects/type/enum/changes/enum.create.js";
|
|
|
14
16
|
import { DropEnum } from "./objects/type/enum/changes/enum.drop.js";
|
|
15
17
|
import { CreateRange } from "./objects/type/range/changes/range.create.js";
|
|
16
18
|
import { DropRange } from "./objects/type/range/changes/range.drop.js";
|
|
19
|
+
import { stableId } from "./objects/utils.js";
|
|
17
20
|
import { CreateView } from "./objects/view/changes/view.create.js";
|
|
18
21
|
import { DropView } from "./objects/view/changes/view.drop.js";
|
|
19
|
-
/**
|
|
20
|
-
* For objects we are replacing (drop + create), ensure that any dependents are also
|
|
21
|
-
* replaced so that destructive drops succeed. Uses dependency edges from pg_depend
|
|
22
|
-
* (already captured in Catalog.depends) plus change metadata (creates/drops/requires).
|
|
23
|
-
*
|
|
24
|
-
* New changes are appended; ordering is handled later by the sorter.
|
|
25
|
-
*/
|
|
26
22
|
export function expandReplaceDependencies({ changes, mainCatalog, branchCatalog, }) {
|
|
27
23
|
const createdIds = new Set();
|
|
28
24
|
const droppedIds = new Set();
|
|
@@ -38,8 +34,30 @@ export function expandReplaceDependencies({ changes, mainCatalog, branchCatalog,
|
|
|
38
34
|
replaceRoots.add(id);
|
|
39
35
|
}
|
|
40
36
|
}
|
|
37
|
+
// Procedure stableIds are signature-qualified
|
|
38
|
+
// (`procedure:schema.name(argtypes)`), so a function whose parameter types
|
|
39
|
+
// change has different ids in `createdIds` and `droppedIds` and would not
|
|
40
|
+
// appear in the intersection above. Treat any dropped procedure whose
|
|
41
|
+
// `(schema, name)` matches a created procedure as a replace root so
|
|
42
|
+
// dependents referencing the old signature via pg_depend get promoted to
|
|
43
|
+
// DROP+CREATE.
|
|
44
|
+
const createdProcedureNames = new Set();
|
|
45
|
+
for (const id of createdIds) {
|
|
46
|
+
const key = parseProcedureSchemaName(id);
|
|
47
|
+
if (key)
|
|
48
|
+
createdProcedureNames.add(key);
|
|
49
|
+
}
|
|
50
|
+
for (const id of droppedIds) {
|
|
51
|
+
const key = parseProcedureSchemaName(id);
|
|
52
|
+
if (key && createdProcedureNames.has(key)) {
|
|
53
|
+
replaceRoots.add(id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
41
56
|
if (replaceRoots.size === 0) {
|
|
42
|
-
return
|
|
57
|
+
return {
|
|
58
|
+
changes,
|
|
59
|
+
replacedTableIds: new Set(),
|
|
60
|
+
};
|
|
43
61
|
}
|
|
44
62
|
// Build referenced -> dependents adjacency from main catalog dependencies.
|
|
45
63
|
const dependentsByReferenced = new Map();
|
|
@@ -55,12 +73,21 @@ export function expandReplaceDependencies({ changes, mainCatalog, branchCatalog,
|
|
|
55
73
|
const visitedTargets = new Set();
|
|
56
74
|
const visitedRefs = new Set(replaceRoots);
|
|
57
75
|
const queue = [...replaceRoots];
|
|
76
|
+
// Tables being replaced by an expansion-added DropTable+CreateTable pair.
|
|
77
|
+
// Any pre-existing targeted AlterTable*(T) object-scope change is superseded
|
|
78
|
+
// by the replacement and must be removed to avoid contradictions (e.g. an
|
|
79
|
+
// AlterTableDropColumn on a table that is about to be dropped) and the
|
|
80
|
+
// associated drop-phase cycle with the catalog constraint→column edge.
|
|
81
|
+
const tablesReplacedByExpansion = new Set();
|
|
58
82
|
while (queue.length > 0) {
|
|
59
83
|
const refId = queue.shift();
|
|
60
84
|
const dependents = dependentsByReferenced.get(refId);
|
|
61
85
|
if (!dependents)
|
|
62
86
|
continue;
|
|
63
87
|
for (const dependentRaw of dependents) {
|
|
88
|
+
if (isOwnedSequenceColumnDependency(refId, dependentRaw, mainCatalog, branchCatalog)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
64
91
|
// Continue traversing the dependency graph from the raw dependent id.
|
|
65
92
|
if (!visitedRefs.has(dependentRaw)) {
|
|
66
93
|
visitedRefs.add(dependentRaw);
|
|
@@ -98,6 +125,12 @@ export function expandReplaceDependencies({ changes, mainCatalog, branchCatalog,
|
|
|
98
125
|
if (!replacementChanges)
|
|
99
126
|
continue;
|
|
100
127
|
additions.push(...replacementChanges);
|
|
128
|
+
// If we added a DropTable(T) for an existing table, mark T so any
|
|
129
|
+
// pre-existing object-scope AlterTable*(T) changes get dropped below —
|
|
130
|
+
// the DropTable+CreateTable pair supersedes all structural alterations.
|
|
131
|
+
if (resolved.kind === "table" && addDrop) {
|
|
132
|
+
tablesReplacedByExpansion.add(targetId);
|
|
133
|
+
}
|
|
101
134
|
// Track new creates/drops so we don't duplicate work for downstream dependents.
|
|
102
135
|
for (const change of replacementChanges) {
|
|
103
136
|
for (const id of change.creates ?? [])
|
|
@@ -108,9 +141,42 @@ export function expandReplaceDependencies({ changes, mainCatalog, branchCatalog,
|
|
|
108
141
|
}
|
|
109
142
|
}
|
|
110
143
|
if (additions.length === 0) {
|
|
111
|
-
return
|
|
144
|
+
return {
|
|
145
|
+
changes,
|
|
146
|
+
replacedTableIds: tablesReplacedByExpansion,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
changes: [...changes, ...additions],
|
|
151
|
+
replacedTableIds: tablesReplacedByExpansion,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function isOwnedSequenceColumnDependency(referencedId, dependentId, mainCatalog, branchCatalog) {
|
|
155
|
+
// When a sequence replace root is still OWNED BY the same column, the
|
|
156
|
+
// sequence->column pg_depend edge is bookkeeping for ownership, not a signal
|
|
157
|
+
// that the whole owning table needs to be replaced. Skipping that edge keeps
|
|
158
|
+
// expandReplaceDependencies focused on recreating the sequence itself.
|
|
159
|
+
if (!referencedId.startsWith("sequence:") ||
|
|
160
|
+
!dependentId.startsWith("column:")) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const sequence = branchCatalog.sequences[referencedId] ??
|
|
164
|
+
mainCatalog.sequences[referencedId];
|
|
165
|
+
if (!sequence?.owned_by_schema ||
|
|
166
|
+
!sequence.owned_by_table ||
|
|
167
|
+
!sequence.owned_by_column) {
|
|
168
|
+
return false;
|
|
112
169
|
}
|
|
113
|
-
return
|
|
170
|
+
return (dependentId ===
|
|
171
|
+
stableId.column(sequence.owned_by_schema, sequence.owned_by_table, sequence.owned_by_column));
|
|
172
|
+
}
|
|
173
|
+
function parseProcedureSchemaName(stableId) {
|
|
174
|
+
if (!stableId.startsWith("procedure:"))
|
|
175
|
+
return null;
|
|
176
|
+
const paren = stableId.indexOf("(");
|
|
177
|
+
if (paren === -1)
|
|
178
|
+
return null;
|
|
179
|
+
return stableId.slice("procedure:".length, paren);
|
|
114
180
|
}
|
|
115
181
|
function normalizeDependentId(dependentId) {
|
|
116
182
|
let id = dependentId;
|
|
@@ -158,6 +224,18 @@ function resolveObjectForStableId(stableId, mainCatalog, branchCatalog) {
|
|
|
158
224
|
const branch = branchCatalog.materializedViews[stableId];
|
|
159
225
|
return main && branch ? { kind: "materialized_view", main, branch } : null;
|
|
160
226
|
}
|
|
227
|
+
if (stableId.startsWith("index:")) {
|
|
228
|
+
const main = mainCatalog.indexes[stableId];
|
|
229
|
+
const branch = branchCatalog.indexes[stableId];
|
|
230
|
+
return main && branch
|
|
231
|
+
? {
|
|
232
|
+
kind: "index",
|
|
233
|
+
main,
|
|
234
|
+
branch,
|
|
235
|
+
branchIndexableObject: branchCatalog.indexableObjects[branch.tableStableId],
|
|
236
|
+
}
|
|
237
|
+
: null;
|
|
238
|
+
}
|
|
161
239
|
if (stableId.startsWith("procedure:")) {
|
|
162
240
|
const main = mainCatalog.procedures[stableId];
|
|
163
241
|
const branch = branchCatalog.procedures[stableId];
|
|
@@ -243,6 +321,34 @@ function buildReplaceChanges(resolved, options) {
|
|
|
243
321
|
? [new CreateMaterializedView({ materializedView: resolved.branch })]
|
|
244
322
|
: []),
|
|
245
323
|
];
|
|
324
|
+
case "index":
|
|
325
|
+
// Constraint-owned, primary, and partition-attached indexes are managed
|
|
326
|
+
// by the owning constraint or parent-index DDL, not standalone
|
|
327
|
+
// CREATE INDEX / DROP INDEX. The `case "table":` branch above already
|
|
328
|
+
// recreates constraints via AlterTableAddConstraint; emitting a
|
|
329
|
+
// standalone drop/create here would fail in PostgreSQL
|
|
330
|
+
// ("cannot drop index ... because constraint ... requires it") or
|
|
331
|
+
// duplicate the index the constraint recreates. Skip matches
|
|
332
|
+
// diffIndexes (packages/pg-delta/src/core/objects/index/index.diff.ts).
|
|
333
|
+
if (resolved.main.is_owned_by_constraint ||
|
|
334
|
+
resolved.main.is_primary ||
|
|
335
|
+
resolved.main.is_index_partition ||
|
|
336
|
+
resolved.branch.is_owned_by_constraint ||
|
|
337
|
+
resolved.branch.is_primary ||
|
|
338
|
+
resolved.branch.is_index_partition) {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
return [
|
|
342
|
+
...(addDrop ? [new DropIndex({ index: resolved.main })] : []),
|
|
343
|
+
...(addCreate
|
|
344
|
+
? [
|
|
345
|
+
new CreateIndex({
|
|
346
|
+
index: resolved.branch,
|
|
347
|
+
indexableObject: resolved.branchIndexableObject,
|
|
348
|
+
}),
|
|
349
|
+
]
|
|
350
|
+
: []),
|
|
351
|
+
];
|
|
246
352
|
case "procedure":
|
|
247
353
|
return [
|
|
248
354
|
...(addDrop ? [new DropProcedure({ procedure: resolved.main })] : []),
|