@neverinfamous/postgres-mcp 2.0.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 +76 -9
- package/dist/__tests__/benchmarks/schema-parsing.bench.js +1 -1
- package/dist/__tests__/benchmarks/schema-parsing.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 -1
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +11 -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 +28 -520
- 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} +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 +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 +14 -14
- package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.js +6 -3
- 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 +12 -16
- 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 +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/{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/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/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.js +1 -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 +10 -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} +4 -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 -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/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 +43 -10
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +282 -49
- package/dist/transports/http.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 +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
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Introspection Tools - Schema Analysis
|
|
3
|
+
*
|
|
4
|
+
* Schema snapshot, constraint analysis, and migration risk assessment tools.
|
|
5
|
+
* 3 tools total.
|
|
6
|
+
*/
|
|
7
|
+
import { readOnly } from "../../../../utils/annotations.js";
|
|
8
|
+
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
+
import { formatPostgresError } from "../core/error-helpers.js";
|
|
10
|
+
import { parseArrayColumn, qualifiedName } from "./graph.js";
|
|
11
|
+
import { SchemaSnapshotSchemaBase, SchemaSnapshotSchema, ConstraintAnalysisSchemaBase, ConstraintAnalysisSchema, MigrationRisksSchemaBase, MigrationRisksSchema,
|
|
12
|
+
// Output schemas
|
|
13
|
+
SchemaSnapshotOutputSchema, ConstraintAnalysisOutputSchema, MigrationRisksOutputSchema, } from "../../schemas/index.js";
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// pg_schema_snapshot
|
|
16
|
+
// =============================================================================
|
|
17
|
+
export function createSchemaSnapshotTool(adapter) {
|
|
18
|
+
return {
|
|
19
|
+
name: "pg_schema_snapshot",
|
|
20
|
+
description: "Get a complete schema snapshot in a single agent-optimized JSON structure. Includes tables, columns, types, constraints, indexes, triggers, sequences, and extensions.",
|
|
21
|
+
group: "introspection",
|
|
22
|
+
inputSchema: SchemaSnapshotSchemaBase,
|
|
23
|
+
outputSchema: SchemaSnapshotOutputSchema,
|
|
24
|
+
annotations: readOnly("Schema Snapshot"),
|
|
25
|
+
icons: getToolIcons("introspection", readOnly("Schema Snapshot")),
|
|
26
|
+
handler: async (params, _context) => {
|
|
27
|
+
try {
|
|
28
|
+
const parsed = SchemaSnapshotSchema.parse(params);
|
|
29
|
+
const includeAll = !parsed.sections || parsed.sections.length === 0;
|
|
30
|
+
const sections = new Set(parsed.sections ?? []);
|
|
31
|
+
const snapshot = {};
|
|
32
|
+
const stats = {
|
|
33
|
+
tables: 0,
|
|
34
|
+
views: 0,
|
|
35
|
+
indexes: 0,
|
|
36
|
+
constraints: 0,
|
|
37
|
+
functions: 0,
|
|
38
|
+
triggers: 0,
|
|
39
|
+
sequences: 0,
|
|
40
|
+
customTypes: 0,
|
|
41
|
+
extensions: 0,
|
|
42
|
+
};
|
|
43
|
+
const schemaExclude = parsed.includeSystem
|
|
44
|
+
? ""
|
|
45
|
+
: "AND n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_toast'";
|
|
46
|
+
const extensionSchemaExclude = !parsed.schema &&
|
|
47
|
+
!parsed.includeSystem &&
|
|
48
|
+
parsed.excludeExtensionSchemas !== false
|
|
49
|
+
? "AND n.nspname NOT IN ('cron', 'topology', 'tiger', 'tiger_data')"
|
|
50
|
+
: "";
|
|
51
|
+
// Exclude extension-owned objects (e.g. spatial_ref_sys, part_config) from public schema
|
|
52
|
+
const extOwnedActive = !parsed.includeSystem && parsed.excludeExtensionSchemas !== false;
|
|
53
|
+
const extOwnedClause = (oidExpr) => extOwnedActive
|
|
54
|
+
? `AND NOT EXISTS (SELECT 1 FROM pg_depend dep WHERE dep.objid = ${oidExpr} AND dep.deptype = 'e')`
|
|
55
|
+
: "";
|
|
56
|
+
const schemaParams = [];
|
|
57
|
+
let schemaWhere = "";
|
|
58
|
+
if (parsed.schema) {
|
|
59
|
+
schemaParams.push(parsed.schema);
|
|
60
|
+
schemaWhere = `AND n.nspname = $${String(schemaParams.length)}`;
|
|
61
|
+
}
|
|
62
|
+
// Tables + columns (or compact mode without columns)
|
|
63
|
+
if (includeAll || sections.has("tables")) {
|
|
64
|
+
const columnsSubquery = parsed.compact
|
|
65
|
+
? ""
|
|
66
|
+
: `,
|
|
67
|
+
(SELECT json_agg(json_build_object(
|
|
68
|
+
'name', a.attname,
|
|
69
|
+
'type', pg_catalog.format_type(a.atttypid, a.atttypmod),
|
|
70
|
+
'nullable', NOT a.attnotnull,
|
|
71
|
+
'default', pg_get_expr(d.adbin, d.adrelid),
|
|
72
|
+
'primaryKey', COALESCE((SELECT true FROM pg_constraint pk
|
|
73
|
+
WHERE pk.conrelid = a.attrelid AND a.attnum = ANY(pk.conkey)
|
|
74
|
+
AND pk.contype = 'p'), false)
|
|
75
|
+
) ORDER BY a.attnum)
|
|
76
|
+
FROM pg_attribute a
|
|
77
|
+
LEFT JOIN pg_attrdef d ON (a.attrelid, a.attnum) = (d.adrelid, d.adnum)
|
|
78
|
+
WHERE a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped
|
|
79
|
+
) AS columns`;
|
|
80
|
+
const tablesResult = await adapter.executeQuery(`SELECT
|
|
81
|
+
n.nspname AS schema, c.relname AS name,
|
|
82
|
+
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'p' THEN 'partitioned_table' END AS type,
|
|
83
|
+
CASE WHEN c.reltuples = -1 THEN COALESCE(s.n_live_tup, 0) ELSE c.reltuples END::bigint AS row_count,
|
|
84
|
+
pg_table_size(c.oid) AS size_bytes,
|
|
85
|
+
obj_description(c.oid, 'pg_class') AS comment${columnsSubquery}
|
|
86
|
+
FROM pg_class c
|
|
87
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
88
|
+
LEFT JOIN pg_stat_user_tables s ON s.relid = c.oid
|
|
89
|
+
WHERE c.relkind IN ('r', 'p')
|
|
90
|
+
${schemaExclude} ${extensionSchemaExclude} ${extOwnedClause("c.oid")} ${schemaWhere}
|
|
91
|
+
ORDER BY n.nspname, c.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
92
|
+
snapshot["tables"] = tablesResult.rows ?? [];
|
|
93
|
+
stats.tables = tablesResult.rows?.length ?? 0;
|
|
94
|
+
}
|
|
95
|
+
// Views
|
|
96
|
+
if (includeAll || sections.has("views")) {
|
|
97
|
+
const viewsResult = await adapter.executeQuery(`SELECT
|
|
98
|
+
n.nspname AS schema, c.relname AS name,
|
|
99
|
+
CASE c.relkind WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized_view' END AS type,
|
|
100
|
+
pg_get_viewdef(c.oid, true) AS definition
|
|
101
|
+
FROM pg_class c
|
|
102
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
103
|
+
WHERE c.relkind IN ('v', 'm')
|
|
104
|
+
${schemaExclude} ${extensionSchemaExclude} ${extOwnedClause("c.oid")} ${schemaWhere}
|
|
105
|
+
ORDER BY n.nspname, c.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
106
|
+
snapshot["views"] = viewsResult.rows ?? [];
|
|
107
|
+
stats.views = viewsResult.rows?.length ?? 0;
|
|
108
|
+
}
|
|
109
|
+
// Indexes
|
|
110
|
+
if (includeAll || sections.has("indexes")) {
|
|
111
|
+
const indexesResult = await adapter.executeQuery(`SELECT
|
|
112
|
+
i.relname AS name, t.relname AS table_name, n.nspname AS schema,
|
|
113
|
+
am.amname AS type, ix.indisunique AS is_unique,
|
|
114
|
+
pg_get_indexdef(ix.indexrelid) AS definition,
|
|
115
|
+
pg_relation_size(i.oid) AS size_bytes
|
|
116
|
+
FROM pg_index ix
|
|
117
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
118
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
119
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
120
|
+
JOIN pg_am am ON am.oid = i.relam
|
|
121
|
+
WHERE ${parsed.includeSystem ? "true" : "n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_toast'"}
|
|
122
|
+
${extensionSchemaExclude} ${extOwnedClause("t.oid")} ${schemaWhere}
|
|
123
|
+
ORDER BY n.nspname, t.relname, i.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
124
|
+
snapshot["indexes"] = indexesResult.rows ?? [];
|
|
125
|
+
stats.indexes = indexesResult.rows?.length ?? 0;
|
|
126
|
+
}
|
|
127
|
+
// Constraints
|
|
128
|
+
if (includeAll || sections.has("constraints")) {
|
|
129
|
+
const constraintsResult = await adapter.executeQuery(`SELECT
|
|
130
|
+
c.conname AS name, t.relname AS table_name, n.nspname AS schema,
|
|
131
|
+
CASE c.contype WHEN 'p' THEN 'primary_key' WHEN 'f' THEN 'foreign_key'
|
|
132
|
+
WHEN 'u' THEN 'unique' WHEN 'c' THEN 'check' WHEN 'x' THEN 'exclusion' END AS type,
|
|
133
|
+
pg_get_constraintdef(c.oid) AS definition
|
|
134
|
+
FROM pg_constraint c
|
|
135
|
+
JOIN pg_class t ON t.oid = c.conrelid
|
|
136
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
137
|
+
WHERE ${parsed.includeSystem ? "true" : "n.nspname NOT IN ('pg_catalog', 'information_schema')"}
|
|
138
|
+
${extensionSchemaExclude} ${extOwnedClause("t.oid")} ${schemaWhere}
|
|
139
|
+
ORDER BY n.nspname, t.relname, c.conname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
140
|
+
snapshot["constraints"] = constraintsResult.rows ?? [];
|
|
141
|
+
stats.constraints = constraintsResult.rows?.length ?? 0;
|
|
142
|
+
}
|
|
143
|
+
// Functions
|
|
144
|
+
if (includeAll || sections.has("functions")) {
|
|
145
|
+
const functionsResult = await adapter.executeQuery(`SELECT
|
|
146
|
+
n.nspname AS schema, p.proname AS name,
|
|
147
|
+
pg_get_function_arguments(p.oid) AS arguments,
|
|
148
|
+
pg_get_function_result(p.oid) AS return_type,
|
|
149
|
+
l.lanname AS language, p.provolatile AS volatility
|
|
150
|
+
FROM pg_proc p
|
|
151
|
+
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
152
|
+
JOIN pg_language l ON l.oid = p.prolang
|
|
153
|
+
WHERE ${parsed.includeSystem ? "true" : "n.nspname NOT IN ('pg_catalog', 'information_schema')"}
|
|
154
|
+
${extensionSchemaExclude} ${extOwnedClause("p.oid")} ${schemaWhere}
|
|
155
|
+
ORDER BY n.nspname, p.proname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
156
|
+
snapshot["functions"] = functionsResult.rows ?? [];
|
|
157
|
+
stats.functions = functionsResult.rows?.length ?? 0;
|
|
158
|
+
}
|
|
159
|
+
// Triggers
|
|
160
|
+
if (includeAll || sections.has("triggers")) {
|
|
161
|
+
const triggersResult = await adapter.executeQuery(`SELECT
|
|
162
|
+
t.tgname AS name, c.relname AS table_name, n.nspname AS schema,
|
|
163
|
+
CASE WHEN t.tgtype & 2 = 2 THEN 'BEFORE' WHEN t.tgtype & 64 = 64 THEN 'INSTEAD OF' ELSE 'AFTER' END AS timing,
|
|
164
|
+
array_remove(ARRAY[
|
|
165
|
+
CASE WHEN t.tgtype & 4 = 4 THEN 'INSERT' END,
|
|
166
|
+
CASE WHEN t.tgtype & 8 = 8 THEN 'DELETE' END,
|
|
167
|
+
CASE WHEN t.tgtype & 16 = 16 THEN 'UPDATE' END,
|
|
168
|
+
CASE WHEN t.tgtype & 32 = 32 THEN 'TRUNCATE' END
|
|
169
|
+
], NULL) AS events,
|
|
170
|
+
p.proname AS function_name
|
|
171
|
+
FROM pg_trigger t
|
|
172
|
+
JOIN pg_class c ON c.oid = t.tgrelid
|
|
173
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
174
|
+
JOIN pg_proc p ON p.oid = t.tgfoid
|
|
175
|
+
WHERE NOT t.tgisinternal
|
|
176
|
+
${schemaExclude} ${extensionSchemaExclude} ${extOwnedClause("c.oid")} ${schemaWhere}
|
|
177
|
+
ORDER BY n.nspname, c.relname, t.tgname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
178
|
+
snapshot["triggers"] = triggersResult.rows ?? [];
|
|
179
|
+
stats.triggers = triggersResult.rows?.length ?? 0;
|
|
180
|
+
}
|
|
181
|
+
// Sequences
|
|
182
|
+
if (includeAll || sections.has("sequences")) {
|
|
183
|
+
const seqResult = await adapter.executeQuery(`SELECT
|
|
184
|
+
n.nspname AS schema, c.relname AS name,
|
|
185
|
+
(SELECT tc.relname || '.' || a.attname
|
|
186
|
+
FROM pg_depend d
|
|
187
|
+
JOIN pg_class tc ON tc.oid = d.refobjid
|
|
188
|
+
JOIN pg_attribute a ON a.attrelid = tc.oid AND a.attnum = d.refobjsubid
|
|
189
|
+
WHERE d.objid = c.oid AND d.classid = 'pg_class'::regclass AND d.deptype = 'a'
|
|
190
|
+
LIMIT 1) AS owned_by
|
|
191
|
+
FROM pg_class c
|
|
192
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
193
|
+
WHERE c.relkind = 'S'
|
|
194
|
+
${schemaExclude} ${extensionSchemaExclude} ${extOwnedClause("c.oid")} ${schemaWhere}
|
|
195
|
+
ORDER BY n.nspname, c.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
196
|
+
snapshot["sequences"] = seqResult.rows ?? [];
|
|
197
|
+
stats.sequences = seqResult.rows?.length ?? 0;
|
|
198
|
+
}
|
|
199
|
+
// Custom types
|
|
200
|
+
if (includeAll || sections.has("types")) {
|
|
201
|
+
const typesResult = await adapter.executeQuery(`SELECT
|
|
202
|
+
n.nspname AS schema, t.typname AS name,
|
|
203
|
+
CASE t.typtype WHEN 'e' THEN 'enum' WHEN 'c' THEN 'composite' WHEN 'd' THEN 'domain' WHEN 'r' THEN 'range' END AS type,
|
|
204
|
+
CASE WHEN t.typtype = 'e' THEN
|
|
205
|
+
(SELECT json_agg(e.enumlabel ORDER BY e.enumsortorder) FROM pg_enum e WHERE e.enumtypid = t.oid)
|
|
206
|
+
END AS values
|
|
207
|
+
FROM pg_type t
|
|
208
|
+
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
209
|
+
WHERE t.typtype IN ('e', 'c', 'd', 'r')
|
|
210
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
211
|
+
${extensionSchemaExclude} ${extOwnedClause("t.oid")} ${schemaWhere}
|
|
212
|
+
ORDER BY n.nspname, t.typname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
213
|
+
snapshot["types"] = typesResult.rows ?? [];
|
|
214
|
+
stats.customTypes = typesResult.rows?.length ?? 0;
|
|
215
|
+
}
|
|
216
|
+
// Extensions (skip when schema filter is active — extensions are global objects)
|
|
217
|
+
if ((includeAll || sections.has("extensions")) && !parsed.schema) {
|
|
218
|
+
const extResult = await adapter.executeQuery(`SELECT extname AS name, extversion AS version,
|
|
219
|
+
n.nspname AS schema
|
|
220
|
+
FROM pg_extension e
|
|
221
|
+
JOIN pg_namespace n ON n.oid = e.extnamespace
|
|
222
|
+
ORDER BY e.extname`);
|
|
223
|
+
snapshot["extensions"] = extResult.rows ?? [];
|
|
224
|
+
stats.extensions = extResult.rows?.length ?? 0;
|
|
225
|
+
}
|
|
226
|
+
// Add hint for nonexistent/empty schema
|
|
227
|
+
const allEmpty = Object.values(stats).every((v) => v === 0);
|
|
228
|
+
const hint = parsed.schema !== undefined && allEmpty
|
|
229
|
+
? `Schema '${parsed.schema}' returned no tables. Verify the schema exists with pg_list_schemas.`
|
|
230
|
+
: undefined;
|
|
231
|
+
return {
|
|
232
|
+
snapshot,
|
|
233
|
+
stats,
|
|
234
|
+
generatedAt: new Date().toISOString(),
|
|
235
|
+
...(parsed.compact && { compact: true }),
|
|
236
|
+
...(hint !== undefined && { hint }),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return {
|
|
241
|
+
success: false,
|
|
242
|
+
error: formatPostgresError(error, {
|
|
243
|
+
tool: "pg_schema_snapshot",
|
|
244
|
+
}),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// =============================================================================
|
|
251
|
+
// pg_constraint_analysis
|
|
252
|
+
// =============================================================================
|
|
253
|
+
export function createConstraintAnalysisTool(adapter) {
|
|
254
|
+
return {
|
|
255
|
+
name: "pg_constraint_analysis",
|
|
256
|
+
description: "Analyze all constraints for issues: redundant indexes, missing foreign keys, missing NOT NULL, missing primary keys, and unindexed foreign keys.",
|
|
257
|
+
group: "introspection",
|
|
258
|
+
inputSchema: ConstraintAnalysisSchemaBase,
|
|
259
|
+
outputSchema: ConstraintAnalysisOutputSchema,
|
|
260
|
+
annotations: readOnly("Constraint Analysis"),
|
|
261
|
+
icons: getToolIcons("introspection", readOnly("Constraint Analysis")),
|
|
262
|
+
handler: async (params, _context) => {
|
|
263
|
+
try {
|
|
264
|
+
const parsed = ConstraintAnalysisSchema.parse(params);
|
|
265
|
+
const runAll = !parsed.checks || parsed.checks.length === 0;
|
|
266
|
+
const checks = new Set(parsed.checks ?? []);
|
|
267
|
+
const findings = [];
|
|
268
|
+
const schemaParams = [];
|
|
269
|
+
let schemaWhere = "";
|
|
270
|
+
let tableWhere = "";
|
|
271
|
+
if (parsed.schema) {
|
|
272
|
+
schemaParams.push(parsed.schema);
|
|
273
|
+
schemaWhere = `AND n.nspname = $${String(schemaParams.length)}`;
|
|
274
|
+
}
|
|
275
|
+
if (parsed.table) {
|
|
276
|
+
schemaParams.push(parsed.table);
|
|
277
|
+
tableWhere = `AND c.relname = $${String(schemaParams.length)}`;
|
|
278
|
+
}
|
|
279
|
+
const extensionSchemaExclude = !parsed.schema &&
|
|
280
|
+
!parsed.table &&
|
|
281
|
+
parsed.excludeExtensionSchemas !== false
|
|
282
|
+
? "AND n.nspname NOT IN ('cron', 'topology', 'tiger', 'tiger_data')"
|
|
283
|
+
: "";
|
|
284
|
+
// Check: Tables without primary keys
|
|
285
|
+
if (runAll || checks.has("missing_pk")) {
|
|
286
|
+
const result = await adapter.executeQuery(`SELECT n.nspname AS schema, c.relname AS table_name
|
|
287
|
+
FROM pg_class c
|
|
288
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
289
|
+
WHERE c.relkind IN ('r', 'p')
|
|
290
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
291
|
+
AND n.nspname !~ '^pg_toast'
|
|
292
|
+
AND NOT EXISTS (
|
|
293
|
+
SELECT 1 FROM pg_constraint pk
|
|
294
|
+
WHERE pk.conrelid = c.oid AND pk.contype = 'p'
|
|
295
|
+
)
|
|
296
|
+
${extensionSchemaExclude} ${schemaWhere} ${tableWhere}
|
|
297
|
+
ORDER BY n.nspname, c.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
298
|
+
for (const row of result.rows ?? []) {
|
|
299
|
+
findings.push({
|
|
300
|
+
type: "missing_pk",
|
|
301
|
+
severity: "error",
|
|
302
|
+
table: qualifiedName(row["schema"], row["table_name"]),
|
|
303
|
+
description: "Table has no primary key",
|
|
304
|
+
suggestion: "Add a primary key column (e.g., id SERIAL PRIMARY KEY) for data integrity and efficient lookups",
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Check: Unindexed foreign keys
|
|
309
|
+
if (runAll || checks.has("unindexed_fk")) {
|
|
310
|
+
const result = await adapter.executeQuery(`SELECT
|
|
311
|
+
n.nspname AS schema, t.relname AS table_name,
|
|
312
|
+
c.conname AS constraint_name,
|
|
313
|
+
array_agg(a.attname ORDER BY x.ordinality) AS columns
|
|
314
|
+
FROM pg_constraint c
|
|
315
|
+
JOIN pg_class t ON t.oid = c.conrelid
|
|
316
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
317
|
+
CROSS JOIN LATERAL unnest(c.conkey) WITH ORDINALITY AS x(attnum, ordinality)
|
|
318
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = x.attnum
|
|
319
|
+
WHERE c.contype = 'f'
|
|
320
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
321
|
+
${extensionSchemaExclude}
|
|
322
|
+
AND NOT EXISTS (
|
|
323
|
+
SELECT 1 FROM pg_index ix
|
|
324
|
+
WHERE ix.indrelid = t.oid
|
|
325
|
+
AND c.conkey <@ ix.indkey::smallint[]
|
|
326
|
+
)
|
|
327
|
+
${schemaWhere} ${tableWhere.replace("c.relname", "t.relname")}
|
|
328
|
+
GROUP BY n.nspname, t.relname, c.conname
|
|
329
|
+
ORDER BY n.nspname, t.relname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
330
|
+
for (const row of result.rows ?? []) {
|
|
331
|
+
const cols = parseArrayColumn(row["columns"]);
|
|
332
|
+
findings.push({
|
|
333
|
+
type: "unindexed_fk",
|
|
334
|
+
severity: "warning",
|
|
335
|
+
table: qualifiedName(row["schema"], row["table_name"]),
|
|
336
|
+
description: `Foreign key '${row["constraint_name"]}' on column(s) [${cols.join(", ")}] has no supporting index`,
|
|
337
|
+
suggestion: `CREATE INDEX ON ${qualifiedName(row["schema"], row["table_name"])} (${cols.join(", ")})`,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Check: Tables with columns that likely should have NOT NULL
|
|
342
|
+
if (runAll || checks.has("missing_not_null")) {
|
|
343
|
+
const result = await adapter.executeQuery(`SELECT
|
|
344
|
+
n.nspname AS schema, c.relname AS table_name,
|
|
345
|
+
a.attname AS column_name, pg_catalog.format_type(a.atttypid, a.atttypmod) AS type
|
|
346
|
+
FROM pg_attribute a
|
|
347
|
+
JOIN pg_class c ON c.oid = a.attrelid
|
|
348
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
349
|
+
WHERE c.relkind IN ('r', 'p')
|
|
350
|
+
AND a.attnum > 0 AND NOT a.attisdropped AND a.attnotnull = false
|
|
351
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
352
|
+
AND n.nspname !~ '^pg_toast'
|
|
353
|
+
${extensionSchemaExclude}
|
|
354
|
+
AND a.attname IN ('id', 'uuid', 'email', 'name', 'created_at', 'updated_at', 'status', 'type')
|
|
355
|
+
AND NOT EXISTS (SELECT 1 FROM pg_constraint pk WHERE pk.conrelid = c.oid AND a.attnum = ANY(pk.conkey) AND pk.contype = 'p')
|
|
356
|
+
${schemaWhere} ${tableWhere}
|
|
357
|
+
ORDER BY n.nspname, c.relname, a.attname`, schemaParams.length > 0 ? schemaParams : undefined);
|
|
358
|
+
for (const row of result.rows ?? []) {
|
|
359
|
+
findings.push({
|
|
360
|
+
type: "missing_not_null",
|
|
361
|
+
severity: "info",
|
|
362
|
+
table: qualifiedName(row["schema"], row["table_name"]),
|
|
363
|
+
description: `Column '${row["column_name"]}' (${row["type"]}) is nullable but commonly expected to be NOT NULL`,
|
|
364
|
+
suggestion: `ALTER TABLE ${qualifiedName(row["schema"], row["table_name"])} ALTER COLUMN "${row["column_name"]}" SET NOT NULL`,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Build summary
|
|
369
|
+
const byType = {};
|
|
370
|
+
const bySeverity = {};
|
|
371
|
+
for (const f of findings) {
|
|
372
|
+
byType[f.type] = (byType[f.type] ?? 0) + 1;
|
|
373
|
+
bySeverity[f.severity] = (bySeverity[f.severity] ?? 0) + 1;
|
|
374
|
+
}
|
|
375
|
+
// Add hint for nonexistent table
|
|
376
|
+
const hint = parsed.table !== undefined && findings.length === 0
|
|
377
|
+
? `No findings for table '${parsed.schema ? parsed.schema + "." : "public."}${parsed.table}'. Verify the table exists with pg_list_tables.`
|
|
378
|
+
: undefined;
|
|
379
|
+
return {
|
|
380
|
+
findings,
|
|
381
|
+
summary: {
|
|
382
|
+
totalFindings: findings.length,
|
|
383
|
+
byType,
|
|
384
|
+
bySeverity,
|
|
385
|
+
},
|
|
386
|
+
...(hint !== undefined && { hint }),
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
return {
|
|
391
|
+
success: false,
|
|
392
|
+
error: formatPostgresError(error, {
|
|
393
|
+
tool: "pg_constraint_analysis",
|
|
394
|
+
}),
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
// =============================================================================
|
|
401
|
+
// pg_migration_risks
|
|
402
|
+
// =============================================================================
|
|
403
|
+
/** DDL patterns and their associated risks */
|
|
404
|
+
const DDL_RISK_PATTERNS = [
|
|
405
|
+
{
|
|
406
|
+
pattern: /\bDROP\s+TABLE\b/i,
|
|
407
|
+
category: "data_loss",
|
|
408
|
+
riskLevel: "critical",
|
|
409
|
+
description: "DROP TABLE permanently deletes the table and all its data",
|
|
410
|
+
mitigation: "Back up the table first (pg_dump_table), verify no active references",
|
|
411
|
+
requiresDowntime: false,
|
|
412
|
+
lockImpact: "ACCESS EXCLUSIVE on the table",
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
pattern: /\bTRUNCATE\b/i,
|
|
416
|
+
category: "data_loss",
|
|
417
|
+
riskLevel: "critical",
|
|
418
|
+
description: "TRUNCATE removes all rows from the table",
|
|
419
|
+
mitigation: "Verify you intend to delete all data, check CASCADE effects",
|
|
420
|
+
requiresDowntime: false,
|
|
421
|
+
lockImpact: "ACCESS EXCLUSIVE on the table",
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
pattern: /\bDROP\s+COLUMN\b/i,
|
|
425
|
+
category: "data_loss",
|
|
426
|
+
riskLevel: "high",
|
|
427
|
+
description: "DROP COLUMN permanently removes the column and its data",
|
|
428
|
+
mitigation: "Back up the column data first, verify no application dependencies",
|
|
429
|
+
requiresDowntime: false,
|
|
430
|
+
lockImpact: "ACCESS EXCLUSIVE on the table",
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
pattern: /\bALTER\s+(?:TABLE|COLUMN)\b.*\bSET\s+NOT\s+NULL\b/i,
|
|
434
|
+
category: "constraint",
|
|
435
|
+
riskLevel: "high",
|
|
436
|
+
description: "Adding NOT NULL requires a full table scan to verify no NULL values exist",
|
|
437
|
+
mitigation: "First check for NULLs: SELECT COUNT(*) FROM table WHERE column IS NULL",
|
|
438
|
+
requiresDowntime: false,
|
|
439
|
+
lockImpact: "ACCESS EXCLUSIVE during verification scan",
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
pattern: /\bALTER\s+TABLE\b.*\bADD\s+(?:CONSTRAINT\b.*\b)?FOREIGN\s+KEY\b/i,
|
|
443
|
+
category: "constraint",
|
|
444
|
+
riskLevel: "medium",
|
|
445
|
+
description: "Adding a foreign key requires validating all existing rows",
|
|
446
|
+
mitigation: "Use NOT VALID to skip validation, then VALIDATE CONSTRAINT separately",
|
|
447
|
+
requiresDowntime: false,
|
|
448
|
+
lockImpact: "SHARE ROW EXCLUSIVE on both tables",
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
pattern: /\bALTER\s+TABLE\b.*\bADD\s+COLUMN\b/i,
|
|
452
|
+
category: "schema_change",
|
|
453
|
+
riskLevel: "low",
|
|
454
|
+
description: "Adding a nullable column without a default is a metadata-only change",
|
|
455
|
+
requiresDowntime: false,
|
|
456
|
+
lockImpact: "ACCESS EXCLUSIVE (very brief)",
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
pattern: /\bALTER\s+TABLE\b.*\bADD\s+COLUMN\b.*\bDEFAULT\b/i,
|
|
460
|
+
category: "schema_change",
|
|
461
|
+
riskLevel: "medium",
|
|
462
|
+
description: "Adding a column with a volatile DEFAULT may require rewriting all rows (PG < 11) or is metadata-only (PG >= 11)",
|
|
463
|
+
mitigation: "On PG >= 11, this is usually fast. On older versions, consider adding without default then updating",
|
|
464
|
+
requiresDowntime: false,
|
|
465
|
+
lockImpact: "ACCESS EXCLUSIVE (metadata-only on PG >= 11)",
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
pattern: /\bALTER\s+TABLE\b.*\bALTER\s+COLUMN\b.*\bTYPE\b/i,
|
|
469
|
+
category: "schema_change",
|
|
470
|
+
riskLevel: "high",
|
|
471
|
+
description: "Changing column type requires rewriting the entire table",
|
|
472
|
+
mitigation: "Consider creating a new column, migrating data, then dropping the old one",
|
|
473
|
+
requiresDowntime: true,
|
|
474
|
+
lockImpact: "ACCESS EXCLUSIVE for the entire rewrite",
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
pattern: /\bCREATE\s+INDEX\b(?!\s+CONCURRENTLY)/i,
|
|
478
|
+
category: "locking",
|
|
479
|
+
riskLevel: "high",
|
|
480
|
+
description: "CREATE INDEX (non-concurrent) blocks writes to the table for the entire build duration",
|
|
481
|
+
mitigation: "Use CREATE INDEX CONCURRENTLY to avoid blocking writes",
|
|
482
|
+
requiresDowntime: false,
|
|
483
|
+
lockImpact: "SHARE lock on the table (blocks INSERT/UPDATE/DELETE)",
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
pattern: /\bCREATE\s+INDEX\s+CONCURRENTLY\b/i,
|
|
487
|
+
category: "locking",
|
|
488
|
+
riskLevel: "low",
|
|
489
|
+
description: "CREATE INDEX CONCURRENTLY allows concurrent writes but takes longer",
|
|
490
|
+
requiresDowntime: false,
|
|
491
|
+
lockImpact: "No blocking locks (uses ShareUpdateExclusiveLock)",
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
pattern: /\bDROP\s+INDEX\b(?!\s+CONCURRENTLY)/i,
|
|
495
|
+
category: "locking",
|
|
496
|
+
riskLevel: "medium",
|
|
497
|
+
description: "DROP INDEX blocks writes briefly. May degrade query performance",
|
|
498
|
+
mitigation: "Use DROP INDEX CONCURRENTLY in production, verify no critical queries depend on it",
|
|
499
|
+
requiresDowntime: false,
|
|
500
|
+
lockImpact: "ACCESS EXCLUSIVE (brief)",
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
pattern: /\bRENAME\s+(?:TABLE|COLUMN|TO)\b/i,
|
|
504
|
+
category: "breaking_change",
|
|
505
|
+
riskLevel: "high",
|
|
506
|
+
description: "Renaming a table or column will break any application queries referencing the old name",
|
|
507
|
+
mitigation: "Create a view with the old name pointing to the new name for backward compatibility",
|
|
508
|
+
requiresDowntime: false,
|
|
509
|
+
lockImpact: "ACCESS EXCLUSIVE (brief)",
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
pattern: /\bDROP\s+SCHEMA\b.*\bCASCADE\b/i,
|
|
513
|
+
category: "data_loss",
|
|
514
|
+
riskLevel: "critical",
|
|
515
|
+
description: "DROP SCHEMA CASCADE deletes the schema and ALL objects within it",
|
|
516
|
+
mitigation: "List all objects in the schema first, verify intent, and back up critical data",
|
|
517
|
+
requiresDowntime: false,
|
|
518
|
+
lockImpact: "ACCESS EXCLUSIVE on all objects in the schema",
|
|
519
|
+
},
|
|
520
|
+
];
|
|
521
|
+
export function createMigrationRisksTool(adapter) {
|
|
522
|
+
return {
|
|
523
|
+
name: "pg_migration_risks",
|
|
524
|
+
description: "Analyze proposed DDL statements for risks: data loss, lock contention, constraint violations, and breaking changes. Pre-flight check before executing migrations.",
|
|
525
|
+
group: "introspection",
|
|
526
|
+
inputSchema: MigrationRisksSchemaBase,
|
|
527
|
+
outputSchema: MigrationRisksOutputSchema,
|
|
528
|
+
annotations: readOnly("Migration Risks"),
|
|
529
|
+
icons: getToolIcons("introspection", readOnly("Migration Risks")),
|
|
530
|
+
handler: (params, _context) => Promise.resolve().then(() => {
|
|
531
|
+
// adapter is available for future enhancements (e.g., checking table existence)
|
|
532
|
+
void adapter;
|
|
533
|
+
const parsed = MigrationRisksSchema.parse(params);
|
|
534
|
+
const risks = [];
|
|
535
|
+
let requiresDowntime = false;
|
|
536
|
+
let highestRiskLevel = "low";
|
|
537
|
+
const lockImpacts = new Set();
|
|
538
|
+
const riskOrder = { low: 0, medium: 1, high: 2, critical: 3 };
|
|
539
|
+
for (let i = 0; i < parsed.statements.length; i++) {
|
|
540
|
+
const stmt = parsed.statements[i] ?? "";
|
|
541
|
+
for (const pattern of DDL_RISK_PATTERNS) {
|
|
542
|
+
if (pattern.pattern.test(stmt)) {
|
|
543
|
+
risks.push({
|
|
544
|
+
statement: stmt.length > 200 ? stmt.slice(0, 200) + "..." : stmt,
|
|
545
|
+
statementIndex: i,
|
|
546
|
+
riskLevel: pattern.riskLevel,
|
|
547
|
+
category: pattern.category,
|
|
548
|
+
description: pattern.description,
|
|
549
|
+
mitigation: pattern.mitigation,
|
|
550
|
+
});
|
|
551
|
+
if (pattern.requiresDowntime) {
|
|
552
|
+
requiresDowntime = true;
|
|
553
|
+
}
|
|
554
|
+
if (riskOrder[pattern.riskLevel] > riskOrder[highestRiskLevel]) {
|
|
555
|
+
highestRiskLevel = pattern.riskLevel;
|
|
556
|
+
}
|
|
557
|
+
lockImpacts.add(pattern.lockImpact);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
risks,
|
|
563
|
+
summary: {
|
|
564
|
+
totalStatements: parsed.statements.length,
|
|
565
|
+
totalRisks: risks.length,
|
|
566
|
+
highestRisk: highestRiskLevel,
|
|
567
|
+
requiresDowntime,
|
|
568
|
+
estimatedLockImpact: lockImpacts.size > 0 ? [...lockImpacts].join("; ") : "None",
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
}),
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../../../src/adapters/postgresql/tools/introspection/analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Introspection Tools - Graph Analysis
|
|
3
|
+
*
|
|
4
|
+
* Dependency graph, topological sort, and cascade simulation tools.
|
|
5
|
+
* 3 tools total.
|
|
6
|
+
*/
|
|
7
|
+
import type { PostgresAdapter } from "../../PostgresAdapter.js";
|
|
8
|
+
import type { ToolDefinition } from "../../../../types/index.js";
|
|
9
|
+
export interface FkEdge {
|
|
10
|
+
constraintName: string;
|
|
11
|
+
fromSchema: string;
|
|
12
|
+
fromTable: string;
|
|
13
|
+
fromColumns: string[];
|
|
14
|
+
toSchema: string;
|
|
15
|
+
toTable: string;
|
|
16
|
+
toColumns: string[];
|
|
17
|
+
onDelete: string;
|
|
18
|
+
onUpdate: string;
|
|
19
|
+
}
|
|
20
|
+
interface TableNode {
|
|
21
|
+
schema: string;
|
|
22
|
+
table: string;
|
|
23
|
+
rowCount?: number;
|
|
24
|
+
sizeBytes?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Fetch all foreign key relationships across user schemas
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchForeignKeys(adapter: PostgresAdapter, schemaFilter?: string, excludeExtensionSchemas?: boolean): Promise<FkEdge[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Fetch all user tables with row counts and sizes
|
|
32
|
+
*/
|
|
33
|
+
export declare function fetchTableNodes(adapter: PostgresAdapter, schemaFilter?: string, excludeExtensionSchemas?: boolean): Promise<TableNode[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Parse PostgreSQL array column (handles both native arrays and string format)
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseArrayColumn(value: unknown): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Create qualified table name
|
|
40
|
+
*/
|
|
41
|
+
export declare function qualifiedName(schema: string, table: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Detect circular dependencies using DFS
|
|
44
|
+
*/
|
|
45
|
+
export declare function detectCycles(adjacency: Map<string, string[]>): string[][];
|
|
46
|
+
/**
|
|
47
|
+
* Topological sort using Kahn's algorithm
|
|
48
|
+
* Returns null if cycles exist
|
|
49
|
+
*/
|
|
50
|
+
export declare function topologicalSort(adjacency: Map<string, string[]>, allNodes: Set<string>): string[] | null;
|
|
51
|
+
export declare function createDependencyGraphTool(adapter: PostgresAdapter): ToolDefinition;
|
|
52
|
+
export declare function createTopologicalSortTool(adapter: PostgresAdapter): ToolDefinition;
|
|
53
|
+
export declare function createCascadeSimulatorTool(adapter: PostgresAdapter): ToolDefinition;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=graph.d.ts.map
|