@supabase/pg-delta 1.0.0-alpha.2 → 1.0.0-alpha.21
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 +70 -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 +10 -17
- 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 +55 -90
- 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 +69 -22
- package/dist/core/objects/table/changes/table.alter.js +130 -27
- 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 +101 -162
- package/dist/core/objects/table/table.model.d.ts +29 -22
- package/dist/core/objects/table/table.model.js +16 -8
- 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 +100 -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/cycle-breakers.d.ts +15 -0
- package/dist/core/sort/cycle-breakers.js +269 -0
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- package/dist/core/sort/sort-changes.js +97 -43
- 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 +252 -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 +555 -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 +434 -0
- package/src/core/objects/sequence/sequence.diff.ts +334 -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 +910 -0
- package/src/core/objects/table/changes/table.alter.ts +939 -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 +1189 -0
- package/src/core/objects/table/table.diff.ts +913 -0
- package/src/core/objects/table/table.model.ts +465 -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 +303 -0
- package/src/core/post-diff-cycle-breaking.ts +138 -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/cycle-breakers.test.ts +476 -0
- package/src/core/sort/cycle-breakers.ts +311 -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 +319 -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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PostgreSQL connection configuration with custom type handlers.
|
|
3
3
|
*/
|
|
4
|
-
import { Pool, types } from "pg";
|
|
4
|
+
import { escapeIdentifier, Pool, types } from "pg";
|
|
5
|
+
import { normalizeConnectionUrl } from "./connection-url.js";
|
|
6
|
+
import { parseSslConfig } from "./plan/ssl-config.js";
|
|
5
7
|
// ============================================================================
|
|
6
8
|
// Array Parser
|
|
7
9
|
// ============================================================================
|
|
@@ -92,14 +94,152 @@ types.setTypeParser(1005, (val) => parseArray(val, parseIntElement)); // int2[]
|
|
|
92
94
|
types.setTypeParser(1007, (val) => parseArray(val, parseIntElement)); // int4[]
|
|
93
95
|
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
94
96
|
types.setTypeParser(1016, (val) => parseArray(val, parseIntElement)); // int8[]
|
|
97
|
+
const DEFAULT_POOL_MAX = Number(process.env.PGDELTA_POOL_MAX) || 5;
|
|
98
|
+
const DEFAULT_CONNECTION_TIMEOUT_MS = Number(process.env.PGDELTA_CONNECTION_TIMEOUT_MS) || 3_000;
|
|
99
|
+
const DEFAULT_CONNECT_TIMEOUT_MS = Number(process.env.PGDELTA_CONNECT_TIMEOUT_MS) || 2_500;
|
|
100
|
+
const DEFAULT_CONNECT_MAX_ATTEMPTS = Number(process.env.PGDELTA_CONNECT_MAX_ATTEMPTS) || 3;
|
|
101
|
+
const DEFAULT_CONNECT_BASE_BACKOFF_MS = Number(process.env.PGDELTA_CONNECT_BASE_BACKOFF_MS) || 250;
|
|
102
|
+
const DEFAULT_CONNECT_MAX_BACKOFF_MS = Number(process.env.PGDELTA_CONNECT_MAX_BACKOFF_MS) || 1_000;
|
|
103
|
+
// PostgreSQL auth-class SQLSTATE codes: not retryable.
|
|
104
|
+
const NON_RETRYABLE_PG_CODES = new Set([
|
|
105
|
+
"28000", // invalid_authorization_specification
|
|
106
|
+
"28P01", // invalid_password
|
|
107
|
+
"28P02", // pgdelta: alias reserved here to future-proof against new auth codes
|
|
108
|
+
]);
|
|
109
|
+
// Non-retryable TLS/SSL markers. The `pg` driver surfaces TLS failures as
|
|
110
|
+
// either plain Node `Error` instances with a code on `ERR_TLS_*` or error
|
|
111
|
+
// messages that include well-known cert/TLS terminology; we match both
|
|
112
|
+
// because node-pg normalises some of these.
|
|
113
|
+
const TLS_MESSAGE_MARKERS = [
|
|
114
|
+
"self-signed certificate",
|
|
115
|
+
"self signed certificate",
|
|
116
|
+
"unable to verify the first certificate",
|
|
117
|
+
"certificate has expired",
|
|
118
|
+
"tls",
|
|
119
|
+
"ssl",
|
|
120
|
+
];
|
|
121
|
+
/**
|
|
122
|
+
* Return true when `err` represents a transient connect failure that makes
|
|
123
|
+
* sense to retry with backoff (e.g. refused connections, DNS blips, our own
|
|
124
|
+
* eager-connect timeout wrapper). Returns false for permanent failures such
|
|
125
|
+
* as authentication errors, TLS negotiation errors, and `ENOTFOUND`.
|
|
126
|
+
*
|
|
127
|
+
* Unknown errors are treated as retryable on purpose: transient-by-default
|
|
128
|
+
* is safer here because a duplicated retry is strictly cheaper than a spurious
|
|
129
|
+
* hard failure during catalog extraction.
|
|
130
|
+
*/
|
|
131
|
+
export function isRetryableConnectError(err) {
|
|
132
|
+
if (!(err instanceof Error))
|
|
133
|
+
return true;
|
|
134
|
+
const code = err.code;
|
|
135
|
+
if (code && NON_RETRYABLE_PG_CODES.has(code))
|
|
136
|
+
return false;
|
|
137
|
+
if (code === "ENOTFOUND")
|
|
138
|
+
return false;
|
|
139
|
+
if (code && typeof code === "string" && code.startsWith("ERR_TLS")) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const message = err.message?.toLowerCase() ?? "";
|
|
143
|
+
// Our own eager-connect timeout wrapper is retryable (flaky network).
|
|
144
|
+
if (message.includes("timed out after"))
|
|
145
|
+
return true;
|
|
146
|
+
for (const marker of TLS_MESSAGE_MARKERS) {
|
|
147
|
+
if (message.includes(marker))
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Retry an async `connect` operation with bounded exponential backoff.
|
|
154
|
+
* Stops immediately on a non-retryable error. On exhausted attempts, throws
|
|
155
|
+
* the last observed error.
|
|
156
|
+
*
|
|
157
|
+
* Exposed for testing — production call sites always go through
|
|
158
|
+
* {@link createManagedPool}.
|
|
159
|
+
*/
|
|
160
|
+
export async function connectWithRetry(opts) {
|
|
161
|
+
const maxAttempts = opts.maxAttempts ?? DEFAULT_CONNECT_MAX_ATTEMPTS;
|
|
162
|
+
const baseBackoffMs = opts.baseBackoffMs ?? DEFAULT_CONNECT_BASE_BACKOFF_MS;
|
|
163
|
+
const maxBackoffMs = opts.maxBackoffMs ?? DEFAULT_CONNECT_MAX_BACKOFF_MS;
|
|
164
|
+
const isRetryable = opts.isRetryable ?? isRetryableConnectError;
|
|
165
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
166
|
+
let lastError;
|
|
167
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
168
|
+
try {
|
|
169
|
+
return await opts.connect(attempt);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
lastError = err;
|
|
173
|
+
if (attempt >= maxAttempts || !isRetryable(err)) {
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
const backoff = Math.min(baseBackoffMs * 2 ** (attempt - 1), maxBackoffMs);
|
|
177
|
+
await sleep(backoff);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Unreachable: loop either returns or throws.
|
|
181
|
+
throw lastError;
|
|
182
|
+
}
|
|
95
183
|
/**
|
|
96
184
|
* Create a Pool with custom type handlers and optional event listeners.
|
|
185
|
+
*
|
|
186
|
+
* `connectionString` may be `undefined` when the caller needs pg to rely on
|
|
187
|
+
* explicit `host`/`port`/`user`/... fields from `options` instead — notably
|
|
188
|
+
* the bracketed-IPv6 workaround in {@link poolConfigFromUrl}, where passing
|
|
189
|
+
* the connection string would cause `pg-connection-string` to re-inject the
|
|
190
|
+
* bracketed host that breaks `getaddrinfo`.
|
|
97
191
|
*/
|
|
98
192
|
export function createPool(connectionString, options) {
|
|
99
193
|
const { onConnect, onError, onAcquire, onRemove, ...config } = options ?? {};
|
|
100
|
-
const pool = new Pool({
|
|
101
|
-
|
|
102
|
-
|
|
194
|
+
const pool = new Pool({
|
|
195
|
+
...(connectionString ? { connectionString } : {}),
|
|
196
|
+
max: DEFAULT_POOL_MAX,
|
|
197
|
+
connectionTimeoutMillis: DEFAULT_CONNECTION_TIMEOUT_MS,
|
|
198
|
+
...config,
|
|
199
|
+
});
|
|
200
|
+
if (onConnect) {
|
|
201
|
+
const pendingClientSetup = new WeakMap();
|
|
202
|
+
const waitForClientSetup = async (client) => {
|
|
203
|
+
const setup = pendingClientSetup.get(client);
|
|
204
|
+
if (setup) {
|
|
205
|
+
await setup;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
throw new Error("Internal error: pool client was acquired before async onConnect setup was registered. This indicates a bug in the pool wrapper logic; please report it with reproduction steps.");
|
|
209
|
+
};
|
|
210
|
+
const originalConnect = pool.connect.bind(pool);
|
|
211
|
+
pool.on("connect", (client) => {
|
|
212
|
+
pendingClientSetup.set(client, Promise.resolve().then(() => onConnect(client)));
|
|
213
|
+
});
|
|
214
|
+
pool.connect = ((callback) => {
|
|
215
|
+
if (!callback) {
|
|
216
|
+
return originalConnect().then(async (client) => {
|
|
217
|
+
try {
|
|
218
|
+
await waitForClientSetup(client);
|
|
219
|
+
return client;
|
|
220
|
+
}
|
|
221
|
+
catch (setupError) {
|
|
222
|
+
client.release?.(setupError);
|
|
223
|
+
throw setupError;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return originalConnect(async (err, client, release) => {
|
|
228
|
+
if (err || !client) {
|
|
229
|
+
callback(err, client, release);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
await waitForClientSetup(client);
|
|
234
|
+
callback(err, client, release);
|
|
235
|
+
}
|
|
236
|
+
catch (setupError) {
|
|
237
|
+
release(setupError);
|
|
238
|
+
callback(setupError, undefined, () => { });
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
}
|
|
103
243
|
if (onError)
|
|
104
244
|
pool.on("error", onError);
|
|
105
245
|
if (onAcquire)
|
|
@@ -108,3 +248,132 @@ export function createPool(connectionString, options) {
|
|
|
108
248
|
pool.on("remove", onRemove);
|
|
109
249
|
return pool;
|
|
110
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Build a pg {@link PoolConfig} from a cleaned connection URL.
|
|
253
|
+
*
|
|
254
|
+
* For most URLs this just returns `{ connectionString }` and pg does its
|
|
255
|
+
* normal parsing. But for URLs whose hostname is a bracketed IPv6 literal
|
|
256
|
+
* (e.g. `postgresql://user@[::1]:5432/db`, as produced by
|
|
257
|
+
* {@link normalizeConnectionUrl}), we expand the URL into explicit
|
|
258
|
+
* `host`/`port`/`user`/`password`/`database` fields with a **bare** IPv6
|
|
259
|
+
* host — no brackets.
|
|
260
|
+
*
|
|
261
|
+
* This works around a `pg-connection-string` quirk: its parser sets
|
|
262
|
+
* `config.host` to the WHATWG `URL.hostname`, which keeps the surrounding
|
|
263
|
+
* `[...]` for IPv6 literals. That bracketed value is then passed verbatim to
|
|
264
|
+
* `getaddrinfo`, which rejects it with `ENOTFOUND`. Since
|
|
265
|
+
* `pg`'s connection-parameters module does
|
|
266
|
+
* `Object.assign({}, config, parse(connectionString))`, any `host` we pass
|
|
267
|
+
* alongside `connectionString` gets clobbered — so we drop `connectionString`
|
|
268
|
+
* entirely on this path and hand pg the parsed fields directly.
|
|
269
|
+
*
|
|
270
|
+
* Remaining query parameters (e.g. `application_name`, `options`,
|
|
271
|
+
* `connect_timeout`) are forwarded as top-level config keys, mirroring how
|
|
272
|
+
* `pg-connection-string` would normally surface them.
|
|
273
|
+
*/
|
|
274
|
+
export function poolConfigFromUrl(cleanedUrl) {
|
|
275
|
+
const urlObj = new URL(cleanedUrl);
|
|
276
|
+
if (!urlObj.hostname.startsWith("[")) {
|
|
277
|
+
return { connectionString: cleanedUrl };
|
|
278
|
+
}
|
|
279
|
+
const config = {
|
|
280
|
+
host: urlObj.hostname.slice(1, -1),
|
|
281
|
+
};
|
|
282
|
+
if (urlObj.port)
|
|
283
|
+
config.port = Number(urlObj.port);
|
|
284
|
+
if (urlObj.username)
|
|
285
|
+
config.user = decodeURIComponent(urlObj.username);
|
|
286
|
+
if (urlObj.password)
|
|
287
|
+
config.password = decodeURIComponent(urlObj.password);
|
|
288
|
+
if (urlObj.pathname.length > 1) {
|
|
289
|
+
config.database = decodeURIComponent(urlObj.pathname.slice(1));
|
|
290
|
+
}
|
|
291
|
+
for (const [key, value] of urlObj.searchParams) {
|
|
292
|
+
config[key] = value;
|
|
293
|
+
}
|
|
294
|
+
return config;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* End a pool and wait for all client sockets to fully close.
|
|
298
|
+
*
|
|
299
|
+
* pg-pool's `pool.end()` resolves once clients are removed from its
|
|
300
|
+
* internal bookkeeping, but the underlying `client.end()` calls (which
|
|
301
|
+
* close the TCP/TLS sockets) are fired asynchronously *after* that.
|
|
302
|
+
* If the server (e.g. a test container) is stopped right after
|
|
303
|
+
* `pool.end()` resolves, the still-open sockets receive an unexpected
|
|
304
|
+
* RST and emit unhandled "Connection terminated unexpectedly" errors.
|
|
305
|
+
*
|
|
306
|
+
* This helper waits for every `remove` event — which pg-pool emits
|
|
307
|
+
* inside each `client.end()` callback — ensuring all sockets are
|
|
308
|
+
* truly closed before it resolves.
|
|
309
|
+
*/
|
|
310
|
+
/**
|
|
311
|
+
* Create a pool from a connection URL with standard session setup:
|
|
312
|
+
* SSL parsing, search_path isolation, optional SET ROLE, and 57P01 suppression.
|
|
313
|
+
*
|
|
314
|
+
* Returns the pool and a `close` function that properly waits for all sockets
|
|
315
|
+
* to close (via {@link endPool}).
|
|
316
|
+
*/
|
|
317
|
+
export async function createManagedPool(url, options) {
|
|
318
|
+
// Normalize percent-encoded IPv6 hosts (e.g. `2406%3A...%3Ab3c9`) into the
|
|
319
|
+
// canonical bracketed form before the URL reaches `parseSslConfig` or pg.
|
|
320
|
+
// Non-IPv6 hosts are returned unchanged.
|
|
321
|
+
const normalizedUrl = normalizeConnectionUrl(url);
|
|
322
|
+
const sslConfig = await parseSslConfig(normalizedUrl, options?.label ?? "target");
|
|
323
|
+
// Expand bracketed-IPv6 URLs into explicit pg fields so the brackets never
|
|
324
|
+
// reach `getaddrinfo` — see `poolConfigFromUrl` for the full rationale.
|
|
325
|
+
const connectionConfig = poolConfigFromUrl(sslConfig.cleanedUrl);
|
|
326
|
+
const pool = createPool(connectionConfig.connectionString, {
|
|
327
|
+
...connectionConfig,
|
|
328
|
+
...(sslConfig.ssl !== undefined ? { ssl: sslConfig.ssl } : {}),
|
|
329
|
+
onError: (err) => {
|
|
330
|
+
if (err.code !== "57P01") {
|
|
331
|
+
console.error("Pool error:", err);
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
onConnect: async (client) => {
|
|
335
|
+
await client.query("SET search_path = ''");
|
|
336
|
+
if (options?.role) {
|
|
337
|
+
await client.query(`SET ROLE ${escapeIdentifier(options.role)}`);
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
// Eagerly validate connectivity so SSL/auth failures surface immediately
|
|
342
|
+
// instead of hanging on the first real query. node-pg's connectionTimeoutMillis
|
|
343
|
+
// is not reliably enforced under Bun when SSL negotiation hangs. Transient
|
|
344
|
+
// failures (refused connections, flaky DNS, our own timeout wrapper) are
|
|
345
|
+
// retried with bounded exponential backoff; auth/TLS/ENOTFOUND fail fast.
|
|
346
|
+
const label = options?.label ?? "target";
|
|
347
|
+
const timeoutMs = DEFAULT_CONNECT_TIMEOUT_MS;
|
|
348
|
+
try {
|
|
349
|
+
const client = await connectWithRetry({
|
|
350
|
+
connect: () => Promise.race([
|
|
351
|
+
pool.connect(),
|
|
352
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Connection to ${label} database timed out after ${timeoutMs}ms. ` +
|
|
353
|
+
`The server may require SSL, use an invalid certificate, or be unreachable.`)), timeoutMs)),
|
|
354
|
+
]),
|
|
355
|
+
});
|
|
356
|
+
client.release();
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
await pool.end().catch(() => { });
|
|
360
|
+
throw err;
|
|
361
|
+
}
|
|
362
|
+
return { pool, close: () => endPool(pool) };
|
|
363
|
+
}
|
|
364
|
+
export function endPool(pool) {
|
|
365
|
+
const clientCount = pool.totalCount;
|
|
366
|
+
if (clientCount === 0) {
|
|
367
|
+
return pool.end();
|
|
368
|
+
}
|
|
369
|
+
return new Promise((resolve, reject) => {
|
|
370
|
+
let removed = 0;
|
|
371
|
+
pool.on("remove", function onRemove() {
|
|
372
|
+
if (++removed >= clientCount) {
|
|
373
|
+
pool.removeListener("remove", onRemove);
|
|
374
|
+
resolve();
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
pool.end().catch(reject);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { getSchema } from "../
|
|
1
|
+
import { getSchema } from "../change-utils.js";
|
|
2
2
|
import { GrantRoleDefaultPrivileges, RevokeRoleDefaultPrivileges, } from "../objects/role/changes/role.privilege.js";
|
|
3
|
+
import { AlterTableAlterColumnAddIdentity, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropIdentity, AlterTableAlterColumnSetDefault, } from "../objects/table/changes/table.alter.js";
|
|
3
4
|
/**
|
|
4
5
|
* Maps object type names to PostgreSQL default privilege objtype codes.
|
|
5
6
|
* This mirrors the mapping in base.default-privileges.ts.
|
|
@@ -116,11 +117,74 @@ function generateDefaultPrivilegeConstraints(changes) {
|
|
|
116
117
|
}
|
|
117
118
|
return constraints;
|
|
118
119
|
}
|
|
120
|
+
function generateIdentityTransitionConstraints(changes) {
|
|
121
|
+
const constraints = [];
|
|
122
|
+
const dropDefaultByColumn = new Map();
|
|
123
|
+
const dropIdentityByColumn = new Map();
|
|
124
|
+
const addIdentityByColumn = new Map();
|
|
125
|
+
const setDefaultByColumn = new Map();
|
|
126
|
+
for (let i = 0; i < changes.length; i++) {
|
|
127
|
+
const change = changes[i];
|
|
128
|
+
const columnKey = "table" in change && "column" in change
|
|
129
|
+
? `${change.table.schema}.${change.table.name}.${change.column.name}`
|
|
130
|
+
: null;
|
|
131
|
+
if (!columnKey)
|
|
132
|
+
continue;
|
|
133
|
+
if (change instanceof AlterTableAlterColumnDropDefault) {
|
|
134
|
+
const entries = dropDefaultByColumn.get(columnKey) ?? [];
|
|
135
|
+
entries.push(i);
|
|
136
|
+
dropDefaultByColumn.set(columnKey, entries);
|
|
137
|
+
}
|
|
138
|
+
else if (change instanceof AlterTableAlterColumnAddIdentity) {
|
|
139
|
+
const entries = addIdentityByColumn.get(columnKey) ?? [];
|
|
140
|
+
entries.push(i);
|
|
141
|
+
addIdentityByColumn.set(columnKey, entries);
|
|
142
|
+
}
|
|
143
|
+
else if (change instanceof AlterTableAlterColumnDropIdentity) {
|
|
144
|
+
const entries = dropIdentityByColumn.get(columnKey) ?? [];
|
|
145
|
+
entries.push(i);
|
|
146
|
+
dropIdentityByColumn.set(columnKey, entries);
|
|
147
|
+
}
|
|
148
|
+
else if (change instanceof AlterTableAlterColumnSetDefault) {
|
|
149
|
+
const entries = setDefaultByColumn.get(columnKey) ?? [];
|
|
150
|
+
entries.push(i);
|
|
151
|
+
setDefaultByColumn.set(columnKey, entries);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// These rules only order same-column ALTERs inside the create/alter phase.
|
|
155
|
+
// Sequence drops are handled separately in the earlier drop phase.
|
|
156
|
+
for (const [columnKey, dropDefaultIndexes] of dropDefaultByColumn) {
|
|
157
|
+
const addIdentityIndexes = addIdentityByColumn.get(columnKey) ?? [];
|
|
158
|
+
for (const sourceIndex of dropDefaultIndexes) {
|
|
159
|
+
for (const targetIndex of addIdentityIndexes) {
|
|
160
|
+
constraints.push({
|
|
161
|
+
sourceChangeIndex: sourceIndex,
|
|
162
|
+
targetChangeIndex: targetIndex,
|
|
163
|
+
source: "custom",
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const [columnKey, dropIdentityIndexes] of dropIdentityByColumn) {
|
|
169
|
+
const setDefaultIndexes = setDefaultByColumn.get(columnKey) ?? [];
|
|
170
|
+
for (const sourceIndex of dropIdentityIndexes) {
|
|
171
|
+
for (const targetIndex of setDefaultIndexes) {
|
|
172
|
+
constraints.push({
|
|
173
|
+
sourceChangeIndex: sourceIndex,
|
|
174
|
+
targetChangeIndex: targetIndex,
|
|
175
|
+
source: "custom",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return constraints;
|
|
181
|
+
}
|
|
119
182
|
/**
|
|
120
183
|
* All custom constraint generators.
|
|
121
184
|
*/
|
|
122
185
|
const customConstraintGenerators = [
|
|
123
186
|
generateDefaultPrivilegeConstraints,
|
|
187
|
+
generateIdentityTransitionConstraints,
|
|
124
188
|
];
|
|
125
189
|
/**
|
|
126
190
|
* Generate Constraints from custom constraint generators.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Change } from "../change.types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Try to break an unbreakable cycle by INJECTING NEW CHANGES or REWRITING
|
|
4
|
+
* existing ones (rather than removing graph edges).
|
|
5
|
+
*
|
|
6
|
+
* Called by `sortPhaseChanges` when its edge-removal cycle handler has seen
|
|
7
|
+
* the same cycle twice — i.e. weak-edge filtering exhausted itself but the
|
|
8
|
+
* cycle is still there. At that point we know the cycle is composed of
|
|
9
|
+
* "hard" edges (explicit `requires` or pg_depend rows) that can only be
|
|
10
|
+
* broken by changing the change list itself.
|
|
11
|
+
*
|
|
12
|
+
* Returns a rewritten `phaseChanges` array, or `null` if no breaker matches
|
|
13
|
+
* (in which case the caller throws the existing CycleError).
|
|
14
|
+
*/
|
|
15
|
+
export declare function tryBreakCycleByChangeInjection(cycleNodeIndexes: readonly number[], phaseChanges: readonly Change[]): Change[] | null;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { AlterPublicationDropTables } from "../objects/publication/changes/publication.alter.js";
|
|
2
|
+
import { AlterTableDropColumn, AlterTableDropConstraint, } from "../objects/table/changes/table.alter.js";
|
|
3
|
+
import { DropTable } from "../objects/table/changes/table.drop.js";
|
|
4
|
+
import { stableId } from "../objects/utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Try to break an unbreakable cycle by INJECTING NEW CHANGES or REWRITING
|
|
7
|
+
* existing ones (rather than removing graph edges).
|
|
8
|
+
*
|
|
9
|
+
* Called by `sortPhaseChanges` when its edge-removal cycle handler has seen
|
|
10
|
+
* the same cycle twice — i.e. weak-edge filtering exhausted itself but the
|
|
11
|
+
* cycle is still there. At that point we know the cycle is composed of
|
|
12
|
+
* "hard" edges (explicit `requires` or pg_depend rows) that can only be
|
|
13
|
+
* broken by changing the change list itself.
|
|
14
|
+
*
|
|
15
|
+
* Returns a rewritten `phaseChanges` array, or `null` if no breaker matches
|
|
16
|
+
* (in which case the caller throws the existing CycleError).
|
|
17
|
+
*/
|
|
18
|
+
export function tryBreakCycleByChangeInjection(cycleNodeIndexes, phaseChanges) {
|
|
19
|
+
// ─── Branch A: FK cycle among DropTable changes ──────────────────────
|
|
20
|
+
// Triggered when N≥2 dropped tables reference each other via foreign
|
|
21
|
+
// keys. With no surviving table on either side, every FK constraint
|
|
22
|
+
// stable-id ends up tied back to a DropTable node, and every
|
|
23
|
+
// pg_depend row produces a hard explicit edge between two DropTables.
|
|
24
|
+
// Edge filtering can't break it — the edges are not weak.
|
|
25
|
+
//
|
|
26
|
+
// Example (3-cycle):
|
|
27
|
+
// DROP TABLE a; DROP TABLE b; DROP TABLE c;
|
|
28
|
+
// where a.b_id REFERENCES b, b.c_id REFERENCES c, c.a_id REFERENCES a
|
|
29
|
+
//
|
|
30
|
+
// Fix: inject a dedicated `ALTER TABLE ... DROP CONSTRAINT fk` ahead of
|
|
31
|
+
// each DropTable in the cycle, and mark the constraint name on
|
|
32
|
+
// `DropTable.externallyDroppedConstraints` so the table drop won't try
|
|
33
|
+
// to re-claim the same constraint stable-id. The injected drops have
|
|
34
|
+
// their own stable-id ownership and run before any DropTable, breaking
|
|
35
|
+
// the cycle.
|
|
36
|
+
//
|
|
37
|
+
// This naturally handles any N (2-cycle, 3-cycle, …) because
|
|
38
|
+
// `findCycle` already gave us the full member list — no separate SCC
|
|
39
|
+
// enumeration needed.
|
|
40
|
+
const fkBroken = tryBreakFkCycle(cycleNodeIndexes, phaseChanges);
|
|
41
|
+
if (fkBroken)
|
|
42
|
+
return fkBroken;
|
|
43
|
+
// ─── Branch B: Publication ↔ Column on a surviving table ─────────────
|
|
44
|
+
// Triggered when a publication has an explicit column list and one of
|
|
45
|
+
// those columns is dropped on a table that itself is NOT being dropped
|
|
46
|
+
// (the table just loses one column).
|
|
47
|
+
//
|
|
48
|
+
// Example:
|
|
49
|
+
// CREATE PUBLICATION p FOR TABLE lab_results (id, flash_summary);
|
|
50
|
+
// ALTER TABLE lab_results DROP COLUMN flash_summary;
|
|
51
|
+
//
|
|
52
|
+
// Diff emits two drop-phase changes:
|
|
53
|
+
// AlterPublicationDropTables(p, [lab_results])
|
|
54
|
+
// AlterTableDropColumn(lab_results.flash_summary)
|
|
55
|
+
//
|
|
56
|
+
// The cycle:
|
|
57
|
+
// pub:p → col:lab_results.flash_summary (catalog, pg_depend)
|
|
58
|
+
// col:lab_results.flash_summary → table:lab_results
|
|
59
|
+
// (explicit, AlterTableDropColumn.requires)
|
|
60
|
+
//
|
|
61
|
+
// Fix: rebuild the AlterTableDropColumn with `omitTableRequirement=true`
|
|
62
|
+
// so it no longer requires `table:lab_results`. Safe because
|
|
63
|
+
// `lab_results` survives the migration; its lifetime trivially covers
|
|
64
|
+
// the column drop. The catalog edge `pub → col` correctly orders the
|
|
65
|
+
// publication drop before the column drop.
|
|
66
|
+
const pubColBroken = tryBreakPublicationColumnCycle(cycleNodeIndexes, phaseChanges);
|
|
67
|
+
if (pubColBroken)
|
|
68
|
+
return pubColBroken;
|
|
69
|
+
// No known pattern. Returning null lets sortPhaseChanges throw the
|
|
70
|
+
// formatted CycleError with full diagnostic — better a clear bug
|
|
71
|
+
// report than silently shipping a broken plan.
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Branch A worker — inject `AlterTableDropConstraint` for every FK linking
|
|
76
|
+
* two DropTables in the cycle.
|
|
77
|
+
*
|
|
78
|
+
* Returns the rewritten changes array, or `null` if the cycle does not
|
|
79
|
+
* match (e.g. mixed types, or no cross-cycle FK exists).
|
|
80
|
+
*/
|
|
81
|
+
function tryBreakFkCycle(cycleNodeIndexes, phaseChanges) {
|
|
82
|
+
// Guard: every member of the cycle must be a DropTable. Mixed cycles
|
|
83
|
+
// (e.g. DropTable + DropView, or DropTable + DropMaterializedView) are
|
|
84
|
+
// out of scope — they need a different breaker.
|
|
85
|
+
const cycleDropTables = [];
|
|
86
|
+
for (const nodeIndex of cycleNodeIndexes) {
|
|
87
|
+
const change = phaseChanges[nodeIndex];
|
|
88
|
+
if (!(change instanceof DropTable))
|
|
89
|
+
return null;
|
|
90
|
+
cycleDropTables.push(change);
|
|
91
|
+
}
|
|
92
|
+
const cycleTableIds = new Set(cycleDropTables.map((change) => change.table.stableId));
|
|
93
|
+
// For each DropTable in the cycle, find every FK whose referenced table
|
|
94
|
+
// is also in the cycle. Each such FK becomes one injected
|
|
95
|
+
// `AlterTableDropConstraint` and one entry on the source table's
|
|
96
|
+
// `externallyDroppedConstraints`.
|
|
97
|
+
//
|
|
98
|
+
// 2-cycle example: { A→B, B→A } — two FKs, two injected drops.
|
|
99
|
+
// 3-cycle example: { A→B, B→C, C→A } — three FKs, three injected drops.
|
|
100
|
+
const injectedDropsByTableId = new Map();
|
|
101
|
+
const updatedExternalsByTableId = new Map();
|
|
102
|
+
let didMutate = false;
|
|
103
|
+
for (const dropTable of cycleDropTables) {
|
|
104
|
+
const tableId = dropTable.table.stableId;
|
|
105
|
+
const existingExternals = new Set(dropTable.externallyDroppedConstraints);
|
|
106
|
+
let tableMutated = false;
|
|
107
|
+
for (const fk of iterCrossCycleFkConstraints(dropTable.table.constraints, tableId, cycleTableIds)) {
|
|
108
|
+
// Skip if a same-table `AlterTableDropConstraint` is already in the
|
|
109
|
+
// change list — could happen if a previous breaker iteration
|
|
110
|
+
// injected one, or the diff layer emitted one explicitly.
|
|
111
|
+
if (existingExternals.has(fk.name))
|
|
112
|
+
continue;
|
|
113
|
+
if (alreadyHasExplicitDrop(phaseChanges, tableId, fk.name))
|
|
114
|
+
continue;
|
|
115
|
+
const injected = new AlterTableDropConstraint({
|
|
116
|
+
table: dropTable.table,
|
|
117
|
+
constraint: fk,
|
|
118
|
+
});
|
|
119
|
+
const list = injectedDropsByTableId.get(tableId) ?? [];
|
|
120
|
+
list.push(injected);
|
|
121
|
+
injectedDropsByTableId.set(tableId, list);
|
|
122
|
+
existingExternals.add(fk.name);
|
|
123
|
+
tableMutated = true;
|
|
124
|
+
didMutate = true;
|
|
125
|
+
}
|
|
126
|
+
if (tableMutated) {
|
|
127
|
+
updatedExternalsByTableId.set(tableId, existingExternals);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!didMutate)
|
|
131
|
+
return null;
|
|
132
|
+
// Rebuild phaseChanges: keep all non-DropTable changes in place. For
|
|
133
|
+
// each DropTable in the cycle that gained injected drops, emit the
|
|
134
|
+
// injected drops first, then a fresh DropTable carrying the updated
|
|
135
|
+
// `externallyDroppedConstraints` so it stops claiming the FK
|
|
136
|
+
// stable-ids.
|
|
137
|
+
const rewritten = [];
|
|
138
|
+
for (const change of phaseChanges) {
|
|
139
|
+
if (!(change instanceof DropTable)) {
|
|
140
|
+
rewritten.push(change);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const tableId = change.table.stableId;
|
|
144
|
+
const injected = injectedDropsByTableId.get(tableId);
|
|
145
|
+
if (injected) {
|
|
146
|
+
rewritten.push(...injected);
|
|
147
|
+
}
|
|
148
|
+
const updatedExternals = updatedExternalsByTableId.get(tableId);
|
|
149
|
+
if (updatedExternals) {
|
|
150
|
+
rewritten.push(new DropTable({
|
|
151
|
+
table: change.table,
|
|
152
|
+
externallyDroppedConstraints: updatedExternals,
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
rewritten.push(change);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return rewritten;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Yield FK constraints on `constraints` whose referenced table is also a
|
|
163
|
+
* member of the cycle (i.e. an FK strictly between two cycle DropTables).
|
|
164
|
+
*
|
|
165
|
+
* Self-referencing FKs are skipped — they create a self-loop in the
|
|
166
|
+
* dependency graph which the existing sort-phase handler resolves on its
|
|
167
|
+
* own; injecting an `AlterTableDropConstraint` for a self-FK would just
|
|
168
|
+
* add noise.
|
|
169
|
+
*/
|
|
170
|
+
function* iterCrossCycleFkConstraints(constraints, ownTableId, cycleTableIds) {
|
|
171
|
+
for (const constraint of constraints) {
|
|
172
|
+
if (constraint.constraint_type !== "f")
|
|
173
|
+
continue;
|
|
174
|
+
if (constraint.is_partition_clone)
|
|
175
|
+
continue;
|
|
176
|
+
if (!constraint.foreign_key_schema || !constraint.foreign_key_table) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const referencedId = stableId.table(constraint.foreign_key_schema, constraint.foreign_key_table);
|
|
180
|
+
if (referencedId === ownTableId)
|
|
181
|
+
continue;
|
|
182
|
+
if (!cycleTableIds.has(referencedId))
|
|
183
|
+
continue;
|
|
184
|
+
yield constraint;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* True iff `phaseChanges` already contains an explicit
|
|
189
|
+
* `AlterTableDropConstraint(table, constraint)` for the given pair —
|
|
190
|
+
* either emitted by the diff layer or by a previous breaker iteration.
|
|
191
|
+
* Avoids duplicate constraint drops.
|
|
192
|
+
*/
|
|
193
|
+
function alreadyHasExplicitDrop(phaseChanges, tableId, constraintName) {
|
|
194
|
+
for (const change of phaseChanges) {
|
|
195
|
+
if (!(change instanceof AlterTableDropConstraint))
|
|
196
|
+
continue;
|
|
197
|
+
if (change.table.stableId !== tableId)
|
|
198
|
+
continue;
|
|
199
|
+
if (change.constraint.name === constraintName)
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Branch B worker — break the publication↔column cycle by rebuilding the
|
|
206
|
+
* `AlterTableDropColumn` change with `omitTableRequirement=true`.
|
|
207
|
+
*
|
|
208
|
+
* Returns the rewritten changes array, or `null` if the cycle does not
|
|
209
|
+
* match (e.g. table is also being dropped, or no `AlterPublicationDropTables`
|
|
210
|
+
* references the table).
|
|
211
|
+
*/
|
|
212
|
+
function tryBreakPublicationColumnCycle(cycleNodeIndexes, phaseChanges) {
|
|
213
|
+
// Find an `AlterTableDropColumn` and an `AlterPublicationDropTables` in
|
|
214
|
+
// the cycle that reference the same table. Both must be present —
|
|
215
|
+
// otherwise this is a different cycle shape.
|
|
216
|
+
let dropColumnIndex = -1;
|
|
217
|
+
let dropColumnChange = null;
|
|
218
|
+
let pubMatchesTable = false;
|
|
219
|
+
let pubChange = null;
|
|
220
|
+
for (const nodeIndex of cycleNodeIndexes) {
|
|
221
|
+
const change = phaseChanges[nodeIndex];
|
|
222
|
+
if (change instanceof AlterTableDropColumn &&
|
|
223
|
+
!change.omitTableRequirement) {
|
|
224
|
+
dropColumnIndex = nodeIndex;
|
|
225
|
+
dropColumnChange = change;
|
|
226
|
+
}
|
|
227
|
+
else if (change instanceof AlterPublicationDropTables) {
|
|
228
|
+
pubChange = change;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (dropColumnChange === null || pubChange === null)
|
|
232
|
+
return null;
|
|
233
|
+
// Verify the publication is actually dropping membership for the same
|
|
234
|
+
// table whose column is being dropped. Without this check we'd risk
|
|
235
|
+
// rewriting an unrelated AlterTableDropColumn that happens to share a
|
|
236
|
+
// cycle with some other publication change.
|
|
237
|
+
const targetTableId = dropColumnChange.table.stableId;
|
|
238
|
+
for (const t of pubChange.tables) {
|
|
239
|
+
if (stableId.table(t.schema, t.name) === targetTableId) {
|
|
240
|
+
pubMatchesTable = true;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (!pubMatchesTable)
|
|
245
|
+
return null;
|
|
246
|
+
// Verify the table is NOT itself being dropped. If `DropTable(T)` is in
|
|
247
|
+
// the same phase, the existing structural rewrites in
|
|
248
|
+
// `post-diff-cycle-breaking.ts` (replace-expansion superseded filter)
|
|
249
|
+
// already prune the redundant `AlterTableDropColumn`, so we should not
|
|
250
|
+
// see this combination here. Be defensive and bail anyway — flipping
|
|
251
|
+
// `omitTableRequirement` when T is being dropped would let the column
|
|
252
|
+
// drop reorder against the table drop, which is unsafe.
|
|
253
|
+
for (const change of phaseChanges) {
|
|
254
|
+
if (change instanceof DropTable &&
|
|
255
|
+
change.table.stableId === targetTableId) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Replace the AlterTableDropColumn with a fresh instance carrying
|
|
260
|
+
// `omitTableRequirement=true`. All other changes pass through
|
|
261
|
+
// unchanged.
|
|
262
|
+
const rewritten = phaseChanges.slice();
|
|
263
|
+
rewritten[dropColumnIndex] = new AlterTableDropColumn({
|
|
264
|
+
table: dropColumnChange.table,
|
|
265
|
+
column: dropColumnChange.column,
|
|
266
|
+
omitTableRequirement: true,
|
|
267
|
+
});
|
|
268
|
+
return rewritten;
|
|
269
|
+
}
|
|
@@ -56,7 +56,17 @@ export function convertExplicitRequirementsToConstraints(phaseChanges, graphData
|
|
|
56
56
|
const requiredIds = graphData.explicitRequirementSets[consumerIndex];
|
|
57
57
|
if (requiredIds.size === 0)
|
|
58
58
|
continue;
|
|
59
|
+
// Collect dropped IDs for this change so we can skip requirements
|
|
60
|
+
// for stableIds that this change also drops. A change that drops a
|
|
61
|
+
// stableId should not depend on another change that creates the same
|
|
62
|
+
// stableId, because the entity already exists in the source database.
|
|
63
|
+
// This prevents false ordering constraints such as Grant → Revoke
|
|
64
|
+
// when both operate on the same ACL stableId.
|
|
65
|
+
const droppedIds = new Set(phaseChanges[consumerIndex].drops);
|
|
59
66
|
for (const requiredId of requiredIds) {
|
|
67
|
+
if (droppedIds.has(requiredId)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
60
70
|
const producerIndexes = graphData.changeIndexesByCreatedId.get(requiredId);
|
|
61
71
|
if (!producerIndexes || producerIndexes.size === 0)
|
|
62
72
|
continue;
|