リリース日: 2025-08-14
このリリースは17.5に対し、様々な不具合を修正したものです。 17メジャーリリースにおける新機能については、E.7を参照してください。
17.Xからの移行ではダンプ/リストアは不要です。
しかし、BRIN numeric_minmax_multi_opsインデックスがある場合は、更新後にインデックスを再作成することをお勧めします。
以下の4番目の変更ログの項目を参照してください。
また、17.5より前のバージョンからアップグレードする場合は、E.2を参照してください。
プランナの見積もり関数におけるセキュリティチェックが強化されました。 (Dean Rasheed) §
CVE-2017-7484の修正およびその後の追加修正は、呼び出し元ユーザが読み取り権限を持たない列の統計データに対して、情報漏洩のある関数が適用されるのを防止することを目的としていました。 この保護には2つのギャップがありました。 1つ目のギャップは、パーティション分割と継承階層に適用され、テーブルの行単位セキュリティ(RLS)ポリシーが統計データへのアクセスを制限すべきであるにもかかわらず、実際には制限されていませんでした。
もう1つのギャップは、問い合わせがビューを介してテーブルにアクセスし、ビュー所有者には基となるテーブルの読み取り権限があるが、呼び出し元のユーザにはビューに対する権限がない場合に発生しました。 ビュー所有者の権限はセキュリティチェックを満たしていたため、ビューに対する呼び出し元ユーザの権限をチェックする前に、情報漏洩のある関数は基となるテーブルの統計情報に適用されました。 この問題は、プランニングの開始時点でビューのセキュリティチェックを実行することで修正されました。 これにより、以前よりも早い段階で権限エラーが発生する可能性があります。
PostgreSQLプロジェクトは、本問題を報告してくれたDean Rasheedに感謝します。 (CVE-2025-8713)
pg_dumpスクリプトがリストアを実行しているユーザへの攻撃に使用されるのを防ぎます。 (Nathan Bossart) §
ダンプ/リストア操作では通常、スーパーユーザとしてSQLコマンドを実行するため、ターゲットデータベースの環境はソースサーバを信頼する必要があります。 しかし、リストアを実行するためにpsqlを実行するオペレーティングシステムのユーザがソースサーバを信頼する必要があるということではありません。 ここでのリスクは、ソースサーバに対してスーパーユーザレベルの制御権を獲得した攻撃者が、psqlメタコマンドと解釈されるテキストを出力できる可能性があるということです。 これにより、ターゲットデータベースへのアクセスとは独立して、リストアをおこなうユーザ自身のアカウントへのシェルレベルのアクセスが可能になります。
この事態が発生しないことを確実に保証するため、追加のメタコマンド実行を防止する\restrictコマンドをpsqlに追加して、ソースサーバからデータが来る前にこのコマンドを発行するようpg_dumpを変更しました。
PostgreSQLプロジェクトは、本問題を報告してくれたMartin Rakhmanov、Matthieu Denais、およびRyotaKに感謝します。 (CVE-2025-8714)
pg_dump出力内のコメントに含まれる名前の改行がスペースに変換されるようになりました。 (Noah Misch) §
改行を含むオブジェクト名により、出力スクリプトに任意のSQLコマンドを挿入できる可能性がありました。 (上記の修正がなければ、psqlメタコマンドの挿入も同様に可能でした)。 CVE-2012-0868により当時この種の問題は修正されましたが、その後の作業でいくつかのケースが再導入されていました。
PostgreSQLプロジェクトは、本問題を報告してくれたNoah Mischに感謝します。 (CVE-2025-8715)
BRIN numeric_minmax_multi_opsサポート関数における誤った距離計算が修正されました。
(Peter Eisentraut, Tom Lane)
§
この関数の結果は、64ビットプラットフォームで時々誤り、32ビットプラットフォームでは大幅に誤っていました。
最悪の場合、インデックスは非効率的になり肥大化していましたが、このロジックは値を範囲にマージする方法を選択するためにだけ使用されるため、明らかな障害は引き起こしませんでした。
それでもなお、numeric_minmax_multi_ops演算子クラスを使用するBRINインデックスは再インデックスすることをお勧めします。
受け入れ可能なXML入力サイズの不具合が回避されました。 (Michael Paquier, Erik Wienhold) § §
libxml2の初期2.13.xリリースにおけるバグに対する回避策として、10MBを超えるテキストチャンクを拒否するコードパスを使用していましたが、以前のコーディングではそうしていませんでした。 これらの初期リリースはおそらく現在では実環境から消滅しているため、以前のコーディングに戻されました。
同時更新によるMERGEの問題が修正されました。
(Dean Rasheed)
§
CTE内のMERGEがBEFORE ROWトリガを持つテーブルに対して更新または削除を試行し、同時実行中のUPDATEまたはDELETEによって対象行が変更された場合、MERGEコマンドは失敗します(更新操作の場合はクラッシュし、削除操作の場合は誤ったアクションが実行される可能性がありました)。
単純継承の親テーブルへのMERGEが修正されました。
(Dean Rasheed)
§
このようなターゲットテーブルへの挿入は、WITH CHECK OPTIONおよびRETURNINGアクションの処理に失敗するため、クラッシュしたり、誤った問い合わせ結果が生成されたりする可能性がありました。
文レベルのトリガを持つテーブルがパーティションまたは継承の子テーブルになれるよう修正されました。 (Etsuro Fujita) §
継承ツリー全体に対する操作では、各子テーブルごとに個別の遷移テーブルを管理する必要があるため、パーティションまたは継承の子テーブルには、遷移テーブルを持つ行レベルのトリガを設定できません。 ただし、文レベルのトリガの場合は、親テーブルの文レベルのトリガのみが実行されるため、この問題は発生しません。 既存のテーブルがパーティションまたは継承の子テーブルになることができるかどうかをチェックするコードは、両方の種類のトリガを一律に拒否していました。
子外部テーブルからの遷移タプルの収集が禁止されました。 (Etsuro Fujita) §
外部テーブルに対する遷移テーブルを持つトリガはサポートされていません。 しかし、パーティションまたは継承された子テーブルが外部テーブルである場合は見落とされていました。 親にそのようなトリガがある場合、外部の子テーブルから誤った遷移タプルが収集されていました。 代わりにそのような場合がサポートされていないことを報告するエラーを発生させるようになりました。
予約済みプレフィックスを持つ不明なカスタムパラメータをリセットできるようになりました。 (Nathan Bossart) §
以前は、ALTER DATABASE/ROLE/SYSTEMを使用してパラメータ設定が保存されている場合、そのパラメータが不明で予約済みプレフィックスが付いていると、保存された設定を削除できませんでした。
このような状況は、以前は拡張にパラメータがあったものの、アップグレードでそのパラメータが削除された場合に発生する可能性がありました。
ALTER SUBSCRIPTION ... DROP PUBLICATION実行中に発生する可能性のあるデッドロックが修正されました。
(Ajin Cherian)
§
レプリケーションのオリジン削除時に、サーバプロセスが一貫した順序でカタログロックを取得するようになりました。
競合する名前を持つインデックスを作成する際に競合状態となる時間が短縮されました。 (Tom Lane) §
インデックスの自動生成名を選択する際、完全に有効な行と同様に、未コミットのpg_class行との競合も回避されます。
これにより、同時実行中のCREATE INDEXがインデックスを構築中である場合や、完了したが未コミットトランザクションの一部である場合に、同じ名前が選択される可能性を回避できます。
それでも問題が発生する時間はまだありますが、新しいインデックスのパラメータを検証し、pg_class行を挿入するのに必要な時間だけです。
複数のテーブルを単一のコマンドでバキューム処理する場合の誤ったVACUUMオプション使用が防止されました。
(Nathan Bossart, Michael Paquier)
§
あるテーブルのTRUNCATEおよびINDEX_CLEANUPオプションが他のテーブルにも適用される可能性がありました。
インデックスのないテーブルをバキュームする際に、テーブルの空き領域マップが適切なタイミングで更新されるようになりました。 (Masahiko Sawada) §
以前の最適化により、このようなテーブルでは空き領域マップのバキューム処理がスキップされることがありました。
SIMILAR TO正規表現内の文字クラスの処理が修正されました。
(Laurenz Albe)
§
§
SIMILAR TOパターンマッチ式をPOSIX形式の正規表現に変換するコードでは、大括弧がネスト可能であることを考慮していませんでした。
例えば、[[:alpha:]%_]のようなパターンでは、コードでは%および_の文字がリテラルであるべきところをメタ文字として扱っていました。
問い合わせを逆解析する際は、FETCH FIRST 句内の式を常に括弧で囲むようになりました。
(Heikki Linnakangas)
§
§
expression ROWS WITH TIES
これにより、逆解析された結果が構文的に有効でなかった場合が回避されます。
チェックポインタプロセスのfsyncリクエストキューサイズが制限されました。 (Alexander Korotkov, Xuneng Zhou) § §
shared_buffersの設定が非常に大きい場合、チェックポインタがfsyncリクエストに1GBを超える領域を割り当てようとし、エラーが発生して無限ループに陥る可能性がありました。
このシナリオを防ぐために、キューサイズが制限されました。
部分的に書き込まれたWALレコードの読み取り時に、ロジカルデコーディングでの無限待機を回避するようになりました。 (Vignesh C) §
複数のページにまたがるWALレコードの最初の部分を書き込んだ後にサーバがクラッシュした場合、WALストリームのロジカルデコーディングでは次のWALページにデータが到着するまで待機することになります。 サーバがアイドル状態の場合は絶対に発生しえませんでした。
MultiXactOffsetSLRUとMultiXactMemberSLRUのLWLock名のスペルの不一致が修正されました。
(Bertrand Drouvot)
§
これにより、pg_wait_eventsとpg_stat_activityで異なる待機イベント名が表示され、これらのビューを結合する監視問い合わせが機能しなくなる可能性がありました。
ACL文字列内のロール名の引用符の一貫性のなさが修正されました。 (Tom Lane) §
以前の引用符ルールはロケールに依存していたため、aclitemの値を異なる環境間で転送する際に移植性の問題が発生する可能性がありました
(pg_dumpではそうではありませんが、他のツールではそうする可能性があります)。
一貫性を確保するため、aclitem出力では常に非ASCII文字を引用符で囲みます。ただし、下位互換性を維持するために、aclitemの入力では非ASCII文字を引用符で囲む必要はありません。
リレーションと外部データのオプションの名前に等号(=)を使用しないよう修正されました。
(Tom Lane)
§
このようなオプション名に明確な使用例はなく、これらを許可すると、保存された表現形式に曖昧さが生じます。
LZ4圧縮されたアーカイブデータを不正確に解凍する可能性のある問題が修正されました。 (Mikhail Gribkov) §
このエラーは、圧縮率の低い入力データでのみ発生するようで、これが検出されなかった理由かもしれません。
btreeインデックススキャンによって間違ったインデックスエントリを削除済みとしてマークされる可能性がある稀なシナリオが回避されました。 (Peter Geoghegan) §
論理レプリケーション中に、他のトランザクションからのキャッシュ無効化メッセージの再配布が回避されました。 (vignesh C) §
前回のマイナーリリースでは、レプリケーション受信プロセスがプロセス間のキャッシュ無効化メッセージに応答して、レプリケーション更新中に古いカタログデータを使用しないようにするバグ修正が含まれていました。 しかし、この修正によって意図せずこれらのメッセージが再配布されてしまい、無効化メッセージの数が急増し、メモリ割り当てエラーが発生することがありました。 受信したメッセージを再配布しないよう修正されました。
レプリケーションスロットの同期設定が誤っている場合に発生する予期せぬサーバシャットダウンが回避されました。 (Fujii Masao) §
sync_replication_slotsがtrueに設定され、wal_levelがlogical未満の場合、postmasterプロセスはエラーを報告し、その後停止します。
望ましい動作はスロット同期を無効にすることなので、このエラーメッセージのレベルを下げることでpostmasterのシャットダウンが回避されました。
チェックポイント処理中に古いWALファイルが早期に削除されないようになりました。 (Vitaly Davydov) §
チェックポイント処理中にレプリケーションスロットのリスタートポイントが進められると、不要になったWALセグメントが早期に削除され、その直後にデータベースがクラッシュした場合にリカバリが失敗する可能性がありました。 これらのWALセグメントを1サイクル分のチェックポイントサイクル分を保持することで修正されました。
レプリケーションスロットの確定済みフラッシュ位置を絶対に後方に移動しないようになりました。 (Shveta Malik) §
場合によっては、レプリケーションクライアントが永続的に保存したLSNを過ぎたLSNを確認し、再起動後に古いLSNを送信する可能性がありました。 クライアントが2つのポイント間でWALに対して何もする必要がなかった限り、これはバグではないと考えます。 しかし、データ重複の恐れがあるため、そのWALを再送信すべきではありません。そのため、特定のスロットについては最新の確認済みLSNを信頼するようになりました
新しい論理レプリケーションワーカーを起動する前に過度の遅延が発生しないようになりました。 (Tom Lane) §
場合によっては、論理レプリケーションランチャが新しいワーカーを起動する前に、設定されたwal_retrieve_retry_intervalよりもかなり長くスリープする可能性がありました。
INSERT ... ON CONFLICTの論理レプリケーション中のメモリ解放後使用が修正されました。
(Ethan Mertz, Michael Paquier)
§
これにより、進捗状況の報告が不正確になる可能性があり、運が悪ければWAL送信プロセスがクラッシュする可能性がありました。
スタンバイサーバ上のトランザクション待機が中断可能になりました。 (Kevin K Biju) §
スタンバイサーバ上でレプリケーションスロットを作成する場合、プライマリサーバ上でアクティブなトランザクションが終了し、スタンバイサーバ上で再生されるまで待機が必要な場合があります。 これは無期限の待機となる可能性があるため、操作をキャンセルできるようにすることが望ましいですが、ループ内で問い合わせキャンセルがチェックされていませんでした。
カスケード論理WAL送信者が、稼働するスタンバイサーバで再生済みの範囲を超えるデータを送信しないようになりました。 (Alexey Makhmutov) §
これにより、スタンバイサーバのシャットダウン時に、サーバの起動プロセスが既にシャットダウンしているために再生作業が発生しないのもかかわらず、再生作業を待機してWAL送信者が停止してしまう状況が回避されます。
自動バキュームにおけるリレーションごとのメモリリークが修正されました。 (Tom Lane) §
XMLSERIALIZE(... INDENT)でのセッション存続期間のメモリリークが修正されました。
(Dmitry Kovalenko, Tom Lane)
§
§
「bump」アロケータを使用して大きなチャンクを割り当てた際のメモリ不足後のクラッシュの可能性が修正されました。 (Tom Lane) §
スナップショット無しでシステムカタログのTOASTされたフィールドを取得しようとする可能性のある箇所が修正されました。 (Nathan Bossart) §
これにより、アサーションエラーが発生したり、「cannot fetch toast data without an active snapshot」エラーが発生する可能性がありました。
PortalRunMulti()の終了までにコマンドタグが決定されている必要があるという誤ったアサーションが削除されました。
(Álvaro Herrera)
§
これは、空のプリペアドステートメントなどの特殊なケースで失敗していました。
XMLTABLE解析におけるアサーションエラーが修正されました。
(Richard Guo)
§
PL/pgSQL式を並列実行できる機能が復元されました。 (Dipesh Dhameliya) §
PL/pgSQLにおける「式」の概念は非常に幅広く、単一の列を返し、かつ1行以上を返さないSQLのSELECT問い合わせを包含します。
そのため、例えば集約関数の評価など、問い合わせに膨大な処理量を要する場合には、並列ワーカーで実行することが有効です。
これは以前は可能でしたが、以前のバグ修正で意図せず無効されていました。
PL/Pythonのエラー報告におけるエッジケースのリソースリークが修正されました。 (Tom Lane) § §
Pythonからのエラー報告中にメモリ不足エラーが発生すると、Pythonオブジェクトの参照カウントを削除できず、セッション存続期間中のメモリリークが発生する可能性がありました。
サーバのアドレスがhostaddrを使用して指定されている場合のlibpqのPQcancelCreate()関数が修正されました。
(Sergei Kornilov)
§
結果として生成されたキャンセルオブジェクトが実際に使用されるとlibpqがクラッシュしていました。
渡された接続がNULLでない限り、NULLを返さないようlibpqのPQport()関数が修正されました。
(Daniele Varrazzo)
§
これはドキュメントに記載されている動作ですが、最近のlibpqバージョンでは、ユーザがポートを指定していない場合、NULLを返すことがありました。
このような場合には空の文字列を返すという従来の動作に戻ります。
(v18以降では、代わりにコンパイル時に組み込まれたデフォルトのポート番号、通常は"5432"を返します)。
GSSAPI認証が16kBを超えるパケットが必要な場合の失敗が回避されました。 (Jacob Champion, Tom Lane) §
多数のADグループに属するActive Directoryユーザには、より大きな認証パケットが必要です。 この制限により、接続失敗時に分かりにくいエラーメッセージ、通常は「GSSAPI context establishment error: The routine must be called again to complete its function: Unknown error」が発生しました。
SSLおよびGSSAPIデータ転送におけるタイミング依存の障害が修正されました。 (Tom Lane) §
非ブロッキングモードでSSLまたはGSSAPI暗号化を使用すると、libpqが「SSL error: bad length」または「GSSAPI caller failed to retransmit all data needing to be retried」で失敗することがありました。
ecpgアプリケーションにおける接続検索時のNULLポインタ参照が回避されました。 (Aleksander Alekseev) §
この問題は、アプリケーションに名前付き接続と名前のない接続が混在する場合にのみ発生する可能性がありました。
psqlのCOPYおよび\copyオプションのタブ補完が改善されました。
(Atsushi Torikoshi)
§
一部のオプションはどちらか一方の場合でのみ有効であるにもかかわらず、COPY FROMとCOPY TOの両方に同じ補完候補が提供されていました。
これらの場合を区別して、より正確な提案が提供されるようになります。
複数のパイプライン同期メッセージを受信した際のpgbenchにおけるアサーションエラーが回避されました。 (Fujii Masao) §
pg_createsubscriberによるサブスクリプション初期化時の重複トランザクションリプレイが修正されました。 (Shlok Kyal) §
サブスクライバーのリカバリ中に処理された最後のトランザクションが、通常のレプリケーションが開始されると再度送信される可能性がありました。
pg_dumpがドメイン型の非NULL制約に関するコメントを確実にダンプするようになりました。 (Jian He, Álvaro Herrera) §
pg_dumpがドメイン制約に関するコメントを有効な順序で確実にダンプするようになりました。 (Jian He) §
場合によっては、制約の作成前にコメントコマンドが出現することがあります。
pg_dumpにおいて、全種類のデータベースオブジェクトに対して安定したソート順序を確保するようになりました。 (Noah Misch, Andreas Karlsson) § § §
pg_dumpは、依存関係に基づく再順序付けをおこなう前に、オブジェクトを論理名でソートします。 このソートでは、ルールや制約などの特定のオブジェクトタイプを識別する完全な一意キーが考慮されていなかったため、論理的に同一のデータベースに対しても異なるソート順序が生成される可能性がありました。 そのため、pg_dump出力のdiffによるデータベースの比較が困難でした。そこで、あらゆるケースにおいて安定したソート順序を確保するためにロジックが改善されました。
pg_dumpフィルタファイルにおけるオブジェクト型の解析の誤りが修正されました。 (Fujii Masao) §
キーワードを、以前のように最初の非英数文字で停止するのではなく、次の空白まで拡張して扱うようになりました。
これにより、有効なキーワードには影響しませんが、一部のエラーケースを正しく認識できるようになります。
例えば、以前はtable-dataはtableと誤って解釈されていましたが、今後は拒否されます。
pg_restoreが、PostgreSQL v12以前のpg_dumpバージョンで作成されたディレクトリフォーマットのダンプからラージオブジェクト(BLOB)のリストアに失敗していたのが修正されました。 (Pavel Stehule) §
pg_upgradeにおいて、継承されたNOT NULL制約の不整合をチェックするようになりました。 (Ali Akbar) § § §
PostgreSQL 18以前のバージョンでは、継承された列のNOT NULL制約を削除することが可能です。 ただし、これによりスキーマを復元できなくなり、pg_upgradeが失敗します。 pg_upgradeの事前チェック中にこのようなケースを検出し、ユーザがアップグレードを開始する前を修正できるようになりました。
pg_upgradeの実行中にターゲットインストール環境でmax_slot_wal_keep_sizeがデフォルトに設定されていることを要求しなくなりました。
(Dilip Kumar)
§
initdb中にtrack_commit_timestampが有効になっている場合のアサーションエラーが回避されました。
(Hayato Kuroda, Andy Fan)
§
PREPARE TRANSACTION WALレコード内の削除された統計に関する情報を表示するようpg_waldumpが修正されました。
(Daniil Davydov)
§
contrib/dblink接続確立中に開いている接続の潜在的なリークが回避されました。
(Tom Lane)
§
dblinkのハッシュテーブルに新しい接続オブジェクトを挿入する際にメモリ不足が発生する稀なシナリオでは、開いている接続がセッション終了までリークされ、リモートサーバ上にアイドル状態のセッションが残存していました。
contrib/pg_prewarmが非常に大きなshared_buffers設定に対応できるようになりました。
(Daria Shanina)
§
shared_buffersが約5000万バッファ(400GB)を超えると、autoprewarmはメモリ割り当てエラーで失敗していました。
contrib/pg_prewarmにおけるアサーションエラーが防止されました。
(Masahiro Ikeda)
§
ビューなどのストレージを持たないリレーションにpg_prewarm()を適用すると、アサーションエラーが発生しましたが、アサート無しのビルドでは悪影響はありませんでした。
この問題を回避するためのエラーチェックが追加されました。
contrib/pg_stat_statementsでは、正規化された問い合わせで使用されるパラメータ番号に欠番が発生しないようになりました。
(Sami Imseih)
§
contrib/postgres_fdwのDirectModifyメソッドにおけるメモリリークが修正されました。
(Tom Lane)
§
DirectModifyメソッドの呼び出し間で問い合わせが失敗した場合、リモート変更コマンドの結果を保持するPGresultが残りのセッションの間リークしたままでした。これは、処理すべきRETURNINGデータがある場合に発生する可能性がありました。
configureの--with-includesおよび--with-librariesオプションで指定されたディレクトリが、システム提供のディレクトリよりも先に検索されるようになりました。
(Tom Lane)
§
これらのオプションを使用する一般的な理由は、ユーザがビルドしたライブラリのバージョンでシステム提供のバージョンを上書きできるようにするためです。 しかし、makefileが発行するコマンド内のスイッチの順序が不適切だったために、一部の環境では機能しませんでした。
configureの__cpuid()と__cpuidex()のチェックが修正されました。
(Lukas Fittl, Michael Paquier)
§
configureはこれらのWindows固有の関数を検出できなかったため、これらは使用されず、ハードウェア命令の利用可能性を検証できなかったため、CRC計算が必要以上に遅くなっていました。 このエラーの実質的な影響は限定的でした。なぜなら、Windows用の稼働ビルドでは通常Autoconfツールチェーンが使用されないためです。
Solarisベースのプラットフォームで--with-pamオプションを使用した場合のビルド失敗が修正されました。
(Tom Lane)
§
SolarisはPAM認証のAPIに関して他のUnixプラットフォームと一貫性がありません。 これは「inconsistent pointer」というコンパイラ警告として現れましたが、これまで何の対応もありませんでした。 しかし、GCC 14以降ではデフォルトで警告ではなくエラーとなるため、これを修正しました。
GNU Hurdでコードが移植可能になりました。 (Michael Banck, Christoph Berg, Samuel Thibault) § §
Hurdでは成立しないIOV_MAXとO_RDONLYに関する前提が修正されました。
memset_s()の使用法がC11標準に厳密に準拠しました。
(Tom Lane)
§
これにより、一部のプラットフォームでのコンパイル失敗が回避されます。
Mesonを使用してMSVCでビルドする際の互換性に関する警告が無効化されました。 (Peter Eisentraut) §
JSONB比較コード内での初期化されていない値に関するコンパイラ警告が出力されなくなりました。 (Tom Lane) §
libxml2 2.14以降でビルドする際の非推奨の警告が回避されました。 (Michael Paquier) §
C++でpg_locale.hをコンパイルする際の問題が回避されました。
(John Naylor)
§
PostgreSQLのヘッダファイルは、C++で記述された拡張を含めるために、一般的にextern "C" { ... }で囲む必要があります。
pg_locale.hではlibicuヘッダを使用しているため、この処理は失敗しましたが、これらのヘッダ内のC++専用の宣言を抑制することで回避できます。
C++で書かれた拡張でlibicuのC++ APIを使用したい場合は、pg_locale.hの前にlibicuヘッダを含めることで対応できます。