PostgreSQL 12.10 に関する技術情報

このリリースは 12.9 からの修正リリース(2022年2月10日リリース)です。
12.X からのアップデートではダンプ、リストアは不要です。
しかしながら、本リリースで修正されたいくつかの障害により既にインデックスに破損が生じている可能性があるため、該当するインデックスを再構築することが推奨されます。
また、12.9 よりも前のバージョンから移行する場合には 12.9 のリリース情報も確認してください。

PostgreSQL 12.9 から 12.10 への変更点

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

  1. REINDEX CONCURRENTLY の問題を防止するため、TOAST テーブルの更新に標準のロックプロトコルが適用されました。 (Michael Paquier) (14)(13)(12)
  2. REINDEX CONCURRENTLY を TOASTテーブルまたは TOASTテーブルのインデックスに 適用した場合、破損したインデックスを生成することがよくありました。これは TOASTエントリを更新するセッションが、他の更新の動作と同様にトランザクションがコミットされるまで ROW EXCLUSIVE ロックを保持するのではなく、ROW EXCLUSIVE ロックをすぐに解放したために発生しました。今回 TOAST 更新が通常のルールに従ってテーブルロックを保持するよう修正されました。既存の破損したインデックスは、再度 REINDEX を実行することで修復できます。

  3. ページプルーニング中に RECENTLY_DEAD タプルが状態を完全に DEAD に変更した時の HOTチェーンの破損が修正されました。 (Andres Freund) (14)
  4. VACUUM では、それを指すリダイレクトアイテムが残っている状態で RECENTLY_DEAD のタプルを削除することがありえました。そのようなタプルのアイテムスロットが後に新しいタプルで再利用されると、既存の HOTチェーンの一部とみなされ、インデックス破損が形成されます。

    発生した場合はテーブルのインデックス再作成で修復できます。しかし、これは非常に確率の低いシナリオであるため、発生したかもしれないという可能性だけでインデックスを再作成することは推奨されません。

  5. ローカルパーミッションと外部パーティションが混在するテーブルのEvalPlanQual再チェックでのクラッシュが修正されました。 (Etsuro Fujita) (14)
  6. EvalPlanQual再チェックは READ COMMITTED 隔離レベルの問い合わせで使われる処理です。

  7. COPY TO でのメモリ処理の誤りが修正されました。 (Bharath Rupireddy) (14)
  8. この見落としにより、COPY でエラーが発生した後、誤ったエラーメッセージやクラッシュが発生することがありました。

  9. 同時に DROP STATISTICS で統計オブジェクトが削除された時に発生する ALTER STATISTICS での NULLポインタ参照によるクラッシュが回避されました。 (Tomas Vondra) (14)(13)
  10. マルチ範囲型データから範囲を抽出する際に、アライメントのパディングが正しく処理されるようになりました。 (Alexander Korotkov) (14)
  11. この誤りは可変長データ型のマルチ範囲を処理する際にクラッシュを引き起こす可能性がありました。

  12. 無名 RECORD データ型に対するハッシュの過度な楽観的使用が修正されました。 (Tom Lane) (14)
  13. これにより、「ERROR: could not identify a hash function for type record」(型レコードのハッシュ関数を識別できない)のエラーが防止されます。

  14. パラレルで単一の子ノードを持つ Appendノードに対する誤ったプラン作成が修正されました。 (David Rowley) (14)(13)(12)
  15. 場合によっては、Append が単純化されるべきではない時に単純化され、誤った問い合わせ結果(重複した行)が発生することがありました。

    単一の子ノードを持つ Appendノードは、例えば「SELECT id, c FROM t1 UNION ALL SELECT id, c FROM t2 WHERE false」といった形を持つ問い合わせのプランで出現する可能性がありました。

  16. インデックスに返却不能の列が含まれる場合について、インデックスオンリースキャンプランが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  17. インデックスの列にはインデックスオンリースキャンで返すことができるか(返却可能列か返却不能列か)を示す、returnable属性があります。

    インデックスが返却可能列と返却不能列の両方を持ち、返却不能列の 1つが返却可能列にあらわれるテーブル列を使用した式である場合、その式を使用した問い合わせは、返却可能列から式を再計算するのではなく、返却不能列を読もうとするインデックスオンリースキャンプランとなる可能性がありました。返却不能列は NULL として読み込まれるため、誤った問い合わせ結果が発生しました。

    (障害動作例/ここでの lower(c) は返却不能列)
    db=# CREATE TABLE t9 (c text);
    db=# INSERT INTO t9 VALUES (md5('A')), (md5('B'));
    db=# CREATE INDEX ON t9 USING gist(lower(c) gist_trgm_ops) INCLUDE (c);
    db=# SET enable_seqscan TO off;
    db=# \pset null *NULL*
    db=# SELECT lower(c), c FROM t9;
     lower  |                c
    --------+----------------------------------
     *NULL* | 7fc56270e7a70fa81a5935b72eacbe29
     *NULL* | 9d5ed678fe57bcca610140957afab571
    (2 rows)
    
  18. Memoize の上位からきたパラメータを使用するサブプランを処理できるように、Memoizeプランノードが修正されました。 (David Rowley) (14)
  19. この障害により誤った問い合わせ結果が生じるケースが報告されました。

  20. Memoizeプランノードがハッシュ不可能な結合の演算子で正しく動作するように修正されました。 (David Rowley) (14)
  21. 結合条件に不等号を使っている場合や浮動小数点データ型で 0.0 と -0.0 がある場合などで問題が生じました。この障害により、クラッシュや誤った問い合わせ結果が生じる可能性があります。

  22. 指定されていない型修飾へのキャストにより、長さの強制関数の呼び出しではなく、RelabelTypeノードが生成されるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  23. 強制関数は正しい動作(何もしないこと)を実行しますが、この変換は非効率で望ましくありません。

    character(N) 型を bpchar 型にキャストする場合が該当します。

  24. anycompatible で始まる名前の疑似データ型(以下「anicompatible*」と記載)について一致判定が修正されました。 (Tom Lane) (14)(13)
  25. anicompatible* 型の多相パラメータを持つ関数や演算子が、実際には本当は一致しないはずの引数の集合に一致したと、パーサが誤判断することがありました。

    報告されたケースでは、一つの呼び出しに複数の演算子を一致させることになり、「ERROR: operator is not unique: ...」「HINT: Could not choose a best candidate operator. You might need to add explicit type casts.」などのあいまいな演算子だというエラーを引き起こしました。一方、より後の処理段階でエラーを起こすこともあり得ました。

  26. ちょうど WALページの境界でデータベースが整合性を持つ状態に到達した場合の、WALリプレイ失敗が修正されました。 (Álvaro Herrera) (14)(13)(12)(11)(10)
  27. 修正されませんが、これは 9.6.x でも該当します。

  28. 物理ストリーミングレプリケーションのスタンバイサーバの startup処理がトランザクションID 周回を許容するように修正されました。 (Abhijit Menon-Sen, Tomas Vondra) (14)(13)(12)(11)(10)
  29. プライマリ上のアクティブなトランザクションのセットが周回境界を越えている間にスタンバイサーバが起動すると(古いトランザクションよりも小さい XID を持つ新しいトランザクションがいくつか存在するため)、「ERROR: out-of-order XID insertion in KnownAssignedXids」エラーが生じました。再試行されますがこのエラーを乗り越えることはできません。

  30. ロジカルレプリケーションで子テーブルのデータの二重送信が回避されるようになりました。 (Hou Zhijie) (14)(13)
  31. パブリケーションに子テーブルと親テーブルの両方が含まれ、publish_via_partition_root オプションが設定されている場合、サブスクライバは子テーブルと親テーブルの両方で無駄な同期を開始していました。このような場合は親テーブルのみが同期されるようになりました。

  32. ロジカルレプリケーション接続で発行される SQLコマンドの字句制限が撤廃されました。 (Tom Lane) (14)(13)(12)(11)(10)
  33. これまでは、引用符で囲まれていないセミコロンを含む SQLコマンド、奇数の一重引用符または二重引用符を含むドル引用符で囲まれたリテラル、または SQLコマンドがコメントで始まる場合、walsenderプロセスがエラーを起こしました。

    さらに、不完全なエラーからの回復処理により以降のコマンドでも予期せぬエラーが発生する可能性がありました。

  34. ROLLBACK PREPARED 操作のレプリケーションに際して、レプリケーション元のタイムスタンプが確実に設定されるようになりました。 (Masahiko Sawada) (14)
  35. トランザクションの最後のサブトランザクションのコミットタイムスタンプが記録されない可能性があり、修正されました。 (Alex Kingsborough, Kyotaro Horiguchi) (14)(13)(12)(11)(10)
  36. チェックポイントに際して、pg_logical/mappingsサブディレクトリを必ず fsync するようになりました。 (Nathan Bossart) (14)(13)(12)(11)(10)
  37. 一部のファイルシステムでは、この見落としによりシステムクラッシュ後に論理書き換えの状態ファイルが失われる可能性がありました。

  38. パーティションテーブルの拡張統計情報が作成されるようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  39. 以前のバグ修正により、古い形式の継承ツリーに対する拡張統計の構築が無効になりましたが、パーティションテーブルに対する構築も無効になっており、不要な制限となっていました。今回の変更により、ANALYZE はパーティションテーブルの統計オブジェクトの値を計算できるようになりました。(しかし、autovacuum はパーティションテーブルを自動処理しないので、パーティションテーブルの統計情報を維持したい場合は、パーティションテーブルに対して定期的に手動 ANALYZE を実行する必要があることに注意してください。)

  40. 継承ツリーの拡張統計情報を無視するようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  41. 現在、拡張統計情報の値は継承ツリー全体ではなく各テーブルに対してローカルでのみ計算されます。しかし、この値が継承ツリーをまたがる問い合わせを計画する際に誤って参照されたため、デフォルトよりも悪い推定値になる可能性がありました。

  42. パーティションテーブルの行型が他の場所で複合型として使用されている場合、パーティションテーブルの列のデータ型を変更することが禁止されました。 (Tom Lane) (14)(13)(12)(11)(10)
  43. この制限は通常のテーブルでは長い間存在していましたが、見落としによりパーティションテーブルではチェックされていませんでした。

  44. レプリカアイデンティティ(REPLICA IDENTITY) のインデックスの一部である列に対する ALTER TABLE ... DROP NOT NULL が禁止されました。 (Haiying Tang, Hou Zhijie) (14)(13)(12)(11)(10)
  45. 同じ禁止事項はすでに主キーインデックスに存在していました。

  46. ALTER TABLE .. ADD PRIMARY KEY USING INDEX の実行に際して、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Hou Zhijie) (14)(13)(12)(11)
  47. 同時実行中のセッションが、テーブルに主キーがあるかどうかに関する判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。

    パブリケーションしているテーブルの UPDATE で、テーブルに ALTER TABLE で主キーを設定した後であっても、以下エラーが発生する動作が報告されました。

    ERROR:  cannot update table ... because it does not have a replica identity and publishes updates
    
  48. REPLICA IDENTITY インデックスから切り替えを行う際、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Tang Haiying, Hou Zhijie) (14)(13)(12)(11)(10)
  49. 同時実行中のセッションが、どのインデックスが REPLICA IDENTITY であるかの判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。

  50. SP-GiSTインデックス作成で、インデックス対象列のデータ型が演算子クラスの宣言された入力型とバイナリ互換性がある場合でもエラーとなっていたのが修正されました。 (Tom Lane) (14)
  51. このような場合は動作すべきでしたが以下のエラーが発生していました。

    ERROR:  compress method must be defined when leaf type is different from input type
    
  52. 最も古い xmin値を計算する際、並列のバキュームとインデックス同時構築を無視できるようにようになりました。 (Masahiko Sawada) (14)(13)
  53. 並列化されていない処理では既に無視されていましたが、並列化されたロジックでは機能していませんでした。その結果、xmin の限界値の前進が抑えられることで、バキュームのクリーンアップが遅れるなどの望ましくない影響がありました。

  54. 式インデックスを更新するときのメモリリークが修正されました。 (Peter Geoghegan) (14)
  55. 式インデックスを持つテーブルの多くの行を更新する UPDATE 文は、大量のメモリを消費する可能性がありました。

  56. 多数のオブジェクトの所有権を変更する REASSIGN OWNED BY コマンド実行中にメモリリークが発生しないように修正されました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  57. 不要なキャッシュアクセスを回避することにより、ロジカル変更を送信する walsender のパフォーマンスが向上しました。 (Hou Zhijie) (14)(13)
  58. pg_hba_file_rules ビューでの cert認証方式のオプションの表示が修正されました。 (Magnus Hagander) (14)(13)(12)
  59. 認証方式が cert の場合、clientcert=verify-full が暗黙的に指定されますが、pg_hba_file_rules ビューは誤って clientcert=verify-ca と報告していました。

  60. pg_log_backend_memory_contexts() で対象とされるセッションが、結果をサーバのログのみに送信するよう修正されました。 (Fujii Masao) (14)
  61. 以前は、client_min_messages のレベルを高く設定すると、接続しているクライアントにもログメッセージが送信される可能性がありました。これはクライアントが要求していない動作です(そしておそらくワイヤープロトコル違反でした)。

  62. INSERT .. VALUES のルールにおける行全体の変数の表示方法が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  63. 行全体の変数は、var.* として出力されますが、ルールが再ロードされたときに個々の列に展開されるため、異なるセマンティクスとなっていました。これを防ぐために他の場所と同様に明示的なキャストが行われるようになりました。

  64. SQL標準の関数本体を逆コンパイルによって再構築したときに、INSERT ... SELECT 内の関数パラメータが適切に表示されるようになりました。 (Tom Lane) (14)
  65. これまでは、パラメータに名前が付いていても $n と出力されていました。

  66. 空文字列に対して Unicode 文字列正規化を適用する場合の 1バイトのバッファオーバーランが修正されました。 (Michael Paquier) (14)(13)
  67. これによる実際の影響は、アライメントを考慮すれば限定的なものですが、デバッグビルドでは警告が発生していました。

  68. いくつかの誤ったアサートが修正または削除されました。 (Simon Riggs, Michael Paquier, Alexander Lakhin) (14)(13)(12)(11)(10)
  69. これらの誤りは、製品ビルドではなく、デバッグビルドのみ影響を受けました。

  70. libpq と ecpglib でマルチスレッド使用時における gettext() 初期化の競合状態が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  71. エラーメッセージのローカライズに失敗する可能性がありました。

  72. libpq の PQcancel関数から strerror を呼び出さないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  73. PQcancel はシグナルハンドラから安全に呼び出すことができるはずですが、strerror は安全ではありません。誤った使用法は、サーバへのキャンセルメッセージ送信に失敗した場合にのみ発生しますので、そのためおそらくこれまで報告がありませんでした。

  74. psql の \password コマンドで設定するパスワードは、接続元のユーザのものではなく、CURRENT_USER のものがデフォルトとなりました。 (Tom Lane) (14)(13)(12)(11)(10)
  75. これはドキュメントの動作と一致し、セッション開始後の SET ROLE または SET SESSION AUTHORIZATION を実行した場合に発生し得るパーミッションエラーを避けます。また、混乱を防ぐために操作対象のロール名がパスワードプロンプトに含まれるようになりました。

  76. 親テーブルのトリガを識別するように psql の \d コマンドのクエリが修正されました。 (Justin Pryzby) (14)(13)
  77. パーティションにトリガがあり、親テーブルにも同じ名前の無関係な文レベルトリガが存在した場合、以前のコードでは「ERROR: more than one row returned by a subquery used as an expression」というエラーが発生していました。

  78. psql の \d コマンドで、テーブルの拡張統計オブジェクトが OID でなく名前でソートされるようになりました。 (Justin Pryzby) (14)
  79. psql の列挙型のラベルをタブを使って補完する機能が修正されました。 (Tom Lane) (14)(13)
  80. Windows の標準入力からの読み込みをデータソースまたは宛先に使用したときの障害が修正されました。 (Dmitry Koval, Juan Jose Santamaria Flecha, Michael Paquier) (14)
  81. これは、psql の \copy コマンド、または pg_recvlogical で「-f -」を付けた場合に影響がありました。「could not stat file」エラーが発生しました。

  82. psql や 他のクライアントプログラムでは、Ctrl+C シグナルハンドラからのgettext() 呼び出しを避けるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  83. この誤りに起因する障害報告は確認されていませんが、gettext() は非同期シグナル安全な関数ではなく、安全とは言えません。

  84. pg_receivewal と pg_recvlogical の初期パスワード入力がキャンセルできるようになりました。 (Tom Lane, Nathan Bossart) (14)(13)(12)(11)(10)
  85. 以前は、パスワード入力を求められている間、Ctrl+C でこれらのプログラムを終了することができませんでした。

  86. pg_dump がユーザ定義キャストをダンプするときの順序が、TYPE の直後、FUNCTION の手前に修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  87. まれに、出力スクリプトがユーザ定義キャストを作成する前に参照してしまう場合がありました。

  88. pg_dump の --inserts と --column-inserts モードが修正され、以前削除された列と生成列の両方を含むテーブルを扱えるようになりました。 (Tom Lane) (14)(13)(12)
  89. pg_dump と pg_basebackup での誤ったエラー報告の可能性が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  90. 以前のコードでは、一部のカーネル呼び出しからのエラーをチェックできず、他のケースでは誤った errno 値を報告する可能性がありました。

  91. char(N) 列に対する contrib/btree_gist のインデックスによるインデックスオンリースキャン結果が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  92. インデックスオンリースキャンでは末尾の空白が削除された列値が返されましたが、これはインデックス格納方法に起因したもので、想定の動作ではありませんでした。末尾空白の違いだけですが誤った問い合わせ結果です。

    空白埋めをした char(N) 値を格納するようにコードが修正されました。インデックスの動作は REINDEX をしない限りすぐには反映されません。 REINDEX(インデックス再作成)をしない場合、空白が削除された値は、更新を行っていくなかで徐々に置き換えられていきます。インデックスオンリースキャン実行計画を使用しない問い合わせは、どの場合でも影響を受けません。

  93. postgres_fdw の非同期クエリの処理における稀なケースが修正されました。 (Etsuro Fujita) (14)
  94. これらのエラーは、外部テーブルのスキャンを並列化しようとすると、クラッシュまたは誤った問い合わせ結果を引き起こす可能性がありました。

  95. PL/Pythonの ビルド方法を決定するために、非推奨の distutils モジュールではなく、Python の sysconfig モジュールを使用するように configure が変更されました。 (Peter Eisentraut, Tom Lane, Andres Freund) (14)(13)(12)(11)(10)
  96. これにより Python 3.10 では distutils が非推奨になり Python 3.12 での削除が予定されている configure-time の警告が回避されます。 おそらく、Python 3.12 以降では configure --with-python は完全に失敗します。

    sysconfig が Python 2.7 より前、また、Python 3.2 より前にも存在しなかったため、古くなった Python バージョンでの PL/Python のビルドはもはやできなくなります。

  97. OpenSSL なしでクロスコンパイルが再度可能となりました。 (Tom Lane) (14)
  98. configure ではターゲットシステムで /dev/urandom が使用可能であるはずと想定すべきでしたが、代わりに configure が失敗していました。

  99. Windows 環境で Perl 5.28 以降を使用する PL/Perl コンパイルの失敗が修正されました。 (Victor Wagner) (14)(13)(12)(11)(10)
  100. Python 3.11 以降での PL/Python コンパイルの失敗が修正されました。 (Peter Eisentraut) (14)(13)(12)(11)(10)
  101. Visual Studio 2022 を使用したビルドがサポートされました。 (Hans Buschmann) (14)(13)(12)(11)(10)
  102. MSVC ビルドシステムで .bat ラッパースクリプトを事前にディレクトリに移動することなく呼び出せるようになりました。 (Anton Voloshin, Andrew Dunstan) (14)(13)(12)(11)(10)