リリース日: 2022-08-11
このリリースは14.4に対し、様々な不具合を修正したものです。 14メジャーリリースにおける新機能については、E.6を参照してください。
拡張のスクリプトが、拡張に属していないオブジェクトを置換しないようになりました。 (Tom Lane)
この変更は、拡張に属さない既存オブジェクトがある場合に、拡張のスクリプトがCREATE OR REPLACE
を行うことを防止します。
また、同じ状況でのCREATE IF NOT EXISTS
も防止します。
これにより、敵対的なデータベースユーザが拡張のオブジェクトの所有者になって、それを変更して将来の他ユーザによるオブジェクト使用を危機にさらすという、トロイの木馬型の攻撃を防ぐことができます。
副次的な利点として、意図しないオブジェクトを誤って置換してしまうリスクも軽減されます。
PostgreSQLプロジェクトは本問題を報告してくれたSven Klemmに感謝します。 (CVE-2022-2625)
スタンバイサーバでのCREATE DATABASE
のWALレコードリプレイが修正されました。
(Kyotaro Horiguchi, Asim R Praveen, Paul Guo)
スタンバイサーバがデータベース作成のWALレコードをリプレイする時に、テーブルスペースのディレクトリが見つからないことがあります。 本パッチ適用前は、このような場合、スタンバイはリカバリに失敗していましたが、このようなディレクトリが合法的に欠落している可能性がありました。 テーブルスペースを(通常のディレクトリとして)作成し、リプレイが一貫した状態に達したら、再び削除されていることを確認する動作に変更されました。
「構内(in place)」テーブルスペースがサポートされました。 (Thomas Munro, Michael Paquier, Álvaro Herrera)
通常、PostgreSQLのテーブルスペースは、他のファイルシステム上のディレクトリへのシンボリックリンクですが、この変更により、データベースクラスタディレクトリ内の単なるディレクトリにすることができます。
これはテーブルを異なるファイルシステム上に分離するのには役に立ちませんが、テストには便利な仕組みです。
さらに、CREATE DATABASE
リプレイの修正(前項の修正)で、欠落しているテーブルスペースを「構内」テーブルスペースとして一時的に作成するために必要となります。
CREATE INDEX
における権限チェックが修正されました。
(Nathan Bossart, Noah Misch)
CVE-2022-1552むけの修正により、CREATE INDEX
が演算子クラスやその他のオブジェクトの検索を実行する際に、以前は呼び出しユーザのパーミッションを適用していたところで、テーブル所有者のパーミッションを適用するようになっていました。
pg_dumpはパーミッションを再度付与する前にCREATE INDEX
を発行するため、これによりダンプ/リストアのシナリオが壊れていました。
拡張問い合わせプロトコルでは、トランザクションブロック内で実行できないCREATE DATABASE
等のコマンド後に、即時コミットを強制するようになりました。
(Tom Lane)
クライアントがそのようなコマンドの直後にSyncメッセージを送信せず、代わりに別のコマンドを送信した場合、そのコマンドで障害が発生すると、直前のコマンドがロールバックされ、通常ディスク上に矛盾した状態が残りました(欠落しているデータベースディレクトリや余分なデータベースディレクトリなど)。 そのような状況を防ぐためのメカニズムは、簡易問い合わせメッセージ内の複数コマンドに対しては機能しますが、拡張問い合わせの一連のメッセージに対しては機能しません。 現在動作しているユースケースを壊さずに矛盾を防ぐため、そのようなコマンドの後に暗黙のコミットを強制するものとなりました。
トランザクションの可視性をチェックする際の競合状態が修正されました。 (Simon Riggs)
内部実装関数TransactionIdIsInProgress(xid)
が、対象のトランザクションが可視とみなされる前にfalse
を報告し、さまざまな誤動作を引き起こす可能性がありました。
競合状態のウィンドウは通常、非常に狭いですが、同期レプリケーションを使用すると同期レプリカの待機がそのウィンドウ内で発生するため、より広くなります。
最上位以外に集合を返す関数を含む式でソートした場合の誤った計画が修正されました。 (Richard Guo, Tom Lane)
拡張統計情報の誤った権限検査コードが修正されました。 (Richard Guo)
ユーザが不十分なSELECT
権限しか持たないテーブルに拡張統計情報がある場合、一部の問い合わせが「unrecognized node type」で失敗していました。
ブール値式の MCV(最頻値)型の統計情報を処理するために、拡張統計情報の仕組みが修正されました。 (Tom Lane)
統計収集は正常に動作しますが、WHERE
にその式を含む問い合わせは、プラン作成時に「unknown clause type」で失敗していました。
配列
変数に MCV(最頻値)タイプの拡張統計情報がある場合に
句に対してプランナでクラッシュが生じていて、修正されました。
(Tom Lane)
constant
= ANY(array
)
ALTER TABLE ... ENABLE/DISABLE TRIGGER
がパーティションテーブル上のトリガの再帰を正しく処理するように修正されました。
(Álvaro Herrera, Amit Langote)
場合によっては、コマンドがトリガを持たない子パーティションでトリガを調整しようとするため、「trigger does not exist」が発生することがありました。
拡張統計情報の計算中にANALYZE
をキャンセルできるようになりました。
(Tom Lane, Justin Pryzby)
高コストな統計情報対象を伴うシナリオでは、キャンセルできないソート操作に何秒も費やす可能性がありました。
jsonpath
型の構文エラーメッセージが改善されました。
(Andrew Dunstan)
pg_stop_backup()
がセッションの状態を適切にクリーンアップするようになりました。
(Fujii Masao)
これまで省略されていたため、セッションの後半でアサート失敗やクラッシュを引き起こす可能性がありました。
ゼロ次元の配列の引数を適切に処理するようにtrim_array()
が修正されました。
不正メモリアクセスにより、潜在的にクラッシュが生じる可能性がありました。
(Martin Kalcher)
FOR [KEY] UPDATE/SHARE
句における結合エイリアスのマッチングが修正されました。
(Dean Rasheed)
稀なケースでは、誤解を招くエラーが報告されることがありました。
多すぎる列を持つFROM
の中のROW()
表現と関数をリジェクトします。
(Tom Lane)
おおよそ1600列を超えるケースはサポートされておらず、必ず実行は失敗します。 しかしながら、32Kを超える列を持った問い合わせによってアサート失敗またはクラッシュが発生する以前のコードが一部ありました。 これを避けるために、パースする際にチェックするようになりました。
ビューが作られて複合型の列がドロップされた場合、複合型を返すFROM
の中の関数を使っているビューのダンプが修正されました。
(Tom Lane)
ダンプされるビューはこの関数のためにたくさんの列へのエイリアスを持っているため、この見過ごしはdump/reloadまたはpg_upgradeの障害を引き起こします。
論理レプリケーションのwalsenderで入れ子のバックアップ処理を禁止するようになりました。 (Fujii Masao)
論理レプリケーションのサブスクライバのメモリリークが修正されました。 (Hou Zhijie)
ターゲットテーブルがパーテション化されている場合、論理レプリケーションのレプリカアイデンティティのチェックが修正されました。 (Shi Yu, Hou Zhijie)
レプリカアイデンティティ列は子パーティションのために再度識別される必要があります。
論理レプリケーションのパブリッシャーのスキーマを変更した後、サブスクライバでキャッシュされたスキーマデータ更新に失敗する障害が修正されました。 (Shi Yu, Hou Zhijie)
BRIN_EVACUATE_PAGE
フラグを正しく処理するためのWAL一貫性チェックロジックが修正されました。
(Haiyang Wang)
共有ハッシュテーブル管理における誤ったアサートチェックが修正されました。 (Thomas Munro)
min_dynamic_shared_memory
がデフォルトでない値にセットされた時に起きるアサート失敗が修正されました。
(Thomas Munro)
SPI_commit()
のなかでコミット時のエラーが起きた時、呼び出し元がクリーンアップしてくれることを期待せずに自動で行うようになりました。
(Peter Eisentraut, Tom Lane)
適切なクリーンアップには複雑で低レベルな機能を必要とします。
従って、どの既知の呼び出し元もクリーンアップしないことがあり得ます。
このために、手続き言語のプロシージャがCOMMIT
を発行したが(例えば遅延制約検査などで)エラーが起きてしまった場合に誤動作を招きます。
これを改善するためにSPI_commit()
を次のように再定義しました。
即ち、前トランザクションの特性を保存せずに新しいデフォルトトランザクションの特性を取ること以外は、SPI_commit_and_chain()
と等価な新しいトランザクションを開始するものとしました。
この変更をAPIの観点からある程度透過的にするため、SPI_start_transaction()
をno-op(何もしない動作)に再定義しました。
全てのSPI_commit()
の既知の呼び出し元は直後にSPI_start_transaction()
を呼びます。
これにより全ての呼び出し元は本変更の影響を受けません。
同じ変更はSPI_rollback()
にも行われています。
PL/Pythonの修正も行われました。 PL/Pythonでは、このようなエラー処理が完全に省略されていて、Python 3.11ではクラッシュすると報告されています。 古いPythonリリースでは何も問題ないように見えますがメモリリークが起きます。
パイプラインモードでのlibpqのアイドル状態の処理が改善されました。 (Álvaro Herrera, Kyotaro Horiguchi)
これにより、「message type 0x33 arrived from server while idle」という警告が修正され、PQgetResult()
からのクエリ終了を表す結果のNULLが失われる可能性が修正されます。
予想外の順序で操作を呼び出した場合のecpglibのコアダンプが回避されました。 (Tom Lane)
EXEC SQL PREPARE
などの特定の操作をデータベース接続を確立する前に呼び出すと、(予想どおりにエラーを報告するのではなく) クラッシュします。
ecpglibで、冗長なnewlocale()
呼び出しが回避されました。
(Noah Misch)
問い合わせごとにロケールオブジェクトを作成して解放するのではなく、最初の接続時にプロセスごとにCロケールオブジェクトを割り当てます。 これにより、AIXでのlibcメモリリークが軽減され、あらゆるプラットフォームでパフォーマンスが向上する可能性があります。
psqlの\watch
コマンドで、Ctrl+Cでキャンセルした後に改行をエコーするようになりました。
(Pavel Stehule)
これにより、libedit(およびおそらくlibreadline)でカーソルがどの列にあるかについて混乱するのを防ぎます。
pg_upgradeがアップグレード不可能なanyarray
を取る関数を検出するように修正されました。
(Justin Pryzby)
バージョン14では、いくつかの組み込み関数が、anyarray
ではなくanycompatiblearray
型を取るように変更されました。
これはほとんど透過的ですが、これらの関数の上に構築されたユーザ定義の集約関数と演算子は、正確に一致する型で宣言する必要があります。
古いシグネチャを参照するオブジェクトが存在すると、pg_upgradeが失敗する原因となるため、アップグレードを開始する前に、そのようなケースを検出して報告するように変更されました。
pg_upgradeで--clone
オプションを使用した場合にclone()
が失敗した後に誤ったエラー状態が報告される可能性がある問題が修正されました。
(Justin Pryzby)
contrib/pg_stat_statements
が32ビットプラットフォームでの非常に大きなクエリテキストファイルでの問題を回避するように修正されました。
(Tom Lane)
contrib/postgres_fdw
で、WITH CHECK OPTION
制約がある場合に一括挿入を防止するようになりました。
(Etsuro Fujita)
一度に複数の行が挿入されると、そのような制約は適切にチェックすることができませんでした。
contrib/postgres_fdw
が非同期データフェッチクエリの送信失敗を検出するように修正されました。
(Fujii Masao)
contrib/postgres_fdw
がregconfig
およびその他のreg*
タイプの定数を適切なスキーマ修飾で送信するようになりました。
(Tom Lane)
Linuxで動的共有メモリの割り当て中にシグナルをブロックするようになりました。 (Thomas Munro)
これにより、シグナルがposix_fallocate()
に割り込むときの問題が回避されます。
shm_open()
からの予期しないEEXIST
エラーを検出するようになりました。
(Thomas Munro)
これにより、Solarisで発生する可能性のあるクラッシュが回避されます。
illumosではsignalfd()
を使用しないようになりました。
(Thomas Munro)
これにより、ハングやカーネルパニックが発生するように見えるため、修正が利用可能になるまでこの機能は使用されません。