@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -2
- 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 +40 -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/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +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 +25 -22
- package/dist/core/objects/table/table.model.js +4 -1
- package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
- package/dist/core/objects/trigger/trigger.model.d.ts +9 -0
- package/dist/core/objects/trigger/trigger.model.js +14 -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 +11 -28
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +134 -155
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2447 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +893 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/plan/types.d.ts +6 -0
- package/dist/core/postgres-config.d.ts +29 -0
- package/dist/core/postgres-config.js +83 -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 +8 -0
- package/dist/index.js +7 -1
- package/package.json +54 -22
- package/src/cli/app.ts +52 -0
- package/src/cli/bin/cli.ts +15 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +330 -0
- package/src/cli/commands/plan.ts +216 -0
- package/src/cli/commands/sync.ts +185 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +44 -0
- package/src/cli/utils/integrations.ts +42 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +247 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +464 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change.types.ts +44 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1870 -0
- package/src/core/expand-replace-dependencies.test.ts +70 -0
- package/src/core/expand-replace-dependencies.ts +380 -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/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +211 -0
- package/src/core/integrations/filter/dsl.ts +266 -0
- package/src/core/integrations/filter/extractors.test.ts +244 -0
- package/src/core/integrations/filter/extractors.ts +187 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/integration-dsl.ts +34 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -0
- package/src/core/integrations/serialize/dsl.ts +77 -0
- package/src/core/integrations/serialize/serialize.types.ts +3 -0
- package/src/core/integrations/supabase.ts +130 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
- package/src/core/objects/base.change.ts +62 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.ts +82 -0
- package/src/core/objects/base.privilege-diff.ts +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +79 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +68 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +106 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
- package/src/core/objects/collation/changes/collation.drop.ts +37 -0
- package/src/core/objects/collation/changes/collation.types.ts +10 -0
- package/src/core/objects/collation/collation.diff.test.ts +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +286 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +59 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +124 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
- package/src/core/objects/domain/changes/domain.drop.ts +34 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
- package/src/core/objects/domain/changes/domain.types.ts +12 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +78 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +64 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
- package/src/core/objects/extension/changes/extension.create.ts +63 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
- package/src/core/objects/extension/changes/extension.drop.ts +34 -0
- package/src/core/objects/extension/changes/extension.types.ts +10 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +209 -0
- package/src/core/objects/index/changes/index.alter.ts +144 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +63 -0
- package/src/core/objects/index/changes/index.create.test.ts +69 -0
- package/src/core/objects/index/changes/index.create.ts +68 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -0
- package/src/core/objects/index/changes/index.drop.ts +34 -0
- package/src/core/objects/index/changes/index.types.ts +6 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.ts +370 -0
- package/src/core/objects/language/changes/language.alter.test.ts +36 -0
- package/src/core/objects/language/changes/language.alter.ts +53 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +58 -0
- package/src/core/objects/language/changes/language.create.test.ts +30 -0
- package/src/core/objects/language/changes/language.create.ts +104 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -0
- package/src/core/objects/language/changes/language.drop.ts +39 -0
- package/src/core/objects/language/changes/language.privilege.ts +172 -0
- package/src/core/objects/language/changes/language.types.ts +12 -0
- package/src/core/objects/language/language.diff.test.ts +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
- package/src/core/objects/procedure/procedure.diff.ts +341 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
- package/src/core/objects/publication/changes/publication.alter.ts +225 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +64 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +82 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +29 -0
- package/src/core/objects/publication/changes/publication.types.ts +24 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
- package/src/core/objects/role/changes/role.alter.test.ts +362 -0
- package/src/core/objects/role/changes/role.alter.ts +110 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +55 -0
- package/src/core/objects/role/changes/role.create.test.ts +56 -0
- package/src/core/objects/role/changes/role.create.ts +102 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -0
- package/src/core/objects/role/changes/role.drop.ts +34 -0
- package/src/core/objects/role/changes/role.privilege.ts +376 -0
- package/src/core/objects/role/changes/role.types.ts +12 -0
- package/src/core/objects/role/role.diff.test.ts +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +72 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +62 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +42 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
- package/src/core/objects/rule/changes/rule.drop.ts +29 -0
- package/src/core/objects/rule/changes/rule.types.ts +12 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
- package/src/core/objects/schema/changes/schema.alter.ts +45 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +56 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +34 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
- package/src/core/objects/schema/changes/schema.types.ts +12 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
- package/src/core/objects/sequence/sequence.diff.ts +294 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +846 -0
- package/src/core/objects/table/changes/table.alter.ts +806 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +266 -0
- package/src/core/objects/table/changes/table.create.test.ts +188 -0
- package/src/core/objects/table/changes/table.create.ts +192 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -0
- package/src/core/objects/table/changes/table.drop.ts +45 -0
- package/src/core/objects/table/changes/table.privilege.ts +200 -0
- package/src/core/objects/table/changes/table.types.ts +12 -0
- package/src/core/objects/table/table.diff.test.ts +868 -0
- package/src/core/objects/table/table.diff.ts +817 -0
- package/src/core/objects/table/table.model.ts +460 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +116 -0
- package/src/core/objects/trigger/trigger.model.ts +264 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +51 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +64 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +155 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
- package/src/core/objects/type/range/changes/range.drop.ts +34 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
- package/src/core/objects/type/range/changes/range.types.ts +12 -0
- package/src/core/objects/type/range/range.diff.test.ts +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +5 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +112 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +59 -0
- package/src/core/objects/view/changes/view.create.test.ts +70 -0
- package/src/core/objects/view/changes/view.create.ts +73 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -0
- package/src/core/objects/view/changes/view.drop.ts +40 -0
- package/src/core/objects/view/changes/view.privilege.ts +200 -0
- package/src/core/objects/view/changes/view.types.ts +12 -0
- package/src/core/objects/view/view.diff.test.ts +173 -0
- package/src/core/objects/view/view.diff.ts +215 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +368 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2803 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1120 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +171 -0
- package/src/core/postgres-config.ts +238 -0
- package/src/core/sort/custom-constraints.ts +161 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +597 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +38 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
2
|
+
import type { Pool } from "pg";
|
|
3
|
+
import z from "zod";
|
|
4
|
+
import { BasePgModel } from "../../base.model.ts";
|
|
5
|
+
import {
|
|
6
|
+
type PrivilegeProps,
|
|
7
|
+
privilegePropsSchema,
|
|
8
|
+
} from "../../base.privilege-diff.ts";
|
|
9
|
+
|
|
10
|
+
const rangePropsSchema = z.object({
|
|
11
|
+
schema: z.string(),
|
|
12
|
+
name: z.string(),
|
|
13
|
+
owner: z.string(),
|
|
14
|
+
comment: z.string().nullable(),
|
|
15
|
+
|
|
16
|
+
// Subtype information
|
|
17
|
+
subtype_schema: z.string(),
|
|
18
|
+
subtype_str: z.string(),
|
|
19
|
+
|
|
20
|
+
// Optional, only present when non-default relative to subtype
|
|
21
|
+
collation: z.string().nullable(),
|
|
22
|
+
|
|
23
|
+
// Canonical and diff functions when present (non-default)
|
|
24
|
+
canonical_function_schema: z.string().nullable(),
|
|
25
|
+
canonical_function_name: z.string().nullable(),
|
|
26
|
+
subtype_diff_schema: z.string().nullable(),
|
|
27
|
+
subtype_diff_name: z.string().nullable(),
|
|
28
|
+
|
|
29
|
+
// Optional: print only when non-default (see extractor logic)
|
|
30
|
+
subtype_opclass_schema: z.string().nullable(),
|
|
31
|
+
subtype_opclass_name: z.string().nullable(),
|
|
32
|
+
privileges: z.array(privilegePropsSchema),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
type RangePrivilegeProps = PrivilegeProps;
|
|
36
|
+
export type RangeProps = z.infer<typeof rangePropsSchema>;
|
|
37
|
+
|
|
38
|
+
export class Range extends BasePgModel {
|
|
39
|
+
public readonly schema: RangeProps["schema"];
|
|
40
|
+
public readonly name: RangeProps["name"];
|
|
41
|
+
public readonly owner: RangeProps["owner"];
|
|
42
|
+
public readonly comment: RangeProps["comment"];
|
|
43
|
+
|
|
44
|
+
public readonly subtype_schema: RangeProps["subtype_schema"];
|
|
45
|
+
public readonly subtype_str: RangeProps["subtype_str"];
|
|
46
|
+
|
|
47
|
+
public readonly collation: RangeProps["collation"];
|
|
48
|
+
|
|
49
|
+
public readonly canonical_function_schema: RangeProps["canonical_function_schema"];
|
|
50
|
+
public readonly canonical_function_name: RangeProps["canonical_function_name"];
|
|
51
|
+
public readonly subtype_diff_schema: RangeProps["subtype_diff_schema"];
|
|
52
|
+
public readonly subtype_diff_name: RangeProps["subtype_diff_name"];
|
|
53
|
+
|
|
54
|
+
public readonly subtype_opclass_schema: RangeProps["subtype_opclass_schema"];
|
|
55
|
+
public readonly subtype_opclass_name: RangeProps["subtype_opclass_name"];
|
|
56
|
+
public readonly privileges: RangePrivilegeProps[];
|
|
57
|
+
|
|
58
|
+
constructor(props: RangeProps) {
|
|
59
|
+
super();
|
|
60
|
+
|
|
61
|
+
// Identity fields
|
|
62
|
+
this.schema = props.schema;
|
|
63
|
+
this.name = props.name;
|
|
64
|
+
|
|
65
|
+
// Data fields
|
|
66
|
+
this.owner = props.owner;
|
|
67
|
+
this.comment = props.comment;
|
|
68
|
+
this.subtype_schema = props.subtype_schema;
|
|
69
|
+
this.subtype_str = props.subtype_str;
|
|
70
|
+
this.collation = props.collation;
|
|
71
|
+
this.canonical_function_schema = props.canonical_function_schema;
|
|
72
|
+
this.canonical_function_name = props.canonical_function_name;
|
|
73
|
+
this.subtype_diff_schema = props.subtype_diff_schema;
|
|
74
|
+
this.subtype_diff_name = props.subtype_diff_name;
|
|
75
|
+
this.subtype_opclass_schema = props.subtype_opclass_schema;
|
|
76
|
+
this.subtype_opclass_name = props.subtype_opclass_name;
|
|
77
|
+
this.privileges = props.privileges;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get stableId(): `type:${string}` {
|
|
81
|
+
return `type:${this.schema}.${this.name}`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get identityFields() {
|
|
85
|
+
return {
|
|
86
|
+
schema: this.schema,
|
|
87
|
+
name: this.name,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
get dataFields() {
|
|
92
|
+
return {
|
|
93
|
+
owner: this.owner,
|
|
94
|
+
subtype_schema: this.subtype_schema,
|
|
95
|
+
subtype_str: this.subtype_str,
|
|
96
|
+
collation: this.collation,
|
|
97
|
+
canonical_function_schema: this.canonical_function_schema,
|
|
98
|
+
canonical_function_name: this.canonical_function_name,
|
|
99
|
+
subtype_diff_schema: this.subtype_diff_schema,
|
|
100
|
+
subtype_diff_name: this.subtype_diff_name,
|
|
101
|
+
subtype_opclass_schema: this.subtype_opclass_schema,
|
|
102
|
+
subtype_opclass_name: this.subtype_opclass_name,
|
|
103
|
+
comment: this.comment,
|
|
104
|
+
privileges: this.privileges,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Extract all range types from the database.
|
|
111
|
+
*
|
|
112
|
+
* We intentionally capture only non-default options for CREATE TYPE AS RANGE:
|
|
113
|
+
* - SUBTYPE is required and always present
|
|
114
|
+
* - SUBTYPE_OPCLASS is included only when it differs from the default btree opclass
|
|
115
|
+
* - COLLATION is included only when it differs from the subtype's typcollation
|
|
116
|
+
* - CANONICAL and SUBTYPE_DIFF are included only when set
|
|
117
|
+
* - MULTIRANGE_TYPE_NAME is not included (we currently do not attempt to infer
|
|
118
|
+
* whether it differs from the default auto-generated name)
|
|
119
|
+
*/
|
|
120
|
+
export async function extractRanges(pool: Pool): Promise<Range[]> {
|
|
121
|
+
const { rows } = await pool.query<RangeProps>(sql`
|
|
122
|
+
with extension_oids as (
|
|
123
|
+
select objid from pg_depend d
|
|
124
|
+
where d.refclassid = 'pg_extension'::regclass and d.classid = 'pg_type'::regclass
|
|
125
|
+
), default_btree_opclass as (
|
|
126
|
+
-- For each input type, find its default btree operator class
|
|
127
|
+
select oc2.opcintype as type_oid, oc2.oid as opclass_oid
|
|
128
|
+
from pg_opclass oc2
|
|
129
|
+
join pg_am am on am.oid = oc2.opcmethod and am.amname = 'btree'
|
|
130
|
+
where oc2.opcdefault
|
|
131
|
+
)
|
|
132
|
+
select
|
|
133
|
+
-- range type identity
|
|
134
|
+
t.typnamespace::regnamespace::text as schema,
|
|
135
|
+
quote_ident(t.typname) as name,
|
|
136
|
+
t.typowner::regrole::text as owner,
|
|
137
|
+
obj_description(t.oid, 'pg_type') as comment,
|
|
138
|
+
|
|
139
|
+
-- subtype info
|
|
140
|
+
subt.typnamespace::regnamespace::text as subtype_schema,
|
|
141
|
+
format_type(r.rngsubtype, 0) as subtype_str,
|
|
142
|
+
|
|
143
|
+
-- include collation only if not default
|
|
144
|
+
case when r.rngcollation is not null and r.rngcollation <> 0 and r.rngcollation <> subt.typcollation then quote_ident(c.collname) else null end as collation,
|
|
145
|
+
|
|
146
|
+
-- include canonical/subtype_diff when set
|
|
147
|
+
case when r.rngcanonical <> 0 then pn_subcanon.nspname::regnamespace::text else null end as canonical_function_schema,
|
|
148
|
+
case when r.rngcanonical <> 0 then quote_ident(p_subcanon.proname) else null end as canonical_function_name,
|
|
149
|
+
case when r.rngsubdiff <> 0 then pn_subdiff.nspname::regnamespace::text else null end as subtype_diff_schema,
|
|
150
|
+
case when r.rngsubdiff <> 0 then quote_ident(p_subdiff.proname) else null end as subtype_diff_name,
|
|
151
|
+
|
|
152
|
+
-- include opclass only when not default for btree
|
|
153
|
+
case when r.rngsubopc is not null and r.rngsubopc <> 0 and r.rngsubopc <> dbo.opclass_oid then opc.opcnamespace::regnamespace::text else null end as subtype_opclass_schema,
|
|
154
|
+
case when r.rngsubopc is not null and r.rngsubopc <> 0 and r.rngsubopc <> dbo.opclass_oid then quote_ident(opc.opcname) else null end as subtype_opclass_name,
|
|
155
|
+
|
|
156
|
+
-- privileges
|
|
157
|
+
coalesce(
|
|
158
|
+
(
|
|
159
|
+
select json_agg(
|
|
160
|
+
json_build_object(
|
|
161
|
+
'grantee', case when x.grantee = 0 then 'PUBLIC' else x.grantee::regrole::text end,
|
|
162
|
+
'privilege', x.privilege_type,
|
|
163
|
+
'grantable', x.is_grantable
|
|
164
|
+
)
|
|
165
|
+
order by x.grantee, x.privilege_type
|
|
166
|
+
)
|
|
167
|
+
from lateral aclexplode(COALESCE(t.typacl, acldefault('T', t.typowner))) as x(grantor, grantee, privilege_type, is_grantable)
|
|
168
|
+
), '[]'
|
|
169
|
+
) as privileges
|
|
170
|
+
from pg_catalog.pg_range r
|
|
171
|
+
join pg_catalog.pg_type t on t.oid = r.rngtypid
|
|
172
|
+
join pg_catalog.pg_type subt on subt.oid = r.rngsubtype
|
|
173
|
+
left join default_btree_opclass dbo on dbo.type_oid = r.rngsubtype
|
|
174
|
+
left join pg_catalog.pg_opclass opc on opc.oid = r.rngsubopc
|
|
175
|
+
left join pg_catalog.pg_collation c on c.oid = r.rngcollation
|
|
176
|
+
left join pg_catalog.pg_proc p_subcanon on p_subcanon.oid = r.rngcanonical
|
|
177
|
+
left join pg_catalog.pg_namespace pn_subcanon on pn_subcanon.oid = p_subcanon.pronamespace
|
|
178
|
+
left join pg_catalog.pg_proc p_subdiff on p_subdiff.oid = r.rngsubdiff
|
|
179
|
+
left join pg_catalog.pg_namespace pn_subdiff on pn_subdiff.oid = p_subdiff.pronamespace
|
|
180
|
+
left outer join extension_oids e on t.oid = e.objid
|
|
181
|
+
where not t.typnamespace::regnamespace::text like any(array['pg\_%', 'information\_schema'])
|
|
182
|
+
and e.objid is null
|
|
183
|
+
order by 1, 2
|
|
184
|
+
`);
|
|
185
|
+
const validated = rows.map((row: unknown) => rangePropsSchema.parse(row));
|
|
186
|
+
return validated.map((row: RangeProps) => new Range(row));
|
|
187
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CompositeTypeChange } from "./composite-type/changes/composite-type.types.ts";
|
|
2
|
+
import type { EnumChange } from "./enum/changes/enum.types.ts";
|
|
3
|
+
import type { RangeChange } from "./range/changes/range.types.ts";
|
|
4
|
+
|
|
5
|
+
export type TypeChange = CompositeTypeChange | EnumChange | RangeChange;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
type Comparator<T> = (a: T, b: T) => boolean;
|
|
2
|
+
|
|
3
|
+
type Indexable<T> = { [P in keyof T]: unknown };
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* JSON.stringify replacement that safely serializes BigInt values by converting
|
|
7
|
+
* them to strings. This ensures stable serialization for deep equality checks
|
|
8
|
+
* without throwing on BigInt instances.
|
|
9
|
+
*/
|
|
10
|
+
export function stringifyWithBigInt(value: unknown, space: number = 2): string {
|
|
11
|
+
return JSON.stringify(
|
|
12
|
+
value,
|
|
13
|
+
(_key, v) => (typeof v === "bigint" ? v.toString() : v),
|
|
14
|
+
space,
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function hasNonAlterableChanges<T, K extends keyof T>(
|
|
19
|
+
main: T,
|
|
20
|
+
branch: T,
|
|
21
|
+
keys: ReadonlyArray<K>,
|
|
22
|
+
comparators?: Partial<Record<K, Comparator<unknown>>>,
|
|
23
|
+
): boolean {
|
|
24
|
+
const mainIndexable = main as unknown as Indexable<T>;
|
|
25
|
+
const branchIndexable = branch as unknown as Indexable<T>;
|
|
26
|
+
for (const key of keys) {
|
|
27
|
+
// Prefer custom comparator when provided; fallback to strict equality
|
|
28
|
+
const equals =
|
|
29
|
+
(comparators?.[key] as Comparator<unknown>) ??
|
|
30
|
+
((a: unknown, b: unknown) => a === b);
|
|
31
|
+
if (!equals(mainIndexable[key], branchIndexable[key])) return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const deepEqual: Comparator<unknown> = (a: unknown, b: unknown) =>
|
|
37
|
+
stringifyWithBigInt(a) === stringifyWithBigInt(b);
|
|
38
|
+
|
|
39
|
+
// Helpers for stableId that aren't encoded in a class, mostly for sub-entities or meta entities.
|
|
40
|
+
export const stableId = {
|
|
41
|
+
schema(schema: string) {
|
|
42
|
+
return `schema:${schema}` as const;
|
|
43
|
+
},
|
|
44
|
+
table(schema: string, table: string) {
|
|
45
|
+
return `table:${schema}.${table}` as const;
|
|
46
|
+
},
|
|
47
|
+
view(schema: string, view: string) {
|
|
48
|
+
return `view:${schema}.${view}` as const;
|
|
49
|
+
},
|
|
50
|
+
materializedView(schema: string, view: string) {
|
|
51
|
+
return `materializedView:${schema}.${view}` as const;
|
|
52
|
+
},
|
|
53
|
+
acl(objectStableId: string, grantee: string) {
|
|
54
|
+
return `acl:${objectStableId}::grantee:${grantee}` as const;
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* 'defacl:' || grantor || ':' || objtype || ':' || coalesce('schema:' || in_schema, 'global') || ':grantee:' || grantee as dependent_stable_id,
|
|
59
|
+
*/
|
|
60
|
+
defacl(
|
|
61
|
+
grantor: string,
|
|
62
|
+
objtype: string,
|
|
63
|
+
schema: string | null,
|
|
64
|
+
grantee: string,
|
|
65
|
+
) {
|
|
66
|
+
return `defacl:${grantor}:${objtype}:${schema ? `schema:${schema}` : "global"}:grantee:${grantee}` as const;
|
|
67
|
+
},
|
|
68
|
+
column(schema: string, table: string, column: string) {
|
|
69
|
+
return `column:${schema}.${table}.${column}` as const;
|
|
70
|
+
},
|
|
71
|
+
constraint(schema: string, table: string, constraint: string) {
|
|
72
|
+
return `constraint:${schema}.${table}.${constraint}` as const;
|
|
73
|
+
},
|
|
74
|
+
comment(objectStableId: string) {
|
|
75
|
+
return `comment:${objectStableId}` as const;
|
|
76
|
+
},
|
|
77
|
+
role(role: string) {
|
|
78
|
+
return `role:${role}` as const;
|
|
79
|
+
},
|
|
80
|
+
type(schema: string, name: string) {
|
|
81
|
+
return `type:${schema}.${name}` as const;
|
|
82
|
+
},
|
|
83
|
+
collation(schema: string, name: string) {
|
|
84
|
+
return `collation:${schema}.${name}` as const;
|
|
85
|
+
},
|
|
86
|
+
procedure(schema: string, name: string, args: string = "") {
|
|
87
|
+
return `procedure:${schema}.${name}(${args})` as const;
|
|
88
|
+
},
|
|
89
|
+
membership(role: string, member: string) {
|
|
90
|
+
return `membership:${role}->${member}` as const;
|
|
91
|
+
},
|
|
92
|
+
foreignDataWrapper(name: string) {
|
|
93
|
+
return `foreignDataWrapper:${name}` as const;
|
|
94
|
+
},
|
|
95
|
+
server(name: string) {
|
|
96
|
+
return `server:${name}` as const;
|
|
97
|
+
},
|
|
98
|
+
userMapping(server: string, user: string) {
|
|
99
|
+
return `userMapping:${server}:${user}` as const;
|
|
100
|
+
},
|
|
101
|
+
foreignTable(schema: string, name: string) {
|
|
102
|
+
return `foreignTable:${schema}.${name}` as const;
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Check if a schema name represents a user-defined type (not pg_catalog or information_schema).
|
|
108
|
+
* Used to filter out system types when building dependency lists.
|
|
109
|
+
*/
|
|
110
|
+
export function isUserDefinedTypeSchema(
|
|
111
|
+
schema: string | null | undefined,
|
|
112
|
+
): boolean {
|
|
113
|
+
return (
|
|
114
|
+
schema != null && schema !== "pg_catalog" && schema !== "information_schema"
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Parse a procedure reference string (from regprocedure::text) to extract schema and function name.
|
|
120
|
+
* Format: "schema.function_name(argtypes)" or "function_name(argtypes)"
|
|
121
|
+
* Returns null if parsing fails or if it's a system procedure.
|
|
122
|
+
*/
|
|
123
|
+
export function parseProcedureReference(
|
|
124
|
+
procRef: string | null | undefined,
|
|
125
|
+
): { schema: string; name: string } | null {
|
|
126
|
+
if (!procRef) return null;
|
|
127
|
+
|
|
128
|
+
// Format is "schema.function_name(argtypes)" or "function_name(argtypes)"
|
|
129
|
+
// Extract everything before the opening parenthesis
|
|
130
|
+
const match = procRef.match(/^([^(]+)\(/);
|
|
131
|
+
if (!match) return null;
|
|
132
|
+
|
|
133
|
+
const qualifiedName = match[1];
|
|
134
|
+
const parts = qualifiedName.split(".");
|
|
135
|
+
if (parts.length === 1) {
|
|
136
|
+
// No schema prefix - assume current schema (we can't determine it here)
|
|
137
|
+
// For now, skip these as we need schema info
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
if (parts.length === 2) {
|
|
141
|
+
const [schema, name] = parts;
|
|
142
|
+
if (isUserDefinedTypeSchema(schema)) {
|
|
143
|
+
return { schema, name };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Parse a type string (from format_type) to extract schema and type name if it's schema-qualified.
|
|
151
|
+
* Format: "type_name" or "schema.type_name" or "schema.type_name[]"
|
|
152
|
+
* Returns null if it's not schema-qualified or if it's a system type.
|
|
153
|
+
*/
|
|
154
|
+
export function parseTypeString(
|
|
155
|
+
typeStr: string | null | undefined,
|
|
156
|
+
): { schema: string; name: string } | null {
|
|
157
|
+
if (!typeStr) return null;
|
|
158
|
+
|
|
159
|
+
// Remove array brackets for parsing
|
|
160
|
+
const baseType = typeStr.replace(/\[\]+$/, "");
|
|
161
|
+
|
|
162
|
+
// Check if it's schema-qualified (contains a dot)
|
|
163
|
+
const parts = baseType.split(".");
|
|
164
|
+
if (parts.length === 2) {
|
|
165
|
+
const [schema, name] = parts;
|
|
166
|
+
if (isUserDefinedTypeSchema(schema)) {
|
|
167
|
+
return { schema, name };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
3
|
+
import { View, type ViewProps } from "../view.model.ts";
|
|
4
|
+
import {
|
|
5
|
+
AlterViewChangeOwner,
|
|
6
|
+
AlterViewResetOptions,
|
|
7
|
+
AlterViewSetOptions,
|
|
8
|
+
} from "./view.alter.ts";
|
|
9
|
+
|
|
10
|
+
describe.concurrent("view", () => {
|
|
11
|
+
describe("alter", () => {
|
|
12
|
+
test("change owner", async () => {
|
|
13
|
+
const props: Omit<ViewProps, "owner"> = {
|
|
14
|
+
schema: "public",
|
|
15
|
+
name: "test_view",
|
|
16
|
+
definition: "SELECT * FROM test_table",
|
|
17
|
+
row_security: false,
|
|
18
|
+
force_row_security: false,
|
|
19
|
+
has_indexes: false,
|
|
20
|
+
has_rules: false,
|
|
21
|
+
has_triggers: false,
|
|
22
|
+
has_subclasses: false,
|
|
23
|
+
is_populated: false,
|
|
24
|
+
replica_identity: "d",
|
|
25
|
+
is_partition: false,
|
|
26
|
+
options: null,
|
|
27
|
+
partition_bound: null,
|
|
28
|
+
comment: null,
|
|
29
|
+
columns: [],
|
|
30
|
+
privileges: [],
|
|
31
|
+
};
|
|
32
|
+
const main = new View({
|
|
33
|
+
...props,
|
|
34
|
+
owner: "old_owner",
|
|
35
|
+
});
|
|
36
|
+
// branch no longer needed for constructor; we only pass explicit owner
|
|
37
|
+
|
|
38
|
+
const change = new AlterViewChangeOwner({
|
|
39
|
+
view: main,
|
|
40
|
+
owner: "new_owner",
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await assertValidSql(change.serialize());
|
|
44
|
+
|
|
45
|
+
expect(change.serialize()).toBe(
|
|
46
|
+
"ALTER VIEW public.test_view OWNER TO new_owner",
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("set options", async () => {
|
|
52
|
+
const props: Omit<ViewProps, "options"> = {
|
|
53
|
+
schema: "public",
|
|
54
|
+
name: "test_view",
|
|
55
|
+
definition: "SELECT * FROM test_table",
|
|
56
|
+
row_security: false,
|
|
57
|
+
force_row_security: false,
|
|
58
|
+
has_indexes: false,
|
|
59
|
+
has_rules: false,
|
|
60
|
+
has_triggers: false,
|
|
61
|
+
has_subclasses: false,
|
|
62
|
+
is_populated: false,
|
|
63
|
+
replica_identity: "d",
|
|
64
|
+
is_partition: false,
|
|
65
|
+
partition_bound: null,
|
|
66
|
+
owner: "test",
|
|
67
|
+
comment: null,
|
|
68
|
+
columns: [],
|
|
69
|
+
privileges: [],
|
|
70
|
+
};
|
|
71
|
+
const main = new View({ ...props, options: ["security_barrier=true"] });
|
|
72
|
+
// branch no longer needed; we pass explicit options list
|
|
73
|
+
|
|
74
|
+
const change = new AlterViewSetOptions({
|
|
75
|
+
view: main,
|
|
76
|
+
options: ["security_barrier=false"],
|
|
77
|
+
});
|
|
78
|
+
await assertValidSql(change.serialize());
|
|
79
|
+
expect(change.serialize()).toBe(
|
|
80
|
+
"ALTER VIEW public.test_view SET (security_barrier=false)",
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("reset options", async () => {
|
|
85
|
+
const view = new View({
|
|
86
|
+
schema: "public",
|
|
87
|
+
name: "test_view",
|
|
88
|
+
definition: "SELECT * FROM test_table",
|
|
89
|
+
row_security: false,
|
|
90
|
+
force_row_security: false,
|
|
91
|
+
has_indexes: false,
|
|
92
|
+
has_rules: false,
|
|
93
|
+
has_triggers: false,
|
|
94
|
+
has_subclasses: false,
|
|
95
|
+
is_populated: false,
|
|
96
|
+
replica_identity: "d",
|
|
97
|
+
is_partition: false,
|
|
98
|
+
options: ["security_barrier=true", "check_option=local"],
|
|
99
|
+
partition_bound: null,
|
|
100
|
+
owner: "test",
|
|
101
|
+
comment: null,
|
|
102
|
+
columns: [],
|
|
103
|
+
privileges: [],
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const change = new AlterViewResetOptions({
|
|
107
|
+
view,
|
|
108
|
+
params: ["check_option"],
|
|
109
|
+
});
|
|
110
|
+
await assertValidSql(change.serialize());
|
|
111
|
+
expect(change.serialize()).toBe(
|
|
112
|
+
"ALTER VIEW public.test_view RESET (check_option)",
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { View } from "../view.model.ts";
|
|
2
|
+
import { AlterViewChange } from "./view.base.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Alter a view.
|
|
6
|
+
*
|
|
7
|
+
* @see https://www.postgresql.org/docs/17/sql-alterview.html
|
|
8
|
+
*
|
|
9
|
+
* Synopsis
|
|
10
|
+
* ```sql
|
|
11
|
+
* ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
|
|
12
|
+
* ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
|
|
13
|
+
* ALTER VIEW [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
|
|
14
|
+
* ALTER VIEW [ IF EXISTS ] name RENAME [ COLUMN ] column_name TO new_column_name
|
|
15
|
+
* ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
|
|
16
|
+
* ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
|
|
17
|
+
* ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
|
|
18
|
+
* ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export type AlterView =
|
|
23
|
+
| AlterViewChangeOwner
|
|
24
|
+
| AlterViewResetOptions
|
|
25
|
+
| AlterViewSetOptions;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* ALTER VIEW ... OWNER TO ...
|
|
29
|
+
*/
|
|
30
|
+
export class AlterViewChangeOwner extends AlterViewChange {
|
|
31
|
+
public readonly view: View;
|
|
32
|
+
public readonly owner: string;
|
|
33
|
+
public readonly scope = "object" as const;
|
|
34
|
+
|
|
35
|
+
constructor(props: { view: View; owner: string }) {
|
|
36
|
+
super();
|
|
37
|
+
this.view = props.view;
|
|
38
|
+
this.owner = props.owner;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get requires() {
|
|
42
|
+
return [this.view.stableId];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
serialize(): string {
|
|
46
|
+
return [
|
|
47
|
+
"ALTER VIEW",
|
|
48
|
+
`${this.view.schema}.${this.view.name}`,
|
|
49
|
+
"OWNER TO",
|
|
50
|
+
this.owner,
|
|
51
|
+
].join(" ");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// NOTE: ReplaceView removed. Non-alterable changes are emitted as CREATE OR REPLACE in view.diff.ts.
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* ALTER VIEW ... SET ( ... )
|
|
59
|
+
*/
|
|
60
|
+
export class AlterViewSetOptions extends AlterViewChange {
|
|
61
|
+
public readonly view: View;
|
|
62
|
+
public readonly options: string[];
|
|
63
|
+
public readonly scope = "object" as const;
|
|
64
|
+
|
|
65
|
+
constructor(props: { view: View; options: string[] }) {
|
|
66
|
+
super();
|
|
67
|
+
this.view = props.view;
|
|
68
|
+
this.options = props.options;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
get requires() {
|
|
72
|
+
return [this.view.stableId];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
serialize(): string {
|
|
76
|
+
const opts = this.options.join(", ");
|
|
77
|
+
return [
|
|
78
|
+
"ALTER VIEW",
|
|
79
|
+
`${this.view.schema}.${this.view.name}`,
|
|
80
|
+
"SET",
|
|
81
|
+
`(${opts})`,
|
|
82
|
+
].join(" ");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* ALTER VIEW ... RESET ( ... )
|
|
88
|
+
*/
|
|
89
|
+
export class AlterViewResetOptions extends AlterViewChange {
|
|
90
|
+
public readonly view: View;
|
|
91
|
+
public readonly params: string[];
|
|
92
|
+
public readonly scope = "object" as const;
|
|
93
|
+
|
|
94
|
+
constructor(props: { view: View; params: string[] }) {
|
|
95
|
+
super();
|
|
96
|
+
this.view = props.view;
|
|
97
|
+
this.params = props.params;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
get requires() {
|
|
101
|
+
return [this.view.stableId];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
serialize(): string {
|
|
105
|
+
return [
|
|
106
|
+
"ALTER VIEW",
|
|
107
|
+
`${this.view.schema}.${this.view.name}`,
|
|
108
|
+
"RESET",
|
|
109
|
+
`(${this.params.join(", ")})`,
|
|
110
|
+
].join(" ");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseChange } from "../../base.change.ts";
|
|
2
|
+
import type { View } from "../view.model.ts";
|
|
3
|
+
|
|
4
|
+
abstract class BaseViewChange extends BaseChange {
|
|
5
|
+
abstract readonly view: View;
|
|
6
|
+
abstract readonly scope: "object" | "comment" | "privilege";
|
|
7
|
+
readonly objectType: "view" = "view";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export abstract class CreateViewChange extends BaseViewChange {
|
|
11
|
+
readonly operation = "create" as const;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export abstract class AlterViewChange extends BaseViewChange {
|
|
15
|
+
readonly operation = "alter" as const;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export abstract class DropViewChange extends BaseViewChange {
|
|
19
|
+
readonly operation = "drop" as const;
|
|
20
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../base.change.ts";
|
|
2
|
+
import { stableId } from "../../utils.ts";
|
|
3
|
+
import type { View } from "../view.model.ts";
|
|
4
|
+
import { CreateViewChange, DropViewChange } from "./view.base.ts";
|
|
5
|
+
|
|
6
|
+
export type CommentView = CreateCommentOnView | DropCommentOnView;
|
|
7
|
+
|
|
8
|
+
export class CreateCommentOnView extends CreateViewChange {
|
|
9
|
+
public readonly view: View;
|
|
10
|
+
public readonly scope = "comment" as const;
|
|
11
|
+
|
|
12
|
+
constructor(props: { view: View }) {
|
|
13
|
+
super();
|
|
14
|
+
this.view = props.view;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get creates() {
|
|
18
|
+
return [stableId.comment(this.view.stableId)];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get requires() {
|
|
22
|
+
return [this.view.stableId];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
serialize(): string {
|
|
26
|
+
return [
|
|
27
|
+
"COMMENT ON VIEW",
|
|
28
|
+
`${this.view.schema}.${this.view.name}`,
|
|
29
|
+
"IS",
|
|
30
|
+
quoteLiteral(this.view.comment as string),
|
|
31
|
+
].join(" ");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class DropCommentOnView extends DropViewChange {
|
|
36
|
+
public readonly view: View;
|
|
37
|
+
public readonly scope = "comment" as const;
|
|
38
|
+
|
|
39
|
+
constructor(props: { view: View }) {
|
|
40
|
+
super();
|
|
41
|
+
this.view = props.view;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get drops() {
|
|
45
|
+
return [stableId.comment(this.view.stableId)];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get requires() {
|
|
49
|
+
return [stableId.comment(this.view.stableId), this.view.stableId];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
serialize(): string {
|
|
53
|
+
return [
|
|
54
|
+
"COMMENT ON VIEW",
|
|
55
|
+
`${this.view.schema}.${this.view.name}`,
|
|
56
|
+
"IS NULL",
|
|
57
|
+
].join(" ");
|
|
58
|
+
}
|
|
59
|
+
}
|