リリース日: 2022-05-12
このリリースは14.2に対し、様々な不具合を修正したものです。 14メジャーリリースにおける新機能については、E.6を参照してください。
14.Xからの移行ではダンプ/リストアは不要です。
ただし、(contrib/ltree
拡張によって提供される)ltree
型の列にGiSTインデックスがある場合、アップデート後にインデックスを再作成する必要があります。
以下の2番目の変更点を参照してください。
また、14.2より前のバージョンからアップグレードする場合には、E.4を参照してください。
「セキュリティ限定された操作」のサンドボックス内では追加操作を制限するようにしました。 (Sergey Shinderuk, Noah Misch)
自動VACUUM、CLUSTER
、CREATE INDEX
、REINDEX、
REFRESH MATERIALIZED VIEW
、pg_amcheckでは「セキュリティ限定された操作」による保護が有効化されるのが遅すぎたり、全く働かなかったりしていました。
データベース内に永続オブジェクトを作成する権限を持ったユーザは、スーパーユーザ権限で任意のSQLコードを実行するオブジェクトを定義できました。
仕込まれたSQLコードは、次に自動VACUUMが行われるときに、あるいは、スーパーユーザがそのオブジェクトに作用するいずれかのコマンドを実行したときに、実行されます。
PostgreSQLプロジェクトは本問題を報告してくれたAlexander Lakhinに感謝します。 (CVE-2022-1552)
gist_ltree_ops
のインデックスについて、デフォルトのシグネチャ長が修正されました。
(Tomas Vondra, Alexander Korotkov)
演算子クラスパラメータをサポートするように演算子クラスをアップグレードするときに、ltree
列に対するGiSTインデックスのデフォルトのシグネチャ長(ハッシュサイズ)が、意図せず変更されてしまいました。
最初からltree
拡張をバージョン1.2にアップグレードしている場合を除き、このようなインデックスに何らか操作が行われた場合、シグネチャ長が8バイトではなく28バイトと見做されて動作します。
したがって、おそらくそのインデックスは壊れています。
安全のためバージョンアップ後に全てのltree
の列に対するGiSTインデックスを再作成(REINDEX)することを推奨します。
なお、ltree[]
列、つまりltree
の配列のGiSTインデックスには影響しません。
素のテーブルを参照する行全体の値の列に対して、問い合わせで指定された列の別名を使わないようにしました。 (Tom Lane)
SELECT
リストの最上位以外でのtbl.*
などの行全体変数から作られたタプルの列名は、今後は、もしあるなら常に関連して名前付けされた複合型の要素名になります。
これまではFROM
のエントリに適用された全ての列の別名を追跡させるように試みていました。
しかし、それは意味的に非常に疑わしいもので、実際には変数の出力はそれが主張する複合型とは全く異なるからです。
この矛盾に対処するための以前の試みは、読み取り不可能なデータをディスクに保存することを含めて悪い結果をもたらしたので、このアイデア全体をあきらめました。
列名を付け直したい場合の本障害の回避策は、sub-SELECT
の階層を追加して、行全体の変数がsub-SELECT
の出力を参照して、素のテーブルを参照しないようにすることです。
そうすれば、変数は最初からrecord
型であり、問題は発生しません。
interval型からエポック値を抽出するときの誤った丸めが修正されました。 (Peter Eisentraut)
numeric
型を返すようになった新しいEXTRACT()
の実装コードで、誤ってDAYS_PER_YEAR
定数を整数型に変換して切り捨てていたため、13.xバージョン以前のfloat
型を返すコードと戻り値が異なっていました。
pg_stat_get_replication_slot(NULL)
実行時のクラッシュが防止されました。
(Andres Freund)
この関数はカタログデータでSTRICTと定義されるべきでしたが、バージョン14ではこれが指定されていなかったため、代替策として実行時のチェックが追加されました。
table_to_xmlschema()
などのXML関数におけるtimestamptz
型、timetz
型の誤った出力が修正されました。
(Renan Soares Lopes)
これらのデータ型に対するXMLスキーマ出力では文字列パターンの正規表現が壊れていました。
列数がゼロのVALUES
句のパーサ処理のクラッシュが回避されました。
(Tom Lane)
プランノードのResultがAppendノードのすぐ下にあらわれる場合のプランナのエラーやクラッシュが修正されました。 (Etsuro Fujita)
非同期リモートクエリをサポートするために最近追加されたコードはこのケースを処理できず、クラッシュや認識されないノードタイプに関するエラーが引き起こされました。
SEARCH
句またはCYCLE
句を使用するクエリに重複するテーブル式の名前が含まれている場合のプランナのエラーやクラッシュが修正されました。
(Tom Lane, Kyotaro Horiguchi)
再帰的なWITH
クエリの名前が自身の中で再利用されると、プランナがクラッシュしたり、「could not find attribute 2 in subquery targetlist」などの奇妙なエラーを報告したりする可能性がありました。
外側のクエリ階層を参照するGROUPING()
構文のプランナエラーが修正されました。
(Richard Guo, Tom Lane)
返却可能な列と返却不可能な列の両方を持つインデックスに対するインデックスオンリースキャンのプラン生成が修正されました。 (Tom Lane)
以前のコーディングでは、返却可能な列に加え、返却不可能な列も読み取ろうとする可能性がありました。 これは実際には無効な値に対して何も行わなかったためおよそ無害でしたが、最近追加されたエラーチェックでそのようなプランを拒否していました。
EvalPlanQualの実行中に古いタプルをロックしようとする際に、ピン(PIN)で固定されなくなった共有バッファにアクセスしないようになりました。 (Tom Lane)
従来コードはピンを解放した後、さらに数回バッファにアクセスしていました。 理論的には別プロセスがピンがなくなった時点ですぐにバッファを再利用し(あるいは、より可能性が高いのは、その空き領域をデフラグしようとし)、タプルの新しいバージョンを見つけるのに失敗する可能性があります。
再並べ替えを実行しているIndexScanノードでの、クエリ存続期間におけるメモリリークが修正されました。 (Aliaksandr Kalenik)
関数の並列性属性とSET
変数リストを同じコマンドで変更できるようにALTER FUNCTION
が修正されました。
(Tom Lane)
一つのALTER FUNCTION
コマンドで関数のSET
句も更新した場合、並列性属性の変更が失われていました。
制約に「所有されている」インデックスの検出が厳格化されました。 (Tom Lane, Japin Li)
一部のコードパスで、外部キー制約が依存しているインデックスを、ユニーク制約または主キー制約によって所有されているインデックスと取り違えていました。
その結果、外部キー制約を持つテーブルに対する特定のALTER TABLE
操作に際して、奇妙なエラーが発生していました。
テーブルのシステム列を変更しようとすると、間違ったエラーが発生する問題が修正されました。 (Tom Lane)
システムはそれができないことを通知するべきですが、代わりに「no owned sequence found」を報告する場合がありました。
先頭キーが式であるインデックスを使用してCLUSTER
処理を行った場合に、テーブルの行が誤った並べ替えになる問題が修正されました。
(Peter Geoghegan, Thomas Munro)
テーブルは正しいデータで再構築されますが、インデックスの順序とはほとんど関係のない順序になりました。
ソートされたGiSTインデックスのビルド直後にシステムクラッシュが発生した場合のデータ損失が防止されました。 (Heikki Linnakangas)
ソートを使用してGiSTインデックスを構築するコードパスは、完了時にファイルのfsync
を怠っていました。
このため、その後すぐにオペレーティングシステムがクラッシュした場合、インデックスが破損する可能性がありました。
パーティション化されたインデックスを削除する際にデッドロックエラーのリスクがあり、修正されました。 (Jimmy Yih, Gaurab Dey, Tom Lane)
必要なテーブルとインデックスのロックが確実に標準的な順序(子の前に親、インデックスの前にテーブル)で取られるようになりました。
DROP INDEX
の以前のコーディングでは、これとは異なる方法でロックを取っていたため、標準的な順序でこれらのロックを取る同時実行の問い合わせに対してデッドロックが発生する可能性がありました。
DROP TABLESPACE
とチェックポイントの間の競合状態が修正されました。
(Nathan Bossart)
DROP TABLESPACE
によって強制されるチェックポイントが、テーブルスペースのディレクトリからすべてのデッドファイルを削除することに失敗して、「tablespace is not empty」のような偽のエラーが発生する場合がありました。
チェックポイント実行と並行してTRUNCATE
コマンドを実行した後に、クラッシュリカバリが失敗する可能性があり、修正されました。
(Kyotaro Horiguchi, Heikki Linnakangas, Robert Haas)
チェックポイントが完了できるようになる前に、テーブルのディスクファイルが全削除されることをTRUNCATE
は保証しなければなりません。
そうでないと、そのチェックポイントから開始したリプレイが、削除されているはずのページの予期せぬデータを見つけて、リプレイ失敗を引き起こすおそれがありました。
一時オブジェクト削除中における安全でないTOASTデータアクセスが修正されました。 (Andres Freund)
サーバプロセス終了時に「FATAL: cannot fetch toast data without an active snapshot」のエラーを出して、一時オブジェクトの削除に失敗することがありました。 次に一時スキーマを使う際に正常にクリーンアップされるため、通常は無害です。
カスタム設定名の最初の文字に_
(アンダースコア)が再度使えるようになりました。
(Japin Li)
バージョン14ではそのような名前が意図せず使えなくなってしまっていました。
compute_query_id
設定に指定可能な値としてregress
が追加されました。
(Michael Paquier)
これはテストを容易にすることを目的としており、クエリIDが計算されるけれどもEXPLAIN
の出力には表示されません。
RegisterSyncRequestの待機ロジックが改善されました。 (Thomas Munro)
その中でcheckpointerプロセスへの同期要求キューが溢れた場合(実際のシステムでは滅多に発生しないことを願っていますが、非常に小さいバッファプールでテストする場合は一般的です)、その待ち行列が無くなるのを待ちます。 待機中は、ユーザーが何が起こっているかを知るために待機イベントとして報告する必要があります。 また、checkpointerプロセスが既に終了している場合にループが終了しない可能性があるためpostmasterプロセスの終了を監視する必要があります。
書き込みと書き込みの間でcheckpointerプロセスが待機しているときにはラッチイベントを起こすようになりました。 (Thomas Munro)
これは同期リクエストを送信するバックエンドの反応性を改善します。 更にこの待機に対応した適切な待機イベントクラスも追加されました。
WALの後続レコードが欠けている時にスタンバイを昇格すると「PANIC: xlog flush request is not satisfied」が発生する問題が修正されました。 (Sami Imseih)
ホットスタンバイのコンフリクトを処理する際に自己デッドロックが起きる可能性があり、修正されました。 (Andres Freund)
不運なタイミングのとき、WALを適用するプロセスが他プロセスのバッファロックの解放を待って、動作が止まってしまう可能性がありました。
ロジカルレプリケーションの変更を送信する際、パーティションの先祖関係を間違ってしまう可能性があり、修正されました。 (Tomas Vondra, Hou zj, Amit Kapila)
publish_via_partition_root
オプションが有効に指定されていて、更新するリレーションに対する異なる先祖で指定された複数のパブリケーションがある場合(即ち親子関係にあるリレーション各々にパブリケーションを作っている場合)、サブスクリプションへの変更の報告に際して間違った先祖リレーションを選択することがありました。
max_sync_workers_per_subscription
設定の制限に抵触する場合でもロジカルレプリケーションのapply workerプロセスが再起動されるようになりました。
(Amit Kapila)
本設定に対する上限検査コードの欠陥により、これまでは再起動されたワーカを直ぐに終了してしまっていて、ほとんどのワーカが存続できませんでした。
UPDATEに対して、変更されていないレプリカアイデンティティ(REPLICA IDENTITY)のキー列を、それが外部TOAST格納されている場合にはWALログに含めるようになりました。 (Dilip Kumar, Amit Kapila)
この対処をしないと、サブスクライバはその値を見ることができないので、更新を正しく複製できないことになります。
ps(1)コマンドにおけるサーバプロセス表示の置き換えに対応していないプラットフォームを適切に処理できるようになりました。 (Andrew Dunstan)
このようなプラットフォームはほとんど無かったため、これまでリファクタリングが潜在的なメモリ破壊をもたらすことに気づかれませんでした。 サポートされているプラットフォームで該当する唯一のものはCygwinで、バックエンドプロセスのクラッシュが報告されました。
タイマ割り込みの見逃しに対して、サーバがより頑健になりました。 (Michael Harris, Tom Lane)
バージョン14で追加された最適化は、なんらかの理由でサーバプロセスがタイマ割り込みを逃してしまった場合は他についてもカーネルに要求を繰り返さないというもので、セッションの以降においてタイムアウト検出に失敗することになりました。 これでは脆弱すぎると判断され、リカバリパスが追加されました。
PL/Perl関数のコンパイル時にSPI関数は実行できないようになりました。 (Tom Lane)
PL/Perl関数のコンパイル時にはPerlはユーザ定義コードを実行すると考えられます。 しかしながら、SPI経由のSQL操作を行うコードは望ましくありません。 関数の検証に際して本当にコード実行をしたくないので、クラッシュしなければセキュリティ上の危険がありました。 そこで、代わりに親切なエラーメッセージを出す検査が加えられました。
libpqがroot所有のSSL秘密鍵ファイルを受け入れるようになりました。 (David Steele)
この変更により、libpqのSSL鍵ファイルの所有者とアクセス許可の安全チェックが、バージョン9.6以降のサーバと統一されます。
すなわち、現在のルールに加え、鍵ファイルの所有者がrootであって、パーミッションがrw-r-----
以下の場合を許容するようになりました。
これは、鍵ファイルのシステム全体での管理に役立ちます。
libpqのPQisBusy()
関数の接続エラー後の動作が修正されました。
(Tom Lane)
書き込みエラーを検出した場合、PQisBusy()
は常に真を返しましたが、これは誤りでした。
サーバから何か読み取れるまで、通常は入力処理を継続したいところでした。
この障害の実際の影響は、libpqの非同期クエリAPIを使用するアプリケーションが、PQconsumeInput()
が致命的なエラーを返した場合にしか接続断を検出しないことです。
この修正により、接続断が順当にエラーのPGresult
オブジェクトを介して報告されるようになりました。
これはほとんどのアプリケーションにとって相応しい動作です。
psql、pg_dump、およびpg_amcheckでデータベース
.スキーマ
.テーブル
という構文を再度許容するようになりました
(Mark Dilger)
14より前のバージョンは、2つ以上の.
(ドット)を含むパターンにおけるスキーマ
とテーブル
以外の全ての修飾名を黙って無視していました。
バージョン14でのリファクタリングの誤りで、そのユースケースがエラーになるようになってしまいました。
本バージョンで復活しましたが、先頭の修飾名がカレントデータベースの名前と一致しない場合にはエラーが発生します。
pg_ctlは、stop/restart/promoteの動作を待機している間、postmasterプロセスが動作していることを再チェックするようになりました。 (Tom Lane)
pg_ctlは、stopまたはpromoteシグナルを送信する一方でpostmasterプロセスが動作していること(PIDが有効であるか)を1回確認しますが、その後は単純にPIDファイルが削除されるまで待機していました。 postmasterがPIDファイルを削除したり、制御ファイルを更新したりせず、非正常に終了した場合、pg_ctlはタイムアウトになるまで待機していました。 これに替えてpostmasterプロセスがまだ存在しているかをときどき再チェックするようになりました。
pg_waldumpのエラー処理が修正されました。 (Kyotaro Horiguchi, Andres Freund)
WALセグメントサイズを知るためにWALファイルを読み取ったとき、短すぎるファイルの場合にpg_waldumpは誤ったエラー報告をしていました。 また、このエラーメッセージおよび関連するエラーメッセージで報告されるファイル名は無効である可能性がありました。
contrib/pageinspect
の関数が全てゼロのページに対応するようになりました。
(Michael Paquier)
これは正当な境界条件的ケースでしたが、このモジュールではほぼ想定されていませんでした。 必要に応じて、NULLを返すか、行を返さないように変更されました。 これは、エラーを発生させるよりも有効です。
contrib/pageinspect
で、破損したページの「特別な領域」に対する保護を追加し、正しいページサイズのチェックを強化し、不足していたインデックスの型チェックが追加されました。
(Michael Paquier, Justin Pryzby, Julien Rouhaud)
これらの変更により、モジュールが不良データでクラッシュする可能性が低くなりました。
contrib/postgres_fdw
でBEFORE INSERT ... FOR EACH ROW
トリガが外部テーブルに存在する場合、バッチ挿入が無効にされました。
(Etsuro Fujita)
このようなトリガはテーブルを照会する際、手前で挿入した行を参照するかもしれません。 バッチ挿入では、これらの行がまだ可視となってない可能性があるため、予期せぬ動作を回避するため、無効にされました。
contrib/postgres_fdw
で、リモートで順序付けされたクエリを要求する前にORDER BY
句が安全に渡せることを検証し、必要に応じてUSING
句を含めるようになりました。
(Ronan Dunklau)
この修正はリモートサーバが意図と異なる順序で並べ替えるケースを防止します。 これは見た目だけの場合もありますが、リモートデータがローカルで実行されるマージ結合の入力として使用されると、完全に間違った結果が生じる可能性がありました。
sys/epoll.h
があり、sys/signalfd.h
はないプラットフォームを扱えるようにconfigureが修正されました。
(Tom Lane)
LLVM 14で動作するようにJITコードが更新されました。 (Thomas Munro)
clangの-fsanitize=undefined
オプションで様々な障害をクリーンアップするようになりました。
(Tom Lane, Andres Freund, Zhihong Yu)
これらの変更のほとんどは、CおよびPOSIX標準の文書に型通りに準拠するためのものであり、本番ビルドに影響を与える可能性はほとんどありません。
OpenSSLなしでビルドする場合は、libpqのpkg-config
ファイルにOpenSSLの依存関係を追加しないように修正されました。
(Fabrice Fontaine)
式の中にネストされたステートメントをサポートしないCコンパイラでビルドできるようにPL/Perlが修正されました。 (Tom Lane)
WindowsでビルドにMSVCを使用していない場合に、pg_dumpallのビルドエラーが発生する可能性があり、修正されました。 (Andres Freund)
Windowsビルドでは、pexportsの代わりにgendefを使用してDEFファイルを作るようになりました。 (Andrew Dunstan)
これにより、ビルドプロセスが最新のMSysツールチェーンで機能するように調整されました。
MinGWでビルドされたプログラムでの余分なワイルドカードパターンの展開が防止されました。 (Andrew Dunstan)
何らかの理由で、MinGWによって提供されるCライブラリは、デフォルトでプログラムのコマンドライン引数のシェルワイルドカード文字を展開してしまいます。 MSVCでは特に発生しないため、これは混乱を招くのでパターン展開が無効化されました。
タイムゾーンデータファイルがtzdatarelease 2022aに更新されました。 パレスチナでの夏時間法の変更に加えて、チリ、ウクライナの歴史的修正が含まれます。