@neverinfamous/postgres-mcp 2.0.0 → 2.2.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 +119 -46
- package/dist/__tests__/benchmarks/codemode.bench.js +3 -3
- package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/connection-pool.bench.js +3 -3
- package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts +11 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.js +143 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.js +0 -64
- package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/schema-parsing.bench.js +5 -5
- package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/tool-filtering.bench.js +17 -8
- package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -1
- 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 -5
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +11 -20
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -26
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.js +31 -526
- 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 +2 -2
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.js +1 -3
- 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} +16 -171
- 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 +6 -6
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/index.js +8 -8
- package/dist/adapters/postgresql/schemas/index.js.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.d.ts +19 -42
- package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.js +72 -27
- package/dist/adapters/postgresql/schemas/introspection.js.map +1 -1
- 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 +4 -4
- package/dist/adapters/postgresql/schemas/monitoring.js +2 -2
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +14 -14
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.js +64 -46
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.d.ts +16 -14
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.js +9 -9
- package/dist/adapters/postgresql/schemas/partman.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/advanced.js +495 -0
- 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.js → postgis/basic.js} +1 -486
- 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 +35 -25
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +57 -19
- 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 +18 -18
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/text-search.js +12 -27
- 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 +9 -15
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.js +95 -76
- 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} +50 -232
- 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.js +1 -1
- 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 +100 -210
- 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 +151 -127
- 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 +90 -43
- 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 +605 -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 +621 -0
- package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts +21 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.js +31 -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 +575 -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/{basic.js → read.js} +41 -482
- 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} +26 -357
- 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.js +346 -260
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
- package/dist/adapters/postgresql/tools/migration/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/migration/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/migration/index.js +23 -0
- package/dist/adapters/postgresql/tools/migration/index.js.map +1 -0
- 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} +24 -359
- 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 +438 -383
- 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 +171 -652
- 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 +69 -42
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts +18 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.js +533 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts +11 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.js +332 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts +1 -1
- package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/index.js +7 -1
- package/dist/adapters/postgresql/tools/performance/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.js +80 -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 +439 -318
- 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 +45 -77
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.js +121 -93
- 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} +64 -386
- 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 +1 -218
- package/dist/adapters/postgresql/tools/stats/advanced.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/scopes.d.ts.map +1 -1
- package/dist/auth/scopes.js +3 -1
- 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 +16 -4
- 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 +195 -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 +529 -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 -1
- package/dist/codemode/index.d.ts.map +1 -1
- package/dist/codemode/index.js +1 -1
- package/dist/codemode/index.js.map +1 -1
- package/dist/codemode/sandbox.d.ts.map +1 -1
- package/dist/codemode/sandbox.js +8 -25
- package/dist/codemode/sandbox.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +11 -11
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +28 -15
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/filtering/ToolFilter.d.ts +0 -32
- package/dist/filtering/ToolFilter.d.ts.map +1 -1
- package/dist/filtering/ToolFilter.js +0 -43
- package/dist/filtering/ToolFilter.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 +55 -10
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +301 -50
- package/dist/transports/http.js.map +1 -1
- package/dist/types/filtering.d.ts +1 -1
- package/dist/types/filtering.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/mcp.d.ts +0 -21
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/schema.d.ts +0 -79
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/utils/fts-config.d.ts +0 -6
- package/dist/utils/fts-config.d.ts.map +1 -1
- package/dist/utils/fts-config.js +1 -1
- package/dist/utils/fts-config.js.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/identifiers.d.ts.map +1 -1
- package/dist/utils/identifiers.js +6 -6
- package/dist/utils/identifiers.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 +3 -14
- package/dist/utils/progress-utils.d.ts.map +1 -1
- package/dist/utils/progress-utils.js +2 -21
- 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 +16 -0
- package/dist/utils/where-clause.js.map +1 -1
- package/package.json +6 -4
- 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 -852
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/extensions.js +0 -1202
- package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -541
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.js +0 -814
- 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/introspection.d.ts +0 -15
- package/dist/adapters/postgresql/tools/introspection.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/introspection.js +0 -1682
- package/dist/adapters/postgresql/tools/introspection.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.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 -1082
- 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 -1544
- package/dist/codemode/api.js.map +0 -1
- package/dist/utils/promptGenerator.d.ts +0 -20
- package/dist/utils/promptGenerator.d.ts.map +0 -1
- package/dist/utils/promptGenerator.js +0 -81
- package/dist/utils/promptGenerator.js.map +0 -1
|
@@ -6,6 +6,7 @@
|
|
|
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 { formatPostgresError } from "../core/error-helpers.js";
|
|
9
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";
|
|
@@ -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
|
}
|
|
@@ -66,171 +77,184 @@ A startPartition far in the past (e.g., '2024-01-01' with daily intervals) creat
|
|
|
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
|
-
// Check for deprecated interval keywords and return structured error
|
|
87
|
-
const deprecatedReplacement = DEPRECATED_INTERVALS[interval.toLowerCase()];
|
|
88
|
-
if (deprecatedReplacement) {
|
|
89
|
-
return {
|
|
90
|
-
success: false,
|
|
91
|
-
error: `Deprecated interval '${interval}'. Use PostgreSQL interval syntax instead: '${deprecatedReplacement}'.`,
|
|
92
|
-
hint: "Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. Do NOT use keywords like 'daily' or 'monthly'.",
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
// At this point, all required params are guaranteed to be defined
|
|
96
|
-
const validatedParentTable = parentTable;
|
|
97
|
-
const validatedControlColumn = controlColumn;
|
|
98
|
-
const validatedInterval = interval;
|
|
99
|
-
// Note: pg_partman defaults to 'range' type, which is correct for most uses
|
|
100
|
-
const args = [
|
|
101
|
-
`p_parent_table := '${validatedParentTable}'`,
|
|
102
|
-
`p_control := '${validatedControlColumn}'`,
|
|
103
|
-
`p_interval := '${validatedInterval}'`,
|
|
104
|
-
];
|
|
105
|
-
if (premake !== undefined) {
|
|
106
|
-
args.push(`p_premake := ${String(premake)}`);
|
|
107
|
-
}
|
|
108
|
-
if (startPartition !== undefined) {
|
|
109
|
-
// pg_partman 5.x doesn't interpret 'now' as a timestamp literal.
|
|
110
|
-
// Resolve 'now' to NOW()::text so pg_partman receives an actual timestamp string.
|
|
111
|
-
if (startPartition.toLowerCase() === "now") {
|
|
112
|
-
args.push(`p_start_partition := NOW()::text`);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
args.push(`p_start_partition := '${startPartition}'`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (templateTable !== undefined) {
|
|
119
|
-
args.push(`p_template_table := '${templateTable}'`);
|
|
120
|
-
}
|
|
121
|
-
if (epochType !== undefined) {
|
|
122
|
-
args.push(`p_epoch := '${epochType}'`);
|
|
123
|
-
}
|
|
124
|
-
if (defaultPartition !== undefined) {
|
|
125
|
-
args.push(`p_default_table := ${String(defaultPartition)}`);
|
|
126
|
-
}
|
|
127
|
-
const partmanSchema = await getPartmanSchema(adapter);
|
|
128
|
-
const sql = `SELECT ${partmanSchema}.create_parent(${args.join(", ")})`;
|
|
129
80
|
try {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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");
|
|
137
91
|
return {
|
|
138
92
|
success: false,
|
|
139
|
-
error: `
|
|
140
|
-
hint:
|
|
141
|
-
|
|
142
|
-
`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" },
|
|
143
96
|
};
|
|
144
97
|
}
|
|
145
|
-
|
|
146
|
-
|
|
98
|
+
// Check for deprecated interval keywords and return structured error
|
|
99
|
+
const deprecatedReplacement = DEPRECATED_INTERVALS[interval.toLowerCase()];
|
|
100
|
+
if (deprecatedReplacement) {
|
|
147
101
|
return {
|
|
148
102
|
success: false,
|
|
149
|
-
error: `
|
|
150
|
-
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'.",
|
|
151
105
|
};
|
|
152
106
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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)}`);
|
|
159
121
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
+
}
|
|
167
131
|
}
|
|
168
|
-
if (
|
|
169
|
-
|
|
170
|
-
return {
|
|
171
|
-
success: false,
|
|
172
|
-
error: `Control column '${validatedControlColumn}' must have a NOT NULL constraint.`,
|
|
173
|
-
hint: "Add NOT NULL constraint to the control column. Example: ALTER TABLE events ALTER COLUMN ts SET NOT NULL;",
|
|
174
|
-
};
|
|
132
|
+
if (templateTable !== undefined) {
|
|
133
|
+
args.push(`p_template_table := '${templateTable}'`);
|
|
175
134
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
errorMsg.includes("must have created the given parent table")) {
|
|
179
|
-
return {
|
|
180
|
-
success: false,
|
|
181
|
-
error: `Table '${validatedParentTable}' must be created as RANGE or LIST partitioned before calling createParent.`,
|
|
182
|
-
hint: "Create the table with PARTITION BY RANGE or PARTITION BY LIST clause first. " +
|
|
183
|
-
"Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
|
|
184
|
-
};
|
|
135
|
+
if (epochType !== undefined) {
|
|
136
|
+
args.push(`p_epoch := '${epochType}'`);
|
|
185
137
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
return {
|
|
189
|
-
success: false,
|
|
190
|
-
error: `Invalid interval format: '${validatedInterval}'.`,
|
|
191
|
-
hint: "Use PostgreSQL interval syntax. Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. " +
|
|
192
|
-
"Do NOT use keywords like 'daily' or 'monthly'.",
|
|
193
|
-
examples: [
|
|
194
|
-
"1 day",
|
|
195
|
-
"1 week",
|
|
196
|
-
"2 weeks",
|
|
197
|
-
"1 month",
|
|
198
|
-
"3 months",
|
|
199
|
-
"1 year",
|
|
200
|
-
],
|
|
201
|
-
};
|
|
138
|
+
if (defaultPartition !== undefined) {
|
|
139
|
+
args.push(`p_default_table := ${String(defaultPartition)}`);
|
|
202
140
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
+
};
|
|
213
249
|
}
|
|
214
|
-
catch {
|
|
215
|
-
|
|
250
|
+
catch (error) {
|
|
251
|
+
return {
|
|
252
|
+
success: false,
|
|
253
|
+
error: formatPostgresError(error, {
|
|
254
|
+
tool: "pg_partman_create_parent",
|
|
255
|
+
}),
|
|
256
|
+
};
|
|
216
257
|
}
|
|
217
|
-
return {
|
|
218
|
-
success: true,
|
|
219
|
-
parentTable: validatedParentTable,
|
|
220
|
-
controlColumn: validatedControlColumn,
|
|
221
|
-
interval: validatedInterval,
|
|
222
|
-
premake: premake ?? 4,
|
|
223
|
-
maintenanceRan,
|
|
224
|
-
// Suppress raw maintenanceError - the message/hint explains the situation clearly
|
|
225
|
-
message: maintenanceRan
|
|
226
|
-
? `Partition set created for ${validatedParentTable} on column ${validatedControlColumn}. Initial partitions created.`
|
|
227
|
-
: `Partition set registered for ${validatedParentTable} on column ${validatedControlColumn}. ` +
|
|
228
|
-
`No child partitions created yet - pg_partman needs data or a startPartition that matches the control column type.`,
|
|
229
|
-
hint: !maintenanceRan
|
|
230
|
-
? 'For DATE columns, use a date like "2024-01-01". For TIMESTAMP columns, "now" works. ' +
|
|
231
|
-
"Otherwise, insert data first and run pg_partman_run_maintenance."
|
|
232
|
-
: undefined,
|
|
233
|
-
};
|
|
234
258
|
},
|
|
235
259
|
};
|
|
236
260
|
}
|
|
@@ -249,134 +273,144 @@ Maintains all partition sets if no specific parent table is specified.`,
|
|
|
249
273
|
annotations: write("Run Partition Maintenance"),
|
|
250
274
|
icons: getToolIcons("partman", write("Run Partition Maintenance")),
|
|
251
275
|
handler: async (params, _context) => {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
success: false,
|
|
261
|
-
parentTable,
|
|
262
|
-
error: `Table '${parentTable}' is not managed by pg_partman.`,
|
|
263
|
-
hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
const args = [`p_parent_table := '${parentTable}'`];
|
|
267
|
-
if (analyze !== undefined) {
|
|
268
|
-
args.push(`p_analyze := ${String(analyze)}`);
|
|
269
|
-
}
|
|
270
|
-
try {
|
|
271
|
-
const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
|
|
272
|
-
await adapter.executeQuery(sql);
|
|
273
|
-
return {
|
|
274
|
-
success: true,
|
|
275
|
-
parentTable,
|
|
276
|
-
analyze: analyze ?? true,
|
|
277
|
-
message: `Maintenance completed for ${parentTable}`,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
catch (e) {
|
|
281
|
-
// Extract clean error message (first line only, remove PL/pgSQL context)
|
|
282
|
-
let errorMsg = e instanceof Error ? e.message : String(e);
|
|
283
|
-
const fullError = errorMsg;
|
|
284
|
-
errorMsg = errorMsg.split("\n")[0] ?? errorMsg;
|
|
285
|
-
errorMsg = errorMsg.replace(/\s+CONTEXT:.*$/i, "").trim();
|
|
286
|
-
// Catch pg_partman internal errors about NULL child tables
|
|
287
|
-
if (fullError.includes("Child table given does not exist") ||
|
|
288
|
-
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) {
|
|
289
284
|
return {
|
|
290
285
|
success: false,
|
|
291
286
|
parentTable,
|
|
292
|
-
error:
|
|
293
|
-
hint: "
|
|
294
|
-
|
|
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.",
|
|
295
329
|
};
|
|
296
330
|
}
|
|
297
|
-
// Return clean error response instead of throwing with stack trace
|
|
298
|
-
return {
|
|
299
|
-
success: false,
|
|
300
|
-
parentTable,
|
|
301
|
-
error: errorMsg,
|
|
302
|
-
hint: "Check that the parent table exists, is properly partitioned, and has valid pg_partman configuration. " +
|
|
303
|
-
"Use pg_partman_show_config to verify configuration.",
|
|
304
|
-
};
|
|
305
331
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const configsResult = await adapter.executeQuery(`
|
|
332
|
+
// For all partition sets, iterate ourselves to handle orphaned configs gracefully
|
|
333
|
+
const configsResult = await adapter.executeQuery(`
|
|
309
334
|
SELECT parent_table FROM ${partmanSchema}.part_config
|
|
310
335
|
`);
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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(`
|
|
322
347
|
SELECT 1 FROM information_schema.tables
|
|
323
348
|
WHERE table_schema = $1 AND table_name = $2
|
|
324
349
|
`, [schema, tableName]);
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
}
|
|
329
|
-
// Run maintenance for this table
|
|
330
|
-
try {
|
|
331
|
-
const args = [`p_parent_table := '${table}'`];
|
|
332
|
-
if (analyze !== undefined) {
|
|
333
|
-
args.push(`p_analyze := ${String(analyze)}`);
|
|
350
|
+
if ((tableExistsResult.rows?.length ?? 0) === 0) {
|
|
351
|
+
orphanedTables.push(table);
|
|
352
|
+
continue;
|
|
334
353
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
+
});
|
|
349
379
|
}
|
|
350
|
-
errors.push({
|
|
351
|
-
table,
|
|
352
|
-
reason,
|
|
353
|
-
});
|
|
354
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
|
+
};
|
|
355
413
|
}
|
|
356
|
-
// Determine success status
|
|
357
|
-
const skippedCount = orphanedTables.length + errors.length;
|
|
358
|
-
const allFailed = maintained.length === 0 && skippedCount > 0;
|
|
359
|
-
const partial = maintained.length > 0 && skippedCount > 0;
|
|
360
|
-
return {
|
|
361
|
-
success: !allFailed,
|
|
362
|
-
partial: partial ? true : undefined,
|
|
363
|
-
parentTable: "all",
|
|
364
|
-
analyze: analyze ?? true,
|
|
365
|
-
maintained,
|
|
366
|
-
orphaned: orphanedTables.length > 0
|
|
367
|
-
? {
|
|
368
|
-
count: orphanedTables.length,
|
|
369
|
-
tables: orphanedTables,
|
|
370
|
-
hint: `Remove orphaned configs: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`,
|
|
371
|
-
}
|
|
372
|
-
: undefined,
|
|
373
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
374
|
-
message: allFailed
|
|
375
|
-
? `Maintenance failed for all ${String(skippedCount)} partition sets due to errors.`
|
|
376
|
-
: skippedCount > 0
|
|
377
|
-
? `Maintenance completed for ${String(maintained.length)} partition sets. ${String(skippedCount)} skipped (${String(orphanedTables.length)} orphaned, ${String(errors.length)} errors).`
|
|
378
|
-
: `Maintenance completed for all ${String(maintained.length)} partition sets`,
|
|
379
|
-
};
|
|
380
414
|
},
|
|
381
415
|
};
|
|
382
416
|
}
|
|
@@ -395,62 +429,73 @@ export function createPartmanShowPartitionsTool(adapter) {
|
|
|
395
429
|
annotations: readOnly("Show Partman Partitions"),
|
|
396
430
|
icons: getToolIcons("partman", readOnly("Show Partman Partitions")),
|
|
397
431
|
handler: async (params, _context) => {
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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 = `
|
|
423
459
|
SELECT COUNT(*) as total FROM ${partmanSchema}.show_partitions(
|
|
424
460
|
p_parent_table := '${parentTable}',
|
|
425
461
|
p_include_default := ${String(includeDefaultVal)},
|
|
426
462
|
p_order := '${orderDir}'
|
|
427
463
|
)
|
|
428
464
|
`;
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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 = `
|
|
434
470
|
SELECT * FROM ${partmanSchema}.show_partitions(
|
|
435
471
|
p_parent_table := '${parentTable}',
|
|
436
472
|
p_include_default := ${String(includeDefaultVal)},
|
|
437
473
|
p_order := '${orderDir}'
|
|
438
474
|
)
|
|
439
475
|
`;
|
|
440
|
-
|
|
441
|
-
|
|
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
|
+
};
|
|
442
498
|
}
|
|
443
|
-
const result = await adapter.executeQuery(sql);
|
|
444
|
-
const partitions = result.rows ?? [];
|
|
445
|
-
const truncated = applyLimit && totalCount > limit;
|
|
446
|
-
return {
|
|
447
|
-
success: true,
|
|
448
|
-
parentTable,
|
|
449
|
-
partitions,
|
|
450
|
-
count: partitions.length,
|
|
451
|
-
truncated,
|
|
452
|
-
totalCount,
|
|
453
|
-
};
|
|
454
499
|
},
|
|
455
500
|
};
|
|
456
501
|
}
|
|
@@ -467,90 +512,100 @@ export function createPartmanShowConfigTool(adapter) {
|
|
|
467
512
|
annotations: readOnly("Show Partman Config"),
|
|
468
513
|
icons: getToolIcons("partman", readOnly("Show Partman Config")),
|
|
469
514
|
handler: async (params, _context) => {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
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(`
|
|
474
520
|
SELECT column_name
|
|
475
521
|
FROM information_schema.columns
|
|
476
522
|
WHERE table_schema = $1 AND table_name = 'part_config'
|
|
477
523
|
`, [partmanSchema]);
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
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
|
-
const
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
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(`
|
|
529
576
|
SELECT 1 FROM information_schema.tables
|
|
530
577
|
WHERE table_schema = $1 AND table_name = $2
|
|
531
578
|
`, [schema, tableName]);
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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
|
+
};
|
|
541
608
|
}
|
|
542
|
-
return {
|
|
543
|
-
configs: configsWithStatus,
|
|
544
|
-
count: configsWithStatus.length,
|
|
545
|
-
truncated,
|
|
546
|
-
totalCount,
|
|
547
|
-
orphanedCount: orphanedCount > 0 ? orphanedCount : undefined,
|
|
548
|
-
hint: notFoundHint ??
|
|
549
|
-
(orphanedCount > 0
|
|
550
|
-
? `${String(orphanedCount)} orphaned config(s) found - parent table no longer exists. ` +
|
|
551
|
-
`To clean up, use raw SQL: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`
|
|
552
|
-
: undefined),
|
|
553
|
-
};
|
|
554
609
|
},
|
|
555
610
|
};
|
|
556
611
|
}
|