リリース日: 2022-02-10
このリリースは14.0に対し、様々な不具合を修正したものです。 14メジャーリリースにおける新機能については、E.6を参照してください。
14.Xからの移行ではダンプ/リストアは不要です。
しかしながら、最初の2つの変更点で説明されているように、インデックスが破損する可能性のあるいくつかのバグが見つかっています。 これらのケースに該当する場合は、アップデート後に影響を受けている可能性のあるインデックスを再作成することをお勧めします。
また、14.1より前のバージョンからアップグレードする場合には、E.5を参照してください。
REINDEX CONCURRENTLY
の問題を防止するため、TOASTテーブルの更新に標準のロックプロトコルが適用されました。
(Michael Paquier)
REINDEX CONCURRENTLY
を TOASTテーブルまたはTOASTテーブルのインデックスに適用した場合、破損したインデックスを生成することがよくありました。
これはTOASTエントリを更新するセッションが、他の更新の動作と同様にトランザクションがコミットされるまでROW EXCLUSIVE
ロックを保持するのではなく、ROW EXCLUSIVE
ロックをすぐに解放したために発生しました。
今回TOAST更新が通常のルールに従ってテーブルロックを保持するよう修正されました。
既存の破損したインデックスは、再度REINDEXを実行することで修復できます。
ページプルーニング中にRECENTLY_DEADタプルが状態を完全にDEADに変更した時のHOTチェーンの破損が修正されました。 (Andres Freund)
VACUUM
では、それを指すリダイレクトアイテムが残っている状態でRECENTLY_DEADのタプルを削除することがありえました。
そのようなタプルのアイテムスロットが後に新しいタプルで再利用されると、既存のHOTチェーンの一部とみなされ、インデックス破損が形成されます。
発生した場合はテーブルのインデックス再作成で修復できます。
しかし、これは非常に確率の低いシナリオであるため、発生したかもしれないという可能性だけでインデックスを再作成することは推奨されません。
ローカルパーミッションと外部パーティションが混在するテーブルのEvalPlanQual再チェックでのクラッシュが修正されました。 (Etsuro Fujita)
COPY TO
でのメモリ処理の誤りが修正されました。
(Bharath Rupireddy)
この見落としにより、COPY
でエラーが発生した後、誤ったエラーメッセージやクラッシュが発生することがありました。
同時に統計オブジェクトが削除された時に発生するALTER STATISTICS
でのNULLポインタ参照によるクラッシュが回避されました。
(Tomas Vondra)
多重範囲型データから範囲を抽出する際に、アライメントのパディングが正しく処理されるようになりました。 (Alexander Korotkov)
この誤りは可変長データ型の多重範囲を処理する際にクラッシュを引き起こす可能性がありました。
無名RECORD
データ型に対するハッシュの過度な楽観的使用が修正されました。
(Tom Lane)
これにより、「could not identify a hash function for type record」(型レコードのハッシュ関数を識別できない)のエラーが防止されます。
パラレルで単一の子ノードを持つAppendノードに対する誤ったプラン作成が修正されました。 (David Rowley)
場合によっては、Appendが単純化されるべきではない時に単純化され、誤った問い合わせ結果(重複した行)が発生することがありました。
インデックスに返却不能の列が含まれる場合について、インデックスオンリースキャンプランが修正されました。 (Tom Lane)
インデックスの列にはインデックスオンリースキャンで返すことができるか(返却可能列か返却不能列か)を示す、returnable属性があります。 インデックスが返却可能列と返却不能列の両方を持ち、返却不能列の1つが返却可能列にあらわれるテーブル列を使用した式である場合、その式を使用した問い合わせは、返却可能列から式を再計算するのではなく、返却不能列を読もうとするインデックスオンリースキャンプランとなる可能性がありました。 返却不能列はNULLとして読み込まれるため、誤った問い合わせ結果が発生しました。
Memoizeの上位からきたパラメータを使用するサブプランを処理できるように、Memoizeプランノードが修正されました。 (David Rowley)
Memoizeプランノードがハッシュ不可能な結合の演算子で正しく動作するように修正されました。 (David Rowley)
指定されていない型修飾へのキャストにより、長さの強制関数の呼び出しではなく、RelabelTypeノードが生成されるようになりました。 (Tom Lane)
強制関数は正しい動作(何もしないこと)を実行しますが、この変換は非効率で望ましくありません。
anycompatible
で始まる名前の疑似データ型について一致判定が修正されました。
(Tom Lane)
anycompatible
で始まる名前の疑似データ型の多相パラメータを持つ関数や演算子が、実際には本当は一致しないはずの引数の集合に一致したとパーサが誤判断することがありました。
報告されたケースでは、一つの呼び出しに複数の演算子を一致させることになり、あいまいな演算子だというエラーを引き起こしました。
一方、より後の処理段階でエラーを起こすこともあり得ました。
ちょうどWALページの境界でデータベースが整合性を持つ状態に到達した場合の、WALリプレイ失敗が修正されました。 (Álvaro Herrera)
物理ストリーミングレプリケーションのスタンバイサーバのstartup処理がトランザクションID周回を許容するように修正されました。 (Abhijit Menon-Sen, Tomas Vondra)
プライマリ上のアクティブなトランザクションのセットが周回境界を越えている間にレプリカサーバが起動すると(古いトランザクションよりも小さいXIDを持つ新しいトランザクションがいくつか存在するため)、「out-of-order XID insertion in KnownAssignedXids」エラーが生じました。 レプリカは再試行されますがこのエラーを乗り越えることはできません。
ロジカルレプリケーションで子テーブルのデータの二重送信が回避されるようになりました。 (Hou Zhijie)
パブリケーションに子テーブルと親テーブルの両方が含まれ、publish_via_partition_root
オプションが設定されている場合、サブスクライバは子テーブルと親テーブルの両方で無駄な同期を開始していました。
このような場合は親テーブルのみが同期されるようになりました。
ロジカルレプリケーション接続で発行されるSQLコマンドの字句制限が撤廃されました。 (Tom Lane)
これまでは、引用符で囲まれていないセミコロンを含むSQLコマンド、奇数の一重引用符または二重引用符を含むドル引用符で囲まれたリテラル、またはSQLコマンドがコメントで始まる場合、walsenderプロセスがエラーを起こしました。 さらに、不完全なエラーからの回復処理により以降のコマンドでも予期せぬエラーが発生する可能性がありました。
ROLLBACK PREPARED
操作のレプリケーションに際して、レプリケーション元のタイムスタンプが確実に設定されるようになりました。
(Masahiko Sawada)
トランザクションの最後のサブトランザクションのコミットタイムスタンプが記録されない可能性があり、修正されました。 (Alex Kingsborough, Kyotaro Horiguchi)
チェックポイントに際して、pg_logical/mappings
サブディレクトリを必ずfsync
するようになりました。
(Nathan Bossart)
一部のファイルシステムでは、この見落としによりシステムクラッシュ後に論理書き換えの状態ファイルが失われる可能性がありました。
パーティションテーブルの拡張統計情報が作成されるようになりました。 (Justin Pryzby)
以前のバグ修正により、古い形式の継承ツリーに対する拡張統計の構築が無効になりましたが、パーティションテーブルに対する構築も無効になっており、不要な制限となっていました。
今回の変更により、ANALYZE
はパーティションテーブルの統計オブジェクトの値を計算できるようになりました。
(しかし、autovacuumはパーティションテーブルを自動処理しないので、パーティションテーブルの統計情報を維持したい場合は、パーティションテーブルに対して定期的に手動ANALYZE
を実行する必要があることに注意してください。)
継承ツリーの拡張統計情報を無視するようになりました。 (Justin Pryzby)
現在、拡張統計情報の値は継承ツリー全体ではなく各テーブルに対してローカルでのみ計算されます。 しかし、この値が継承ツリーをまたがる問い合わせを計画する際に誤って参照されたため、デフォルトよりも悪い推定値になる可能性がありました。
パーティションテーブルの行型が他の場所で複合型として使用されている場合、パーティションテーブルの列のデータ型を変更することが禁止されました。 (Tom Lane)
この制限は通常のテーブルでは長い間存在していましたが、見落としによりパーティションテーブルではチェックされていませんでした。
レプリカアイデンティティ(REPLICA IDENTITY) のインデックスの一部である列に対するALTER TABLE ... DROP NOT NULL
が禁止されました。
(Haiying Tang, Hou Zhijie)
同じ禁止事項はすでに主キーインデックスに存在していました。
ALTER TABLE ADD PRIMARY KEY USING INDEX
の実行に際して、キャッシュされたテーブルの状態が正しく更新されるようになりました。
(Hou Zhijie)
同時実行中のセッションが、テーブルに主キーがあるかどうかに関する判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。
REPLICA IDENTITY
インデックスから切り替えを行う際、キャッシュされたテーブルの状態が正しく更新されるようになりました。
(Tang Haiying, Hou Zhijie)
同時実行中のセッションが、どのインデックスがREPLICA IDENTITY
であるかの判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。
SP-GiSTインデックス作成で、インデックス対象列のデータ型が演算子クラスの宣言された入力型とバイナリ互換性がある場合でもエラーとなっていたのが修正されました。 (Tom Lane)
このような場合は動作すべきでしたが「compress method must be defined when leaf type is different from input type」エラーが発生していました。
最も古いxmin値を計算する際、並列のバキュームとインデックス同時構築を無視できるようにようになりました。 (Masahiko Sawada)
並列化されていない処理では既に無視されていましたが、並列化されたロジックでは機能していませんでした。 その結果、xminの限界値の前進が抑えられることで、バキュームのクリーンアップが遅れるなどの望ましくない影響がありました。
式インデックスを更新するときのメモリリークが修正されました。 (Peter Geoghegan)
式インデックスを持つテーブルの多くの行を更新するUPDATE
文は、大量のメモリを消費する可能性がありました。
多数のオブジェクトの所有権を変更するREASSIGN OWNED BY
コマンド実行中にメモリリークが発生しないように修正されました。
(Justin Pryzby)
不要なキャッシュアクセスを回避することにより、ロジカル変更を送信するwalsenderのパフォーマンスが向上しました。 (Hou Zhijie)
pg_hba_file_rules
ビューでのcert
認証方式のオプションの表示が修正されました。
(Magnus Hagander)
認証方式がcert
の場合、clientcert=verify-full
が暗黙的に指定されますが、pg_hba_file_rules
ビューは誤ってclientcert=verify-ca
と報告していました。
pg_log_backend_memory_contexts()
で対象とされるセッションが、結果をサーバのログのみに送信するよう修正されました。
(Fujii Masao)
以前は、client_min_messages
のレベルを高く設定すると、接続しているクライアントにもログメッセージが送信される可能性がありました。
これはクライアントが要求していない動作です(そしておそらくワイヤープロトコル違反でした)。
INSERT ... VALUES
のルールにおける行全体の変数の表示方法が修正されました。
(Tom Lane)
行全体の変数は、「var.*」として出力されますが、ルールが再ロードされたときに個々の列に展開されるため、異なるセマンティクスとなっていました。 これを防ぐために他の場所と同様に明示的なキャストが行われるようになりました。
SQL標準の関数本体を逆コンパイルによって再構築したときに、INSERT ... SELECT
内の関数パラメータが適切に表示されるようになりました。
(Tom Lane)
これまでは、パラメータに名前が付いていても$
と出力されていました。
N
空文字列に対してUnicode文字列正規化を適用する場合の1バイトのバッファオーバーランが修正されました。 (Michael Paquier)
これによる実際の影響は、アライメントを考慮すれば限定的なものですが、デバッグビルドでは警告が発生していました。
いくつかの誤ったアサートが修正または削除されました。 (Simon Riggs, Michael Paquier, Alexander Lakhin)
これらの誤りは、製品ビルドではなく、デバッグビルドのみ影響を受けました。
libpqとecpglibでマルチスレッド使用時におけるgettext()
初期化の競合状態が修正されました。
エラーメッセージのローカライズに失敗する可能性がありました。
(Tom Lane)
libpqのPQcancel
関数からstrerror
を呼び出さないようになりました。
(Tom Lane)
PQcancel
はシグナルハンドラから安全に呼び出すことができるはずですが、strerror
は安全ではありません。
誤った使用法は、サーバへのキャンセルメッセージ送信に失敗した場合にのみ発生しますので、そのためおそらくこれまで報告がありませんでした。
psqlの\password
コマンドで設定するパスワードは、接続元のユーザのものではなく、CURRENT_USER
のものがデフォルトとなりました。
(Tom Lane)
これはドキュメントの動作と一致し、セッション開始後のSET ROLE
またはSET SESSION AUTHORIZATION
を実行した場合に発生し得るパーミッションエラーを避けます。
また、混乱を防ぐために操作対象のロール名がパスワードプロンプトに含まれるようになりました。
親テーブルのトリガを識別するようにpsqlの\d
コマンドのクエリが修正されました。
(Justin Pryzby)
パーティションにトリガがあり、親テーブルにも同じ名前の無関係な文レベルトリガが存在した場合、以前のコードでは「more than one row returned by a subquery used as an expression」というエラーが発生していました。
psqlの\d
コマンドで、テーブルの拡張統計オブジェクトがOIDでなく名前でソートされるようになりました。
(Justin Pryzby)
psqlの列挙型のラベルをタブを使って補完する機能が修正されました。 (Tom Lane)
Windowsの標準入力からの読み込みをデータソースまたは宛先に使用したときの障害が修正されました。 (Dmitry Koval, Juan José Santamaría Flecha, Michael Paquier)
これは、psqlの\copy
コマンド、またはpg_recvlogicalで-f -
を付けた場合に影響がありました。
psqlや他のクライアントプログラムでは、Ctrl+Cシグナルハンドラからのgettext()
呼び出しを避けるようになりました。
(Tom Lane)
この誤りに起因する障害報告は確認されていませんが、非同期シグナル安全な関数ではないため安全とは言えません。
pg_receivewalとpg_recvlogicalの初期パスワード入力がキャンセルできるようになりました。 (Tom Lane, Nathan Bossart)
以前は、パスワード入力を求められている間、Ctrl+Cでこれらのプログラムを終了することができませんでした。
pg_dumpがユーザ定義キャストをダンプするときの順序が修正されました。 (Tom Lane)
まれに、出力スクリプトがユーザ定義キャストを作成する前に参照してしまう場合がありました。
pg_dumpの--inserts
と--column-inserts
モードが修正され、以前削除された列と生成列の両方を含むテーブルを扱えるようになりました。
(Tom Lane)
pg_dumpとpg_basebackupでの誤ったエラー報告の可能性が修正されました。 (Tom Lane)
以前のコードでは、一部のカーネル呼び出しからのエラーをチェックできず、他のケースでは誤ったerrno値を報告する可能性がありました。
char(
列に対するN
)contrib/btree_gist
のインデックスによるインデックスオンリースキャン結果が修正されました。
(Tom Lane)
インデックスオンリースキャンでは末尾の空白が削除された列値が返されましたが、これは想定の動作ではありませんでした。
これはデータがインデックスに格納される方法に起因したものです。
予想される空白埋めをしたchar(
値を格納するようにコードが修正されました。
インデックスの動作はN
)REINDEX
(インデックス再作成)をしない限りすぐには反映されません。
REINDEX
をしない場合、空白が削除された値は、更新を行っていくなかで徐々に置き換えられていきます。
インデックスオンリースキャン実行計画を使用しない問い合わせは、どの場合でも影響を受けません。
postgres_fdw
の非同期クエリの処理における稀なケースが修正されました。
(Etsuro Fujita)
これらのエラーは、外部テーブルのスキャンを並列化しようとすると、クラッシュまたは誤った問い合わせ結果を引き起こす可能性がありました。
PL/Pythonのビルド方法を決定するために、非推奨のdistutilsモジュールではなく、Pythonのsysconfigモジュールを使用するようにconfigureが変更されました。 (Peter Eisentraut, Tom Lane, Andres Freund)
これにより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のビルドはもはやできなくなります。
OpenSSLなしでクロスコンパイルが再度可能となりました。 (Tom Lane)
configureではターゲットシステムで/dev/urandom
が使用可能であるはずと想定すべきでしたが、代わりにconfigureが失敗していました。
Windows環境でPerl 5.28以降を使用するPL/Perlコンパイルの失敗が修正されました。 (Victor Wagner)
Python 3.11以降でのPL/Pythonコンパイルの失敗が修正されました。 (Peter Eisentraut)
Visual Studio 2022を使用したビルドがサポートされました。 (Hans Buschmann)
MSVCビルドシステムで.bat
ラッパースクリプトを事前にディレクトリに移動することなく呼び出せるようになりました。
(Anton Voloshin, Andrew Dunstan)