このリリースは 9.6.18 からの修正リリース(2020年8月13日リリース)です。9.6.x からのアップデートではダンプ、リストアは不要です。ただし、9.6.16よりも前のバージョンからアップデートする場合には、9.6.16 のリリース情報も参照してください。
PostgreSQL 9.6.18 から 9.6.19 への変更点
12.4、11.9、10.14、9.6.19、9.5.23 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- 論理レプリケーションの walsender と apply worker で、search_path を安全な設定で上書きするようになりました。 (Noah Misch) (12)(11)(10)
- contribモジュールのインストールスクリプトをより安全にしました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- パーティション除外処理の境界ケースについて修正されました。 (Etsuro Fujita, Dmitry Dolgov) (12)(11)
- パーティション同士の入れ子ループ結合の内部でパラメータ化されたBitmapAnd と BitmapOr のインデックススキャンの構造が修正されました。 (Tom Lane) (12)(11)
- パーティショニングテーブルが同一の問い合わせで静的パーティショニング除外と実行時パーティショニング除外の両方の対象で、かつ、問い合わせと同時に新しいパーティションが追加された場合に誤った計画が実行されることがあり、修正されました。 (Amit Langote, Tom Lane) (12)
- 論理レプリケーションの walsender で、キープアライブメッセージ送信の後にフィードバックメッセージを送信できなかったのが修正されました。 (Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
- 論理レプリケーションのサブスクライバにおける、列指定 UPDATEトリガの起動が修正されました。 (Tom Lane) (12)(11)(10)
- pg_replication_slot_advance() の実行中に最も古い xmin値とLSN値が更新されるようになりました。 (Michael Paquier) (12)(11)
- ts_headline() の実行遅延が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
- repeat() 関数がクエリキャンセルで確実に中断できるようになりました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)
- Windows上での結果にキャリッジリターン("\r")が含まれないようにpg_current_logfile() が修正されました。 (Tom Lane) (12)(11)(10)
- pg_read_file() と関連する関数が EOF に達するまで確実に読み込まれるようになりました。 (Joe Conway) (12)(11)
- jsonpath の計算で数値の「NaN」値が禁止されました。 (Alexander Korotkov) (12)
- 浮動小数点の集約で、単一の「Inf」または「NaN」の入力が正しく処理されるようになりました。 (Tom Lane) (12)
- 数値型列のパラレル集計時の「NaN」入力の処理が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
- 24時間を超えて表現された時刻を拒否するようになりました。 (Tom Lane) (12)(11)(10)
- EXPLAIN の非テキスト出力フォーマット(JSON等)において、インデックス名に余計なダブルクォートを付けなくなりました。 (Tom Lane, Euler Taveira) (12)(11)(10)(9.6)(9.5)
- Gather Merge を使用している実行計画のパラレルワーカにおいて、EXPLAIN のリソース使用量、特にバッファアクセスに関するリソース使用量の計算が修正されました。 (Jehan-Guillaume de Rorthais) (12)(11)(10)
- ALTER TABLE における制約の再検証のタイミングが修正されました。 (David Rowley) (12)(11)(10)(9.6)(9.5)
- インデックスのレプリカアイデンティティのフラグを保持するようにREINDEX CONCURRENTLY が修正されました。 (Michael Paquier) (12)
- pg_subscription.subslotname と pg_subscription_rel.srsublsn の不正確な非NULLの印付けが修正されました。 (Tom Lane) (12)(11)(10)
- FROM句にある平坦化されていない副問合せに付加された条件句でLATERAL参照が正常に使えるようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- 選択度推定中に呼び出された演算子にクエリ指定の照合順序を使用するようになりました。 (Tom Lane) (12)
- 一度も ANALYZE されていない外部テーブルのタプルを 0行と想定しないようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- BRINインデックスの要約情報の展開で「WARNING: leftover placeholder tuple detected in BRIN index "..."」という偽りの警告が削除されました。 (Álvaro Herrera) (12)(11)(10)
- 共有ファイルセットの一時ファイルが配置されるテーブルスペースの選択が修正されました。 (Magnus Hagander, Tom Lane) (12)(11)
- WALの整合性をチェックする時の SP-GISTインデックスページのマスキングにおいて稀な場合に発生するエラーが修正されました。 (Alexander Korotkov) (12)(11)
- サーバの buffileモジュールでのエラー処理が改善されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)
- SERIALIZABLE モードでのコンフリクトチェックの異常を修正しました。 (Peter Geoghegan) (12)(11)(10)(9.6)(9.5)
- デッド状態の btreeインデックスエントリを繰り返しデッド判定しないように修正されました。 (Masahiko Sawada) (12)(11)(10)(9.6)(9.5)
- fsync が無効の場合に、ファイル同期リクエストを破棄するように、checkpointer プロセスが修正されました。 (Heikki Linnakangas) (12)
- バックアップ中に JITコンパイルを動作させたときに、非排他的ベースバックアップのクリーンアップ処理中に問題が生じることがあり、回避されました。 (Robert Haas) (12)(11)
- pg_control の変更前に正しいロックを取得するように、一部のコードパスの問題が修正されました。 (Nathan Bossart, Fujii Masao) (12)(11)(10)(9.6)(9.5)
- 関数 currtid() および currtid2() のエラーが修正されました。 (Michael Paquier) (12)(11)(10)(9.6)(9.5)
- スピンロックの取得中に elog() または palloc() を呼び出さないように修正されました。 (Michael Paquier, Tom Lane) (12)(11)(10)(9.6)(9.5)
- 論理レプリケーションのサブスクライバで「REPLICA IDENTITY FULL」が使用できるように、アサートが修正されました。 (Euler Taveira) (12)(11)(10)
- libpq が書き込みに失敗した後もデータベース接続ソケットから読み込みを試し続けるようになりました。 (Tom Lane) (12)
- libpq で GSS暗号化状態の管理についてバグが修正されました。 (Tom Lane) (12)
- bytea およびカーソル変数による ecpgコマンドのクラッシュが修正されました。 (Jehan-Guillaume de Rorthais) (12)
- pg_dump および pg_basebackup でディスク容量不足エラーが正しく報告されるようになりました。 (Justin Pryzby, Tom Lane, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
- pg_restore で、データオフセットなしのカスタム形式のダンプファイルでも、順不同のデータ項目をリストアできるように改善されました。 (David Gilman, Tom Lane) (12)
- テーブル単位と列単位のアクセス権限を両方とも設定したテーブルを並列リストアする場合の問題が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- pg_upgrade の実行時に対象クラスタで vacuum_defer_cleanup_age が 0 に設定されるようになりました。 (Bruce Momjian) (12)(11)(10)(9.6)(9.5)
- pg_recvlogical で終了前に保留中のメッセージを送信するように修正されました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)
- pg_rewind でソースクラスタ内の削除されたばかりのファイルの処理が修正されました。 (Justin Pryzby, Michael Paquier) (12)(11)(10)(9.6)(9.5)
- Windows で pg_test_fsync がバイナリ I/O モードを使用するようになりました。 (Michael Paquier) (12)(11)(10)(9.6)(9.5)
- contrib/amcheck で空の削除済みインデックスページに対してエラーが発生しないように修正されました。 (Alexander Korotkov) (12)(11)
- contrib/dblink でローカル状態を正しく初期化できない問題が修正されました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)
- contrib/pgcrypto で deflate() の誤った使用方法が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- contrib/pgcrypto の pgp_sym_decrypt 関数でごく稀に発生する解凍処理の問題が修正されました。 (Kyotaro Horiguchi, Michael Paquier) (12)(11)(10)(9.6)(9.5)
- Microsoft Visual Studio 2015 以降で NLSコードのビルドに対応しました。 (Juan José Santamaría Flecha, Davinder Singh, Amit Kapila) (12)(11)(10)(9.6)(9.5)
- ソースツリー上に configure という名前のファイルが複数ある場合に、MSVC インストールスクリプトが失敗する問題が修正されました。 (Arnold Müller) (12)(11)(10)(9.6)(9.5)
- BSD系の sys_siglist[] の代わりに POSIX 標準の strsignal() を使用するようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)
パブリッシャデータベースまたはサブスクライバデータベースの悪意のあるユーザが、レプリケーションを実行するロール(スーパーユーザであることが多い)によって任意のSQLコードの実行を引き起こす可能性がありました。このリスクのいくつかは CVE-2018-1058で説明されているものと同等で、本修正は、レプリケーションの送信者と受信者が空の search_path 設定で実行されるようにして、リスクを緩和します。CVE-2018-1058 の修正と同様に、この変更によりレプリケートされたテーブルの定義で使用されるスキーマ修飾されていないオブジェクト名で問題が生じるかもしれません。
信頼されていないロールに属するオブジェクトのレプリケートには他にも危険性があり、そのことについてドキュメント記載されました。(CVE-2020-14349)
攻撃者が拡張のターゲットスキーマまたは必須とされているスキーマにオブジェクトを作成できる場合、拡張のインストールスクリプトに対して CVE-2018-1058 と同様の攻撃が行われる可能性があります。拡張のインストールにはスーパーユーザ権限を必要とすることが多いため、これによりスーパーユーザ権限を取得するための道が開かれてしまいます。このリスクを軽減するために、スクリプトの実行で使用される search_path により注意を払う、check_function_bodies 設定を無効にしてインストール時のコード実行を回避する、一部の contrib モジュールで使用されているカタログ調整クエリを安全にする、ということが行われました。
ドキュメントに、サードパーティの拡張の作者がインストールスクリプトを安全にするための記述が追加されました。これは完全な解決策ではありません。不注意にインストールされた場合、他の拡張に依存する拡張は依然としてリスクがあります。(CVE-2020-14350)
パーティションキー列が複数あるとき、一部の列に値を限定する WHERE句が無かったり、限定を与える句が複数あったりする場合に、パーティション除外のための検査の生成が誤動作するおそれがありました。これはサーバプロセスのクラッシュ、不正なクエリ結果、アサート失敗をもたらす可能性がありました。
(クラッシュする例の一つ / この場合「b >= 2」が無ければクラッシュしない) db=# CREATE TABLE pt3 (a int, b int, c int, d int) PARTITION BY RANGE (a, b, c, d); db=# CREATE TABLE pt3_p1 PARTITION OF pt3 FOR VALUES FROM (1,1,1,0) TO (1,1,1,10); db=# CREATE TABLE pt3_p2 PARTITION OF pt3 FOR VALUES FROM (2,2,2,0) TO (2,2,2,10); db=# SELECT * FROM pt3 WHERE a >= 1 AND b >= 1 AND b >= 2 AND c >= 2 AND d >= 0; server closed the connection unexpectedly
このようなスキャンで結合の外側から値を使用する必要がある実行計画は、通常、実行時にクラッシュします。
(実行するとクラッシュするプラン形状の例 / pt4a と pt4b はパーティションテーブル) db=# EXPLAIN (costs off) SELECT * FROM pt4a WHERE NOT EXISTS ( SELECT FROM pt4b WHERE pt4b.a = pt4a.a AND pt4b.b = pt4a.b + 1 AND pt4b.c = 123) AND a = 1 AND c = 120; QUERY PLAN --------------------------------------------------------------- Nested Loop Anti Join -> Seq Scan on pt4a_p1 Filter: ((a = 1) AND (c = 120)) -> Bitmap Heap Scan on pt4b_p1 Recheck Cond: ((c = 123) AND (b = (pt4a.b + 1))) Filter: ((a = 1) AND (a = pt4a_p1.a)) -> BitmapAnd -> Bitmap Index Scan on pt4b_p1_c_idx Index Cond: (c = 123) -> Bitmap Index Scan on pt4b_p1_b_idx Index Cond: (b = (pt4b.b + 1)) (11 rows)
本障害によりアサート失敗が報告されました。アサートを無効にしている場合、誤った結果やクラッシュがもたらされる可能性があります。また、発生を防ぐ修正に加えて、本ケースはアサートではなく問い合わせのエラーとして報告されるようになりました。
組み込みの論理レプリケーションを使用している場合は、組み込みの walreceiver が(誤った状態をクリアする)フィードバック返信をいずれにせよかなり頻繁に送信するため、これは比較的小さな問題です。しかし、pglogical のような他のレプリケーションシステムでは、重大な性能問題が発生していました。
これまでのコードでは、パブリッシャテーブルとサブスクライバテーブルで列番号が異なる可能性を考慮していませんでした。実際に列番号が異なっていた場合、どのトリガを実行するかについて誤った判断をする可能性がありました。
pg_replication_slot_advance() 関数は以前これができなかったため、レプリケーションスロットを手動で進めた後にリソースのクリーンアップ(不要になったWALセグメントの削除など)を妨げる可能性がありました。
以前の一連のマイナーリリースで追加されたフレーズ検索の修正により、長い文書に対して ts_headline() が不合理に時間を要する可能性がありました。さらに悪いことに時間を要することのあるループ内でキャンセルできませんでした。
以前は読み込むデータの長さが指定されていない場合、これらの関数は stat() によって報告されたファイルの長さで停止していました。これはパイプやその他の種類の仮想ファイルには不適切な動作です。
SQL にも JSON にも 「NaN」(not-a-number) という概念はありませんが、jsonpath のコードはそのような値を許可しようとしていました。これは必然的に非標準の動作につながるため、最初からそのような値を拒否する方が良いと判断されました。
影響を受ける集約は以下です。
corr() covar_pop() regr_intercept() regr_r2() regr_slope() regr_sxx() regr_sxy() regr_syy() stddev_pop() var_pop()
このような場合の集約された値として「NaN」を返すべきですが、PostgreSQL v12 で導入されたアルゴリズム変更のために 0 を返すようになっていました。
一部の部分集計ワーカーが「NaN」のみを検出し、他のワーカーが「NaN」以外のもののみを検出した場合、結果は誤って結合され全体的に誤った結果(つまり「NaN」であるべき時に「NaN」ではない)になる可能性がありました。
日付時刻入力の仕様は、"24:00:00" またはそれに相当する "23:59:60" を許容しますが、それ以上の値は許容しません。しかし、非ゼロの少数秒を伴う "23:59:60.nnn" を受け入れるように範囲チェックが誤って実装されていました。
タイムスタンプ値では翌日の1秒目に折り返される結果になりました。time や timetz の値では、保存された値は実際には 24時間より大きくなり、ダンプ/リストアの失敗やその他の誤動作を引き起こす可能性がありました。
ALTER TABLE が(例えば、列のデータ型の変更により)テーブル内容を完全に書き換える必要がある場合で、外部キーや CHECK制約を再検証するためにテーブルをスキャンする必要がある場合に、これらが時々間違った順序で行われ、以下のような奇妙なエラーを引き起こしていました。
ERROR: could not read block 0 in file "base/16543/17654": read only 0 of 8192 bytes
以前は、テーブルのレプリカID のインデックスをインデックス再構築すると設定が失われ、将来の論理デコード出力に古いタプル値が含まれなくなる原因となっていました。
初期化時のカタログデータは、これら 2つのカタログ列を常に非NULLであると誤って印付けしていました。その印付けが正しいかどうかに依存している主な場所は、JIT有効時のタプル分解です。本修正では影響が出る箇所でこれらの誤った印付けを無視するようにしています。初期化時のカタログデータはバージョン13以降で修正されます。
また、これらの項目の NULL確認を行うコードが追加されました。ただし、NULL確認が無いためにクラッシュする可能性はほとんど無いと考えられます。
アサート失敗や、クエリ実行時のクラッシュにつながる可能性がありました。
(クラッシュを引き起こす問い合わせ例) db=# CREATE TABLE t22 (a int); db=# INSERT INTO t22 VALUES (0), (1), (2); db=# SELECT * FROM t22, LATERAL ( SELECT t22.a > 1 AS b, 1 AS c FROM (SELECT random() ORDER BY 1) AS v UNION ALL SELECT true AS b, 2 AS c ) AS vt22 WHERE b AND a >= 0; server closed the connection unexpectedly
以前は、データベースの列の照合順序を使用していましたが、正しくクエリの照合順序を使用するようになりました。
現在は非決定的な照合順序があるので、修正前は非決定的な照合順序が与えられた場合に演算子が完全に失敗するケースがありました。クエリ自体が動作するようなケースでプラン作成が失敗することは望ましくないため、推定の目的で演算子を呼び出す際には、クエリの照合順序を使用しなければなりませんでした。
これは主に、GROUP BY で得られるグループ数のプランナ推定に影響を与えていました。
本ケースはキャンセルされたバキュームの後に合法的に発生する可能性があるので、それに関する警告は過度なものでした。
temp_tablespaces が空か、データベースのテーブルスペースを明示的に指定している場合に、(パラレルハッシュ結合などで用いられる)共有ファイルセットの一時ファイルが期待通りデータベースのテーブルスペースに配置されるのではなく、pg_defaultテーブルスペースに配置されていました。
これにより、wal_consistency_checking設定が有効な場合に偽のエラー報告をする可能性がありました。
(報告されたエラー例) FATAL: inconsistent page found, rel 1663/16385/22133, forknum 0, blkno 15 CONTEXT: WAL redo at 0/739CEDE8 for SPGist/VACUUM_REDIRECT: newest XID 4619
I/O エラーが EOF に到達したことと区別がつかなかったり、全く報告されなかったりするいくつかのケースが修正されました。また、ブロック番号やバイト数などの詳細が追加されました。
buffileモジュールは内部的な一時ファイルの読み書きに使われるものです。
並行して挿入されたタプルが別の並行トランザクションによって更新され、どちらのタプルのバージョンも現在のトランザクションのスナップショットには見えなかった場合、シリアライズ競合チェックは、タプルが現在のトランザクションの結果に関連しているかどうかについて誤った結論を導き出す可能性がありました。 これにより、直列化失敗でエラーにすべき SERIALIZABLEトランザクションのコミットを許容してしまう可能性がありました。
機能的には無害ですが、チェックサムが有効な場合や wal_log_hints = on の場合、無駄な WAL量増大を引き起こしていました。デッド状態とは無効なエントリであることを示すフラグの付いた状態を意味します。
そのようなリクエストは fsync が無効の場合には無視されますが、保留中の処理を保持するハッシュテーブルから削除する対応が漏れていました。この問題によりハッシュテーブルが肥大化し、再度 fsync を有効化した場合に、アサート失敗が発生する可能性がありました。
偽性の警告「WARNING: aborting backup due to backend exiting beforepg_stop_backup was called」や、アサート失敗が報告されました。
この問題により、一貫性のないチェックサムで pg_control が書き込まれる可能性があり、次に書き込む前にクラッシュした場合、データベースを再起動できないなど、あとで問題が発生する可能性がありました。
これらの関数(文書化されておらず、ODBC ドライバの古いバージョンのみで使用)には、クラッシュを発生させたり、パーティションテーブルなど、ストレージのないテーブルに対して呼び出すと、「could not open file」などの混乱を招くエラーメッセージを表示する問題が含まれていました。
レプリケーションスロット関連の処理の一部では、このコーディング規則に違反していました。そのため、関数の呼び出し中にエラーが発生すると、ごくまれにスピンロックがスタックする可能性がありました。
この問題は、アサートが誤っていただけで、通常の製品ビルドには影響ありません。
この修正は、停止しかけのサーバプロセスから最後のエラーメッセージを確実に取得するためだけでなく、読み取りエラーが発生するまで接続が失われたことを考慮せず済ますためにも重要です。これまで、COPY データの転送中に接続が失なわれた場合に、アプリケーションにエラーを報告することなく、永遠に送信し続ける可能性がありました。
GSS暗号化を使用した接続では、サーバの再起動後にリセットしようとしたとき、または候補サーバのリストの次に移動しようとしたとき、フリーズしてしまう可能性がありました。
一部のコードパスでは「could not write file: Success」などのおかしな報告が生成される可能性がありました。
pg_dump では、出力をシークできない(例えば、出力が何かにパイプされている)場合に、そのようなダンプファイルを生成します。この修正により、そのようなダンプファイルでも並列リストアができるようになります。
アクセス権限はテーブル単位を先に付与する必要がありますが、並列リストアではそれを確実に順序づけできていませんでした。この問題により、「tuple concurrently updated」のエラーが発生したり、列単位のアクセス権限が付与されない可能性がありました。この問題はアクセス権限間の依存関係をダンプファイルに含めることで修正しています。そのため、問題が再発しないようにするには、修正された pg_dump でダンプを取得しなおす必要があります。
これまで、対象クラスタで vacuum_defer_cleanup_age が 0 以外に設定されている場合、システムカタログの凍結処理が正しく動作せず、混乱を招くメッセージとともにアップグレードが失敗していました。アップグレード中は設定が上書きされることに注意してください。
この修正がないと、レプリケーションの senderプロセスが送信障害を検出した場合に、レプリケーションスロットの LSN 位置に対して予期した最後の更新をせずに終了する可能性があります。この問題により、再接続時にデータが再送信されたり、pg_recvlogical が受信しようとした最後のデータの後に送信されたエラーメッセージを見逃す可能性がありました。
オンラインのソースクラスタを使用する場合、ファイルを同時に削除できますが、これまで、ファイルのディレクトリエントリを確認してから、stat() でそれを調査するまでの間に削除されると、pg_rewind の動作に混乱が生じていました。
これまで、テキストモードでテストファイルに書き込んでいましたが、これはPostgreSQL での実際の使用方法を正しく反映したものではありませんでした。
この状態は WAL の再生中は正常です。
状況の組み合わせによっては、この問題は dblink_close() が予期しないリモート COMMIT を発行する可能性がありました。
これまで、pgp_sym_encrypt 関数では、zlib の API 要件を正しく処理していなかったため、誤った圧縮データを生成する可能性がありました。標準的なzlib でこのエラーが発生したとの報告はありませんが、IBM の zlibNX 実装を使用した場合に問題が確認されました。
圧縮されたストリームは空のパケットで正常に終了する可能性がありますが、解凍処理はこれに対応しておらず、データが破損しているとのエラーが発生していました。
この問題により、ソースツリーのトップレベルを識別するために、configureを検索する処理に混乱が発生していました。
この修正により、最新バージョンの glibc でもビルドエラーが発生しなくなります。