@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
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { readOnly, write } from "../../../utils/annotations.js";
|
|
7
7
|
import { getToolIcons } from "../../../utils/icons.js";
|
|
8
|
-
import {
|
|
9
|
-
import { LtreeQuerySchema, LtreeQuerySchemaBase, LtreeSubpathSchema, LtreeSubpathSchemaBase, LtreeLcaSchema, LtreeMatchSchema, LtreeMatchSchemaBase, LtreeListColumnsSchemaBase, LtreeListColumnsSchema, LtreeConvertColumnSchema, LtreeConvertColumnSchemaBase, LtreeIndexSchema, LtreeIndexSchemaBase,
|
|
8
|
+
import { formatPostgresError } from "./core/error-helpers.js";
|
|
9
|
+
import { LtreeQuerySchema, LtreeQuerySchemaBase, LtreeSubpathSchema, LtreeSubpathSchemaBase, LtreeLcaSchemaBase, LtreeLcaSchema, LtreeMatchSchema, LtreeMatchSchemaBase, LtreeListColumnsSchemaBase, LtreeListColumnsSchema, LtreeConvertColumnSchema, LtreeConvertColumnSchemaBase, LtreeIndexSchema, LtreeIndexSchemaBase,
|
|
10
10
|
// Output schemas
|
|
11
11
|
LtreeCreateExtensionOutputSchema, LtreeQueryOutputSchema, LtreeSubpathOutputSchema, LtreeLcaOutputSchema, LtreeMatchOutputSchema, LtreeListColumnsOutputSchema, LtreeConvertColumnOutputSchema, LtreeCreateIndexOutputSchema, } from "../schemas/index.js";
|
|
12
12
|
export function getLtreeTools(adapter) {
|
|
@@ -31,8 +31,18 @@ function createLtreeExtensionTool(adapter) {
|
|
|
31
31
|
annotations: write("Create Ltree Extension"),
|
|
32
32
|
icons: getToolIcons("ltree", write("Create Ltree Extension")),
|
|
33
33
|
handler: async (_params, _context) => {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
try {
|
|
35
|
+
await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS ltree");
|
|
36
|
+
return { success: true, message: "ltree extension enabled" };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: formatPostgresError(error, {
|
|
42
|
+
tool: "pg_ltree_create_extension",
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
36
46
|
},
|
|
37
47
|
};
|
|
38
48
|
}
|
|
@@ -46,42 +56,64 @@ function createLtreeQueryTool(adapter) {
|
|
|
46
56
|
annotations: readOnly("Query Ltree"),
|
|
47
57
|
icons: getToolIcons("ltree", readOnly("Query Ltree")),
|
|
48
58
|
handler: async (params, _context) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
try {
|
|
60
|
+
const { table, column, path, mode, schema, limit } = LtreeQuerySchema.parse(params);
|
|
61
|
+
const schemaName = schema ?? "public";
|
|
62
|
+
const queryMode = mode ?? "descendants";
|
|
63
|
+
const qualifiedTable = `"${schemaName}"."${table}"`;
|
|
64
|
+
const limitClause = limit !== undefined ? `LIMIT ${String(limit)}` : "";
|
|
65
|
+
// Validate column is ltree type
|
|
66
|
+
const colCheck = await adapter.executeQuery(`SELECT udt_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`, [schemaName, table, column]);
|
|
67
|
+
if (!colCheck.rows || colCheck.rows.length === 0) {
|
|
68
|
+
// Distinguish table-not-found from column-not-found
|
|
69
|
+
const tableCheck = await adapter.executeQuery(`SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`, [schemaName, table]);
|
|
70
|
+
if (!tableCheck.rows || tableCheck.rows.length === 0) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Table ${qualifiedTable} does not exist.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
60
76
|
return {
|
|
61
77
|
success: false,
|
|
62
|
-
error: `
|
|
78
|
+
error: `Column "${column}" not found in table ${qualifiedTable}.`,
|
|
63
79
|
};
|
|
64
80
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
82
|
+
if (udtName !== "ltree") {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: `Column "${column}" is not an ltree type (found: ${udtName}). Use an ltree column or convert with pg_ltree_convert_column.`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Detect if path contains lquery pattern characters
|
|
89
|
+
const isLqueryPattern = /[*?{!@|]/.test(path);
|
|
90
|
+
// Get total count when limit is applied for truncation indicators
|
|
91
|
+
let totalCount;
|
|
92
|
+
if (limit !== undefined) {
|
|
93
|
+
let countSql;
|
|
94
|
+
if (isLqueryPattern) {
|
|
95
|
+
countSql = `SELECT COUNT(*)::int as total FROM ${qualifiedTable} WHERE "${column}" ~ $1::lquery`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
let operator;
|
|
99
|
+
switch (queryMode) {
|
|
100
|
+
case "ancestors":
|
|
101
|
+
operator = "@>";
|
|
102
|
+
break;
|
|
103
|
+
case "exact":
|
|
104
|
+
operator = "=";
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
operator = "<@";
|
|
108
|
+
}
|
|
109
|
+
countSql = `SELECT COUNT(*)::int as total FROM ${qualifiedTable} WHERE "${column}" ${operator} $1::ltree`;
|
|
110
|
+
}
|
|
111
|
+
const countResult = await adapter.executeQuery(countSql, [path]);
|
|
112
|
+
totalCount = countResult.rows?.[0]?.["total"];
|
|
113
|
+
}
|
|
114
|
+
let sql;
|
|
83
115
|
if (isLqueryPattern) {
|
|
84
|
-
|
|
116
|
+
sql = `SELECT *, nlevel("${column}") as depth FROM ${qualifiedTable} WHERE "${column}" ~ $1::lquery ORDER BY "${column}" ${limitClause}`;
|
|
85
117
|
}
|
|
86
118
|
else {
|
|
87
119
|
let operator;
|
|
@@ -95,50 +127,38 @@ function createLtreeQueryTool(adapter) {
|
|
|
95
127
|
default:
|
|
96
128
|
operator = "<@";
|
|
97
129
|
}
|
|
98
|
-
|
|
130
|
+
sql = `SELECT *, nlevel("${column}") as depth FROM ${qualifiedTable} WHERE "${column}" ${operator} $1::ltree ORDER BY "${column}" ${limitClause}`;
|
|
99
131
|
}
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
switch (queryMode) {
|
|
114
|
-
// ancestors: column @> path means column contains path, i.e., column is ancestor of path
|
|
115
|
-
case "ancestors":
|
|
116
|
-
operator = "@>";
|
|
117
|
-
break;
|
|
118
|
-
case "exact":
|
|
119
|
-
operator = "=";
|
|
120
|
-
break;
|
|
121
|
-
// descendants: column <@ path means column is contained by path, i.e., column is descendant of path
|
|
122
|
-
default:
|
|
123
|
-
operator = "<@";
|
|
132
|
+
const result = await adapter.executeQuery(sql, [path]);
|
|
133
|
+
const resultCount = result.rows?.length ?? 0;
|
|
134
|
+
const response = {
|
|
135
|
+
path,
|
|
136
|
+
mode: isLqueryPattern ? "pattern" : queryMode,
|
|
137
|
+
isPattern: isLqueryPattern,
|
|
138
|
+
results: result.rows ?? [],
|
|
139
|
+
count: resultCount,
|
|
140
|
+
};
|
|
141
|
+
// Add truncation indicators when limit is applied
|
|
142
|
+
if (limit !== undefined && totalCount !== undefined) {
|
|
143
|
+
response["truncated"] = resultCount < totalCount;
|
|
144
|
+
response["totalCount"] = totalCount;
|
|
124
145
|
}
|
|
125
|
-
|
|
146
|
+
return response;
|
|
126
147
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof z.ZodError) {
|
|
150
|
+
return {
|
|
151
|
+
success: false,
|
|
152
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
error: formatPostgresError(error, {
|
|
158
|
+
tool: "pg_ltree_query",
|
|
159
|
+
}),
|
|
160
|
+
};
|
|
140
161
|
}
|
|
141
|
-
return response;
|
|
142
162
|
},
|
|
143
163
|
};
|
|
144
164
|
}
|
|
@@ -152,33 +172,49 @@ function createLtreeSubpathTool(adapter) {
|
|
|
152
172
|
annotations: readOnly("Ltree Subpath"),
|
|
153
173
|
icons: getToolIcons("ltree", readOnly("Ltree Subpath")),
|
|
154
174
|
handler: async (params, _context) => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
175
|
+
try {
|
|
176
|
+
const { path, offset, length } = LtreeSubpathSchema.parse(params);
|
|
177
|
+
// First get the path depth for validation
|
|
178
|
+
const depthResult = await adapter.executeQuery(`SELECT nlevel($1::ltree) as depth`, [path]);
|
|
179
|
+
const pathDepth = depthResult.rows?.[0]?.["depth"];
|
|
180
|
+
// Validate offset is within bounds
|
|
181
|
+
const effectiveOffset = offset < 0 ? pathDepth + offset : offset;
|
|
182
|
+
if (effectiveOffset < 0 || effectiveOffset >= pathDepth) {
|
|
183
|
+
return {
|
|
184
|
+
success: false,
|
|
185
|
+
error: `Invalid offset: ${String(offset)}. Path "${path}" has ${String(pathDepth)} labels (valid offset range: 0 to ${String(pathDepth - 1)}, or -${String(pathDepth)} to -1 for negative indexing).`,
|
|
186
|
+
originalPath: path,
|
|
187
|
+
pathDepth,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const sql = length !== undefined
|
|
191
|
+
? `SELECT subpath($1::ltree, $2, $3) as subpath, nlevel($1::ltree) as original_depth`
|
|
192
|
+
: `SELECT subpath($1::ltree, $2) as subpath, nlevel($1::ltree) as original_depth`;
|
|
193
|
+
const queryParams = length !== undefined ? [path, offset, length] : [path, offset];
|
|
194
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
195
|
+
const row = result.rows?.[0];
|
|
162
196
|
return {
|
|
163
|
-
success: false,
|
|
164
|
-
error: `Invalid offset: ${String(offset)}. Path "${path}" has ${String(pathDepth)} labels (valid offset range: 0 to ${String(pathDepth - 1)}, or -${String(pathDepth)} to -1 for negative indexing).`,
|
|
165
197
|
originalPath: path,
|
|
166
|
-
|
|
198
|
+
offset,
|
|
199
|
+
length: length ?? "to end",
|
|
200
|
+
subpath: row?.["subpath"],
|
|
201
|
+
originalDepth: row?.["original_depth"],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
if (error instanceof z.ZodError) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
success: false,
|
|
213
|
+
error: formatPostgresError(error, {
|
|
214
|
+
tool: "pg_ltree_subpath",
|
|
215
|
+
}),
|
|
167
216
|
};
|
|
168
217
|
}
|
|
169
|
-
const sql = length !== undefined
|
|
170
|
-
? `SELECT subpath($1::ltree, $2, $3) as subpath, nlevel($1::ltree) as original_depth`
|
|
171
|
-
: `SELECT subpath($1::ltree, $2) as subpath, nlevel($1::ltree) as original_depth`;
|
|
172
|
-
const queryParams = length !== undefined ? [path, offset, length] : [path, offset];
|
|
173
|
-
const result = await adapter.executeQuery(sql, queryParams);
|
|
174
|
-
const row = result.rows?.[0];
|
|
175
|
-
return {
|
|
176
|
-
originalPath: path,
|
|
177
|
-
offset,
|
|
178
|
-
length: length ?? "to end",
|
|
179
|
-
subpath: row?.["subpath"],
|
|
180
|
-
originalDepth: row?.["original_depth"],
|
|
181
|
-
};
|
|
182
218
|
},
|
|
183
219
|
};
|
|
184
220
|
}
|
|
@@ -187,23 +223,39 @@ function createLtreeLcaTool(adapter) {
|
|
|
187
223
|
name: "pg_ltree_lca",
|
|
188
224
|
description: "Find the longest common ancestor of multiple ltree paths.",
|
|
189
225
|
group: "ltree",
|
|
190
|
-
inputSchema:
|
|
226
|
+
inputSchema: LtreeLcaSchemaBase, // Base schema for MCP visibility
|
|
191
227
|
outputSchema: LtreeLcaOutputSchema,
|
|
192
228
|
annotations: readOnly("Ltree LCA"),
|
|
193
229
|
icons: getToolIcons("ltree", readOnly("Ltree LCA")),
|
|
194
230
|
handler: async (params, _context) => {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
231
|
+
try {
|
|
232
|
+
const { paths } = LtreeLcaSchema.parse(params);
|
|
233
|
+
const arrayLiteral = paths
|
|
234
|
+
.map((p) => `'${p.replace(/'/g, "''")}'::ltree`)
|
|
235
|
+
.join(", ");
|
|
236
|
+
const sql = `SELECT lca(ARRAY[${arrayLiteral}]) as lca`;
|
|
237
|
+
const result = await adapter.executeQuery(sql);
|
|
238
|
+
const lca = result.rows?.[0]?.["lca"];
|
|
239
|
+
return {
|
|
240
|
+
paths,
|
|
241
|
+
longestCommonAncestor: lca ?? "",
|
|
242
|
+
hasCommonAncestor: lca !== null && lca !== "",
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
if (error instanceof z.ZodError) {
|
|
247
|
+
return {
|
|
248
|
+
success: false,
|
|
249
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
success: false,
|
|
254
|
+
error: formatPostgresError(error, {
|
|
255
|
+
tool: "pg_ltree_lca",
|
|
256
|
+
}),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
207
259
|
},
|
|
208
260
|
};
|
|
209
261
|
}
|
|
@@ -217,33 +269,33 @@ function createLtreeMatchTool(adapter) {
|
|
|
217
269
|
annotations: readOnly("Ltree Match"),
|
|
218
270
|
icons: getToolIcons("ltree", readOnly("Ltree Match")),
|
|
219
271
|
handler: async (params, _context) => {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
272
|
+
try {
|
|
273
|
+
const { table, column, pattern, schema, limit } = LtreeMatchSchema.parse(params);
|
|
274
|
+
const schemaName = schema ?? "public";
|
|
275
|
+
const qualifiedTable = `"${schemaName}"."${table}"`;
|
|
276
|
+
const limitClause = limit !== undefined ? `LIMIT ${String(limit)}` : "";
|
|
277
|
+
// Validate table exists and column is ltree type
|
|
278
|
+
const colCheck = await adapter.executeQuery(`SELECT udt_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`, [schemaName, table, column]);
|
|
279
|
+
if (!colCheck.rows || colCheck.rows.length === 0) {
|
|
280
|
+
const tableCheck = await adapter.executeQuery(`SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`, [schemaName, table]);
|
|
281
|
+
if (!tableCheck.rows || tableCheck.rows.length === 0) {
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
error: `Table ${qualifiedTable} does not exist.`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
229
287
|
return {
|
|
230
288
|
success: false,
|
|
231
|
-
error: `
|
|
289
|
+
error: `Column "${column}" not found in table ${qualifiedTable}.`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
293
|
+
if (udtName !== "ltree") {
|
|
294
|
+
return {
|
|
295
|
+
success: false,
|
|
296
|
+
error: `Column "${column}" is not an ltree type (found: ${udtName}). Use an ltree column or convert with pg_ltree_convert_column.`,
|
|
232
297
|
};
|
|
233
298
|
}
|
|
234
|
-
return {
|
|
235
|
-
success: false,
|
|
236
|
-
error: `Column "${column}" not found in table ${qualifiedTable}.`,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
240
|
-
if (udtName !== "ltree") {
|
|
241
|
-
return {
|
|
242
|
-
success: false,
|
|
243
|
-
error: `Column "${column}" is not an ltree type (found: ${udtName}). Use an ltree column or convert with pg_ltree_convert_column.`,
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
try {
|
|
247
299
|
// Get total count when limit is applied for truncation indicators
|
|
248
300
|
let totalCount;
|
|
249
301
|
if (limit !== undefined) {
|
|
@@ -267,13 +319,17 @@ function createLtreeMatchTool(adapter) {
|
|
|
267
319
|
return response;
|
|
268
320
|
}
|
|
269
321
|
catch (error) {
|
|
322
|
+
if (error instanceof z.ZodError) {
|
|
323
|
+
return {
|
|
324
|
+
success: false,
|
|
325
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
270
328
|
return {
|
|
271
329
|
success: false,
|
|
272
|
-
error:
|
|
330
|
+
error: formatPostgresError(error, {
|
|
273
331
|
tool: "pg_ltree_match",
|
|
274
|
-
|
|
275
|
-
schema: schemaName,
|
|
276
|
-
}).message,
|
|
332
|
+
}),
|
|
277
333
|
};
|
|
278
334
|
}
|
|
279
335
|
},
|
|
@@ -289,19 +345,35 @@ function createLtreeListColumnsTool(adapter) {
|
|
|
289
345
|
annotations: readOnly("List Ltree Columns"),
|
|
290
346
|
icons: getToolIcons("ltree", readOnly("List Ltree Columns")),
|
|
291
347
|
handler: async (params, _context) => {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
348
|
+
try {
|
|
349
|
+
const { schema } = LtreeListColumnsSchema.parse(params);
|
|
350
|
+
const conditions = [
|
|
351
|
+
"udt_name = 'ltree'",
|
|
352
|
+
"table_schema NOT IN ('pg_catalog', 'information_schema')",
|
|
353
|
+
];
|
|
354
|
+
const queryParams = [];
|
|
355
|
+
if (schema !== undefined) {
|
|
356
|
+
conditions.push(`table_schema = $1`);
|
|
357
|
+
queryParams.push(schema);
|
|
358
|
+
}
|
|
359
|
+
const sql = `SELECT table_schema, table_name, column_name, is_nullable, column_default FROM information_schema.columns WHERE ${conditions.join(" AND ")} ORDER BY table_schema, table_name, ordinal_position`;
|
|
360
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
361
|
+
return { columns: result.rows ?? [], count: result.rows?.length ?? 0 };
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
if (error instanceof z.ZodError) {
|
|
365
|
+
return {
|
|
366
|
+
success: false,
|
|
367
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
success: false,
|
|
372
|
+
error: formatPostgresError(error, {
|
|
373
|
+
tool: "pg_ltree_list_columns",
|
|
374
|
+
}),
|
|
375
|
+
};
|
|
301
376
|
}
|
|
302
|
-
const sql = `SELECT table_schema, table_name, column_name, is_nullable, column_default FROM information_schema.columns WHERE ${conditions.join(" AND ")} ORDER BY table_schema, table_name, ordinal_position`;
|
|
303
|
-
const result = await adapter.executeQuery(sql, queryParams);
|
|
304
|
-
return { columns: result.rows ?? [], count: result.rows?.length ?? 0 };
|
|
305
377
|
},
|
|
306
378
|
};
|
|
307
379
|
}
|
|
@@ -315,88 +387,88 @@ function createLtreeConvertColumnTool(adapter) {
|
|
|
315
387
|
annotations: write("Convert to Ltree"),
|
|
316
388
|
icons: getToolIcons("ltree", write("Convert to Ltree")),
|
|
317
389
|
handler: async (params, _context) => {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
SELECT
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
success: false,
|
|
331
|
-
error: "ltree extension is not installed. Run pg_ltree_create_extension first.",
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
const colCheck = await adapter.executeQuery(`SELECT data_type, udt_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`, [schemaName, table, column]);
|
|
335
|
-
if (!colCheck.rows || colCheck.rows.length === 0) {
|
|
336
|
-
// Distinguish table-not-found from column-not-found
|
|
337
|
-
const tableCheck = await adapter.executeQuery(`SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`, [schemaName, table]);
|
|
338
|
-
if (!tableCheck.rows || tableCheck.rows.length === 0) {
|
|
390
|
+
try {
|
|
391
|
+
const { table, column, schema } = LtreeConvertColumnSchema.parse(params);
|
|
392
|
+
const schemaName = schema ?? "public";
|
|
393
|
+
const qualifiedTable = `"${schemaName}"."${table}"`;
|
|
394
|
+
// Check if ltree extension is installed
|
|
395
|
+
const extCheck = await adapter.executeQuery(`
|
|
396
|
+
SELECT EXISTS(
|
|
397
|
+
SELECT 1 FROM pg_extension WHERE extname = 'ltree'
|
|
398
|
+
) as installed
|
|
399
|
+
`);
|
|
400
|
+
const hasExt = extCheck.rows?.[0]?.["installed"] ?? false;
|
|
401
|
+
if (!hasExt) {
|
|
339
402
|
return {
|
|
340
403
|
success: false,
|
|
341
|
-
error:
|
|
404
|
+
error: "ltree extension is not installed. Run pg_ltree_create_extension first.",
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
const colCheck = await adapter.executeQuery(`SELECT data_type, udt_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`, [schemaName, table, column]);
|
|
408
|
+
if (!colCheck.rows || colCheck.rows.length === 0) {
|
|
409
|
+
// Distinguish table-not-found from column-not-found
|
|
410
|
+
const tableCheck = await adapter.executeQuery(`SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`, [schemaName, table]);
|
|
411
|
+
if (!tableCheck.rows || tableCheck.rows.length === 0) {
|
|
412
|
+
return {
|
|
413
|
+
success: false,
|
|
414
|
+
error: `Table ${qualifiedTable} does not exist. Verify the table name.`,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return {
|
|
418
|
+
success: false,
|
|
419
|
+
error: `Column "${column}" not found in table ${qualifiedTable}. Verify the column name.`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
const dataType = colCheck.rows[0]?.["data_type"];
|
|
423
|
+
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
424
|
+
const currentType = dataType === "USER-DEFINED" ? udtName : dataType;
|
|
425
|
+
if (udtName === "ltree") {
|
|
426
|
+
return {
|
|
427
|
+
success: true,
|
|
428
|
+
message: `Column ${column} is already ltree`,
|
|
429
|
+
table: qualifiedTable,
|
|
430
|
+
previousType: "ltree",
|
|
431
|
+
wasAlreadyLtree: true,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
// Validate source column is text-based (like citext tool does)
|
|
435
|
+
const allowedTypes = ["text", "varchar", "character varying", "bpchar"];
|
|
436
|
+
const normalizedType = dataType.toLowerCase();
|
|
437
|
+
if (!allowedTypes.includes(normalizedType)) {
|
|
438
|
+
return {
|
|
439
|
+
success: false,
|
|
440
|
+
error: `Cannot convert column "${column}" of type "${currentType}" to ltree. Only text-based columns can be converted.`,
|
|
441
|
+
currentType,
|
|
442
|
+
allowedTypes: ["text", "varchar", "character varying"],
|
|
443
|
+
suggestion: "Create a new TEXT column with ltree-formatted paths, then convert that column.",
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
// Check for dependent views before attempting the conversion
|
|
447
|
+
const depCheck = await adapter.executeQuery(`
|
|
448
|
+
SELECT DISTINCT
|
|
449
|
+
c.relname as dependent_view,
|
|
450
|
+
n.nspname as view_schema
|
|
451
|
+
FROM pg_depend d
|
|
452
|
+
JOIN pg_rewrite r ON d.objid = r.oid
|
|
453
|
+
JOIN pg_class c ON r.ev_class = c.oid
|
|
454
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
455
|
+
JOIN pg_class t ON d.refobjid = t.oid
|
|
456
|
+
JOIN pg_namespace tn ON t.relnamespace = tn.oid
|
|
457
|
+
JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum
|
|
458
|
+
WHERE c.relkind = 'v'
|
|
459
|
+
AND tn.nspname = $1
|
|
460
|
+
AND t.relname = $2
|
|
461
|
+
AND a.attname = $3
|
|
462
|
+
`, [schemaName, table, column]);
|
|
463
|
+
const dependentViews = depCheck.rows ?? [];
|
|
464
|
+
if (dependentViews.length > 0) {
|
|
465
|
+
return {
|
|
466
|
+
success: false,
|
|
467
|
+
error: "Column has dependent views that must be dropped before conversion",
|
|
468
|
+
dependentViews: dependentViews.map((v) => `${v["view_schema"]}.${v["dependent_view"]}`),
|
|
469
|
+
hint: "Drop the listed views, run this conversion, then recreate the views. PostgreSQL cannot ALTER COLUMN TYPE when views depend on it.",
|
|
342
470
|
};
|
|
343
471
|
}
|
|
344
|
-
return {
|
|
345
|
-
success: false,
|
|
346
|
-
error: `Column "${column}" not found in table ${qualifiedTable}. Verify the column name.`,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
const dataType = colCheck.rows[0]?.["data_type"];
|
|
350
|
-
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
351
|
-
const currentType = dataType === "USER-DEFINED" ? udtName : dataType;
|
|
352
|
-
if (udtName === "ltree") {
|
|
353
|
-
return {
|
|
354
|
-
success: true,
|
|
355
|
-
message: `Column ${column} is already ltree`,
|
|
356
|
-
table: qualifiedTable,
|
|
357
|
-
previousType: "ltree",
|
|
358
|
-
wasAlreadyLtree: true,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
// Validate source column is text-based (like citext tool does)
|
|
362
|
-
const allowedTypes = ["text", "varchar", "character varying", "bpchar"];
|
|
363
|
-
const normalizedType = dataType.toLowerCase();
|
|
364
|
-
if (!allowedTypes.includes(normalizedType)) {
|
|
365
|
-
return {
|
|
366
|
-
success: false,
|
|
367
|
-
error: `Cannot convert column "${column}" of type "${currentType}" to ltree. Only text-based columns can be converted.`,
|
|
368
|
-
currentType,
|
|
369
|
-
allowedTypes: ["text", "varchar", "character varying"],
|
|
370
|
-
suggestion: "Create a new TEXT column with ltree-formatted paths, then convert that column.",
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
// Check for dependent views before attempting the conversion
|
|
374
|
-
const depCheck = await adapter.executeQuery(`
|
|
375
|
-
SELECT DISTINCT
|
|
376
|
-
c.relname as dependent_view,
|
|
377
|
-
n.nspname as view_schema
|
|
378
|
-
FROM pg_depend d
|
|
379
|
-
JOIN pg_rewrite r ON d.objid = r.oid
|
|
380
|
-
JOIN pg_class c ON r.ev_class = c.oid
|
|
381
|
-
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
382
|
-
JOIN pg_class t ON d.refobjid = t.oid
|
|
383
|
-
JOIN pg_namespace tn ON t.relnamespace = tn.oid
|
|
384
|
-
JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum
|
|
385
|
-
WHERE c.relkind = 'v'
|
|
386
|
-
AND tn.nspname = $1
|
|
387
|
-
AND t.relname = $2
|
|
388
|
-
AND a.attname = $3
|
|
389
|
-
`, [schemaName, table, column]);
|
|
390
|
-
const dependentViews = depCheck.rows ?? [];
|
|
391
|
-
if (dependentViews.length > 0) {
|
|
392
|
-
return {
|
|
393
|
-
success: false,
|
|
394
|
-
error: "Column has dependent views that must be dropped before conversion",
|
|
395
|
-
dependentViews: dependentViews.map((v) => `${v["view_schema"]}.${v["dependent_view"]}`),
|
|
396
|
-
hint: "Drop the listed views, run this conversion, then recreate the views. PostgreSQL cannot ALTER COLUMN TYPE when views depend on it.",
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
try {
|
|
400
472
|
await adapter.executeQuery(`ALTER TABLE ${qualifiedTable} ALTER COLUMN "${column}" TYPE ltree USING "${column}"::ltree`);
|
|
401
473
|
return {
|
|
402
474
|
success: true,
|
|
@@ -406,11 +478,17 @@ function createLtreeConvertColumnTool(adapter) {
|
|
|
406
478
|
};
|
|
407
479
|
}
|
|
408
480
|
catch (error) {
|
|
409
|
-
|
|
481
|
+
if (error instanceof z.ZodError) {
|
|
482
|
+
return {
|
|
483
|
+
success: false,
|
|
484
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
485
|
+
};
|
|
486
|
+
}
|
|
410
487
|
return {
|
|
411
488
|
success: false,
|
|
412
|
-
error:
|
|
413
|
-
|
|
489
|
+
error: formatPostgresError(error, {
|
|
490
|
+
tool: "pg_ltree_convert_column",
|
|
491
|
+
}),
|
|
414
492
|
};
|
|
415
493
|
}
|
|
416
494
|
},
|
|
@@ -426,33 +504,34 @@ function createLtreeCreateIndexTool(adapter) {
|
|
|
426
504
|
annotations: write("Create Ltree Index"),
|
|
427
505
|
icons: getToolIcons("ltree", write("Create Ltree Index")),
|
|
428
506
|
handler: async (params, _context) => {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
507
|
+
try {
|
|
508
|
+
const { table, column, indexName, schema } = LtreeIndexSchema.parse(params);
|
|
509
|
+
const schemaName = schema ?? "public";
|
|
510
|
+
const qualifiedTable = `"${schemaName}"."${table}"`;
|
|
511
|
+
const idxName = indexName ?? `idx_${table}_${column}_ltree`;
|
|
512
|
+
// Validate table exists and column is ltree type
|
|
513
|
+
const colCheck = await adapter.executeQuery(`SELECT udt_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`, [schemaName, table, column]);
|
|
514
|
+
if (!colCheck.rows || colCheck.rows.length === 0) {
|
|
515
|
+
const tableCheck = await adapter.executeQuery(`SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`, [schemaName, table]);
|
|
516
|
+
if (!tableCheck.rows || tableCheck.rows.length === 0) {
|
|
517
|
+
return {
|
|
518
|
+
success: false,
|
|
519
|
+
error: `Table ${qualifiedTable} does not exist.`,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
438
522
|
return {
|
|
439
523
|
success: false,
|
|
440
|
-
error: `
|
|
524
|
+
error: `Column "${column}" not found in table ${qualifiedTable}.`,
|
|
441
525
|
};
|
|
442
526
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
success: false,
|
|
452
|
-
error: `Column "${column}" is not an ltree type (found: ${udtName}). Use an ltree column or convert with pg_ltree_convert_column.`,
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
try {
|
|
527
|
+
const udtName = colCheck.rows[0]?.["udt_name"];
|
|
528
|
+
if (udtName !== "ltree") {
|
|
529
|
+
return {
|
|
530
|
+
success: false,
|
|
531
|
+
error: `Column "${column}" is not an ltree type (found: ${udtName}). Use an ltree column or convert with pg_ltree_convert_column.`,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
// Check for existing index by name
|
|
456
535
|
const idxCheck = await adapter.executeQuery(`SELECT EXISTS(SELECT 1 FROM pg_indexes WHERE schemaname = $1 AND indexname = $2) as exists`, [schemaName, idxName]);
|
|
457
536
|
if (idxCheck.rows?.[0]?.["exists"])
|
|
458
537
|
return {
|
|
@@ -464,6 +543,23 @@ function createLtreeCreateIndexTool(adapter) {
|
|
|
464
543
|
indexType: "gist",
|
|
465
544
|
alreadyExists: true,
|
|
466
545
|
};
|
|
546
|
+
// Check for existing GiST index on same table+column (semantic duplicate)
|
|
547
|
+
const semanticCheck = await adapter.executeQuery(`SELECT indexname FROM pg_indexes
|
|
548
|
+
WHERE schemaname = $1 AND tablename = $2
|
|
549
|
+
AND indexdef ILIKE '%using gist%'
|
|
550
|
+
AND (indexdef ILIKE $3 OR indexdef ILIKE $4)`, [schemaName, table, `%(${column})%`, `%("${column}")%`]);
|
|
551
|
+
if (semanticCheck.rows && semanticCheck.rows.length > 0) {
|
|
552
|
+
const existingName = semanticCheck.rows[0]?.["indexname"];
|
|
553
|
+
return {
|
|
554
|
+
success: true,
|
|
555
|
+
message: `GiST index already exists on column "${column}" as "${existingName}"`,
|
|
556
|
+
indexName: existingName,
|
|
557
|
+
table: qualifiedTable,
|
|
558
|
+
column,
|
|
559
|
+
indexType: "gist",
|
|
560
|
+
alreadyExists: true,
|
|
561
|
+
};
|
|
562
|
+
}
|
|
467
563
|
await adapter.executeQuery(`CREATE INDEX "${idxName}" ON ${qualifiedTable} USING GIST ("${column}")`);
|
|
468
564
|
return {
|
|
469
565
|
success: true,
|
|
@@ -475,14 +571,17 @@ function createLtreeCreateIndexTool(adapter) {
|
|
|
475
571
|
};
|
|
476
572
|
}
|
|
477
573
|
catch (error) {
|
|
574
|
+
if (error instanceof z.ZodError) {
|
|
575
|
+
return {
|
|
576
|
+
success: false,
|
|
577
|
+
error: error.issues.map((i) => i.message).join("; "),
|
|
578
|
+
};
|
|
579
|
+
}
|
|
478
580
|
return {
|
|
479
581
|
success: false,
|
|
480
|
-
error:
|
|
582
|
+
error: formatPostgresError(error, {
|
|
481
583
|
tool: "pg_ltree_create_index",
|
|
482
|
-
|
|
483
|
-
schema: schemaName,
|
|
484
|
-
index: idxName,
|
|
485
|
-
}).message,
|
|
584
|
+
}),
|
|
486
585
|
};
|
|
487
586
|
}
|
|
488
587
|
},
|