@supabase/pg-delta 1.0.0-alpha.4 → 1.0.0-alpha.6
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
package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts
CHANGED
|
@@ -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
|
ForeignTable,
|
|
4
5
|
type ForeignTableProps,
|
|
@@ -47,19 +48,21 @@ describe.concurrent("foreign-table", () => {
|
|
|
47
48
|
privileges: [],
|
|
48
49
|
};
|
|
49
50
|
|
|
50
|
-
test("change owner", () => {
|
|
51
|
+
test("change owner", async () => {
|
|
51
52
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
52
53
|
const change = new AlterForeignTableChangeOwner({
|
|
53
54
|
foreignTable,
|
|
54
55
|
owner: "new_owner",
|
|
55
56
|
});
|
|
56
57
|
|
|
58
|
+
await assertValidSql(change.serialize());
|
|
59
|
+
|
|
57
60
|
expect(change.serialize()).toBe(
|
|
58
61
|
"ALTER FOREIGN TABLE public.test_table OWNER TO new_owner",
|
|
59
62
|
);
|
|
60
63
|
});
|
|
61
64
|
|
|
62
|
-
test("add column", () => {
|
|
65
|
+
test("add column", async () => {
|
|
63
66
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
64
67
|
const change = new AlterForeignTableAddColumn({
|
|
65
68
|
foreignTable,
|
|
@@ -83,12 +86,14 @@ describe.concurrent("foreign-table", () => {
|
|
|
83
86
|
},
|
|
84
87
|
});
|
|
85
88
|
|
|
89
|
+
await assertValidSql(change.serialize());
|
|
90
|
+
|
|
86
91
|
expect(change.serialize()).toBe(
|
|
87
92
|
"ALTER FOREIGN TABLE public.test_table ADD COLUMN name text",
|
|
88
93
|
);
|
|
89
94
|
});
|
|
90
95
|
|
|
91
|
-
test("add column with NOT NULL", () => {
|
|
96
|
+
test("add column with NOT NULL", async () => {
|
|
92
97
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
93
98
|
const change = new AlterForeignTableAddColumn({
|
|
94
99
|
foreignTable,
|
|
@@ -112,12 +117,14 @@ describe.concurrent("foreign-table", () => {
|
|
|
112
117
|
},
|
|
113
118
|
});
|
|
114
119
|
|
|
120
|
+
await assertValidSql(change.serialize());
|
|
121
|
+
|
|
115
122
|
expect(change.serialize()).toBe(
|
|
116
123
|
"ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL",
|
|
117
124
|
);
|
|
118
125
|
});
|
|
119
126
|
|
|
120
|
-
test("add column with DEFAULT", () => {
|
|
127
|
+
test("add column with DEFAULT", async () => {
|
|
121
128
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
122
129
|
const change = new AlterForeignTableAddColumn({
|
|
123
130
|
foreignTable,
|
|
@@ -141,12 +148,14 @@ describe.concurrent("foreign-table", () => {
|
|
|
141
148
|
},
|
|
142
149
|
});
|
|
143
150
|
|
|
151
|
+
await assertValidSql(change.serialize());
|
|
152
|
+
|
|
144
153
|
expect(change.serialize()).toBe(
|
|
145
154
|
"ALTER FOREIGN TABLE public.test_table ADD COLUMN name text DEFAULT 'default_value'",
|
|
146
155
|
);
|
|
147
156
|
});
|
|
148
157
|
|
|
149
|
-
test("add column with NOT NULL and DEFAULT", () => {
|
|
158
|
+
test("add column with NOT NULL and DEFAULT", async () => {
|
|
150
159
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
151
160
|
const change = new AlterForeignTableAddColumn({
|
|
152
161
|
foreignTable,
|
|
@@ -170,24 +179,28 @@ describe.concurrent("foreign-table", () => {
|
|
|
170
179
|
},
|
|
171
180
|
});
|
|
172
181
|
|
|
182
|
+
await assertValidSql(change.serialize());
|
|
183
|
+
|
|
173
184
|
expect(change.serialize()).toBe(
|
|
174
185
|
"ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL DEFAULT 'default_value'",
|
|
175
186
|
);
|
|
176
187
|
});
|
|
177
188
|
|
|
178
|
-
test("drop column", () => {
|
|
189
|
+
test("drop column", async () => {
|
|
179
190
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
180
191
|
const change = new AlterForeignTableDropColumn({
|
|
181
192
|
foreignTable,
|
|
182
193
|
columnName: "id",
|
|
183
194
|
});
|
|
184
195
|
|
|
196
|
+
await assertValidSql(change.serialize());
|
|
197
|
+
|
|
185
198
|
expect(change.serialize()).toBe(
|
|
186
199
|
"ALTER FOREIGN TABLE public.test_table DROP COLUMN id",
|
|
187
200
|
);
|
|
188
201
|
});
|
|
189
202
|
|
|
190
|
-
test("alter column type", () => {
|
|
203
|
+
test("alter column type", async () => {
|
|
191
204
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
192
205
|
const change = new AlterForeignTableAlterColumnType({
|
|
193
206
|
foreignTable,
|
|
@@ -195,12 +208,14 @@ describe.concurrent("foreign-table", () => {
|
|
|
195
208
|
dataType: "bigint",
|
|
196
209
|
});
|
|
197
210
|
|
|
211
|
+
await assertValidSql(change.serialize());
|
|
212
|
+
|
|
198
213
|
expect(change.serialize()).toBe(
|
|
199
214
|
"ALTER FOREIGN TABLE public.test_table ALTER COLUMN id TYPE bigint",
|
|
200
215
|
);
|
|
201
216
|
});
|
|
202
217
|
|
|
203
|
-
test("alter column set default", () => {
|
|
218
|
+
test("alter column set default", async () => {
|
|
204
219
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
205
220
|
const change = new AlterForeignTableAlterColumnSetDefault({
|
|
206
221
|
foreignTable,
|
|
@@ -208,48 +223,56 @@ describe.concurrent("foreign-table", () => {
|
|
|
208
223
|
defaultValue: "0",
|
|
209
224
|
});
|
|
210
225
|
|
|
226
|
+
await assertValidSql(change.serialize());
|
|
227
|
+
|
|
211
228
|
expect(change.serialize()).toBe(
|
|
212
229
|
"ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET DEFAULT 0",
|
|
213
230
|
);
|
|
214
231
|
});
|
|
215
232
|
|
|
216
|
-
test("alter column drop default", () => {
|
|
233
|
+
test("alter column drop default", async () => {
|
|
217
234
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
218
235
|
const change = new AlterForeignTableAlterColumnDropDefault({
|
|
219
236
|
foreignTable,
|
|
220
237
|
columnName: "id",
|
|
221
238
|
});
|
|
222
239
|
|
|
240
|
+
await assertValidSql(change.serialize());
|
|
241
|
+
|
|
223
242
|
expect(change.serialize()).toBe(
|
|
224
243
|
"ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP DEFAULT",
|
|
225
244
|
);
|
|
226
245
|
});
|
|
227
246
|
|
|
228
|
-
test("alter column set not null", () => {
|
|
247
|
+
test("alter column set not null", async () => {
|
|
229
248
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
230
249
|
const change = new AlterForeignTableAlterColumnSetNotNull({
|
|
231
250
|
foreignTable,
|
|
232
251
|
columnName: "id",
|
|
233
252
|
});
|
|
234
253
|
|
|
254
|
+
await assertValidSql(change.serialize());
|
|
255
|
+
|
|
235
256
|
expect(change.serialize()).toBe(
|
|
236
257
|
"ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET NOT NULL",
|
|
237
258
|
);
|
|
238
259
|
});
|
|
239
260
|
|
|
240
|
-
test("alter column drop not null", () => {
|
|
261
|
+
test("alter column drop not null", async () => {
|
|
241
262
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
242
263
|
const change = new AlterForeignTableAlterColumnDropNotNull({
|
|
243
264
|
foreignTable,
|
|
244
265
|
columnName: "id",
|
|
245
266
|
});
|
|
246
267
|
|
|
268
|
+
await assertValidSql(change.serialize());
|
|
269
|
+
|
|
247
270
|
expect(change.serialize()).toBe(
|
|
248
271
|
"ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP NOT NULL",
|
|
249
272
|
);
|
|
250
273
|
});
|
|
251
274
|
|
|
252
|
-
test("set options ADD", () => {
|
|
275
|
+
test("set options ADD", async () => {
|
|
253
276
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
254
277
|
const change = new AlterForeignTableSetOptions({
|
|
255
278
|
foreignTable,
|
|
@@ -259,12 +282,14 @@ describe.concurrent("foreign-table", () => {
|
|
|
259
282
|
],
|
|
260
283
|
});
|
|
261
284
|
|
|
285
|
+
await assertValidSql(change.serialize());
|
|
286
|
+
|
|
262
287
|
expect(change.serialize()).toBe(
|
|
263
288
|
"ALTER FOREIGN TABLE public.test_table OPTIONS (ADD schema_name 'remote_schema', ADD table_name 'remote_table')",
|
|
264
289
|
);
|
|
265
290
|
});
|
|
266
291
|
|
|
267
|
-
test("set options SET", () => {
|
|
292
|
+
test("set options SET", async () => {
|
|
268
293
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
269
294
|
const change = new AlterForeignTableSetOptions({
|
|
270
295
|
foreignTable,
|
|
@@ -273,24 +298,28 @@ describe.concurrent("foreign-table", () => {
|
|
|
273
298
|
],
|
|
274
299
|
});
|
|
275
300
|
|
|
301
|
+
await assertValidSql(change.serialize());
|
|
302
|
+
|
|
276
303
|
expect(change.serialize()).toBe(
|
|
277
304
|
"ALTER FOREIGN TABLE public.test_table OPTIONS (SET schema_name 'new_schema')",
|
|
278
305
|
);
|
|
279
306
|
});
|
|
280
307
|
|
|
281
|
-
test("set options DROP", () => {
|
|
308
|
+
test("set options DROP", async () => {
|
|
282
309
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
283
310
|
const change = new AlterForeignTableSetOptions({
|
|
284
311
|
foreignTable,
|
|
285
312
|
options: [{ action: "DROP", option: "schema_name" }],
|
|
286
313
|
});
|
|
287
314
|
|
|
315
|
+
await assertValidSql(change.serialize());
|
|
316
|
+
|
|
288
317
|
expect(change.serialize()).toBe(
|
|
289
318
|
"ALTER FOREIGN TABLE public.test_table OPTIONS (DROP schema_name)",
|
|
290
319
|
);
|
|
291
320
|
});
|
|
292
321
|
|
|
293
|
-
test("set options mixed ADD/SET/DROP", () => {
|
|
322
|
+
test("set options mixed ADD/SET/DROP", async () => {
|
|
294
323
|
const foreignTable = new ForeignTable(baseTableProps);
|
|
295
324
|
const change = new AlterForeignTableSetOptions({
|
|
296
325
|
foreignTable,
|
|
@@ -301,6 +330,8 @@ describe.concurrent("foreign-table", () => {
|
|
|
301
330
|
],
|
|
302
331
|
});
|
|
303
332
|
|
|
333
|
+
await assertValidSql(change.serialize());
|
|
334
|
+
|
|
304
335
|
expect(change.serialize()).toBe(
|
|
305
336
|
"ALTER FOREIGN TABLE public.test_table OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
|
|
306
337
|
);
|
package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts
CHANGED
|
@@ -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 { ForeignTable } from "../foreign-table.model.ts";
|
|
3
4
|
import { CreateForeignTable } from "./foreign-table.create.ts";
|
|
4
5
|
|
|
5
6
|
describe("foreign-table", () => {
|
|
6
|
-
test("create basic", () => {
|
|
7
|
+
test("create basic", async () => {
|
|
7
8
|
const foreignTable = new ForeignTable({
|
|
8
9
|
schema: "public",
|
|
9
10
|
name: "test_table",
|
|
@@ -38,12 +39,14 @@ describe("foreign-table", () => {
|
|
|
38
39
|
foreignTable,
|
|
39
40
|
});
|
|
40
41
|
|
|
42
|
+
await assertValidSql(change.serialize());
|
|
43
|
+
|
|
41
44
|
expect(change.serialize()).toBe(
|
|
42
45
|
"CREATE FOREIGN TABLE public.test_table (id integer) SERVER test_server",
|
|
43
46
|
);
|
|
44
47
|
});
|
|
45
48
|
|
|
46
|
-
test("create with multiple columns", () => {
|
|
49
|
+
test("create with multiple columns", async () => {
|
|
47
50
|
const foreignTable = new ForeignTable({
|
|
48
51
|
schema: "public",
|
|
49
52
|
name: "test_table",
|
|
@@ -96,12 +99,14 @@ describe("foreign-table", () => {
|
|
|
96
99
|
foreignTable,
|
|
97
100
|
});
|
|
98
101
|
|
|
102
|
+
await assertValidSql(change.serialize());
|
|
103
|
+
|
|
99
104
|
expect(change.serialize()).toBe(
|
|
100
105
|
"CREATE FOREIGN TABLE public.test_table (id integer, name text) SERVER test_server",
|
|
101
106
|
);
|
|
102
107
|
});
|
|
103
108
|
|
|
104
|
-
test("create with options", () => {
|
|
109
|
+
test("create with options", async () => {
|
|
105
110
|
const foreignTable = new ForeignTable({
|
|
106
111
|
schema: "public",
|
|
107
112
|
name: "test_table",
|
|
@@ -136,12 +141,14 @@ describe("foreign-table", () => {
|
|
|
136
141
|
foreignTable,
|
|
137
142
|
});
|
|
138
143
|
|
|
144
|
+
await assertValidSql(change.serialize());
|
|
145
|
+
|
|
139
146
|
expect(change.serialize()).toBe(
|
|
140
147
|
"CREATE FOREIGN TABLE public.test_table (id integer) SERVER test_server OPTIONS (schema_name 'remote_schema', table_name 'remote_table')",
|
|
141
148
|
);
|
|
142
149
|
});
|
|
143
150
|
|
|
144
|
-
test("create with all properties", () => {
|
|
151
|
+
test("create with all properties", async () => {
|
|
145
152
|
const foreignTable = new ForeignTable({
|
|
146
153
|
schema: "public",
|
|
147
154
|
name: "test_table",
|
|
@@ -194,6 +201,8 @@ describe("foreign-table", () => {
|
|
|
194
201
|
foreignTable,
|
|
195
202
|
});
|
|
196
203
|
|
|
204
|
+
await assertValidSql(change.serialize());
|
|
205
|
+
|
|
197
206
|
expect(change.serialize()).toBe(
|
|
198
207
|
"CREATE FOREIGN TABLE public.test_table (id integer, name text) SERVER test_server OPTIONS (schema_name 'remote_schema', table_name 'remote_table')",
|
|
199
208
|
);
|
package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts
CHANGED
|
@@ -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 { ForeignTable } from "../foreign-table.model.ts";
|
|
3
4
|
import { DropForeignTable } from "./foreign-table.drop.ts";
|
|
4
5
|
|
|
5
6
|
describe("foreign-table", () => {
|
|
6
|
-
test("drop", () => {
|
|
7
|
+
test("drop", async () => {
|
|
7
8
|
const foreignTable = new ForeignTable({
|
|
8
9
|
schema: "public",
|
|
9
10
|
name: "test_table",
|
|
@@ -38,6 +39,8 @@ describe("foreign-table", () => {
|
|
|
38
39
|
foreignTable,
|
|
39
40
|
});
|
|
40
41
|
|
|
42
|
+
await assertValidSql(change.serialize());
|
|
43
|
+
|
|
41
44
|
expect(change.serialize()).toBe("DROP FOREIGN TABLE public.test_table");
|
|
42
45
|
});
|
|
43
46
|
});
|
|
@@ -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
|
AlterForeignTableAddColumn,
|
|
11
10
|
AlterForeignTableAlterColumnDropDefault,
|
|
@@ -40,12 +39,10 @@ import type { ForeignTable } from "./foreign-table.model.ts";
|
|
|
40
39
|
* @returns A list of changes to apply to main to make it match branch.
|
|
41
40
|
*/
|
|
42
41
|
export function diffForeignTables(
|
|
43
|
-
ctx:
|
|
44
|
-
|
|
45
|
-
currentUser
|
|
46
|
-
|
|
47
|
-
mainRoles: Record<string, Role>;
|
|
48
|
-
},
|
|
42
|
+
ctx: Pick<
|
|
43
|
+
ObjectDiffContext,
|
|
44
|
+
"version" | "currentUser" | "defaultPrivilegeState"
|
|
45
|
+
>,
|
|
49
46
|
main: Record<string, ForeignTable>,
|
|
50
47
|
branch: Record<string, ForeignTable>,
|
|
51
48
|
): ForeignTableChange[] {
|
|
@@ -80,62 +77,34 @@ export function diffForeignTables(
|
|
|
80
77
|
"foreign_table",
|
|
81
78
|
createdTable.schema ?? "",
|
|
82
79
|
);
|
|
80
|
+
const creatorFilteredDefaults =
|
|
81
|
+
createdTable.owner !== ctx.currentUser
|
|
82
|
+
? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
|
|
83
|
+
: effectiveDefaults;
|
|
83
84
|
const desiredPrivileges = filterPublicBuiltInDefaults(
|
|
84
85
|
"foreign_table",
|
|
85
86
|
createdTable.privileges,
|
|
86
87
|
);
|
|
87
88
|
const privilegeResults = diffPrivileges(
|
|
88
|
-
|
|
89
|
+
filterPublicBuiltInDefaults("foreign_table", creatorFilteredDefaults),
|
|
89
90
|
desiredPrivileges,
|
|
90
91
|
createdTable.owner,
|
|
91
|
-
ctx.mainRoles,
|
|
92
92
|
);
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Generate revoke changes
|
|
112
|
-
if (result.revokes.length > 0) {
|
|
113
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
114
|
-
for (const [grantable, list] of revokeGroups) {
|
|
115
|
-
void grantable;
|
|
116
|
-
changes.push(
|
|
117
|
-
new RevokeForeignTablePrivileges({
|
|
118
|
-
foreignTable: createdTable,
|
|
119
|
-
grantee,
|
|
120
|
-
privileges: list,
|
|
121
|
-
version: ctx.version,
|
|
122
|
-
}),
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Generate revoke grant option changes
|
|
128
|
-
if (result.revokeGrantOption.length > 0) {
|
|
129
|
-
changes.push(
|
|
130
|
-
new RevokeGrantOptionForeignTablePrivileges({
|
|
131
|
-
foreignTable: createdTable,
|
|
132
|
-
grantee,
|
|
133
|
-
privilegeNames: result.revokeGrantOption,
|
|
134
|
-
version: ctx.version,
|
|
135
|
-
}),
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
94
|
+
changes.push(
|
|
95
|
+
...(emitObjectPrivilegeChanges(
|
|
96
|
+
privilegeResults,
|
|
97
|
+
createdTable,
|
|
98
|
+
createdTable,
|
|
99
|
+
"foreignTable",
|
|
100
|
+
{
|
|
101
|
+
Grant: GrantForeignTablePrivileges,
|
|
102
|
+
Revoke: RevokeForeignTablePrivileges,
|
|
103
|
+
RevokeGrantOption: RevokeGrantOptionForeignTablePrivileges,
|
|
104
|
+
},
|
|
105
|
+
ctx.version,
|
|
106
|
+
) as ForeignTableChange[]),
|
|
107
|
+
);
|
|
139
108
|
}
|
|
140
109
|
|
|
141
110
|
for (const tableId of dropped) {
|
|
@@ -293,54 +262,22 @@ export function diffForeignTables(
|
|
|
293
262
|
mainPrivilegesFiltered,
|
|
294
263
|
branchPrivilegesFiltered,
|
|
295
264
|
branchTable.owner,
|
|
296
|
-
ctx.mainRoles,
|
|
297
265
|
);
|
|
298
266
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// Generate revoke changes
|
|
317
|
-
if (result.revokes.length > 0) {
|
|
318
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
319
|
-
for (const [grantable, list] of revokeGroups) {
|
|
320
|
-
void grantable;
|
|
321
|
-
changes.push(
|
|
322
|
-
new RevokeForeignTablePrivileges({
|
|
323
|
-
foreignTable: mainTable,
|
|
324
|
-
grantee,
|
|
325
|
-
privileges: list,
|
|
326
|
-
version: ctx.version,
|
|
327
|
-
}),
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Generate revoke grant option changes
|
|
333
|
-
if (result.revokeGrantOption.length > 0) {
|
|
334
|
-
changes.push(
|
|
335
|
-
new RevokeGrantOptionForeignTablePrivileges({
|
|
336
|
-
foreignTable: mainTable,
|
|
337
|
-
grantee,
|
|
338
|
-
privilegeNames: result.revokeGrantOption,
|
|
339
|
-
version: ctx.version,
|
|
340
|
-
}),
|
|
341
|
-
);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
267
|
+
changes.push(
|
|
268
|
+
...(emitObjectPrivilegeChanges(
|
|
269
|
+
privilegeResults,
|
|
270
|
+
branchTable,
|
|
271
|
+
mainTable,
|
|
272
|
+
"foreignTable",
|
|
273
|
+
{
|
|
274
|
+
Grant: GrantForeignTablePrivileges,
|
|
275
|
+
Revoke: RevokeForeignTablePrivileges,
|
|
276
|
+
RevokeGrantOption: RevokeGrantOptionForeignTablePrivileges,
|
|
277
|
+
},
|
|
278
|
+
ctx.version,
|
|
279
|
+
) as ForeignTableChange[]),
|
|
280
|
+
);
|
|
344
281
|
|
|
345
282
|
// Note: Foreign table renaming would also use ALTER FOREIGN TABLE ... RENAME TO ...
|
|
346
283
|
// But since our ForeignTable model uses 'name' as the identity field,
|
|
@@ -196,7 +196,7 @@ export async function extractForeignTables(
|
|
|
196
196
|
from (
|
|
197
197
|
-- one row for object ACL + one row per column ACL
|
|
198
198
|
select null::name as attname, ft.oid as relacl_oid, (
|
|
199
|
-
select c_rel.relacl from pg_class c_rel where c_rel.oid = ft.oid
|
|
199
|
+
select COALESCE(c_rel.relacl, acldefault('r', c_rel.relowner)) from pg_class c_rel where c_rel.oid = ft.oid
|
|
200
200
|
) as acl
|
|
201
201
|
union all
|
|
202
202
|
select a2.attname, ft.oid as relacl_oid, a2.attacl
|
|
@@ -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 { Server, type ServerProps } from "../server.model.ts";
|
|
3
4
|
import {
|
|
4
5
|
AlterServerChangeOwner,
|
|
@@ -8,7 +9,7 @@ import {
|
|
|
8
9
|
|
|
9
10
|
describe.concurrent("server", () => {
|
|
10
11
|
describe("alter", () => {
|
|
11
|
-
test("change owner", () => {
|
|
12
|
+
test("change owner", async () => {
|
|
12
13
|
const props: ServerProps = {
|
|
13
14
|
name: "test_server",
|
|
14
15
|
owner: "old_owner",
|
|
@@ -25,12 +26,14 @@ describe.concurrent("server", () => {
|
|
|
25
26
|
owner: "new_owner",
|
|
26
27
|
});
|
|
27
28
|
|
|
29
|
+
await assertValidSql(change.serialize());
|
|
30
|
+
|
|
28
31
|
expect(change.serialize()).toBe(
|
|
29
32
|
"ALTER SERVER test_server OWNER TO new_owner",
|
|
30
33
|
);
|
|
31
34
|
});
|
|
32
35
|
|
|
33
|
-
test("set version", () => {
|
|
36
|
+
test("set version", async () => {
|
|
34
37
|
const props: ServerProps = {
|
|
35
38
|
name: "test_server",
|
|
36
39
|
owner: "test",
|
|
@@ -47,10 +50,12 @@ describe.concurrent("server", () => {
|
|
|
47
50
|
version: "2.0",
|
|
48
51
|
});
|
|
49
52
|
|
|
53
|
+
await assertValidSql(change.serialize());
|
|
54
|
+
|
|
50
55
|
expect(change.serialize()).toBe("ALTER SERVER test_server VERSION '2.0'");
|
|
51
56
|
});
|
|
52
57
|
|
|
53
|
-
test("set version to null", () => {
|
|
58
|
+
test("set version to null", async () => {
|
|
54
59
|
const props: ServerProps = {
|
|
55
60
|
name: "test_server",
|
|
56
61
|
owner: "test",
|
|
@@ -67,10 +72,12 @@ describe.concurrent("server", () => {
|
|
|
67
72
|
version: null,
|
|
68
73
|
});
|
|
69
74
|
|
|
75
|
+
await assertValidSql(change.serialize());
|
|
76
|
+
|
|
70
77
|
expect(change.serialize()).toBe("ALTER SERVER test_server VERSION ''");
|
|
71
78
|
});
|
|
72
79
|
|
|
73
|
-
test("set options ADD", () => {
|
|
80
|
+
test("set options ADD", async () => {
|
|
74
81
|
const props: ServerProps = {
|
|
75
82
|
name: "test_server",
|
|
76
83
|
owner: "test",
|
|
@@ -90,12 +97,14 @@ describe.concurrent("server", () => {
|
|
|
90
97
|
],
|
|
91
98
|
});
|
|
92
99
|
|
|
100
|
+
await assertValidSql(change.serialize());
|
|
101
|
+
|
|
93
102
|
expect(change.serialize()).toBe(
|
|
94
103
|
"ALTER SERVER test_server OPTIONS (ADD host 'localhost', ADD port '5432')",
|
|
95
104
|
);
|
|
96
105
|
});
|
|
97
106
|
|
|
98
|
-
test("set options SET", () => {
|
|
107
|
+
test("set options SET", async () => {
|
|
99
108
|
const props: ServerProps = {
|
|
100
109
|
name: "test_server",
|
|
101
110
|
owner: "test",
|
|
@@ -112,12 +121,14 @@ describe.concurrent("server", () => {
|
|
|
112
121
|
options: [{ action: "SET", option: "host", value: "newhost" }],
|
|
113
122
|
});
|
|
114
123
|
|
|
124
|
+
await assertValidSql(change.serialize());
|
|
125
|
+
|
|
115
126
|
expect(change.serialize()).toBe(
|
|
116
127
|
"ALTER SERVER test_server OPTIONS (SET host 'newhost')",
|
|
117
128
|
);
|
|
118
129
|
});
|
|
119
130
|
|
|
120
|
-
test("set options DROP", () => {
|
|
131
|
+
test("set options DROP", async () => {
|
|
121
132
|
const props: ServerProps = {
|
|
122
133
|
name: "test_server",
|
|
123
134
|
owner: "test",
|
|
@@ -134,12 +145,14 @@ describe.concurrent("server", () => {
|
|
|
134
145
|
options: [{ action: "DROP", option: "host" }],
|
|
135
146
|
});
|
|
136
147
|
|
|
148
|
+
await assertValidSql(change.serialize());
|
|
149
|
+
|
|
137
150
|
expect(change.serialize()).toBe(
|
|
138
151
|
"ALTER SERVER test_server OPTIONS (DROP host)",
|
|
139
152
|
);
|
|
140
153
|
});
|
|
141
154
|
|
|
142
|
-
test("set options mixed ADD/SET/DROP", () => {
|
|
155
|
+
test("set options mixed ADD/SET/DROP", async () => {
|
|
143
156
|
const props: ServerProps = {
|
|
144
157
|
name: "test_server",
|
|
145
158
|
owner: "test",
|
|
@@ -160,6 +173,8 @@ describe.concurrent("server", () => {
|
|
|
160
173
|
],
|
|
161
174
|
});
|
|
162
175
|
|
|
176
|
+
await assertValidSql(change.serialize());
|
|
177
|
+
|
|
163
178
|
expect(change.serialize()).toBe(
|
|
164
179
|
"ALTER SERVER test_server OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
|
|
165
180
|
);
|