PostgreSQL 18.4 に関する技術情報

このリリースは 18.3 からの修正リリース(2026年 5月 14日リリース)です。
18.X からのアップデートではダンプ、リストアは不要です。
しかしながら、18.2 よりも前のバージョンからアップデートする場合には、18.2のリリース情報も参照してください。

PostgreSQL 18.3 から 18.4 への変更点

18.4, 17.10, 16.14, 15.18, 14.23 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。

  1. スタートアップパケットの処理での際限ない再帰を防止するようになりました。(CVE-2026-6479) (Michael Paquier) (18)(17)(16)(15)(14)
  2. 悪意のクライアントが、拒絶されたSSLとGSSの暗号化の要求を交互に何度も繰り返すことで、接続先バックエンドをクラッシュさせることができました。

    § § § § § § § § §

  3. メモリ割り当て計算における整数オーバーフローがいくつか修正されました。(CVE-2026-6473) (Tom Lane, Nathan Bossart, Heikki Linnakangas) (18)(17)(16)(15)(14)
  4. 様々な場所のメモリ割り当てサイズの計算で整数オーバーフローの可能性について不注意がありました。整数オーバーフローにより小さすぎるメモリ確保が行なわれて、その結果、範囲外に書き込みが行なわれて、サーバプロセスのクラッシュを引き起こす可能性がありました。また、おそらく任意コード実行も可能と考えられます。

    全てとは言えませんが、この危険があるのは概ね 32ビットビルドだけです。

    § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § § §

  5. pg_createsubscriberコマンドで、オプションで指定されたサブスクリプション名を適切にクォートするようになりました。(CVE-2026-6476) (Nathan Bossart) (18)(17)
  6. (ありそうにないことですが)信頼できない者がサブスクリプション名を任意に指定しているとして、サブスクリプション名にクォート無しのSQLコマンドを含めることで、SQLインジェクションが可能でした。

    § §

  7. 論理レプリケーションのオリジンの検査で、オブジェクト名を適切にクォートするようになりました。(CVE-2026-6638) (Pavel Kohout) (18)(17)(16)
  8. 「ALTER SUBSCRIPTION ... REFRESH PUBLICATION」はクォートを付加することなくSQLコマンドにスキーマ名とリレーション名を埋め込んでいて、これによりSQLインジェクションでパブリッシャ側で任意のSQL実行ができました。

    § § §

  9. ts_headline()関数で長すぎるオプションをエラーを出して拒絶するようになりました。(CVE-2026-6473) (Michael Paquier) (18)(17)(16)(15)(14)
  10. オプション「StartSel」「StopSel」「FragmentDelimiter」の文字列長は32Kbが上限でしたが、入力の検査が行われていませんでした。これを超える長い文字列の指定は、典型的にはサーバプロセスのクラッシュを引き起こしました。

    § § § § §

  11. 列のMCV(最頻値)統計情報をリストアするときに、誤った入力を検出するようになりました。(CVE-2026-6575) (Michael Paquier) (18)
  12. プランナ統計情報をリストアする関数はMCV統計値の検証が不十分でした。そのため、誤った値を受け入れて、後のプランナのクラッシュを引き起こすことがありました。

    §

  13. timeofday()およびpg_strfname()関数で、悪意のタイムゾーン名による攻撃を防ぐようになりました。(CVE-2026-6474) (Tom Lane) (18)(17)(16)(15)(14)
  14. 作りこまれたタイムゾーン設定により、pg_strfname()関数に続いて実行されるsnprintf()関数のテンプレート文字列引数に「%」シーケンスを渡すことができました。これにより潜在的にクラッシュやサーバメモリ暴露を引き起こすことができました。また、pg_strftime()で使われるサイズに限りのある出力バッファのオーバーフローを起こすこともありました。

    § § § § § § § § § §

  15. マルチ範囲型を作るときに、ユーザに指定されたスキーマに対するCREATE権限があることの確認が漏れており、修正されました。(CVE-2026-6472) (Jelte Fennema-Nio) (18)(17)(16)(15)(14)
  16. マルチ範囲型は元となる範囲型と異なるスキーマに作成することが可能ですが、このときマルチ範囲型のスキーマについて権限確認が行なわれませんでした。

    (誤動作例:scm_without_privilegeに権限がなくともエラーなく実行できてしまう)
    db1=> CREATE TYPE scm_with_privilege.typ1_range AS RANGE
            (SUBTYPE=int4, MULTIRANGE_TYPE_NAME=scm_without_privilege.typ1_multi)
    CREATE TYPE
    

    § § § § §

  17. 認証のコードでタイミング攻撃に安全な文字列比較を使うようになりました。(CVE-2026-6478) (Michael Paquier) (18)(17)(16)(15)(14)
  18. これからはパスワードやハッシュ文字列などの検査で、memcpy()やstrcmp()に替えてtimingsafe_bcmp()を使用します。所要時間のデータ依存性がどれほど攻撃に有用であるかは不明ですが、安全のため置き換える判断がされました。

    § § § § § § § § §

  19. libpqのPQfn()を安全でない関数であるとドキュメント記載し、libpq実装内部でも使用しないようになりました。(CVE-2026-6477) (Nathan Bossart) (18)(17)(16)(15)(14)
  20. 非整数の結果型に対してPQfn()には出力バッファのサイズが渡されないため、サーバから返ったデータのサイズが一致するか検査できません。悪意のサーバはこれを使ってクライアントのメモリを上書きできました。PQfn()は既に「廃れたもの」とドキュメント記載されていました。

    PQfn()をresult_is_int引数に0を指定して使用しているクライアントで危険性を回避するには、使用するAPIを変更するほかありません。

    § § § § §

  21. pg_basebackupとpg_rewindでパス横断が防止されました。(CVE-2026-6475) (Michael Paquier) (18)(17)(16)(15)(14)
  22. これらのアプリケーションでは入力から読み込まれた出力ファイルのパスを検証できていませんでした。そのため、(PostgreSQLサーバ側の)入力を与える悪意の者がこれらのアプリケーションにクライアント側の任意のファイル上書きをさせることができました。これからは絶対パスと親ディレクトリ参照を含むパスを拒絶するようになります。

    § § § § §

  23. contrib/intarrayのquery_int型とcontrib/ltreeのltxtquery型の中で、フィールドのオーバーフローが防止されました。(CVE-2026-6473) (Tom Lane) (18)(17)(16)(15)(14)
  24. 16ビットのフィールドがオーバーフローを起こすか検査されていなかったため、これらのデータ型として多すぎる要素数を持つ値を与えると、問合せを実行したバックエンドプロセスのクラッシュが発生する可能性がありました。これから、そのような値は ERROR になります。

    § § § § § § § § § §

  25. contrib/ltreeのlquery型の長すぎる値を防止するようになりました。(CVE-2026-6473) (Michael Paquier) (18)(17)(16)(15)(14)
  26. 64Kアイテムを超える値は内部オーバーフローを起こしていて、潜在的にスタック破壊や誤った問い合わせ結果をもたらすおそれがありました。

    § § § § §

  27. contrib/spiでSQLインジェクションとバッファオーバーランが防止されました。(CVE-2026-6637) (Nathan Bossart) (18)(17)(16)(15)(14)
  28. check_foreign_key()関数はキー値のクォート付加が不十分で、また、クエリの組み立てに固定長のバッファを使用していました。このモジュールはサンプルコードにすぎないとはいえ、このような危険な誤りは含まれるべきでないため、修正されました。

    § § § § §

  29. 照合順序を適用できる型では、等価条件が一意性を示すものと仮定するのでなく、非決定論的照合順序を検査するようになりました。 (Richard Guo) (18)(17)(16)(15)(14)
  30. 多数のプランナ最適化がこれを仮定していました。例えば、一意性インデックスがx列にあれば、ある1行だけが「WHERE x = 'abc'」を満たします。しかしながら、WHERE句にインデックスと異なる照合順序が付加されている場合、この結論は一般には安全ではありません。両方の照合順序が決定論的であるときは文字列の等価がビット単位での等価を意味するため安全ですが、非決定論的な場合にはそのように動作しないため、WHERE句またはインデックスに非決定論的な照合順序が適用される場合に、一意性を前提とした最適化で、誤った問い合わせ結果が返される可能性がありました。

    § § § § § § § § § § § § §

  31. 結合の削除時に、RestrictInfo構造体内のリレーション参照が完全に削除されない問題が修正されました。 (Tom Lane) (18)(17)(16)
  32. この見落としにより、「ERROR: FULL JOIN is only supported with merge-joinable or hash-joinable join conditions」といった予期しないプランナでのエラーを引き起こすことが判明しています。また、他のケースでも有効なプランが考慮されない原因となっていた可能性がありました。

    § § § § §

  33. プランナによるパーティションキー列とサブクエリ出力の照合が改善されました。 (Richard Guo) (18)
  34. オペランドをパーティションキーと比較する前に、オペランドから何もしない(no-opの)PlaceHolderVarsを削除します。この変更により、以前はパーティションのスキャンが不要であると認識できなかった場合でも、パーティションプルーニングが正常に実行されるようになります。

    §

  35. 「ON t1.boolcol」のようなboolean型の列のみで構成される結合句を処理できるように、自己結合の削除処理が修正されました。 (Andrei Lepikhov, Tender Wang, Alexander Korotkov) (18)
  36. 以前は、このような場合に「ERROR: no relation entry for relid ...」が発生していました。

    §

  37. 仮想生成列を持つテーブルで、カーソルを使った更新「UPDATE/DELETE ... WHERE CURRENT OF」が正常に動作するように修正されました。 (Satyanarayana Narlapuram, Dean Rasheed) (18)
  38. これまでは、実行時に「ERROR: WHERE CURRENT OF on a view is not implemented」が発生する動作が報告されていました。

    §

  39. 「INSERT ... ON CONFLICT」内のEXCLUDED列参照における仮想生成列の展開が修正されました。 (Satyanarayana Narlapuram, Dean Rasheed) (18)
  40. 不具合によって、予期せぬエラー「ERROR: unexpected virtual generated column reference」が発生したり、誤った問い合わせ結果が発生したりしていました。

    §

  41. ルールアクションおよびルール条件における「NEW」生成列の誤った処理が修正されました。 (Richard Guo, Dean Rasheed) (18)(17)(16)(15)(14)
  42. 以前は、このような列参照がINSERTの場合にNULLとなり、UPDATEの場合にはOLDと同じ値になっていました。

    (誤動作例)
    db1=# CREATE TABLE t21 (id int PRIMARY KEY, a int,
            gen int GENERATED ALWAYS AS (a * 2) VIRTUAL);
    db1=# CREATE TABLE t21log (op text, old_gen int, new_gen int);
    db1=# CREATE RULE r21i AS ON INSERT TO t21 DO ALSO
            INSERT INTO t21log VALUES ('I', NULL, NEW.gen);
    db1=# CREATE RULE r21u AS ON UPDATE TO t21 DO ALSO
            INSERT INTO t21log VALUES ('U', OLD.gen, NEW.gen);
    db1=# INSERT INTO t21 (id, a) VALUES (1, 10);
    db1=# UPDATE t21 SET a = 100 WHERE id = 1;
    db1=# SELECT * FROM t21log;
     op | old_gen | new_gen
    ----+---------+---------
     I  |  *null* |  *null*
     U  |      20 |      20
    (2 rows)
    

    § § § § §

  43. 偽性のエラー「ERROR: indexes on virtual generated columns are not supported」が修正されました。 (Robert Haas) (18)
  44. 式インデックスの作成時に、このエラーが誤って報告されることがありました。

    §

  45. 偽性のエラー「ERROR: generated columns are not supported in COPY FROM WHERE conditions」が修正されました。 (Tom Lane) (18)(17)(16)(15)(14)
  46. 「COPY t23 FROM stdin WHERE tableoid > 0」のように「COPY FROM」のWHERE句でシステム列を使用すると、このエラーが誤って報告されることがありました。アサート有効のビルドでのアサート失敗も報告されました。

    § § § § §

  47. MERGEがrepeatable readモードまたはserializableモードで同時更新されるタプルを検出した場合に、「ERROR: could not serialize access due to concurrent update」を出して直列化失敗を正しく報告するようになりました。 (Tender Wang) (18)(17)(16)(15)
  48. 以前は、このような場合により低い分離レベルの場合と同じ動作をしていて、トランザクションがアボートせず、不整合が見過ごされる可能性がありました。

    (誤動作例 - 字下げは並行する別セッションをあらわします)
    db1=# CREATE TABLE t24 (id int, v int);
    db1=# INSERT INTO t24 VALUES (1,0);
    
       db1=# BEGIN;
       db1=*# UPDATE t24 SET v = v + 100;
    
    db1=# START TRANSACTION ISOLATION LEVEL serializable;
    db1=*# MERGE INTO t24 t USING (VALUES (1, 100)) AS s (id, inc) ON t.id = s.id
             WHEN MATCHED THEN UPDATE SET v = t.v + s.inc
             WHEN NOT MATCHED THEN INSERT (id, v) VALUES (s.id, s.inc);
    
       db1=*# COMMIT;
    
    db1=*# SELECT * FROM t24;
     id |  v
    ----+-----
      1 |   0
      1 | 200
    (2 rows)
    
    db1=*# COMMIT;
    db1=# SELECT * FROM t24;
     id |  v
    ----+-----
      1 | 200
    (1 row)
    

    § § § §

  49. ソーステーブルから列が削除されている場合における「CREATE TABLE ... LIKE ... INCLUDING STATISTICS」の動作が修正されました。 (Julien Tachoires) (18)(17)(16)(15)(14)
  50. LIKEで指定するテーブルが作成後にALTER TABLEで列の削除を行なっているときに該当します。このような場合、拡張統計オブジェクトが正しくコピーされなかったり、コマンドが下記のような予期せぬエラーを返す可能性がありました。

    ERROR:  cache lookup failed for attribute 3 of relation 17106
    

    § § § § §

  51. 「ALTER INDEX ... ATTACH PARTITION」で、そうすべき場合には親インデックスを有効とマークできるようになりました。 (Sami Imseih) (18)(17)(16)(15)(14)
  52. すべてのリーフインデックスが有効であるにもかかわらず、パーティションインデックスが無効とマークされたままになる特殊なケースが存在していました。本修正は、ユーザが手動でカタログを更新することなく、このような状況を補正する仕組みを提供します。

    § § § § §

  53. 「ALTER TABLE ... SET NOT NULL」がシステムテーブル(カタログ)の変更が完了した後にのみオブジェクトアクセスフック関数を呼び出すように修正されました。 (Artur Zakirov) (18)
  54. これはpg_constraintにNOT NULL制約用の行が追加された際につくられた不具合の修正です。

    §

  55. ALTER FOREIGN DATA WRAPPERが、ラッパーオブジェクトのハンドラ関数への依存関係を削除しないように修正されました。 (Jeff Davis) (18)(17)(16)(15)(14)
  56. 以前は、VALIDATORパラメータの指定により、誤ってハンドラ関数への依存関係が削除されていました。

    § § § § §

  57. 外部キー制約のトリガーに対する遅延実行指定が効かなくなる問題が修正されました。 (Yasuo Honda) (18)
  58. 以前は「DEFERRABLE INITIALLY DEFERRED」として定義された外部キー制約が、「NOT ENFORCED」ステータスに設定された後、再び「ENFORCED」に戻されると「NOT DEFERRABLE」として動作していました。

    この問題が発生している外部キー制約がある場合は、本マイナーバージョンアップ適用後に「ALTER TABLE ..」で再度「NOT ENFORCED」に設定してから「ENFORCED」に戻すことで修復できます。

    §

  59. ドメインを許可するように「WITHOUT OVERLAPS」が修正されました。 (Jian He) (18)
  60. 「UNIQUE/PRIMARY KEY ... WITHOUT OVERLAPS」で指定する重複しない列は範囲型またはマルチ範囲型である必要がありますが、そのような型を元にしたドメインも許可する必要がありました。これまでは以下のようなエラーになっていました。

    (修正前の動作例)
    db1=# CREATE DOMAIN dtsrange AS tsrange CHECK (lower(VALUE) IS NOT NULL);
    db1=# CREATE TABLE t30 (id int, tsr dtsrange, PRIMARY KEY (id, tsr WITHOUT OVERLAPS));
    ERROR:  column "tsr" in WITHOUT OVERLAPS is not a range or multirange type
    

    §

  61. マルチ範囲型を介して、複合型が再帰的に自身をメンバーとして含むことが禁止されました。 (Heikki Linnakangas) (18)(17)(16)(15)(14)
  62. これまでも ALTER TABLE ADD COLUMN や ALTER TYPE ADD ATTRIBUTE の際に、ドメイン、配列、複合型、範囲型を通して自身をメンバーとして含まないことを検査していましたが、マルチ範囲型を経由する場合について見落とされていました。

    (誤動作例)
    db1=# CREATE TYPE typ31 AS (a int, b int);
    db1=# CREATE TYPE typ31range AS RANGE (subtype = typ31);
    db1=# ALTER TYPE typ31 ADD ATTRIBUTE c typ31range;
    → 修正前は実行できてしまう
      修正後は「ERROR:  composite type two_ints cannot be made a member of itself」
    

    § § § § §

  63. Datumのイメージ比較が符号拡張の違いに依存しないよう修正されました。 (David Rowley) (18)(17)(16)(15)(14)
  64. 従来は「ERROR: could not find memoization table entry」といったエラーメッセージが出力されたり、誤った問合せ結果を招いていました。

    DatumとはSQLの各種データ型の値を格納する汎用的な内部実装上のデータ型です。そのイメージ比較とはビット単位での一致を調べる処理です。

    § § § § §

  65. ハッシュ化された「IN」/「NOT IN」において、非STRICTな等価演算子を使用した場合の処理が修正されました。 (Chengpeng Yan) (18)(17)(16)(15)(14)
  66. これまでは、NULLを空文字と等価とする独自の等価演算子を拡張機能で定義している場合などで、NULLを含む検索時にクラッシュや誤った問い合わせ結果を引き起こす可能性がありました。

    なお、組み込みデータ型の等価演算子はすべてSTRICTであるため、この問題は拡張機能で定義されたデータ型でのみ発生します。

    § § § § §

  67. to_char()における、ロケール依存の長すぎる数値記号を切り詰められるようになりました。 (Tom Lane) (18)(17)(16)(15)(14)
  68. to_char()は、パターン内の各フォーマットコードごとに8バイトを見込んで出力バッファを確保しています。ロケールで指定された通貨記号、桁区切り記号、小数点記号、または符号記号が8バイトを超える場合、理論上はバッファオーバーランが発生する可能性がありました。

    現実にはそのようなロケールは存在せず、さらに権限のない攻撃者がPostgresSQLサーバ配下に悪意あるロケール定義をインストールするのは現実的ではありませんが、安全性を考慮し、記号が長すぎる場合にはそれを検出し、必要に応じて切り詰めるようになりました。

    § § § § §

  69. 「Ispell」辞書用のaffixファイル解析時に発生し得るバッファオーバーランが防止されました。 (Tom Lane) (18)(17)(16)(15)(14)
  70. 破損した、あるいは悪意あるaffixファイルによってサーバプロセスがクラッシュする可能性があったため、入力値検証を強化し、異常に長いデータを安全に扱えるよう修正されました。

    なお、テキスト検索設定ファイルは信頼できるものと想定されているため、これはセキュリティ問題の扱いにはなりませんでした。

    § § § § § § § § § §

  71. ウィンドウ集約におけるフレーム開始位置および終了位置の計算で、整数オーバーフローが発生しないよう保護されました。 (Richard Guo) (18)(17)(16)(15)(14)
  72. ユーザ指定のオフセット値が非常に大きい場合(INT64_MAXに近い値)、予期せぬエラーや誤った問い合わせ結果を引き起こす可能性がありました。開発用ビルドではアサート失敗も報告されました。

    (誤動作例)
    db1=# CREATE TABLE t36 (i int);
    db1=# INSERT INTO t36 SELECT generate_series(1, 1000) g;
    db1=# SELECT sum(i) 
            OVER (ROWS BETWEEN 0x7fffffffffffffff FOLLOWING AND 1 FOLLOWING), i FROM t36;
    ERROR:  window frame head moved backward
    

    § § § § §

  73. array_agg_array_combine()が、配列のNULLビットマップを正しく結合するよう修正されました。 (Dmytro Astapov) (18)(17)(16)
  74. array_agg_array_combine() はarray_agg()集約関数の内部実装で使われている関数です。

    この不具合により、NULLと非NULL要素が混在する入力において、並列化されたarray_agg(anyarray)の計算が失敗し、誤った問い合わせ結果が生じるおそれがありました。このエラーは並列ワーカーの実行タイミングに依存するため、再現性の低い不具合として現れていました。

    (並列実行プランのときに誤動作が発生する可能性のある問い合わせ例)
    db1=# CREATE TABLE t37 (id int, grpid int, c1 int, c2 int, c3 int);
    db1=# INSERT INTO t37 SELECT g, g % 10000, 
            nullif(g % 3, 0), nullif(g % 5, 0), nullif(g % 7, 0)
            FROM generate_series(1, 100000) g;
    db1=# SELECT grpid, array_agg(ARRAY[c1, c2, c3]) FROM t37 GROUP BY grpid;
     → この結果が並列実行プランを無効化したときと一致しない場合がある
    

    § § §

  75. sync_file_range()がエラーコード「EINTR」を返した場合に再試行するようになりました。 (DaeMyung Kang) (18)(17)(16)
  76. これまでは、割り込み発生時のリトライ処理が正しく機能していませんでした。sync_file_range()はファイル書き込みをストレージに反映させるときに使われるLinuxのシステムコールです。

    § § §

  77. 共有システムテーブル(カタログ)に対するpg_stat_reset_single_table_counters()の誤動作が修正されました。 (Chao Li) (18)(17)(16)(15)
  78. これまでは、共有システムテーブルに対して同関数を実行すると、現在のデータベースの「stat_reset_timestamp」(pg_stat_databaseシステムビューのstats_reset列で報告される値)が誤って更新されていました。

    (誤動作例)
    db1=# SELECT now(), pg_stat_reset_single_table_counters('pg_authid'::regclass);
                  now              | pg_stat_reset_single_table_counters
    -------------------------------+-------------------------------------
     2026-05-22 13:07:49.624814+09 |
    (1 row)
    
    db1=# SELECT datname, stats_reset FROM pg_stat_database
            WHERE datname = current_database();
     datname |          stats_reset
    ---------+-------------------------------
     db1     | 2026-05-22 13:07:49.627562+09
    (1 row)
    

    § § § §

  79. 並列applyワーカーがidle状態のときにアクティビティ統計を更新するようになりました。 (Zhijie Hou) (18)(17)(16)
  80. これまでは、直近に完了したトランザクションの統計情報が長時間報告されない場合があり、特にワークロードが軽い環境で顕著でした。

    § § §

  81. 集合演算で配列長を推定中するときに、予期せぬエラー「ERROR: no relation entry for relid 0」が発生することがあり、修正されました。 (Tender Wang) (18)(17)
  82. UNIONなどの集合演算で、元となる型の異なる配列型を型変換する場合に発生することがありました。

    (発生例)
    db1=# SELECT null::int[] UNION ALL SELECT null::int[] UNION ALL SELECT null::bigint[];
    ERROR:  no relation entry for relid 0
    

    § §

  83. pglz_decompress()が破損した入力を受け取った場合にバッファの超過読み取りが発生することがあり、修正されました。 (Andrew Dunstan) (18)(17)(16)(15)(14)
  84. pglz_decompress()はpglz形式の圧縮データを展開する内部実装関数です。破損した圧縮データによって入力末尾を越えた読み取りが発生する可能性があり、ごくまれにクラッシュを引き起こすおそれがありました。

    § § § § §

  85. インクリメンタルJSONパーサにおいて、入力バッファの境界をまたぐ数値トークンの処理が修正されました。 (Andrew Dunstan) (18)(17)
  86. JSON数値の文法に反する不正な形式の数値を受け入れてしまう可能性があり、その結果として後の処理でエラー(「ERROR: invalid input syntax for type json」など)が発生することがありえました。デバッグ用ビルドではアサート失敗を引き起こしました。

    § §

  87. インクリメンタルバックアップのリストア時に、リレーションの可視性マップが肥大化することがあり、防止されました。 (Robert Haas) (18)(17)
  88. このリストア処理では、期待されるファイル長の計算が誤っていたため、可視性マップに多数のゼロブロックが追加される可能性がありました。これはデータ破損にはつながりませんが、大量のディスク領域を無用に消費する可能性がありました。

    § §

  89. カタログキャッシュのテキスト列検索において、データベースのデフォルト照合順序ではなく、C照合順序が使用されるようになりました。 (Jeff Davis) (18)(17)
  90. これにより、データベースが特定できずデフォルト照合順序も決定できない特殊ケースでも、物理レプリケーションが開始できるようになります。pg_receivewalによるレプリケーション接続の開始時に「FATAL: cannot read pg_class without having selected a database」が発生するケースが報告されました。

    § §

  91. スタンバイサーバ昇格時に、応答待ちのまま停止したslotsyncワーカープロセスが昇格処理をブロックする問題が修正されました。 (Nisha Moond, Ajin Cherian) (18)(17)
  92. プライマリサーバからの応答を待ち続けていたワーカープロセスにより、昇格処理が不必要に長時間遅延することがありました。

    § § § § § §

  93. アイドル状態のslotsyncワーカープロセスによる過剰なログ出力が修正されました。 (Zhijie Hou) (18)(17)
  94. § §

  95. tuplestoreデータ構造で、エラー発生後に内部状態の不整合が生じないようになりました。 (Tom Lane) (18)(17)(16)(15)(14)
  96. 通常は問題になりませんが、WITH HOLDカーソルのtuplestoreでは問題となる可能性がありました。PostgreSQL 15以前では、この問題により容易に再現可能なクラッシュが発生することがありました。PostgreSQL 16以降での影響は確認されていませんが、すべてのサポートバージョンで内部状態の整合性が保たれるよう修正されました。

    § § § § §

  97. pg_aiosシステムビューのpid列が、所有プロセスが存在しない場合に0ではなくNULLを示すようになりました。 (ChangAo Chen) (18)
  98. §

  99. pg_stat_replicationのlag列が実際より早い段階でNULLと報告されてしまう問題が修正されました。 (Shinya Kato) (18)(17)(16)(15)(14)
  100. 特に論理レプリケーション環境で、レプリケーション処理中であるにもかかわらず、過度に早くNULLとなることがありました。

    § § § § §

  101. 並列Btreeインデックススキャンで使用される共有メモリの割り当て不足が修正されました。 (Siddharth Kothari) (18)
  102. 稀なケースで、この共有メモリの割り当て不足によりサーバがクラッシュする可能性がありました。

    §

  103. WAL出力無しのGiSTインデックスを使用する際に、稀に発生するフラッシュ失敗を回避するようになりました。 (Tomas Vondra) (18)(17)(16)(15)(14)
  104. WAL出力無しのGiSTインデックスにおいて、挿入ポイントを表す擬似LSNの選択が不適切であったため、誤って「ERROR: xlog flush request n/nnnn is not satisfied」が発生することがありました。(なお、ここでのWAL出力無しはUNLOGGEDテーブルを意味していません。)

    § § § § §

  105. 変則的なサイズのセグメント使用時に、DSAページマップの必要サイズの過小評価が修正されました (Paul Bunn) (18)(17)(16)(15)(14)
  106. この計算ミスにより、範囲外アクセスが発生し、サーバがクラッシュする可能性がありました。

    § § § § §

  107. 共有メモリ内における最も古いマルチトランザクション配列のインデックス計算が修正されました。 (Yura Sokolov) (18)(17)
  108. PREPARED状態であるが、未コミットのトランザクションが保持する行ロックが他セッションから見えなくなるなど、可視性の不整合が発生する可能性がありました。また、max_connectionsが非常に小さい場合には、メモリ破壊が発生する可能性もありました。

    § § § §

  109. 多数のEXPLAIN拡張オプションを登録した場合に発生する配列オーバーランが修正されました。 (Joel Jacobson) (18)
  110. この問題により、メモリ破損やサーバプロセスのクラッシュが発生する可能性がありました。

    §

  111. 拡張データ型の式に対する拡張統計情報処理時にクラッシュが発生する可能性があり、修正されました。 (Michael Paquier) (18)(17)(16)(15)(14)
  112. データ型のtypanalyze関数が有効な統計情報を生成しない場合、NULLポインタ参照が発生する可能性がありました。PostgreSQL本体のtypanalyzeでは発生しませんが、拡張機能では発生する可能性がありました。

    § § § § §

  113. GROUP BY句で使用される結合エイリアス変数を正しく表示するよう修正されました。 (Tom Lane) (18)
  114. 「SELECT ... t1 LEFT JOIN t2 USING (x) GROUP BY x」のようなクエリを含むビューにおいて、GROUP BY句のSQL文が内部からの逆解析時に誤って表示され、データベースのダンプ/リストアが失敗する可能性がありました。この問題は、「t1.x」と「t2.x」のデータ型が同一ではなく、「t1.x」側で暗黙的な型変換が必要だった場合にのみ発生しました。

    (誤動作例)
    db1=# CREATE TABLE t1 (x integer, a numeric);
    db1=# CREATE TABLE t2 (x bigint, b text);
    db1=# CREATE VIEW test_view AS SELECT x::integer AS x FROM t1 LEFT JOIN t2 USING (x) GROUP BY x;
    (18.3以前では、以下のように誤ったSQLへ逆解析される)
    db1=# SELECT pg_get_viewdef('test_view'::regclass, true);
           pg_get_viewdef
    -----------------------------
      SELECT t1.x::integer AS x +
        FROM t1                 +
          LEFT JOIN t2 USING (x)+
       GROUP BY (t1.x::bigint);
    (1 row)
    
    (この状態でダンプしリストアすると、以下のようなエラーが発生する)
    $ pg_dump db1 > dump.sql
    $ psql restore_test 
    

    §

  115. ICUを使用した文字列処理における、軽微なメモリリークが修正されました。 (Jeff Davis) (18)(17)(16)
  116. § § §

  117. startupプロセス失敗時に、他の子プロセスを適切にシャットダウンするよう修正されました。 (Ayush Tiwari) (18)(17)(16)(15)
  118. 従来は「startupプロセス実行中は他のpostmaster子プロセスは存在しない」という古い前提に依存しており、postmasterの即時終了でも問題ないとされていました。残存した子プロセスも最終的にはpostmasterの終了を検知して自主的に終了しますが、より適切なシャットダウン手順が望まれていました。

    § § § §

  119. チェックポイントのWALリプレイ処理とマルチトランザクションID生成の間に存在する競合状態が修正されました。 (Heikki Linnakangas) (18)(17)(16)(15)(14)
  120. 古いマイナーバージョンのプライマリからWALを追従するスタンバイサーバにおいて、「ERROR: could not access status of transaction」というエラーを伴うクラッシュおよび再起動ループが発生する可能性がありました。

    § § § § §

  121. walsenderプロセス終了時に無限待機状態となりうる不具合が修正されました。 (Anthonin Bonnefoy) (18)(17)(16)(15)(14)
  122. 論理レプリケーションのパブリッシャ側のPostgreSQLを停止する際に、walsenderプロセスは未書き込みのWALがすべて書き出されるまで待機します。しかし、その書き出し要求が正しく行われていなかったため、状況によっては待機が終了せず、無限に停止処理が続く場合がありました。

    § § § § § § § § § §

  123. リカバリ中にテーブルの空き領域マップ(FSM)の変更内容が確実に保持されるように修正されました。 (Alexey Makhmutov) (18)(17)(16)(15)(14)
  124. これまでは、WALリプレイ時にFSMの更新自体は行われていたものの、チェックサムが有効な場合に、FSMページのバッファがダーティページとして印付けされていませんでした。そのため、変更内容がディスクへ書き出されず、反映されない場合がありました。

    スタンバイサーバでは、この問題により時間の経過とともにFSMの内容が実際のテーブル状態と大きく乖離することがありました。FSMはあくまでヒント情報として使用されるだけですが、スタンバイサーバがアクティブに昇格した際、FSMの大部分が更新によって修復されるまでの間、大きく性能低下するおそれがありました。

    § § § § §

  125. ecpgプリプロセッサで、接続が確立されていない状態で一部の関数を呼び出した場合に、クラッシュする不具合が修正されました。 (Shruthi Gowda) (18)(17)(16)(15)(14)
  126. ECPGdeallocate_all()、ECPGprepared_statement()、ECPGget_desc()、および、ecpg_freeStmtCacheEntry()でセグメンテーション違反が生じました。

    § § § § §

  127. pg_basebackupおよびpg_verifybackupでtarファイルの読み込み処理が強化されました。 (Tom Lane) (18)
  128. これまでは、入力ファイルがtarファイルであるかどうか、さらにPostgreSQLが処理可能なtar形式かどうかの検証が十分に行われていませんでした。そのため、PostgreSQLではない他のtar作成ツールによって生成されたtarファイルを入力とした場合、想定外の形式であることで問題が生じる可能性がありました。

    §

  129. pg_basebackupおよびpg_verifybackupでバックアップの展開およびtar読み込み処理における各種バグが修正されました。 (Andrew Dunstan, Tom Lane, Chao Li) (18)(17)(16)(15)
  130. 具体的には、tarファイルのパディング領域の扱いの不備、特殊ケースにおいてLZ4圧縮データが破損する可能性、一部の異常系エラー条件の検査漏れ、圧縮/展開のエラー発生後に終了しないことによる連鎖的なエラー報告、メモリリークの発生、ということが含まれます。

    § § § § § § § § § § § §

  131. pg_dumpにおいて、NOT NULL制約のNO INHERIT属性が正しく保持されるように修正されました。 (Jian He) (18)
  132. これまでは、一部のケースでNO INHERIT句がダンプ出力されませんでした。

    §

  133. pg_dumpallにおいて、OIDが存在しないロールが権限を与えた場合にもGRANT文を出力するように、修正されました。 (Tom Lane) (18)(17)(16)
  134. これまでは、このような状態のGRANTがダンプ対象から除外される場合がありました。今回の修正で、PostgreSQL v16より前と同様に、GRANTED BY句を付けずにGRANT文を出力するよう変更されました。

    なお、権限を与えたロールのOIDが存在しないことに対する警告メッセージは引き続き出力されますが、警告を出すのはソースサーバがPostgreSQL v16以降の場合のみに限定されます。

    § § §

  135. pg_upgradeにおいて、古いソースサーバへ接続する際に正しいプロトコルバージョンを使用するように修正されました。 (Jacob Champion) (18)(17)(16)(15)(14)
  136. これまでは、2018年2月のマイナーリリース(10.2、9.6.7、9.5.11、9.4.16、9.3.21)よりも古いPostgreSQLサーバからアップグレードを行う場合に、不具合が発生する可能性がありました。

    「FATAL: unsupported frontend protocol ...」が発生するケースが報告されました。

    § § § § §

  137. contrib/basic_archiveが、起動時にアーカイブディレクトリが存在しなくてもよくなりました。 (Nathan Bossart) (18)(17)(16)(15)
  138. これまでは、起動時点でbasic_archive.archive_directoryに指定したディレクトリが存在しない場合、その設定自体が無効なものとして扱われました。今回の修正により、起動時点でディレクトリが存在しなくても、後からディレクトリが作成された場合にアーカイブ処理を継続できるようになりました。

    § § § §

  139. contrib/ltreeが、大文字小文字のフォールドで文字列のバイト長が変化する場合に対応できるように修正されました。 (Jeff Davis) (18)(17)(16)(15)(14)
  140. これまでは、大文字小文字を区別しないマッチングを指定するlqueryパターンにおいて、本来一致するはずのラベルにマッチしない場合がありました。

    § § § § § §

  141. contrib/pg_overexplainにおいて、RANGE_TABLEオプションの出力構造の不具合が修正されました。 (Satyanarayana Narlapuram) (18)
  142. これまでは、JSON、YAML、XML形式の出力で一部のフィールドが誤った位置に出力される場合がありました。

    §

  143. contrib/pg_stat_statementsで、pgss_query_texts.statファイルの解析中にエラーが発生した時に、メモリリークが発生しないように修正されました。 (Heikki Linnakangas) (18)(17)(16)(15)(14)
  144. § § § § §

  145. contrib/postgres_fdwにおいて、利用不能になった接続を早期に解放してしまうことでクラッシュすることがあり、修正されました。 (Etsuro Fujita) (18)(17)(16)(15)(14)
  146. オープン中のカーソルなどのデータ構造に接続オブジェクトへの参照が残っている可能性があるため、トランザクション終了まで接続オブジェクトのクローズを遅延させるようになりました。

    § § § § §

  147. タイムゾーンデータファイルがtzdata release 2026bに更新されました。 (Tom Lane) (18)(17)(16)(15)(14)
  148. ブリティッシュコロンビア州(America/Vancouver)は、2026年11月から通年でUTC-07を使用するようになります(事実上の恒久的な夏時間)。同地域のタイムゾーン略称がそれ以降「MST」になると想定しています。実際には別の略称へ変更される可能性もありますが、現時点では未確定です。

    モルドバの歴史的変更も行なわれました。モルドバは2022年以降、EUの夏時間切替時刻に従っていたことが反映されました。

    § § § § §