@supabase/pg-delta 1.0.0-alpha.4 → 1.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -23
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +245 -0
- package/dist/cli/commands/plan.js +19 -6
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +64 -48
- package/dist/core/catalog.model.d.ts +14 -1
- package/dist/core/catalog.model.js +103 -1
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +63 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +38 -1
- package/dist/core/integrations/filter/dsl.js +20 -2
- package/dist/core/integrations/filter/extractors.js +42 -0
- package/dist/core/integrations/integration-dsl.d.ts +10 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +9 -0
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
- package/dist/core/objects/aggregate/aggregate.model.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
- package/dist/core/objects/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.create.js +4 -2
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.js +1 -1
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
- package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +16 -77
- package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
- package/dist/core/objects/procedure/procedure.model.js +1 -1
- package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
- package/dist/core/objects/publication/changes/publication.alter.js +0 -14
- package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +4 -3
- package/dist/core/objects/role/role.model.js +118 -12
- package/dist/core/objects/rule/rule.model.d.ts +1 -1
- package/dist/core/objects/schema/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.js +1 -1
- package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
- package/dist/core/objects/sequence/sequence.diff.js +16 -79
- package/dist/core/objects/sequence/sequence.model.js +1 -1
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/table/changes/table.create.js +3 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +26 -157
- package/dist/core/objects/table/table.model.d.ts +23 -22
- package/dist/core/objects/table/table.model.js +1 -1
- package/dist/core/objects/trigger/changes/trigger.create.js +2 -4
- package/dist/core/objects/trigger/trigger.model.d.ts +8 -0
- package/dist/core/objects/trigger/trigger.model.js +11 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
- package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.js +1 -1
- package/dist/core/objects/type/range/changes/range.create.js +6 -3
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.js +1 -1
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +16 -158
- package/dist/core/objects/view/view.model.d.ts +18 -4
- package/dist/core/objects/view/view.model.js +3 -13
- package/dist/core/plan/apply.js +9 -26
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +134 -174
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/fixtures.js +3 -5
- package/dist/core/plan/sql-format/keyword-case.js +26 -1
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/types.d.ts +6 -0
- package/dist/core/postgres-config.d.ts +14 -0
- package/dist/core/postgres-config.js +53 -2
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +31 -23
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -1
- package/package.json +21 -4
- package/src/cli/app.ts +27 -3
- package/src/cli/bin/cli.ts +6 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +330 -0
- package/src/cli/commands/plan.ts +28 -7
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/tree/tree.ts +3 -2
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +44 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +79 -78
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +127 -1
- package/src/core/catalog.snapshot.test.ts +464 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/expand-replace-dependencies.test.ts +70 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +574 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +129 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +211 -0
- package/src/core/integrations/filter/dsl.ts +65 -3
- package/src/core/integrations/filter/extractors.test.ts +244 -0
- package/src/core/integrations/filter/extractors.ts +42 -0
- package/src/core/integrations/integration-dsl.ts +10 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -0
- package/src/core/integrations/supabase.ts +9 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +39 -95
- package/src/core/objects/aggregate/aggregate.model.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +3 -1
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +5 -2
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +6 -3
- package/src/core/objects/aggregate/changes/aggregate.create.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +7 -3
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +1 -1
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +9 -3
- package/src/core/objects/base.privilege-diff.ts +178 -30
- package/src/core/objects/base.privilege.ts +9 -2
- package/src/core/objects/collation/changes/collation.alter.test.ts +7 -2
- package/src/core/objects/collation/changes/collation.create.test.ts +7 -2
- package/src/core/objects/collation/changes/collation.drop.test.ts +4 -1
- package/src/core/objects/collation/collation.diff.test.ts +9 -12
- package/src/core/objects/collation/collation.diff.ts +2 -1
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +28 -9
- package/src/core/objects/domain/changes/domain.create.test.ts +32 -2
- package/src/core/objects/domain/changes/domain.create.ts +7 -1
- package/src/core/objects/domain/changes/domain.drop.test.ts +4 -1
- package/src/core/objects/domain/domain.diff.ts +39 -102
- package/src/core/objects/domain/domain.model.ts +1 -1
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +10 -3
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +4 -1
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +4 -1
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +12 -7
- package/src/core/objects/event-trigger/event-trigger.diff.ts +2 -1
- package/src/core/objects/extension/changes/extension.alter.test.ts +7 -2
- package/src/core/objects/extension/changes/extension.create.test.ts +4 -1
- package/src/core/objects/extension/changes/extension.drop.test.ts +4 -1
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +16 -5
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +51 -16
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +111 -4
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +31 -101
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +2 -2
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +46 -15
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +13 -4
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +39 -102
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +1 -1
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +22 -7
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +19 -6
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +4 -1
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +31 -101
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +13 -4
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +16 -5
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +10 -3
- package/src/core/objects/index/changes/index.alter.test.ts +13 -4
- package/src/core/objects/index/changes/index.create.test.ts +4 -1
- package/src/core/objects/index/changes/index.drop.test.ts +4 -1
- package/src/core/objects/language/changes/language.alter.test.ts +4 -1
- package/src/core/objects/language/changes/language.create.test.ts +4 -1
- package/src/core/objects/language/changes/language.drop.test.ts +4 -1
- package/src/core/objects/language/language.diff.test.ts +86 -4
- package/src/core/objects/language/language.diff.ts +17 -49
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +10 -3
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +7 -2
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +4 -1
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +162 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +41 -191
- package/src/core/objects/materialized-view/materialized-view.model.ts +1 -1
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +121 -49
- package/src/core/objects/procedure/changes/procedure.alter.ts +15 -12
- package/src/core/objects/procedure/changes/procedure.create.test.ts +4 -1
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +7 -2
- package/src/core/objects/procedure/procedure.diff.ts +39 -102
- package/src/core/objects/procedure/procedure.model.ts +1 -1
- package/src/core/objects/publication/changes/publication.alter.test.ts +15 -21
- package/src/core/objects/publication/changes/publication.alter.ts +0 -18
- package/src/core/objects/publication/changes/publication.comment.test.ts +5 -2
- package/src/core/objects/publication/changes/publication.create.test.ts +5 -2
- package/src/core/objects/publication/changes/publication.drop.test.ts +3 -1
- package/src/core/objects/publication/changes/publication.types.ts +0 -2
- package/src/core/objects/publication/publication.diff.test.ts +24 -19
- package/src/core/objects/publication/publication.diff.ts +9 -15
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +31 -14
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +3 -3
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +10 -3
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +4 -1
- package/src/core/objects/role/changes/role.alter.test.ts +31 -15
- package/src/core/objects/role/changes/role.create.test.ts +6 -2
- package/src/core/objects/role/changes/role.drop.test.ts +4 -1
- package/src/core/objects/role/role.diff.test.ts +235 -0
- package/src/core/objects/role/role.diff.ts +21 -1
- package/src/core/objects/role/role.model.ts +122 -14
- package/src/core/objects/rule/changes/rule.alter.test.ts +7 -3
- package/src/core/objects/rule/changes/rule.comment.test.ts +5 -2
- package/src/core/objects/rule/changes/rule.create.test.ts +6 -2
- package/src/core/objects/rule/changes/rule.drop.test.ts +3 -1
- package/src/core/objects/schema/changes/schema.alter.test.ts +4 -1
- package/src/core/objects/schema/changes/schema.create.test.ts +4 -1
- package/src/core/objects/schema/changes/schema.drop.test.ts +4 -1
- package/src/core/objects/schema/schema.diff.ts +39 -102
- package/src/core/objects/schema/schema.model.ts +1 -1
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +11 -5
- package/src/core/objects/sequence/changes/sequence.create.test.ts +8 -3
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +4 -1
- package/src/core/objects/sequence/sequence.diff.test.ts +114 -0
- package/src/core/objects/sequence/sequence.diff.ts +39 -104
- package/src/core/objects/sequence/sequence.model.ts +1 -1
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +15 -5
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +5 -2
- package/src/core/objects/subscription/changes/subscription.create.test.ts +5 -2
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +3 -1
- package/src/core/objects/subscription/subscription.diff.test.ts +16 -11
- package/src/core/objects/subscription/subscription.diff.ts +2 -1
- package/src/core/objects/table/changes/table.alter.test.ts +38 -15
- package/src/core/objects/table/changes/table.create.test.ts +41 -3
- package/src/core/objects/table/changes/table.create.ts +4 -0
- package/src/core/objects/table/changes/table.drop.test.ts +3 -1
- package/src/core/objects/table/table.diff.test.ts +157 -0
- package/src/core/objects/table/table.diff.ts +54 -190
- package/src/core/objects/table/table.model.ts +1 -1
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +8 -4
- package/src/core/objects/trigger/changes/trigger.create.test.ts +5 -1
- package/src/core/objects/trigger/changes/trigger.create.ts +7 -4
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +5 -1
- package/src/core/objects/trigger/trigger.diff.test.ts +1 -0
- package/src/core/objects/trigger/trigger.model.ts +12 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +10 -4
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +7 -2
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +4 -1
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +78 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +39 -101
- package/src/core/objects/type/composite-type/composite-type.model.ts +2 -1
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +14 -5
- package/src/core/objects/type/enum/changes/enum.create.test.ts +4 -1
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +4 -1
- package/src/core/objects/type/enum/enum.diff.test.ts +181 -0
- package/src/core/objects/type/enum/enum.diff.ts +58 -146
- package/src/core/objects/type/enum/enum.model.ts +1 -1
- package/src/core/objects/type/range/changes/range.alter.test.ts +3 -1
- package/src/core/objects/type/range/changes/range.create.test.ts +5 -2
- package/src/core/objects/type/range/changes/range.create.ts +6 -2
- package/src/core/objects/type/range/changes/range.drop.test.ts +3 -1
- package/src/core/objects/type/range/range.diff.test.ts +77 -0
- package/src/core/objects/type/range/range.diff.ts +39 -101
- package/src/core/objects/type/range/range.model.ts +1 -1
- package/src/core/objects/view/changes/view.alter.test.ts +8 -3
- package/src/core/objects/view/changes/view.create.test.ts +7 -2
- package/src/core/objects/view/changes/view.drop.test.ts +4 -1
- package/src/core/objects/view/view.diff.test.ts +82 -0
- package/src/core/objects/view/view.diff.ts +41 -191
- package/src/core/objects/view/view.model.ts +3 -17
- package/src/core/plan/apply.ts +9 -27
- package/src/core/plan/create.ts +173 -237
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +18 -4
- package/src/core/plan/sql-format/fixtures.ts +2 -5
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +52 -0
- package/src/core/plan/sql-format/format-off.test.ts +14 -17
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +27 -22
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +17 -21
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +25 -20
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +23 -20
- package/src/core/plan/sql-format/keyword-case.ts +36 -1
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/types.ts +6 -0
- package/src/core/postgres-config.ts +71 -2
- package/src/core/sort/graph-builder.ts +12 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +32 -25
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +26 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import { Procedure, type ProcedureProps } from "../procedure.model.ts";
|
|
3
4
|
import {
|
|
4
5
|
AlterProcedureChangeOwner,
|
|
@@ -12,7 +13,7 @@ import {
|
|
|
12
13
|
|
|
13
14
|
describe.concurrent("procedure", () => {
|
|
14
15
|
describe("alter", () => {
|
|
15
|
-
test("change owner", () => {
|
|
16
|
+
test("change owner", async () => {
|
|
16
17
|
const props: Omit<ProcedureProps, "owner"> = {
|
|
17
18
|
schema: "public",
|
|
18
19
|
name: "test_procedure",
|
|
@@ -54,12 +55,14 @@ describe.concurrent("procedure", () => {
|
|
|
54
55
|
owner: "new_owner",
|
|
55
56
|
});
|
|
56
57
|
|
|
58
|
+
await assertValidSql(change.serialize());
|
|
59
|
+
|
|
57
60
|
expect(change.serialize()).toBe(
|
|
58
|
-
"ALTER PROCEDURE public.test_procedure OWNER TO new_owner",
|
|
61
|
+
"ALTER PROCEDURE public.test_procedure() OWNER TO new_owner",
|
|
59
62
|
);
|
|
60
63
|
});
|
|
61
64
|
|
|
62
|
-
test("change owner (function)", () => {
|
|
65
|
+
test("change owner (function)", async () => {
|
|
63
66
|
const props: Omit<ProcedureProps, "owner"> = {
|
|
64
67
|
schema: "public",
|
|
65
68
|
name: "test_function",
|
|
@@ -101,12 +104,56 @@ describe.concurrent("procedure", () => {
|
|
|
101
104
|
owner: "new_owner",
|
|
102
105
|
});
|
|
103
106
|
|
|
107
|
+
await assertValidSql(change.serialize());
|
|
108
|
+
|
|
109
|
+
expect(change.serialize()).toBe(
|
|
110
|
+
"ALTER FUNCTION public.test_function() OWNER TO new_owner",
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("change owner with argument types (overloaded function)", async () => {
|
|
115
|
+
const procedure = new Procedure({
|
|
116
|
+
schema: "public",
|
|
117
|
+
name: "my_func",
|
|
118
|
+
kind: "f",
|
|
119
|
+
return_type: "void",
|
|
120
|
+
return_type_schema: "pg_catalog",
|
|
121
|
+
language: "plpgsql",
|
|
122
|
+
security_definer: false,
|
|
123
|
+
volatility: "v",
|
|
124
|
+
parallel_safety: "u",
|
|
125
|
+
is_strict: false,
|
|
126
|
+
leakproof: false,
|
|
127
|
+
returns_set: false,
|
|
128
|
+
argument_count: 2,
|
|
129
|
+
argument_default_count: 0,
|
|
130
|
+
argument_names: ["a", "b"],
|
|
131
|
+
argument_types: ["integer", "text"],
|
|
132
|
+
all_argument_types: ["integer", "text"],
|
|
133
|
+
argument_modes: null,
|
|
134
|
+
argument_defaults: null,
|
|
135
|
+
source_code: null,
|
|
136
|
+
binary_path: null,
|
|
137
|
+
sql_body: null,
|
|
138
|
+
definition: "CREATE FUNCTION public.my_func(integer, text) ...",
|
|
139
|
+
config: null,
|
|
140
|
+
execution_cost: 0,
|
|
141
|
+
result_rows: 0,
|
|
142
|
+
comment: null,
|
|
143
|
+
privileges: [],
|
|
144
|
+
owner: "old_owner",
|
|
145
|
+
});
|
|
146
|
+
const change = new AlterProcedureChangeOwner({
|
|
147
|
+
procedure,
|
|
148
|
+
owner: "postgres",
|
|
149
|
+
});
|
|
150
|
+
await assertValidSql(change.serialize());
|
|
104
151
|
expect(change.serialize()).toBe(
|
|
105
|
-
"ALTER FUNCTION public.
|
|
152
|
+
"ALTER FUNCTION public.my_func(integer, text) OWNER TO postgres",
|
|
106
153
|
);
|
|
107
154
|
});
|
|
108
155
|
|
|
109
|
-
test("set security definer", () => {
|
|
156
|
+
test("set security definer", async () => {
|
|
110
157
|
const props: Omit<ProcedureProps, "security_definer"> = {
|
|
111
158
|
schema: "public",
|
|
112
159
|
name: "test_function",
|
|
@@ -143,12 +190,13 @@ describe.concurrent("procedure", () => {
|
|
|
143
190
|
procedure,
|
|
144
191
|
securityDefiner: true,
|
|
145
192
|
});
|
|
193
|
+
await assertValidSql(change.serialize());
|
|
146
194
|
expect(change.serialize()).toBe(
|
|
147
|
-
"ALTER FUNCTION public.test_function SECURITY DEFINER",
|
|
195
|
+
"ALTER FUNCTION public.test_function() SECURITY DEFINER",
|
|
148
196
|
);
|
|
149
197
|
});
|
|
150
198
|
|
|
151
|
-
test("unset security definer (invoker)", () => {
|
|
199
|
+
test("unset security definer (invoker)", async () => {
|
|
152
200
|
const props: Omit<ProcedureProps, "security_definer"> = {
|
|
153
201
|
schema: "public",
|
|
154
202
|
name: "test_function",
|
|
@@ -185,12 +233,13 @@ describe.concurrent("procedure", () => {
|
|
|
185
233
|
procedure,
|
|
186
234
|
securityDefiner: false,
|
|
187
235
|
});
|
|
236
|
+
await assertValidSql(change.serialize());
|
|
188
237
|
expect(change.serialize()).toBe(
|
|
189
|
-
"ALTER FUNCTION public.test_function SECURITY INVOKER",
|
|
238
|
+
"ALTER FUNCTION public.test_function() SECURITY INVOKER",
|
|
190
239
|
);
|
|
191
240
|
});
|
|
192
241
|
|
|
193
|
-
test("set and reset config", () => {
|
|
242
|
+
test("set and reset config", async () => {
|
|
194
243
|
const base: Omit<ProcedureProps, "config"> = {
|
|
195
244
|
schema: "public",
|
|
196
245
|
name: "test_function",
|
|
@@ -243,18 +292,21 @@ describe.concurrent("procedure", () => {
|
|
|
243
292
|
key: "work_mem",
|
|
244
293
|
value: "64MB",
|
|
245
294
|
});
|
|
295
|
+
await assertValidSql(change1.serialize());
|
|
246
296
|
expect(change1.serialize()).toBe(
|
|
247
|
-
"ALTER FUNCTION public.test_function RESET search_path",
|
|
297
|
+
"ALTER FUNCTION public.test_function() RESET search_path",
|
|
248
298
|
);
|
|
299
|
+
await assertValidSql(change2.serialize());
|
|
249
300
|
expect(change2.serialize()).toBe(
|
|
250
|
-
"ALTER FUNCTION public.test_function SET search_path TO pg_temp",
|
|
301
|
+
"ALTER FUNCTION public.test_function() SET search_path TO pg_temp",
|
|
251
302
|
);
|
|
303
|
+
await assertValidSql(change3.serialize());
|
|
252
304
|
expect(change3.serialize()).toBe(
|
|
253
|
-
"ALTER FUNCTION public.test_function SET work_mem TO '64MB'",
|
|
305
|
+
"ALTER FUNCTION public.test_function() SET work_mem TO '64MB'",
|
|
254
306
|
);
|
|
255
307
|
});
|
|
256
308
|
|
|
257
|
-
test("set config from null (function)", () => {
|
|
309
|
+
test("set config from null (function)", async () => {
|
|
258
310
|
const base: Omit<ProcedureProps, "config"> = {
|
|
259
311
|
schema: "public",
|
|
260
312
|
name: "test_function",
|
|
@@ -293,12 +345,13 @@ describe.concurrent("procedure", () => {
|
|
|
293
345
|
key: "search_path",
|
|
294
346
|
value: "public",
|
|
295
347
|
});
|
|
348
|
+
await assertValidSql(change.serialize());
|
|
296
349
|
expect(change.serialize()).toBe(
|
|
297
|
-
"ALTER FUNCTION public.test_function SET search_path TO public",
|
|
350
|
+
"ALTER FUNCTION public.test_function() SET search_path TO public",
|
|
298
351
|
);
|
|
299
352
|
});
|
|
300
353
|
|
|
301
|
-
test("set volatility", () => {
|
|
354
|
+
test("set volatility", async () => {
|
|
302
355
|
const base: Omit<ProcedureProps, "volatility"> = {
|
|
303
356
|
schema: "public",
|
|
304
357
|
name: "test_function",
|
|
@@ -335,12 +388,13 @@ describe.concurrent("procedure", () => {
|
|
|
335
388
|
procedure,
|
|
336
389
|
volatility: "i",
|
|
337
390
|
});
|
|
391
|
+
await assertValidSql(change.serialize());
|
|
338
392
|
expect(change.serialize()).toBe(
|
|
339
|
-
"ALTER FUNCTION public.test_function IMMUTABLE",
|
|
393
|
+
"ALTER FUNCTION public.test_function() IMMUTABLE",
|
|
340
394
|
);
|
|
341
395
|
});
|
|
342
396
|
|
|
343
|
-
test("set strictness", () => {
|
|
397
|
+
test("set strictness", async () => {
|
|
344
398
|
const base: Omit<ProcedureProps, "is_strict"> = {
|
|
345
399
|
schema: "public",
|
|
346
400
|
name: "test_function",
|
|
@@ -377,12 +431,13 @@ describe.concurrent("procedure", () => {
|
|
|
377
431
|
procedure,
|
|
378
432
|
isStrict: true,
|
|
379
433
|
});
|
|
434
|
+
await assertValidSql(change.serialize());
|
|
380
435
|
expect(change.serialize()).toBe(
|
|
381
|
-
"ALTER FUNCTION public.test_function STRICT",
|
|
436
|
+
"ALTER FUNCTION public.test_function() STRICT",
|
|
382
437
|
);
|
|
383
438
|
});
|
|
384
439
|
|
|
385
|
-
test("unset strictness (called on null input)", () => {
|
|
440
|
+
test("unset strictness (called on null input)", async () => {
|
|
386
441
|
const base: Omit<ProcedureProps, "is_strict"> = {
|
|
387
442
|
schema: "public",
|
|
388
443
|
name: "test_function",
|
|
@@ -419,12 +474,13 @@ describe.concurrent("procedure", () => {
|
|
|
419
474
|
procedure,
|
|
420
475
|
isStrict: false,
|
|
421
476
|
});
|
|
477
|
+
await assertValidSql(change.serialize());
|
|
422
478
|
expect(change.serialize()).toBe(
|
|
423
|
-
"ALTER FUNCTION public.test_function CALLED ON NULL INPUT",
|
|
479
|
+
"ALTER FUNCTION public.test_function() CALLED ON NULL INPUT",
|
|
424
480
|
);
|
|
425
481
|
});
|
|
426
482
|
|
|
427
|
-
test("set leakproof", () => {
|
|
483
|
+
test("set leakproof", async () => {
|
|
428
484
|
const base: Omit<ProcedureProps, "leakproof"> = {
|
|
429
485
|
schema: "public",
|
|
430
486
|
name: "test_function",
|
|
@@ -461,12 +517,13 @@ describe.concurrent("procedure", () => {
|
|
|
461
517
|
procedure,
|
|
462
518
|
leakproof: true,
|
|
463
519
|
});
|
|
520
|
+
await assertValidSql(change.serialize());
|
|
464
521
|
expect(change.serialize()).toBe(
|
|
465
|
-
"ALTER FUNCTION public.test_function LEAKPROOF",
|
|
522
|
+
"ALTER FUNCTION public.test_function() LEAKPROOF",
|
|
466
523
|
);
|
|
467
524
|
});
|
|
468
525
|
|
|
469
|
-
test("unset leakproof", () => {
|
|
526
|
+
test("unset leakproof", async () => {
|
|
470
527
|
const base: Omit<ProcedureProps, "leakproof"> = {
|
|
471
528
|
schema: "public",
|
|
472
529
|
name: "test_function",
|
|
@@ -503,12 +560,13 @@ describe.concurrent("procedure", () => {
|
|
|
503
560
|
procedure,
|
|
504
561
|
leakproof: false,
|
|
505
562
|
});
|
|
563
|
+
await assertValidSql(change.serialize());
|
|
506
564
|
expect(change.serialize()).toBe(
|
|
507
|
-
"ALTER FUNCTION public.test_function NOT LEAKPROOF",
|
|
565
|
+
"ALTER FUNCTION public.test_function() NOT LEAKPROOF",
|
|
508
566
|
);
|
|
509
567
|
});
|
|
510
568
|
|
|
511
|
-
test("set parallel safety", () => {
|
|
569
|
+
test("set parallel safety", async () => {
|
|
512
570
|
const base: Omit<ProcedureProps, "parallel_safety"> = {
|
|
513
571
|
schema: "public",
|
|
514
572
|
name: "test_function",
|
|
@@ -545,13 +603,14 @@ describe.concurrent("procedure", () => {
|
|
|
545
603
|
procedure,
|
|
546
604
|
parallelSafety: "r",
|
|
547
605
|
});
|
|
606
|
+
await assertValidSql(change.serialize());
|
|
548
607
|
expect(change.serialize()).toBe(
|
|
549
|
-
"ALTER FUNCTION public.test_function PARALLEL RESTRICTED",
|
|
608
|
+
"ALTER FUNCTION public.test_function() PARALLEL RESTRICTED",
|
|
550
609
|
);
|
|
551
610
|
});
|
|
552
611
|
|
|
553
612
|
// PROCEDURE variants
|
|
554
|
-
test("procedure: set security definer", () => {
|
|
613
|
+
test("procedure: set security definer", async () => {
|
|
555
614
|
const base: Omit<ProcedureProps, "security_definer"> = {
|
|
556
615
|
schema: "public",
|
|
557
616
|
name: "test_procedure",
|
|
@@ -588,12 +647,13 @@ describe.concurrent("procedure", () => {
|
|
|
588
647
|
procedure,
|
|
589
648
|
securityDefiner: true,
|
|
590
649
|
});
|
|
650
|
+
await assertValidSql(change.serialize());
|
|
591
651
|
expect(change.serialize()).toBe(
|
|
592
|
-
"ALTER PROCEDURE public.test_procedure SECURITY DEFINER",
|
|
652
|
+
"ALTER PROCEDURE public.test_procedure() SECURITY DEFINER",
|
|
593
653
|
);
|
|
594
654
|
});
|
|
595
655
|
|
|
596
|
-
test("procedure: unset security definer (invoker)", () => {
|
|
656
|
+
test("procedure: unset security definer (invoker)", async () => {
|
|
597
657
|
const base: Omit<ProcedureProps, "security_definer"> = {
|
|
598
658
|
schema: "public",
|
|
599
659
|
name: "test_procedure",
|
|
@@ -630,12 +690,13 @@ describe.concurrent("procedure", () => {
|
|
|
630
690
|
procedure,
|
|
631
691
|
securityDefiner: false,
|
|
632
692
|
});
|
|
693
|
+
await assertValidSql(change.serialize());
|
|
633
694
|
expect(change.serialize()).toBe(
|
|
634
|
-
"ALTER PROCEDURE public.test_procedure SECURITY INVOKER",
|
|
695
|
+
"ALTER PROCEDURE public.test_procedure() SECURITY INVOKER",
|
|
635
696
|
);
|
|
636
697
|
});
|
|
637
698
|
|
|
638
|
-
test("procedure: set and reset config", () => {
|
|
699
|
+
test("procedure: set and reset config", async () => {
|
|
639
700
|
const base: Omit<ProcedureProps, "config"> = {
|
|
640
701
|
schema: "public",
|
|
641
702
|
name: "test_procedure",
|
|
@@ -685,18 +746,21 @@ describe.concurrent("procedure", () => {
|
|
|
685
746
|
key: "work_mem",
|
|
686
747
|
value: "64MB",
|
|
687
748
|
});
|
|
749
|
+
await assertValidSql(change1.serialize());
|
|
688
750
|
expect(change1.serialize()).toBe(
|
|
689
|
-
"ALTER PROCEDURE public.test_procedure RESET search_path",
|
|
751
|
+
"ALTER PROCEDURE public.test_procedure() RESET search_path",
|
|
690
752
|
);
|
|
753
|
+
await assertValidSql(change2.serialize());
|
|
691
754
|
expect(change2.serialize()).toBe(
|
|
692
|
-
"ALTER PROCEDURE public.test_procedure SET search_path TO pg_temp",
|
|
755
|
+
"ALTER PROCEDURE public.test_procedure() SET search_path TO pg_temp",
|
|
693
756
|
);
|
|
757
|
+
await assertValidSql(change3.serialize());
|
|
694
758
|
expect(change3.serialize()).toBe(
|
|
695
|
-
"ALTER PROCEDURE public.test_procedure SET work_mem TO '64MB'",
|
|
759
|
+
"ALTER PROCEDURE public.test_procedure() SET work_mem TO '64MB'",
|
|
696
760
|
);
|
|
697
761
|
});
|
|
698
762
|
|
|
699
|
-
test("procedure: reset all config (to null)", () => {
|
|
763
|
+
test("procedure: reset all config (to null)", async () => {
|
|
700
764
|
const base: Omit<ProcedureProps, "config"> = {
|
|
701
765
|
schema: "public",
|
|
702
766
|
name: "test_procedure",
|
|
@@ -742,15 +806,17 @@ describe.concurrent("procedure", () => {
|
|
|
742
806
|
action: "reset",
|
|
743
807
|
key: "work_mem",
|
|
744
808
|
});
|
|
809
|
+
await assertValidSql(change1.serialize());
|
|
745
810
|
expect(change1.serialize()).toBe(
|
|
746
|
-
"ALTER PROCEDURE public.test_procedure RESET search_path",
|
|
811
|
+
"ALTER PROCEDURE public.test_procedure() RESET search_path",
|
|
747
812
|
);
|
|
813
|
+
await assertValidSql(change2.serialize());
|
|
748
814
|
expect(change2.serialize()).toBe(
|
|
749
|
-
"ALTER PROCEDURE public.test_procedure RESET work_mem",
|
|
815
|
+
"ALTER PROCEDURE public.test_procedure() RESET work_mem",
|
|
750
816
|
);
|
|
751
817
|
});
|
|
752
818
|
|
|
753
|
-
test("procedure: set volatility", () => {
|
|
819
|
+
test("procedure: set volatility", async () => {
|
|
754
820
|
const base: Omit<ProcedureProps, "volatility"> = {
|
|
755
821
|
schema: "public",
|
|
756
822
|
name: "test_procedure",
|
|
@@ -787,12 +853,13 @@ describe.concurrent("procedure", () => {
|
|
|
787
853
|
procedure,
|
|
788
854
|
volatility: "s",
|
|
789
855
|
});
|
|
856
|
+
await assertValidSql(change.serialize());
|
|
790
857
|
expect(change.serialize()).toBe(
|
|
791
|
-
"ALTER PROCEDURE public.test_procedure STABLE",
|
|
858
|
+
"ALTER PROCEDURE public.test_procedure() STABLE",
|
|
792
859
|
);
|
|
793
860
|
});
|
|
794
861
|
|
|
795
|
-
test("procedure: set strictness", () => {
|
|
862
|
+
test("procedure: set strictness", async () => {
|
|
796
863
|
const base: Omit<ProcedureProps, "is_strict"> = {
|
|
797
864
|
schema: "public",
|
|
798
865
|
name: "test_procedure",
|
|
@@ -829,12 +896,13 @@ describe.concurrent("procedure", () => {
|
|
|
829
896
|
procedure,
|
|
830
897
|
isStrict: true,
|
|
831
898
|
});
|
|
899
|
+
await assertValidSql(change.serialize());
|
|
832
900
|
expect(change.serialize()).toBe(
|
|
833
|
-
"ALTER PROCEDURE public.test_procedure STRICT",
|
|
901
|
+
"ALTER PROCEDURE public.test_procedure() STRICT",
|
|
834
902
|
);
|
|
835
903
|
});
|
|
836
904
|
|
|
837
|
-
test("procedure: unset strictness (called on null input)", () => {
|
|
905
|
+
test("procedure: unset strictness (called on null input)", async () => {
|
|
838
906
|
const base: Omit<ProcedureProps, "is_strict"> = {
|
|
839
907
|
schema: "public",
|
|
840
908
|
name: "test_procedure",
|
|
@@ -871,12 +939,13 @@ describe.concurrent("procedure", () => {
|
|
|
871
939
|
procedure,
|
|
872
940
|
isStrict: false,
|
|
873
941
|
});
|
|
942
|
+
await assertValidSql(change.serialize());
|
|
874
943
|
expect(change.serialize()).toBe(
|
|
875
|
-
"ALTER PROCEDURE public.test_procedure CALLED ON NULL INPUT",
|
|
944
|
+
"ALTER PROCEDURE public.test_procedure() CALLED ON NULL INPUT",
|
|
876
945
|
);
|
|
877
946
|
});
|
|
878
947
|
|
|
879
|
-
test("procedure: set leakproof", () => {
|
|
948
|
+
test("procedure: set leakproof", async () => {
|
|
880
949
|
const base: Omit<ProcedureProps, "leakproof"> = {
|
|
881
950
|
schema: "public",
|
|
882
951
|
name: "test_procedure",
|
|
@@ -913,12 +982,13 @@ describe.concurrent("procedure", () => {
|
|
|
913
982
|
procedure,
|
|
914
983
|
leakproof: true,
|
|
915
984
|
});
|
|
985
|
+
await assertValidSql(change.serialize());
|
|
916
986
|
expect(change.serialize()).toBe(
|
|
917
|
-
"ALTER PROCEDURE public.test_procedure LEAKPROOF",
|
|
987
|
+
"ALTER PROCEDURE public.test_procedure() LEAKPROOF",
|
|
918
988
|
);
|
|
919
989
|
});
|
|
920
990
|
|
|
921
|
-
test("procedure: unset leakproof", () => {
|
|
991
|
+
test("procedure: unset leakproof", async () => {
|
|
922
992
|
const base: Omit<ProcedureProps, "leakproof"> = {
|
|
923
993
|
schema: "public",
|
|
924
994
|
name: "test_procedure",
|
|
@@ -955,12 +1025,13 @@ describe.concurrent("procedure", () => {
|
|
|
955
1025
|
procedure,
|
|
956
1026
|
leakproof: false,
|
|
957
1027
|
});
|
|
1028
|
+
await assertValidSql(change.serialize());
|
|
958
1029
|
expect(change.serialize()).toBe(
|
|
959
|
-
"ALTER PROCEDURE public.test_procedure NOT LEAKPROOF",
|
|
1030
|
+
"ALTER PROCEDURE public.test_procedure() NOT LEAKPROOF",
|
|
960
1031
|
);
|
|
961
1032
|
});
|
|
962
1033
|
|
|
963
|
-
test("procedure: set parallel safety", () => {
|
|
1034
|
+
test("procedure: set parallel safety", async () => {
|
|
964
1035
|
const base: Omit<ProcedureProps, "parallel_safety"> = {
|
|
965
1036
|
schema: "public",
|
|
966
1037
|
name: "test_procedure",
|
|
@@ -997,8 +1068,9 @@ describe.concurrent("procedure", () => {
|
|
|
997
1068
|
procedure,
|
|
998
1069
|
parallelSafety: "s",
|
|
999
1070
|
});
|
|
1071
|
+
await assertValidSql(change.serialize());
|
|
1000
1072
|
expect(change.serialize()).toBe(
|
|
1001
|
-
"ALTER PROCEDURE public.test_procedure PARALLEL SAFE",
|
|
1073
|
+
"ALTER PROCEDURE public.test_procedure() PARALLEL SAFE",
|
|
1002
1074
|
);
|
|
1003
1075
|
});
|
|
1004
1076
|
});
|
|
@@ -2,6 +2,12 @@ import type { Procedure } from "../procedure.model.ts";
|
|
|
2
2
|
import { formatConfigValue } from "../utils.ts";
|
|
3
3
|
import { AlterProcedureChange } from "./procedure.base.ts";
|
|
4
4
|
|
|
5
|
+
/** Build schema.name(args) for ALTER statements so overloaded functions are unambiguous. */
|
|
6
|
+
function procedureSignature(procedure: Procedure): string {
|
|
7
|
+
const args = procedure.argument_types?.join(", ") ?? "";
|
|
8
|
+
return `${procedure.schema}.${procedure.name}(${args})`;
|
|
9
|
+
}
|
|
10
|
+
|
|
5
11
|
/**
|
|
6
12
|
* Alter a procedure.
|
|
7
13
|
*
|
|
@@ -60,7 +66,7 @@ export class AlterProcedureChangeOwner extends AlterProcedureChange {
|
|
|
60
66
|
return [
|
|
61
67
|
"ALTER",
|
|
62
68
|
objectType,
|
|
63
|
-
|
|
69
|
+
procedureSignature(this.procedure),
|
|
64
70
|
"OWNER TO",
|
|
65
71
|
this.owner,
|
|
66
72
|
].join(" ");
|
|
@@ -94,7 +100,7 @@ export class AlterProcedureSetSecurity extends AlterProcedureChange {
|
|
|
94
100
|
return [
|
|
95
101
|
"ALTER",
|
|
96
102
|
objectType,
|
|
97
|
-
|
|
103
|
+
procedureSignature(this.procedure),
|
|
98
104
|
security,
|
|
99
105
|
].join(" ");
|
|
100
106
|
}
|
|
@@ -140,7 +146,7 @@ export class AlterProcedureSetConfig extends AlterProcedureChange {
|
|
|
140
146
|
const head = [
|
|
141
147
|
"ALTER",
|
|
142
148
|
this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION",
|
|
143
|
-
|
|
149
|
+
procedureSignature(this.procedure),
|
|
144
150
|
].join(" ");
|
|
145
151
|
if (this.action === "reset_all") return `${head} RESET ALL`;
|
|
146
152
|
if (this.action === "reset") return `${head} RESET ${this.key}`;
|
|
@@ -180,7 +186,7 @@ export class AlterProcedureSetVolatility extends AlterProcedureChange {
|
|
|
180
186
|
return [
|
|
181
187
|
"ALTER",
|
|
182
188
|
objectType,
|
|
183
|
-
|
|
189
|
+
procedureSignature(this.procedure),
|
|
184
190
|
volMap[this.volatility],
|
|
185
191
|
].join(" ");
|
|
186
192
|
}
|
|
@@ -210,7 +216,7 @@ export class AlterProcedureSetStrictness extends AlterProcedureChange {
|
|
|
210
216
|
return [
|
|
211
217
|
"ALTER",
|
|
212
218
|
objectType,
|
|
213
|
-
|
|
219
|
+
procedureSignature(this.procedure),
|
|
214
220
|
strictness,
|
|
215
221
|
].join(" ");
|
|
216
222
|
}
|
|
@@ -237,12 +243,9 @@ export class AlterProcedureSetLeakproof extends AlterProcedureChange {
|
|
|
237
243
|
serialize(): string {
|
|
238
244
|
const objectType = this.procedure.kind === "p" ? "PROCEDURE" : "FUNCTION";
|
|
239
245
|
const leak = this.leakproof ? "LEAKPROOF" : "NOT LEAKPROOF";
|
|
240
|
-
return [
|
|
241
|
-
"
|
|
242
|
-
|
|
243
|
-
`${this.procedure.schema}.${this.procedure.name}`,
|
|
244
|
-
leak,
|
|
245
|
-
].join(" ");
|
|
246
|
+
return ["ALTER", objectType, procedureSignature(this.procedure), leak].join(
|
|
247
|
+
" ",
|
|
248
|
+
);
|
|
246
249
|
}
|
|
247
250
|
}
|
|
248
251
|
|
|
@@ -274,7 +277,7 @@ export class AlterProcedureSetParallel extends AlterProcedureChange {
|
|
|
274
277
|
return [
|
|
275
278
|
"ALTER",
|
|
276
279
|
objectType,
|
|
277
|
-
|
|
280
|
+
procedureSignature(this.procedure),
|
|
278
281
|
parallelMap[this.parallelSafety],
|
|
279
282
|
].join(" ");
|
|
280
283
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import { Procedure } from "../procedure.model.ts";
|
|
3
4
|
import { CreateProcedure } from "./procedure.create.ts";
|
|
4
5
|
|
|
5
6
|
describe("procedure", () => {
|
|
6
|
-
test("create", () => {
|
|
7
|
+
test("create", async () => {
|
|
7
8
|
const procedure = new Procedure({
|
|
8
9
|
schema: "public",
|
|
9
10
|
name: "test_procedure",
|
|
@@ -41,6 +42,8 @@ describe("procedure", () => {
|
|
|
41
42
|
procedure,
|
|
42
43
|
});
|
|
43
44
|
|
|
45
|
+
await assertValidSql(change.serialize());
|
|
46
|
+
|
|
44
47
|
expect(change.serialize()).toBe(
|
|
45
48
|
"CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$BEGIN RETURN; END;$$",
|
|
46
49
|
);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
2
3
|
import { Procedure } from "../procedure.model.ts";
|
|
3
4
|
import { DropProcedure } from "./procedure.drop.ts";
|
|
4
5
|
|
|
5
6
|
describe("procedure", () => {
|
|
6
|
-
test("drop", () => {
|
|
7
|
+
test("drop", async () => {
|
|
7
8
|
const procedure = new Procedure({
|
|
8
9
|
schema: "public",
|
|
9
10
|
name: "test_procedure",
|
|
@@ -41,10 +42,12 @@ describe("procedure", () => {
|
|
|
41
42
|
procedure,
|
|
42
43
|
});
|
|
43
44
|
|
|
45
|
+
await assertValidSql(change.serialize());
|
|
46
|
+
|
|
44
47
|
expect(change.serialize()).toBe("DROP PROCEDURE public.test_procedure()");
|
|
45
48
|
});
|
|
46
49
|
|
|
47
|
-
test("drop function", () => {
|
|
50
|
+
test("drop function", async () => {
|
|
48
51
|
const fn = new Procedure({
|
|
49
52
|
schema: "public",
|
|
50
53
|
name: "test_function",
|
|
@@ -80,6 +83,8 @@ describe("procedure", () => {
|
|
|
80
83
|
|
|
81
84
|
const change = new DropProcedure({ procedure: fn });
|
|
82
85
|
|
|
86
|
+
await assertValidSql(change.serialize());
|
|
87
|
+
|
|
83
88
|
expect(change.serialize()).toBe("DROP FUNCTION public.test_function()");
|
|
84
89
|
});
|
|
85
90
|
});
|