@neverinfamous/postgres-mcp 1.3.0 → 2.1.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 +1 -1
- package/README.md +244 -129
- package/dist/__tests__/benchmarks/codemode.bench.d.ts +10 -0
- package/dist/__tests__/benchmarks/codemode.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/codemode.bench.js +159 -0
- package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/connection-pool.bench.d.ts +10 -0
- package/dist/__tests__/benchmarks/connection-pool.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/connection-pool.bench.js +123 -0
- package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts +11 -0
- package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/handler-dispatch.bench.js +199 -0
- package/dist/__tests__/benchmarks/handler-dispatch.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts +15 -0
- package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/logger-sanitization.bench.js +155 -0
- package/dist/__tests__/benchmarks/logger-sanitization.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts +10 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.js +181 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts +11 -0
- package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/schema-parsing.bench.js +209 -0
- package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts +9 -0
- package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/tool-filtering.bench.js +83 -0
- package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/transport-auth.bench.d.ts +10 -0
- package/dist/__tests__/benchmarks/transport-auth.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/transport-auth.bench.js +128 -0
- package/dist/__tests__/benchmarks/transport-auth.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/utilities.bench.d.ts +10 -0
- package/dist/__tests__/benchmarks/utilities.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/utilities.bench.js +164 -0
- package/dist/__tests__/benchmarks/utilities.bench.js.map +1 -0
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js +2 -1
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts +6 -1
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +23 -7
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -22
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.js +30 -519
- package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
- package/dist/adapters/postgresql/prompts/index.js +1 -1
- package/dist/adapters/postgresql/prompts/index.js.map +1 -1
- package/dist/adapters/postgresql/resources/index.d.ts +1 -1
- package/dist/adapters/postgresql/resources/index.js +3 -3
- package/dist/adapters/postgresql/resources/index.js.map +1 -1
- package/dist/adapters/postgresql/schema-operations.d.ts +71 -0
- package/dist/adapters/postgresql/schema-operations.d.ts.map +1 -0
- package/dist/adapters/postgresql/schema-operations.js +561 -0
- package/dist/adapters/postgresql/schema-operations.js.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts +4 -4
- package/dist/adapters/postgresql/schemas/admin.js +4 -4
- package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.d.ts +39 -25
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.js +54 -25
- package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
- package/dist/adapters/postgresql/schemas/core/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/core/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core/index.js +6 -0
- package/dist/adapters/postgresql/schemas/core/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{core.d.ts → core/queries.d.ts} +12 -167
- package/dist/adapters/postgresql/schemas/core/queries.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{core.js → core/queries.js} +5 -213
- package/dist/adapters/postgresql/schemas/core/queries.js.map +1 -0
- package/dist/adapters/postgresql/schemas/core/transactions.d.ts +149 -0
- package/dist/adapters/postgresql/schemas/core/transactions.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core/transactions.js +239 -0
- package/dist/adapters/postgresql/schemas/core/transactions.js.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts +12 -12
- package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/cron.js +38 -10
- package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
- package/dist/adapters/postgresql/schemas/extensions/citext.d.ts +222 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.js +306 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/index.d.ts +15 -0
- package/dist/adapters/postgresql/schemas/extensions/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/index.js +20 -0
- package/dist/adapters/postgresql/schemas/extensions/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts +164 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.js +225 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts +253 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.js +430 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts +251 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js +294 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.d.ts +10 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.js +15 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.js.map +1 -0
- package/dist/adapters/postgresql/schemas/index.d.ts +8 -7
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/index.js +16 -10
- package/dist/adapters/postgresql/schemas/index.js.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.d.ts +445 -0
- package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/introspection.js +481 -0
- package/dist/adapters/postgresql/schemas/introspection.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts +270 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.js +371 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts +283 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.js +456 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.js +6 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts +45 -29
- package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/monitoring.js +51 -18
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +28 -32
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.js +82 -53
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.d.ts +78 -7
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.js +54 -41
- package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
- package/dist/adapters/postgresql/schemas/performance.d.ts +37 -19
- package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/performance.js +54 -12
- package/dist/adapters/postgresql/schemas/performance.js.map +1 -1
- package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts +429 -0
- package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{postgis.js → postgis/advanced.js} +4 -467
- package/dist/adapters/postgresql/schemas/postgis/advanced.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{postgis.d.ts → postgis/basic.d.ts} +1 -423
- package/dist/adapters/postgresql/schemas/postgis/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/basic.js +493 -0
- package/dist/adapters/postgresql/schemas/postgis/basic.js.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/postgis/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/index.js +6 -0
- package/dist/adapters/postgresql/schemas/postgis/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +50 -32
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +93 -26
- package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
- package/dist/adapters/postgresql/schemas/stats/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/stats/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/index.js +6 -0
- package/dist/adapters/postgresql/schemas/stats/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/input.d.ts +260 -0
- package/dist/adapters/postgresql/schemas/stats/input.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{stats.js → stats/input.js} +2 -331
- package/dist/adapters/postgresql/schemas/stats/input.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{stats.d.ts → stats/output.d.ts} +3 -246
- package/dist/adapters/postgresql/schemas/stats/output.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/output.js +334 -0
- package/dist/adapters/postgresql/schemas/stats/output.js.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts +44 -32
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/text-search.js +53 -36
- package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.d.ts +10 -10
- package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.js +12 -16
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
- package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/admin.js +82 -67
- package/dist/adapters/postgresql/tools/admin.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.js +119 -97
- package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.js +345 -287
- package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
- package/dist/adapters/postgresql/tools/citext/analysis.d.ts +24 -0
- package/dist/adapters/postgresql/tools/citext/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{citext.js → citext/analysis.js} +131 -281
- package/dist/adapters/postgresql/tools/citext/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/citext/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext/index.js +23 -0
- package/dist/adapters/postgresql/tools/citext/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext/setup.d.ts +16 -0
- package/dist/adapters/postgresql/tools/citext/setup.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext/setup.js +193 -0
- package/dist/adapters/postgresql/tools/citext/setup.js.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/codemode/index.js +3 -12
- package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.d.ts +12 -22
- package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.js +116 -211
- package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +1 -0
- package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.js +8 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.js +124 -114
- package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/index.d.ts +2 -1
- package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/index.js +3 -2
- package/dist/adapters/postgresql/tools/core/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.js +153 -128
- package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.js +186 -161
- package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.js +37 -25
- package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.d.ts +6 -3
- package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.js +11 -2
- package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.js +156 -129
- package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/utility.d.ts +26 -0
- package/dist/adapters/postgresql/tools/core/utility.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/utility.js +174 -0
- package/dist/adapters/postgresql/tools/core/utility.js.map +1 -0
- package/dist/adapters/postgresql/tools/cron.js +149 -70
- package/dist/adapters/postgresql/tools/cron.js.map +1 -1
- package/dist/adapters/postgresql/tools/introspection/analysis.d.ts +12 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.js +574 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/graph.d.ts +55 -0
- package/dist/adapters/postgresql/tools/introspection/graph.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/graph.js +638 -0
- package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts +19 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.js +36 -0
- package/dist/adapters/postgresql/tools/introspection/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/migration.d.ts +15 -0
- package/dist/adapters/postgresql/tools/introspection/migration.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/migration.js +599 -0
- package/dist/adapters/postgresql/tools/introspection/migration.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts +20 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.js +367 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts +4 -2
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/index.js +8 -4
- package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/read.d.ts +38 -0
- package/dist/adapters/postgresql/tools/jsonb/read.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/read.js +543 -0
- package/dist/adapters/postgresql/tools/jsonb/read.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/{advanced.d.ts → transform.d.ts} +1 -13
- package/dist/adapters/postgresql/tools/jsonb/transform.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/{advanced.js → transform.js} +39 -361
- package/dist/adapters/postgresql/tools/jsonb/transform.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/write.d.ts +14 -0
- package/dist/adapters/postgresql/tools/jsonb/write.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/write.js +468 -0
- package/dist/adapters/postgresql/tools/jsonb/write.js.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/kcache.js +116 -51
- package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
- package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/ltree.js +358 -259
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
- package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts +15 -0
- package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{monitoring.js → monitoring/analysis.js} +37 -361
- package/dist/adapters/postgresql/tools/monitoring/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.d.ts +17 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.js +432 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/monitoring/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/index.js +31 -0
- package/dist/adapters/postgresql/tools/monitoring/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/partitioning/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/index.js +23 -0
- package/dist/adapters/postgresql/tools/partitioning/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/info.d.ts +11 -0
- package/dist/adapters/postgresql/tools/partitioning/info.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/info.js +302 -0
- package/dist/adapters/postgresql/tools/partitioning/info.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/management.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partitioning/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{partitioning.js → partitioning/management.js} +48 -307
- package/dist/adapters/postgresql/tools/partitioning/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/helpers.d.ts +29 -0
- package/dist/adapters/postgresql/tools/partman/helpers.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/helpers.js +59 -0
- package/dist/adapters/postgresql/tools/partman/helpers.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts +2 -1
- package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/index.js +4 -2
- package/dist/adapters/postgresql/tools/partman/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/maintenance.d.ts +20 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.js +496 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/management.js +452 -417
- package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.d.ts +1 -13
- package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.js +173 -654
- package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.js +79 -45
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.js +83 -55
- package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.js +18 -11
- package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.js +441 -286
- package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.js +67 -79
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/advanced.js +30 -25
- package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.js +137 -100
- package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/schema/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/schema/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema/index.js +32 -0
- package/dist/adapters/postgresql/tools/schema/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema/objects.d.ts +15 -0
- package/dist/adapters/postgresql/tools/schema/objects.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema/objects.js +378 -0
- package/dist/adapters/postgresql/tools/schema/objects.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema/views.d.ts +15 -0
- package/dist/adapters/postgresql/tools/schema/views.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{schema.js → schema/views.js} +91 -339
- package/dist/adapters/postgresql/tools/schema/views.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/stats/advanced.js +40 -235
- package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/stats/basic.js +45 -30
- package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/stats/math-utils.d.ts +33 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.js +225 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/text/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/index.js +33 -0
- package/dist/adapters/postgresql/tools/text/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/matching.d.ts +17 -0
- package/dist/adapters/postgresql/tools/text/matching.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/matching.js +565 -0
- package/dist/adapters/postgresql/tools/text/matching.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/search.d.ts +17 -0
- package/dist/adapters/postgresql/tools/text/search.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/search.js +653 -0
- package/dist/adapters/postgresql/tools/text/search.js.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/transactions.js +11 -27
- package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/{basic.d.ts → data.d.ts} +10 -8
- package/dist/adapters/postgresql/tools/vector/data.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/data.js +540 -0
- package/dist/adapters/postgresql/tools/vector/data.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/vector/index.js +6 -2
- package/dist/adapters/postgresql/tools/vector/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/management.d.ts +11 -0
- package/dist/adapters/postgresql/tools/vector/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/management.js +425 -0
- package/dist/adapters/postgresql/tools/vector/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/query.d.ts +14 -0
- package/dist/adapters/postgresql/tools/vector/query.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/query.js +767 -0
- package/dist/adapters/postgresql/tools/vector/query.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/{advanced.d.ts → search-advanced.d.ts} +4 -5
- package/dist/adapters/postgresql/tools/vector/search-advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/search-advanced.js +626 -0
- package/dist/adapters/postgresql/tools/vector/search-advanced.js.map +1 -0
- package/dist/auth/auth-context.d.ts +28 -0
- package/dist/auth/auth-context.d.ts.map +1 -0
- package/dist/auth/auth-context.js +37 -0
- package/dist/auth/auth-context.js.map +1 -0
- package/dist/auth/scope-map.d.ts +20 -0
- package/dist/auth/scope-map.d.ts.map +1 -0
- package/dist/auth/scope-map.js +40 -0
- package/dist/auth/scope-map.js.map +1 -0
- package/dist/auth/scopes.d.ts.map +1 -1
- package/dist/auth/scopes.js +2 -0
- package/dist/auth/scopes.js.map +1 -1
- package/dist/cli/args.d.ts +3 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli.js +11 -5
- package/dist/cli.js.map +1 -1
- package/dist/codemode/api/aliases.d.ts +14 -0
- package/dist/codemode/api/aliases.d.ts.map +1 -0
- package/dist/codemode/api/aliases.js +503 -0
- package/dist/codemode/api/aliases.js.map +1 -0
- package/dist/codemode/api/group-api.d.ts +23 -0
- package/dist/codemode/api/group-api.d.ts.map +1 -0
- package/dist/codemode/api/group-api.js +179 -0
- package/dist/codemode/api/group-api.js.map +1 -0
- package/dist/codemode/{api.d.ts → api/index.d.ts} +5 -4
- package/dist/codemode/api/index.d.ts.map +1 -0
- package/dist/codemode/api/index.js +192 -0
- package/dist/codemode/api/index.js.map +1 -0
- package/dist/codemode/api/maps.d.ts +47 -0
- package/dist/codemode/api/maps.d.ts.map +1 -0
- package/dist/codemode/api/maps.js +523 -0
- package/dist/codemode/api/maps.js.map +1 -0
- package/dist/codemode/api/normalize.d.ts +13 -0
- package/dist/codemode/api/normalize.d.ts.map +1 -0
- package/dist/codemode/api/normalize.js +120 -0
- package/dist/codemode/api/normalize.js.map +1 -0
- package/dist/codemode/index.d.ts +1 -3
- package/dist/codemode/index.d.ts.map +1 -1
- package/dist/codemode/index.js +1 -5
- package/dist/codemode/index.js.map +1 -1
- package/dist/codemode/sandbox.d.ts +14 -1
- package/dist/codemode/sandbox.d.ts.map +1 -1
- package/dist/codemode/sandbox.js +66 -44
- package/dist/codemode/sandbox.js.map +1 -1
- package/dist/codemode/types.d.ts.map +1 -1
- package/dist/codemode/types.js +3 -0
- package/dist/codemode/types.js.map +1 -1
- package/dist/constants/ServerInstructions.d.ts +5 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +91 -43
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +22 -19
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +48 -37
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/filtering/ToolFilter.d.ts.map +1 -1
- package/dist/filtering/ToolFilter.js +10 -13
- package/dist/filtering/ToolFilter.js.map +1 -1
- package/dist/pool/ConnectionPool.js +1 -1
- package/dist/pool/ConnectionPool.js.map +1 -1
- package/dist/server/McpServer.d.ts +1 -1
- package/dist/server/McpServer.d.ts.map +1 -1
- package/dist/server/McpServer.js +1 -2
- package/dist/server/McpServer.js.map +1 -1
- package/dist/transports/http.d.ts +44 -10
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +327 -40
- package/dist/transports/http.js.map +1 -1
- package/dist/types/filtering.d.ts +2 -2
- package/dist/types/filtering.d.ts.map +1 -1
- package/dist/utils/icons.d.ts.map +1 -1
- package/dist/utils/icons.js +5 -0
- package/dist/utils/icons.js.map +1 -1
- package/dist/utils/logger.d.ts +6 -6
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +18 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progress-utils.d.ts +2 -2
- package/dist/utils/progress-utils.d.ts.map +1 -1
- package/dist/utils/progress-utils.js +2 -3
- package/dist/utils/progress-utils.js.map +1 -1
- package/dist/utils/version.d.ts +9 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +12 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/utils/where-clause.d.ts +4 -0
- package/dist/utils/where-clause.d.ts.map +1 -1
- package/dist/utils/where-clause.js +40 -0
- package/dist/utils/where-clause.js.map +1 -1
- package/package.json +19 -14
- package/dist/adapters/postgresql/schemas/core.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/core.js.map +0 -1
- package/dist/adapters/postgresql/schemas/extensions.d.ts +0 -833
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/extensions.js +0 -1170
- package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -533
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.js +0 -790
- package/dist/adapters/postgresql/schemas/jsonb.js.map +0 -1
- package/dist/adapters/postgresql/schemas/postgis.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/postgis.js.map +0 -1
- package/dist/adapters/postgresql/schemas/stats.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/stats.js.map +0 -1
- package/dist/adapters/postgresql/tools/citext.d.ts +0 -18
- package/dist/adapters/postgresql/tools/citext.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/citext.js.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +0 -20
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.js +0 -915
- package/dist/adapters/postgresql/tools/jsonb/basic.js.map +0 -1
- package/dist/adapters/postgresql/tools/monitoring.d.ts +0 -13
- package/dist/adapters/postgresql/tools/monitoring.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/monitoring.js.map +0 -1
- package/dist/adapters/postgresql/tools/partitioning.d.ts +0 -13
- package/dist/adapters/postgresql/tools/partitioning.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/partitioning.js.map +0 -1
- package/dist/adapters/postgresql/tools/schema.d.ts +0 -13
- package/dist/adapters/postgresql/tools/schema.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/schema.js.map +0 -1
- package/dist/adapters/postgresql/tools/text.d.ts +0 -13
- package/dist/adapters/postgresql/tools/text.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/text.js +0 -903
- package/dist/adapters/postgresql/tools/text.js.map +0 -1
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/vector/advanced.js +0 -958
- package/dist/adapters/postgresql/tools/vector/advanced.js.map +0 -1
- package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/vector/basic.js +0 -1165
- package/dist/adapters/postgresql/tools/vector/basic.js.map +0 -1
- package/dist/codemode/api.d.ts.map +0 -1
- package/dist/codemode/api.js +0 -1510
- package/dist/codemode/api.js.map +0 -1
- package/dist/codemode/sandbox-factory.d.ts +0 -72
- package/dist/codemode/sandbox-factory.d.ts.map +0 -1
- package/dist/codemode/sandbox-factory.js +0 -88
- package/dist/codemode/sandbox-factory.js.map +0 -1
- package/dist/codemode/worker-sandbox.d.ts +0 -82
- package/dist/codemode/worker-sandbox.d.ts.map +0 -1
- package/dist/codemode/worker-sandbox.js +0 -244
- package/dist/codemode/worker-sandbox.js.map +0 -1
- package/dist/codemode/worker-script.d.ts +0 -8
- package/dist/codemode/worker-script.d.ts.map +0 -1
- package/dist/codemode/worker-script.js +0 -113
- package/dist/codemode/worker-script.js.map +0 -1
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { readOnly, write } from "../../../../utils/annotations.js";
|
|
8
8
|
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
-
import {
|
|
9
|
+
import { formatPostgresError } from "../core/error-helpers.js";
|
|
10
|
+
import { PartmanCreateParentSchema, PartmanCreateParentSchemaBase, PartmanRunMaintenanceSchema, PartmanRunMaintenanceSchemaBase, PartmanShowPartitionsSchema, PartmanShowPartitionsSchemaBase, PartmanShowConfigSchema, PartmanShowConfigSchemaBase, DEPRECATED_INTERVALS,
|
|
10
11
|
// Output schemas
|
|
11
12
|
PartmanCreateExtensionOutputSchema, PartmanCreateParentOutputSchema, PartmanRunMaintenanceOutputSchema, PartmanShowPartitionsOutputSchema, PartmanShowConfigOutputSchema, } from "../../schemas/index.js";
|
|
12
13
|
/**
|
|
@@ -15,8 +16,8 @@ PartmanCreateExtensionOutputSchema, PartmanCreateParentOutputSchema, PartmanRunM
|
|
|
15
16
|
*/
|
|
16
17
|
async function getPartmanSchema(adapter) {
|
|
17
18
|
const result = await adapter.executeQuery(`
|
|
18
|
-
SELECT table_schema FROM information_schema.tables
|
|
19
|
-
WHERE table_name = 'part_config'
|
|
19
|
+
SELECT table_schema FROM information_schema.tables
|
|
20
|
+
WHERE table_name = 'part_config'
|
|
20
21
|
AND table_schema IN ('partman', 'public')
|
|
21
22
|
LIMIT 1
|
|
22
23
|
`);
|
|
@@ -35,8 +36,18 @@ export function createPartmanExtensionTool(adapter) {
|
|
|
35
36
|
annotations: write("Create Partman Extension"),
|
|
36
37
|
icons: getToolIcons("partman", write("Create Partman Extension")),
|
|
37
38
|
handler: async (_params, _context) => {
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
try {
|
|
40
|
+
await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS pg_partman");
|
|
41
|
+
return { success: true, message: "pg_partman extension enabled" };
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
error: formatPostgresError(error, {
|
|
47
|
+
tool: "pg_partman_create_extension",
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
40
51
|
},
|
|
41
52
|
};
|
|
42
53
|
}
|
|
@@ -46,175 +57,204 @@ export function createPartmanExtensionTool(adapter) {
|
|
|
46
57
|
export function createPartmanCreateParentTool(adapter) {
|
|
47
58
|
return {
|
|
48
59
|
name: "pg_partman_create_parent",
|
|
49
|
-
description: `Create a new partition set using pg_partman's create_parent() function.
|
|
60
|
+
description: `Create a new partition set using pg_partman's create_parent() function.
|
|
50
61
|
Supports time-based and integer-based partitioning with automatic child partition creation.
|
|
51
62
|
The parent table must already exist before calling this function.
|
|
52
63
|
|
|
53
64
|
Partition type (time vs integer) is automatically detected from the control column's data type.
|
|
54
65
|
For non-timestamp/integer columns (text, uuid), use raw pg_partman SQL with timeEncoder/timeDecoder parameters.
|
|
55
66
|
|
|
56
|
-
IMPORTANT: For empty tables with no data, you MUST provide startPartition (e.g., 'now' for current date, or a specific date like '2024-01-01').
|
|
67
|
+
IMPORTANT: For empty tables with no data, you MUST provide startPartition (e.g., 'now' for current date, or a specific date like '2024-01-01').
|
|
57
68
|
Without startPartition and data, pg_partman cannot determine where to start creating partitions.
|
|
58
69
|
|
|
59
70
|
TIP: startPartition accepts 'now' as a shorthand for the current date/time.
|
|
60
71
|
|
|
61
|
-
WARNING: startPartition creates ALL partitions from that date to current date + premake.
|
|
72
|
+
WARNING: startPartition creates ALL partitions from that date to current date + premake.
|
|
62
73
|
A startPartition far in the past (e.g., '2024-01-01' with daily intervals) creates many partitions.`,
|
|
63
74
|
group: "partman",
|
|
64
|
-
inputSchema:
|
|
75
|
+
inputSchema: PartmanCreateParentSchemaBase,
|
|
65
76
|
outputSchema: PartmanCreateParentOutputSchema,
|
|
66
77
|
annotations: write("Create Partition Parent"),
|
|
67
78
|
icons: getToolIcons("partman", write("Create Partition Parent")),
|
|
68
79
|
handler: async (params, _context) => {
|
|
69
|
-
const { parentTable, controlColumn, interval, premake, startPartition, templateTable, epochType, defaultPartition, } = PartmanCreateParentSchema.parse(params);
|
|
70
|
-
// Validate required parameters with clear error messages
|
|
71
|
-
if (!parentTable || !controlColumn || !interval) {
|
|
72
|
-
const missing = [];
|
|
73
|
-
if (!parentTable)
|
|
74
|
-
missing.push("parentTable");
|
|
75
|
-
if (!controlColumn)
|
|
76
|
-
missing.push("controlColumn (or control)");
|
|
77
|
-
if (!interval)
|
|
78
|
-
missing.push("interval");
|
|
79
|
-
return {
|
|
80
|
-
success: false,
|
|
81
|
-
error: `Missing required parameters: ${missing.join(", ")}.`,
|
|
82
|
-
hint: 'Example: pg_partman_create_parent({ parentTable: "public.events", controlColumn: "created_at", interval: "1 month" })',
|
|
83
|
-
aliases: { control: "controlColumn" },
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
// At this point, all required params are guaranteed to be defined
|
|
87
|
-
const validatedParentTable = parentTable;
|
|
88
|
-
const validatedControlColumn = controlColumn;
|
|
89
|
-
const validatedInterval = interval;
|
|
90
|
-
// Note: pg_partman defaults to 'range' type, which is correct for most uses
|
|
91
|
-
const args = [
|
|
92
|
-
`p_parent_table := '${validatedParentTable}'`,
|
|
93
|
-
`p_control := '${validatedControlColumn}'`,
|
|
94
|
-
`p_interval := '${validatedInterval}'`,
|
|
95
|
-
];
|
|
96
|
-
if (premake !== undefined) {
|
|
97
|
-
args.push(`p_premake := ${String(premake)}`);
|
|
98
|
-
}
|
|
99
|
-
if (startPartition !== undefined) {
|
|
100
|
-
args.push(`p_start_partition := '${startPartition}'`);
|
|
101
|
-
}
|
|
102
|
-
if (templateTable !== undefined) {
|
|
103
|
-
args.push(`p_template_table := '${templateTable}'`);
|
|
104
|
-
}
|
|
105
|
-
if (epochType !== undefined) {
|
|
106
|
-
args.push(`p_epoch := '${epochType}'`);
|
|
107
|
-
}
|
|
108
|
-
if (defaultPartition !== undefined) {
|
|
109
|
-
args.push(`p_default_table := ${String(defaultPartition)}`);
|
|
110
|
-
}
|
|
111
|
-
const partmanSchema = await getPartmanSchema(adapter);
|
|
112
|
-
const sql = `SELECT ${partmanSchema}.create_parent(${args.join(", ")})`;
|
|
113
80
|
try {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
81
|
+
const { parentTable, controlColumn, interval, premake, startPartition, templateTable, epochType, defaultPartition, } = PartmanCreateParentSchema.parse(params);
|
|
82
|
+
// Validate required parameters with clear error messages
|
|
83
|
+
if (!parentTable || !controlColumn || !interval) {
|
|
84
|
+
const missing = [];
|
|
85
|
+
if (!parentTable)
|
|
86
|
+
missing.push("parentTable");
|
|
87
|
+
if (!controlColumn)
|
|
88
|
+
missing.push("controlColumn (or control)");
|
|
89
|
+
if (!interval)
|
|
90
|
+
missing.push("interval");
|
|
121
91
|
return {
|
|
122
92
|
success: false,
|
|
123
|
-
error: `
|
|
124
|
-
hint:
|
|
125
|
-
|
|
126
|
-
`DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '${validatedParentTable}';`,
|
|
93
|
+
error: `Missing required parameters: ${missing.join(", ")}.`,
|
|
94
|
+
hint: 'Example: pg_partman_create_parent({ parentTable: "public.events", controlColumn: "created_at", interval: "1 month" })',
|
|
95
|
+
aliases: { control: "controlColumn" },
|
|
127
96
|
};
|
|
128
97
|
}
|
|
129
|
-
|
|
130
|
-
|
|
98
|
+
// Check for deprecated interval keywords and return structured error
|
|
99
|
+
const deprecatedReplacement = DEPRECATED_INTERVALS[interval.toLowerCase()];
|
|
100
|
+
if (deprecatedReplacement) {
|
|
131
101
|
return {
|
|
132
102
|
success: false,
|
|
133
|
-
error: `
|
|
134
|
-
hint: "
|
|
103
|
+
error: `Deprecated interval '${interval}'. Use PostgreSQL interval syntax instead: '${deprecatedReplacement}'.`,
|
|
104
|
+
hint: "Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. Do NOT use keywords like 'daily' or 'monthly'.",
|
|
135
105
|
};
|
|
136
106
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
107
|
+
// At this point, all required params are guaranteed to be defined
|
|
108
|
+
const validatedParentTable = parentTable;
|
|
109
|
+
const validatedControlColumn = controlColumn;
|
|
110
|
+
const validatedInterval = interval;
|
|
111
|
+
// Note: pg_partman defaults to 'range' type, which is correct for most uses
|
|
112
|
+
const args = [
|
|
113
|
+
`p_parent_table := '${validatedParentTable}'`,
|
|
114
|
+
`p_control := '${validatedControlColumn}'`,
|
|
115
|
+
`p_interval := '${validatedInterval}'`,
|
|
116
|
+
];
|
|
117
|
+
// premake is passed directly to pg_partman create_parent
|
|
118
|
+
// Guard against NaN from z.coerce.number("abc")
|
|
119
|
+
if (premake !== undefined && !isNaN(premake)) {
|
|
120
|
+
args.push(`p_premake := ${String(premake)}`);
|
|
143
121
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
122
|
+
if (startPartition !== undefined) {
|
|
123
|
+
// pg_partman 5.x doesn't interpret 'now' as a timestamp literal.
|
|
124
|
+
// Resolve 'now' to NOW()::text so pg_partman receives an actual timestamp string.
|
|
125
|
+
if (startPartition.toLowerCase() === "now") {
|
|
126
|
+
args.push(`p_start_partition := NOW()::text`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
args.push(`p_start_partition := '${startPartition}'`);
|
|
130
|
+
}
|
|
151
131
|
}
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
return {
|
|
155
|
-
success: false,
|
|
156
|
-
error: `Control column '${validatedControlColumn}' must have a NOT NULL constraint.`,
|
|
157
|
-
hint: "Add NOT NULL constraint to the control column. Example: ALTER TABLE events ALTER COLUMN ts SET NOT NULL;",
|
|
158
|
-
};
|
|
132
|
+
if (templateTable !== undefined) {
|
|
133
|
+
args.push(`p_template_table := '${templateTable}'`);
|
|
159
134
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
errorMsg.includes("must have created the given parent table")) {
|
|
163
|
-
return {
|
|
164
|
-
success: false,
|
|
165
|
-
error: `Table '${validatedParentTable}' must be created as RANGE or LIST partitioned before calling createParent.`,
|
|
166
|
-
hint: "Create the table with PARTITION BY RANGE or PARTITION BY LIST clause first. " +
|
|
167
|
-
"Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
|
|
168
|
-
};
|
|
135
|
+
if (epochType !== undefined) {
|
|
136
|
+
args.push(`p_epoch := '${epochType}'`);
|
|
169
137
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return {
|
|
173
|
-
success: false,
|
|
174
|
-
error: `Invalid interval format: '${validatedInterval}'.`,
|
|
175
|
-
hint: "Use PostgreSQL interval syntax. Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. " +
|
|
176
|
-
"Do NOT use keywords like 'daily' or 'monthly'.",
|
|
177
|
-
examples: [
|
|
178
|
-
"1 day",
|
|
179
|
-
"1 week",
|
|
180
|
-
"2 weeks",
|
|
181
|
-
"1 month",
|
|
182
|
-
"3 months",
|
|
183
|
-
"1 year",
|
|
184
|
-
],
|
|
185
|
-
};
|
|
138
|
+
if (defaultPartition !== undefined) {
|
|
139
|
+
args.push(`p_default_table := ${String(defaultPartition)}`);
|
|
186
140
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
141
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
142
|
+
const sql = `SELECT ${partmanSchema}.create_parent(${args.join(", ")})`;
|
|
143
|
+
try {
|
|
144
|
+
await adapter.executeQuery(sql);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
const errorMsg = e instanceof Error ? e.message : String(e);
|
|
148
|
+
// Wrap common PostgreSQL/pg_partman errors with clearer messages
|
|
149
|
+
if (errorMsg.includes("duplicate key") ||
|
|
150
|
+
errorMsg.includes("already exists in part_config")) {
|
|
151
|
+
return {
|
|
152
|
+
success: false,
|
|
153
|
+
error: `Table '${validatedParentTable}' is already managed by pg_partman.`,
|
|
154
|
+
hint: "Use pg_partman_show_config to view existing configuration. " +
|
|
155
|
+
"To recreate: use pg_partman_undo_partition first, or if the table was dropped, clean up with: " +
|
|
156
|
+
`DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '${validatedParentTable}';`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (errorMsg.includes("does not exist") &&
|
|
160
|
+
errorMsg.includes("relation")) {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
error: `Table '${validatedParentTable}' does not exist.`,
|
|
164
|
+
hint: "Create the parent table first with appropriate columns, then call pg_partman_create_parent.",
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (errorMsg.includes("Unable to find given parent table")) {
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
error: `Table '${validatedParentTable}' does not exist.`,
|
|
171
|
+
hint: "Create the parent table first with PARTITION BY clause, then call pg_partman_create_parent.",
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// Check 'is not partitioned' BEFORE 'NOT NULL' - if table isn't partitioned, that's the primary issue
|
|
175
|
+
if (errorMsg.includes("is not partitioned")) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
error: `Table '${validatedParentTable}' is not a partitioned table.`,
|
|
179
|
+
hint: "Create the table with PARTITION BY clause. Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (errorMsg.includes("cannot be null") ||
|
|
183
|
+
errorMsg.includes("NOT NULL")) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: `Control column '${validatedControlColumn}' must have a NOT NULL constraint.`,
|
|
187
|
+
hint: "Add NOT NULL constraint to the control column. Example: ALTER TABLE events ALTER COLUMN ts SET NOT NULL;",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Catch pg_partman's partition type requirement error
|
|
191
|
+
if (errorMsg.includes("ranged or list partitioned") ||
|
|
192
|
+
errorMsg.includes("must have created the given parent table")) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
error: `Table '${validatedParentTable}' must be created as RANGE or LIST partitioned before calling createParent.`,
|
|
196
|
+
hint: "Create the table with PARTITION BY RANGE or PARTITION BY LIST clause first. " +
|
|
197
|
+
"Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Catch invalid interval format error with user-friendly message
|
|
201
|
+
if (errorMsg.includes("invalid input syntax for type interval")) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
error: `Invalid interval format: '${validatedInterval}'.`,
|
|
205
|
+
hint: "Use PostgreSQL interval syntax. Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. " +
|
|
206
|
+
"Do NOT use keywords like 'daily' or 'monthly'.",
|
|
207
|
+
examples: [
|
|
208
|
+
"1 day",
|
|
209
|
+
"1 week",
|
|
210
|
+
"2 weeks",
|
|
211
|
+
"1 month",
|
|
212
|
+
"3 months",
|
|
213
|
+
"1 year",
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Re-throw other errors — outer catch will format them
|
|
218
|
+
throw e;
|
|
219
|
+
}
|
|
220
|
+
// pg_partman's create_parent only registers the partition set - it doesn't always create child partitions
|
|
221
|
+
// We call run_maintenance to attempt to create initial partitions, but this may fail in some cases
|
|
222
|
+
// (e.g., when no startPartition is specified and the control column has no existing data to determine ranges)
|
|
223
|
+
let maintenanceRan = false;
|
|
224
|
+
try {
|
|
225
|
+
const maintenanceSql = `SELECT ${partmanSchema}.run_maintenance(p_parent_table := '${validatedParentTable}')`;
|
|
226
|
+
await adapter.executeQuery(maintenanceSql);
|
|
227
|
+
maintenanceRan = true;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// Maintenance may fail for new partition sets without data - this is expected
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
success: true,
|
|
234
|
+
parentTable: validatedParentTable,
|
|
235
|
+
controlColumn: validatedControlColumn,
|
|
236
|
+
interval: validatedInterval,
|
|
237
|
+
premake: premake !== undefined && !isNaN(premake) ? premake : 4,
|
|
238
|
+
maintenanceRan,
|
|
239
|
+
// Suppress raw maintenanceError - the message/hint explains the situation clearly
|
|
240
|
+
message: maintenanceRan
|
|
241
|
+
? `Partition set created for ${validatedParentTable} on column ${validatedControlColumn}. Initial partitions created.`
|
|
242
|
+
: `Partition set registered for ${validatedParentTable} on column ${validatedControlColumn}. ` +
|
|
243
|
+
`No child partitions created yet - pg_partman needs data or a startPartition that matches the control column type.`,
|
|
244
|
+
hint: !maintenanceRan
|
|
245
|
+
? 'For DATE columns, use a date like "2024-01-01". For TIMESTAMP columns, "now" works. ' +
|
|
246
|
+
"Otherwise, insert data first and run pg_partman_run_maintenance."
|
|
247
|
+
: undefined,
|
|
248
|
+
};
|
|
197
249
|
}
|
|
198
|
-
catch {
|
|
199
|
-
|
|
250
|
+
catch (error) {
|
|
251
|
+
return {
|
|
252
|
+
success: false,
|
|
253
|
+
error: formatPostgresError(error, {
|
|
254
|
+
tool: "pg_partman_create_parent",
|
|
255
|
+
}),
|
|
256
|
+
};
|
|
200
257
|
}
|
|
201
|
-
return {
|
|
202
|
-
success: true,
|
|
203
|
-
parentTable: validatedParentTable,
|
|
204
|
-
controlColumn: validatedControlColumn,
|
|
205
|
-
interval: validatedInterval,
|
|
206
|
-
premake: premake ?? 4,
|
|
207
|
-
maintenanceRan,
|
|
208
|
-
// Suppress raw maintenanceError - the message/hint explains the situation clearly
|
|
209
|
-
message: maintenanceRan
|
|
210
|
-
? `Partition set created for ${validatedParentTable} on column ${validatedControlColumn}. Initial partitions created.`
|
|
211
|
-
: `Partition set registered for ${validatedParentTable} on column ${validatedControlColumn}. ` +
|
|
212
|
-
`No child partitions created yet - pg_partman needs data or a startPartition that matches the control column type.`,
|
|
213
|
-
hint: !maintenanceRan
|
|
214
|
-
? 'For DATE columns, use a date like "2024-01-01". For TIMESTAMP columns, "now" works. ' +
|
|
215
|
-
"Otherwise, insert data first and run pg_partman_run_maintenance."
|
|
216
|
-
: undefined,
|
|
217
|
-
};
|
|
218
258
|
},
|
|
219
259
|
};
|
|
220
260
|
}
|
|
@@ -228,139 +268,149 @@ export function createPartmanRunMaintenanceTool(adapter) {
|
|
|
228
268
|
Should be executed regularly (e.g., via pg_cron) to keep partitions current.
|
|
229
269
|
Maintains all partition sets if no specific parent table is specified.`,
|
|
230
270
|
group: "partman",
|
|
231
|
-
inputSchema:
|
|
271
|
+
inputSchema: PartmanRunMaintenanceSchemaBase,
|
|
232
272
|
outputSchema: PartmanRunMaintenanceOutputSchema,
|
|
233
273
|
annotations: write("Run Partition Maintenance"),
|
|
234
274
|
icons: getToolIcons("partman", write("Run Partition Maintenance")),
|
|
235
275
|
handler: async (params, _context) => {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
success: false,
|
|
245
|
-
parentTable,
|
|
246
|
-
error: `Table '${parentTable}' is not managed by pg_partman.`,
|
|
247
|
-
hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
const args = [`p_parent_table := '${parentTable}'`];
|
|
251
|
-
if (analyze !== undefined) {
|
|
252
|
-
args.push(`p_analyze := ${String(analyze)}`);
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
|
|
256
|
-
await adapter.executeQuery(sql);
|
|
257
|
-
return {
|
|
258
|
-
success: true,
|
|
259
|
-
parentTable,
|
|
260
|
-
analyze: analyze ?? true,
|
|
261
|
-
message: `Maintenance completed for ${parentTable}`,
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
catch (e) {
|
|
265
|
-
// Extract clean error message (first line only, remove PL/pgSQL context)
|
|
266
|
-
let errorMsg = e instanceof Error ? e.message : String(e);
|
|
267
|
-
const fullError = errorMsg;
|
|
268
|
-
errorMsg = errorMsg.split("\n")[0] ?? errorMsg;
|
|
269
|
-
errorMsg = errorMsg.replace(/\s+CONTEXT:.*$/i, "").trim();
|
|
270
|
-
// Catch pg_partman internal errors about NULL child tables
|
|
271
|
-
if (fullError.includes("Child table given does not exist") ||
|
|
272
|
-
fullError.includes("<NULL>")) {
|
|
276
|
+
try {
|
|
277
|
+
const { parentTable, analyze } = PartmanRunMaintenanceSchema.parse(params);
|
|
278
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
279
|
+
// If specific table provided, validate and run maintenance directly
|
|
280
|
+
if (parentTable !== undefined) {
|
|
281
|
+
// Check if table has a pg_partman configuration
|
|
282
|
+
const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
|
|
283
|
+
if ((configCheck.rows?.length ?? 0) === 0) {
|
|
273
284
|
return {
|
|
274
285
|
success: false,
|
|
275
286
|
parentTable,
|
|
276
|
-
error:
|
|
277
|
-
hint: "
|
|
278
|
-
|
|
287
|
+
error: `Table '${parentTable}' is not managed by pg_partman.`,
|
|
288
|
+
hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const args = [`p_parent_table := '${parentTable}'`];
|
|
292
|
+
if (analyze !== undefined) {
|
|
293
|
+
args.push(`p_analyze := ${String(analyze)}`);
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
|
|
297
|
+
await adapter.executeQuery(sql);
|
|
298
|
+
return {
|
|
299
|
+
success: true,
|
|
300
|
+
parentTable,
|
|
301
|
+
analyze: analyze ?? true,
|
|
302
|
+
message: `Maintenance completed for ${parentTable}`,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
// Extract clean error message (first line only, remove PL/pgSQL context)
|
|
307
|
+
let errorMsg = e instanceof Error ? e.message : String(e);
|
|
308
|
+
const fullError = errorMsg;
|
|
309
|
+
errorMsg = errorMsg.split("\n")[0] ?? errorMsg;
|
|
310
|
+
errorMsg = errorMsg.replace(/\s+CONTEXT:.*$/i, "").trim();
|
|
311
|
+
// Catch pg_partman internal errors about NULL child tables
|
|
312
|
+
if (fullError.includes("Child table given does not exist") ||
|
|
313
|
+
fullError.includes("<NULL>")) {
|
|
314
|
+
return {
|
|
315
|
+
success: false,
|
|
316
|
+
parentTable,
|
|
317
|
+
error: "Partition set has no child partitions yet.",
|
|
318
|
+
hint: "For new partition sets, ensure startPartition is valid for your data. " +
|
|
319
|
+
"Insert data first, then run maintenance, or specify a valid startPartition when creating the parent.",
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
// Return clean error response instead of throwing with stack trace
|
|
323
|
+
return {
|
|
324
|
+
success: false,
|
|
325
|
+
parentTable,
|
|
326
|
+
error: errorMsg,
|
|
327
|
+
hint: "Check that the parent table exists, is properly partitioned, and has valid pg_partman configuration. " +
|
|
328
|
+
"Use pg_partman_show_config to verify configuration.",
|
|
279
329
|
};
|
|
280
330
|
}
|
|
281
|
-
// Return clean error response instead of throwing with stack trace
|
|
282
|
-
return {
|
|
283
|
-
success: false,
|
|
284
|
-
parentTable,
|
|
285
|
-
error: errorMsg,
|
|
286
|
-
hint: "Check that the parent table exists, is properly partitioned, and has valid pg_partman configuration. " +
|
|
287
|
-
"Use pg_partman_show_config to verify configuration.",
|
|
288
|
-
};
|
|
289
331
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
const configsResult = await adapter.executeQuery(`
|
|
332
|
+
// For all partition sets, iterate ourselves to handle orphaned configs gracefully
|
|
333
|
+
const configsResult = await adapter.executeQuery(`
|
|
293
334
|
SELECT parent_table FROM ${partmanSchema}.part_config
|
|
294
335
|
`);
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
SELECT 1 FROM information_schema.tables
|
|
336
|
+
const configs = configsResult.rows ?? [];
|
|
337
|
+
const maintained = [];
|
|
338
|
+
const orphanedTables = [];
|
|
339
|
+
const errors = [];
|
|
340
|
+
for (const config of configs) {
|
|
341
|
+
const table = config["parent_table"];
|
|
342
|
+
// Check if table still exists
|
|
343
|
+
const [schema, tableName] = table.includes(".")
|
|
344
|
+
? [table.split(".")[0], table.split(".")[1]]
|
|
345
|
+
: ["public", table];
|
|
346
|
+
const tableExistsResult = await adapter.executeQuery(`
|
|
347
|
+
SELECT 1 FROM information_schema.tables
|
|
307
348
|
WHERE table_schema = $1 AND table_name = $2
|
|
308
349
|
`, [schema, tableName]);
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
313
|
-
// Run maintenance for this table
|
|
314
|
-
try {
|
|
315
|
-
const args = [`p_parent_table := '${table}'`];
|
|
316
|
-
if (analyze !== undefined) {
|
|
317
|
-
args.push(`p_analyze := ${String(analyze)}`);
|
|
350
|
+
if ((tableExistsResult.rows?.length ?? 0) === 0) {
|
|
351
|
+
orphanedTables.push(table);
|
|
352
|
+
continue;
|
|
318
353
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
354
|
+
// Run maintenance for this table
|
|
355
|
+
try {
|
|
356
|
+
const args = [`p_parent_table := '${table}'`];
|
|
357
|
+
if (analyze !== undefined) {
|
|
358
|
+
args.push(`p_analyze := ${String(analyze)}`);
|
|
359
|
+
}
|
|
360
|
+
const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
|
|
361
|
+
await adapter.executeQuery(sql);
|
|
362
|
+
maintained.push(table);
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
// Extract clean error message (first line only, remove PL/pgSQL context)
|
|
366
|
+
let reason = error instanceof Error ? error.message : "Unknown error";
|
|
367
|
+
reason = reason.split("\n")[0] ?? reason;
|
|
368
|
+
reason = reason.replace(/\s+CONTEXT:.*$/i, "").trim();
|
|
369
|
+
// Improve NULL child error with actionable guidance
|
|
370
|
+
if (reason.includes("Child table") && reason.includes("NULL")) {
|
|
371
|
+
reason =
|
|
372
|
+
"No child partitions exist yet. For empty tables, ensure startPartition was set when creating the partition set. " +
|
|
373
|
+
'TIP: Use pg_partman_create_parent with startPartition (e.g., "now" or a specific date) to bootstrap partitions.';
|
|
374
|
+
}
|
|
375
|
+
errors.push({
|
|
376
|
+
table,
|
|
377
|
+
reason,
|
|
378
|
+
});
|
|
333
379
|
}
|
|
334
|
-
errors.push({
|
|
335
|
-
table,
|
|
336
|
-
reason,
|
|
337
|
-
});
|
|
338
380
|
}
|
|
381
|
+
// Determine success status
|
|
382
|
+
const skippedCount = orphanedTables.length + errors.length;
|
|
383
|
+
const allFailed = maintained.length === 0 && skippedCount > 0;
|
|
384
|
+
const partial = maintained.length > 0 && skippedCount > 0;
|
|
385
|
+
return {
|
|
386
|
+
success: !allFailed,
|
|
387
|
+
partial: partial ? true : undefined,
|
|
388
|
+
parentTable: "all",
|
|
389
|
+
analyze: analyze ?? true,
|
|
390
|
+
maintained,
|
|
391
|
+
orphaned: orphanedTables.length > 0
|
|
392
|
+
? {
|
|
393
|
+
count: orphanedTables.length,
|
|
394
|
+
tables: orphanedTables,
|
|
395
|
+
hint: `Remove orphaned configs: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`,
|
|
396
|
+
}
|
|
397
|
+
: undefined,
|
|
398
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
399
|
+
message: allFailed
|
|
400
|
+
? `Maintenance failed for all ${String(skippedCount)} partition sets due to errors.`
|
|
401
|
+
: skippedCount > 0
|
|
402
|
+
? `Maintenance completed for ${String(maintained.length)} partition sets. ${String(skippedCount)} skipped (${String(orphanedTables.length)} orphaned, ${String(errors.length)} errors).`
|
|
403
|
+
: `Maintenance completed for all ${String(maintained.length)} partition sets`,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
return {
|
|
408
|
+
success: false,
|
|
409
|
+
error: formatPostgresError(error, {
|
|
410
|
+
tool: "pg_partman_run_maintenance",
|
|
411
|
+
}),
|
|
412
|
+
};
|
|
339
413
|
}
|
|
340
|
-
// Determine success status
|
|
341
|
-
const skippedCount = orphanedTables.length + errors.length;
|
|
342
|
-
const allFailed = maintained.length === 0 && skippedCount > 0;
|
|
343
|
-
const partial = maintained.length > 0 && skippedCount > 0;
|
|
344
|
-
return {
|
|
345
|
-
success: !allFailed,
|
|
346
|
-
partial: partial ? true : undefined,
|
|
347
|
-
parentTable: "all",
|
|
348
|
-
analyze: analyze ?? true,
|
|
349
|
-
maintained,
|
|
350
|
-
orphaned: orphanedTables.length > 0
|
|
351
|
-
? {
|
|
352
|
-
count: orphanedTables.length,
|
|
353
|
-
tables: orphanedTables,
|
|
354
|
-
hint: `Remove orphaned configs: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`,
|
|
355
|
-
}
|
|
356
|
-
: undefined,
|
|
357
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
358
|
-
message: allFailed
|
|
359
|
-
? `Maintenance failed for all ${String(skippedCount)} partition sets due to errors.`
|
|
360
|
-
: skippedCount > 0
|
|
361
|
-
? `Maintenance completed for ${String(maintained.length)} partition sets. ${String(skippedCount)} skipped (${String(orphanedTables.length)} orphaned, ${String(errors.length)} errors).`
|
|
362
|
-
: `Maintenance completed for all ${String(maintained.length)} partition sets`,
|
|
363
|
-
};
|
|
364
414
|
},
|
|
365
415
|
};
|
|
366
416
|
}
|
|
@@ -374,67 +424,78 @@ export function createPartmanShowPartitionsTool(adapter) {
|
|
|
374
424
|
name: "pg_partman_show_partitions",
|
|
375
425
|
description: "List all child partitions for a partition set managed by pg_partman.",
|
|
376
426
|
group: "partman",
|
|
377
|
-
inputSchema:
|
|
427
|
+
inputSchema: PartmanShowPartitionsSchemaBase,
|
|
378
428
|
outputSchema: PartmanShowPartitionsOutputSchema,
|
|
379
429
|
annotations: readOnly("Show Partman Partitions"),
|
|
380
430
|
icons: getToolIcons("partman", readOnly("Show Partman Partitions")),
|
|
381
431
|
handler: async (params, _context) => {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
432
|
+
try {
|
|
433
|
+
const parsed = PartmanShowPartitionsSchema.parse(params);
|
|
434
|
+
const { parentTable, includeDefault, order } = parsed;
|
|
435
|
+
const rawLimit = parsed.limit ?? DEFAULT_PARTITION_LIMIT;
|
|
436
|
+
const limit = isNaN(rawLimit) ? DEFAULT_PARTITION_LIMIT : rawLimit;
|
|
437
|
+
// parentTable is required - provide clear error if missing
|
|
438
|
+
if (!parentTable) {
|
|
439
|
+
return {
|
|
440
|
+
success: false,
|
|
441
|
+
error: 'parentTable parameter is required. Specify the parent table (e.g., "public.events") to list its partitions.',
|
|
442
|
+
hint: "Use pg_partman_show_config to list all partition sets first.",
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
const orderDir = order === "desc" ? "DESC" : "ASC";
|
|
446
|
+
const includeDefaultVal = includeDefault ?? false;
|
|
447
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
448
|
+
// First check if table is managed by pg_partman
|
|
449
|
+
const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
|
|
450
|
+
if ((configCheck.rows?.length ?? 0) === 0) {
|
|
451
|
+
return {
|
|
452
|
+
success: false,
|
|
453
|
+
error: `Table '${parentTable}' is not managed by pg_partman.`,
|
|
454
|
+
hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
// First get total count for pagination
|
|
458
|
+
const countSql = `
|
|
407
459
|
SELECT COUNT(*) as total FROM ${partmanSchema}.show_partitions(
|
|
408
460
|
p_parent_table := '${parentTable}',
|
|
409
461
|
p_include_default := ${String(includeDefaultVal)},
|
|
410
462
|
p_order := '${orderDir}'
|
|
411
463
|
)
|
|
412
464
|
`;
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
465
|
+
const countResult = await adapter.executeQuery(countSql);
|
|
466
|
+
const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
|
|
467
|
+
// Apply limit (0 means no limit)
|
|
468
|
+
const applyLimit = limit > 0;
|
|
469
|
+
let sql = `
|
|
418
470
|
SELECT * FROM ${partmanSchema}.show_partitions(
|
|
419
471
|
p_parent_table := '${parentTable}',
|
|
420
472
|
p_include_default := ${String(includeDefaultVal)},
|
|
421
473
|
p_order := '${orderDir}'
|
|
422
474
|
)
|
|
423
475
|
`;
|
|
424
|
-
|
|
425
|
-
|
|
476
|
+
if (applyLimit) {
|
|
477
|
+
sql += ` LIMIT ${String(limit)}`;
|
|
478
|
+
}
|
|
479
|
+
const result = await adapter.executeQuery(sql);
|
|
480
|
+
const partitions = result.rows ?? [];
|
|
481
|
+
const truncated = applyLimit && totalCount > limit;
|
|
482
|
+
return {
|
|
483
|
+
success: true,
|
|
484
|
+
parentTable,
|
|
485
|
+
partitions,
|
|
486
|
+
count: partitions.length,
|
|
487
|
+
truncated,
|
|
488
|
+
totalCount,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
return {
|
|
493
|
+
success: false,
|
|
494
|
+
error: formatPostgresError(error, {
|
|
495
|
+
tool: "pg_partman_show_partitions",
|
|
496
|
+
}),
|
|
497
|
+
};
|
|
426
498
|
}
|
|
427
|
-
const result = await adapter.executeQuery(sql);
|
|
428
|
-
const partitions = result.rows ?? [];
|
|
429
|
-
const truncated = applyLimit && totalCount > limit;
|
|
430
|
-
return {
|
|
431
|
-
success: true,
|
|
432
|
-
parentTable,
|
|
433
|
-
partitions,
|
|
434
|
-
count: partitions.length,
|
|
435
|
-
truncated,
|
|
436
|
-
totalCount,
|
|
437
|
-
};
|
|
438
499
|
},
|
|
439
500
|
};
|
|
440
501
|
}
|
|
@@ -442,135 +503,109 @@ export function createPartmanShowPartitionsTool(adapter) {
|
|
|
442
503
|
* Show partition configuration
|
|
443
504
|
*/
|
|
444
505
|
export function createPartmanShowConfigTool(adapter) {
|
|
445
|
-
// Preprocess to support table/parent/name aliases and auto-prefix public schema
|
|
446
|
-
const inputSchema = z
|
|
447
|
-
.preprocess((input) => {
|
|
448
|
-
if (typeof input !== "object" || input === null)
|
|
449
|
-
return input;
|
|
450
|
-
const raw = input;
|
|
451
|
-
const result = { ...raw };
|
|
452
|
-
// Alias: table → parentTable
|
|
453
|
-
if (result.table && !result.parentTable) {
|
|
454
|
-
result.parentTable = result.table;
|
|
455
|
-
}
|
|
456
|
-
// Alias: parent → parentTable (documented in ServerInstructions)
|
|
457
|
-
if (result.parent && !result.parentTable) {
|
|
458
|
-
result.parentTable = result.parent;
|
|
459
|
-
}
|
|
460
|
-
// Alias: name → parentTable (documented in ServerInstructions)
|
|
461
|
-
if (result.name && !result.parentTable) {
|
|
462
|
-
result.parentTable = result.name;
|
|
463
|
-
}
|
|
464
|
-
// Auto-prefix public. for parentTable when no schema specified
|
|
465
|
-
// (Consistent with other partman tools)
|
|
466
|
-
if (result.parentTable && !result.parentTable.includes(".")) {
|
|
467
|
-
result.parentTable = `public.${result.parentTable}`;
|
|
468
|
-
}
|
|
469
|
-
return result;
|
|
470
|
-
}, z.object({
|
|
471
|
-
parentTable: z
|
|
472
|
-
.string()
|
|
473
|
-
.optional()
|
|
474
|
-
.describe("Parent table name (all configs if omitted)"),
|
|
475
|
-
limit: z
|
|
476
|
-
.number()
|
|
477
|
-
.optional()
|
|
478
|
-
.describe("Maximum number of configs to return (default: 50, use 0 for all)"),
|
|
479
|
-
}))
|
|
480
|
-
.default({});
|
|
481
506
|
return {
|
|
482
507
|
name: "pg_partman_show_config",
|
|
483
508
|
description: "View the configuration for a partition set from part_config table.",
|
|
484
509
|
group: "partman",
|
|
485
|
-
inputSchema,
|
|
510
|
+
inputSchema: PartmanShowConfigSchemaBase,
|
|
486
511
|
outputSchema: PartmanShowConfigOutputSchema,
|
|
487
512
|
annotations: readOnly("Show Partman Config"),
|
|
488
513
|
icons: getToolIcons("partman", readOnly("Show Partman Config")),
|
|
489
514
|
handler: async (params, _context) => {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
515
|
+
try {
|
|
516
|
+
const parsed = PartmanShowConfigSchema.parse(params);
|
|
517
|
+
const partmanSchema = await getPartmanSchema(adapter);
|
|
518
|
+
// Dynamically detect available columns to handle different pg_partman versions
|
|
519
|
+
const columnsResult = await adapter.executeQuery(`
|
|
520
|
+
SELECT column_name
|
|
521
|
+
FROM information_schema.columns
|
|
496
522
|
WHERE table_schema = $1 AND table_name = 'part_config'
|
|
497
523
|
`, [partmanSchema]);
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
const
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
524
|
+
const availableColumns = new Set((columnsResult.rows ?? []).map((r) => r["column_name"]));
|
|
525
|
+
// Build column list based on what's available
|
|
526
|
+
const baseColumns = [
|
|
527
|
+
"parent_table",
|
|
528
|
+
"control",
|
|
529
|
+
"partition_interval",
|
|
530
|
+
"partition_type",
|
|
531
|
+
"premake",
|
|
532
|
+
"automatic_maintenance",
|
|
533
|
+
"template_table",
|
|
534
|
+
"retention",
|
|
535
|
+
"retention_keep_table",
|
|
536
|
+
"epoch",
|
|
537
|
+
"default_table",
|
|
538
|
+
];
|
|
539
|
+
// Add inherit_fk only if it exists (not in all pg_partman versions)
|
|
540
|
+
const columns = baseColumns.filter((c) => availableColumns.has(c));
|
|
541
|
+
if (availableColumns.has("inherit_fk")) {
|
|
542
|
+
columns.push("inherit_fk");
|
|
543
|
+
}
|
|
544
|
+
// Get total count first for pagination
|
|
545
|
+
let countSql = `SELECT COUNT(*) as total FROM ${partmanSchema}.part_config`;
|
|
546
|
+
const countParams = [];
|
|
547
|
+
if (parsed.parentTable !== undefined) {
|
|
548
|
+
countSql += " WHERE parent_table = $1";
|
|
549
|
+
countParams.push(parsed.parentTable);
|
|
550
|
+
}
|
|
551
|
+
const countResult = await adapter.executeQuery(countSql, countParams);
|
|
552
|
+
const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
|
|
553
|
+
// Apply limit (default 50, 0 means no limit)
|
|
554
|
+
const rawLimit = parsed.limit ?? 50;
|
|
555
|
+
const limit = isNaN(rawLimit) ? 50 : rawLimit;
|
|
556
|
+
const applyLimit = limit > 0;
|
|
557
|
+
let sql = `SELECT ${columns.join(", ")} FROM ${partmanSchema}.part_config`;
|
|
558
|
+
const queryParams = [];
|
|
559
|
+
if (parsed.parentTable !== undefined) {
|
|
560
|
+
sql += " WHERE parent_table = $1";
|
|
561
|
+
queryParams.push(parsed.parentTable);
|
|
562
|
+
}
|
|
563
|
+
sql += " ORDER BY parent_table";
|
|
564
|
+
if (applyLimit) {
|
|
565
|
+
sql += ` LIMIT ${String(limit)}`;
|
|
566
|
+
}
|
|
567
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
568
|
+
const configs = result.rows ?? [];
|
|
569
|
+
// Check each config to see if parent table still exists (orphaned detection)
|
|
570
|
+
const configsWithStatus = await Promise.all(configs.map(async (config) => {
|
|
571
|
+
const parentTable = config["parent_table"];
|
|
572
|
+
const [schema, tableName] = parentTable.includes(".")
|
|
573
|
+
? [parentTable.split(".")[0], parentTable.split(".")[1]]
|
|
574
|
+
: ["public", parentTable];
|
|
575
|
+
const tableExistsResult = await adapter.executeQuery(`
|
|
576
|
+
SELECT 1 FROM information_schema.tables
|
|
550
577
|
WHERE table_schema = $1 AND table_name = $2
|
|
551
578
|
`, [schema, tableName]);
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
579
|
+
const orphaned = (tableExistsResult.rows?.length ?? 0) === 0;
|
|
580
|
+
return { ...config, orphaned };
|
|
581
|
+
}));
|
|
582
|
+
const orphanedCount = configsWithStatus.filter((c) => c.orphaned).length;
|
|
583
|
+
const truncated = applyLimit && totalCount > limit;
|
|
584
|
+
// Provide hint if a specific table was requested but not found
|
|
585
|
+
let notFoundHint;
|
|
586
|
+
if (parsed.parentTable !== undefined &&
|
|
587
|
+
configsWithStatus.length === 0) {
|
|
588
|
+
notFoundHint = `Table '${parsed.parentTable}' is not managed by pg_partman. Use pg_partman_create_parent to set up partitioning.`;
|
|
589
|
+
}
|
|
590
|
+
return {
|
|
591
|
+
configs: configsWithStatus,
|
|
592
|
+
count: configsWithStatus.length,
|
|
593
|
+
truncated,
|
|
594
|
+
totalCount,
|
|
595
|
+
orphanedCount: orphanedCount > 0 ? orphanedCount : undefined,
|
|
596
|
+
hint: notFoundHint ??
|
|
597
|
+
(orphanedCount > 0
|
|
598
|
+
? `${String(orphanedCount)} orphaned config(s) found - parent table no longer exists. ` +
|
|
599
|
+
`To clean up, use raw SQL: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`
|
|
600
|
+
: undefined),
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
return {
|
|
605
|
+
success: false,
|
|
606
|
+
error: formatPostgresError(error, { tool: "pg_partman_show_config" }),
|
|
607
|
+
};
|
|
561
608
|
}
|
|
562
|
-
return {
|
|
563
|
-
configs: configsWithStatus,
|
|
564
|
-
count: configsWithStatus.length,
|
|
565
|
-
truncated,
|
|
566
|
-
totalCount,
|
|
567
|
-
orphanedCount: orphanedCount > 0 ? orphanedCount : undefined,
|
|
568
|
-
hint: notFoundHint ??
|
|
569
|
-
(orphanedCount > 0
|
|
570
|
-
? `${String(orphanedCount)} orphaned config(s) found - parent table no longer exists. ` +
|
|
571
|
-
`To clean up, use raw SQL: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`
|
|
572
|
-
: undefined),
|
|
573
|
-
};
|
|
574
609
|
},
|
|
575
610
|
};
|
|
576
611
|
}
|