リリース日: 2023-08-10
このリリースは15.3に対し、様々な不具合を修正したものです。 15メジャーリリースにおける新機能については、E.5を参照してください。
15.Xからの移行ではダンプ/リストアは不要です。
しかしながら、BRINインデックスを使用している場合は、インデックスを再作成することをお勧めします。 以下の変更点の3番目のエントリを参照してください。
また、15.1より前のバージョンからアップグレードする場合は、E.4を参照してください。
スキーマ名や所有者名にクオート、バックスラッシュ、ドル記号が含まれている場合、拡張のスクリプトでその名前に置き換えることが禁止されました。 (Noah Misch)
この制限は、信頼された拡張に対するSQLインジェクションを防ぎます。
PostgreSQLプロジェクトは、本問題を報告してくれたMicah Gate、Valerie Woolard、Tim Carey-Smith、Christoph Bergに感謝します。 (CVE-2023-39417)
行セキュリティポリシーを適切に実施するようにMERGE
コマンドを修正しました。
(Dean Rasheed)
MERGE
コマンドがUPDATE
アクションを実行する場合、WHERE
句を持つ単純なUPDATE
の動作方法と一貫性を保つように、ターゲットテーブルで定義されたUPDATE
またはSELECT
RLSポリシーを強制する必要があります。
その代わりに、INSERT
とUPDATE
アクションの両方にINSERT
RLSポリシーを実施していました。
さらに、MERGE
がDO NOTHING
アクションを実行すると、行が削除されていない場合でも、ターゲットテーブルのDELETE
RLSポリシーが既存の行に適用されます。
これはセキュリティの問題ではありませんが、望ましくないエラーが発生する可能性があります。
PostgreSQLプロジェクトは、本問題を報告してくれたDean Rasheedに感謝します。 (CVE-2023-39418)
BRINインデックスでの行のない空の範囲と全てがNULL範囲との混同と、全てがNULLの要約の誤ったマージを修正しました。 (Tomas Vondra)
これらの見落としの結果、BRINインデックス範囲にNULL値があることを忘れてしまう可能性があり、NULL値を返すべき後続のクエリがNULL値を返さない可能性がありました。
この修正自体は、誤ったBRINエントリを修正しません。
NULLの検索に使用されるBRINインデックスに対してREINDEX
することをお勧めします。
DROP DATABASE
が中断されたときに、破損したデータベースを放置しないようになりました。
(Andres Freund)
DROP DATABASE
がすでに元に戻せない処理を開始した後に中断された場合、ターゲットデータベースはアクセス可能なままですが(pg_database
行の削除がロールバックされるため)、データベースの内容は破損していました。
元に戻せない操作を開始する前に、データベースをアクセス不能とマーキングする修正をしました。
その後に障害が発生すると、データベースは部分的に残ったままになりますが、別のDROP DATABASE
を発行する以外には何もできません。
パーティションインデックスが作成時に有効または無効として正しくマークされるようになりました。 (Michael Paquier)
新しいパーティションインデックスが、いずれかのパーティション上の既存の無効なインデックスと一致する場合、そのパーティションインデックスは途中で有効とマークされる可能性がありました。 これにより、パーティションテーブルに対する後続の問い合わせで誤動作やアサーションエラーが発生する可能性がありました。
ALTER TABLE ATTACH PARTITION
の実行中にパーティションインデックスを子インデックスと照合するとき、無効な子インデックスを無視するようになりました。
(Michael Paquier)
このようなインデックスは無視され、代わりに新しい子インデックスが作成されるようになりました。
すべてのパーティションがアタッチされた後、パーティションインデックスを有効とマーキングする時に発生する可能性があった障害を修正しました。 (Michael Paquier)
インデックスのpg_index
エントリの更新は、他の列に対して古いデータを使用する可能性がありました。
報告されている症状の1つは、「attempted to update invisible tuple」エラーです。
拡張に拡張のスキーマ外のオブジェクトが含まれている場合にエラーが発生するようにALTER EXTENSION SET SCHEMA
を修正しました。
(Michael Paquier, Heikki Linnakangas)
拡張に複数スキーマのオブジェクトが含まれている場合にエラーが発生するのは常に意図されていましたが、チェックのコーディングが誤っていたため、一部のケースを検出できず、予期しない動作が発生しました。
テーブルのアクセスメソッド依存関係の追跡を修正しました。 (Michael Paquier)
ALTER TABLE ... SET ACCESS METHOD
は、テーブルのアクセスメソッドを変更するときに関連するpg_depend
エントリの更新に失敗しました。
組み込みでないアクセスメソッドを使用する場合、テーブルが依然としてアクセスメソッドに依存していても、そのアクセスメソッドが削除される可能性があるというリスクが生じます。
この修正は、ALTER TABLE
のロジックを修正しますが、すでに欠落しているpg_depend
エントリは修復されません。
プランナでの一意性の証明に一意な部分インデックスを使用しないようにしました。 (David Rowley)
問題のインデックスがテーブルのスキャンに使用されない場合、テーブルから読み込まれた行の推定される一意性が保持されない可能性があるため、これは誤った計画を引き起こす可能性がありました。
揮発性の結合条件を含むラテラル結合で、Memoizeを使わないようにしました。 (Richard Guo)
揮発性のフィルタ条件を含むサブプランにMemoizeを適用すると、間違った結果につながる可能性があります。
これを回避するためのチェックは、LATERAL
を使用するときに発生する可能性のあるいくつかのケースを見逃していました。
疑似定数のJOIN句を伴う外部結合に対して誤った計画を作成しないようにしました。 (Etsuro Fujita)
現在、プランナにはプッシュダウンされたリモート結合に疑似定数のJOIN句を付加するサポートがないため、このような場合にはリモート結合の生成を無効にしました。 (より優れたソリューションには、プランナデータ構造のABIを破壊する変更が必要になるため、将来のメジャーリリースを待つ必要があります。)
ルールアクションを展開するときに、RLS(行単位セキュリティ)のポリシー式およびセキュリティバリアビューでサブSELECTが正しく処理されるようになりました。 (Tom Lane)
SERIALIZABLE
分離モードのコンフリクト検出における競合条件を修正しました。
(Thomas Munro)
ビットマップヒープスキャンとGINインデックスを使用して、最初に空のbtreeインデックスを調べる場合に、競合が見逃される可能性がありました。 これらのケースはすべて、競合するトランザクションのコミットを不適切に許可するために、シリアライザブル可能性の障害につながる可能性がありました。
継承テーブルまたはパーティションテーブルを対象としたEvalPlanQualチェックの誤動作を修正しました。 (Tom Lane)
この見落としは、READ COMMITTED
分離モードのUPDATEまたはDELETEアクションが、同時更新と衝突しているためにスキップされるべきときに実行される可能性がありました。
外側のネストループからのパラメータを含む内側ハッシュキーを使用したハッシュ結合を修正しました。 (Tom Lane)
そのようなパラメータの値が変更された後に結合を再スキャンする場合、ハッシュテーブルを再構築する必要がありますが、それを怠っていました。 その結果、結合の出力行が欠落する可能性がありました。
複合型列のフィールドを更新しようとしたときに時々発生する障害を修正しました。 (Tom Lane)
複合型列の全体の値が、TOAST外部格納を必要とするほど大きい場合、タイミングの悪いキャッシュフラッシュにより、エラーやサーバクラッシュを引き起こす可能性がありました。
トリガを使用した一部のUPDATE
クエリでのクエリ存続期間のメモリリークを防止しました。
(Tomas Vondra)
増分ソート実行プランノードが再スキャンされる際に、メモリがクエリ処理が終了するまで解放されないメモリリークを防止しました。 (James Coleman, Laurenz Albe, Tom Lane)
jsonpath
のdatetime()
メソッドへの入力として小数点以下の秒を受け入れるようにしました。
(Tom Lane)
極めて複雑なテキスト検索パターンでのスタックオーバーフローによるクラッシュを防止しました。 (Tom Lane)
pg_hba.conf
とpg_ident.conf
で最大10240バイトのトークンを使えるようにしました。
(Tom Lane)
一部のユースケースでは、以前の256バイトの制限では不十分であることが判明していました。
拡張がGUCプレフィックスの予約を宣言したときに、既存のすべてのプレースホルダが一致するかどうかチェックされるようにしました。 (Karina Litskevich, Ekaterina Sokolova)
ループロジックの欠陥で、一部の項目がスキップされる可能性がありました。
C++のout of memory条件の誤った処理を修正しました。 (Heikki Linnakangas)
JITが使用されている場合、C++のnew
呼び出しでメモリが不足すると、想定されたC++例外ではなく代わりにPostgreSQLのFATALエラーが発生していました。
plancache.c
での稀なNULLポインタのクラッシュを修正しました。
(Tom Lane)
サブスクリプションがドロップされた時にそのサブスクリプションの統計エントリをリークしないようにしました。 (Masahiko Sawada)
ページの解放によって空き領域の範囲が結合された場合に、役立つ可能性のある共有メモリセグメントの追跡を失うことを回避しました。 (Dongming Liu)
セグメントは新しい空き容量に応じて適切な「bin」に移動され、その後の検索で見つかるようになります。
特定の種類のBツリーインデックスの破損を検出した後にVACUUM
の続行が可能となりました。
(Peter Geoghegan)
無効な兄弟ページリンクが検出された場合は、以前のようにエラーを起こすのではなく、問題をログに記録して続行します。
REINDEX
以外に壊れたインデックスを修正するものはありませんが、それが完了するまでVACUUM
が完了しないようにすると、事態がさらに悪化するリスクがありました。
VACUUM
がpg_database
.datfrozenxid
またはpg_database
.datminmxid
で無効なデータを検出した後にWrapLimitsVacuumLock
が確実に解放されるようにしました。
(Andres Freund)
このロックはセッションが終了するか他のエラーが発生するとクリーンアップされますが、このロックの解放に失敗すると、後でデッドロックにつながる可能性がありました。
クラッシュリカバリ時に準備されたトランザクションの二重リプレイを回避しました。 (suyu.cmj, Michael Paquier)
このチェックポイントによって2相トランザクション状態データがすでにディスクにフラッシュされている状態で、チェックポイントが途中でクラッシュした後、クラッシュリカバリは準備されたトランザクションを2回リプレイしようとして、起動プロセスで「lock is already held」のような致命的エラーが発生していました。
新しく作成されたがまだ空のテーブルが次のチェックポイントでfsync
されるようにしました。
(Heikki Linnakangas)
これを行なわないと、オペレーティングシステムのクラッシュによって空のファイルが消える原因となる場合、テーブルに対する後続の操作は「could not open file」エラーで失敗する可能性がありました。
UNLOGGEDインデックスの初期フォーク作成が必ずWALログに記録されるようにしました。 (Heikki Linnakangas)
UNLOGGEDインデックスのメインデータフォークはWALログに記録されませんが、クラッシュ後にインデックスをリストアするための一貫した状態を確保するために、その初期フォークはWALログに記録される必要があります。 初期フォークにデータが含まれていない場合、このステップは省略されていましたが、標準のインデックスAMでは使用されていないケースで、おそらく一部の拡張ではそのように動作します。
偽性の「missing contrecord」エラーを出ないようにしました。 (Thomas Munro)
pg_waldumpとwalsenderからの不正確な苦情がログに記録されるのを避けるために、このケースを単純なWAL終了として扱うようにしました。
jsonpath
コードでの過度に厳密なアサーションを修正しました。
(David Rowley)
問い合わせがlike_regex
の結果に.type()
演算子を適用した場合、このアサーションは失敗していました。
非アサートビルドにはバグがありませんでした。
すでにアボートされたトランザクションで拡張クエリプロトコルを介して空のステートメントを処理する場合のアサート失敗を回避しました。 (Tom Lane)
トランザクション内でstats_fetch_consistency
設定が変更された場合のアサート失敗を回避しました。
(Kyotaro Horiguchi)
contrib/fuzzystrmatch
のSoundexのdifference()
関数が空の入力を正常に処理できるように修正しました。
(Alexander Lakhin, Tom Lane)
アルファベット文字を含まない入力文字列を使用すると、予期しない出力が発生していました。
contrib/hstore
で入力の空白チェックを強化しました。
(Evan Jones)
場合によっては、文字が誤って空白として認識され、破棄されることがありました。
contrib/intarray
のGiST__int_ops
インデックス演算子クラスを使用したオーバーサイズの入力配列を禁止しました。
(Ankit Kumar Pandey, Alexander Lakhin)
以前、このコードはNOTICE
を報告していましたが、とにかく続行すると、無効なインデックスエントリが作成され、インデックスが読み込まれたときにクラッシュする危険性がありました。
contrib/intarray
のGiSTインデックスエントリの無駄な二重展開を回避しました。
(Konstantin Knizhnik, Matthias van de Meent, Tom Lane)
contrib/pageinspect
のGiST_page_items()
関数が、INCLUDE句で列が含まれている場合に動作するよう修正しました。
(Alexander Lakhin, Michael Paquier)
以前は、インデックスにINCLUDE句で列が含まれている場合、gist_page_items()
はインデックスリーフページでこれらの値を表示できなかったり、非リーフページでは完全にクラッシュしていました。
psqlで標準入出力が端末でない場合に、PSQL_WATCH_PAGER
環境変数を無視するようにしました。
(Tom Lane)
これは、\watch
以外のコマンドでのPSQL_PAGER
と同じ扱いになります。
一意のインデックスに対するパース時の依存関係を必要とする本体を持つ新しいスタイルのSQL言語関数を正しく処理するようにpg_dumpを修正しました。 (Tom Lane)
このようなケースはGROUP BY
句やON CONFLICT
句で発生することがあります。
この場合、一意インデックスが作成された後に関数のダンプを延期する必要がありますが、pg_dumpはそれを行わず、代わりに「could not resolve dependency loop」という警告を出力していました。
pg_dumpで、依存関係ループ問題の詳細情報の表示を改善しました。 (Tom Lane)
pgbenchで、空のパイプラインとプリペアモードで生じるクラッシュを回避しました。 (Álvaro Herrera)
pg_index
.indisreplident
がリレーションキャッシュのエントリ内で常に最新となるようにしました。
(Shruthi Gowda)
場合によっては、値が古くなることがありました。 リレーションキャッシュのコピーに依存しているコアコードはないため、PostgreSQLに限って言えば、潜在的なバグに過ぎませんが、これに起因して拡張でバグが発生する可能性がありました。
Exuberant以外のctagsで動作するようにmake_etagsスクリプトを修正しました。 (Masahiko Sawada)