@supabase/pg-delta 1.0.0-alpha.4 → 1.0.0-alpha.5
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 +40 -23
- 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 +245 -0
- package/dist/cli/commands/plan.js +19 -6
- 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/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- 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 +64 -48
- 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/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/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 +63 -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 +38 -1
- package/dist/core/integrations/filter/dsl.js +20 -2
- package/dist/core/integrations/filter/extractors.js +42 -0
- package/dist/core/integrations/integration-dsl.d.ts +10 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +9 -0
- 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.create.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
- 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/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.create.js +4 -2
- 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/event-trigger.diff.d.ts +2 -3
- 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-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/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- 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/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.js +12 -12
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +16 -77
- 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 +0 -9
- package/dist/core/objects/publication/changes/publication.alter.js +0 -14
- package/dist/core/objects/publication/changes/publication.types.d.ts +2 -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.js +3 -3
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
- 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/rule.model.d.ts +1 -1
- 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/sequence.diff.d.ts +2 -8
- package/dist/core/objects/sequence/sequence.diff.js +16 -79
- package/dist/core/objects/sequence/sequence.model.js +1 -1
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/table/changes/table.create.js +3 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +26 -157
- package/dist/core/objects/table/table.model.d.ts +23 -22
- package/dist/core/objects/table/table.model.js +1 -1
- package/dist/core/objects/trigger/changes/trigger.create.js +2 -4
- package/dist/core/objects/trigger/trigger.model.d.ts +8 -0
- package/dist/core/objects/trigger/trigger.model.js +11 -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/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.create.js +6 -3
- 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/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +16 -158
- 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 +9 -26
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +134 -174
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/fixtures.js +3 -5
- package/dist/core/plan/sql-format/keyword-case.js +26 -1
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/types.d.ts +6 -0
- package/dist/core/postgres-config.d.ts +14 -0
- package/dist/core/postgres-config.js +53 -2
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +31 -23
- 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 +6 -0
- package/dist/index.js +6 -1
- package/package.json +21 -4
- package/src/cli/app.ts +27 -3
- package/src/cli/bin/cli.ts +6 -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 +330 -0
- package/src/cli/commands/plan.ts +28 -7
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/tree/tree.ts +3 -2
- 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 +44 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +79 -78
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +127 -1
- package/src/core/catalog.snapshot.test.ts +464 -0
- package/src/core/catalog.snapshot.ts +289 -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/expand-replace-dependencies.test.ts +70 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +574 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +129 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +211 -0
- package/src/core/integrations/filter/dsl.ts +65 -3
- package/src/core/integrations/filter/extractors.test.ts +244 -0
- package/src/core/integrations/filter/extractors.ts +42 -0
- package/src/core/integrations/integration-dsl.ts +10 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -0
- package/src/core/integrations/supabase.ts +9 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +39 -95
- package/src/core/objects/aggregate/aggregate.model.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +3 -1
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +5 -2
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +6 -3
- package/src/core/objects/aggregate/changes/aggregate.create.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +7 -3
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +9 -3
- package/src/core/objects/base.privilege-diff.ts +178 -30
- package/src/core/objects/base.privilege.ts +9 -2
- package/src/core/objects/collation/changes/collation.alter.test.ts +7 -2
- package/src/core/objects/collation/changes/collation.create.test.ts +7 -2
- package/src/core/objects/collation/changes/collation.drop.test.ts +4 -1
- package/src/core/objects/collation/collation.diff.test.ts +9 -12
- package/src/core/objects/collation/collation.diff.ts +2 -1
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +28 -9
- package/src/core/objects/domain/changes/domain.create.test.ts +32 -2
- package/src/core/objects/domain/changes/domain.create.ts +7 -1
- package/src/core/objects/domain/changes/domain.drop.test.ts +4 -1
- package/src/core/objects/domain/domain.diff.ts +39 -102
- package/src/core/objects/domain/domain.model.ts +1 -1
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +10 -3
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +4 -1
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +4 -1
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +12 -7
- package/src/core/objects/event-trigger/event-trigger.diff.ts +2 -1
- package/src/core/objects/extension/changes/extension.alter.test.ts +7 -2
- package/src/core/objects/extension/changes/extension.create.test.ts +4 -1
- package/src/core/objects/extension/changes/extension.drop.test.ts +4 -1
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +16 -5
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +51 -16
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +111 -4
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +31 -101
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +2 -2
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +46 -15
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +13 -4
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +39 -102
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +1 -1
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +22 -7
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +19 -6
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +31 -101
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +13 -4
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +16 -5
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +10 -3
- package/src/core/objects/index/changes/index.alter.test.ts +13 -4
- package/src/core/objects/index/changes/index.create.test.ts +4 -1
- package/src/core/objects/index/changes/index.drop.test.ts +4 -1
- package/src/core/objects/language/changes/language.alter.test.ts +4 -1
- package/src/core/objects/language/changes/language.create.test.ts +4 -1
- package/src/core/objects/language/changes/language.drop.test.ts +4 -1
- package/src/core/objects/language/language.diff.test.ts +86 -4
- package/src/core/objects/language/language.diff.ts +17 -49
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +10 -3
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +7 -2
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +4 -1
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +162 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +41 -191
- package/src/core/objects/materialized-view/materialized-view.model.ts +1 -1
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +121 -49
- package/src/core/objects/procedure/changes/procedure.alter.ts +15 -12
- package/src/core/objects/procedure/changes/procedure.create.test.ts +4 -1
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +7 -2
- package/src/core/objects/procedure/procedure.diff.ts +39 -102
- package/src/core/objects/procedure/procedure.model.ts +1 -1
- package/src/core/objects/publication/changes/publication.alter.test.ts +15 -21
- package/src/core/objects/publication/changes/publication.alter.ts +0 -18
- package/src/core/objects/publication/changes/publication.comment.test.ts +5 -2
- package/src/core/objects/publication/changes/publication.create.test.ts +5 -2
- package/src/core/objects/publication/changes/publication.drop.test.ts +3 -1
- package/src/core/objects/publication/changes/publication.types.ts +0 -2
- package/src/core/objects/publication/publication.diff.test.ts +24 -19
- package/src/core/objects/publication/publication.diff.ts +9 -15
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +31 -14
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +3 -3
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +10 -3
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +4 -1
- package/src/core/objects/role/changes/role.alter.test.ts +31 -15
- package/src/core/objects/role/changes/role.create.test.ts +6 -2
- package/src/core/objects/role/changes/role.drop.test.ts +4 -1
- package/src/core/objects/role/role.diff.test.ts +235 -0
- package/src/core/objects/role/role.diff.ts +21 -1
- package/src/core/objects/role/role.model.ts +122 -14
- package/src/core/objects/rule/changes/rule.alter.test.ts +7 -3
- package/src/core/objects/rule/changes/rule.comment.test.ts +5 -2
- package/src/core/objects/rule/changes/rule.create.test.ts +6 -2
- package/src/core/objects/rule/changes/rule.drop.test.ts +3 -1
- package/src/core/objects/schema/changes/schema.alter.test.ts +4 -1
- package/src/core/objects/schema/changes/schema.create.test.ts +4 -1
- package/src/core/objects/schema/changes/schema.drop.test.ts +4 -1
- package/src/core/objects/schema/schema.diff.ts +39 -102
- package/src/core/objects/schema/schema.model.ts +1 -1
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +11 -5
- package/src/core/objects/sequence/changes/sequence.create.test.ts +8 -3
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +4 -1
- package/src/core/objects/sequence/sequence.diff.test.ts +114 -0
- package/src/core/objects/sequence/sequence.diff.ts +39 -104
- package/src/core/objects/sequence/sequence.model.ts +1 -1
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +15 -5
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +5 -2
- package/src/core/objects/subscription/changes/subscription.create.test.ts +5 -2
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +3 -1
- package/src/core/objects/subscription/subscription.diff.test.ts +16 -11
- package/src/core/objects/subscription/subscription.diff.ts +2 -1
- package/src/core/objects/table/changes/table.alter.test.ts +38 -15
- package/src/core/objects/table/changes/table.create.test.ts +41 -3
- package/src/core/objects/table/changes/table.create.ts +4 -0
- package/src/core/objects/table/changes/table.drop.test.ts +3 -1
- package/src/core/objects/table/table.diff.test.ts +157 -0
- package/src/core/objects/table/table.diff.ts +54 -190
- package/src/core/objects/table/table.model.ts +1 -1
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +8 -4
- package/src/core/objects/trigger/changes/trigger.create.test.ts +5 -1
- package/src/core/objects/trigger/changes/trigger.create.ts +7 -4
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +5 -1
- package/src/core/objects/trigger/trigger.diff.test.ts +1 -0
- package/src/core/objects/trigger/trigger.model.ts +12 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +10 -4
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +7 -2
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +4 -1
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +78 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +39 -101
- package/src/core/objects/type/composite-type/composite-type.model.ts +2 -1
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +14 -5
- package/src/core/objects/type/enum/changes/enum.create.test.ts +4 -1
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +4 -1
- package/src/core/objects/type/enum/enum.diff.test.ts +181 -0
- package/src/core/objects/type/enum/enum.diff.ts +58 -146
- package/src/core/objects/type/enum/enum.model.ts +1 -1
- package/src/core/objects/type/range/changes/range.alter.test.ts +3 -1
- package/src/core/objects/type/range/changes/range.create.test.ts +5 -2
- package/src/core/objects/type/range/changes/range.create.ts +6 -2
- package/src/core/objects/type/range/changes/range.drop.test.ts +3 -1
- package/src/core/objects/type/range/range.diff.test.ts +77 -0
- package/src/core/objects/type/range/range.diff.ts +39 -101
- package/src/core/objects/type/range/range.model.ts +1 -1
- package/src/core/objects/view/changes/view.alter.test.ts +8 -3
- package/src/core/objects/view/changes/view.create.test.ts +7 -2
- package/src/core/objects/view/changes/view.drop.test.ts +4 -1
- package/src/core/objects/view/view.diff.test.ts +82 -0
- package/src/core/objects/view/view.diff.ts +41 -191
- package/src/core/objects/view/view.model.ts +3 -17
- package/src/core/plan/apply.ts +9 -27
- package/src/core/plan/create.ts +173 -237
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +18 -4
- package/src/core/plan/sql-format/fixtures.ts +2 -5
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +52 -0
- package/src/core/plan/sql-format/format-off.test.ts +14 -17
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +27 -22
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +17 -21
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +25 -20
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +23 -20
- package/src/core/plan/sql-format/keyword-case.ts +36 -1
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/types.ts +6 -0
- package/src/core/postgres-config.ts +71 -2
- package/src/core/sort/graph-builder.ts +12 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +32 -25
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +26 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import {
|
|
3
4
|
ForeignDataWrapper,
|
|
4
5
|
type ForeignDataWrapperProps,
|
|
@@ -10,7 +11,7 @@ import {
|
|
|
10
11
|
|
|
11
12
|
describe.concurrent("foreign-data-wrapper", () => {
|
|
12
13
|
describe("alter", () => {
|
|
13
|
-
test("change owner", () => {
|
|
14
|
+
test("change owner", async () => {
|
|
14
15
|
const props: ForeignDataWrapperProps = {
|
|
15
16
|
name: "test_fdw",
|
|
16
17
|
owner: "old_owner",
|
|
@@ -26,12 +27,14 @@ describe.concurrent("foreign-data-wrapper", () => {
|
|
|
26
27
|
owner: "new_owner",
|
|
27
28
|
});
|
|
28
29
|
|
|
30
|
+
await assertValidSql(change.serialize());
|
|
31
|
+
|
|
29
32
|
expect(change.serialize()).toBe(
|
|
30
33
|
"ALTER FOREIGN DATA WRAPPER test_fdw OWNER TO new_owner",
|
|
31
34
|
);
|
|
32
35
|
});
|
|
33
36
|
|
|
34
|
-
test("set options ADD", () => {
|
|
37
|
+
test("set options ADD", async () => {
|
|
35
38
|
const props: ForeignDataWrapperProps = {
|
|
36
39
|
name: "test_fdw",
|
|
37
40
|
owner: "test",
|
|
@@ -50,12 +53,14 @@ describe.concurrent("foreign-data-wrapper", () => {
|
|
|
50
53
|
],
|
|
51
54
|
});
|
|
52
55
|
|
|
56
|
+
await assertValidSql(change.serialize());
|
|
57
|
+
|
|
53
58
|
expect(change.serialize()).toBe(
|
|
54
59
|
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD host 'localhost', ADD port '5432')",
|
|
55
60
|
);
|
|
56
61
|
});
|
|
57
62
|
|
|
58
|
-
test("set options SET", () => {
|
|
63
|
+
test("set options SET", async () => {
|
|
59
64
|
const props: ForeignDataWrapperProps = {
|
|
60
65
|
name: "test_fdw",
|
|
61
66
|
owner: "test",
|
|
@@ -71,12 +76,14 @@ describe.concurrent("foreign-data-wrapper", () => {
|
|
|
71
76
|
options: [{ action: "SET", option: "host", value: "newhost" }],
|
|
72
77
|
});
|
|
73
78
|
|
|
79
|
+
await assertValidSql(change.serialize());
|
|
80
|
+
|
|
74
81
|
expect(change.serialize()).toBe(
|
|
75
82
|
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (SET host 'newhost')",
|
|
76
83
|
);
|
|
77
84
|
});
|
|
78
85
|
|
|
79
|
-
test("set options DROP", () => {
|
|
86
|
+
test("set options DROP", async () => {
|
|
80
87
|
const props: ForeignDataWrapperProps = {
|
|
81
88
|
name: "test_fdw",
|
|
82
89
|
owner: "test",
|
|
@@ -92,12 +99,14 @@ describe.concurrent("foreign-data-wrapper", () => {
|
|
|
92
99
|
options: [{ action: "DROP", option: "host" }],
|
|
93
100
|
});
|
|
94
101
|
|
|
102
|
+
await assertValidSql(change.serialize());
|
|
103
|
+
|
|
95
104
|
expect(change.serialize()).toBe(
|
|
96
105
|
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (DROP host)",
|
|
97
106
|
);
|
|
98
107
|
});
|
|
99
108
|
|
|
100
|
-
test("set options mixed ADD/SET/DROP", () => {
|
|
109
|
+
test("set options mixed ADD/SET/DROP", async () => {
|
|
101
110
|
const props: ForeignDataWrapperProps = {
|
|
102
111
|
name: "test_fdw",
|
|
103
112
|
owner: "test",
|
|
@@ -117,6 +126,8 @@ describe.concurrent("foreign-data-wrapper", () => {
|
|
|
117
126
|
],
|
|
118
127
|
});
|
|
119
128
|
|
|
129
|
+
await assertValidSql(change.serialize());
|
|
130
|
+
|
|
120
131
|
expect(change.serialize()).toBe(
|
|
121
132
|
"ALTER FOREIGN DATA WRAPPER test_fdw OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
|
|
122
133
|
);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
|
|
3
4
|
import { CreateForeignDataWrapper } from "./foreign-data-wrapper.create.ts";
|
|
4
5
|
|
|
5
6
|
describe("foreign-data-wrapper", () => {
|
|
6
|
-
test("create basic", () => {
|
|
7
|
+
test("create basic", async () => {
|
|
7
8
|
const fdw = new ForeignDataWrapper({
|
|
8
9
|
name: "test_fdw",
|
|
9
10
|
owner: "test",
|
|
@@ -18,16 +19,18 @@ describe("foreign-data-wrapper", () => {
|
|
|
18
19
|
foreignDataWrapper: fdw,
|
|
19
20
|
});
|
|
20
21
|
|
|
22
|
+
await assertValidSql(change.serialize());
|
|
23
|
+
|
|
21
24
|
expect(change.serialize()).toBe(
|
|
22
25
|
"CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER NO VALIDATOR",
|
|
23
26
|
);
|
|
24
27
|
});
|
|
25
28
|
|
|
26
|
-
test("create with handler", () => {
|
|
29
|
+
test("create with handler", async () => {
|
|
27
30
|
const fdw = new ForeignDataWrapper({
|
|
28
31
|
name: "test_fdw",
|
|
29
32
|
owner: "test",
|
|
30
|
-
handler: "public.handler_func
|
|
33
|
+
handler: "public.handler_func",
|
|
31
34
|
validator: null,
|
|
32
35
|
options: null,
|
|
33
36
|
comment: null,
|
|
@@ -38,17 +41,19 @@ describe("foreign-data-wrapper", () => {
|
|
|
38
41
|
foreignDataWrapper: fdw,
|
|
39
42
|
});
|
|
40
43
|
|
|
44
|
+
await assertValidSql(change.serialize());
|
|
45
|
+
|
|
41
46
|
expect(change.serialize()).toBe(
|
|
42
|
-
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func
|
|
47
|
+
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func NO VALIDATOR",
|
|
43
48
|
);
|
|
44
49
|
});
|
|
45
50
|
|
|
46
|
-
test("create with validator", () => {
|
|
51
|
+
test("create with validator", async () => {
|
|
47
52
|
const fdw = new ForeignDataWrapper({
|
|
48
53
|
name: "test_fdw",
|
|
49
54
|
owner: "test",
|
|
50
55
|
handler: null,
|
|
51
|
-
validator: "public.validator_func
|
|
56
|
+
validator: "public.validator_func",
|
|
52
57
|
options: null,
|
|
53
58
|
comment: null,
|
|
54
59
|
privileges: [],
|
|
@@ -58,17 +63,19 @@ describe("foreign-data-wrapper", () => {
|
|
|
58
63
|
foreignDataWrapper: fdw,
|
|
59
64
|
});
|
|
60
65
|
|
|
66
|
+
await assertValidSql(change.serialize());
|
|
67
|
+
|
|
61
68
|
expect(change.serialize()).toBe(
|
|
62
|
-
"CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER VALIDATOR public.validator_func
|
|
69
|
+
"CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER VALIDATOR public.validator_func",
|
|
63
70
|
);
|
|
64
71
|
});
|
|
65
72
|
|
|
66
|
-
test("create with handler and validator", () => {
|
|
73
|
+
test("create with handler and validator", async () => {
|
|
67
74
|
const fdw = new ForeignDataWrapper({
|
|
68
75
|
name: "test_fdw",
|
|
69
76
|
owner: "test",
|
|
70
|
-
handler: "public.handler_func
|
|
71
|
-
validator: "public.validator_func
|
|
77
|
+
handler: "public.handler_func",
|
|
78
|
+
validator: "public.validator_func",
|
|
72
79
|
options: null,
|
|
73
80
|
comment: null,
|
|
74
81
|
privileges: [],
|
|
@@ -78,12 +85,14 @@ describe("foreign-data-wrapper", () => {
|
|
|
78
85
|
foreignDataWrapper: fdw,
|
|
79
86
|
});
|
|
80
87
|
|
|
88
|
+
await assertValidSql(change.serialize());
|
|
89
|
+
|
|
81
90
|
expect(change.serialize()).toBe(
|
|
82
|
-
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func
|
|
91
|
+
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func VALIDATOR public.validator_func",
|
|
83
92
|
);
|
|
84
93
|
});
|
|
85
94
|
|
|
86
|
-
test("create with options", () => {
|
|
95
|
+
test("create with options", async () => {
|
|
87
96
|
const fdw = new ForeignDataWrapper({
|
|
88
97
|
name: "test_fdw",
|
|
89
98
|
owner: "test",
|
|
@@ -98,17 +107,19 @@ describe("foreign-data-wrapper", () => {
|
|
|
98
107
|
foreignDataWrapper: fdw,
|
|
99
108
|
});
|
|
100
109
|
|
|
110
|
+
await assertValidSql(change.serialize());
|
|
111
|
+
|
|
101
112
|
expect(change.serialize()).toBe(
|
|
102
113
|
"CREATE FOREIGN DATA WRAPPER test_fdw NO HANDLER NO VALIDATOR OPTIONS (host 'localhost', port '5432')",
|
|
103
114
|
);
|
|
104
115
|
});
|
|
105
116
|
|
|
106
|
-
test("create with all properties", () => {
|
|
117
|
+
test("create with all properties", async () => {
|
|
107
118
|
const fdw = new ForeignDataWrapper({
|
|
108
119
|
name: "test_fdw",
|
|
109
120
|
owner: "test",
|
|
110
|
-
handler: "public.handler_func
|
|
111
|
-
validator: "public.validator_func
|
|
121
|
+
handler: "public.handler_func",
|
|
122
|
+
validator: "public.validator_func",
|
|
112
123
|
options: ["host", "localhost", "port", "5432"],
|
|
113
124
|
comment: null,
|
|
114
125
|
privileges: [],
|
|
@@ -118,8 +129,32 @@ describe("foreign-data-wrapper", () => {
|
|
|
118
129
|
foreignDataWrapper: fdw,
|
|
119
130
|
});
|
|
120
131
|
|
|
132
|
+
await assertValidSql(change.serialize());
|
|
133
|
+
|
|
134
|
+
expect(change.serialize()).toBe(
|
|
135
|
+
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER public.handler_func VALIDATOR public.validator_func OPTIONS (host 'localhost', port '5432')",
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("create with schema-qualified handler (no function args in output)", async () => {
|
|
140
|
+
const fdw = new ForeignDataWrapper({
|
|
141
|
+
name: "test_fdw",
|
|
142
|
+
owner: "test",
|
|
143
|
+
handler: "extensions.iceberg_fdw_handler",
|
|
144
|
+
validator: "extensions.iceberg_fdw_validator",
|
|
145
|
+
options: null,
|
|
146
|
+
comment: null,
|
|
147
|
+
privileges: [],
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const change = new CreateForeignDataWrapper({
|
|
151
|
+
foreignDataWrapper: fdw,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
await assertValidSql(change.serialize());
|
|
155
|
+
|
|
121
156
|
expect(change.serialize()).toBe(
|
|
122
|
-
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER
|
|
157
|
+
"CREATE FOREIGN DATA WRAPPER test_fdw HANDLER extensions.iceberg_fdw_handler VALIDATOR extensions.iceberg_fdw_validator",
|
|
123
158
|
);
|
|
124
159
|
});
|
|
125
160
|
});
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import { ForeignDataWrapper } from "../foreign-data-wrapper.model.ts";
|
|
3
4
|
import { DropForeignDataWrapper } from "./foreign-data-wrapper.drop.ts";
|
|
4
5
|
|
|
5
6
|
describe("foreign-data-wrapper", () => {
|
|
6
|
-
test("drop", () => {
|
|
7
|
+
test("drop", async () => {
|
|
7
8
|
const fdw = new ForeignDataWrapper({
|
|
8
9
|
name: "test_fdw",
|
|
9
10
|
owner: "test",
|
|
@@ -18,6 +19,8 @@ describe("foreign-data-wrapper", () => {
|
|
|
18
19
|
foreignDataWrapper: fdw,
|
|
19
20
|
});
|
|
20
21
|
|
|
22
|
+
await assertValidSql(change.serialize());
|
|
23
|
+
|
|
21
24
|
expect(change.serialize()).toBe("DROP FOREIGN DATA WRAPPER test_fdw");
|
|
22
25
|
});
|
|
23
26
|
});
|
package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts
CHANGED
|
@@ -4,8 +4,17 @@ import {
|
|
|
4
4
|
AlterForeignDataWrapperChangeOwner,
|
|
5
5
|
AlterForeignDataWrapperSetOptions,
|
|
6
6
|
} from "./changes/foreign-data-wrapper.alter.ts";
|
|
7
|
+
import {
|
|
8
|
+
CreateCommentOnForeignDataWrapper,
|
|
9
|
+
DropCommentOnForeignDataWrapper,
|
|
10
|
+
} from "./changes/foreign-data-wrapper.comment.ts";
|
|
7
11
|
import { CreateForeignDataWrapper } from "./changes/foreign-data-wrapper.create.ts";
|
|
8
12
|
import { DropForeignDataWrapper } from "./changes/foreign-data-wrapper.drop.ts";
|
|
13
|
+
import {
|
|
14
|
+
GrantForeignDataWrapperPrivileges,
|
|
15
|
+
RevokeForeignDataWrapperPrivileges,
|
|
16
|
+
RevokeGrantOptionForeignDataWrapperPrivileges,
|
|
17
|
+
} from "./changes/foreign-data-wrapper.privilege.ts";
|
|
9
18
|
import { diffForeignDataWrappers } from "./foreign-data-wrapper.diff.ts";
|
|
10
19
|
import {
|
|
11
20
|
ForeignDataWrapper,
|
|
@@ -117,7 +126,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
|
|
|
117
126
|
const main = new ForeignDataWrapper({
|
|
118
127
|
name: "fdw1",
|
|
119
128
|
owner: "o1",
|
|
120
|
-
handler: "public.old_handler
|
|
129
|
+
handler: "public.old_handler",
|
|
121
130
|
validator: null,
|
|
122
131
|
options: null,
|
|
123
132
|
comment: null,
|
|
@@ -126,7 +135,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
|
|
|
126
135
|
const branch = new ForeignDataWrapper({
|
|
127
136
|
name: "fdw1",
|
|
128
137
|
owner: "o1",
|
|
129
|
-
handler: "public.new_handler
|
|
138
|
+
handler: "public.new_handler",
|
|
130
139
|
validator: null,
|
|
131
140
|
options: null,
|
|
132
141
|
comment: null,
|
|
@@ -150,7 +159,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
|
|
|
150
159
|
name: "fdw1",
|
|
151
160
|
owner: "o1",
|
|
152
161
|
handler: null,
|
|
153
|
-
validator: "public.old_validator
|
|
162
|
+
validator: "public.old_validator",
|
|
154
163
|
options: null,
|
|
155
164
|
comment: null,
|
|
156
165
|
privileges: [],
|
|
@@ -159,7 +168,7 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
|
|
|
159
168
|
name: "fdw1",
|
|
160
169
|
owner: "o1",
|
|
161
170
|
handler: null,
|
|
162
|
-
validator: "public.new_validator
|
|
171
|
+
validator: "public.new_validator",
|
|
163
172
|
options: null,
|
|
164
173
|
comment: null,
|
|
165
174
|
privileges: [],
|
|
@@ -176,4 +185,102 @@ describe.concurrent("foreign-data-wrapper.diff", () => {
|
|
|
176
185
|
true,
|
|
177
186
|
);
|
|
178
187
|
});
|
|
188
|
+
|
|
189
|
+
test("created with privileges emits grant", () => {
|
|
190
|
+
const fdw = new ForeignDataWrapper({
|
|
191
|
+
name: "fdw1",
|
|
192
|
+
owner: "o1",
|
|
193
|
+
handler: null,
|
|
194
|
+
validator: null,
|
|
195
|
+
options: null,
|
|
196
|
+
comment: null,
|
|
197
|
+
privileges: [
|
|
198
|
+
{ grantee: "role_usage", privilege: "USAGE", grantable: false },
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
const changes = diffForeignDataWrappers(
|
|
202
|
+
testContext,
|
|
203
|
+
{},
|
|
204
|
+
{ [fdw.stableId]: fdw },
|
|
205
|
+
);
|
|
206
|
+
expect(changes[0]).toBeInstanceOf(CreateForeignDataWrapper);
|
|
207
|
+
expect(
|
|
208
|
+
changes.some((c) => c instanceof GrantForeignDataWrapperPrivileges),
|
|
209
|
+
).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("altered comment emits create/drop comment", () => {
|
|
213
|
+
const base: ForeignDataWrapperProps = {
|
|
214
|
+
name: "fdw1",
|
|
215
|
+
owner: "o1",
|
|
216
|
+
handler: null,
|
|
217
|
+
validator: null,
|
|
218
|
+
options: null,
|
|
219
|
+
comment: null,
|
|
220
|
+
privileges: [],
|
|
221
|
+
};
|
|
222
|
+
const main = new ForeignDataWrapper(base);
|
|
223
|
+
const withComment = new ForeignDataWrapper({
|
|
224
|
+
...base,
|
|
225
|
+
comment: "my fdw",
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const addComment = diffForeignDataWrappers(
|
|
229
|
+
testContext,
|
|
230
|
+
{ [main.stableId]: main },
|
|
231
|
+
{ [withComment.stableId]: withComment },
|
|
232
|
+
);
|
|
233
|
+
expect(addComment[0]).toBeInstanceOf(CreateCommentOnForeignDataWrapper);
|
|
234
|
+
|
|
235
|
+
const dropComment = diffForeignDataWrappers(
|
|
236
|
+
testContext,
|
|
237
|
+
{ [withComment.stableId]: withComment },
|
|
238
|
+
{ [main.stableId]: main },
|
|
239
|
+
);
|
|
240
|
+
expect(dropComment[0]).toBeInstanceOf(DropCommentOnForeignDataWrapper);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("altered privileges emit grant, revoke, and revoke grant option", () => {
|
|
244
|
+
const base: ForeignDataWrapperProps = {
|
|
245
|
+
name: "fdw1",
|
|
246
|
+
owner: "o1",
|
|
247
|
+
handler: null,
|
|
248
|
+
validator: null,
|
|
249
|
+
options: null,
|
|
250
|
+
comment: null,
|
|
251
|
+
privileges: [],
|
|
252
|
+
};
|
|
253
|
+
const main = new ForeignDataWrapper({
|
|
254
|
+
...base,
|
|
255
|
+
privileges: [
|
|
256
|
+
{ grantee: "role_usage", privilege: "USAGE", grantable: false },
|
|
257
|
+
{ grantee: "role_with_option", privilege: "USAGE", grantable: true },
|
|
258
|
+
{ grantee: "role_removed", privilege: "USAGE", grantable: false },
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
const branch = new ForeignDataWrapper({
|
|
262
|
+
...base,
|
|
263
|
+
privileges: [
|
|
264
|
+
{ grantee: "role_usage", privilege: "USAGE", grantable: true },
|
|
265
|
+
{ grantee: "role_with_option", privilege: "USAGE", grantable: false },
|
|
266
|
+
{ grantee: "role_new", privilege: "USAGE", grantable: false },
|
|
267
|
+
],
|
|
268
|
+
});
|
|
269
|
+
const changes = diffForeignDataWrappers(
|
|
270
|
+
testContext,
|
|
271
|
+
{ [main.stableId]: main },
|
|
272
|
+
{ [branch.stableId]: branch },
|
|
273
|
+
);
|
|
274
|
+
expect(
|
|
275
|
+
changes.some((c) => c instanceof GrantForeignDataWrapperPrivileges),
|
|
276
|
+
).toBe(true);
|
|
277
|
+
expect(
|
|
278
|
+
changes.some((c) => c instanceof RevokeForeignDataWrapperPrivileges),
|
|
279
|
+
).toBe(true);
|
|
280
|
+
expect(
|
|
281
|
+
changes.some(
|
|
282
|
+
(c) => c instanceof RevokeGrantOptionForeignDataWrapperPrivileges,
|
|
283
|
+
),
|
|
284
|
+
).toBe(true);
|
|
285
|
+
});
|
|
179
286
|
});
|
package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { DefaultPrivilegeState } from "../../base.default-privileges.ts";
|
|
2
1
|
import { diffObjects } from "../../base.diff.ts";
|
|
3
2
|
import {
|
|
4
3
|
diffPrivileges,
|
|
4
|
+
emitObjectPrivilegeChanges,
|
|
5
5
|
filterPublicBuiltInDefaults,
|
|
6
|
-
groupPrivilegesByGrantable,
|
|
7
6
|
} from "../../base.privilege-diff.ts";
|
|
8
|
-
import type {
|
|
7
|
+
import type { ObjectDiffContext } from "../../diff-context.ts";
|
|
9
8
|
import {
|
|
10
9
|
AlterForeignDataWrapperChangeOwner,
|
|
11
10
|
AlterForeignDataWrapperSetOptions,
|
|
@@ -33,12 +32,7 @@ import type { ForeignDataWrapper } from "./foreign-data-wrapper.model.ts";
|
|
|
33
32
|
* @returns A list of changes to apply to main to make it match branch.
|
|
34
33
|
*/
|
|
35
34
|
export function diffForeignDataWrappers(
|
|
36
|
-
ctx:
|
|
37
|
-
version: number;
|
|
38
|
-
currentUser: string;
|
|
39
|
-
defaultPrivilegeState: DefaultPrivilegeState;
|
|
40
|
-
mainRoles: Record<string, Role>;
|
|
41
|
-
},
|
|
35
|
+
ctx: Pick<ObjectDiffContext, "version" | "currentUser">,
|
|
42
36
|
main: Record<string, ForeignDataWrapper>,
|
|
43
37
|
branch: Record<string, ForeignDataWrapper>,
|
|
44
38
|
): ForeignDataWrapperChange[] {
|
|
@@ -87,54 +81,22 @@ export function diffForeignDataWrappers(
|
|
|
87
81
|
effectiveDefaults,
|
|
88
82
|
desiredPrivileges,
|
|
89
83
|
createdFdw.owner,
|
|
90
|
-
ctx.mainRoles,
|
|
91
84
|
);
|
|
92
85
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Generate revoke changes
|
|
111
|
-
if (result.revokes.length > 0) {
|
|
112
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
113
|
-
for (const [grantable, list] of revokeGroups) {
|
|
114
|
-
void grantable;
|
|
115
|
-
changes.push(
|
|
116
|
-
new RevokeForeignDataWrapperPrivileges({
|
|
117
|
-
foreignDataWrapper: createdFdw,
|
|
118
|
-
grantee,
|
|
119
|
-
privileges: list,
|
|
120
|
-
version: ctx.version,
|
|
121
|
-
}),
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Generate revoke grant option changes
|
|
127
|
-
if (result.revokeGrantOption.length > 0) {
|
|
128
|
-
changes.push(
|
|
129
|
-
new RevokeGrantOptionForeignDataWrapperPrivileges({
|
|
130
|
-
foreignDataWrapper: createdFdw,
|
|
131
|
-
grantee,
|
|
132
|
-
privilegeNames: result.revokeGrantOption,
|
|
133
|
-
version: ctx.version,
|
|
134
|
-
}),
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
86
|
+
changes.push(
|
|
87
|
+
...(emitObjectPrivilegeChanges(
|
|
88
|
+
privilegeResults,
|
|
89
|
+
createdFdw,
|
|
90
|
+
createdFdw,
|
|
91
|
+
"foreignDataWrapper",
|
|
92
|
+
{
|
|
93
|
+
Grant: GrantForeignDataWrapperPrivileges,
|
|
94
|
+
Revoke: RevokeForeignDataWrapperPrivileges,
|
|
95
|
+
RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
|
|
96
|
+
},
|
|
97
|
+
ctx.version,
|
|
98
|
+
) as ForeignDataWrapperChange[]),
|
|
99
|
+
);
|
|
138
100
|
}
|
|
139
101
|
|
|
140
102
|
for (const fdwId of dropped) {
|
|
@@ -228,54 +190,22 @@ export function diffForeignDataWrappers(
|
|
|
228
190
|
mainPrivilegesFiltered,
|
|
229
191
|
branchPrivilegesFiltered,
|
|
230
192
|
branchFdw.owner,
|
|
231
|
-
ctx.mainRoles,
|
|
232
193
|
);
|
|
233
194
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Generate revoke changes
|
|
252
|
-
if (result.revokes.length > 0) {
|
|
253
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
254
|
-
for (const [grantable, list] of revokeGroups) {
|
|
255
|
-
void grantable;
|
|
256
|
-
changes.push(
|
|
257
|
-
new RevokeForeignDataWrapperPrivileges({
|
|
258
|
-
foreignDataWrapper: mainFdw,
|
|
259
|
-
grantee,
|
|
260
|
-
privileges: list,
|
|
261
|
-
version: ctx.version,
|
|
262
|
-
}),
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Generate revoke grant option changes
|
|
268
|
-
if (result.revokeGrantOption.length > 0) {
|
|
269
|
-
changes.push(
|
|
270
|
-
new RevokeGrantOptionForeignDataWrapperPrivileges({
|
|
271
|
-
foreignDataWrapper: mainFdw,
|
|
272
|
-
grantee,
|
|
273
|
-
privilegeNames: result.revokeGrantOption,
|
|
274
|
-
version: ctx.version,
|
|
275
|
-
}),
|
|
276
|
-
);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
195
|
+
changes.push(
|
|
196
|
+
...(emitObjectPrivilegeChanges(
|
|
197
|
+
privilegeResults,
|
|
198
|
+
branchFdw,
|
|
199
|
+
mainFdw,
|
|
200
|
+
"foreignDataWrapper",
|
|
201
|
+
{
|
|
202
|
+
Grant: GrantForeignDataWrapperPrivileges,
|
|
203
|
+
Revoke: RevokeForeignDataWrapperPrivileges,
|
|
204
|
+
RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
|
|
205
|
+
},
|
|
206
|
+
ctx.version,
|
|
207
|
+
) as ForeignDataWrapperChange[]),
|
|
208
|
+
);
|
|
279
209
|
|
|
280
210
|
// Note: FDW renaming would also use ALTER FOREIGN DATA WRAPPER ... RENAME TO ...
|
|
281
211
|
// But since our ForeignDataWrapper model uses 'name' as the identity field,
|
package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts
CHANGED
|
@@ -93,11 +93,11 @@ export async function extractForeignDataWrappers(
|
|
|
93
93
|
fdw.fdwowner::regrole::text as owner,
|
|
94
94
|
case
|
|
95
95
|
when fdw.fdwhandler = 0 then null
|
|
96
|
-
else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname)
|
|
96
|
+
else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname)
|
|
97
97
|
end as handler,
|
|
98
98
|
case
|
|
99
99
|
when fdw.fdwvalidator = 0 then null
|
|
100
|
-
else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname)
|
|
100
|
+
else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname)
|
|
101
101
|
end as validator,
|
|
102
102
|
coalesce(fdw.fdwoptions, array[]::text[]) as options,
|
|
103
103
|
obj_description(fdw.oid, 'pg_foreign_data_wrapper') as comment,
|