リリース日: 2023-11-09
このリリースは16.0に対し、様々な不具合を修正したものです。 16メジャーリリースにおける新機能については、E.5を参照してください。
16.Xからの移行ではダンプ/リストアは不要です。
しかし、特定の種類のインデックスで間違った検索結果を生成したり、不必要に非効率的になる可能性があるいくつかの間違いが発見されています。
この更新をインストールした後、影響を受ける可能性のあるインデックスに対してREINDEX
コマンドの実行をお勧めします。
以下の4番目から7番目の変更ログエントリを参照してください。
DISTINCT
を付けた"any"
型の引数を取る集約関数の不明なデータ型引数の処理を修正しました。
(Tom Lane)
このエラーにより、実行時にtext
型の値がunknown
型の値(つまり、ゼロ終端文字列)として解釈されました。
その結果、text
型値の後ろのサーバーメモリが公開される可能性がありました。
PostgreSQLプロジェクトは、本問題を報告してくれたJingzhou Fu氏に感謝します。 (CVE-2023-5868)
新しい配列の次元を計算するときに整数オーバーフローを検出します。 (Tom Lane)
現在の配列の境界外にある配列添字に新しい要素を割り当てると、エッジケースで検出されない整数オーバーフローが発生する可能性がありました。 任意のコード実行に悪用される可能性のあるメモリ上書きや、サーバメモリの漏洩も可能でした。
PostgreSQLプロジェクトは、本問題を報告してくれたPedro Gallegosに感謝します。 (CVE-2023-5869)
pg_signal_backend
ロールがバックグラウンドワーカーと自動バキュームプロセスにシグナルを送信しないようにします。
(Noah Misch, Jelte Fennema-Nio)
ドキュメントには、pg_signal_backend
はスーパーユーザ所有のプロセスにシグナルを発行できないと書かれています。
しかし、これらのバックグラウンドプロセスロールはOIDをゼロと自称していたので、シグナルを送信できました。
これをスーパーユーザ所有のプロセスとして扱うようにしました。
これらのプロセスタイプの1つを取り消すことによるセキュリティへの影響は、コアコードに関する限りかなり小さいですが(別のプロセスを開始するだけです)、拡張ではより脆弱なバックグラウンドワーカーが追加される可能性があります。
また、そのようなプロセスではis_superuser
パラメータが正しく設定されていることを確認するようにしました。
この見落としによるセキュリティ上の具体的な影響は不明ですが、一部の拡張では重大な影響があるかもしれません。
PostgreSQLプロジェクトは、本問題を報告してくれたHemanth SandranaとMahendrakar Srinivasaraoに感謝します。 (CVE-2023-5870)
GiSTインデックス構築時の再帰的なページ分割時の誤動作を修正しました。 (Heikki Linnakangas)
ページのダウンリンク位置が誤って追跡されるケースを修正し、そのような状況から回復するためのロジックを導入しました。 このエラーにより、後続のインデックス検索で間違った結果が得られる可能性があります。 この更新をインストールした後に、すべてのGiSTインデックスを再作成することをお勧めします。
interval
型列のbtreeインデックスエントリの重複を防止しました。
(Noah Misch)
例えば24:00:00
と1 day
のように、区別はできるが比較すると等しいinterval
型の値があります。
これはbtree重複排除による想定を破るため、interval
型列は重複排除から除外する必要があります。
この見落としにより、インデックスオンリースキャンで誤った結果が生成される可能性があります。
さらに、更新後のamcheckは、このようなインデックスのほとんどすべてに対してエラーを報告します。
ユーザはinterval
型列のbtreeインデックスを再作成する必要があります。
datetime_minmax_multi_ops
のBRINインデックスで、date
型の値をより適切に処理するようにしました。
(Tomas Vondra)
日付の距離計算が逆方向であったため、どのエントリをマージするかの判断が不適切でした。
インデックスは依然として正しい結果を生成しますが、本来あるべき状態より大幅に非効率でした。
date
型列のminmax_multi
のBRINインデックスの再作成を推奨します。
datetime_minmax_multi_ops
のBRINインデックスで、大きなtimestamp
型とtimestamptz
型の値をより適切に処理します。
(Tomas Vondra)
無限大は、他の値からの大きな距離ではなく、距離がゼロであると誤って処理されたため、どのエントリをマージするか不適切な判断をしていました。
また、有限であるが非常に大きい値(表現可能なタイムスタンプ範囲の終点付近)は、内部オーバーフローを引き起こす可能性があり、これもまた不適切な判断の原因となりました。
インデックスは依然として正しい結果を生成しますが、本来あるべき状態より大幅に非効率でした。
timestamp
型およびtimestamptz
型の列に無限大または大きな有限値が含まれているか、含まれていた場合は、minmax_multi
のBRINインデックスの再作成を推奨します。
極端なinterval型の値を持つinterval_minmax_multi_ops
のBRINインデックスでの計算オーバーフローを回避します。
(Tomas Vondra)
このバグは、このようなインデックスに大きなinterval型の値を挿入しようとすると、予期しない障害を引き起こす可能性がありました。
複数のパーティションキーを持つハッシュパーティションテーブルに対するパーティションステップ生成と実行時パーティション除去を修正しました。 (David Rowley)
パーティションキーの1つにIS NULL
条件がある場合、クラッシュすることがありました。
MERGE
中に同時に更新された行の不整合な再チェックを修正しました。
(Dean Rasheed)
READ COMMITTED
モードでは、ターゲット行が同時実行トランザクションによって更新されたことが判明した更新は、更新された行に対して問い合わせのWHERE
条件を再チェックします。
MERGE
は、この再チェック中に他の結合テーブルの適切な行が使用されることを確認できず、その結果、新しく更新された行がMERGE
によって再度更新されるべきかどうかについて誤った判断をする可能性がありました。
親テーブルが制約によって除外されている場合でも、継承されたUPDATE
/DELETE
/MERGE
のターゲットテーブルを正しく識別します。
(Amit Langote, Tom Lane)
最初に指定されたテーブルが制約によって除外されているが、その継承されたすべての子孫が除外されていない場合、除外されていない最初の子孫が主ターゲットテーブルとして識別されました。 これにより、最初に指定されたテーブルではなく、そのテーブルに関連付けられた文レベルのトリガーを起動することになります。 v16では、同じ見落としによって「invalid perminfoindex 0 in RTE with relid NNNN」というエラーが発生する可能性もありました。
ScalarArrayOpExpr句のbtreeマーク/リストア処理でのエッジケースを修正しました。 (Peter Geoghegan)
インデックススキャンを以前にマークされた位置にリストアする場合、スキャンがScalarArrayOpExpr(つまり、indexcol = ANY(ARRAY
)句の一致の最後まで正確に進んだ場合、コードは必要なセットアップ手順を見逃す可能性がありました。
その結果、取得されるべき行が欠落する可能性がありました。
Memoize実行時の問い合わせ内部のメモリリークを修正しました。 (Orlov Aleksej, David Rowley)
集合を返す関数が繰り返しゼロ行を返す場合の問い合わせ内部のメモリリークを修正しました。 (Tom Lane)
cursor_to_xmlschema()
関数がデータを返さないPortalに適用された場合にクラッシュしないようにしました。
(Boyu Yang)
連続したpg_logical_slot_get_changes()
関数の呼び出し間でのオリジンフィルタ条件の不適切な共有を修正しました。
(Hou Zhijie)
この関数の1回の呼び出しで設定されたオリジン条件は、オリジン引数を指定しなかった後続の呼び出しで再利用されていました。 これは意図されたものではありません。
pgrowlocks()
関数がパーティションテーブルに適用された場合に、意図したエラーが発生します。
(David Rowley)
以前は、「only heap AM is supported」という的外れなエラーが発生していました。
様々なSQL関数で無効なインデックスをよりきれいに処理します。 (Noah Misch)
pgstatindex()
、pgstatginindex()
、pgstathashindex()
、pgstattuple()
が無効なインデックスに適用された場合にエラーを報告します。
brin_desummarize_range()
、brin_summarize_new_values()
、brin_summarize_range()
、またはgin_clean_pending_list()
が無効なインデックスに適用された場合、デバッグレベルのメッセージを報告する以外は何も行われません。
以前は、これらの関数はインデックスを処理しようとしていましたが、失敗したCREATE INDEX
が残したものによっては、奇妙な方法で失敗する可能性がありました。
to_tsvector()
への長い入力に対する早すぎるメモリ割り当てエラーを回避します。
(Tom Lane)
tsvectorrecv()
関数で構築されたtsvector
の過剰割り当てを修正しました。
(Denis Erokhin)
受信ベクトルに位置データが含まれている場合、バイナリ受信関数は、完成したtsvector
内に無駄なスペース(位置データのサイズとほぼ等しい)を残していました。
極端な場合、これにより出力時に長さ制限を下回っていたベクトルに対して「maximum total lexeme length exceeded」エラーを引き起こす可能性がありました。
いずれにしても、ディスク上のスペースが無駄になる可能性がありました。
破損したPGLZ圧縮データの検査を改善しました。 (Flavien Guedez)
run_as_owner
オプションのコマンドによる変更が実際に適用されるようにALTER SUBSCRIPTION
を修正しました。
(Hou Zhijie)
パーティションテーブルへの一括テーブル挿入を修正しました。 (Andres Freund)
パーティション間での挿入状態の不適切な共有により、COPY FROM
中に障害が発生する可能性があり、典型的には「could not read block NNNN in file XXXX: read only 0 of 8192 bytes」というエラーとして表示されます。
COPY FROM
で、コマンドが必要としない列のデフォルト値を評価しないようにします。
(Laurenz Albe)
これにより、デフォルト値が実際にはその列に対して有効でない場合や、デフォルトの式が現在の実行コンテキストで失敗する場合に発生する可能性のあるエラーを回避できます。 このようなエッジケースは、例えばダンプのリストア時などに発生することがありました。 以前のリリースではこのような状況で失敗しなかったので、v16でもこのような状況を回避します。
COPY FROM
で、サポートされていないエンコーディング変換が必要な場合にちゃんと失敗するようにしました。
(Tom Lane)
最近のリファクタリングで、これに対する意図したエラーチェックが誤って削除されたため、有用なエラーメッセージではなく「cache lookup failed for function 0」というエラーで終了していました。
EXPLAIN
によって表示されるようにマークされたパラメータの起動時の値がNULLである場合、EXPLAIN
でのクラッシュを回避します。
(Xing Guo, Aleksander Alekseev, Tom Lane)
この説明に当てはまる組み込みパラメータはありませんが、拡張機能でそのようなパラメータを定義できます。
ON COMMIT DROP
での一時テーブル削除中にスナップショットがあることを確認します。
(Tom Lane)
これにより、一時テーブルのカタログエントリにTOASTを必要とするような大きな幅のフィールドがある場合(非常に複雑なCHECK
条件など)に起こりうる誤動作を防ぐことができます。
system()
でフォークされたばかりの子プロセスのシャットダウン信号に対する不適切な応答を回避します。
(Nathan Bossart)
この修正により、system()
によってフォークされたが、まだ目的の子プログラムを実行していない子プロセスが、親サーバプロセス用に意図されたシグナルを受け取って処理する可能性がある競合状態が回避されます。
これにより、重複したクリーンアップ処理が実行され、好ましくない結果になっていました。
フロントエンドプログラムでpg_control
の破損した読み込みに対処します。
(Thomas Munro)
一部のファイルシステムでは、サーバが同時にそのファイルに書き込む場合、pg_control
の読み込みがアトミックな動作にならないことがあります。
これは、不正なCRCによって検出できます。
エラーを報告する前に、数回試行してファイルが有効になるかどうかを確認するようにしました。
関連するSQL関数でpg_control
の破損した読み込みを回避します。
(Thomas Munro)
pg_control
を読み込む前に適切なロックを取得して、そのファイルの一貫したビューを確保しました。
ORDER BY
またはDISTINCT
オプションを使用した集約関数の計画時に発生する「could not find pathkey item to sort」というエラーを修正しました。
(David Rowley)
バックエンドアクティビティの文字列配列のサイズを計算する際の整数オーバーフローを回避します。 (Jakub Wartak)
64ビットマシンでは、許可された接続数を乗算したときに32ビットオーバーフローが発生するような大きなtrack_activity_query_size
の値を許可します。
しかし、バックエンドごとのローカル配列を実際に割り当てるコードは、この点について不注意で、配列を誤って割り当てていました。
継承テーブルでのANALYZE
に対する一貫性のない進捗状況統計が一時的に表示される問題を修正しました。
(Heikki Linnakangas)
ブロックレベルカウンタは、現在のリレーションフィールドを更新すると同時にゼロにリセットされる必要がありました。
統計カウンタにWAL書き込みを報告するようにバックグラウンドライタを修正しました。 (Nazir Bilal Yavuz)
pgstat_report_wal()
の強制フラッシュ動作に関する混乱を修正しました。
(Ryoga Yoshida, Michael Paquier)
これにより、シャットダウン時にWAL I/Oに関する一部の統計情報が忘れられる可能性がありました。
一時テーブルの拡張に関する統計追跡を修正しました。 (Karina Litskevich, Andres Freund)
これらは、一時テーブル書き込みとしてカウントされるべきときに、通常のテーブル書き込みとしてカウントされていました。
track_io_timing
が有効な場合、リレーション拡張操作にかかった時間を書き込み時間として含めます。
(Nazir Bilal Yavuz)
キャッシュされたCALL
文の依存関係を追跡し、必要な場合に再計画します。
(Tom Lane)
CALL
の引数でインライン化された関数を置き換えるDDLコマンドは、PL/pgSQLによってキャッシュされているCALL
を再計画する必要性を生じさせます。
これが行なわれなかったため、誤動作や「cache lookup failed」などの奇妙なエラーが発生していました。
OpenSSL接続のセットアップでエラーが発生した後のpfree-a-NULL-pointerクラッシュの可能性を回避します。 (Sergey Shinderuk)
外部問い合わせレベルからRECORD
型のVarsを検査する際に正しくネストの深さを追跡します。
(Richard Guo)
この見落としにより、アサーションエラー、コアダンプ、または「bogus varno」エラーが発生する可能性がありました。
ScalarArrayOpExprプランノードのハッシュ関数と否定関数の依存関係を追跡します。 (David Rowley)
ほとんどの場合、ノードの元の演算子が存在している間はこれらの関数が消滅する可能性が低いため、この見落としは無害でした。
RECORD
型のキャッシュ管理におけるエラー処理のバグを修正しました。
(Thomas Munro)
メモリ不足エラーが不適切な時点で発生すると、無限ループにつながる一貫性のない状態を残す可能性がありました。
WALの読み込み中のメモリ不足エラーを致命的なエラーとして扱います。 (Michael Paquier)
以前は、これは偽のデータ状態として扱われ、WALの終わりに達したという結論に至りましたが、これは誤りであり、一貫性のないWAL再生につながる可能性がありました。
不正なWALレコード長フィールドに基づいてメモリを割り当てようとしたために起こりうるリカバリ失敗を修正しました。 (Thomas Munro, Michael Paquier)
min_dynamic_shared_memory
が0より大きく設定された場合にWindowsで発生する「could not duplicate handle」エラーを修正しました。
(Thomas Munro)
GenericXLogFinish
の処理順序を修正しました。
(Jeff Davis)
このコードは、変更されたバッファをダーティにマークする前にWALを書き込むことで、クラッシュ安全性に必要な条件に違反していました。
この関数はコアコードでは使用されませんが、拡張では使用されます(例えばcontrib/bloom
では使用されます)。
PL/Python例外処理での誤ったアサーションを削除しました。 (Alexander Lakhin)
サブスクリプションの新しいrun_as_owner
オプションをダンプするようにpg_dumpを修正しました。
(Philip Warner)
この見落としのため、サブスクリプションは常にrun_as_owner
がfalse
に設定された状態でリストアされていました。
これはv16より前のリリースでの動作と同等ではありません。
選択的リストアが選択されたテーブルのテーブルレベルと列レベルの両方のACLを含むようにpg_restoreを修正しました。 (Euler Taveira, Tom Lane)
以前は、両方のタイプが存在する場合、テーブルレベルのACLのみがリストアされていました。
pg_upgradeに、abstime
、reltime
、tinterval
のデータ型の使用を検査するロジックを追加します。
(Álvaro Herrera)
これらの旧式のデータ型はPostgreSQLバージョン12で削除されたため、アップグレード可能であると主張する前に、古いデータベースに存在しないことを確認します。
Windows上のpgbenchでの誤った「too many client connections」エラーを回避しました。 (Noah Misch)
vacuumdbの複数の-N
スイッチの処理を修正しました。
(Nathan Bossart, Kuwamura Masaki)
複数の-N
スイッチは複数のスキーマ内のテーブルを除外するはずですが、生成された問い合わせの構築に誤りがあったため、実際には何も除外されませんでした。
vacuumdbがANALYZEのみのモードで--buffer-usage-limit
オプションを適切に処理するよう修正しました。
(Ryoga Yoshida, David Rowley)
contrib/amcheck
では、中断されたページ削除を破損として報告しないようにしました。
(Noah Misch)
この修正により、「the first child of leftmost target page is not leftmost of its level」、「block NNNN is not leftmost」、「left link/right link pair in index XXXX is not in agreement」という誤検出の報告が出なくなりました。
これらの報告は、未完了のbtreeインデックスページの削除後、VACUUM
がクリーンアップする前にamcheckが実行された場合に表示されました。
contrib/btree_gin
で、<
または<=
演算子を使用してinterval
列にインデックスに対するインデックススキャンが実行された場合の失敗を修正しました。
(Dean Rasheed)
このようなインデックススキャンは、返されるべきすべてのエントリを返すことができませんでした。
LLVM 16と17のサポートを追加しました。 (Thomas Munro, Dmitry Dolgov)
最近のmacOSでの様々なビルド時の警告を抑制します。 (Tom Lane)
Xcode 15(macOS Sonomaとともにリリース)では、リンカの動作が変更され、PostgreSQLのビルド時に多数の重複ライブラリ警告が発生するようになりました。
これらは無害でしたが、煩わしいので、同じライブラリを2回引用することは避けるようにしました。
また、-multiply_defined suppress
リンカスイッチの使用を削除しました。
これは長い間何も実行されていなかったようで、現在は積極的に警告が出ています。
contrib/unaccent
のルールファイルをビルドする際、--with-python
が指定されておらず、make変数PYTHON
が設定されていなければ、python
を使うようにフォールバックします。
(Japin Li)
デフォルトのタイムゾーンの略語リストからPHOT
(フェニックス諸島時間)を削除しました。
(Tom Lane)
デフォルトのリストにこの略語があると、最近のDebianやUbuntuのリリースでは、基礎となるtzdbエントリがデフォルトでインストールされなくなっているため、エラーが発生する可能性があります。 これは、人口が約24人のゾーン用の略語なので、それを見逃す人はまずいないでしょう。 もし見逃した場合でも、カスタム略語ファイルを使用して元に戻すことができます。