PostgreSQL 13.4 に関する技術情報

このリリースは 13.3 からの修正リリース(2021年8月12日リリース)です。
13.X からのアップデートではダンプ、リストアは不要です。
しかしながら、13.2 よりも前のバージョンから移行する場合には 13.2 のリリース情報も確認してください。

PostgreSQL 13.3 から 13.4 への変更点

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

  1. 射影ステップの繰り返し適用による誤った実行計画の作成が修正されました。 (Tom Lane) (13)(12)(11)
  2. 2つの ProjectionPath(射影、ターゲットリストの処理を行うパス)が互いにスタックした場合、プランナが誤った実行計画を作成する可能性がありました。これを再現させる既知の手順は並列ソートのみですが、それ以外の発生パターンもあるかもしれません。本障害によりクラッシュまたは誤った問い合わせ結果が生じます。また、障害動作を狙って起こしてサーバのメモリ内容の漏洩を狙う攻撃も可能です。(CVE-2021-3677)

    以下に再現例を示します。

    db=# CREATE TABLE t1 (c1 int, c2 int);
    db=# INSERT INTO t1 VALUES (1, 2), (3, 4);
    db=# SET parallel_setup_cost TO 0;
    db=# SET parallel_tuple_cost TO 0;
    db=# SET min_parallel_table_scan_size TO 0;
    db=# SET max_parallel_workers_per_gather TO 4;
    
    db=# SELECT generate_series(1, c1), array(SELECT generate_series(1, c1)) FROM t1 ORDER BY c2;
    (修正前の誤った問い合わせ結果)
     generate_series |   array
    -----------------+-----------
                   1 | {1,2}
                   2 | {1,2}
                   1 | {1,2,3,4}
                   2 | {1,2,3,4}
                   3 | {1,2,3,4}
                   4 | {1,2,3,4}
    (6 rows)
    
    (修正後の正しい応答)
     generate_series |  array
    -----------------+---------
                   1 | {1}
                   1 | {1,2,3}
                   2 | {1,2,3}
                   3 | {1,2,3}
    (4 rows)
    
    (修正前の誤ったプラン、一部で c1列と c2列が取り違えられている)
    db=# EXPLAIN (VERBOSE, COSTS off)
           SELECT generate_series(1, c1), array(SELECT generate_series(1, c1)) FROM t1 ORDER BY c2;
                          QUERY PLAN
    -------------------------------------------------------
     ProjectSet
       Output: generate_series(1, t1.c2), (SubPlan 1), t1.c1
       ->  Gather Merge
             Output: t1.c2, t1.c1
             Workers Planned: 3
             ->  Sort
                   Output: t1.c2, t1.c1
                   Sort Key: t1.c2
                   ->  Parallel Seq Scan on public.t1
                         Output: t1.c2, t1.c1
       SubPlan 1
         ->  ProjectSet
               Output: generate_series(1, t1.c2)
               ->  Result
    (14 rows)
    
  3. SSL再ネゴシエーションがより完全に禁止されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  4. SSL再ネゴシエーションはしばらく前から無効になっていましたが、クライアイントから再ネゴシエーションの要求があれば受けつけてしまい、悪意の狙って作られた要求によりクラッシュを起こすおそれがありました(OpenSSL の脆弱性 CVE-2021-3449 を参照)。OpenSSL 1.1.0h 以降のそれが可能なバージョンについて、再ネゴシエーションが完全に無効化されました。

  5. プロシージャ内の COMMIT または ROLLBACK の後にポータルレベルのスナップショットを復元するようになりました。 (Tom Lane) (13)(12)(11)
  6. この変更により、COMMIT または ROLLBACK の直後に TOAST化された値を取得しようとし、「no known snapshots」または「missing chunk number 0 for toast value」のエラーとなる場合が修正されます。

    一部の拡張はポータル外で SQL を実行するかもしれません。このような拡張は事前に外部スナップショットの存在確認をする必要があります。以前はスナップショットを存在せずとも動作する場合もありましたが、今後は「cannot execute SQL without an outer snapshot or portal」のエラーとなります。

    (修正前の障害動作例)
    db=# CREATE TABLE t3 (c text);
    db=# INSERT INTO t3 VALUES ((SELECT string_agg(random()::text, ':') FROM generate_series(1, 1000)));
    db=# INSERT INTO t3 VALUES ((SELECT string_agg(random()::text, ':') FROM generate_series(1, 1000)));
    db=# DO $$
         DECLARE
           r record;
         BEGIN
           FOR r in SELECT c FROM t3 LOOP
             INSERT INTO t3 VALUES (r.c);
             COMMIT;
           END LOOP;
         END;
         $$;
    ERROR:  no known snapshots
    CONTEXT:  PL/pgSQL function inline_code_block line 5 at FOR over SELECT rows
    
  7. 不安定なクエリを読み取るカーソルの結果を保持する際の誤った動作が修正されました。 (Tom Lane) (13)(12)(11)
  8. 以前は、クエリ結果全体を常に巻き戻して再読み取りしていましたが、行を再度取り出した際に以前とは異なる結果となる可能性があり、あとで大きな問題となっていました。NO SCROLL指定のカーソルは順序どおりにしか行を取り出せないため、読み取っていない部分のみを保持することで修正されました。SCROLL指定のカーソルは問題が残ったままですが、不安定なクエリで使用するのは安全でないことがすでにマニュアルに記述されています。そこで、その記述をより強調することで対処されました。

    また、PL/pgSQL のクエリ結果による FORループで使用される暗黙カーソルに NO SCROLL指定を強制し、プロシージャ内のコミットでそのようなカーソルを保持する際の同様の問題が修正されました。

    (修正前の誤った問い合わせ結果の例)
    db=# CREATE TABLE t4 (c1 int, c2 text);
    db=# INSERT INTO t4 VALUES (1, 'foo'), (2, 'bar'), (3, 'baz');
    db=# DO $$
         DECLARE
           c CURSOR FOR SELECT c1 FROM t4 ORDER BY c1 FOR UPDATE;
         BEGIN
           FOR r IN c LOOP
             UPDATE t4 SET c2 = c2 || ' ' || c2 WHERE c1 = r.c1;
             COMMIT;
           END LOOP;
         END;
         $$;
    
    db=# SELECT * FROM t4;
     c1 |   c2
    ----+---------
      2 | bar
      1 | foo foo
      3 | baz baz
    (3 rows)
    
    (修正後の正しい結果)
     c1 |   c2
    ----+---------
      1 | foo foo
      2 | bar bar
      3 | baz baz
    (3 rows)
    
  9. SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE が拒否されるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  10. グループ化セットなしの GROUP BY と同様に FOR UPDATE は拒否すべきですが、以前は、空のグループ化セットを正しく処理できず、エグゼキュータでクラッシュしていました。

    (修正前のクラッシュする問い合わせ例)
    db=# SELECT NULL FROM t1 GROUP BY GROUPING SETS (()) FOR UPDATE;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    (修正後)
    db=# SELECT NULL FROM t1 GROUP BY GROUPING SETS (()) FOR UPDATE;
    ERROR:  FOR UPDATE is not allowed with GROUP BY clause
    
  11. WITH 内のクエリが NOTIFY のみに書き換えられる場合を拒否するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  12. 以前はクラッシュしていました。

    (修正前のクラッシュ発生例)
    db=# CREATE RULE r AS ON INSERT TO t DO INSTEAD NOTIFY n;
    db=# WITH w AS (INSERT INTO t VALUES (0)) VALUES (0);
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    (修正後は以下のエラーが出ます)
    ERROR:  DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH
    
  13. 結果が小数点以下 16383 桁を越える乗算をした場合にエラーとせずに結果を丸めるようになりました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  14. (修正前の動作)
    db=# SELECT (0.1 - 2e-16383) * (0.1 - 3e-16383);
    ERROR:  value overflows numeric format
    
    (修正後の応答)
                                       ?column?
    -------------------------------------------------------------------------------
     0.010000000000000000000000000000000(中略)000000000000000000000000000000000000
    (1 row)
    
  15. 非常に大きな累乗をした際のごく稀なエラーと精度の低下が修正されました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  16. (修正前の誤動作例:エラーになる場合)
    db=# SELECT 0.9999999999 ^ 70000000000000;
    ERROR:  value overflows numeric format
    
    (修正前の誤動作例:誤った問い合わせ結果が返る場合)
    db=# SELECT 0.9999999999 ^ 23300000000000;
                                       ?column?
    -------------------------------------------------------------------------------
     1.000000000000000000000000000000000...中略...000000000000000000000000000000000
    (1 row)
    
  17. to_char() に EEEE書式で 10 ^ (-10001) 未満の値を与えた場合のゼロ除算エラーが修正されました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  18. (障害動作例)
    db=# SELECT to_char(1.2345e-16379::numeric, '9.999EEEE');
    ERROR:  division by zero
    
    (修正後の正しい応答)
         to_char
    ---------------
      1.235e-16379
    (1 row)
    
  19. pg_size_pretty(bigint) が numeric版と同様に正の値と同じ方法で負の値を丸めるように修正されました。 (Dean Rasheed, David Rowley) (13)(12)(11)(10)(9.6)
  20. (正の値の応答)
    db=# SELECT pg_size_pretty(10485247::bigint);
     pg_size_pretty
    ----------------
     10239 kB
    (1 row)
    
    (負の値に対する障害動作)
    db=# SELECT pg_size_pretty(-10485247::bigint);
     pg_size_pretty
    ----------------
     -10 MB
    (1 row)
    
    (修正後の正しい応答)
     pg_size_pretty
    ----------------
     -10239 kB
    (1 行)
    
  21. pg_filenode_relation(0, 0) がエラーを出すのではなく NULL を返すようになりました。 (Justin Pryzby) (13)(12)(11)(10)(9.6)
  22. 無効なテーブル空間の OID とファイルノード番号に対しては NULL を返すべきですが、以前は 0 を与えた場合に紛らわしいエラーとなっていました。

    (修正前のエラー応答)
    db=# SELECT pg_filenode_relation(0, 0);
    ERROR:  unexpected duplicate for tablespace 0, relfilenode 0
    
  23. ALTER EXTENSION が拡張にオブジェクトを追加または削除する際に、ロックを取得するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  24. 以前は ALTER EXTENSION ADD/DROP と DROP EXTENSION が同時に実行できて、その結果、システムカタログを破損する可能性がありました。

  25. ALTER SUBSCRIPTION が空文字列のスロット名を拒絶するように修正されました。 (Japin Li) (13)(12)(11)(10)
  26. (修正後のエラーが返る動作)
    db=# ALTER SUBSCRIPTION s SET (slot_name = '');
    ERROR:  replication slot name "" is too short
    
  27. パーティションテーブルのトリガを新たなパーティションに複製するときに、トリガの有効/無効ステータスを確実にコピーするようになりました。 (Álvaro Herrera) (13)(12)(11)
  28. これまではパーティションテーブルのトリガのステータスが、子テーブルに伝搬しませんでした。

  29. REFRESH MATERIALIZED VIEW CONCURRENTLY むけに生成された問い合わせで、別名の衝突を回避するようになりました。 (Tom Lane, Bharath Rupireddy) (13)(12)(11)(10)(9.6)
  30. mv と newdata など、特定の名前の列を含むマテリアライズドビューでコマンドが失敗していました。「ERROR: column reference "mv" is ambiguous」といったエラーが発生しました。

  31. PREPARE TRANSACTION がセッション寿命のロックとトランザクション寿命のロックの衝突を正しく検査するように修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  32. 同じ勧告的ロックID値に対してセッション寿命とトランザクション寿命の両方のロックを持っている場合、トラザクションは準備された状態にできません。この制限は完全には検査されておらず、PREPARE TRANSACTION 実行時に PANIC を引き起こすおそれがありました。

  33. RLS(行単位セキュリティ)のポリシーに複数回リストされているロールをターゲットにした DROP OWNED BY の誤動作が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  34. そのような場合、アサート失敗や「ERROR: tuple already updated by self」が引き起こされました。

  35. DROP OWNED BY 実行中に RLS ポリシーからロールを削除する際の不要なエラーチェックが削除されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  36. 特に、DROP OWNED BY を使うのにスーパーユーザであることを必須とする場合について、修正されています。

  37. CREATE COLLATION にて古い形式の Windowsロケール名を許容するようになりました。 (Thomas Munro) (13)
  38. ある時点から、古い形式のロケールに対して OS がバージョン情報を提供できないためにエラーにしていましたが、そのようなロケールを再度許容するようになりました。

    (13.3 バージョンでエラーになる例)
    db=# CREATE COLLATION public.ja_jp (LOCALE = 'Japanese_Japan.932');
    ERROR:  could not get collation version for locale "Japanese_Japan.932":
    error code 87
    
  39. 行全体の変数を GENERATED句で利用できなくなりました。 (Tom Lane) (13)(12)
  40. GENERATED句で行全体の変数を利用することは、生成列がそれ自体もしくは他の生成列を参照できないというルールに違反しており、そのようなケースの動作が明白に定義されていませんでした。実際の動作としては、しばしばクラッシュを引き起こしました。

    (GENERATED句に行全体の変数を使用する例)
    db=# CREATE TABLE t20 
           (a int PRIMARY KEY, b int GENERATED ALWAYS AS (num_nulls(t20)) STORED);
    ERROR:  cannot use whole-row variable in column generation expression
    
  41. GENERATED の式における tableoid の使用について修正されました。 (Tom Lane) (13)(12)
  42. システム列 tableoid に対して 0 や誤った値が取得される場合がありました。ALTER TABLE で後から生成列を加えた場合や、生成列を持つ外部テーブルにINSERT や UPDATE を行う時に誤動作が発生します。

  43. 外部テーブルに対して高速デフォルトをセットしないようになりました。 (Andrew Dunstan) (13)(12)(11)
  44. 外部テーブルのようにローカルにヒープストレージが存在しない場合、高速デフォルトは役に立たず、その後の操作で混乱が生まれます。バージョン11 で高速デフォルトが追加された際に対象のテーブルが通常テーブルであるかのチェックがなかったため追加されました。

  45. インデックス状態フラグをトランザクションとして更新できるようになりました。 (Michael Paquier, Andrey Lepikhov) (13)(12)(11)(10)(9.6)
  46. これにより、インデックス述部が IMMUTABLE と宣言されているけれども実際にはそうではない場合の処理で失敗するのを回避できます。CREATE INDEX CONCURRENTLY でアサート失敗が生じるケースが報告されました。

  47. CREATE/ALTER DOMAIN がキャッシュされた実行プランにあらわれたときに、プランのキャッシュエントリが破損しないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  48. プリペアドステートメントとして、これら命令を実行したときに、「ERROR: unrecognized node type: N」(Nは数値)という予期せぬエラーが生じるケースが報告されました。

  49. pg_stat_activity にて walsender の最新のレプリケーションコマンドが表示されるようになりました。 (Tom Lane) (13)(12)(11)(10)
  50. 今までは最新の SQL コマンドが表示されており、実際には表示されている SQL コマンドではなくレプリケーションコマンドが実行されている場合に紛らわしいものとなっていました。

  51. postgresql.conf から設定項目が削除された場合でもpg_settings.pending_restart が true にセットされるようになりました。 (Álvaro Herrera) (13)(12)(11)(10)(9.6)
  52. pending_restart は再起動が必要な設定項目が変更された際は正しく表示されていましたが、設定項目自体が削除された場合に対応できていませんでした。

  53. 64 ビットの Windows で work_mem × hash_mem_multiplier が 2GB を超えることが許容されました。 (Tom Lane) (13)
  54. これにより hash_mem_multiplier を数ギガバイトを超えるような大きなハッシュ集約のディスク書き出しを防ぐ目的で利用できるようになりました。

  55. 外部テーブルを継承する通常テーブルに関する問い合わせにおける、誤った実行プラン作成が修正されました。 (Amit Langote) (13)(12)
  56. SELECT FOR UPDATE や関連するコマンドで、アサート失敗、もしくは、「ERROR: could not find junk column」が発生していました。

  57. プラン作成において、FROM 要素が LATERAL であるときの、不変の FROM句内関数結果のプルアップが修正されました。 (Tom Lane) (13)
  58. 問い合わせでクラッシュやアサート失敗を起こす動作が報告されました。

  59. 新しいスタンバイが新しいプライマリに追随する際に稀に発生する障害が修正されました。 (Dilip Kumar, Robert Haas) (13)(12)(11)(10)(9.6)
  60. いくつかの条件が組み合わさった際にスタンバイが間違った WALタイムラインに従おうとする可能性がありました。

  61. トランザクションアボートのレコードの WALリプレイがファイル切り捨てを引き起こすときに、最小のリカバリポイントが更新されるようになりました。 (Fujii Masao) (13)(12)(11)(10)(9.6)
  62. ファイル切り捨ては元に戻せないため、そのレコードよりも前の時点でリカバリを止めることは安全ではありません。トランザクションがコミットされた場合で該当するケースは数年前に修正されていましたが、アボートのケースは修正されていませんでした。

  63. レプリケーションスロットが無効となった後に「必要とされる最も古いWALセグメント」の境界値を適切に進めるようになりました。 (Kyotaro Horiguchi) (13)
  64. 全てのレプリケーションスロットが無効となった際に境界値を再計算しておらず、最終的にサーバの WAL ストレージが溢れる可能性がありました。

  65. walreceiver で、エラー発生後にキャッシュからのカタログ検索を試みなくなりました。 (Masahiko Sawada, Bharath Rupireddy) (13)(12)(11)(10)
  66. これはエラー後において安全な方法ではありません。

  67. スタンバイサーバにシャットダウンシグナルが送信された場合、まだ起動処理中でWAL受信を待っているであっても、直ちにシャットダウンを実行するようになりました。 (Fujii Masao, Soumyadeep Chakraborty) (13)(12)(11)(10)(9.6)
  68. トランザクションコミットグループへの参加に失敗した際に、共有状態が正しくクリアされるようになりました。 (Amit Kapila) (13)(12)(11)
  69. タイミングによっては、後のセッションが同じ PGPROCオブジェクトを再利用する場合にアサート失敗が発生する可能性がありました。

  70. 他のプロセスからの同時書き込みに際しても不正な relmapper のデータを読み込みを回避できるように、ロックが追加されました。 (Heikki Linnakangas) (13)(12)(11)(10)(9.6)
  71. relmapper は OID とファイルノードの対応を保持するデータで、ファイル名は pg_filenode.map です。

  72. 並列B-treeインデックス構築の、ソート段階に関する進捗報告が改善されました。 (Matthias van de Meent) (13)(12)
  73. パラレルワーカによるソート処理の開始前にも状態報告するようになりました。

  74. レプリケーションプロトコル違反の検査が改善されました。 (Tom Lane) (13)(12)(11)(10)
  75. ロジカルレプリケーションワーカは多くの箇所でアサートを用いて、不適切なレプリケーションコマンドの検査を行っていましたが、通常のエラー処理に変更されました。

    不正な入力に対して、デバッグビルドでアサート失敗で停止することも、実運用ビルドで検査が行われないことも、望ましくありません。

  76. パーティションテーブルのロジカルレプリケーションで更新時に発生しうるクラッシュが幾つか修正されました。 (Amit Langote, Tom Lane) (13)
  77. ロジカルレプリケーションワーカでパーティションテーブルのAFTERトリガが発動する時に生じる可能性のあったクラッシュが修正されました。 (Tom Lane) (13)
  78. 複数ロジカルレプリケーションワーカが同じテーブルを TRUNCATEしようとする際に起こるデッドロックが修正されました。 (Peter Smith, Haiying Tang) (13)(12)(11)
  79. TRUNCATE実行時にサブスクライバ側で「ERROR: deadlock detected」が発生していました。

  80. 投機的挿入(speculative insertions)のロジカルデコーディングにおける幾つかの誤りが修正されました。 (Dilip Kumar) (13)(12)(11)(10)(9.6)
  81. 投機的挿入は INSERT .. ON CONFLICT .. で使われる処理です。メモリリークや予期せぬエラー、アサート失敗がもたらされる可能性がありました。

  82. ロジカルレプリケーションのデコーディングによるメモリリークが修正されました。 (Amit Langote) (13)
  83. エラー発生後、データ型キャッシュのハッシュテーブルに無効なレコード型のエントリが残る問題が回避されました。 (Sait Talha Nisanci) (13)(12)(11)
  84. これは後のクラッシュやメモリリークを引き起こす原因となっていました。

  85. CREATE TABLE ... AS EXECUTE構文でエラー発生する一部の場合における、プランキャッシュの参照カウントの取りこぼしが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  86. 結果としてメモリリークが生じる可能性がありました。

  87. パラレルワーカ間のタプル記述子を共有するコードで競合状態が修正されました。 (Thomas Munro) (13)(12)(11)
  88. 場合によってはクラッシュが発生する可能性がありました。

  89. checkpointerプロセスによる使われなくなったレプリケーションスロット無効化が、そのスロットを削除や更新しようとする処理と並行して行われたときの競合状態が修正されました。 (Andres Freund, Álvaro Herrera) (13)
  90. バックグランドワーカスロット(BackgroundWorkerSlots)を解放する際の潜在的な競合状態が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  91. Intelハードウェアでは明白にバグが修正されたという結果が観察できないかもしれませんが、メモリオーダリング制御が弱いマシン上では問題が起きる可能性がありました。

  92. ソートのコードにおける潜在的なクラッシュが修正されました。 (Ronan Dunklau) (13)(12)(11)(10)(9.6)
  93. あるコードパスで NULLポインタを解放しようとする可能性がありました。本ケースは、コアサーバのソート利用では到達できないように見えますが、拡張から引き起こされる可能性がありました。

  94. 破損データに対して B-tree ポスティングリストを分割するコードが堅牢化されました。 (Peter Geoghegan) (13)
  95. 既存のエントリと同一の TID を持つアイテムを挿入しようとすると、クラッシュするのではなく、エラーを投げるようになりました。 これは決して起こるべきではありませんが、インデックスがそのテーブルと矛盾している時に場合に起こることが報告されています。

  96. SP-GiST のインデックス挿入における無限ループが防止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  97. INCLUDE列がリーフインデックスタプルがページに収まらないほどのスペースを占めている場合、text_ops演算子クラスはタプルを収めるために無駄に無限ループに陥ってしまいました。11以前のバージョンには INCLUDE列がありませんが、演算子クラスのバグに対する良い防御策と思われるので、このループ防止の修正が後方適用されました。

  98. SP-GiST のインデックス挿入が、クエリキャンセル要求によって終了できることが保証されました。 (Tom Lane, Álvaro Herrera) (13)(12)(11)(10)(9.6)
  99. PL/pgSQL で INTO句に STRICT が指定されていないにもかかわらず、あたかも STRICT が指定されているかのように動作する可能性がある、初期化されていない変数のバグが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  100. libpq の出力関数(PQprint)において、メモリ不足障害が発生しても処理を中断しないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  101. これまでは abort(3) でプログラムを終了させていました。

  102. ecpg で numaric型の INT_MIN(通常は -2147483648)を integer に変換できるようになりました。 (John Naylor) (13)(12)(11)(10)(9.6)
  103. 以前の ecpg の範囲チェックでは INT_MIN ではなく -INT_MAX を範囲内としていたため、-2147483648 が範囲外として拒否されていました。

  104. psql やその他のクライアントプログラムで不正にエンコードされたデータを扱う際に、文字列の末尾をオーバーランしないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  105. 文字列の終わり近くに不適切にエンコードされたマルチバイト文字があると、様々な処理ループが文字列の最後の NUL を越えて実行される可能性があり、その結果、後続のメモリに何があるかによって、検出不能な問題からプログラムのクラッシュまで様々な問題が発生します。これは CVE-2006-2313 を想起させますが、これらの特定ケースが注意を喚起させるセキュリティ上の重要性を持つとは思われません。

  106. 有効/無効(あるいは REPLICA/ALWAYS)の状態が親テーブルのトリガと異なるパーティションテーブルのトリガを正しく処理するようにpg_dump が修正されました。 (Justin Pryzby, Álvaro Herrera) (13)(12)(11)
  107. このような場合にダンプで指定されていた状態が失われていました。

  108. 異なるタイムゾーンで作成されたダンプファイルで pg_restore を実行した場合に発生する「invalid creation date in header」という警告が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  109. 新しい glibc バージョンの mktime() の移植性の問題により、異なるタイムゾーンで作成されたダンプファイルに対して pg_restore を実行した時、下記のメッセージが出ていました。

    pg_restore: warning: invalid creation date in header
    pg_restore: while PROCESSING TOC:
    
  110. pg_upgrade が古いインストールの「oldestXID」の値を引き継ぐようになりました。 (Bertrand Drouvot) (13)(12)(11)(10)(9.6)
  111. 以前、新しいインストールの「oldestXID」は(通常)すぐに周回防止の自動バキュームが強制実行されるような古い値に設定されていました。これはパフォーマンスの観点からは望ましくありません。さらに悪いことに、大きな値の autovacuum_freeze_max_age を使用しているインストールでは、アップグレード直後に不必要な強制シャットダウンが発生する可能性がありました。

  112. アップグレードすべき拡張を検出して警告を出すように pg_upgrade が拡張されました。 (Bruce Momjian) (13)(12)(11)(10)(9.6)
  113. これからは、拡張を新PostgreSQLバージョンでデフォルトとされるバージョンにアップグレードするのに必要な ALTER EXTENSION UPDATE コマンドを含む、スクリプトファイルが作成されます。

  114. pg_receivewal を圧縮WAL格納と非圧縮WAL格納の間で切り替える際の問題が回避されました。 (Michael Paquier) (13)(12)(11)(10)
  115. contrib/postgres_fdw が生成列について有効に動作するよう修正されました。 (Etsuro Fujita) (13)(12)
  116. 外部テーブルの生成列が外部テーブルの生成列をあらわす場合については、適切に動作するようになりました。

    postgres_fdw は IMPORT でリモートテーブルの生成列を通常の列として取り込み、外部テーブルに INSERT を行う時に「ERROR: cannot insert a non-DEFAULT value into column "..."」というエラーが出ていました。import_generated オプション(デフォルトtrue)が追加され、true なら、IMPORT FOREIGN SCHEMA は生成列を取り込むようになりました。

  117. contrib/postgres_fdw で、エラーの後にカタログ検索を試みないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  118. 通常はこの方法で動作しますが、カタログアクセスが機能しないエラーが発生している可能性があるため、あまり安全ではありませんでした。この修正の副作用として、データ変換エラーに関するメッセージで、外部テーブルや外部列の実際の名前ではなく、クエリのテーブルやカラムのエイリアス(使用されている場合)が言及されるようになりました。

  119. トランザクション隔離のテストの基盤が改善されました。 (Tom Lane, Michael Paquier) (13)(12)(11)(10)(9.6)
  120. キャッシュ上書きの検査のオーバヘッドが軽減されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  121. PL/Python のリグレッションテストが Python 3.10 でも通るように修正されました。 (Honza Horak) (13)(12)(11)(10)(9.6)
  122. PostgreSQLコード内の実装における printf("%s", NULL) がクラッシュする代わりに (null) を出力するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  123. これにより、ごく稀な場合でのサーバの堅牢性が向上し、printf の実装が一般的なライブラリと同様となります。

  124. ポイントインタイムリカバリが ROLLBACK PREPARED レコードで停止した際に出力する誤ったログメッセージが修正されました。 (Simon Riggs) (13)(12)(11)(10)(9.6)
  125. 「recovery stopping before abort of transaction %u, time %s」と出力すべきメッセージが、これまでは、「recovery stopping before commit of transaction %u, time %s」と出力されていました。

  126. ALTER TABLEで誤ったリレーションタイプに対するエラーメッセージが改善されました。 (Kyotaro Horiguchi) (13)(12)(11)
  127. (メッセージ改善例)
    db=# CREATE VIEW v69 AS SELECT * FROM t1;
    db=# ALTER TABLE v69 ALTER c SET STATISTICS 0;
    ERROR:  "v69" is of the wrong type
    (修正後のメッセージ)
    ERROR:  "v69" is not a table, materialized view, index, partitioned index, or foreign table
    
  128. エラーメッセージ内の「負でない (non-negative)」等がゼロを含むか明確な表現に置き換えられました。 (Bharath Rupireddy) (13)(12)(11)(10)(9.6)
  129. db=# CREATE TABLE t70 (c int) PARTITION BY HASH (c);
    db=# CREATE TABLE p70 PARTITION OF t70 FOR VALUES WITH (MODULUS 4, REMAINDER 0);
    
    (修正前)
    db=# SELECT satisfies_hash_partition('t70'::regclass, 0, 0, NULL);
    ERROR:  modulus for hash partition must be a positive integer
    db=# SELECT satisfies_hash_partition('t70'::regclass, 1, -1, NULL);
    ERROR:  remainder for hash partition must be a non-negative integer
    
    (修正後)
    db=# SELECT satisfies_hash_partition('t70'::regclass, 0, 0, NULL);
    ERROR:  modulus for hash partition must be an integer value greater than zero
    db=# SELECT satisfies_hash_partition('t70'::regclass, 1, -1, NULL);
    ERROR:  remainder for hash partition must be an integer value greater than or equal to zero
    
  130. 個別の libldap_rライブラリがなくなった OpenLDAP 2.5 で動作するように configure が修正されました。 (Adrian Ho, Tom Lane) (13)(12)(11)(10)(9.6)
  131. libldap_rライブラリが存在しない場合は、libldapライブラリは暗黙的にスレッドセーフであると想定されます。

  132. make ターゲットに新たに world-bin および install-world-bin が追加されました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  133. これらは、ドキュメントをビルドまたはインストールしないことを除き、world および install-world と同じです。

  134. TAPテストの makeルール(prove_installcheck)がPGXS の使い方に沿って動作するように修正されました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  135. JITのコードが今後の LLVM API の変更に備えて調整されました。 (Thomas Munro, Andres Freund) (13)(12)(11)
  136. LLVM 13 では、以前の JIT コンパイラではクラッシュをもたらす、互換性のない API の変更が行われています。

  137. GSSAPIライブラリから返る文字列が null終端していることを前提としないように修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  138. GSSAPI の仕様では文字列ポインタと長さを返すことになっています。実際には文字列は通常 null終端されているため、従来コードでもエラーは発生していませんが、AddressSanitizer から問題が報告されました。

  139. MSVC で GSSAPI を使ったビルドが可能になりました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  140. 最新の Kerberosビルドとのさまざまな非互換性が修正されました。

  141. MSVC ビルドで --with-pgport が指定されている場合、pg_config が出力する configure オプションに含めるようになりました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  142. PostgreSQL 10 を ICU 69 以降でビルドできるようになりました。 (Peter Eisentraut) (10)
  143. contrib/pgcrypto で、シンボル名が OpenSSL と競合しないように修正されました。 (Tom Lane) (9.6)
  144. SHA224ハッシュを使った操作で valgrid がエラーを検知する可能性がありました。これは、アライメント用パディングバイトのメモリ破壊にすぎないため、実際には影響なさそうですが、念のため修正されました。