リリース日: 2021-11-11
このリリースは14.0に対し、様々な不具合を修正したものです。 14メジャーリリースにおける新機能については、E.6を参照してください。
14.Xからの移行ではダンプ/リストアは不要です。
しかしながら、以下の3番目の変更点で説明されているように、物理レプリケーションを使用するインストレーションではプライマリサーバの前にスタンバイサーバを更新する必要があることに注意してください。
また、次のいくつかの変更点で説明されているように、インデックスが破損する可能性があるいくつかのバグが見つかっています。 これらのケースに該当する場合は、アップデート後に影響を受けている可能性のあるインデックスの再作成をお勧めします。
PostgreSQLサーバがSSL暗号化またはGSS暗号化においてハンドシェイクが完了するまでは外来データを拒絶するようになりました。 (Tom Lane)
これまでTCP接続にデータを挿入できる中間者は、暗号化で保護されているはずのデータベースセッションの冒頭に平文データを投入可能でした。 サーバが認証データを要求してこない場合(例えばSSL証明書認証のみを使っている場合)に限られますが、これを悪用して偽のSQLコマンドをサーバに送ることができました。
PostgreSQLプロジェクトは本問題を報告してくれたJacob Championに感謝します。 (CVE-2021-23214)
libpqがSSL暗号化またはGSS暗号化のハンドシェイクが完了する前は、外来データを拒絶するようになりました。 (Tom Lane)
これまでTCP接続にデータを挿入できる中間者は、暗号化で保護されているはずのデータベースセッションの冒頭に平文データを投入可能でした。 libpqの問い合わせ応答以外の細かい振る舞いのために実現は容易ではありませんが、これを悪用してクライアントの最初の問い合わせに偽の応答を挿入することがおそらく可能でした。 別の攻撃は、セッションの初期に送られたクライアントのパスワードやその他の機微データを抜き出すことです。 これはCVE-2021-23214のサーバ側脆弱性と組み合わせて可能となります。 (CVE-2021-23222)
PostgreSQLプロジェクトは本問題を報告してくれたJacob Championに感謝します。 (CVE-2021-23222)
物理レプリケーションで、プライマリが部分的なWALレコードで終わっているWALセグメントを渡した後にクラッシュした場合について、修正されました。 (Álvaro Herrera)
ダウンするプライマリが不完全なWALレコードの残りを書き込み完了できなかった場合、以前のクラッシュリカバリロジックでは、それをバックアップして、不完全なWALレコードの最初からWALを上書きしました。 スタンバイサーバは既にそのWALセグメントのコピーを持っているかもしれないので、これは問題がありました。 不整合な次セグメントに遭遇して、手動の介入なしにはリカバリできないことになりました。 クラッシュ後の再起動時にWALセグメント境界を越えたバックアップをしないように修正されました。 その代わりに、次のWALセグメントの始めに新しいタイプのWALレコードを書いて、不完全なWALレコードは決して終了せず無視しなければならないことを知らせるようになりました。
この修正を適用する場合、新しいWALレコードタイプが生じるようになるため、プライマリより先にスタンバイサーバをアップデートするのが良いです。
並列VACUUM
がインデックスを取りこぼさないように修正されました。
(Peter Geoghegan, Masahiko Sawada)
テーブルがmin_parallel_index_scan_size
を上回る2つ以上のインデックスを持つ場合に、並列VACUUM
がmin_parallel_index_scan_size
を下回るインデックスを処理していませんでした。
この結果、これらのインデックスはVACUUM
で除去済みのヒープ上のエントリに対する参照を持つことになって、破損した状態となる可能性があります。
この問題は並列VACUUMを行わないautovacuumには影響しません。
適切なインデックスサイズの組み合わせを持つ手動VACUUMを行ったことがあるテーブルについて、REINDEXを行うことが推奨されます。
CREATE INDEX CONCURRENTLY
が直近の準備されたトランザクションを待つように修正されました。
(Andrey Borodin)
準備されたトランザクションから直近に挿入された行が、新たなインデックスから無視されるかもしれませんでした。その結果、インデックスに依存する問い合わせが、その行を取りこぼすおそれがありました。
この問題に対する以前の修正は、CREATE INDEX CONCURRENTLY
が検査したときに進行中のPREPARE TRANSACTION
コマンドを考慮できていませんでした。
max_prepared_transactions
>0の準備されたトランザクション(二相コミット)が有効なサーバでは、CONCURRENTLY指定で作成されたインデックスを全てREINDEXすることが推奨されます。
同時作成をしているインデックスで、新たな行に対するエントリ追加の失敗を引き起こす可能性のある競合状態が回避されました。 (Noah Misch, Andrey Borodin)
これにより破損したインデックスが生じる可能性があります。
実際には稀にしか発生しないとみられますが、この誤りは潜在的にCONCURRENTLY
指定を付けたあらゆるインデックス構築または再構築に影響する可能性があります。
同時作成したインデックスの全てをREINDEXすることが推奨されます。
対象インデックスに付加された演算子クラスのパラメータを維持するようにREINDEX CONCURRENTLY
が修正されました。
(Michael Paquier)
組込オブジェクト以外を含んだデータベースを複製するときの共有依存関係の誤作成が修正されました。 (Aleksander Alekseev)
このエラーの影響は、おそらく実際には限定的です。
原理的には、ロールがまだオブジェクトを所有している間、ロールを削除することができます。
しかし、ほとんどのインストレーションでは、template1
に追加したオブジェクトに使用されていたロールを削除することはないでしょう。
パーティションテーブルにアタッチあるいはデタッチしているテーブルについて、リレーションキャッシュが確実に無効化されるようになりました。 (Amit Langote, Álvaro Herrera)
本障害により、アタッチ/デタッチの後に既存のセッションからそのパーティションに対する直接の挿入/更新を行ったときに、アタッチ/デタッチ操作がリレーションキャッシュに反映されていないことによる、不適切な制約の適用等の誤動作を起こす可能性がありました。
範囲型の作成時にパースツリーが破損する障害が、修正されました。 (Alex Kozhemyakin, Sergey Shinderuk)
CREATE TYPE
がパースツリーの要素を誤って解放していて、続くイベントトリガやCREATE TYPE
コマンドがプランキャッシュに格納されて後に再使用される場合に、(クラッシュや予期せぬエラー等の)問題が起きる可能性がありました。
複合型のドメインの配列の要素の更新について修正されました。 (Tom Lane)
UPDATE tab SET fld[1].subfld = val
のようなコマンドが、配列要素が複合型ではなく複合型のドメインである場合に失敗して、クラッシュや誤った更新結果を引き起こしました。
FETCH FIRST WITH TIES
とFOR UPDATE SKIP LOCKED
の組み合わせが禁止されました。
(David Christensen)
FETCH FIRST WITH TIES
は同順位でない行を見つけるまで停止しないため、返すべき行数に加えてもう1行を取り出す必要があります。
また、現在の実装ではFOR UPDATE
が使われた場合は返さない行についてもロックを取得します。
その結果、SKIP LOCKED
オプションが指定された場合に望ましくない振る舞いが生じました。
別の一連の望ましくない動作を導入せずにこれを変更することは難しいため、当面の対処として、この組み合わせが禁止されました。
ALTER INDEX index ALTER COLUMN col SET (options)
でのオプション指定が禁止されました。
(Nathan Bossart, Michael Paquier)
パーサはこれを受け入れていましたが、文書記載がなく、実際には機能しませんでした。
numeric型のpower()
関数で稀な場合の精度損失が修正されました。
(Dean Rasheed)
第一引数が1に非常に近い場合に不正確な結果が生じる可能性がありました。
Memoizeプランでハッシュ等価演算子の誤選択が回避されました。 (David Rowley)
本障害により、クラッシュまたは誤った問い合わせ結果が生じるおそれがありました。
副問い合わせの式を関数にプルアップする際のプランナエラーが修正されました。 (Tom Lane)
FROM
にある関数がFROM
句のsub-SELECT
の出力をラテラル参照する場合で、sub-SELECT
を外側の問い合わせに平坦化が可能である場合、関数の式へコピーされた式は完全には処理されませんでした。
その結果、プランの実行時にクラッシュを引き起こすおそれがありました。
列の範囲の見積に不完全なMCVのみのプランナ統計情報を信用して使わないように修正されました。 (Tom Lane)
ANALYZE
で稀にMCV(most-common-values、最頻値)リストが作られてヒストグラムは作られないことがあります。
このような場合、MCVリストのみでデータ全体をあらわせそうな場合に限って、MCVリストのみで列値の範囲を見積をするようになりました。
サブトランザクション内でのポータルのスナップショット復旧について修正されました。 (Bertrand Drouvot)
プロシージャがあるトランザクションをコミットやロールバックして、その次の明示的な動作が新たなサブトランザクション内である場合にスナップショット管理を誤っていました。
その結果、不正なポインタが生じて、クラッシュを引き起こす可能性がありました。
PL/pgSQLにおける典型的な例は、クエリを実行するBEGIN ... EXCEPTION
ブロックの直後にあるCOMMIT
です。
スナップショットのエクスポート後にトランザクションが失敗した場合に、正しくクリーンアップするようになりました。 (Dilip Kumar)
この誤りは、同じセッションがスナップショットを再びエクスポートしようとした場合に限って問題を引き起こします。 ありそうな該当シナリオは、レプリケーションスロットを作成(その後ロールバック)、そして別のレプリケーションスロットを作成しようとすることです。
スタンバイサーバでオーバーフローしたサブトランザクション追跡の周回を防止しました。 (Kyotaro Horiguchi, Alexander Korotkov)
この誤りにより、スタンバイサーバで顕著な性能低下をもたらすおそれがあります。 該当した場合、SubtransSLRUについての過大な処理量がはっきり現れました。
スタンバイサーバの昇格中に、(二相コミット機能の)準備されたトランザクションが適切に考慮されるようになりました。 (Michael Paquier, Andres Freund)
同時実行中のセッションが取得したスナップショットで、準備されたトランザクションが省略される可能性がある限られた時間帯がありました。 その後、そのセッションがスナップショットを使用してデータを更新すると、誤った結果やデータの破損が発生する可能性がありました。
EXPLAIN
がWorkTableScanノードにアタッチされたフィルタ条件を表示しようとした時に発生する「could not find RecursiveUnion」エラーが修正されました。
(Tom Lane)
ALTER INDEX
コマンドを使ってテーブルの名前を変更する際に、正しいロックレベルを使用するように修正されました。
(Nathan Bossart, Álvaro Herrera)
歴史的な理由から、ALTER INDEX ... RENAME
はあらゆる種類のリレーションに適用できます。
インデックス名を変更するのに必要なロックレベルは、テーブル等その他のリレーション名を変更する場合より低いのですが、ALTER INDEX
を使った場合には対象がインデックス以外であっても、誤って低いロックレベルが使用されていました。
オブジェクトとそのオブジェクトを所有するロールが並行して同時に削除された場合にnull-pointer-dereferenceによるクラッシュが発生することがあり、回避されました。 (Álvaro Herrera)
lo_export()
または関連する関数が失敗した場合の「snapshot reference leak」警告が防止されました。
(Heikki Linnakangas)
CoerceToDomain式ノードの非効率なコード生成が修正されました。 (Ranier Vilela)
いくつかのリスト操作でO(N^2)の動作が回避されるようになりました。 (Nathan Bossart, Tom Lane)
これにより、プライマリ上で多数の排他ロックを保持しているトランザクションをスタンバイでリプレイする場合、チェックポイント後に削除(unlink)されることになっているファイルが多数ある場合、ハッシュ集約に多くのバッチ(ディスク書き出し)が含まれる場合、pg_trgm
が複雑な正規表現からインデックス可能な条件を抽出する場合を含むいくつかのシナリオで処理速度低下が修正されました。
これらのうち、実際にユーザから報告されたのは1番目の項目だけですが、それ以外も非効率なリスト削除により該当すると見られます。
B-treeのポスティングリスト分割に関するより防御的な検査が追加されました。 (Peter Geoghegan)
この変更により、テーブルのTIDの重複を含むインデックスの破損を検出できるようになります。
BRINのfloat8またはfloat4のminmax_multi_opsインデックスにNaNを挿入する時のアサート失敗が回避されました。 (Tomas Vondra)
実運用むけビルドにおいては、このような場合、いくらか非効率的ですが間違ってはいないインデックスになります。
自動VACUUMのランチャープロセスがpg_log_backend_memory_contexts()
の要求に対してより迅速に応答できるようになりました。
(Koyu Tanigawa)
HMACハッシュ計算におけるメモリリークが修正されました。 (Sergey Shinderuk)
shared_memory_type
がsysv
の場合、huge_pages
をon
に設定することが禁止されました。
(Thomas Munro)
以前はこの設定は受け入れられていましたが、実装がないため何もしませんでした。
PL/pgSQLのRETURN QUERY
文における、クエリ型のチェックが修正されました。
(Tom Lane)
RETURN QUERY
は、UPDATE RETURNING
のようにタプルを返すことができる任意のクエリを受け入れるべきです。
v14では誤ってSELECT
以外のものを禁止していました。
さらに、異形のRETURN QUERY EXECUTE
では、クエリ型チェックがまったく適用されていませんでした。
大域的でないデフォルト権限を正しくダンプするように、pg_dumpが修正されました。 (Neil Chen, Masahiko Sawada)
大域的な(限定なしの)ALTER DEFAULT PRIVILEGES
コマンドが関数のEXECUTE
などデフォルトである権限を取り消した後、限定付きのALTER DEFAULT PRIVILEGES
コマンドが選択されたロールやスキーマに対してその権限を再び付与した場合、pg_dumpは制限付きの権限付与を正しくダンプできませんでした。
ダンプされるパーティションテーブルに対して、pg_dumpが共有ロックを取得するようになりました。 (Tom Lane)
pg_dumpがリーフパーティションのいずれかをロックすれば、パーティションテーブル自体に対する重要なDDLを防ぐのに十分であるためこの見落としはたいていの場合は無害でした。 しかし関連するロックが保持されないため、子のないパーティションテーブルをダンプするときに問題が発生する可能性がありました。
PostgreSQL8.3より前のサーバからトリガ定義をダンプしようとした際のpg_dumpのクラッシュが修正されました。 (Tom Lane)
pg_restoreの無効なラージオブジェクトのTOCファイルに関するエラーメッセージ中の誤ったファイル名が修正されました。 (Daniel Gustafsson)
ソケットレベルの障害発生後、pgbenchがゼロ以外のステータスで終了するようになりました。 (Yugo Nagata, Fabien Coelho)
望ましい動作は実行を完了した後、ステータス2で終了することで、そのように修正されました。 また、ソケットレベル障害のエラー報告が修正されました。
pg_amcheckが一時的なリレーションや、無効または準備ができていないインデックスをチェックしないようにしました。 (Mark Dilger)
これにより、ほぼ確実に矛盾しているように見える、役に立たないリレーションのチェックが回避されます。
contrib/amcheck
がスタンバイサーバで実行される際に、UNLOGGEDテーブルをスキップするようになりました。
(Mark Dilger)
このようなテーブルは空になりますし、UNLOGGEDインデックスもすでにスキップするようになっているため、このようにするのが適切です。
contrib/pg_stat_statements
が最大1GB単位で「問い合わせテキスト」ファイルを読み込むようになりました。
(Tom Lane)
そのような大きな問い合わせテキストファイルは非常にまれですが、もし発生した場合、以前のコードでは(一度に2GB以上の読み込みを拒否しますので)64ビット版Windowsでは失敗していたでしょう。
contrib/postgres_fdw
がデータ変換エラーを報告しようとする際に発生しうるNULLポインタのクラッシュが修正されました。
(Tom Lane)
GetSharedSecurityLabel()
が、クリティカルなリレーションキャッシュエントリがまだ構築されていない新たに開始したセッションでも使用できるようになりました。
(Jeff Davis)
TAPテストを実行する際、モジュール自体のディレクトリをPATH
に含めるようになりました。
(Andrew Dunstan)
これにより、カスタムテストドライバなどのインストールされていないプログラムを検出できるようになりました。
Windowsのタイムゾーン名をIANAタイムゾーンに割り当てるのにCLDRプロジェクトのデータを利用するようになりました。 (Tom Lane)
Windowsで実行する場合、initdbは新たなクラスタのtimezone
パラメータに、システムのタイムゾーンに対応したIANAタイムゾーンを設定しようとします。
これまでWindowsで利用していたマッピングテーブルは何年も前に生成され、更新も散発的にしか行われないため、数多くのエラーが含まれていたり、最近追加されたゾーンが存在していなかったりと問題がありました。
CLDRが最も適切なマッピングを追跡していることが判明したため、これらのデータを使用するようになりました。
既存インストレーションには影響はなく、新しく初期化されたデータベースクラスタにのみ影響します。
タイムゾーンデータファイルがtzdatarelease 2021eに更新されました。 フィジー、ヨルダン、パレスチナ、サモアで夏時間法が変更され、バルバドス、クック諸島、ガイアナ、ニウエ、ポルトガル、トンガの歴史的修正が行われています。
また、Pacific/EnderburyはPacific/Kantonに名称変更されました。 また、Africa/Accra、America/Atikokan、America/Blanc-Sablon、America/Creston、America/Curacao、America/Nassau、America/Port_of_Spain、Antarctica/DumontDUrville、Antarctica/Syowaの各ゾーンは、1970年以降時計が一致している近くのより人口の多いゾーンに統合されました。 これらの名前はエイリアスとして残されています。