From f71972af266cdda1bac2667a2ccaa24349074140 Mon Sep 17 00:00:00 2001 From: JoseDFlorez <63378897+JoseDFN@users.noreply.github.com> Date: Fri, 9 Oct 2026 19:48:30 -0500 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=93=A6=20build:=20slim=20the=20skill?= =?UTF-8?q?=20installation=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the canonical skill into skills/database-dependency-migration and commit an allowlisted payload that reduces installation bytes by 86.4%. Keep optional toolkit resources and licenses, share the payload with the .skill archive, and check synchronization and real installs in CI. Update installation instructions, packaging regression coverage, and contribution guidance for the repository owners' review exemption. Validation: 150 offline tests pass, two live tests skip without a DSN, check:skill passes, and prior real Skills CLI and artifact smokes pass. --- .gitattributes | 4 + .github/workflows/ci.yml | 3 + CHANGELOG.md | 2 + CONTRIBUTING.md | 12 +- README.md | 30 +- SECURITY.md | 2 +- docs/releases.md | 4 +- docs/skill-distribution-validation.md | 26 + .../2026-10-09-slim-skill-installation.md | 14 + package.json | 3 +- scripts/check-site-publication.mjs | 11 +- scripts/package-skill.mjs | 60 +- scripts/skill-distribution.mjs | 185 + scripts/smoke-skills-install.mjs | 24 +- scripts/sync-skill.mjs | 8 + scripts/tooling.mjs | 3 +- site/scripts/prepare-demos.mjs | 7 +- site/src/Home.tsx | 2 +- site/src/docs.ts | 10 +- .../CONTRIBUTING.md | 3 + skills/database-dependency-migration/LICENSE | 21 + .../database-dependency-migration/README.md | 36 + .../database-dependency-migration/SECURITY.md | 21 + .../database-dependency-migration/SKILL.md | 0 .../THIRD_PARTY_NOTICES.md | 24 + .../agents/openai.yaml | 4 + .../assets/viewer/archivo-LICENSE | 93 + .../viewer/archivo-latin-wght-normal.woff2 | Bin 0 -> 34928 bytes .../assets/viewer/bootstrap.js | 16 + .../assets/viewer/ibm-plex-mono-LICENSE | 93 + .../ibm-plex-mono-latin-400-normal.woff2 | Bin 0 -> 14708 bytes .../assets/viewer/locales.js | 235 + .../assets/viewer/template.html | 338 + .../assets/viewer/viewer.css | 749 + .../assets/viewer/viewer.js | 563 + .../docs/roadmap.md | 38 + .../examples/README.md | 15 + .../analytics/capture-provenance.json | 10 + .../examples/analytics/catalog.json | 20954 ++++++++++++++++ .../examples/analytics/drop.sql | 1 + .../examples/analytics/schema.sql | 5 + .../examples/diff/after.sql | 1 + .../examples/diff/before.sql | 1 + .../examples/dynamic-sql-unknown/app/query.ts | 2 + .../dynamic-sql-unknown/app/static.sql | 1 + .../examples/dynamic-sql-unknown/schema.sql | 8 + .../examples/ecommerce/app/customers.sql | 1 + .../examples/ecommerce/app/orders.sql | 2 + .../migrations/001_add_customer_uuid.sql | 4 + .../migrations/002_backfill_customer_uuid.sql | 7 + .../migrations/003_contract_legacy_id.sql | 4 + .../examples/ecommerce/schema.sql | 46 + .../examples/high-traffic/migrations/007.sql | 5 + .../high-traffic/workload-profile.json | 1 + .../examples/multi-schema/schema.sql | 4 + .../examples/rendered/analytics/graph.dot | 54 + .../examples/rendered/analytics/graph.mmd | 53 + .../rendered/analytics/model.dbdep.json | 1633 ++ .../examples/rendered/analytics/report.html | 3783 +++ .../examples/rendered/analytics/report.md | 239 + .../examples/rendered/analytics/review.json | 169 + .../examples/rendered/ecommerce/graph.dot | 153 + .../examples/rendered/ecommerce/graph.mmd | 152 + .../rendered/ecommerce/model.dbdep.json | 3031 +++ .../examples/rendered/ecommerce/report.html | 5181 ++++ .../examples/rendered/ecommerce/report.md | 358 + .../examples/rendered/ecommerce/review.json | 406 + .../examples/rendered/high-traffic/graph.dot | 153 + .../examples/rendered/high-traffic/graph.mmd | 152 + .../rendered/high-traffic/model.dbdep.json | 2932 +++ .../rendered/high-traffic/report.html | 5082 ++++ .../examples/rendered/high-traffic/report.md | 294 + .../rendered/high-traffic/review.json | 190 + .../examples/tricky-identifiers/schema.sql | 13 + .../package.json | 52 + .../pnpm-lock.yaml | 1332 + .../references/dependency-semantics.md | 13 + .../references/diagramming.md | 9 + .../references/migrations.md | 31 + .../references/model.md | 19 + .../references/parser-and-confidence.md | 17 + .../references/postgres-catalog.md | 15 + .../references/security.md | 11 + .../references/source-analysis.md | 55 + .../references/toolkit.md | 39 + .../references/troubleshooting.md | 11 + .../schemas/dbdep.schema.json | 575 + .../schemas/findings.schema.json | 114 + .../schemas/report.schema.json | 153 + .../scripts/dbdep.mjs | 3 + .../src/dbdep/catalog.mjs | 513 + .../src/dbdep/cli.mjs | 417 + .../src/dbdep/engine.mjs | 5 + .../src/dbdep/graph.mjs | 190 + .../src/dbdep/model.mjs | 375 + .../src/dbdep/planning.mjs | 49 + .../src/dbdep/reports.mjs | 412 + .../src/dbdep/rules.mjs | 693 + .../src/dbdep/sql.mjs | 786 + .../src/dbdep/types.mjs | 63 + .../templates/review-report.md | 35 + tests/browser/site-docs.spec.mjs | 2 +- tests/browser/site-regressions.spec.mjs | 9 +- tests/node/release-bundle.test.mjs | 29 +- tests/node/site-publication.test.mjs | 7 +- tests/node/skill-distribution.test.mjs | 161 + 106 files changed, 53849 insertions(+), 90 deletions(-) create mode 100644 docs/skill-distribution-validation.md create mode 100644 docs/superpowers/plans/2026-10-09-slim-skill-installation.md create mode 100644 scripts/skill-distribution.mjs create mode 100644 scripts/sync-skill.mjs create mode 100644 skills/database-dependency-migration/CONTRIBUTING.md create mode 100644 skills/database-dependency-migration/LICENSE create mode 100644 skills/database-dependency-migration/README.md create mode 100644 skills/database-dependency-migration/SECURITY.md rename SKILL.md => skills/database-dependency-migration/SKILL.md (100%) create mode 100644 skills/database-dependency-migration/THIRD_PARTY_NOTICES.md create mode 100644 skills/database-dependency-migration/agents/openai.yaml create mode 100644 skills/database-dependency-migration/assets/viewer/archivo-LICENSE create mode 100644 skills/database-dependency-migration/assets/viewer/archivo-latin-wght-normal.woff2 create mode 100644 skills/database-dependency-migration/assets/viewer/bootstrap.js create mode 100644 skills/database-dependency-migration/assets/viewer/ibm-plex-mono-LICENSE create mode 100644 skills/database-dependency-migration/assets/viewer/ibm-plex-mono-latin-400-normal.woff2 create mode 100644 skills/database-dependency-migration/assets/viewer/locales.js create mode 100644 skills/database-dependency-migration/assets/viewer/template.html create mode 100644 skills/database-dependency-migration/assets/viewer/viewer.css create mode 100644 skills/database-dependency-migration/assets/viewer/viewer.js create mode 100644 skills/database-dependency-migration/docs/roadmap.md create mode 100644 skills/database-dependency-migration/examples/README.md create mode 100644 skills/database-dependency-migration/examples/analytics/capture-provenance.json create mode 100644 skills/database-dependency-migration/examples/analytics/catalog.json create mode 100644 skills/database-dependency-migration/examples/analytics/drop.sql create mode 100644 skills/database-dependency-migration/examples/analytics/schema.sql create mode 100644 skills/database-dependency-migration/examples/diff/after.sql create mode 100644 skills/database-dependency-migration/examples/diff/before.sql create mode 100644 skills/database-dependency-migration/examples/dynamic-sql-unknown/app/query.ts create mode 100644 skills/database-dependency-migration/examples/dynamic-sql-unknown/app/static.sql create mode 100644 skills/database-dependency-migration/examples/dynamic-sql-unknown/schema.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/app/customers.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/app/orders.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/migrations/001_add_customer_uuid.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/migrations/002_backfill_customer_uuid.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/migrations/003_contract_legacy_id.sql create mode 100644 skills/database-dependency-migration/examples/ecommerce/schema.sql create mode 100644 skills/database-dependency-migration/examples/high-traffic/migrations/007.sql create mode 100644 skills/database-dependency-migration/examples/high-traffic/workload-profile.json create mode 100644 skills/database-dependency-migration/examples/multi-schema/schema.sql create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/graph.dot create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/graph.mmd create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/model.dbdep.json create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/report.html create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/report.md create mode 100644 skills/database-dependency-migration/examples/rendered/analytics/review.json create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/graph.dot create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/graph.mmd create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/model.dbdep.json create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/report.html create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/report.md create mode 100644 skills/database-dependency-migration/examples/rendered/ecommerce/review.json create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/graph.dot create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/graph.mmd create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/model.dbdep.json create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/report.html create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/report.md create mode 100644 skills/database-dependency-migration/examples/rendered/high-traffic/review.json create mode 100644 skills/database-dependency-migration/examples/tricky-identifiers/schema.sql create mode 100644 skills/database-dependency-migration/package.json create mode 100644 skills/database-dependency-migration/pnpm-lock.yaml create mode 100644 skills/database-dependency-migration/references/dependency-semantics.md create mode 100644 skills/database-dependency-migration/references/diagramming.md create mode 100644 skills/database-dependency-migration/references/migrations.md create mode 100644 skills/database-dependency-migration/references/model.md create mode 100644 skills/database-dependency-migration/references/parser-and-confidence.md create mode 100644 skills/database-dependency-migration/references/postgres-catalog.md create mode 100644 skills/database-dependency-migration/references/security.md create mode 100644 skills/database-dependency-migration/references/source-analysis.md create mode 100644 skills/database-dependency-migration/references/toolkit.md create mode 100644 skills/database-dependency-migration/references/troubleshooting.md create mode 100644 skills/database-dependency-migration/schemas/dbdep.schema.json create mode 100644 skills/database-dependency-migration/schemas/findings.schema.json create mode 100644 skills/database-dependency-migration/schemas/report.schema.json create mode 100644 skills/database-dependency-migration/scripts/dbdep.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/catalog.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/cli.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/engine.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/graph.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/model.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/planning.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/reports.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/rules.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/sql.mjs create mode 100644 skills/database-dependency-migration/src/dbdep/types.mjs create mode 100644 skills/database-dependency-migration/templates/review-report.md create mode 100644 tests/node/skill-distribution.test.mjs diff --git a/.gitattributes b/.gitattributes index 583ef4f..c0a3e58 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,3 +12,7 @@ evals/review.html -text -whitespace linguist-generated=true evals/review-node.html -text -whitespace linguist-generated=true # Keep generated viewers available without counting them as authored source. examples/rendered/** linguist-generated=true +# Committed copies keep Skills CLI installation independent of contributor setup. +skills/database-dependency-migration/** linguist-generated=true +skills/database-dependency-migration/SKILL.md linguist-generated=false +skills/database-dependency-migration/README.md linguist-generated=false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ccbd001..0bef27e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: node-version: "24" - run: npm install --global pnpm@12.10.1 --ignore-scripts - run: pnpm install --frozen-lockfile --ignore-scripts + - run: pnpm check:skill - run: pnpm audit --audit-level=low - run: pnpm exec playwright install --with-deps chromium - run: pnpm test @@ -26,6 +27,8 @@ jobs: - run: pnpm package:skill - run: pnpm package:site - run: pnpm smoke:artifacts + - run: npm install --prefix out/skills-cli --ignore-scripts --no-audit --no-fund skills@1.7.2 + - run: pnpm smoke:skills --cli out/skills-cli/node_modules/skills/bin/cli.mjs - name: build the GitHub Pages repository prefix run: pnpm build env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 71f1fe8..f440c77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +Move the discoverable skill into `skills/database-dependency-migration/`. Generate its committed toolkit/resources with a shared distribution allowlist, exclude website/evaluation/development files and use the same payload for `.skill` archives. Add stale-copy checks, installed-link regressions and a real Skills CLI smoke in CI. Update manual-copy instructions and website documentation paths. + Make source-cited migration review the default skill workflow without Node.js, pnpm, installed packages, builds or a database server. Add manual EF Core/C#, Prisma and TypeORM mapping guidance, sequential schema ledgers and PR-ready summaries. Keep parser-backed models and interactive reports in the optional toolkit, with a production-only npm installation path. Update the README, troubleshooting, report outline, agent prompt and English/Spanish website installation and quickstart guidance. Record broader automation and independent accuracy testing as future work. Find npm in both official Windows and POSIX Node installation layouts during artifact installation checks. Resolve prerequisites before creating a temporary workspace. The first remote Linux CI run exposed this portability bug after all engine/browser/build checks passed. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9c617ae..492e564 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ Keep dependency claims grounded in source evidence, preserve explicit unknowns, Anyone can fork this public repository, create a branch in their fork, and open a pull request targeting `main`. Repository write access is not needed. Describe the problem, resulting behavior and checks performed, and follow the commit format below. -The [code owners](.github/CODEOWNERS) are `@JoseDFlorez` and `@Juanfrxz`. A pull request requires an approval from at least one of them, passing required CI checks and resolved review conversations before merging. New changes invalidate earlier approvals. Maintainers also use pull requests; the author cannot approve their own request and the latest push needs another maintainer's approval. +The [code owners](.github/CODEOWNERS) are `@JoseDFlorez` and `@Juanfrxz`. They use pull requests and may merge without a separate review approval through their explicit review exemption. The normal contributor path requires approval from at least one code owner; new changes invalidate earlier approvals and the latest push needs another maintainer's approval. Every pull request must pass required CI checks and resolve review conversations before merging. Public contributors can comment and submit reviews. Their approval does not replace the required code-owner approval. Keep vulnerabilities and private database artifacts out of public pull requests; follow [SECURITY.md](SECURITY.md). @@ -41,7 +41,7 @@ Use `pnpm exec prettier --check` with the files you changed. Describe checks act | Catalog capture or normalization | `src/dbdep/catalog.mjs`, fixed-query contract, catalog guidance, isolated live tests and sanitized provenance | | Hazard rules or phase guidance | `src/dbdep/rules.mjs`, `planning.mjs`, migration guidance, positive/negative and UNKNOWN regressions | | Reports or viewer | `src/dbdep/reports.mjs`, `assets/viewer/`, schemas as needed, browser checks and regenerated examples | -| CLI or installation | `src/dbdep/cli.mjs`, `SKILL.md`, README, site command docs, CLI and real-install smoke checks | +| CLI or installation | `src/dbdep/cli.mjs`, `skills/database-dependency-migration/SKILL.md`, README, distribution sync and real-install smoke checks | | Website | `site/src/`, bilingual copy/accessibility, site tests and retained license notices | Add an observable failing regression before changing graph semantics, hazards or safety boundaries. Preserve stable IDs, deterministic ordering, UTF-8 source locations, hashes and evidence states. Unsupported or ambiguous resolution must remain UNKNOWN. The current canonical contract is 1.0.0; explain incompatible changes explicitly. @@ -81,6 +81,8 @@ Build and package the current local version, then test both npm/unpacked skill a pnpm build pnpm check:site pnpm pack --pack-destination dist/v0.3.2 +pnpm sync:skill +pnpm check:skill pnpm package:skill pnpm package:site pnpm smoke:artifacts @@ -95,7 +97,9 @@ pnpm exec node scripts/smoke-skills-install.mjs --cli out/skills-cli/node_module `DBDEP_SKILLS_CLI` can supply the same cached entry point. The smoke installs a current worktree snapshot into a project outside the checkout, disables telemetry, checks archive/version/member hashes and sensitive filenames, installs frozen production dependencies, runs `doctor`, creates all three demos and strictly validates them. Its checked temporary directory is removed and its receipt is written under `dist/v/`. This catches the installer excluding files named `metadata.json`; the active high-traffic input is `workload-profile.json`. -The Skills CLI copies the root skill directory, including site/evaluation/development files. npm and `.skill` packaging use their own allowlists. Test their actual contents and preserve licenses. Rebuild the website after README or SKILL changes; site packaging rejects stale documentation copies. Development checks require the full workspace. An installed skill needs no package installation for source review; only its optional toolkit needs the production-only npm or frozen pnpm setup documented in the README. +The Skills CLI installs only `skills/database-dependency-migration/`. Its canonical `SKILL.md` and installation README are authored there; `pnpm sync:skill` refreshes the other committed files from an explicit root-source allowlist. After changing toolkit sources, references, templates, metadata, examples, manifests, lockfiles or licenses, run the sync and include its changes in the same commit. `pnpm check:skill` rejects stale or unexpected files, and CI runs it before tests. Do not edit the generated copies directly. + +The `.skill` archive uses that same checked payload. npm retains its separate toolkit file allowlist. The real installer smoke compares installation member hashes against the dedicated directory, rejects website/evaluation/development files and reports installed bytes. Test actual contents and preserve licenses. Rebuild the website after README or skill-entry changes; site packaging rejects stale documentation copies. Development checks require the full workspace. Source review needs no package installation; only the optional toolkit needs the production-only npm or frozen pnpm setup documented in the README. ## Style and commits @@ -113,7 +117,7 @@ Examples are `šŸ› fix: preserve metadata in skills installs` and `šŸ“ docs: ex ## Releases and deployment -Follow [SemVer](https://semver.org/) and [docs/releases.md](docs/releases.md). Update root/site package versions, `SKILL.md` metadata, the lockfile and changelog together. The pending local release is v0.3.2; historical v0.3.0/v0.3.1 receipts and frozen evaluations remain historical. +Follow [SemVer](https://semver.org/) and [docs/releases.md](docs/releases.md). Update root/site package versions, `skills/database-dependency-migration/SKILL.md` metadata, the lockfile and changelog together, then sync the dedicated skill directory. The pending local release is v0.3.2; historical v0.3.0/v0.3.1 receipts and frozen evaluations remain historical. Complete relevant checks and artifact/hash comparisons on final `main` before creating an annotated `v` tag. Never move or replace an existing release tag. Local commit/tag creation, remote push, GitHub release assets, npm publication and Pages deployment are distinct actions; perform publication only when authorized. diff --git a/README.md b/README.md index cbaf917..7f2bc62 100644 --- a/README.md +++ b/README.md @@ -25,27 +25,32 @@ You need an agent that supports `SKILL.md`, such as Codex or Claude Code, and ac ### Manual installation without Node.js -Copy or symlink this checkout, or unpack the `.skill` archive, into your agent's skill directory. Keep `SKILL.md`, `references/` and `templates/` together. The scripts, schemas and viewer are optional toolkit resources. Reload your agent and use the skill immediately. +Copy or symlink [skills/database-dependency-migration](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/tree/main/skills/database-dependency-migration), or unpack the `.skill` archive, into your agent's skill directory. Keep its `SKILL.md`, references and templates together. The scripts, schemas and viewer are optional toolkit resources. Reload your agent and use the skill immediately. -Alternatively, clone from your project root: +For a project installation on macOS/Linux, clone the repository and copy its distributable directory: ```sh -git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git .agents/skills/database-dependency-migration +git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git dbdep-skill-source +mkdir -p .agents/skills +cp -R dbdep-skill-source/skills/database-dependency-migration .agents/skills/ ``` For a personal Codex skill on macOS/Linux: ```sh -git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git ~/.agents/skills/database-dependency-migration +mkdir -p ~/.agents/skills +cp -R dbdep-skill-source/skills/database-dependency-migration ~/.agents/skills/ ``` On Windows PowerShell: ```powershell -git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git "$HOME/.agents/skills/database-dependency-migration" +git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git dbdep-skill-source +New-Item -ItemType Directory -Path .agents/skills -Force +Copy-Item -LiteralPath ./dbdep-skill-source/skills/database-dependency-migration -Destination .agents/skills/database-dependency-migration -Recurse ``` -For Claude Code, use `.claude/skills/database-dependency-migration` in a project or `~/.claude/skills/database-dependency-migration` personally. No package installation is needed. +For a personal Windows installation, use `$HOME/.agents/skills` as the destination parent. For Claude Code, use `.claude/skills/database-dependency-migration` in a project or `~/.claude/skills/database-dependency-migration` personally. No package installation is needed. ### Skills CLI @@ -57,7 +62,7 @@ npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --sk This installs into `.agents/skills/database-dependency-migration` in the current project. Replace `codex` with `claude-code`, or add `--global` for a personal installation. Reload your agent and use the skill; there is no follow-up `pnpm install` step. The installer itself requires Node.js 22.20+; manual copying/cloning does not. -Skills CLI copies the repository directory containing the root `SKILL.md`, including development files, website and evaluations. The `.skill` archive excludes the website and evaluation records. Neither installation needs those development files to run a source review. +Skills CLI discovers `skills/database-dependency-migration/` and copies only that directory. It includes the skill guidance, optional toolkit, examples and licenses, while excluding the website, evaluation records, tests and development scripts. The `.skill` archive uses the same checked payload. No contributor build or dependency installation is needed to install or use the skill. ### Updating @@ -65,8 +70,8 @@ Skills CLI copies the repository directory containing the root `SKILL.md`, inclu npx skills@1.7.2 update database-dependency-migration --project # Personal Skills CLI installation: npx skills@1.7.2 update database-dependency-migration --global -# Manual Git project installation: -git -C .agents/skills/database-dependency-migration pull --ff-only +# Manual installation: update the source checkout, then copy its skill directory again. +git -C dbdep-skill-source pull --ff-only ``` For a personal/manual installation, use its actual directory with `git -C`; replace copied files with the updated skill when not using Git. Reload the agent. Only users of the optional toolkit need to refresh runtime dependencies after updating. Keep inputs and reports in the user's workspace, outside the installed skill directory. @@ -114,7 +119,7 @@ node scripts/dbdep.mjs inspect --catalog examples/analytics/catalog.json --out o node scripts/dbdep.mjs demo out/demo --json ``` -`pnpm dbdep ` runs the same entry point. From another working directory, use `node "/scripts/dbdep.mjs" ...`. A local npm tarball can expose `dbdep` through `npm install -g `; no published npm package is assumed. +`pnpm dbdep ` runs the same entry point. From another working directory, use `node "/scripts/dbdep.mjs" ...`. A local npm tarball can expose `dbdep` through `npm install -g `; no published npm package is assumed. The npm tarball supplies the standalone toolkit. Install the complete agent skill through Skills CLI, manual copying or the `.skill` archive. `snapshot` aliases `inspect`. A schema directory contains declarations; it does not replay migrations. Review without a baseline is explicitly partial. Exit **0** means analysis completed, **2** means invalid input/prerequisites, and **3** means a requested policy gate failed. A successful analysis may contain high-risk findings; failed risk gates still write review artifacts. @@ -156,11 +161,12 @@ Open the localhost URL printed by the preview. GitHub Pages deployment is a manu | Path | Contents | | --------------------------------------- | ------------------------------------------------------------------------------------- | -| `SKILL.md`, `agents/` | Agent entry point, task routing and display metadata | +| `skills/database-dependency-migration/` | Discoverable skill entry point and complete, checked installation payload | +| `agents/`, `references/`, `templates/` | Source guidance and metadata copied into the distributable skill | | `src/dbdep/` | Independent model, parser, graph, catalog, hazard, planning, reporting and CLI engine | | `scripts/dbdep.mjs` | Standalone CLI entry point | | `scripts/` | Fixture, packaging, install-smoke and evaluation development tools | -| `schemas/`, `references/`, `templates/` | Canonical schemas, evidence semantics, safety guidance and report template | +| `schemas/` | Canonical model, findings and review schemas | | `assets/viewer/` | Offline report viewer and embedded licensed fonts | | `examples/` | Curated inputs, authentic sanitized capture and generated reports | | `tests/` | Node, browser and isolated live regressions | diff --git a/SECURITY.md b/SECURITY.md index 3a84540..01826d2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,7 +8,7 @@ Use the repository's private vulnerability reporting option when available. Othe ## Trust boundaries -The installed skill contains agent instructions and an optional Node.js toolkit. Ordinary source reviews require no dependency installation or executable toolkit code. Review the toolkit's source and dependencies before choosing to run it; install with `--ignore-scripts`, using the frozen production path when reproducibility is required. The Skills CLI copies the root skill directory, including development files and evaluations; the separate `.skill` archive has a narrower file allowlist. +The installed skill contains agent instructions and an optional Node.js toolkit. Ordinary source reviews require no dependency installation or executable toolkit code. Review the toolkit's source and dependencies before choosing to run it; install with `--ignore-scripts`, using the frozen production path when reproducibility is required. Skills CLI copies only `skills/database-dependency-migration/`; the `.skill` archive uses the same checked payload. Website, evaluation, test and development files stay outside this installation. The analyzer reads supplied SQL and catalog captures as data. It has no migration execution command or API. Live discovery requires an explicitly selected environment variable and read-only mode, uses fixed catalog queries, omits routine bodies and business rows, and hashes stored default-expression trees. Development fixture scripts execute shipped example SQL only in their own disposable cluster or explicitly configured CI fixture database. diff --git a/docs/releases.md b/docs/releases.md index e564eee..b84c0c3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,6 +1,6 @@ # Release procedure -Release only validated `main`. Version 0.1.0 is the first pre-1.0 contract; it does not claim production completeness. Version 0.2.0 adds webpage functionality. Version 0.3.0 replaces the Python toolkit with Node.js, adds web documentation and matches standalone reports to the webpage. Update package.json, SKILL.md metadata, site/package.json, pnpm-lock.yaml and CHANGELOG.md together. The webpage footer and static archive name read their version from package metadata. Preserve historical Python tags and evaluation evidence. +Release only validated `main`. Version 0.1.0 is the first pre-1.0 contract; it does not claim production completeness. Version 0.2.0 adds webpage functionality. Version 0.3.0 replaces the Python toolkit with Node.js, adds web documentation and matches standalone reports to the webpage. Update package.json, skills/database-dependency-migration/SKILL.md metadata, site/package.json, pnpm-lock.yaml and CHANGELOG.md together, then run `pnpm sync:skill` and commit the refreshed distribution. The webpage footer and static archive name read their version from package metadata. Preserve historical Python tags and evaluation evidence. Run formatting/static checks, all offline/browser tests, isolated live tests where available, fixture regeneration checks and npm/.skill install smoke checks. Verify the no-runtime source-review workflow separately from optional toolkit installation; the skill package receipt declares `runtime: none` and `optional_toolkit_runtime: node`. Record actual results and limitations. Inspect staged files for secrets and ignored output leakage. @@ -9,3 +9,5 @@ Commits use ` : ` with a separate e Local commit/tag creation is distinct from remote publishing. Push main and tag, create GitHub release assets or publish to npm only when explicitly requested. A local validation receipt is not evidence that remote CI ran. Do not add passing badges before observing remote results. Build with `pnpm install --frozen-lockfile --ignore-scripts`, `pnpm build`, `pnpm pack --pack-destination dist/v0.3.2`, `pnpm package:skill`, and `pnpm package:site`. Skill packaging checks frontmatter and stages an allowlist; it excludes environments, evaluation outputs and the separate webpage. Run the separately installed creator's validator/evaluation scripts and record their actual results. Those creator-owned scripts may use Python, which is not required by the shipped toolkit. Both skill/site archives normalize ZIP ordering/timestamps. The site archive retains dependency licenses and rejects README/SKILL copies that differ from the current source. Run `pnpm smoke:artifacts` outside the source tree before tagging, then record artifact SHA-256 checksums. Finish package writes before smoke tests consume archives. Rebuild after changing bundled documentation. Check generated inputs separately from committed source hashes, and verify artifact/source consistency before creating the immutable tag. + +Run `pnpm check:skill` before packaging; it compares the committed dedicated skill directory against its source allowlist. The Skills CLI and `.skill` archive must carry the same files. Run the pinned `pnpm smoke:skills --cli ` to verify only the dedicated directory installs and the optional toolkit works outside the checkout. diff --git a/docs/skill-distribution-validation.md b/docs/skill-distribution-validation.md new file mode 100644 index 0000000..a18fdeb --- /dev/null +++ b/docs/skill-distribution-validation.md @@ -0,0 +1,26 @@ +# Dedicated skill distribution validation + +Validated locally on 2026-10-09 using Windows, Node.js 24.15.0, pnpm 12.10.1 and Skills CLI 1.7.2. The source checkout is based on `bee4ca28b803a933e9e8c28ee69bcb8ca7566d6d`; these results cover the dedicated-directory change rather than a published release. + +## Installation size + +The previous project installation in the network-engineering workspace contains 398 files and 14,988,975 bytes. The real Skills CLI smoke installs 82 files and 2,043,247 bytes from `skills/database-dependency-migration/`, an 86.4% reduction in uncompressed file bytes. Runtime dependencies are excluded from both measurements. + +The installed file names and hashes match the dedicated directory exactly. Website, evaluations, tests and development scripts are absent. Source-review instructions, references, templates, agent metadata, optional toolkit resources, examples and licenses remain included. All relative Markdown links resolve within the distribution; developer-only documentation links point to the full repository. + +## Checks performed + +- `pnpm check:skill` verifies the source allowlist and committed distribution. Regression tests also confirm stale source copies and unexpected files fail, synchronization preserves unexpected files for review, and directory links cannot bypass checks. +- `pnpm test` reports 150 passing tests and two skipped live-catalog tests, with no failures. No live database DSN was configured for this packaging change. +- `pnpm verify:examples` confirms all eighteen curated artifacts remain reproducible. +- `pnpm smoke:skills --cli ` installs a current worktree snapshot into an external temporary project, verifies every member hash, installs frozen production dependencies, runs `doctor`, generates three HTML demos and strictly validates all three models. +- `pnpm build` exports all website routes. `pnpm package:site` verifies the canonical README and relocated skill-entry copies, curated public files and retained licenses before archiving. +- Targeted Playwright installation clipboard checks pass for both the home page and documentation page. Clipboard assertions normalize Windows line endings. +- `pnpm pack`, `pnpm package:skill` and `pnpm smoke:artifacts` verify fresh npm-toolkit and unpacked-skill installation outside the checkout. Both toolkits pass `doctor` and generate three strictly validated demo models. The npm tarball contains the standalone toolkit without a partial skill entry point; the complete `.skill` archive matches the Skills CLI payload byte-for-byte. +- Read-only code review and `git diff --check` found no remaining important issues. + +## Maintenance + +Author `SKILL.md` and the installation README in the dedicated directory. Other copies come from the repository's source files through `pnpm sync:skill`; include regenerated files with each relevant source change. CI checks synchronization before tests and runs the real installer smoke. Historical tags and evaluation records retain their original paths and evidence. + +These are local results. No remote push, release publication, npm publication or Pages deployment is included. diff --git a/docs/superpowers/plans/2026-10-09-slim-skill-installation.md b/docs/superpowers/plans/2026-10-09-slim-skill-installation.md new file mode 100644 index 0000000..4723ed6 --- /dev/null +++ b/docs/superpowers/plans/2026-10-09-slim-skill-installation.md @@ -0,0 +1,14 @@ +# Slim skill installation + +The user approved a dedicated `skills/database-dependency-migration/` directory on 2026-10-09. + +Move the canonical skill entry point there so the existing Skills CLI command discovers only the distributable directory. Keep toolkit source files at the repository root and generate committed copies with an explicit allowlist. Use that same payload for `.skill` archives. Preserve the optional toolkit, its production lockfile, examples, source-review references and licenses. + +Execute this plan inline in an isolated worktree. Leave the reviewed changes in the original checkout for the user. + +- [x] Add a regression in `tests/node/skill-distribution.test.mjs` that requires a discoverable, self-contained nested skill without website, evaluations, tests or developer scripts. Run it before implementation and confirm the missing directory fails. +- [x] Move `SKILL.md` into the dedicated directory and write its installation README. Add `scripts/skill-distribution.mjs` and `scripts/sync-skill.mjs` to collect, generate and check the resource allowlist. Reject stale or unexpected members. Add `sync:skill` and `check:skill` commands, and make `scripts/package-skill.mjs` archive the same checked payload. +- [x] Update root README, contributing/release instructions, changelog, bilingual installation documentation, npm file list and website copy/validation paths. Update website fixture tests for the nested canonical entry point. Preserve historical receipts and frozen evaluations. +- [x] Update `scripts/smoke-skills-install.mjs` to compare the installed files against the dedicated directory rather than the entire repository, assert exclusion of developer files and report installed bytes. Add the synchronization check and real installer smoke to CI. +- [x] Run `pnpm check:skill`, all Node tests, `pnpm verify:examples`, the pinned Skills CLI installation smoke, website build/publication checks and npm/skill artifact installation smoke. Confirm `doctor`, generated HTML and all three strict model validations work outside the checkout. +- [x] Review the diff and copy the verified change into the original clean checkout. Check the original directory and report the measured reduction and checks actually performed. diff --git a/package.json b/package.json index 0f8a8c9..4f68761 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "assets/viewer", "examples", "references", - "SKILL.md", "agents", "templates", "README.md", @@ -44,6 +43,8 @@ "verify:examples": "node scripts/verify-examples.mjs", "benchmark": "node scripts/benchmark.mjs", "package:skill": "node scripts/package-skill.mjs", + "sync:skill": "node scripts/sync-skill.mjs", + "check:skill": "node scripts/sync-skill.mjs --check", "package:site": "node scripts/package-site.mjs", "smoke:artifacts": "node scripts/smoke-artifacts.mjs", "smoke:skills": "node scripts/smoke-skills-install.mjs", diff --git a/scripts/check-site-publication.mjs b/scripts/check-site-publication.mjs index 07e6a22..8fdd043 100644 --- a/scripts/check-site-publication.mjs +++ b/scripts/check-site-publication.mjs @@ -3,7 +3,14 @@ import { readdirSync, readFileSync, lstatSync } from "node:fs"; import { join, resolve, relative } from "node:path"; import { fileURLToPath } from "node:url"; -import { ROOT, files, sha256, save, verify_built_docs } from "./tooling.mjs"; +import { + ROOT, + SKILL_PATH, + files, + sha256, + save, + verify_built_docs, +} from "./tooling.mjs"; export function check_site_publication( root = ROOT, @@ -12,7 +19,7 @@ export function check_site_publication( verify_built_docs(root, built); const copies = new Map([ ["docs/README.md", join(root, "README.md")], - ["docs/SKILL.md", join(root, "SKILL.md")], + ["docs/SKILL.md", join(root, SKILL_PATH)], ["favicon.svg", join(root, "site/public/favicon.svg")], [".nojekyll", join(root, "site/public/.nojekyll")], ["THIRD_PARTY_NOTICES.md", join(root, "site/THIRD_PARTY_NOTICES.md")], diff --git a/scripts/package-skill.mjs b/scripts/package-skill.mjs index ec894f3..bc63837 100644 --- a/scripts/package-skill.mjs +++ b/scripts/package-skill.mjs @@ -1,57 +1,19 @@ #!/usr/bin/env node -import { readFileSync } from "node:fs"; -import { relative, join, resolve } from "node:path"; -import { ROOT, VERSION, files, archive, save } from "./tooling.mjs"; +import { join, resolve } from "node:path"; +import { ROOT, VERSION, archive, save } from "./tooling.mjs"; +import { check_skill, skill_payloads } from "./skill-distribution.mjs"; const outIndex = process.argv.indexOf("--out"); const out = outIndex >= 0 ? resolve(process.argv[outIndex + 1]) : join(ROOT, "dist", `v${VERSION}`); -const skill = readFileSync(join(ROOT, "SKILL.md"), "utf8"); -if ( - !/^---\r?\n[\s\S]*?\r?\n---/m.test(skill) || - !/^name: database-dependency-migration$/m.test(skill) || - !/^description: .{20,}$/m.test(skill) -) - throw new Error("Skill frontmatter is invalid"); -const payloads = {}; -const add = (name, source) => { - payloads[`database-dependency-migration/${name}`] = readFileSync(source); -}; -for (const name of [ - "SKILL.md", - "README.md", - "CONTRIBUTING.md", - "docs/roadmap.md", - "LICENSE", - "SECURITY.md", - "THIRD_PARTY_NOTICES.md", - "package.json", - "pnpm-lock.yaml", -]) - add(name, join(ROOT, name)); -for (const folder of [ - "src/dbdep", - "scripts", - "schemas", - "assets/viewer", - "examples", - "references", - "agents", - "templates", -]) { - for (const p of files(join(ROOT, folder))) { - const name = relative(ROOT, p).replaceAll("\\", "/"); - if ( - name.endsWith(".py") || - name.includes("/__pycache__/") || - name.endsWith(".png") - ) - continue; - if (folder === "scripts" && !name.endsWith(".mjs")) continue; - add(name, p); - } -} +check_skill(); +const payloads = Object.fromEntries( + Object.entries(skill_payloads()).map(([name, data]) => [ + `database-dependency-migration/${name}`, + data, + ]), +); const receipt = { ...archive(join(out, "database-dependency-migration.skill"), payloads), runtime: "none", @@ -60,6 +22,8 @@ const receipt = { excluded: [ "site", "evals", + "tests", + "development scripts", "environments", "git", "screenshots", diff --git a/scripts/skill-distribution.mjs b/scripts/skill-distribution.mjs new file mode 100644 index 0000000..621cf61 --- /dev/null +++ b/scripts/skill-distribution.mjs @@ -0,0 +1,185 @@ +import { + existsSync, + lstatSync, + readdirSync, + readFileSync, + mkdirSync, + writeFileSync, +} from "node:fs"; +import { dirname, join, relative, posix } from "node:path"; +import { ROOT, files } from "./tooling.mjs"; + +export const SKILL_DIRECTORY = "skills/database-dependency-migration"; +const repository = + "https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/blob/main/"; + +export function skill_payloads(root = ROOT) { + const payloads = {}; + const add = (name, source) => { + payloads[name] = readFileSync(source); + }; + for (const name of ["SKILL.md", "README.md"]) + add(name, join(root, SKILL_DIRECTORY, name)); + const skill = payloads["SKILL.md"].toString("utf8"); + if ( + !/^---\r?\n[\s\S]*?\r?\n---/m.test(skill) || + !/^name: database-dependency-migration$/m.test(skill) || + !/^description: .{20,}$/m.test(skill) + ) + throw new Error("Skill frontmatter is invalid"); + for (const name of [ + "LICENSE", + "SECURITY.md", + "THIRD_PARTY_NOTICES.md", + "pnpm-lock.yaml", + "docs/roadmap.md", + "scripts/dbdep.mjs", + ]) + add(name, join(root, name)); + for (const folder of [ + "src/dbdep", + "schemas", + "assets/viewer", + "examples", + "references", + "agents", + "templates", + ]) + for (const source of files(join(root, folder))) { + const name = relative(root, source).replaceAll("\\", "/"); + if ( + name.endsWith(".png") || + name.endsWith(".py") || + name.includes("/__pycache__/") + ) + continue; + add(name, source); + } + const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8")); + payloads["package.json"] = Buffer.from( + JSON.stringify( + { + ...manifest, + scripts: { + dbdep: "node scripts/dbdep.mjs", + demo: "node scripts/dbdep.mjs demo out/demo --json", + }, + files: [ + "src/dbdep/*.mjs", + "scripts/dbdep.mjs", + "schemas", + "assets/viewer", + "examples", + "references", + "SKILL.md", + "agents", + "templates", + "README.md", + "CONTRIBUTING.md", + "docs/roadmap.md", + "pnpm-lock.yaml", + "LICENSE", + "SECURITY.md", + "THIRD_PARTY_NOTICES.md", + ], + }, + null, + 2, + ) + "\n", + ); + payloads["CONTRIBUTING.md"] = Buffer.from( + "# Contributing\n\nThis directory contains the installed skill and optional toolkit. Development takes place in the full repository. Read the [contributing guide](" + + repository + + "CONTRIBUTING.md) for workspace setup, tests and release instructions.\n", + ); + // Documents about unbundled development resources link to the full repository. + for (const [name, data] of Object.entries(payloads)) { + if (!name.endsWith(".md")) continue; + payloads[name] = Buffer.from( + data.toString("utf8").replace(/\]\(([^)\s]+)\)/g, (match, link) => { + if (/^(?:[a-z][a-z0-9+.-]*:|#)/i.test(link)) return match; + const [path, anchor] = link.split("#"); + const target = posix.normalize(posix.join(posix.dirname(name), path)); + if (payloads[target]) return match; + return "](" + repository + target + (anchor ? "#" + anchor : "") + ")"; + }), + ); + } + return payloads; +} + +function verify_regular_paths(root, names) { + for (const name of ["", ...names]) { + let path = root; + for (const component of (SKILL_DIRECTORY + "/" + name).split("/")) { + path = join(path, component); + if (existsSync(path) && lstatSync(path).isSymbolicLink()) + throw new Error( + "Skill distribution must contain regular files and directories", + ); + } + } +} + +function distribution_files(root) { + verify_regular_paths(root, []); + const walk = (directory) => + readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + if (entry.isSymbolicLink()) + throw new Error( + "Skill distribution must contain regular files and directories", + ); + const path = join(directory, entry.name); + return entry.isDirectory() ? walk(path) : entry.isFile() ? [path] : []; + }); + return walk(join(root, SKILL_DIRECTORY)); +} + +export function check_skill(root = ROOT) { + const payloads = skill_payloads(root); + const directory = join(root, SKILL_DIRECTORY); + const names = distribution_files(root).map((path) => + relative(directory, path).replaceAll("\\", "/"), + ); + verify_regular_paths(root, [...Object.keys(payloads), ...names]); + const stale = Object.keys(payloads).filter( + (name) => + !existsSync(join(directory, name)) || + !payloads[name].equals(readFileSync(join(directory, name))), + ); + const unexpected = names.filter((name) => !payloads[name]); + if (stale.length || unexpected.length) + throw new Error( + "Skill distribution is stale; run pnpm sync:skill. " + + JSON.stringify({ stale, unexpected }), + ); + return { + directory: SKILL_DIRECTORY, + members: names.length, + bytes: Object.values(payloads).reduce( + (sum, value) => sum + value.length, + 0, + ), + }; +} + +export function sync_skill(root = ROOT) { + const payloads = skill_payloads(root); + const directory = join(root, SKILL_DIRECTORY); + verify_regular_paths(root, Object.keys(payloads)); + const unexpected = distribution_files(root) + .map((path) => relative(directory, path).replaceAll("\\", "/")) + .filter((name) => !payloads[name]); + if (unexpected.length) + throw new Error( + "Remove unexpected distribution files before syncing: " + + unexpected.join(", "), + ); + for (const [name, data] of Object.entries(payloads)) { + const path = join(directory, name); + mkdirSync(dirname(path), { recursive: true }); + if (!existsSync(path) || !readFileSync(path).equals(data)) + writeFileSync(path, data); + } + return check_skill(root); +} diff --git a/scripts/smoke-skills-install.mjs b/scripts/smoke-skills-install.mjs index 1a8bd19..344cc24 100644 --- a/scripts/smoke-skills-install.mjs +++ b/scripts/smoke-skills-install.mjs @@ -21,6 +21,7 @@ import { save, sha256, } from "./tooling.mjs"; +import { SKILL_DIRECTORY, check_skill } from "./skill-distribution.mjs"; const SKILLS_VERSION = "1.7.2"; const { values } = parseArgs({ @@ -92,6 +93,7 @@ function sensitive(name) { } try { + receipt.distribution = check_skill(); const location = relative(ROOT, temporary); if ( !isAbsolute(location) && @@ -156,16 +158,31 @@ try { const copied = files(installed).map((path) => relative(installed, path).replaceAll("\\", "/"), ); - const missing = Object.keys(payloads).filter( + const distributionPrefix = SKILL_DIRECTORY + "/"; + const expected = Object.fromEntries( + Object.entries(payloads) + .filter(([name]) => name.startsWith(distributionPrefix)) + .map(([name, data]) => [name.slice(distributionPrefix.length), data]), + ); + const missing = Object.keys(expected).filter( (name) => !copied.includes(name), ); const changed = copied.filter( (name) => - !payloads[name] || - sha256(readFileSync(join(installed, name))) !== sha256(payloads[name]), + !expected[name] || + sha256(readFileSync(join(installed, name))) !== sha256(expected[name]), ); receipt.installed_contents = { members: copied.length, + bytes: copied.reduce( + (sum, name) => sum + readFileSync(join(installed, name)).length, + 0, + ), + developer_files: copied.filter( + (name) => + /^(site|evals|tests|\.github)\//.test(name) || + (name.startsWith("scripts/") && name !== "scripts/dbdep.mjs"), + ), missing, changed, sensitive: copied.filter(sensitive), @@ -173,6 +190,7 @@ try { if ( missing.length || changed.length || + receipt.installed_contents.developer_files.length || receipt.installed_contents.sensitive.length ) throw new Error( diff --git a/scripts/sync-skill.mjs b/scripts/sync-skill.mjs new file mode 100644 index 0000000..396db28 --- /dev/null +++ b/scripts/sync-skill.mjs @@ -0,0 +1,8 @@ +#!/usr/bin/env node +import { check_skill, sync_skill } from "./skill-distribution.mjs"; + +console.log( + JSON.stringify( + process.argv.includes("--check") ? check_skill() : sync_skill(), + ), +); diff --git a/scripts/tooling.mjs b/scripts/tooling.mjs index e46aaaf..2b87285 100644 --- a/scripts/tooling.mjs +++ b/scripts/tooling.mjs @@ -13,6 +13,7 @@ import { createHash } from "node:crypto"; import { zipSync, unzipSync } from "fflate"; export const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +export const SKILL_PATH = "skills/database-dependency-migration/SKILL.md"; export const VERSION = JSON.parse( readFileSync(join(ROOT, "package.json"), "utf8"), ).version; @@ -30,7 +31,7 @@ export function resolve_npm_cli(executable = process.execPath) { export function verify_built_docs(root, built) { for (const name of ["README.md", "SKILL.md"]) { if ( - !readFileSync(join(root, name)).equals( + !readFileSync(join(root, name === "SKILL.md" ? SKILL_PATH : name)).equals( readFileSync(join(built, "docs", name)), ) ) diff --git a/site/scripts/prepare-demos.mjs b/site/scripts/prepare-demos.mjs index 717dcf7..3a5f276 100644 --- a/site/scripts/prepare-demos.mjs +++ b/site/scripts/prepare-demos.mjs @@ -142,7 +142,12 @@ await writeFile( await mkdir(resolve(site, "public/docs"), { recursive: true }); for (const filename of ["README.md", "SKILL.md"]) { await copyFile( - resolve(root, filename), + resolve( + root, + filename === "SKILL.md" + ? "skills/database-dependency-migration/SKILL.md" + : filename, + ), resolve(site, "public/docs", filename), ); } diff --git a/site/src/Home.tsx b/site/src/Home.tsx index 2ed415e..de9b63d 100644 --- a/site/src/Home.tsx +++ b/site/src/Home.tsx @@ -11,7 +11,7 @@ import { useSitePreferences } from "./preferences-context"; import Link from "next/link"; const installCommand = - "git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git .agents/skills/database-dependency-migration"; + "git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git dbdep-skill-source\nmkdir -p .agents/skills\ncp -R dbdep-skill-source/skills/database-dependency-migration .agents/skills/"; function MagneticAction({ children }: { children: ReactNode }) { const reduced = useReducedMotion(); diff --git a/site/src/docs.ts b/site/src/docs.ts index e03c874..3f052ae 100644 --- a/site/src/docs.ts +++ b/site/src/docs.ts @@ -46,7 +46,7 @@ type DocsCopy = { }; const install = - "git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git .agents/skills/database-dependency-migration"; + "git clone https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer.git dbdep-skill-source\nmkdir -p .agents/skills\ncp -R dbdep-skill-source/skills/database-dependency-migration .agents/skills/"; const toolkitInstall = "npm install --omit=dev --ignore-scripts --package-lock=false\nnode scripts/dbdep.mjs doctor --json"; const inspect = @@ -119,7 +119,7 @@ const en: DocsCopy = { { title: "Install and use the skill", paragraphs: [ - "You need an agent that supports SKILL.md and access to the files you want reviewed. No Node.js, pnpm, package installation, build or database server is needed. Clone or copy the skill into your agent's skill directory, reload the agent, and ask it to review your sources.", + "You need an agent that supports SKILL.md and access to the files you want reviewed. No Node.js, pnpm, package installation, build or database server is needed. Copy the repository's skills/database-dependency-migration directory into your agent's skill directory, reload the agent, and ask it to review your sources.", ], code: [ { @@ -132,7 +132,7 @@ const en: DocsCopy = { { title: "Connect your coding agent", paragraphs: [ - "Keep SKILL.md, references and templates together. Scripts, schemas and viewer assets are optional toolkit resources. You can also install with npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --skill database-dependency-migration --agent codex --copy. The Skills CLI itself needs Node.js 22.20+; manual copying or cloning does not. Neither route requires a follow-up pnpm install.", + "Keep SKILL.md, references and templates together. Scripts, schemas and viewer assets are optional toolkit resources. You can also install with npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --skill database-dependency-migration --agent codex --copy. It installs only the dedicated skill directory, without website, evaluation or development files. The Skills CLI itself needs Node.js 22.20+; manual copying does not. Neither route requires a follow-up pnpm install.", ], table: { headings: [ @@ -595,7 +595,7 @@ const es: DocsCopy = { { title: "Instala y usa la skill", paragraphs: [ - "Necesitas un agente compatible con SKILL.md y acceso a los archivos. No necesitas Node.js, pnpm, instalar paquetes, compilar ni un servidor de base de datos. Clona o copia la skill al directorio de skills de tu agente, vuelve a cargarlo y pide la revisión.", + "Necesitas un agente compatible con SKILL.md y acceso a los archivos. No necesitas Node.js, pnpm, instalar paquetes, compilar ni un servidor de base de datos. Copia skills/database-dependency-migration desde el repositorio al directorio de skills de tu agente, vuelve a cargarlo y pide la revisión.", ], code: [ { @@ -608,7 +608,7 @@ const es: DocsCopy = { { title: "Conecta tu agente", paragraphs: [ - "Conserva SKILL.md, las referencias y las plantillas juntas. Scripts, esquemas y visor son recursos del toolkit opcional. TambiĆ©n puedes instalar con npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --skill database-dependency-migration --agent codex --copy. Skills CLI necesita Node.js 22.20+; copiar o clonar manualmente no. Ninguna opción requiere pnpm install despuĆ©s.", + "Conserva SKILL.md, las referencias y las plantillas juntas. Scripts, esquemas y visor son recursos del toolkit opcional. TambiĆ©n puedes instalar con npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --skill database-dependency-migration --agent codex --copy. Solo instala el directorio dedicado de la skill, sin el sitio web, evaluaciones ni archivos de desarrollo. Skills CLI necesita Node.js 22.20+; copiar manualmente no. Ninguna opción requiere pnpm install despuĆ©s.", ], table: { headings: [ diff --git a/skills/database-dependency-migration/CONTRIBUTING.md b/skills/database-dependency-migration/CONTRIBUTING.md new file mode 100644 index 0000000..bcd8692 --- /dev/null +++ b/skills/database-dependency-migration/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing + +This directory contains the installed skill and optional toolkit. Development takes place in the full repository. Read the [contributing guide](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/blob/main/CONTRIBUTING.md) for workspace setup, tests and release instructions. diff --git a/skills/database-dependency-migration/LICENSE b/skills/database-dependency-migration/LICENSE new file mode 100644 index 0000000..4dff0f0 --- /dev/null +++ b/skills/database-dependency-migration/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 whetstone-dev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/skills/database-dependency-migration/README.md b/skills/database-dependency-migration/README.md new file mode 100644 index 0000000..01a63c8 --- /dev/null +++ b/skills/database-dependency-migration/README.md @@ -0,0 +1,36 @@ +# Database dependency migration + +Review PostgreSQL migrations and database consumers in SQL, EF Core/C#, Prisma and TypeORM sources. Read [SKILL.md](SKILL.md) for the agent workflow. Source review requires no runtime setup and never executes migrations. + +## Installation + +From the project where you want to use the skill: + +```sh +npx skills@1.7.2 add whetstone-dev/Database-Dependency-Migration-Visualizer --skill database-dependency-migration --agent codex --copy +``` + +This installs into `.agents/skills/database-dependency-migration` in the current project. Replace `codex` with `claude-code` for that agent. Add `--global` for a personal installation. The Skills CLI requires Node.js 22.20+. + +For installation without Node.js, copy this directory into your agent's skill directory or unpack the `.skill` release archive. Keep its references, templates and agent metadata together. Reload your agent and ask it to use `database-dependency-migration` to review your actual schema, migration and application files. + +The package contains source-review guidance, the optional toolkit, examples and licenses. Website, evaluations, tests and development scripts stay in the full repository. + +## Optional toolkit + +Normal source review needs no dependency installation. For validated JSON and interactive HTML reports, install the optional runtime inside this directory with Node.js 22.18+: + +```sh +npm install --omit=dev --ignore-scripts --package-lock=false +node scripts/dbdep.mjs doctor --json +``` + +For frozen transitive dependencies, use pnpm 12.10.1 instead: + +```sh +pnpm install --prod --frozen-lockfile --ignore-workspace --ignore-scripts +``` + +Run the toolkit from your workspace with `node "/scripts/dbdep.mjs" ...`. Keep inputs and generated reports outside this installed directory. Read [toolkit usage](references/toolkit.md), [source analysis](references/source-analysis.md), [the report outline](templates/review-report.md), [security](SECURITY.md) and [license notices](THIRD_PARTY_NOTICES.md). + +The [full repository](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer) contains the website, contributor tools and evaluation records. diff --git a/skills/database-dependency-migration/SECURITY.md b/skills/database-dependency-migration/SECURITY.md new file mode 100644 index 0000000..78def37 --- /dev/null +++ b/skills/database-dependency-migration/SECURITY.md @@ -0,0 +1,21 @@ +# Security policy + +The latest locally validated release is v0.3.2. Support focuses on the latest release; older tags and evaluation records remain historical evidence. A local tag does not establish publication or a deployed website. + +## Report a vulnerability + +Use the repository's private vulnerability reporting option when available. Otherwise contact a maintainer privately before sharing an exploit that includes private database details. Public issues may describe a sanitized problem, affected version and reproduction using synthetic SQL. Do not include credentials, production captures or private schema names. + +## Trust boundaries + +The installed skill contains agent instructions and an optional Node.js toolkit. Ordinary source reviews require no dependency installation or executable toolkit code. Review the toolkit's source and dependencies before choosing to run it; install with `--ignore-scripts`, using the frozen production path when reproducibility is required. Skills CLI copies only `skills/database-dependency-migration/`; the `.skill` archive uses the same checked payload. Website, evaluation, test and development files stay outside this installation. + +The analyzer reads supplied SQL and catalog captures as data. It has no migration execution command or API. Live discovery requires an explicitly selected environment variable and read-only mode, uses fixed catalog queries, omits routine bodies and business rows, and hashes stored default-expression trees. Development fixture scripts execute shipped example SQL only in their own disposable cluster or explicitly configured CI fixture database. + +Reports reject pre-existing symlink/junction output paths and replace ordinary files atomically. The CLI protects selected input files from output overwrites. These checks do not isolate a process from another user who can concurrently replace its directories. Run in a workspace you control and select a separate output directory. + +SQL literals and comments are omitted from generated models. Recognizable DSN/password markers are rejected, but this is not exhaustive secret detection. Names, paths and metadata can still be sensitive. Reports and local catalog snapshots are private unless deliberately reviewed for sharing. The standalone explorer and creator evaluation viewers work offline; the public website contains curated examples only. + +Input size and graph traversal are not globally resource-limited. Unsupported SQL resolution remains UNKNOWN. Read-only discovery and static findings do not establish a production migration's correctness, lock duration or downtime. + +See the [security boundary](references/security.md), [catalog contract](references/postgres-catalog.md), [local audit](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/blob/main/docs/security-audit.md), and [Pages publication setup](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/blob/main/docs/github-pages.md). diff --git a/SKILL.md b/skills/database-dependency-migration/SKILL.md similarity index 100% rename from SKILL.md rename to skills/database-dependency-migration/SKILL.md diff --git a/skills/database-dependency-migration/THIRD_PARTY_NOTICES.md b/skills/database-dependency-migration/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..afb4de2 --- /dev/null +++ b/skills/database-dependency-migration/THIRD_PARTY_NOTICES.md @@ -0,0 +1,24 @@ +# Third-party notices + +This repository's original code uses the MIT license in LICENSE. Archify and network-engineering informed architecture; their dependency engines were not imported. Installed Emil and Apple skills informed interface and motion decisions. + +Runtime dependencies install separately using the exact workspace lockfile: + +| Component | Version | License | +|---|---|---| +| libpg-query JavaScript wrapper | 18.1.5 | MIT; embedded PostgreSQL/libpg_query code retains its upstream notices | +| Ajv | 8.20.0 | MIT | +| ajv-formats | 3.0.1 | MIT | +| pg | 8.23.1 | MIT | +| pg-connection-string | 2.14.1 | MIT | +| Commander | 15.0.0 | MIT | +| Playwright, development | 1.56.0 | Apache-2.0; browser binaries retain their own notices | +| fflate, packaging | 0.8.3 | MIT | +| Prettier, development | 3.9.9 | MIT | +| Archivo and IBM Plex Mono embedded fonts | retained font files | SIL Open Font License 1.1 | + +Complete font licenses are in assets/viewer and embedded in each standalone report's HTML comment. Consult installed package licenses when distributing dependencies together. The npm tarball and Agent Skill package include original source/resources and licensed font files; runtime dependencies and browser binaries install separately. + +The separate site application uses pinned GSAP, Lenis, React and Motion dependencies. It includes application-specific React Bits adaptations at a recorded upstream commit under MIT + Commons Clause. Complete retained licenses, source hashes and adaptation notes are in [site/THIRD_PARTY_NOTICES.md](https://github.com/whetstone-dev/Database-Dependency-Migration-Visualizer/blob/main/site/THIRD_PARTY_NOTICES.md). Those webpage components are excluded from the Agent Skill package. + +Historical v0.1.0 and v0.2.0 releases used Python, pglast and psycopg. Their licenses and validation records remain part of those tagged releases; they are not dependencies of v0.3.0. diff --git a/skills/database-dependency-migration/agents/openai.yaml b/skills/database-dependency-migration/agents/openai.yaml new file mode 100644 index 0000000..547b6ac --- /dev/null +++ b/skills/database-dependency-migration/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Database dependency migration" + short_description: "Review PostgreSQL dependencies and migration risks" + default_prompt: "Use $database-dependency-migration to review my PostgreSQL migration and SQL or ORM consumers directly from source files. Cite evidence, list affected objects and risks, and keep unresolved dependencies explicit." diff --git a/skills/database-dependency-migration/assets/viewer/archivo-LICENSE b/skills/database-dependency-migration/assets/viewer/archivo-LICENSE new file mode 100644 index 0000000..78b7453 --- /dev/null +++ b/skills/database-dependency-migration/assets/viewer/archivo-LICENSE @@ -0,0 +1,93 @@ +Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo) Archivo-Italic[wdth,wght].ttf: Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/skills/database-dependency-migration/assets/viewer/archivo-latin-wght-normal.woff2 b/skills/database-dependency-migration/assets/viewer/archivo-latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..716d4abd199a236dc4b9e112f63429b9b47ce911 GIT binary patch literal 34928 zcmV(`K-0f>Pew8T0RR910Eln^6aWAK0bU>g0Ehel0RR9100000000000000000000 z0000QgIF8qbR3HYKS)+VQiT!*U_Vn-K~#ZGCoTYmE-!u&2nvDGK!Kq?3xr+(FoL`~ z0X7081Bo~UAO(s%2aJ6T2U}f2QNmOi(A}svt5j!*n;$tF(YkE}6xz!1Br_{&)@YT5 z=>JbiI%I5c9q{pIX$5)&orq*Q3`TKIN!=^Al-q1nRdsjj6(G4fy$KE{hcCMC6$7(( zN>`d*%h`0MA&8GQ?hY+qg`~X=L9bQFp_TQ>e9!wnKxg@3a=htp{!#YH@FK!{jcVk! zLU^P{^WZYy14`~9uyGk9S#{P6|5082pBs@?)yRR=GY=mGR}@x64$sf6_x~ywFxJh0 z1q&E#V`Bpb3|b;bv?3xPDq)=!=qX0!VZ|AJXXKr6p68tx#+{xrq|^6LWKitj;{vBC zAx(ekG|0~9Wi0{((6M9D5%c`_WB*(G+^;~TnNHVG+>>j5Qpse7QYev5^GYas{ztd! zk0I+irVtVs#NrTzU>-uili5sI^P;-y-c{9A&2?ApyVhlRoxVLgKp!~21U&Voq02_D zO55FB0KVj75<3QzSr)<*uq6XQiRU$)4fIczRfq>Vvkd9X|7K;DEy=QoM@VLwHUyvW z80zEocMgj3it>tz2$RPlSoTl-S-q{xrm!<2{@c-X5rTgY4M?2|CDHR5g zQX!1>eJpFglyT`wYYpH47#M&WfX?5WT9*C?40oDqu^#fA8le`H{76+wxg3(RCNj=- zzt=s#4VtjjlHeE;v!ewuBP~G6U^p5T8r^6BWRv5#o?34y^@RHy>&ugdXJ;C93yiAr9sDi@-z>aiKB6EKU1#t$evW0@R zVSS%ccCy!ik1zxgkwzM6LgR`^kRiMGzlLvV&NPPdmK<6Kp*{Y5?L;@oHpPQcJjy^; zz>p1BEC@NqTK|q$>t40zp&c+H5h)rWqPf2QAB{i|!f7jNerGUPAd*0&mJTs9dXUf%1%#LqfsjVwKtR9%dI2IZu+UHt00bi*2uKtLv^DU5skAD9MoRz;fRt`7 zxuUzuxh}dbzT>znyvM#TyI*|2-1_PH``h<#y#LgL+aKKX==Mj?KECboE8@yVw0YCU zEgQFP+_iDv)7zfj`ShM=C!XE*?9ONRY~Hu|#MaW*16z-7-?Dwr_R~AJ?%ezQ-eH^r zD;;hQ&kXM#KD+zG?lYsCN6(C2aXWi=?>)6Y|NNBaXTL}e(t}f9p7HX6SNmUG`^$+p z({C9A(`1@XyVHetM;v$4<4-OUU9JtQ;iMq(~5ov3jH1^!cUcmFA7sOxu;WI#5l^tFo@lDunZ7=(FDMG+5iG7 zfMt+_9`_9h^$ZPZCV0?LKy|fiy~92lXb_Ep0jyEe?ab}&ax&%aiRBu?Z?7*mP-@L)`A-+X!s~kJH zK#dm*8P?cUa15g;9;i(pkyh8^Ws1(Pp?NL>{-LsXGk<3cwI^PvRm^kLxp)=XS+w1L z_T{5K-p@a5*cLzJ`5HgwKl?QlYYb=w;&V@o_rc9@F`V3U@CJLrmat^cY(PJ$&sYBk zeub~#t;2k(qq-_U07XDB4c5bfK!PB)J@>;o-2ehqpXmwD5)nG-y=ph4Q$@5)*GyHnv z@6WrFH$3>vyPw`zoE#m_19*2GP4qgWZ_m1tHZ;&o%-vaat0Y^zV_KD@qKCGmp7%Ai z9yz+TaEnW|yt($+Zr_sP(nI2&P(69uu>kVJ9V>5lD?)3}d8Y9y2AD}7tqiGI zScpA+Kth^JZF~0*p8L;PyWjK+%fmb5n|z5+^A2zJ5>IoNTRjpzGBl<+5&qwDduW$! z$hO%UU`hLFHo=-LU@n+X7+AmGom4kCqC_(Zs*H==k?A%1vRhzI4{ z^P#Ay6}ISOIvYa4TYe7S`lN;WfRO>de5^RYml?)L%x75Z+|8pfFu95E=Vwk|PCzaURQK z=_(fD43^M7JSix%4h{`k7%-DeOb7aWZm2CFCM9D=rUF=l3cmntDkYE7BMOfcjp<>v z?LoJ5B+B}sHk5fm9gDAoN;V_eX+|lp(Ig6@Zlg?ljqf!&5(>IZXtQ_lcB>uPBq;j_^|ow)s+M8^SYTDLs+GI3NdhoEb%)nK7#tMLM5Jb~qn%FPT%p zw#SUn6k+}kt`!i{TSFL7O@0p5a)6i2$U<U_eS%&!|uz!zbFZ zXpgpfN__HX(np$3Fd@~X>8D1kn3$$AGgVV)O(QHL)QC4rCtaB#Z@v|nXOOv`Rc0^G z#948L5+hq{Z3(6tN-)VpMgNngs`<=}Bp+-^q=jakV~lT*V#X5MMpd$8hUmzw>BcdW zRGmY$I!Mf-9*Jvp2`u* zqe;lf-a+%HX(563tn^H3;Tv7JY&H}{oDt0Eog$o@8T2u;&#f0Nv35|(k&#t~%BTT_ zwFc^06yQlup-k|JPo6h>gaLYuYt>zgs;2IyvUTXus@Y@MhBwPSC? zXB3kma_vVEKE_vo9EM$gfN;&s_86AXZGwEj=nOFoYTtn)wC+H)7D7s~^>9A&v?8mG z)XujTqy_@cMimh24k#H8vt-50a;XkX7b~L_m0bo1A~dP|EYd{L2=>bk3p}_xzytTL z3|zp#7VaQWQ*ohmbO6|;>gQ6>Z#zHu+v(1k_UQQ2WH`p@a_+hNMc-SnAJRsOOES3* zY|up2zLwU6wM|R=CuMeS1#l zZEK%kiig!LeIVUNd-cbyOuW^&@9LI$nY7S9)?~W2HSC@QmN{CddwA3`Q}4T87g_JR z?ACLZTirI;tZCx_M`~t&MDOUqkm6=`XLYWn)+o_8Dalo5Mwy~XW;Uo}Bt~;VB1c~j zTegilkJUKSid!y$+shpN`R7-9=b@NuL&mK+y$0q43q;<+ zcE-5|rMweC*Sx;9yb92)$By7Ui6H{PXL7q5BaQp4foY;zdz8^_^kv!pt)$fyK3=}P z8{DdIxWr4cy9AwEN?Y<;VCbY>Y-64!ZP=5X?c=h0}KR>Qs0&5RYze+UnULBbJ}o*%<|vB~w4@`RdqDI2&wi#Ju$ z{X4de0e3j2Um5*D&x3YzG4#)^EoeK#qi&AdwMrRQAAtRE^`FFLADPb2#j9<7 zPDXp_tLG(O=CP1&Ido0NuS%=$`2004D(U`J8=hwaWlEFhy~hsP|rwLkG#!s19&8>>zL;AwUEs ztOLVICJ`kV4HzvV5feou12jg_NSKszW)=jj6N^s|ba93yxM6%>61yIiDAu+3(^}JT?nL73LAk@i~aB2-eOVxHktDo??|F{Q3 zaTLhm!$XF24%hT`j;4<3(MEy~)GQA0Yc7Dng?Ddz4#JTzJM?Vn2=&2Vsn(`Bf!zNu z8u72+?uqun-mrDrBQlr`Lh!@y1Hb-s5iHbkV=A{1Od9^luSla7J*J+S{V}JVaoZ2> zc$`qEJPma5K1d>&6nvzTMmptGP)UF)s;Qxt2AY`oB*g3)fS!|&I_hblktUjHp_O(z z=%kBodg!B{0R|bO=F?!--V68D-GyaD2+UV_bqtgSc>@Lrkf1<=0Sj(lPiJ>6UXn;A z1s|!Tk^X2#122`FuD%u6+P6u11*jxI71h*G>vdV|=8Zmk>^rU-JTT!&-zb*OS~1}Bh_Q&3X5sL7JMB{BGHvHlWT z!C9B}B6tLC3^T$gV~jJwBvZ_E=B!(nF%pd#i`yuyosa38w}Vc)yeH|sppSkgwJ;Yh z!u$o?ltSUHdvE~?tmmF^e&^8sNwGHLXz=KBcmys!EZuh&>WkVL0D;rpxZk+lBh2^f zb<6?dz7>bpnOy;oQ4nor4Txd|HEufR=xk=D)2B&adBuP89~y-_{|NZ{7sx;?EL4zG z)@G4G0^j_om8K4=+#bw7x$UDO@+n*PGcw7RAp}Lf8~mNLYB0_&mGG-Wb65Sg8*;g23acP+q)2>M`_76&Zn&7~oL?zY zxqqZq*zwQs5Fx~m1al#s1Ej}FAI!Li%NAXvqQrarWawtb-4R(CGs($Dd~@5QjJe zt@@A*9>g6&OfAJ|$q6j8j#9vB3h_7ZxZVy>{hngR+gO{^I2Bn4L3m)C?5%PREP)O} zG#JqG2IP?t$HCBuz?1Jg0^+X4paTP{TK{4aL0~g6Y9J7ZRU|a2Q8@P)vAT^n0R(Dp zFgoT_i{t#eP?6s(}70T&@K|LTVu&Dwn;D`N0BUJFK zA83?Gh1`OE+ZDprHYBRMANcWR@UJ`?u}3yFEb_0=`4Oh*E+7A#&_Y9ahyW2G@{M}T zC`cX@t$5M%++1eSHgnufmiX%Gs;dLntthWF-K^jn;;hQbnnhaD6Kfi)%=PCX3rPzP zFU!lTu`f4SAY?LykmdS(d<5^d*lap)W<&&I(P$w}NDWS%9vKu(qlkof_`P9F>F=LB zIVLU#q-1F_v!vNMo}~i`Lg9?JTcJRsdvrP+u8>eTA|peO$<0L~5r{$sRH)uYD3n&4 zpFauP&=9-wN|Ic`rEYJN6R{}6>QAC}s@P+*^%W+E78lD4@k&T)b(q8Gm)LU(QYy(- zV-bs+6s+QPpjZGyW6-t}Xj6tG~EkIG`Si9{SP4vBN($ zq-x?Z?J?)E%wsLblTUV^a-ZrrqdMz6>prJEmvAogLgx1=7c(!mU!h+qywY%$aaDLV z|9aH*{2K)~s%|oFX5GsEA@fJ&9o1ve~$_5Vh@WY@5d03b?gVV39l zL0(u(RTW({)#>W=4MfT!lqTvMnvMHh^M5?%SApMrFpA}a0@y<~9l+^(m_A15Q;AcL z26hs51*NYf);c9~a02Q7w6td;0AY149R$#M0I+&^2Y^8cARw?H0JI_im;oQOy**rj z066IW&|UyQe+eOuv)^O}OgBNR3b~TS(UGA+00WCXjR3Twf|%s*UPcIZFTq2*7jXWL zIrI*^1r`dLTT0tKK$;Z}E?{Q^fjs~wI^K1hh9A)7PsQ)wU;5T5^$l^!FEjsa0RY-A zkzUuf!VB6eEk#Gi!nE&*w54B}%d$fOLn4C31jD#NQOdF*J7@Rpp+g8H0*4R};smV% zmVhS^31kAjz$$PFwizPfJYxY25rusnUL>Fnfk;-XIObdB!oDLJd&jF%aAEcfg;69lqy%J zL8B%uMjE5tSRKasJ_vBp-<}xq%rBmM6(smSGkh`GUH`c1YxWC(pX{8+s8Ueqn)@GDeqjjp+MX5GKhzy~jAn>C*Zo2IUw?F_I!9Y;qz;`FM zJoXUw8of&!0I^$B6+!^ObAbpUn>7=tgHYI6$SoQCnr?tF3=*vyg$2MKYTYCp06w_1 zS$LaJ%ezz>zM|M#vjy8c%-R4$?>4PH{k8*kj)8bHkt@Ilg@E^EFp%M)W###Pgkqg! zkSE8iWpO1~836*Q#CV2_TL{kXQN&98oVV->Q1xQ`M#AKTT`_^w!Tj5fSjDrN&SJ-Q{dVhnEgDtb&Z`qtRC!my{g)lv&HSK9o*-w zvF0YW{`%c^Dso$Lb|qt=x&{d`ji3l1vtCwh#)(3%u(i5Z{R#cEpai#{8OmyB zXQ%qZa)E`IFSgJQwnNx#H0gO3N~T)Qw)})H`BlirImKw>UR2cnXSa9W-RIixC zoxMci5srGL`t7|%$9+!ifbRwAP+J(-tuu9Hc)WLCs9EnPi zNm?XhJu}9XX;6ZOmv73j2pW#wT9!fK);`|?QzW6cMdo7GY$-MADm=dUhK(Qc;0Wc<7ngIUR>40l4F3iqI&ni3#z(#;!OQ z_J`#?DB^@WpvWs%QiYo?M8;HpSAIGcrftN!xKjRYbjcz%ok@I=P^k{|3Z+ftqk!V_ zfk0T#=M!0MTWdt)OYvf6kUqjgQ|wxrBqqfuM1Vl3x3<SuoZI~l>6r+#}KSYudBH^u>q}Vo#B*FHMqN4Vxx#20>Mx;Y4)f6;^dsLS+(>=y; zy$x-}#Cpn%N!jTzg%;JQ0bjzvq0wB;N<*b{O2y}aFe^EewRnAASnxwMOOd(;g5Hf? z+V&hdIwB2*mzexKId=iwQVxCUagB-l(d{R5;ao8#6f*-L>44~eP^BPaP%A>Q2(jc~ zHF&Gba2#?RClvH-vcbQoP+Vnoi&66rOiVBSHbhH~1jDv3kj5icXVp$w#8Eqy zS#_CoF(`?6l~k-OQKsYlytoVG%rA((B4>8hXJEIMTRBQgR3K%EewoG6rv{Env+ESH zr_h$YR7d(&6KwFTe3}=JmMn1t%ygPuF|277z?D>yb60AD;@pB%7_o4E%gA0T$zqm3 zlC&5HKl1&~^2hmQ4);s1gwoZ2a>#czil-@VaNjGYhTSZ(bz(!1kvS0TA{LgNkCfx( ziKKMoQ!H!DcEbq}&NygwvTbGFT zkJpL$AhVpy&|^Mo?mVYLhwoh6oI{XttsD%wS82M0w-rWY0xLWnL%k65;!1fmMePam zG~Q8?C8=)OCVHasS4-l)_N>9X{y4yxU&1Ba}v%ecE1Bo=|8 zTPBstWEBS(CZuMkgQyk&^zE)#iB+)Jota4O3(x|6+IXNLYmX(4JHZaZSrRA*NBb@6 z_b|~WCNwrA>TGfX?-Y+nTKsH#RmtrgIPqGwJJybA?r~CpSrF*Ib7l)c4R6 z7v>hIzJV5(;Ca2=Fdw$vzO5UGNt#`QH5Zy^*Kj;3_!Nn2aGH<1Q9kZ#T)E=_M<9IL zO9rtTaY_;eSnNlkSg@p*i8SQZ=kwbF1>8%xg|RwRdKV)v`S6BPO#B_M)+;J>w={CrhS9WzUTTh1rFJYhNC0=k z5)}L?h935P!HTYy+f9B`ks;`1p?w=^MGBIZ zMsWos`%F)$X2qqw{9nOCr50T{MF%Yj$x&f7z$|>?GT0jvM->j`$+Z!=1j6`h#4Nd( zVjW0c?y41>)NzM-egu?vsYcA>+?70OIlL!^avuL$6gxUd0RZh-%5VeW5_&M+#2fVB zYTwU^8f;iD1y8<!tF&j5wN-e%}u0%rvWjvZwu5(<4 z^|IHQBtlkewFLx#>hL0=R~sK*(=o3Sdq)8203|)Tei}_Qkp$zeP$*;q9xVE=sy*q* zOp27BZcOf0q5Eo#=qID9u%`GY>z%f)3pW-Wy*V$YDptuUhdr*u5488M-s6ItsFnv9X zr`D67Atf5n9Do<~zK| zEu_7gr5#cC>g>{+$MH55Y^1Xe+Tdqkq0uroB$Bg@spq;MUr1`a$;(qbeLTk5v73zh zDt{PirTUMrmFcFO^3N}`hq#?n{QgDm;3=VUlbya$HkZiyG?-)D{Jb*wg-~aVIJ%z+{NHc< z$}~F|vYD|w*$0`UsRr&#&`>@99C}iES?BR0`_gGxZN?(Eiwu!X6=d4#9%6t~;OVzW z@<{s2uze&F{q}j^EAIJk3i->2^tNy`S%yI`A|l(Nla!{ww>xcAo+241<8#Tt98C~p zjquA2lCh%*>+-{*hRTd1sWi)h-O);~A~|H1(s%s<|9x<_`)F_R6zu5`!opZXSfP&` zCG#iGftJ$-`$EdW#BC~aAao~Y{)RDYC6%0;zNEl`R;z}TlFW!H>dW_i5MFJr$TFHk zpl=^g7l(X`WX$ZHbM2aqW!)fm2}}NTJBa5Oh`A(MJ%bfZ&818yBR`Ignr*G;1*p7X zpwqtt+*SQ%#OdKO5?WDVDMuNX@G^DG-BEdvdoh#EmkN)3ae7=LK;P7ZmrUh`-JA+s zZA0DYr>nn1;-NnDfBxlS9iQ`eR3Fw2vvWBn;bZ$TF)MnWRX>|chv&bCEj#w@PeWxP zzWDN9%V?>;e-hl#1M{o1PG)h*AM!GozYMdk4f=@7;JrzZBmC%Ylh*Zj*Y>w$)sD=r z0W7GswluYr7{@>}-zu$d=z%BIFrTO0sMc)Mej94k8}CpThlVbpQkTf{Vx<56dbC9# zSt(?l*i9#sLtT7HkBE6=HJ!u{1*r7xr7a7?H(6UaQ3p9K{j&LX*Zi@=M-K@Vqfv*U zq=mjhDe&!RH{~j$QuOjCs!zzgA)zbWZq6!E#Qf9zOzDf{j5sHL&~%eG*-h8{D!T_d z33UsT(gwTt@7%sTXPU*|Rxnwoa;1o)Tq6vsnp9evswQ9WHl&JFE?rMSdfPPf>SL9^ znVFRpRYa{L6A26rDKD*P?y+Tb=E{-hfNw`=?SiEAf%Y-!i~Gj4bDQTyCb4PEOjDTo zqS9Wk%gA{^6=(~{m2ls&ZwI|)(dN3Ax?J z?%R9AP-GTq(fA$Xq>INnqfsO_c}d=spnv4K(G)_%GGFHMj?T=%KG@K>)EDdQn2XHP z&}2yC7O-7JYh+dN+!0a8>J~9}4cwJ2_ zT9qwXvcUeV;{UW<=d095l{yk)s=u8@ojv~R55tX*bR+b_?mMDKAcbJ5VWbFc`(v4@?jjPB^2~pTXc}7^`VW`t1K%yIgj!0ed#)~eNpqt@PLbpBqwI6n@$44hngqu zm5ZOF-oK3&J#l@kU9l63-i`$!bj-lOJ|Sw4a5j2?zT~Fzd;i?HCXn3{7T+{1wE#CE zb)?khvts&aPbNykzmOt~sAc(z7*Cloq9*0vzRxk2%@GczD9d)JZ2?J8NC)J| z-;BwB#DW;l?(dLl#)I<&+VoUbWOPJguA+nDRnu>|q|$l+k;&~yJSN=eC>6zfi{#-+ z#(zUgNrLPJ1sqn-@f3ENRYMOvaaCY@t)8mZJkMpUMm=^P^;;@+>Ei10Z530h zMRm&gF9|Fs{`cv(@TkN>#RQ7)=AJE7Do*15+udkKg~%C~!`=EOn`81-ne}5zBo!2f zvrI#8xci>jp%W#&&7?;;OC`5+S0x7v%Y+mPk4uXQ5ci3x>Jt91KM8-|UPPB!_Jcfv zK1;C#gL7Bi>VnZ9uOFAh6j<~frDeL#B1?5`xRd5Fk$s_gZfWTSvC_y$wvfz>lx&UY!YFZj6gPEICL6(Hd;t2b`cbtP zTXdaerTUISi&b*``bRX}b*l>J#!Smr5NlONhQ~mXKl=VGKio<4n#m@b#|d;me)iw zv%G5~BiAMwah9ZYKt#xHv6?zdN=+Sof3~lh`GIN*^Ty%yad%OL}r*=^K~)i2c6ZTueTC-rn2H+AHN8vdPEu*DbfC5W3B8-ku4SdgQmRnuZi1EpKQ z;{DH}xzwafuTXn4!pbS6gwU5U zK3{CO){~_)pUgWMdKnYM!ZE&Q{7bwL>9lQj~ZPpnQ) zs2rEdIWxsV6Q=(n)d71+TUT3W3Au|59N(!4X>6v8ji075jxu`gSF)lkatf8!OuF3w zD-I+7^W%bSUD*BAGj!R6O=E$1e+JU_M%E8KnX~iKVaLpIuTqm&M6=!k4stcljlt}j zB+`1MF@yK;_C9fhN2pA7)OGpU`&_?bCG!K{;|d^0};$73EGTrntLlq$1>w zwpuz%N-Z6IFgLH&8Z0fbbdnYXlFeixc^yyPMKCGu$z8;{Rwv{xcC^vexQc0xb||hM zo_KFhJ=l_Qpv7CeD_A8b8L^qmEk zm;=9V$94Uqm2QUDNR&VP9;ttN7tvC%SZ6zQ7cFPLf2bg`r2d85ULSg`g_h!2N!h94 z#TL6hTQSY<{3O5o6DK%(_@SI=WO$9LE*nMp@A^#4l8g6+l=T&(rTjk;?l`At|f(P=XXYGMfR83!5{_1%CZuS1q_2Zhk1?XP*~%#C`d<$r_vb{U0i8Qs0ieW zg4Xf{YqjF6`ZUh;@f`J7i>&LJ3E026X!r1&n!?0=a4;9TEyQuRBA+lsQ)(r7fz9Svfucz zoP1R7XIw?ro9@#juxgMr!OP9*Du&TfofW7AR(~Sf78uPzv&%I6hzCQXDBXJ4!#`mjKziTF*7W7;OJp{=pLGW#O65)4ZN=`l0fuT_+Nsv zlS0YKO39P@Btp1=++ISb&76lPq(TIQHd!ANzIm5u3+Xi`EIM;?FwI?!eD~iUjIc09 z2YpRDa24_UbHB|8h6RSs9KoD|~bMhem_uC%yoEysiA zc$QqCMrB7tW`ZyRMcbCeE`p>~ z0B2&;FJYQ$dtyvrsWYay0Xx+T=Ke;+QYoW!N+lf>nGEWXNIL)!KL2Zp;>Fc4XL0*B zc4*nPfn+huE`su;AS2Nu@SjvFcYkA^#M#;IRwM}0&1|z>AdEl%eLND_-PxzIb&iY{4cd)Y4z_y&gpT;!=D5~@-%QFc}eV5 z)u@ zpfZ|Ws?VoyaH9>oVzU&*dTa<5>?CLh=knMyhKg%w+#L-HMd1!Et)^*cE1S1!<`d>7 z8hs;^wUJKS#2lo1La81)J&zii2euJPY_4Zs;IUq&B7C&aob0q}Df&69Il~%a(~q%O z$LY+YV3(&2HWQzf>@T{kq=TM2UTxmK=8Yf-n)>mqqzgP<=h<>aR&smrbe(5&@dr8F zB?oUGTeB|-!n4`$6lnRIS{9+iJJbuu`cV`V^iBIqZ+j24pMrA$1ZUAcA!@DBAjZNl-N0V?QWOrC7&I?%3ylP36@~vC4 z)hwBuwL0@&lgpyOdM|!bO^VdfYHBr0?G2yhQnsOew0X2?*@|L-2FYGm#R%4<#EL@I zg@E!x$D35Cd=+KvNof@o(!Eu(JNNkJu+I7LP7p;BQ}Rs#C?mIWJ|H++Cbj@+MaDeV zUk5Xa@?Lg#<^7UTkX~e)FIth7CR$}%Pz1UjXBOp_a39JnOmB>h-f!umm9YyNLB@*k zWPHiRh*R{#OKAnPrAKI|A}*FB2URcf`{P7_*v&Wy|DHCZrx|6 z2Wm-~Rj|hZ^B|T7QU`+i7xXNk^*8-3k#Uy<#7LwbNpBlHeivp{T+W-rNL4Bs=`*W_ z9fK66Lg8Z`nmVix($kendg{u&%XJS@SxQA3>%l_0)~i*ghKH+DlC)o5^G63KsUG-P z`acb)ZTukaW38g0|^}jtkws5iUXyQ@rIRM^w zolTRjepm6`weo926+>4+#?^|u6=18(<(_vJ5?u4=&7VKE7kvD=F4w#^$hcB@w^Dk! zp|xSu0&ud?)#Ki|RerY|6u?bg3%cev-#gO@1n|Anoddgh%9l%7>q zvu8le71AACe*4L*Ei2|tk#M4}egaN_>nGREE_;In4bo*(8wRJ=*0XEbz<%ibqy$vA za&J-ypLvuV$)S${N8WEQ|G1sw*Ch#LsqVzgd#clW1g}S;TbAbG>yngDNf)iw<14e<7wV4P{V zk$dCuAF6TN8E|jOq!YO{2j_Mqt?#Ygq%AF7scIkLm|f-K1|nVe>>*qYt~d+FR({UqTO64pg){Oe`lwLefUG2|p>Xo5xcaf% z(u-G*+q!wn9<~?jB6(BCx(SKsP!zZ4=p}Y=R0bhf5c2AG;3oLHwC+5c$LC*(lqMwD zZO*I?l|OZKxFg%b?4k(qw>3haMamQqa`*`WyZC9LN*d>+MMVAkm-xbufueGIZ0T47 zKx|xZD%aXdy?%RXv(kmP*_hc(Clj#tN2G>MelEZgq4CI|jUyEdQC}>DuG^N#b_=)J zR2+Zp$`=!~a@_gMP#vg-Ath1d17+JgPqW&@@Mu;_%-m4H=Q0ONtDZyUf64HtrUc^& zslA4h5<_olYUaJxYuJyEvTu$pO(QMxdX3wg$Yya%_+Dd*_&0;l7@6RvMiyNX3#y3% zkD8z43b*9uPV%Kpsoj*xaO}xrm~2n61G||cV$S*@5nD8P!XEE3D>M+JH1Bg7g`QWr;J=!TH(B1i3sxsmk1WZM|Jh zrIfvbA->={0sqpI%!OPAVr1}lZE*adTeJ9MHs$z&;swuw{I24zB1ZL=fJiTR$uM_x zmgsEDK%gy%ze?sUX|v-WQxBKenfTQU8unyGWr6E%3N!sjFC{i+XWt~EcdSOQd;Dl4 z(#)jbyLbYc5~JR;XE!l8o9GD*%~MCQz?rs=Hp1mMT9pB0jZ1(2pI0 z=KCHH{8h64`CteBG4<7wu77@&@NZvb>W44CGoSwG=^X{0-W85-o&SA@zVMBfCs+Tp zkB67fLl2!1mp5!a?Ui7rxB2}zOPuGLa&=L$8QWaX{yXU7-WBDFqG|)Sp_X)I!KV*i z25jF+4B3JI21qlHeh=TEqj~e z(BeEd@6KoE-uvGe6J`e%g{{P1z(wF@;a=lM;U5#|gdD;F!au|w;v(V&5`yF+O(UHq z{Y5S#Pa|(4Unl<-xq8ZB= zADKGlGnSBLWF@l7SUs$ztR1Witj}yY+s7_upXZ=BZJeWA5;wp-$|Lbgcz5`<{L=!V zpj)s*7%$u^d?gZ#YDBw5U&T&wqxh=$gTyA8DS0mWDlL|tmg!`ZWPi$=<l#@H)%Sw zY-o9b2izzEh|M3?!9+hlTCG(pm0G7cTtov=%(`VD5jyGR@b6o-&E5H5@ICLc{oA?g zB-?e2u++$Ye@7PlkiB^C9pGh8sqdQ&O!OF~UzOVo746!^TRzi@1*>Sh=E}!dw6tBC zu3~7=P2OS@Yw*HunyprufwA4l@i;2|TCfb4lv7{^`{LEtc#Xd_{=3_)CujKqQhE?X z_7acRfAn?KFeyCa8$4SEpb$mJV;5OrUlWG0*KgOzIOk^m!NU&8)2&V~rVO*e*{}K= zs9bU$Y3U)xuRffg^PK7%w6Ku@ilB7yNv{aK2o6QM6Qo5&3o0Vd=sYd$riKtGXjRg{ zjdZwc2UHrH0ZCDTOp&6P$`Mqd69*lr$w3X;Ubl_9-LQ7yzj-8d$d`f&V!ECqS&vYz zJT|sm*>`wk@e#(Ez0`zsKq@LG5umx21nx}CxpJ(On4Z;=QEyRnWy$01>SB^c&_xK}KiMi+L4XAq+N%JK9^n5Xs3RGw-X{ zB8V}+JD$&wx_i3u1W-aD1hJr%Esh}=4 zogTi;@6TW2Q_K!QcvYgmU%%!%G5+E5n;M9I4vE#rt3UWEq8Vf{*Vt4>6x5~^)-X`= zg#y9b*uqPn+zY1jHxtl$L*zWQiUm(d0|c%F!P1tcOYGioa;p1L$&>@_h-ri?g@n4@Q{`0dm!Jr>4F(xz0&6a*axg^`hGwnyLcDQ-9F zVDyDWv^!;o?LPa1bK}Muz#AJkLUs1**|5m~Xh0J(p9p;$L zZN(-sQa8;Mo^Z41T&DL}fG+m?|O~sg!?{a z=*QiDGH`(vU_S#nM&Ez(9!IC};0nxxBiZLpeEa0y!5&O!ln0nWpvur2|A-iH1UJ1- zY;qB^I~2wlIX%CtF4!G`K`sP{@BJc5C)-d+I_svt{<1}!SgSS0Y;(CEMP9gY`TC8U zH?LpQTNGe=`y9jKu!f#7xOVNDC6nyKLO*V7UbtAVSGrredU500a!h)CY*ypg?N_KW zM;|mP6H_xYBo5FA`WR8BMQVd^o!PQ97!ws z%rGl3+*@9L(S}{+@}U#0K9i3>(i|Ba94a5%%QrAVBIz!_Ay;S&R*S!hzyEe_y};3W zOn^P+SZV1cTh=UJzIyAfA|AEpGXf^3hBfiPM<4He{Tlc7AF{8P!=`;r%}!BPmgD%D zP=!ffWl*k;eQgr@tei4HSa<1R?dm^f<#NUmnd@e4-9Ru@o$OgA&Fw!4j< zO)IS5lEC)v(qcA2+nuAdU4T>N#PSWTY4(5AsbuaA_@&}D?oOxWiqdMlOhStN_2gv# z|HNzS$0#9#nex!7%&3Qp>z~`>MKtM}95<*%Tx8_QE_mmr>pd1a9OFi}3(P#zoauR| z=iZ!fquhO&`eE9-E@J=Hd*s~SdVwx4HS8f9@+TpLV`Y!?c9VAhhn-4f8Yg2k>~v~X zZ$dj&Xg}P*{S*O@c)ZJGi0r_oF3AO zLL8VfL9B!&ObCegMI-J|REzE@*)(a7Qu;ce8eHsi23_DdXingp`6g8d-0jp_- z*~(r=+Z0|3cjgo}M1i4@kJv7rlo42T{ycDIc|Kcd(0>l1tY`zLqr1KY@VX@#!O{9w zc5dS?&GSjH7+8q8~pQvP4pCXFPJ zuKs2qbnbeCM5O&De5v5vQ340C);hfW8PSfRinRA)AE4EEGWDi9|n%I0MO^UcF7!sn4Z|k)9A$e?D3uL#$c7 z0AbVixzfHDmD%Y{t99)?M_i9v#Qmc8hW2eV!RSU^*ELv}5_#V1KS}pIZA9 zn}eKF^We`6XnCuh^1yG*S(&v*5M0Zoc~Dwnzdm?Kzqv2`sM&_tKvJee8^beg8-g>i z+TnocqzS`hnCh+l`i5JQ2>-1qzZAJ8>H1F?q2^AKZ+ZYrb*nOUoTD1jhXhK9do#vLMlEZYq-Bq?ySc+r>*)sva&J%AgEl>fXAmb9au`uc# z;`SV-xhS~h5CHjO$_BkY`N3j`gC>lk#vu?TTEgP)+9q4wQ5GIsA}8a__*mdg-P!+o zbJw&VoQBA?@3NYiU!ZbLHjug zCWGx4uikn3?8UEt|3A#C9S2u>`*1(sJH2(ynr&wvKARE@VX8$UMU=s0O-N40R@Q?C zbLDIY!MC6nS(ceuI?*xImJ^+%gTc7ZsX7R?|H{=L9zA{j^0zh$;5Z~l1q z;ZM(=e>uGC^KY+z`RU1nyEiXiItGsQ_Tg__Ik|7=&OP6qxq74b-Di65(eu}D^y5Sl zZLHH7r;~{$sek^QClQOKGO1K9S17+k76XgH;t6;>9*4!=m@oA$i_N0bXw(o2#R{}Y zhmu)jaicEzO3nHU%`?Y*i+)(R$biM#K%*|mUUxQ)$y6{};`O{&Te-iQEpP#DFH==8I8T`4gDFj9Hw;~dT zO$)&=+^Z`uuMe2OoMW|)1UCG9cI%B(8E|8MG#qniF?uVX;v5Gm=heghvi=w4s;RiX zI1b^?8iDchzynE}{t1uG{3qR8$sPQiC3nO4VI#7pt#oV2gdiitg2OQ2-z@Q$82@`h z=+l=F|J4*Jz8U=khuP>)@|Vl+CG+zw7m%9`%Cttrt-OAShrSt2h7B`=k@?RsipQ&{ zpLova29#3mYEk>x@}!gj7p0_92AVc-E+u}O|0k+-zLp}D5N0uZOz9Ld-CyEk)zlTs zcwW&pEZ{IUKCx)>qm!td7c^pt(tvhba#M*WfpZloOl4gq;cU6u=g6}Vm=bRI2Zd06 z)TGF-sw0EPmPY^1^WUjMr2KuO01I0~u3B(MVZQ0JiyR|=poka2yMPACE`+HYlYrN~ z7=Gx5DZ(1YwFrW$$c~V9@B&ZoB>poPtqMtO2FEpx(_)&;=$hO`KOLtBO8wWLUL@XS zDuI5%tlZ&+krcwcFdHcyL5;sTM`gAsZ}IOU7BZ!C<1f_uU%bNWqk&eJ)RKhO7R} zf3rlvY_lJgIb!=edkA;7!6o^9_AethFl!qhxI1n%slRKj*=??vI$LiJ-lDquyZ_pI zcbH5vJt3T1d2MI-$1%@)1&P>?jfwsa-C}>2Hgz!b?3KECuw0tveJOa9LQnHC;FEH= z&CmJw{%nKNcRa(Is<-?a*e3I{Jh1&*|38;43}*sIPH;MG=EHe zp2sANDK^HtysnIzHWVdAxyg1%j83f{HyqPi?)OB>#9XFPPG^Kr z&@_p$JoaLhN^6LT^W+o(-^fN`GpTmd32C#4az$na9B>*kAulSpm&+d>=GWy*{qeKK;=?T$%}}nm4mfSB?++cR zzSrs{29z*NweI5ywTqZ=h;6TB^315cI9f@4o!o8OaU+9d@8WS4X6L4BPDm5sYm$sX zWOl_aGdeR~R$Wa!3LFI~7{-jn5dh!U^l(;Ioza`4v*kL@Vzf5xq}`POHKamX=sdDV znufeopwKE5&NQ)Xo6r9x@hr~9sqe4FZE*_7U>pYY+4el8vI*;EQ}EdAq?`4k8nY+5 z;fO)Buk1nSU5ETu-8~ zU6d5lJ4}39m{qGBZ^Z=%u$NP32pN!9ILa9MnzBGJDzxLgnqJ}@>|a*W31dE>1R}Sy zf>$U|Qoz8;09TauU0PFgs@gCY{L~fZ_)MvFvgLdR$vVthX1PWk?VVBUSJSWHzT>X) zU5ZhLl9_K<5BKe6y}G&NGUvrD6}uS27-DIs+@UcpO!q!rUCKcOoiJvWv`$(Mh`5|% zR6(NY!wsHg>HlrmxOvNS#&+TC(aJq1!Z6sr(N;pkcDq*m|8aHgGWeJ=I|kx7LXy&| zrs%Le3K@w*m{@>VGXm8n)`7QMHEGgWoo%EJo84@qRzT*@u#JgUAZVx@CX^G>BuTK` zs1W$(65IfiijDG!F6Zc$x1zOfiY&Y38Oia;s;hdupEv1A`k>XXhEfQ?K(yo zLE=>b8C}a1@K|@H`#8}xS%(zJD0-Wry9tJshAhUf=5FmG3m0wZxc^0~K74iRMXUdA zM5Oa*a2#}ZO6T zzfdv5}6-tSyF`EvD%iE%uWyEjX z)R2ifA96|feB9+m86_KmKqX-K6yf`2{sS-|2LrGV;HQ9uu+^YyiMA*#tNs5m^{gPq;UQdUjS(8H5l1L1v{d~f>l&+Pg zE@nmKwBz|QtGUkS^9s-MiV#aHC5~dL+V1U~i9*xK09PDIeUqA1bZ%2^+OVr@PV&$t zUjC_UIEEGw8DP@ld9u?afQG`Yleo_*BZO=2G}Q4oD}vj3rONUosib83%v*)^2{w(Q zKQ94vO|jjwU?GzI68Z(SrPZrs8~2+9%bR;H+`Tmw=!;AG!R!k!!fRoi^Arh-8I)w-+(K*Hn)B4|XSR>zi$@yJz=V_q#EpxG@FMxOL< zgH`G4J`QJ$_1OQyH4@jN`YD>gES2$F} zF`BKZW?u*?d9bU(Baz0TBa+=dOd%T<{#*{=-~3&Bp7glvclNWWhlz4y`FK`s>>$TV z>+J_HuoU{js#@O87qrQEJe|LIPQx_V0Bf%__pW@J%jPTHv9tTb3@6S;hoz?19?WQ% z{W_WS#LQmSn~d$0Jd(-sV|hE)pd2Gh(W(_|*mZX2# z{W+2K5IRAP>-u*LV^mFKID%m?wTXH|HV2P0sr?o6QxLXwXSlwaRtl=BM9WB{2!%~9 z+C&G@tH)>+HT=8;pn}5?3@fF;at<*pDG!*B-C00bRSE4}x>c?%z-gydITXnJ&a4+n zkg?wSb^(=!t%YKy#)aBWH_-wTTT!t}Vci92Pj9sf*^p`4R*e=+*EiNrrofGbfYi#F z;edeFoCkg@;T_KQ)f3St0Ko3csu0o1nYG`q73sQbKT4zWL~Nakm+GA0fe{l7@x4}- z;FWY-cF=@$%n9b`}2&0 z2Lz1-K{Itr*BkXZ#_<$}w=fL#VlvK@)&v(a@(w??rZb|R%$8RKxn36nu_IuL6oR=< z&2?6ZMPV41Zw~9icjn~Etv9wskoz)4RjOqMkc;8C=ys0A=*C-k4h1wZsXAp#8x-^_wSZeKLja`pcj83he zpA}GL+LZ=GgXi%1$qlO!C_{~AaAw@3CVnKUB8AtbURGm}o!MY{<4cVP!*c^9ud!NK zfCQC!211pvP|gk=ZHN3?D}(3S$BQNBJzzb`Tuqm9AYZDqPx4zwTejctf8oW!5cuQG z6vF;nk^?K?DKnZ;p^G{WLaRvAj?axbTPyzD>-eR)sI|$~XGA$}NutAtX`bh}z$-Rk zKNZawt#2oxvQhh_Oi0ft8OB2lMr-d}wSoD#lQd_Yu3^$?<<)6b70#6_xqN0|?4LWl zdN!9Xegy~Z7*SQGzujnEoj`(pM!6}w_!Oyxz5(2E&<(k^dZ!vWIgP7~qZ9M#mD5B; zkqT{69Jf^55l|W*JEKp77=VlSvfi#?{>JWSbQQ0JedyH;rWt z&zyGkPiHnnLegV7off-gbK4;nt`{Z*8()U}5VkQoQY-09*N`~d_iSysGXxccs~9QY zN*`Ql_s^w2L+x`{+g%+C`f@6`?nyv?DMlspAbsFGUV>= zRB-QV11;>g;&Lxt?tm+d<#S2|ms)cS*BTYINVv1^oMD z4u#EOr-`|vYK`?WNtX3=fsDgQfFfW#!duVW-XiNWrT6}^;<}TK$9?y&35a0raetxw zp8ks$ecSrgpKArM2Yrk=4sqMw;st??#ee>y>3bsB5(WbpgCh^-kpIKyYB-}MTFw1M zSoG@DirkFZcp2MFSO2~IJE1^Gl>Jl~ZEg_& zHO29Z?Zta0gcxhh#0VDML9|1`lb6)~soU7}UH0D)wV663ze&tl1Hi6(aC9j0TAR@C zl;&&+OK3Q&w)Prc41HcN?xM$nRvc#cH)&$QM7Lmf|jN62(cD zmqkYWZbtP>bm6Bw=@iR;F2T}^HqZm0>i@HTi~OT*msWJBJAL8*rQYbB%^nu&J<|MU z-!G!bQ3TPcRq6-eUsjMaUG?($Vi(4loWQkOK97o#>dP16;rcogP?h+BzI<{2@o*N( z=}8OOa)ZKQ%2M4f=HurtUNbP+46}@M)Z%ryTen+{db3t6l)GSeWKJ;*Ph1+Nt)EcF z^GbF2Vi6v9*rdqwx&E`)i*RrG;N2r9j~_p<=R|X8Yr_(Lc>Vw5>YiI^U{tx!{R=IT zf3$lg^0#&&X_&Y1?;in zddxb(fYrgzGye7SkG16&&mh{{`Vz_?1{Z&KD6Pwf$?~|Z)(M4S^bu?MVS4IR^+KIA zLk!2VAgLaC3=h`NGnWu7Xe4GRuorL1k4!9;+(jxE(Gf-`lH>VmJ0GQ)C!O zx2UZg3~eHx|3PZGYOm)vmO(mjM4rQw)P;PjBsWIKA_K3$JP%&Hu;U3nr8E*{LjC^M zc?JcGF>~5sSTJogn?A*G1_p+oeIZK9cpw5$HCgkZKUH4G|MNe!Jhb;sM~7a&{zKlm z&V68>r)-qkTA&&lCTo6H^8P+Nm+$q4mCk*!LDx z6K*zJw_75GTyH)QYV(snEsTUqY~iDG)(ZB%Aj>Y#V;APKjgnFHlE=v?i#m9ugl}x) z#xXCG{%z z>TO#e>7!sx$G$(d$^*R?F+QNa;{(CAbb{0zP#dgrZkKcJ#%{jXnQQXomuTzVX(N)C zAG0njRcwYRSPF0DgWXE)Tckt)U}6bd2&thOvljEXN$}WnIj1FwD88dd2U^tmOoc;p zTLpAMSGYJD$X3wMbs7kr?vRyS!b~}SZrBY~7@)B)s}%1V3K^ak5zr#XezQO8SttobmwhEiCd$o z#Q&y(shYdgtHnB;gyNuoFXnr3g-+d$N)iDgW-dZ(m<5cd3>EbGY-%`#ki8&*VjoMR z*QwD!^_oE#wo77-_EI`yIluu9TRRCxu!>fuVJY1T=~OboCH5>H*d&<1+nzmJZ-#A3 z{J1e^Dyg2WN=S&>dP~UjRCVo?(4kY36tUMF7yz6xo5e?i9yZQplbxgXv}1C= zIqfQuk+0k>XP>Mv=jQ!;#<#+7OkZs0{)xVzfJw##41m5m-}6|H000=BZ(;p*F?D7} zqX0`Ahrbn&)CKY#<~$2C$-Vwa$2jVX9;m1W1tzmiVud$hP=v+mx_GcHdLh96229N8 z10Y_d&+_Y>WBCd0M(3l^9&?vK7zvw;Dhx{O?WX?k*4699osrV+mEyg-jjg=+UP=~B zcFXI$QmQ)_{H@PacNUGuf;=d8<0`Nx(w$3Z$ZltUTpCOKYcxu%c6nE{Eu;76_Pv7` zz(y?z+*M`89>(tKq#`z~_W}Qv-gI1=;bm2$UjC5Dyf@hhhbm+!!b3q@wWCCT%LHcW zIXk;nYN@DXWvOn=Yc(iDGlAZTtmnJ*{l3R{zV=`r6fY7S5p(E705FdD;R@NZxqD1 zaU+t+L!?iq2|_Q)NCP>G zqZ_4K+?Lks4LhAygNH(FCPDu?XZPA-F5gTU=^~Mp0>x0ynudC1!>>dxBgHXe#6(IA zU?ghPqIRlWVAS)&m1h5JW-1F9WaQVbDCRdgXrlbG@lhO-SS?vS)*<}QYna}R$u_)Y z`9Yv791BPs_^Cn>q85d$1hcDTvpF2{`a%Kf8IuzzQ~^ZAYL%I0gL+-taZK|y!2zj| z8F)g-F#UJy-k>?N_;f5{o2)-89d5Y*?`KQ6?ok^_!36p@TWa3z6ogs^IC-k96Y-6n zc4z(Ha3CKxCz1@(w`3%fr-ZI)T86Axx@qvD9RTPzvkp^3&)1)BY3i#mCB$V4y#<|= zN!QaVFzwj7@OEL{gdVTPOyH=&H8i-x9578=2XMs+xqKB54z{v?jh{-c1*Iz}I4 zOtDqc^|SkffiI8ae7+$_rK!Yc_f(-`B(O9UX?9plXWk^240)RHTv}-tg1N2hLgA1X z$wtpcq;;HQBwpp()S{6Vgn@9nDgfj}E`dR5(pk?r8LkUt_29|-AQ+ zk(*R47mGH>fuu&>KJ@#=Vy&ag+V8$()6r5TlglL`fi<-aS+<}l9GQR#qh7t=MuHec zF)a)yV#2s%HgxUs?<@4#{7^-u%gqBvQjHF&s>k#QVT?RE{z_a#@3i?Knh!;A+yi8lCjyiOOcx)b2%MIM`-askx(tuG$-aaXG8@^NCb^-H<|cRekld#T zLHrWN=xYt|6r=23AtW4Z7cbyll&>XcrHvWX3mDj~3%$(5R6>}ZfdLSL0y^8k`@lan zQ)^B;EwLOj>q>-=$;m;I22hs7u1V(&JQr>(PjA(_I#x@h*Eivi8Dx`16YPw4dudu3 z)(5O&8lo;$6-Owoi4GvLpv=XBB4!u2k`6gt7h`C`pu20*@?(0-ktZw6(Ru&G`E?lL z?s)0Ssf(oh4$zyl@EkFL6ceOV=kD|dnsLzM4|Pd4NP09`EiT^G1mwe~NZXBO|5AJ- z>7M9nZ(({TQyrlS*rj6^3THN%BCD1DesMJMk5Nm$(%~G@GIi{aZF>g)gh2PVx%^z( z-_L%==^bz1HS-ag{Yi|{vxn%2uzB%M@)t7B=bWL+wCzAXJ_H9l{vSiW7d0op&gRvf5`SD= zuL;SRsqh@)RV&Pki#rQIK1h_-%`7<<|3k4;+-utL!k2y&A$bLj0l!O;q+F%RiG+Oc z4(WK7AmFq#q&X^ejS8%&Gs{DJhm?8w{h#z!FnN&@hrj=OmOlcz-*?hFsU<(ft+2;) zoyBLJHtV?>qxM~nq_kTd(vYiYRClxD>@GomFh%5u+idE8)GtY4_wqFwWl>Mz3X)nY zfjJ|5>e3a2QfC{PzaJkHEYM*a%I`88g9#JLe8H$$qgy!nM%$Ck$)H`K0*Lvnt-U$c zv+U8veh?OoE~-WzOgE9xN)Iz3?5@nNCR10#P=iSgI)>v+v?cnyT5Tc{zQ?6Bs$mF8 zEuZcHfDEQC?n9&HPQkXUQN3cqwT+WdrNG8R8Bdw^d|c+AO}4z9i0X)YUT>BHvX6oZ zKy;Js$yT@7)@K-Rs-ajyfkiKl4+OA{#tX2~He_|y?^dR$L>UzdEUMdTYptX(g)G09 zw#FJYRuCD_aSWxOX^Y&%q7qi&Y%(kgywxhVV$4R$_0(TW1NM5hBNgpw(gpf>mYqY1hXe3nVEN<`) z$c${LU9yj`iB-r@f>pB9sH?C(#)S)F-WCUQmwP`ua>mKfg6-Y3^nK5UI#VT)XGs(3 zj+0gE%H?9Qp(ql^m)ADBDj?>5rY2EWIf)Pji{dCYh)xiU&0yH zaz`9T7N{Gr=q%T$?{%agxTx$w;k9&90SsgiJxA4PM^x6GK;an-FSVUJYgx=M7B@L3 zQcQgcALZ3S1TK2!#CpaiRNL5XG(Lo!ya%!e{Y+b9x>mJ%h6JDB-#BC0w(E;x)`}>a z?(`gmJ}+TM8g~@ifm_=+=;a{;2u3eYqr{n4v~e;(GD~ciD~=QC<{`1?o3?K|VIH{o zQcq0{1A<|p9WuBgXfH0vT&d4Rx)&1Q$oM<@dL8AihlA#&ZJ6^A8QyA4B< z9lX;vV2ll5Yz=cMHm{tG*&|b@I|)x$feB0{fzC^b8`8;L%FWP7`QAVak=xn8O7AZR zE3|uqA?xe9rs^CgOc1NH$x{KoiHyr(DHMPLBWp&P#$+lmQpr=90`_1YW9!KGc7^#{ z)$?|CWS)9FUO*nytkgJ07SE-;-9Es~k>44$Il=jJQcvLCqqG4 zrf)^ex&~0(D&{MQ`S)ue5o$ZrNN5oRo9gr5#SVgmG2U1qeg0=X=WHY(Qz5%Yuinfj zD7yMrDekj-=T;&74^dEnOfeW*Vi!ey__BMQ`_H?>3BoH0QRNn9_HEyglsVBqweB`= z@YJ6Hz93jho^uJq|DZT5>e+W1g1GnT3rei+5<3~c4?0TNdcm;s;%fb8!J#xaZ%1$> zHGd!5)bCaR2EIc^pf-3;K%B6&4{=`9b7xW z*LL#QoHBe~Uoc7g6!CgFvA#sskwPu0^Ff&e6UK$4ouylN{_o>Q>5(6OcO}w z4dGb5)4e~Y>DJFUiM)@6m_TB2Lg(G3-^VC2kl| zCVcHjszMeMTHBjjo>c-sXOmvj_1Kv@BWL@LGn zI?jGL6$V$KdF}gFS;tHybK)&gEn>R$cHf!^jjBKk-j*3$sn)&~Ss8|vXu24CBDLXB zIqKW3An`3|)a3(QH}-zN@oIS6g*`FGR&yt+8&5uwkltBhK zAj?PG{JX!vAX`2dx3#_uura}L=zf}~Hj*R2OXKAh0BkQ-0ZuMI>?IGn2$m}W621lq z%rw%{O#D)cHTT~wTVnIm7JjACfCOX#xhRl<1nrr@^_IdJE|_Liv!K_L3J_wX{-+gJ z9Atwtei%iBegFiqxiY?T0BdZ@Y)p-1vRArZ|Gs1zl9;1)#V#lV3}))MN1dv&A!m4C zU4*{Pg4$c&LF{q1;u4{l96H|ukPazKL~KHkKP>o%3!+EEr~swt6OB=Cv7l8%ywj8!!N!Xb#wAG`nW@#-P%!ry;3AKnrfMI8=i4^YbF zo6e-vK6#M-X0S}2+f0oX&9?-8p3Hm*ukHV?veET(Pm!OJ(I@7)m$7lG{&0IfHmXZY zu!cTr_@{6T^q|W*LLLK+At8`=bgoscy6&HG-mSafdyt@@`4BVe}K)}k_g z%*7OiJ((PM58Jvn87aP?(>B`b?%D7uD_@jsXRpj%8(`niO3Ho^-KXrMLwM1%k;o=+ctImQu}>%oCF6Ke_lu- zmd)I&qboT-K@N=nWqSVSZlm66x07(co7sg7bP2z@7&!dC8I@C=*A5O-WA1><(xC;^ z`vZroVS`}c)y0~x_Iy;<^`gGFf4Y;0yk39NGH;TL;FsX>`5|D$YUV;P^64=8%d(f= z-}`cX{mq>-SLwRvZycRWpB%{fN0Tkjfo`bo&`Bas z-wEk8TYv-@7m6yqymosO;>V9yj-ER8ypm2;zc!#I2CIZWEJa|9 z)g+AWF-jF#trie}zH3E_nr$1h!y~gVsL*y4X+bSX zJl_v}-53p%NJ3l;Z5Yf&H^_WAXoBjdpC5{`NEGab| zTRQ!fN|c{zc1x0TfAGJ+?(4KEBA5pYuD10fo?*tBJL^#zDvDw2CBfXOQ(~xIJ>qB$ zccz_L9YRCpnI6TxU_pfoC8b`lIt(#$xo%mR{!L6(?Y@n{_VZys3`d(g?I;Zn+5Y=? z%K6sV&OrpDplulq6EQBGSg0)?;x_F_&WO zte6EI-eDezFrjoC`nn&$_~v+Mu3ejsU#5W3ur+3v`*+purCeJ46@PKP!JxVo=DjIy z(+jXzt%{rNPNyfut`_xSHrw-DT_1>}eu;|R@BLHP2*|@`O>=jmJEo+7{$;Ew8Vm+v z*8k9?RPvxHrc4Kf$%3%Z>4M9mV%QObCJ2(onNrTlEinfpk;zaZ4W zmB)*YE+66dgFGo34V{l);YmM-ER=bi$2(fE-D`!IXdm-8_+}a%WI%@Fj+3_@R$x^k zT42{xjMiPJ?-{xLakX8}@O-oBy=j1fDh=u#7h;Ll;yfjP&}*f48xv?7O(`3$Ow&W* z6?4>sl;;6}oh%C4?1A`n6!y^S7BTljFJH{9(WuezeubbOjb*ay9l(UuLl=Q#aam+p zSw=Pj3lhrM0qlC2Tr_Kdgd6h;fDv~e{H0&2E=12+KKK6&!fJQix!+%g%bgDa%=FbL zYJH@q^7Zr(DIRBF=Aa`wOm3e?`wKkMeb))Sye97bxUmv7p7xWCjBq<+)wK9%97mw_$s6YD_fr=r4b?8!!n|!|)uz7mP{wyY3d@YUhI^ zSN_7MJlJ1owz2s%|Lr_pZs9l#qW0?^GM9$STie6y5OP0fG+$oed!3V>MJns07fkA&w#&Xd(-|>yg);!@1qbStphlJCpyli_;uIae60g2wlqi*6}~WjDSGQZ!!Rsr!owc_A=xZ7!|`|YRL-UZ==sFSHbz% zw;xgIpi53LS5C@stz#+%DD0C13ZdK|k{}oek@68-lI;)APQ2KjeP5@xbNg4kStZD5 zCLS2qkH4y0g2e;r`Q)gy6V!|4Hk?J^Z20iL{;2Qt)R2R9lGB$iwg0MiqDiCKP{Ok5 zy|_$x0JJgwORZNuo=UG{_WGg8|3o^PhbGlA{daP2Bgt@s@wN0Hp&XZKJkpURw^B# z0@h~JL(W+$CuR)|qt2rd_uto(>}0)gmqYSb{>OaPeKbW}iQwH?i|j03Ra%fV+yP_! z97|S^Y?X&x`l%d&g)}a!+2pm`6%fVLgE2y}8dW>0%vze_s4-{=LGrGI9>={r60zU) zP3c=AU^$=k5DXP*kxFZ?K#ny{paEm5wH8BBTe54LCW6i3gB`BRmwnRHv}TIb2Q9@JVsu3yjI>{2_+#x1T8!rH)dU=_Ha?@4dR4U zf-zyE=l06-F&|v3@e(Zs9FI#bn`sFtPkqGVtT&;)TiPTbG^>S~4>^NcAH$G`y7hnW z3>L(`*B#XuhoZkXS`&C4(Lb!WDcRU=J=KW58?932P8duyQ(x|cIX&kZP{0g67A+WO8IcwNf{BBWY! z^to`135a&Ih@cs!hl{TScj#SGUF{LIOM^0Z?g<#icdnLE@1fu~ zLj6}77n>=!z@Myy8TecTm}%1BU^G)}64Hr6p*PP7AJLH?o?rjozJ7?$RUFP=zrUYE zDK|4|#&8%6g;mKn`Wq9#Ebwh4@+!*9DgqUaTU}@7B9FDSR2b#2M1}dqHMJG}Zg9cc zmOa7&XgsikRqjiS%@vL`5o5NMLEbApK!2_hhH+9fqr@jkN+c2V3!X-Q+~Ua1u@rTNfkIh-?~r4mBSSnkOqX^u(?eOaW$ysnT_O!41|4x)@hk z|HVe;H(Z@SnVWVzRzk_>Ytn1`3k17|yRDspi%dK^K+PS8S?w)GgI<;B7MxEs2VL}$ zN*7VEW-D6R-mIKb4H(9*KO2mwm+;6WcOsx%as1I@z%l0py*z{S%eEm);(o+4qK0^G zEHbf$&iRkmL3&SFfm{dq^2SN3ThN!#S0PQib|Gk8Sf)LANtIK?H5h<}!%~}2ivER# zV%U&QNYRYKDCkr!+BUn8Yd7Umyzd$zYJjX!%{H`?&N;H&}6>MK(4&(WmGE+bbZ{ok)mRsFrR^jl*{&e60LYDv?dXBWO7Y zCiK+>6cdi15``>21b3kpAXLy&xR#*CM2L0BB>5Vvn`X}1WHlXoknT%{+1Fdnm(u4OTk-#|dp@h{0Rk^G zLj(M3`l4yQUf$Hp?xs5HCLtekW18f)NEed?+*-VWuG7)@?&DGDx-cf4yC$xKly|Sn zR&2?HFGJQ1H%em7WT=k^9aBX3T%gH+FpR7Yzp-SrT`1ace(G?zL2sra|oz0 zm+zse(`#S>E7wguk)VD&(SSaav!s`6Q$@%6mUb4L8=aXuANS9GOCkCsff@idC)zOD zKkb{BSTmovq9MqRW^SD%Y6e`wErG3?Ah17(KpcY)W|8f^*KPF$Hi&B6j;RtolLrEg z1q_z!&&jl9O(wQP;-~;m@YCz0Yz=>=Tp)jsJ>m$TC9B#WWAAEI5YB9@z)+ME1$?1h znuzLGQupq@sf$6lH|&F7c3GF#i>P-qSJ3%1H<9Ywj&{A2l@;vphVTyltCSoPv- z!dbF9O@4#tXHn{!a{G|v|EWg#>@(2*poDx8DAu?`1>S7Lee>d?4g2K*aPZMe4CgB= zxZg7X=$HGar|L?Bj)?nFqr!V@I^9F>CLRMrLjN<&1?XetMv^PeR~SaN9bHy=Sw@UM z6^+fDp`8q`NJ^>QHO)3hL}EkX2=~Z=n9>+xofwjST1UJy)F->p zSBm9w=OcgQgO*I(sJ(0O+nc4CYJ3k6#Ugq^n}pzn4GA6Vl~J7K0-;3&-7pX;DZz2i z_pb#^xsr?x%>HmODFY4=M&AyMZ6(?Ov6CPe4Fep(E8+0kqYC3DQesA~ zk@>J)}xh^-u`_Z&F|+egibD5N0btz8O!4;NvC4hmS|F+(598mM__N`#+n_ zS8|U{hy3kQY3_3-8<@DDWx_b_e)ef2w4#~|5V|Ifpws7)R&Zlan}m<`hMEH3Lx?VF zGLP0zc{d{)!uYY;Hh>W`JWaS`8%WOMP`%poZjHftR9GQ1^@APvGxDi_iIJ} zg4Uo4Nd}-XnjA3PYUy?I^~_3i*A!j>1qk~0e2qJt=B-A&naN7U!3S;5(iy02;2u6e zOLRtCm%!2g1;HUW{7-aP!ISha@w6bO)c27+dV^=~sbK5Nxg+v>H#>Z*JOY;C2f)vh z6Df6Kr(*WeFrO&7t6h|*;rj=*R<$@egy%Z0D!YS=t@L717kgQN5ANwTfO64W0Rhu- zUlzX&JWa1Re}HHaT;S(*F9QrW6Syc~Dh0zsKshet4M;3#r!f-%g6i6CML zhp`&TdXJ>8!>Dp5k&eOP4VQ;DBt@n5xh^~mGy^hFKBObQ_$-?SSp`4?jvxrg8ZJ)` zY9WcS5GCH9l6JH&__!Vb7wVIlX|t z3P09ONa~=2HQ>W1F_|;s1rjHa8jJ!(r|5sU@U} zPl=6Uwkz+w%SEostS}Cs6vgz(Q{Vq|b5YbNQeuT<9&9+bU{Lk}go(iW3T{VVU{ruq zEVCvRvL|6%i?~S5LYAqBDjr?gDHrI6H06N5W@3Obf3nHQ+cR_mm)b&-4v!o@YAXrs6r13kFN=-JC zk;RD110yN`R2;7lO&R}?Ceu;-0&}uxT1ZbSik5c(|E^j8Ja{Kb`FS4WIu(O!fhhr8 ztxXvs&WD{Z0PN*{+ZeZwErY&X$m-kYf@$Z^s95k!Z@hJrxzyJ9P}t-#6L8Lrm4aiO zV?^HJTpEm*gx5WcmDW=|(*MIYvy6}UGZ(#eB=PEc-t+B$JzPMG5P2Obt#B+sYcy+~ z$@-257KV4=9ayXF8*owNJdIGF1Za4zqz1}@%DT5SkS-8F0S5p#50)Q-5Y(p-4B6g< z5V&en2uWmhgix@mB!os=kvAq|$p1G70TA_P2m*M$48Z`a#~}ou=3)p5@H$b0k`RZ` z-n1`-0hFu*Y|~%}2SPF(@J&4-0uZGnLiIO-w|1Z>UBaH zVxHQYnrfQac&>;{D5@uM6YB*h5pUtCW{u{WJ>JoC+CTL)f;QMbkqj#y zsI0K^ifSb{EGCifp0SF05XAR+>{ZjwYH8+=m(h$Qb5SwYpfUj()$e=q%+d?x8^~s? zDtqwyDvOq#51C_q)v(jXTxrA9LA2gMUH4(>$gn|IyNS_IYZn;CblyKbDeOW(5- zAIn?N+?yUx8VpYl$254pFcOBr_kqEA6}GFi!(37_0dl`msB*zYmnf;IXdFiMxJ~V^yoFw z2n7lidE!u>rac5L zeTa&tOn8yX?Q<-{vdgY?ru=27FEEtY--c>g=9Bq}8@&-2ad?I>;&6|k{B1~*6mEba zp|eu1MR;4^rhfO<6H2Gkv#$GlA+zh*qiIj6>BE#>NBGYVO>^REL8O)EdZz7RL9&#N zY4Np}MlYMuuFvm}UYLx0k!Qrgr)6n9A5%v6`|GdFk|=uqkANxT%vkc3#v#;ST|=s7$4KYGaHSbt42tXcY{FaNwfWR9Q&rr`1UkSm@-v|#v`G8q^E E05fT^n*aa+ literal 0 HcmV?d00001 diff --git a/skills/database-dependency-migration/assets/viewer/bootstrap.js b/skills/database-dependency-migration/assets/viewer/bootstrap.js new file mode 100644 index 0000000..75b7da4 --- /dev/null +++ b/skills/database-dependency-migration/assets/viewer/bootstrap.js @@ -0,0 +1,16 @@ +// Apply shared website preferences before styles are parsed. English is the default. +(() => { + let theme, locale; + try { + theme = localStorage.getItem("dbdep-theme"); + locale = localStorage.getItem("dbdep-locale"); + } catch { + // The report remains usable when browser storage is unavailable. + } + const dark = + theme === "dark" || + (theme !== "light" && matchMedia("(prefers-color-scheme: dark)").matches); + document.documentElement.dataset.theme = dark ? "dark" : "light"; + document.documentElement.dataset.locale = locale === "es" ? "es" : "en"; + document.documentElement.lang = locale === "es" ? "es" : "en"; +})(); diff --git a/skills/database-dependency-migration/assets/viewer/ibm-plex-mono-LICENSE b/skills/database-dependency-migration/assets/viewer/ibm-plex-mono-LICENSE new file mode 100644 index 0000000..83eac82 --- /dev/null +++ b/skills/database-dependency-migration/assets/viewer/ibm-plex-mono-LICENSE @@ -0,0 +1,93 @@ +Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ThinItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ExtraLight.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-ExtraLightItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Light.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-LightItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Regular.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Italic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Medium.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-MediumItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-SemiBold.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-SemiBoldItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-Bold.ttf: Copyright 2017 IBM Corp. All rights reserved. IBMPlexMono-BoldItalic.ttf: Copyright 2017 IBM Corp. All rights reserved. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/skills/database-dependency-migration/assets/viewer/ibm-plex-mono-latin-400-normal.woff2 b/skills/database-dependency-migration/assets/viewer/ibm-plex-mono-latin-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0804aaff92260b5359330f63e05b9ac25ccabeee GIT binary patch literal 14708 zcmV-)Ig7@3Pew8T0RR9106BC35dZ)H0HGiN067o<0RR9100000000000000000000 z0000QOdEz$9EMf~U;uu?K%G5`TK0we>7U<4oqgE|L^X$*rj z8;_19%I%W^bO(SBuPiMn*f#0ijzrPkb7(X&f{g=!B742;|Gy8w1P?Xm&z;E?bn2ER0SB@N_|ohnR#tmztr{aO7{OhZ>6~^sZ*r{s<4EH4Dw+^f;SyWMD_#BD1JaCUG$UB8U?kpU?cMV6-Uq|O<_fGpiN*+6o|bB1jrJ2rAzlx?#_2c zgagkjBm=2TmlU1Tnn7(K5WM|?iUDakwSHWmB<1+|}P?0FC<>z&ptG-EseJQc5 zFBw?2b#}sz4`c{~Q(|%m&viCct)AK3lD)!xYEuGG z&U7YI6WD%wR{d6~RQ^6aleH;nb8x9zKC&cxVxk+-0+iUo#S7RHwwMeY;_1g)UR)B% zPD;dT!vEYoEZTIUck@nZ)IvxM{X))62l}sFHFvkN8H85e-vo`Q@nyesFCci_p^Z#w zRAl{{|B2Jur{F?pJT){`Wcrn5lnf!f?d9`Ux5YtA1Y{))X@4Mqy8%dq zAnU9M8_1AT$fQE%6tY|)I}~#AzoG!t26*_935S4oEXnXn=ltc2FFl9$Aa9W)`^aDb zigz(=DbWhZa{htLOR-1Mdg5bQa_HEPNOj0m&?O1Py20#1OS5+!pW$A(yCt!ab8 z4Cb(a<=0vf1twYHF{=m^(?UVM#{*CkK(rtSh|cj^u;Ena3&jnK#;OdP7n{d;cd?NS z?AnFxd0B3=p9&2U2bg^ZDO{}Z3|_?n zM;NSeLajE+aWgD|@B_V&6c-^ukTj!VDHAsIg60q)A($Uf*c;Q-Nc*++E2fL0lk*WE zEbKVKz)$F{fDA#9$d)a84@i8O!*$>Oy`rmro{BXHox|hk-b4J^0umfr3^6!wAR>J= zzLm_IJu#@kd&fv2Oqxqtq(??%lDZ^BI4r~vN6xpCBQjQTZ=5g-gV=Hd9VqZk1lkNO zM>u^_Fk%Qlz+`ZB5Y-WbCM8mYd=Dg_L7aJ-LKG*f{Yab`q6Q+^GNnt695LVIr4I!1 zmJ!DwnxZL0RmoU-Pu9LB4m?dE>h6#*XH1_qb;{(S#0%$-#gQdLntnJS)ghr&{t2!Vo~#c?vkiUkKO zC}M6RL5_f^BLerEK8zLkKzcp}fqCp-MXcu>QELL0mSbT8SoR~Z9T)(BIqQOa%1O{; zrc?g^JtzelY>Yv#0a6M72FT$+0y5xXI0QV5k)8!QG4UaQdzf*+6faGkCjU>_hBr;5 zbLn1skWC?!IAoMZjcKZ;Yo^V@5@9pO;tn$moWT-$l3w$($p12`KfJhZmmo zk%}c^@Qm=K22I)&8@g+*UoqlH1kenM`=HncD5^pCjBZhP*KNT6|Hs7qf8*+Kz}3@L z;#JL6^i{%@J6GmiiC(F?TzlCC0n7l_13Q32YCwzvKn$_YA7W5&jsJ6ths6m}p-UE~ zK#7u+tLBfz2gOf-Mh%)IaF;Ayib~$Nrbv}7O;xhRYS*bvw;Z|HniPrF%0q#_W~g<= zRUBW))9nA4&x*x(~_QnM;&v@adl3*;H-1b zyXcHn`t|5FsLy~Q!zPRxGj7(DX){L5TV}zc6_(UnZoM_uT4#gRO!ZOUxvLaeq-gTG zMV4A@iDe!$NyTWZ&2Y>i9iFd`IhI<9y9=qiV~*z7tvMEHj)R(0iJLxgce=?m7_>FC zEv{aSc)8YyVgXQj=3{NhhV_FRVo;uU?5xyd&!k7P_9V4bAJ8Rd@DXK^x!n04+r&VfCmCJcY{VUf8^_5(%)e4Nwg=9oIyYunl zq84-W04ugC;Fmdmn$1*u{&~*dvs}O6vUA^aI61V2uLf%x=xNplWszC$jz(Nq?9X3- z@Kg`p;7zrs)_9e{4Q+$wEvt4^5~v=n!2-bvzNX?G4-k(-8bxMwG3<&b&xV79l}IXWnsD^wo8Pq2W(e zpWDvx+tFE9NUg+-d5N)=)oVwysbamL#0t-HA3=TWWd}hEbf`ZWZT2D_tGA)N@^K zCj0|SfA@2)wO#0(FV5zSMHkw+n`$8o$I(td3PPXWD{Yhtgc7+ddRJ?i^^&%!c8u1s zUh#OIQEFyU7*V*A9!e&_=n8kfWS&i=<~BCgcRX;Op%<)|B-|79EUY5fy}P5pVM6mT z-CJVZ6@a>R18A*;H(`m8hH6-5Z|rV{2ly{h0-1wnq3LRGd0-@$|QmF9w6QWOca#XK$*$R2o$b( z#x-+q%Ww|pG6#m%D^F&s6#gx_*4zlT0B<^x*szT{hBz0FmBh<3aziW}VDR11z9vOJslu3liO3HDTed(Dvz>z8Lu1usSSUT9^ae*W+@j~GV_DVSn4gj#$|1L z9Rq`+I!+nm7Lq3uNfLuajHWb{(o&63Ajd{he^#5SG)3o(R()AB*AaX{ib+etjbTg2 zE!o?$n9BGh<}x*dI}R@F?B{nhtvLWH1B?hrl_|>ehZAQWFm`uM0IGa*Z^>2odiU>% zI1#eZk;Ik^S-K@rWkc7sD|4SbkZjvvQD}@pEXr1!aQiS5yt$43C2pQDnf2+mjo6fS zHx9;F15^$eAyIh4$P1(-u%-a=6wy9$EO8xLiWQ!X3YLTGj^mE6)GE z@>}`C!-)nG2DrO}OHBfIS8vX-lQ!cgGQIplTs4X(`|x6i&4opB(dt*mp%@Wj@PMYO z<1055mTO-v#KPW@_W8+lyZCTOWr;nKOr&fe4%&r+WzkZ6xz(?EYGAl+9S710tCd)_ zIkU|((;Zc`U|=}=w$^1t$>4AU5MF*1IDSsz&Zf`pirG%U+;m{=U;Dw-{9py@*Z+9v zQt3zRTyRvFmauHN>6k!stI?WVoBBZo?pHzbr$YWzx__^IUiM4*Y3_Lkkw>i| zn1QjHS9d9Yw7J?l%p$sZN36yPe+=eN!l$p<;_Gnu;Sv$w%o)pRq6o>CTzgAh6g!LP z`Obnf4}h(1cm9QiVDUz`q$dF`hvqORVM}p4b#JJw9V(i`puoVm+}gwzmTi6Zlo^v# zk))x^6xBh!yuQYktbpbLB_db8lfheI2K&+ywOm)Oc!T6*q1=f^U0?GP8PV^pO`7x-Ay>nD=PLeZO2tb?yBXI!`w|BVMXmAC zKBonLI_`>DY^f`BgcAXhGic|gU$JNj3qtLJVOazlBq};E=QtN^i`=$87}Blu4`(nz z2t(AJZ8|`Cbb)~u)T=>4ZR%m6UenI>mBS{qFUSk-`tKXc7r_I#-*A~VOtQ3)-@dZm z3>`2TgOhV~y826JjEUUdO5Ya!G7Q;48Z@EQ61noKbbV148b?23cimZs{(eMC?*E(u zWIZU@``OyjOYX4cPtH;nj#_1|^Y?tT{tst|%bt|%o!&Ql02l9>+M63TwC`M5z#@3J z>aB>gCg>NSs{u(BbpATLD9|V(B&w!svBp}?g~t(_5Ai_{S;@%wzdVY@mcv_Qh2|;U z?So7MEsi&ad2`6&0EXj87=c7f0K8TToWZ4-P>WYwuy=)?AVY}3no~xPN+__ZCZ@iI z0okA2$hxRs9ImpycyyP+E(?1vB_~k41U3P!q&%xoQVAxMC0vyKQpo;3tBlZ!6GAU& z3e5LvG^{&7#Nw9p@SR`sXl0>I&!lfYdvACSjv}yjTJ67@S!=FF$y%YRxv07n>#Q=? z`XBrmz8!?B-!$o@YBuMJe%F=)2_h6l__F{tuwkoef64FFE9+m9F9}&rLm%boD?GC`o}6 z#C(3IN%972Frwu)(%kc`!zplhAmflqWas8wi+$QYrYRYNqbw&h=SETrw6f?eKw!ta zyNp~Qov*Z?0sC6Xnd|5q4w+s56tb*W5(1R*0>8B7@(mhDf2Qy1)8` zem4~b_if6Iq4|T=4c9qP2Tut9xhG>s>wJ!J%-y>72RB2*-~6yph``7qScc}wMr-n* zvDko};-o~e$P zG3HO|5Cv&0+O1Z0CDa(s9tLTuk-FyRK!2%&`+&(AkQt*BqsCMYf~d7Uh=beq?i_qv0@J zL7%eA$m`#=b^EC@g{)(GZ|j#OGsTig7<-lYr9_b-lH_ZO`s-*AqcC%Bk3yYZ9aA&6 zW0rmC{)xjBnN(YUZ+7Pvh~IPtMmXn#bhAuf><#}QelJb)7E4IG3RsKuSYygpDXh-cur8C<(p>K(Wu$56MDXk!&Q|sCVBj=vrJ)jH4roCbOZ*1MKe~1xFi&Vx3|iczNSxX3{79 z@m8+fIoCRGpjoG8e%zZBnu(&Ddf+dGZV3&ob6WD*@}mj36U4Bwopb`LW6&@}Of@0y60O$Q3OHj+Pw-;aiV_qb4!js)T<$#$rzZuxl!g zh8ghGT1)iX$%JlZpF4p>SafdTd!`lPV~Yx>uK-^@e&69f%rSHu7n>mFYK z547@-?soA|g)zWTEA329*7sZ9X1I{UKdDJf+P9sy47RbBW#lgTuu4HxX&Lm~i1?`^ zk33A&(dlh6D8xFUbuTyv1)>%@j{gAu(9efi{ef2_-9o5Z7u?nG=P1l=xn2A%yk*{T zM`0iqW|DuL5coIPpvFQ(V zLS;h4b+I}y_EV@P;?XEg|H1az>=q{4LIH7f^p71lzzNOa8uHOOUziAk-6@j5Mm%|;Cb}&&zTXo1!D(^63|Ru9@li|l4@Qeo<@l%!F~7skBezaF zvG-`t*leCDpOv%6L>R13xr&FJ0}aihRDbby7HD(p%&UQ?CC<(x$}|-;4hhqQ)hu%$ zV83ubaPWb*Jsv|8VoebnitVcNq*{y9K=|idurjsQuCdn7=cmj<>&9Kt8i*IUP zQvP0D7405}X4)*GbL9`?SJjS1;~!Qy#+!Quu~obEDl%_$VR$-d2bOm#~JfE;tlm-Htez>C@U0RCKF6M=DXE~GI={7~i8D@(IA#U|Sd8dp{3zcdDh#A7zh@|0`wrF$z%_r|AO!z{Om$9kZx@zB;T zP1v)fbPc>>O<+mc^XM&K*fr>13imDb4wl`9x~69QI#L-u25pA>H%E_E{5p~mqQA8* zq4ZjA+5Sh_ZmlH#5uaXo1j$t-)9d={bhwOWCJ(^?8$5TFhEOoYW|h zNkMMlmovd4eI|?T$k|BHF^L8f`Z)Y-X#G+en`nIz#ELn_%*f)`zudT5k1en|0ZqKx z4miB#NblmHmHl<^kM)N7#bp<5sQ z(3-5+`3h|`V+tw*HHBeEk{e;9i5%>n8DsZu=8~f3&=)X%C=|YM9%?X)?8fX zb5X+i=XOah?sKiKMXNVjclNm%Hd!R7v)>*20*xS;Lw>=MrY`f*-=64$H~UQe&G*v` zFekZolnZNM6%`oWAdXT~yvYZP=)n}JULseTbl0rt74jx)J_eLI9Lk?>QJUi>wNKJx zmZ1Afv4t=wZL^haaUZn%<+TN!TE8~H28Y~(?#;IHbGWl-FNv{(^3Cq84lu#3?k%=5 zbogZPygc>w*z0OW=Ns?oKv6GdZYF8aBkz)yz`jhQ8i=4%?F0=(YTB2uCDQ+PqBW$= z%!BGr9gM!0h(`qGFcnT6W)dDDUiL8@pQ=rHZ)Dec=YQ+y-AG8u;_TD&%uP@afi*^FJSf&G={dFA!Dv$;8b^TQ?=|CRtZ&)#-sH# z8uR$5rzRs)F+hAO-cS%bl~;_*!WHwTV#mJ-G4wGX=4TYm&bG0s2CNd57ng@3OMa@^ z{+*xmgya8iPOeV70H$4_&gIUI@xYxMoEzXVp4q*7s|!BLgMV04BwoN4J9%ac#_1sa z_~FXtMVTLAv}T=ZH&uGzJ?4qrM4pO%7{^%8DzkgTJ_riiY)}~TL1C+qeT$`F-D2Ba z`&iS-cYoSUCU5@fF4>FJa9Y^x7S0b9@O_^|Wv#o*+HYFix9glPOLtCl$9l&z8?XCF zY;pgd^wqcjPro8(!F>I4%56*Un1yd*C==DDZ*dboIA%P$+80U`xAF|tI=QkV6Wfw% zznE5Ph$^VEgGbUK#89l4E@n5HAPYiu^#XX|s(sc1O_c&Z0CN#*&iB^yc9=8Qe5wG} zyY1U!#_A(dMBL|3_x7p#B+h>;1FE*X`TqG3hXKXA_PzC1U5Iy?zHF$<1;sRn%w~PR zTWBYjH3l>lVhWo8JHhNTj>(1Kmxx?er*Jjcamq4K-q28P`BVG8uNDd+0=-zP)h`aM z*mcd!nVI=aO{yN6F{5UvEU7_Vr-i$zt5@vUhZrpO=>T}$Zj(ad2`vdpJc_pC z-w6i%!fu`t%*Ex2t`~-H%DyqYAUKpV6P~7YFErqfgMU~CZ4E2PKv6Oc9Wgk!WdTeM z-f`ZK6T9lwQ-2(_7RvN?or95~JMfv|I4KkVtoz~}#2i;NC(#3M(eoyi#XJxZl^V#a za715oWkqbQx)y|2OFcghgRHDqH|Pe^c04KA+)xu&tM2XQEz~Ffc)L4cL!V~sX=TfB1VzW9!&VWV)?4VNjT+_CF;FyAA-$uaX zS|ZI^+}R zB%1rfcTt&oseUh2mFlfiRuCy!*a#sT|GX!M@%_Hwk}Elx%hFQbd;dr>P?}slH2s|a zInnz0X}|JkxudWgHAAT zvvOH<%Yh<#q0!&y4+gqhr0+G+%mE7v`Jpru%lJ$ks~$#!y!7{}#*8YpDkDlY zzE3aIa&Ry&z+l>}ogL!0`DSjAlkti9v1@(pQUPLL?X=w8Yl{tgHUx_IKB1 zVn9@hR_Z~0$geTw17*_MH1NRll#@d@SL%Px?2=qqyMA1ui(^j1&fhi~HvYBK@D?{v zJAH7*Qhoo~-1+wfB2kaJGN-xDZ4%I!Qg>|ISz(3NnqrsM#hf??T;0Tp>s0-8NIMia zorNr&&M7{ksM(Y^+kM>b49#9mnYDATh#2aAvz1~Zo#)us2QPh6{M1_t=JXxdw~w83 zQp-~04am*(`8t|M2yuONp>b&C?nq5zSs4#KvU|ge-J)TxkUK2e9gUp-(xqD3mG=b= zyeNNRLh$)j372rTBk)-7#(4+K{Fa0U@&5+2pr(pndd!?An_GWA1s#h@A&?5Xyzb)o zM>w@k$t@IWw^Uj$2J#E2_FQ;A6Nl}(u`T{IUuNd9$#-AFve9&&U9OkhW<0&wN1{&0 z#!4J)!8BI2K^^jXpf|_}kGCwyqdaA)SWhYa*~t~@A15Xxew_YGJ#S)T#n-{Yz9tEX z_40o$J-lN^NvH^sxf_N0ah+k?DUoauomp(R%a8J32gudJ^?yG(&L&_JbK`Qw1tdO+ z@J)JL)@@YLqLumKLh*m}g26NJmnTSUP}FVQJ**hI?s;6qEz+uH?1s(U)x@ag_uQL2 zn~cR5pkXK#CihUcDQV)0U~7Ck;)6d4oSS?Bpz{`1D*=;|JY6_e9(Y9yYzVrBmy_5d zTmh&%fK{WBXf^iR9TsR=dT2QeJA8L3!^J>_=)6Z_ZeUw!_S1VrUe;7^E3!b+e2*Grd*%1#BmmG&sg z{iZ)LIepWQao4Yq-sH~RaxxEG%3f-~ugglwT8Fn|H*oRTe6s}FWhRowzv*EsCLxvo zGi}+W_L<)=p?a1kZ|l$b@cq0s&nq(n{Ua&|^&{H;7&tQjh*zN}T1bCURk0IwYRRSD z*U2&}`Khj*+glfU|7oGV%gtHcJa9`^*BRMckQvFy^RdS?6x>Poiyh(o%(!UXJv=$w zvHsTnBKIxAvtxXB=fA=DftQs6F`}xRVlgU`$9V3bW zMl^8(RWYZZvTs8}Ty;8SSVhl!)6Y5<3oMZO@Bvz0%<*Efo?-vNz`rR;1RmSL?_Y`F z7eWxy4*!vZaHF6d`R%Dlo#*S(j&3j z47&u79j*nbrG$cZ#09CPgn|JC45cfzlu|*!T)I+A3FWMNxB8;n1Zc|mti?l9BYvd6 z9;W%R{zjPQC;IF98~U4JnxE=#g=zgWey+cvzoowurs+k&8Tr$Flm9ZCImE5Zf8qZ9 zdJF>z{yTleR4niHtKhl*>a7^wN-X+)guLjR=uF9Qxot5IOSk57>`5<#(;KfSkupur z;I_<+Z<^f9WE(KC&8aJN)I4iSReVM2kGM)Z?=SEOEqpCYRD7%Ps`q$mSaUMuL zkWT-)8}O*z_%Gd2)yz@d%*oQvx!W@(UgBW9j-5PWxEn#oHkFQqJg%yPG$A_%9(ivT z_==iGF38ik_*!c&X8g$gfKj9?fgiaaz=l#L|Ac*CCPInvh{4@n9u!LPvBQtt57?e0 zNV8CCDuZbMvL|~qC&s%cqbhLXy}Njn%12RpP?V%<8^)cYBMlfFlSNZ%G(BzF0GS#Ep)EG&?N|SQ>4l9g7MY?v z&ly=E)?+k53;rEj*5NlPOs?uoMXNN?KEf1DTGr3KqP`jnWR7t$H zVDt^)0}UReApIa{mC>8gB{OD%K~JD7y%j2m#j5dyCCNglstVM&sz8!6zf2}c73BT6 zn)y(?LgmRSqCLt`G>)=U0P0DpoGbELz$KP!E0FV`nH9u){1S|3LHr9Pq^v)qc1>$w z@~hU^rmDI}WRLZU%zv(jo~ZaTmak*MJDm`HbaMJHDt_VQV<-4T$rn!0wo9^$w-LEnssgB{hX5igxr?vd512rK=LF1z?r8r^`xb`>a|4*Hwl%0PPhz!-7hir zy*_E7r62e~ba18@B6Vm-#=v=9x>|V>_bT|HR!)bIc@~uB&GDj*9RNA~4k=PBm)xRG z?7*+^&jljLdBU!)MvE}fNM-+NVPd+L^S!oV#t}s9&@d|c3mUWro|$Y#WDKjF5LQTe zsge%~iDE4DV0~zCja@o{f>30`T)2QNlxYfp&WQD6ao>|g$Q#E2g8K+y$nW`llKYey zPW9U`5^m%>@eEQo;#r&7(q%A+-&N#IHnmoX9k4$fIXKQnW)q_gGqY^8^ujj+5(FJ1 z8@Z2_QTG`0{mMxHV7`m->VZ-8H!bE0?Y{l;d+8%?7hRZ`ncE3$&D}}AR z0>C49LE@%fw;-*G_x)alSasB7GF@asyFuwAv$Fow*3^T?AD}q4aIQ57Xy`NywG)rR20c%G>0jKeCX620H z4Pptu8$*n;bXqF`^slR?kr+F`$c^LR>*gHWB}_Q5S_=b@4;VRRl*RpDn4es5AJ?KD znAj%FC0iP<1SUeHp zNi)o%VXB@ju)mu+K5nhMYO zE+_!ZVN{H{d*e2(vK4uIdlE;m4+Pzw*pDV;>xqAxP%F10nfc13jACOco!(Rs8a8{6VEbe*Q?>WDA?GI(xH7|Z3Wk3p=*RTKb)TAX`mLyPHuY3 zW9cjc5^kkf_1RJHOdZ`FV}Z5wBpoE3p6jUufa%I`jCa;6**C`3sSbT3rG^M*WvQq z|HW+1HG`^2 z24a+U%ol~w)jW}o73ys$lO=fsfwGq@9B2`sqR*frUf05x=v813<5Um9oPEWIuG~4f zb|kcJT#?xtgGuVcIEN?mq}NLm9=Jt^TXmyDH#&syPO_%pSe)~O62^@V0V!AqM+^WG z@m3MLiIX_yoio6CS0)*KghqVhL~EyA>ZK)W<7A`t7E@_mS+uP(P2IR#kOpYkHLP1^ zf^je?NzWNwJr7{^{37N!Hjz%Og)L{!X>NVOLOj(h^eV>{2#h@pYphQHq#Li1+;o@2zPRy;4;r6(wq z`%!fEOM_a@Hq)w0EOGx>Iw*V3>+Fyud&)g!aIbvAlM}gPx9*bi@O)P6J(e<#TJuT& zOVRL9@0W}};ftry-H^OmyD%cfo2`w0{J)R90{GT%;gcd6KOqhykPkd5D>*rUaI0y* zh*h*Y>3b(V?$w3fxpy(^7Y?9$-t+^96;>NiELst%$x@ajc+3f63IGSxeybpe?O;}~ z5E2x%&)&p_ej-X9YCxHM@zM6Fsm`BH*PST?G2zV*nV42oTTs1sB=KLyp}>yE7t@3jgKdfks=yB3ZML2}va;3J^Xi ze;~;m;+yic->_IKnIRo>qID;tz|%ueuo6zUBwSGKa-r(ouub_!v)DixMQ%V!#zjRHecxvaUAs*l)qYau)^_n{HkS_={hP zinZ7i{L^^b5HA=0iwwO%{7dF&toJcBLjrW>%=x1EpAESU1;A2*Kx;WpTTaLhxb0xo z%!Ny^x^K71p8UoOp9oCSe9CNK#N0`+#meWLxuMpL>;aen&Sw*Drva8_`aJP=JU3{j z3KE-$dM7|y2yWo%f;I@KbG=&XDZfa)#`zdhs&Cu9%8S*~PfVlt0txzo)~z+7sf3i3 zUqIR>U7XoTvc#?lJl}>~J*#VD&!X0Q7bI+TLXDUBLEMfCM|ZK~wF9t|i<6j!Vj(#E zopOTllxoKMW5~vCzPlQmL`FSzaJ)K=Sk$a!J<3%C)DGu&Bu#PP#GJd=$WwXnQcS%F=E)>*yyP&>PzJ<807pXt(!(v=ou8@FY$!`jOg3Kpj%7zoX()b8Qkb1z7O zHNDjm*FqwNxBNBb~sUVV}Q>_A~r75M{=uJFoGpu8vLR!*y#{zmzPj($a zGDT!P0gG9W5LR;>;ZBOLlNz&t2PL4rzE)?}@yFA-0p{{ahJjZ2d3djGbz07d^Hix0 zaVbJuA9g)8v%i*ch}Uo^s_EL`7s#B4bjTUg-+Ueh40CgX-&W?OR_hTfo({fpgMLn7 zO2@_~E?&dMrjo&~7%XP(y1Hu&ee`yXk6gz!@b-sv z&X}=;?M-*5pa*c{-)?D0IfYMy~4cmMC z{#P`vtat4g%%L*R{j>uY+ ze;sU)AqZpW;!gu+easBNGQO4yC1er|Z&-4=a;@64Ytu`R8o`Qn#iGTbwS;HHJmMZv zYRSmlwrAVR>fI!&RPRpX`ph}bF?sZaI-eo7SHy+oj$SvMU|A&Bp z%HMec`48aIlD$J*`M8aB|MTDWEh>e9HW)yFe_Z-@s%DaZ4EhY2pNhv*5Xla&rxXsf z1jOQ~(x_YmSHwZ|3De`CqA8<=qaxyi7mQIRA&Zm?6e~@4z@VlSn+|sJgOQP-q=!o( zijGHQiB^ncDW5tUEXu?J~L?wCfab3^?B(ARdpm zm~s&iKs!kA_u&xGDhm#k9003vmlZ_GvkFGcjS9}*T!q0umlNJAXAMX#flU&5iV1SX*i|ZYDaV=4m$Chk}F?(0r&Cp<|<4@moB|A@S**3CzT@mR;cox`|K zfzH$j{`NS@-S77I^jV5m-qa7{?=Nj|%fY52ZU2oo);vwd-#UF?m;1CI7tZz%$nNN9 z`|NCb@6KbCt!?LtdQupF*2jMF=QeHUKGo-`HUixs5H%6;L=e;u;Y0)?URCeo9rq3g zj$Clb71un)hNpRkXL)XH=j&^))AwmTI3Yp%W+dYzBrN(uVPOGWnX`5sBt{Vbzy|n; z3`NE + + + + + + PostgreSQL dependency explorer + + + + + + + + + +
+
+
+

+ POSTGRESQL / DEPENDENCY REPORT +

+

+ Know what breaks
before you migrate. +

+

+ Trace dependencies back to their evidence. Review changes before + deployment. +

+
+
+
+ + +
+
+ + + + + +
+
+
+
+
+ + + +
+
+ + +
+
+

+ + + + + + + + +
+ Solid: catalogDashed: parsed referenceDotted: foreign key relationshipArrow = source depends on target. Impact follows reverse + arrows. +
+
+ +
+
+ + + +
+

+ OBSERVED = catalog metadata Ā· PARSED = syntax evidence Ā· INFERRED = + unproven Ā· UNKNOWN = unavailable. +

+

+ Graph paths show potential impact. Runtime coverage and lock duration + require separate evidence. +

+
+
+ + + + + + diff --git a/skills/database-dependency-migration/assets/viewer/viewer.css b/skills/database-dependency-migration/assets/viewer/viewer.css new file mode 100644 index 0000000..d594ddd --- /dev/null +++ b/skills/database-dependency-migration/assets/viewer/viewer.css @@ -0,0 +1,749 @@ +@font-face { + font-family: "Archivo Variable"; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url("__ARCHIVO_FONT__") format("woff2"); +} +@font-face { + font-family: "IBM Plex Mono"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("__PLEX_FONT__") format("woff2"); +} +:root { + color-scheme: light; + --bg: #f8fafc; + --surface: #fff; + --surface-soft: #f1f4f9; + --ink: #182331; + --muted: #5d6a7c; + --line: #e0e6ee; + --line-strong: #c6d0df; + --accent: #345bdd; + --accent-soft: #edf2ff; + --green: #267463; + --violet: #7a4dbb; + --amber: #956318; + --nav: rgb(248 250 252 / 86%); + --shadow: 0 14px 44px -20px rgb(24 44 76 / 24%), 0 2px 6px rgb(24 44 76 / 3%); + --font: "Archivo Variable", system-ui, sans-serif; + --mono: "IBM Plex Mono", ui-monospace, monospace; + --ease-out: cubic-bezier(0.23, 1, 0.32, 1); + font: 100%/1.6 var(--font); + font-optical-sizing: auto; + background: var(--bg); + color: var(--ink); +} +:root[data-theme="dark"], +svg[data-theme="dark"] { + color-scheme: dark; + --bg: #10141c; + --surface: #181e29; + --surface-soft: #1d2532; + --ink: #edf1f8; + --muted: #a5b1c4; + --line: #2b3546; + --line-strong: #46536a; + --accent: #91abff; + --accent-soft: #202e4c; + --green: #85d3b9; + --violet: #c8a5ff; + --amber: #edc17a; + --nav: rgb(16 20 28 / 86%); + --shadow: 0 18px 50px -20px rgb(0 0 0 / 65%), 0 1px 0 rgb(255 255 255 / 3%); +} +* { + box-sizing: border-box; +} +body { + margin: 0; + background: var(--bg); +} +button, +input, +select { + font: inherit; + color: var(--ink); +} +button, +a { + -webkit-tap-highlight-color: transparent; + touch-action: manipulation; +} +button { + cursor: pointer; + border: 1px solid var(--line); + background: var(--surface); + min-width: 44px; + min-height: 44px; + padding: 0.55rem 0.85rem; + border-radius: 8px; + font-size: 0.8rem; + transition: transform 120ms var(--ease-out); +} +button:active { + transform: scale(0.97); +} +.keyboard-mode button { + transition: none; +} +.keyboard-mode button:active { + transform: none; +} +@media (hover: hover) and (pointer: fine) { + button:hover { + background: var(--surface-soft); + } + .tabs button:hover { + color: var(--accent); + } +} +button:focus-visible, +input:focus-visible, +select:focus-visible, +a:focus-visible, +#graph:focus-visible, +.node:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 4px; +} +.node:focus-visible rect { + stroke: var(--accent); + stroke-width: 3; +} +::selection { + background: var(--accent-soft); + color: var(--accent); +} +main:focus { + outline: none; +} +h1, +h2, +h3, +p { + margin: 0; +} +h1, +h2, +h3 { + font-weight: 560; +} +.mono { + font-family: var(--mono); + font-size: 0.66rem; + letter-spacing: 0.06em; +} +.skip-link { + position: fixed; + top: 10px; + left: 10px; + z-index: 100; + background: var(--surface); + color: var(--ink); + padding: 12px 20px; + border-radius: 8px; + transform: translateY(-150%); +} +.skip-link:focus { + transform: none; +} +.site-header { + position: sticky; + top: 0; + z-index: 10; + background: var(--nav); + backdrop-filter: blur(20px) saturate(160%); +} +.header-inner, +main { + width: min(1400px, calc(100% - 96px)); + margin-inline: auto; +} +.header-inner { + display: flex; + align-items: center; + min-height: 86px; + gap: 24px; +} +.brand { + display: inline-flex; + align-items: center; + gap: 11px; + min-height: 44px; + font-size: 0.9rem; + letter-spacing: -0.03em; +} +.brand strong { + font-weight: 640; +} +.brand-mark { + width: 30px; + height: 30px; + color: var(--accent); + flex: none; +} +.brand-divider { + margin-inline: 7px; + color: var(--line-strong); +} +.brand > span:last-child { + color: var(--muted); +} +.stamp { + color: var(--muted); + margin-left: auto; +} +.preferences { + display: flex; + align-items: center; + gap: 8px; + margin-left: auto; +} +.language-control { + display: flex; + padding: 3px; + border-radius: 11px; + background: var(--surface-soft); + border: 1px solid var(--line); +} +.language-control button { + background: transparent; + border: 0; + padding: 5px 8px; + font: 400 0.64rem var(--mono); + color: var(--muted); +} +.language-control button[aria-pressed="true"] { + background: var(--surface); + color: var(--ink); + box-shadow: 0 1px 3px rgb(0 0 0 / 10%); +} +.theme-control { + display: grid; + place-items: center; + width: 44px; + padding: 0; + border-radius: 11px; +} +.theme-control svg { + width: 18px; + height: 18px; +} +main { + padding-block: 52px 28px; +} +.intro { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 32px; + margin-bottom: 38px; +} +.intro-copy { + max-width: 720px; +} +.eyebrow { + display: inline-flex; + align-items: center; + gap: 9px; + color: var(--accent); + margin-bottom: 20px; +} +.eyebrow i { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--green); +} +h1 { + font-size: clamp(2.5rem, 4.1vw, 4.1rem); + letter-spacing: -0.064em; + line-height: 1.09; +} +.hero-accent { + color: var(--accent); +} +.subtitle { + color: var(--muted); + font-size: 1rem; + line-height: 1.75; + max-width: 700px; + margin-top: 20px; +} +.stats { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px 36px; + flex: none; + padding-bottom: 6px; +} +.stat strong { + display: block; + font-size: 1.7rem; + line-height: 1.25; + letter-spacing: -0.05em; + font-weight: 560; + font-variant-numeric: tabular-nums; +} +.stat span { + font: 400 0.64rem var(--mono); + color: var(--muted); + letter-spacing: 0.03em; +} +.original-text-note { + margin-bottom: 22px; + border-left: 2px solid var(--accent); + padding-left: 12px; + color: var(--muted); + font-size: 0.85rem; +} +.tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding-bottom: 14px; + border-bottom: 1px solid var(--line); + margin-bottom: 22px; +} +.tabs button { + border-color: transparent; + background: transparent; + color: var(--muted); + padding-inline: 16px; + text-align: left; +} +.tabs button[aria-pressed="true"] { + background: var(--accent-soft); + color: var(--accent); + border-color: var(--line); +} +.toolbar { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 18px; +} +label { + display: flex; + flex-direction: column; + gap: 7px; + min-width: 0; + font: 400 0.66rem var(--mono); + color: var(--muted); +} +.toolbar label { + flex: 1 1 140px; +} +.toolbar label:first-child { + flex: 1.7 1 250px; +} +input, +select { + min-height: 44px; + width: 100%; + min-width: 0; + padding: 9px 12px; + font: 400 1rem var(--font); + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); +} +.workspace { + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + border: 1px solid var(--line); + border-radius: 14px; + background: var(--surface); + box-shadow: var(--shadow); +} +.canvas-wrap { + min-width: 0; + border-right: 1px solid var(--line); +} +.canvas-tools { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 8px; + padding: 12px; + border-bottom: 1px solid var(--line); +} +.zoom-tools, +.export-tools { + display: flex; + flex-wrap: wrap; + gap: 6px; +} +#cap { + padding: 10px 16px; + color: var(--muted); + font: 400 0.66rem/1.7 var(--mono); + overflow-wrap: anywhere; +} +#graph { + width: 100%; + height: 600px; + display: block; + cursor: grab; + color: var(--muted); + background-color: var(--surface-soft); + background-image: radial-gradient( + var(--line-strong) 0.6px, + transparent 0.6px + ); + background-size: 16px 16px; + touch-action: none; +} +#graph:active { + cursor: grabbing; +} +.node { + cursor: pointer; +} +.node rect { + fill: var(--surface); + stroke: var(--line-strong); + stroke-width: 1; +} +.node text { + fill: var(--ink); + font: 12px var(--mono); + pointer-events: none; +} +.node .sub { + fill: var(--muted); + font: 10px var(--mono); +} +.node.selected rect { + stroke: var(--accent); + stroke-width: 3; + fill: var(--accent-soft); +} +.node.affected rect { + stroke: var(--violet); + stroke-width: 2; + fill: var(--surface); +} +.node.changed rect { + stroke: var(--amber); + stroke-width: 2; + stroke-dasharray: 5 2; +} +.edge { + fill: none; + stroke: var(--muted); + stroke-width: 1.2; + opacity: 0.3; + marker-end: url(#arrow); +} +.edge.parsed { + stroke-dasharray: 6 4; +} +.edge.fk { + stroke: var(--green); + stroke-dasharray: 2 3; +} +.edge.active { + opacity: 0.9; + stroke-width: 2; +} +.schema-title { + font: 13px var(--mono); + fill: var(--muted); +} +.export-background { + fill: var(--surface-soft); +} +.legend { + display: flex; + flex-wrap: wrap; + gap: 10px 18px; + padding: 16px; + border-top: 1px solid var(--line); + font: 400 0.62rem/1.7 var(--mono); + color: var(--muted); +} +.legend-direction { + flex-basis: 100%; +} +.hard::before, +.parsed::before, +.fk::before { + content: ""; + display: inline-block; + width: 22px; + border-top: 2px solid; + margin-right: 6px; + vertical-align: middle; +} +.parsed::before { + border-top-style: dashed; +} +.fk::before { + border-top-style: dotted; + color: var(--green); +} +aside { + padding: 24px; + max-height: 850px; + overflow: auto; + overflow-wrap: anywhere; +} +aside .eyebrow { + margin-bottom: 12px; +} +h2 { + font-size: 1.25rem; + line-height: 1.4; + letter-spacing: -0.035em; +} +h3 { + font-size: 0.85rem; + line-height: 1.6; +} +aside h3 { + margin-top: 24px; +} +aside p { + margin-top: 10px; + font-size: 0.8rem; + line-height: 1.7; +} +.object-id { + font-family: var(--mono); + color: var(--muted); +} +.evidence, +.path, +.unknown { + border-top: 1px solid var(--line); + padding-top: 14px; + margin-top: 14px; +} +.evidence { + font: 400 0.65rem/1.7 var(--mono); + color: var(--muted); +} +.evidence strong { + color: var(--ink); + font-weight: 400; +} +.evidence p { + font: inherit; +} +.original-text { + overflow-wrap: anywhere; +} +.path button { + width: 100%; + text-align: left; + margin-top: 4px; + font: 400 0.65rem/1.6 var(--mono); + overflow-wrap: anywhere; +} +.review-toolbar { + margin-bottom: 24px; +} +.review-toolbar label { + max-width: 260px; +} +.finding, +.phase { + border: 1px solid var(--line); + border-radius: 12px; + padding: 24px; + margin-block: 16px; + background: var(--surface); +} +.finding { + border-left: 3px solid var(--accent); +} +.finding.high { + border-left-color: var(--amber); +} +.finding.unknown { + border-left-color: var(--muted); +} +.finding p { + margin-top: 12px; + line-height: 1.75; + overflow-wrap: anywhere; + font-size: 0.9rem; +} +.finding .evidence { + font-size: 0.65rem; +} +.unknown { + color: var(--muted); + font-size: 0.85rem; + line-height: 1.75; + overflow-wrap: anywhere; +} +.coverage-title { + margin-top: 32px; +} +#change-list h3 { + margin-top: 22px; + color: var(--accent); +} +#change-list p { + margin-top: 8px; + overflow-wrap: anywhere; +} +.phase { + display: grid; + grid-template-columns: minmax(140px, 0.3fr) minmax(0, 1fr); + gap: 24px; +} +.phase h2 { + color: var(--accent); + text-transform: capitalize; +} +.phase h3 { + margin-top: 18px; +} +.phase p { + color: var(--muted); + font-size: 0.9rem; + line-height: 1.75; + overflow-wrap: anywhere; +} +footer { + font: 400 0.65rem/1.9 var(--mono); + color: var(--muted); + border-top: 1px solid var(--line); + margin-top: 32px; + padding-top: 20px; + overflow-wrap: anywhere; +} +[hidden] { + display: none !important; +} +@media (max-width: 1100px) { + .stamp { + display: none; + } + .intro { + align-items: flex-start; + } + .workspace { + grid-template-columns: minmax(0, 1fr) 280px; + } +} +@media (max-width: 760px) { + .header-inner, + main { + width: calc(100% - 40px); + } + .header-inner { + min-height: 76px; + gap: 12px; + flex-wrap: wrap; + padding-block: 10px; + } + .brand { + gap: 7px; + } + .brand-divider, + .brand > span:last-child { + display: none; + } + main { + padding-top: 32px; + } + .intro { + flex-direction: column; + gap: 26px; + margin-bottom: 26px; + } + h1 { + font-size: 2.5rem; + } + .stats { + width: 100%; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; + } + .stat strong { + font-size: 1.45rem; + } + .stat span { + font-size: 0.58rem; + overflow-wrap: anywhere; + } + .tabs { + gap: 5px; + } + .tabs button { + flex: 1 1 120px; + padding-inline: 10px; + } + .toolbar label:first-child { + flex-basis: 100%; + } + .workspace { + grid-template-columns: minmax(0, 1fr); + } + .canvas-wrap { + border-right: 0; + } + .canvas-tools { + padding: 10px; + } + #graph { + height: 420px; + } + aside { + border-top: 1px solid var(--line); + padding: 20px; + } + .phase { + grid-template-columns: minmax(0, 1fr); + gap: 16px; + padding: 20px; + } +} +@media (max-width: 440px) { + .preferences { + gap: 5px; + } + .brand { + font-size: 0.8rem; + } + .brand-mark { + width: 24px; + height: 24px; + } + .stats { + gap: 9px; + } +} +@media (prefers-reduced-motion: reduce) { + button { + transition: none; + } + button:active { + transform: none; + } +} +@media (prefers-reduced-transparency: reduce) { + .site-header { + background: var(--bg); + backdrop-filter: none; + } +} +@media (prefers-contrast: more) { + .site-header { + background: var(--bg); + backdrop-filter: none; + } + button, + input, + select, + .workspace { + border-color: var(--muted); + } +} diff --git a/skills/database-dependency-migration/assets/viewer/viewer.js b/skills/database-dependency-migration/assets/viewer/viewer.js new file mode 100644 index 0000000..cf6e94c --- /dev/null +++ b/skills/database-dependency-migration/assets/viewer/viewer.js @@ -0,0 +1,563 @@ +"use strict"; +const STATE = JSON.parse(document.getElementById("dbdep-state").textContent); +const M = STATE.model, + NS = "http://www.w3.org/2000/svg", + CAP = 350; +const $ = (id) => document.getElementById(id); +const nodes = new Map(M.nodes.map((n) => [n.id, n])); +const edges = new Map(M.edges.map((e) => [e.id, e])); +const evidence = new Map(M.evidence.map((e) => [e.id, e])); +const reverse = new Map(); +M.edges.forEach((e) => { + if (!reverse.has(e.target)) reverse.set(e.target, []); + reverse.get(e.target).push(e); +}); +let selected = STATE.root || null, + zoom = 1, + panX = 0, + panY = 0, + drag = null; +let locale = document.documentElement.dataset.locale === "es" ? "es" : "en"; +let theme = + document.documentElement.dataset.theme === "dark" ? "dark" : "light"; +document.addEventListener("keydown", () => + document.body.classList.add("keyboard-mode"), +); +document.addEventListener("pointerdown", () => + document.body.classList.remove("keyboard-mode"), +); + +function t(key, replacements = {}) { + return COPY[locale][key].replace(/\{(\w+)\}/g, (_, token) => + String(replacements[token]), + ); +} +function value(type, canonical) { + return locale === "es" + ? SPANISH_VALUES[type]?.[canonical] || canonical + : canonical; +} +function persist(key, preference) { + try { + localStorage.setItem(`dbdep-${key}`, preference); + } catch { + /* Preferences still work when browser storage is unavailable. */ + } +} +function el(tag, text, cls, parent) { + const element = document.createElement(tag); + if (text !== null) element.textContent = text; + if (cls) element.className = cls; + if (parent) parent.append(element); + return element; +} +function original(tag, text, cls, parent) { + const element = el( + tag, + text, + [cls, "original-text"].filter(Boolean).join(" "), + parent, + ); + element.lang = "en"; + return element; +} +function svg(tag, attrs, text) { + const element = document.createElementNS(NS, tag); + Object.entries(attrs).forEach(([key, v]) => element.setAttribute(key, v)); + if (text !== undefined) element.textContent = text; + return element; +} + +// One BFS predecessor per object keeps the full impact traversal linear in memory. +function reach(root) { + const paths = new Map([[root, null]]), + queue = [root]; + for (let i = 0; i < queue.length; i++) { + for (const edge of reverse.get(queue[i]) || []) { + if (!paths.has(edge.source)) { + paths.set(edge.source, edge.id); + queue.push(edge.source); + } + } + } + paths.delete(root); + return paths; +} +function pathPreview(id, paths) { + const result = []; + let steps = 0; + while (paths.has(id)) { + const edgeId = paths.get(id); + if (result.length < 16) result.push(edgeId); + id = edges.get(edgeId).target; + steps++; + } + return { edges: result, steps }; +} +function options(id, key) { + [...new Set(M.nodes.map((node) => node[key]))].sort().forEach((v) => { + const option = el("option", v, null, $(id)); + option.value = v; + if (key !== "schema") option.dataset.valueType = key; + }); +} +options("schema", "schema"); +options("kind", "kind"); +options("status", "status"); +for (const [key, label] of [ + ["nodes", "statNodes"], + ["edges", "statEdges"], + ["findings", "statFindings"], + ["unknowns", "statUnknowns"], +]) { + const stat = el("div", null, "stat", $("stats")); + el("strong", String(STATE.summary[key]), null, stat); + el("span", t(label), null, stat).dataset.i18n = label; +} +function transform() { + $("scene").setAttribute( + "transform", + `translate(${panX},${panY}) scale(${zoom})`, + ); +} +function draw() { + const paths = selected ? reach(selected) : new Map(); + const direct = new Set( + (reverse.get(selected) || []).map((edge) => edge.source), + ); + const text = $("search").value.toLowerCase(), + depth = $("depth").value; + const filtered = M.nodes.filter( + (node) => + (!text || + node.qualified_name.toLowerCase().includes(text) || + node.id.toLowerCase().includes(text)) && + (!$("schema").value || node.schema === $("schema").value) && + (!$("kind").value || node.kind === $("kind").value) && + (!$("status").value || node.status === $("status").value) && + (depth === "all" || + node.id === selected || + (depth === "direct" ? direct.has(node.id) : paths.has(node.id))), + ); + const shown = filtered.slice(0, CAP), + positions = new Map(); + const schemas = [...new Set(shown.map((node) => node.schema))].sort(); + const allSchemas = [...new Set(filtered.map((node) => node.schema))].sort(); + let row = 0; + const scene = $("scene"); + scene.replaceChildren(); + for (const schema of schemas) { + scene.append( + svg( + "text", + { x: 20, y: row * 78 + 20, class: "schema-title" }, + schema.toUpperCase(), + ), + ); + row++; + const group = shown.filter((node) => node.schema === schema); + group.forEach((node, i) => + positions.set(node.id, { + x: 20 + (i % 5) * 256, + y: (row + Math.floor(i / 5)) * 78, + }), + ); + row += Math.ceil(group.length / 5) + 1; + } + $("cap").textContent = !filtered.length + ? t("noObjects") + : filtered.length > CAP + ? t("capped", { + cap: CAP, + total: filtered.length, + schemas: allSchemas + .map( + (schema) => + `${schema}: ${filtered.filter((node) => node.schema === schema).length}`, + ) + .join(", "), + }) + : t("visible", { + visible: shown.length, + dependents: paths.size, + unknowns: M.unknowns.length, + }); + const activeEdges = new Set(paths.values()); + M.edges.forEach((edge) => { + if (!positions.has(edge.source) || !positions.has(edge.target)) return; + const a = positions.get(edge.source), + b = positions.get(edge.target); + const path = svg("path", { + d: `M${a.x + 119},${a.y + 57} C${a.x + 119},${a.y + 90} ${b.x + 119},${b.y - 20} ${b.x + 119},${b.y}`, + class: `edge ${edge.kind === "foreign_key" ? "fk" : edge.status === "PARSED" ? "parsed" : ""} ${activeEdges.has(edge.id) ? "active" : ""}`, + }); + path.append( + svg( + "title", + {}, + `${value("edgeKind", edge.kind)} Ā· ${value("status", edge.status)} Ā· ${edge.explanation}`, + ), + ); + scene.append(path); + }); + const changed = new Set( + STATE.changes + ? [ + ...STATE.changes.added, + ...STATE.changes.removed, + ...STATE.changes.modified, + ] + : [], + ); + shown.forEach((node) => { + const point = positions.get(node.id); + const group = svg("g", { + class: `node ${node.id === selected ? "selected" : paths.has(node.id) ? "affected" : ""} ${changed.has(node.id) ? "changed" : ""}`, + transform: `translate(${point.x},${point.y})`, + tabindex: 0, + role: "button", + "aria-label": `${node.qualified_name}, ${value("kind", node.kind)}, ${value("status", node.status)}`, + "data-id": node.id, + }); + const label = + node.kind === "column" + ? `${node.parent}.${node.name}` + : node.kind === "query" + ? node.name.split(":ev:")[0].split("/").slice(-2).join("/") + : node.name; + group.append( + svg("rect", { width: 238, height: 58, rx: 6 }), + svg( + "text", + { x: 10, y: 23 }, + label.length > 27 ? label.slice(0, 24) + "…" : label, + ), + svg( + "text", + { x: 10, y: 43, class: "sub" }, + `${value("kind", node.kind)} / ${value("status", node.status)}`, + ), + svg("title", {}, node.qualified_name), + ); + group.addEventListener("click", () => choose(node.id)); + group.addEventListener("keydown", (event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + choose(node.id); + } + }); + scene.append(group); + }); + $("graph").setAttribute("viewBox", `0 0 1300 ${Math.max(780, row * 78)}`); + transform(); +} +function choose(id) { + selected = id; + draw(); + inspect(); + const group = [...document.querySelectorAll(".node")].find( + (node) => node.getAttribute("data-id") === id, + ); + if (group) group.focus(); +} +function inspect() { + const detail = $("detail"); + detail.replaceChildren(); + el("p", t("inspector"), "eyebrow mono", detail); + if (!selected || !nodes.has(selected)) { + el("h2", t("selectObject"), null, detail); + el("p", t("selectHint"), null, detail); + return; + } + const node = nodes.get(selected), + paths = reach(selected); + el("h2", node.qualified_name, null, detail); + el( + "p", + t("dependents", { + kind: value("kind", node.kind), + status: value("status", node.status), + count: paths.size, + }), + null, + detail, + ); + el("p", node.id, "object-id", detail); + for (const id of node.evidence_ids) { + const record = evidence.get(id), + block = el("div", null, "evidence", detail); + el( + "strong", + `${value("status", record.status)} / ${value("origin", record.origin)}`, + null, + block, + ); + el( + "p", + record.path + ? `${record.path}:${record.line_start}–${record.line_end}` + : `${record.query_id} Ā· ${record.captured_at} Ā· ${record.catalog_address || ""}`, + null, + block, + ); + original("p", record.explanation, null, block); + el("p", record.source_hash, null, block); + } + el("h3", t("dependencyPaths"), null, detail); + let displayed = 0; + for (const id of paths.keys()) { + if (displayed++ >= 40) break; + const preview = pathPreview(id, paths), + block = el("div", null, "path", detail); + const button = el("button", nodes.get(id).qualified_name, null, block); + button.type = "button"; + button.addEventListener("click", () => choose(id)); + for (const edgeId of preview.edges) { + const edge = edges.get(edgeId); + el( + "p", + `${nodes.get(edge.source).qualified_name} → ${nodes.get(edge.target).qualified_name} (${value("edgeKind", edge.kind)}, ${value("status", edge.status)})`, + null, + block, + ); + el( + "p", + edge.evidence_ids + .map((id) => { + const record = evidence.get(id); + return record.path + ? `${record.path}:${record.line_start}` + : `${record.query_id} / ${record.catalog_address || ""}`; + }) + .join("; "), + null, + block, + ); + } + if (preview.steps > 16) + el("p", t("omittedSteps", { count: preview.steps - 16 }), null, block); + } + if (paths.size > 40) + el("p", t("cappedPaths", { total: paths.size }), null, detail); + el("h3", t("unknownCoverage"), null, detail); + M.unknowns.forEach((unknown) => + original("p", unknown.explanation, "unknown", detail), + ); +} +function findings() { + const list = $("finding-list"); + list.replaceChildren(); + const risk = $("risk").value; + const shown = M.findings.filter( + (finding) => !risk || finding.risk_level === risk, + ); + for (const finding of shown) { + const article = el("article", null, `finding ${finding.risk_level}`, list); + el( + "h3", + `${finding.rule_id} Ā· ${value("risk", finding.risk_level).toUpperCase()} Ā· ${value("status", finding.status)}`, + null, + article, + ); + original("p", finding.reason, null, article); + original("p", finding.remediation, null, article); + el( + "p", + `${finding.risk_dimensions.map((dimension) => value("dimension", dimension)).join(", ")} Ā· ${finding.evidence_ids.join(", ")}`, + "evidence", + article, + ); + } + if (!shown.length) + el("p", t(M.findings.length ? "noRiskFindings" : "noFindings"), null, list); +} +function coverage() { + $("unknown-list").replaceChildren(); + M.unknowns.forEach((unknown) => { + const paragraph = el("p", null, "unknown", $("unknown-list")); + el("span", value("status", "UNKNOWN") + " / ", null, paragraph); + original("span", unknown.explanation, null, paragraph); + }); +} +function changes() { + const list = $("change-list"); + list.replaceChildren(); + if (!STATE.changes) return; + for (const key of ["added", "removed", "modified"]) { + el("h3", t(key), null, list); + STATE.changes[key].forEach((id) => + el("p", nodes.has(id) ? nodes.get(id).qualified_name : id, null, list), + ); + } + STATE.changes.rename_candidates.forEach((candidate) => + original("p", candidate.explanation, "unknown", list), + ); +} +function sequence() { + const list = $("phase-list"); + list.replaceChildren(); + STATE.plan.forEach((phase, i) => { + const article = el("article", null, "phase", list); + el("h2", `${i + 1}. ${value("phase", phase.phase)}`, null, article); + const content = el("div", null, null, article); + original("p", phase.action, null, content); + for (const key of ["preconditions", "verification", "recovery"]) { + el("h3", t(key), null, content); + original("p", phase[key], null, content); + } + }); + if (!STATE.plan.length) el("p", t("noPlan"), null, list); +} +function applyTheme() { + document.documentElement.dataset.theme = theme; + $("theme-toggle").setAttribute( + "aria-label", + t(theme === "light" ? "dark" : "light"), + ); + $("theme-toggle").setAttribute("aria-pressed", String(theme === "dark")); + $("theme-moon").toggleAttribute("hidden", theme === "dark"); + $("theme-sun").toggleAttribute("hidden", theme !== "dark"); +} +function applyLocale() { + document.documentElement.lang = locale; + document.documentElement.dataset.locale = locale; + document.title = t("title"); + document.querySelectorAll("[data-i18n]").forEach((element) => { + element.textContent = t(element.dataset.i18n); + }); + document + .querySelectorAll("[data-i18n-aria]") + .forEach((element) => + element.setAttribute("aria-label", t(element.dataset.i18nAria)), + ); + document + .querySelectorAll("[data-i18n-placeholder]") + .forEach((element) => + element.setAttribute("placeholder", t(element.dataset.i18nPlaceholder)), + ); + document.querySelectorAll("option[data-value-type]").forEach((option) => { + option.textContent = value(option.dataset.valueType, option.value); + }); + $("locale-en").setAttribute("aria-pressed", String(locale === "en")); + $("locale-es").setAttribute("aria-pressed", String(locale === "es")); + $("original-text-note").hidden = locale !== "es"; + applyTheme(); + const scrollTop = $("detail").scrollTop; + draw(); + inspect(); + $("detail").scrollTop = scrollTop; + findings(); + coverage(); + changes(); + sequence(); +} +for (const language of ["en", "es"]) + $("locale-" + language).addEventListener("click", () => { + locale = language; + persist("locale", locale); + applyLocale(); + }); +$("theme-toggle").addEventListener("click", () => { + theme = theme === "light" ? "dark" : "light"; + persist("theme", theme); + applyTheme(); +}); + +document.querySelectorAll("[data-tab]").forEach((button) => + button.addEventListener("click", () => { + document + .querySelectorAll("[data-tab]") + .forEach((other) => + other.setAttribute("aria-pressed", String(other === button)), + ); + for (const id of ["explorer", "findings", "sequence"]) + $(id).hidden = id !== button.dataset.tab; + }), +); +for (const id of ["search", "schema", "kind", "status", "depth"]) + $(id).addEventListener(id === "search" ? "input" : "change", draw); +$("risk").addEventListener("change", findings); +function scale(factor) { + zoom = Math.min(4, Math.max(0.25, zoom * factor)); + transform(); +} +$("zoom-in").addEventListener("click", () => scale(1.2)); +$("zoom-out").addEventListener("click", () => scale(1 / 1.2)); +$("reset").addEventListener("click", () => { + zoom = 1; + panX = panY = 0; + transform(); +}); +$("graph").addEventListener( + "wheel", + (event) => { + event.preventDefault(); + scale(event.deltaY < 0 ? 1.1 : 1 / 1.1); + }, + { passive: false }, +); +$("graph").addEventListener("keydown", (event) => { + const steps = { + ArrowLeft: [30, 0], + ArrowRight: [-30, 0], + ArrowUp: [0, 30], + ArrowDown: [0, -30], + }; + if (steps[event.key]) { + event.preventDefault(); + panX += steps[event.key][0]; + panY += steps[event.key][1]; + transform(); + } + if (event.key === "+" || event.key === "=") scale(1.2); + if (event.key === "-") scale(1 / 1.2); +}); +$("graph").addEventListener("pointerdown", (event) => { + if (drag || event.target.closest(".node")) return; + drag = [event.clientX, event.clientY, panX, panY]; + $("graph").setPointerCapture(event.pointerId); +}); +$("graph").addEventListener("pointermove", (event) => { + if (!drag) return; + const box = $("graph").getBoundingClientRect(), + viewBox = $("graph").viewBox.baseVal; + panX = drag[2] + ((event.clientX - drag[0]) * viewBox.width) / box.width; + panY = drag[3] + ((event.clientY - drag[1]) * viewBox.height) / box.height; + transform(); +}); +$("graph").addEventListener("pointerup", () => { + drag = null; +}); +$("graph").addEventListener("pointercancel", () => { + drag = null; +}); +function download(name, data, type) { + const anchor = document.createElement("a"), + url = URL.createObjectURL(new Blob([data], { type })); + anchor.href = url; + anchor.download = name; + anchor.click(); + setTimeout(() => URL.revokeObjectURL(url), 1000); +} +$("export-json").addEventListener("click", () => + download("model.dbdep.json", JSON.stringify(M, null, 2), "application/json"), +); +$("export-svg").addEventListener("click", () => { + const clone = $("graph").cloneNode(true); + clone.setAttribute("xmlns", NS); + // The SVG needs its own preference: it no longer inherits the HTML root palette. + clone.setAttribute("data-theme", theme); + clone.setAttribute("lang", locale); + clone.removeAttribute("tabindex"); + clone.removeAttribute("data-i18n-aria"); + clone.prepend( + svg("rect", { width: "100%", height: "100%", class: "export-background" }), + ); + clone.prepend(svg("style", {}, document.querySelector("style").textContent)); + download( + "dependencies.svg", + new XMLSerializer().serializeToString(clone), + "image/svg+xml", + ); +}); +applyLocale(); diff --git a/skills/database-dependency-migration/docs/roadmap.md b/skills/database-dependency-migration/docs/roadmap.md new file mode 100644 index 0000000..320db1d --- /dev/null +++ b/skills/database-dependency-migration/docs/roadmap.md @@ -0,0 +1,38 @@ +# Tooling roadmap + +Normal skill use now reads sources and produces a review without additional runtime setup. The following work extends the deterministic toolkit and automation. These are acceptance criteria, not shipped features or completed accuracy measurements. + +## ORM-aware application analysis + +Start with EF Core migrations and C# consumers. Preserve `Up` order, map explicit database names through entity configuration, and attach both mapping and use-site evidence. Separate migrations, model snapshots and deployed-schema facts. Mark provider-generated SQL, conventions, helpers and unresolved translations UNKNOWN. Then add version-aware Prisma and TypeORM adapters. Validate each adapter against independent expected consumers before claiming supported coverage. + +The skill currently guides manual inspection of these sources; the toolkit still records host-language coverage gaps. + +## GitHub pull-request integration + +On PRs containing migrations, analyze against the identified base commit and include unchanged consumers. Publish affected objects, relevant source evidence, high-risk findings and unresolved dependencies as one maintained comment or check. Include base/head identities and analysis coverage. Preserve reports when a policy gate fails. Treat fork source as untrusted and keep analysis credentials separate from the permission to publish results. + +The skill currently prepares comment-ready Markdown and can publish only when requested through an available GitHub tool. It does not install automatic PR analysis. + +## Stateful migration analysis + +Evaluate ordered operations against an evolving schema model. Preserve object identities through renames, register new objects, remove dropped objects, and update supported dependency relationships. Resolve later references against the preceding state. Carry unsupported transformation effects into later dependent operations as UNKNOWN. Cover transaction/rollback boundaries, failed preconditions, add/rename/use sequences and changes to foreign keys, views and indexes. + +The skill currently uses a manual ledger; the engine still reviews against a fixed baseline. + +## Independent accuracy testing + +Select at least three real PostgreSQL projects and freeze repository revisions, migration inputs and consumer scope. Establish expected dependencies manually for at least 20 meaningful changes across those projects before inspecting analyzer output. Include table/column drops, renames, type changes, foreign keys, view chains, ORM mappings and sequential operations. + +Have an independent reviewer resolve disagreements about expected edges and warnings. Record evidence for each expected dependency and each warning judgment. Measure: + +- Missed dependencies as counts and recall, with expected dependencies as the denominator. +- Incorrect edges as counts and precision, with reported edges as the denominator. +- False-positive warnings as counts and rate among judged warnings; retain unresolved warning judgments separately. +- Setup time from a clean checkout to the first usable review, separately for normal skill use and toolkit setup. Record environment, prerequisites and failed attempts. + +Report per-project and per-change results as well as totals. Distinguish an abstention/UNKNOWN from a false edge, while counting an expected dependency not recovered in the missed-dependency metric. Preserve raw outputs and human judgments. Existing curated fixtures and historical evaluations do not satisfy this study. + +## Distribution + +Keep install-and-use source review independent of Node.js, pnpm and a database. Preserve manual-copy/clone and Skills CLI installation. Keep runtime setup optional and production-only when the user wants validated machine artifacts. Check instructions in an environment without toolkit dependencies and keep README, skill references and bilingual web guidance aligned. diff --git a/skills/database-dependency-migration/examples/README.md b/skills/database-dependency-migration/examples/README.md new file mode 100644 index 0000000..3c06dc0 --- /dev/null +++ b/skills/database-dependency-migration/examples/README.md @@ -0,0 +1,15 @@ +# Reproducible PostgreSQL examples + +The skill can review these schema, migration and application files directly, with no runtime installation. Ask for affected consumers, source citations, risks and unresolved dependencies. The existing `rendered/` HTML reports also open locally without installing packages. + +With the optional toolkit installed, `node scripts/dbdep.mjs demo out/demo` generates ecommerce, analytics and high-traffic bundles. Contributors use `pnpm verify:examples` to compare checked-in canonical artifacts with fresh analysis; screenshots are verified separately with `node scripts/capture-screenshots.mjs`. Inputs contain fixture values only, never real connection details. + +- `ecommerce/` includes six tables, FK constraints, view, function/trigger and application SQL. Three proposed phases illustrate expansion/backfill/destructive contract. Backfill SQL is a whole-table sketch; batching, writer coordination and recovery are operator responsibilities. The analyzer does not execute it. +- `analytics/` has a table and two chained views. Its actual catalog capture records pg_rewrite ownership and provenance; default expressions are hashed and no user rows are captured. +- `high-traffic/` has regular index, type change and transaction-wrapped concurrent index. Metadata is an explicit user scenario, not discovered traffic/size. +- `dynamic-sql-unknown/` retains a grounded SQL query while PL/pgSQL and TypeScript consumers remain UNKNOWN. +- `multi-schema/` tests ambiguous unqualified names and schema isolation. +- `tricky-identifiers/` includes quoted identifiers, enum, composite keys, overloads and partitioning. Offline inherited columns remain partial. +- `diff/` tests add/drop with an unconfirmed possible rename. + +The three `rendered/` bundles were generated from these fixtures. HTML inspection/search works from local files. Screenshots show presentation only. Node/edge/finding/evidence consistency comes from automated tests and graph/catalog correctness comes from explicit assertions. diff --git a/skills/database-dependency-migration/examples/analytics/capture-provenance.json b/skills/database-dependency-migration/examples/analytics/capture-provenance.json new file mode 100644 index 0000000..5527ab5 --- /dev/null +++ b/skills/database-dependency-migration/examples/analytics/capture-provenance.json @@ -0,0 +1,10 @@ +{ + "capture_role": "dbdep_readonly: LOGIN, no user-table SELECT grants", + "capture_sha256": "sha256:b060e672cefda54c1d90fdba2c3ad34f0250b1e751e2243eebd7c198d1237af5", + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "command": "python scripts/fixture_cluster.py --pg-bin --update-fixtures", + "schema_sha256": "sha256:acbb921ac8bf82f40fdaa110b518972addcacc7fc82c0c05fe55c9e201871eed", + "scope": "script-created isolated loopback fixture cluster", + "server_version_num": "180003", + "sql_executed": "shipped analytics/ecommerce/tricky-identifiers fixtures only, never a user migration" +} diff --git a/skills/database-dependency-migration/examples/analytics/catalog.json b/skills/database-dependency-migration/examples/analytics/catalog.json new file mode 100644 index 0000000..e31ad16 --- /dev/null +++ b/skills/database-dependency-migration/examples/analytics/catalog.json @@ -0,0 +1,20954 @@ +{ + "capture_version": "1.0.0", + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "queries": { + "pg_attrdef": { + "rows": [], + "sql_hash": "sha256:0a179a191dbf3480caa818be9daa296944c1d302f412dc6cdee25f05f8a8ef7f" + }, + "pg_attribute": { + "rows": [ + { + "attgenerated": "", + "attidentity": "", + "attname": "id", + "attnotnull": true, + "attnum": 1, + "attrelid": 16389, + "atttypid": 20, + "atttypmod": -1 + }, + { + "attgenerated": "", + "attidentity": "", + "attname": "total_amount", + "attnotnull": true, + "attnum": 2, + "attrelid": 16389, + "atttypid": 1700, + "atttypmod": 786438 + }, + { + "attgenerated": "", + "attidentity": "", + "attname": "id", + "attnotnull": false, + "attnum": 1, + "attrelid": 16394, + "atttypid": 20, + "atttypmod": -1 + }, + { + "attgenerated": "", + "attidentity": "", + "attname": "id", + "attnotnull": false, + "attnum": 1, + "attrelid": 16396, + "atttypid": 20, + "atttypmod": -1 + }, + { + "attgenerated": "", + "attidentity": "", + "attname": "total_amount", + "attnotnull": false, + "attnum": 2, + "attrelid": 16396, + "atttypid": 1700, + "atttypmod": 786438 + }, + { + "attgenerated": "", + "attidentity": "", + "attname": "revenue", + "attnotnull": false, + "attnum": 1, + "attrelid": 16400, + "atttypid": 1700, + "atttypmod": -1 + } + ], + "sql_hash": "sha256:0013610c63acaa02d545c5231efdcf947a0ab7882d5f9a1e6a618ab597bb46e8" + }, + "pg_class": { + "rows": [ + { + "nspname": "sales", + "oid": 16389, + "relispartition": false, + "relkind": "r", + "relname": "orders", + "relpages": 0, + "reltuples": -1.0 + }, + { + "nspname": "sales", + "oid": 16394, + "relispartition": false, + "relkind": "i", + "relname": "orders_pkey", + "relpages": 1, + "reltuples": 0.0 + }, + { + "nspname": "analytics", + "oid": 16396, + "relispartition": false, + "relkind": "v", + "relname": "order_summary", + "relpages": 0, + "reltuples": -1.0 + }, + { + "nspname": "analytics", + "oid": 16400, + "relispartition": false, + "relkind": "v", + "relname": "monthly_revenue", + "relpages": 0, + "reltuples": -1.0 + } + ], + "sql_hash": "sha256:13b57cb8fdde96554198f4112122aeb8b460585d632117e260d379614075f78a" + }, + "pg_constraint": { + "rows": [ + { + "confkey": null, + "confrelid": 0, + "conindid": 0, + "conkey": [ + 1 + ], + "conname": "orders_id_not_null", + "conrelid": 16389, + "contype": "n", + "convalidated": true, + "nspname": "sales", + "oid": 16392 + }, + { + "confkey": null, + "confrelid": 0, + "conindid": 0, + "conkey": [ + 2 + ], + "conname": "orders_total_amount_not_null", + "conrelid": 16389, + "contype": "n", + "convalidated": true, + "nspname": "sales", + "oid": 16393 + }, + { + "confkey": null, + "confrelid": 0, + "conindid": 16394, + "conkey": [ + 1 + ], + "conname": "orders_pkey", + "conrelid": 16389, + "contype": "p", + "convalidated": true, + "nspname": "sales", + "oid": 16395 + } + ], + "sql_hash": "sha256:69f7a70d20a223e65018cca048537bedf51abaf6f534ab925b15bb894cf6d681" + }, + "pg_depend": { + "rows": [ + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12001, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12002, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12002, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12000, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12006, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12007, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12007, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12011, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12012, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12012, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12010, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12015, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12016, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12016, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12014, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12019, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12020, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12020, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12018, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12024, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12025, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12025, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12023, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12029, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12030, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12030, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12028, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12034, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12035, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12035, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12033, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12039, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12040, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12040, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12038, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12044, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12045, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12045, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12043, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12049, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12050, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12050, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12048, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12054, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12055, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12055, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12053, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12059, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12060, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12060, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12058, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12064, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12065, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12065, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12063, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12069, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12070, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12070, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12068, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12074, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12075, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12075, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12073, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12078, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12079, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12079, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12077, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12082, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12083, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12083, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12081, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12086, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12087, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12087, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12085, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12091, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12092, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12092, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12090, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12096, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12097, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12097, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12095, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12100, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12101, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12101, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12099, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12105, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12106, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12106, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12111, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12112, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12112, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12110, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12115, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12116, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12116, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12114, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12119, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12120, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12120, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12118, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12123, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12124, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12124, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12122, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12127, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12128, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12128, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12126, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12131, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12132, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12132, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12130, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12135, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12136, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12136, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12134, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12139, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12140, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12140, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12138, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12143, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12144, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12144, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12142, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12147, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12148, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12152, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12153, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12153, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12157, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12158, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12156, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12162, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12163, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12163, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12161, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12166, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12167, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12167, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12165, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12171, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12172, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12172, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12170, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12175, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12176, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12176, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12180, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12181, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12181, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12179, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12184, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12185, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12185, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12183, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12188, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12189, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12189, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12193, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12194, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12194, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12192, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12197, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12198, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12198, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12196, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12201, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12202, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12202, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12206, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12207, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12207, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12205, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12210, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12211, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12211, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12209, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12214, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12215, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12215, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12219, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12220, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12220, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12218, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12223, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12224, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12224, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12222, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12227, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12228, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12228, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12226, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12232, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12233, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12233, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12231, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12237, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12238, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12238, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12236, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12241, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12242, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12242, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12240, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12245, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12246, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12246, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12244, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12249, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12250, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12250, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12248, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12254, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12255, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12255, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12253, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12258, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12259, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12259, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12257, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12262, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12263, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12263, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12261, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12267, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12268, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12268, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12266, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12271, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12272, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12272, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12270, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12276, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12277, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12277, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12275, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12280, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12281, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12281, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12279, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12285, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12286, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12286, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12284, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12290, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12291, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12291, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12289, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12294, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12295, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12295, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12293, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12298, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12299, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12299, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12297, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12302, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12303, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12303, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12301, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12306, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12307, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12307, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12305, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12310, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12311, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12311, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12309, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12315, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12316, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12316, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12314, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12320, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12321, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12321, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12319, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12325, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12326, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12326, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12324, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12330, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12331, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12331, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12329, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12334, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12335, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12335, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12333, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12339, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12340, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12340, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12338, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12344, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12345, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12345, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12343, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12348, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12349, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12349, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12347, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12352, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12353, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12353, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12351, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12356, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 12357, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 12357, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12355, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14873, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "n", + "objid": 14874, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14876, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "n", + "objid": 14877, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14878, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "n", + "objid": 14879, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14881, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14882, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14882, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14880, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14884, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "n", + "objid": 14885, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14886, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "n", + "objid": 14887, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14890, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14891, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14891, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14889, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14895, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14896, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14896, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14894, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14899, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14900, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14900, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14898, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14904, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14905, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14905, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14903, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14909, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14910, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14910, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14908, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14914, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14915, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14915, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14913, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14919, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14920, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14920, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14918, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14924, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14925, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14925, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14923, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14929, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14930, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14930, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14928, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14934, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14935, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14935, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14933, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14939, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14940, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14940, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14944, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14945, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14945, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14943, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14949, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14950, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14950, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14948, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14954, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14955, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14955, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14953, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14959, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14960, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14960, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14958, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14964, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14965, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14965, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14963, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14969, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14970, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14970, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14968, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14973, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14974, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14974, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14972, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14978, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14979, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14979, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14982, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14983, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14983, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14981, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14987, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14988, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14988, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14986, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14992, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14993, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14993, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14991, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14997, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14998, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 14998, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14996, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15001, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15002, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15002, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15000, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15006, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15007, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15007, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15011, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15012, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15012, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15010, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15015, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15016, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15016, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15014, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15020, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15021, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15021, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15019, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15025, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15026, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15026, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15024, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15030, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15031, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15031, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15029, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15035, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15036, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15036, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15034, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15039, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15040, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15040, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15038, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15044, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15045, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15045, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15043, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15049, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15050, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15050, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15048, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15054, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15055, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15055, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15053, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15059, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15060, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15060, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15058, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15064, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15065, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15065, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15063, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15069, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15070, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15070, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15074, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15075, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15075, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15073, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15078, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15079, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15079, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15077, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15083, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15084, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15084, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15082, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15088, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15089, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15089, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15087, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15093, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15094, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15094, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15092, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15098, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15099, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15099, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15103, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15104, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15104, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15102, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15107, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15108, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15108, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15112, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15113, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15113, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15111, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15116, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15117, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15117, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15115, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15121, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15122, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15122, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15120, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15126, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15127, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15127, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15125, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15131, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15132, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15132, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15130, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15136, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15137, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15137, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15135, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15141, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15142, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15142, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15146, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15147, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15147, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15145, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15151, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15152, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15152, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15156, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15157, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15157, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15155, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15160, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15161, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15161, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15164, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15165, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15165, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15163, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15168, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15169, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15169, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15167, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15172, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15173, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15176, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15177, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15177, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15175, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15180, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15181, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15181, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15179, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15184, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15185, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15185, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15189, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15190, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15190, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15188, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15193, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15194, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15194, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15192, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15197, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15198, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15198, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15202, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15203, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15203, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15201, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15207, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 15208, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 15208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15206, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16390, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 16391, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16391, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16397, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 16398, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16398, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16396, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16401, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 16402, + "refobjsubid": 0 + }, + { + "class_name": "pg_type", + "deptype": "i", + "objid": 16402, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16400, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14861, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14862, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14861, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14862, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14863, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14864, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14865, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14866, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14865, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14866, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14868, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14869, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14870, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14871, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "n", + "objid": 14872, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "e", + "objid": 15211, + "objsubid": 0, + "refclass_name": "pg_extension", + "refobjid": 15210, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "e", + "objid": 15212, + "objsubid": 0, + "refclass_name": "pg_extension", + "refobjid": 15210, + "refobjsubid": 0 + }, + { + "class_name": "pg_proc", + "deptype": "e", + "objid": 15213, + "objsubid": 0, + "refclass_name": "pg_extension", + "refobjid": 15210, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14880, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14880, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14889, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14889, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14889, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14889, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14894, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14894, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14894, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14894, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 29, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 30, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14898, + "objsubid": 31, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14903, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14908, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14913, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14913, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14913, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14913, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14913, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14918, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14918, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14918, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14918, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14918, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14923, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14928, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14933, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14938, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14943, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 29, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 30, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 31, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 32, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 33, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 34, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 35, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 36, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 37, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 38, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 39, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 40, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 41, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 42, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 43, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14948, + "objsubid": 44, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14953, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14958, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14963, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14968, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14972, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14977, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14977, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14981, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 29, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 30, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 31, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14986, + "objsubid": 32, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14991, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 14996, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15000, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15005, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15010, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15014, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15019, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15024, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 29, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 30, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 31, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 32, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 33, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 34, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 35, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 36, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 37, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 38, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 39, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 40, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 41, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 42, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 43, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 44, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 45, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 46, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 47, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 48, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 49, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 50, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 51, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 52, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 53, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 54, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 55, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 56, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 57, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 58, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 59, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 60, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 61, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 62, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 63, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 64, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 65, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 66, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 67, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 68, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 69, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 70, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 71, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 72, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 73, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 74, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 75, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 76, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 77, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 78, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 79, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 80, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 81, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15029, + "objsubid": 82, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15034, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15038, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15043, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "i", + "objid": 15046, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15043, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15047, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15046, + "refobjsubid": 1 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15047, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15046, + "refobjsubid": 2 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15048, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "i", + "objid": 15051, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15048, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15052, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15051, + "refobjsubid": 1 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15052, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15051, + "refobjsubid": 2 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15053, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "i", + "objid": 15056, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15053, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15057, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15056, + "refobjsubid": 1 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15057, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15056, + "refobjsubid": 2 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15058, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15058, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15058, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15058, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15058, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "i", + "objid": 15061, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15058, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15062, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15061, + "refobjsubid": 1 + }, + { + "class_name": "pg_class", + "deptype": "a", + "objid": 15062, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15061, + "refobjsubid": 2 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15063, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15068, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15073, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15077, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15082, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15087, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15092, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15097, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15102, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15106, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15111, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15115, + "objsubid": 29, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15120, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15125, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15130, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15135, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15140, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 10, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 11, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 12, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 13, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 14, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 15, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 16, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 17, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 18, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 19, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 20, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 21, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 22, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 23, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 24, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 25, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 26, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 27, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15145, + "objsubid": 28, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15150, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15155, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15159, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15159, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15159, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15159, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15159, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15163, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15163, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15163, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15163, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15163, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15167, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 8, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15171, + "objsubid": 9, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15175, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15175, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15175, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15175, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15175, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15179, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15183, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15188, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15192, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15196, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15196, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15196, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15196, + "objsubid": 6, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15196, + "objsubid": 7, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 4, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15201, + "objsubid": 5, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15206, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 14860, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15206, + "objsubid": 1, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15206, + "objsubid": 2, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 15206, + "objsubid": 3, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 16389, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 16387, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "i", + "objid": 16394, + "objsubid": 0, + "refclass_name": "pg_constraint", + "refobjid": 16395, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 16396, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 16388, + "refobjsubid": 0 + }, + { + "class_name": "pg_class", + "deptype": "n", + "objid": 16400, + "objsubid": 0, + "refclass_name": "pg_namespace", + "refobjid": 16388, + "refobjsubid": 0 + }, + { + "class_name": "pg_constraint", + "deptype": "a", + "objid": 14875, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_constraint", + "deptype": "a", + "objid": 14888, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_constraint", + "deptype": "a", + "objid": 16392, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 1 + }, + { + "class_name": "pg_constraint", + "deptype": "a", + "objid": 16393, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 2 + }, + { + "class_name": "pg_constraint", + "deptype": "a", + "objid": 16395, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 1 + }, + { + "class_name": "pg_language", + "deptype": "n", + "objid": 15214, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 15211, + "refobjsubid": 0 + }, + { + "class_name": "pg_language", + "deptype": "n", + "objid": 15214, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 15212, + "refobjsubid": 0 + }, + { + "class_name": "pg_language", + "deptype": "n", + "objid": 15214, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 15213, + "refobjsubid": 0 + }, + { + "class_name": "pg_language", + "deptype": "e", + "objid": 15214, + "objsubid": 0, + "refclass_name": "pg_extension", + "refobjid": 15210, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12003, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12000, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12008, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12010, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12005, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12014, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12021, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12018, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12026, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12023, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12031, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12028, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12036, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12033, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12041, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12038, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12046, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12043, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12051, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12048, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12056, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12053, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12061, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12058, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12066, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12063, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12071, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12068, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12073, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12080, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12077, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12084, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12081, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12088, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12085, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12093, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12090, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12098, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12095, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12102, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12099, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12107, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "a", + "objid": 12108, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12108, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12108, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12108, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "a", + "objid": 12109, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12109, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12104, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12113, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12110, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12117, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12114, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12121, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12118, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12125, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12122, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12129, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12126, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12133, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12130, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12137, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12134, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12141, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12138, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12145, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12142, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12149, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12154, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 12 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 13 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 14 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 15 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 16 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 17 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 18 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 19 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 20 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 21 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 22 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 23 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 24 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 25 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 26 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 27 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 28 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 29 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 30 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12159, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12156, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 12 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12164, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12161, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 12 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 13 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 14 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 15 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 16 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 17 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 18 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 19 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 20 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 21 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 22 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 23 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 24 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 25 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 26 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 27 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 28 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 29 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12146, + "refobjsubid": 30 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12168, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12165, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12151, + "refobjsubid": 12 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12173, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12170, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12177, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12179, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12174, + "refobjsubid": 11 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12183, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12190, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12192, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12187, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12196, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12203, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12208, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12205, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12200, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12212, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12209, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12216, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12221, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12218, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12213, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12225, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12222, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12229, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12226, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12234, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12231, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12239, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12236, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12243, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12240, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12247, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12244, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12251, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12248, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12256, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12253, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12260, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12257, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12264, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12261, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12269, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12261, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 12269, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12261, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12269, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12266, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12273, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12270, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12278, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12275, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12282, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12279, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12287, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12284, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12292, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12289, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12296, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12293, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12300, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12297, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12304, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12301, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12308, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12305, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12312, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12309, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12317, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12314, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12322, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12319, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12327, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12324, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12332, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12329, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12336, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12333, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12341, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12338, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12346, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12343, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12350, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12347, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12354, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12351, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 12358, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 12355, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14883, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14883, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14880, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14892, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14892, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14892, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14889, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14897, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14889, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14897, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14889, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14897, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14889, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14897, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14894, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14863, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14864, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14865, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14866, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14868, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14869, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14870, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14871, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14872, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14901, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14898, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14906, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14906, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14903, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14911, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14911, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14908, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14916, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14916, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14916, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14913, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14921, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14921, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14921, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14918, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14926, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14926, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14923, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14931, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14931, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14928, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14936, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14936, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14933, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14941, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14941, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14941, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14941, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14946, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14946, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14943, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14863, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14864, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14865, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14866, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14868, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14869, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14870, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14871, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14872, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14951, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14948, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14956, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14956, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14953, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14961, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14961, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14958, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14966, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14966, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14966, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14963, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14971, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14971, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14968, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14865, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14866, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14868, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14869, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14870, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14871, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14872, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14975, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14972, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14980, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14980, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14984, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14984, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14984, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14861, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14984, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14862, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14984, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14981, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14861, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14989, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14986, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14994, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14994, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14994, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14991, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14938, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 14999, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14996, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15003, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15003, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15000, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15008, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15008, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15008, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15008, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15005, + "refobjsubid": 10 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15013, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15010, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15017, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15017, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15014, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15022, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15022, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15019, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15027, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15027, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15024, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15032, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15029, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15037, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15037, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15037, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15034, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14868, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15041, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15038, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15066, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15066, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15066, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15066, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15063, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15071, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15071, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15071, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15071, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15068, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15076, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15073, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15080, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15080, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15080, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15080, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15077, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15085, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15085, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15085, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15082, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15090, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15090, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14861, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15090, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15087, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15095, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15095, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15095, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15095, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14885, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15095, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15092, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15100, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15100, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15100, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15100, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15097, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15105, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15102, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15109, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15109, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15109, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15109, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14977, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15106, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15114, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15111, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15118, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15118, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15118, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15118, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15118, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15115, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15123, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15123, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15120, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15128, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15128, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15125, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15133, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15133, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15130, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15138, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15138, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15138, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14887, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15138, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15135, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14898, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14898, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14898, + "refobjsubid": 30 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14948, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14948, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14948, + "refobjsubid": 33 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14972, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14972, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14972, + "refobjsubid": 27 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14986, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14986, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 14986, + "refobjsubid": 31 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15029, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15029, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15029, + "refobjsubid": 36 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15143, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14874, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14861, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15140, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15148, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15145, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15153, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15150, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15158, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15155, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15162, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15162, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15162, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15166, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15163, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15159, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15170, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15167, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15174, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15174, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15174, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15178, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15175, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 8 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15182, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15179, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15186, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15186, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15191, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15188, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15183, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15195, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15192, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15171, + "refobjsubid": 9 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15199, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14877, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_type", + "refobjid": 14879, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 3 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 7 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15204, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15201, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15209, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 4 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15209, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 5 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 15209, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15196, + "refobjsubid": 6 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 15209, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 15206, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 16399, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 1 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 16399, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16389, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 16399, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16396, + "refobjsubid": 0 + }, + { + "class_name": "pg_rewrite", + "deptype": "n", + "objid": 16403, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16396, + "refobjsubid": 2 + }, + { + "class_name": "pg_rewrite", + "deptype": "i", + "objid": 16403, + "objsubid": 0, + "refclass_name": "pg_class", + "refobjid": 16400, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14802, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14804, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14806, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14808, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14810, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14812, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14814, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14816, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14818, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14820, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14822, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14824, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14826, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14828, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14830, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14832, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14834, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14836, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14838, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14840, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14842, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14844, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14846, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14848, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14850, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14852, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14854, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14856, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_dict", + "deptype": "n", + "objid": 14858, + "objsubid": 0, + "refclass_name": "pg_ts_template", + "refobjid": 14801, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14803, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14802, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14805, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14804, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14807, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14806, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14809, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14808, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14811, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14810, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14813, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14812, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14815, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14814, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14817, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14816, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14819, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14818, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14821, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14820, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14823, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14822, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14825, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14824, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14827, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14814, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14827, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14826, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14829, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14828, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14831, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14830, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14833, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14832, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14835, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14834, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14837, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14836, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14839, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14838, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14841, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14840, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14843, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14842, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14845, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14844, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14847, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14814, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14847, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14846, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14849, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14848, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14851, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14850, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14853, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14852, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14855, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14854, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14857, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14856, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_config", + "deptype": "n", + "objid": 14859, + "objsubid": 0, + "refclass_name": "pg_ts_dict", + "refobjid": 14858, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_template", + "deptype": "n", + "objid": 14801, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14799, + "refobjsubid": 0 + }, + { + "class_name": "pg_ts_template", + "deptype": "n", + "objid": 14801, + "objsubid": 0, + "refclass_name": "pg_proc", + "refobjid": 14800, + "refobjsubid": 0 + } + ], + "sql_hash": "sha256:49abd0415a10073d639817a880d5dde3f3932083d8924626255a0f298414b9be" + }, + "pg_extension": { + "rows": [ + { + "extname": "plpgsql", + "extversion": "1.0", + "nspname": "pg_catalog", + "oid": 15210 + } + ], + "sql_hash": "sha256:4968c8432025af3a6e3d12cfd6064f7ddd8618fd31c89631339842aaeec49e75" + }, + "pg_index": { + "rows": [ + { + "indexrelid": 16394, + "indisready": true, + "indisunique": true, + "indisvalid": true, + "indkey": [ + 1 + ], + "indrelid": 16389 + } + ], + "sql_hash": "sha256:ecd96560a53202a6acf1dbd4961d3feb0d3931dae0f7b4dee89525cad58222e4" + }, + "pg_inherits": { + "rows": [], + "sql_hash": "sha256:6e356ce15119b3094e7fea3139df580150375f4e6234ae29d2844d12a9388e1b" + }, + "pg_namespace": { + "rows": [ + { + "nspname": "public", + "oid": 2200 + }, + { + "nspname": "sales", + "oid": 16387 + }, + { + "nspname": "analytics", + "oid": 16388 + } + ], + "sql_hash": "sha256:9fd63d206ec6c08126a0a3305c5936ba043d1a27af107796a0b86b28c4fa3538" + }, + "pg_proc": { + "rows": [], + "sql_hash": "sha256:6825b1cf9226ac8505e94ed09c646c2beb1c7129abc767281b036952fd4cf72f" + }, + "pg_rewrite": { + "rows": [ + { + "ev_class": 16396, + "oid": 16399, + "rulename": "_RETURN" + }, + { + "ev_class": 16400, + "oid": 16403, + "rulename": "_RETURN" + } + ], + "sql_hash": "sha256:aa01f772ff5c156c6ff7a4bf299ef4a0970df5116cda602b03dd9c9b915c331d" + }, + "pg_trigger": { + "rows": [], + "sql_hash": "sha256:2dca3cea4174fa5d312335b4d9ece61bcb9dee90b79b71de05118d144d1b3f15" + }, + "pg_type": { + "rows": [ + { + "nspname": "pg_catalog", + "oid": 16, + "typelem": 0, + "typname": "bool", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 17, + "typelem": 0, + "typname": "bytea", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 18, + "typelem": 0, + "typname": "char", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 19, + "typelem": 18, + "typname": "name", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 20, + "typelem": 0, + "typname": "int8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 21, + "typelem": 0, + "typname": "int2", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 22, + "typelem": 21, + "typname": "int2vector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 23, + "typelem": 0, + "typname": "int4", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 24, + "typelem": 0, + "typname": "regproc", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 25, + "typelem": 0, + "typname": "text", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 26, + "typelem": 0, + "typname": "oid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 27, + "typelem": 0, + "typname": "tid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 28, + "typelem": 0, + "typname": "xid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 29, + "typelem": 0, + "typname": "cid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 30, + "typelem": 26, + "typname": "oidvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 32, + "typelem": 0, + "typname": "pg_ddl_command", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 71, + "typelem": 0, + "typname": "pg_type", + "typrelid": 1247, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 75, + "typelem": 0, + "typname": "pg_attribute", + "typrelid": 1249, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 81, + "typelem": 0, + "typname": "pg_proc", + "typrelid": 1255, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 83, + "typelem": 0, + "typname": "pg_class", + "typrelid": 1259, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 114, + "typelem": 0, + "typname": "json", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 142, + "typelem": 0, + "typname": "xml", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 143, + "typelem": 142, + "typname": "_xml", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 194, + "typelem": 0, + "typname": "pg_node_tree", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 199, + "typelem": 114, + "typname": "_json", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 210, + "typelem": 71, + "typname": "_pg_type", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 269, + "typelem": 0, + "typname": "table_am_handler", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 270, + "typelem": 75, + "typname": "_pg_attribute", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 271, + "typelem": 5069, + "typname": "_xid8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 272, + "typelem": 81, + "typname": "_pg_proc", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 273, + "typelem": 83, + "typname": "_pg_class", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 325, + "typelem": 0, + "typname": "index_am_handler", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 600, + "typelem": 701, + "typname": "point", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 601, + "typelem": 600, + "typname": "lseg", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 602, + "typelem": 0, + "typname": "path", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 603, + "typelem": 600, + "typname": "box", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 604, + "typelem": 0, + "typname": "polygon", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 628, + "typelem": 701, + "typname": "line", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 629, + "typelem": 628, + "typname": "_line", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 650, + "typelem": 0, + "typname": "cidr", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 651, + "typelem": 650, + "typname": "_cidr", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 700, + "typelem": 0, + "typname": "float4", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 701, + "typelem": 0, + "typname": "float8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 705, + "typelem": 0, + "typname": "unknown", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 718, + "typelem": 0, + "typname": "circle", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 719, + "typelem": 718, + "typname": "_circle", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 774, + "typelem": 0, + "typname": "macaddr8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 775, + "typelem": 774, + "typname": "_macaddr8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 790, + "typelem": 0, + "typname": "money", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 791, + "typelem": 790, + "typname": "_money", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 829, + "typelem": 0, + "typname": "macaddr", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 869, + "typelem": 0, + "typname": "inet", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1000, + "typelem": 16, + "typname": "_bool", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1001, + "typelem": 17, + "typname": "_bytea", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1002, + "typelem": 18, + "typname": "_char", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1003, + "typelem": 19, + "typname": "_name", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1005, + "typelem": 21, + "typname": "_int2", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1006, + "typelem": 22, + "typname": "_int2vector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1007, + "typelem": 23, + "typname": "_int4", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1008, + "typelem": 24, + "typname": "_regproc", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1009, + "typelem": 25, + "typname": "_text", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1010, + "typelem": 27, + "typname": "_tid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1011, + "typelem": 28, + "typname": "_xid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1012, + "typelem": 29, + "typname": "_cid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1013, + "typelem": 30, + "typname": "_oidvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1014, + "typelem": 1042, + "typname": "_bpchar", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1015, + "typelem": 1043, + "typname": "_varchar", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1016, + "typelem": 20, + "typname": "_int8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1017, + "typelem": 600, + "typname": "_point", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1018, + "typelem": 601, + "typname": "_lseg", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1019, + "typelem": 602, + "typname": "_path", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1020, + "typelem": 603, + "typname": "_box", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1021, + "typelem": 700, + "typname": "_float4", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1022, + "typelem": 701, + "typname": "_float8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1027, + "typelem": 604, + "typname": "_polygon", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1028, + "typelem": 26, + "typname": "_oid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1033, + "typelem": 0, + "typname": "aclitem", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1034, + "typelem": 1033, + "typname": "_aclitem", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1040, + "typelem": 829, + "typname": "_macaddr", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1041, + "typelem": 869, + "typname": "_inet", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1042, + "typelem": 0, + "typname": "bpchar", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1043, + "typelem": 0, + "typname": "varchar", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1082, + "typelem": 0, + "typname": "date", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1083, + "typelem": 0, + "typname": "time", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1114, + "typelem": 0, + "typname": "timestamp", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1115, + "typelem": 1114, + "typname": "_timestamp", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1182, + "typelem": 1082, + "typname": "_date", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1183, + "typelem": 1083, + "typname": "_time", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1184, + "typelem": 0, + "typname": "timestamptz", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1185, + "typelem": 1184, + "typname": "_timestamptz", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1186, + "typelem": 0, + "typname": "interval", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1187, + "typelem": 1186, + "typname": "_interval", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1231, + "typelem": 1700, + "typname": "_numeric", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1248, + "typelem": 0, + "typname": "pg_database", + "typrelid": 1262, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 1263, + "typelem": 2275, + "typname": "_cstring", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1266, + "typelem": 0, + "typname": "timetz", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1270, + "typelem": 1266, + "typname": "_timetz", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1560, + "typelem": 0, + "typname": "bit", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1561, + "typelem": 1560, + "typname": "_bit", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1562, + "typelem": 0, + "typname": "varbit", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1563, + "typelem": 1562, + "typname": "_varbit", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1700, + "typelem": 0, + "typname": "numeric", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 1790, + "typelem": 0, + "typname": "refcursor", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2201, + "typelem": 1790, + "typname": "_refcursor", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2202, + "typelem": 0, + "typname": "regprocedure", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2203, + "typelem": 0, + "typname": "regoper", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2204, + "typelem": 0, + "typname": "regoperator", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2205, + "typelem": 0, + "typname": "regclass", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2206, + "typelem": 0, + "typname": "regtype", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2207, + "typelem": 2202, + "typname": "_regprocedure", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2208, + "typelem": 2203, + "typname": "_regoper", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2209, + "typelem": 2204, + "typname": "_regoperator", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2210, + "typelem": 2205, + "typname": "_regclass", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2211, + "typelem": 2206, + "typname": "_regtype", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2249, + "typelem": 0, + "typname": "record", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2275, + "typelem": 0, + "typname": "cstring", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2276, + "typelem": 0, + "typname": "any", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2277, + "typelem": 0, + "typname": "anyarray", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2278, + "typelem": 0, + "typname": "void", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2279, + "typelem": 0, + "typname": "trigger", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2280, + "typelem": 0, + "typname": "language_handler", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2281, + "typelem": 0, + "typname": "internal", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2283, + "typelem": 0, + "typname": "anyelement", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2287, + "typelem": 2249, + "typname": "_record", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2776, + "typelem": 0, + "typname": "anynonarray", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 2842, + "typelem": 0, + "typname": "pg_authid", + "typrelid": 1260, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 2843, + "typelem": 0, + "typname": "pg_auth_members", + "typrelid": 1261, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 2949, + "typelem": 2970, + "typname": "_txid_snapshot", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2950, + "typelem": 0, + "typname": "uuid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2951, + "typelem": 2950, + "typname": "_uuid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 2970, + "typelem": 0, + "typname": "txid_snapshot", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3115, + "typelem": 0, + "typname": "fdw_handler", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 3220, + "typelem": 0, + "typname": "pg_lsn", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3221, + "typelem": 3220, + "typname": "_pg_lsn", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3310, + "typelem": 0, + "typname": "tsm_handler", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 3361, + "typelem": 0, + "typname": "pg_ndistinct", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3402, + "typelem": 0, + "typname": "pg_dependencies", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3500, + "typelem": 0, + "typname": "anyenum", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 3614, + "typelem": 0, + "typname": "tsvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3615, + "typelem": 0, + "typname": "tsquery", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3642, + "typelem": 0, + "typname": "gtsvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3643, + "typelem": 3614, + "typname": "_tsvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3644, + "typelem": 3642, + "typname": "_gtsvector", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3645, + "typelem": 3615, + "typname": "_tsquery", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3734, + "typelem": 0, + "typname": "regconfig", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3735, + "typelem": 3734, + "typname": "_regconfig", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3769, + "typelem": 0, + "typname": "regdictionary", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3770, + "typelem": 3769, + "typname": "_regdictionary", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3802, + "typelem": 0, + "typname": "jsonb", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3807, + "typelem": 3802, + "typname": "_jsonb", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3831, + "typelem": 0, + "typname": "anyrange", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 3838, + "typelem": 0, + "typname": "event_trigger", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 3904, + "typelem": 0, + "typname": "int4range", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3905, + "typelem": 3904, + "typname": "_int4range", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3906, + "typelem": 0, + "typname": "numrange", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3907, + "typelem": 3906, + "typname": "_numrange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3908, + "typelem": 0, + "typname": "tsrange", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3909, + "typelem": 3908, + "typname": "_tsrange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3910, + "typelem": 0, + "typname": "tstzrange", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3911, + "typelem": 3910, + "typname": "_tstzrange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3912, + "typelem": 0, + "typname": "daterange", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3913, + "typelem": 3912, + "typname": "_daterange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 3926, + "typelem": 0, + "typname": "int8range", + "typrelid": 0, + "typtype": "r" + }, + { + "nspname": "pg_catalog", + "oid": 3927, + "typelem": 3926, + "typname": "_int8range", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4066, + "typelem": 0, + "typname": "pg_shseclabel", + "typrelid": 3592, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 4072, + "typelem": 0, + "typname": "jsonpath", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4073, + "typelem": 4072, + "typname": "_jsonpath", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4089, + "typelem": 0, + "typname": "regnamespace", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4090, + "typelem": 4089, + "typname": "_regnamespace", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4096, + "typelem": 0, + "typname": "regrole", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4097, + "typelem": 4096, + "typname": "_regrole", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4191, + "typelem": 0, + "typname": "regcollation", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4192, + "typelem": 4191, + "typname": "_regcollation", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4451, + "typelem": 0, + "typname": "int4multirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4532, + "typelem": 0, + "typname": "nummultirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4533, + "typelem": 0, + "typname": "tsmultirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4534, + "typelem": 0, + "typname": "tstzmultirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4535, + "typelem": 0, + "typname": "datemultirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4536, + "typelem": 0, + "typname": "int8multirange", + "typrelid": 0, + "typtype": "m" + }, + { + "nspname": "pg_catalog", + "oid": 4537, + "typelem": 0, + "typname": "anymultirange", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 4538, + "typelem": 0, + "typname": "anycompatiblemultirange", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 4600, + "typelem": 0, + "typname": "pg_brin_bloom_summary", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 4601, + "typelem": 0, + "typname": "pg_brin_minmax_multi_summary", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 5017, + "typelem": 0, + "typname": "pg_mcv_list", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 5038, + "typelem": 0, + "typname": "pg_snapshot", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 5039, + "typelem": 5038, + "typname": "_pg_snapshot", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 5069, + "typelem": 0, + "typname": "xid8", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 5077, + "typelem": 0, + "typname": "anycompatible", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 5078, + "typelem": 0, + "typname": "anycompatiblearray", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 5079, + "typelem": 0, + "typname": "anycompatiblenonarray", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 5080, + "typelem": 0, + "typname": "anycompatiblerange", + "typrelid": 0, + "typtype": "p" + }, + { + "nspname": "pg_catalog", + "oid": 6101, + "typelem": 0, + "typname": "pg_subscription", + "typrelid": 6100, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 6150, + "typelem": 4451, + "typname": "_int4multirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 6151, + "typelem": 4532, + "typname": "_nummultirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 6152, + "typelem": 4533, + "typname": "_tsmultirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 6153, + "typelem": 4534, + "typname": "_tstzmultirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 6155, + "typelem": 4535, + "typname": "_datemultirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 6157, + "typelem": 4536, + "typname": "_int8multirange", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10000, + "typelem": 10001, + "typname": "_pg_attrdef", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10001, + "typelem": 0, + "typname": "pg_attrdef", + "typrelid": 2604, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10002, + "typelem": 10003, + "typname": "_pg_constraint", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10003, + "typelem": 0, + "typname": "pg_constraint", + "typrelid": 2606, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10004, + "typelem": 10005, + "typname": "_pg_inherits", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10005, + "typelem": 0, + "typname": "pg_inherits", + "typrelid": 2611, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10006, + "typelem": 10007, + "typname": "_pg_index", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10007, + "typelem": 0, + "typname": "pg_index", + "typrelid": 2610, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10008, + "typelem": 10009, + "typname": "_pg_operator", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10009, + "typelem": 0, + "typname": "pg_operator", + "typrelid": 2617, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10010, + "typelem": 10011, + "typname": "_pg_opfamily", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10011, + "typelem": 0, + "typname": "pg_opfamily", + "typrelid": 2753, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10012, + "typelem": 10013, + "typname": "_pg_opclass", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10013, + "typelem": 0, + "typname": "pg_opclass", + "typrelid": 2616, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10014, + "typelem": 10015, + "typname": "_pg_am", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10015, + "typelem": 0, + "typname": "pg_am", + "typrelid": 2601, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10016, + "typelem": 10017, + "typname": "_pg_amop", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10017, + "typelem": 0, + "typname": "pg_amop", + "typrelid": 2602, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10018, + "typelem": 10019, + "typname": "_pg_amproc", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10019, + "typelem": 0, + "typname": "pg_amproc", + "typrelid": 2603, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10020, + "typelem": 10021, + "typname": "_pg_language", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10021, + "typelem": 0, + "typname": "pg_language", + "typrelid": 2612, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10022, + "typelem": 10023, + "typname": "_pg_largeobject_metadata", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10023, + "typelem": 0, + "typname": "pg_largeobject_metadata", + "typrelid": 2995, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10024, + "typelem": 10025, + "typname": "_pg_largeobject", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10025, + "typelem": 0, + "typname": "pg_largeobject", + "typrelid": 2613, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10026, + "typelem": 10027, + "typname": "_pg_aggregate", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10027, + "typelem": 0, + "typname": "pg_aggregate", + "typrelid": 2600, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10028, + "typelem": 10029, + "typname": "_pg_statistic", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10029, + "typelem": 0, + "typname": "pg_statistic", + "typrelid": 2619, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10030, + "typelem": 10031, + "typname": "_pg_statistic_ext", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10031, + "typelem": 0, + "typname": "pg_statistic_ext", + "typrelid": 3381, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10032, + "typelem": 10033, + "typname": "_pg_statistic_ext_data", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10033, + "typelem": 0, + "typname": "pg_statistic_ext_data", + "typrelid": 3429, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10034, + "typelem": 10035, + "typname": "_pg_rewrite", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10035, + "typelem": 0, + "typname": "pg_rewrite", + "typrelid": 2618, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10036, + "typelem": 10037, + "typname": "_pg_trigger", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10037, + "typelem": 0, + "typname": "pg_trigger", + "typrelid": 2620, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10038, + "typelem": 10039, + "typname": "_pg_event_trigger", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10039, + "typelem": 0, + "typname": "pg_event_trigger", + "typrelid": 3466, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10040, + "typelem": 10041, + "typname": "_pg_description", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10041, + "typelem": 0, + "typname": "pg_description", + "typrelid": 2609, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10042, + "typelem": 10043, + "typname": "_pg_cast", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10043, + "typelem": 0, + "typname": "pg_cast", + "typrelid": 2605, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10044, + "typelem": 10045, + "typname": "_pg_enum", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10045, + "typelem": 0, + "typname": "pg_enum", + "typrelid": 3501, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10046, + "typelem": 10047, + "typname": "_pg_namespace", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10047, + "typelem": 0, + "typname": "pg_namespace", + "typrelid": 2615, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10048, + "typelem": 10049, + "typname": "_pg_conversion", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10049, + "typelem": 0, + "typname": "pg_conversion", + "typrelid": 2607, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10050, + "typelem": 10051, + "typname": "_pg_depend", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10051, + "typelem": 0, + "typname": "pg_depend", + "typrelid": 2608, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10052, + "typelem": 1248, + "typname": "_pg_database", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10053, + "typelem": 10054, + "typname": "_pg_db_role_setting", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10054, + "typelem": 0, + "typname": "pg_db_role_setting", + "typrelid": 2964, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10055, + "typelem": 10056, + "typname": "_pg_tablespace", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10056, + "typelem": 0, + "typname": "pg_tablespace", + "typrelid": 1213, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10057, + "typelem": 2842, + "typname": "_pg_authid", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10058, + "typelem": 2843, + "typname": "_pg_auth_members", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10059, + "typelem": 10060, + "typname": "_pg_shdepend", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10060, + "typelem": 0, + "typname": "pg_shdepend", + "typrelid": 1214, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10061, + "typelem": 10062, + "typname": "_pg_shdescription", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10062, + "typelem": 0, + "typname": "pg_shdescription", + "typrelid": 2396, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10063, + "typelem": 10064, + "typname": "_pg_ts_config", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10064, + "typelem": 0, + "typname": "pg_ts_config", + "typrelid": 3602, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10065, + "typelem": 10066, + "typname": "_pg_ts_config_map", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10066, + "typelem": 0, + "typname": "pg_ts_config_map", + "typrelid": 3603, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10067, + "typelem": 10068, + "typname": "_pg_ts_dict", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10068, + "typelem": 0, + "typname": "pg_ts_dict", + "typrelid": 3600, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10069, + "typelem": 10070, + "typname": "_pg_ts_parser", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10070, + "typelem": 0, + "typname": "pg_ts_parser", + "typrelid": 3601, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10071, + "typelem": 10072, + "typname": "_pg_ts_template", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10072, + "typelem": 0, + "typname": "pg_ts_template", + "typrelid": 3764, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10073, + "typelem": 10074, + "typname": "_pg_extension", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10074, + "typelem": 0, + "typname": "pg_extension", + "typrelid": 3079, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10075, + "typelem": 10076, + "typname": "_pg_foreign_data_wrapper", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10076, + "typelem": 0, + "typname": "pg_foreign_data_wrapper", + "typrelid": 2328, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10077, + "typelem": 10078, + "typname": "_pg_foreign_server", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10078, + "typelem": 0, + "typname": "pg_foreign_server", + "typrelid": 1417, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10079, + "typelem": 10080, + "typname": "_pg_user_mapping", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10080, + "typelem": 0, + "typname": "pg_user_mapping", + "typrelid": 1418, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10081, + "typelem": 10082, + "typname": "_pg_foreign_table", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10082, + "typelem": 0, + "typname": "pg_foreign_table", + "typrelid": 3118, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10083, + "typelem": 10084, + "typname": "_pg_policy", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10084, + "typelem": 0, + "typname": "pg_policy", + "typrelid": 3256, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10085, + "typelem": 10086, + "typname": "_pg_replication_origin", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10086, + "typelem": 0, + "typname": "pg_replication_origin", + "typrelid": 6000, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10087, + "typelem": 10088, + "typname": "_pg_default_acl", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10088, + "typelem": 0, + "typname": "pg_default_acl", + "typrelid": 826, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10089, + "typelem": 10090, + "typname": "_pg_init_privs", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10090, + "typelem": 0, + "typname": "pg_init_privs", + "typrelid": 3394, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10091, + "typelem": 10092, + "typname": "_pg_seclabel", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10092, + "typelem": 0, + "typname": "pg_seclabel", + "typrelid": 3596, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10093, + "typelem": 4066, + "typname": "_pg_shseclabel", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10094, + "typelem": 10095, + "typname": "_pg_collation", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10095, + "typelem": 0, + "typname": "pg_collation", + "typrelid": 3456, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10096, + "typelem": 10097, + "typname": "_pg_parameter_acl", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10097, + "typelem": 0, + "typname": "pg_parameter_acl", + "typrelid": 6243, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10098, + "typelem": 10099, + "typname": "_pg_partitioned_table", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10099, + "typelem": 0, + "typname": "pg_partitioned_table", + "typrelid": 3350, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10100, + "typelem": 10101, + "typname": "_pg_range", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10101, + "typelem": 0, + "typname": "pg_range", + "typrelid": 3541, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10102, + "typelem": 10103, + "typname": "_pg_transform", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10103, + "typelem": 0, + "typname": "pg_transform", + "typrelid": 3576, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10104, + "typelem": 10105, + "typname": "_pg_sequence", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10105, + "typelem": 0, + "typname": "pg_sequence", + "typrelid": 2224, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10106, + "typelem": 10107, + "typname": "_pg_publication", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10107, + "typelem": 0, + "typname": "pg_publication", + "typrelid": 6104, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10108, + "typelem": 10109, + "typname": "_pg_publication_namespace", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10109, + "typelem": 0, + "typname": "pg_publication_namespace", + "typrelid": 6237, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10110, + "typelem": 10111, + "typname": "_pg_publication_rel", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10111, + "typelem": 0, + "typname": "pg_publication_rel", + "typrelid": 6106, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 10112, + "typelem": 6101, + "typname": "_pg_subscription", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10113, + "typelem": 10114, + "typname": "_pg_subscription_rel", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 10114, + "typelem": 0, + "typname": "pg_subscription_rel", + "typrelid": 6102, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12001, + "typelem": 12002, + "typname": "_pg_roles", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12002, + "typelem": 0, + "typname": "pg_roles", + "typrelid": 12000, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12006, + "typelem": 12007, + "typname": "_pg_shadow", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12007, + "typelem": 0, + "typname": "pg_shadow", + "typrelid": 12005, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12011, + "typelem": 12012, + "typname": "_pg_group", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12012, + "typelem": 0, + "typname": "pg_group", + "typrelid": 12010, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12015, + "typelem": 12016, + "typname": "_pg_user", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12016, + "typelem": 0, + "typname": "pg_user", + "typrelid": 12014, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12019, + "typelem": 12020, + "typname": "_pg_policies", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12020, + "typelem": 0, + "typname": "pg_policies", + "typrelid": 12018, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12024, + "typelem": 12025, + "typname": "_pg_rules", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12025, + "typelem": 0, + "typname": "pg_rules", + "typrelid": 12023, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12029, + "typelem": 12030, + "typname": "_pg_views", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12030, + "typelem": 0, + "typname": "pg_views", + "typrelid": 12028, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12034, + "typelem": 12035, + "typname": "_pg_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12035, + "typelem": 0, + "typname": "pg_tables", + "typrelid": 12033, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12039, + "typelem": 12040, + "typname": "_pg_matviews", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12040, + "typelem": 0, + "typname": "pg_matviews", + "typrelid": 12038, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12044, + "typelem": 12045, + "typname": "_pg_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12045, + "typelem": 0, + "typname": "pg_indexes", + "typrelid": 12043, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12049, + "typelem": 12050, + "typname": "_pg_sequences", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12050, + "typelem": 0, + "typname": "pg_sequences", + "typrelid": 12048, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12054, + "typelem": 12055, + "typname": "_pg_stats", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12055, + "typelem": 0, + "typname": "pg_stats", + "typrelid": 12053, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12059, + "typelem": 12060, + "typname": "_pg_stats_ext", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12060, + "typelem": 0, + "typname": "pg_stats_ext", + "typrelid": 12058, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12064, + "typelem": 12065, + "typname": "_pg_stats_ext_exprs", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12065, + "typelem": 0, + "typname": "pg_stats_ext_exprs", + "typrelid": 12063, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12069, + "typelem": 12070, + "typname": "_pg_publication_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12070, + "typelem": 0, + "typname": "pg_publication_tables", + "typrelid": 12068, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12074, + "typelem": 12075, + "typname": "_pg_locks", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12075, + "typelem": 0, + "typname": "pg_locks", + "typrelid": 12073, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12078, + "typelem": 12079, + "typname": "_pg_cursors", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12079, + "typelem": 0, + "typname": "pg_cursors", + "typrelid": 12077, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12082, + "typelem": 12083, + "typname": "_pg_available_extensions", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12083, + "typelem": 0, + "typname": "pg_available_extensions", + "typrelid": 12081, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12086, + "typelem": 12087, + "typname": "_pg_available_extension_versions", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12087, + "typelem": 0, + "typname": "pg_available_extension_versions", + "typrelid": 12085, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12091, + "typelem": 12092, + "typname": "_pg_prepared_xacts", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12092, + "typelem": 0, + "typname": "pg_prepared_xacts", + "typrelid": 12090, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12096, + "typelem": 12097, + "typname": "_pg_prepared_statements", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12097, + "typelem": 0, + "typname": "pg_prepared_statements", + "typrelid": 12095, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12100, + "typelem": 12101, + "typname": "_pg_seclabels", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12101, + "typelem": 0, + "typname": "pg_seclabels", + "typrelid": 12099, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12105, + "typelem": 12106, + "typname": "_pg_settings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12106, + "typelem": 0, + "typname": "pg_settings", + "typrelid": 12104, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12111, + "typelem": 12112, + "typname": "_pg_file_settings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12112, + "typelem": 0, + "typname": "pg_file_settings", + "typrelid": 12110, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12115, + "typelem": 12116, + "typname": "_pg_hba_file_rules", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12116, + "typelem": 0, + "typname": "pg_hba_file_rules", + "typrelid": 12114, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12119, + "typelem": 12120, + "typname": "_pg_ident_file_mappings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12120, + "typelem": 0, + "typname": "pg_ident_file_mappings", + "typrelid": 12118, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12123, + "typelem": 12124, + "typname": "_pg_timezone_abbrevs", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12124, + "typelem": 0, + "typname": "pg_timezone_abbrevs", + "typrelid": 12122, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12127, + "typelem": 12128, + "typname": "_pg_timezone_names", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12128, + "typelem": 0, + "typname": "pg_timezone_names", + "typrelid": 12126, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12131, + "typelem": 12132, + "typname": "_pg_config", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12132, + "typelem": 0, + "typname": "pg_config", + "typrelid": 12130, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12135, + "typelem": 12136, + "typname": "_pg_shmem_allocations", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12136, + "typelem": 0, + "typname": "pg_shmem_allocations", + "typrelid": 12134, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12139, + "typelem": 12140, + "typname": "_pg_shmem_allocations_numa", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12140, + "typelem": 0, + "typname": "pg_shmem_allocations_numa", + "typrelid": 12138, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12143, + "typelem": 12144, + "typname": "_pg_backend_memory_contexts", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12144, + "typelem": 0, + "typname": "pg_backend_memory_contexts", + "typrelid": 12142, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12147, + "typelem": 12148, + "typname": "_pg_stat_all_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12148, + "typelem": 0, + "typname": "pg_stat_all_tables", + "typrelid": 12146, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12152, + "typelem": 12153, + "typname": "_pg_stat_xact_all_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12153, + "typelem": 0, + "typname": "pg_stat_xact_all_tables", + "typrelid": 12151, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12157, + "typelem": 12158, + "typname": "_pg_stat_sys_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12158, + "typelem": 0, + "typname": "pg_stat_sys_tables", + "typrelid": 12156, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12162, + "typelem": 12163, + "typname": "_pg_stat_xact_sys_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12163, + "typelem": 0, + "typname": "pg_stat_xact_sys_tables", + "typrelid": 12161, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12166, + "typelem": 12167, + "typname": "_pg_stat_user_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12167, + "typelem": 0, + "typname": "pg_stat_user_tables", + "typrelid": 12165, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12171, + "typelem": 12172, + "typname": "_pg_stat_xact_user_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12172, + "typelem": 0, + "typname": "pg_stat_xact_user_tables", + "typrelid": 12170, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12175, + "typelem": 12176, + "typname": "_pg_statio_all_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12176, + "typelem": 0, + "typname": "pg_statio_all_tables", + "typrelid": 12174, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12180, + "typelem": 12181, + "typname": "_pg_statio_sys_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12181, + "typelem": 0, + "typname": "pg_statio_sys_tables", + "typrelid": 12179, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12184, + "typelem": 12185, + "typname": "_pg_statio_user_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12185, + "typelem": 0, + "typname": "pg_statio_user_tables", + "typrelid": 12183, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12188, + "typelem": 12189, + "typname": "_pg_stat_all_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12189, + "typelem": 0, + "typname": "pg_stat_all_indexes", + "typrelid": 12187, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12193, + "typelem": 12194, + "typname": "_pg_stat_sys_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12194, + "typelem": 0, + "typname": "pg_stat_sys_indexes", + "typrelid": 12192, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12197, + "typelem": 12198, + "typname": "_pg_stat_user_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12198, + "typelem": 0, + "typname": "pg_stat_user_indexes", + "typrelid": 12196, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12201, + "typelem": 12202, + "typname": "_pg_statio_all_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12202, + "typelem": 0, + "typname": "pg_statio_all_indexes", + "typrelid": 12200, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12206, + "typelem": 12207, + "typname": "_pg_statio_sys_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12207, + "typelem": 0, + "typname": "pg_statio_sys_indexes", + "typrelid": 12205, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12210, + "typelem": 12211, + "typname": "_pg_statio_user_indexes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12211, + "typelem": 0, + "typname": "pg_statio_user_indexes", + "typrelid": 12209, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12214, + "typelem": 12215, + "typname": "_pg_statio_all_sequences", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12215, + "typelem": 0, + "typname": "pg_statio_all_sequences", + "typrelid": 12213, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12219, + "typelem": 12220, + "typname": "_pg_statio_sys_sequences", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12220, + "typelem": 0, + "typname": "pg_statio_sys_sequences", + "typrelid": 12218, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12223, + "typelem": 12224, + "typname": "_pg_statio_user_sequences", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12224, + "typelem": 0, + "typname": "pg_statio_user_sequences", + "typrelid": 12222, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12227, + "typelem": 12228, + "typname": "_pg_stat_activity", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12228, + "typelem": 0, + "typname": "pg_stat_activity", + "typrelid": 12226, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12232, + "typelem": 12233, + "typname": "_pg_stat_replication", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12233, + "typelem": 0, + "typname": "pg_stat_replication", + "typrelid": 12231, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12237, + "typelem": 12238, + "typname": "_pg_stat_slru", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12238, + "typelem": 0, + "typname": "pg_stat_slru", + "typrelid": 12236, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12241, + "typelem": 12242, + "typname": "_pg_stat_wal_receiver", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12242, + "typelem": 0, + "typname": "pg_stat_wal_receiver", + "typrelid": 12240, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12245, + "typelem": 12246, + "typname": "_pg_stat_recovery_prefetch", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12246, + "typelem": 0, + "typname": "pg_stat_recovery_prefetch", + "typrelid": 12244, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12249, + "typelem": 12250, + "typname": "_pg_stat_subscription", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12250, + "typelem": 0, + "typname": "pg_stat_subscription", + "typrelid": 12248, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12254, + "typelem": 12255, + "typname": "_pg_stat_ssl", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12255, + "typelem": 0, + "typname": "pg_stat_ssl", + "typrelid": 12253, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12258, + "typelem": 12259, + "typname": "_pg_stat_gssapi", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12259, + "typelem": 0, + "typname": "pg_stat_gssapi", + "typrelid": 12257, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12262, + "typelem": 12263, + "typname": "_pg_replication_slots", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12263, + "typelem": 0, + "typname": "pg_replication_slots", + "typrelid": 12261, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12267, + "typelem": 12268, + "typname": "_pg_stat_replication_slots", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12268, + "typelem": 0, + "typname": "pg_stat_replication_slots", + "typrelid": 12266, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12271, + "typelem": 12272, + "typname": "_pg_stat_database", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12272, + "typelem": 0, + "typname": "pg_stat_database", + "typrelid": 12270, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12276, + "typelem": 12277, + "typname": "_pg_stat_database_conflicts", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12277, + "typelem": 0, + "typname": "pg_stat_database_conflicts", + "typrelid": 12275, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12280, + "typelem": 12281, + "typname": "_pg_stat_user_functions", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12281, + "typelem": 0, + "typname": "pg_stat_user_functions", + "typrelid": 12279, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12285, + "typelem": 12286, + "typname": "_pg_stat_xact_user_functions", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12286, + "typelem": 0, + "typname": "pg_stat_xact_user_functions", + "typrelid": 12284, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12290, + "typelem": 12291, + "typname": "_pg_stat_archiver", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12291, + "typelem": 0, + "typname": "pg_stat_archiver", + "typrelid": 12289, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12294, + "typelem": 12295, + "typname": "_pg_stat_bgwriter", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12295, + "typelem": 0, + "typname": "pg_stat_bgwriter", + "typrelid": 12293, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12298, + "typelem": 12299, + "typname": "_pg_stat_checkpointer", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12299, + "typelem": 0, + "typname": "pg_stat_checkpointer", + "typrelid": 12297, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12302, + "typelem": 12303, + "typname": "_pg_stat_io", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12303, + "typelem": 0, + "typname": "pg_stat_io", + "typrelid": 12301, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12306, + "typelem": 12307, + "typname": "_pg_stat_wal", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12307, + "typelem": 0, + "typname": "pg_stat_wal", + "typrelid": 12305, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12310, + "typelem": 12311, + "typname": "_pg_stat_progress_analyze", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12311, + "typelem": 0, + "typname": "pg_stat_progress_analyze", + "typrelid": 12309, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12315, + "typelem": 12316, + "typname": "_pg_stat_progress_vacuum", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12316, + "typelem": 0, + "typname": "pg_stat_progress_vacuum", + "typrelid": 12314, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12320, + "typelem": 12321, + "typname": "_pg_stat_progress_cluster", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12321, + "typelem": 0, + "typname": "pg_stat_progress_cluster", + "typrelid": 12319, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12325, + "typelem": 12326, + "typname": "_pg_stat_progress_create_index", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12326, + "typelem": 0, + "typname": "pg_stat_progress_create_index", + "typrelid": 12324, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12330, + "typelem": 12331, + "typname": "_pg_stat_progress_basebackup", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12331, + "typelem": 0, + "typname": "pg_stat_progress_basebackup", + "typrelid": 12329, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12334, + "typelem": 12335, + "typname": "_pg_stat_progress_copy", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12335, + "typelem": 0, + "typname": "pg_stat_progress_copy", + "typrelid": 12333, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12339, + "typelem": 12340, + "typname": "_pg_user_mappings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12340, + "typelem": 0, + "typname": "pg_user_mappings", + "typrelid": 12338, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12344, + "typelem": 12345, + "typname": "_pg_replication_origin_status", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12345, + "typelem": 0, + "typname": "pg_replication_origin_status", + "typrelid": 12343, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12348, + "typelem": 12349, + "typname": "_pg_stat_subscription_stats", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12349, + "typelem": 0, + "typname": "pg_stat_subscription_stats", + "typrelid": 12347, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12352, + "typelem": 12353, + "typname": "_pg_wait_events", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12353, + "typelem": 0, + "typname": "pg_wait_events", + "typrelid": 12351, + "typtype": "c" + }, + { + "nspname": "pg_catalog", + "oid": 12356, + "typelem": 12357, + "typname": "_pg_aios", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "pg_catalog", + "oid": 12357, + "typelem": 0, + "typname": "pg_aios", + "typrelid": 12355, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14873, + "typelem": 14874, + "typname": "_cardinal_number", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14874, + "typelem": 0, + "typname": "cardinal_number", + "typrelid": 0, + "typtype": "d" + }, + { + "nspname": "information_schema", + "oid": 14876, + "typelem": 14877, + "typname": "_character_data", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14877, + "typelem": 0, + "typname": "character_data", + "typrelid": 0, + "typtype": "d" + }, + { + "nspname": "information_schema", + "oid": 14878, + "typelem": 14879, + "typname": "_sql_identifier", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14879, + "typelem": 0, + "typname": "sql_identifier", + "typrelid": 0, + "typtype": "d" + }, + { + "nspname": "information_schema", + "oid": 14881, + "typelem": 14882, + "typname": "_information_schema_catalog_name", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14882, + "typelem": 0, + "typname": "information_schema_catalog_name", + "typrelid": 14880, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14884, + "typelem": 14885, + "typname": "_time_stamp", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14885, + "typelem": 0, + "typname": "time_stamp", + "typrelid": 0, + "typtype": "d" + }, + { + "nspname": "information_schema", + "oid": 14886, + "typelem": 14887, + "typname": "_yes_or_no", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14887, + "typelem": 0, + "typname": "yes_or_no", + "typrelid": 0, + "typtype": "d" + }, + { + "nspname": "information_schema", + "oid": 14890, + "typelem": 14891, + "typname": "_applicable_roles", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14891, + "typelem": 0, + "typname": "applicable_roles", + "typrelid": 14889, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14895, + "typelem": 14896, + "typname": "_administrable_role_authorizations", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14896, + "typelem": 0, + "typname": "administrable_role_authorizations", + "typrelid": 14894, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14899, + "typelem": 14900, + "typname": "_attributes", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14900, + "typelem": 0, + "typname": "attributes", + "typrelid": 14898, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14904, + "typelem": 14905, + "typname": "_character_sets", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14905, + "typelem": 0, + "typname": "character_sets", + "typrelid": 14903, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14909, + "typelem": 14910, + "typname": "_check_constraint_routine_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14910, + "typelem": 0, + "typname": "check_constraint_routine_usage", + "typrelid": 14908, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14914, + "typelem": 14915, + "typname": "_check_constraints", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14915, + "typelem": 0, + "typname": "check_constraints", + "typrelid": 14913, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14919, + "typelem": 14920, + "typname": "_collations", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14920, + "typelem": 0, + "typname": "collations", + "typrelid": 14918, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14924, + "typelem": 14925, + "typname": "_collation_character_set_applicability", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14925, + "typelem": 0, + "typname": "collation_character_set_applicability", + "typrelid": 14923, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14929, + "typelem": 14930, + "typname": "_column_column_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14930, + "typelem": 0, + "typname": "column_column_usage", + "typrelid": 14928, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14934, + "typelem": 14935, + "typname": "_column_domain_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14935, + "typelem": 0, + "typname": "column_domain_usage", + "typrelid": 14933, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14939, + "typelem": 14940, + "typname": "_column_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14940, + "typelem": 0, + "typname": "column_privileges", + "typrelid": 14938, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14944, + "typelem": 14945, + "typname": "_column_udt_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14945, + "typelem": 0, + "typname": "column_udt_usage", + "typrelid": 14943, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14949, + "typelem": 14950, + "typname": "_columns", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14950, + "typelem": 0, + "typname": "columns", + "typrelid": 14948, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14954, + "typelem": 14955, + "typname": "_constraint_column_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14955, + "typelem": 0, + "typname": "constraint_column_usage", + "typrelid": 14953, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14959, + "typelem": 14960, + "typname": "_constraint_table_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14960, + "typelem": 0, + "typname": "constraint_table_usage", + "typrelid": 14958, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14964, + "typelem": 14965, + "typname": "_domain_constraints", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14965, + "typelem": 0, + "typname": "domain_constraints", + "typrelid": 14963, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14969, + "typelem": 14970, + "typname": "_domain_udt_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14970, + "typelem": 0, + "typname": "domain_udt_usage", + "typrelid": 14968, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14973, + "typelem": 14974, + "typname": "_domains", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14974, + "typelem": 0, + "typname": "domains", + "typrelid": 14972, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14978, + "typelem": 14979, + "typname": "_enabled_roles", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14979, + "typelem": 0, + "typname": "enabled_roles", + "typrelid": 14977, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14982, + "typelem": 14983, + "typname": "_key_column_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14983, + "typelem": 0, + "typname": "key_column_usage", + "typrelid": 14981, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14987, + "typelem": 14988, + "typname": "_parameters", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14988, + "typelem": 0, + "typname": "parameters", + "typrelid": 14986, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14992, + "typelem": 14993, + "typname": "_referential_constraints", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14993, + "typelem": 0, + "typname": "referential_constraints", + "typrelid": 14991, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 14997, + "typelem": 14998, + "typname": "_role_column_grants", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 14998, + "typelem": 0, + "typname": "role_column_grants", + "typrelid": 14996, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15001, + "typelem": 15002, + "typname": "_routine_column_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15002, + "typelem": 0, + "typname": "routine_column_usage", + "typrelid": 15000, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15006, + "typelem": 15007, + "typname": "_routine_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15007, + "typelem": 0, + "typname": "routine_privileges", + "typrelid": 15005, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15011, + "typelem": 15012, + "typname": "_role_routine_grants", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15012, + "typelem": 0, + "typname": "role_routine_grants", + "typrelid": 15010, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15015, + "typelem": 15016, + "typname": "_routine_routine_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15016, + "typelem": 0, + "typname": "routine_routine_usage", + "typrelid": 15014, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15020, + "typelem": 15021, + "typname": "_routine_sequence_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15021, + "typelem": 0, + "typname": "routine_sequence_usage", + "typrelid": 15019, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15025, + "typelem": 15026, + "typname": "_routine_table_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15026, + "typelem": 0, + "typname": "routine_table_usage", + "typrelid": 15024, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15030, + "typelem": 15031, + "typname": "_routines", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15031, + "typelem": 0, + "typname": "routines", + "typrelid": 15029, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15035, + "typelem": 15036, + "typname": "_schemata", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15036, + "typelem": 0, + "typname": "schemata", + "typrelid": 15034, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15039, + "typelem": 15040, + "typname": "_sequences", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15040, + "typelem": 0, + "typname": "sequences", + "typrelid": 15038, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15044, + "typelem": 15045, + "typname": "_sql_features", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15045, + "typelem": 0, + "typname": "sql_features", + "typrelid": 15043, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15049, + "typelem": 15050, + "typname": "_sql_implementation_info", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15050, + "typelem": 0, + "typname": "sql_implementation_info", + "typrelid": 15048, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15054, + "typelem": 15055, + "typname": "_sql_parts", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15055, + "typelem": 0, + "typname": "sql_parts", + "typrelid": 15053, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15059, + "typelem": 15060, + "typname": "_sql_sizing", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15060, + "typelem": 0, + "typname": "sql_sizing", + "typrelid": 15058, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15064, + "typelem": 15065, + "typname": "_table_constraints", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15065, + "typelem": 0, + "typname": "table_constraints", + "typrelid": 15063, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15069, + "typelem": 15070, + "typname": "_table_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15070, + "typelem": 0, + "typname": "table_privileges", + "typrelid": 15068, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15074, + "typelem": 15075, + "typname": "_role_table_grants", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15075, + "typelem": 0, + "typname": "role_table_grants", + "typrelid": 15073, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15078, + "typelem": 15079, + "typname": "_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15079, + "typelem": 0, + "typname": "tables", + "typrelid": 15077, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15083, + "typelem": 15084, + "typname": "_transforms", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15084, + "typelem": 0, + "typname": "transforms", + "typrelid": 15082, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15088, + "typelem": 15089, + "typname": "_triggered_update_columns", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15089, + "typelem": 0, + "typname": "triggered_update_columns", + "typrelid": 15087, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15093, + "typelem": 15094, + "typname": "_triggers", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15094, + "typelem": 0, + "typname": "triggers", + "typrelid": 15092, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15098, + "typelem": 15099, + "typname": "_udt_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15099, + "typelem": 0, + "typname": "udt_privileges", + "typrelid": 15097, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15103, + "typelem": 15104, + "typname": "_role_udt_grants", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15104, + "typelem": 0, + "typname": "role_udt_grants", + "typrelid": 15102, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15107, + "typelem": 15108, + "typname": "_usage_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15108, + "typelem": 0, + "typname": "usage_privileges", + "typrelid": 15106, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15112, + "typelem": 15113, + "typname": "_role_usage_grants", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15113, + "typelem": 0, + "typname": "role_usage_grants", + "typrelid": 15111, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15116, + "typelem": 15117, + "typname": "_user_defined_types", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15117, + "typelem": 0, + "typname": "user_defined_types", + "typrelid": 15115, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15121, + "typelem": 15122, + "typname": "_view_column_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15122, + "typelem": 0, + "typname": "view_column_usage", + "typrelid": 15120, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15126, + "typelem": 15127, + "typname": "_view_routine_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15127, + "typelem": 0, + "typname": "view_routine_usage", + "typrelid": 15125, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15131, + "typelem": 15132, + "typname": "_view_table_usage", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15132, + "typelem": 0, + "typname": "view_table_usage", + "typrelid": 15130, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15136, + "typelem": 15137, + "typname": "_views", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15137, + "typelem": 0, + "typname": "views", + "typrelid": 15135, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15141, + "typelem": 15142, + "typname": "_data_type_privileges", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15142, + "typelem": 0, + "typname": "data_type_privileges", + "typrelid": 15140, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15146, + "typelem": 15147, + "typname": "_element_types", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15147, + "typelem": 0, + "typname": "element_types", + "typrelid": 15145, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15151, + "typelem": 15152, + "typname": "__pg_foreign_table_columns", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15152, + "typelem": 0, + "typname": "_pg_foreign_table_columns", + "typrelid": 15150, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15156, + "typelem": 15157, + "typname": "_column_options", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15157, + "typelem": 0, + "typname": "column_options", + "typrelid": 15155, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15160, + "typelem": 15161, + "typname": "__pg_foreign_data_wrappers", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15161, + "typelem": 0, + "typname": "_pg_foreign_data_wrappers", + "typrelid": 15159, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15164, + "typelem": 15165, + "typname": "_foreign_data_wrapper_options", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15165, + "typelem": 0, + "typname": "foreign_data_wrapper_options", + "typrelid": 15163, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15168, + "typelem": 15169, + "typname": "_foreign_data_wrappers", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15169, + "typelem": 0, + "typname": "foreign_data_wrappers", + "typrelid": 15167, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15172, + "typelem": 15173, + "typname": "__pg_foreign_servers", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15173, + "typelem": 0, + "typname": "_pg_foreign_servers", + "typrelid": 15171, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15176, + "typelem": 15177, + "typname": "_foreign_server_options", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15177, + "typelem": 0, + "typname": "foreign_server_options", + "typrelid": 15175, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15180, + "typelem": 15181, + "typname": "_foreign_servers", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15181, + "typelem": 0, + "typname": "foreign_servers", + "typrelid": 15179, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15184, + "typelem": 15185, + "typname": "__pg_foreign_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15185, + "typelem": 0, + "typname": "_pg_foreign_tables", + "typrelid": 15183, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15189, + "typelem": 15190, + "typname": "_foreign_table_options", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15190, + "typelem": 0, + "typname": "foreign_table_options", + "typrelid": 15188, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15193, + "typelem": 15194, + "typname": "_foreign_tables", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15194, + "typelem": 0, + "typname": "foreign_tables", + "typrelid": 15192, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15197, + "typelem": 15198, + "typname": "__pg_user_mappings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15198, + "typelem": 0, + "typname": "_pg_user_mappings", + "typrelid": 15196, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15202, + "typelem": 15203, + "typname": "_user_mapping_options", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15203, + "typelem": 0, + "typname": "user_mapping_options", + "typrelid": 15201, + "typtype": "c" + }, + { + "nspname": "information_schema", + "oid": 15207, + "typelem": 15208, + "typname": "_user_mappings", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "information_schema", + "oid": 15208, + "typelem": 0, + "typname": "user_mappings", + "typrelid": 15206, + "typtype": "c" + }, + { + "nspname": "sales", + "oid": 16390, + "typelem": 16391, + "typname": "_orders", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "sales", + "oid": 16391, + "typelem": 0, + "typname": "orders", + "typrelid": 16389, + "typtype": "c" + }, + { + "nspname": "analytics", + "oid": 16397, + "typelem": 16398, + "typname": "_order_summary", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "analytics", + "oid": 16398, + "typelem": 0, + "typname": "order_summary", + "typrelid": 16396, + "typtype": "c" + }, + { + "nspname": "analytics", + "oid": 16401, + "typelem": 16402, + "typname": "_monthly_revenue", + "typrelid": 0, + "typtype": "b" + }, + { + "nspname": "analytics", + "oid": 16402, + "typelem": 0, + "typname": "monthly_revenue", + "typrelid": 16400, + "typtype": "c" + } + ], + "sql_hash": "sha256:b3a71251f210047d45ebb2387eec027cd4417a2b96649fd25359b56a8ab32455" + }, + "server_version": { + "rows": [ + { + "version": "180003" + } + ], + "sql_hash": "sha256:04a1e5105680b2bb9287d2115d58a5f2119e93bc2c4ee46ffb0166d4ae72dc70" + } + } +} diff --git a/skills/database-dependency-migration/examples/analytics/drop.sql b/skills/database-dependency-migration/examples/analytics/drop.sql new file mode 100644 index 0000000..149bacf --- /dev/null +++ b/skills/database-dependency-migration/examples/analytics/drop.sql @@ -0,0 +1 @@ +ALTER TABLE sales.orders DROP COLUMN total_amount CASCADE; diff --git a/skills/database-dependency-migration/examples/analytics/schema.sql b/skills/database-dependency-migration/examples/analytics/schema.sql new file mode 100644 index 0000000..6b2c5fb --- /dev/null +++ b/skills/database-dependency-migration/examples/analytics/schema.sql @@ -0,0 +1,5 @@ +CREATE SCHEMA sales; +CREATE SCHEMA analytics; +CREATE TABLE sales.orders (id bigint PRIMARY KEY, total_amount numeric(12,2) NOT NULL); +CREATE VIEW analytics.order_summary AS SELECT id, total_amount FROM sales.orders; +CREATE VIEW analytics.monthly_revenue AS SELECT sum(total_amount) AS revenue FROM analytics.order_summary; diff --git a/skills/database-dependency-migration/examples/diff/after.sql b/skills/database-dependency-migration/examples/diff/after.sql new file mode 100644 index 0000000..b1e1ba2 --- /dev/null +++ b/skills/database-dependency-migration/examples/diff/after.sql @@ -0,0 +1 @@ +CREATE TABLE public.customers (id bigint PRIMARY KEY, display_name text); diff --git a/skills/database-dependency-migration/examples/diff/before.sql b/skills/database-dependency-migration/examples/diff/before.sql new file mode 100644 index 0000000..50ea800 --- /dev/null +++ b/skills/database-dependency-migration/examples/diff/before.sql @@ -0,0 +1 @@ +CREATE TABLE public.customers (id bigint PRIMARY KEY, name text); diff --git a/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/query.ts b/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/query.ts new file mode 100644 index 0000000..b0276cb --- /dev/null +++ b/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/query.ts @@ -0,0 +1,2 @@ +// Deliberately dynamic. SQL inside host languages is not resolved in v1. +export const lookup = (column: string) => `SELECT ${column} FROM public.customers`; diff --git a/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/static.sql b/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/static.sql new file mode 100644 index 0000000..7590fae --- /dev/null +++ b/skills/database-dependency-migration/examples/dynamic-sql-unknown/app/static.sql @@ -0,0 +1 @@ +SELECT email FROM public.customers WHERE id = $1; diff --git a/skills/database-dependency-migration/examples/dynamic-sql-unknown/schema.sql b/skills/database-dependency-migration/examples/dynamic-sql-unknown/schema.sql new file mode 100644 index 0000000..fdba7b7 --- /dev/null +++ b/skills/database-dependency-migration/examples/dynamic-sql-unknown/schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE public.customers (id bigint PRIMARY KEY, email text); +CREATE FUNCTION public.lookup_customer(field_name text) RETURNS text LANGUAGE plpgsql AS $$ +DECLARE result text; +BEGIN + EXECUTE 'SELECT ' || quote_ident(field_name) || ' FROM public.customers LIMIT 1' INTO result; + RETURN result; +END +$$; diff --git a/skills/database-dependency-migration/examples/ecommerce/app/customers.sql b/skills/database-dependency-migration/examples/ecommerce/app/customers.sql new file mode 100644 index 0000000..7b248d7 --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/app/customers.sql @@ -0,0 +1 @@ +SELECT c.id, c.email, c.name FROM public.customers AS c WHERE c.id = $1; diff --git a/skills/database-dependency-migration/examples/ecommerce/app/orders.sql b/skills/database-dependency-migration/examples/ecommerce/app/orders.sql new file mode 100644 index 0000000..952d2a7 --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/app/orders.sql @@ -0,0 +1,2 @@ +SELECT o.id, o.customer_id, c.email FROM public.orders o +JOIN public.customers c ON c.id = o.customer_id WHERE o.id = $1; diff --git a/skills/database-dependency-migration/examples/ecommerce/migrations/001_add_customer_uuid.sql b/skills/database-dependency-migration/examples/ecommerce/migrations/001_add_customer_uuid.sql new file mode 100644 index 0000000..50826b2 --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/migrations/001_add_customer_uuid.sql @@ -0,0 +1,4 @@ +-- REVIEW ONLY. Expansion requires mapping design and deployment review. +ALTER TABLE public.customers ADD COLUMN customer_uuid uuid; +ALTER TABLE public.orders ADD COLUMN customer_uuid uuid; +ALTER TABLE public.addresses ADD COLUMN customer_uuid uuid; diff --git a/skills/database-dependency-migration/examples/ecommerce/migrations/002_backfill_customer_uuid.sql b/skills/database-dependency-migration/examples/ecommerce/migrations/002_backfill_customer_uuid.sql new file mode 100644 index 0000000..a17b155 --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/migrations/002_backfill_customer_uuid.sql @@ -0,0 +1,7 @@ +-- REVIEW ONLY. Operator supplies bounded batches, validates mapping uniqueness +-- and coordinates dual writers. This sketch is not an online backfill runner. +UPDATE public.customers SET customer_uuid = gen_random_uuid() WHERE customer_uuid IS NULL; +UPDATE public.orders o SET customer_uuid = c.customer_uuid +FROM public.customers c WHERE o.customer_id = c.id AND o.customer_uuid IS NULL; +UPDATE public.addresses a SET customer_uuid = c.customer_uuid +FROM public.customers c WHERE a.customer_id = c.id AND a.customer_uuid IS NULL; diff --git a/skills/database-dependency-migration/examples/ecommerce/migrations/003_contract_legacy_id.sql b/skills/database-dependency-migration/examples/ecommerce/migrations/003_contract_legacy_id.sql new file mode 100644 index 0000000..13802de --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/migrations/003_contract_legacy_id.sql @@ -0,0 +1,4 @@ +-- Deliberately hazardous proposal, not executable migration instructions. +-- Requires replaced FKs/views, new keys and verified consumer transition first. +ALTER TABLE public.customers ALTER COLUMN id TYPE uuid USING id::text::uuid; +ALTER TABLE public.orders DROP COLUMN customer_id; diff --git a/skills/database-dependency-migration/examples/ecommerce/schema.sql b/skills/database-dependency-migration/examples/ecommerce/schema.sql new file mode 100644 index 0000000..7fbfbd2 --- /dev/null +++ b/skills/database-dependency-migration/examples/ecommerce/schema.sql @@ -0,0 +1,46 @@ +CREATE TABLE public.customers ( + id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + email text NOT NULL UNIQUE, + name text NOT NULL, + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE TABLE public.addresses ( + id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + customer_id bigint NOT NULL REFERENCES public.customers(id), + city text NOT NULL +); +CREATE TABLE public.products ( + id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + sku text UNIQUE NOT NULL, + price numeric(12,2) NOT NULL CHECK (price >= 0) +); +CREATE TABLE public.orders ( + id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + customer_id bigint NOT NULL REFERENCES public.customers(id), + total_amount numeric(12,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE TABLE public.order_items ( + order_id bigint REFERENCES public.orders(id), + product_id bigint REFERENCES public.products(id), + quantity integer NOT NULL CHECK (quantity > 0), + PRIMARY KEY (order_id, product_id) +); +CREATE TABLE public.payments ( + id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + order_id bigint NOT NULL REFERENCES public.orders(id), + amount numeric(12,2) NOT NULL CHECK (amount >= 0) +); +CREATE INDEX orders_customer_idx ON public.orders(customer_id); +CREATE VIEW public.customer_summary AS +SELECT c.id, c.email, count(o.id) AS order_count +FROM public.customers c LEFT JOIN public.orders o ON o.customer_id = c.id +GROUP BY c.id, c.email; +CREATE FUNCTION public.touch_customer() RETURNS trigger LANGUAGE plpgsql AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END +$$; +CREATE TRIGGER customers_touch BEFORE UPDATE ON public.customers +FOR EACH ROW EXECUTE FUNCTION public.touch_customer(); diff --git a/skills/database-dependency-migration/examples/high-traffic/migrations/007.sql b/skills/database-dependency-migration/examples/high-traffic/migrations/007.sql new file mode 100644 index 0000000..e0607df --- /dev/null +++ b/skills/database-dependency-migration/examples/high-traffic/migrations/007.sql @@ -0,0 +1,5 @@ +CREATE INDEX orders_total_idx ON public.orders(total_amount); +ALTER TABLE public.orders ALTER COLUMN total_amount TYPE double precision; +BEGIN; +CREATE INDEX CONCURRENTLY orders_created_idx ON public.orders(created_at); +COMMIT; diff --git a/skills/database-dependency-migration/examples/high-traffic/workload-profile.json b/skills/database-dependency-migration/examples/high-traffic/workload-profile.json new file mode 100644 index 0000000..8af2650 --- /dev/null +++ b/skills/database-dependency-migration/examples/high-traffic/workload-profile.json @@ -0,0 +1 @@ +{"public.orders": {"size_bytes": 8000000000, "traffic": "high", "origin": "user_supplied", "explanation": "Scenario inputs supplied by the user, not discovered measurements."}} diff --git a/skills/database-dependency-migration/examples/multi-schema/schema.sql b/skills/database-dependency-migration/examples/multi-schema/schema.sql new file mode 100644 index 0000000..ade6a5b --- /dev/null +++ b/skills/database-dependency-migration/examples/multi-schema/schema.sql @@ -0,0 +1,4 @@ +CREATE SCHEMA sales; +CREATE TABLE public.orders (id bigint PRIMARY KEY); +CREATE TABLE sales.orders (id bigint PRIMARY KEY); +SELECT id FROM orders; diff --git a/skills/database-dependency-migration/examples/rendered/analytics/graph.dot b/skills/database-dependency-migration/examples/rendered/analytics/graph.dot new file mode 100644 index 0000000..7fb9d58 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/graph.dot @@ -0,0 +1,54 @@ +digraph dependencies { + // Source depends on target; reverse traversal gives impact + "postgresql:local/analytics/column/monthly_revenue/revenue/" [label="analytics.monthly_revenue.revenue"]; + "postgresql:local/analytics/column/order_summary/id/" [label="analytics.order_summary.id"]; + "postgresql:local/analytics/column/order_summary/total_amount/" [label="analytics.order_summary.total_amount"]; + "postgresql:local/analytics/schema//analytics/" [label="analytics.analytics"]; + "postgresql:local/analytics/type//_monthly_revenue/" [label="analytics._monthly_revenue"]; + "postgresql:local/analytics/type//_order_summary/" [label="analytics._order_summary"]; + "postgresql:local/analytics/type//monthly_revenue/" [label="analytics.monthly_revenue"]; + "postgresql:local/analytics/type//order_summary/" [label="analytics.order_summary"]; + "postgresql:local/analytics/view//monthly_revenue/" [label="analytics.monthly_revenue"]; + "postgresql:local/analytics/view//order_summary/" [label="analytics.order_summary"]; + "postgresql:local/pg_catalog/extension//plpgsql/" [label="pg_catalog.plpgsql"]; + "postgresql:local/public/schema//public/" [label="public.public"]; + "postgresql:local/sales/column/orders/id/" [label="sales.orders.id"]; + "postgresql:local/sales/column/orders/total_amount/" [label="sales.orders.total_amount"]; + "postgresql:local/sales/constraint/orders/orders_id_not_null/" [label="sales.orders.orders_id_not_null"]; + "postgresql:local/sales/constraint/orders/orders_pkey/" [label="sales.orders.orders_pkey"]; + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" [label="sales.orders.orders_total_amount_not_null"]; + "postgresql:local/sales/index//orders_pkey/" [label="sales.orders_pkey"]; + "postgresql:local/sales/schema//sales/" [label="sales.sales"]; + "postgresql:local/sales/table//orders/" [label="sales.orders"]; + "postgresql:local/sales/type//_orders/" [label="sales._orders"]; + "postgresql:local/sales/type//orders/" [label="sales.orders"]; + "postgresql:local/analytics/view//order_summary/" -> "postgresql:local/analytics/schema//analytics/" [label="catalog_dependency"]; + "postgresql:local/sales/index//orders_pkey/" -> "postgresql:local/sales/table//orders/" [label="contains"]; + "postgresql:local/analytics/view//monthly_revenue/" -> "postgresql:local/analytics/schema//analytics/" [label="catalog_dependency"]; + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" -> "postgresql:local/sales/column/orders/total_amount/" [label="expression_reference"]; + "postgresql:local/sales/type//_orders/" -> "postgresql:local/sales/type//orders/" [label="catalog_dependency"]; + "postgresql:local/sales/constraint/orders/orders_id_not_null/" -> "postgresql:local/sales/table//orders/" [label="contains"]; + "postgresql:local/sales/constraint/orders/orders_pkey/" -> "postgresql:local/sales/column/orders/id/" [label="catalog_dependency"]; + "postgresql:local/analytics/type//_order_summary/" -> "postgresql:local/analytics/type//order_summary/" [label="catalog_dependency"]; + "postgresql:local/analytics/view//monthly_revenue/" -> "postgresql:local/analytics/column/order_summary/total_amount/" [label="catalog_dependency"]; + "postgresql:local/analytics/type//_monthly_revenue/" -> "postgresql:local/analytics/type//monthly_revenue/" [label="catalog_dependency"]; + "postgresql:local/sales/index//orders_pkey/" -> "postgresql:local/sales/column/orders/id/" [label="expression_reference"]; + "postgresql:local/analytics/view//order_summary/" -> "postgresql:local/sales/column/orders/id/" [label="catalog_dependency"]; + "postgresql:local/sales/constraint/orders/orders_pkey/" -> "postgresql:local/sales/column/orders/id/" [label="expression_reference"]; + "postgresql:local/analytics/view//order_summary/" -> "postgresql:local/sales/column/orders/total_amount/" [label="catalog_dependency"]; + "postgresql:local/sales/table//orders/" -> "postgresql:local/sales/schema//sales/" [label="catalog_dependency"]; + "postgresql:local/analytics/type//monthly_revenue/" -> "postgresql:local/analytics/view//monthly_revenue/" [label="catalog_dependency"]; + "postgresql:local/sales/constraint/orders/orders_pkey/" -> "postgresql:local/sales/table//orders/" [label="contains"]; + "postgresql:local/analytics/column/order_summary/id/" -> "postgresql:local/analytics/view//order_summary/" [label="contains"]; + "postgresql:local/sales/constraint/orders/orders_id_not_null/" -> "postgresql:local/sales/column/orders/id/" [label="expression_reference"]; + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" -> "postgresql:local/sales/table//orders/" [label="contains"]; + "postgresql:local/analytics/column/order_summary/total_amount/" -> "postgresql:local/analytics/view//order_summary/" [label="contains"]; + "postgresql:local/sales/index//orders_pkey/" -> "postgresql:local/sales/constraint/orders/orders_pkey/" [label="catalog_dependency"]; + "postgresql:local/analytics/type//order_summary/" -> "postgresql:local/analytics/view//order_summary/" [label="catalog_dependency"]; + "postgresql:local/analytics/column/monthly_revenue/revenue/" -> "postgresql:local/analytics/view//monthly_revenue/" [label="contains"]; + "postgresql:local/sales/constraint/orders/orders_id_not_null/" -> "postgresql:local/sales/column/orders/id/" [label="catalog_dependency"]; + "postgresql:local/sales/type//orders/" -> "postgresql:local/sales/table//orders/" [label="catalog_dependency"]; + "postgresql:local/sales/column/orders/id/" -> "postgresql:local/sales/table//orders/" [label="contains"]; + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" -> "postgresql:local/sales/column/orders/total_amount/" [label="catalog_dependency"]; + "postgresql:local/sales/column/orders/total_amount/" -> "postgresql:local/sales/table//orders/" [label="contains"]; +} diff --git a/skills/database-dependency-migration/examples/rendered/analytics/graph.mmd b/skills/database-dependency-migration/examples/rendered/analytics/graph.mmd new file mode 100644 index 0000000..3829a9f --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/graph.mmd @@ -0,0 +1,53 @@ +flowchart LR + %% Source depends on target; traverse reverse for impact + n0["analytics.monthly_revenue.revenue"] + n1["analytics.order_summary.id"] + n2["analytics.order_summary.total_amount"] + n3["analytics.analytics"] + n4["analytics._monthly_revenue"] + n5["analytics._order_summary"] + n6["analytics.monthly_revenue"] + n7["analytics.order_summary"] + n8["analytics.monthly_revenue"] + n9["analytics.order_summary"] + n10["pg_catalog.plpgsql"] + n11["public.public"] + n12["sales.orders.id"] + n13["sales.orders.total_amount"] + n14["sales.orders.orders_id_not_null"] + n15["sales.orders.orders_pkey"] + n16["sales.orders.orders_total_amount_not_null"] + n17["sales.orders_pkey"] + n18["sales.sales"] + n19["sales.orders"] + n20["sales._orders"] + n21["sales.orders"] + n9 -->|catalog_dependency| n3 + n17 -->|contains| n19 + n8 -->|catalog_dependency| n3 + n16 -->|expression_reference| n13 + n20 -->|catalog_dependency| n21 + n14 -->|contains| n19 + n15 -->|catalog_dependency| n12 + n5 -->|catalog_dependency| n7 + n8 -->|catalog_dependency| n2 + n4 -->|catalog_dependency| n6 + n17 -->|expression_reference| n12 + n9 -->|catalog_dependency| n12 + n15 -->|expression_reference| n12 + n9 -->|catalog_dependency| n13 + n19 -->|catalog_dependency| n18 + n6 -->|catalog_dependency| n8 + n15 -->|contains| n19 + n1 -->|contains| n9 + n14 -->|expression_reference| n12 + n16 -->|contains| n19 + n2 -->|contains| n9 + n17 -->|catalog_dependency| n15 + n7 -->|catalog_dependency| n9 + n0 -->|contains| n8 + n14 -->|catalog_dependency| n12 + n21 -->|catalog_dependency| n19 + n12 -->|contains| n19 + n16 -->|catalog_dependency| n13 + n13 -->|contains| n19 diff --git a/skills/database-dependency-migration/examples/rendered/analytics/model.dbdep.json b/skills/database-dependency-migration/examples/rendered/analytics/model.dbdep.json new file mode 100644 index 0000000..156a45b --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/model.dbdep.json @@ -0,0 +1,1633 @@ +{ + "coverage": { + "capabilities": [ + "catalog_objects", + "pg_depend", + "pg_rewrite_ownership", + "reverse_dependencies" + ], + "catalog_available": true, + "exhaustive": false, + "repository_scan": false, + "unresolved": 1 + }, + "edges": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:45d9b35cafa103957cf2af5e" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:056208d89c84aa3d6fecdb15", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_class:16396:0->pg_namespace:16388:0", + "dependency_type": "n", + "via": "pg_class" + }, + "source": "postgresql:local/analytics/view//order_summary/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/schema//analytics/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:94bf53b50e435deee109a236" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:0a8c47aa37fc354f4b4568c2", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/index//orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:0dcbc87e35e0e8b5c14d9e5c" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1e22031734eb8d95d585eab9", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_class:16400:0->pg_namespace:16388:0", + "dependency_type": "n", + "via": "pg_class" + }, + "source": "postgresql:local/analytics/view//monthly_revenue/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/schema//analytics/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:33adc274c68e8a9db5269838", + "kind": "expression_reference", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:0945ec2f971483bce560c4b2" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:46be06185d2d854f7d861dc5", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16390:0->pg_type:16391:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/sales/type//_orders/", + "status": "OBSERVED", + "target": "postgresql:local/sales/type//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:46eea5bd97bf831a975c7342", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_id_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e073c156d4870e6df674b8d8" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:48b0c940d4da7c979141a6b6", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_constraint:16395:0->pg_class:16389:1", + "dependency_type": "a", + "via": "pg_constraint" + }, + "source": "postgresql:local/sales/constraint/orders/orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:a18cd7ab749ffd45da973e4f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4d95cd8f47074ab437ac62a5", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16397:0->pg_type:16398:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/analytics/type//_order_summary/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/type//order_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4e94d8a44687244d3018b756" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5478cb147e8a08cfcc0208bf", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_rewrite:16403:0->pg_class:16396:2", + "dependency_type": "n", + "via": "pg_rewrite" + }, + "source": "postgresql:local/analytics/view//monthly_revenue/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/column/order_summary/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:97b8b53b0789c823f69fe6a5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:55cc31eaf22b798c2164ec54", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16401:0->pg_type:16402:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/analytics/type//_monthly_revenue/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/type//monthly_revenue/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:94bf53b50e435deee109a236" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:585b66573bc42ab100b3a1dc", + "kind": "expression_reference", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/index//orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:ae9518b47e51bd76d8120289" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5888b841d8ac8406dc4efa32", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_rewrite:16399:0->pg_class:16389:1", + "dependency_type": "n", + "via": "pg_rewrite" + }, + "source": "postgresql:local/analytics/view//order_summary/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6de9a81ca0690cfadea55519", + "kind": "expression_reference", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:90a64f3016d97b0343f1bd48" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7382463a30822eedad6c5a9a", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_rewrite:16399:0->pg_class:16389:2", + "dependency_type": "n", + "via": "pg_rewrite" + }, + "source": "postgresql:local/analytics/view//order_summary/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:d680e8bdddcc4d7014effc22" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7dbacce2ca01cccde5c50180", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_class:16389:0->pg_namespace:16387:0", + "dependency_type": "n", + "via": "pg_class" + }, + "source": "postgresql:local/sales/table//orders/", + "status": "OBSERVED", + "target": "postgresql:local/sales/schema//sales/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e1b7cfaf007c8cada9f1ae20" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7f81923f375e97d964167b72", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16402:0->pg_class:16400:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/analytics/type//monthly_revenue/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/view//monthly_revenue/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:84f3b58a92a101d5ffe166bd", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:5a4d372fdb8de56e300b05a8" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:88287709ee258a2673402599", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/analytics/column/order_summary/id/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/view//order_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8ee17f769a71eb691e4a955d", + "kind": "expression_reference", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_id_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:10a5cef22313ed07c5c01130" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8fa19659c0a992517783b817", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c7362b01ada7e5f7494ecbf7" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:9efce2644f223eca12a5d782", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/analytics/column/order_summary/total_amount/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/view//order_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:549eb3a8383dbb88a06197b6" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ad60973d736404b83ade4847", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_class:16394:0->pg_constraint:16395:0", + "dependency_type": "i", + "via": "pg_class" + }, + "source": "postgresql:local/sales/index//orders_pkey/", + "status": "OBSERVED", + "target": "postgresql:local/sales/constraint/orders/orders_pkey/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:2b726a8c9138c587bda8edf9" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:b6a319aa26a2f9a28fb01645", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16398:0->pg_class:16396:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/analytics/type//order_summary/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/view//order_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b0983bdf4576283eda0289a3" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c980619568e864c98439e05f", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/analytics/column/monthly_revenue/revenue/", + "status": "OBSERVED", + "target": "postgresql:local/analytics/view//monthly_revenue/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:5ebda9f77097aff56bde2cf2" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d8b24b933beba20d5e8bbe59", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_constraint:16392:0->pg_class:16389:1", + "dependency_type": "a", + "via": "pg_constraint" + }, + "source": "postgresql:local/sales/constraint/orders/orders_id_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:53e332384fa39e3e95d5c713" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d8c8b9c4eefcf4110513f79c", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_type:16391:0->pg_class:16389:0", + "dependency_type": "i", + "via": "pg_type" + }, + "source": "postgresql:local/sales/type//orders/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b99d0e21d0e3f87f72381177" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e4981304a9018319416b1400", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/column/orders/id/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:ddddf24415e7310b1823ff63" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f687f0b82151e49858eeca4d", + "kind": "catalog_dependency", + "origin": "postgres_catalog", + "properties": { + "catalog_address": "pg_constraint:16393:0->pg_class:16389:2", + "dependency_type": "a", + "via": "pg_constraint" + }, + "source": "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/", + "status": "OBSERVED", + "target": "postgresql:local/sales/column/orders/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4dbb656b27318ea9f0bfed20" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:fa90f9ab092de29493c87262", + "kind": "contains", + "origin": "postgres_catalog", + "properties": {}, + "source": "postgresql:local/sales/column/orders/total_amount/", + "status": "OBSERVED", + "target": "postgresql:local/sales/table//orders/" + } + ], + "engine": { + "name": "postgresql", + "source_mode": "catalog_snapshot", + "version": "18" + }, + "evidence": [ + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16398:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:02bb36f63e76a8251e5fe5fc", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16390:0->pg_type:16391:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:0945ec2f971483bce560c4b2", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16396:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:0d30f4198da3491416f9e19e", + "origin": "postgres_catalog", + "query_id": "pg_class", + "source_hash": "sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16400:0->pg_namespace:16388:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:0dcbc87e35e0e8b5c14d9e5c", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:10a5cef22313ed07c5c01130", + "origin": "postgres_catalog", + "query_id": "pg_constraint", + "source_hash": "sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16400:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:26b00cd48f049c824c083999", + "origin": "postgres_catalog", + "query_id": "pg_class", + "source_hash": "sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16390:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:272377cb956d0eec9031e4c7", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16398:0->pg_class:16396:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:2b726a8c9138c587bda8edf9", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_namespace:16388:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:2c83deeee37ec3e87689b909", + "origin": "postgres_catalog", + "query_id": "pg_namespace", + "source_hash": "sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16391:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:3506d2f1190ae064132ef7d8", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_rewrite:16403:0->pg_class:16400:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:442dac27d805b6a84bbebfb7", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16396:0->pg_namespace:16388:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:45d9b35cafa103957cf2af5e", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16394:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:47b3d1d960d2e8653880bdd5", + "origin": "postgres_catalog", + "query_id": "pg_class", + "source_hash": "sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16389:2", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:4dbb656b27318ea9f0bfed20", + "origin": "postgres_catalog", + "query_id": "pg_attribute", + "source_hash": "sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_rewrite:16403:0->pg_class:16396:2", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:4e94d8a44687244d3018b756", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16391:0->pg_class:16389:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:53e332384fa39e3e95d5c713", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16394:0->pg_constraint:16395:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:549eb3a8383dbb88a06197b6", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "byte_length": 57, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:55869a800d91529f3d4c107c", + "line_end": 1, + "line_start": 1, + "origin": "migration_diff", + "path": "examples/analytics/drop.sql", + "source_hash": "sha256:297b740b46ede38605d0d18d43357d4abfd26ee5803285d390623a59cbb52201", + "status": "PARSED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16396:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:5a4d372fdb8de56e300b05a8", + "origin": "postgres_catalog", + "query_id": "pg_attribute", + "source_hash": "sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:5c841a0b542b7bbc4a8f8471", + "origin": "postgres_catalog", + "query_id": "server_version", + "source_hash": "sha256:82dac9244dba639bc043db976903d9a364691818ca5cac80d5b2e24fbf90a76d", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16392:0->pg_class:16389:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:5ebda9f77097aff56bde2cf2", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16392:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:601c22d1fc5af5606bd3d4ba", + "origin": "postgres_catalog", + "query_id": "pg_constraint", + "source_hash": "sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16395:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:7343e9fd75a693aece425800", + "origin": "postgres_catalog", + "query_id": "pg_constraint", + "source_hash": "sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16401:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:845e1f63c21ede90483c793e", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_namespace:2200:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:8a43b97405c43896b7f874b9", + "origin": "postgres_catalog", + "query_id": "pg_namespace", + "source_hash": "sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_rewrite:16399:0->pg_class:16389:2", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:90a64f3016d97b0343f1bd48", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_rewrite:16399:0->pg_class:16396:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:93a6a1713544f0a43f57935e", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:94bf53b50e435deee109a236", + "origin": "postgres_catalog", + "query_id": "pg_index", + "source_hash": "sha256:99430df1dcc4c9019f78d316353b0b066b0c8ae41613397a1627e53387367ce9", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16401:0->pg_type:16402:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:97b8b53b0789c823f69fe6a5", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16397:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:a0c24950cc86ece96b03a0ae", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16397:0->pg_type:16398:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:a18cd7ab749ffd45da973e4f", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_rewrite:16399:0->pg_class:16389:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:ae9518b47e51bd76d8120289", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16400:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:b0983bdf4576283eda0289a3", + "origin": "postgres_catalog", + "query_id": "pg_attribute", + "source_hash": "sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16389:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:b99d0e21d0e3f87f72381177", + "origin": "postgres_catalog", + "query_id": "pg_attribute", + "source_hash": "sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16396:2", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:c7362b01ada7e5f7494ecbf7", + "origin": "postgres_catalog", + "query_id": "pg_attribute", + "source_hash": "sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16402:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:cfca16ac9a1c3ff6fa4bc14a", + "origin": "postgres_catalog", + "query_id": "pg_type", + "source_hash": "sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16389:0->pg_namespace:16387:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:d680e8bdddcc4d7014effc22", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16393:0->pg_class:16389:2", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:ddddf24415e7310b1823ff63", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16393:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:e054f21253244cf1902a0b00", + "origin": "postgres_catalog", + "query_id": "pg_constraint", + "source_hash": "sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_constraint:16395:0->pg_class:16389:1", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:e073c156d4870e6df674b8d8", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_type:16402:0->pg_class:16400:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:e1b7cfaf007c8cada9f1ae20", + "origin": "postgres_catalog", + "query_id": "pg_depend", + "source_hash": "sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_extension:15210:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:eeb1c6f3bc5d0853972c9992", + "origin": "postgres_catalog", + "query_id": "pg_extension", + "source_hash": "sha256:e20869df2b51a80de931d27c03ff98f05bc37f29466b8103f3c782ee53127ec3", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_namespace:16387:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:f86c03cd14b6fade625bb6ee", + "origin": "postgres_catalog", + "query_id": "pg_namespace", + "source_hash": "sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba", + "status": "OBSERVED" + }, + { + "captured_at": "2026-10-09T16:32:45.035603+00:00", + "catalog_address": "pg_class:16389:0", + "confidence": "direct", + "explanation": "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + "id": "ev:ffc6ecf0e20f88c94d01f3aa", + "origin": "postgres_catalog", + "query_id": "pg_class", + "source_hash": "sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04", + "status": "OBSERVED" + } + ], + "findings": [ + { + "confidence": "conditional", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:0eb98e4f01dcc1e39c11911e", + "object_ids": [], + "origin": "migration_diff", + "reason": "Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown.", + "remediation": "Collect labeled metadata and rehearse representative workload; do not invent row counts or timing.", + "risk_dimensions": [ + "locking", + "rewrite", + "unresolved_dependencies" + ], + "risk_level": "unknown", + "rule_id": "DDM012", + "severity": "warning", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:bb3848522f33610793c415a2", + "object_ids": [ + "postgresql:local/analytics/column/monthly_revenue/revenue/", + "postgresql:local/analytics/column/order_summary/id/", + "postgresql:local/analytics/column/order_summary/total_amount/", + "postgresql:local/analytics/type//_monthly_revenue/", + "postgresql:local/analytics/type//_order_summary/", + "postgresql:local/analytics/type//monthly_revenue/", + "postgresql:local/analytics/type//order_summary/", + "postgresql:local/analytics/view//monthly_revenue/", + "postgresql:local/analytics/view//order_summary/", + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" + ], + "origin": "migration_diff", + "reason": "CASCADE can remove recorded dependent objects. The impact paths include potential static consumers too; those are not PostgreSQL's exact cascade deletion closure.", + "remediation": "Review catalog dependency types/internal ownership and explicitly approve each removal. Prefer RESTRICT while investigating.", + "risk_dimensions": [ + "data_loss", + "unresolved_dependencies" + ], + "risk_level": "high", + "rule_id": "DDM010", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:db4d27c584b85bd820b74833", + "object_ids": [ + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" + ], + "origin": "migration_diff", + "reason": "Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds.", + "remediation": "Rebuild or transition affected objects with verified order and constraint validation.", + "risk_dimensions": [ + "compatibility", + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM014", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:e5625c83e8db59377c0ed674", + "object_ids": [ + "postgresql:local/sales/column/orders/total_amount/" + ], + "origin": "migration_diff", + "reason": "DROP COLUMN destroys column data and affects known dependency/source references.", + "remediation": "Preserve data and transition consumers before a separately reviewed destructive contract.", + "risk_dimensions": [ + "data_loss", + "compatibility" + ], + "risk_level": "high", + "rule_id": "DDM001", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:e80d3475d1af1f83b6d9860b", + "object_ids": [ + "postgresql:local/sales/column/orders/total_amount/" + ], + "origin": "migration_diff", + "reason": "Destructive contract lacks evidence of completed application transition.", + "remediation": "Require expand/backfill/validate/transition gates before contract.", + "risk_dimensions": [ + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM011", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:55869a800d91529f3d4c107c" + ], + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "id": "finding:fdf60da5c1473addae40e620", + "object_ids": [ + "postgresql:local/analytics/view//monthly_revenue/", + "postgresql:local/analytics/view//order_summary/" + ], + "origin": "migration_diff", + "reason": "Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN.", + "remediation": "Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered.", + "risk_dimensions": [ + "compatibility", + "unresolved_dependencies" + ], + "risk_level": "high", + "rule_id": "DDM008", + "severity": "error", + "status": "PARSED" + } + ], + "nodes": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:b0983bdf4576283eda0289a3" + ], + "id": "postgresql:local/analytics/column/monthly_revenue/revenue/", + "kind": "column", + "name": "revenue", + "origin": "postgres_catalog", + "parent": "monthly_revenue", + "properties": { + "catalog_address": "pg_class:16400:1", + "nullable": true, + "type": "numeric", + "typmod": -1 + }, + "qualified_name": "analytics.monthly_revenue.revenue", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:5a4d372fdb8de56e300b05a8" + ], + "id": "postgresql:local/analytics/column/order_summary/id/", + "kind": "column", + "name": "id", + "origin": "postgres_catalog", + "parent": "order_summary", + "properties": { + "catalog_address": "pg_class:16396:1", + "nullable": true, + "type": "int8", + "typmod": -1 + }, + "qualified_name": "analytics.order_summary.id", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c7362b01ada7e5f7494ecbf7" + ], + "id": "postgresql:local/analytics/column/order_summary/total_amount/", + "kind": "column", + "name": "total_amount", + "origin": "postgres_catalog", + "parent": "order_summary", + "properties": { + "catalog_address": "pg_class:16396:2", + "nullable": true, + "type": "numeric", + "typmod": 786438 + }, + "qualified_name": "analytics.order_summary.total_amount", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:2c83deeee37ec3e87689b909" + ], + "id": "postgresql:local/analytics/schema//analytics/", + "kind": "schema", + "name": "analytics", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_namespace:16388:0", + "oid": 16388 + }, + "qualified_name": "analytics.analytics", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:845e1f63c21ede90483c793e" + ], + "id": "postgresql:local/analytics/type//_monthly_revenue/", + "kind": "type", + "name": "_monthly_revenue", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16401:0", + "internal": true, + "oid": 16401, + "typtype": "b" + }, + "qualified_name": "analytics._monthly_revenue", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:a0c24950cc86ece96b03a0ae" + ], + "id": "postgresql:local/analytics/type//_order_summary/", + "kind": "type", + "name": "_order_summary", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16397:0", + "internal": true, + "oid": 16397, + "typtype": "b" + }, + "qualified_name": "analytics._order_summary", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:cfca16ac9a1c3ff6fa4bc14a" + ], + "id": "postgresql:local/analytics/type//monthly_revenue/", + "kind": "type", + "name": "monthly_revenue", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16402:0", + "internal": true, + "oid": 16402, + "typtype": "c" + }, + "qualified_name": "analytics.monthly_revenue", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:02bb36f63e76a8251e5fe5fc" + ], + "id": "postgresql:local/analytics/type//order_summary/", + "kind": "type", + "name": "order_summary", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16398:0", + "internal": true, + "oid": 16398, + "typtype": "c" + }, + "qualified_name": "analytics.order_summary", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:26b00cd48f049c824c083999" + ], + "id": "postgresql:local/analytics/view//monthly_revenue/", + "kind": "view", + "name": "monthly_revenue", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_class:16400:0", + "is_partition": false, + "oid": 16400, + "relkind": "v", + "relpages": 0, + "reltuples": -1, + "statistics_source": "pg_class estimates, not row counts" + }, + "qualified_name": "analytics.monthly_revenue", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:0d30f4198da3491416f9e19e" + ], + "id": "postgresql:local/analytics/view//order_summary/", + "kind": "view", + "name": "order_summary", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_class:16396:0", + "is_partition": false, + "oid": 16396, + "relkind": "v", + "relpages": 0, + "reltuples": -1, + "statistics_source": "pg_class estimates, not row counts" + }, + "qualified_name": "analytics.order_summary", + "schema": "analytics", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:eeb1c6f3bc5d0853972c9992" + ], + "id": "postgresql:local/pg_catalog/extension//plpgsql/", + "kind": "extension", + "name": "plpgsql", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_extension:15210:0", + "oid": 15210, + "version": "1.0" + }, + "qualified_name": "pg_catalog.plpgsql", + "schema": "pg_catalog", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8a43b97405c43896b7f874b9" + ], + "id": "postgresql:local/public/schema//public/", + "kind": "schema", + "name": "public", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_namespace:2200:0", + "oid": 2200 + }, + "qualified_name": "public.public", + "schema": "public", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b99d0e21d0e3f87f72381177" + ], + "id": "postgresql:local/sales/column/orders/id/", + "kind": "column", + "name": "id", + "origin": "postgres_catalog", + "parent": "orders", + "properties": { + "catalog_address": "pg_class:16389:1", + "nullable": false, + "type": "int8", + "typmod": -1 + }, + "qualified_name": "sales.orders.id", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4dbb656b27318ea9f0bfed20" + ], + "id": "postgresql:local/sales/column/orders/total_amount/", + "kind": "column", + "name": "total_amount", + "origin": "postgres_catalog", + "parent": "orders", + "properties": { + "catalog_address": "pg_class:16389:2", + "nullable": false, + "type": "numeric", + "typmod": 786438 + }, + "qualified_name": "sales.orders.total_amount", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:601c22d1fc5af5606bd3d4ba" + ], + "id": "postgresql:local/sales/constraint/orders/orders_id_not_null/", + "kind": "constraint", + "name": "orders_id_not_null", + "origin": "postgres_catalog", + "parent": "orders", + "properties": { + "catalog_address": "pg_constraint:16392:0", + "columns": [ + "id" + ], + "constraint_type": "not_null", + "oid": 16392, + "validated": true + }, + "qualified_name": "sales.orders.orders_id_not_null", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7343e9fd75a693aece425800" + ], + "id": "postgresql:local/sales/constraint/orders/orders_pkey/", + "kind": "constraint", + "name": "orders_pkey", + "origin": "postgres_catalog", + "parent": "orders", + "properties": { + "catalog_address": "pg_constraint:16395:0", + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "oid": 16395, + "validated": true + }, + "qualified_name": "sales.orders.orders_pkey", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e054f21253244cf1902a0b00" + ], + "id": "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/", + "kind": "constraint", + "name": "orders_total_amount_not_null", + "origin": "postgres_catalog", + "parent": "orders", + "properties": { + "catalog_address": "pg_constraint:16393:0", + "columns": [ + "total_amount" + ], + "constraint_type": "not_null", + "oid": 16393, + "validated": true + }, + "qualified_name": "sales.orders.orders_total_amount_not_null", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:47b3d1d960d2e8653880bdd5" + ], + "id": "postgresql:local/sales/index//orders_pkey/", + "kind": "index", + "name": "orders_pkey", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_class:16394:0", + "is_partition": false, + "oid": 16394, + "ready": true, + "relkind": "i", + "relpages": 1, + "reltuples": 0, + "statistics_source": "pg_class estimates, not row counts", + "unique": true, + "valid": true + }, + "qualified_name": "sales.orders_pkey", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f86c03cd14b6fade625bb6ee" + ], + "id": "postgresql:local/sales/schema//sales/", + "kind": "schema", + "name": "sales", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_namespace:16387:0", + "oid": 16387 + }, + "qualified_name": "sales.sales", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:ffc6ecf0e20f88c94d01f3aa" + ], + "id": "postgresql:local/sales/table//orders/", + "kind": "table", + "name": "orders", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_class:16389:0", + "is_partition": false, + "oid": 16389, + "relkind": "r", + "relpages": 0, + "reltuples": -1, + "statistics_source": "pg_class estimates, not row counts" + }, + "qualified_name": "sales.orders", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:272377cb956d0eec9031e4c7" + ], + "id": "postgresql:local/sales/type//_orders/", + "kind": "type", + "name": "_orders", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16390:0", + "internal": true, + "oid": 16390, + "typtype": "b" + }, + "qualified_name": "sales._orders", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:3506d2f1190ae064132ef7d8" + ], + "id": "postgresql:local/sales/type//orders/", + "kind": "type", + "name": "orders", + "origin": "postgres_catalog", + "parent": "", + "properties": { + "catalog_address": "pg_type:16391:0", + "internal": true, + "oid": 16391, + "typtype": "c" + }, + "qualified_name": "sales.orders", + "schema": "sales", + "signature": "", + "status": "OBSERVED" + } + ], + "schema_version": "1.0.0", + "snapshot": { + "created_at": "2026-10-09T16:32:45.035603+00:00", + "id": "snapshot:a212e9d15e69ec94425d4006", + "source_fingerprint": "sha256:a212e9d15e69ec94425d400683b5b40d3f561b034d1a488268b3063d2dcda2de" + }, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:5c841a0b542b7bbc4a8f8471" + ], + "explanation": "Catalog dependencies cover recorded edges only; repository/runtime consumers and some object definitions are unavailable.", + "id": "unknown:1bf85ce355b1da62c1134f3e", + "object_id": null, + "origin": "heuristic", + "status": "UNKNOWN" + } + ] +} diff --git a/skills/database-dependency-migration/examples/rendered/analytics/report.html b/skills/database-dependency-migration/examples/rendered/analytics/report.html new file mode 100644 index 0000000..19d0677 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/report.html @@ -0,0 +1,3783 @@ + + + + + + + PostgreSQL dependency explorer + + + + + + + + + +
+
+
+

+ POSTGRESQL / DEPENDENCY REPORT +

+

+ Know what breaks
before you migrate. +

+

+ Trace dependencies back to their evidence. Review changes before + deployment. +

+
+
+
+ + +
+
+ + + + + +
+
+
+
+
+ + + +
+
+ + +
+
+

+ + + + + + + + +
+ Solid: catalogDashed: parsed referenceDotted: foreign key relationshipArrow = source depends on target. Impact follows reverse + arrows. +
+
+ +
+
+ + + +
+

+ OBSERVED = catalog metadata Ā· PARSED = syntax evidence Ā· INFERRED = + unproven Ā· UNKNOWN = unavailable. +

+

+ Graph paths show potential impact. Runtime coverage and lock duration + require separate evidence. +

+
+
+ + + + + + diff --git a/skills/database-dependency-migration/examples/rendered/analytics/report.md b/skills/database-dependency-migration/examples/rendered/analytics/report.md new file mode 100644 index 0000000..98e268e --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/report.md @@ -0,0 +1,239 @@ +# PostgreSQL dependency review + +Analysis only. No SQL was executed by the analyzer. + +Snapshot ` snapshot:a212e9d15e69ec94425d4006 `. PostgreSQL 18, catalog\_snapshot. +Nodes: 22. Edges: 29. Evidence: 44. Findings: 6. Unknowns: 1. + +Arrows mean source depends on/references target. Impact walks reverse edges. Paths describe potential impact; they do not prove runtime failure or complete consumer coverage. + +## Findings + +### DDM012 (warning, unknown, PARSED) + +Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown. + +Collect labeled metadata and rehearse representative workload; do not invent row counts or timing. + +Finding ID: ` finding:0eb98e4f01dcc1e39c11911e `. Dimensions: locking, rewrite, unresolved\_dependencies. Evidence: ev:55869a800d91529f3d4c107c. + +### DDM010 (error, high, PARSED) + +CASCADE can remove recorded dependent objects. The impact paths include potential static consumers too; those are not PostgreSQL's exact cascade deletion closure. + +Review catalog dependency types/internal ownership and explicitly approve each removal. Prefer RESTRICT while investigating. + +Finding ID: ` finding:bb3848522f33610793c415a2 `. Dimensions: data\_loss, unresolved\_dependencies. Evidence: ev:55869a800d91529f3d4c107c. + +### DDM014 (error, high, PARSED) + +Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds. + +Rebuild or transition affected objects with verified order and constraint validation. + +Finding ID: ` finding:db4d27c584b85bd820b74833 `. Dimensions: compatibility, deployment\_order. Evidence: ev:55869a800d91529f3d4c107c. + +### DDM001 (error, high, PARSED) + +DROP COLUMN destroys column data and affects known dependency/source references. + +Preserve data and transition consumers before a separately reviewed destructive contract. + +Finding ID: ` finding:e5625c83e8db59377c0ed674 `. Dimensions: data\_loss, compatibility. Evidence: ev:55869a800d91529f3d4c107c. + +### DDM011 (error, high, PARSED) + +Destructive contract lacks evidence of completed application transition. + +Require expand/backfill/validate/transition gates before contract. + +Finding ID: ` finding:e80d3475d1af1f83b6d9860b `. Dimensions: deployment\_order. Evidence: ev:55869a800d91529f3d4c107c. + +### DDM008 (error, high, PARSED) + +Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN. + +Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered. + +Finding ID: ` finding:fdf60da5c1473addae40e620 `. Dimensions: compatibility, unresolved\_dependencies. Evidence: ev:55869a800d91529f3d4c107c. + +## Coverage and unknowns + +OBSERVED means supplied catalog metadata. PARSED means syntax-aware source evidence. INFERRED means unproven. UNKNOWN means unavailable or unsupported. Static analysis is not exhaustive. + +- UNKNOWN: Catalog dependencies cover recorded edges only; repository/runtime consumers and some object definitions are unavailable. Evidence: ev:5c841a0b542b7bbc4a8f8471. + +## Migration sequence + +### expand + +Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys. + +Preconditions: Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget. + +Verification: Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics. + +Recovery: Stop deployment before consumers depend on the new fields; keep old fields available. + +### backfill + +If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers. + +Preconditions: Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling. + +Verification: Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic. + +Recovery: Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure. + +### validate + +Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate. + +Preconditions: Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index. + +Verification: Check constraint validation and pg\_index.indisvalid/indisready, compare old/new results and observe lock waits. + +Recovery: Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling. + +### transition + +Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs. + +Preconditions: Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths. + +Verification: Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage. + +Recovery: Revert application reads only while both representations remain consistent; otherwise prefer roll-forward. + +### contract + +Remove legacy objects only after verified transition and a separate destructive-change review. + +Preconditions: Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition. + +Verification: Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime. + +Recovery: Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator. + +Affected root: ` postgresql:local/sales/column/orders/total_amount/ `. + +- ` postgresql:local/analytics/column/monthly_revenue/revenue/ ` via edge:c980619568e864c98439e05f, edge:5478cb147e8a08cfcc0208bf, edge:9efce2644f223eca12a5d782, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/column/order_summary/id/ ` via edge:88287709ee258a2673402599, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/column/order_summary/total_amount/ ` via edge:9efce2644f223eca12a5d782, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/type//_monthly_revenue/ ` via edge:55cc31eaf22b798c2164ec54, edge:7f81923f375e97d964167b72, edge:5478cb147e8a08cfcc0208bf, edge:9efce2644f223eca12a5d782, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/type//_order_summary/ ` via edge:4d95cd8f47074ab437ac62a5, edge:b6a319aa26a2f9a28fb01645, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/type//monthly_revenue/ ` via edge:7f81923f375e97d964167b72, edge:5478cb147e8a08cfcc0208bf, edge:9efce2644f223eca12a5d782, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/type//order_summary/ ` via edge:b6a319aa26a2f9a28fb01645, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/view//monthly_revenue/ ` via edge:5478cb147e8a08cfcc0208bf, edge:9efce2644f223eca12a5d782, edge:7382463a30822eedad6c5a9a +- ` postgresql:local/analytics/view//order_summary/ ` via edge:7382463a30822eedad6c5a9a +- ` postgresql:local/sales/constraint/orders/orders_total_amount_not_null/ ` via edge:33adc274c68e8a9db5269838 + +## Object inventory + +| ID | Object | Kind | Status | Evidence | +|---|---|---|---|---| +| postgresql:local/analytics/column/monthly\_revenue/revenue/ | analytics.monthly\_revenue.revenue | column | OBSERVED | ev:b0983bdf4576283eda0289a3 | +| postgresql:local/analytics/column/order\_summary/id/ | analytics.order\_summary.id | column | OBSERVED | ev:5a4d372fdb8de56e300b05a8 | +| postgresql:local/analytics/column/order\_summary/total\_amount/ | analytics.order\_summary.total\_amount | column | OBSERVED | ev:c7362b01ada7e5f7494ecbf7 | +| postgresql:local/analytics/schema//analytics/ | analytics.analytics | schema | OBSERVED | ev:2c83deeee37ec3e87689b909 | +| postgresql:local/analytics/type//\_monthly\_revenue/ | analytics.\_monthly\_revenue | type | OBSERVED | ev:845e1f63c21ede90483c793e | +| postgresql:local/analytics/type//\_order\_summary/ | analytics.\_order\_summary | type | OBSERVED | ev:a0c24950cc86ece96b03a0ae | +| postgresql:local/analytics/type//monthly\_revenue/ | analytics.monthly\_revenue | type | OBSERVED | ev:cfca16ac9a1c3ff6fa4bc14a | +| postgresql:local/analytics/type//order\_summary/ | analytics.order\_summary | type | OBSERVED | ev:02bb36f63e76a8251e5fe5fc | +| postgresql:local/analytics/view//monthly\_revenue/ | analytics.monthly\_revenue | view | OBSERVED | ev:26b00cd48f049c824c083999 | +| postgresql:local/analytics/view//order\_summary/ | analytics.order\_summary | view | OBSERVED | ev:0d30f4198da3491416f9e19e | +| postgresql:local/pg\_catalog/extension//plpgsql/ | pg\_catalog.plpgsql | extension | OBSERVED | ev:eeb1c6f3bc5d0853972c9992 | +| postgresql:local/public/schema//public/ | public.public | schema | OBSERVED | ev:8a43b97405c43896b7f874b9 | +| postgresql:local/sales/column/orders/id/ | sales.orders.id | column | OBSERVED | ev:b99d0e21d0e3f87f72381177 | +| postgresql:local/sales/column/orders/total\_amount/ | sales.orders.total\_amount | column | OBSERVED | ev:4dbb656b27318ea9f0bfed20 | +| postgresql:local/sales/constraint/orders/orders\_id\_not\_null/ | sales.orders.orders\_id\_not\_null | constraint | OBSERVED | ev:601c22d1fc5af5606bd3d4ba | +| postgresql:local/sales/constraint/orders/orders\_pkey/ | sales.orders.orders\_pkey | constraint | OBSERVED | ev:7343e9fd75a693aece425800 | +| postgresql:local/sales/constraint/orders/orders\_total\_amount\_not\_null/ | sales.orders.orders\_total\_amount\_not\_null | constraint | OBSERVED | ev:e054f21253244cf1902a0b00 | +| postgresql:local/sales/index//orders\_pkey/ | sales.orders\_pkey | index | OBSERVED | ev:47b3d1d960d2e8653880bdd5 | +| postgresql:local/sales/schema//sales/ | sales.sales | schema | OBSERVED | ev:f86c03cd14b6fade625bb6ee | +| postgresql:local/sales/table//orders/ | sales.orders | table | OBSERVED | ev:ffc6ecf0e20f88c94d01f3aa | +| postgresql:local/sales/type//\_orders/ | sales.\_orders | type | OBSERVED | ev:272377cb956d0eec9031e4c7 | +| postgresql:local/sales/type//orders/ | sales.orders | type | OBSERVED | ev:3506d2f1190ae064132ef7d8 | + +## Edge inventory + +| ID | Source | Target | Kind | Status | +|---|---|---|---|---| +| edge:056208d89c84aa3d6fecdb15 | postgresql:local/analytics/view//order\_summary/ | postgresql:local/analytics/schema//analytics/ | catalog\_dependency | OBSERVED | +| edge:0a8c47aa37fc354f4b4568c2 | postgresql:local/sales/index//orders\_pkey/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | +| edge:1e22031734eb8d95d585eab9 | postgresql:local/analytics/view//monthly\_revenue/ | postgresql:local/analytics/schema//analytics/ | catalog\_dependency | OBSERVED | +| edge:33adc274c68e8a9db5269838 | postgresql:local/sales/constraint/orders/orders\_total\_amount\_not\_null/ | postgresql:local/sales/column/orders/total\_amount/ | expression\_reference | OBSERVED | +| edge:46be06185d2d854f7d861dc5 | postgresql:local/sales/type//\_orders/ | postgresql:local/sales/type//orders/ | catalog\_dependency | OBSERVED | +| edge:46eea5bd97bf831a975c7342 | postgresql:local/sales/constraint/orders/orders\_id\_not\_null/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | +| edge:48b0c940d4da7c979141a6b6 | postgresql:local/sales/constraint/orders/orders\_pkey/ | postgresql:local/sales/column/orders/id/ | catalog\_dependency | OBSERVED | +| edge:4d95cd8f47074ab437ac62a5 | postgresql:local/analytics/type//\_order\_summary/ | postgresql:local/analytics/type//order\_summary/ | catalog\_dependency | OBSERVED | +| edge:5478cb147e8a08cfcc0208bf | postgresql:local/analytics/view//monthly\_revenue/ | postgresql:local/analytics/column/order\_summary/total\_amount/ | catalog\_dependency | OBSERVED | +| edge:55cc31eaf22b798c2164ec54 | postgresql:local/analytics/type//\_monthly\_revenue/ | postgresql:local/analytics/type//monthly\_revenue/ | catalog\_dependency | OBSERVED | +| edge:585b66573bc42ab100b3a1dc | postgresql:local/sales/index//orders\_pkey/ | postgresql:local/sales/column/orders/id/ | expression\_reference | OBSERVED | +| edge:5888b841d8ac8406dc4efa32 | postgresql:local/analytics/view//order\_summary/ | postgresql:local/sales/column/orders/id/ | catalog\_dependency | OBSERVED | +| edge:6de9a81ca0690cfadea55519 | postgresql:local/sales/constraint/orders/orders\_pkey/ | postgresql:local/sales/column/orders/id/ | expression\_reference | OBSERVED | +| edge:7382463a30822eedad6c5a9a | postgresql:local/analytics/view//order\_summary/ | postgresql:local/sales/column/orders/total\_amount/ | catalog\_dependency | OBSERVED | +| edge:7dbacce2ca01cccde5c50180 | postgresql:local/sales/table//orders/ | postgresql:local/sales/schema//sales/ | catalog\_dependency | OBSERVED | +| edge:7f81923f375e97d964167b72 | postgresql:local/analytics/type//monthly\_revenue/ | postgresql:local/analytics/view//monthly\_revenue/ | catalog\_dependency | OBSERVED | +| edge:84f3b58a92a101d5ffe166bd | postgresql:local/sales/constraint/orders/orders\_pkey/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | +| edge:88287709ee258a2673402599 | postgresql:local/analytics/column/order\_summary/id/ | postgresql:local/analytics/view//order\_summary/ | contains | OBSERVED | +| edge:8ee17f769a71eb691e4a955d | postgresql:local/sales/constraint/orders/orders\_id\_not\_null/ | postgresql:local/sales/column/orders/id/ | expression\_reference | OBSERVED | +| edge:8fa19659c0a992517783b817 | postgresql:local/sales/constraint/orders/orders\_total\_amount\_not\_null/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | +| edge:9efce2644f223eca12a5d782 | postgresql:local/analytics/column/order\_summary/total\_amount/ | postgresql:local/analytics/view//order\_summary/ | contains | OBSERVED | +| edge:ad60973d736404b83ade4847 | postgresql:local/sales/index//orders\_pkey/ | postgresql:local/sales/constraint/orders/orders\_pkey/ | catalog\_dependency | OBSERVED | +| edge:b6a319aa26a2f9a28fb01645 | postgresql:local/analytics/type//order\_summary/ | postgresql:local/analytics/view//order\_summary/ | catalog\_dependency | OBSERVED | +| edge:c980619568e864c98439e05f | postgresql:local/analytics/column/monthly\_revenue/revenue/ | postgresql:local/analytics/view//monthly\_revenue/ | contains | OBSERVED | +| edge:d8b24b933beba20d5e8bbe59 | postgresql:local/sales/constraint/orders/orders\_id\_not\_null/ | postgresql:local/sales/column/orders/id/ | catalog\_dependency | OBSERVED | +| edge:d8c8b9c4eefcf4110513f79c | postgresql:local/sales/type//orders/ | postgresql:local/sales/table//orders/ | catalog\_dependency | OBSERVED | +| edge:e4981304a9018319416b1400 | postgresql:local/sales/column/orders/id/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | +| edge:f687f0b82151e49858eeca4d | postgresql:local/sales/constraint/orders/orders\_total\_amount\_not\_null/ | postgresql:local/sales/column/orders/total\_amount/ | catalog\_dependency | OBSERVED | +| edge:fa90f9ab092de29493c87262 | postgresql:local/sales/column/orders/total\_amount/ | postgresql:local/sales/table//orders/ | contains | OBSERVED | + +## Evidence inventory + +| ID | Origin | Location | Hash | +|---|---|---|---| +| ev:02bb36f63e76a8251e5fe5fc | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16398:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:0945ec2f971483bce560c4b2 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16390:0->pg\_type:16391:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:0d30f4198da3491416f9e19e | postgres\_catalog | pg\_class at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16396:0\) | sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04 | +| ev:0dcbc87e35e0e8b5c14d9e5c | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16400:0->pg\_namespace:16388:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:10a5cef22313ed07c5c01130 | postgres\_catalog | pg\_constraint at 2026-10-09T16:32:45.035603+00:00 \(\) | sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93 | +| ev:26b00cd48f049c824c083999 | postgres\_catalog | pg\_class at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16400:0\) | sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04 | +| ev:272377cb956d0eec9031e4c7 | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16390:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:2b726a8c9138c587bda8edf9 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16398:0->pg\_class:16396:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:2c83deeee37ec3e87689b909 | postgres\_catalog | pg\_namespace at 2026-10-09T16:32:45.035603+00:00 \(pg\_namespace:16388:0\) | sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba | +| ev:3506d2f1190ae064132ef7d8 | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16391:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:442dac27d805b6a84bbebfb7 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_rewrite:16403:0->pg\_class:16400:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:45d9b35cafa103957cf2af5e | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16396:0->pg\_namespace:16388:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:47b3d1d960d2e8653880bdd5 | postgres\_catalog | pg\_class at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16394:0\) | sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04 | +| ev:4dbb656b27318ea9f0bfed20 | postgres\_catalog | pg\_attribute at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16389:2\) | sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e | +| ev:4e94d8a44687244d3018b756 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_rewrite:16403:0->pg\_class:16396:2\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:53e332384fa39e3e95d5c713 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16391:0->pg\_class:16389:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:549eb3a8383dbb88a06197b6 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16394:0->pg\_constraint:16395:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:55869a800d91529f3d4c107c | migration\_diff | examples/analytics/drop.sql:1-1 | sha256:297b740b46ede38605d0d18d43357d4abfd26ee5803285d390623a59cbb52201 | +| ev:5a4d372fdb8de56e300b05a8 | postgres\_catalog | pg\_attribute at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16396:1\) | sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e | +| ev:5c841a0b542b7bbc4a8f8471 | postgres\_catalog | server\_version at 2026-10-09T16:32:45.035603+00:00 \(\) | sha256:82dac9244dba639bc043db976903d9a364691818ca5cac80d5b2e24fbf90a76d | +| ev:5ebda9f77097aff56bde2cf2 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16392:0->pg\_class:16389:1\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:601c22d1fc5af5606bd3d4ba | postgres\_catalog | pg\_constraint at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16392:0\) | sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93 | +| ev:7343e9fd75a693aece425800 | postgres\_catalog | pg\_constraint at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16395:0\) | sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93 | +| ev:845e1f63c21ede90483c793e | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16401:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:8a43b97405c43896b7f874b9 | postgres\_catalog | pg\_namespace at 2026-10-09T16:32:45.035603+00:00 \(pg\_namespace:2200:0\) | sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba | +| ev:90a64f3016d97b0343f1bd48 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_rewrite:16399:0->pg\_class:16389:2\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:93a6a1713544f0a43f57935e | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_rewrite:16399:0->pg\_class:16396:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:94bf53b50e435deee109a236 | postgres\_catalog | pg\_index at 2026-10-09T16:32:45.035603+00:00 \(\) | sha256:99430df1dcc4c9019f78d316353b0b066b0c8ae41613397a1627e53387367ce9 | +| ev:97b8b53b0789c823f69fe6a5 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16401:0->pg\_type:16402:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:a0c24950cc86ece96b03a0ae | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16397:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:a18cd7ab749ffd45da973e4f | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16397:0->pg\_type:16398:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:ae9518b47e51bd76d8120289 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_rewrite:16399:0->pg\_class:16389:1\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:b0983bdf4576283eda0289a3 | postgres\_catalog | pg\_attribute at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16400:1\) | sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e | +| ev:b99d0e21d0e3f87f72381177 | postgres\_catalog | pg\_attribute at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16389:1\) | sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e | +| ev:c7362b01ada7e5f7494ecbf7 | postgres\_catalog | pg\_attribute at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16396:2\) | sha256:4b9df534f307951c1815569ed2d46ab00935dcf74f36048065a0ae379196db0e | +| ev:cfca16ac9a1c3ff6fa4bc14a | postgres\_catalog | pg\_type at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16402:0\) | sha256:9c16999f2382b3d4748bd8fe09569edfb24885a9cff77a47d3d7baaf2c492bce | +| ev:d680e8bdddcc4d7014effc22 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16389:0->pg\_namespace:16387:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:ddddf24415e7310b1823ff63 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16393:0->pg\_class:16389:2\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:e054f21253244cf1902a0b00 | postgres\_catalog | pg\_constraint at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16393:0\) | sha256:fa9b4946bdb637292ddf707df2a1d0b3888a370a36a96667834b203e7bd5ff93 | +| ev:e073c156d4870e6df674b8d8 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_constraint:16395:0->pg\_class:16389:1\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:e1b7cfaf007c8cada9f1ae20 | postgres\_catalog | pg\_depend at 2026-10-09T16:32:45.035603+00:00 \(pg\_type:16402:0->pg\_class:16400:0\) | sha256:9e5040336dc3349a29735da7b94dd499aa51a1c46d7f1e103c350711f4ac4b85 | +| ev:eeb1c6f3bc5d0853972c9992 | postgres\_catalog | pg\_extension at 2026-10-09T16:32:45.035603+00:00 \(pg\_extension:15210:0\) | sha256:e20869df2b51a80de931d27c03ff98f05bc37f29466b8103f3c782ee53127ec3 | +| ev:f86c03cd14b6fade625bb6ee | postgres\_catalog | pg\_namespace at 2026-10-09T16:32:45.035603+00:00 \(pg\_namespace:16387:0\) | sha256:e044ff4af53fb9dbe91eff0599e205ddc4b6dc24d8e26d7365162e77dfa0d7ba | +| ev:ffc6ecf0e20f88c94d01f3aa | postgres\_catalog | pg\_class at 2026-10-09T16:32:45.035603+00:00 \(pg\_class:16389:0\) | sha256:ac3cbd252fdb623adf6a84ee5b7055db8707a021a431d17f4032a6998755ad04 | diff --git a/skills/database-dependency-migration/examples/rendered/analytics/review.json b/skills/database-dependency-migration/examples/rendered/analytics/review.json new file mode 100644 index 0000000..30e7245 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/analytics/review.json @@ -0,0 +1,169 @@ +{ + "impacts": [ + { + "affected": [ + "postgresql:local/analytics/column/monthly_revenue/revenue/", + "postgresql:local/analytics/column/order_summary/id/", + "postgresql:local/analytics/column/order_summary/total_amount/", + "postgresql:local/analytics/type//_monthly_revenue/", + "postgresql:local/analytics/type//_order_summary/", + "postgresql:local/analytics/type//monthly_revenue/", + "postgresql:local/analytics/type//order_summary/", + "postgresql:local/analytics/view//monthly_revenue/", + "postgresql:local/analytics/view//order_summary/", + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" + ], + "categories": { + "inferred": [], + "recorded_catalog": [ + "postgresql:local/analytics/column/monthly_revenue/revenue/", + "postgresql:local/analytics/column/order_summary/id/", + "postgresql:local/analytics/column/order_summary/total_amount/", + "postgresql:local/analytics/type//_monthly_revenue/", + "postgresql:local/analytics/type//_order_summary/", + "postgresql:local/analytics/type//monthly_revenue/", + "postgresql:local/analytics/type//order_summary/", + "postgresql:local/analytics/view//monthly_revenue/", + "postgresql:local/analytics/view//order_summary/", + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" + ], + "static_reference": [] + }, + "direct": [ + "postgresql:local/analytics/view//order_summary/", + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/" + ], + "explanation": "Reverse paths show potential impact. They do not prove execution failure or exhaustive runtime coverage.", + "operation": "AT_DropColumn", + "paths": { + "postgresql:local/analytics/column/monthly_revenue/revenue/": [ + "edge:c980619568e864c98439e05f", + "edge:5478cb147e8a08cfcc0208bf", + "edge:9efce2644f223eca12a5d782", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/column/order_summary/id/": [ + "edge:88287709ee258a2673402599", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/column/order_summary/total_amount/": [ + "edge:9efce2644f223eca12a5d782", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/type//_monthly_revenue/": [ + "edge:55cc31eaf22b798c2164ec54", + "edge:7f81923f375e97d964167b72", + "edge:5478cb147e8a08cfcc0208bf", + "edge:9efce2644f223eca12a5d782", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/type//_order_summary/": [ + "edge:4d95cd8f47074ab437ac62a5", + "edge:b6a319aa26a2f9a28fb01645", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/type//monthly_revenue/": [ + "edge:7f81923f375e97d964167b72", + "edge:5478cb147e8a08cfcc0208bf", + "edge:9efce2644f223eca12a5d782", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/type//order_summary/": [ + "edge:b6a319aa26a2f9a28fb01645", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/view//monthly_revenue/": [ + "edge:5478cb147e8a08cfcc0208bf", + "edge:9efce2644f223eca12a5d782", + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/analytics/view//order_summary/": [ + "edge:7382463a30822eedad6c5a9a" + ], + "postgresql:local/sales/constraint/orders/orders_total_amount_not_null/": [ + "edge:33adc274c68e8a9db5269838" + ] + }, + "root": "postgresql:local/sales/column/orders/total_amount/", + "to": null, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:5c841a0b542b7bbc4a8f8471" + ], + "explanation": "Catalog dependencies cover recorded edges only; repository/runtime consumers and some object definitions are unavailable.", + "id": "unknown:1bf85ce355b1da62c1134f3e", + "object_id": null, + "origin": "heuristic", + "status": "UNKNOWN" + } + ] + } + ], + "limitations": [ + "SQL is never executed. Baseline is not replayed into a target schema.", + "Runtime consumers, table statistics and deployment completion require independent evidence.", + "Phases are a review checklist, not target-specific executable migrations. Apply relevant phases to the supplied change and verify operational prerequisites." + ], + "metadata": { + "evidence_ids": [], + "origin": "user_supplied", + "status": "INFERRED", + "tables": {} + }, + "operations": [ + { + "evidence_ids": [ + "ev:55869a800d91529f3d4c107c" + ], + "object_id": "postgresql:local/sales/column/orders/total_amount/", + "operation": "AT_DropColumn" + } + ], + "plan": [ + { + "action": "Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys.", + "phase": "expand", + "preconditions": "Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget.", + "recovery": "Stop deployment before consumers depend on the new fields; keep old fields available.", + "review_only": true, + "verification": "Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics." + }, + { + "action": "If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers.", + "phase": "backfill", + "preconditions": "Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling.", + "recovery": "Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure.", + "review_only": true, + "verification": "Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic." + }, + { + "action": "Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate.", + "phase": "validate", + "preconditions": "Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index.", + "recovery": "Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling.", + "review_only": true, + "verification": "Check constraint validation and pg_index.indisvalid/indisready, compare old/new results and observe lock waits." + }, + { + "action": "Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs.", + "phase": "transition", + "preconditions": "Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths.", + "recovery": "Revert application reads only while both representations remain consistent; otherwise prefer roll-forward.", + "review_only": true, + "verification": "Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage." + }, + { + "action": "Remove legacy objects only after verified transition and a separate destructive-change review.", + "phase": "contract", + "preconditions": "Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition.", + "recovery": "Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator.", + "review_only": true, + "verification": "Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime." + } + ], + "review_only": true, + "risk_level": "high", + "schema_version": "1.0.0" +} diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/graph.dot b/skills/database-dependency-migration/examples/rendered/ecommerce/graph.dot new file mode 100644 index 0000000..5aa912b --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/graph.dot @@ -0,0 +1,153 @@ +digraph dependencies { + // Source depends on target; reverse traversal gives impact + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" [label="application.\"examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5\""]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" [label="application.\"examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694\""]; + "postgresql:local/public/column/addresses/city/" [label="public.addresses.city"]; + "postgresql:local/public/column/addresses/customer_id/" [label="public.addresses.customer_id"]; + "postgresql:local/public/column/addresses/id/" [label="public.addresses.id"]; + "postgresql:local/public/column/customer_summary/email/" [label="public.customer_summary.email"]; + "postgresql:local/public/column/customer_summary/id/" [label="public.customer_summary.id"]; + "postgresql:local/public/column/customer_summary/order_count/" [label="public.customer_summary.order_count"]; + "postgresql:local/public/column/customers/email/" [label="public.customers.email"]; + "postgresql:local/public/column/customers/id/" [label="public.customers.id"]; + "postgresql:local/public/column/customers/name/" [label="public.customers.name"]; + "postgresql:local/public/column/customers/updated_at/" [label="public.customers.updated_at"]; + "postgresql:local/public/column/order_items/order_id/" [label="public.order_items.order_id"]; + "postgresql:local/public/column/order_items/product_id/" [label="public.order_items.product_id"]; + "postgresql:local/public/column/order_items/quantity/" [label="public.order_items.quantity"]; + "postgresql:local/public/column/orders/created_at/" [label="public.orders.created_at"]; + "postgresql:local/public/column/orders/customer_id/" [label="public.orders.customer_id"]; + "postgresql:local/public/column/orders/id/" [label="public.orders.id"]; + "postgresql:local/public/column/orders/total_amount/" [label="public.orders.total_amount"]; + "postgresql:local/public/column/payments/amount/" [label="public.payments.amount"]; + "postgresql:local/public/column/payments/id/" [label="public.payments.id"]; + "postgresql:local/public/column/payments/order_id/" [label="public.payments.order_id"]; + "postgresql:local/public/column/products/id/" [label="public.products.id"]; + "postgresql:local/public/column/products/price/" [label="public.products.price"]; + "postgresql:local/public/column/products/sku/" [label="public.products.sku"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" [label="public.addresses.addresses_customer_id_fkey"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" [label="public.addresses.addresses_pkey"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" [label="public.customers.customers_email_key"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" [label="public.customers.customers_pkey"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" [label="public.order_items.order_items_order_id_fkey"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" [label="public.order_items.order_items_pkey"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" [label="public.order_items.order_items_product_id_fkey"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" [label="public.order_items.order_items_quantity_check__485b310e0371"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" [label="public.orders.orders_customer_id_fkey"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" [label="public.orders.orders_pkey"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" [label="public.orders.orders_total_amount_check__8c94b42a7e78"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" [label="public.payments.payments_amount_check__2fbbb5aae972"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" [label="public.payments.payments_order_id_fkey"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" [label="public.payments.payments_pkey"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" [label="public.products.products_pkey"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" [label="public.products.products_price_check__a1bdfb6cc254"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" [label="public.products.products_sku_key"]; + "postgresql:local/public/function//touch_customer/" [label="public.touch_customer"]; + "postgresql:local/public/index//orders_customer_idx/" [label="public.orders_customer_idx"]; + "postgresql:local/public/table//addresses/" [label="public.addresses"]; + "postgresql:local/public/table//customers/" [label="public.customers"]; + "postgresql:local/public/table//order_items/" [label="public.order_items"]; + "postgresql:local/public/table//orders/" [label="public.orders"]; + "postgresql:local/public/table//payments/" [label="public.payments"]; + "postgresql:local/public/table//products/" [label="public.products"]; + "postgresql:local/public/trigger/customers/customers_touch/" [label="public.customers.customers_touch"]; + "postgresql:local/public/view//customer_summary/" [label="public.customer_summary"]; + "postgresql:local/public/index//orders_customer_idx/" -> "postgresql:local/public/column/orders/customer_id/" [label="expression_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/name/" [label="query_reference"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" -> "postgresql:local/public/column/order_items/quantity/" [label="expression_reference"]; + "postgresql:local/public/index//orders_customer_idx/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/orders/id/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/customers/updated_at/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/addresses/customer_id/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/column/order_items/product_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/column/addresses/id/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/column/order_items/product_id/" [label="expression_reference"]; + "postgresql:local/public/column/addresses/city/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/orders/customer_id/" [label="expression_reference"]; + "postgresql:local/public/trigger/customers/customers_touch/" -> "postgresql:local/public/table//customers/" [label="trigger_association"]; + "postgresql:local/public/column/order_items/order_id/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/table//orders/" [label="query_reference"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/addresses/customer_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/payments/id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/amount/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/customers/email/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/customers/name/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/order_items/order_id/" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/column/products/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/orders/created_at/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" -> "postgresql:local/public/column/payments/amount/" [label="expression_reference"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/orders/customer_id/" [label="query_reference"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/order_items/order_id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/order_id/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/table//order_items/" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/column/addresses/customer_id/" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/column/customer_summary/email/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/orders/id/" [label="query_reference"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/payments/order_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/table//products/" [label="foreign_key"]; + "postgresql:local/public/column/customers/id/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/customers/id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/id/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/orders/total_amount/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/orders/customer_id/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/column/customer_summary/id/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/public/column/order_items/quantity/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" -> "postgresql:local/public/column/products/price/" [label="expression_reference"]; + "postgresql:local/public/table//payments/" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/trigger/customers/customers_touch/" -> "postgresql:local/public/function//touch_customer/" [label="trigger_association"]; + "postgresql:local/public/table//order_items/" -> "postgresql:local/public/table//products/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/column/orders/customer_id/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/orders/id/" [label="query_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/column/customer_summary/order_count/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" -> "postgresql:local/public/column/orders/total_amount/" [label="expression_reference"]; + "postgresql:local/public/column/order_items/product_id/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/column/order_items/product_id/" -> "postgresql:local/public/column/products/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/addresses/id/" [label="expression_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/payments/order_id/" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/column/order_items/order_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/column/products/sku/" [label="expression_reference"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/orders/id/" [label="expression_reference"]; + "postgresql:local/public/column/products/price/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/column/products/id/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; + "postgresql:local/public/table//orders/" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/column/products/sku/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/table//addresses/" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/products/id/" [label="expression_reference"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/table//orders/" [label="query_reference"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/column/customers/email/" [label="expression_reference"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; + "postgresql:local/public/column/orders/customer_id/" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; +} diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/graph.mmd b/skills/database-dependency-migration/examples/rendered/ecommerce/graph.mmd new file mode 100644 index 0000000..ae0367c --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/graph.mmd @@ -0,0 +1,152 @@ +flowchart LR + %% Source depends on target; traverse reverse for impact + n0["application."examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5""] + n1["application."examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694""] + n2["public.addresses.city"] + n3["public.addresses.customer_id"] + n4["public.addresses.id"] + n5["public.customer_summary.email"] + n6["public.customer_summary.id"] + n7["public.customer_summary.order_count"] + n8["public.customers.email"] + n9["public.customers.id"] + n10["public.customers.name"] + n11["public.customers.updated_at"] + n12["public.order_items.order_id"] + n13["public.order_items.product_id"] + n14["public.order_items.quantity"] + n15["public.orders.created_at"] + n16["public.orders.customer_id"] + n17["public.orders.id"] + n18["public.orders.total_amount"] + n19["public.payments.amount"] + n20["public.payments.id"] + n21["public.payments.order_id"] + n22["public.products.id"] + n23["public.products.price"] + n24["public.products.sku"] + n25["public.addresses.addresses_customer_id_fkey"] + n26["public.addresses.addresses_pkey"] + n27["public.customers.customers_email_key"] + n28["public.customers.customers_pkey"] + n29["public.order_items.order_items_order_id_fkey"] + n30["public.order_items.order_items_pkey"] + n31["public.order_items.order_items_product_id_fkey"] + n32["public.order_items.order_items_quantity_check__485b310e0371"] + n33["public.orders.orders_customer_id_fkey"] + n34["public.orders.orders_pkey"] + n35["public.orders.orders_total_amount_check__8c94b42a7e78"] + n36["public.payments.payments_amount_check__2fbbb5aae972"] + n37["public.payments.payments_order_id_fkey"] + n38["public.payments.payments_pkey"] + n39["public.products.products_pkey"] + n40["public.products.products_price_check__a1bdfb6cc254"] + n41["public.products.products_sku_key"] + n42["public.touch_customer"] + n43["public.orders_customer_idx"] + n44["public.addresses"] + n45["public.customers"] + n46["public.order_items"] + n47["public.orders"] + n48["public.payments"] + n49["public.products"] + n50["public.customers.customers_touch"] + n51["public.customer_summary"] + n43 -->|expression_reference| n16 + n0 -->|query_reference| n10 + n32 -->|expression_reference| n14 + n43 -->|contains| n47 + n17 -->|contains| n47 + n11 -->|contains| n45 + n3 -->|contains| n44 + n30 -->|expression_reference| n13 + n26 -->|contains| n44 + n51 -->|query_reference| n8 + n4 -->|contains| n44 + n31 -->|expression_reference| n13 + n2 -->|contains| n44 + n33 -->|expression_reference| n16 + n50 -->|trigger_association| n45 + n12 -->|contains| n46 + n1 -->|query_reference| n47 + n25 -->|expression_reference| n3 + n27 -->|contains| n45 + n38 -->|expression_reference| n20 + n19 -->|contains| n48 + n8 -->|contains| n45 + n10 -->|contains| n45 + n12 -->|foreign_key| n17 + n35 -->|contains| n47 + n31 -->|foreign_key| n22 + n37 -->|contains| n48 + n15 -->|contains| n47 + n36 -->|expression_reference| n19 + n36 -->|contains| n48 + n51 -->|query_reference| n16 + n37 -->|foreign_key| n47 + n29 -->|expression_reference| n12 + n21 -->|contains| n48 + n46 -->|foreign_key| n47 + n25 -->|foreign_key| n9 + n3 -->|foreign_key| n9 + n5 -->|contains| n51 + n1 -->|query_reference| n17 + n37 -->|expression_reference| n21 + n28 -->|contains| n45 + n31 -->|foreign_key| n49 + n9 -->|contains| n45 + n28 -->|expression_reference| n9 + n20 -->|contains| n48 + n18 -->|contains| n47 + n1 -->|query_reference| n16 + n40 -->|contains| n49 + n6 -->|contains| n51 + n14 -->|contains| n46 + n40 -->|expression_reference| n23 + n48 -->|foreign_key| n47 + n29 -->|foreign_key| n47 + n50 -->|trigger_association| n42 + n46 -->|foreign_key| n49 + n33 -->|foreign_key| n45 + n16 -->|contains| n47 + n51 -->|query_reference| n17 + n0 -->|query_reference| n9 + n7 -->|contains| n51 + n51 -->|query_reference| n9 + n29 -->|contains| n46 + n39 -->|contains| n49 + n32 -->|contains| n46 + n25 -->|contains| n44 + n35 -->|expression_reference| n18 + n13 -->|contains| n46 + n13 -->|foreign_key| n22 + n26 -->|expression_reference| n4 + n1 -->|query_reference| n9 + n25 -->|foreign_key| n45 + n37 -->|foreign_key| n17 + n31 -->|contains| n46 + n34 -->|contains| n47 + n21 -->|foreign_key| n17 + n30 -->|expression_reference| n12 + n41 -->|contains| n49 + n0 -->|query_reference| n8 + n41 -->|expression_reference| n24 + n30 -->|contains| n46 + n34 -->|expression_reference| n17 + n23 -->|contains| n49 + n22 -->|contains| n49 + n0 -->|query_reference| n45 + n47 -->|foreign_key| n45 + n24 -->|contains| n49 + n44 -->|foreign_key| n45 + n1 -->|query_reference| n8 + n39 -->|expression_reference| n22 + n38 -->|contains| n48 + n29 -->|foreign_key| n17 + n51 -->|query_reference| n47 + n27 -->|expression_reference| n8 + n33 -->|foreign_key| n9 + n1 -->|query_reference| n45 + n16 -->|foreign_key| n9 + n33 -->|contains| n47 + n51 -->|query_reference| n45 diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/model.dbdep.json b/skills/database-dependency-migration/examples/rendered/ecommerce/model.dbdep.json new file mode 100644 index 0000000..9f10014 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/model.dbdep.json @@ -0,0 +1,3031 @@ +{ + "coverage": { + "capabilities": [ + "ddl_ast", + "simple_sql_references", + "reverse_dependencies" + ], + "catalog_available": false, + "exhaustive": false, + "repository_scan": true, + "unresolved": 8 + }, + "edges": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:014fb6369ba96ca9ec2ffb6e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/index//orders_customer_idx/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:0d63cdfda898dda0d0ad8205", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/name/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:0fd89a08c8cb49371591999e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/quantity/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:122fa6ad729c390103dc691f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/index//orders_customer_idx/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:18a94627aae399dfc7524ec3", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1a413343114cc7a6e07d44c2", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/updated_at/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1aa24304fac7db22fadbc3a2", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1d9d0976df3698a0baab6d4f", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/product_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:21f46e17cc79c2dc179c60b7", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:24a25eea6c256af13096b2d4", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2b4a327b2a480706c0fa842d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2d6b9ecfcf9878d978cd8602", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/product_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2eddcbe6246a409f53fb05a8", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/city/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2f87c0839429a4ab70f6577b", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2fc82a466cea94afdf966e07", + "kind": "trigger_association", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/trigger/customers/customers_touch/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:31b516307eef6dd0a3d257d6", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3d411ea3b817ba78d8239733", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3e7919197cdfba064bae5dee", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/addresses/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3f36d958c1a16f4f5063977f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4288ed89833d0022c1d54d05", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:42b516772ae0c490fc62e11c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/amount/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:44748c81a94abde3f9f756c1", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/email/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:449d080bde5028b829fd281a", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/name/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4852fede4511dce0fbc8a7af", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/column/order_items/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:493a5da95d3bdaadae7e03fb", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4c6e6857c89ea809b31a3996", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:535a1452c20c4f6274bc02e5", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5402d78cd2ee1aefae55d740", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/created_at/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:57783f8cc3c12381d5a1b58e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:57d138471f7e225c7e01d90c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5854677188c6ab1c841f33ed", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:60a259d4dc6d48cdf764e46f", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:612709d82e5f92d0eb08603a", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:62a5bb71cf88a0ebc61e744d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:62fcf75c3913fb26cc394149", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "order_id" + ], + "constraint": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/table//order_items/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6b337fb6d4bfa4f999a1cc86", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6c3f2ed8788f2720c5aff75f", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/column/addresses/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6e209e98877452de8f04385b", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/email/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:75fa9aa95ba7b9d956e76660", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7925f99039a93219e51926db", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7c94d6184e2c7e444f2c9312", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7f3b931f78bdeb022b90e8ba", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:80ea424e44ca67d3c85bc3c5", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:84d30a74505bc15546505d27", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:874d99945657054a80df9f02", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:888273ce7767cc3e55291871", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/total_amount/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:898dfc1b3549f6fe9e1041ce", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8a9ad2f29f72dd1a1af8587d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8d3c400eda2590da824c965e", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/id/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:9001b115d6c5c48b4b5718ff", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/quantity/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:90c8c74b3403895629e680da", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "status": "PARSED", + "target": "postgresql:local/public/column/products/price/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:96cdb0d84bc00a09ceb5109e", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "order_id" + ], + "constraint": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/table//payments/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:98d3f4f0a67ad80a7f7ab0bd", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:9d307aea5e208abba7504fb0", + "kind": "trigger_association", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/trigger/customers/customers_touch/", + "status": "PARSED", + "target": "postgresql:local/public/function//touch_customer/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a642923dda75dbdc7098d8d7", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "product_id" + ], + "constraint": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" + }, + "source": "postgresql:local/public/table//order_items/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a666f589e93aa92ac58f69ea", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a8578a71397a160629502a5d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a8bea9311b58d34372ee5943", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a9189d507b83265b33fafc29", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aa1d9857feb03fc467ed1835", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/order_count/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aa9343ef5c72a1e514641dc7", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aac409ebab28c4f020bdeda0", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ac3cbd05c6a9226c89d527a4", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ad680030f5a2e293affc3783", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:b3f2f89e86307ac919bd989c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bc0cecf27a9d335975ad3a49", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bd8703a71aa20f06a188f31a", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/product_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bdbb2b13e6ac09f5824bae43", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" + }, + "source": "postgresql:local/public/column/order_items/product_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bfd9cd55aaab90c4ed183b91", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/addresses/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c0e890722d6fafc386c0e426", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c65687c186e8bee9cb8c0471", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c7ba0696045c497301e52033", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c8311f0c1b599de8590f98cd", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c97827f27d1098e9f3c77ea4", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ca4029a75da40252e4498d21", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/column/payments/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ca848fa6534d7f92402c1a52", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:cc0012b67ac594d5d7bd6657", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:cddcdabaec4c64d86a5967e5", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d1d2cc90cfc4e410bdc75cec", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/column/products/sku/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d31da38e2ae27e8c7cfcd42f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d660558bd60070ae4acb636e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:da05ef9838f3b40e481aa89b", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/price/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:da43cc551d6ebd2502680372", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:dbfeb24560e06d8750f73f55", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e1747cefd339bbab7c6a304a", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "customer_id" + ], + "constraint": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/table//orders/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e247fcd60cd703bd273870d3", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/sku/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e40e0e88abbd113de3a5fcd8", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "customer_id" + ], + "constraint": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/table//addresses/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e4b95d06d0a70b8f382dfa23", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e74e28ce9dd6823209b2030c", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ebd6536c72c75c6b3b067c27", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:eccc92a583473fdc12ea81af", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f23585bc075e6bd84fb1a091", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f42877ab42b51eee114c1133", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f4ce6b8bb9138d13271b58f2", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f5f65ed52b52a130866ae814", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:fbc21659908e0ae2a5cd46ea", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/column/orders/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:fdfb9eb03a5388bd20d49588", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ffb83430132bc8b5e521cc1e", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + } + ], + "engine": { + "name": "postgresql", + "source_mode": "offline_ddl", + "version": "18" + }, + "evidence": [ + { + "byte_length": 62, + "byte_start": 1231, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:3eff11898bac02d99ee08daf", + "line_end": 34, + "line_start": 34, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 191, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:40680f826d95f1ec183340ed", + "line_end": 6, + "line_start": 1, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 175, + "byte_start": 193, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:4f849d665202a664e7893d4a", + "line_end": 11, + "line_start": 7, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 118, + "byte_start": 1614, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:776d7da11045ee31e44912e0", + "line_end": 46, + "line_start": 45, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 264, + "byte_start": 540, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:7de9792a75dda688bf1f738f", + "line_end": 22, + "line_start": 17, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 168, + "byte_start": 370, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:8dadc8fc9c511aafd4803a87", + "line_end": 16, + "line_start": 12, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 49, + "byte_start": 233, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:932595bbd8475c83626294de", + "line_end": 4, + "line_start": 4, + "origin": "migration_diff", + "path": "examples/ecommerce/migrations/003_contract_legacy_id.sql", + "source_hash": "sha256:312cd82ea52d1f6afd5b49d4dff0812fadc95d7f0b87a1250e2fd461a9687c2e", + "status": "PARSED" + }, + { + "byte_length": 222, + "byte_start": 806, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:b306c585df0ee00d863316dd", + "line_end": 28, + "line_start": 23, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 184, + "byte_start": 1295, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:c81447f17e11c2d5b6c401da", + "line_end": 38, + "line_start": 35, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 199, + "byte_start": 1030, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e3fa1e6bfbfed48ae579bc40", + "line_end": 33, + "line_start": 29, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 71, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e4dc7c3f3bcbc60c845f14b5", + "line_end": 1, + "line_start": 1, + "origin": "application_source", + "path": "examples/ecommerce/app/customers.sql", + "source_hash": "sha256:a415aaea7a68344c4f8c3e93fc4233772176a54a53c14c74541c2e512be81470", + "status": "PARSED" + }, + { + "byte_length": 131, + "byte_start": 1481, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e9af3cfadad5d8900305d336", + "line_end": 44, + "line_start": 39, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 75, + "byte_start": 156, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e9b2533c0430764b4a894410", + "line_end": 3, + "line_start": 3, + "origin": "migration_diff", + "path": "examples/ecommerce/migrations/003_contract_legacy_id.sql", + "source_hash": "sha256:312cd82ea52d1f6afd5b49d4dff0812fadc95d7f0b87a1250e2fd461a9687c2e", + "status": "PARSED" + }, + { + "byte_length": 120, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:f8c7e18154ef774049bc8694", + "line_end": 2, + "line_start": 1, + "origin": "application_source", + "path": "examples/ecommerce/app/orders.sql", + "source_hash": "sha256:07ed8c193824ea5e25844e2be152acec7d04492c5b3d5ca9fbc55d2ee4e1421e", + "status": "PARSED" + } + ], + "findings": [ + { + "confidence": "conditional", + "evidence": [ + "ev:932595bbd8475c83626294de" + ], + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "id": "finding:17fd8d2f76f37f5db9c4bbc0", + "object_ids": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/view//customer_summary/" + ], + "origin": "migration_diff", + "reason": "Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN.", + "remediation": "Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered.", + "risk_dimensions": [ + "compatibility", + "unresolved_dependencies" + ], + "risk_level": "high", + "rule_id": "DDM008", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:e9b2533c0430764b4a894410" + ], + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "id": "finding:1f42b755eba72fea9ba81aea", + "object_ids": [ + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/" + ], + "origin": "migration_diff", + "reason": "Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds.", + "remediation": "Rebuild or transition affected objects with verified order and constraint validation.", + "risk_dimensions": [ + "compatibility", + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM014", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:e9b2533c0430764b4a894410" + ], + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "id": "finding:370414671077baaa53bc48ab", + "object_ids": [], + "origin": "migration_diff", + "reason": "Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown.", + "remediation": "Collect labeled metadata and rehearse representative workload; do not invent row counts or timing.", + "risk_dimensions": [ + "locking", + "rewrite", + "unresolved_dependencies" + ], + "risk_level": "unknown", + "rule_id": "DDM012", + "severity": "warning", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:e9b2533c0430764b4a894410" + ], + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "id": "finding:3c74037dcbed2a710c2586e9", + "object_ids": [ + "postgresql:local/public/column/customers/id/" + ], + "origin": "migration_diff", + "reason": "Type transition int8 to uuid. BIGINT/integer identifiers have no general semantics-preserving UUID cast. PostgreSQL 18 ALTER COLUMN TYPE generally takes ACCESS EXCLUSIVE; rewrite/index rebuild depends on cast, typmod and USING expression. Rewrite and lock duration are conditional.", + "remediation": "Design and verify a mapping/replacement column. Check USING, defaults, FKs, views, indexes and actual cast support in a disposable database.", + "risk_dimensions": [ + "compatibility", + "locking", + "rewrite" + ], + "risk_level": "high", + "rule_id": "DDM002", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:e9b2533c0430764b4a894410" + ], + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "id": "finding:4c54355fe16388208b9d5a72", + "object_ids": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/view//customer_summary/" + ], + "origin": "migration_diff", + "reason": "Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN.", + "remediation": "Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered.", + "risk_dimensions": [ + "compatibility", + "unresolved_dependencies" + ], + "risk_level": "high", + "rule_id": "DDM008", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence": [ + "ev:932595bbd8475c83626294de" + ], + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "id": "finding:527d85f2940afbbabfaec742", + "object_ids": [ + "postgresql:local/public/column/orders/customer_id/" + ], + "origin": "migration_diff", + "reason": "DROP COLUMN destroys column data and affects known dependency/source references.", + "remediation": "Preserve data and transition consumers before a separately reviewed destructive contract.", + "risk_dimensions": [ + "data_loss", + "compatibility" + ], + "risk_level": "high", + "rule_id": "DDM001", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:932595bbd8475c83626294de" + ], + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "id": "finding:927b58a07c6c822fa0c8fe67", + "object_ids": [ + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/" + ], + "origin": "migration_diff", + "reason": "Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds.", + "remediation": "Rebuild or transition affected objects with verified order and constraint validation.", + "risk_dimensions": [ + "compatibility", + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM014", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:e9b2533c0430764b4a894410" + ], + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "id": "finding:9d142d86d93f8fb28487b147", + "object_ids": [ + "postgresql:local/public/column/customers/id/" + ], + "origin": "migration_diff", + "reason": "Changed column has identity/default/generated semantics; sequence names and implicit casts may need catalog resolution.", + "remediation": "Preserve ownership, generation, default behavior and sequence state in a reviewed replacement design.", + "risk_dimensions": [ + "compatibility", + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM015", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:932595bbd8475c83626294de" + ], + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "id": "finding:d987bdc99719f15b83e7d489", + "object_ids": [], + "origin": "migration_diff", + "reason": "Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown.", + "remediation": "Collect labeled metadata and rehearse representative workload; do not invent row counts or timing.", + "risk_dimensions": [ + "locking", + "rewrite", + "unresolved_dependencies" + ], + "risk_level": "unknown", + "rule_id": "DDM012", + "severity": "warning", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:932595bbd8475c83626294de" + ], + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "id": "finding:edffb23ebd95aa3c71ba1c43", + "object_ids": [ + "postgresql:local/public/column/orders/customer_id/" + ], + "origin": "migration_diff", + "reason": "Destructive contract lacks evidence of completed application transition.", + "remediation": "Require expand/backfill/validate/transition gates before contract.", + "risk_dimensions": [ + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM011", + "severity": "error", + "status": "PARSED" + } + ], + "nodes": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "id": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "kind": "query", + "name": "examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5", + "origin": "application_source", + "parent": "", + "properties": { + "query_type": "SelectStmt" + }, + "qualified_name": "application.\"examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5\"", + "schema": "application", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "id": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "kind": "query", + "name": "examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694", + "origin": "application_source", + "parent": "", + "properties": { + "query_type": "SelectStmt" + }, + "qualified_name": "application.\"examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694\"", + "schema": "application", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/city/", + "kind": "column", + "name": "city", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:f08b4647711f741de68a6c097e6f853a74c01c4504f6eed2bf39c4ccd9a2d2d3", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.addresses.city", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/customer_id/", + "kind": "column", + "name": "customer_id", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:c39228203e96db2b8f215085f7140c92c27add8b2fb53c8535a7d66dbdf26695", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.addresses.customer_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.addresses.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/email/", + "kind": "column", + "name": "email", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:66ea6bf2c488f1e2b3c2ac21ecee8d8370033b025b59c8c9b3bb9c2fa0c21a1a", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.email", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:49c0c7d706e779884f4363cb3ee005ca55369ea38d969fcdfc75876128460501", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/order_count/", + "kind": "column", + "name": "order_count", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:d84fb59976dfbac1825a1b0308511edf1748625f1bb8522042ad115c5fd6fdea", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.order_count", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/email/", + "kind": "column", + "name": "email", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:137b050c4a5fcfe348bc515063a2634f1d673100246fc37ebef150a8a8bc0ff7", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.customers.email", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.customers.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/name/", + "kind": "column", + "name": "name", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:1e03ec01f5d19a6bbd1b0f7957b8ea19189cc72e9c15f59a5b5d67d0d22f036d", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.customers.name", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/updated_at/", + "kind": "column", + "name": "updated_at", + "origin": "sql_file", + "parent": "customers", + "properties": { + "default": "sha256:8e2094a132c5ca7401619f31b664c568d4fa6a6f6548e2c7e79a2756e154215a", + "definition_hash": "sha256:4134ad4f3a994aff6d436bf6e4329672515896b0977f7dbf2d30ebe930aefa87", + "nullable": false, + "type": "timestamptz" + }, + "qualified_name": "public.customers.updated_at", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/order_id/", + "kind": "column", + "name": "order_id", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:51db3ae41e544385c616bcfa177cd75905d120f72fca4bc4b5a9710b3eac30da", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.order_items.order_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/product_id/", + "kind": "column", + "name": "product_id", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:ff6902b4bb96c519432cce2b2de806bc82c62b4efb355f67108bccc2f890640a", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.order_items.product_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/quantity/", + "kind": "column", + "name": "quantity", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:1d91d3b7f5c391ff0f57184ae9efd6e06247a3661d2414848c98dc6832ab2834", + "nullable": false, + "type": "int4" + }, + "qualified_name": "public.order_items.quantity", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/created_at/", + "kind": "column", + "name": "created_at", + "origin": "sql_file", + "parent": "orders", + "properties": { + "default": "sha256:8e2094a132c5ca7401619f31b664c568d4fa6a6f6548e2c7e79a2756e154215a", + "definition_hash": "sha256:256ff2ee5a0bd607cbfc4d481a0529aa37ee8b3c905052a7c52c018df867e584", + "nullable": false, + "type": "timestamptz" + }, + "qualified_name": "public.orders.created_at", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/customer_id/", + "kind": "column", + "name": "customer_id", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:c39228203e96db2b8f215085f7140c92c27add8b2fb53c8535a7d66dbdf26695", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.orders.customer_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.orders.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/total_amount/", + "kind": "column", + "name": "total_amount", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:057f194f15b4ffa477b37d8f3bcf98d675b6ea05f0d05515695e16e1e6bffc13", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.orders.total_amount", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/amount/", + "kind": "column", + "name": "amount", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:b292d1afe6633b88dd524d5e1484f9db97f6bb46707d91ef73d3ef7712a94271", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.payments.amount", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.payments.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/order_id/", + "kind": "column", + "name": "order_id", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:4a51ca6377aa9cd5c5ac4788994569a39b17ab6e4ab074d339389b98ef939eef", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.payments.order_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.products.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/price/", + "kind": "column", + "name": "price", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:2357e448da6873b42c07bf6821c09096aa13e811a8b9d0645d2e0c46e8197b1b", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.products.price", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/sku/", + "kind": "column", + "name": "sku", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:10f6445cf9f0d00a4b80aa8cc89056203227ab042cc87e8eff7f7ddd94afdd03", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.products.sku", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "kind": "constraint", + "name": "addresses_customer_id_fkey", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "columns": [ + "customer_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:884466556956c633a5c8fcd4799d4aeac8643f8b8f4fb66427b4b437481879c4", + "name_inferred": true + }, + "qualified_name": "public.addresses.addresses_customer_id_fkey", + "schema": "public", + "signature": "884466556956c633a5c8fcd4", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "addresses_pkey", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.addresses.addresses_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "kind": "constraint", + "name": "customers_email_key", + "origin": "sql_file", + "parent": "customers", + "properties": { + "columns": [ + "email" + ], + "constraint_type": "unique", + "definition_hash": "sha256:30ba9a81fb7ea6ec9ff167f700ff6645f7a64c25d44fe35747c072bd9733974f", + "name_inferred": true + }, + "qualified_name": "public.customers.customers_email_key", + "schema": "public", + "signature": "30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "customers_pkey", + "origin": "sql_file", + "parent": "customers", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.customers.customers_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "kind": "constraint", + "name": "order_items_order_id_fkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "order_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:1ef74bdedf741fe887a86e145fcd8edf53dcb516e17a8fb3b02c4bd9eb3e6815", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_order_id_fkey", + "schema": "public", + "signature": "1ef74bdedf741fe887a86e14", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "kind": "constraint", + "name": "order_items_pkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "order_id", + "product_id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:0f66fa763c977cd394d53f0420f2b7b60ba0db3bd7820e8e4193d15351f15589", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_pkey", + "schema": "public", + "signature": "0f66fa763c977cd394d53f04", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "kind": "constraint", + "name": "order_items_product_id_fkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "product_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:4f7950eb41a49d97e2c7146e5dca493da458f09a1887359bfdcb6d2ce4544bcc", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_product_id_fkey", + "schema": "public", + "signature": "4f7950eb41a49d97e2c7146e", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "kind": "constraint", + "name": "order_items_quantity_check__485b310e0371", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "quantity" + ], + "constraint_type": "check", + "definition_hash": "sha256:485b310e03717749fd3667563af2e7c4e56277a8aacbf380725a9369c203ee69", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_quantity_check__485b310e0371", + "schema": "public", + "signature": "485b310e03717749fd366756", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "kind": "constraint", + "name": "orders_customer_id_fkey", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "customer_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:884466556956c633a5c8fcd4799d4aeac8643f8b8f4fb66427b4b437481879c4", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_customer_id_fkey", + "schema": "public", + "signature": "884466556956c633a5c8fcd4", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "orders_pkey", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "kind": "constraint", + "name": "orders_total_amount_check__8c94b42a7e78", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "total_amount" + ], + "constraint_type": "check", + "definition_hash": "sha256:8c94b42a7e78904691546dba808f1c7031d09def28d0edf7e5631c7dc0362c2d", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_total_amount_check__8c94b42a7e78", + "schema": "public", + "signature": "8c94b42a7e78904691546dba", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "kind": "constraint", + "name": "payments_amount_check__2fbbb5aae972", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "amount" + ], + "constraint_type": "check", + "definition_hash": "sha256:2fbbb5aae972c43b3e1ddb511934de05abe0e1e0163d5766ba8346e162aac7b1", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_amount_check__2fbbb5aae972", + "schema": "public", + "signature": "2fbbb5aae972c43b3e1ddb51", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "kind": "constraint", + "name": "payments_order_id_fkey", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "order_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:1ef74bdedf741fe887a86e145fcd8edf53dcb516e17a8fb3b02c4bd9eb3e6815", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_order_id_fkey", + "schema": "public", + "signature": "1ef74bdedf741fe887a86e14", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "payments_pkey", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "products_pkey", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.products.products_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "kind": "constraint", + "name": "products_price_check__a1bdfb6cc254", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "price" + ], + "constraint_type": "check", + "definition_hash": "sha256:a1bdfb6cc254d41061cec4716594eab5693d635a51376961f9c38d5cd0fe1a14", + "name_inferred": true + }, + "qualified_name": "public.products.products_price_check__a1bdfb6cc254", + "schema": "public", + "signature": "a1bdfb6cc254d41061cec471", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "kind": "constraint", + "name": "products_sku_key", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "sku" + ], + "constraint_type": "unique", + "definition_hash": "sha256:30ba9a81fb7ea6ec9ff167f700ff6645f7a64c25d44fe35747c072bd9733974f", + "name_inferred": true + }, + "qualified_name": "public.products.products_sku_key", + "schema": "public", + "signature": "30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "id": "postgresql:local/public/function//touch_customer/", + "kind": "function", + "name": "touch_customer", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:69788d99ee54b34da61bcda504b3d00f44297888828d434f875fcccd212a12bc" + }, + "qualified_name": "public.touch_customer", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "id": "postgresql:local/public/index//orders_customer_idx/", + "kind": "index", + "name": "orders_customer_idx", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:d756ef818809be11f2ee04e3eb1fff93110159c327f567b050f9f65de80dc738" + }, + "qualified_name": "public.orders_customer_idx", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/table//addresses/", + "kind": "table", + "name": "addresses", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:9c145553e656fe8efd771936eac30f6b3cff418e8897302f418389562756c435" + }, + "qualified_name": "public.addresses", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/table//customers/", + "kind": "table", + "name": "customers", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:8ba1a04f5b65f1a8a0377e13fd1d70616cd2a2f3fa939ac2089e2c05767cc559" + }, + "qualified_name": "public.customers", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/table//order_items/", + "kind": "table", + "name": "order_items", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:6f8b284ed2f016fb55a7ff04ea23ad7b91d781cb2bdf00e1391cb0b254210859" + }, + "qualified_name": "public.order_items", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/table//orders/", + "kind": "table", + "name": "orders", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:b234fb61206da550dcd90d0a7d1e8a5eb71725c35e3a89f744edb79f61303a79" + }, + "qualified_name": "public.orders", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/table//payments/", + "kind": "table", + "name": "payments", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:61c438642adec4e78e5308d6e5b02d5f392b152bedb35e7619fdc2b0579163be" + }, + "qualified_name": "public.payments", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/table//products/", + "kind": "table", + "name": "products", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:e71fc575ab401cd52f45edd3df0faa3421ba55f9ea17bdb7996344bd9382cf1b" + }, + "qualified_name": "public.products", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "id": "postgresql:local/public/trigger/customers/customers_touch/", + "kind": "trigger", + "name": "customers_touch", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:b883f3a4e2ca6cb2493debafc7c58ab3e03eac238ad05d86ebbe9e6618e97f92" + }, + "qualified_name": "public.customers.customers_touch", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/view//customer_summary/", + "kind": "view", + "name": "customer_summary", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:c64cf7e681c56e9e87c80899bd868f94133a64e21a9dcbd8a871f71c128e25d3" + }, + "qualified_name": "public.customer_summary", + "schema": "public", + "signature": "", + "status": "PARSED" + } + ], + "schema_version": "1.0.0", + "snapshot": { + "created_at": null, + "id": "snapshot:a90cf67bbd08aeb06cdd4199", + "source_fingerprint": "sha256:a90cf67bbd08aeb06cdd419997c98ef8d49823ba05ccb749f8aa32ab37123b33" + }, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:18505c245f165e4c93c709f8", + "object_id": "postgresql:local/public/column/orders/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5afc9281a8cd153100e8eb4f", + "object_id": "postgresql:local/public/column/products/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5ff30f718f152d8ea851b944", + "object_id": "postgresql:local/public/column/addresses/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "explanation": "Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL.", + "id": "unknown:69ffcfe1e4e57e6481af7368", + "object_id": "postgresql:local/public/function//touch_customer/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:8bea11811025af9e17a96a8e", + "object_id": "postgresql:local/public/column/customers/updated_at/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:9e847561e1fbe07255d98720", + "object_id": "postgresql:local/public/column/customers/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:eacbb533e2808e73f27dbf47", + "object_id": "postgresql:local/public/column/payments/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:f16dbb53af3ad137ed449c36", + "object_id": "postgresql:local/public/column/orders/created_at/", + "origin": "heuristic", + "status": "UNKNOWN" + } + ] +} diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/report.html b/skills/database-dependency-migration/examples/rendered/ecommerce/report.html new file mode 100644 index 0000000..e2f9297 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/report.html @@ -0,0 +1,5181 @@ + + + + + + + PostgreSQL dependency explorer + + + + + + + + + +
+
+
+

+ POSTGRESQL / DEPENDENCY REPORT +

+

+ Know what breaks
before you migrate. +

+

+ Trace dependencies back to their evidence. Review changes before + deployment. +

+
+
+
+ + +
+
+ + + + + +
+
+
+
+
+ + + +
+
+ + +
+
+

+ + + + + + + + +
+ Solid: catalogDashed: parsed referenceDotted: foreign key relationshipArrow = source depends on target. Impact follows reverse + arrows. +
+
+ +
+
+ + + +
+

+ OBSERVED = catalog metadata Ā· PARSED = syntax evidence Ā· INFERRED = + unproven Ā· UNKNOWN = unavailable. +

+

+ Graph paths show potential impact. Runtime coverage and lock duration + require separate evidence. +

+
+
+ + + + + + diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/report.md b/skills/database-dependency-migration/examples/rendered/ecommerce/report.md new file mode 100644 index 0000000..799cf51 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/report.md @@ -0,0 +1,358 @@ +# PostgreSQL dependency review + +Analysis only. No SQL was executed by the analyzer. + +Snapshot ` snapshot:a90cf67bbd08aeb06cdd4199 `. PostgreSQL 18, offline\_ddl. +Nodes: 52. Edges: 98. Evidence: 14. Findings: 10. Unknowns: 8. + +Arrows mean source depends on/references target. Impact walks reverse edges. Paths describe potential impact; they do not prove runtime failure or complete consumer coverage. + +## Findings + +### DDM008 (error, high, PARSED) + +Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN. + +Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered. + +Finding ID: ` finding:17fd8d2f76f37f5db9c4bbc0 `. Dimensions: compatibility, unresolved\_dependencies. Evidence: ev:932595bbd8475c83626294de. + +### DDM014 (error, high, PARSED) + +Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds. + +Rebuild or transition affected objects with verified order and constraint validation. + +Finding ID: ` finding:1f42b755eba72fea9ba81aea `. Dimensions: compatibility, deployment\_order. Evidence: ev:e9b2533c0430764b4a894410. + +### DDM012 (warning, unknown, PARSED) + +Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown. + +Collect labeled metadata and rehearse representative workload; do not invent row counts or timing. + +Finding ID: ` finding:370414671077baaa53bc48ab `. Dimensions: locking, rewrite, unresolved\_dependencies. Evidence: ev:e9b2533c0430764b4a894410. + +### DDM002 (error, high, PARSED) + +Type transition int8 to uuid. BIGINT/integer identifiers have no general semantics-preserving UUID cast. PostgreSQL 18 ALTER COLUMN TYPE generally takes ACCESS EXCLUSIVE; rewrite/index rebuild depends on cast, typmod and USING expression. Rewrite and lock duration are conditional. + +Design and verify a mapping/replacement column. Check USING, defaults, FKs, views, indexes and actual cast support in a disposable database. + +Finding ID: ` finding:3c74037dcbed2a710c2586e9 `. Dimensions: compatibility, locking, rewrite. Evidence: ev:e9b2533c0430764b4a894410. + +### DDM008 (error, high, PARSED) + +Known views/routines/SQL consumers reference this object. Catalog paths and parsed source references have distinct guarantees; untracked routine bodies remain UNKNOWN. + +Review the supplied dependency paths and verify runtime consumers; never claim all function calls were discovered. + +Finding ID: ` finding:4c54355fe16388208b9d5a72 `. Dimensions: compatibility, unresolved\_dependencies. Evidence: ev:e9b2533c0430764b4a894410. + +### DDM001 (error, high, PARSED) + +DROP COLUMN destroys column data and affects known dependency/source references. + +Preserve data and transition consumers before a separately reviewed destructive contract. + +Finding ID: ` finding:527d85f2940afbbabfaec742 `. Dimensions: data\_loss, compatibility. Evidence: ev:932595bbd8475c83626294de. + +### DDM014 (error, high, PARSED) + +Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds. + +Rebuild or transition affected objects with verified order and constraint validation. + +Finding ID: ` finding:927b58a07c6c822fa0c8fe67 `. Dimensions: compatibility, deployment\_order. Evidence: ev:932595bbd8475c83626294de. + +### DDM015 (error, high, PARSED) + +Changed column has identity/default/generated semantics; sequence names and implicit casts may need catalog resolution. + +Preserve ownership, generation, default behavior and sequence state in a reviewed replacement design. + +Finding ID: ` finding:9d142d86d93f8fb28487b147 `. Dimensions: compatibility, deployment\_order. Evidence: ev:e9b2533c0430764b4a894410. + +### DDM012 (warning, unknown, PARSED) + +Table size/traffic/runtime statistics are unavailable. Lock mode can be described but duration and downtime are unknown. + +Collect labeled metadata and rehearse representative workload; do not invent row counts or timing. + +Finding ID: ` finding:d987bdc99719f15b83e7d489 `. Dimensions: locking, rewrite, unresolved\_dependencies. Evidence: ev:932595bbd8475c83626294de. + +### DDM011 (error, high, PARSED) + +Destructive contract lacks evidence of completed application transition. + +Require expand/backfill/validate/transition gates before contract. + +Finding ID: ` finding:edffb23ebd95aa3c71ba1c43 `. Dimensions: deployment\_order. Evidence: ev:932595bbd8475c83626294de. + +## Coverage and unknowns + +OBSERVED means supplied catalog metadata. PARSED means syntax-aware source evidence. INFERRED means unproven. UNKNOWN means unavailable or unsupported. Static analysis is not exhaustive. + +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:7de9792a75dda688bf1f738f. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:8dadc8fc9c511aafd4803a87. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:4f849d665202a664e7893d4a. +- UNKNOWN: Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL. Evidence: ev:e9af3cfadad5d8900305d336. +- UNKNOWN: Default/generated function and sequence expression targets need catalog resolution. Evidence: ev:40680f826d95f1ec183340ed. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:40680f826d95f1ec183340ed. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:e3fa1e6bfbfed48ae579bc40. +- UNKNOWN: Default/generated function and sequence expression targets need catalog resolution. Evidence: ev:7de9792a75dda688bf1f738f. + +## Migration sequence + +### expand + +Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys. + +Preconditions: Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget. + +Verification: Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics. + +Recovery: Stop deployment before consumers depend on the new fields; keep old fields available. + +### backfill + +If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers. + +Preconditions: Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling. + +Verification: Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic. + +Recovery: Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure. + +### validate + +Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate. + +Preconditions: Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index. + +Verification: Check constraint validation and pg\_index.indisvalid/indisready, compare old/new results and observe lock waits. + +Recovery: Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling. + +### transition + +Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs. + +Preconditions: Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths. + +Verification: Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage. + +Recovery: Revert application reads only while both representations remain consistent; otherwise prefer roll-forward. + +### contract + +Remove legacy objects only after verified transition and a separate destructive-change review. + +Preconditions: Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition. + +Verification: Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime. + +Recovery: Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator. + +Affected root: ` postgresql:local/public/column/customers/id/ `. + +- ` postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ ` via edge:a9189d507b83265b33fafc29 +- ` postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ ` via edge:c0e890722d6fafc386c0e426 +- ` postgresql:local/public/column/addresses/customer_id/ ` via edge:6c3f2ed8788f2720c5aff75f +- ` postgresql:local/public/column/customer_summary/email/ ` via edge:6e209e98877452de8f04385b, edge:aa9343ef5c72a1e514641dc7 +- ` postgresql:local/public/column/customer_summary/id/ ` via edge:8d3c400eda2590da824c965e, edge:aa9343ef5c72a1e514641dc7 +- ` postgresql:local/public/column/customer_summary/order_count/ ` via edge:aa1d9857feb03fc467ed1835, edge:aa9343ef5c72a1e514641dc7 +- ` postgresql:local/public/column/orders/customer_id/ ` via edge:fbc21659908e0ae2a5cd46ea +- ` postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4 ` via edge:6b337fb6d4bfa4f999a1cc86 +- ` postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422 ` via edge:84d30a74505bc15546505d27 +- ` postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4 ` via edge:f4ce6b8bb9138d13271b58f2 +- ` postgresql:local/public/index//orders_customer_idx/ ` via edge:014fb6369ba96ca9ec2ffb6e, edge:fbc21659908e0ae2a5cd46ea +- ` postgresql:local/public/view//customer_summary/ ` via edge:aa9343ef5c72a1e514641dc7 +Affected root: ` postgresql:local/public/column/orders/customer_id/ `. + +- ` postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ ` via edge:898dfc1b3549f6fe9e1041ce +- ` postgresql:local/public/column/customer_summary/email/ ` via edge:6e209e98877452de8f04385b, edge:5854677188c6ab1c841f33ed +- ` postgresql:local/public/column/customer_summary/id/ ` via edge:8d3c400eda2590da824c965e, edge:5854677188c6ab1c841f33ed +- ` postgresql:local/public/column/customer_summary/order_count/ ` via edge:aa1d9857feb03fc467ed1835, edge:5854677188c6ab1c841f33ed +- ` postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4 ` via edge:2f87c0839429a4ab70f6577b +- ` postgresql:local/public/index//orders_customer_idx/ ` via edge:014fb6369ba96ca9ec2ffb6e +- ` postgresql:local/public/view//customer_summary/ ` via edge:5854677188c6ab1c841f33ed + +## Object inventory + +| ID | Object | Kind | Status | Evidence | +|---|---|---|---|---| +| postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | application."examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5" | query | PARSED | ev:e4dc7c3f3bcbc60c845f14b5 | +| postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | application."examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694" | query | PARSED | ev:f8c7e18154ef774049bc8694 | +| postgresql:local/public/column/addresses/city/ | public.addresses.city | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/addresses/customer\_id/ | public.addresses.customer\_id | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/addresses/id/ | public.addresses.id | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/customer\_summary/email/ | public.customer\_summary.email | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customer\_summary/id/ | public.customer\_summary.id | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customer\_summary/order\_count/ | public.customer\_summary.order\_count | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customers/email/ | public.customers.email | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/id/ | public.customers.id | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/name/ | public.customers.name | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/updated\_at/ | public.customers.updated\_at | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/order\_items/order\_id/ | public.order\_items.order\_id | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/order\_items/product\_id/ | public.order\_items.product\_id | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/order\_items/quantity/ | public.order\_items.quantity | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/orders/created\_at/ | public.orders.created\_at | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/customer\_id/ | public.orders.customer\_id | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/id/ | public.orders.id | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/total\_amount/ | public.orders.total\_amount | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/payments/amount/ | public.payments.amount | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/payments/id/ | public.payments.id | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/payments/order\_id/ | public.payments.order\_id | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/products/id/ | public.products.id | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/column/products/price/ | public.products.price | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/column/products/sku/ | public.products.sku | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | public.addresses.addresses\_customer\_id\_fkey | constraint | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | public.addresses.addresses\_pkey | constraint | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | public.customers.customers\_email\_key | constraint | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | public.customers.customers\_pkey | constraint | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | public.order\_items.order\_items\_order\_id\_fkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | public.order\_items.order\_items\_pkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | public.order\_items.order\_items\_product\_id\_fkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | public.order\_items.order\_items\_quantity\_check\_\_485b310e0371 | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | public.orders.orders\_customer\_id\_fkey | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | public.orders.orders\_pkey | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | public.orders.orders\_total\_amount\_check\_\_8c94b42a7e78 | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | public.payments.payments\_amount\_check\_\_2fbbb5aae972 | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | public.payments.payments\_order\_id\_fkey | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | public.payments.payments\_pkey | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | public.products.products\_pkey | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | public.products.products\_price\_check\_\_a1bdfb6cc254 | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | public.products.products\_sku\_key | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/function//touch\_customer/ | public.touch\_customer | function | PARSED | ev:e9af3cfadad5d8900305d336 | +| postgresql:local/public/index//orders\_customer\_idx/ | public.orders\_customer\_idx | index | PARSED | ev:3eff11898bac02d99ee08daf | +| postgresql:local/public/table//addresses/ | public.addresses | table | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/table//customers/ | public.customers | table | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/table//order\_items/ | public.order\_items | table | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/table//orders/ | public.orders | table | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/table//payments/ | public.payments | table | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/table//products/ | public.products | table | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/trigger/customers/customers\_touch/ | public.customers.customers\_touch | trigger | PARSED | ev:776d7da11045ee31e44912e0 | +| postgresql:local/public/view//customer\_summary/ | public.customer\_summary | view | PARSED | ev:c81447f17e11c2d5b6c401da | + +## Edge inventory + +| ID | Source | Target | Kind | Status | +|---|---|---|---|---| +| edge:014fb6369ba96ca9ec2ffb6e | postgresql:local/public/index//orders\_customer\_idx/ | postgresql:local/public/column/orders/customer\_id/ | expression\_reference | PARSED | +| edge:0d63cdfda898dda0d0ad8205 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/name/ | query\_reference | PARSED | +| edge:0fd89a08c8cb49371591999e | postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | postgresql:local/public/column/order\_items/quantity/ | expression\_reference | PARSED | +| edge:122fa6ad729c390103dc691f | postgresql:local/public/index//orders\_customer\_idx/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:18a94627aae399dfc7524ec3 | postgresql:local/public/column/orders/id/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:1a413343114cc7a6e07d44c2 | postgresql:local/public/column/customers/updated\_at/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:1aa24304fac7db22fadbc3a2 | postgresql:local/public/column/addresses/customer\_id/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:1d9d0976df3698a0baab6d4f | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/column/order\_items/product\_id/ | expression\_reference | PARSED | +| edge:21f46e17cc79c2dc179c60b7 | postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:24a25eea6c256af13096b2d4 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:2b4a327b2a480706c0fa842d | postgresql:local/public/column/addresses/id/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:2d6b9ecfcf9878d978cd8602 | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/column/order\_items/product\_id/ | expression\_reference | PARSED | +| edge:2eddcbe6246a409f53fb05a8 | postgresql:local/public/column/addresses/city/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:2f87c0839429a4ab70f6577b | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/orders/customer\_id/ | expression\_reference | PARSED | +| edge:2fc82a466cea94afdf966e07 | postgresql:local/public/trigger/customers/customers\_touch/ | postgresql:local/public/table//customers/ | trigger\_association | PARSED | +| edge:31b516307eef6dd0a3d257d6 | postgresql:local/public/column/order\_items/order\_id/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:3d411ea3b817ba78d8239733 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/table//orders/ | query\_reference | PARSED | +| edge:3e7919197cdfba064bae5dee | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/addresses/customer\_id/ | expression\_reference | PARSED | +| edge:3f36d958c1a16f4f5063977f | postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:4288ed89833d0022c1d54d05 | postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | postgresql:local/public/column/payments/id/ | expression\_reference | PARSED | +| edge:42b516772ae0c490fc62e11c | postgresql:local/public/column/payments/amount/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:44748c81a94abde3f9f756c1 | postgresql:local/public/column/customers/email/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:449d080bde5028b829fd281a | postgresql:local/public/column/customers/name/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:4852fede4511dce0fbc8a7af | postgresql:local/public/column/order\_items/order\_id/ | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:493a5da95d3bdaadae7e03fb | postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:4c6e6857c89ea809b31a3996 | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/column/products/id/ | foreign\_key | PARSED | +| edge:535a1452c20c4f6274bc02e5 | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:5402d78cd2ee1aefae55d740 | postgresql:local/public/column/orders/created\_at/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:57783f8cc3c12381d5a1b58e | postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | postgresql:local/public/column/payments/amount/ | expression\_reference | PARSED | +| edge:57d138471f7e225c7e01d90c | postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:5854677188c6ab1c841f33ed | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/orders/customer\_id/ | query\_reference | PARSED | +| edge:60a259d4dc6d48cdf764e46f | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:612709d82e5f92d0eb08603a | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/order\_items/order\_id/ | expression\_reference | PARSED | +| edge:62a5bb71cf88a0ebc61e744d | postgresql:local/public/column/payments/order\_id/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:62fcf75c3913fb26cc394149 | postgresql:local/public/table//order\_items/ | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:6b337fb6d4bfa4f999a1cc86 | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:6c3f2ed8788f2720c5aff75f | postgresql:local/public/column/addresses/customer\_id/ | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:6e209e98877452de8f04385b | postgresql:local/public/column/customer\_summary/email/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:75fa9aa95ba7b9d956e76660 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/orders/id/ | query\_reference | PARSED | +| edge:7925f99039a93219e51926db | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/payments/order\_id/ | expression\_reference | PARSED | +| edge:7c94d6184e2c7e444f2c9312 | postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:7f3b931f78bdeb022b90e8ba | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/table//products/ | foreign\_key | PARSED | +| edge:80ea424e44ca67d3c85bc3c5 | postgresql:local/public/column/customers/id/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:84d30a74505bc15546505d27 | postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | postgresql:local/public/column/customers/id/ | expression\_reference | PARSED | +| edge:874d99945657054a80df9f02 | postgresql:local/public/column/payments/id/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:888273ce7767cc3e55291871 | postgresql:local/public/column/orders/total\_amount/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:898dfc1b3549f6fe9e1041ce | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/orders/customer\_id/ | query\_reference | PARSED | +| edge:8a9ad2f29f72dd1a1af8587d | postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:8d3c400eda2590da824c965e | postgresql:local/public/column/customer\_summary/id/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:9001b115d6c5c48b4b5718ff | postgresql:local/public/column/order\_items/quantity/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:90c8c74b3403895629e680da | postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | postgresql:local/public/column/products/price/ | expression\_reference | PARSED | +| edge:96cdb0d84bc00a09ceb5109e | postgresql:local/public/table//payments/ | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:98d3f4f0a67ad80a7f7ab0bd | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:9d307aea5e208abba7504fb0 | postgresql:local/public/trigger/customers/customers\_touch/ | postgresql:local/public/function//touch\_customer/ | trigger\_association | PARSED | +| edge:a642923dda75dbdc7098d8d7 | postgresql:local/public/table//order\_items/ | postgresql:local/public/table//products/ | foreign\_key | PARSED | +| edge:a666f589e93aa92ac58f69ea | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:a8578a71397a160629502a5d | postgresql:local/public/column/orders/customer\_id/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:a8bea9311b58d34372ee5943 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/orders/id/ | query\_reference | PARSED | +| edge:a9189d507b83265b33fafc29 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:aa1d9857feb03fc467ed1835 | postgresql:local/public/column/customer\_summary/order\_count/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:aa9343ef5c72a1e514641dc7 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:aac409ebab28c4f020bdeda0 | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:ac3cbd05c6a9226c89d527a4 | postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:ad680030f5a2e293affc3783 | postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:b3f2f89e86307ac919bd989c | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:bc0cecf27a9d335975ad3a49 | postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | postgresql:local/public/column/orders/total\_amount/ | expression\_reference | PARSED | +| edge:bd8703a71aa20f06a188f31a | postgresql:local/public/column/order\_items/product\_id/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:bdbb2b13e6ac09f5824bae43 | postgresql:local/public/column/order\_items/product\_id/ | postgresql:local/public/column/products/id/ | foreign\_key | PARSED | +| edge:bfd9cd55aaab90c4ed183b91 | postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | postgresql:local/public/column/addresses/id/ | expression\_reference | PARSED | +| edge:c0e890722d6fafc386c0e426 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:c65687c186e8bee9cb8c0471 | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:c7ba0696045c497301e52033 | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:c8311f0c1b599de8590f98cd | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:c97827f27d1098e9f3c77ea4 | postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:ca4029a75da40252e4498d21 | postgresql:local/public/column/payments/order\_id/ | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:ca848fa6534d7f92402c1a52 | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/column/order\_items/order\_id/ | expression\_reference | PARSED | +| edge:cc0012b67ac594d5d7bd6657 | postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:cddcdabaec4c64d86a5967e5 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:d1d2cc90cfc4e410bdc75cec | postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/column/products/sku/ | expression\_reference | PARSED | +| edge:d31da38e2ae27e8c7cfcd42f | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:d660558bd60070ae4acb636e | postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | postgresql:local/public/column/orders/id/ | expression\_reference | PARSED | +| edge:da05ef9838f3b40e481aa89b | postgresql:local/public/column/products/price/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:da43cc551d6ebd2502680372 | postgresql:local/public/column/products/id/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:dbfeb24560e06d8750f73f55 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | +| edge:e1747cefd339bbab7c6a304a | postgresql:local/public/table//orders/ | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:e247fcd60cd703bd273870d3 | postgresql:local/public/column/products/sku/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:e40e0e88abbd113de3a5fcd8 | postgresql:local/public/table//addresses/ | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:e4b95d06d0a70b8f382dfa23 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:e74e28ce9dd6823209b2030c | postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | postgresql:local/public/column/products/id/ | expression\_reference | PARSED | +| edge:ebd6536c72c75c6b3b067c27 | postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:eccc92a583473fdc12ea81af | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:f23585bc075e6bd84fb1a091 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/table//orders/ | query\_reference | PARSED | +| edge:f42877ab42b51eee114c1133 | postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/column/customers/email/ | expression\_reference | PARSED | +| edge:f4ce6b8bb9138d13271b58f2 | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:f5f65ed52b52a130866ae814 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | +| edge:fbc21659908e0ae2a5cd46ea | postgresql:local/public/column/orders/customer\_id/ | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:fdfb9eb03a5388bd20d49588 | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:ffb83430132bc8b5e521cc1e | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | + +## Evidence inventory + +| ID | Origin | Location | Hash | +|---|---|---|---| +| ev:3eff11898bac02d99ee08daf | sql\_file | examples/ecommerce/schema.sql:34-34 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:40680f826d95f1ec183340ed | sql\_file | examples/ecommerce/schema.sql:1-6 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:4f849d665202a664e7893d4a | sql\_file | examples/ecommerce/schema.sql:7-11 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:776d7da11045ee31e44912e0 | sql\_file | examples/ecommerce/schema.sql:45-46 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:7de9792a75dda688bf1f738f | sql\_file | examples/ecommerce/schema.sql:17-22 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:8dadc8fc9c511aafd4803a87 | sql\_file | examples/ecommerce/schema.sql:12-16 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:932595bbd8475c83626294de | migration\_diff | examples/ecommerce/migrations/003\_contract\_legacy\_id.sql:4-4 | sha256:312cd82ea52d1f6afd5b49d4dff0812fadc95d7f0b87a1250e2fd461a9687c2e | +| ev:b306c585df0ee00d863316dd | sql\_file | examples/ecommerce/schema.sql:23-28 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:c81447f17e11c2d5b6c401da | sql\_file | examples/ecommerce/schema.sql:35-38 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:e3fa1e6bfbfed48ae579bc40 | sql\_file | examples/ecommerce/schema.sql:29-33 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:e4dc7c3f3bcbc60c845f14b5 | application\_source | examples/ecommerce/app/customers.sql:1-1 | sha256:a415aaea7a68344c4f8c3e93fc4233772176a54a53c14c74541c2e512be81470 | +| ev:e9af3cfadad5d8900305d336 | sql\_file | examples/ecommerce/schema.sql:39-44 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:e9b2533c0430764b4a894410 | migration\_diff | examples/ecommerce/migrations/003\_contract\_legacy\_id.sql:3-3 | sha256:312cd82ea52d1f6afd5b49d4dff0812fadc95d7f0b87a1250e2fd461a9687c2e | +| ev:f8c7e18154ef774049bc8694 | application\_source | examples/ecommerce/app/orders.sql:1-2 | sha256:07ed8c193824ea5e25844e2be152acec7d04492c5b3d5ca9fbc55d2ee4e1421e | diff --git a/skills/database-dependency-migration/examples/rendered/ecommerce/review.json b/skills/database-dependency-migration/examples/rendered/ecommerce/review.json new file mode 100644 index 0000000..f37aafd --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/ecommerce/review.json @@ -0,0 +1,406 @@ +{ + "impacts": [ + { + "affected": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/column/addresses/customer_id/", + "postgresql:local/public/column/customer_summary/email/", + "postgresql:local/public/column/customer_summary/id/", + "postgresql:local/public/column/customer_summary/order_count/", + "postgresql:local/public/column/orders/customer_id/", + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/", + "postgresql:local/public/view//customer_summary/" + ], + "categories": { + "inferred": [], + "recorded_catalog": [], + "static_reference": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/column/addresses/customer_id/", + "postgresql:local/public/column/customer_summary/email/", + "postgresql:local/public/column/customer_summary/id/", + "postgresql:local/public/column/customer_summary/order_count/", + "postgresql:local/public/column/orders/customer_id/", + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/", + "postgresql:local/public/view//customer_summary/" + ] + }, + "direct": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/column/addresses/customer_id/", + "postgresql:local/public/column/orders/customer_id/", + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/view//customer_summary/" + ], + "explanation": "Reverse paths show potential impact. They do not prove execution failure or exhaustive runtime coverage.", + "operation": "AT_AlterColumnType", + "paths": { + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/": [ + "edge:a9189d507b83265b33fafc29" + ], + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/": [ + "edge:c0e890722d6fafc386c0e426" + ], + "postgresql:local/public/column/addresses/customer_id/": [ + "edge:6c3f2ed8788f2720c5aff75f" + ], + "postgresql:local/public/column/customer_summary/email/": [ + "edge:6e209e98877452de8f04385b", + "edge:aa9343ef5c72a1e514641dc7" + ], + "postgresql:local/public/column/customer_summary/id/": [ + "edge:8d3c400eda2590da824c965e", + "edge:aa9343ef5c72a1e514641dc7" + ], + "postgresql:local/public/column/customer_summary/order_count/": [ + "edge:aa1d9857feb03fc467ed1835", + "edge:aa9343ef5c72a1e514641dc7" + ], + "postgresql:local/public/column/orders/customer_id/": [ + "edge:fbc21659908e0ae2a5cd46ea" + ], + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4": [ + "edge:6b337fb6d4bfa4f999a1cc86" + ], + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422": [ + "edge:84d30a74505bc15546505d27" + ], + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4": [ + "edge:f4ce6b8bb9138d13271b58f2" + ], + "postgresql:local/public/index//orders_customer_idx/": [ + "edge:014fb6369ba96ca9ec2ffb6e", + "edge:fbc21659908e0ae2a5cd46ea" + ], + "postgresql:local/public/view//customer_summary/": [ + "edge:aa9343ef5c72a1e514641dc7" + ] + }, + "root": "postgresql:local/public/column/customers/id/", + "to": null, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:18505c245f165e4c93c709f8", + "object_id": "postgresql:local/public/column/orders/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5afc9281a8cd153100e8eb4f", + "object_id": "postgresql:local/public/column/products/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5ff30f718f152d8ea851b944", + "object_id": "postgresql:local/public/column/addresses/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "explanation": "Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL.", + "id": "unknown:69ffcfe1e4e57e6481af7368", + "object_id": "postgresql:local/public/function//touch_customer/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:8bea11811025af9e17a96a8e", + "object_id": "postgresql:local/public/column/customers/updated_at/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:9e847561e1fbe07255d98720", + "object_id": "postgresql:local/public/column/customers/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:eacbb533e2808e73f27dbf47", + "object_id": "postgresql:local/public/column/payments/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:f16dbb53af3ad137ed449c36", + "object_id": "postgresql:local/public/column/orders/created_at/", + "origin": "heuristic", + "status": "UNKNOWN" + } + ] + }, + { + "affected": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/column/customer_summary/email/", + "postgresql:local/public/column/customer_summary/id/", + "postgresql:local/public/column/customer_summary/order_count/", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/", + "postgresql:local/public/view//customer_summary/" + ], + "categories": { + "inferred": [], + "recorded_catalog": [], + "static_reference": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/column/customer_summary/email/", + "postgresql:local/public/column/customer_summary/id/", + "postgresql:local/public/column/customer_summary/order_count/", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/", + "postgresql:local/public/view//customer_summary/" + ] + }, + "direct": [ + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "postgresql:local/public/index//orders_customer_idx/", + "postgresql:local/public/view//customer_summary/" + ], + "explanation": "Reverse paths show potential impact. They do not prove execution failure or exhaustive runtime coverage.", + "operation": "AT_DropColumn", + "paths": { + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/": [ + "edge:898dfc1b3549f6fe9e1041ce" + ], + "postgresql:local/public/column/customer_summary/email/": [ + "edge:6e209e98877452de8f04385b", + "edge:5854677188c6ab1c841f33ed" + ], + "postgresql:local/public/column/customer_summary/id/": [ + "edge:8d3c400eda2590da824c965e", + "edge:5854677188c6ab1c841f33ed" + ], + "postgresql:local/public/column/customer_summary/order_count/": [ + "edge:aa1d9857feb03fc467ed1835", + "edge:5854677188c6ab1c841f33ed" + ], + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4": [ + "edge:2f87c0839429a4ab70f6577b" + ], + "postgresql:local/public/index//orders_customer_idx/": [ + "edge:014fb6369ba96ca9ec2ffb6e" + ], + "postgresql:local/public/view//customer_summary/": [ + "edge:5854677188c6ab1c841f33ed" + ] + }, + "root": "postgresql:local/public/column/orders/customer_id/", + "to": null, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:18505c245f165e4c93c709f8", + "object_id": "postgresql:local/public/column/orders/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5afc9281a8cd153100e8eb4f", + "object_id": "postgresql:local/public/column/products/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5ff30f718f152d8ea851b944", + "object_id": "postgresql:local/public/column/addresses/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "explanation": "Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL.", + "id": "unknown:69ffcfe1e4e57e6481af7368", + "object_id": "postgresql:local/public/function//touch_customer/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:8bea11811025af9e17a96a8e", + "object_id": "postgresql:local/public/column/customers/updated_at/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:9e847561e1fbe07255d98720", + "object_id": "postgresql:local/public/column/customers/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:eacbb533e2808e73f27dbf47", + "object_id": "postgresql:local/public/column/payments/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:f16dbb53af3ad137ed449c36", + "object_id": "postgresql:local/public/column/orders/created_at/", + "origin": "heuristic", + "status": "UNKNOWN" + } + ] + } + ], + "limitations": [ + "SQL is never executed. Baseline is not replayed into a target schema.", + "Runtime consumers, table statistics and deployment completion require independent evidence.", + "Phases are a review checklist, not target-specific executable migrations. Apply relevant phases to the supplied change and verify operational prerequisites." + ], + "metadata": { + "evidence_ids": [], + "origin": "user_supplied", + "status": "INFERRED", + "tables": {} + }, + "operations": [ + { + "evidence_ids": [ + "ev:e9b2533c0430764b4a894410" + ], + "object_id": "postgresql:local/public/column/customers/id/", + "operation": "AT_AlterColumnType" + }, + { + "evidence_ids": [ + "ev:932595bbd8475c83626294de" + ], + "object_id": "postgresql:local/public/column/orders/customer_id/", + "operation": "AT_DropColumn" + } + ], + "plan": [ + { + "action": "Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys.", + "phase": "expand", + "preconditions": "Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget.", + "recovery": "Stop deployment before consumers depend on the new fields; keep old fields available.", + "review_only": true, + "verification": "Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics." + }, + { + "action": "If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers.", + "phase": "backfill", + "preconditions": "Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling.", + "recovery": "Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure.", + "review_only": true, + "verification": "Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic." + }, + { + "action": "Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate.", + "phase": "validate", + "preconditions": "Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index.", + "recovery": "Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling.", + "review_only": true, + "verification": "Check constraint validation and pg_index.indisvalid/indisready, compare old/new results and observe lock waits." + }, + { + "action": "Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs.", + "phase": "transition", + "preconditions": "Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths.", + "recovery": "Revert application reads only while both representations remain consistent; otherwise prefer roll-forward.", + "review_only": true, + "verification": "Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage." + }, + { + "action": "Remove legacy objects only after verified transition and a separate destructive-change review.", + "phase": "contract", + "preconditions": "Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition.", + "recovery": "Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator.", + "review_only": true, + "verification": "Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime." + } + ], + "review_only": true, + "risk_level": "high", + "schema_version": "1.0.0" +} diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/graph.dot b/skills/database-dependency-migration/examples/rendered/high-traffic/graph.dot new file mode 100644 index 0000000..5aa912b --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/graph.dot @@ -0,0 +1,153 @@ +digraph dependencies { + // Source depends on target; reverse traversal gives impact + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" [label="application.\"examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5\""]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" [label="application.\"examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694\""]; + "postgresql:local/public/column/addresses/city/" [label="public.addresses.city"]; + "postgresql:local/public/column/addresses/customer_id/" [label="public.addresses.customer_id"]; + "postgresql:local/public/column/addresses/id/" [label="public.addresses.id"]; + "postgresql:local/public/column/customer_summary/email/" [label="public.customer_summary.email"]; + "postgresql:local/public/column/customer_summary/id/" [label="public.customer_summary.id"]; + "postgresql:local/public/column/customer_summary/order_count/" [label="public.customer_summary.order_count"]; + "postgresql:local/public/column/customers/email/" [label="public.customers.email"]; + "postgresql:local/public/column/customers/id/" [label="public.customers.id"]; + "postgresql:local/public/column/customers/name/" [label="public.customers.name"]; + "postgresql:local/public/column/customers/updated_at/" [label="public.customers.updated_at"]; + "postgresql:local/public/column/order_items/order_id/" [label="public.order_items.order_id"]; + "postgresql:local/public/column/order_items/product_id/" [label="public.order_items.product_id"]; + "postgresql:local/public/column/order_items/quantity/" [label="public.order_items.quantity"]; + "postgresql:local/public/column/orders/created_at/" [label="public.orders.created_at"]; + "postgresql:local/public/column/orders/customer_id/" [label="public.orders.customer_id"]; + "postgresql:local/public/column/orders/id/" [label="public.orders.id"]; + "postgresql:local/public/column/orders/total_amount/" [label="public.orders.total_amount"]; + "postgresql:local/public/column/payments/amount/" [label="public.payments.amount"]; + "postgresql:local/public/column/payments/id/" [label="public.payments.id"]; + "postgresql:local/public/column/payments/order_id/" [label="public.payments.order_id"]; + "postgresql:local/public/column/products/id/" [label="public.products.id"]; + "postgresql:local/public/column/products/price/" [label="public.products.price"]; + "postgresql:local/public/column/products/sku/" [label="public.products.sku"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" [label="public.addresses.addresses_customer_id_fkey"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" [label="public.addresses.addresses_pkey"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" [label="public.customers.customers_email_key"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" [label="public.customers.customers_pkey"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" [label="public.order_items.order_items_order_id_fkey"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" [label="public.order_items.order_items_pkey"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" [label="public.order_items.order_items_product_id_fkey"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" [label="public.order_items.order_items_quantity_check__485b310e0371"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" [label="public.orders.orders_customer_id_fkey"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" [label="public.orders.orders_pkey"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" [label="public.orders.orders_total_amount_check__8c94b42a7e78"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" [label="public.payments.payments_amount_check__2fbbb5aae972"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" [label="public.payments.payments_order_id_fkey"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" [label="public.payments.payments_pkey"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" [label="public.products.products_pkey"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" [label="public.products.products_price_check__a1bdfb6cc254"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" [label="public.products.products_sku_key"]; + "postgresql:local/public/function//touch_customer/" [label="public.touch_customer"]; + "postgresql:local/public/index//orders_customer_idx/" [label="public.orders_customer_idx"]; + "postgresql:local/public/table//addresses/" [label="public.addresses"]; + "postgresql:local/public/table//customers/" [label="public.customers"]; + "postgresql:local/public/table//order_items/" [label="public.order_items"]; + "postgresql:local/public/table//orders/" [label="public.orders"]; + "postgresql:local/public/table//payments/" [label="public.payments"]; + "postgresql:local/public/table//products/" [label="public.products"]; + "postgresql:local/public/trigger/customers/customers_touch/" [label="public.customers.customers_touch"]; + "postgresql:local/public/view//customer_summary/" [label="public.customer_summary"]; + "postgresql:local/public/index//orders_customer_idx/" -> "postgresql:local/public/column/orders/customer_id/" [label="expression_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/name/" [label="query_reference"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" -> "postgresql:local/public/column/order_items/quantity/" [label="expression_reference"]; + "postgresql:local/public/index//orders_customer_idx/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/orders/id/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/customers/updated_at/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/addresses/customer_id/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/column/order_items/product_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/column/addresses/id/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/column/order_items/product_id/" [label="expression_reference"]; + "postgresql:local/public/column/addresses/city/" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/orders/customer_id/" [label="expression_reference"]; + "postgresql:local/public/trigger/customers/customers_touch/" -> "postgresql:local/public/table//customers/" [label="trigger_association"]; + "postgresql:local/public/column/order_items/order_id/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/table//orders/" [label="query_reference"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/addresses/customer_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/payments/id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/amount/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/customers/email/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/customers/name/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/column/order_items/order_id/" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/column/products/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/orders/created_at/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" -> "postgresql:local/public/column/payments/amount/" [label="expression_reference"]; + "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/orders/customer_id/" [label="query_reference"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/order_items/order_id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/order_id/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/table//order_items/" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/column/addresses/customer_id/" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/column/customer_summary/email/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/orders/id/" [label="query_reference"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/payments/order_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/table//products/" [label="foreign_key"]; + "postgresql:local/public/column/customers/id/" -> "postgresql:local/public/table//customers/" [label="contains"]; + "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/customers/id/" [label="expression_reference"]; + "postgresql:local/public/column/payments/id/" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/column/orders/total_amount/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/orders/customer_id/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/column/customer_summary/id/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/public/column/order_items/quantity/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471" -> "postgresql:local/public/column/products/price/" [label="expression_reference"]; + "postgresql:local/public/table//payments/" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//orders/" [label="foreign_key"]; + "postgresql:local/public/trigger/customers/customers_touch/" -> "postgresql:local/public/function//touch_customer/" [label="trigger_association"]; + "postgresql:local/public/table//order_items/" -> "postgresql:local/public/table//products/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/column/orders/customer_id/" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/orders/id/" [label="query_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/column/customer_summary/order_count/" -> "postgresql:local/public/view//customer_summary/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//addresses/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" -> "postgresql:local/public/column/orders/total_amount/" [label="expression_reference"]; + "postgresql:local/public/column/order_items/product_id/" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/column/order_items/product_id/" -> "postgresql:local/public/column/products/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/addresses/id/" [label="expression_reference"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/customers/id/" [label="query_reference"]; + "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/column/payments/order_id/" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/column/order_items/order_id/" [label="expression_reference"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/column/products/sku/" [label="expression_reference"]; + "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04" -> "postgresql:local/public/table//order_items/" [label="contains"]; + "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/orders/id/" [label="expression_reference"]; + "postgresql:local/public/column/products/price/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/column/products/id/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; + "postgresql:local/public/table//orders/" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/public/column/products/sku/" -> "postgresql:local/public/table//products/" [label="contains"]; + "postgresql:local/public/table//addresses/" -> "postgresql:local/public/table//customers/" [label="foreign_key"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/column/customers/email/" [label="query_reference"]; + "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422" -> "postgresql:local/public/column/products/id/" [label="expression_reference"]; + "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422" -> "postgresql:local/public/table//payments/" [label="contains"]; + "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" -> "postgresql:local/public/column/orders/id/" [label="foreign_key"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/table//orders/" [label="query_reference"]; + "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7" -> "postgresql:local/public/column/customers/email/" [label="expression_reference"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; + "postgresql:local/public/column/orders/customer_id/" -> "postgresql:local/public/column/customers/id/" [label="foreign_key"]; + "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" -> "postgresql:local/public/table//orders/" [label="contains"]; + "postgresql:local/public/view//customer_summary/" -> "postgresql:local/public/table//customers/" [label="query_reference"]; +} diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/graph.mmd b/skills/database-dependency-migration/examples/rendered/high-traffic/graph.mmd new file mode 100644 index 0000000..ae0367c --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/graph.mmd @@ -0,0 +1,152 @@ +flowchart LR + %% Source depends on target; traverse reverse for impact + n0["application."examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5""] + n1["application."examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694""] + n2["public.addresses.city"] + n3["public.addresses.customer_id"] + n4["public.addresses.id"] + n5["public.customer_summary.email"] + n6["public.customer_summary.id"] + n7["public.customer_summary.order_count"] + n8["public.customers.email"] + n9["public.customers.id"] + n10["public.customers.name"] + n11["public.customers.updated_at"] + n12["public.order_items.order_id"] + n13["public.order_items.product_id"] + n14["public.order_items.quantity"] + n15["public.orders.created_at"] + n16["public.orders.customer_id"] + n17["public.orders.id"] + n18["public.orders.total_amount"] + n19["public.payments.amount"] + n20["public.payments.id"] + n21["public.payments.order_id"] + n22["public.products.id"] + n23["public.products.price"] + n24["public.products.sku"] + n25["public.addresses.addresses_customer_id_fkey"] + n26["public.addresses.addresses_pkey"] + n27["public.customers.customers_email_key"] + n28["public.customers.customers_pkey"] + n29["public.order_items.order_items_order_id_fkey"] + n30["public.order_items.order_items_pkey"] + n31["public.order_items.order_items_product_id_fkey"] + n32["public.order_items.order_items_quantity_check__485b310e0371"] + n33["public.orders.orders_customer_id_fkey"] + n34["public.orders.orders_pkey"] + n35["public.orders.orders_total_amount_check__8c94b42a7e78"] + n36["public.payments.payments_amount_check__2fbbb5aae972"] + n37["public.payments.payments_order_id_fkey"] + n38["public.payments.payments_pkey"] + n39["public.products.products_pkey"] + n40["public.products.products_price_check__a1bdfb6cc254"] + n41["public.products.products_sku_key"] + n42["public.touch_customer"] + n43["public.orders_customer_idx"] + n44["public.addresses"] + n45["public.customers"] + n46["public.order_items"] + n47["public.orders"] + n48["public.payments"] + n49["public.products"] + n50["public.customers.customers_touch"] + n51["public.customer_summary"] + n43 -->|expression_reference| n16 + n0 -->|query_reference| n10 + n32 -->|expression_reference| n14 + n43 -->|contains| n47 + n17 -->|contains| n47 + n11 -->|contains| n45 + n3 -->|contains| n44 + n30 -->|expression_reference| n13 + n26 -->|contains| n44 + n51 -->|query_reference| n8 + n4 -->|contains| n44 + n31 -->|expression_reference| n13 + n2 -->|contains| n44 + n33 -->|expression_reference| n16 + n50 -->|trigger_association| n45 + n12 -->|contains| n46 + n1 -->|query_reference| n47 + n25 -->|expression_reference| n3 + n27 -->|contains| n45 + n38 -->|expression_reference| n20 + n19 -->|contains| n48 + n8 -->|contains| n45 + n10 -->|contains| n45 + n12 -->|foreign_key| n17 + n35 -->|contains| n47 + n31 -->|foreign_key| n22 + n37 -->|contains| n48 + n15 -->|contains| n47 + n36 -->|expression_reference| n19 + n36 -->|contains| n48 + n51 -->|query_reference| n16 + n37 -->|foreign_key| n47 + n29 -->|expression_reference| n12 + n21 -->|contains| n48 + n46 -->|foreign_key| n47 + n25 -->|foreign_key| n9 + n3 -->|foreign_key| n9 + n5 -->|contains| n51 + n1 -->|query_reference| n17 + n37 -->|expression_reference| n21 + n28 -->|contains| n45 + n31 -->|foreign_key| n49 + n9 -->|contains| n45 + n28 -->|expression_reference| n9 + n20 -->|contains| n48 + n18 -->|contains| n47 + n1 -->|query_reference| n16 + n40 -->|contains| n49 + n6 -->|contains| n51 + n14 -->|contains| n46 + n40 -->|expression_reference| n23 + n48 -->|foreign_key| n47 + n29 -->|foreign_key| n47 + n50 -->|trigger_association| n42 + n46 -->|foreign_key| n49 + n33 -->|foreign_key| n45 + n16 -->|contains| n47 + n51 -->|query_reference| n17 + n0 -->|query_reference| n9 + n7 -->|contains| n51 + n51 -->|query_reference| n9 + n29 -->|contains| n46 + n39 -->|contains| n49 + n32 -->|contains| n46 + n25 -->|contains| n44 + n35 -->|expression_reference| n18 + n13 -->|contains| n46 + n13 -->|foreign_key| n22 + n26 -->|expression_reference| n4 + n1 -->|query_reference| n9 + n25 -->|foreign_key| n45 + n37 -->|foreign_key| n17 + n31 -->|contains| n46 + n34 -->|contains| n47 + n21 -->|foreign_key| n17 + n30 -->|expression_reference| n12 + n41 -->|contains| n49 + n0 -->|query_reference| n8 + n41 -->|expression_reference| n24 + n30 -->|contains| n46 + n34 -->|expression_reference| n17 + n23 -->|contains| n49 + n22 -->|contains| n49 + n0 -->|query_reference| n45 + n47 -->|foreign_key| n45 + n24 -->|contains| n49 + n44 -->|foreign_key| n45 + n1 -->|query_reference| n8 + n39 -->|expression_reference| n22 + n38 -->|contains| n48 + n29 -->|foreign_key| n17 + n51 -->|query_reference| n47 + n27 -->|expression_reference| n8 + n33 -->|foreign_key| n9 + n1 -->|query_reference| n45 + n16 -->|foreign_key| n9 + n33 -->|contains| n47 + n51 -->|query_reference| n45 diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/model.dbdep.json b/skills/database-dependency-migration/examples/rendered/high-traffic/model.dbdep.json new file mode 100644 index 0000000..468d220 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/model.dbdep.json @@ -0,0 +1,2932 @@ +{ + "coverage": { + "capabilities": [ + "ddl_ast", + "simple_sql_references", + "reverse_dependencies" + ], + "catalog_available": false, + "exhaustive": false, + "repository_scan": true, + "unresolved": 8 + }, + "edges": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:014fb6369ba96ca9ec2ffb6e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/index//orders_customer_idx/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:0d63cdfda898dda0d0ad8205", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/name/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:0fd89a08c8cb49371591999e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/quantity/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:122fa6ad729c390103dc691f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/index//orders_customer_idx/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:18a94627aae399dfc7524ec3", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1a413343114cc7a6e07d44c2", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/updated_at/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1aa24304fac7db22fadbc3a2", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:1d9d0976df3698a0baab6d4f", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/product_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:21f46e17cc79c2dc179c60b7", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:24a25eea6c256af13096b2d4", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2b4a327b2a480706c0fa842d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2d6b9ecfcf9878d978cd8602", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/product_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2eddcbe6246a409f53fb05a8", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/addresses/city/", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2f87c0839429a4ab70f6577b", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:2fc82a466cea94afdf966e07", + "kind": "trigger_association", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/trigger/customers/customers_touch/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:31b516307eef6dd0a3d257d6", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3d411ea3b817ba78d8239733", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3e7919197cdfba064bae5dee", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/addresses/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:3f36d958c1a16f4f5063977f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4288ed89833d0022c1d54d05", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:42b516772ae0c490fc62e11c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/amount/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:44748c81a94abde3f9f756c1", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/email/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:449d080bde5028b829fd281a", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/name/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4852fede4511dce0fbc8a7af", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/column/order_items/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:493a5da95d3bdaadae7e03fb", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:4c6e6857c89ea809b31a3996", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:535a1452c20c4f6274bc02e5", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5402d78cd2ee1aefae55d740", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/created_at/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:57783f8cc3c12381d5a1b58e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:57d138471f7e225c7e01d90c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:5854677188c6ab1c841f33ed", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:60a259d4dc6d48cdf764e46f", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:612709d82e5f92d0eb08603a", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:62a5bb71cf88a0ebc61e744d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:62fcf75c3913fb26cc394149", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "order_id" + ], + "constraint": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/table//order_items/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6b337fb6d4bfa4f999a1cc86", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6c3f2ed8788f2720c5aff75f", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/column/addresses/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:6e209e98877452de8f04385b", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/email/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:75fa9aa95ba7b9d956e76660", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7925f99039a93219e51926db", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/payments/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7c94d6184e2c7e444f2c9312", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:7f3b931f78bdeb022b90e8ba", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:80ea424e44ca67d3c85bc3c5", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customers/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:84d30a74505bc15546505d27", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:874d99945657054a80df9f02", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/payments/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:888273ce7767cc3e55291871", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/total_amount/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:898dfc1b3549f6fe9e1041ce", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/customer_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8a9ad2f29f72dd1a1af8587d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:8d3c400eda2590da824c965e", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/id/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:9001b115d6c5c48b4b5718ff", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/quantity/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:90c8c74b3403895629e680da", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "status": "PARSED", + "target": "postgresql:local/public/column/products/price/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:96cdb0d84bc00a09ceb5109e", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "order_id" + ], + "constraint": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/table//payments/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:98d3f4f0a67ad80a7f7ab0bd", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:9d307aea5e208abba7504fb0", + "kind": "trigger_association", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/trigger/customers/customers_touch/", + "status": "PARSED", + "target": "postgresql:local/public/function//touch_customer/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a642923dda75dbdc7098d8d7", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "product_id" + ], + "constraint": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" + }, + "source": "postgresql:local/public/table//order_items/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a666f589e93aa92ac58f69ea", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a8578a71397a160629502a5d", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/orders/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a8bea9311b58d34372ee5943", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:a9189d507b83265b33fafc29", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aa1d9857feb03fc467ed1835", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/customer_summary/order_count/", + "status": "PARSED", + "target": "postgresql:local/public/view//customer_summary/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aa9343ef5c72a1e514641dc7", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:aac409ebab28c4f020bdeda0", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ac3cbd05c6a9226c89d527a4", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ad680030f5a2e293affc3783", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:b3f2f89e86307ac919bd989c", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//addresses/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bc0cecf27a9d335975ad3a49", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/total_amount/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bd8703a71aa20f06a188f31a", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/order_items/product_id/", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bdbb2b13e6ac09f5824bae43", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e" + }, + "source": "postgresql:local/public/column/order_items/product_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:bfd9cd55aaab90c4ed183b91", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/addresses/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c0e890722d6fafc386c0e426", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c65687c186e8bee9cb8c0471", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c7ba0696045c497301e52033", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c8311f0c1b599de8590f98cd", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:c97827f27d1098e9f3c77ea4", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ca4029a75da40252e4498d21", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14" + }, + "source": "postgresql:local/public/column/payments/order_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ca848fa6534d7f92402c1a52", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/column/order_items/order_id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:cc0012b67ac594d5d7bd6657", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:cddcdabaec4c64d86a5967e5", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d1d2cc90cfc4e410bdc75cec", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/column/products/sku/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d31da38e2ae27e8c7cfcd42f", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "status": "PARSED", + "target": "postgresql:local/public/table//order_items/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:d660558bd60070ae4acb636e", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:da05ef9838f3b40e481aa89b", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/price/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:da43cc551d6ebd2502680372", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/id/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:dbfeb24560e06d8750f73f55", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e1747cefd339bbab7c6a304a", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "customer_id" + ], + "constraint": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/table//orders/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e247fcd60cd703bd273870d3", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/column/products/sku/", + "status": "PARSED", + "target": "postgresql:local/public/table//products/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e40e0e88abbd113de3a5fcd8", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "columns": [ + "customer_id" + ], + "constraint": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/table//addresses/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e4b95d06d0a70b8f382dfa23", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:e74e28ce9dd6823209b2030c", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/column/products/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ebd6536c72c75c6b3b067c27", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "status": "PARSED", + "target": "postgresql:local/public/table//payments/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:eccc92a583473fdc12ea81af", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "status": "PARSED", + "target": "postgresql:local/public/column/orders/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f23585bc075e6bd84fb1a091", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f42877ab42b51eee114c1133", + "kind": "expression_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/email/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f4ce6b8bb9138d13271b58f2", + "kind": "foreign_key", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:f5f65ed52b52a130866ae814", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:fbc21659908e0ae2a5cd46ea", + "kind": "foreign_key", + "origin": "sql_file", + "properties": { + "constraint": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4" + }, + "source": "postgresql:local/public/column/orders/customer_id/", + "status": "PARSED", + "target": "postgresql:local/public/column/customers/id/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:fdfb9eb03a5388bd20d49588", + "kind": "contains", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "status": "PARSED", + "target": "postgresql:local/public/table//orders/" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "explanation": "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + "id": "edge:ffb83430132bc8b5e521cc1e", + "kind": "query_reference", + "origin": "sql_file", + "properties": {}, + "source": "postgresql:local/public/view//customer_summary/", + "status": "PARSED", + "target": "postgresql:local/public/table//customers/" + } + ], + "engine": { + "name": "postgresql", + "source_mode": "offline_ddl", + "version": "18" + }, + "evidence": [ + { + "byte_length": 6, + "byte_start": 219, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:1300e87731793115ceb87783", + "line_end": 5, + "line_start": 5, + "origin": "migration_diff", + "path": "examples/high-traffic/migrations/007.sql", + "source_hash": "sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b", + "status": "PARSED" + }, + { + "byte_length": 62, + "byte_start": 1231, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:3eff11898bac02d99ee08daf", + "line_end": 34, + "line_start": 34, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 191, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:40680f826d95f1ec183340ed", + "line_end": 6, + "line_start": 1, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 175, + "byte_start": 193, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:4f849d665202a664e7893d4a", + "line_end": 11, + "line_start": 7, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 73, + "byte_start": 62, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:551306041c228ae54da88290", + "line_end": 2, + "line_start": 2, + "origin": "migration_diff", + "path": "examples/high-traffic/migrations/007.sql", + "source_hash": "sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b", + "status": "PARSED" + }, + { + "byte_length": 0, + "byte_start": 0, + "confidence": "direct", + "explanation": "User-supplied operational scenario, not discovered measurements. Free-form explanation is hashed only.", + "id": "ev:5fb078138cefc22bce2fcef9", + "line_end": 1, + "line_start": 1, + "origin": "user_supplied", + "path": "user-metadata", + "source_hash": "sha256:438abb43ce671eaa2d4fc0e8d95e4c2931b3194707d7ff9c14edac4d5032c914", + "status": "INFERRED" + }, + { + "byte_length": 118, + "byte_start": 1614, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:776d7da11045ee31e44912e0", + "line_end": 46, + "line_start": 45, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 264, + "byte_start": 540, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:7de9792a75dda688bf1f738f", + "line_end": 22, + "line_start": 17, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 168, + "byte_start": 370, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:8dadc8fc9c511aafd4803a87", + "line_end": 16, + "line_start": 12, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 5, + "byte_start": 137, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:91db41ab80f56bfbfc4da0f0", + "line_end": 3, + "line_start": 3, + "origin": "migration_diff", + "path": "examples/high-traffic/migrations/007.sql", + "source_hash": "sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b", + "status": "PARSED" + }, + { + "byte_length": 222, + "byte_start": 806, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:b306c585df0ee00d863316dd", + "line_end": 28, + "line_start": 23, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 184, + "byte_start": 1295, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:c81447f17e11c2d5b6c401da", + "line_end": 38, + "line_start": 35, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 60, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:dcedb83e305f10addb8f3fe7", + "line_end": 1, + "line_start": 1, + "origin": "migration_diff", + "path": "examples/high-traffic/migrations/007.sql", + "source_hash": "sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b", + "status": "PARSED" + }, + { + "byte_length": 199, + "byte_start": 1030, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e3fa1e6bfbfed48ae579bc40", + "line_end": 33, + "line_start": 29, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 71, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e4dc7c3f3bcbc60c845f14b5", + "line_end": 1, + "line_start": 1, + "origin": "application_source", + "path": "examples/ecommerce/app/customers.sql", + "source_hash": "sha256:a415aaea7a68344c4f8c3e93fc4233772176a54a53c14c74541c2e512be81470", + "status": "PARSED" + }, + { + "byte_length": 131, + "byte_start": 1481, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:e9af3cfadad5d8900305d336", + "line_end": 44, + "line_start": 39, + "origin": "sql_file", + "path": "examples/ecommerce/schema.sql", + "source_hash": "sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d", + "status": "PARSED" + }, + { + "byte_length": 73, + "byte_start": 144, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:f5f5e93f642715781126c9c2", + "line_end": 4, + "line_start": 4, + "origin": "migration_diff", + "path": "examples/high-traffic/migrations/007.sql", + "source_hash": "sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b", + "status": "PARSED" + }, + { + "byte_length": 120, + "byte_start": 0, + "confidence": "direct", + "explanation": "Syntax establishes a static reference, not runtime reachability.", + "id": "ev:f8c7e18154ef774049bc8694", + "line_end": 2, + "line_start": 1, + "origin": "application_source", + "path": "examples/ecommerce/app/orders.sql", + "source_hash": "sha256:07ed8c193824ea5e25844e2be152acec7d04492c5b3d5ca9fbc55d2ee4e1421e", + "status": "PARSED" + } + ], + "findings": [ + { + "confidence": "conditional", + "evidence": [ + "ev:551306041c228ae54da88290" + ], + "evidence_ids": [ + "ev:551306041c228ae54da88290" + ], + "id": "finding:0ea66c21e46700e8de9703bd", + "object_ids": [ + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" + ], + "origin": "migration_diff", + "reason": "Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds.", + "remediation": "Rebuild or transition affected objects with verified order and constraint validation.", + "risk_dimensions": [ + "compatibility", + "deployment_order" + ], + "risk_level": "high", + "rule_id": "DDM014", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence": [ + "ev:f5f5e93f642715781126c9c2" + ], + "evidence_ids": [ + "ev:f5f5e93f642715781126c9c2" + ], + "id": "finding:61f2a716d49ea583a4524bbf", + "object_ids": [], + "origin": "migration_diff", + "reason": "CREATE INDEX CONCURRENTLY is forbidden inside a transaction block, including an externally declared single-transaction runner.", + "remediation": "Run the reviewed concurrent index operation outside transaction blocks; inspect invalid-index aftermath on failure.", + "risk_dimensions": [ + "deployment_order", + "locking" + ], + "risk_level": "high", + "rule_id": "DDM006", + "severity": "error", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:dcedb83e305f10addb8f3fe7" + ], + "evidence_ids": [ + "ev:dcedb83e305f10addb8f3fe7" + ], + "id": "finding:b2c6ce04fbdf286d25f7cfc3", + "object_ids": [ + "postgresql:local/public/table//orders/" + ], + "origin": "migration_diff", + "reason": "Regular CREATE INDEX takes SHARE lock and blocks writes. Impact depends on table size, workload and lock waits; no duration is predicted.", + "remediation": "Consider CREATE INDEX CONCURRENTLY outside transaction blocks; check version/partition restrictions and invalid indexes.", + "risk_dimensions": [ + "locking" + ], + "risk_level": "medium", + "rule_id": "DDM005", + "severity": "warning", + "status": "PARSED" + }, + { + "confidence": "conditional", + "evidence": [ + "ev:551306041c228ae54da88290" + ], + "evidence_ids": [ + "ev:551306041c228ae54da88290" + ], + "id": "finding:e8c62af5af6d801991d01b20", + "object_ids": [ + "postgresql:local/public/column/orders/total_amount/" + ], + "origin": "migration_diff", + "reason": "Type transition numeric(12,2) to float8. Conversion compatibility requires type/cast and data verification. PostgreSQL 18 ALTER COLUMN TYPE generally takes ACCESS EXCLUSIVE; rewrite/index rebuild depends on cast, typmod and USING expression. Rewrite and lock duration are conditional.", + "remediation": "Design and verify a mapping/replacement column. Check USING, defaults, FKs, views, indexes and actual cast support in a disposable database.", + "risk_dimensions": [ + "compatibility", + "locking", + "rewrite" + ], + "risk_level": "high", + "rule_id": "DDM002", + "severity": "error", + "status": "PARSED" + } + ], + "nodes": [ + { + "confidence": "direct", + "evidence_ids": [ + "ev:e4dc7c3f3bcbc60c845f14b5" + ], + "id": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/", + "kind": "query", + "name": "examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5", + "origin": "application_source", + "parent": "", + "properties": { + "query_type": "SelectStmt" + }, + "qualified_name": "application.\"examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5\"", + "schema": "application", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:f8c7e18154ef774049bc8694" + ], + "id": "postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/", + "kind": "query", + "name": "examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694", + "origin": "application_source", + "parent": "", + "properties": { + "query_type": "SelectStmt" + }, + "qualified_name": "application.\"examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694\"", + "schema": "application", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/city/", + "kind": "column", + "name": "city", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:f08b4647711f741de68a6c097e6f853a74c01c4504f6eed2bf39c4ccd9a2d2d3", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.addresses.city", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/customer_id/", + "kind": "column", + "name": "customer_id", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:c39228203e96db2b8f215085f7140c92c27add8b2fb53c8535a7d66dbdf26695", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.addresses.customer_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/column/addresses/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.addresses.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/email/", + "kind": "column", + "name": "email", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:66ea6bf2c488f1e2b3c2ac21ecee8d8370033b025b59c8c9b3bb9c2fa0c21a1a", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.email", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:49c0c7d706e779884f4363cb3ee005ca55369ea38d969fcdfc75876128460501", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/column/customer_summary/order_count/", + "kind": "column", + "name": "order_count", + "origin": "sql_file", + "parent": "customer_summary", + "properties": { + "definition_hash": "sha256:d84fb59976dfbac1825a1b0308511edf1748625f1bb8522042ad115c5fd6fdea", + "nullable": true, + "type": "" + }, + "qualified_name": "public.customer_summary.order_count", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/email/", + "kind": "column", + "name": "email", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:137b050c4a5fcfe348bc515063a2634f1d673100246fc37ebef150a8a8bc0ff7", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.customers.email", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.customers.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/name/", + "kind": "column", + "name": "name", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:1e03ec01f5d19a6bbd1b0f7957b8ea19189cc72e9c15f59a5b5d67d0d22f036d", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.customers.name", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/column/customers/updated_at/", + "kind": "column", + "name": "updated_at", + "origin": "sql_file", + "parent": "customers", + "properties": { + "default": "sha256:8e2094a132c5ca7401619f31b664c568d4fa6a6f6548e2c7e79a2756e154215a", + "definition_hash": "sha256:4134ad4f3a994aff6d436bf6e4329672515896b0977f7dbf2d30ebe930aefa87", + "nullable": false, + "type": "timestamptz" + }, + "qualified_name": "public.customers.updated_at", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/order_id/", + "kind": "column", + "name": "order_id", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:51db3ae41e544385c616bcfa177cd75905d120f72fca4bc4b5a9710b3eac30da", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.order_items.order_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/product_id/", + "kind": "column", + "name": "product_id", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:ff6902b4bb96c519432cce2b2de806bc82c62b4efb355f67108bccc2f890640a", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.order_items.product_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/column/order_items/quantity/", + "kind": "column", + "name": "quantity", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "definition_hash": "sha256:1d91d3b7f5c391ff0f57184ae9efd6e06247a3661d2414848c98dc6832ab2834", + "nullable": false, + "type": "int4" + }, + "qualified_name": "public.order_items.quantity", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/created_at/", + "kind": "column", + "name": "created_at", + "origin": "sql_file", + "parent": "orders", + "properties": { + "default": "sha256:8e2094a132c5ca7401619f31b664c568d4fa6a6f6548e2c7e79a2756e154215a", + "definition_hash": "sha256:256ff2ee5a0bd607cbfc4d481a0529aa37ee8b3c905052a7c52c018df867e584", + "nullable": false, + "type": "timestamptz" + }, + "qualified_name": "public.orders.created_at", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/customer_id/", + "kind": "column", + "name": "customer_id", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:c39228203e96db2b8f215085f7140c92c27add8b2fb53c8535a7d66dbdf26695", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.orders.customer_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.orders.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/column/orders/total_amount/", + "kind": "column", + "name": "total_amount", + "origin": "sql_file", + "parent": "orders", + "properties": { + "definition_hash": "sha256:057f194f15b4ffa477b37d8f3bcf98d675b6ea05f0d05515695e16e1e6bffc13", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.orders.total_amount", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/amount/", + "kind": "column", + "name": "amount", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:b292d1afe6633b88dd524d5e1484f9db97f6bb46707d91ef73d3ef7712a94271", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.payments.amount", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.payments.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/column/payments/order_id/", + "kind": "column", + "name": "order_id", + "origin": "sql_file", + "parent": "payments", + "properties": { + "definition_hash": "sha256:4a51ca6377aa9cd5c5ac4788994569a39b17ab6e4ab074d339389b98ef939eef", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.payments.order_id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/id/", + "kind": "column", + "name": "id", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:2814c4710c8164390073593d66ed870d08a2112eb28c1455a0f252754bd4cac8", + "identity": "sha256:970849dc6bb4bf7555e927881f2be02618b27020f51a9864235a907b53da2864", + "nullable": false, + "type": "int8" + }, + "qualified_name": "public.products.id", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/price/", + "kind": "column", + "name": "price", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:2357e448da6873b42c07bf6821c09096aa13e811a8b9d0645d2e0c46e8197b1b", + "nullable": false, + "type": "numeric(12,2)" + }, + "qualified_name": "public.products.price", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/column/products/sku/", + "kind": "column", + "name": "sku", + "origin": "sql_file", + "parent": "products", + "properties": { + "definition_hash": "sha256:10f6445cf9f0d00a4b80aa8cc89056203227ab042cc87e8eff7f7ddd94afdd03", + "nullable": false, + "type": "text" + }, + "qualified_name": "public.products.sku", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/constraint/addresses/addresses_customer_id_fkey/884466556956c633a5c8fcd4", + "kind": "constraint", + "name": "addresses_customer_id_fkey", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "columns": [ + "customer_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:884466556956c633a5c8fcd4799d4aeac8643f8b8f4fb66427b4b437481879c4", + "name_inferred": true + }, + "qualified_name": "public.addresses.addresses_customer_id_fkey", + "schema": "public", + "signature": "884466556956c633a5c8fcd4", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/constraint/addresses/addresses_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "addresses_pkey", + "origin": "sql_file", + "parent": "addresses", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.addresses.addresses_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/constraint/customers/customers_email_key/30ba9a81fb7ea6ec9ff167f7", + "kind": "constraint", + "name": "customers_email_key", + "origin": "sql_file", + "parent": "customers", + "properties": { + "columns": [ + "email" + ], + "constraint_type": "unique", + "definition_hash": "sha256:30ba9a81fb7ea6ec9ff167f700ff6645f7a64c25d44fe35747c072bd9733974f", + "name_inferred": true + }, + "qualified_name": "public.customers.customers_email_key", + "schema": "public", + "signature": "30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/constraint/customers/customers_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "customers_pkey", + "origin": "sql_file", + "parent": "customers", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.customers.customers_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_order_id_fkey/1ef74bdedf741fe887a86e14", + "kind": "constraint", + "name": "order_items_order_id_fkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "order_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:1ef74bdedf741fe887a86e145fcd8edf53dcb516e17a8fb3b02c4bd9eb3e6815", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_order_id_fkey", + "schema": "public", + "signature": "1ef74bdedf741fe887a86e14", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_pkey/0f66fa763c977cd394d53f04", + "kind": "constraint", + "name": "order_items_pkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "order_id", + "product_id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:0f66fa763c977cd394d53f0420f2b7b60ba0db3bd7820e8e4193d15351f15589", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_pkey", + "schema": "public", + "signature": "0f66fa763c977cd394d53f04", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_product_id_fkey/4f7950eb41a49d97e2c7146e", + "kind": "constraint", + "name": "order_items_product_id_fkey", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "product_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:4f7950eb41a49d97e2c7146e5dca493da458f09a1887359bfdcb6d2ce4544bcc", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_product_id_fkey", + "schema": "public", + "signature": "4f7950eb41a49d97e2c7146e", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/constraint/order_items/order_items_quantity_check__485b310e0371/485b310e03717749fd366756", + "kind": "constraint", + "name": "order_items_quantity_check__485b310e0371", + "origin": "sql_file", + "parent": "order_items", + "properties": { + "columns": [ + "quantity" + ], + "constraint_type": "check", + "definition_hash": "sha256:485b310e03717749fd3667563af2e7c4e56277a8aacbf380725a9369c203ee69", + "name_inferred": true + }, + "qualified_name": "public.order_items.order_items_quantity_check__485b310e0371", + "schema": "public", + "signature": "485b310e03717749fd366756", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_customer_id_fkey/884466556956c633a5c8fcd4", + "kind": "constraint", + "name": "orders_customer_id_fkey", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "customer_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:884466556956c633a5c8fcd4799d4aeac8643f8b8f4fb66427b4b437481879c4", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_customer_id_fkey", + "schema": "public", + "signature": "884466556956c633a5c8fcd4", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "orders_pkey", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba", + "kind": "constraint", + "name": "orders_total_amount_check__8c94b42a7e78", + "origin": "sql_file", + "parent": "orders", + "properties": { + "columns": [ + "total_amount" + ], + "constraint_type": "check", + "definition_hash": "sha256:8c94b42a7e78904691546dba808f1c7031d09def28d0edf7e5631c7dc0362c2d", + "name_inferred": true + }, + "qualified_name": "public.orders.orders_total_amount_check__8c94b42a7e78", + "schema": "public", + "signature": "8c94b42a7e78904691546dba", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_amount_check__2fbbb5aae972/2fbbb5aae972c43b3e1ddb51", + "kind": "constraint", + "name": "payments_amount_check__2fbbb5aae972", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "amount" + ], + "constraint_type": "check", + "definition_hash": "sha256:2fbbb5aae972c43b3e1ddb511934de05abe0e1e0163d5766ba8346e162aac7b1", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_amount_check__2fbbb5aae972", + "schema": "public", + "signature": "2fbbb5aae972c43b3e1ddb51", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_order_id_fkey/1ef74bdedf741fe887a86e14", + "kind": "constraint", + "name": "payments_order_id_fkey", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "order_id" + ], + "constraint_type": "foreign_key", + "definition_hash": "sha256:1ef74bdedf741fe887a86e145fcd8edf53dcb516e17a8fb3b02c4bd9eb3e6815", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_order_id_fkey", + "schema": "public", + "signature": "1ef74bdedf741fe887a86e14", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/constraint/payments/payments_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "payments_pkey", + "origin": "sql_file", + "parent": "payments", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.payments.payments_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_pkey/62676e56159a610040517422", + "kind": "constraint", + "name": "products_pkey", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "id" + ], + "constraint_type": "primary_key", + "definition_hash": "sha256:62676e56159a6100405174223116bad9567b0c9cfa971186e6f4848555f723ae", + "name_inferred": true + }, + "qualified_name": "public.products.products_pkey", + "schema": "public", + "signature": "62676e56159a610040517422", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_price_check__a1bdfb6cc254/a1bdfb6cc254d41061cec471", + "kind": "constraint", + "name": "products_price_check__a1bdfb6cc254", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "price" + ], + "constraint_type": "check", + "definition_hash": "sha256:a1bdfb6cc254d41061cec4716594eab5693d635a51376961f9c38d5cd0fe1a14", + "name_inferred": true + }, + "qualified_name": "public.products.products_price_check__a1bdfb6cc254", + "schema": "public", + "signature": "a1bdfb6cc254d41061cec471", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/constraint/products/products_sku_key/30ba9a81fb7ea6ec9ff167f7", + "kind": "constraint", + "name": "products_sku_key", + "origin": "sql_file", + "parent": "products", + "properties": { + "columns": [ + "sku" + ], + "constraint_type": "unique", + "definition_hash": "sha256:30ba9a81fb7ea6ec9ff167f700ff6645f7a64c25d44fe35747c072bd9733974f", + "name_inferred": true + }, + "qualified_name": "public.products.products_sku_key", + "schema": "public", + "signature": "30ba9a81fb7ea6ec9ff167f7", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "id": "postgresql:local/public/function//touch_customer/", + "kind": "function", + "name": "touch_customer", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:69788d99ee54b34da61bcda504b3d00f44297888828d434f875fcccd212a12bc" + }, + "qualified_name": "public.touch_customer", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:3eff11898bac02d99ee08daf" + ], + "id": "postgresql:local/public/index//orders_customer_idx/", + "kind": "index", + "name": "orders_customer_idx", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:d756ef818809be11f2ee04e3eb1fff93110159c327f567b050f9f65de80dc738" + }, + "qualified_name": "public.orders_customer_idx", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "id": "postgresql:local/public/table//addresses/", + "kind": "table", + "name": "addresses", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:9c145553e656fe8efd771936eac30f6b3cff418e8897302f418389562756c435" + }, + "qualified_name": "public.addresses", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "id": "postgresql:local/public/table//customers/", + "kind": "table", + "name": "customers", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:8ba1a04f5b65f1a8a0377e13fd1d70616cd2a2f3fa939ac2089e2c05767cc559" + }, + "qualified_name": "public.customers", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:b306c585df0ee00d863316dd" + ], + "id": "postgresql:local/public/table//order_items/", + "kind": "table", + "name": "order_items", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:6f8b284ed2f016fb55a7ff04ea23ad7b91d781cb2bdf00e1391cb0b254210859" + }, + "qualified_name": "public.order_items", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "id": "postgresql:local/public/table//orders/", + "kind": "table", + "name": "orders", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:b234fb61206da550dcd90d0a7d1e8a5eb71725c35e3a89f744edb79f61303a79" + }, + "qualified_name": "public.orders", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "id": "postgresql:local/public/table//payments/", + "kind": "table", + "name": "payments", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:61c438642adec4e78e5308d6e5b02d5f392b152bedb35e7619fdc2b0579163be" + }, + "qualified_name": "public.payments", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "id": "postgresql:local/public/table//products/", + "kind": "table", + "name": "products", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:e71fc575ab401cd52f45edd3df0faa3421ba55f9ea17bdb7996344bd9382cf1b" + }, + "qualified_name": "public.products", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:776d7da11045ee31e44912e0" + ], + "id": "postgresql:local/public/trigger/customers/customers_touch/", + "kind": "trigger", + "name": "customers_touch", + "origin": "sql_file", + "parent": "customers", + "properties": { + "definition_hash": "sha256:b883f3a4e2ca6cb2493debafc7c58ab3e03eac238ad05d86ebbe9e6618e97f92" + }, + "qualified_name": "public.customers.customers_touch", + "schema": "public", + "signature": "", + "status": "PARSED" + }, + { + "confidence": "direct", + "evidence_ids": [ + "ev:c81447f17e11c2d5b6c401da" + ], + "id": "postgresql:local/public/view//customer_summary/", + "kind": "view", + "name": "customer_summary", + "origin": "sql_file", + "parent": "", + "properties": { + "definition_hash": "sha256:c64cf7e681c56e9e87c80899bd868f94133a64e21a9dcbd8a871f71c128e25d3" + }, + "qualified_name": "public.customer_summary", + "schema": "public", + "signature": "", + "status": "PARSED" + } + ], + "schema_version": "1.0.0", + "snapshot": { + "created_at": null, + "id": "snapshot:0362657069299f80c25efffe", + "source_fingerprint": "sha256:0362657069299f80c25efffe5eb9c09bebdc1d49a95f6128d3ca0dd5cac95e2c" + }, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:18505c245f165e4c93c709f8", + "object_id": "postgresql:local/public/column/orders/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5afc9281a8cd153100e8eb4f", + "object_id": "postgresql:local/public/column/products/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5ff30f718f152d8ea851b944", + "object_id": "postgresql:local/public/column/addresses/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "explanation": "Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL.", + "id": "unknown:69ffcfe1e4e57e6481af7368", + "object_id": "postgresql:local/public/function//touch_customer/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:8bea11811025af9e17a96a8e", + "object_id": "postgresql:local/public/column/customers/updated_at/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:9e847561e1fbe07255d98720", + "object_id": "postgresql:local/public/column/customers/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:eacbb533e2808e73f27dbf47", + "object_id": "postgresql:local/public/column/payments/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:f16dbb53af3ad137ed449c36", + "object_id": "postgresql:local/public/column/orders/created_at/", + "origin": "heuristic", + "status": "UNKNOWN" + } + ] +} diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/report.html b/skills/database-dependency-migration/examples/rendered/high-traffic/report.html new file mode 100644 index 0000000..f24d53c --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/report.html @@ -0,0 +1,5082 @@ + + + + + + + PostgreSQL dependency explorer + + + + + + + + + +
+
+
+

+ POSTGRESQL / DEPENDENCY REPORT +

+

+ Know what breaks
before you migrate. +

+

+ Trace dependencies back to their evidence. Review changes before + deployment. +

+
+
+
+ + +
+
+ + + + + +
+
+
+
+
+ + + +
+
+ + +
+
+

+ + + + + + + + +
+ Solid: catalogDashed: parsed referenceDotted: foreign key relationshipArrow = source depends on target. Impact follows reverse + arrows. +
+
+ +
+
+ + + +
+

+ OBSERVED = catalog metadata Ā· PARSED = syntax evidence Ā· INFERRED = + unproven Ā· UNKNOWN = unavailable. +

+

+ Graph paths show potential impact. Runtime coverage and lock duration + require separate evidence. +

+
+
+ + + + + + diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/report.md b/skills/database-dependency-migration/examples/rendered/high-traffic/report.md new file mode 100644 index 0000000..f07a39d --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/report.md @@ -0,0 +1,294 @@ +# PostgreSQL dependency review + +Analysis only. No SQL was executed by the analyzer. + +Snapshot ` snapshot:0362657069299f80c25efffe `. PostgreSQL 18, offline\_ddl. +Nodes: 52. Edges: 98. Evidence: 18. Findings: 4. Unknowns: 8. + +Arrows mean source depends on/references target. Impact walks reverse edges. Paths describe potential impact; they do not prove runtime failure or complete consumer coverage. + +## Findings + +### DDM014 (error, high, PARSED) + +Constraints/indexes/column-specific triggers depend on the changed object via the displayed edge kinds. + +Rebuild or transition affected objects with verified order and constraint validation. + +Finding ID: ` finding:0ea66c21e46700e8de9703bd `. Dimensions: compatibility, deployment\_order. Evidence: ev:551306041c228ae54da88290. + +### DDM006 (error, high, PARSED) + +CREATE INDEX CONCURRENTLY is forbidden inside a transaction block, including an externally declared single-transaction runner. + +Run the reviewed concurrent index operation outside transaction blocks; inspect invalid-index aftermath on failure. + +Finding ID: ` finding:61f2a716d49ea583a4524bbf `. Dimensions: deployment\_order, locking. Evidence: ev:f5f5e93f642715781126c9c2. + +### DDM005 (warning, medium, PARSED) + +Regular CREATE INDEX takes SHARE lock and blocks writes. Impact depends on table size, workload and lock waits; no duration is predicted. + +Consider CREATE INDEX CONCURRENTLY outside transaction blocks; check version/partition restrictions and invalid indexes. + +Finding ID: ` finding:b2c6ce04fbdf286d25f7cfc3 `. Dimensions: locking. Evidence: ev:dcedb83e305f10addb8f3fe7. + +### DDM002 (error, high, PARSED) + +Type transition numeric\(12,2\) to float8. Conversion compatibility requires type/cast and data verification. PostgreSQL 18 ALTER COLUMN TYPE generally takes ACCESS EXCLUSIVE; rewrite/index rebuild depends on cast, typmod and USING expression. Rewrite and lock duration are conditional. + +Design and verify a mapping/replacement column. Check USING, defaults, FKs, views, indexes and actual cast support in a disposable database. + +Finding ID: ` finding:e8c62af5af6d801991d01b20 `. Dimensions: compatibility, locking, rewrite. Evidence: ev:551306041c228ae54da88290. + +## Coverage and unknowns + +OBSERVED means supplied catalog metadata. PARSED means syntax-aware source evidence. INFERRED means unproven. UNKNOWN means unavailable or unsupported. Static analysis is not exhaustive. + +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:7de9792a75dda688bf1f738f. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:8dadc8fc9c511aafd4803a87. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:4f849d665202a664e7893d4a. +- UNKNOWN: Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL. Evidence: ev:e9af3cfadad5d8900305d336. +- UNKNOWN: Default/generated function and sequence expression targets need catalog resolution. Evidence: ev:40680f826d95f1ec183340ed. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:40680f826d95f1ec183340ed. +- UNKNOWN: Identity sequence exists but its actual name/OID needs catalog metadata. Evidence: ev:e3fa1e6bfbfed48ae579bc40. +- UNKNOWN: Default/generated function and sequence expression targets need catalog resolution. Evidence: ev:7de9792a75dda688bf1f738f. + +## Migration sequence + +### expand + +Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys. + +Preconditions: Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget. + +Verification: Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics. + +Recovery: Stop deployment before consumers depend on the new fields; keep old fields available. + +### backfill + +If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers. + +Preconditions: Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling. + +Verification: Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic. + +Recovery: Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure. + +### validate + +Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate. + +Preconditions: Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index. + +Verification: Check constraint validation and pg\_index.indisvalid/indisready, compare old/new results and observe lock waits. + +Recovery: Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling. + +### transition + +Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs. + +Preconditions: Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths. + +Verification: Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage. + +Recovery: Revert application reads only while both representations remain consistent; otherwise prefer roll-forward. + +### contract + +Remove legacy objects only after verified transition and a separate destructive-change review. + +Preconditions: Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition. + +Verification: Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime. + +Recovery: Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator. + +Affected root: ` postgresql:local/public/column/orders/total_amount/ `. + +- ` postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba ` via edge:bc0cecf27a9d335975ad3a49 + +## Object inventory + +| ID | Object | Kind | Status | Evidence | +|---|---|---|---|---| +| postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | application."examples/ecommerce/app/customers.sql:ev:e4dc7c3f3bcbc60c845f14b5" | query | PARSED | ev:e4dc7c3f3bcbc60c845f14b5 | +| postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | application."examples/ecommerce/app/orders.sql:ev:f8c7e18154ef774049bc8694" | query | PARSED | ev:f8c7e18154ef774049bc8694 | +| postgresql:local/public/column/addresses/city/ | public.addresses.city | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/addresses/customer\_id/ | public.addresses.customer\_id | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/addresses/id/ | public.addresses.id | column | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/column/customer\_summary/email/ | public.customer\_summary.email | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customer\_summary/id/ | public.customer\_summary.id | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customer\_summary/order\_count/ | public.customer\_summary.order\_count | column | PARSED | ev:c81447f17e11c2d5b6c401da | +| postgresql:local/public/column/customers/email/ | public.customers.email | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/id/ | public.customers.id | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/name/ | public.customers.name | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/customers/updated\_at/ | public.customers.updated\_at | column | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/column/order\_items/order\_id/ | public.order\_items.order\_id | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/order\_items/product\_id/ | public.order\_items.product\_id | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/order\_items/quantity/ | public.order\_items.quantity | column | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/column/orders/created\_at/ | public.orders.created\_at | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/customer\_id/ | public.orders.customer\_id | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/id/ | public.orders.id | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/orders/total\_amount/ | public.orders.total\_amount | column | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/column/payments/amount/ | public.payments.amount | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/payments/id/ | public.payments.id | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/payments/order\_id/ | public.payments.order\_id | column | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/column/products/id/ | public.products.id | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/column/products/price/ | public.products.price | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/column/products/sku/ | public.products.sku | column | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | public.addresses.addresses\_customer\_id\_fkey | constraint | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | public.addresses.addresses\_pkey | constraint | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | public.customers.customers\_email\_key | constraint | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | public.customers.customers\_pkey | constraint | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | public.order\_items.order\_items\_order\_id\_fkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | public.order\_items.order\_items\_pkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | public.order\_items.order\_items\_product\_id\_fkey | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | public.order\_items.order\_items\_quantity\_check\_\_485b310e0371 | constraint | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | public.orders.orders\_customer\_id\_fkey | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | public.orders.orders\_pkey | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | public.orders.orders\_total\_amount\_check\_\_8c94b42a7e78 | constraint | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | public.payments.payments\_amount\_check\_\_2fbbb5aae972 | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | public.payments.payments\_order\_id\_fkey | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | public.payments.payments\_pkey | constraint | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | public.products.products\_pkey | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | public.products.products\_price\_check\_\_a1bdfb6cc254 | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | public.products.products\_sku\_key | constraint | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/function//touch\_customer/ | public.touch\_customer | function | PARSED | ev:e9af3cfadad5d8900305d336 | +| postgresql:local/public/index//orders\_customer\_idx/ | public.orders\_customer\_idx | index | PARSED | ev:3eff11898bac02d99ee08daf | +| postgresql:local/public/table//addresses/ | public.addresses | table | PARSED | ev:4f849d665202a664e7893d4a | +| postgresql:local/public/table//customers/ | public.customers | table | PARSED | ev:40680f826d95f1ec183340ed | +| postgresql:local/public/table//order\_items/ | public.order\_items | table | PARSED | ev:b306c585df0ee00d863316dd | +| postgresql:local/public/table//orders/ | public.orders | table | PARSED | ev:7de9792a75dda688bf1f738f | +| postgresql:local/public/table//payments/ | public.payments | table | PARSED | ev:e3fa1e6bfbfed48ae579bc40 | +| postgresql:local/public/table//products/ | public.products | table | PARSED | ev:8dadc8fc9c511aafd4803a87 | +| postgresql:local/public/trigger/customers/customers\_touch/ | public.customers.customers\_touch | trigger | PARSED | ev:776d7da11045ee31e44912e0 | +| postgresql:local/public/view//customer\_summary/ | public.customer\_summary | view | PARSED | ev:c81447f17e11c2d5b6c401da | + +## Edge inventory + +| ID | Source | Target | Kind | Status | +|---|---|---|---|---| +| edge:014fb6369ba96ca9ec2ffb6e | postgresql:local/public/index//orders\_customer\_idx/ | postgresql:local/public/column/orders/customer\_id/ | expression\_reference | PARSED | +| edge:0d63cdfda898dda0d0ad8205 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/name/ | query\_reference | PARSED | +| edge:0fd89a08c8cb49371591999e | postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | postgresql:local/public/column/order\_items/quantity/ | expression\_reference | PARSED | +| edge:122fa6ad729c390103dc691f | postgresql:local/public/index//orders\_customer\_idx/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:18a94627aae399dfc7524ec3 | postgresql:local/public/column/orders/id/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:1a413343114cc7a6e07d44c2 | postgresql:local/public/column/customers/updated\_at/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:1aa24304fac7db22fadbc3a2 | postgresql:local/public/column/addresses/customer\_id/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:1d9d0976df3698a0baab6d4f | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/column/order\_items/product\_id/ | expression\_reference | PARSED | +| edge:21f46e17cc79c2dc179c60b7 | postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:24a25eea6c256af13096b2d4 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:2b4a327b2a480706c0fa842d | postgresql:local/public/column/addresses/id/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:2d6b9ecfcf9878d978cd8602 | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/column/order\_items/product\_id/ | expression\_reference | PARSED | +| edge:2eddcbe6246a409f53fb05a8 | postgresql:local/public/column/addresses/city/ | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:2f87c0839429a4ab70f6577b | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/orders/customer\_id/ | expression\_reference | PARSED | +| edge:2fc82a466cea94afdf966e07 | postgresql:local/public/trigger/customers/customers\_touch/ | postgresql:local/public/table//customers/ | trigger\_association | PARSED | +| edge:31b516307eef6dd0a3d257d6 | postgresql:local/public/column/order\_items/order\_id/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:3d411ea3b817ba78d8239733 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/table//orders/ | query\_reference | PARSED | +| edge:3e7919197cdfba064bae5dee | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/addresses/customer\_id/ | expression\_reference | PARSED | +| edge:3f36d958c1a16f4f5063977f | postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:4288ed89833d0022c1d54d05 | postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | postgresql:local/public/column/payments/id/ | expression\_reference | PARSED | +| edge:42b516772ae0c490fc62e11c | postgresql:local/public/column/payments/amount/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:44748c81a94abde3f9f756c1 | postgresql:local/public/column/customers/email/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:449d080bde5028b829fd281a | postgresql:local/public/column/customers/name/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:4852fede4511dce0fbc8a7af | postgresql:local/public/column/order\_items/order\_id/ | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:493a5da95d3bdaadae7e03fb | postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:4c6e6857c89ea809b31a3996 | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/column/products/id/ | foreign\_key | PARSED | +| edge:535a1452c20c4f6274bc02e5 | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:5402d78cd2ee1aefae55d740 | postgresql:local/public/column/orders/created\_at/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:57783f8cc3c12381d5a1b58e | postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | postgresql:local/public/column/payments/amount/ | expression\_reference | PARSED | +| edge:57d138471f7e225c7e01d90c | postgresql:local/public/constraint/payments/payments\_amount\_check\_\_2fbbb5aae972/2fbbb5aae972c43b3e1ddb51 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:5854677188c6ab1c841f33ed | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/orders/customer\_id/ | query\_reference | PARSED | +| edge:60a259d4dc6d48cdf764e46f | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:612709d82e5f92d0eb08603a | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/order\_items/order\_id/ | expression\_reference | PARSED | +| edge:62a5bb71cf88a0ebc61e744d | postgresql:local/public/column/payments/order\_id/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:62fcf75c3913fb26cc394149 | postgresql:local/public/table//order\_items/ | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:6b337fb6d4bfa4f999a1cc86 | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:6c3f2ed8788f2720c5aff75f | postgresql:local/public/column/addresses/customer\_id/ | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:6e209e98877452de8f04385b | postgresql:local/public/column/customer\_summary/email/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:75fa9aa95ba7b9d956e76660 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/orders/id/ | query\_reference | PARSED | +| edge:7925f99039a93219e51926db | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/payments/order\_id/ | expression\_reference | PARSED | +| edge:7c94d6184e2c7e444f2c9312 | postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:7f3b931f78bdeb022b90e8ba | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/table//products/ | foreign\_key | PARSED | +| edge:80ea424e44ca67d3c85bc3c5 | postgresql:local/public/column/customers/id/ | postgresql:local/public/table//customers/ | contains | PARSED | +| edge:84d30a74505bc15546505d27 | postgresql:local/public/constraint/customers/customers\_pkey/62676e56159a610040517422 | postgresql:local/public/column/customers/id/ | expression\_reference | PARSED | +| edge:874d99945657054a80df9f02 | postgresql:local/public/column/payments/id/ | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:888273ce7767cc3e55291871 | postgresql:local/public/column/orders/total\_amount/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:898dfc1b3549f6fe9e1041ce | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/orders/customer\_id/ | query\_reference | PARSED | +| edge:8a9ad2f29f72dd1a1af8587d | postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:8d3c400eda2590da824c965e | postgresql:local/public/column/customer\_summary/id/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:9001b115d6c5c48b4b5718ff | postgresql:local/public/column/order\_items/quantity/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:90c8c74b3403895629e680da | postgresql:local/public/constraint/products/products\_price\_check\_\_a1bdfb6cc254/a1bdfb6cc254d41061cec471 | postgresql:local/public/column/products/price/ | expression\_reference | PARSED | +| edge:96cdb0d84bc00a09ceb5109e | postgresql:local/public/table//payments/ | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:98d3f4f0a67ad80a7f7ab0bd | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//orders/ | foreign\_key | PARSED | +| edge:9d307aea5e208abba7504fb0 | postgresql:local/public/trigger/customers/customers\_touch/ | postgresql:local/public/function//touch\_customer/ | trigger\_association | PARSED | +| edge:a642923dda75dbdc7098d8d7 | postgresql:local/public/table//order\_items/ | postgresql:local/public/table//products/ | foreign\_key | PARSED | +| edge:a666f589e93aa92ac58f69ea | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:a8578a71397a160629502a5d | postgresql:local/public/column/orders/customer\_id/ | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:a8bea9311b58d34372ee5943 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/orders/id/ | query\_reference | PARSED | +| edge:a9189d507b83265b33fafc29 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:aa1d9857feb03fc467ed1835 | postgresql:local/public/column/customer\_summary/order\_count/ | postgresql:local/public/view//customer\_summary/ | contains | PARSED | +| edge:aa9343ef5c72a1e514641dc7 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:aac409ebab28c4f020bdeda0 | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:ac3cbd05c6a9226c89d527a4 | postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:ad680030f5a2e293affc3783 | postgresql:local/public/constraint/order\_items/order\_items\_quantity\_check\_\_485b310e0371/485b310e03717749fd366756 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:b3f2f89e86307ac919bd989c | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//addresses/ | contains | PARSED | +| edge:bc0cecf27a9d335975ad3a49 | postgresql:local/public/constraint/orders/orders\_total\_amount\_check\_\_8c94b42a7e78/8c94b42a7e78904691546dba | postgresql:local/public/column/orders/total\_amount/ | expression\_reference | PARSED | +| edge:bd8703a71aa20f06a188f31a | postgresql:local/public/column/order\_items/product\_id/ | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:bdbb2b13e6ac09f5824bae43 | postgresql:local/public/column/order\_items/product\_id/ | postgresql:local/public/column/products/id/ | foreign\_key | PARSED | +| edge:bfd9cd55aaab90c4ed183b91 | postgresql:local/public/constraint/addresses/addresses\_pkey/62676e56159a610040517422 | postgresql:local/public/column/addresses/id/ | expression\_reference | PARSED | +| edge:c0e890722d6fafc386c0e426 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/customers/id/ | query\_reference | PARSED | +| edge:c65687c186e8bee9cb8c0471 | postgresql:local/public/constraint/addresses/addresses\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:c7ba0696045c497301e52033 | postgresql:local/public/constraint/payments/payments\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:c8311f0c1b599de8590f98cd | postgresql:local/public/constraint/order\_items/order\_items\_product\_id\_fkey/4f7950eb41a49d97e2c7146e | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:c97827f27d1098e9f3c77ea4 | postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:ca4029a75da40252e4498d21 | postgresql:local/public/column/payments/order\_id/ | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:ca848fa6534d7f92402c1a52 | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/column/order\_items/order\_id/ | expression\_reference | PARSED | +| edge:cc0012b67ac594d5d7bd6657 | postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/table//products/ | contains | PARSED | +| edge:cddcdabaec4c64d86a5967e5 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:d1d2cc90cfc4e410bdc75cec | postgresql:local/public/constraint/products/products\_sku\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/column/products/sku/ | expression\_reference | PARSED | +| edge:d31da38e2ae27e8c7cfcd42f | postgresql:local/public/constraint/order\_items/order\_items\_pkey/0f66fa763c977cd394d53f04 | postgresql:local/public/table//order\_items/ | contains | PARSED | +| edge:d660558bd60070ae4acb636e | postgresql:local/public/constraint/orders/orders\_pkey/62676e56159a610040517422 | postgresql:local/public/column/orders/id/ | expression\_reference | PARSED | +| edge:da05ef9838f3b40e481aa89b | postgresql:local/public/column/products/price/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:da43cc551d6ebd2502680372 | postgresql:local/public/column/products/id/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:dbfeb24560e06d8750f73f55 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Fcustomers.sql%3Aev%3Ae4dc7c3f3bcbc60c845f14b5/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | +| edge:e1747cefd339bbab7c6a304a | postgresql:local/public/table//orders/ | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:e247fcd60cd703bd273870d3 | postgresql:local/public/column/products/sku/ | postgresql:local/public/table//products/ | contains | PARSED | +| edge:e40e0e88abbd113de3a5fcd8 | postgresql:local/public/table//addresses/ | postgresql:local/public/table//customers/ | foreign\_key | PARSED | +| edge:e4b95d06d0a70b8f382dfa23 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/column/customers/email/ | query\_reference | PARSED | +| edge:e74e28ce9dd6823209b2030c | postgresql:local/public/constraint/products/products\_pkey/62676e56159a610040517422 | postgresql:local/public/column/products/id/ | expression\_reference | PARSED | +| edge:ebd6536c72c75c6b3b067c27 | postgresql:local/public/constraint/payments/payments\_pkey/62676e56159a610040517422 | postgresql:local/public/table//payments/ | contains | PARSED | +| edge:eccc92a583473fdc12ea81af | postgresql:local/public/constraint/order\_items/order\_items\_order\_id\_fkey/1ef74bdedf741fe887a86e14 | postgresql:local/public/column/orders/id/ | foreign\_key | PARSED | +| edge:f23585bc075e6bd84fb1a091 | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/table//orders/ | query\_reference | PARSED | +| edge:f42877ab42b51eee114c1133 | postgresql:local/public/constraint/customers/customers\_email\_key/30ba9a81fb7ea6ec9ff167f7 | postgresql:local/public/column/customers/email/ | expression\_reference | PARSED | +| edge:f4ce6b8bb9138d13271b58f2 | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:f5f65ed52b52a130866ae814 | postgresql:local/application/query//examples%2Fecommerce%2Fapp%2Forders.sql%3Aev%3Af8c7e18154ef774049bc8694/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | +| edge:fbc21659908e0ae2a5cd46ea | postgresql:local/public/column/orders/customer\_id/ | postgresql:local/public/column/customers/id/ | foreign\_key | PARSED | +| edge:fdfb9eb03a5388bd20d49588 | postgresql:local/public/constraint/orders/orders\_customer\_id\_fkey/884466556956c633a5c8fcd4 | postgresql:local/public/table//orders/ | contains | PARSED | +| edge:ffb83430132bc8b5e521cc1e | postgresql:local/public/view//customer\_summary/ | postgresql:local/public/table//customers/ | query\_reference | PARSED | + +## Evidence inventory + +| ID | Origin | Location | Hash | +|---|---|---|---| +| ev:1300e87731793115ceb87783 | migration\_diff | examples/high-traffic/migrations/007.sql:5-5 | sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b | +| ev:3eff11898bac02d99ee08daf | sql\_file | examples/ecommerce/schema.sql:34-34 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:40680f826d95f1ec183340ed | sql\_file | examples/ecommerce/schema.sql:1-6 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:4f849d665202a664e7893d4a | sql\_file | examples/ecommerce/schema.sql:7-11 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:551306041c228ae54da88290 | migration\_diff | examples/high-traffic/migrations/007.sql:2-2 | sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b | +| ev:5fb078138cefc22bce2fcef9 | user\_supplied | user-metadata:1-1 | sha256:438abb43ce671eaa2d4fc0e8d95e4c2931b3194707d7ff9c14edac4d5032c914 | +| ev:776d7da11045ee31e44912e0 | sql\_file | examples/ecommerce/schema.sql:45-46 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:7de9792a75dda688bf1f738f | sql\_file | examples/ecommerce/schema.sql:17-22 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:8dadc8fc9c511aafd4803a87 | sql\_file | examples/ecommerce/schema.sql:12-16 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:91db41ab80f56bfbfc4da0f0 | migration\_diff | examples/high-traffic/migrations/007.sql:3-3 | sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b | +| ev:b306c585df0ee00d863316dd | sql\_file | examples/ecommerce/schema.sql:23-28 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:c81447f17e11c2d5b6c401da | sql\_file | examples/ecommerce/schema.sql:35-38 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:dcedb83e305f10addb8f3fe7 | migration\_diff | examples/high-traffic/migrations/007.sql:1-1 | sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b | +| ev:e3fa1e6bfbfed48ae579bc40 | sql\_file | examples/ecommerce/schema.sql:29-33 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:e4dc7c3f3bcbc60c845f14b5 | application\_source | examples/ecommerce/app/customers.sql:1-1 | sha256:a415aaea7a68344c4f8c3e93fc4233772176a54a53c14c74541c2e512be81470 | +| ev:e9af3cfadad5d8900305d336 | sql\_file | examples/ecommerce/schema.sql:39-44 | sha256:613c7315ca18c17eace15b1baab2cb6c2a3fc1a6b355702acda1fa3ff181922d | +| ev:f5f5e93f642715781126c9c2 | migration\_diff | examples/high-traffic/migrations/007.sql:4-4 | sha256:b258f46847ce8c427e965530b42a2a3289baaa972e08a50e662ef5bd0180db5b | +| ev:f8c7e18154ef774049bc8694 | application\_source | examples/ecommerce/app/orders.sql:1-2 | sha256:07ed8c193824ea5e25844e2be152acec7d04492c5b3d5ca9fbc55d2ee4e1421e | diff --git a/skills/database-dependency-migration/examples/rendered/high-traffic/review.json b/skills/database-dependency-migration/examples/rendered/high-traffic/review.json new file mode 100644 index 0000000..9511629 --- /dev/null +++ b/skills/database-dependency-migration/examples/rendered/high-traffic/review.json @@ -0,0 +1,190 @@ +{ + "impacts": [ + { + "affected": [ + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" + ], + "categories": { + "inferred": [], + "recorded_catalog": [], + "static_reference": [ + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" + ] + }, + "direct": [ + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba" + ], + "explanation": "Reverse paths show potential impact. They do not prove execution failure or exhaustive runtime coverage.", + "operation": "AT_AlterColumnType", + "paths": { + "postgresql:local/public/constraint/orders/orders_total_amount_check__8c94b42a7e78/8c94b42a7e78904691546dba": [ + "edge:bc0cecf27a9d335975ad3a49" + ] + }, + "root": "postgresql:local/public/column/orders/total_amount/", + "to": null, + "unknowns": [ + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:18505c245f165e4c93c709f8", + "object_id": "postgresql:local/public/column/orders/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:8dadc8fc9c511aafd4803a87" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5afc9281a8cd153100e8eb4f", + "object_id": "postgresql:local/public/column/products/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:4f849d665202a664e7893d4a" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:5ff30f718f152d8ea851b944", + "object_id": "postgresql:local/public/column/addresses/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e9af3cfadad5d8900305d336" + ], + "explanation": "Routine body/runtime references are not exhaustively analyzed offline, including dynamic SQL.", + "id": "unknown:69ffcfe1e4e57e6481af7368", + "object_id": "postgresql:local/public/function//touch_customer/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:8bea11811025af9e17a96a8e", + "object_id": "postgresql:local/public/column/customers/updated_at/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:40680f826d95f1ec183340ed" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:9e847561e1fbe07255d98720", + "object_id": "postgresql:local/public/column/customers/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:e3fa1e6bfbfed48ae579bc40" + ], + "explanation": "Identity sequence exists but its actual name/OID needs catalog metadata.", + "id": "unknown:eacbb533e2808e73f27dbf47", + "object_id": "postgresql:local/public/column/payments/id/", + "origin": "heuristic", + "status": "UNKNOWN" + }, + { + "confidence": "unknown", + "evidence_ids": [ + "ev:7de9792a75dda688bf1f738f" + ], + "explanation": "Default/generated function and sequence expression targets need catalog resolution.", + "id": "unknown:f16dbb53af3ad137ed449c36", + "object_id": "postgresql:local/public/column/orders/created_at/", + "origin": "heuristic", + "status": "UNKNOWN" + } + ] + } + ], + "limitations": [ + "SQL is never executed. Baseline is not replayed into a target schema.", + "Runtime consumers, table statistics and deployment completion require independent evidence.", + "Phases are a review checklist, not target-specific executable migrations. Apply relevant phases to the supplied change and verify operational prerequisites." + ], + "metadata": { + "evidence_ids": [ + "ev:5fb078138cefc22bce2fcef9" + ], + "origin": "user_supplied", + "status": "INFERRED", + "tables": { + "public.orders": { + "size_bytes": 8000000000, + "traffic": "high" + } + } + }, + "operations": [ + { + "evidence_ids": [ + "ev:551306041c228ae54da88290" + ], + "object_id": "postgresql:local/public/column/orders/total_amount/", + "operation": "AT_AlterColumnType" + } + ], + "plan": [ + { + "action": "Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys.", + "phase": "expand", + "preconditions": "Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget.", + "recovery": "Stop deployment before consumers depend on the new fields; keep old fields available.", + "review_only": true, + "verification": "Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics." + }, + { + "action": "If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers.", + "phase": "backfill", + "preconditions": "Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling.", + "recovery": "Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure.", + "review_only": true, + "verification": "Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic." + }, + { + "action": "Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate.", + "phase": "validate", + "preconditions": "Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index.", + "recovery": "Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling.", + "review_only": true, + "verification": "Check constraint validation and pg_index.indisvalid/indisready, compare old/new results and observe lock waits." + }, + { + "action": "Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs.", + "phase": "transition", + "preconditions": "Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths.", + "recovery": "Revert application reads only while both representations remain consistent; otherwise prefer roll-forward.", + "review_only": true, + "verification": "Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage." + }, + { + "action": "Remove legacy objects only after verified transition and a separate destructive-change review.", + "phase": "contract", + "preconditions": "Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition.", + "recovery": "Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator.", + "review_only": true, + "verification": "Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime." + } + ], + "review_only": true, + "risk_level": "high", + "schema_version": "1.0.0" +} diff --git a/skills/database-dependency-migration/examples/tricky-identifiers/schema.sql b/skills/database-dependency-migration/examples/tricky-identifiers/schema.sql new file mode 100644 index 0000000..0545c27 --- /dev/null +++ b/skills/database-dependency-migration/examples/tricky-identifiers/schema.sql @@ -0,0 +1,13 @@ +CREATE SCHEMA "Commerce"; +CREATE TYPE "Commerce".state AS ENUM ('new', 'paid'); +CREATE TABLE "Commerce"."Order" ( + "CustomerID" bigint, region integer, status "Commerce".state, + PRIMARY KEY ("CustomerID", region) +) PARTITION BY RANGE (region); +CREATE TABLE "Commerce".order_eu PARTITION OF "Commerce"."Order" FOR VALUES FROM (1) TO (10); +CREATE TABLE "Commerce".items ( + customer_id bigint, region integer, + FOREIGN KEY (customer_id, region) REFERENCES "Commerce"."Order" ("CustomerID", region) +); +CREATE FUNCTION "Commerce".label(value bigint) RETURNS text LANGUAGE SQL AS $$ SELECT value::text $$; +CREATE FUNCTION "Commerce".label(value text) RETURNS text LANGUAGE SQL AS $$ SELECT value $$; diff --git a/skills/database-dependency-migration/package.json b/skills/database-dependency-migration/package.json new file mode 100644 index 0000000..5e14140 --- /dev/null +++ b/skills/database-dependency-migration/package.json @@ -0,0 +1,52 @@ +{ + "name": "database-dependency-migration", + "version": "0.3.2", + "description": "Evidence-backed PostgreSQL dependencies and review-only migration analysis", + "type": "module", + "license": "MIT", + "engines": { + "node": ">=22.18.0" + }, + "packageManager": "pnpm@12.10.1", + "bin": { + "dbdep": "scripts/dbdep.mjs" + }, + "exports": { + ".": "./src/dbdep/engine.mjs" + }, + "files": [ + "src/dbdep/*.mjs", + "scripts/dbdep.mjs", + "schemas", + "assets/viewer", + "examples", + "references", + "SKILL.md", + "agents", + "templates", + "README.md", + "CONTRIBUTING.md", + "docs/roadmap.md", + "pnpm-lock.yaml", + "LICENSE", + "SECURITY.md", + "THIRD_PARTY_NOTICES.md" + ], + "scripts": { + "dbdep": "node scripts/dbdep.mjs", + "demo": "node scripts/dbdep.mjs demo out/demo --json" + }, + "dependencies": { + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "commander": "15.0.0", + "libpg-query": "18.1.5", + "pg": "8.23.1", + "pg-connection-string": "2.14.1" + }, + "devDependencies": { + "@playwright/test": "1.63.0", + "fflate": "0.8.3", + "prettier": "3.9.9" + } +} diff --git a/skills/database-dependency-migration/pnpm-lock.yaml b/skills/database-dependency-migration/pnpm-lock.yaml new file mode 100644 index 0000000..359780b --- /dev/null +++ b/skills/database-dependency-migration/pnpm-lock.yaml @@ -0,0 +1,1332 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.10.1 + version: 12.10.1 + +packages: + + '@pnpm/exe.android-arm64@12.10.1': + resolution: {integrity: sha512-CVTlHPwNvadQCJD9bGSMzWIhFX8QpjtqC2c27dhdnn/9iKzEjZ3qL62o3gHpKbIuo6qn4WxTKRoaokgNdReBig==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.10.1': + resolution: {integrity: sha512-NFiYLIaodY7da0XIebwcU3JoP7IK/lzF7zgKSSP+9H+QcFnQ1GDfBkuBKCYJzZ+Xu0WH54neIPLBBCaOjaaauA==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.10.1': + resolution: {integrity: sha512-0O8tdQ8ijlPJudXspLMTcitMkdBEz6uUflazL5uQE0WMs85oQIp0U+5hfEktMFB64QqEhjqlvvujTwbzdr9oMg==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.10.1': + resolution: {integrity: sha512-ud+1/uZOKEo8P/AsPynOJc/LNwfI0j6WwCElibj71rU9l4nIBnsSn+wWTIPZPkZ4BBSH5+82azSnAARMyJ1lNA==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.10.1': + resolution: {integrity: sha512-mj9PE5rf8uAfQQ2K66HSATMSut+lNiB4eSqFd5+azFVCMnxNSy/32xpZQJT21PhnN3Y4qbK+iKHe5nWAxSuRhw==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.10.1': + resolution: {integrity: sha512-xba+00wZJ8Um6rBJJjWl88uJj0tydB8dtomvjlCLvi0uL32vpa9CRP8Vv26FIXvbiZ1bo2RCzYt/eChxJVV52w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.10.1': + resolution: {integrity: sha512-oBdMp69ScC9UnniG4qZAQVr2fBDSXjm4yk/72vkEVyrlwS23yMxcRQl7Qdo3sgXPAygY6TWnPRKm4rXzjoyW7w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.10.1': + resolution: {integrity: sha512-Yyb3wu09h3c7mLme270uHFiVaAIUHC411Ru9LIU2BKUIstrGlXa9OqqVWoXaRgYRdFdOFknkwG7GNn6ygwLbnw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.10.1': + resolution: {integrity: sha512-PdkeUFFkybknnGkWP0H22eMpIiS4OZXL5BcQzF4lh+vmrW3IaC2HOkbANKgot/PKO0Kl77pzA/6PKFxgbgfXIQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.10.1': + resolution: {integrity: sha512-1okKuHKJwJPAbofDxfhZWAUxEWtee4ZSf7Pah8kcvocaJkf2WxFJ5KVTiNIvDml5GLidDQsgf7Pcf/WHbCak7Q==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.10.1': + resolution: {integrity: sha512-e6IqzVNkPa7srFKJKnY23uWJ+qz0LaRWiTUo/sHfFXRRMRzB5uNOr6qWWip/jqhdGwU91n9J7LrEYZ6e0tRczw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.10.1': + resolution: {integrity: sha512-ZByV0DRgWzGaDSjT5ddRBASdwz+r/qPMYh7o6RGmPQjtRGNFbSl94xY2DcAM8mqCOZJUUDtAXQ+wpBXcdpKlkg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.10.1': + resolution: {integrity: sha512-I7QZHcjioG7orFeCRUFUHByJ1G0zFPnAlaGGyrUvb6MGkv5oeNwNPl7t+Gp+7zHfnMcgLGJ1a+Wfim0IDw3lOw==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.10.1': + resolution: {integrity: sha512-4WJFdp58EKlCj0zLobrXU0vpszSZIr4X/3y/uNbAQqGW0zE+VdruZB0gFc3L2kzsUzVwTYbaCn+XEhnCYSAlTg==} + cpu: [x64] + os: [win32] + + pnpm@12.10.1: + resolution: {integrity: sha512-ukCjfrGjcNYP6oxM8dNkwTvMzvUY6YrSvO6VT1OdONo3RY5YJho/pV4GUjRQ6g//+fSXsTW+QfLBXBZCusrObA==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.10.1': + optional: true + + '@pnpm/exe.android-x64@12.10.1': + optional: true + + '@pnpm/exe.darwin-arm64@12.10.1': + optional: true + + '@pnpm/exe.darwin-x64@12.10.1': + optional: true + + '@pnpm/exe.freebsd-x64@12.10.1': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.10.1': + optional: true + + '@pnpm/exe.linux-arm64@12.10.1': + optional: true + + '@pnpm/exe.linux-ppc64@12.10.1': + optional: true + + '@pnpm/exe.linux-riscv64@12.10.1': + optional: true + + '@pnpm/exe.linux-s390x@12.10.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.10.1': + optional: true + + '@pnpm/exe.linux-x64@12.10.1': + optional: true + + '@pnpm/exe.win32-arm64@12.10.1': + optional: true + + '@pnpm/exe.win32-x64@12.10.1': + optional: true + + pnpm@12.10.1: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.10.1 + '@pnpm/exe.android-x64': 12.10.1 + '@pnpm/exe.darwin-arm64': 12.10.1 + '@pnpm/exe.darwin-x64': 12.10.1 + '@pnpm/exe.freebsd-x64': 12.10.1 + '@pnpm/exe.linux-arm64': 12.10.1 + '@pnpm/exe.linux-arm64-musl': 12.10.1 + '@pnpm/exe.linux-ppc64': 12.10.1 + '@pnpm/exe.linux-riscv64': 12.10.1 + '@pnpm/exe.linux-s390x': 12.10.1 + '@pnpm/exe.linux-x64': 12.10.1 + '@pnpm/exe.linux-x64-musl': 12.10.1 + '@pnpm/exe.win32-arm64': 12.10.1 + '@pnpm/exe.win32-x64': 12.10.1 + +--- +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + ajv: + specifier: 8.20.0 + version: 8.20.0 + ajv-formats: + specifier: 3.0.1 + version: 3.0.1(ajv@8.20.0) + commander: + specifier: 15.0.0 + version: 15.0.0 + libpg-query: + specifier: 18.1.5 + version: 18.1.5 + pg: + specifier: 8.23.1 + version: 8.23.1 + pg-connection-string: + specifier: 2.14.1 + version: 2.14.1 + devDependencies: + '@playwright/test': + specifier: 1.63.0 + version: 1.63.0 + fflate: + specifier: 0.8.3 + version: 0.8.3 + prettier: + specifier: 3.9.9 + version: 3.9.9 + + site: + dependencies: + '@fontsource-variable/archivo': + specifier: 5.3.0 + version: 5.3.0 + '@fontsource/ibm-plex-mono': + specifier: 5.3.0 + version: 5.3.0 + gsap: + specifier: 3.15.0 + version: 3.15.0 + lenis: + specifier: 1.3.26 + version: 1.3.26(react@19.3.0) + motion: + specifier: 14.0.0 + version: 14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next: + specifier: 16.4.0 + version: 16.4.0(@playwright/test@1.63.0)(@types/node@24.19.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: + specifier: 19.3.0 + version: 19.3.0 + react-dom: + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) + devDependencies: + '@types/node': + specifier: 24.19.1 + version: 24.19.1 + '@types/react': + specifier: 19.3.0 + version: 19.3.0 + '@types/react-dom': + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) + prettier: + specifier: 3.9.9 + version: 3.9.9 + typescript: + specifier: 7.0.2 + version: 7.0.2 + +packages: + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@fontsource-variable/archivo@5.3.0': + resolution: {integrity: sha512-HogK8FJelrD1o7TlZlkIVtHgc20bO5PZRWE7mUeUTdMN055alznQV6/00J00IBeu8FQAH4s3zW9UJNvKExXf+g==} + + '@fontsource/ibm-plex-mono@5.3.0': + resolution: {integrity: sha512-eTgnZjZEGk1QtD3ZstF+Vclo2HLAni8YMy34/DxllwZvyz1lR/1RF/xTiAquOBO7MvqBx8D2Ig2WCPMVfdZu7Q==} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + + '@next/env@16.4.0': + resolution: {integrity: sha512-pyLlT5oafGlX8X7xjgGNXz5dNIDSxREm+qD6i9VLSZiZFopA/XWl8NM/KPmLx/8EG/++c49iid3gNWSQW1+2dQ==} + + '@next/swc-darwin-arm64@16.4.0': + resolution: {integrity: sha512-yyZ+9MgViAKLLb5l1gPBGjRwnq3teNLb5Zx6JEw8LzNSTjlsnp+baUHFxTgl7PpjCmKf48VQfyipG1eBflb48Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.4.0': + resolution: {integrity: sha512-RePEEejEj1Auf5s9qEcG0JbcDP3ceNUS/ofNX8AhxzgIjTVlZIHMatlp16YplcSMpsVo/ZMQHJTjbMYJznjGUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.4.0': + resolution: {integrity: sha512-HhsyCqd+NpmvDDVY/LqkAN24f+QVvXh3ie+PfcwKinWL2Mu826JymQxJXGjAIfmJ4VlHjp4Pe/nZtXtUoEMAqw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@16.4.0': + resolution: {integrity: sha512-sN9Pf+Zh+RpZAOmbR7d8KAA8T61CVhawtbEJ2Bk6QrRzx6Z/6haaF4UiwBzytM96GRRRWZh9/WALIEO3npMamA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@16.4.0': + resolution: {integrity: sha512-D5M5xLWQVd1CvR+L7BickM1weRfmM41x3L1NWcnKY/oyJJqr1qwaCgmu3dMAhLBOMdZwSuDCRV6DJRRpiUkbDQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@16.4.0': + resolution: {integrity: sha512-8d5WLS6a9YalqpOgXdlbvonFu+sIgjA+CO6tGzetrpPVcUL56foa7B7664h41rAlbLi5fJwK4vWji3zf4QDy+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@16.4.0': + resolution: {integrity: sha512-sQuOIiW3snb48UwrBcDMvFA/u03qtw2LeuSIxFIQ9AJuW9UG/4Ddsfo+eV73PnZwBhyncMtsKVh7PrzMol2/fA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.4.0': + resolution: {integrity: sha512-6/33lCuxpdHUy27RegyGM/5uTpF7YZd3UR4D0gpkOA/tWY5YR7msbQjqPgCZmSmxrrTLGCXYA4A8vT2H5DPGTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@pgsql/types@18.0.0': + resolution: {integrity: sha512-jtAY4JU7jdVYZ/Vv3zlZqVP+FRWZokyCLKPPCnAApiaJAElpyyiMC3HRiquBu29kSrVs+rkqZD50SUIb/zyEGw==} + + '@playwright/test@1.63.0': + resolution: {integrity: sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==} + engines: {node: '>=20'} + hasBin: true + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@types/node@24.19.1': + resolution: {integrity: sha512-aS3/DG0oM05K0RIXXP+hKjinGG5IgSSVGzswZxW3O0sS3pH4/fycXundUC9XsszgKCk4gHXylTEK6hyFxVxnoQ==} + + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} + peerDependencies: + '@types/react': ^19.3.0 + + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + baseline-browser-mapping@2.11.28: + resolution: {integrity: sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA==} + engines: {node: '>=6.0.0'} + hasBin: true + + caniuse-lite@1.0.30001815: + resolution: {integrity: sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + framer-motion@14.0.0: + resolution: {integrity: sha512-QAtHmybrDFSliyW1sexMtSQTQd+1jw2ajibEmzpuI4XdPVzQkn+dAzJMm2sW3pl9MJuSS4xN51djQ7huhlP/VA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + gsap@3.15.0: + resolution: {integrity: sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + lenis@1.3.26: + resolution: {integrity: sha512-s/xTCZCxTFvHbAN1OzuhNaN5YPJH2ail0XAkctKW1b+RUAG4nUL5UHLXwNko1h8aEeT2jspBXegMgPJd8zcuag==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + libpg-query@18.1.5: + resolution: {integrity: sha512-xsksgH106LyVUylIp2bJz1MPFmVVIGKbB8belGWmh+J8/i38w8eM1twDIBnd97tzeNQFctH9MWKMthl22+fWcQ==} + + motion-dom@14.0.0: + resolution: {integrity: sha512-aU3ApXo1yTpeUi3JU+jbDk2TELjxPE3MbBMUP7nZHlARb6RweJK+ojmLjpuB0YsY6zhbBl1YWGo8LMsI1/Llqw==} + + motion-utils@14.0.0: + resolution: {integrity: sha512-jBsyjVxTTRZNeuvd/v+btVXr90LQkYl4HhRu9T2ARc+PMnvkmjsjRVeAg4Qm10b6TlTw+kykWI8gu/6LuvpLSQ==} + + motion@14.0.0: + resolution: {integrity: sha512-oGc2lkge2lkRZCP+J8/JsnYu4NFjqP1MtXirNdetn3QbvK2JqwM9A200EdT4C598KfzDhjLT12zF21xDM4Oilw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next@16.4.0: + resolution: {integrity: sha512-N2C+9q89Z/oLrsepSRS4jRMtwmUZAoZuAHU0e9T6+sAB5DdhADmrnOW+zjYijlrYFmVfmQhGVGy9eMFoB7UgKg==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + pg-cloudflare@1.4.1: + resolution: {integrity: sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==} + + pg-connection-string@2.14.1: + resolution: {integrity: sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.16.1: + resolution: {integrity: sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.23.1: + resolution: {integrity: sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + playwright-core@1.63.0: + resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.63.0: + resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==} + engines: {node: '>=20'} + hasBin: true + + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} + engines: {node: '>=14'} + hasBin: true + + react-dom@19.3.0: + resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} + peerDependencies: + react: ^19.3.0 + + react@19.3.0: + resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + +snapshots: + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@fontsource-variable/archivo@5.3.0': {} + + '@fontsource/ibm-plex-mono@5.3.0': {} + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.4 + optional: true + + '@img/sharp-darwin-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.4 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + optional: true + + '@img/sharp-linux-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.4 + optional: true + + '@img/sharp-linux-arm@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.4 + optional: true + + '@img/sharp-linux-ppc64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.4 + optional: true + + '@img/sharp-linux-riscv64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.4 + optional: true + + '@img/sharp-linux-s390x@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.4 + optional: true + + '@img/sharp-linux-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + optional: true + + '@img/sharp-wasm32@0.35.5': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-win32-arm64@0.35.5': + optional: true + + '@img/sharp-win32-ia32@0.35.5': + optional: true + + '@img/sharp-win32-x64@0.35.5': + optional: true + + '@next/env@16.4.0': {} + + '@next/swc-darwin-arm64@16.4.0': + optional: true + + '@next/swc-darwin-x64@16.4.0': + optional: true + + '@next/swc-linux-arm64-gnu@16.4.0': + optional: true + + '@next/swc-linux-arm64-musl@16.4.0': + optional: true + + '@next/swc-linux-x64-gnu@16.4.0': + optional: true + + '@next/swc-linux-x64-musl@16.4.0': + optional: true + + '@next/swc-win32-arm64-msvc@16.4.0': + optional: true + + '@next/swc-win32-x64-msvc@16.4.0': + optional: true + + '@pgsql/types@18.0.0': {} + + '@playwright/test@1.63.0': + dependencies: + playwright: 1.63.0 + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@types/node@24.19.1': + dependencies: + undici-types: 7.24.6 + + '@types/react-dom@19.3.0(@types/react@19.3.0)': + dependencies: + '@types/react': 19.3.0 + + '@types/react@19.3.0': + dependencies: + csstype: 3.2.3 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + baseline-browser-mapping@2.11.28: {} + + caniuse-lite@1.0.30001815: {} + + client-only@0.0.1: {} + + commander@15.0.0: {} + + csstype@3.2.3: {} + + detect-libc@2.1.2: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.8: {} + + fflate@0.8.3: {} + + framer-motion@14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + motion-dom: 14.0.0 + motion-utils: 14.0.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + + gsap@3.15.0: {} + + json-schema-traverse@1.0.0: {} + + lenis@1.3.26(react@19.3.0): + optionalDependencies: + react: 19.3.0 + + libpg-query@18.1.5: + dependencies: + '@pgsql/types': 18.0.0 + + motion-dom@14.0.0: + dependencies: + motion-utils: 14.0.0 + + motion-utils@14.0.0: {} + + motion@14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + framer-motion: 14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + tslib: 2.8.1 + optionalDependencies: + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + + nanoid@3.3.20: {} + + next@16.4.0(@playwright/test@1.63.0)(@types/node@24.19.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + '@next/env': 16.4.0 + '@swc/helpers': 0.5.23 + baseline-browser-mapping: 2.11.28 + caniuse-lite: 1.0.30001815 + postcss: 8.5.23 + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + styled-jsx: 5.1.6(react@19.3.0) + optionalDependencies: + '@next/swc-darwin-arm64': 16.4.0 + '@next/swc-darwin-x64': 16.4.0 + '@next/swc-linux-arm64-gnu': 16.4.0 + '@next/swc-linux-arm64-musl': 16.4.0 + '@next/swc-linux-x64-gnu': 16.4.0 + '@next/swc-linux-x64-musl': 16.4.0 + '@next/swc-win32-arm64-msvc': 16.4.0 + '@next/swc-win32-x64-msvc': 16.4.0 + '@playwright/test': 1.63.0 + sharp: 0.35.5(@types/node@24.19.1) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - babel-plugin-macros + + pg-cloudflare@1.4.1: + optional: true + + pg-connection-string@2.14.1: {} + + pg-int8@1.0.1: {} + + pg-pool@3.14.0(pg@8.23.1): + dependencies: + pg: 8.23.1 + + pg-protocol@1.16.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.23.1: + dependencies: + pg-connection-string: 2.14.1 + pg-pool: 3.14.0(pg@8.23.1) + pg-protocol: 1.16.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.4.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.1.1: {} + + playwright-core@1.63.0: {} + + playwright@1.63.0: + dependencies: + playwright-core: 1.63.0 + + postcss@8.5.23: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + prettier@3.9.9: {} + + react-dom@19.3.0(react@19.3.0): + dependencies: + react: 19.3.0 + scheduler: 0.28.0 + + react@19.3.0: {} + + require-from-string@2.0.2: {} + + scheduler@0.28.0: {} + + semver@7.8.5: + optional: true + + sharp@0.35.5(@types/node@24.19.1): + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 24.19.1 + optional: true + + source-map-js@1.2.2: {} + + split2@4.2.0: {} + + styled-jsx@5.1.6(react@19.3.0): + dependencies: + client-only: 0.0.1 + react: 19.3.0 + + tslib@2.8.1: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici-types@7.24.6: {} + + xtend@4.0.2: {} diff --git a/skills/database-dependency-migration/references/dependency-semantics.md b/skills/database-dependency-migration/references/dependency-semantics.md new file mode 100644 index 0000000..2f252b8 --- /dev/null +++ b/skills/database-dependency-migration/references/dependency-semantics.md @@ -0,0 +1,13 @@ +# Dependency semantics + +Every edge points from dependent/reference source to its target. In a manual source review, cite each link and trace reverse paths from the changed object. Label unsupported links UNKNOWN; see [source analysis](source-analysis.md). + +Toolkit impact uses a cycle-safe breadth-first traversal of reverse edges and returns deterministic shortest edge paths. It excludes the root from its own dependents. It separates paths containing PARSED/INFERRED/UNKNOWN evidence from all-OBSERVED paths. + +`foreign_key` represents a relational constraint/relationship. Constraint nodes link to local and referenced key columns; a distinct local-column relationship to referenced columns allows column impact traversal. This does not mean a referencing row always exists or a foreign key carries an ERD cardinality guarantee. + +`catalog_dependency` preserves pg_depend.deptype and both catalog addresses. Types n/a/i/e/x/P/S retain PostgreSQL's recorded meaning; the engine does not turn every type into a user-removable object. Internal triggers, row/array types, rewrite rules and extension membership need special deletion semantics. `pg_rewrite` owners become user-facing view nodes, with the rule address retained as evidence. This is graph normalization, not deletion simulation. + +`query_reference` is grounded AST table/column source evidence. `trigger_association` links a trigger to its relation and routine; association alone does not establish references to every relation column. `expression_reference` represents indexes and constraint expressions. `contains` has a child as source and owner as target, so dropping a table can affect its columns. `partition`/`inheritance` preserve structural relationships. `sequence_ownership` describes catalog-recorded sequence/column ownership. Runtime call targets and dynamic identifiers remain UNKNOWN. + +A rename preserves recorded object identities in PostgreSQL; application SQL strings can break. A reverse path is potential impact. RESTRICT and CASCADE behavior depends on catalog dependency types, internal ownership and the exact operation. The engine intentionally does not compute an exact deletion closure or suggest CASCADE as automatically acceptable. diff --git a/skills/database-dependency-migration/references/diagramming.md b/skills/database-dependency-migration/references/diagramming.md new file mode 100644 index 0000000..1028ab6 --- /dev/null +++ b/skills/database-dependency-migration/references/diagramming.md @@ -0,0 +1,9 @@ +# Interactive reports + +The standalone HTML embeds the validated model, summary, optional changes and phase plan. It needs no CDN, network access or service. Search, schema/kind/status filters, node inspection, keyboard selection, zoom/pan, direct/transitive impact, path evidence, risk filtering, change lists and review phases are implemented. Foreign-key edges use a dotted stroke, parsed references a dashed stroke, recorded catalogs a solid stroke. Color is supplementary. + +Rendering is capped at 350 visible nodes. The model/export remains complete and a cap message provides per-schema totals. Narrow filters to inspect omitted nodes. Layout groups by schema on a deterministic grid; it is not a force-directed layout and large dense graphs can overlap. The shortest path panel is better evidence than arrow placement. SVG/JSON exports work; PNG export is unavailable. CLI Mermaid/DOT exports are deterministic and independent of browser layout. + +The detail panel previews up to 40 shortest paths and 16 steps per path, with explicit truncation messages. Browser traversal stores one predecessor per node to bound graph memory. CLI impact provides complete paths; exported model JSON retains every node and edge. A 1,000-node browser test checks the cap, omitted-schema totals, path preview, and selection beyond the initial graph window. + +`tests/browser/report-preferences.spec.mjs` exercises offline navigation, search, node selection, reverse highlights, filters, zoom, keyboard controls, exports, risk views and sequence tabs. Cross-artifact tests compare JSON state, Markdown inventory and model counts. Automated UI success does not prove perceptual quality or SQL correctness. Screenshots must come from actual runs and be inspected before claiming review. diff --git a/skills/database-dependency-migration/references/migrations.md b/skills/database-dependency-migration/references/migrations.md new file mode 100644 index 0000000..58324d0 --- /dev/null +++ b/skills/database-dependency-migration/references/migrations.md @@ -0,0 +1,31 @@ +# Migration review and rules + +In the optional toolkit, migration SQL is parsed locally and never executed. The baseline is not mutated or replayed. Findings add migration evidence to a copy of the baseline. Multiple operations can target the baseline object; references to objects introduced/renamed earlier in the proposal can remain unresolved. Plans are operator review material with explicit assumptions and recovery steps. + +For normal skill use, read sources directly and track explicit sequential operations in the [source-analysis ledger](source-analysis.md#track-sequential-state). Cite manual findings as SOURCE_READ and carry unsupported effects forward as UNKNOWN. This does not add stateful replay to the engine or establish backfill correctness. The rule table below documents engine rules; manual reviews may use the risk categories without claiming those rules ran. + +| Rule | Trigger | Interpretation | +|---|---|---| +| DDM001 | Drop table/column | Destructive data potential and dependency impact | +| DDM002 | Alter column type | Conversion/type compatibility; conditional rewrite and ACCESS EXCLUSIVE lock | +| DDM003 | Set not null | NULL verification, potential scan, validated CHECK alternative | +| DDM004 | Add default column | Constant fast default on 11+ versus volatile/unclassified/older defaults | +| DDM005 | Regular create index | SHARE lock blocks writes; concurrency tradeoff | +| DDM006 | Concurrent index in explicit/external transaction | Definite forbidden context | +| DDM007 | Add CHECK/FK | NOT VALID and later validation where supported | +| DDM008 | Altered referenced object | Views/routines/application SQL, separated by evidence | +| DDM009 | Rename column | Recorded identities versus stale textual consumers | +| DDM010 | Drop CASCADE | Review potential consequences; no exact deletion closure | +| DDM011 | Destructive contract | Transition completion is unproven; require phase gates | +| DDM012 | Missing size/traffic | Operational impact unknown; no invented measurements | +| DDM013 | Ambiguous/unsupported reference | Retain coverage gap and resolve from supported input | +| DDM014 | Affected constraint/index/trigger | Preserve edge type and deployment requirements | +| DDM015 | Identity/default/generated change | Preserve generation and ownership semantics | + +Risk dimensions are data_loss, locking, rewrite, compatibility, deployment_order and unresolved_dependencies. Risk levels are low/medium/high/unknown. Unknown operational impact can coexist with a definite syntax/transaction prohibition. Neither lock mode nor a supplied size predicts lock duration. `--fail-on high` gates high risks; `medium` gates high/medium; `unknown` gates high/medium/unknown. Analysis outputs still exist if the policy exits 3. + +For a transactional migration runner, use `--transaction-mode single`. Default analysis assumes statement execution and detects explicit BEGIN/START/COMMIT/ROLLBACK. ROLLBACK TO SAVEPOINT does not exit the outer transaction. PostgreSQL may also execute multi-statement submissions in an implicit transaction; the tool cannot detect the runner's submission protocol. Declare that context explicitly. + +Integer to UUID requires a designed mapping, uniqueness, FK/key/index/view transition and compatible application deployment. Casting decimal text to UUID does not create a valid semantic mapping. Expand nullable representations, coordinate writers, backfill bounded batches, validate, transition consumers, then separately approve contract. Data loss cannot be undone by reverse DDL. Recovery requires retained source data, tested backups or roll-forward. + +Regular and concurrent index tradeoffs and ALTER TABLE rules follow [PostgreSQL 18 CREATE INDEX](https://www.postgresql.org/docs/18/sql-createindex.html) and [PostgreSQL 17 ALTER TABLE](https://www.postgresql.org/docs/17/sql-altertable.html). Constant defaults and validated-check scan avoidance are qualified by version. The analyzer conservatively treats arbitrary default function volatility as unknown. Partition restrictions still require review. diff --git a/skills/database-dependency-migration/references/model.md b/skills/database-dependency-migration/references/model.md new file mode 100644 index 0000000..65122e4 --- /dev/null +++ b/skills/database-dependency-migration/references/model.md @@ -0,0 +1,19 @@ +# Canonical model + +Schema version 1.0.0 is validated by `schemas/dbdep.schema.json`, plus semantic checks in `src/dbdep/model.mjs`. Findings have `schemas/findings.schema.json`; review envelopes have `schemas/report.schema.json`. + +IDs use `postgresql:local/////`. Components are UTF-8 percent-encoded. Empty components remain significant. The input is one logical database; comparing different databases requires the operator to confirm intended scope. OIDs and class/subobject addresses are snapshot-local evidence, never stable keys. Routine input signatures use parser-normalized type names offline and catalog type identities in captures. Name aliases such as int8/bigint and quoted custom argument types can still differ across capture modes; compare like modes. + +Column nodes carry their relation name as parent. Constraint and trigger identities include their owning relation; indexes are schema objects. Unnamed offline constraints carry a content-hash signature, with occurrence suffixes for identical CHECK declarations. Generated names are labeled `name_inferred` and can differ from PostgreSQL collision handling. Catalog capture supplies actual names. Never infer physical sequence names for identity/serial defaults offline. + +JSON uses sorted object keys, ASCII escapes, two-space indentation and a final newline. Node, edge, evidence, finding and unknown arrays sort by ID. Ordered key columns/signatures retain order. Offline timestamps are null; catalog capture timestamps record actual capture time. File evidence hashes the complete original UTF-8 bytes, not snippets. Libpg_query locations produce line ranges and optional `byte_start`/`byte_length` offsets into those original source bytes, including the three-byte offset of an initial UTF-8 BOM. Offsets distinguish multiple statements on one line. Snapshot fingerprint hashes sorted source-path/query-ID and source-hash pairs plus engine version. Moving files can change query identity and evidence. Paths outside the current workspace display basename only; inspect a coherent workspace to avoid collisions. + +`validate --strict` checks canonical ordering as well as duplicate IDs, enums, edge endpoints, evidence IDs, hash formats, per-source hash consistency, counts and fingerprint. UNKNOWN coverage is valid and does not itself invalidate a graph. Validation checks internal evidence consistency; it does not prove that the original file or database still has the captured content. Sources need independent recapture/re-hashing for freshness. + +Catalog evidence `source_hash` fingerprints the canonical query record containing `sql_hash` and `rows`. It is a payload fingerprint, not the hash of the SELECT text. The capture's `queries[query_id].sql_hash` separately fingerprints the exact allowlisted SQL text. Cite these hashes with distinct labels and retain the supplied capture for independent verification. + +Repository text files use LF endings through `.gitattributes`, preventing Git's Windows checkout conversion from changing fixture hashes. External SQL preserves supplied newlines and its source hash includes an initial BOM. Only parser input strips the BOM; evidence offsets add its three bytes back. Equivalent files with different newline bytes have different evidence fingerprints. Node canonical JSON emits integer-valued catalog estimates as integers; catalog evidence hashes can differ from historical Python hashes while the supplied capture and graph relationships stay unchanged. + +Retained creator evaluation receipts/copies are exempt from Git newline conversion so their original byte hashes remain checkable on any platform. + +Diff matches stable IDs. Removed/added columns with the same owner/type produce UNKNOWN possible-renames. No similarity threshold confirms a rename. Catalog definition comparison is partial because full view/index/routine bodies are deliberately not captured. diff --git a/skills/database-dependency-migration/references/parser-and-confidence.md b/skills/database-dependency-migration/references/parser-and-confidence.md new file mode 100644 index 0000000..582d99b --- /dev/null +++ b/skills/database-dependency-migration/references/parser-and-confidence.md @@ -0,0 +1,17 @@ +# Parser and confidence + +This reference describes the optional deterministic toolkit. The skill's [source review](source-analysis.md) works without it and uses SOURCE_READ for manual text evidence. That prose label is not a canonical model state. Manual ORM findings do not extend the parser's coverage. + +libpg-query 18.1.5 exposes PostgreSQL 18's parser through WebAssembly. It parses syntax; it does not run PostgreSQL name/type binding. CLI version context accepts PostgreSQL 14-18, but grammar acceptance does not prove syntax exists on every release. Actual fixture execution is recorded separately. Use release-specific documentation and a disposable database before making execution claims. + +Relation alias column lists and implicit USING/NATURAL join column resolution remain UNKNOWN. The engine retains supported relation references and suppresses column edges for those unsupported scopes. Routine signatures quote unusual identifier components to prevent overload collisions. Unqualified custom argument types preserve source spelling; qualify them and compare like capture modes when matching routine identities across snapshots. + +Implemented offline objects include schemas, regular/partitioned tables, columns, named/unnamed common constraints, views, materialized views, sequences, enum/domain/composite types, overloaded functions/procedures, indexes and triggers. Composite FK column order is preserved. Identity/default/generated definitions are hashed. Column type relationships resolve to declared custom types. + +Unqualified custom type collisions remain UNKNOWN and produce no direct type edge. Unnamed constraints use content-based synthetic identities; duplicate CHECK declarations receive deterministic occurrence suffixes. Displayed inferred names do not establish PostgreSQL's actual generated names. Catalog comparison requires matching capture modes and explicit name reconciliation. + +Simple SELECT/INSERT/UPDATE/DELETE SQL files produce query nodes and grounded relations/column references. Quoted identifiers preserve case. Unqualified names with collisions are UNKNOWN; the tool does not invent search_path. Nested queries, CTEs and set operations retain grounded relation references while column scope is UNKNOWN. Join USING/NATURAL column expansion, implicit generated view-column names, function overload calls, inheritance expansion and routine bodies need catalog or manual follow-up. Unsupported AST statements remain explicit unknowns. A directory schema input represents declarations; it does not replay a chronological migration history. + +SQL in TypeScript/JavaScript/Python/C#/Java/Prisma files is not parsed as PostgreSQL. Such files contribute host-language coverage gaps with hashes. No ORM adapter is claimed. All PL/pgSQL/SQL routine body/runtime references are flagged UNKNOWN offline, including dynamic SQL, instead of scanning string fragments and claiming facts. Syntax failure exits 2 with a secret-safe diagnostic, without partial model output. + +OBSERVED means extracted supplied catalog metadata; PARSED means syntax-aware static evidence; INFERRED means plausible but unproven; UNKNOWN means unsupported/ambiguous/unavailable. Confidence values `direct`, `conditional`, `unknown` describe evidence interpretation, not probabilities. diff --git a/skills/database-dependency-migration/references/postgres-catalog.md b/skills/database-dependency-migration/references/postgres-catalog.md new file mode 100644 index 0000000..999161c --- /dev/null +++ b/skills/database-dependency-migration/references/postgres-catalog.md @@ -0,0 +1,15 @@ +# Catalog capture + +`src/dbdep/catalog.mjs` contains the exact allowlisted SELECTs. They inspect pg_namespace, pg_class, pg_attribute, pg_type, pg_constraint, pg_index, pg_depend, pg_rewrite, pg_proc, pg_trigger, pg_inherits, pg_extension and pg_attrdef. Relation references use pg_catalog explicitly; the only explicit function call in current discovery is built-in current_setting. Default expressions use the stored `adbin::text` node tree, then become hashes. Discovery avoids pg_get_expr because deparsing constants can invoke custom data-type output functions. Routine bodies, privileges, database names, connection URLs and user rows are not extracted. + +Use a dedicated login with CONNECT and catalog visibility. No table SELECT grants are required for the shipped fixtures. Startup options restrict search_path, apply 10-second statement and 2-second lock timeouts, and default to read-only transactions. The pg client uses fixed BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY and COMMIT statements so discovery queries share one snapshot. Discovery payload queries are SELECT only. DSN options cannot override the startup safeguards. A read-only transaction alone does not establish safety; fixed relation/function allowlists do. + +Captures contain actual query hashes, timestamp and selected rows. Default expressions become SHA-256 hashes before persistence. The catalog adapter checks the query-set/hash contract, maps class/OID/subidentifier addresses and collapses rewrite rule/default ownership to views/columns while preserving address provenance. Structural FK/index/trigger/inheritance edges use their actual catalogs. Internal/automatic/normal/extension/partition dependency codes remain edge properties. Built-in system objects are omitted; non-modeled unresolved endpoints are recorded. pg_class statistics are labeled estimates. No actual table size/traffic or runtime coverage is asserted. + +The normalized capture format is project-specific, not an arbitrary pg_dump/CSV export. New live captures use `capture_version: "1.1.0"`; the canonical model remains 1.0.0. Offline `inspect --catalog` also accepts 1.0.0 captures against their exact legacy fixed-query hashes, including the former deparsed default-expression representation. It never executes a query from an imported capture. Authentic legacy captures and their evidence remain unchanged. Catalog/repository merge is unavailable; use separate offline query inspection. + +The checked-in analytics fixture was captured from a real isolated PostgreSQL server. See `examples/analytics/capture-provenance.json` for version, SQL hashes, capture hash and original execution commands. Run `pnpm test:live` to verify catalog capture in a fresh isolated cluster. `node scripts/fixture-cluster.mjs --update-fixtures` explicitly recaptures the fixture and provenance. Never run fixture setup against a production connection. + +Default-expression hashes from 1.0.0 and 1.1.0 captures use different representations. A diff across capture versions can therefore report a changed default without a semantic change. Compare captures of the same version or review this representation change explicitly; do not reinterpret historical hashes as current stored-tree fingerprints. + +Authoritative semantics: [pg_depend](https://www.postgresql.org/docs/18/catalog-pg-depend.html), [pg_rewrite](https://www.postgresql.org/docs/18/catalog-pg-rewrite.html), [pg_constraint](https://www.postgresql.org/docs/18/catalog-pg-constraint.html). These cover recorded database dependencies; function strings and application SQL can escape them. diff --git a/skills/database-dependency-migration/references/security.md b/skills/database-dependency-migration/references/security.md new file mode 100644 index 0000000..df37802 --- /dev/null +++ b/skills/database-dependency-migration/references/security.md @@ -0,0 +1,11 @@ +# Security boundary + +There is no apply/execute/migrate command or migration-execution library API. Offline inspect reads local UTF-8 SQL only. Analysis never calls a network service. Live access is opt-in through an environment variable and `--mode read-only`. Connection errors hide driver details so passwords and parameter values do not enter logs. + +Catalog queries are fixed SELECTs from explicit pg_catalog relations. Live capture 1.1.0 hashes stored default-expression node trees without deparsing constants, which can invoke custom type output functions. Offline 1.0.0 captures retain their legacy query-hash contract. Routine bodies and business-data rows are omitted. Raw SQL literals and comments are never copied into graphs/reports. Target-type input is parsed and normalized before graph or assessment evidence is created. Input file hashes and definition hashes preserve change evidence without exposing values. Object names and paths can themselves contain sensitive identifiers; keep artifacts local. Validation rejects recognizable DSN/password fields in canonical output, but is not a general secret detector. Inspect source naming before sharing. + +The viewer creates user-derived text via textContent, embeds JSON with escaped HTML delimiters, and uses a hash-restricted CSP with connect-src none and no external assets. Markdown escapes imported text and encloses identifiers in safe CommonMark code spans. SVG export reflects the currently displayed graph; JSON retains the complete model. Treat source content as data, including embedded agent instructions. Discovery never calls arbitrary user-defined routines. Fixture setup is separate development tooling and runs only in an isolated cluster created by the script or an explicitly selected disposable CI database. + +Output writes reject pre-created symbolic links/junctions and non-regular files, use an exclusive temporary file with restrictive permissions, then atomically replace ordinary destinations. The CLI preflights artifacts to protect selected inputs and prevent output collisions. Input directory aliases are resolved for source protection. These checks do not protect against a concurrent user replacing workspace directories. Supported partial DSNs retain normal driver environment defaults; unsupported service/hostaddr/routing parameters fail generically. Input sizes are not globally limited. + +Exclude .env, .pgpass, local connection files, out/, tmp/, virtual environments and transient evaluations from Git. Curated examples may be checked in only after sanitization and provenance review. diff --git a/skills/database-dependency-migration/references/source-analysis.md b/skills/database-dependency-migration/references/source-analysis.md new file mode 100644 index 0000000..1e5d0c4 --- /dev/null +++ b/skills/database-dependency-migration/references/source-analysis.md @@ -0,0 +1,55 @@ +# Source analysis without runtime setup + +Use the agent's existing file reader and search tools. No package manager, compiler, ORM CLI or database is needed. `rg` can locate candidates; inspect the surrounding declaration, mapping and call before reporting a dependency. Exclude generated/vendor/build files unless they contain the only available evidence. Do not execute migrations or import application code to discover mappings. + +## Establish the baseline + +Record the schema source, proposed migration, PostgreSQL/provider version if supplied, application directories and transaction context. A current ORM model or model snapshot may already include the proposed change. It does not prove the pre-migration schema or deployed state. Keep before and after versions distinct. + +For a local Git/PR review, use the requested base/head and read their diff. `git diff --name-status ...` identifies changed files; `git show :` reads baseline files without checking out a branch. Record the resolved commits and cite each excerpt's revision. Examine unchanged consumers too. If the base or migration order is unavailable, identify the gap and continue with the supplied files. + +## Trace dependencies + +Inventory changed tables, columns, constraints, indexes, views, sequences and routines. Inspect SQL consumers and application mappings using both database names and mapped symbols. Trace foreign-key columns, index expressions, view definitions, joins, projections, filters and writes. Include `SELECT *` or implicit ORM projections as conditional consumers when the returned shape may change. + +An arrow `consumer -> dependency` means the consumer references the dependency. Trace reverse paths from the changed object. For every reported path, cite each link. A shared word or matching property name is insufficient. Record unresolved schemas, aliases, overloads and naming conventions as UNKNOWN. Do not infer a complete application call graph from a database access method. + +Use a compact evidence table: + +| Changed object | Consumer and path | Evidence | Interpretation | +| --- | --- | --- | --- | +| Fully qualified table/column | File or mapped property, then intermediate dependencies | File:line and revision, or supplied catalog record | SOURCE_READ, OBSERVED, PARSED, INFERRED or UNKNOWN with reason | + +SOURCE_READ describes directly inspected text in this prose review. It does not mean the SQL passed a parser, that an ORM generated a particular query, or that a path runs in production. For an ORM consumer, cite both the mapping and the use; mark translation/runtime assumptions INFERRED or UNKNOWN. Keep this table outside canonical toolkit JSON. + +## EF Core migrations and C# consumers + +Inspect project/package files for EF Core and the PostgreSQL provider. Read the migration's `Up` operations in order. Read `Down` separately as a recovery proposal, never as part of the forward sequence or proof that lost data can be restored. Compare the appropriate baseline model snapshot and explicit schema declarations. + +Map `CreateTable`, `AddColumn`, `AlterColumn`, `RenameColumn`, `RenameTable`, `DropColumn`, foreign keys and indexes to their schema/table/column arguments. Read literal `migrationBuilder.Sql` text as SQL evidence. Helper calls, conditionals or generated SQL that cannot be resolved from source remain UNKNOWN. + +Follow `DbContext`, entity configuration, `ToTable`, `HasColumnName`, `HasForeignKey`, `HasPrincipalKey`, and `[Table]`/`[Column]` into entity/property uses. Check LINQ projections and filters, writes, `FromSql*`, `ExecuteSql*`, `DbCommand` and Dapper query calls when present. A property referenced in a LINQ expression is a potential consumer only after its database mapping is established. Name changes in C# alone do not prove a database rename. Conventions, shadow properties, value converters, inheritance, owned types, split tables and runtime configuration may need follow-up. + +EF's `Up`/`Down` and snapshot roles are documented in [managing migrations](https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/managing). Explicit property mappings are documented in [entity properties](https://learn.microsoft.com/en-us/ef/core/modeling/entity-properties). Verify provider/version-specific SQL claims against the project's actual version. + +## Prisma and TypeORM + +For Prisma, identify the installed version and its migration format first. In SQL-based migration histories, read ordered `prisma/migrations/*/migration.sql` files, then map model/field names through `@@map`, `@map`, schema declarations and relation scalar fields. Follow the mapped model into Prisma Client reads/writes and inspect `$queryRaw`/`$executeRaw` literals. Do not treat a relation field as a physical column or an application field rename as a database rename. Newer migration formats must be inspected as supplied; an unrecognized format remains UNKNOWN. See [Prisma database mapping](https://docs.prisma.io/docs/orm/v7/prisma-schema/data-model/database-mapping). + +For TypeORM, read `MigrationInterface.up` and literal `queryRunner.query` calls or explicit table/column operations in execution order. Review `down` separately. Resolve `@Entity`, `@Column`, `@JoinColumn` and `EntitySchema` physical names into repository calls, query builders and raw SQL. Inspect the configured naming strategy; unavailable or computed names remain UNKNOWN. Decorated class/property names alone do not prove physical names. See [TypeORM migrations](https://typeorm.io/docs/advanced-topics/migrations/). + +## Track sequential state + +Maintain a ledger with step, source location, target identity, known before state, operation, after state and unresolved effects. Start from the identified baseline, not the final ORM model. For explicit creates/adds, register the new object; for renames, retain its identity and track old/new names; for drops, mark it absent; for explicit type/null/default changes, update only those known attributes. Update explicitly defined FK/index/view relationships when their targets resolve. Name binding after a rename must use the new name. Stored PostgreSQL dependencies and literal application SQL have different rename behavior. + +For example, `ADD COLUMN code text; RENAME COLUMN code TO external_code; CREATE INDEX ... (external_code)` references a column introduced in the proposal. Explain that link rather than reporting it missing from the baseline. The conclusion remains conditional on preceding operations succeeding. + +Unsupported operations, dynamic SQL, missing predecessors, ambiguous names, data conversions and helper-generated changes introduce UNKNOWN effects. Carry those effects into later findings that depend on them; continue reasoning about independent objects. If a statement is invalid or blocked by a dependency, do not assume it succeeds or claim subsequent steps execute. For explicit transactions/savepoints, track rollback only where the boundary is clear; otherwise mark resulting state UNKNOWN. Data/backfill correctness and transaction-runner behavior cannot be established by a schema ledger. + +This ledger is agent reasoning, not a deterministic migration simulator. The bundled engine still reviews against a fixed baseline and does not implement these state transitions. + +## Deliver the review + +Use [the report outline](../templates/review-report.md). Explain destructive changes, conversions, dependency blockers, reader/writer compatibility and deployment order with evidence. Describe lock/rewrite risks as conditional when version, table size or traffic is unknown. Report backfill correctness as UNKNOWN without operational evidence. Do not invent measured downtime or a safe rollback. + +A PR-ready summary should list changed objects, strongest high-risk findings, key consumers and unresolved dependencies, with links to source evidence and the full report if available. Preparing Markdown needs no GitHub connection. Publishing a comment/check requires an explicit publication request and an available GitHub tool. This skill does not install a webhook, bot or automatic PR workflow. diff --git a/skills/database-dependency-migration/references/toolkit.md b/skills/database-dependency-migration/references/toolkit.md new file mode 100644 index 0000000..7b9e5e0 --- /dev/null +++ b/skills/database-dependency-migration/references/toolkit.md @@ -0,0 +1,39 @@ +# Optional deterministic toolkit + +The normal skill workflow is [source analysis](source-analysis.md) and needs no runtime setup. Use this toolkit for parser-backed evidence, validated canonical JSON, deterministic graph exports or the standalone HTML explorer. It requires Node.js 22.18+ and runtime dependencies. Resolve this skill's absolute directory as `` and keep inputs/outputs in the user's workspace. + +If the runtime is unavailable, complete the source review. State that any requested validated model or interactive explorer could not be generated. Never replace the parser with regex extraction or claim manually written JSON is validated. + +## Install only the optional runtime + +Run inside the installed skill directory, without installing the website or development tools: + +An instructions-only copy may omit `package.json`, scripts and engine resources. Use the complete checkout or `.skill` bundle before enabling the toolkit in that case; the source-review workflow already works from the instructions and references. + +```sh +npm install --omit=dev --ignore-scripts --package-lock=false +node scripts/dbdep.mjs doctor --json +``` + +This npm path pins direct dependencies through `package.json`; it does not freeze transitive dependencies. For a reproducible production installation with the shipped pnpm lockfile, the alternative is: + +```sh +pnpm install --prod --frozen-lockfile --ignore-workspace --ignore-scripts +``` + +Neither path is needed for source review. Full workspace setup belongs in [CONTRIBUTING.md](../CONTRIBUTING.md), not in ordinary skill use. + +## Route by task + +Run `node "/scripts/dbdep.mjs" ` from the user's workspace, or installed `dbdep`. Examples below abbreviate that entry point to `dbdep`. + +- Schema exploration: read [parser and confidence](parser-and-confidence.md). Run `dbdep inspect --ddl [--repo ] --out out/schema.dbdep.json`, then `dbdep validate out/schema.dbdep.json --strict --json`. Run `dbdep render out/schema.dbdep.json --out out/dependencies.html` and `dbdep docs out/schema.dbdep.json --out out/report.md`. +- Impact: read [dependency semantics](dependency-semantics.md). Run `dbdep impact --object --operation alter-type --to uuid --json`. Use stable IDs for ambiguous objects or overloaded routines. `dbdep render --object --out out/impact.html` focuses the explorer. +- Migration review: read [migrations](migrations.md). Run `dbdep review --baseline --migration --out out/review --json`. Use `--transaction-mode single` for a runner that wraps the file in a transaction and `--metadata ` for labeled user-supplied size/traffic. Missing baseline is allowed but partial. `--fail-on high` is an optional policy gate; artifacts are still written on gate failure. Sequential operations are not replayed against an evolving schema. +- Comparison: run `dbdep diff --out out/diff --json`. Similar add/drop pairs are possible renames with UNKNOWN status, not confirmed renames. +- Supplied catalogs: read [PostgreSQL catalog](postgres-catalog.md), then `dbdep inspect --catalog --out out/catalog.dbdep.json`. +- Explicitly requested live discovery: read [security](security.md) and [PostgreSQL catalog](postgres-catalog.md). Use `dbdep inspect --dsn-env DBDEP_DATABASE_URL --mode read-only --out out/live.dbdep.json [--capture-out out/catalog.json]`. Never print or persist the DSN. There is no apply command. + +Use `dbdep demo ` for the three shipped demonstrations. See [troubleshooting](troubleshooting.md), [model validation](model.md) and [diagramming](diagramming.md) as needed. Host-language files contribute toolkit coverage gaps; manual ORM findings belong in a separate source review. + +Exit 0 means analysis completed, 2 means invalid input/prerequisites, and 3 means a requested policy gate failed. A successful analysis may contain high-risk findings. diff --git a/skills/database-dependency-migration/references/troubleshooting.md b/skills/database-dependency-migration/references/troubleshooting.md new file mode 100644 index 0000000..42d065b --- /dev/null +++ b/skills/database-dependency-migration/references/troubleshooting.md @@ -0,0 +1,11 @@ +# Troubleshooting + +Normal skill use needs no runtime. If Node.js, pnpm or toolkit packages are missing, use [source analysis](source-analysis.md) and deliver a source-cited review. Do not block that review on `doctor`, package installation or a build. + +For the optional toolkit, run `node scripts/dbdep.mjs doctor --json` or installed `dbdep doctor --json`. Node.js 22.18+ is required only for this path. See [toolkit setup](toolkit.md) for the production-only npm installation and frozen pnpm alternative. Contributors use the full workspace setup in [CONTRIBUTING.md](../CONTRIBUTING.md); browser binaries are for development tests. + +Exit 2 indicates invalid JSON/schema, unsupported capture version, missing dependency, malformed selector, ambiguous object, SQL syntax error or I/O failure. Fix the original source/model, then regenerate. Use stable node IDs for functions with overloads or constraints sharing names. SQL literals are excluded from parse errors; inspect the input locally for detail. + +Exit 3 indicates a requested risk policy failed, with artifacts still delivered. UNKNOWN gaps are report content, not model errors. Invalid models never render. PostgreSQL 14-18 catalogs use an exact capture query contract; future versions require an adapter update. The parser uses PostgreSQL 18 grammar, so older-server syntax needs release verification. + +Do not resolve uncertainty by guessing a search_path, routine body, implicit cast, row count or consumer transition. Request final schema declarations, a sanitized catalog capture, qualified identifiers or owner-provided operational evidence instead. diff --git a/skills/database-dependency-migration/schemas/dbdep.schema.json b/skills/database-dependency-migration/schemas/dbdep.schema.json new file mode 100644 index 0000000..9ffc03f --- /dev/null +++ b/skills/database-dependency-migration/schemas/dbdep.schema.json @@ -0,0 +1,575 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "urn:dbdep:1.0.0", + "title": "PostgreSQL dependency graph, source depends on target; reverse edges give impact", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "engine", + "snapshot", + "coverage", + "nodes", + "edges", + "evidence", + "findings", + "unknowns" + ], + "properties": { + "schema_version": { + "const": "1.0.0" + }, + "engine": { + "type": "object", + "required": [ + "name", + "version", + "source_mode" + ], + "additionalProperties": false, + "properties": { + "name": { + "const": "postgresql" + }, + "version": { + "type": "string", + "pattern": "^[0-9]+(?:[.][0-9]+)*$" + }, + "source_mode": { + "enum": [ + "offline_ddl", + "catalog_snapshot", + "live_read_only" + ] + } + } + }, + "snapshot": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "created_at", + "source_fingerprint" + ], + "properties": { + "id": { + "type": "string" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "source_fingerprint": { + "type": "string", + "pattern": "^sha256:[0-9a-f]{64}$" + } + } + }, + "coverage": { + "type": "object", + "additionalProperties": false, + "required": [ + "catalog_available", + "repository_scan", + "exhaustive", + "unresolved", + "capabilities" + ], + "properties": { + "catalog_available": { + "type": "boolean" + }, + "repository_scan": { + "type": "boolean" + }, + "exhaustive": { + "const": false + }, + "unresolved": { + "type": "integer", + "minimum": 0 + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + } + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/$defs/node" + } + }, + "edges": { + "type": "array", + "items": { + "$ref": "#/$defs/edge" + } + }, + "evidence": { + "type": "array", + "items": { + "$ref": "#/$defs/evidence" + } + }, + "findings": { + "type": "array", + "items": { + "$ref": "#/$defs/finding" + } + }, + "unknowns": { + "type": "array", + "items": { + "$ref": "#/$defs/unknown" + } + } + }, + "$defs": { + "node": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "evidence_ids", + "kind", + "schema", + "name", + "parent", + "signature", + "qualified_name", + "properties" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "evidence_ids": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "schema": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "qualified_name": { + "type": "string" + }, + "kind": { + "enum": [ + "schema", + "table", + "partitioned_table", + "view", + "materialized_view", + "column", + "sequence", + "index", + "constraint", + "type", + "function", + "procedure", + "trigger", + "query", + "extension" + ] + }, + "properties": { + "type": "object" + } + }, + "additionalProperties": false + }, + "edge": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "evidence_ids", + "source", + "target", + "kind", + "explanation", + "properties" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "evidence_ids": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "source": { + "type": "string" + }, + "target": { + "type": "string" + }, + "explanation": { + "type": "string" + }, + "kind": { + "enum": [ + "contains", + "foreign_key", + "catalog_dependency", + "query_reference", + "trigger_association", + "type_reference", + "partition", + "inheritance", + "expression_reference", + "sequence_ownership" + ] + }, + "properties": { + "type": "object" + } + }, + "additionalProperties": false + }, + "evidence": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "source_hash", + "explanation" + ], + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "source_hash": { + "type": "string", + "pattern": "^sha256:[0-9a-f]{64}$" + }, + "explanation": { + "type": "string" + }, + "path": { + "type": "string" + }, + "line_start": { + "type": "integer", + "minimum": 1 + }, + "line_end": { + "type": "integer", + "minimum": 1 + }, + "byte_start": { + "type": "integer", + "minimum": 0 + }, + "byte_length": { + "type": "integer", + "minimum": 0 + }, + "query_id": { + "type": "string" + }, + "captured_at": { + "type": "string" + }, + "catalog_address": { + "type": "string" + } + }, + "anyOf": [ + { + "required": [ + "path", + "line_start", + "line_end" + ] + }, + { + "required": [ + "query_id", + "captured_at" + ] + } + ] + }, + "finding": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "evidence_ids", + "rule_id", + "severity", + "risk_level", + "risk_dimensions", + "reason", + "remediation", + "evidence", + "object_ids" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "evidence_ids": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "rule_id": { + "type": "string", + "pattern": "^DDM00[1-9]$|^DDM01[0-5]$" + }, + "severity": { + "enum": [ + "info", + "warning", + "error" + ] + }, + "risk_level": { + "enum": [ + "low", + "medium", + "high", + "unknown" + ] + }, + "risk_dimensions": { + "type": "array", + "uniqueItems": true, + "items": { + "enum": [ + "data_loss", + "locking", + "rewrite", + "compatibility", + "deployment_order", + "unresolved_dependencies" + ] + } + }, + "reason": { + "type": "string" + }, + "remediation": { + "type": "string" + }, + "evidence": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "object_ids": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "unknown": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "evidence_ids", + "explanation", + "object_id" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "evidence_ids": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "explanation": { + "type": "string" + }, + "object_id": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + } +} diff --git a/skills/database-dependency-migration/schemas/findings.schema.json b/skills/database-dependency-migration/schemas/findings.schema.json new file mode 100644 index 0000000..8046850 --- /dev/null +++ b/skills/database-dependency-migration/schemas/findings.schema.json @@ -0,0 +1,114 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "origin", + "status", + "confidence", + "evidence_ids", + "rule_id", + "severity", + "risk_level", + "risk_dimensions", + "reason", + "remediation", + "evidence", + "object_ids" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "origin": { + "enum": [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic" + ] + }, + "status": { + "enum": [ + "OBSERVED", + "PARSED", + "INFERRED", + "UNKNOWN" + ] + }, + "confidence": { + "enum": [ + "direct", + "conditional", + "unknown" + ] + }, + "evidence_ids": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "rule_id": { + "type": "string", + "pattern": "^DDM00[1-9]$|^DDM01[0-5]$" + }, + "severity": { + "enum": [ + "info", + "warning", + "error" + ] + }, + "risk_level": { + "enum": [ + "low", + "medium", + "high", + "unknown" + ] + }, + "risk_dimensions": { + "type": "array", + "uniqueItems": true, + "items": { + "enum": [ + "data_loss", + "locking", + "rewrite", + "compatibility", + "deployment_order", + "unresolved_dependencies" + ] + } + }, + "reason": { + "type": "string" + }, + "remediation": { + "type": "string" + }, + "evidence": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "object_ids": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } +} diff --git a/skills/database-dependency-migration/schemas/report.schema.json b/skills/database-dependency-migration/schemas/report.schema.json new file mode 100644 index 0000000..5f34e62 --- /dev/null +++ b/skills/database-dependency-migration/schemas/report.schema.json @@ -0,0 +1,153 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Review-only migration report envelope; canonical model is a separate artifact", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "review_only", + "operations", + "impacts", + "plan", + "risk_level", + "metadata", + "limitations" + ], + "properties": { + "schema_version": { + "const": "1.0.0" + }, + "review_only": { + "const": true + }, + "operations": { + "type": "array", + "items": { + "type": "object", + "required": [ + "operation", + "object_id", + "evidence_ids" + ], + "properties": { + "operation": { + "type": "string" + }, + "object_id": { + "type": [ + "string", + "null" + ] + }, + "evidence_ids": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "impacts": { + "type": "array", + "items": { + "type": "object", + "required": [ + "root", + "direct", + "affected", + "paths", + "categories", + "unknowns", + "explanation" + ] + } + }, + "plan": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "phase", + "action", + "preconditions", + "verification", + "recovery", + "review_only" + ], + "properties": { + "phase": { + "enum": [ + "expand", + "backfill", + "validate", + "transition", + "contract" + ] + }, + "action": { + "type": "string", + "minLength": 1 + }, + "preconditions": { + "type": "string", + "minLength": 1 + }, + "verification": { + "type": "string", + "minLength": 1 + }, + "recovery": { + "type": "string", + "minLength": 1 + }, + "review_only": { + "const": true + } + } + } + }, + "risk_level": { + "enum": [ + "low", + "medium", + "high", + "unknown" + ] + }, + "metadata": { + "type": "object", + "required": [ + "origin", + "status", + "evidence_ids", + "tables" + ], + "properties": { + "origin": { + "const": "user_supplied" + }, + "status": { + "const": "INFERRED" + }, + "evidence_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "tables": { + "type": "object" + } + } + }, + "limitations": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/skills/database-dependency-migration/scripts/dbdep.mjs b/skills/database-dependency-migration/scripts/dbdep.mjs new file mode 100644 index 0000000..98a9b99 --- /dev/null +++ b/skills/database-dependency-migration/scripts/dbdep.mjs @@ -0,0 +1,3 @@ +#!/usr/bin/env node +import { main } from "../src/dbdep/cli.mjs"; +process.exitCode = await main(); diff --git a/skills/database-dependency-migration/src/dbdep/catalog.mjs b/skills/database-dependency-migration/src/dbdep/catalog.mjs new file mode 100644 index 0000000..5d53b38 --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/catalog.mjs @@ -0,0 +1,513 @@ +/** Fixed catalog discovery; supplied SQL and business rows never enter this API. */ +import pg from "pg"; +import { parse as parseConnectionString } from "pg-connection-string"; +import { Builder, canonical, digest, quoted } from "./model.mjs"; + +const USER_NS = + "n.nspname NOT LIKE 'pg_%' AND n.nspname <> 'information_schema'"; +// Exact historical queries validate offline 1.0.0 evidence only. +export const LEGACY_QUERIES = Object.freeze({ + server_version: + "SELECT pg_catalog.current_setting('server_version_num') AS version", + pg_namespace: `SELECT n.oid, n.nspname FROM pg_catalog.pg_namespace n WHERE ${USER_NS} ORDER BY n.oid`, + pg_class: `SELECT c.oid, n.nspname, c.relname, c.relkind, c.relispartition, c.reltuples, c.relpages FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY c.oid`, + pg_attribute: `SELECT a.attrelid, a.attnum, a.attname, a.atttypid, a.atttypmod, a.attnotnull, a.attidentity, a.attgenerated FROM pg_catalog.pg_attribute a JOIN pg_catalog.pg_class c ON c.oid=a.attrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} AND a.attnum>0 AND NOT a.attisdropped ORDER BY a.attrelid,a.attnum`, + pg_type: + "SELECT t.oid, n.nspname, t.typname, t.typtype, t.typrelid, t.typelem FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid=t.typnamespace ORDER BY t.oid", + pg_constraint: `SELECT k.oid, n.nspname, k.conname, k.contype, k.conrelid, k.confrelid, k.conkey, k.confkey, k.convalidated, k.conindid FROM pg_catalog.pg_constraint k JOIN pg_catalog.pg_namespace n ON n.oid=k.connamespace WHERE ${USER_NS} ORDER BY k.oid`, + pg_index: `SELECT i.indexrelid, i.indrelid, i.indkey::smallint[] AS indkey, i.indisvalid, i.indisready, i.indisunique FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class c ON c.oid=i.indrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY i.indexrelid`, + pg_depend: + "SELECT d.classid::regclass::text AS class_name, d.objid, d.objsubid, d.refclassid::regclass::text AS refclass_name, d.refobjid, d.refobjsubid, d.deptype FROM pg_catalog.pg_depend d ORDER BY d.classid,d.objid,d.objsubid,d.refclassid,d.refobjid,d.refobjsubid,d.deptype", + pg_rewrite: `SELECT r.oid, r.ev_class, r.rulename FROM pg_catalog.pg_rewrite r JOIN pg_catalog.pg_class c ON c.oid=r.ev_class JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY r.oid`, + pg_proc: `SELECT p.oid, n.nspname, p.proname, p.prokind, p.proargtypes::oid[] AS argument_types, p.prorettype FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid=p.pronamespace WHERE ${USER_NS} ORDER BY p.oid`, + pg_trigger: `SELECT t.oid, t.tgname, t.tgrelid, t.tgfoid, t.tgisinternal, t.tgattr::smallint[] AS tgattr FROM pg_catalog.pg_trigger t JOIN pg_catalog.pg_class c ON c.oid=t.tgrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY t.oid`, + pg_inherits: `SELECT i.inhrelid, i.inhparent FROM pg_catalog.pg_inherits i JOIN pg_catalog.pg_class c ON c.oid=i.inhrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY i.inhrelid,i.inhparent`, + pg_extension: + "SELECT e.oid, n.nspname, e.extname, e.extversion FROM pg_catalog.pg_extension e JOIN pg_catalog.pg_namespace n ON n.oid=e.extnamespace ORDER BY e.oid", + pg_attrdef: `SELECT a.oid, a.adrelid, a.adnum, pg_catalog.pg_get_expr(a.adbin,a.adrelid) AS expression FROM pg_catalog.pg_attrdef a JOIN pg_catalog.pg_class c ON c.oid=a.adrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY a.oid`, +}); +export const QUERIES = Object.freeze({ + ...LEGACY_QUERIES, + // pg_get_expr can invoke a custom constant type's output routine while + // deparsing. Read stored pg_node_tree text without traversing expressions. + pg_attrdef: `SELECT a.oid, a.adrelid, a.adnum, a.adbin::text AS expression FROM pg_catalog.pg_attrdef a JOIN pg_catalog.pg_class c ON c.oid=a.adrelid JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE ${USER_NS} ORDER BY a.oid`, +}); + +/** Accept libpq keyword DSNs and PostgreSQL URLs without ever exposing values. */ +export function connection_config(dsn) { + if (typeof dsn !== "string" || !dsn.trim()) + throw new Error("The requested DSN is unavailable"); + let parsed; + if (/^postgres(?:ql)?:\/\//i.test(dsn)) { + const parameters = new URLSearchParams( + dsn.includes("?") ? dsn.slice(dsn.indexOf("?") + 1).split("#", 1)[0] : "", + ); + if ( + [ + "service", + "servicefile", + "hostaddr", + "dbname", + "database", + "target_session_attrs", + "load_balance_hosts", + ].some((key) => parameters.has(key)) + ) + throw new Error("Unsupported DSN parameter"); + parsed = parseConnectionString(dsn); + } else { + parsed = Object.create(null); + const supported = new Set([ + "host", + "port", + "user", + "password", + "dbname", + "database", + "ssl", + "sslmode", + "options", + ]); + const tokens = /\s*([a-z_]+)\s*=\s*('(?:\\.|[^'\\])*'|(?:\\.|[^\s])+)/gy; + let index = 0; + while (index < dsn.length) { + if (!dsn.slice(index).trim()) break; + tokens.lastIndex = index; + const match = tokens.exec(dsn); + if (!match) throw new Error("Unsupported DSN syntax"); + if (!supported.has(match[1])) + throw new Error("Unsupported DSN parameter"); + let value = match[2]; + if (value.startsWith("'")) value = value.slice(1, -1); + value = value.replace(/\\(.)/gs, "$1"); + parsed[match[1] === "dbname" ? "database" : match[1]] = value; + index = tokens.lastIndex; + } + if (parsed.sslmode !== undefined) { + if ( + !["disable", "require", "verify-ca", "verify-full"].includes( + parsed.sslmode, + ) + ) + throw new Error("Unsupported SSL mode in keyword DSN"); + parsed.ssl = parsed.sslmode !== "disable"; + } else if (parsed.ssl !== undefined) { + if (["false", "0"].includes(parsed.ssl)) parsed.ssl = false; + else if (["true", "1"].includes(parsed.ssl)) parsed.ssl = true; + else if (parsed.ssl !== "no-verify") + throw new Error("Unsupported SSL setting in keyword DSN"); + } + } + const config = {}; + for (const key of ["host", "port", "user", "password", "database", "ssl"]) { + if (parsed[key] !== undefined) config[key] = parsed[key]; + } + // A DSN's options cannot override these startup safeguards. + return { + ...config, + connectionTimeoutMillis: 5000, + query_timeout: 11000, + options: + "-c default_transaction_read_only=on -c statement_timeout=10000 -c lock_timeout=2000 -c search_path=pg_catalog", + }; +} + +export async function capture(dsn) { + const result = { + capture_version: "1.1.0", + captured_at: new Date().toISOString(), + queries: {}, + }; + let client; + try { + client = new pg.Client(connection_config(dsn)); + await client.connect(); + // Transaction control is fixed; every discovery query is in the SELECT allowlist. + await client.query("BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY"); + for (const [qid, sql] of Object.entries(QUERIES)) { + const { rows } = await client.query(sql); + if (qid === "pg_attrdef") { + for (const row of rows) { + row.expression_hash = digest(row.expression); + delete row.expression; + } + } + result.queries[qid] = { sql_hash: digest(sql), rows }; + } + await client.query("COMMIT"); + } catch { + throw new Error( + "Read-only catalog capture failed; no connection details are included. Check connectivity, role permissions and PostgreSQL version locally.", + ); + } finally { + if (client) await client.end().catch(() => {}); + } + const version = Math.floor( + Number(result.queries.server_version.rows[0].version) / 10000, + ); + if (!(version >= 14 && version <= 18)) + throw new Error("Live adapter supports PostgreSQL 14-18 only"); + return result; +} + +export function inspect_catalog(data) { + const expected = + data?.capture_version === "1.1.0" + ? QUERIES + : data?.capture_version === "1.0.0" + ? LEGACY_QUERIES + : null; + if (!expected) throw new Error("Unsupported catalog capture version"); + const queries = data.queries ?? {}; + if ( + Object.keys(queries).sort().join(",") !== + Object.keys(expected).sort().join(",") + ) + throw new Error("Catalog capture query set is incomplete or unknown"); + for (const [qid, q] of Object.entries(queries)) { + if (q.sql_hash !== digest(expected[qid])) + throw new Error(`Catalog query hash mismatch: ${qid}`); + if ( + !Array.isArray(q.rows) || + q.rows.some((r) => !r || typeof r !== "object" || Array.isArray(r)) + ) + throw new Error("Malformed catalog row structure"); + } + const version = String( + Math.floor(Number(queries.server_version.rows[0]?.version) / 10000), + ); + if (!(Number(version) >= 14 && Number(version) <= 18)) + throw new Error("Catalog adapter supports PostgreSQL 14-18"); + const b = new Builder(version, "catalog_snapshot"); + b.model.snapshot.created_at = data.captured_at; + b.model.coverage.catalog_available = true; + const addresses = new Map(), + relations = new Map(), + columns = new Map(); + const key = (...parts) => parts.join(":"); + const types = new Map(queries.pg_type.rows.map((r) => [r.oid, r])); + const namespaces = new Set(queries.pg_namespace.rows.map((r) => r.nspname)); + const provenance = new Map(); + const ev = (qid, address = "") => { + if (!provenance.has(qid)) + provenance.set(qid, { + source_hash: digest(canonical(queries[qid])), + addresses: new Map(), + }); + const record = provenance.get(qid); + if (!record.addresses.has(address)) + record.addresses.set( + address, + b.evidence(qid, Buffer.alloc(0), 0, 0, "OBSERVED", "postgres_catalog", { + source_hash: record.source_hash, + query_id: qid, + captured_at: data.captured_at, + catalog_address: address, + explanation: + "Direct catalog metadata from the supplied snapshot; not runtime or production-load proof.", + }), + ); + return record.addresses.get(address); + }; + const node = ( + qid, + oid, + kind, + schema, + name, + parent = "", + signature = "", + properties = {}, + ) => { + const addr = `${qid}:${oid}:0`; + const n = b.node( + kind, + schema, + name, + ev(qid, addr), + parent, + signature, + { oid, catalog_address: addr, ...properties }, + "OBSERVED", + "postgres_catalog", + ); + addresses.set(key(qid, oid, 0), n); + return n; + }; + const edge = (source, target, kind, qid, properties = null, address = "") => { + if (source && target) + b.edge( + source, + target, + kind, + ev(qid, address), + "OBSERVED", + "postgres_catalog", + properties, + ); + }; + for (const r of queries.pg_namespace.rows) + node("pg_namespace", r.oid, "schema", r.nspname, r.nspname); + for (const r of queries.pg_class.rows) { + const kind = { + r: "table", + p: "partitioned_table", + v: "view", + m: "materialized_view", + S: "sequence", + i: "index", + I: "index", + }[r.relkind]; + if (kind) + relations.set( + r.oid, + node("pg_class", r.oid, kind, r.nspname, r.relname, "", "", { + relkind: r.relkind, + is_partition: r.relispartition, + reltuples: r.reltuples, + relpages: r.relpages, + statistics_source: "pg_class estimates, not row counts", + }), + ); + } + for (const r of queries.pg_type.rows) + if (namespaces.has(r.nspname)) + node("pg_type", r.oid, "type", r.nspname, r.typname, "", "", { + typtype: r.typtype, + internal: Boolean(r.typrelid || r.typelem), + }); + const type_name = (oid) => { + const t = types.get(oid) ?? {}; + return ( + (t.nspname && t.nspname !== "pg_catalog" ? `${quoted(t.nspname)}.` : "") + + quoted(t.typname ?? "unknown") + ); + }; + for (const r of queries.pg_attribute.rows) { + const rel = relations.get(r.attrelid); + if (!rel || ["index", "sequence"].includes(rel.kind)) continue; + const addr = `pg_class:${r.attrelid}:${r.attnum}`; + const props = { + type: type_name(r.atttypid), + typmod: r.atttypmod, + nullable: !r.attnotnull, + catalog_address: addr, + }; + if (r.attidentity) props.identity = r.attidentity; + if (r.attgenerated) props.generated = r.attgenerated; + const n = b.node( + "column", + rel.schema, + r.attname, + ev("pg_attribute", addr), + rel.name, + "", + props, + "OBSERVED", + "postgres_catalog", + ); + columns.set(key(r.attrelid, r.attnum), n); + addresses.set(key("pg_class", r.attrelid, r.attnum), n); + edge(n, rel, "contains", "pg_attribute", null, addr); + edge( + n, + addresses.get(key("pg_type", r.atttypid, 0)), + "type_reference", + "pg_attribute", + null, + addr, + ); + } + for (const r of queries.pg_attrdef.rows) { + const col = columns.get(key(r.adrelid, r.adnum)); + if (col) { + col.properties.default = r.expression_hash; + addresses.set(key("pg_attrdef", r.oid, 0), col); + } + } + for (const r of queries.pg_proc.rows) { + if (!["f", "p"].includes(r.prokind)) continue; + const n = node( + "pg_proc", + r.oid, + r.prokind === "p" ? "procedure" : "function", + r.nspname, + r.proname, + "", + r.argument_types.map(type_name).join(","), + { return_type: type_name(r.prorettype) }, + ); + b.unknown( + "Routine body/runtime references can be untracked by pg_depend; bodies are not extracted or analyzed.", + n.evidence_ids[0], + n.id, + ); + } + for (const r of queries.pg_constraint.rows) { + const rel = relations.get(r.conrelid); + const n = node( + "pg_constraint", + r.oid, + "constraint", + r.nspname, + r.conname, + rel?.name ?? "", + "", + { + constraint_type: + { + f: "foreign_key", + p: "primary_key", + u: "unique", + c: "check", + x: "exclusion", + n: "not_null", + }[r.contype] ?? r.contype, + validated: r.convalidated, + columns: (r.conkey ?? []) + .map((a) => columns.get(key(r.conrelid, a))?.name) + .filter((v) => v !== undefined), + }, + ); + edge(n, rel, "contains", "pg_constraint"); + for (const a of r.conkey ?? []) + edge( + n, + columns.get(key(r.conrelid, a)), + "expression_reference", + "pg_constraint", + ); + if (r.contype === "f") { + const target = relations.get(r.confrelid); + edge(rel, target, "foreign_key", "pg_constraint", { constraint: n.id }); + edge(n, target, "foreign_key", "pg_constraint"); + for ( + let i = 0; + i < Math.min(r.conkey?.length ?? 0, r.confkey?.length ?? 0); + i++ + ) { + const cn = columns.get(key(r.conrelid, r.conkey[i])), + tn = columns.get(key(r.confrelid, r.confkey[i])); + edge(n, tn, "foreign_key", "pg_constraint"); + edge(cn, tn, "foreign_key", "pg_constraint", { constraint: n.id }); + } + } + } + for (const r of queries.pg_index.rows) { + const n = relations.get(r.indexrelid); + if (n) { + Object.assign(n.properties, { + valid: r.indisvalid, + ready: r.indisready, + unique: r.indisunique, + }); + edge(n, relations.get(r.indrelid), "contains", "pg_index"); + for (const a of r.indkey) + edge( + n, + columns.get(key(r.indrelid, a)), + "expression_reference", + "pg_index", + ); + } + } + for (const r of queries.pg_rewrite.rows) + if (relations.has(r.ev_class)) + addresses.set(key("pg_rewrite", r.oid, 0), relations.get(r.ev_class)); + for (const r of queries.pg_trigger.rows) { + const rel = relations.get(r.tgrelid); + if (!rel) continue; + const n = node( + "pg_trigger", + r.oid, + "trigger", + rel.schema, + r.tgname, + rel.name, + "", + { internal: r.tgisinternal }, + ); + edge(n, rel, "trigger_association", "pg_trigger"); + edge( + n, + addresses.get(key("pg_proc", r.tgfoid, 0)), + "trigger_association", + "pg_trigger", + ); + for (const a of r.tgattr) + edge( + n, + columns.get(key(r.tgrelid, a)), + "expression_reference", + "pg_trigger", + ); + } + for (const r of queries.pg_inherits.rows) { + const rel = relations.get(r.inhrelid); + edge( + rel, + relations.get(r.inhparent), + rel?.properties.is_partition ? "partition" : "inheritance", + "pg_inherits", + ); + } + for (const r of queries.pg_extension.rows) + node("pg_extension", r.oid, "extension", r.nspname, r.extname, "", "", { + version: r.extversion, + }); + let unresolved = 0; + for (const r of queries.pg_depend.rows) { + const cls = r.class_name.replace(/^pg_catalog\./, ""), + refcls = r.refclass_name.replace(/^pg_catalog\./, ""); + const source = addresses.get(key(cls, r.objid, r.objsubid)), + target = addresses.get(key(refcls, r.refobjid, r.refobjsubid)); + if (!source) continue; + if (!target) { + if ( + ![ + "pg_type", + "pg_namespace", + "pg_collation", + "pg_proc", + "pg_language", + "pg_am", + "pg_operator", + "pg_opclass", + ].includes(refcls) + ) + unresolved++; + continue; + } + const address = `${cls}:${r.objid}:${r.objsubid}->${refcls}:${r.refobjid}:${r.refobjsubid}`; + const kind = + source.kind === "sequence" && + target.kind === "column" && + ["a", "i"].includes(r.deptype) + ? "sequence_ownership" + : "catalog_dependency"; + edge( + source, + target, + kind, + "pg_depend", + { dependency_type: r.deptype, catalog_address: address, via: cls }, + address, + ); + } + if (unresolved) + b.unknown( + `${unresolved} catalog endpoints outside modeled object classes remain unresolved.`, + ev("pg_depend"), + ); + b.unknown( + "Catalog dependencies cover recorded edges only; repository/runtime consumers and some object definitions are unavailable.", + ev("server_version"), + ); + b.model.coverage.capabilities = [ + "catalog_objects", + "pg_depend", + "pg_rewrite_ownership", + "reverse_dependencies", + ]; + return b.finish(); +} diff --git a/skills/database-dependency-migration/src/dbdep/cli.mjs b/skills/database-dependency-migration/src/dbdep/cli.mjs new file mode 100644 index 0000000..5c9ef44 --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/cli.mjs @@ -0,0 +1,417 @@ +/** Analysis-only CLI. Invalid input exits 2; a requested risk gate exits 3. */ +import { Command, Option } from "commander"; +import { readFileSync, existsSync } from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { createRequire } from "node:module"; +import { Builder, canonical, resources, validate } from "./model.mjs"; +import { inspect_ddl } from "./sql.mjs"; +import { select, impact, diff } from "./graph.mjs"; +import { review } from "./rules.mjs"; +import { capture, inspect_catalog } from "./catalog.mjs"; +import { + bundle, + dot, + markdown, + mermaid, + render, + require_valid, + summary, + write, + bundle_names, + protect_inputs, + check_output_path, +} from "./reports.mjs"; + +const manifest = JSON.parse( + readFileSync(join(resources(), "package.json"), "utf8"), +); +const json = (path) => JSON.parse(readFileSync(path, "utf8")); +export function load_model(path) { + const model = json(path); + require_valid(model); + return model; +} + +export function comparison_model(before, after, changes) { + const b = new Builder(after.engine.version); + b.model = structuredClone(after); + b.nodes = new Map(b.model.nodes.map((n) => [n.id, n])); + b.edges = new Map(b.model.edges.map((e) => [e.id, e])); + for (const model of [b.model, structuredClone(before)]) { + for (const e of model.evidence) { + const field = "path" in e ? "path" : "query_id"; + e[field] = `${model.snapshot.id}/${e[field]}`; + } + if (model !== b.model) { + for (const n of model.nodes) + if (changes.removed.includes(n.id)) b.nodes.set(n.id, n); + for (const e of model.edges) + if (b.nodes.has(e.source) && b.nodes.has(e.target)) + b.edges.set(e.id, e); + const known = new Set(b.model.evidence.map((e) => e.id)); + b.model.evidence.push(...model.evidence.filter((e) => !known.has(e.id))); + } + } + return b.finish(); +} +export function demo(directory) { + const ex = join(resources(), "examples"); + let m = inspect_ddl( + join(ex, "ecommerce/schema.sql"), + join(ex, "ecommerce/app"), + ); + let r = review( + m, + join(ex, "ecommerce/migrations/003_contract_legacy_id.sql"), + ); + const a = bundle( + join(directory, "ecommerce"), + r.model, + r, + null, + select(m, "public.customers.id").id, + ); + m = inspect_catalog(json(join(ex, "analytics/catalog.json"))); + r = review(m, join(ex, "analytics/drop.sql")); + const b = bundle( + join(directory, "analytics"), + r.model, + r, + null, + select(m, "sales.orders.total_amount").id, + ); + m = inspect_ddl(join(ex, "ecommerce/schema.sql"), join(ex, "ecommerce/app")); + r = review( + m, + join(ex, "high-traffic/migrations/007.sql"), + "18", + json(join(ex, "high-traffic/workload-profile.json")), + ); + const c = bundle( + join(directory, "high-traffic"), + r.model, + r, + null, + select(m, "public.orders.total_amount").id, + ); + return { ecommerce: a, analytics: b, "high-traffic": c }; +} +function installed_version(dependency) { + try { + const require = createRequire(import.meta.url); + let directory = dirname(require.resolve(dependency)); + while (directory !== dirname(directory)) { + const candidate = join(directory, "package.json"); + if (existsSync(candidate)) { + const pkg = json(candidate); + if (pkg.name === dependency) return pkg.version; + } + directory = dirname(directory); + } + } catch { + /* doctor reports unavailable without a sensitive resolver exception */ + } + return null; +} +export async function run(args) { + const command = args.command; + const inputs = [ + "catalog", + "model", + "baseline", + "migration", + "metadata", + "before", + "after", + ].map((key) => ({ path: args[key] })); + inputs.push( + { path: args.ddl, extensions: [".sql"] }, + { + path: args.repo, + extensions: [".sql", ".ts", ".js", ".py", ".cs", ".prisma", ".java"], + }, + ); + const outputs = ["review", "diff"].includes(command) + ? bundle_names.map((name) => join(args.out, name)) + : command === "demo" + ? ["ecommerce", "analytics", "high-traffic"].flatMap((slug) => + bundle_names.map((name) => join(args.out, slug, name)), + ) + : [args.out, args.captureOut].filter(Boolean); + for (const path of outputs) check_output_path(path); + protect_inputs(outputs, inputs); + if (command === "inspect" || command === "snapshot") { + if ([args.ddl, args.catalog, args.dsnEnv].filter(Boolean).length !== 1) + throw new Error("Choose exactly one of --ddl, --catalog or --dsn-env"); + if (args.captureOut && !args.dsnEnv) + throw new Error("--capture-out requires live discovery"); + let model; + if (args.ddl) model = inspect_ddl(args.ddl, args.repo, args.pgVersion); + else { + if (args.repo) + throw new Error( + "Catalog plus repository merging is unavailable; use a separate offline inspection", + ); + let data; + if (args.catalog) data = json(args.catalog); + else { + if (args.mode !== "read-only") + throw new Error("Explicit live discovery requires --mode read-only"); + const dsn = process.env[args.dsnEnv]; + if (!dsn) + throw new Error("The requested DSN environment variable is unset"); + data = await capture(dsn); + if (args.captureOut) write(args.captureOut, canonical(data)); + } + model = inspect_catalog(data); + if (args.dsnEnv) model.engine.source_mode = "live_read_only"; + } + require_valid(model); + write(args.out, canonical(model)); + return [{ model: resolve(args.out), summary: summary(model) }, 0]; + } + if (command === "validate") { + const errors = validate(json(args.model), args.strict); + return [{ valid: errors.length === 0, errors }, errors.length ? 2 : 0]; + } + if (["render", "docs", "mermaid", "dot"].includes(command)) { + const model = load_model(args.model); + const content = + command === "render" + ? render( + model, + null, + null, + args.object ? select(model, args.object).id : null, + ) + : { docs: markdown, mermaid, dot }[command](model); + write(args.out, content); + return [{ artifact: resolve(args.out) }, 0]; + } + if (command === "impact") { + const result = impact( + load_model(args.model), + args.object, + args.operation, + args.to, + ); + if (args.out) write(args.out, canonical(result)); + return [result, 0]; + } + if (command === "review") { + const baseline = args.baseline ? load_model(args.baseline) : null; + const r = review( + baseline, + args.migration, + args.pgVersion, + args.metadata ? json(args.metadata) : null, + args.transactionMode, + ); + const delivered = bundle( + args.out, + r.model, + r, + null, + r.impacts[0]?.root ?? null, + ); + const levels = new Set(r.model.findings.map((f) => f.risk_level)); + const gates = { + high: ["high"], + medium: ["high", "medium"], + unknown: ["high", "medium", "unknown"], + }; + const failed = Boolean( + args.failOn && gates[args.failOn].some((l) => levels.has(l)), + ); + return [ + { + ...delivered, + risk_level: r.risk_level, + policy_passed: !failed, + review_only: true, + }, + failed ? 3 : 0, + ]; + } + if (command === "diff") { + const before = load_model(args.before), + after = load_model(args.after), + changes = diff(before, after); + bundle(args.out, comparison_model(before, after, changes), null, changes); + write(join(args.out, "before.dbdep.json"), canonical(before)); + write(join(args.out, "after.dbdep.json"), canonical(after)); + return [changes, 0]; + } + if (command === "demo") return [demo(args.out), 0]; + if (command === "doctor") { + const dependencies = Object.fromEntries( + ["libpg-query", "ajv", "pg"].map((d) => [d, installed_version(d)]), + ); + const ready = + Object.values(dependencies).every(Boolean) && + existsSync(join(resources(), "assets/viewer/viewer.js")); + return [ + { + ready, + version: manifest.version, + node: process.versions.node, + dependencies, + postgresql: { + grammar: "18", + live_adapter: "14-18", + runtime_coverage: "partial", + }, + offline: true, + migration_execution: false, + }, + ready ? 0 : 2, + ]; + } + throw new Error("Unsupported command"); +} + +export function parser(onArgs) { + const program = new Command() + .name("dbdep") + .description("PostgreSQL dependency analysis; never execute migrations") + .version(manifest.version) + .exitOverride(); + program.configureOutput({ writeErr: () => {} }); + const bind = (cmd, fields = []) => + cmd.action((...values) => { + const child = values.at(-1); + const args = { command: child.name(), ...child.opts() }; + for (let i = 0; i < fields.length; i++) args[fields[i]] = values[i]; + onArgs(args); + }); + const pgVersion = () => + new Option("--pg-version ") + .choices(["14", "15", "16", "17", "18"]) + .default("18"); + bind( + program + .command("inspect") + .alias("snapshot") + .description( + "Offline DDL/catalog or explicitly requested read-only discovery", + ) + .option("--ddl ") + .option("--catalog ") + .option("--dsn-env ") + .addOption(new Option("--mode ").choices(["read-only"])) + .option("--repo ") + .addOption(pgVersion()) + .option("--capture-out ") + .requiredOption("--out ") + .option("--json"), + ); + bind( + program + .command("validate") + .argument("") + .option("--strict") + .option("--json"), + ["model"], + ); + for (const command of ["render", "docs", "mermaid", "dot"]) { + const cmd = program + .command(command) + .argument("") + .requiredOption("--out "); + if (command === "render") cmd.option("--object "); + bind(cmd, ["model"]); + } + bind( + program + .command("impact") + .argument("") + .requiredOption("--object ") + .addOption( + new Option("--operation ").choices([ + "drop-column", + "rename-column", + "alter-type", + "drop-table", + "replace-view", + ]), + ) + .option("--to ") + .option("--out ") + .option("--json"), + ["model"], + ); + bind( + program + .command("review") + .option("--baseline ") + .requiredOption("--migration ") + .option("--metadata ") + .addOption(pgVersion()) + .addOption( + new Option("--transaction-mode ") + .choices(["statements", "single"]) + .default("statements"), + ) + .addOption( + new Option("--fail-on ").choices(["high", "medium", "unknown"]), + ) + .requiredOption("--out ") + .option("--json"), + ); + bind( + program + .command("diff") + .argument("") + .argument("") + .requiredOption("--out ") + .option("--json"), + ["before", "after"], + ); + bind(program.command("demo").argument("").option("--json"), ["out"]); + bind(program.command("doctor").option("--json")); + return program; +} +export async function main(argv = process.argv) { + let args; + try { + const p = parser((a) => { + args = a; + }); + p.parse(argv); + if (!args) { + p.outputHelp(); + return 2; + } + const [result, code] = await run(args); + process.stdout.write( + args.json ? canonical(result) : JSON.stringify(result) + "\n", + ); + return code; + } catch (error) { + if ( + error.code === "commander.helpDisplayed" || + error.code === "commander.version" + ) + return 0; + let message = error.message; + if (error.code?.startsWith("commander.")) + message = "Invalid command or arguments; use dbdep --help"; + else if ( + error.code && + ["ENOENT", "EACCES", "EPERM", "EISDIR"].includes(error.code) + ) + message = + "Cannot read/write the requested local artifact; check paths and permissions"; + else if (error instanceof SyntaxError) + message = "Invalid JSON input; inspect the local artifact"; + else if (error instanceof TypeError || error instanceof RangeError) + message = "Malformed input structure; inspect the local input contract"; + // Never print credential-bearing strings or arbitrary driver exception details. + if (/postgres(?:ql)?:\/\/|password\s*=/i.test(message)) + message = "Input contains forbidden connection details"; + process.stderr.write( + JSON.stringify({ error: message, exit_code: 2 }) + "\n", + ); + return 2; + } +} diff --git a/skills/database-dependency-migration/src/dbdep/engine.mjs b/skills/database-dependency-migration/src/dbdep/engine.mjs new file mode 100644 index 0000000..fc17550 --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/engine.mjs @@ -0,0 +1,5 @@ +/** Native Node public library facade. All schema and migration SQL is analysis only. */ +export { diff, impact, select } from "./graph.mjs"; +export { canonical, digest, validate, resources } from "./model.mjs"; +export { inspect_ddl } from "./sql.mjs"; +export { review, assess_operation } from "./rules.mjs"; diff --git a/skills/database-dependency-migration/src/dbdep/graph.mjs b/skills/database-dependency-migration/src/dbdep/graph.mjs new file mode 100644 index 0000000..e19fb4f --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/graph.mjs @@ -0,0 +1,190 @@ +/** Reverse dependencies, bounded identity resolution and snapshot comparison. */ +import { statements } from "./sql.mjs"; +import { canonical, compare } from "./model.mjs"; +import { assess_operation } from "./rules.mjs"; +import { normalize_target_type } from "./types.mjs"; +export { normalize_target_type } from "./types.mjs"; + +export function select(model, selector) { + const direct = model.nodes.find((n) => n.id === selector); + if (direct) return direct; + let names; + try { + const stmts = statements("SELECT " + selector), + body = stmts[0].stmt.SelectStmt; + const fields = body.targetList[0].ResTarget.val.ColumnRef.fields; + names = fields.map((f) => { + if (!f.String) throw new Error(); + return f.String.sval; + }); + if ( + stmts.length !== 1 || + body.targetList.length !== 1 || + names.length < 1 || + names.length > 3 || + Object.keys(body).some( + (k) => !["targetList", "limitOption", "op"].includes(k), + ) + ) + throw new Error(); + } catch { + throw new Error( + "Malformed selector; use schema.table.column or a stable node ID", + ); + } + const matches = model.nodes.filter((n) => { + const parts = [n.schema, ...(n.parent ? [n.parent] : []), n.name]; + return ( + parts.length >= names.length && + parts.slice(-names.length).every((v, i) => v === names[i]) + ); + }); + if (matches.length !== 1) + throw new Error( + "Object selector is ambiguous or absent; use a stable node ID", + ); + return matches[0]; +} +export function impact(model, selector, operation = null, to = null) { + to = normalize_target_type(to); + const root = select(model, selector).id, + reverse = new Map(); + for (const e of model.edges) { + if (!reverse.has(e.target)) reverse.set(e.target, []); + reverse.get(e.target).push(e); + } + const paths = new Map([[root, []]]), + queue = [root]; + for (let index = 0; index < queue.length; index++) { + const target = queue[index]; + for (const e of (reverse.get(target) ?? []).sort((a, b) => + compare(a.id, b.id), + )) + if (!paths.has(e.source)) { + paths.set(e.source, [e.id, ...paths.get(target)]); + queue.push(e.source); + } + } + const affected = [...paths.keys()].filter((k) => k !== root).sort(compare), + direct = [...new Set((reverse.get(root) ?? []).map((e) => e.source))] + .filter((k) => k !== root) + .sort(compare); + const categories = { + recorded_catalog: [], + static_reference: [], + inferred: [], + }, + byEdge = new Map(model.edges.map((e) => [e.id, e])); + for (const n of affected) { + const statuses = new Set(paths.get(n).map((e) => byEdge.get(e).status)); + const category = + statuses.has("INFERRED") || statuses.has("UNKNOWN") + ? "inferred" + : statuses.has("PARSED") + ? "static_reference" + : "recorded_catalog"; + categories[category].push(n); + } + const result = { + root, + operation, + to, + direct, + affected, + paths: Object.fromEntries( + [...paths.entries()] + .filter(([k]) => k !== root) + .sort(([a], [b]) => compare(a, b)), + ), + categories, + unknowns: model.unknowns, + explanation: + "Reverse paths show potential impact. They do not prove execution failure or exhaustive runtime coverage.", + }; + if (operation) + Object.assign( + result, + assess_operation(model, select(model, selector), operation, to), + ); + return result; +} +export function diff(before, after) { + const bn = new Map(before.nodes.map((n) => [n.id, n])), + an = new Map(after.nodes.map((n) => [n.id, n])); + const added = [...an.keys()].filter((k) => !bn.has(k)).sort(compare), + removed = [...bn.keys()].filter((k) => !an.has(k)).sort(compare); + const comparable = (n) => ({ + ...Object.fromEntries( + Object.entries(n).filter( + ([k]) => + ![ + "evidence_ids", + "status", + "origin", + "confidence", + "properties", + ].includes(k), + ), + ), + properties: Object.fromEntries( + Object.entries(n.properties).filter( + ([k]) => + !["oid", "catalog_address", "reltuples", "relpages"].includes(k), + ), + ), + }); + const matched = [...bn.keys()].filter((k) => an.has(k)).sort(compare), + modified = matched.filter( + (k) => + canonical(comparable(bn.get(k))) !== canonical(comparable(an.get(k))), + ); + const edgeKey = (e) => + canonical([ + e.source, + e.target, + e.kind, + Object.fromEntries( + Object.entries(e.properties).filter(([k]) => k !== "catalog_address"), + ), + ]); + const be = new Map(before.edges.map((e) => [edgeKey(e), e.id])), + ae = new Map(after.edges.map((e) => [edgeKey(e), e.id])), + candidates = []; + for (const r of removed) + for (const a of added) { + const old = bn.get(r), + next = an.get(a); + if ( + old.kind === "column" && + next.kind === "column" && + old.schema === next.schema && + old.parent === next.parent && + old.properties.type === next.properties.type + ) + candidates.push({ + removed: r, + added: a, + status: "UNKNOWN", + explanation: + "Possible rename; add/drop remains the observed change. Human confirmation required.", + }); + } + return { + schema_version: "1.0.0", + before: before.snapshot.id, + after: after.snapshot.id, + added, + removed, + modified, + matched, + edges_added: [...ae.keys()] + .filter((k) => !be.has(k)) + .map((k) => ae.get(k)) + .sort(compare), + edges_removed: [...be.keys()] + .filter((k) => !ae.has(k)) + .map((k) => be.get(k)) + .sort(compare), + rename_candidates: candidates, + }; +} diff --git a/skills/database-dependency-migration/src/dbdep/model.mjs b/skills/database-dependency-migration/src/dbdep/model.mjs new file mode 100644 index 0000000..72a5602 --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/model.mjs @@ -0,0 +1,375 @@ +/** Canonical identity, evidence and secret-safe semantic validation. */ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import Ajv2020 from "ajv/dist/2020.js"; +import addFormats from "ajv-formats"; + +export const STATUSES = ["OBSERVED", "PARSED", "INFERRED", "UNKNOWN"]; +export const ORIGINS = [ + "postgres_catalog", + "sql_file", + "migration_diff", + "application_source", + "user_supplied", + "heuristic", +]; +export const KINDS = [ + "schema", + "table", + "partitioned_table", + "view", + "materialized_view", + "column", + "sequence", + "index", + "constraint", + "type", + "function", + "procedure", + "trigger", + "query", + "extension", +]; +export const EDGE_KINDS = [ + "contains", + "foreign_key", + "catalog_dependency", + "query_reference", + "trigger_association", + "type_reference", + "partition", + "inheritance", + "expression_reference", + "sequence_ownership", +]; +export const resources = () => + path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); + +const ascii = (value) => + JSON.stringify(value).replace( + /[\u007f-\uffff]/g, + (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`, + ); +export function compare(a, b) { + const ac = Array.from(String(a), (c) => c.codePointAt(0)), + bc = Array.from(String(b), (c) => c.codePointAt(0)); + for (let i = 0; i < Math.min(ac.length, bc.length); i++) + if (ac[i] !== bc[i]) return ac[i] - bc[i]; + return ac.length - bc.length; +} +/** Python-compatible sorted-key JSON. Compact form uses Python's default separators. */ +export function json_sorted(value, indent = null) { + const seen = new Set(); + function serialize(v, depth) { + if (v === null || typeof v === "boolean" || typeof v === "string") + return ascii(v); + if (typeof v === "number") { + if (!Number.isFinite(v)) + throw new TypeError("Canonical JSON requires finite numbers"); + return JSON.stringify(v); + } + if (typeof v !== "object" || v === undefined) + throw new TypeError("Canonical JSON requires JSON values"); + if (seen.has(v)) + throw new TypeError("Canonical JSON cannot contain circular values"); + seen.add(v); + const isArray = Array.isArray(v), + keys = isArray ? v.map((_, i) => i) : Object.keys(v).sort(compare); + const begin = isArray ? "[" : "{", + end = isArray ? "]" : "}"; + let result; + if (!keys.length) result = begin + end; + else { + const values = keys.map( + (k) => (isArray ? "" : ascii(k) + ": ") + serialize(v[k], depth + 1), + ); + result = + indent === null + ? begin + values.join(", ") + end + : begin + + "\n" + + values + .map((x) => " ".repeat((depth + 1) * indent) + x) + .join(",\n") + + "\n" + + " ".repeat(depth * indent) + + end; + } + seen.delete(v); + return result; + } + return serialize(value, 0); +} +export const canonical = (value) => json_sorted(value, 2) + "\n"; +export const digest = (value) => + "sha256:" + + crypto + .createHash("sha256") + .update(Buffer.isBuffer(value) ? value : Buffer.from(String(value), "utf8")) + .digest("hex"); +const quote = (value) => + encodeURIComponent(value).replace( + /[!'()*]/g, + (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`, + ); +export const identity = (kind, schema, name, parent = "", signature = "") => + "postgresql:local/" + + [schema, kind, parent, name, signature].map(quote).join("/"); +export const quoted = (name) => + /^[a-z_][a-z_0-9$]*$/.test(name) + ? name + : '"' + name.replaceAll('"', '""') + '"'; +export const display = (schema, name, parent = "") => + [schema, parent, name].filter(Boolean).map(quoted).join("."); +export function safe_path(source) { + const absolute = path.resolve(String(source)), + relative = path.relative(process.cwd(), absolute); + return relative !== ".." && + !relative.startsWith(".." + path.sep) && + !path.isAbsolute(relative) + ? relative.split(path.sep).join("/") + : path.basename(absolute); +} +export function fingerprint(model) { + const sources = [ + ...new Map( + model.evidence.map((e) => { + const pair = [e.path ?? e.query_id ?? "", e.source_hash]; + return [JSON.stringify(pair), pair]; + }), + ).values(), + ]; + sources.sort((a, b) => compare(a[0], b[0]) || compare(a[1], b[1])); + return digest(canonical({ sources, version: model.engine.version })); +} +const unique = (values) => [...new Set(values)].sort(compare); +export class Builder { + constructor(version = "18", source_mode = "offline_ddl") { + this.model = { + schema_version: "1.0.0", + engine: { name: "postgresql", version: String(version), source_mode }, + snapshot: { id: "", created_at: null, source_fingerprint: "" }, + coverage: { + catalog_available: false, + repository_scan: false, + exhaustive: false, + unresolved: 0, + capabilities: [], + }, + nodes: [], + edges: [], + evidence: [], + findings: [], + unknowns: [], + }; + this.nodes = new Map(); + this.edges = new Map(); + } + evidence( + source, + raw, + start = 0, + length = 0, + status = "PARSED", + origin = "sql_file", + extra = {}, + ) { + raw = Buffer.isBuffer(raw) ? raw : Buffer.from(raw); + const data = { + origin, + status, + confidence: "direct", + source_hash: digest(raw), + explanation: + "Syntax establishes a static reference, not runtime reachability.", + ...extra, + }; + if (origin !== "postgres_catalog") + Object.assign(data, { + path: safe_path(source), + line_start: raw.subarray(0, start).filter((c) => c === 10).length + 1, + line_end: + raw.subarray(0, start + length).filter((c) => c === 10).length + 1, + byte_start: start, + byte_length: length, + }); + data.id = "ev:" + digest(canonical(data)).slice(7, 31); + if (!this.model.evidence.some((e) => e.id === data.id)) + this.model.evidence.push(data); + return data.id; + } + node( + kind, + schema, + name, + evidence, + parent = "", + signature = "", + properties = null, + status = "PARSED", + origin = "sql_file", + ) { + const key = identity(kind, schema, name, parent, signature); + if (this.nodes.has(key)) { + const n = this.nodes.get(key); + n.evidence_ids = unique([...n.evidence_ids, evidence]); + if (properties) Object.assign(n.properties, properties); + return n; + } + const n = { + id: key, + kind, + schema, + name, + parent, + signature, + qualified_name: display(schema, name, parent), + origin, + status, + confidence: "direct", + evidence_ids: [evidence], + properties: properties ?? {}, + }; + this.nodes.set(key, n); + return n; + } + edge( + source, + target, + kind, + evidence, + status = "PARSED", + origin = "sql_file", + properties = null, + ) { + source = typeof source === "object" ? source.id : source; + target = typeof target === "object" ? target.id : target; + if (source === target) return; + const props = properties ?? {}, + stable = Object.fromEntries( + Object.entries(props).filter(([k]) => k !== "catalog_address"), + ); + const key = + "edge:" + + digest(canonical([source, target, kind, status, stable])).slice(7, 31); + if (this.edges.has(key)) + this.edges.get(key).evidence_ids = unique([ + ...this.edges.get(key).evidence_ids, + evidence, + ]); + else + this.edges.set(key, { + id: key, + source, + target, + kind, + origin, + status, + confidence: "direct", + evidence_ids: [evidence], + explanation: + "Source depends on or references target; impact traverses reverse edges. Runtime effects require review.", + properties: props, + }); + } + unknown(explanation, evidence, object_id = null) { + const u = { + id: + "unknown:" + + digest(canonical([explanation, evidence, object_id])).slice(7, 31), + status: "UNKNOWN", + origin: "heuristic", + confidence: "unknown", + explanation, + evidence_ids: [evidence], + object_id, + }; + if (!this.model.unknowns.some((x) => x.id === u.id)) + this.model.unknowns.push(u); + } + finish() { + const byId = (a, b) => compare(a.id, b.id); + this.model.nodes = [...this.nodes.values()].sort(byId); + this.model.edges = [...this.edges.values()].sort(byId); + for (const key of ["evidence", "unknowns", "findings"]) + this.model[key].sort(byId); + this.model.coverage.unresolved = this.model.unknowns.length; + const fp = fingerprint(this.model); + this.model.snapshot.source_fingerprint = fp; + this.model.snapshot.id = "snapshot:" + fp.slice(7, 31); + return this.model; + } +} +const ajv = new Ajv2020({ allErrors: true, strict: false }); +addFormats(ajv); +const checkSchema = ajv.compile( + JSON.parse( + fs.readFileSync( + path.join(resources(), "schemas/dbdep.schema.json"), + "utf8", + ), + ), +); +export function validate(model, strict = false) { + if (!checkSchema(model)) + return unique( + checkSchema.errors.map( + (e) => + `${e.instancePath.slice(1)}: JSON Schema ${e.keyword} check failed`, + ), + ); + const errors = [], + ids = {}; + for (const key of ["nodes", "edges", "evidence", "findings", "unknowns"]) { + const vals = model[key].map((x) => x.id); + ids[key] = new Set(vals); + if (ids[key].size !== vals.length) errors.push(`Duplicate IDs in ${key}`); + if (strict) { + const sorted = [...vals].sort(compare); + if (vals.some((v, i) => v !== sorted[i])) errors.push(`Unsorted ${key}`); + } + } + for (const edge of model.edges) { + if (!ids.nodes.has(edge.source) || !ids.nodes.has(edge.target)) + errors.push("Dangling edge endpoint"); + if ( + edge.properties.constraint !== undefined && + !ids.nodes.has(edge.properties.constraint) + ) + errors.push("Dangling constraint reference"); + } + for (const finding of model.findings) { + if (finding.object_ids.some((id) => !ids.nodes.has(id))) + errors.push("Dangling finding object reference"); + if ( + canonical(unique(finding.evidence)) !== + canonical(unique(finding.evidence_ids)) + ) + errors.push("Inconsistent finding evidence aliases"); + } + for (const unknown of model.unknowns) + if (unknown.object_id !== null && !ids.nodes.has(unknown.object_id)) + errors.push("Dangling unknown object reference"); + for (const key of ["nodes", "edges", "findings", "unknowns"]) + for (const obj of model[key]) + if (obj.evidence_ids.some((id) => !ids.evidence.has(id))) + errors.push("Missing evidence reference"); + const hashes = new Map(); + for (const e of model.evidence) { + const source = e.path ?? e.query_id; + if (hashes.has(source) && hashes.get(source) !== e.source_hash) + errors.push("Inconsistent source hash for an evidence source"); + hashes.set(source, e.source_hash); + if ((e.line_end ?? 1) < (e.line_start ?? 1)) + errors.push("Invalid evidence range"); + } + if (fingerprint(model) !== model.snapshot.source_fingerprint) + errors.push("Source fingerprint mismatch"); + if (model.coverage.unresolved !== model.unknowns.length) + errors.push("Unknown count mismatch"); + if (/postgres(?:ql)?:\/\/|password\s*=/i.test(canonical(model))) + errors.push("Credential-bearing connection string is forbidden"); + return unique(errors); +} diff --git a/skills/database-dependency-migration/src/dbdep/planning.mjs b/skills/database-dependency-migration/src/dbdep/planning.mjs new file mode 100644 index 0000000..598e19c --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/planning.mjs @@ -0,0 +1,49 @@ +/** Review-only operational plans. No SQL execution or rollback promise. */ +const phases = [ + [ + "expand", + "Where a replacement is needed, add nullable columns or compatible interfaces. Define the replacement representation and any identifier mapping before changing keys.", + "Confirm PostgreSQL version, backups, ownership, consumers and feasible mapping. Review privileges and lock budget.", + "Rehearse DDL on a disposable database with representative data. Verify identity/sequence/default semantics.", + "Stop deployment before consumers depend on the new fields; keep old fields available.", + ], + [ + "backfill", + "If stored data needs a representation change, backfill bounded, resumable batches using reviewed transformation logic and coordinated dual writers.", + "Validate transformation semantics and mapping uniqueness where identifiers change. Handle concurrent writes and define throttling.", + "Check transformation results, applicable mapping completeness and uniqueness, NULL rates and FK consistency under concurrent traffic.", + "Pause batches and preserve old data; restore from tested backup only under an approved recovery procedure.", + ], + [ + "validate", + "Validate CHECK/FK constraints where NOT VALID is supported. Build concurrent indexes outside transaction blocks when appropriate.", + "Confirm constraint support, partition restrictions, existing violations and resource budget. Concurrent index failure can leave an invalid index.", + "Check constraint validation and pg_index.indisvalid/indisready, compare old/new results and observe lock waits.", + "Investigate failed validation or invalid indexes; repair/retry through separate authorized tooling.", + ], + [ + "transition", + "Deploy compatible readers/writers and transition dependent FKs, views, functions, API/ORM contracts and downstream jobs.", + "Obtain explicit consumer ownership and deployment-order evidence. Account for UNKNOWN and dynamic SQL paths.", + "Observe application errors and old-field usage through an agreed window. Static graph paths do not prove runtime coverage.", + "Revert application reads only while both representations remain consistent; otherwise prefer roll-forward.", + ], + [ + "contract", + "Remove legacy objects only after verified transition and a separate destructive-change review.", + "Confirm no remaining consumers, validated keys, tested backups and signed-off CASCADE consequences. Schedule lock acquisition.", + "Reinspect schema, compare snapshots and run application integration checks. Do not promise zero downtime.", + "Drops can lose data. Reverse DDL does not restore it; use tested recovery or roll-forward with an operator.", + ], +]; +export const plan = (findings) => + findings.length + ? phases.map(([phase, action, preconditions, verification, recovery]) => ({ + phase, + action, + preconditions, + verification, + recovery, + review_only: true, + })) + : []; diff --git a/skills/database-dependency-migration/src/dbdep/reports.mjs b/skills/database-dependency-migration/src/dbdep/reports.mjs new file mode 100644 index 0000000..bc794d9 --- /dev/null +++ b/skills/database-dependency-migration/src/dbdep/reports.mjs @@ -0,0 +1,412 @@ +/** Every report is derived from a validated canonical snapshot. */ +import { + readFileSync, + mkdirSync, + writeFileSync, + existsSync, + lstatSync, + realpathSync, + readdirSync, + openSync, + closeSync, + renameSync, + unlinkSync, +} from "node:fs"; +import { + dirname, + join, + resolve, + parse, + relative, + sep, + extname, +} from "node:path"; +import { createHash, randomUUID } from "node:crypto"; +import { canonical, resources, validate } from "./model.mjs"; + +export function require_valid(model) { + const errors = validate(model); + if (errors.length) + throw new Error( + `Invalid canonical model: ${errors.slice(0, 8).join("; ")}`, + ); +} +export function summary(model) { + return { + nodes: model.nodes.length, + edges: model.edges.length, + evidence: model.evidence.length, + unknowns: model.unknowns.length, + findings: model.findings.length, + severity_counts: Object.fromEntries( + ["info", "warning", "error"].map((s) => [ + s, + model.findings.filter((f) => f.severity === s).length, + ]), + ), + }; +} +export const html_escape = (value) => + String(value) + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +const csp_hash = (text) => + createHash("sha256").update(text, "utf8").digest("base64"); + +export function render(model, review = null, changes = null, root = null) { + require_valid(model); + const state = { + model, + summary: summary(model), + plan: review?.plan ?? [], + changes, + root, + }; + const data = canonical(state) + .replaceAll("<", "\\u003c") + .replaceAll(">", "\\u003e") + .replaceAll("&", "\\u0026"); + const viewer = join(resources(), "assets/viewer"); + let css = readFileSync(join(viewer, "viewer.css"), "utf8"); + for (const [token, filename] of [ + ["__ARCHIVO_FONT__", "archivo-latin-wght-normal.woff2"], + ["__PLEX_FONT__", "ibm-plex-mono-latin-400-normal.woff2"], + ]) { + if (css.includes(token)) + css = css.replaceAll( + token, + `data:font/woff2;base64,${readFileSync(join(viewer, filename)).toString("base64")}`, + ); + } + const js = readFileSync(join(viewer, "viewer.js"), "utf8"); + const bootstrap = existsSync(join(viewer, "bootstrap.js")) + ? readFileSync(join(viewer, "bootstrap.js"), "utf8") + : ""; + const locales = existsSync(join(viewer, "locales.js")) + ? readFileSync(join(viewer, "locales.js"), "utf8") + : ""; + const script = locales ? `${locales}\n${js}` : js; + const csp = `default-src 'none'; script-src 'sha256-${csp_hash(script)}'${bootstrap ? ` 'sha256-${csp_hash(bootstrap)}'` : ""}; style-src 'sha256-${csp_hash(css)}'; font-src data:; img-src data: blob:; connect-src 'none'; base-uri 'none'; form-action 'none'; object-src 'none'`; + const fallback = `${model.nodes.length} nodes, ${model.edges.length} edges, ${model.findings.length} findings, ${model.unknowns.length} unknowns. PostgreSQL ${html_escape(model.engine.version)}. Source depends on target; blast radius follows reverse edges. Use report.md or the canonical JSON without JavaScript.`; + const fontLicenses = ["archivo-LICENSE", "ibm-plex-mono-LICENSE"] + .filter((f) => existsSync(join(viewer, f))) + .map((f) => `${f}\n${readFileSync(join(viewer, f), "utf8")}`) + .join("\n\n"); + let template = readFileSync(join(viewer, "template.html"), "utf8"); + const replacements = { + __CSP__: html_escape(csp), + __CSS__: css, + __FALLBACK__: fallback, + __STATE__: data, + __JS__: script, + __BOOTSTRAP__: bootstrap, + __FONT_LICENSES__: html_escape(fontLicenses).replaceAll("--", "--"), + }; + // Single pass prevents user data from being interpreted as renderer tokens. + template = template.replace( + /__(?:CSP|CSS|FALLBACK|STATE|JS|BOOTSTRAP|FONT_LICENSES)__/g, + (token) => replacements[token], + ); + return template; +} +export function embedded_state(document) { + const match = document.match( + /