他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

E.4. リリース16.1 #

リリース日: 2023-11-09

このリリースは16.0に対し、様々な不具合を修正したものです。 16メジャーリリースにおける新機能については、E.5を参照してください。

E.4.1. バージョン16.1への移行 #

16.Xからの移行ではダンプ/リストアは不要です。

しかし、特定の種類のインデックスで間違った検索結果を生成したり、不必要に非効率的になる可能性があるいくつかの間違いが発見されています。 この更新をインストールした後、影響を受ける可能性のあるインデックスに対してREINDEXコマンドの実行をお勧めします。 以下の4番目から7番目の変更ログエントリを参照してください。

E.4.2. 変更点 #

  • 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:001 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_ownerfalseに設定された状態でリストアされていました。 これはv16より前のリリースでの動作と同等ではありません。

  • 選択的リストアが選択されたテーブルのテーブルレベルと列レベルの両方のACLを含むようにpg_restoreを修正しました。 (Euler Taveira, Tom Lane)

    以前は、両方のタイプが存在する場合、テーブルレベルのACLのみがリストアされていました。

  • pg_upgradeに、abstimereltimetintervalのデータ型の使用を検査するロジックを追加します。 (Á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 levelblock NNNN is not leftmostleft 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 15macOS Sonomaとともにリリース)では、リンカの動作が変更され、PostgreSQLのビルド時に多数の重複ライブラリ警告が発生するようになりました。 これらは無害でしたが、煩わしいので、同じライブラリを2回引用することは避けるようにしました。 また、-multiply_defined suppressリンカスイッチの使用を削除しました。 これは長い間何も実行されていなかったようで、現在は積極的に警告が出ています。

  • contrib/unaccentのルールファイルをビルドする際、--with-pythonが指定されておらず、make変数PYTHONが設定されていなければ、pythonを使うようにフォールバックします。 (Japin Li)

  • デフォルトのタイムゾーンの略語リストからPHOT(フェニックス諸島時間)を削除しました。 (Tom Lane)

    デフォルトのリストにこの略語があると、最近のDebianやUbuntuのリリースでは、基礎となるtzdbエントリがデフォルトでインストールされなくなっているため、エラーが発生する可能性があります。 これは、人口が約24人のゾーン用の略語なので、それを見逃す人はまずいないでしょう。 もし見逃した場合でも、カスタム略語ファイルを使用して元に戻すことができます。