このリリースは 12.9 からの修正リリース(2022年2月10日リリース)です。
12.X からのアップデートではダンプ、リストアは不要です。
しかしながら、本リリースで修正されたいくつかの障害により既にインデックスに破損が生じている可能性があるため、該当するインデックスを再構築することが推奨されます。
また、12.9 よりも前のバージョンから移行する場合には 12.9 のリリース情報も確認してください。
PostgreSQL 12.9 から 12.10 への変更点
14.2、13.6、12.10、11.15、10.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- REINDEX CONCURRENTLY の問題を防止するため、TOAST テーブルの更新に標準のロックプロトコルが適用されました。 (Michael Paquier) (14)(13)(12)
- ページプルーニング中に RECENTLY_DEAD タプルが状態を完全に DEAD に変更した時の HOTチェーンの破損が修正されました。 (Andres Freund) (14)
- ローカルパーミッションと外部パーティションが混在するテーブルのEvalPlanQual再チェックでのクラッシュが修正されました。 (Etsuro Fujita) (14)
- COPY TO でのメモリ処理の誤りが修正されました。 (Bharath Rupireddy) (14)
- 同時に DROP STATISTICS で統計オブジェクトが削除された時に発生する ALTER STATISTICS での NULLポインタ参照によるクラッシュが回避されました。 (Tomas Vondra) (14)(13)
- マルチ範囲型データから範囲を抽出する際に、アライメントのパディングが正しく処理されるようになりました。 (Alexander Korotkov) (14)
- 無名 RECORD データ型に対するハッシュの過度な楽観的使用が修正されました。 (Tom Lane) (14)
- パラレルで単一の子ノードを持つ Appendノードに対する誤ったプラン作成が修正されました。 (David Rowley) (14)(13)(12)
- インデックスに返却不能の列が含まれる場合について、インデックスオンリースキャンプランが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- Memoize の上位からきたパラメータを使用するサブプランを処理できるように、Memoizeプランノードが修正されました。 (David Rowley) (14)
- Memoizeプランノードがハッシュ不可能な結合の演算子で正しく動作するように修正されました。 (David Rowley) (14)
- 指定されていない型修飾へのキャストにより、長さの強制関数の呼び出しではなく、RelabelTypeノードが生成されるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
- anycompatible で始まる名前の疑似データ型(以下「anicompatible*」と記載)について一致判定が修正されました。 (Tom Lane) (14)(13)
- ちょうど WALページの境界でデータベースが整合性を持つ状態に到達した場合の、WALリプレイ失敗が修正されました。 (Álvaro Herrera) (14)(13)(12)(11)(10)
- 物理ストリーミングレプリケーションのスタンバイサーバの startup処理がトランザクションID 周回を許容するように修正されました。 (Abhijit Menon-Sen, Tomas Vondra) (14)(13)(12)(11)(10)
- ロジカルレプリケーションで子テーブルのデータの二重送信が回避されるようになりました。 (Hou Zhijie) (14)(13)
- ロジカルレプリケーション接続で発行される SQLコマンドの字句制限が撤廃されました。 (Tom Lane) (14)(13)(12)(11)(10)
- ROLLBACK PREPARED 操作のレプリケーションに際して、レプリケーション元のタイムスタンプが確実に設定されるようになりました。 (Masahiko Sawada) (14)
- トランザクションの最後のサブトランザクションのコミットタイムスタンプが記録されない可能性があり、修正されました。 (Alex Kingsborough, Kyotaro Horiguchi) (14)(13)(12)(11)(10)
- チェックポイントに際して、pg_logical/mappingsサブディレクトリを必ず fsync するようになりました。 (Nathan Bossart) (14)(13)(12)(11)(10)
- パーティションテーブルの拡張統計情報が作成されるようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
- 継承ツリーの拡張統計情報を無視するようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
- パーティションテーブルの行型が他の場所で複合型として使用されている場合、パーティションテーブルの列のデータ型を変更することが禁止されました。 (Tom Lane) (14)(13)(12)(11)(10)
- レプリカアイデンティティ(REPLICA IDENTITY) のインデックスの一部である列に対する ALTER TABLE ... DROP NOT NULL が禁止されました。 (Haiying Tang, Hou Zhijie) (14)(13)(12)(11)(10)
- ALTER TABLE .. ADD PRIMARY KEY USING INDEX の実行に際して、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Hou Zhijie) (14)(13)(12)(11)
- REPLICA IDENTITY インデックスから切り替えを行う際、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Tang Haiying, Hou Zhijie) (14)(13)(12)(11)(10)
- SP-GiSTインデックス作成で、インデックス対象列のデータ型が演算子クラスの宣言された入力型とバイナリ互換性がある場合でもエラーとなっていたのが修正されました。 (Tom Lane) (14)
- 最も古い xmin値を計算する際、並列のバキュームとインデックス同時構築を無視できるようにようになりました。 (Masahiko Sawada) (14)(13)
- 式インデックスを更新するときのメモリリークが修正されました。 (Peter Geoghegan) (14)
- 多数のオブジェクトの所有権を変更する REASSIGN OWNED BY コマンド実行中にメモリリークが発生しないように修正されました。 (Justin Pryzby) (14)(13)(12)(11)(10)
- 不要なキャッシュアクセスを回避することにより、ロジカル変更を送信する walsender のパフォーマンスが向上しました。 (Hou Zhijie) (14)(13)
- pg_hba_file_rules ビューでの cert認証方式のオプションの表示が修正されました。 (Magnus Hagander) (14)(13)(12)
- pg_log_backend_memory_contexts() で対象とされるセッションが、結果をサーバのログのみに送信するよう修正されました。 (Fujii Masao) (14)
- INSERT .. VALUES のルールにおける行全体の変数の表示方法が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- SQL標準の関数本体を逆コンパイルによって再構築したときに、INSERT ... SELECT 内の関数パラメータが適切に表示されるようになりました。 (Tom Lane) (14)
- 空文字列に対して Unicode 文字列正規化を適用する場合の 1バイトのバッファオーバーランが修正されました。 (Michael Paquier) (14)(13)
- いくつかの誤ったアサートが修正または削除されました。 (Simon Riggs, Michael Paquier, Alexander Lakhin) (14)(13)(12)(11)(10)
- libpq と ecpglib でマルチスレッド使用時における gettext() 初期化の競合状態が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- libpq の PQcancel関数から strerror を呼び出さないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
- psql の \password コマンドで設定するパスワードは、接続元のユーザのものではなく、CURRENT_USER のものがデフォルトとなりました。 (Tom Lane) (14)(13)(12)(11)(10)
- 親テーブルのトリガを識別するように psql の \d コマンドのクエリが修正されました。 (Justin Pryzby) (14)(13)
- psql の \d コマンドで、テーブルの拡張統計オブジェクトが OID でなく名前でソートされるようになりました。 (Justin Pryzby) (14)
- psql の列挙型のラベルをタブを使って補完する機能が修正されました。 (Tom Lane) (14)(13)
- Windows の標準入力からの読み込みをデータソースまたは宛先に使用したときの障害が修正されました。 (Dmitry Koval, Juan Jose Santamaria Flecha, Michael Paquier) (14)
- psql や 他のクライアントプログラムでは、Ctrl+C シグナルハンドラからのgettext() 呼び出しを避けるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
- pg_receivewal と pg_recvlogical の初期パスワード入力がキャンセルできるようになりました。 (Tom Lane, Nathan Bossart) (14)(13)(12)(11)(10)
- pg_dump がユーザ定義キャストをダンプするときの順序が、TYPE の直後、FUNCTION の手前に修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- pg_dump の --inserts と --column-inserts モードが修正され、以前削除された列と生成列の両方を含むテーブルを扱えるようになりました。 (Tom Lane) (14)(13)(12)
- pg_dump と pg_basebackup での誤ったエラー報告の可能性が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- char(N) 列に対する contrib/btree_gist のインデックスによるインデックスオンリースキャン結果が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
- postgres_fdw の非同期クエリの処理における稀なケースが修正されました。 (Etsuro Fujita) (14)
- PL/Pythonの ビルド方法を決定するために、非推奨の distutils モジュールではなく、Python の sysconfig モジュールを使用するように configure が変更されました。 (Peter Eisentraut, Tom Lane, Andres Freund) (14)(13)(12)(11)(10)
- OpenSSL なしでクロスコンパイルが再度可能となりました。 (Tom Lane) (14)
- Windows 環境で Perl 5.28 以降を使用する PL/Perl コンパイルの失敗が修正されました。 (Victor Wagner) (14)(13)(12)(11)(10)
- Python 3.11 以降での PL/Python コンパイルの失敗が修正されました。 (Peter Eisentraut) (14)(13)(12)(11)(10)
- Visual Studio 2022 を使用したビルドがサポートされました。 (Hans Buschmann) (14)(13)(12)(11)(10)
- MSVC ビルドシステムで .bat ラッパースクリプトを事前にディレクトリに移動することなく呼び出せるようになりました。 (Anton Voloshin, Andrew Dunstan) (14)(13)(12)(11)(10)
REINDEX CONCURRENTLY を TOASTテーブルまたは TOASTテーブルのインデックスに 適用した場合、破損したインデックスを生成することがよくありました。これは TOASTエントリを更新するセッションが、他の更新の動作と同様にトランザクションがコミットされるまで ROW EXCLUSIVE ロックを保持するのではなく、ROW EXCLUSIVE ロックをすぐに解放したために発生しました。今回 TOAST 更新が通常のルールに従ってテーブルロックを保持するよう修正されました。既存の破損したインデックスは、再度 REINDEX を実行することで修復できます。
VACUUM では、それを指すリダイレクトアイテムが残っている状態で RECENTLY_DEAD のタプルを削除することがありえました。そのようなタプルのアイテムスロットが後に新しいタプルで再利用されると、既存の HOTチェーンの一部とみなされ、インデックス破損が形成されます。
発生した場合はテーブルのインデックス再作成で修復できます。しかし、これは非常に確率の低いシナリオであるため、発生したかもしれないという可能性だけでインデックスを再作成することは推奨されません。
EvalPlanQual再チェックは READ COMMITTED 隔離レベルの問い合わせで使われる処理です。
この見落としにより、COPY でエラーが発生した後、誤ったエラーメッセージやクラッシュが発生することがありました。
この誤りは可変長データ型のマルチ範囲を処理する際にクラッシュを引き起こす可能性がありました。
これにより、「ERROR: could not identify a hash function for type record」(型レコードのハッシュ関数を識別できない)のエラーが防止されます。
場合によっては、Append が単純化されるべきではない時に単純化され、誤った問い合わせ結果(重複した行)が発生することがありました。
単一の子ノードを持つ Appendノードは、例えば「SELECT id, c FROM t1 UNION ALL SELECT id, c FROM t2 WHERE false」といった形を持つ問い合わせのプランで出現する可能性がありました。
インデックスの列にはインデックスオンリースキャンで返すことができるか(返却可能列か返却不能列か)を示す、returnable属性があります。
インデックスが返却可能列と返却不能列の両方を持ち、返却不能列の 1つが返却可能列にあらわれるテーブル列を使用した式である場合、その式を使用した問い合わせは、返却可能列から式を再計算するのではなく、返却不能列を読もうとするインデックスオンリースキャンプランとなる可能性がありました。返却不能列は NULL として読み込まれるため、誤った問い合わせ結果が発生しました。
(障害動作例/ここでの lower(c) は返却不能列) db=# CREATE TABLE t9 (c text); db=# INSERT INTO t9 VALUES (md5('A')), (md5('B')); db=# CREATE INDEX ON t9 USING gist(lower(c) gist_trgm_ops) INCLUDE (c); db=# SET enable_seqscan TO off; db=# \pset null *NULL* db=# SELECT lower(c), c FROM t9; lower | c --------+---------------------------------- *NULL* | 7fc56270e7a70fa81a5935b72eacbe29 *NULL* | 9d5ed678fe57bcca610140957afab571 (2 rows)
この障害により誤った問い合わせ結果が生じるケースが報告されました。
結合条件に不等号を使っている場合や浮動小数点データ型で 0.0 と -0.0 がある場合などで問題が生じました。この障害により、クラッシュや誤った問い合わせ結果が生じる可能性があります。
強制関数は正しい動作(何もしないこと)を実行しますが、この変換は非効率で望ましくありません。
character(N) 型を bpchar 型にキャストする場合が該当します。
anicompatible* 型の多相パラメータを持つ関数や演算子が、実際には本当は一致しないはずの引数の集合に一致したと、パーサが誤判断することがありました。
報告されたケースでは、一つの呼び出しに複数の演算子を一致させることになり、「ERROR: operator is not unique: ...」「HINT: Could not choose a best candidate operator. You might need to add explicit type casts.」などのあいまいな演算子だというエラーを引き起こしました。一方、より後の処理段階でエラーを起こすこともあり得ました。
修正されませんが、これは 9.6.x でも該当します。
プライマリ上のアクティブなトランザクションのセットが周回境界を越えている間にスタンバイサーバが起動すると(古いトランザクションよりも小さい XID を持つ新しいトランザクションがいくつか存在するため)、「ERROR: out-of-order XID insertion in KnownAssignedXids」エラーが生じました。再試行されますがこのエラーを乗り越えることはできません。
パブリケーションに子テーブルと親テーブルの両方が含まれ、publish_via_partition_root オプションが設定されている場合、サブスクライバは子テーブルと親テーブルの両方で無駄な同期を開始していました。このような場合は親テーブルのみが同期されるようになりました。
これまでは、引用符で囲まれていないセミコロンを含む SQLコマンド、奇数の一重引用符または二重引用符を含むドル引用符で囲まれたリテラル、または SQLコマンドがコメントで始まる場合、walsenderプロセスがエラーを起こしました。
さらに、不完全なエラーからの回復処理により以降のコマンドでも予期せぬエラーが発生する可能性がありました。
一部のファイルシステムでは、この見落としによりシステムクラッシュ後に論理書き換えの状態ファイルが失われる可能性がありました。
以前のバグ修正により、古い形式の継承ツリーに対する拡張統計の構築が無効になりましたが、パーティションテーブルに対する構築も無効になっており、不要な制限となっていました。今回の変更により、ANALYZE はパーティションテーブルの統計オブジェクトの値を計算できるようになりました。(しかし、autovacuum はパーティションテーブルを自動処理しないので、パーティションテーブルの統計情報を維持したい場合は、パーティションテーブルに対して定期的に手動 ANALYZE を実行する必要があることに注意してください。)
現在、拡張統計情報の値は継承ツリー全体ではなく各テーブルに対してローカルでのみ計算されます。しかし、この値が継承ツリーをまたがる問い合わせを計画する際に誤って参照されたため、デフォルトよりも悪い推定値になる可能性がありました。
この制限は通常のテーブルでは長い間存在していましたが、見落としによりパーティションテーブルではチェックされていませんでした。
同じ禁止事項はすでに主キーインデックスに存在していました。
同時実行中のセッションが、テーブルに主キーがあるかどうかに関する判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。
パブリケーションしているテーブルの UPDATE で、テーブルに ALTER TABLE で主キーを設定した後であっても、以下エラーが発生する動作が報告されました。
ERROR: cannot update table ... because it does not have a replica identity and publishes updates
同時実行中のセッションが、どのインデックスが REPLICA IDENTITY であるかの判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。
このような場合は動作すべきでしたが以下のエラーが発生していました。
ERROR: compress method must be defined when leaf type is different from input type
並列化されていない処理では既に無視されていましたが、並列化されたロジックでは機能していませんでした。その結果、xmin の限界値の前進が抑えられることで、バキュームのクリーンアップが遅れるなどの望ましくない影響がありました。
式インデックスを持つテーブルの多くの行を更新する UPDATE 文は、大量のメモリを消費する可能性がありました。
認証方式が cert の場合、clientcert=verify-full が暗黙的に指定されますが、pg_hba_file_rules ビューは誤って clientcert=verify-ca と報告していました。
以前は、client_min_messages のレベルを高く設定すると、接続しているクライアントにもログメッセージが送信される可能性がありました。これはクライアントが要求していない動作です(そしておそらくワイヤープロトコル違反でした)。
行全体の変数は、var.* として出力されますが、ルールが再ロードされたときに個々の列に展開されるため、異なるセマンティクスとなっていました。これを防ぐために他の場所と同様に明示的なキャストが行われるようになりました。
これまでは、パラメータに名前が付いていても $n と出力されていました。
これによる実際の影響は、アライメントを考慮すれば限定的なものですが、デバッグビルドでは警告が発生していました。
これらの誤りは、製品ビルドではなく、デバッグビルドのみ影響を受けました。
エラーメッセージのローカライズに失敗する可能性がありました。
PQcancel はシグナルハンドラから安全に呼び出すことができるはずですが、strerror は安全ではありません。誤った使用法は、サーバへのキャンセルメッセージ送信に失敗した場合にのみ発生しますので、そのためおそらくこれまで報告がありませんでした。
これはドキュメントの動作と一致し、セッション開始後の SET ROLE または SET SESSION AUTHORIZATION を実行した場合に発生し得るパーミッションエラーを避けます。また、混乱を防ぐために操作対象のロール名がパスワードプロンプトに含まれるようになりました。
パーティションにトリガがあり、親テーブルにも同じ名前の無関係な文レベルトリガが存在した場合、以前のコードでは「ERROR: more than one row returned by a subquery used as an expression」というエラーが発生していました。
これは、psql の \copy コマンド、または pg_recvlogical で「-f -」を付けた場合に影響がありました。「could not stat file」エラーが発生しました。
この誤りに起因する障害報告は確認されていませんが、gettext() は非同期シグナル安全な関数ではなく、安全とは言えません。
以前は、パスワード入力を求められている間、Ctrl+C でこれらのプログラムを終了することができませんでした。
まれに、出力スクリプトがユーザ定義キャストを作成する前に参照してしまう場合がありました。
以前のコードでは、一部のカーネル呼び出しからのエラーをチェックできず、他のケースでは誤った errno 値を報告する可能性がありました。
インデックスオンリースキャンでは末尾の空白が削除された列値が返されましたが、これはインデックス格納方法に起因したもので、想定の動作ではありませんでした。末尾空白の違いだけですが誤った問い合わせ結果です。
空白埋めをした char(N) 値を格納するようにコードが修正されました。インデックスの動作は REINDEX をしない限りすぐには反映されません。 REINDEX(インデックス再作成)をしない場合、空白が削除された値は、更新を行っていくなかで徐々に置き換えられていきます。インデックスオンリースキャン実行計画を使用しない問い合わせは、どの場合でも影響を受けません。
これらのエラーは、外部テーブルのスキャンを並列化しようとすると、クラッシュまたは誤った問い合わせ結果を引き起こす可能性がありました。
これにより Python 3.10 では distutils が非推奨になり Python 3.12 での削除が予定されている configure-time の警告が回避されます。 おそらく、Python 3.12 以降では configure --with-python は完全に失敗します。
sysconfig が Python 2.7 より前、また、Python 3.2 より前にも存在しなかったため、古くなった Python バージョンでの PL/Python のビルドはもはやできなくなります。
configure ではターゲットシステムで /dev/urandom が使用可能であるはずと想定すべきでしたが、代わりに configure が失敗していました。