Version 9.17¶
Release date: 2026-07-30
This release contains a number of bug fixes and new features since the release of pgAdmin 4 v9.16.
Supported Database Servers¶
PostgreSQL: 14, 15, 16, 17 and 18
EDB Advanced Server: 14, 15, 16, 17 and 18
Bundled PostgreSQL Utilities¶
psql, pg_dump, pg_dumpall, pg_restore: 18.4
New features¶
Issue #9990 - Include the authenticated user’s identity in the HTTP access log.Issue #9942 - Add an opt-in Gateway API HTTPRoute template to the Helm chart as an alternative to the existing Ingress.Issue #10104 - Add a preference to cap the row count fetched by the plain “View Data” action, so it is usable on large tables without always doing a fullSELECT *.Issue #10142 - Add support for a custom XYZ tile provider (URL, name, CRS, attribution, max zoom) in the Geometry Viewer, alongside the existing built-in base layers.
Housekeeping¶
Issue #10077 - Centralize shared-server-group visibility and access-control logic, and adjust the ServerGroup-to-Server/SharedServer model relationships.Issue #10093 - Add a basic starter contributing guide.Issue #10135 - Fail the macOS appbundle build if any bundled library links outside the bundle, and scan all Mach-O binaries for bundle linkage rather than only files named.so/.dylib.Issue #10154 - Pin the sonarqube-scan-action GitHub workflow to a full commit SHA instead of a mutable branch ref, to harden against supply-chain tampering.Issue #10138 - Update the Simplified Chinese (zh_Hans_CN) translation to match the wording used in the interface.Issue #10156 - Pin the Yarn version used by the build scripts to thepackageManagerfield, rather than whatever Yarn happens to be on the builder’s PATH.Issue #10176 - Bump JavaScript and Python third-party dependencies, including axios, webpack, react, electron, and certifi.
Bug fixes¶
Issue #10053 - Warn when OAuth2 provider settings are misplaced at the top level of the config instead of underOAUTH2_CONFIG.Issue #10100 - Fix Schema Diff’s “Generate Script” and the browser tree’s CREATE Script view emitting wrong SQL for SERIAL/identity columns, by detecting column-owned sequences via pg_depend instead of guessing the sequence name.Issue #10102 - Fix a Schema Diff result-status filter chip showing “No difference found” after being toggled off and back on, even when real differences exist.Issue #10106 - Fix the Object Explorer briefly showing the literal HTML markup instead of a greyed-out “[Disconnecting…]” label when disconnecting a server or database.Issue #10107 - Detect a selected-but-unusable OS keyring and fall back gracefully instead of failing.Issue #10109 - Fix ALT+F5 (“Execute query at cursor”) doing nothing when the cursor is on or near a statement that is not highlighted, in a Query Tool tab with multiple statements separated by blank lines.Issue #10110 - Stop the googleapiclient cloud-deployment dependency from pulling in the system oauth2client package.Issue #10117 - Fix a “‘Response’ object is not iterable” crash when expanding a Trigger node under a Table to view its trigger function, and report the correct error message on a node.sql failure in that flow.Issue #10158 - Honor the selected EOL sequence when copying query text to the clipboard.Issue #10187 - Fix the object browser’s extension UI breaking under PostgreSQL 19’s extension catalog changes.Issue #10190 - Fix a tool-permission bypass where a user denied the Query Tool, Grant Wizard, or Schema Diff permission could still drive that tool’s backend routes and Socket.IO handlers directly, since the permission check was applied only to a single “front door” route per tool. Also fixes a non-owner triggering an adhoc connection against another user’s shared server persisting a new server record still owned by that other user (CVE-2026-17350). Reported by LXY.Issue #10191 - Fix OS command injection in the MASTER_PASSWORD_HOOK feature, where an externally-sourced username (e.g. via OAuth2/OIDC, Kerberos, or webserver authentication) containing shell metacharacters could execute arbitrary commands as the pgAdmin service account when the configured hook string uses%u(CVE-2026-17347). Reported by Thiago Pereira.Issue #10192 - Fix a lexer-differential bypass of the AI Assistant’s read-only transaction guard, where sqlparse’s string-literal lexing disagreed with PostgreSQL’s own parser understandard_conforming_strings = on, letting a crafted multi-statement payload smuggle a COMMIT past the intended read-only wrapper, an incomplete fix for CVE-2026-12045 (CVE-2026-17351). Reported by Kai Aizen.Issue #10193 - Fix SQL injection in the Index Statistics all-indexes listing and the Publications/Subscriptions Dependencies views, where an apostrophe in a table, index, publication, or subscription name broke out of an unescaped template interpolation, an incomplete fix for CVE-2026-12044 (CVE-2026-17346). Reported by Hung Tran Quoc (@rampage0010).Issue #10194 - Fix several Constraints, Preferences, Debugger, and Schema Diff routes missing the@pga_login_requireddecorator, making them reachable without authentication in server mode, an incomplete fix for CVE-2026-12046 (CVE-2026-17348). Reported by Hung Tran Quoc (@rampage0010).Issue #10200 - Fix an adhoc server connection cloning another user’s stored database credentials (password, save password flag, tunnel password) alongside ownership, letting a non-owner who cloned another user’s shared server connect using that user’s saved database password (CVE-2026-17349).Issue #10213 - Fix OS command injection in the Import/Export Data tool, where a query-based export could pass a crafted query string past the\copy (...)parenthesis-balance guard by exploiting a backslash-escape mismatch with psql’s defaultstandard_conforming_strings = onbehaviour, exposing a liveTO PROGRAMclause for arbitrary command execution (CVE-2026-17566). Reported by Arpit Jain.
Additional changes (no associated issue)¶
Dependencies¶
Non-breaking dependabot and audit-driven bumps aggregated for v9.17.
Python:
certifi2026.5.20 -> 2026.6.17
JavaScript (web/):
@babel/core7.29.0 -> 7.29.6@date-io/date-fns3.x -> 3.2.1@szhsin/react-menu4.5.1 -> 4.5.2@tanstack/react-query5.100.9 -> 5.101.4@types/react19.2.14 -> 19.2.17ajv8.18.0 -> 8.20.0anti-trojan-source1.8.1 -> 1.12.0autoprefixer10.5.0 -> 10.5.4axios1.16.0 -> 1.18.1core-jsadded as an explicit direct dependency (3.49.0), previously relied on transitively via pickrdate-fns4.1.0 -> 4.4.0dompurify3.4.1 -> 3.4.12eslint-plugin-jest29.15.2 -> 29.15.5globals17.5.0 -> 17.7.0hotkeys-js4.0.3 -> 4.0.4html-to-image1.11.11 -> 1.11.13ip-address10.1.1 -> 10.2.0jest/jest-environment-jsdom30.3.0 -> 30.4.2 / 30.4.1marked18.0.2 -> 18.0.7moment-timezone0.6.2 -> 0.6.3papaparse5.5.3 -> 5.5.4postcss8.5.10/8.5.14 -> 8.5.20react/react-dom19.2.5 -> 19.2.7react-checkbox-tree2.0.1 -> 2.0.2react-draggable4.5.0 -> 4.7.0react-timer-hook4.0.5 -> 4.0.6sharp0.34.4 -> 0.35.3sql-formatter15.7.3 -> 15.8.2svgo4.0.1 -> 4.0.2terser-webpack-plugin5.5.0 -> 5.6.1typescript-eslint8.59.0 -> 8.65.0webpack5.106.2 -> 5.108.4webpack-bundle-analyzer5.3.0 -> 5.3.1zustand5.0.12 -> 5.0.14Transitive advisory bumps:brace-expansion,form-data,undici,js-yamlRevertedazure-mgmt-resourceto avoid a breaking import-path change inpgadmin/misc/cloud/azure
JavaScript (runtime/):
electron42.3.3 -> 43.1.1eslint10.4.1 -> 10.7.0globals17.6.0 -> 17.7.0axios1.18.0 -> 1.18.1ip-address10.1.1 -> 10.2.0postcss8.5.10 -> 8.5.20PinnedpackageManagertoyarn@4.15.0