@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
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Role } from "../role/role.model.ts";
|
|
1
|
+
import type { ObjectDiffContext } from "../diff-context.ts";
|
|
3
2
|
import type { MaterializedViewChange } from "./changes/materialized-view.types.ts";
|
|
4
3
|
import type { MaterializedView } from "./materialized-view.model.ts";
|
|
5
4
|
/**
|
|
@@ -10,9 +9,4 @@ import type { MaterializedView } from "./materialized-view.model.ts";
|
|
|
10
9
|
* @param branch - The materialized views in the branch catalog.
|
|
11
10
|
* @returns A list of changes to apply to main to make it match branch.
|
|
12
11
|
*/
|
|
13
|
-
export declare function diffMaterializedViews(ctx:
|
|
14
|
-
version: number;
|
|
15
|
-
currentUser: string;
|
|
16
|
-
defaultPrivilegeState: DefaultPrivilegeState;
|
|
17
|
-
mainRoles: Record<string, Role>;
|
|
18
|
-
}, main: Record<string, MaterializedView>, branch: Record<string, MaterializedView>): MaterializedViewChange[];
|
|
12
|
+
export declare function diffMaterializedViews(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, MaterializedView>, branch: Record<string, MaterializedView>): MaterializedViewChange[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
|
-
import { diffPrivileges,
|
|
2
|
+
import { diffPrivileges, emitColumnPrivilegeChanges, } from "../base.privilege-diff.js";
|
|
3
3
|
import { deepEqual, hasNonAlterableChanges } from "../utils.js";
|
|
4
4
|
import { AlterMaterializedViewChangeOwner, AlterMaterializedViewSetStorageParams, } from "./changes/materialized-view.alter.js";
|
|
5
5
|
import { CreateCommentOnMaterializedView, CreateCommentOnMaterializedViewColumn, DropCommentOnMaterializedView, DropCommentOnMaterializedViewColumn, } from "./changes/materialized-view.comment.js";
|
|
@@ -54,87 +54,18 @@ export function diffMaterializedViews(ctx, main, branch) {
|
|
|
54
54
|
// We compare default privileges against desired privileges to generate REVOKE/GRANT statements
|
|
55
55
|
// needed to reach the final desired state.
|
|
56
56
|
const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "materialized_view", mv.schema ?? "");
|
|
57
|
+
const creatorFilteredDefaults = mv.owner !== ctx.currentUser
|
|
58
|
+
? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
|
|
59
|
+
: effectiveDefaults;
|
|
57
60
|
const desiredPrivileges = mv.privileges;
|
|
58
61
|
// Filter out owner privileges - owner always has ALL privileges implicitly
|
|
59
62
|
// and shouldn't be compared. Use the materialized view owner as the reference.
|
|
60
|
-
const privilegeResults = diffPrivileges(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
for (const [grantable, privSet] of group.byGrant) {
|
|
67
|
-
const privileges = Array.from(privSet).map((priv) => ({
|
|
68
|
-
privilege: priv,
|
|
69
|
-
grantable,
|
|
70
|
-
}));
|
|
71
|
-
changes.push(new GrantMaterializedViewPrivileges({
|
|
72
|
-
materializedView: mv,
|
|
73
|
-
grantee,
|
|
74
|
-
privileges,
|
|
75
|
-
columns: group.columns,
|
|
76
|
-
version: ctx.version,
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Generate revoke changes
|
|
82
|
-
if (result.revokes.length > 0) {
|
|
83
|
-
const revokeGroups = groupPrivilegesByColumns(result.revokes);
|
|
84
|
-
for (const [, group] of revokeGroups) {
|
|
85
|
-
const allPrivileges = new Set();
|
|
86
|
-
for (const [, privSet] of group.byGrant) {
|
|
87
|
-
for (const priv of privSet) {
|
|
88
|
-
allPrivileges.add(priv);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const privileges = Array.from(allPrivileges).map((priv) => ({
|
|
92
|
-
privilege: priv,
|
|
93
|
-
grantable: false,
|
|
94
|
-
}));
|
|
95
|
-
changes.push(new RevokeMaterializedViewPrivileges({
|
|
96
|
-
materializedView: mv,
|
|
97
|
-
grantee,
|
|
98
|
-
privileges,
|
|
99
|
-
columns: group.columns,
|
|
100
|
-
version: ctx.version,
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Generate revoke grant option changes
|
|
105
|
-
if (result.revokeGrantOption.length > 0) {
|
|
106
|
-
const revokeGrantGroups = new Map();
|
|
107
|
-
for (const r of result.revokeGrantOption) {
|
|
108
|
-
// For revoke grant option, we need to find the columns from the effective defaults
|
|
109
|
-
const originalPriv = effectiveDefaults.find((p) => p.grantee === grantee && p.privilege === r);
|
|
110
|
-
const key = originalPriv?.columns
|
|
111
|
-
? originalPriv.columns.sort().join(",")
|
|
112
|
-
: "";
|
|
113
|
-
if (!revokeGrantGroups.has(key)) {
|
|
114
|
-
revokeGrantGroups.set(key, {
|
|
115
|
-
columns: originalPriv?.columns
|
|
116
|
-
? [...originalPriv.columns]
|
|
117
|
-
: undefined,
|
|
118
|
-
privileges: new Set(),
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
const group = revokeGrantGroups.get(key);
|
|
122
|
-
if (!group)
|
|
123
|
-
continue;
|
|
124
|
-
group.privileges.add(r);
|
|
125
|
-
}
|
|
126
|
-
for (const [, group] of revokeGrantGroups) {
|
|
127
|
-
const privilegeNames = Array.from(group.privileges);
|
|
128
|
-
changes.push(new RevokeGrantOptionMaterializedViewPrivileges({
|
|
129
|
-
materializedView: mv,
|
|
130
|
-
grantee,
|
|
131
|
-
privilegeNames,
|
|
132
|
-
columns: group.columns,
|
|
133
|
-
version: ctx.version,
|
|
134
|
-
}));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
63
|
+
const privilegeResults = diffPrivileges(creatorFilteredDefaults, desiredPrivileges, mv.owner);
|
|
64
|
+
changes.push(...emitColumnPrivilegeChanges(privilegeResults, mv, mv, "materializedView", {
|
|
65
|
+
Grant: GrantMaterializedViewPrivileges,
|
|
66
|
+
Revoke: RevokeMaterializedViewPrivileges,
|
|
67
|
+
RevokeGrantOption: RevokeGrantOptionMaterializedViewPrivileges,
|
|
68
|
+
}, effectiveDefaults, ctx.version));
|
|
138
69
|
}
|
|
139
70
|
for (const materializedViewId of dropped) {
|
|
140
71
|
changes.push(new DropMaterializedView({ materializedView: main[materializedViewId] }));
|
|
@@ -250,85 +181,12 @@ export function diffMaterializedViews(ctx, main, branch) {
|
|
|
250
181
|
// PRIVILEGES (unified object and column privileges)
|
|
251
182
|
// Filter out owner privileges - owner always has ALL privileges implicitly
|
|
252
183
|
// and shouldn't be compared. Use branch owner as the reference.
|
|
253
|
-
const privilegeResults = diffPrivileges(mainMaterializedView.privileges, branchMaterializedView.privileges, branchMaterializedView.owner
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
for (const [grantable, privSet] of group.byGrant) {
|
|
260
|
-
const privileges = Array.from(privSet).map((priv) => ({
|
|
261
|
-
privilege: priv,
|
|
262
|
-
grantable,
|
|
263
|
-
}));
|
|
264
|
-
changes.push(new GrantMaterializedViewPrivileges({
|
|
265
|
-
materializedView: branchMaterializedView,
|
|
266
|
-
grantee,
|
|
267
|
-
privileges,
|
|
268
|
-
columns: group.columns,
|
|
269
|
-
version: ctx.version,
|
|
270
|
-
}));
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
// Generate revoke changes
|
|
275
|
-
if (result.revokes.length > 0) {
|
|
276
|
-
const revokeGroups = groupPrivilegesByColumns(result.revokes);
|
|
277
|
-
for (const [, group] of revokeGroups) {
|
|
278
|
-
// Collapse all grantable groups into a single revoke (grantable: false)
|
|
279
|
-
const allPrivileges = new Set();
|
|
280
|
-
for (const [, privSet] of group.byGrant) {
|
|
281
|
-
for (const priv of privSet) {
|
|
282
|
-
allPrivileges.add(priv);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
const privileges = Array.from(allPrivileges).map((priv) => ({
|
|
286
|
-
privilege: priv,
|
|
287
|
-
grantable: false,
|
|
288
|
-
}));
|
|
289
|
-
changes.push(new RevokeMaterializedViewPrivileges({
|
|
290
|
-
materializedView: mainMaterializedView,
|
|
291
|
-
grantee,
|
|
292
|
-
privileges,
|
|
293
|
-
columns: group.columns,
|
|
294
|
-
version: ctx.version,
|
|
295
|
-
}));
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
// Generate revoke grant option changes
|
|
299
|
-
if (result.revokeGrantOption.length > 0) {
|
|
300
|
-
const revokeGrantGroups = new Map();
|
|
301
|
-
for (const r of result.revokeGrantOption) {
|
|
302
|
-
// For revoke grant option, we need to find the columns from the original privilege
|
|
303
|
-
const originalPriv = mainMaterializedView.privileges.find((p) => p.grantee === grantee && p.privilege === r);
|
|
304
|
-
const key = originalPriv?.columns
|
|
305
|
-
? originalPriv.columns.sort().join(",")
|
|
306
|
-
: "";
|
|
307
|
-
if (!revokeGrantGroups.has(key)) {
|
|
308
|
-
revokeGrantGroups.set(key, {
|
|
309
|
-
columns: originalPriv?.columns
|
|
310
|
-
? [...originalPriv.columns]
|
|
311
|
-
: undefined,
|
|
312
|
-
privileges: new Set(),
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
const group = revokeGrantGroups.get(key);
|
|
316
|
-
if (!group)
|
|
317
|
-
continue;
|
|
318
|
-
group.privileges.add(r);
|
|
319
|
-
}
|
|
320
|
-
for (const [, group] of revokeGrantGroups) {
|
|
321
|
-
const privilegeNames = Array.from(group.privileges);
|
|
322
|
-
changes.push(new RevokeGrantOptionMaterializedViewPrivileges({
|
|
323
|
-
materializedView: mainMaterializedView,
|
|
324
|
-
grantee,
|
|
325
|
-
privilegeNames,
|
|
326
|
-
columns: group.columns,
|
|
327
|
-
version: ctx.version,
|
|
328
|
-
}));
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
184
|
+
const privilegeResults = diffPrivileges(mainMaterializedView.privileges, branchMaterializedView.privileges, branchMaterializedView.owner);
|
|
185
|
+
changes.push(...emitColumnPrivilegeChanges(privilegeResults, branchMaterializedView, mainMaterializedView, "materializedView", {
|
|
186
|
+
Grant: GrantMaterializedViewPrivileges,
|
|
187
|
+
Revoke: RevokeMaterializedViewPrivileges,
|
|
188
|
+
RevokeGrantOption: RevokeGrantOptionMaterializedViewPrivileges,
|
|
189
|
+
}, mainMaterializedView.privileges, ctx.version));
|
|
332
190
|
}
|
|
333
191
|
}
|
|
334
192
|
return changes;
|
|
@@ -14,10 +14,10 @@ declare const materializedViewPropsSchema: z.ZodObject<{
|
|
|
14
14
|
has_subclasses: z.ZodBoolean;
|
|
15
15
|
is_populated: z.ZodBoolean;
|
|
16
16
|
replica_identity: z.ZodEnum<{
|
|
17
|
-
f: "f";
|
|
18
17
|
n: "n";
|
|
19
18
|
i: "i";
|
|
20
19
|
d: "d";
|
|
20
|
+
f: "f";
|
|
21
21
|
}>;
|
|
22
22
|
is_partition: z.ZodBoolean;
|
|
23
23
|
options: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
@@ -85,7 +85,7 @@ export declare class MaterializedView extends BasePgModel implements TableLikeOb
|
|
|
85
85
|
has_triggers: boolean;
|
|
86
86
|
has_subclasses: boolean;
|
|
87
87
|
is_populated: boolean;
|
|
88
|
-
replica_identity: "
|
|
88
|
+
replica_identity: "n" | "i" | "d" | "f";
|
|
89
89
|
is_partition: boolean;
|
|
90
90
|
options: string[] | null;
|
|
91
91
|
partition_bound: string | null;
|
|
@@ -133,7 +133,7 @@ export declare class MaterializedView extends BasePgModel implements TableLikeOb
|
|
|
133
133
|
has_triggers: boolean;
|
|
134
134
|
has_subclasses: boolean;
|
|
135
135
|
is_populated: boolean;
|
|
136
|
-
replica_identity: "
|
|
136
|
+
replica_identity: "n" | "i" | "d" | "f";
|
|
137
137
|
is_partition: boolean;
|
|
138
138
|
options: string[] | null;
|
|
139
139
|
partition_bound: string | null;
|
|
@@ -193,7 +193,7 @@ select
|
|
|
193
193
|
filter (where src.attname is not null) as cols
|
|
194
194
|
from (
|
|
195
195
|
-- one row for object ACL + one row per column ACL
|
|
196
|
-
select null::name as attname, c.relacl as acl
|
|
196
|
+
select null::name as attname, COALESCE(c.relacl, acldefault('r', c.relowner)) as acl
|
|
197
197
|
union all
|
|
198
198
|
select a2.attname, a2.attacl
|
|
199
199
|
from pg_attribute a2
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { formatConfigValue } from "../utils.js";
|
|
2
2
|
import { AlterProcedureChange } from "./procedure.base.js";
|
|
3
|
+
/** Build schema.name(args) for ALTER statements so overloaded functions are unambiguous. */
|
|
4
|
+
function procedureSignature(procedure) {
|
|
5
|
+
const args = procedure.argument_types?.join(", ") ?? "";
|
|
6
|
+
return `${procedure.schema}.${procedure.name}(${args})`;
|
|
7
|
+
}
|
|
3
8
|
/**
|
|
4
9
|
* ALTER FUNCTION/PROCEDURE ... OWNER TO ...
|
|
5
10
|
*/
|
|
@@ -20,7 +25,7 @@ export class AlterProcedureChangeOwner extends AlterProcedureChange {
|
|
|
20
25
|
return [
|
|
21
26
|
"ALTER",
|
|
22
27
|
objectType,
|
|
23
|
-
|
|
28
|
+
procedureSignature(this.procedure),
|
|
24
29
|
"OWNER TO",
|
|
25
30
|
this.owner,
|
|
26
31
|
].join(" ");
|
|
@@ -49,7 +54,7 @@ export class AlterProcedureSetSecurity extends AlterProcedureChange {
|
|
|
49
54
|
return [
|
|
50
55
|
"ALTER",
|
|
51
56
|
objectType,
|
|
52
|
-
|
|
57
|
+
procedureSignature(this.procedure),
|
|
53
58
|
security,
|
|
54
59
|
].join(" ");
|
|
55
60
|
}
|
|
@@ -78,7 +83,7 @@ export class AlterProcedureSetConfig extends AlterProcedureChange {
|
|
|
78
83
|
const head = [
|
|
79
84
|
"ALTER",
|
|
80
85
|
this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
|
|
81
|
-
|
|
86
|
+
procedureSignature(this.procedure),
|
|
82
87
|
].join(" ");
|
|
83
88
|
if (this.action === "reset_all")
|
|
84
89
|
return `${head} RESET ALL`;
|
|
@@ -113,7 +118,7 @@ export class AlterProcedureSetVolatility extends AlterProcedureChange {
|
|
|
113
118
|
return [
|
|
114
119
|
"ALTER",
|
|
115
120
|
objectType,
|
|
116
|
-
|
|
121
|
+
procedureSignature(this.procedure),
|
|
117
122
|
volMap[this.volatility],
|
|
118
123
|
].join(" ");
|
|
119
124
|
}
|
|
@@ -139,7 +144,7 @@ export class AlterProcedureSetStrictness extends AlterProcedureChange {
|
|
|
139
144
|
return [
|
|
140
145
|
"ALTER",
|
|
141
146
|
objectType,
|
|
142
|
-
|
|
147
|
+
procedureSignature(this.procedure),
|
|
143
148
|
strictness,
|
|
144
149
|
].join(" ");
|
|
145
150
|
}
|
|
@@ -162,12 +167,7 @@ export class AlterProcedureSetLeakproof extends AlterProcedureChange {
|
|
|
162
167
|
serialize() {
|
|
163
168
|
const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
|
|
164
169
|
const leak = this.leakproof ? "LEAKPROOF" : "NOT LEAKPROOF";
|
|
165
|
-
return [
|
|
166
|
-
"ALTER",
|
|
167
|
-
objectType,
|
|
168
|
-
`${this.procedure.schema}.${this.procedure.name}`,
|
|
169
|
-
leak,
|
|
170
|
-
].join(" ");
|
|
170
|
+
return ["ALTER", objectType, procedureSignature(this.procedure), leak].join(" ");
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
/**
|
|
@@ -195,7 +195,7 @@ export class AlterProcedureSetParallel extends AlterProcedureChange {
|
|
|
195
195
|
return [
|
|
196
196
|
"ALTER",
|
|
197
197
|
objectType,
|
|
198
|
-
|
|
198
|
+
procedureSignature(this.procedure),
|
|
199
199
|
parallelMap[this.parallelSafety],
|
|
200
200
|
].join(" ");
|
|
201
201
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Role } from "../role/role.model.ts";
|
|
1
|
+
import type { ObjectDiffContext } from "../diff-context.ts";
|
|
3
2
|
import type { ProcedureChange } from "./changes/procedure.types.ts";
|
|
4
3
|
import type { Procedure } from "./procedure.model.ts";
|
|
5
4
|
/**
|
|
@@ -10,9 +9,4 @@ import type { Procedure } from "./procedure.model.ts";
|
|
|
10
9
|
* @param branch - The procedures in the branch catalog.
|
|
11
10
|
* @returns A list of changes to apply to main to make it match branch.
|
|
12
11
|
*/
|
|
13
|
-
export declare function diffProcedures(ctx:
|
|
14
|
-
version: number;
|
|
15
|
-
currentUser: string;
|
|
16
|
-
defaultPrivilegeState: DefaultPrivilegeState;
|
|
17
|
-
mainRoles: Record<string, Role>;
|
|
18
|
-
}, main: Record<string, Procedure>, branch: Record<string, Procedure>): ProcedureChange[];
|
|
12
|
+
export declare function diffProcedures(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, Procedure>, branch: Record<string, Procedure>): ProcedureChange[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
|
-
import { diffPrivileges,
|
|
2
|
+
import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../base.privilege-diff.js";
|
|
3
3
|
import { deepEqual, hasNonAlterableChanges } from "../utils.js";
|
|
4
4
|
import { AlterProcedureChangeOwner, AlterProcedureSetConfig, AlterProcedureSetLeakproof, AlterProcedureSetParallel, AlterProcedureSetSecurity, AlterProcedureSetStrictness, AlterProcedureSetVolatility, } from "./changes/procedure.alter.js";
|
|
5
5
|
import { CreateCommentOnProcedure, DropCommentOnProcedure, } from "./changes/procedure.comment.js";
|
|
@@ -37,6 +37,9 @@ export function diffProcedures(ctx, main, branch) {
|
|
|
37
37
|
// We compare default privileges against desired privileges to generate REVOKE/GRANT statements
|
|
38
38
|
// needed to reach the final desired state.
|
|
39
39
|
const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "procedure", proc.schema ?? "");
|
|
40
|
+
const creatorFilteredDefaults = proc.owner !== ctx.currentUser
|
|
41
|
+
? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
|
|
42
|
+
: effectiveDefaults;
|
|
40
43
|
// Filter out PUBLIC's built-in default EXECUTE privilege (PostgreSQL grants it automatically)
|
|
41
44
|
// Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
|
|
42
45
|
// This prevents generating unnecessary "GRANT EXECUTE TO PUBLIC" statements
|
|
@@ -44,44 +47,12 @@ export function diffProcedures(ctx, main, branch) {
|
|
|
44
47
|
// Filter out owner privileges - owner always has ALL privileges implicitly
|
|
45
48
|
// and shouldn't be compared. Note: we use the final owner (proc.owner), not the
|
|
46
49
|
// current user, because ownership change happens before privilege diffing.
|
|
47
|
-
const privilegeResults = diffPrivileges(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
void grantable;
|
|
54
|
-
changes.push(new GrantProcedurePrivileges({
|
|
55
|
-
procedure: proc,
|
|
56
|
-
grantee,
|
|
57
|
-
privileges: list,
|
|
58
|
-
version: ctx.version,
|
|
59
|
-
}));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// Generate revoke changes
|
|
63
|
-
if (result.revokes.length > 0) {
|
|
64
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
65
|
-
for (const [grantable, list] of revokeGroups) {
|
|
66
|
-
void grantable;
|
|
67
|
-
changes.push(new RevokeProcedurePrivileges({
|
|
68
|
-
procedure: proc,
|
|
69
|
-
grantee,
|
|
70
|
-
privileges: list,
|
|
71
|
-
version: ctx.version,
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Generate revoke grant option changes
|
|
76
|
-
if (result.revokeGrantOption.length > 0) {
|
|
77
|
-
changes.push(new RevokeGrantOptionProcedurePrivileges({
|
|
78
|
-
procedure: proc,
|
|
79
|
-
grantee,
|
|
80
|
-
privilegeNames: result.revokeGrantOption,
|
|
81
|
-
version: ctx.version,
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
50
|
+
const privilegeResults = diffPrivileges(filterPublicBuiltInDefaults("procedure", creatorFilteredDefaults), desiredPrivileges, proc.owner);
|
|
51
|
+
changes.push(...emitObjectPrivilegeChanges(privilegeResults, proc, proc, "procedure", {
|
|
52
|
+
Grant: GrantProcedurePrivileges,
|
|
53
|
+
Revoke: RevokeProcedurePrivileges,
|
|
54
|
+
RevokeGrantOption: RevokeGrantOptionProcedurePrivileges,
|
|
55
|
+
}, ctx.version));
|
|
85
56
|
}
|
|
86
57
|
for (const procedureId of dropped) {
|
|
87
58
|
changes.push(new DropProcedure({ procedure: main[procedureId] }));
|
|
@@ -238,44 +209,12 @@ export function diffProcedures(ctx, main, branch) {
|
|
|
238
209
|
const branchPrivilegesFiltered = filterPublicBuiltInDefaults("procedure", branchProcedure.privileges);
|
|
239
210
|
// Filter out owner privileges - owner always has ALL privileges implicitly
|
|
240
211
|
// and shouldn't be compared. Use branch owner as the reference.
|
|
241
|
-
const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchProcedure.owner
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
void grantable;
|
|
248
|
-
changes.push(new GrantProcedurePrivileges({
|
|
249
|
-
procedure: branchProcedure,
|
|
250
|
-
grantee,
|
|
251
|
-
privileges: list,
|
|
252
|
-
version: ctx.version,
|
|
253
|
-
}));
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Generate revoke changes
|
|
257
|
-
if (result.revokes.length > 0) {
|
|
258
|
-
const revokeGroups = groupPrivilegesByGrantable(result.revokes);
|
|
259
|
-
for (const [grantable, list] of revokeGroups) {
|
|
260
|
-
void grantable;
|
|
261
|
-
changes.push(new RevokeProcedurePrivileges({
|
|
262
|
-
procedure: mainProcedure,
|
|
263
|
-
grantee,
|
|
264
|
-
privileges: list,
|
|
265
|
-
version: ctx.version,
|
|
266
|
-
}));
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
// Generate revoke grant option changes
|
|
270
|
-
if (result.revokeGrantOption.length > 0) {
|
|
271
|
-
changes.push(new RevokeGrantOptionProcedurePrivileges({
|
|
272
|
-
procedure: mainProcedure,
|
|
273
|
-
grantee,
|
|
274
|
-
privilegeNames: result.revokeGrantOption,
|
|
275
|
-
version: ctx.version,
|
|
276
|
-
}));
|
|
277
|
-
}
|
|
278
|
-
}
|
|
212
|
+
const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchProcedure.owner);
|
|
213
|
+
changes.push(...emitObjectPrivilegeChanges(privilegeResults, branchProcedure, mainProcedure, "procedure", {
|
|
214
|
+
Grant: GrantProcedurePrivileges,
|
|
215
|
+
Revoke: RevokeProcedurePrivileges,
|
|
216
|
+
RevokeGrantOption: RevokeGrantOptionProcedurePrivileges,
|
|
217
|
+
}, ctx.version));
|
|
279
218
|
}
|
|
280
219
|
}
|
|
281
220
|
return changes;
|
|
@@ -6,24 +6,24 @@ declare const procedurePropsSchema: z.ZodObject<{
|
|
|
6
6
|
schema: z.ZodString;
|
|
7
7
|
name: z.ZodString;
|
|
8
8
|
kind: z.ZodEnum<{
|
|
9
|
-
f: "f";
|
|
10
|
-
w: "w";
|
|
11
9
|
a: "a";
|
|
10
|
+
w: "w";
|
|
12
11
|
p: "p";
|
|
12
|
+
f: "f";
|
|
13
13
|
}>;
|
|
14
14
|
return_type: z.ZodString;
|
|
15
15
|
return_type_schema: z.ZodString;
|
|
16
16
|
language: z.ZodString;
|
|
17
17
|
security_definer: z.ZodBoolean;
|
|
18
18
|
volatility: z.ZodEnum<{
|
|
19
|
-
s: "s";
|
|
20
19
|
i: "i";
|
|
20
|
+
s: "s";
|
|
21
21
|
v: "v";
|
|
22
22
|
}>;
|
|
23
23
|
parallel_safety: z.ZodEnum<{
|
|
24
|
-
r: "r";
|
|
25
24
|
u: "u";
|
|
26
25
|
s: "s";
|
|
26
|
+
r: "r";
|
|
27
27
|
}>;
|
|
28
28
|
execution_cost: z.ZodNumber;
|
|
29
29
|
result_rows: z.ZodNumber;
|
|
@@ -36,8 +36,8 @@ declare const procedurePropsSchema: z.ZodObject<{
|
|
|
36
36
|
argument_types: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
37
37
|
all_argument_types: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
38
38
|
argument_modes: z.ZodNullable<z.ZodArray<z.ZodEnum<{
|
|
39
|
-
o: "o";
|
|
40
39
|
i: "i";
|
|
40
|
+
o: "o";
|
|
41
41
|
b: "b";
|
|
42
42
|
v: "v";
|
|
43
43
|
t: "t";
|
|
@@ -96,13 +96,13 @@ export declare class Procedure extends BasePgModel {
|
|
|
96
96
|
name: string;
|
|
97
97
|
};
|
|
98
98
|
get dataFields(): {
|
|
99
|
-
kind: "
|
|
99
|
+
kind: "a" | "w" | "p" | "f";
|
|
100
100
|
return_type: string;
|
|
101
101
|
return_type_schema: string;
|
|
102
102
|
language: string;
|
|
103
103
|
security_definer: boolean;
|
|
104
|
-
volatility: "
|
|
105
|
-
parallel_safety: "
|
|
104
|
+
volatility: "i" | "s" | "v";
|
|
105
|
+
parallel_safety: "u" | "s" | "r";
|
|
106
106
|
is_strict: boolean;
|
|
107
107
|
leakproof: boolean;
|
|
108
108
|
returns_set: boolean;
|
|
@@ -111,7 +111,7 @@ export declare class Procedure extends BasePgModel {
|
|
|
111
111
|
argument_names: string[] | null;
|
|
112
112
|
argument_types: string[] | null;
|
|
113
113
|
all_argument_types: string[] | null;
|
|
114
|
-
argument_modes: ("
|
|
114
|
+
argument_modes: ("i" | "o" | "b" | "v" | "t")[] | null;
|
|
115
115
|
argument_defaults: string | null;
|
|
116
116
|
source_code: string | null;
|
|
117
117
|
binary_path: string | null;
|
|
@@ -222,7 +222,7 @@ select
|
|
|
222
222
|
)
|
|
223
223
|
order by x.grantee, x.privilege_type
|
|
224
224
|
)
|
|
225
|
-
from lateral aclexplode(p.proacl) as x(grantor, grantee, privilege_type, is_grantable)
|
|
225
|
+
from lateral aclexplode(COALESCE(p.proacl, acldefault('f', p.proowner))) as x(grantor, grantee, privilege_type, is_grantable)
|
|
226
226
|
), '[]'
|
|
227
227
|
) as privileges
|
|
228
228
|
from
|
|
@@ -13,15 +13,6 @@ export declare class AlterPublicationSetOptions extends AlterPublicationChange {
|
|
|
13
13
|
get requires(): `publication:${string}`[];
|
|
14
14
|
serialize(): string;
|
|
15
15
|
}
|
|
16
|
-
export declare class AlterPublicationSetForAllTables extends AlterPublicationChange {
|
|
17
|
-
readonly publication: Publication;
|
|
18
|
-
readonly scope: "object";
|
|
19
|
-
constructor(props: {
|
|
20
|
-
publication: Publication;
|
|
21
|
-
});
|
|
22
|
-
get requires(): `publication:${string}`[];
|
|
23
|
-
serialize(): string;
|
|
24
|
-
}
|
|
25
16
|
export declare class AlterPublicationSetList extends AlterPublicationChange {
|
|
26
17
|
readonly publication: Publication;
|
|
27
18
|
readonly scope: "object";
|
|
@@ -27,20 +27,6 @@ export class AlterPublicationSetOptions extends AlterPublicationChange {
|
|
|
27
27
|
return `ALTER PUBLICATION ${this.publication.name} SET (${assignments.join(", ")})`;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
export class AlterPublicationSetForAllTables extends AlterPublicationChange {
|
|
31
|
-
publication;
|
|
32
|
-
scope = "object";
|
|
33
|
-
constructor(props) {
|
|
34
|
-
super();
|
|
35
|
-
this.publication = props.publication;
|
|
36
|
-
}
|
|
37
|
-
get requires() {
|
|
38
|
-
return [this.publication.stableId];
|
|
39
|
-
}
|
|
40
|
-
serialize() {
|
|
41
|
-
return `ALTER PUBLICATION ${this.publication.name} SET FOR ALL TABLES`;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
30
|
export class AlterPublicationSetList extends AlterPublicationChange {
|
|
45
31
|
publication;
|
|
46
32
|
scope = "object";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables,
|
|
1
|
+
import type { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetList, AlterPublicationSetOptions, AlterPublicationSetOwner } from "./publication.alter.ts";
|
|
2
2
|
import type { CommentPublication } from "./publication.comment.ts";
|
|
3
3
|
import type { CreatePublication } from "./publication.create.ts";
|
|
4
4
|
import type { DropPublication } from "./publication.drop.ts";
|
|
5
|
-
export type PublicationChange = AlterPublicationAddSchemas | AlterPublicationAddTables | AlterPublicationDropSchemas | AlterPublicationDropTables |
|
|
5
|
+
export type PublicationChange = AlterPublicationAddSchemas | AlterPublicationAddTables | AlterPublicationDropSchemas | AlterPublicationDropTables | AlterPublicationSetList | AlterPublicationSetOptions | AlterPublicationSetOwner | CommentPublication | CreatePublication | DropPublication;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
+
import type { ObjectDiffContext } from "../diff-context.ts";
|
|
1
2
|
import type { PublicationChange } from "./changes/publication.types.ts";
|
|
2
3
|
import type { Publication } from "./publication.model.ts";
|
|
3
|
-
export declare function diffPublications(ctx:
|
|
4
|
-
currentUser: string;
|
|
5
|
-
}, main: Record<string, Publication>, branch: Record<string, Publication>): PublicationChange[];
|
|
4
|
+
export declare function diffPublications(ctx: Pick<ObjectDiffContext, "currentUser">, main: Record<string, Publication>, branch: Record<string, Publication>): PublicationChange[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
2
|
import { deepEqual } from "../utils.js";
|
|
3
|
-
import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables,
|
|
3
|
+
import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetOptions, AlterPublicationSetOwner, } from "./changes/publication.alter.js";
|
|
4
4
|
import { CreateCommentOnPublication, DropCommentOnPublication, } from "./changes/publication.comment.js";
|
|
5
5
|
import { CreatePublication } from "./changes/publication.create.js";
|
|
6
6
|
import { DropPublication } from "./changes/publication.drop.js";
|
|
@@ -52,21 +52,16 @@ export function diffPublications(ctx, main, branch) {
|
|
|
52
52
|
let handledObjectLists = false;
|
|
53
53
|
if (mainPublication.all_tables !== branchPublication.all_tables) {
|
|
54
54
|
handledObjectLists = true;
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
// Changing the all_tables mode requires DROP + CREATE because
|
|
56
|
+
// ALTER PUBLICATION does not support SET ALL TABLES.
|
|
57
|
+
changes.push(new DropPublication({ publication: mainPublication }));
|
|
58
|
+
changes.push(new CreatePublication({ publication: branchPublication }));
|
|
59
|
+
if (branchPublication.comment !== null) {
|
|
60
|
+
changes.push(new CreateCommentOnPublication({
|
|
57
61
|
publication: branchPublication,
|
|
58
62
|
}));
|
|
59
63
|
}
|
|
60
|
-
|
|
61
|
-
changes.push(new DropPublication({ publication: mainPublication }));
|
|
62
|
-
changes.push(new CreatePublication({ publication: branchPublication }));
|
|
63
|
-
if (branchPublication.comment !== null) {
|
|
64
|
-
changes.push(new CreateCommentOnPublication({
|
|
65
|
-
publication: branchPublication,
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
64
|
+
continue;
|
|
70
65
|
}
|
|
71
66
|
if (!handledObjectLists && !branchPublication.all_tables) {
|
|
72
67
|
const tableDiff = diffPublicationTables(mainPublication.tables, branchPublication.tables);
|