リリース日: 2023-05-11
このリリースは15.2に対し、様々な不具合を修正したものです。 15メジャーリリースにおける新機能については、E.5を参照してください。
CREATE SCHEMA
がsearch_path
の変更を無効にしないようにしました。
(Alexander Lakhin)
CREATE SCHEMA
コマンド内では、一般的なsearch_path
内のオブジェクトだけでなく、新しく作成されたスキーマ内のオブジェクトも、安全なsearch_path
を設定しようとする呼び出された関数またはスクリプト内でも可視になります。
これにより、スキーマを作成する権限を持つユーザであれば、セキュリティ定義関数または拡張スクリプトの権限を乗っ取ることが可能になります。
PostgreSQLプロジェクトは、本問題を報告してくれたAlexander Lakhinに感謝します。 (CVE-2023-2454)
集合を返す関数をインライン化した後でも、行レベルセキュリティポリシーを正しく適用するようになりました。 (Stephen Frost, Tom Lane)
集合を返すSQL言語関数が行レベルセキュリティポリシーを持つテーブルを参照し、そのテーブルが呼び出し元問い合わせにインライン化できる場合、キャッシュされたプランを別のロールで再利用する状況では、これらのRLSポリシーが適切に実施されないことがありました。 これにより、ユーザは非表示になっている行を表示または変更できました。
PostgreSQLプロジェクトは、本問題を報告してくれたWolfgang Waltherに感謝します。 (CVE-2023-2455)
STRATEGY WAL_LOG
オプションを使用したCREATE DATABASE
コマンドの後にテンプレート(ソース)データベースの破損が発生する可能性があったのを修正しました。
(Nathan Bossart, Ryo Matsumura)
不適切なバッファ処理により、テンプレートのpg_class
カタログのその後の変更が失われるリスクが生じていました。
STRATEGY WAL_LOG
オプションを使用したCREATE DATABASE
コマンド実行中のメモリリークと不要なディスク読み込みを修正しました。
(Andres Freund)
CREATE SCHEMA
で新しいスキーマ名が省略されている場合のクラッシュを回避しました。
(Michael Paquier)
SQL標準では、CREATE SCHEMA AUTHORIZATION
と書くことができ、スキーマ名はデフォルトでowner_name
owner_name
に設定されます。
ただし、一部のコードパスはスキーマ名が存在することを想定しており、障害が発生しました。
MERGE
コマンドでのさまざまなプランナ障害を修正しました。
(Tom Lane)
プラン作成時に「variable not found in subplan target list」または「PlaceHolderVar found where not expected」のようなエラーで失敗する可能性がありました。
一部の場合におけるMERGE
で報告される行数を修正しました。
(Dean Rasheed)
コマンドタグで報告された行数では、NULLを返すBEFORE ROW
トリガにより、実際には変更されていない行がカウントされていました。
これは、通常のUPDATE
またはDELETE
での動作と矛盾するため、このような行をカウントしないよう変更されました。
また、MERGE
が行をパーティションテーブルの別のパーティションに移動するときに、1行を2回カウントしないようになりました。
同時更新を伴うMERGE
の問題を修正しました。
(Dean Rasheed, Álvaro Herrera)
同時に実行されているトランザクションによって行が更新された直後に、MERGE
によってその行が更新または削除されると、誤動作が発生することがありました。
これにより、クラッシュ、または誤ったマージ動作、あるいは何も実行されない可能性がありました。
MERGE
コマンドの逆コンパイルを追加しました。
(Álvaro Herrera)
これはMERGE
が追加されたときには見過ごされていましたが、新しい形式のSQL関数でのMERGE
にとって不可欠です。
パーティションテーブルでの外部キー制約のトリガの有効化/無効化を修正しました。 (Tom Lane)
ALTER TABLE ... ENABLE/DISABLE TRIGGER
は、パーティションテーブルの外部キー強制トリガに適用されると失敗していました。
これは、名前によってパーティションのクローントリガを見つけようとしましたが、それらの名前が同じではないためです。
代わりに、親トリガのOIDによってそれらを見つけることにしました。
インデックスに格納されている複合型の変更が禁止されました。 (Tom Lane)
ALTER TYPE
は、複合型がテーブル列に格納されている場合、バイナリ互換性のない複合型の変更を許可しません。
(いつかは許可されるかもしれませんが、まだ行われていません。
多くのテーブルを書き換えることによるロックの影響は気が遠くなります。)
私たちは、インデックスがテーブルには含まれない複合型を含む可能性を見落としていました。
システム列を外部キーの要素とすることが禁止されました。 (Tom Lane)
OIDがシステム列から除外されて以来、システム列の妥当な用途はなく、コードの様々な部分はもはやサポートされていません。 すべてのケースを修正しようとするのではなく、禁止することにしました。
行単位セキュリティ(RLS)が設定されている親テーブルからのCOPY TO
が、子テーブルの行をコピーしないようにしました。
(Antonin Houska)
ドキュメントにはCOPY TO
が名前付きテーブルからのみ行をコピーし、そのテーブルが持つ継承子テーブルから行はコピーしないことが明確に記載されています。
ただし、行単位セキュリティがテーブルで有効になっている場合、誤って子テーブルの行がコピーされていました。
array_position()
またはarray_positions()
に空配列が渡された場合に発生するクラッシュの可能性を回避しました。
(Tom Lane)
to_char()
で発生する可能性があった範囲外のフェッチを修正しました。
(Tom Lane)
運が悪ければ、サーバクラッシュにつながる可能性がありました。
translate()
関数でのバッファオーバーラン読み出しを回避しました。
(Daniil Anisimov)
削除機能を利用する場合、関数は入力文字列の直後のバイトをフェッチし、可能性は低いですがクラッシュすることがありました。
テキスト検索に関連する文字クラス処理のロジックを調整して、有効なロケールがC
であるかどうかを正しく検出します。
(Jeff Davis)
データベースのデフォルト照合順序がICUを利用している場合に混乱がありました。
interval
型に対する空文字列の入力によるクラッシュ発生を回避しました。
(Tom Lane)
ISO-8601形式のinterval値の表現で、フィールドの指数表現を再度使用可能にしました。 (Tom Lane)
interval型に対するP0.1e10D
のような入力は、ISO-8601で公式に認可されていませんが、PostgreSQLではバージョン15の前まで長い間受け入れていたので、本バージョンで再度許可しました。
JSON文字列リテラルの解析エラーに対するエラーカーソル設定を修正しました。 (Tom Lane)
JSON値の中の文字列リテラルで構文エラーが検出されたほとんどの場合では、エラーカーソルが適切に設定されていませんでした。 これにより、少なくとも役に立たないエラーメッセージ(実際のトラブルスポットではなく、トークンの前の文字列を指す)が発生し、v14以降ではクラッシュになる可能性さえありました。
現在の64-bit XIDよりも大きいvacuum_defer_cleanup_age
設定によるビットの破損を修正しました。
(Andres Freund)
v14以降では、デフォルト以外のvacuum_defer_cleanup_age
設定を使用して、非常に大きいバキュームクリーンアップ範囲XIDを計算することができ、バキュームはまだ有効な行を削除することになりました。
v12およびv13では、GiSTインデックスのみに影響する同じ問題のより小規模な形式があり、インデックスページのリサイクルが早すぎる可能性がありました。
パーサが不適切にネストされた集約を検出できなかった問題を修正しました。 (Tom Lane)
この見落としは、無効として拒否されるはずだった問い合わせが実行され、エグゼキュータの失敗につながる可能性がありました。
serial型のSEQUENCE NAME
オプションパース時のデータ構造の破損を修正しました。
(David Rowley)
イベントトリガが破損した構文解析ツリーを取得する場合に、トラブルにつながる可能性がありました。
initPlanを移動する際に、プランノードの並列安全性マークを正しく更新するようになりました。 (Tom Lane)
このプランナの見落としは、ランタイム時の「subplan was not initialized」エラーにつながる可能性がありました。
拡張統計のコードでPlaceHolderVarsによる失敗を回避しました。 (Tom Lane)
依存関係型の拡張統計の使用は「PlaceHolderVar found where not expected」エラーで失敗する可能性がありました。
副問い合わせに適用される検索条件句が、副問い合わせ内のウィンドウ集約「run condition」に変換できるかどうかの誤ったテストを修正しました。 (David Rowley)
そのような句内のSubPlanは他のいくつかの異常な場合と同様に、アサーション失敗または誤った回答を引き起こすことがありました。
呼び出しにサブSELECTが含まれる場合、ウィンドウ集約の逆遷移最適化を無効にします。 (David Rowley)
この最適化では、集約の引数式が繰り返し可能な結果を持つ必要がありますが、サブSELECTには当てはまらない場合がありました。
ネストされたARRAY[]
コンストラクタの実行で誤りを修正しました。
(Alexander Lakhin, Tom Lane)
結果の配列に必要な合計スペースのオーバーフローを正しく検出し、出力割り当てのサイズ不足によるクラッシュの可能性を回避します。 また、結果の配列内の末尾のパディングスペースはゼロになります。 ゴミを残すことはほとんどの目的に対して無害ですが、後で奇妙な動作を引き起こす可能性がありました。
複合型から作成した、ドメイン型の配列内のフィールドを更新する時のクラッシュを防止しました。 (Dmitry Dolgov)
ブール型の列に対するパーティション除去のロジックを修正しました。 (David Rowley)
boolcol IS NOT TRUE
のような条件でのプルーニングが正しく行われなかったため、boolcol
がNULLである行が返されない可能性がありました。
また、あまり一般的ではないNOT boolcol
のパーティション化の場合も正しく処理されませんでした。
パラレルハッシュ結合でバッチ毎のクリーンアップでの競合状態を修正しました。 (Thomas Munro, Melanie Plageman)
parallel_leader_participation
=off
(デフォルトではない)の場合にタイミングによってはクラッシュする可能性がありました。
EvalPlanQualチェック後にGENERATED
列を再計算します。
(Tom Lane)
READ COMMITTED
分離モードでは、行更新の効果を、最初に検出された問い合わせよりも新しい行バージョンに再適用する必要がある場合があります。
その場合、GENERATED
列が同時更新によって変更された列に依存している場合は、それらの列を再計算する必要があります。
Memoizeプラン実行によるメモリリークを修正しました。 (David Rowley)
パーティションテーブルに含まれる外部テーブルに対してバッチ挿入を使用する場合のバッファの参照カウント漏れを修正しました。 (Alexander Pyhalov)
ミリ秒以下のvacuum_cost_delay
設定が再度利用可能になりました。
(Thomas Munro)
テーブルのリレーションごとのvacuum_cost_delay
設定がゼロの時にバキュームコスト遅延のバランスを取らないようにしました。
(Masahiko Sawada)
遅延のバランシングは、自動バキュームがリレーション単位のvacuum_cost_delay
設定でテーブルを処理するときは常に無効になるはずですが、これは正の設定に対してのみ行われ、ゼロに対しては行われませんでした。
ビューの最後に列が追加されたときに発生する稀なクラッシュを修正しました。 (Tom Lane)
パーティションテーブル更新でのMULTIEXPR_SUBLINKサブプランのまれな障害を修正しました。 (Andres Freund, Tom Lane)
構文INSERT ... ON CONFLICT DO UPDATE SET (c1,...) = (SELECT ...)
をターゲットのパーティションテーブルに使用すると、子テーブルが親と異なる場合(例えば列の物理的順序が異なる)に失敗する可能性があります。
これは通常、エグゼキュータでの一貫性チェックの失敗として現れますが、クラッシュまたは不適切なデータの更新も発生する可能性がありました。
DO ALSO INSERT ... SELECT
ルールを持つビューに対する複数行のINSERT ... VALUES
問い合わせ内のDEFAULT
マーカーの処理を修正しました。
(Dean Rasheed)
このような場合は通常、「unrecognized node type」エラーまたはアサーション失敗となりました。
ルールアクションの副問い合わせ内のOLD
およびNEW
の参照がサポートされました。
(Dean Rasheed, Tom Lane)
このような参照は実際にはラテラル参照ですが、副問い合わせが明示的にLATERAL
でマークされれていない場合、サーバはクラッシュする可能性があります。
必要に応じて、暗黙的にそれを行うようにしました。
WITH
句内にINSERT
/UPDATE
/DELETE
を含むルールまたはSQL関数本体を逆コンパイルする場合は、ターゲットテーブルの別名を正しく出力するようにしました。
(Tom Lane)
SERIALIZABLE READ ONLY
最適化の不具合を修正しました。
(Thomas Munro)
すでに「doomed」とマークされたトランザクションは、SERIALIZABLE READ ONLY
トランザクションに対する安全なスナップショット最適化を混乱させていました。
場合によっては不必要に最適化がスキップされていました。
他の場合には、アサーション障害が発生しました(ただし、非アサートビルドでは問題はありませんでした)。
論理デコードプラグインのpgoutput
でキャッシュのコールバックスロットのリークを回避しました。
(Shi Yu)
単一セッション内でプラグインの起動と停止を何度も繰り返すと、最終的に「out of relcache_callback_list slots」エラーが発生しました。
インデックス演算子クラスのオプションに対するカスタムバリデータへの不要な呼び出しを回避しました。 (Alexander Korotkov)
この変更により、予期しないエラー発生が修正されました。
複数列のBRINインデックスを複数のキーでスキャンする際の無駄な動作を回避しました。 (Tomas Vondra)
既存のコードでは、スキャンキーが一致するかどうかを判断する際に、最後のレンジのみを実質的に考慮していたため、通常は必要以上にインデックスをスキャンしていました。
BRINのinet_minmax_multi_ops演算子クラスのネットマスク処理を修正しました。 (Tomas Vondra)
このエラーは、アサートが有効なビルドでアサーション障害を引き起こしましたが、稼働ビルドではほとんど無害です。
GiSTインデックスのバッファリングビルド中の無効ポインタの参照を修正しました。 (Alexander Lakhin)
このエラーは、取得された値が重要ではないため、通常、稼働ビルドでは無害のようですが、原理的にサーバクラッシュを引き起こす可能性があります。
ロジカルレプリケーション中のUPDATEまたはDELETE処理で削除された列および生成列を無視するようにしました。 (Onder Kalaci, Shi Yu)
テーブルにこのような列が含まれている場合、REPLICA IDENTITY FULL
オプションを指定したレプリケーションは失敗しました。
コミットタイムスタンプに対するSLRUバッファ入出力の待機イベント名を修正しました。 (Alexander Lakhin)
この待機イベントは、ドキュメントではCommitTsBuffer
という名前でしたが、コードではCommitTSBuffer
で実装されていました。
コードをドキュメントと一致するように変更すると、関連する待機イベント名との一貫性が高まります。
待機イベントSLRUFlushSync
のレポートを再び有効化しました。
(Thomas Munro)
この待機タイプのレポートは、コードリファクタリングで誤って削除されました。
保持するWALセグメントの数を計算する際のアンダーフローの可能性を回避しました。 (Kyotaro Horiguchi)
これにより、wal_keep_size
が正確に反映されない可能性がありました。
スタンバイモードにおけるスタートアップ進捗報告オーバーヘッドを無効にしました。 (Bharath Rupireddy)
スタンバイモードでは、リカバリの進捗状況のレポートの進捗状況は実際にしませんが、その場合でも追跡する作業をしていました。
SCRAM-SHA-256チャネルバインディングでRSA-PSS証明書をサポートしました。 (Jacob Champion, Heikki Linnakangas)
この機能では、OpenSSL 1.1.1以降を使用して構築する必要があります。 サーバとlibpqの両方が影響を受けます。
WindowsにおけるプロセスID追跡での競合を回避しました。 (Thomas Munro)
postmasterが子プロセスがなくなったことを確認する前にオペレーティングシステムはPIDを再利用することができました。 これは、同じPIDを持つ複数の子プロセスが追跡されることになり、混乱を招く可能性がありました。
list_copy_head()
が空リストで正しく動作するように修正しました。
(David Rowley)
このケースにはPostgreSQLコアコードが到達することは知られていませんが、拡張機能では動作に依存している可能性があります。
SPI_result_code_string()
に欠けていたケースを追加しました。
(Dean Rasheed)
AllocSetRealloc()
の間違ったValgrindマーキングを修正しました。
(Karina Litskevich)
大きい(8キロバイトを超える)のpallocチャンクのサイズが減少する異常なケースでは、Valgrind有効ビルドは、チャンクからのメモリ解放の定義された状態を誤ってマークし、Valgrindテスト中に誤った結果を引き起こす可能性がありました。
行単位セキュリティが有効なパーティションテーブルに対するMERGE
のアサート失敗を修正しました。
(Dean Rasheed)
トランザクションになっているロジカルレプリケーションのメッセージをデコードする時のアサーション失敗を回避しました。 (Tomas Vondra)
正規表現のエスケープ処理でロケールの影響を回避しました。 (Jeff Davis)
バックスラッシュの後ろに非ASCII文字が続くと、一般的なロケールによってはアサーション失敗が発生することがありました。
log_newpage_range()
で指定された範囲の最後の数ページが空である場合、空のWALページを書き込むのを避けるようにしました。
(Matthias van de Meent)
このケースがリリースされたブランチで到達可能かどうかは完全には明らかではありませんが、到達可能な場合はアサーション失敗が発生する可能性があります。
キャスト式を使用するplpgsqlのDO
ブロックでのセッション存続期間のメモリリークを修正しました。
(Ajit Awekar, Tom Lane)
Perlのリスト構造を多次元SQL配列に変換する時の配列の次元チェックを強化しました。 (Tom Lane)
plperlは、サブリストのネストに一貫性がなく、データが値の長方形配列を表さない場合に誤動作する可能性がありました。 このような場合はエラーが発生するようになりましたが、以前はクラッシュまたはガベージ出力が発生する可能性がありました。
Pythonのリスト構造を多次元SQL配列に変換する時の配列の次元チェックが強化されました。 (Tom Lane)
plpythonは、空のサブリストを扱う場合や、サブリストのネストに一貫性がなく、データが値の長方形配列を表さない場合に誤動作する可能性がありました。 前者は空の出力配列になり、後者はエラーになります。 しかし、クラッシュになる場合もあれば、予期しない出力になる場合もあります。
plpythonでの例外スタックの巻き戻しを修正しました。 (Xing Guo)
いくつかのまれな失敗例では、PG_TRY例外スタックをクリーンアップせずに戻ることがあり、次のスタックレベルが巻き戻された前に別のエラーが発生した場合にクラッシュする危険性がありました。
libpqのPQconnectPoll()
における一貫性のないGSS暗号化のエラー処理を修正しました。
(Michael Paquier)
gssencmode
がrequire
に設定されている場合、GSS初期化の失敗後にコネクションがdeadとマークされませんでした。
TLS暗号化の同等のケースで以前から行われてきたように、すぐに失敗するよう変更しました。
-C ORACLE
オプションでビルドされたecpgプログラムで発生する可能性があったデータ破損を修正しました。
(Kyotaro Horiguchi)
varcharsize
をゼロに設定してecpg_get_data()
が呼び出されると、直前のフィールドの最後のバイトに終端ゼロ文字が書き込まれ、そのフィールドのデータが切り捨てられる可能性がありました。
列挙(enum)型の列でハッシュ分割されたパーティションテーブルが正常に復元されるようにpg_dumpを修正しました。 (Tom Lane)
列挙値のハッシュコードは列挙値に割り当てられたOIDに依存するので、ダンプとリストアの後では通常異なります。
これは、行がしばしば元のパーティションとは異なるパーティションに入る必要があることを意味します。
ユーザは--load-via-partition-root
オプションを指定することでこの問題を回避できますが、それなしでは成功する可能性が非常に低いので、pg_dumpがそのようなテーブルにこのオプションを自動的に適用するように変更しました。
また、--load-via-partition-root
モードが使用されている場合、リストア前にターゲットテーブルをTRUNCATE
試行しないように、pg_restoreを修正しました。
これにより、デッドロックやデータ喪失の危険性が回避されます。
Windowsでシークできないファイルを正しく検出するようになりました。 (Juan José Santamaría Flecha, Michael Paquier, Daniel Watzinger)
このバグは、pg_dumpがパイプに書き込む時、またはpg_restoreがパイプから読み取る時に誤動作を引き起こしました。
pgbenchの「prepared」モードで、パイプラインを開始する前にパイプライン内のすべてのコマンドを準備(prepare)するようにしました。 (Álvaro Herrera)
これにより、pgbenchスクリプトがパイプライン内でシリアライザブルトランザクションを開始しようとしたときの失敗を回避します。
contrib/amcheck
のヒープを検査するコードで、xminまたはxmaxがゼロのタプルを正しく処理するようにしました。
(Robert Haas)
contrib/amcheck
では、エポックゼロより前にあるように見えるxidを適切に扱うようにしました。
(Andres Freund)
破損の場合、最初のxidエポックより前にあるように見える周回した32ビットxidが表示されることがありました。 このような値を64ビット形式に昇格すると、はるか将来の値が生成され、結果として誤ったレポートが作成されました。 このような場合にはFirstNormalFullTransactionIdを返すことで、理にかなった妥当な動作をするようになります。
contrib/basebackup_to_shell
で、パイプのオープン失敗を適切に検出するようにしました。
(Robert Haas)
contrib/hstore_plpython
で、変換されるPythonの値がマッピングでない場合のクラッシュを回避しました。
(Dmitry Dolgov, Tom Lane)
これはエラーを発生させるべきですが、Python 3では一部のAPIが変更されたためにチェックの動作がおかしくなり、クラッシュが発生する可能性があります。
ltree
列のGiSTインデックスのsiglen
オプションが指定されている場合は、4の倍数にする必要があるようにしました。
(Alexander Korotkov)
その他の値を指定すると、インデックスコンテンツへのアクセスが不整合になります。 これは、Intel互換ハードウェアでは無害ですが、その他のアーキテクチャではクラッシュの原因となる可能性があります。
contrib/pageinspect
で、gist_page_items()
関数の不正な入力に対する防御を追加しました。
(Dmitry Koval)
contrib/pg_trgm
で満たす文字列が存在しない正規表現での誤動作を修正しました。
(Tom Lane)
$foo
のような正規表現は定義としては正当ですが、この表現を満たす文字列は存在しません。
正規表現コンパイラはそれを認識し、空のNFAグラフを生成します。
このようなグラフをpg_trgmのGINやGiSTインデックス修飾に最適化しようとした結果、作業配列の末尾を超えてアクセスすることになり、クラッシュする可能性がありました。
contrib/postgres_fdw
のapplication_name
パラメータにおけるエスケープシーケンス処理を修正しました。
(Kyotaro Horiguchi, Michael Paquier)
エスケープを展開するコードは、外部テーブルの自動ANALYZEの中など、バックグラウンドプロセスで実行された場合に失敗する可能性がありました。
contrib/pg_walinspect
で、pg_get_wal_records_info()
のメモリ使用量を制限しました。
(Bharath Rupireddy)
GNU互換のstripで静的ライブラリから不要な情報を除去する場合は、--strip-unneeded
オプションを使用します。
(Tom Lane)
以前は、make install-strip
はこの場合には-x
オプションを使用していました。
この変更により、llvm-stripの誤動作が回避され、出力もわずかに小さくなりました。
文書構築でのDTDファイルの自動ダウンロード推奨をやめて、実際に無効にしました。 (Aleksander Alekseev, Peter Eisentraut, Tom Lane)
SGML文書をビルドするには、DocBook DTDファイルのローカルインストールが必要です。
以前はxsltprocがsourceforge.netからこれらのファイルを実行中にダウンロードできましたが、sourceforge.netでは現在HTTPSアクセスのみが許可されており、xsltprocの一般的なバージョンではサポートされていません。
そのため、それが可能または有用であることを示唆する文書の一部を削除し、代わりにxsltprocの--nonet
オプションをビルドレシピに追加します。
PGXSビルドでTAPテストを実行する場合、一時的なportlock
ディレクトリには、より安全な場所を使用するようにしました。
(Peter Eisentraut)
それをビルドディレクトリのtmp_check
の下に置きます。
以前のコーディングでは、PGXSビルドはそれをインストレーションディレクトリに置こうと試みましたが、これは必ずしも書き込み可能ではありません。
エジプト、グリーンランド、モロッコ、パレスチナでの夏時間法改正に伴い、タイムゾーンデータファイルをtzdataリリース2023cに更新しました。
モスクワ時間に従っている場合、Europe/KirovおよびEurope/Volgogradは、モスクワ時間に従う他のタイムゾーンとの整合性を保つため、数字による略語ではなくMSK/MSDという略語を使用するようにしました。 また、America/YellowknifeはAmerica/Edmontonと区別されなくなりました。 これは、その地域の1948年以前のタイムスタンプの一部に影響を与えます。