リリース日: 2024-02-08
このリリースは16.1に対し、様々な不具合を修正したものです。 16メジャーリリースにおける新機能については、E.5を参照してください。
16.Xからの移行ではダンプ/リストアは不要です。
しかしながら、同時更新中にGINインデックスの破損を引き起こす可能性があるバグが1件修正されました。 このような破損が疑われる場合は、この更新をインストールした後で、影響を受けるインデックスを再作成してください。
また、16.1より前のバージョンからアップグレードする場合は、E.4を参照してください。
REFRESH MATERIALIZED VIEW CONCURRENTLY
内のセキュリティ制限を強化しました。
(Heikki Linnakangas)
同時リフレッシュコマンドの1つのステップが弱いセキュリティ制限の下で実行されていました。
マテリアライズドビューの所有者がスーパーユーザまたは他の高い権限を持つユーザに、そのビューに対して同時リフレッシュを実行するよう説得できる場合、そのビューの所有者がREFRESH
を実行しているユーザの権限で実行されるコードを制御できました。
ユーザが決定したすべてのコードが、期待どおりにビューの所有者として実行されるよう修正しました。
このエラーに対する唯一の既知のセキュリティ上の弱点はPostgreSQL16.0以降では動作しないため、v16は実際には脆弱ではない可能性があります。
PostgreSQLプロジェクトは、本問題を報告してくれたPedro Gallegosに感謝します。 (CVE-2024-0985)
JITインライン化を実行する時のメモリリークを修正しました。 (Andres Freund, Daniel Gustafsson)
多数のJITコンパイルの後に、バックエンドプロセスがメモリ不足の状態に陥るという複数の報告がありました。 この修正により、この問題が解決されます。
不正なパーティション結合のプランが生成されないようにしました。 (Richard Guo)
LATERAL参照を含む一部の特殊な状況では、誤ったプランが作成される可能性がありました。 影響を受ける問い合わせは、間違った答えを出したり、「variable not found in subplan target list」などの奇妙なエラーを出したり、エグゼキュータのクラッシュしたりする可能性がありました。
PlaceHolderVars内の副問い合わせ出力式の不正なラッピングを修正しました。 (Tom Lane)
これにより、副問い合わせが外部結合の下にあり、出力列が外部結合の範囲外にあるものをLATERAL参照している場合の不正な結果が修正されます。 出力列は、外部結合の動作により、NULLとして表示されるはずなのにNULLとして表示されないことがありました。
ウィンドウ関数の実行条件の誤った処理を修正しました。 (Richard Guo)
この見落としにより、「WindowFunc not found in subplan target lists」エラーが発生する可能性がありました。
Memoizeプランの内側の一意性検出を修正しました。 (Richard Guo)
この間違いにより「cache entry already complete」というエラーが発生する可能性がありました。
定数畳み込みフィールド選択時のnullingrelsの計算を修正しました。 (Richard Guo)
これを行わないと、「wrong varnullingrels (b) (expected (b 3)) for Var 2/2」のようなエラーが発生しました。
MERGE
によるパーティション間の更新が発生する場合に、不適切なアクションをおこなわないようにしました。
(Dean Rasheed)
パーティションテーブルでMERGE UPDATE
アクションを実行するとき、パーティションキー列の変更によりUPDATE
がDELETE
とINSERT
に変わった場合、AFTER UPDATE ROW
トリガの起動や、RLSチェックなどの他のUPDATE後アクションの起動をスキップします。
これらのアクションは通常失敗するため、通常のUPDATE
ではこのような場合にこれらを行いません。
MERGE
もそうすべきではありません。
パーティションにまたがるMERGE
の更新でBEFORE ROW DELETE
トリガを処理するようにしました。
(Dean Rasheed)
このようなトリガがNULLを返すことで更新を阻止しようとした場合、MERGE
はエラーかアサーションエラーを引き起こしてました。
BEFORE ROW UPDATE
トリガで、固定されていないバッファへのアクセスを防止しました。
(Alexander Lakhin, Tom Lane)
更新中のタプルが別のセッションによって更新されてから別のページに移動された場合、バッファ上の固定されていない新しいタプルバージョンからデータをフェッチしようとする狭い期間がありました。 これにより、原理的には提案された新しいタプルの更新されていない列にガベージデータが表示される可能性がありました。 しかし、実際に問題が発生する可能性はかなり低いと見られます。
パラレルハッシュ結合で、サイズが大きすぎる共有メモリ領域を要求しないようにしました。 (Thomas Munro, Andrei Lepikhov, Alexander Korotkov)
制限値が大きすぎるため、予想されるハッシュテーブルのサイズが十分に大きい場合に「invalid DSA memory alloc request size」エラーが発生する可能性がありました。
一時テーブルを拡張しようとしてエラーが発生する場合のローカルバッファ状態の破損を修正しました。 (Tender Wang)
複数の引数を持つDISTINCT
が指定された集約を評価する際の間違ったタプルスロットの使用を修正しました。
(David Rowley)
この間違いは、「attribute 1 of type record has wrong type」といったエラーにつながる可能性がありました。
外部キー強制トリガによって更新されるタプルが追加の可視性クロスチェックに失敗した場合、heap_update()
とheap_delete()
でのアサーションエラーを回避します。
(Alexander Lakhin)
このエラーは、非アサートビルドには影響しませんでした。
BRINブルーム演算子クラスのfalse_positive_rate
パラメータに関する過度に厳密なアサーションを修正しました。
(Alexander Lakhin)
このエラーは、非アサートビルドにも影響しませんでした。
複雑な継承ツリーでのALTER TABLE ADD COLUMN
の際に起こりうるエラーを修正しました。
(Tender Wang)
もし、孫テーブルが複数の中間の親テーブルを介して新しい列を継承する場合、コマンドは「tuple already updated by self」というエラーで失敗していました。
ALTER TEXT SEARCH CONFIGURATION ... MAPPING
コマンドでトークン名が重複する問題を修正しました。
(Tender Wang, Michael Paquier)
DROP ROLE
で重複したロール名を指定した場合について修正しました。
(Michael Paquier)
以前は、これにより「tuple already updated by self」エラーが発生していました。 代わりに、重複を無視するようにしました。
DROP STATISTICS
の実行中に、関連するテーブルを適切にロックするようにしました。
(Tomas Vondra)
ロックの取得に失敗すると、ANALYZE
と同時にDROP
が実行された場合に「tuple concurrently deleted」エラーが発生する可能性がありました。
GENERATED
式とDEFAULT
式での関数の揮発性検査を修正しました。
(Tom Lane)
これらの場所では、デフォルト引数式への揮発性関数の挿入を検出できなかったり、多様関数が実際には対象のデータ型では不変であるにもかかわらず揮発性であると判断したりする可能性がありました。
これにより、GENERATED
句を不適切に拒否または受け入れたり、ALTER TABLE ADD COLUMN
の定数デフォルト値の最適化が誤って適用されたりする可能性がありました。
フィールドをTOASTから展開する時に新しいカタログキャッシュエントリが古くなったことを検出します。 (Tom Lane)
カタログキャッシュに挿入する前に、カタログタプル内の任意の行外フィールドを展開します。 これは、カタログキャッシュエントリが無効になる可能性があるデータベースアクセスを伴いますが、新しいエントリはまだキャッシュにないので、無効化すべき必要があることに気づかないでしょう。 その結果、既に古いキャッシュエントリが作成され、永続化されるかもしれない競合状態が発生します。 これは、予測が困難な誤動作を引き起こすことになります。 TOAST展開後にタプルの可視性を再確認することで修正します。
一部のプラットフォームでのエッジケースの整数オーバーフロー検出不具合を修正しました。 (Dean Rasheed)
0 - INT64_MIN
の計算はオーバーフローエラーとなるべきで、ほとんどのプラットフォームではそのようになっていました。
しかし、組み込みの整数オーバーフローも128ビット整数もないプラットフォームでは、オーバーフローを検出できず、代わりにINT64_MIN
を返していました。
timestamp
型にinterval
型を加算または減算するときに、ユリウス日付のオーバーフローを検出します。
(Tom Lane)
範囲外エラーが発生するはずのいくつかのケースで、代わりに誤った結果が生成されていました。
interval_mul()
とinterval_div()
でオーバーフローの検査をさらに追加しました。
(Dean Rasheed)
範囲外エラーが発生するはずのいくつかのケースで、誤った結果が生成されていました。
scram_SaltedPassword()
関数を割り込み可能にしました。
(Bowen Shi)
大きなscram_iterations
の値では、この関数の実行に長い時間がかかる可能性がありました。
問い合わせのキャンセル要求によって中断できるようにしました。
stats_fetch_consistency
の変更後にキャッシュされた統計情報を破棄するようにしました。
(Shinya Kato)
一部のコードパスで、古い統計情報が返される可能性がありました。
pg_file_settings
ビューで、backend
またはsuperuser-backend
コンテキストの設定に対して、未適用の値の有効性を検査するようにしました。
(Tom Lane)
無効な値は意図したようにビューに記録されませんでした。 これらのグループには設定がほとんどないため、この問題は検出されませんでした。
既存のインデックスを新しいパーティションインデックスと一致させる場合に、照合順序も一致させます。 (Peter Eisentraut)
以前は、パーティションキーの対応する要素と異なる照合順序を持つインデックスを受け入れることができ、誤動作につながる可能性がありました。
パーティションインデックスに対するREINDEX INDEX
で、子インデックスが同時に削除された場合のエラーを回避します。
(Fei Changhong)
GINインデックスの内部ページの不完全な分割をクリーンアップする際の不十分なロックを修正しました。 (Fei Changhong, Heikki Linnakangas)
このコードは、バッファの排他ロックではなく共有ロックを使用してこれを行おうとしました。 このため、2 つのプロセスが同時にクリーンアップを試みた場合に、インデックスが壊れる可能性がありました。
GINインデックスの挿入におけるバッファピンの早期解放を回避しました。 (Tom Lane)
インデックスのルートページの分割が、自身の挿入と同時に起こった場合、コードは「buffer NNNN is not owned by resource owner」で失敗する可能性がありました。
パーティションテーブルに対するSP-GiSTインデックスのエラーを回避しました。 (Tom Lane)
この種のインデックスを使用しようとすると、「No such file or directory」エラーが発生する可能性がありました。
ラージオブジェクトの所有者検査を修正しました。 (Tom Lane)
所有者権限を必要とするラージオブジェクト操作は、スーパーユーザによって実行されない限り、「unrecognized class ID: 2613」で失敗していました。
ラージオブジェクトの所有者変更の報告を修正しました。 (Tom Lane)
何も実行されないALTER LARGE OBJECT OWNER
コマンド(すなわち、既存の所有者を選択するコマンド)は、間違ったクラスIDをPostAlterHook
に渡したため、そのフックを使用する拡張機能を混乱する可能性がありました。
EXPLAIN (BUFFERS)
でのI/Oタイミングデータの報告を修正しました。
(Michael Paquier)
「shared/local」とラベル付けされた数値は実際には共有バッファのみを参照するため、ラベルを「shared」に変更しました。
CREATE DATABASE
の耐久性を保証します。
(Noah Misch)
CREATE DATABASE
の実行中またはその直後にオペレーティングシステムのクラッシュが発生した場合、リカバリが失敗したり、新しいデータベースへの後続の接続が失敗したりする可能性がありました。
その時間帯にベースバックアップが取られた場合、バックアップを使用しようとすると同様の問題が発生する可能性がありました。
症状は、データベースディレクトリ、PG_VERSION
ファイル、またはpg_filenode.map
ファイルが存在しないか、空であることでした。
バックアップからのリカバリ開始時と終了時に、LOG
メッセージをより多く出すようにしました。
(Andres Freund)
この変更により、リカバリの問題の診断に役立つ追加情報がpostmasterログに提供されます。
スタンバイサーバがサブトランザクション中にデッドインデックスタプルを誤って処理しないようにしました。 (Fei Changhong)
サブトランザクションのstartedInRecovery
フラグが正しく設定されていませんでした。
これは、デッドインデックスタプルの処理にのみ影響します。
これにより、サブトランザクション内の問い合わせが、返すべきインデックスエントリを無視したり(プライマリサーバでは既にデッドになっているが、スタンバイトランザクションではまだデッドになっていない場合)、プライマリでまだデッドになっていないインデックスエントリを早まってデッドとマークしたりする可能性がありました。
後者の場合に重大な結果が生じるかどうかは明らかではないが、意図された動作ではありません。
walreceiverプロセスのシグナル処理を修正しました。 (Heikki Linnakangas)
レプリケーション接続確立の待機中に、walreceiversがSIGTERMに応答しないようにする変更を元に戻しました。
レコードがWALデコードバッファに収まるかどうかの検査での整数オーバーフローの危険性を修正しました。 (Thomas Munro)
この不具合は、64ビットプラットフォーム上で32ビットPostgreSQLビルドを実行する場合を除き、潜在的なものにすぎないようです。
論理レプリケーション適用ワーカー、そのテーブル同期ワーカー、およびサブスクリプションを変更しようとするセッションプロセス間のデッドロックを修正しました。 (Shlok Kyal)
デッドロック・ループの一方のエッジにはロック待機が含まれていなかったため、デッドロックは検出されず、手動で介入するまで持続しました。
pgoutput論理レプリケーションプラグインによって列のデフォルト値が正しく転送されるようにしました。 (Nikhil Benesch)
新しい列にデフォルトの定数値を持つALTER TABLE ADD COLUMN
は、既存のタプルの書き換えを回避し、代わりに読み取りコードがその列を欠いたタプルに正しいデフォルトを挿入することを期待していました。
その後、テーブルでレプリケーションが開始された場合、pgoutputはそのような列の正しいデフォルトの代わりにNULLを送信したため、サブスクライバで誤ったレプリケーションを引き起こしていました。
列のないテーブルに対する論理レプリケーションの初期同期の失敗を修正しました。 (Vignesh C)
このケースでは、不適切な形式のCOPY
コマンドが生成されていました。
使用前にサブスクリプションの接続文字列を再検証します。 (Vignesh C)
これは、パスワードなしでサブスクリプションが作成された(スーパーユーザに許可されている)が、その後、サブスクリプションの所有者がスーパーユーザ以外に変更された場合を検出することを目的にしています。
新しいクライアントがサーバのパスワードチャレンジに応答せずに接続を切断した場合に正しいステータスコードを返すようにしました。 (Liu Lang, Tom Lane)
場合によっては、これをログに記録可能なエラーとして処理しますが、これは意図したものではなく、psqlのような一般的なクライアントが頻繁に行うため、ログスパムを生成する傾向がありました。
また、ClientAuthentication_hook
を使用する拡張も混乱させる可能性がありました。
OpenSSL 3.2との非互換性を修正しました。 (Tristan Partin, Bo Andreson)
「data」フィールドを使用しても問題ないと仮定するのではなく、プライベートストレージにBIOの「app_data」フィールドを使用します。 この間違いは以前は問題を引き起こさなかったが、3.2ではクラッシュや二重解放に関するエラーを引き起こしていました。
OpenSSLがエラー時にerrno
を設定しないことについて、より注意するようにしました。
(Tom Lane)
errno
が設定されていない場合、報告された失敗の原因はEOFの読み込みであると想定していました。
これにより、「could not accept SSL connection: Success」のような奇妙なエラーレポートの稀なケースが修正されます。
外部データラッパーのForeignAsyncRequest
関数が失敗したときのファイル記述子のリークを修正しました。
(Heikki Linnakangas)
CREATE SUBSCRIPTION
の接続文字列検証における軽微なメモリリークを修正しました。
(Jeff Davis)
ファイル関連のシステムコールによるENOMEMエラーをERRCODE_INTERNAL_ERROR
ではなくERRCODE_OUT_OF_MEMORY
として報告するようにしました。
(Alexander Kuzmenkov)
PL/pgSQLで、SQL標準本体を持つCREATE FUNCTION
/CREATE PROCEDURE
をサポートしました。
(Tom Lane)
以前は、関数本体にセミコロンがあるため、このようなケースは解析エラーで失敗していました。
パイプライン内のlibpqのエラー処理を修正しました。 (Álvaro Herrera)
問い合わせの問題以外の理由でエラーが返された場合(たとえば、接続が失われた場合)、パイプラインの状態が同期しなくなる可能性があります。 これにより、呼び出し側アプリケーションでビジーループが発生する可能性がありました。
libpqのPQsendFlushRequest()
関数を、他のPQsend
関数と同じ規則に従って、クライアント出力バッファをフラッシュするようにしました。
(Jelte Fennema-Nio)
パイプラインモードでは、引き続きPQflush()
を呼び出す必要がある場合がありますが、この変更により、一部の不整合が解消されます。
libpqが2つの異なるスレッドでOpenSSLサポートを同時に初期化する場合の競合状態を回避します。 (Willi Mann, Michael Paquier)
GSSAPIデータ送信におけるタイミング依存の障害を修正しました。 (Tom Lane)
非ブロッキングモードでGSSAPI暗号化を使用すると、libpqが「GSSAPI caller failed to retransmit all data needing to be retried」というエラーを返すことがありました。
postgresql.conf
のlc_
パラメータのエントリを常にコメント解除するようinitdbを変更しました。
(Kyotaro Horiguchi)
xxx
initdbはv16より前はこの方法で動作していましたが、現在は再びこの方法で動作するようになりました。
以前の変更により、initdbの--no-locale
オプションがlc_messages
に意図した効果を及ぼさなくなっていました。
pg_dumpでは、拡張メンバオブジェクトのRLSポリシーやセキュリティラベルをダンプしません。 (Tom Lane, Jacob Champion)
以前は、これらのプロパティを設定するためのコマンドがダンプに含まれていましたが、これらは拡張の内部的な問題と考えるべきでまったく正しくありませんでした。 さらに、復元するユーザーにはそれらを設定するための十分な権限がない可能性があり、ダンプするユーザーにはそれらをダンプするための十分な権限が可能性があります(RLSポリシーのダンプには、それらのテーブルのロックを取得する必要があるため)。
pg_dumpでは、その元となるテーブルがダンプされていない場合、拡張統計オブジェクトをダンプしません。 (Rian McGuire, Tom Lane)
これは、インデックスなどの他の依存オブジェクトの動作に準拠します。
pg_dumpの1つのコードパスでメモリ不足を適切に検出します。 (Daniel Gustafsson)
pgbenchスクリプトが開いたままのパイプラインで終了することをエラーにします。 (Anthonin Bonnefoy)
以前は、\startpipeline
コマンドに対応する\endpipeline
がない場合、pgbenchは奇妙な動作をしていました。
これはpgbenchが適切に処理する必要があるエラーではなく、スクリプトの間違いのようなのでエラーを投げるようにしました。
INT_MAX
と等しい要素を持つ配列がgist__int_ops
インデックスに挿入された場合に発生するcontrib/intarray
のクラッシュを修正しました。
(Alexander Lakhin, Tom Lane)
contrib/pageinspect
のhash_bitmap_info()
関数をパーティション化されたハッシュインデックスに適用した場合に、より適切なエラーを報告するようにしました。
(Alexander Lakhin, Michael Paquier)
contrib/pgstattuple
のpgstathashindex()
関数をパーティション化されたハッシュインデックスに適用した場合に、より適切なエラーを報告するようにしました。
(Alexander Lakhin)
Windowsでは、pg_ctlとpg_regressでサブプロセスを起動する際に自動起動オプションを抑制します。 (Kyotaro Horiguchi)
cmd.exe
経由で子プロセスを起動する場合、/D
フラグを渡して、レジストリで指定された自動実行コマンドの実行を防ぎます。
これにより、予期しない副作用が回避できます。
is_valid_ascii()
をmb/pg_wchar.h
からutils/ascii.h
に移動しました。
(Jubilee Young)
この変更により、一部のサードパーティコードで問題を引き起こしていた<simd.h>
をpg_wchar.h
に含める必要がなくなりました。
libxml2バージョン2.12.0以降でのコンパイル失敗を修正しました。 (Tom Lane)
WindowsでのWAL_DEBUG
コードのコンパイル失敗を修正しました。
(Bharath Rupireddy)
Python のヘッダファイルからのコンパイラ警告を抑制します。 (Peter Eisentraut, Tom Lane)
私たちが推奨するコンパイラオプションは、最新バージョンのPythonのヘッダファイルに現れる構造体について警告を発します。 gccを使用する場合、プラグマでこれらの警告を抑制できます。
LLVM 18でのコンパイル時の非推奨警告を回避します。 (Thomas Munro)
タイムゾーンデータファイルをグリーンランド、カザフスタン、パレスチナでの夏時間法の変更に加え、南極観測点のケイシーとヴォストークを修正したtzdataリリース2024aに更新しました。 また、ベトナム、トロント、ミクロン島の歴史的修正も行われています。