@neverinfamous/postgres-mcp 1.0.1
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 +515 -0
- package/dist/__tests__/mocks/adapter.d.ts +80 -0
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -0
- package/dist/__tests__/mocks/adapter.js +225 -0
- package/dist/__tests__/mocks/adapter.js.map +1 -0
- package/dist/__tests__/mocks/index.d.ts +11 -0
- package/dist/__tests__/mocks/index.d.ts.map +1 -0
- package/dist/__tests__/mocks/index.js +11 -0
- package/dist/__tests__/mocks/index.js.map +1 -0
- package/dist/__tests__/mocks/pool.d.ts +43 -0
- package/dist/__tests__/mocks/pool.d.ts.map +1 -0
- package/dist/__tests__/mocks/pool.js +71 -0
- package/dist/__tests__/mocks/pool.js.map +1 -0
- package/dist/adapters/DatabaseAdapter.d.ts +139 -0
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
- package/dist/adapters/DatabaseAdapter.js +250 -0
- package/dist/adapters/DatabaseAdapter.js.map +1 -0
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +119 -0
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -0
- package/dist/adapters/postgresql/PostgresAdapter.js +902 -0
- package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -0
- package/dist/adapters/postgresql/index.d.ts +5 -0
- package/dist/adapters/postgresql/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/index.js +5 -0
- package/dist/adapters/postgresql/index.js.map +1 -0
- package/dist/adapters/postgresql/prompts/backup.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/backup.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/backup.js +132 -0
- package/dist/adapters/postgresql/prompts/backup.js.map +1 -0
- package/dist/adapters/postgresql/prompts/citext.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/citext.js +227 -0
- package/dist/adapters/postgresql/prompts/citext.js.map +1 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.js +282 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.js.map +1 -0
- package/dist/adapters/postgresql/prompts/health.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/health.js +118 -0
- package/dist/adapters/postgresql/prompts/health.js.map +1 -0
- package/dist/adapters/postgresql/prompts/index.d.ts +13 -0
- package/dist/adapters/postgresql/prompts/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/index.js +308 -0
- package/dist/adapters/postgresql/prompts/index.js.map +1 -0
- package/dist/adapters/postgresql/prompts/indexTuning.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/indexTuning.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/indexTuning.js +130 -0
- package/dist/adapters/postgresql/prompts/indexTuning.js.map +1 -0
- package/dist/adapters/postgresql/prompts/kcache.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/kcache.js +227 -0
- package/dist/adapters/postgresql/prompts/kcache.js.map +1 -0
- package/dist/adapters/postgresql/prompts/ltree.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/ltree.js +286 -0
- package/dist/adapters/postgresql/prompts/ltree.js.map +1 -0
- package/dist/adapters/postgresql/prompts/partman.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/partman.js +211 -0
- package/dist/adapters/postgresql/prompts/partman.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcron.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgcron.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcron.js +233 -0
- package/dist/adapters/postgresql/prompts/pgcron.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.js +299 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgvector.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgvector.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgvector.js +148 -0
- package/dist/adapters/postgresql/prompts/pgvector.js.map +1 -0
- package/dist/adapters/postgresql/prompts/postgis.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/postgis.js +200 -0
- package/dist/adapters/postgresql/prompts/postgis.js.map +1 -0
- package/dist/adapters/postgresql/resources/activity.d.ts +9 -0
- package/dist/adapters/postgresql/resources/activity.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/activity.js +118 -0
- package/dist/adapters/postgresql/resources/activity.js.map +1 -0
- package/dist/adapters/postgresql/resources/capabilities.d.ts +9 -0
- package/dist/adapters/postgresql/resources/capabilities.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/capabilities.js +182 -0
- package/dist/adapters/postgresql/resources/capabilities.js.map +1 -0
- package/dist/adapters/postgresql/resources/cron.d.ts +9 -0
- package/dist/adapters/postgresql/resources/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/cron.js +156 -0
- package/dist/adapters/postgresql/resources/cron.js.map +1 -0
- package/dist/adapters/postgresql/resources/crypto.d.ts +9 -0
- package/dist/adapters/postgresql/resources/crypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/crypto.js +191 -0
- package/dist/adapters/postgresql/resources/crypto.js.map +1 -0
- package/dist/adapters/postgresql/resources/extensions.d.ts +9 -0
- package/dist/adapters/postgresql/resources/extensions.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/extensions.js +85 -0
- package/dist/adapters/postgresql/resources/extensions.js.map +1 -0
- package/dist/adapters/postgresql/resources/health.d.ts +9 -0
- package/dist/adapters/postgresql/resources/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/health.js +185 -0
- package/dist/adapters/postgresql/resources/health.js.map +1 -0
- package/dist/adapters/postgresql/resources/index.d.ts +40 -0
- package/dist/adapters/postgresql/resources/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/index.js +87 -0
- package/dist/adapters/postgresql/resources/index.js.map +1 -0
- package/dist/adapters/postgresql/resources/indexes.d.ts +9 -0
- package/dist/adapters/postgresql/resources/indexes.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/indexes.js +130 -0
- package/dist/adapters/postgresql/resources/indexes.js.map +1 -0
- package/dist/adapters/postgresql/resources/kcache.d.ts +9 -0
- package/dist/adapters/postgresql/resources/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/kcache.js +219 -0
- package/dist/adapters/postgresql/resources/kcache.js.map +1 -0
- package/dist/adapters/postgresql/resources/locks.d.ts +9 -0
- package/dist/adapters/postgresql/resources/locks.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/locks.js +89 -0
- package/dist/adapters/postgresql/resources/locks.js.map +1 -0
- package/dist/adapters/postgresql/resources/partman.d.ts +9 -0
- package/dist/adapters/postgresql/resources/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/partman.js +149 -0
- package/dist/adapters/postgresql/resources/partman.js.map +1 -0
- package/dist/adapters/postgresql/resources/performance.d.ts +9 -0
- package/dist/adapters/postgresql/resources/performance.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/performance.js +170 -0
- package/dist/adapters/postgresql/resources/performance.js.map +1 -0
- package/dist/adapters/postgresql/resources/pool.d.ts +9 -0
- package/dist/adapters/postgresql/resources/pool.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/pool.js +93 -0
- package/dist/adapters/postgresql/resources/pool.js.map +1 -0
- package/dist/adapters/postgresql/resources/postgis.d.ts +9 -0
- package/dist/adapters/postgresql/resources/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/postgis.js +232 -0
- package/dist/adapters/postgresql/resources/postgis.js.map +1 -0
- package/dist/adapters/postgresql/resources/replication.d.ts +9 -0
- package/dist/adapters/postgresql/resources/replication.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/replication.js +126 -0
- package/dist/adapters/postgresql/resources/replication.js.map +1 -0
- package/dist/adapters/postgresql/resources/schema.d.ts +10 -0
- package/dist/adapters/postgresql/resources/schema.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/schema.js +80 -0
- package/dist/adapters/postgresql/resources/schema.js.map +1 -0
- package/dist/adapters/postgresql/resources/settings.d.ts +9 -0
- package/dist/adapters/postgresql/resources/settings.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/settings.js +184 -0
- package/dist/adapters/postgresql/resources/settings.js.map +1 -0
- package/dist/adapters/postgresql/resources/stats.d.ts +10 -0
- package/dist/adapters/postgresql/resources/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/stats.js +124 -0
- package/dist/adapters/postgresql/resources/stats.js.map +1 -0
- package/dist/adapters/postgresql/resources/tables.d.ts +9 -0
- package/dist/adapters/postgresql/resources/tables.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/tables.js +20 -0
- package/dist/adapters/postgresql/resources/tables.js.map +1 -0
- package/dist/adapters/postgresql/resources/vacuum.d.ts +9 -0
- package/dist/adapters/postgresql/resources/vacuum.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/vacuum.js +122 -0
- package/dist/adapters/postgresql/resources/vacuum.js.map +1 -0
- package/dist/adapters/postgresql/resources/vector.d.ts +9 -0
- package/dist/adapters/postgresql/resources/vector.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/vector.js +185 -0
- package/dist/adapters/postgresql/resources/vector.js.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts +74 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.js +180 -0
- package/dist/adapters/postgresql/schemas/admin.js.map +1 -0
- package/dist/adapters/postgresql/schemas/backup.d.ts +68 -0
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/backup.js +114 -0
- package/dist/adapters/postgresql/schemas/backup.js.map +1 -0
- package/dist/adapters/postgresql/schemas/core.d.ts +443 -0
- package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core.js +628 -0
- package/dist/adapters/postgresql/schemas/core.js.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts +131 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.js +218 -0
- package/dist/adapters/postgresql/schemas/cron.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions.d.ts +403 -0
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions.js +600 -0
- package/dist/adapters/postgresql/schemas/extensions.js.map +1 -0
- package/dist/adapters/postgresql/schemas/index.d.ts +21 -0
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/index.js +72 -0
- package/dist/adapters/postgresql/schemas/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +94 -0
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb.js +198 -0
- package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts +28 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.js +45 -0
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +152 -0
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/partitioning.js +399 -0
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -0
- package/dist/adapters/postgresql/schemas/partman.d.ts +94 -0
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/partman.js +264 -0
- package/dist/adapters/postgresql/schemas/partman.js.map +1 -0
- package/dist/adapters/postgresql/schemas/performance.d.ts +52 -0
- package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/performance.js +57 -0
- package/dist/adapters/postgresql/schemas/performance.js.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis.d.ts +693 -0
- package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis.js +662 -0
- package/dist/adapters/postgresql/schemas/postgis.js.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +171 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +235 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -0
- package/dist/adapters/postgresql/schemas/stats.d.ts +229 -0
- package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats.js +587 -0
- package/dist/adapters/postgresql/schemas/stats.js.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts +83 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.js +132 -0
- package/dist/adapters/postgresql/schemas/text-search.js.map +1 -0
- package/dist/adapters/postgresql/schemas/vector.d.ts +143 -0
- package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/vector.js +123 -0
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -0
- package/dist/adapters/postgresql/tools/admin.d.ts +13 -0
- package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/admin.js +417 -0
- package/dist/adapters/postgresql/tools/admin.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/dump.d.ts +12 -0
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/dump.js +546 -0
- package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/backup/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/index.js +29 -0
- package/dist/adapters/postgresql/tools/backup/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/planning.d.ts +22 -0
- package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/planning.js +411 -0
- package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext.d.ts +18 -0
- package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext.js +568 -0
- package/dist/adapters/postgresql/tools/citext.js.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts +27 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.js +171 -0
- package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/convenience.d.ts +192 -0
- package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/convenience.js +617 -0
- package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/health.d.ts +20 -0
- package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/health.js +360 -0
- package/dist/adapters/postgresql/tools/core/health.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/index.js +40 -0
- package/dist/adapters/postgresql/tools/core/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/indexes.d.ts +30 -0
- package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/indexes.js +232 -0
- package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/objects.d.ts +20 -0
- package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/objects.js +361 -0
- package/dist/adapters/postgresql/tools/core/objects.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/query.d.ts +16 -0
- package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/query.js +87 -0
- package/dist/adapters/postgresql/tools/core/query.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/schemas.d.ts +135 -0
- package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/schemas.js +221 -0
- package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/tables.d.ts +24 -0
- package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/tables.js +219 -0
- package/dist/adapters/postgresql/tools/core/tables.js.map +1 -0
- package/dist/adapters/postgresql/tools/cron.d.ts +16 -0
- package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/cron.js +440 -0
- package/dist/adapters/postgresql/tools/cron.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts +33 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.js +681 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +20 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.js +654 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.js +39 -0
- package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts +20 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.js +574 -0
- package/dist/adapters/postgresql/tools/kcache.js.map +1 -0
- package/dist/adapters/postgresql/tools/ltree.d.ts +8 -0
- package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/ltree.js +390 -0
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring.d.ts +13 -0
- package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring.js +753 -0
- package/dist/adapters/postgresql/tools/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning.d.ts +13 -0
- package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning.js +500 -0
- package/dist/adapters/postgresql/tools/partitioning.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts +19 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.js +33 -0
- package/dist/adapters/postgresql/tools/partman/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.js +563 -0
- package/dist/adapters/postgresql/tools/partman/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/operations.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/operations.js +632 -0
- package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/analysis.js +383 -0
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/explain.d.ts +13 -0
- package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/explain.js +71 -0
- package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts +13 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.js +40 -0
- package/dist/adapters/postgresql/tools/performance/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.js +122 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/optimization.js +315 -0
- package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/stats.d.ts +14 -0
- package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/stats.js +559 -0
- package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -0
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts +8 -0
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/pgcrypto.js +239 -0
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts +21 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.js +383 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts +16 -0
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/basic.js +479 -0
- package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/index.d.ts +17 -0
- package/dist/adapters/postgresql/tools/postgis/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/index.js +46 -0
- package/dist/adapters/postgresql/tools/postgis/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.d.ts +21 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.js +150 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema.d.ts +13 -0
- package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema.js +515 -0
- package/dist/adapters/postgresql/tools/schema.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts +24 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.js +876 -0
- package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/basic.d.ts +24 -0
- package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/basic.js +501 -0
- package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/index.d.ts +17 -0
- package/dist/adapters/postgresql/tools/stats/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/index.js +30 -0
- package/dist/adapters/postgresql/tools/stats/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/text.d.ts +13 -0
- package/dist/adapters/postgresql/tools/text.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text.js +708 -0
- package/dist/adapters/postgresql/tools/text.js.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts +13 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.js +201 -0
- package/dist/adapters/postgresql/tools/transactions.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts +12 -0
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/advanced.js +902 -0
- package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/basic.d.ts +25 -0
- package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/basic.js +1000 -0
- package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts +13 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.js +33 -0
- package/dist/adapters/postgresql/tools/vector/index.js.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts +44 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.js +117 -0
- package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
- package/dist/auth/OAuthResourceServer.d.ts +42 -0
- package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
- package/dist/auth/OAuthResourceServer.js +80 -0
- package/dist/auth/OAuthResourceServer.js.map +1 -0
- package/dist/auth/TokenValidator.d.ts +36 -0
- package/dist/auth/TokenValidator.d.ts.map +1 -0
- package/dist/auth/TokenValidator.js +139 -0
- package/dist/auth/TokenValidator.js.map +1 -0
- package/dist/auth/errors.d.ts +63 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +102 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +61 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +156 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/scopes.d.ts +65 -0
- package/dist/auth/scopes.d.ts.map +1 -0
- package/dist/auth/scopes.js +189 -0
- package/dist/auth/scopes.js.map +1 -0
- package/dist/auth/types.d.ts +208 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +34 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +308 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +341 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemode/api.d.ts +62 -0
- package/dist/codemode/api.d.ts.map +1 -0
- package/dist/codemode/api.js +1505 -0
- package/dist/codemode/api.js.map +1 -0
- package/dist/codemode/index.d.ts +13 -0
- package/dist/codemode/index.d.ts.map +1 -0
- package/dist/codemode/index.js +17 -0
- package/dist/codemode/index.js.map +1 -0
- package/dist/codemode/sandbox-factory.d.ts +72 -0
- package/dist/codemode/sandbox-factory.d.ts.map +1 -0
- package/dist/codemode/sandbox-factory.js +88 -0
- package/dist/codemode/sandbox-factory.js.map +1 -0
- package/dist/codemode/sandbox.d.ts +96 -0
- package/dist/codemode/sandbox.d.ts.map +1 -0
- package/dist/codemode/sandbox.js +345 -0
- package/dist/codemode/sandbox.js.map +1 -0
- package/dist/codemode/security.d.ts +44 -0
- package/dist/codemode/security.d.ts.map +1 -0
- package/dist/codemode/security.js +149 -0
- package/dist/codemode/security.js.map +1 -0
- package/dist/codemode/types.d.ts +137 -0
- package/dist/codemode/types.d.ts.map +1 -0
- package/dist/codemode/types.js +46 -0
- package/dist/codemode/types.js.map +1 -0
- package/dist/codemode/worker-sandbox.d.ts +82 -0
- package/dist/codemode/worker-sandbox.d.ts.map +1 -0
- package/dist/codemode/worker-sandbox.js +244 -0
- package/dist/codemode/worker-sandbox.js.map +1 -0
- package/dist/codemode/worker-script.d.ts +8 -0
- package/dist/codemode/worker-script.d.ts.map +1 -0
- package/dist/codemode/worker-script.js +113 -0
- package/dist/codemode/worker-script.js.map +1 -0
- package/dist/constants/ServerInstructions.d.ts +13 -0
- package/dist/constants/ServerInstructions.d.ts.map +1 -0
- package/dist/constants/ServerInstructions.js +405 -0
- package/dist/constants/ServerInstructions.js.map +1 -0
- package/dist/filtering/ToolConstants.d.ts +43 -0
- package/dist/filtering/ToolConstants.d.ts.map +1 -0
- package/dist/filtering/ToolConstants.js +352 -0
- package/dist/filtering/ToolConstants.js.map +1 -0
- package/dist/filtering/ToolFilter.d.ts +90 -0
- package/dist/filtering/ToolFilter.d.ts.map +1 -0
- package/dist/filtering/ToolFilter.js +315 -0
- package/dist/filtering/ToolFilter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/pool/ConnectionPool.d.ts +70 -0
- package/dist/pool/ConnectionPool.d.ts.map +1 -0
- package/dist/pool/ConnectionPool.js +254 -0
- package/dist/pool/ConnectionPool.js.map +1 -0
- package/dist/server/McpServer.d.ts +50 -0
- package/dist/server/McpServer.d.ts.map +1 -0
- package/dist/server/McpServer.js +108 -0
- package/dist/server/McpServer.js.map +1 -0
- package/dist/transports/http.d.ts +126 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +303 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +8 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +7 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/types/adapters.d.ts +136 -0
- package/dist/types/adapters.d.ts.map +1 -0
- package/dist/types/adapters.js +7 -0
- package/dist/types/adapters.js.map +1 -0
- package/dist/types/database.d.ts +204 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +7 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/errors.d.ts +62 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +91 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/filtering.d.ts +39 -0
- package/dist/types/filtering.d.ts.map +1 -0
- package/dist/types/filtering.js +7 -0
- package/dist/types/filtering.js.map +1 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +31 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +7 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/oauth.d.ts +65 -0
- package/dist/types/oauth.d.ts.map +1 -0
- package/dist/types/oauth.js +7 -0
- package/dist/types/oauth.js.map +1 -0
- package/dist/types/schema.d.ts +110 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +7 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/utils/annotations.d.ts +42 -0
- package/dist/utils/annotations.d.ts.map +1 -0
- package/dist/utils/annotations.js +75 -0
- package/dist/utils/annotations.js.map +1 -0
- package/dist/utils/icons.d.ts +25 -0
- package/dist/utils/icons.d.ts.map +1 -0
- package/dist/utils/icons.js +212 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/identifiers.d.ts +111 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +270 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/dist/utils/logger.d.ts +141 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +304 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/promptGenerator.d.ts +20 -0
- package/dist/utils/promptGenerator.d.ts.map +1 -0
- package/dist/utils/promptGenerator.js +81 -0
- package/dist/utils/promptGenerator.js.map +1 -0
- package/dist/utils/resourceAnnotations.d.ts +36 -0
- package/dist/utils/resourceAnnotations.d.ts.map +1 -0
- package/dist/utils/resourceAnnotations.js +57 -0
- package/dist/utils/resourceAnnotations.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL pg_partman Extension Tools - Operations
|
|
3
|
+
*
|
|
4
|
+
* Partition operations: check_default, partition_data, set_retention, undo_partition, analyze_health.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { readOnly, write, destructive } from "../../../../utils/annotations.js";
|
|
8
|
+
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
+
import { PartmanCheckDefaultSchema, PartmanPartitionDataSchema, PartmanRetentionSchema, PartmanUndoPartitionSchema, } from "../../schemas/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Detect the schema where pg_partman is installed.
|
|
12
|
+
* Newer versions install to 'public' by default, older versions use 'partman'.
|
|
13
|
+
*/
|
|
14
|
+
async function getPartmanSchema(adapter) {
|
|
15
|
+
const result = await adapter.executeQuery(`
|
|
16
|
+
SELECT table_schema FROM information_schema.tables
|
|
17
|
+
WHERE table_name = 'part_config'
|
|
18
|
+
AND table_schema IN ('partman', 'public')
|
|
19
|
+
LIMIT 1
|
|
20
|
+
`);
|
|
21
|
+
return result.rows?.[0]?.["table_schema"] ?? "partman";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check for data in default partition
|
|
25
|
+
*/
|
|
26
|
+
export function createPartmanCheckDefaultTool(adapter) {
|
|
27
|
+
return {
|
|
28
|
+
name: "pg_partman_check_default",
|
|
29
|
+
description: `Check if any data exists in the default partition that should be moved to child partitions.
|
|
30
|
+
Data in default indicates partitions may be missing for certain time/value ranges.`,
|
|
31
|
+
group: "partman",
|
|
32
|
+
inputSchema: PartmanCheckDefaultSchema,
|
|
33
|
+
annotations: readOnly("Check Partman Default"),
|
|
34
|
+
icons: getToolIcons("partman", readOnly("Check Partman Default")),
|
|
35
|
+
handler: async (params, _context) => {
|
|
36
|
+
const { parentTable } = PartmanCheckDefaultSchema.parse(params);
|
|
37
|
+
// parentTable is required - provide clear error if missing
|
|
38
|
+
if (!parentTable) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: 'parentTable parameter is required. Specify the parent table (e.g., "public.events") to check its default partition.',
|
|
42
|
+
hint: "Use pg_partman_show_config to list all partition sets first.",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Check if parent table exists in pg_class (handles orphaned configs)
|
|
46
|
+
const [tableSchema, tableName] = parentTable.includes(".")
|
|
47
|
+
? [parentTable.split(".")[0], parentTable.split(".")[1]]
|
|
48
|
+
: ["public", parentTable];
|
|
49
|
+
const tableExistsResult = await adapter.executeQuery(`
|
|
50
|
+
SELECT 1 FROM information_schema.tables
|
|
51
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
52
|
+
`, [tableSchema, tableName]);
|
|
53
|
+
if ((tableExistsResult.rows?.length ?? 0) === 0) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: `Table '${parentTable}' does not exist. Cannot check default partition for non-existent table.`,
|
|
57
|
+
hint: "Verify the table name or use pg_partman_show_config to list existing partition sets.",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// First, find the default partition
|
|
61
|
+
const findDefaultSql = `
|
|
62
|
+
SELECT
|
|
63
|
+
c.relname as default_partition,
|
|
64
|
+
n.nspname as schema
|
|
65
|
+
FROM pg_inherits i
|
|
66
|
+
JOIN pg_class c ON c.oid = i.inhrelid
|
|
67
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
68
|
+
JOIN pg_class p ON p.oid = i.inhparent
|
|
69
|
+
JOIN pg_namespace pn ON pn.oid = p.relnamespace
|
|
70
|
+
WHERE (pn.nspname || '.' || p.relname) = $1
|
|
71
|
+
AND c.relname LIKE '%_default'
|
|
72
|
+
`;
|
|
73
|
+
const result = await adapter.executeQuery(findDefaultSql, [parentTable]);
|
|
74
|
+
const defaultInfo = result.rows?.[0];
|
|
75
|
+
if (!defaultInfo) {
|
|
76
|
+
// Check if the table is partitioned at all (has any child tables)
|
|
77
|
+
const hasChildrenResult = await adapter.executeQuery(`
|
|
78
|
+
SELECT 1 FROM pg_inherits i
|
|
79
|
+
JOIN pg_class p ON p.oid = i.inhparent
|
|
80
|
+
JOIN pg_namespace pn ON pn.oid = p.relnamespace
|
|
81
|
+
WHERE (pn.nspname || '.' || p.relname) = $1
|
|
82
|
+
LIMIT 1
|
|
83
|
+
`, [parentTable]);
|
|
84
|
+
// Also check if the table is actually a partitioned table (relkind = 'p')
|
|
85
|
+
const [tableSchema, tableName] = parentTable.includes(".")
|
|
86
|
+
? [parentTable.split(".")[0], parentTable.split(".")[1]]
|
|
87
|
+
: ["public", parentTable];
|
|
88
|
+
const partitionedCheckResult = await adapter.executeQuery(`
|
|
89
|
+
SELECT relkind FROM pg_class c
|
|
90
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
91
|
+
WHERE n.nspname = $1 AND c.relname = $2
|
|
92
|
+
`, [tableSchema, tableName]);
|
|
93
|
+
const relkind = partitionedCheckResult.rows?.[0]?.["relkind"];
|
|
94
|
+
const isActuallyPartitioned = relkind === "p"; // 'p' means partitioned table
|
|
95
|
+
if ((hasChildrenResult.rows?.length ?? 0) === 0) {
|
|
96
|
+
if (isActuallyPartitioned) {
|
|
97
|
+
return {
|
|
98
|
+
parentTable,
|
|
99
|
+
hasDefault: false,
|
|
100
|
+
isPartitioned: true,
|
|
101
|
+
hasChildPartitions: false,
|
|
102
|
+
message: "Table is partitioned but has no child partitions yet. Run pg_partman_run_maintenance or insert data to create partitions. " +
|
|
103
|
+
"TIP: For empty tables, configure pg_partman with startPartition before running maintenance.",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
parentTable,
|
|
108
|
+
hasDefault: false,
|
|
109
|
+
isPartitioned: false,
|
|
110
|
+
hasChildPartitions: false,
|
|
111
|
+
message: "Table is not a partitioned table. Create it with PARTITION BY clause to enable partitioning.",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
parentTable,
|
|
116
|
+
hasDefault: false,
|
|
117
|
+
isPartitioned: true,
|
|
118
|
+
hasChildPartitions: true,
|
|
119
|
+
message: "Table is partitioned with child partitions but has no default partition. This is normal if the partition set was created without a default.",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const defaultPartitionName = `${String(defaultInfo["schema"])}.${String(defaultInfo["default_partition"])}`;
|
|
123
|
+
// Use actual COUNT for accuracy instead of reltuples (which returns -1 before ANALYZE)
|
|
124
|
+
// Limit to 1 for efficiency - we only need to know if ANY data exists
|
|
125
|
+
const countSql = `SELECT COUNT(*) FROM (SELECT 1 FROM ${defaultPartitionName} LIMIT 1) t`;
|
|
126
|
+
let rowCount = 0;
|
|
127
|
+
try {
|
|
128
|
+
const countResult = await adapter.executeQuery(countSql);
|
|
129
|
+
rowCount = Number(countResult.rows?.[0]?.["count"] ?? 0);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// If count fails (rare), fall back to 0
|
|
133
|
+
rowCount = 0;
|
|
134
|
+
}
|
|
135
|
+
const hasData = rowCount > 0;
|
|
136
|
+
return {
|
|
137
|
+
parentTable,
|
|
138
|
+
hasDefault: true,
|
|
139
|
+
defaultPartition: defaultPartitionName,
|
|
140
|
+
hasDataInDefault: hasData,
|
|
141
|
+
recommendation: hasData
|
|
142
|
+
? "Run pg_partman_partition_data to move data to appropriate child partitions"
|
|
143
|
+
: "Default partition is empty - no action needed",
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Move data from default to child partitions
|
|
150
|
+
*/
|
|
151
|
+
export function createPartmanPartitionDataTool(adapter) {
|
|
152
|
+
return {
|
|
153
|
+
name: "pg_partman_partition_data",
|
|
154
|
+
description: `Move data from the default partition to appropriate child partitions.
|
|
155
|
+
Creates new partitions if needed for the data being moved.`,
|
|
156
|
+
group: "partman",
|
|
157
|
+
inputSchema: PartmanPartitionDataSchema,
|
|
158
|
+
annotations: write("Partition Data"),
|
|
159
|
+
icons: getToolIcons("partman", write("Partition Data")),
|
|
160
|
+
handler: async (params, _context) => {
|
|
161
|
+
const { parentTable, batchSize, lockWaitSeconds } = PartmanPartitionDataSchema.parse(params);
|
|
162
|
+
// parentTable is required - provide clear error if missing
|
|
163
|
+
if (!parentTable) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: 'parentTable parameter is required. Specify the parent table (e.g., "public.events") to move data from its default partition.',
|
|
167
|
+
hint: "Use pg_partman_show_config to list all partition sets first.",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const args = [`p_parent_table := '${parentTable}'`];
|
|
171
|
+
if (batchSize !== undefined) {
|
|
172
|
+
args.push(`p_loop_count := ${String(batchSize)}`);
|
|
173
|
+
}
|
|
174
|
+
if (lockWaitSeconds !== undefined) {
|
|
175
|
+
args.push(`p_lock_wait := ${String(lockWaitSeconds)}`);
|
|
176
|
+
}
|
|
177
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
178
|
+
const configResult = await adapter.executeQuery(`
|
|
179
|
+
SELECT control, epoch
|
|
180
|
+
FROM ${partmanSchema}.part_config
|
|
181
|
+
WHERE parent_table = $1
|
|
182
|
+
`, [parentTable]);
|
|
183
|
+
const config = configResult.rows?.[0];
|
|
184
|
+
if (!config) {
|
|
185
|
+
return {
|
|
186
|
+
success: false,
|
|
187
|
+
error: `No pg_partman configuration found for ${parentTable}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Get row count in default partition before moving data
|
|
191
|
+
const [partSchema, partTableName] = parentTable.includes(".")
|
|
192
|
+
? [
|
|
193
|
+
parentTable.split(".")[0] ?? "public",
|
|
194
|
+
parentTable.split(".")[1] ?? parentTable,
|
|
195
|
+
]
|
|
196
|
+
: ["public", parentTable];
|
|
197
|
+
const defaultPartitionName = `${partSchema}.${partTableName}_default`;
|
|
198
|
+
let rowsBeforeMove = 0;
|
|
199
|
+
try {
|
|
200
|
+
const beforeResult = await adapter.executeQuery(`SELECT COUNT(*)::int as count FROM ${defaultPartitionName}`);
|
|
201
|
+
rowsBeforeMove = Number(beforeResult.rows?.[0]?.["count"] ?? 0);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Default partition might not exist - that's okay
|
|
205
|
+
}
|
|
206
|
+
// partition_data_proc is a PROCEDURE, not a function - use CALL syntax
|
|
207
|
+
const sql = `CALL ${partmanSchema}.partition_data_proc(${args.join(", ")})`;
|
|
208
|
+
await adapter.executeQuery(sql);
|
|
209
|
+
// Get row count in default partition after moving data
|
|
210
|
+
let rowsAfterMove = 0;
|
|
211
|
+
try {
|
|
212
|
+
const afterResult = await adapter.executeQuery(`SELECT COUNT(*)::int as count FROM ${defaultPartitionName}`);
|
|
213
|
+
rowsAfterMove = Number(afterResult.rows?.[0]?.["count"] ?? 0);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Default partition might not exist
|
|
217
|
+
}
|
|
218
|
+
const rowsMoved = rowsBeforeMove - rowsAfterMove;
|
|
219
|
+
return {
|
|
220
|
+
success: true,
|
|
221
|
+
parentTable,
|
|
222
|
+
rowsMoved: rowsMoved > 0 ? rowsMoved : 0,
|
|
223
|
+
rowsRemaining: rowsAfterMove,
|
|
224
|
+
message: rowsMoved > 0
|
|
225
|
+
? `Data partitioning completed - ${String(rowsMoved)} rows moved from default to child partitions`
|
|
226
|
+
: "Data partitioning completed - no rows needed to be moved (default partition empty or already partitioned)",
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Configure retention policies
|
|
233
|
+
*/
|
|
234
|
+
export function createPartmanSetRetentionTool(adapter) {
|
|
235
|
+
return {
|
|
236
|
+
name: "pg_partman_set_retention",
|
|
237
|
+
description: `Configure retention policy for a partition set.
|
|
238
|
+
Partitions older than the retention period will be dropped or detached during maintenance.`,
|
|
239
|
+
group: "partman",
|
|
240
|
+
inputSchema: PartmanRetentionSchema,
|
|
241
|
+
annotations: write("Set Partition Retention"),
|
|
242
|
+
icons: getToolIcons("partman", write("Set Partition Retention")),
|
|
243
|
+
handler: async (params, _context) => {
|
|
244
|
+
const { parentTable, retention, retentionKeepTable } = PartmanRetentionSchema.parse(params);
|
|
245
|
+
// Validate required parentTable
|
|
246
|
+
if (!parentTable) {
|
|
247
|
+
return {
|
|
248
|
+
success: false,
|
|
249
|
+
error: "Missing required parameter: parentTable.",
|
|
250
|
+
hint: 'Example: pg_partman_set_retention({ parentTable: "public.events", retention: "30 days" })',
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const validatedParentTable = parentTable;
|
|
254
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
255
|
+
// If retention is omitted (undefined), it's required
|
|
256
|
+
if (retention === undefined) {
|
|
257
|
+
return {
|
|
258
|
+
success: false,
|
|
259
|
+
error: "Missing required parameter: retention.",
|
|
260
|
+
hint: 'Provide a retention period (e.g., "30 days") or pass null to explicitly disable retention. ' +
|
|
261
|
+
'Example: pg_partman_set_retention({ parentTable: "public.events", retention: "30 days" })',
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Special case: explicit null or empty string means disable/clear retention
|
|
265
|
+
if (retention === null || retention === "") {
|
|
266
|
+
const sql = `
|
|
267
|
+
UPDATE ${partmanSchema}.part_config
|
|
268
|
+
SET retention = NULL
|
|
269
|
+
WHERE parent_table = $1
|
|
270
|
+
`;
|
|
271
|
+
const result = await adapter.executeQuery(sql, [validatedParentTable]);
|
|
272
|
+
if ((result.rowsAffected ?? 0) === 0) {
|
|
273
|
+
throw new Error(`No pg_partman configuration found for ${validatedParentTable}. Use pg_partman_show_config to list existing partition sets.`);
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
success: true,
|
|
277
|
+
parentTable: validatedParentTable,
|
|
278
|
+
retention: null,
|
|
279
|
+
message: "Retention policy disabled - partitions will no longer be automatically dropped or detached",
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const validatedRetention = retention;
|
|
283
|
+
// Validate retention format - must be valid PostgreSQL interval
|
|
284
|
+
// Try to parse it to catch obvious errors before storing garbage
|
|
285
|
+
const validIntervalPattern = /^\d+\s*(second|minute|hour|day|week|month|year)s?$/i;
|
|
286
|
+
const validNumericPattern = /^\d+$/; // Allow pure numeric for integer-based partitions
|
|
287
|
+
if (!validIntervalPattern.test(validatedRetention) &&
|
|
288
|
+
!validNumericPattern.test(validatedRetention)) {
|
|
289
|
+
throw new Error(`Invalid retention format '${validatedRetention}'. ` +
|
|
290
|
+
`Use PostgreSQL interval syntax (e.g., '30 days', '6 months', '1 year') ` +
|
|
291
|
+
`or integer value for integer-based partitions.`);
|
|
292
|
+
}
|
|
293
|
+
const updates = [`retention = '${validatedRetention}'`];
|
|
294
|
+
if (retentionKeepTable !== undefined) {
|
|
295
|
+
updates.push(`retention_keep_table = ${String(retentionKeepTable)}`);
|
|
296
|
+
}
|
|
297
|
+
const sql = `
|
|
298
|
+
UPDATE ${partmanSchema}.part_config
|
|
299
|
+
SET ${updates.join(", ")}
|
|
300
|
+
WHERE parent_table = $1
|
|
301
|
+
`;
|
|
302
|
+
const result = await adapter.executeQuery(sql, [validatedParentTable]);
|
|
303
|
+
if ((result.rowsAffected ?? 0) === 0) {
|
|
304
|
+
throw new Error(`No pg_partman configuration found for ${validatedParentTable}. Use pg_partman_show_config to list existing partition sets.`);
|
|
305
|
+
}
|
|
306
|
+
// Check partition type to use appropriate terminology in message
|
|
307
|
+
const configResult = await adapter.executeQuery(`SELECT partition_type FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [validatedParentTable]);
|
|
308
|
+
const partitionTypeRaw = configResult.rows?.[0]?.["partition_type"];
|
|
309
|
+
const partitionType = typeof partitionTypeRaw === "string" ? partitionTypeRaw : "range";
|
|
310
|
+
const isIntegerBased = validNumericPattern.test(validatedRetention) ||
|
|
311
|
+
partitionType.toLowerCase() === "native" ||
|
|
312
|
+
partitionType.toLowerCase().includes("id");
|
|
313
|
+
// Use "below" for integer-based, "older than" for time-based partitions
|
|
314
|
+
const retentionPhrase = isIntegerBased
|
|
315
|
+
? `partitions with values below ${validatedRetention}`
|
|
316
|
+
: `partitions older than ${validatedRetention}`;
|
|
317
|
+
return {
|
|
318
|
+
success: true,
|
|
319
|
+
parentTable: validatedParentTable,
|
|
320
|
+
retention: validatedRetention,
|
|
321
|
+
retentionKeepTable: retentionKeepTable ?? false,
|
|
322
|
+
message: `Retention policy set: ${retentionPhrase} will be ${retentionKeepTable === true ? "detached" : "dropped"}`,
|
|
323
|
+
};
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Undo partitioning - convert back to regular table
|
|
329
|
+
*/
|
|
330
|
+
export function createPartmanUndoPartitionTool(adapter) {
|
|
331
|
+
return {
|
|
332
|
+
name: "pg_partman_undo_partition",
|
|
333
|
+
description: `Convert a partitioned table back to a regular table by moving all data from child partitions to a TARGET table.
|
|
334
|
+
|
|
335
|
+
IMPORTANT: The targetTable parameter is REQUIRED. pg_partman does not consolidate data back to the parent table directly.
|
|
336
|
+
You must first create an empty table with the same structure as the parent, then specify it as targetTable.
|
|
337
|
+
|
|
338
|
+
Example: undoPartition({ parentTable: "public.events", targetTable: "public.events_consolidated" })`,
|
|
339
|
+
group: "partman",
|
|
340
|
+
inputSchema: PartmanUndoPartitionSchema,
|
|
341
|
+
annotations: destructive("Undo Partitioning"),
|
|
342
|
+
icons: getToolIcons("partman", destructive("Undo Partitioning")),
|
|
343
|
+
handler: async (params, _context) => {
|
|
344
|
+
const { parentTable, targetTable, batchSize, keepTable } = PartmanUndoPartitionSchema.parse(params);
|
|
345
|
+
// Validate required parameters with clear error messages
|
|
346
|
+
if (!parentTable || !targetTable) {
|
|
347
|
+
const missing = [];
|
|
348
|
+
if (!parentTable)
|
|
349
|
+
missing.push("parentTable");
|
|
350
|
+
if (!targetTable)
|
|
351
|
+
missing.push("targetTable (or target)");
|
|
352
|
+
return {
|
|
353
|
+
success: false,
|
|
354
|
+
error: `Missing required parameters: ${missing.join(", ")}.`,
|
|
355
|
+
hint: 'Example: pg_partman_undo_partition({ parentTable: "public.events", targetTable: "public.events_archive" }). Target table must exist first.',
|
|
356
|
+
aliases: { target: "targetTable" },
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// At this point, parentTable and targetTable are guaranteed to be defined
|
|
360
|
+
// Auto-prefix 'public.' schema when not specified (consistent with parentTable behavior)
|
|
361
|
+
const validatedParentTable = parentTable.includes(".")
|
|
362
|
+
? parentTable
|
|
363
|
+
: `public.${parentTable}`;
|
|
364
|
+
const validatedTargetTable = targetTable.includes(".")
|
|
365
|
+
? targetTable
|
|
366
|
+
: `public.${targetTable}`;
|
|
367
|
+
// Pre-validate: Check that target table exists before calling pg_partman
|
|
368
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
369
|
+
// Parse target table name to check existence
|
|
370
|
+
const [targetSchema, targetTableName] = [
|
|
371
|
+
validatedTargetTable.split(".")[0],
|
|
372
|
+
validatedTargetTable.split(".")[1],
|
|
373
|
+
];
|
|
374
|
+
const tableExistsResult = await adapter.executeQuery(`
|
|
375
|
+
SELECT 1 FROM information_schema.tables
|
|
376
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
377
|
+
`, [targetSchema, targetTableName]);
|
|
378
|
+
if ((tableExistsResult.rows?.length ?? 0) === 0) {
|
|
379
|
+
throw new Error(`Target table '${validatedTargetTable}' does not exist. ` +
|
|
380
|
+
`pg_partman's undo_partition requires the target table to exist before consolidating data. ` +
|
|
381
|
+
`Create the target table first with the same structure as the parent table.`);
|
|
382
|
+
}
|
|
383
|
+
const args = [
|
|
384
|
+
`p_parent_table := '${validatedParentTable}'`,
|
|
385
|
+
`p_target_table := '${validatedTargetTable}'`,
|
|
386
|
+
];
|
|
387
|
+
if (batchSize !== undefined) {
|
|
388
|
+
args.push(`p_loop_count := ${String(batchSize)}`);
|
|
389
|
+
}
|
|
390
|
+
if (keepTable !== undefined) {
|
|
391
|
+
args.push(`p_keep_table := ${String(keepTable)}`);
|
|
392
|
+
}
|
|
393
|
+
// undo_partition_proc is a PROCEDURE, not a function - use CALL syntax
|
|
394
|
+
const sql = `CALL ${partmanSchema}.undo_partition_proc(${args.join(", ")})`;
|
|
395
|
+
await adapter.executeQuery(sql);
|
|
396
|
+
// Note: pg_partman's undo_partition detaches child partitions but leaves them as standalone tables
|
|
397
|
+
// This allows data recovery if needed, but users should clean up manually
|
|
398
|
+
const keepTableValue = keepTable ?? true;
|
|
399
|
+
return {
|
|
400
|
+
success: true,
|
|
401
|
+
parentTable: validatedParentTable,
|
|
402
|
+
targetTable: validatedTargetTable,
|
|
403
|
+
message: `Partition set removed for ${validatedParentTable}. Data consolidated to ${validatedTargetTable}.`,
|
|
404
|
+
note: keepTableValue
|
|
405
|
+
? "Child partitions were detached and now exist as standalone tables. " +
|
|
406
|
+
"To clean up, drop them manually: DROP TABLE <partition_name>;"
|
|
407
|
+
: undefined,
|
|
408
|
+
};
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Analyze partition health and provide recommendations
|
|
414
|
+
*/
|
|
415
|
+
export function createPartmanAnalyzeHealthTool(adapter) {
|
|
416
|
+
return {
|
|
417
|
+
name: "pg_partman_analyze_partition_health",
|
|
418
|
+
description: `Analyze the health of partition sets managed by pg_partman.
|
|
419
|
+
Checks for issues like data in default partitions, missing premake partitions,
|
|
420
|
+
stale maintenance, and retention configuration.`,
|
|
421
|
+
group: "partman",
|
|
422
|
+
inputSchema: z
|
|
423
|
+
.preprocess((input) => {
|
|
424
|
+
if (typeof input !== "object" || input === null)
|
|
425
|
+
return input;
|
|
426
|
+
const raw = input;
|
|
427
|
+
const result = { ...raw };
|
|
428
|
+
// Alias: table → parentTable
|
|
429
|
+
if (result.table && !result.parentTable) {
|
|
430
|
+
result.parentTable = result.table;
|
|
431
|
+
}
|
|
432
|
+
// Auto-prefix public. for parentTable when no schema specified
|
|
433
|
+
if (result.parentTable && !result.parentTable.includes(".")) {
|
|
434
|
+
result.parentTable = `public.${result.parentTable}`;
|
|
435
|
+
}
|
|
436
|
+
return result;
|
|
437
|
+
}, z.object({
|
|
438
|
+
parentTable: z
|
|
439
|
+
.string()
|
|
440
|
+
.optional()
|
|
441
|
+
.describe("Specific parent table to analyze (all if omitted)"),
|
|
442
|
+
limit: z
|
|
443
|
+
.number()
|
|
444
|
+
.optional()
|
|
445
|
+
.describe("Maximum number of partition sets to analyze (default: 50, use 0 for all)"),
|
|
446
|
+
}))
|
|
447
|
+
.default({}),
|
|
448
|
+
annotations: readOnly("Analyze Partition Health"),
|
|
449
|
+
icons: getToolIcons("partman", readOnly("Analyze Partition Health")),
|
|
450
|
+
handler: async (params, _context) => {
|
|
451
|
+
const AnalyzeHealthSchema = z
|
|
452
|
+
.preprocess((input) => {
|
|
453
|
+
if (typeof input !== "object" || input === null)
|
|
454
|
+
return input;
|
|
455
|
+
const raw = input;
|
|
456
|
+
const result = { ...raw };
|
|
457
|
+
// Alias: table → parentTable
|
|
458
|
+
if (result.table && !result.parentTable) {
|
|
459
|
+
result.parentTable = result.table;
|
|
460
|
+
}
|
|
461
|
+
// Auto-prefix public. for parentTable when no schema specified
|
|
462
|
+
if (result.parentTable && !result.parentTable.includes(".")) {
|
|
463
|
+
result.parentTable = `public.${result.parentTable}`;
|
|
464
|
+
}
|
|
465
|
+
return result;
|
|
466
|
+
}, z.object({
|
|
467
|
+
parentTable: z.string().optional(),
|
|
468
|
+
limit: z.number().optional(),
|
|
469
|
+
}))
|
|
470
|
+
.default({});
|
|
471
|
+
const parsed = AnalyzeHealthSchema.parse(params ?? {});
|
|
472
|
+
const queryParams = [];
|
|
473
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
474
|
+
// Get total count first for pagination
|
|
475
|
+
let countSql = `SELECT COUNT(*) as total FROM ${partmanSchema}.part_config`;
|
|
476
|
+
const countParams = [];
|
|
477
|
+
if (parsed.parentTable !== undefined) {
|
|
478
|
+
countSql += " WHERE parent_table = $1";
|
|
479
|
+
countParams.push(parsed.parentTable);
|
|
480
|
+
}
|
|
481
|
+
const countResult = await adapter.executeQuery(countSql, countParams);
|
|
482
|
+
const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
|
|
483
|
+
// Apply limit (default 50, 0 means no limit)
|
|
484
|
+
const limit = parsed.limit ?? 50;
|
|
485
|
+
const applyLimit = limit > 0;
|
|
486
|
+
let configSql = `
|
|
487
|
+
SELECT
|
|
488
|
+
parent_table,
|
|
489
|
+
control,
|
|
490
|
+
partition_interval,
|
|
491
|
+
premake,
|
|
492
|
+
retention,
|
|
493
|
+
retention_keep_table,
|
|
494
|
+
automatic_maintenance,
|
|
495
|
+
template_table
|
|
496
|
+
FROM ${partmanSchema}.part_config
|
|
497
|
+
`;
|
|
498
|
+
if (parsed.parentTable !== undefined) {
|
|
499
|
+
configSql += " WHERE parent_table = $1";
|
|
500
|
+
queryParams.push(parsed.parentTable);
|
|
501
|
+
}
|
|
502
|
+
configSql += " ORDER BY parent_table";
|
|
503
|
+
if (applyLimit) {
|
|
504
|
+
configSql += ` LIMIT ${String(limit)}`;
|
|
505
|
+
}
|
|
506
|
+
const configResult = await adapter.executeQuery(configSql, queryParams);
|
|
507
|
+
const configs = configResult.rows ?? [];
|
|
508
|
+
// If a specific table was requested but not found, indicate that clearly
|
|
509
|
+
if (parsed.parentTable !== undefined && configs.length === 0) {
|
|
510
|
+
return {
|
|
511
|
+
overallHealth: "not_found",
|
|
512
|
+
partitionSets: [],
|
|
513
|
+
message: `No pg_partman configuration found for table '${parsed.parentTable}'. ` +
|
|
514
|
+
`Use pg_partman_show_config to list configured partition sets, or ` +
|
|
515
|
+
`pg_partman_create_parent to configure partitioning for this table.`,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
const healthChecks = [];
|
|
519
|
+
for (const config of configs) {
|
|
520
|
+
const parentTable = config["parent_table"];
|
|
521
|
+
const issues = [];
|
|
522
|
+
const warnings = [];
|
|
523
|
+
const recommendations = [];
|
|
524
|
+
// Check if parent table still exists (handle orphaned configs)
|
|
525
|
+
const [tableSchema, tableName] = parentTable.includes(".")
|
|
526
|
+
? [parentTable.split(".")[0], parentTable.split(".")[1]]
|
|
527
|
+
: ["public", parentTable];
|
|
528
|
+
const tableExistsResult = await adapter.executeQuery(`
|
|
529
|
+
SELECT 1 FROM information_schema.tables
|
|
530
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
531
|
+
`, [tableSchema, tableName]);
|
|
532
|
+
if ((tableExistsResult.rows?.length ?? 0) === 0) {
|
|
533
|
+
// Orphaned config - table no longer exists
|
|
534
|
+
healthChecks.push({
|
|
535
|
+
parentTable,
|
|
536
|
+
issues: ["Orphaned configuration - parent table no longer exists"],
|
|
537
|
+
warnings: [],
|
|
538
|
+
recommendations: [
|
|
539
|
+
"Remove orphaned config from part_config table or recreate the table",
|
|
540
|
+
],
|
|
541
|
+
partitionCount: 0,
|
|
542
|
+
hasDefaultPartition: false,
|
|
543
|
+
hasDataInDefault: false,
|
|
544
|
+
});
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
let partitionCount = 0;
|
|
548
|
+
try {
|
|
549
|
+
const partCountResult = await adapter.executeQuery(`
|
|
550
|
+
SELECT COUNT(*) as count
|
|
551
|
+
FROM ${partmanSchema}.show_partitions(p_parent_table := $1)
|
|
552
|
+
`, [parentTable]);
|
|
553
|
+
partitionCount = Number(partCountResult.rows?.[0]?.["count"] ?? 0);
|
|
554
|
+
}
|
|
555
|
+
catch (e) {
|
|
556
|
+
// If show_partitions fails, provide detailed error info
|
|
557
|
+
const errorMsg = e instanceof Error ? e.message : "Unknown error";
|
|
558
|
+
healthChecks.push({
|
|
559
|
+
parentTable,
|
|
560
|
+
issues: [`Failed to query partitions: ${errorMsg}`],
|
|
561
|
+
warnings: [],
|
|
562
|
+
recommendations: [
|
|
563
|
+
"Check that the table exists and is partitioned",
|
|
564
|
+
"Verify pg_partman configuration with pg_partman_show_config",
|
|
565
|
+
"If table was dropped, remove orphaned config from part_config",
|
|
566
|
+
],
|
|
567
|
+
partitionCount: 0,
|
|
568
|
+
hasDefaultPartition: false,
|
|
569
|
+
hasDataInDefault: false,
|
|
570
|
+
});
|
|
571
|
+
continue;
|
|
572
|
+
}
|
|
573
|
+
const premake = config["premake"] ?? 4;
|
|
574
|
+
if (partitionCount < premake) {
|
|
575
|
+
warnings.push(`Only ${String(partitionCount)} partitions exist, premake is set to ${String(premake)}`);
|
|
576
|
+
recommendations.push("Run pg_partman_run_maintenance to create premake partitions");
|
|
577
|
+
}
|
|
578
|
+
const defaultCheckResult = await adapter.executeQuery(`
|
|
579
|
+
SELECT c.reltuples::bigint as rows
|
|
580
|
+
FROM pg_inherits i
|
|
581
|
+
JOIN pg_class c ON c.oid = i.inhrelid
|
|
582
|
+
JOIN pg_class p ON p.oid = i.inhparent
|
|
583
|
+
JOIN pg_namespace pn ON pn.oid = p.relnamespace
|
|
584
|
+
WHERE (pn.nspname || '.' || p.relname) = $1
|
|
585
|
+
AND c.relname LIKE '%_default'
|
|
586
|
+
`, [parentTable]);
|
|
587
|
+
const hasDefaultPartition = (defaultCheckResult.rows?.length ?? 0) > 0;
|
|
588
|
+
const defaultRows = Number(defaultCheckResult.rows?.[0]?.["rows"] ?? 0);
|
|
589
|
+
const hasDataInDefault = hasDefaultPartition && defaultRows > 0;
|
|
590
|
+
if (hasDataInDefault) {
|
|
591
|
+
issues.push(`Approximately ${String(defaultRows)} rows in default partition`);
|
|
592
|
+
recommendations.push("Run pg_partman_partition_data to move data to child partitions");
|
|
593
|
+
}
|
|
594
|
+
// Note: Not having retention configured is often intentional (audit tables, etc.)
|
|
595
|
+
// Don't flag as warning to reduce noise; users can check config directly if needed
|
|
596
|
+
const autoMaint = config["automatic_maintenance"];
|
|
597
|
+
if (autoMaint !== "on") {
|
|
598
|
+
warnings.push("Automatic maintenance is not enabled");
|
|
599
|
+
recommendations.push("Schedule regular maintenance with pg_cron or enable automatic_maintenance");
|
|
600
|
+
}
|
|
601
|
+
healthChecks.push({
|
|
602
|
+
parentTable,
|
|
603
|
+
issues,
|
|
604
|
+
warnings,
|
|
605
|
+
recommendations,
|
|
606
|
+
partitionCount,
|
|
607
|
+
hasDefaultPartition,
|
|
608
|
+
hasDataInDefault,
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
const totalIssues = healthChecks.reduce((sum, h) => sum + h.issues.length, 0);
|
|
612
|
+
const totalWarnings = healthChecks.reduce((sum, h) => sum + h.warnings.length, 0);
|
|
613
|
+
const truncated = applyLimit && totalCount > limit;
|
|
614
|
+
return {
|
|
615
|
+
partitionSets: healthChecks,
|
|
616
|
+
truncated: truncated ? true : undefined,
|
|
617
|
+
totalCount: truncated ? totalCount : undefined,
|
|
618
|
+
summary: {
|
|
619
|
+
totalPartitionSets: truncated ? totalCount : healthChecks.length,
|
|
620
|
+
totalIssues,
|
|
621
|
+
totalWarnings,
|
|
622
|
+
overallHealth: totalIssues === 0
|
|
623
|
+
? totalWarnings === 0
|
|
624
|
+
? "healthy"
|
|
625
|
+
: "warnings"
|
|
626
|
+
: "issues_found",
|
|
627
|
+
},
|
|
628
|
+
};
|
|
629
|
+
},
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
//# sourceMappingURL=operations.js.map
|