@supabase/pg-delta 0.0.0 → 1.0.0-alpha.0
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/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/cli/app.d.ts +1 -0
- package/dist/cli/app.js +26 -0
- package/dist/cli/bin/cli.d.ts +2 -0
- package/dist/cli/bin/cli.js +7 -0
- package/dist/cli/commands/apply.d.ts +5 -0
- package/dist/cli/commands/apply.js +85 -0
- package/dist/cli/commands/plan.d.ts +5 -0
- package/dist/cli/commands/plan.js +137 -0
- package/dist/cli/commands/sync.d.ts +5 -0
- package/dist/cli/commands/sync.js +141 -0
- package/dist/cli/formatters/index.d.ts +4 -0
- package/dist/cli/formatters/index.js +4 -0
- package/dist/cli/formatters/tree/tree-builder.d.ts +10 -0
- package/dist/cli/formatters/tree/tree-builder.js +333 -0
- package/dist/cli/formatters/tree/tree-renderer.d.ts +45 -0
- package/dist/cli/formatters/tree/tree-renderer.js +303 -0
- package/dist/cli/formatters/tree/tree.d.ts +8 -0
- package/dist/cli/formatters/tree/tree.js +161 -0
- package/dist/cli/utils/integrations.d.ts +13 -0
- package/dist/cli/utils/integrations.js +35 -0
- package/dist/cli/utils.d.ts +64 -0
- package/dist/cli/utils.js +160 -0
- package/dist/core/catalog.diff.d.ts +5 -0
- package/dist/core/catalog.diff.js +147 -0
- package/dist/core/catalog.model.d.ts +93 -0
- package/dist/core/catalog.model.js +254 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +1 -0
- package/dist/core/context.d.ts +11 -0
- package/dist/core/context.js +12 -0
- package/dist/core/depend.d.ts +31 -0
- package/dist/core/depend.js +1833 -0
- package/dist/core/expand-replace-dependencies.d.ts +14 -0
- package/dist/core/expand-replace-dependencies.js +280 -0
- package/dist/core/fingerprint.d.ts +23 -0
- package/dist/core/fingerprint.js +174 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.js +14 -0
- package/dist/core/integrations/filter/dsl.d.ts +97 -0
- package/dist/core/integrations/filter/dsl.js +107 -0
- package/dist/core/integrations/filter/extractors.d.ts +12 -0
- package/dist/core/integrations/filter/extractors.js +136 -0
- package/dist/core/integrations/integration-dsl.d.ts +22 -0
- package/dist/core/integrations/integration-dsl.js +6 -0
- package/dist/core/integrations/integration.types.d.ts +5 -0
- package/dist/core/integrations/integration.types.js +1 -0
- package/dist/core/integrations/serialize/dsl.d.ts +58 -0
- package/dist/core/integrations/serialize/dsl.js +42 -0
- package/dist/core/main.d.ts +5 -0
- package/dist/core/main.js +44 -0
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +10 -0
- package/dist/core/objects/aggregate/aggregate.diff.js +186 -0
- package/dist/core/objects/aggregate/aggregate.model.d.ts +174 -0
- package/dist/core/objects/aggregate/aggregate.model.js +297 -0
- package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +19 -0
- package/dist/core/objects/aggregate/changes/aggregate.alter.js +25 -0
- package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +17 -0
- package/dist/core/objects/aggregate/changes/aggregate.base.js +13 -0
- package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +23 -0
- package/dist/core/objects/aggregate/changes/aggregate.comment.js +44 -0
- package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +19 -0
- package/dist/core/objects/aggregate/changes/aggregate.create.js +228 -0
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +17 -0
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +26 -0
- package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +62 -0
- package/dist/core/objects/aggregate/changes/aggregate.privilege.js +102 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +6 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.js +1 -0
- package/dist/core/objects/base.change.d.ts +46 -0
- package/dist/core/objects/base.change.js +38 -0
- package/dist/core/objects/base.default-privileges.d.ts +29 -0
- package/dist/core/objects/base.default-privileges.js +167 -0
- package/dist/core/objects/base.diff.d.ts +6 -0
- package/dist/core/objects/base.diff.js +12 -0
- package/dist/core/objects/base.model.d.ts +74 -0
- package/dist/core/objects/base.model.js +47 -0
- package/dist/core/objects/base.privilege-diff.d.ts +54 -0
- package/dist/core/objects/base.privilege-diff.js +216 -0
- package/dist/core/objects/base.privilege.d.ts +27 -0
- package/dist/core/objects/base.privilege.js +169 -0
- package/dist/core/objects/collation/changes/collation.alter.d.ts +45 -0
- package/dist/core/objects/collation/changes/collation.alter.js +52 -0
- package/dist/core/objects/collation/changes/collation.base.d.ts +17 -0
- package/dist/core/objects/collation/changes/collation.base.js +13 -0
- package/dist/core/objects/collation/changes/collation.comment.d.ts +26 -0
- package/dist/core/objects/collation/changes/collation.comment.js +50 -0
- package/dist/core/objects/collation/changes/collation.create.d.ts +32 -0
- package/dist/core/objects/collation/changes/collation.create.js +86 -0
- package/dist/core/objects/collation/changes/collation.drop.d.ts +22 -0
- package/dist/core/objects/collation/changes/collation.drop.js +31 -0
- package/dist/core/objects/collation/changes/collation.types.d.ts +5 -0
- package/dist/core/objects/collation/changes/collation.types.js +1 -0
- package/dist/core/objects/collation/collation.diff.d.ts +13 -0
- package/dist/core/objects/collation/collation.diff.js +85 -0
- package/dist/core/objects/collation/collation.model.d.ts +67 -0
- package/dist/core/objects/collation/collation.model.js +207 -0
- package/dist/core/objects/domain/changes/domain.alter.d.ts +143 -0
- package/dist/core/objects/domain/changes/domain.alter.js +191 -0
- package/dist/core/objects/domain/changes/domain.base.d.ts +17 -0
- package/dist/core/objects/domain/changes/domain.base.js +13 -0
- package/dist/core/objects/domain/changes/domain.comment.d.ts +25 -0
- package/dist/core/objects/domain/changes/domain.comment.js +47 -0
- package/dist/core/objects/domain/changes/domain.create.d.ts +30 -0
- package/dist/core/objects/domain/changes/domain.create.js +92 -0
- package/dist/core/objects/domain/changes/domain.drop.d.ts +22 -0
- package/dist/core/objects/domain/changes/domain.drop.js +28 -0
- package/dist/core/objects/domain/changes/domain.privilege.d.ts +97 -0
- package/dist/core/objects/domain/changes/domain.privilege.js +127 -0
- package/dist/core/objects/domain/changes/domain.types.d.ts +6 -0
- package/dist/core/objects/domain/changes/domain.types.js +1 -0
- package/dist/core/objects/domain/domain.diff.d.ts +18 -0
- package/dist/core/objects/domain/domain.diff.js +244 -0
- package/dist/core/objects/domain/domain.model.d.ts +103 -0
- package/dist/core/objects/domain/domain.model.js +172 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +44 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +51 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +17 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.base.js +13 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +23 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +46 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +25 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.create.js +55 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +22 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +28 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +5 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.js +1 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +13 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.js +81 -0
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +45 -0
- package/dist/core/objects/event-trigger/event-trigger.model.js +89 -0
- package/dist/core/objects/extension/changes/extension.alter.d.ts +44 -0
- package/dist/core/objects/extension/changes/extension.alter.js +51 -0
- package/dist/core/objects/extension/changes/extension.base.d.ts +17 -0
- package/dist/core/objects/extension/changes/extension.base.js +13 -0
- package/dist/core/objects/extension/changes/extension.comment.d.ts +26 -0
- package/dist/core/objects/extension/changes/extension.comment.js +46 -0
- package/dist/core/objects/extension/changes/extension.create.d.ts +25 -0
- package/dist/core/objects/extension/changes/extension.create.js +49 -0
- package/dist/core/objects/extension/changes/extension.drop.d.ts +22 -0
- package/dist/core/objects/extension/changes/extension.drop.js +28 -0
- package/dist/core/objects/extension/changes/extension.types.d.ts +5 -0
- package/dist/core/objects/extension/changes/extension.types.js +1 -0
- package/dist/core/objects/extension/extension.diff.d.ts +10 -0
- package/dist/core/objects/extension/extension.diff.js +65 -0
- package/dist/core/objects/extension/extension.model.d.ts +52 -0
- package/dist/core/objects/extension/extension.model.js +268 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +51 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +61 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +50 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +25 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +78 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +28 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +123 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +221 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +59 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +128 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +5 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +163 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +248 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +50 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +25 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +64 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +31 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +129 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +268 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +117 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +215 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +65 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +84 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +26 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +43 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +24 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +62 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +28 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +97 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +123 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +6 -0
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +18 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +209 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +62 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.model.js +118 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +37 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +38 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.d.ts +17 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.js +13 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +24 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +52 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +23 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +34 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +4 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.js +1 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.d.ts +10 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.js +77 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +36 -0
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +85 -0
- package/dist/core/objects/index/changes/index.alter.d.ts +76 -0
- package/dist/core/objects/index/changes/index.alter.js +94 -0
- package/dist/core/objects/index/changes/index.base.d.ts +17 -0
- package/dist/core/objects/index/changes/index.base.js +13 -0
- package/dist/core/objects/index/changes/index.comment.d.ts +26 -0
- package/dist/core/objects/index/changes/index.comment.js +50 -0
- package/dist/core/objects/index/changes/index.create.d.ts +30 -0
- package/dist/core/objects/index/changes/index.create.js +53 -0
- package/dist/core/objects/index/changes/index.drop.d.ts +22 -0
- package/dist/core/objects/index/changes/index.drop.js +28 -0
- package/dist/core/objects/index/changes/index.types.d.ts +5 -0
- package/dist/core/objects/index/changes/index.types.js +1 -0
- package/dist/core/objects/index/changes/utils.d.ts +3 -0
- package/dist/core/objects/index/changes/utils.js +6 -0
- package/dist/core/objects/index/index.diff.d.ts +12 -0
- package/dist/core/objects/index/index.diff.js +182 -0
- package/dist/core/objects/index/index.model.d.ts +150 -0
- package/dist/core/objects/index/index.model.js +340 -0
- package/dist/core/objects/language/changes/language.alter.d.ts +32 -0
- package/dist/core/objects/language/changes/language.alter.js +30 -0
- package/dist/core/objects/language/changes/language.base.d.ts +17 -0
- package/dist/core/objects/language/changes/language.base.js +13 -0
- package/dist/core/objects/language/changes/language.comment.d.ts +26 -0
- package/dist/core/objects/language/changes/language.comment.js +45 -0
- package/dist/core/objects/language/changes/language.create.d.ts +25 -0
- package/dist/core/objects/language/changes/language.create.js +76 -0
- package/dist/core/objects/language/changes/language.drop.d.ts +22 -0
- package/dist/core/objects/language/changes/language.drop.js +31 -0
- package/dist/core/objects/language/changes/language.privilege.d.ts +97 -0
- package/dist/core/objects/language/changes/language.privilege.js +128 -0
- package/dist/core/objects/language/changes/language.types.d.ts +6 -0
- package/dist/core/objects/language/changes/language.types.js +1 -0
- package/dist/core/objects/language/language.diff.d.ts +15 -0
- package/dist/core/objects/language/language.diff.js +117 -0
- package/dist/core/objects/language/language.model.d.ts +62 -0
- package/dist/core/objects/language/language.model.js +128 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +67 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +63 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +17 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.base.js +13 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +53 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +112 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +35 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.create.js +71 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +26 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +42 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +105 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +151 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +6 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.js +1 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +18 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.js +335 -0
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +152 -0
- package/dist/core/objects/materialized-view/materialized-view.model.js +228 -0
- package/dist/core/objects/procedure/changes/procedure.alter.d.ts +143 -0
- package/dist/core/objects/procedure/changes/procedure.alter.js +207 -0
- package/dist/core/objects/procedure/changes/procedure.base.d.ts +17 -0
- package/dist/core/objects/procedure/changes/procedure.base.js +13 -0
- package/dist/core/objects/procedure/changes/procedure.comment.d.ts +26 -0
- package/dist/core/objects/procedure/changes/procedure.comment.js +52 -0
- package/dist/core/objects/procedure/changes/procedure.create.d.ts +42 -0
- package/dist/core/objects/procedure/changes/procedure.create.js +77 -0
- package/dist/core/objects/procedure/changes/procedure.drop.d.ts +23 -0
- package/dist/core/objects/procedure/changes/procedure.drop.js +37 -0
- package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +98 -0
- package/dist/core/objects/procedure/changes/procedure.privilege.js +144 -0
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +6 -0
- package/dist/core/objects/procedure/changes/procedure.types.js +1 -0
- package/dist/core/objects/procedure/procedure.diff.d.ts +18 -0
- package/dist/core/objects/procedure/procedure.diff.js +282 -0
- package/dist/core/objects/procedure/procedure.model.d.ts +132 -0
- package/dist/core/objects/procedure/procedure.model.js +244 -0
- package/dist/core/objects/procedure/utils.d.ts +14 -0
- package/dist/core/objects/procedure/utils.js +55 -0
- package/dist/core/objects/publication/changes/publication.alter.d.ts +88 -0
- package/dist/core/objects/publication/changes/publication.alter.js +176 -0
- package/dist/core/objects/publication/changes/publication.base.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.base.js +13 -0
- package/dist/core/objects/publication/changes/publication.comment.d.ts +23 -0
- package/dist/core/objects/publication/changes/publication.comment.js +46 -0
- package/dist/core/objects/publication/changes/publication.create.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.create.js +61 -0
- package/dist/core/objects/publication/changes/publication.drop.d.ts +17 -0
- package/dist/core/objects/publication/changes/publication.drop.js +23 -0
- package/dist/core/objects/publication/changes/publication.types.d.ts +5 -0
- package/dist/core/objects/publication/changes/publication.types.js +1 -0
- package/dist/core/objects/publication/publication.diff.d.ts +5 -0
- package/dist/core/objects/publication/publication.diff.js +161 -0
- package/dist/core/objects/publication/publication.model.d.ts +96 -0
- package/dist/core/objects/publication/publication.model.js +186 -0
- package/dist/core/objects/publication/utils.d.ts +5 -0
- package/dist/core/objects/publication/utils.js +45 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +62 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +90 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.base.d.ts +17 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.base.js +13 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +23 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +51 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +27 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.create.js +79 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +22 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +33 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +5 -0
- package/dist/core/objects/rls-policy/changes/rls-policy.types.js +1 -0
- package/dist/core/objects/rls-policy/rls-policy.diff.d.ts +10 -0
- package/dist/core/objects/rls-policy/rls-policy.diff.js +80 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +52 -0
- package/dist/core/objects/rls-policy/rls-policy.model.js +127 -0
- package/dist/core/objects/role/changes/role.alter.d.ts +78 -0
- package/dist/core/objects/role/changes/role.alter.js +55 -0
- package/dist/core/objects/role/changes/role.base.d.ts +17 -0
- package/dist/core/objects/role/changes/role.base.js +13 -0
- package/dist/core/objects/role/changes/role.comment.d.ts +23 -0
- package/dist/core/objects/role/changes/role.comment.js +42 -0
- package/dist/core/objects/role/changes/role.create.d.ts +38 -0
- package/dist/core/objects/role/changes/role.create.js +83 -0
- package/dist/core/objects/role/changes/role.drop.d.ts +22 -0
- package/dist/core/objects/role/changes/role.drop.js +28 -0
- package/dist/core/objects/role/changes/role.privilege.d.ts +148 -0
- package/dist/core/objects/role/changes/role.privilege.js +283 -0
- package/dist/core/objects/role/changes/role.types.d.ts +6 -0
- package/dist/core/objects/role/changes/role.types.js +1 -0
- package/dist/core/objects/role/role.diff.d.ts +13 -0
- package/dist/core/objects/role/role.diff.js +386 -0
- package/dist/core/objects/role/role.model.d.ts +89 -0
- package/dist/core/objects/role/role.model.js +312 -0
- package/dist/core/objects/rule/changes/rule.alter.d.ts +22 -0
- package/dist/core/objects/rule/changes/rule.alter.js +58 -0
- package/dist/core/objects/rule/changes/rule.base.d.ts +17 -0
- package/dist/core/objects/rule/changes/rule.base.js +13 -0
- package/dist/core/objects/rule/changes/rule.comment.d.ts +22 -0
- package/dist/core/objects/rule/changes/rule.comment.js +51 -0
- package/dist/core/objects/rule/changes/rule.create.d.ts +14 -0
- package/dist/core/objects/rule/changes/rule.create.js +28 -0
- package/dist/core/objects/rule/changes/rule.drop.d.ts +12 -0
- package/dist/core/objects/rule/changes/rule.drop.js +23 -0
- package/dist/core/objects/rule/changes/rule.types.d.ts +5 -0
- package/dist/core/objects/rule/changes/rule.types.js +1 -0
- package/dist/core/objects/rule/rule.diff.d.ts +3 -0
- package/dist/core/objects/rule/rule.diff.js +53 -0
- package/dist/core/objects/rule/rule.model.d.ts +72 -0
- package/dist/core/objects/rule/rule.model.js +156 -0
- package/dist/core/objects/schema/changes/schema.alter.d.ts +32 -0
- package/dist/core/objects/schema/changes/schema.alter.js +25 -0
- package/dist/core/objects/schema/changes/schema.base.d.ts +17 -0
- package/dist/core/objects/schema/changes/schema.base.js +13 -0
- package/dist/core/objects/schema/changes/schema.comment.d.ts +23 -0
- package/dist/core/objects/schema/changes/schema.comment.js +43 -0
- package/dist/core/objects/schema/changes/schema.create.d.ts +27 -0
- package/dist/core/objects/schema/changes/schema.create.js +38 -0
- package/dist/core/objects/schema/changes/schema.drop.d.ts +22 -0
- package/dist/core/objects/schema/changes/schema.drop.js +28 -0
- package/dist/core/objects/schema/changes/schema.privilege.d.ts +97 -0
- package/dist/core/objects/schema/changes/schema.privilege.js +131 -0
- package/dist/core/objects/schema/changes/schema.types.d.ts +6 -0
- package/dist/core/objects/schema/changes/schema.types.js +1 -0
- package/dist/core/objects/schema/schema.diff.d.ts +18 -0
- package/dist/core/objects/schema/schema.diff.js +142 -0
- package/dist/core/objects/schema/schema.model.d.ts +47 -0
- package/dist/core/objects/schema/schema.model.js +91 -0
- package/dist/core/objects/sequence/changes/sequence.alter.d.ts +59 -0
- package/dist/core/objects/sequence/changes/sequence.alter.js +75 -0
- package/dist/core/objects/sequence/changes/sequence.base.d.ts +17 -0
- package/dist/core/objects/sequence/changes/sequence.base.js +13 -0
- package/dist/core/objects/sequence/changes/sequence.comment.d.ts +23 -0
- package/dist/core/objects/sequence/changes/sequence.comment.js +47 -0
- package/dist/core/objects/sequence/changes/sequence.create.d.ts +25 -0
- package/dist/core/objects/sequence/changes/sequence.create.js +78 -0
- package/dist/core/objects/sequence/changes/sequence.drop.d.ts +22 -0
- package/dist/core/objects/sequence/changes/sequence.drop.js +31 -0
- package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +101 -0
- package/dist/core/objects/sequence/changes/sequence.privilege.js +135 -0
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +6 -0
- package/dist/core/objects/sequence/changes/sequence.types.js +1 -0
- package/dist/core/objects/sequence/sequence.diff.d.ts +20 -0
- package/dist/core/objects/sequence/sequence.diff.js +258 -0
- package/dist/core/objects/sequence/sequence.model.d.ts +76 -0
- package/dist/core/objects/sequence/sequence.model.js +169 -0
- package/dist/core/objects/subscription/changes/subscription.alter.d.ts +56 -0
- package/dist/core/objects/subscription/changes/subscription.alter.js +82 -0
- package/dist/core/objects/subscription/changes/subscription.base.d.ts +17 -0
- package/dist/core/objects/subscription/changes/subscription.base.js +13 -0
- package/dist/core/objects/subscription/changes/subscription.comment.d.ts +23 -0
- package/dist/core/objects/subscription/changes/subscription.comment.js +46 -0
- package/dist/core/objects/subscription/changes/subscription.create.d.ts +12 -0
- package/dist/core/objects/subscription/changes/subscription.create.js +52 -0
- package/dist/core/objects/subscription/changes/subscription.drop.d.ts +11 -0
- package/dist/core/objects/subscription/changes/subscription.drop.js +15 -0
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +5 -0
- package/dist/core/objects/subscription/changes/subscription.types.js +1 -0
- package/dist/core/objects/subscription/subscription.diff.d.ts +5 -0
- package/dist/core/objects/subscription/subscription.diff.js +167 -0
- package/dist/core/objects/subscription/subscription.model.d.ts +80 -0
- package/dist/core/objects/subscription/subscription.model.js +166 -0
- package/dist/core/objects/subscription/utils.d.ts +37 -0
- package/dist/core/objects/subscription/utils.js +112 -0
- package/dist/core/objects/table/changes/table.alter.d.ts +357 -0
- package/dist/core/objects/table/changes/table.alter.js +607 -0
- package/dist/core/objects/table/changes/table.base.d.ts +17 -0
- package/dist/core/objects/table/changes/table.base.js +13 -0
- package/dist/core/objects/table/changes/table.comment.d.ts +106 -0
- package/dist/core/objects/table/changes/table.comment.js +175 -0
- package/dist/core/objects/table/changes/table.create.d.ts +33 -0
- package/dist/core/objects/table/changes/table.create.js +145 -0
- package/dist/core/objects/table/changes/table.drop.d.ts +22 -0
- package/dist/core/objects/table/changes/table.drop.js +35 -0
- package/dist/core/objects/table/changes/table.privilege.d.ts +107 -0
- package/dist/core/objects/table/changes/table.privilege.js +150 -0
- package/dist/core/objects/table/changes/table.types.d.ts +6 -0
- package/dist/core/objects/table/changes/table.types.js +1 -0
- package/dist/core/objects/table/table.diff.d.ts +18 -0
- package/dist/core/objects/table/table.diff.js +668 -0
- package/dist/core/objects/table/table.model.d.ts +341 -0
- package/dist/core/objects/table/table.model.js +426 -0
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +29 -0
- package/dist/core/objects/trigger/changes/trigger.alter.js +27 -0
- package/dist/core/objects/trigger/changes/trigger.base.d.ts +17 -0
- package/dist/core/objects/trigger/changes/trigger.base.js +13 -0
- package/dist/core/objects/trigger/changes/trigger.comment.d.ts +23 -0
- package/dist/core/objects/trigger/changes/trigger.comment.js +51 -0
- package/dist/core/objects/trigger/changes/trigger.create.d.ts +41 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +61 -0
- package/dist/core/objects/trigger/changes/trigger.drop.d.ts +22 -0
- package/dist/core/objects/trigger/changes/trigger.drop.js +33 -0
- package/dist/core/objects/trigger/changes/trigger.types.d.ts +5 -0
- package/dist/core/objects/trigger/changes/trigger.types.js +1 -0
- package/dist/core/objects/trigger/trigger.diff.d.ts +11 -0
- package/dist/core/objects/trigger/trigger.diff.js +84 -0
- package/dist/core/objects/trigger/trigger.model.d.ts +92 -0
- package/dist/core/objects/trigger/trigger.model.js +235 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +81 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +123 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +17 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.base.js +13 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +53 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +108 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +23 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.create.js +72 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +22 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +31 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +97 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +131 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +6 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.js +1 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +18 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.js +250 -0
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +148 -0
- package/dist/core/objects/type/composite-type/composite-type.model.js +223 -0
- package/dist/core/objects/type/enum/changes/enum.alter.d.ts +52 -0
- package/dist/core/objects/type/enum/changes/enum.alter.js +60 -0
- package/dist/core/objects/type/enum/changes/enum.base.d.ts +17 -0
- package/dist/core/objects/type/enum/changes/enum.base.js +13 -0
- package/dist/core/objects/type/enum/changes/enum.comment.d.ts +26 -0
- package/dist/core/objects/type/enum/changes/enum.comment.js +47 -0
- package/dist/core/objects/type/enum/changes/enum.create.d.ts +22 -0
- package/dist/core/objects/type/enum/changes/enum.create.js +43 -0
- package/dist/core/objects/type/enum/changes/enum.drop.d.ts +22 -0
- package/dist/core/objects/type/enum/changes/enum.drop.js +28 -0
- package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +97 -0
- package/dist/core/objects/type/enum/changes/enum.privilege.js +131 -0
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +6 -0
- package/dist/core/objects/type/enum/changes/enum.types.js +1 -0
- package/dist/core/objects/type/enum/enum.diff.d.ts +18 -0
- package/dist/core/objects/type/enum/enum.diff.js +268 -0
- package/dist/core/objects/type/enum/enum.model.d.ts +66 -0
- package/dist/core/objects/type/enum/enum.model.js +154 -0
- package/dist/core/objects/type/range/changes/range.alter.d.ts +33 -0
- package/dist/core/objects/type/range/changes/range.alter.js +30 -0
- package/dist/core/objects/type/range/changes/range.base.d.ts +17 -0
- package/dist/core/objects/type/range/changes/range.base.js +13 -0
- package/dist/core/objects/type/range/changes/range.comment.d.ts +26 -0
- package/dist/core/objects/type/range/changes/range.comment.js +47 -0
- package/dist/core/objects/type/range/changes/range.create.d.ts +31 -0
- package/dist/core/objects/type/range/changes/range.create.js +113 -0
- package/dist/core/objects/type/range/changes/range.drop.d.ts +22 -0
- package/dist/core/objects/type/range/changes/range.drop.js +28 -0
- package/dist/core/objects/type/range/changes/range.privilege.d.ts +97 -0
- package/dist/core/objects/type/range/changes/range.privilege.js +131 -0
- package/dist/core/objects/type/range/changes/range.types.d.ts +6 -0
- package/dist/core/objects/type/range/changes/range.types.js +1 -0
- package/dist/core/objects/type/range/range.diff.d.ts +18 -0
- package/dist/core/objects/type/range/range.diff.js +172 -0
- package/dist/core/objects/type/range/range.model.d.ts +81 -0
- package/dist/core/objects/type/range/range.model.js +165 -0
- package/dist/core/objects/type/type.types.d.ts +4 -0
- package/dist/core/objects/type/type.types.js +1 -0
- package/dist/core/objects/utils.d.ts +57 -0
- package/dist/core/objects/utils.js +137 -0
- package/dist/core/objects/view/changes/view.alter.d.ts +62 -0
- package/dist/core/objects/view/changes/view.alter.js +75 -0
- package/dist/core/objects/view/changes/view.base.d.ts +17 -0
- package/dist/core/objects/view/changes/view.base.js +13 -0
- package/dist/core/objects/view/changes/view.comment.d.ts +23 -0
- package/dist/core/objects/view/changes/view.comment.js +46 -0
- package/dist/core/objects/view/changes/view.create.d.ts +27 -0
- package/dist/core/objects/view/changes/view.create.js +57 -0
- package/dist/core/objects/view/changes/view.drop.d.ts +17 -0
- package/dist/core/objects/view/changes/view.drop.js +30 -0
- package/dist/core/objects/view/changes/view.privilege.d.ts +107 -0
- package/dist/core/objects/view/changes/view.privilege.js +150 -0
- package/dist/core/objects/view/changes/view.types.d.ts +6 -0
- package/dist/core/objects/view/changes/view.types.js +1 -0
- package/dist/core/objects/view/view.diff.d.ts +18 -0
- package/dist/core/objects/view/view.diff.js +270 -0
- package/dist/core/objects/view/view.model.d.ts +152 -0
- package/dist/core/objects/view/view.model.js +250 -0
- package/dist/core/plan/apply.d.ts +33 -0
- package/dist/core/plan/apply.js +112 -0
- package/dist/core/plan/create.d.ts +22 -0
- package/dist/core/plan/create.js +228 -0
- package/dist/core/plan/hierarchy.d.ts +19 -0
- package/dist/core/plan/hierarchy.js +488 -0
- package/dist/core/plan/index.d.ts +19 -0
- package/dist/core/plan/index.js +21 -0
- package/dist/core/plan/io.d.ts +12 -0
- package/dist/core/plan/io.js +17 -0
- package/dist/core/plan/risk.d.ts +10 -0
- package/dist/core/plan/risk.js +38 -0
- package/dist/core/plan/serialize.d.ts +26 -0
- package/dist/core/plan/serialize.js +176 -0
- package/dist/core/plan/statements.d.ts +8 -0
- package/dist/core/plan/statements.js +13 -0
- package/dist/core/plan/types.d.ts +153 -0
- package/dist/core/plan/types.js +32 -0
- package/dist/core/postgres-config.d.ts +8 -0
- package/dist/core/postgres-config.js +46 -0
- package/dist/core/sort/custom-constraints.d.ts +9 -0
- package/dist/core/sort/custom-constraints.js +133 -0
- package/dist/core/sort/debug-visualization.d.ts +8 -0
- package/dist/core/sort/debug-visualization.js +145 -0
- package/dist/core/sort/dependency-filter.d.ts +19 -0
- package/dist/core/sort/dependency-filter.js +152 -0
- package/dist/core/sort/graph-builder.d.ts +37 -0
- package/dist/core/sort/graph-builder.js +172 -0
- package/dist/core/sort/graph-utils.d.ts +14 -0
- package/dist/core/sort/graph-utils.js +41 -0
- package/dist/core/sort/logical-sort.d.ts +26 -0
- package/dist/core/sort/logical-sort.js +532 -0
- package/dist/core/sort/sort-changes.d.ts +28 -0
- package/dist/core/sort/sort-changes.js +147 -0
- package/dist/core/sort/topological-sort.d.ts +20 -0
- package/dist/core/sort/topological-sort.js +138 -0
- package/dist/core/sort/types.d.ts +102 -0
- package/dist/core/sort/types.js +1 -0
- package/dist/core/sort/utils.d.ts +23 -0
- package/dist/core/sort/utils.js +51 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +58 -12
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { diffObjects } from "../base.diff.js";
|
|
2
|
+
import { deepEqual, hasNonAlterableChanges } from "../utils.js";
|
|
3
|
+
import { AlterIndexSetStatistics, AlterIndexSetStorageParams, AlterIndexSetTablespace, } from "./changes/index.alter.js";
|
|
4
|
+
import { CreateCommentOnIndex, DropCommentOnIndex, } from "./changes/index.comment.js";
|
|
5
|
+
import { CreateIndex } from "./changes/index.create.js";
|
|
6
|
+
import { DropIndex } from "./changes/index.drop.js";
|
|
7
|
+
/**
|
|
8
|
+
* Diff two sets of indexes from main and branch catalogs.
|
|
9
|
+
*
|
|
10
|
+
* @param main - The indexes in the main catalog.
|
|
11
|
+
* @param branch - The indexes in the branch catalog.
|
|
12
|
+
* @param branchIndexableObjects - Table-like objects (tables, materialized views) in branch.
|
|
13
|
+
* @returns A list of changes to apply to main to make it match branch.
|
|
14
|
+
*/
|
|
15
|
+
export function diffIndexes(main, branch, branchIndexableObjects) {
|
|
16
|
+
const { created, dropped, altered } = diffObjects(main, branch);
|
|
17
|
+
const changes = [];
|
|
18
|
+
for (const indexId of created) {
|
|
19
|
+
const index = branch[indexId];
|
|
20
|
+
// Skip constraint-owned or primary indexes; they are created by constraint DDL
|
|
21
|
+
if (index.is_owned_by_constraint || index.is_primary) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// Skip index partitions - they are automatically created when the parent partitioned index is created
|
|
25
|
+
if (index.is_index_partition) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
changes.push(new CreateIndex({
|
|
29
|
+
index,
|
|
30
|
+
indexableObject: branchIndexableObjects[index.tableStableId],
|
|
31
|
+
}));
|
|
32
|
+
if (index.comment !== null) {
|
|
33
|
+
changes.push(new CreateCommentOnIndex({ index }));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const indexId of dropped) {
|
|
37
|
+
const index = main[indexId];
|
|
38
|
+
// Constraint-owned or primary indexes are handled by constraint/table drops
|
|
39
|
+
if (index.is_owned_by_constraint ||
|
|
40
|
+
index.is_primary ||
|
|
41
|
+
!branchIndexableObjects[index.tableStableId]) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Skip index partitions - they are automatically dropped when the parent partitioned index is dropped
|
|
45
|
+
if (index.is_index_partition) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
changes.push(new DropIndex({ index: main[indexId] }));
|
|
49
|
+
}
|
|
50
|
+
for (const indexId of altered) {
|
|
51
|
+
const mainIndex = main[indexId];
|
|
52
|
+
const branchIndex = branch[indexId];
|
|
53
|
+
// Constraint-owned or primary indexes are handled by constraint/table DDL
|
|
54
|
+
if (mainIndex.is_owned_by_constraint || mainIndex.is_primary) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (branchIndex.is_owned_by_constraint || branchIndex.is_primary) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Skip index partitions - they are automatically updated when the parent partitioned index is updated
|
|
61
|
+
if (mainIndex.is_index_partition || branchIndex.is_index_partition) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Check if non-alterable properties have changed
|
|
65
|
+
// These require dropping and recreating the index
|
|
66
|
+
// Note: key_columns is excluded because it contains attribute numbers that can differ
|
|
67
|
+
// between databases even when indexes are logically identical. The definition field
|
|
68
|
+
// already captures the logical structure using column names, so we compare by definition instead.
|
|
69
|
+
const NON_ALTERABLE_FIELDS = [
|
|
70
|
+
"index_type",
|
|
71
|
+
"is_unique",
|
|
72
|
+
"is_primary",
|
|
73
|
+
"is_exclusion",
|
|
74
|
+
"nulls_not_distinct",
|
|
75
|
+
"immediate",
|
|
76
|
+
"is_clustered",
|
|
77
|
+
"is_replica_identity",
|
|
78
|
+
"column_collations",
|
|
79
|
+
"operator_classes",
|
|
80
|
+
"column_options",
|
|
81
|
+
"index_expressions",
|
|
82
|
+
"partial_predicate",
|
|
83
|
+
"definition", // Compare by definition instead of key_columns
|
|
84
|
+
];
|
|
85
|
+
const nonAlterablePropsChanged = hasNonAlterableChanges(mainIndex, branchIndex, NON_ALTERABLE_FIELDS, {
|
|
86
|
+
column_collations: deepEqual,
|
|
87
|
+
operator_classes: deepEqual,
|
|
88
|
+
column_options: deepEqual,
|
|
89
|
+
definition: (a, b) => {
|
|
90
|
+
// Normalize definitions by removing "USING btree" (default) for comparison
|
|
91
|
+
const normalize = (def) => def.replace(/\s+USING\s+btree/gi, "");
|
|
92
|
+
return normalize(a) === normalize(b);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
if (nonAlterablePropsChanged) {
|
|
96
|
+
// Replace the entire index (drop + create)
|
|
97
|
+
changes.push(new DropIndex({ index: mainIndex }), new CreateIndex({
|
|
98
|
+
index: branchIndex,
|
|
99
|
+
indexableObject: branchIndexableObjects[branchIndex.tableStableId],
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Only alterable properties changed - check each one
|
|
104
|
+
// STORAGE PARAMS
|
|
105
|
+
if (JSON.stringify(mainIndex.storage_params) !==
|
|
106
|
+
JSON.stringify(branchIndex.storage_params)) {
|
|
107
|
+
const parseOptions = (options) => {
|
|
108
|
+
const map = new Map();
|
|
109
|
+
for (const opt of options) {
|
|
110
|
+
const eqIndex = opt.indexOf("=");
|
|
111
|
+
const key = opt.slice(0, eqIndex);
|
|
112
|
+
const value = opt.slice(eqIndex + 1);
|
|
113
|
+
map.set(key, value);
|
|
114
|
+
}
|
|
115
|
+
return map;
|
|
116
|
+
};
|
|
117
|
+
const mainMap = parseOptions(mainIndex.storage_params);
|
|
118
|
+
const branchMap = parseOptions(branchIndex.storage_params);
|
|
119
|
+
const keysToReset = [];
|
|
120
|
+
for (const key of mainMap.keys()) {
|
|
121
|
+
if (!branchMap.has(key)) {
|
|
122
|
+
keysToReset.push(key);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const paramsToSet = [];
|
|
126
|
+
for (const [key, newValue] of branchMap.entries()) {
|
|
127
|
+
const oldValue = mainMap.get(key);
|
|
128
|
+
const changed = oldValue !== newValue;
|
|
129
|
+
if (changed) {
|
|
130
|
+
paramsToSet.push(`${key}=${newValue}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
changes.push(new AlterIndexSetStorageParams({
|
|
134
|
+
index: mainIndex,
|
|
135
|
+
paramsToSet,
|
|
136
|
+
keysToReset,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
// STATISTICS TARGET
|
|
140
|
+
if (JSON.stringify(mainIndex.statistics_target) !==
|
|
141
|
+
JSON.stringify(branchIndex.statistics_target)) {
|
|
142
|
+
const columnTargets = [];
|
|
143
|
+
const mainTargets = mainIndex.statistics_target;
|
|
144
|
+
const branchTargets = branchIndex.statistics_target;
|
|
145
|
+
const length = Math.max(mainTargets.length, branchTargets.length);
|
|
146
|
+
for (let i = 0; i < length; i++) {
|
|
147
|
+
const oldVal = mainTargets[i];
|
|
148
|
+
const newVal = branchTargets[i];
|
|
149
|
+
if (oldVal !== newVal && newVal !== undefined) {
|
|
150
|
+
columnTargets.push({ columnNumber: i + 1, statistics: newVal });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (columnTargets.length > 0) {
|
|
154
|
+
changes.push(new AlterIndexSetStatistics({ index: mainIndex, columnTargets }));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// TABLESPACE
|
|
158
|
+
if (mainIndex.tablespace !== branchIndex.tablespace) {
|
|
159
|
+
const nextTablespace = branchIndex.tablespace;
|
|
160
|
+
if (nextTablespace !== null) {
|
|
161
|
+
changes.push(new AlterIndexSetTablespace({
|
|
162
|
+
index: mainIndex,
|
|
163
|
+
tablespace: nextTablespace,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// COMMENT
|
|
168
|
+
if (mainIndex.comment !== branchIndex.comment) {
|
|
169
|
+
if (branchIndex.comment === null) {
|
|
170
|
+
changes.push(new DropCommentOnIndex({ index: mainIndex }));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
changes.push(new CreateCommentOnIndex({ index: branchIndex }));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Note: Index renaming would also use ALTER INDEX ... RENAME TO ...
|
|
177
|
+
// But since our Index model uses 'name' as the identity field,
|
|
178
|
+
// a name change would be handled as drop + create by diffObjects()
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return changes;
|
|
182
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { Sql } from "postgres";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import { BasePgModel } from "../base.model.ts";
|
|
4
|
+
declare const indexPropsSchema: z.ZodObject<{
|
|
5
|
+
schema: z.ZodString;
|
|
6
|
+
table_name: z.ZodString;
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
storage_params: z.ZodArray<z.ZodString>;
|
|
9
|
+
statistics_target: z.ZodArray<z.ZodNumber>;
|
|
10
|
+
index_type: z.ZodString;
|
|
11
|
+
tablespace: z.ZodNullable<z.ZodString>;
|
|
12
|
+
is_unique: z.ZodBoolean;
|
|
13
|
+
is_primary: z.ZodBoolean;
|
|
14
|
+
is_exclusion: z.ZodBoolean;
|
|
15
|
+
nulls_not_distinct: z.ZodBoolean;
|
|
16
|
+
immediate: z.ZodBoolean;
|
|
17
|
+
is_clustered: z.ZodBoolean;
|
|
18
|
+
is_replica_identity: z.ZodBoolean;
|
|
19
|
+
key_columns: z.ZodArray<z.ZodNumber>;
|
|
20
|
+
column_collations: z.ZodArray<z.ZodString>;
|
|
21
|
+
operator_classes: z.ZodArray<z.ZodString>;
|
|
22
|
+
column_options: z.ZodArray<z.ZodNumber>;
|
|
23
|
+
index_expressions: z.ZodNullable<z.ZodString>;
|
|
24
|
+
partial_predicate: z.ZodNullable<z.ZodString>;
|
|
25
|
+
is_owned_by_constraint: z.ZodBoolean;
|
|
26
|
+
table_relkind: z.ZodEnum<{
|
|
27
|
+
r: "r";
|
|
28
|
+
m: "m";
|
|
29
|
+
p: "p";
|
|
30
|
+
}>;
|
|
31
|
+
is_partitioned_index: z.ZodBoolean;
|
|
32
|
+
is_index_partition: z.ZodBoolean;
|
|
33
|
+
parent_index_name: z.ZodNullable<z.ZodString>;
|
|
34
|
+
definition: z.ZodString;
|
|
35
|
+
comment: z.ZodNullable<z.ZodString>;
|
|
36
|
+
owner: z.ZodString;
|
|
37
|
+
}, z.z.core.$strip>;
|
|
38
|
+
/**
|
|
39
|
+
* All properties exposed by CREATE INDEX statement are included in diff output.
|
|
40
|
+
* https://www.postgresql.org/docs/current/sql-createindex.html
|
|
41
|
+
*
|
|
42
|
+
* ALTER INDEX statement can only be generated for a subset of properties:
|
|
43
|
+
* - name, storage param, statistics, tablespace, attach partition
|
|
44
|
+
* https://www.postgresql.org/docs/current/sql-alterindex.html
|
|
45
|
+
*
|
|
46
|
+
* Unsupported alter properties include
|
|
47
|
+
* - depends on extension (all extension dependencies are excluded)
|
|
48
|
+
*
|
|
49
|
+
* Other properties require dropping and creating a new index.
|
|
50
|
+
*/
|
|
51
|
+
export type IndexProps = z.infer<typeof indexPropsSchema>;
|
|
52
|
+
export declare class Index extends BasePgModel {
|
|
53
|
+
readonly schema: IndexProps["schema"];
|
|
54
|
+
readonly table_name: IndexProps["table_name"];
|
|
55
|
+
readonly name: IndexProps["name"];
|
|
56
|
+
readonly storage_params: IndexProps["storage_params"];
|
|
57
|
+
readonly statistics_target: IndexProps["statistics_target"];
|
|
58
|
+
readonly index_type: IndexProps["index_type"];
|
|
59
|
+
readonly tablespace: IndexProps["tablespace"];
|
|
60
|
+
readonly is_unique: IndexProps["is_unique"];
|
|
61
|
+
readonly is_primary: IndexProps["is_primary"];
|
|
62
|
+
readonly is_exclusion: IndexProps["is_exclusion"];
|
|
63
|
+
readonly nulls_not_distinct: IndexProps["nulls_not_distinct"];
|
|
64
|
+
readonly immediate: IndexProps["immediate"];
|
|
65
|
+
readonly is_clustered: IndexProps["is_clustered"];
|
|
66
|
+
readonly is_replica_identity: IndexProps["is_replica_identity"];
|
|
67
|
+
readonly key_columns: IndexProps["key_columns"];
|
|
68
|
+
readonly column_collations: IndexProps["column_collations"];
|
|
69
|
+
readonly operator_classes: IndexProps["operator_classes"];
|
|
70
|
+
readonly column_options: IndexProps["column_options"];
|
|
71
|
+
readonly index_expressions: IndexProps["index_expressions"];
|
|
72
|
+
readonly partial_predicate: IndexProps["partial_predicate"];
|
|
73
|
+
readonly table_relkind: IndexProps["table_relkind"];
|
|
74
|
+
readonly is_owned_by_constraint: IndexProps["is_owned_by_constraint"];
|
|
75
|
+
readonly is_partitioned_index: IndexProps["is_partitioned_index"];
|
|
76
|
+
readonly is_index_partition: IndexProps["is_index_partition"];
|
|
77
|
+
readonly parent_index_name: IndexProps["parent_index_name"];
|
|
78
|
+
readonly definition: IndexProps["definition"];
|
|
79
|
+
readonly comment: IndexProps["comment"];
|
|
80
|
+
readonly owner: IndexProps["owner"];
|
|
81
|
+
constructor(props: IndexProps);
|
|
82
|
+
get stableId(): `index:${string}`;
|
|
83
|
+
get tableStableId(): `table:${string}` | `materializedView:${string}`;
|
|
84
|
+
get identityFields(): {
|
|
85
|
+
schema: string;
|
|
86
|
+
table_name: string;
|
|
87
|
+
name: string;
|
|
88
|
+
};
|
|
89
|
+
get dataFields(): {
|
|
90
|
+
storage_params: string[];
|
|
91
|
+
statistics_target: number[];
|
|
92
|
+
index_type: string;
|
|
93
|
+
tablespace: string | null;
|
|
94
|
+
is_unique: boolean;
|
|
95
|
+
is_primary: boolean;
|
|
96
|
+
is_exclusion: boolean;
|
|
97
|
+
nulls_not_distinct: boolean;
|
|
98
|
+
immediate: boolean;
|
|
99
|
+
is_clustered: boolean;
|
|
100
|
+
is_replica_identity: boolean;
|
|
101
|
+
column_collations: string[];
|
|
102
|
+
operator_classes: string[];
|
|
103
|
+
column_options: number[];
|
|
104
|
+
index_expressions: string | null;
|
|
105
|
+
partial_predicate: string | null;
|
|
106
|
+
table_relkind: "r" | "m" | "p";
|
|
107
|
+
is_owned_by_constraint: boolean;
|
|
108
|
+
is_partitioned_index: boolean;
|
|
109
|
+
is_index_partition: boolean;
|
|
110
|
+
parent_index_name: string | null;
|
|
111
|
+
definition: string;
|
|
112
|
+
comment: string | null;
|
|
113
|
+
owner: string;
|
|
114
|
+
};
|
|
115
|
+
stableSnapshot(): {
|
|
116
|
+
identity: {
|
|
117
|
+
schema: string;
|
|
118
|
+
table_name: string;
|
|
119
|
+
name: string;
|
|
120
|
+
};
|
|
121
|
+
data: {
|
|
122
|
+
statistics_target: unknown;
|
|
123
|
+
column_options: unknown;
|
|
124
|
+
column_collations: unknown;
|
|
125
|
+
operator_classes: unknown;
|
|
126
|
+
storage_params: string[];
|
|
127
|
+
index_type: string;
|
|
128
|
+
tablespace: string | null;
|
|
129
|
+
is_unique: boolean;
|
|
130
|
+
is_primary: boolean;
|
|
131
|
+
is_exclusion: boolean;
|
|
132
|
+
nulls_not_distinct: boolean;
|
|
133
|
+
immediate: boolean;
|
|
134
|
+
is_clustered: boolean;
|
|
135
|
+
is_replica_identity: boolean;
|
|
136
|
+
index_expressions: string | null;
|
|
137
|
+
partial_predicate: string | null;
|
|
138
|
+
table_relkind: "r" | "m" | "p";
|
|
139
|
+
is_owned_by_constraint: boolean;
|
|
140
|
+
is_partitioned_index: boolean;
|
|
141
|
+
is_index_partition: boolean;
|
|
142
|
+
parent_index_name: string | null;
|
|
143
|
+
definition: string;
|
|
144
|
+
comment: string | null;
|
|
145
|
+
owner: string;
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export declare function extractIndexes(sql: Sql): Promise<Index[]>;
|
|
150
|
+
export {};
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
import { BasePgModel } from "../base.model.js";
|
|
3
|
+
const TableRelkindSchema = z.enum([
|
|
4
|
+
"r", // table (regular relation)
|
|
5
|
+
"m", // materialized view
|
|
6
|
+
"p", // partitioned table
|
|
7
|
+
]);
|
|
8
|
+
const indexPropsSchema = z.object({
|
|
9
|
+
schema: z.string(),
|
|
10
|
+
table_name: z.string(),
|
|
11
|
+
name: z.string(),
|
|
12
|
+
storage_params: z.array(z.string()),
|
|
13
|
+
statistics_target: z.array(z.number()),
|
|
14
|
+
index_type: z.string(),
|
|
15
|
+
tablespace: z.string().nullable(),
|
|
16
|
+
is_unique: z.boolean(),
|
|
17
|
+
is_primary: z.boolean(),
|
|
18
|
+
is_exclusion: z.boolean(),
|
|
19
|
+
nulls_not_distinct: z.boolean(),
|
|
20
|
+
immediate: z.boolean(),
|
|
21
|
+
is_clustered: z.boolean(),
|
|
22
|
+
is_replica_identity: z.boolean(),
|
|
23
|
+
key_columns: z.array(z.number()),
|
|
24
|
+
column_collations: z.array(z.string()),
|
|
25
|
+
operator_classes: z.array(z.string()),
|
|
26
|
+
column_options: z.array(z.number()),
|
|
27
|
+
index_expressions: z.string().nullable(),
|
|
28
|
+
partial_predicate: z.string().nullable(),
|
|
29
|
+
is_owned_by_constraint: z.boolean(),
|
|
30
|
+
table_relkind: TableRelkindSchema, // 'r' for table, 'm' for materialized view
|
|
31
|
+
is_partitioned_index: z.boolean(),
|
|
32
|
+
is_index_partition: z.boolean(),
|
|
33
|
+
parent_index_name: z.string().nullable(),
|
|
34
|
+
definition: z.string(),
|
|
35
|
+
comment: z.string().nullable(),
|
|
36
|
+
owner: z.string(),
|
|
37
|
+
});
|
|
38
|
+
export class Index extends BasePgModel {
|
|
39
|
+
schema;
|
|
40
|
+
table_name;
|
|
41
|
+
name;
|
|
42
|
+
storage_params;
|
|
43
|
+
statistics_target;
|
|
44
|
+
index_type;
|
|
45
|
+
tablespace;
|
|
46
|
+
is_unique;
|
|
47
|
+
is_primary;
|
|
48
|
+
is_exclusion;
|
|
49
|
+
nulls_not_distinct;
|
|
50
|
+
immediate;
|
|
51
|
+
is_clustered;
|
|
52
|
+
is_replica_identity;
|
|
53
|
+
key_columns;
|
|
54
|
+
column_collations;
|
|
55
|
+
operator_classes;
|
|
56
|
+
column_options;
|
|
57
|
+
index_expressions;
|
|
58
|
+
partial_predicate;
|
|
59
|
+
table_relkind;
|
|
60
|
+
is_owned_by_constraint;
|
|
61
|
+
is_partitioned_index;
|
|
62
|
+
is_index_partition;
|
|
63
|
+
parent_index_name;
|
|
64
|
+
definition;
|
|
65
|
+
comment;
|
|
66
|
+
owner;
|
|
67
|
+
constructor(props) {
|
|
68
|
+
super();
|
|
69
|
+
// Identity fields
|
|
70
|
+
this.schema = props.schema;
|
|
71
|
+
this.table_name = props.table_name;
|
|
72
|
+
this.name = props.name;
|
|
73
|
+
// Data fields
|
|
74
|
+
this.storage_params = props.storage_params;
|
|
75
|
+
this.statistics_target = props.statistics_target;
|
|
76
|
+
this.index_type = props.index_type;
|
|
77
|
+
this.tablespace = props.tablespace;
|
|
78
|
+
this.is_unique = props.is_unique;
|
|
79
|
+
this.is_primary = props.is_primary;
|
|
80
|
+
this.is_exclusion = props.is_exclusion;
|
|
81
|
+
this.nulls_not_distinct = props.nulls_not_distinct;
|
|
82
|
+
this.immediate = props.immediate;
|
|
83
|
+
this.is_clustered = props.is_clustered;
|
|
84
|
+
this.is_replica_identity = props.is_replica_identity;
|
|
85
|
+
this.key_columns = props.key_columns;
|
|
86
|
+
this.column_collations = props.column_collations;
|
|
87
|
+
this.operator_classes = props.operator_classes;
|
|
88
|
+
this.column_options = props.column_options;
|
|
89
|
+
this.index_expressions = props.index_expressions;
|
|
90
|
+
this.partial_predicate = props.partial_predicate;
|
|
91
|
+
this.table_relkind = props.table_relkind;
|
|
92
|
+
this.is_owned_by_constraint = props.is_owned_by_constraint;
|
|
93
|
+
this.is_partitioned_index = props.is_partitioned_index;
|
|
94
|
+
this.is_index_partition = props.is_index_partition;
|
|
95
|
+
this.parent_index_name = props.parent_index_name;
|
|
96
|
+
this.definition = props.definition;
|
|
97
|
+
this.comment = props.comment;
|
|
98
|
+
this.owner = props.owner;
|
|
99
|
+
}
|
|
100
|
+
get stableId() {
|
|
101
|
+
return `index:${this.schema}.${this.table_name}.${this.name}`;
|
|
102
|
+
}
|
|
103
|
+
get tableStableId() {
|
|
104
|
+
// Materialized views use a different stableId prefix
|
|
105
|
+
if (this.table_relkind === "m") {
|
|
106
|
+
return `materializedView:${this.schema}.${this.table_name}`;
|
|
107
|
+
}
|
|
108
|
+
return `table:${this.schema}.${this.table_name}`;
|
|
109
|
+
}
|
|
110
|
+
get identityFields() {
|
|
111
|
+
return {
|
|
112
|
+
schema: this.schema,
|
|
113
|
+
table_name: this.table_name,
|
|
114
|
+
name: this.name,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
get dataFields() {
|
|
118
|
+
return {
|
|
119
|
+
storage_params: this.storage_params,
|
|
120
|
+
statistics_target: this.statistics_target,
|
|
121
|
+
index_type: this.index_type,
|
|
122
|
+
tablespace: this.tablespace,
|
|
123
|
+
is_unique: this.is_unique,
|
|
124
|
+
is_primary: this.is_primary,
|
|
125
|
+
is_exclusion: this.is_exclusion,
|
|
126
|
+
nulls_not_distinct: this.nulls_not_distinct,
|
|
127
|
+
immediate: this.immediate,
|
|
128
|
+
is_clustered: this.is_clustered,
|
|
129
|
+
is_replica_identity: this.is_replica_identity,
|
|
130
|
+
// key_columns excluded: contains attribute numbers that can differ between databases
|
|
131
|
+
// even when indexes are logically identical. The definition field already captures
|
|
132
|
+
// the logical structure using column names, so we compare by definition instead.
|
|
133
|
+
column_collations: this.column_collations,
|
|
134
|
+
operator_classes: this.operator_classes,
|
|
135
|
+
column_options: this.column_options,
|
|
136
|
+
index_expressions: this.index_expressions,
|
|
137
|
+
partial_predicate: this.partial_predicate,
|
|
138
|
+
table_relkind: this.table_relkind,
|
|
139
|
+
is_owned_by_constraint: this.is_owned_by_constraint,
|
|
140
|
+
is_partitioned_index: this.is_partitioned_index,
|
|
141
|
+
is_index_partition: this.is_index_partition,
|
|
142
|
+
parent_index_name: this.parent_index_name,
|
|
143
|
+
definition: this.definition,
|
|
144
|
+
comment: this.comment,
|
|
145
|
+
owner: this.owner,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
stableSnapshot() {
|
|
149
|
+
const normalizeArray = (arr) => {
|
|
150
|
+
if (!Array.isArray(arr))
|
|
151
|
+
return arr;
|
|
152
|
+
return [...arr].map((v) => normalizeValue(v));
|
|
153
|
+
};
|
|
154
|
+
const normalizeValue = (v) => {
|
|
155
|
+
if (Array.isArray(v))
|
|
156
|
+
return normalizeArray(v);
|
|
157
|
+
if (v && typeof v === "object") {
|
|
158
|
+
return Object.fromEntries(Object.entries(v).map(([k, val]) => [
|
|
159
|
+
k,
|
|
160
|
+
normalizeValue(val),
|
|
161
|
+
]));
|
|
162
|
+
}
|
|
163
|
+
return v;
|
|
164
|
+
};
|
|
165
|
+
return {
|
|
166
|
+
identity: this.identityFields,
|
|
167
|
+
data: {
|
|
168
|
+
...this.dataFields,
|
|
169
|
+
statistics_target: normalizeArray(this.statistics_target),
|
|
170
|
+
column_options: normalizeArray(this.column_options),
|
|
171
|
+
column_collations: normalizeArray(this.column_collations),
|
|
172
|
+
operator_classes: normalizeArray(this.operator_classes),
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export async function extractIndexes(sql) {
|
|
178
|
+
return sql.begin(async (sql) => {
|
|
179
|
+
await sql `set search_path = ''`;
|
|
180
|
+
const indexRows = await sql `
|
|
181
|
+
with extension_oids as (
|
|
182
|
+
select objid
|
|
183
|
+
from pg_depend d
|
|
184
|
+
where d.refclassid = 'pg_extension'::regclass
|
|
185
|
+
and d.classid = 'pg_class'::regclass
|
|
186
|
+
),
|
|
187
|
+
-- align every per-column array by ordinality (1..indnatts)
|
|
188
|
+
-- this is used to ensure that key_columns, column_collations, operator_classes, and column_options are aligned
|
|
189
|
+
idx_cols as (
|
|
190
|
+
select
|
|
191
|
+
i.indexrelid,
|
|
192
|
+
i.indrelid,
|
|
193
|
+
k.ord,
|
|
194
|
+
k.attnum,
|
|
195
|
+
-- collation: only for key cols; 0 for none/default
|
|
196
|
+
case when k.ord <= i.indnkeyatts then coalesce(coll.oid, 0) else 0 end as coll_oid,
|
|
197
|
+
-- opclass: one per column
|
|
198
|
+
coalesce(cls.oid, 0) as cls_oid,
|
|
199
|
+
-- options: only for key cols; 0 for include cols
|
|
200
|
+
case when k.ord <= i.indnkeyatts then coalesce(opt.val, 0) else 0 end::int2 as indopt
|
|
201
|
+
from pg_index i
|
|
202
|
+
join lateral unnest(i.indkey) with ordinality as k(attnum, ord) on true
|
|
203
|
+
left join lateral unnest(i.indcollation) with ordinality as coll(oid, ordc) on ordc = k.ord
|
|
204
|
+
left join lateral unnest(i.indclass) with ordinality as cls(oid, ordo) on ordo = k.ord
|
|
205
|
+
left join lateral unnest(i.indoption) with ordinality as opt(val, ordi) on ordi = k.ord
|
|
206
|
+
)
|
|
207
|
+
select
|
|
208
|
+
c.relnamespace::regnamespace::text as schema,
|
|
209
|
+
quote_ident(tc.relname) as table_name,
|
|
210
|
+
tc.relkind as table_relkind,
|
|
211
|
+
quote_ident(c.relname) as name,
|
|
212
|
+
coalesce(c.reloptions, array[]::text[]) as storage_params,
|
|
213
|
+
am.amname as index_type,
|
|
214
|
+
quote_ident(ts.spcname) as tablespace,
|
|
215
|
+
i.indisunique as is_unique,
|
|
216
|
+
i.indisprimary as is_primary,
|
|
217
|
+
i.indisexclusion as is_exclusion,
|
|
218
|
+
i.indnullsnotdistinct as nulls_not_distinct,
|
|
219
|
+
i.indimmediate as immediate,
|
|
220
|
+
i.indisclustered as is_clustered,
|
|
221
|
+
i.indisreplident as is_replica_identity,
|
|
222
|
+
i.indkey as key_columns,
|
|
223
|
+
|
|
224
|
+
-- NEW: partitioned-index / index-partition tagging
|
|
225
|
+
(c.relkind = 'I') as is_partitioned_index,
|
|
226
|
+
(parent_idx.oid is not null) as is_index_partition,
|
|
227
|
+
case
|
|
228
|
+
when parent_idx.oid is not null then
|
|
229
|
+
quote_ident(parent_idx_ns.nspname) || '.' || quote_ident(parent_idx.relname)
|
|
230
|
+
end as parent_index_name,
|
|
231
|
+
|
|
232
|
+
-- Foreign keys don’t create/own an index; their conindid points to the referenced PK/UNIQUE index.
|
|
233
|
+
-- Mark as is_owned_by_constraint only when the owning constraint is PK/UNIQUE/EXCLUSION.
|
|
234
|
+
exists (
|
|
235
|
+
select 1
|
|
236
|
+
from pg_depend d
|
|
237
|
+
join pg_constraint pc on pc.oid = d.refobjid
|
|
238
|
+
where d.classid = 'pg_class'::regclass
|
|
239
|
+
and d.objid = i.indexrelid
|
|
240
|
+
and d.refclassid = 'pg_constraint'::regclass
|
|
241
|
+
and d.deptype = 'i'
|
|
242
|
+
and pc.contype in ('p','u','x')
|
|
243
|
+
) as is_owned_by_constraint,
|
|
244
|
+
|
|
245
|
+
-- per-column arrays from one pass over idx_cols
|
|
246
|
+
coalesce(agg.column_collations, array[]::text[]) as column_collations,
|
|
247
|
+
coalesce(agg.operator_classes, array[]::text[]) as operator_classes,
|
|
248
|
+
coalesce(agg.column_options, array[]::int2[]) as column_options,
|
|
249
|
+
|
|
250
|
+
-- always an array (possibly empty), ordered by index attnum
|
|
251
|
+
coalesce(st.statistics_target, array[]::int4[]) as statistics_target,
|
|
252
|
+
|
|
253
|
+
pg_get_expr(i.indexprs, i.indrelid) as index_expressions,
|
|
254
|
+
pg_get_expr(i.indpred, i.indrelid) as partial_predicate,
|
|
255
|
+
pg_get_indexdef(i.indexrelid, 0, true) as definition,
|
|
256
|
+
obj_description(c.oid, 'pg_class') as comment,
|
|
257
|
+
c.relowner::regrole::text as owner
|
|
258
|
+
|
|
259
|
+
from pg_index i
|
|
260
|
+
join pg_class c on c.oid = i.indexrelid
|
|
261
|
+
join pg_class tc on tc.oid = i.indrelid
|
|
262
|
+
join pg_am am on am.oid = c.relam
|
|
263
|
+
left join pg_tablespace ts on ts.oid = c.reltablespace
|
|
264
|
+
left join extension_oids e on c.oid = e.objid
|
|
265
|
+
left join extension_oids e_table on tc.oid = e_table.objid
|
|
266
|
+
|
|
267
|
+
-- NEW: detect whether this index is an attached partition of a partitioned index
|
|
268
|
+
left join pg_inherits inh_idx
|
|
269
|
+
on inh_idx.inhrelid = c.oid
|
|
270
|
+
left join pg_class parent_idx
|
|
271
|
+
on parent_idx.oid = inh_idx.inhparent
|
|
272
|
+
left join pg_namespace parent_idx_ns
|
|
273
|
+
on parent_idx_ns.oid = parent_idx.relnamespace
|
|
274
|
+
|
|
275
|
+
-- single lateral aggregate keeps order by ic2.ord
|
|
276
|
+
left join lateral (
|
|
277
|
+
select
|
|
278
|
+
array_agg(
|
|
279
|
+
case
|
|
280
|
+
when ic2.coll_oid = 0 then null
|
|
281
|
+
when col.collname = 'default'
|
|
282
|
+
and col.collnamespace = 'pg_catalog'::regnamespace then null
|
|
283
|
+
else quote_ident(ns_coll.nspname) || '.' || quote_ident(col.collname)
|
|
284
|
+
end
|
|
285
|
+
order by ic2.ord
|
|
286
|
+
) as column_collations,
|
|
287
|
+
|
|
288
|
+
-- 'default' when the AM's default opclass applies to the column's base type
|
|
289
|
+
array_agg(
|
|
290
|
+
case
|
|
291
|
+
when oc.oid is null then 'default'
|
|
292
|
+
when ic2.attnum = 0 then oc.opcnamespace::regnamespace::text || '.' || quote_ident(oc.opcname) -- expression key: no column type
|
|
293
|
+
-- in the case where the opclass is the default for the column's base type
|
|
294
|
+
when oc.opcdefault and (
|
|
295
|
+
(case when t.typtype = 'd' then t.typbasetype else a.atttypid end) = oc.opcintype
|
|
296
|
+
or exists (
|
|
297
|
+
select 1
|
|
298
|
+
from pg_catalog.pg_cast pc
|
|
299
|
+
where pc.castsource = (case when t.typtype = 'd' then t.typbasetype else a.atttypid end)
|
|
300
|
+
and pc.casttarget = oc.opcintype
|
|
301
|
+
and pc.castcontext = 'i' -- implicit
|
|
302
|
+
)
|
|
303
|
+
)
|
|
304
|
+
then 'default'
|
|
305
|
+
else oc.opcnamespace::regnamespace::text || '.' || quote_ident(oc.opcname)
|
|
306
|
+
end
|
|
307
|
+
order by ic2.ord
|
|
308
|
+
) as operator_classes,
|
|
309
|
+
|
|
310
|
+
array_agg(coalesce(ic2.indopt, 0)::int2 order by ic2.ord) as column_options
|
|
311
|
+
|
|
312
|
+
from idx_cols ic2
|
|
313
|
+
left join pg_collation col on col.oid = ic2.coll_oid
|
|
314
|
+
left join pg_namespace ns_coll on ns_coll.oid = col.collnamespace
|
|
315
|
+
left join pg_opclass oc on oc.oid = ic2.cls_oid
|
|
316
|
+
-- base type for the underlying column (domain -> base); NULL for expressions
|
|
317
|
+
left join pg_attribute a on a.attrelid = ic2.indrelid and a.attnum = ic2.attnum
|
|
318
|
+
left join pg_type t on t.oid = a.atttypid
|
|
319
|
+
where ic2.indexrelid = i.indexrelid
|
|
320
|
+
) as agg on true
|
|
321
|
+
|
|
322
|
+
left join lateral (
|
|
323
|
+
select array_agg(coalesce(a2.attstattarget, -1) order by a2.attnum) as statistics_target
|
|
324
|
+
from pg_attribute a2
|
|
325
|
+
where a2.attrelid = i.indexrelid
|
|
326
|
+
and a2.attnum > 0
|
|
327
|
+
) as st on true
|
|
328
|
+
|
|
329
|
+
where not c.relnamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
|
|
330
|
+
and i.indislive is true
|
|
331
|
+
and e.objid is null
|
|
332
|
+
and e_table.objid is null
|
|
333
|
+
|
|
334
|
+
order by 1, 2;
|
|
335
|
+
`;
|
|
336
|
+
// Validate and parse each row using the Zod schema
|
|
337
|
+
const validatedRows = indexRows.map((row) => indexPropsSchema.parse(row));
|
|
338
|
+
return validatedRows.map((row) => new Index(row));
|
|
339
|
+
});
|
|
340
|
+
}
|