リリース日: 2023-02-09
このリリースは15.1に対し、様々な不具合を修正したものです。 15メジャーリリースにおける新機能については、E.5を参照してください。
libpqはGSSAPIトランスポート暗号化の開始に失敗した後にメモリ内容をリークする可能性があり、修正しました。 (Jacob Champion)
改変されたサーバ、または認証されていない中間者は、GSSAPI(Kerberos)トランスポート暗号化のセットアップ中に、ゼロ終端されていないエラーメッセージを送信できます。 libpqは、その文字列をコピーするとともに、アプリケーションメモリ内の次のゼロバイトまでのバイトをエラーレポートにコピーします。 呼び出し側のアプリケーションがエラーレポートに対して行う処理によっては、アプリケーションメモリの内容が開示される可能性があります。 また、メモリ終端を超えた読み取りが行われるために、クラッシュが発生する可能性もわずかにありました。 サーバメッセージを適切にゼロで終端されるように修正しました。 (CVE-2022-41862)
パーティションテーブルまたは継承ツリーのUPDATE中に、子テーブルで更新する必要があるGENERATED列の計算を修正しました。
(Amit Langote, Tom Lane)
これにより、親テーブルに存在しない、または親列の生成式とは依存関係が異なるGENERATED列を更新できない障害が修正されました。
MERGEでGENERATED列の計算が失敗する可能性があったのを修正しました。
(Dean Rasheed)
MERGEの最初の行単位アクションがUPDATEであった場合、その後のINSERTアクションは、UPDATEアクションのために計算する必要がないと見なされたGENERATED列の計算に失敗しました(これはUPDATEターゲット列のいずれにも依存していないためです)。
MERGEで到達不可能なWHEN句のチェックを修正しました。
(Dean Rasheed)
無条件WHEN句に続くWHEN句は到達不能として拒否されるべきですが、このケースは常に検出されたわけではありませんでした。
MERGEのルール検出テストを修正しました。
(Dean Rasheed)
MERGEは、ルールを持つテーブルには対応していません。
しかし、以前はルールを持っていて現在は持っていないテーブルで失敗していました。
MERGEではDO NOTHINGアクションを処理されたタプルとして数えないようにしました。
(Álvaro Herrera)
これにより、コードの動作がドキュメントと一致するようになります。
WITH RECURSIVE ... CYCLEという共通テーブル式(CTE)が出力列にアクセスできるようにしました。
(Tom Lane)
CTE内からSET列への参照は、「cache lookup failed for type 0」で失敗していました。
外部テーブルへのバルクインサートをおこなう際の保留中のインサート処理を修正しました。 (Etsuro Fujita)
場合によっては、保留中のインサートがすぐに外部データラッパー(FDW)にフラッシュされず、例えばBEFORE ROWのトリガで表示できるはずの行が表示されないなど、論理的な不整合が発生することがありました。
まだ有効ではないインデックスにREPLICA IDENTITYを設定できるようにしました。
(Tom Lane)
pg_dumpがREPLICA IDENTITYとマークされたパーティションインデックスをダンプする時、パーティションインデックスが有効とマークされる前にREPLICA IDENTITYを適用するインデックスシーケンスを生成し、リストアを失敗させていました。
その順序で行うことを禁止する正当な理由はなさそうなので、許可するようにしました。
マーキングはインデックスが有効になるまで何の効果も持ちません。
複数行のVALUESリストからINSERTを実行するルール内のDEFAULTマーカーの処理を修正しました。
(Dean Rasheed)
場合によっては、DEFAULTマーカーが適切なデフォルト値の式に置き換えられず、「unrecognized node type」エラーになることがありました。
jsonpathの存在チェックで未定義変数の使用を拒否するようにしました。
(Alexander Korotkov, David G. Johnston)
jsonpathの一致演算子は、パスパターンに未定義変数があるとエラーになりますが、存在演算子はエラーや警告を出さずに一致するものとして扱っていました。
TOAST格納された添字の値に対応できるようにjsonbの添字を修正しました。
(Tom Lane, David G. Johnston)
テーブルから直接フェッチされたテキスト値をjsonb添字として使用すると、失敗する可能性がありました。
通常、フェッチでは一致する要素が見つかりません。
代入では、値をでたらめなキーとともに保存してしまう可能性がありましたが、この問題を引き起こすのに十分な長さのキーが実際に使われることはおそらく稀です。
並列ハッシュ結合における稀な場合のデータ破壊を修正しました。 (Dmitry Astapov)
一時的ファイルに書き出される大きなタプルの最後のチャンクがちょうど32760バイトである場合、境界バグによって破損する可能性がありました。 通常、後の問い合わせで破損したデータの症状で失敗します。
checkpoint_completion_targetのデフォルト以外の設定を尊重するようにしました。
(Bharath Rupireddy)
checkpoint_completion_targetでの変更後に内部状態が更新されず、特にその設定がオンザフライで変更された場合に、チェックポイントI/Oの実行が必要以上に高速または低速になった可能性がありました。
recovery_target_xidモードでログに正しい終了タイムスタンプを記録するようにしました。
(Tom Lane)
recovery_target_xid設定に基づいて、recovery_target_inclusive=offでリカバリを終了すると、「recovery stopping before ... transaction」のログメッセージに誤ったタイムスタンプ(常に2000-01-01)が出力されました。
一部のバッファファイル読み取り失敗のエラーレポートを改善しました。 (Peter Eisentraut)
無関係なエラーコードを報告するのではなく、読み取りの不足を正しくレポートし、必要なバイト数と実際に読み取られたバイト数を示します。 ほとんどの場所ではすでにこれが正しく行われていますが、最近作成されたレプリケーションロジックの中にはそうでないものもありました。
int2vectorとoidvectorの要素数の恣意的な上限を削除しました。
(Tom Lane)
以前は、これらの型の入力関数は100以上の要素を拒否していました。
論理レプリケーションの列をリスト指定できる仕様の導入に伴って、int2vectorが最大で1600列分の要素を受け入れる必要があります。
そうしないと、長い列リストによって論理レプリケーションの障害が発生します。
拡張問い合わせプロトコルでは、パイプラインを実行していた場合、ANALYZEの後は即時コミットを避けるようにしました。
(Tom Lane)
明示的なBEGIN TRANSACTIONがない場合、ANALYZEは自分自身でコミットを実行しますが、これはパイプライン化された一連のコマンドでは発生させるべきではありません。
間違った長さのキャンセルリクエストパケットを拒否するようにしました。 (Andrey Borodin)
サーバは、その長さワードが小さすぎる場合でも、キャンセル要求を処理します。 これにより、割り当てられたバッファの終わりを超えた読み取りが発生しました。 理論的には、セグメンテーション違反が発生する可能性がありますが、バッファはメモリ末尾にとても近い必要があるため、実際に発生する可能性は非常に低いようです。 最も可能性の高い結果は、間違ったバックエンドPIDまたはキャンセルコードに関する偽のログメッセージでした。 代わりに、長さが間違っている苦情を言うようになりました。
ウィンドウ関数の実行条件式に対するプランナの前処理の見落としを修正しました。 (Richard Guo, David Rowley)
これにより、「WindowFunc not found in subplan target lists」などのプランナのエラーが発生する可能性がありました。
ウィンドウ関数の実行条件式を実行中に発生する可能性があった無効な領域へのポインタアクセスが修正されました。 (David Rowley)
実際には、実行条件の最適化は、すべてint8を返す特定のウィンドウ関数にのみ適用されるため、これは32ビットビルドでのみ問題として現れます。
副問い合わせのプルアップにおいて、再帰呼び出しおよびループに対する防御機構を追加しました。 (Tom Lane)
不自然な問い合わせを使用すると、深い再帰が発生し、副問い合わせを平坦化するために不合理な時間がかかる可能性があります。 これに対する適切な修正は、バックパッチに対して過度に侵襲的に思えますが、少なくともスタック深さのチェックと割り込みチェックを追加して、問い合わせをキャンセルできるようにすることはできます。
Memoizeノードをパーティションワイズ結合またはパラメータ化されたネストループと組み合わせる場合のプランナ問題を修正しました。 (Richard Guo)
これらのエラーは、Memoizeが有用なコンテキストでMemoizeが使用されなかったり、場合によっては間違った問い合わせ計画につながる可能性がありました。
パーティションワイズ結合のコードを、各パーティションに対するプラン生成の失敗に寛容になるように修正しました。 (Tom Lane)
これにより、「could not devise a query plan for the given query」エラーが発生する可能性がありました。
get_actual_variable_rangeによって行われるクリーンアップ作業の量を制限します。
(Simon Riggs)
インデックスの末尾にある多数のタプルを削除した直後にプランナを実行すると、これらのインデックスエントリの「killed」ビットを設定するためにかなりの量の作業を費やすことになります。 100ヒープのページを調べた後にこのプロセスを放棄することで、1つの問い合わせで実行される作業量を制限します。 最終的にはすべてのクリーンアップがおこなわれますが、大きなパフォーマンスの問題は発生しません。
リレーションのrelkindが変わった時、統計計算が混乱する問題を防止しました。 (Andres Freund)
テーブルをビューに変換すると、クラッシュやアサーション失敗が発生する可能性がありました。
括弧で囲まれたAT TIME ZONE構文の表示を修正しました。
(Tom Lane)
これにより、AT TIME ZONEの引数自体が式であるルールまたはビューに対する、ダンプ/リストア障害が発生する可能性がありました。
SQL関数のユーティリティコマンドに対するキャッシュされたパースツリーが破損しないようにしました。 (Tom Lane, Daniel Gustafsson)
SQL言語の関数が1回の呼び出し問い合わせ内で同じユーティリティコマンドを複数回実行すると、クラッシュしたり、「unrecognized node type」などの奇妙なエラーが発生する可能性があります。
全文検索の問い合わせ実行は、語句一致の処理中に確実にキャンセルできるようになりました。 (Tom Lane)
非決定性な照合順序を持つ文字列のハッシュ作成におけるメモリリークを修正しました。 (Jeff Davis)
DROP DATABASEと論理レプリケーションワーカープロセスとの間のデッドロックを修正しました。
(Hou Zhijie)
これは、ワーカーが論理レプリケーションスロットを作成しているときに割り込みをブロックするという誤った選択が原因です。 バージョン15では、デッドロックが検出されない可能性があります。 バージョン14では、デッドロックは観測されていませんが、ネットワークI/Oを待機している間に割り込みをブロックすることは、やはり望ましくありません。
レプリケーション接続の試行に失敗した後、libpqの接続オブジェクトをクリーンアップするようにしました。 (Andres Freund)
以前のコーディングでは接続オブジェクトをリークしていました。
バックグラウンドのコードパスでは、呼び出し側のプロセスはあきらめて終了するので無害です。
しかし、CREATE SUBSCRIPTIONのようなコマンドでは、そのような失敗はセッション内での小さなメモリリークをもたらしました。
ホットスタンバイサーバで、プライマリ上でアクティブと知られているXIDを調べる処理負荷を削減します。 (Simon Riggs, Michail Nikolaev)
KnownAssignedXids配列のクリーンアップが不十分な場合、特にスタンバイ側でmax_connectionsが大きな値に設定されている場合は、パフォーマンスが低下する可能性がありました。
カタログの最も古いxminを決定するときに、無効になった論理レプリケーションスロットを無視するようにしました。 (Sirisha Chamarthi)
レプリケーションスロットは、max_slot_wal_keep_sizeを超えたために無効になった後でも、システムカタログ内の無効なタプルのクリーンアップを妨げる可能性がありました。
したがって、レプリケーションの消費者に障害が発生すると、カタログが際限なく肥大化する可能性がありました。
論理デコードでトランザクションのクラッシュが検出された時に、リモートノードに通知するようにしました。 (Hou Zhijie)
サーバ再起動の後、再起動の直前に発生したトランザクションの変更を再ストリームします。 これらのトランザクションの中には、おそらく完了しなかったものもあります。 完了しなかったことに気付いたとき、関連するデコード状態をローカルで破棄しましたが、そのことをサブスクライバに伝えることを怠っていました。 そのため、サブスクライバは、次に再起動されるまで、無駄なストリーミングファイルを保持していました。
論理デコードにおける初期化されていないメモリの使用を修正しました。 (Masahiko Sawada)
場合によっては、論理デコードを再開すると、すでに解放されていたXIDデータの再利用を試みて、予測不可能な動作を引き起こす可能性がありました。
論理デコードのコンテキスト作成に際して共有状態を更新している間、スピンロックを取得するようにしました。 (Masahiko Sawada)
2相トランザクションに関するデータを更新する際に、適切なロックを取得することを怠っていたため、潜在的に他のプロセスが一貫性のないデータを見ることが可能でした。
pgoutputレプリケーションプラグインが、テーブルレプリケーションの列一覧にリストされていない列を送信しないように修正しました。 (Hou Zhijie)
UPDATEおよびDELETEイベントは、設定された列一覧に注意を払わなかったため、予想よりも多くのデータを送信しました。
レシーバが組み込みの論理レプリケーションコードである場合、これは問題になりませんでしたが、他のレシーバを混乱させる可能性があり、どのケースでもネットワーク帯域幅が無駄になりました。
ハッシュインデックスのページ分割操作のWALリプレイ中に稀に発生する「failed to acquire cleanup lock」パニックを回避しました。 (Robert Haas)
WALリプレイ中にその全可視ビットを設定する際に、ヒープページのLSNを進めるようにしました。 (Jeff Davis)
これをおこなわなかった場合、スタンバイサーバとプライマリサーバでページが異なる可能性があり、LSNが変更されるタイミングに関して他のいくつかの想定に反しました。 これはPostgreSQL自体に関する限り、理論的な危険にしか見えませんが、サードパーティのツールを混乱させる可能性がありました。
int64_div_fast_to_numeric()がより広い範囲の入力に対して動作するよう修正しました。
(Dean Rasheed)
この関数は、その第2引数における一部の値で誤動作しました。 PostgreSQLコアにはそのような用途は存在しませんが、それは明らかに外部のモジュールにとって危険であるため、修正されました。
WaitEventSetロジックにおける潜在的なバッファオーバーラン問題を修正しました。
(Thomas Munro)
epollベースおよびkqueueベースの実装では、内部バッファのサイズが呼び出し元の出力バッファのサイズと異なる場合、カーネルに非常に多くのイベントを要求する可能性がありました。
このケースは、リリースされたPostgreSQLバージョンでは発生しないことがわかっていますが、このエラーは外部モジュールおよび将来のバグ修正にとって危険です。
32ビットビルドで共有メモリをアクセスするときに、名目上未定義の挙動を回避するようにしました。 (Andres Freund)
clangの未定義動作サニタライザは、アライメントが取れていないポインタの使用に不満を言っていました。 これがデバッグ以外のビルドで問題を引き起こす可能性は非常に低いですが、テスト目的で修正する価値があります。
BRINのminmax-multi演算子クラスのアサーション失敗を修正しました。 (Tomas Vondra)
アサーションは過度に厳格であったため、非アサートビルドでは無害でした。
不要なRESULT RTE最適化ロジックでの不完全なアサートが削除されました。 (Tom Lane)
ACLチェックに対するキャッシュルックアップ失敗メッセージのコピーペーストエラーを修正しました。 (Justin Pryzby)
原則として、これらのエラーに到達することはありません。 しかし、もしそうであれば、間違ったタイプのオブジェクトを報告していました。
pg_basebackupで非常に大きなテーブル空間マップファイルが破損する可能性を修正しました。 (Antonin Houska)
pg_dumpで--if-existsモードを使用した時の無害な警告が出ないようにしました。
(Tom Lane)
publicスキーマにデフォルト以外の所有者がある場合、pg_dumpの--if-existsオプションを使用すると、ワーニングメッセージ「warning: could not find where to insert IF EXISTS in statement "-- *not* dropping schema, since initdb creates it"」が表示されました。
しかし、ダンプの出力は問題ありませんでした。
psqlの\sfおよび\efコマンドを、SQL標準の関数本体を持つSQL言語関数を処理できるように修正しました。
(Tom Lane)
これらのコマンドは、新しいスタイルの構文を使用したときに、関数本体の開始を誤って識別しました。
ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMAのタブ補完を修正しました。
(Dean Rasheed)
contrib/pageinspectが更新され、そのディスクアクセス機能はPARALLEL RESTRICTEDとしてマークしました。
(Tom Lane)
これにより、これらの関数のいずれかを使用して一時テーブルを検査する場合に発生する可能性のある失敗が回避されます。 これは、セッションの一時テーブルにパラレルワーカーからアクセスできないためです。
contrib/segで、入力した数が127桁以上の場合、クラッシュまたはごみデータを出力しないように修正しました。
(Tom Lane)
Microsoft Visual Studio 2013のビルドを修正しました。 (Tom Lane)
以前のパッチでは、対象となるすべてのプラットフォームにsnprintf()があると想定されていましたが、MSVC 2013はまだ完全に対応されていません。
そのプラットフォームでsprintf()を使用するように戻します。
Strawberry Perlを使用して、MSVCでPL/Perlを構築する際のコンパイルエラーを修正しました。 (Andrew Dunstan)
MSVCで構築されたPL/Perlとgccで構築されたPerlライブラリの不一致を修正しました。 (Andrew Dunstan)
このような組み合わせは、以前は「loadable library and perl binaries are mismatched」エラーで失敗する可能性がありました。
Perlのヘッダファイルからのコンパイラ警告を抑止しました。 (Andres Freund)
推奨しているコンパイラオプションは、Perlのヘッダファイルの最近のバージョンで使用されている構造に関する警告を引き起こします。 gccを使用する場合は、プラグマを使用してこれらの警告を抑制できます。
pg_waldumpが未使用の静的インライン関数を破棄しないコンパイラでビルドされるように修正しました。 (Tom Lane)
タイムゾーンデータファイルがtzdataリリース2022gに更新されました。グリーンランドとメキシコの夏時間法の変更に加え、カナダ北部、コロンビア、シンガポールの歴史的修正が適用されました。
注目すべき点として、新しいタイムゾーンAmerica/Ciudad_Juarezは、America/Ojinagaから分割されました。