このリリースは 9.4.18 からの修正リリース(2018年8月9日リリース)です。
9.4.x からのアップデートではダンプ、リストアは不要です。
また、9.4.18 より前のバージョンからアップデートを行う場合は 9.4.18 に関する技術情報を参照してください。
PostgreSQL 9.4.18 から 9.4.19 への変更点
10.5、9.6.10、9.5.14、9.4.19、9.3.24 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- libpq にて接続を試行するごとに状態を完全にはリセットできておらず、修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- 単純な「SELECT * FROM ...」ではないビューを通した「INSERT ... ON CONFLICT UPDATE」が修正されました。 (Dean Rasheed, Amit Langote) (10)(9.6)(9.5)
- 固定されたシステムカタログに対する relfrozenxid値と relminxid値の更新が、遅れることなく処理されるようになりました。 (Andres Freund) (10)(9.6)(9.5)(9.4)(9.3)
- 昇格したばかりのスタンバイが昇格後の最初のチェックポイント処理を終える前にクラッシュした場合について、修正されました。 (Michael Paquier, Kyotaro Horiguchi, Pavan Deolasee, Álvaro Herrera) (10)(9.6)(9.5)(9.4)(9.3)
- 内容が全てゼロのBtreeインデックスのページを再利用する際に不適切なWALレコードを出力しないように修正されました。 (Amit Kapila) (10)(9.6)(9.5)(9.4)(9.3)
- WALリプレイにて、1GBを超える破損したレコード長から保護されるようになりました。 (Michael Paquier) (10)(9.6)(9.5)
- リカバリの終わりに、タイムラインヒストリファイルへの書き込みをできるだけ遅らせるようになりました。 (Heikki Linnakangas) (10)(9.6)(9.5)
- 多数のリレーションを削除するトランザクションに対して、WALリプレイの性能が改善されました。 (Fujii Masao) (10)(9.6)(9.5)(9.4)(9.3)
- スタンバイサーバのWALリプレイにてロック解放の性能が改善されました。 (Thomas Munro) (10)(9.6)(9.5)(9.4)(9.3)
- wal sender がロジカルデータのストリーミング状態を正しく報告するようになりました。 (Simon Riggs, Sawada Masahiko) (10)(9.6)(9.5)(9.4)
- ロジカルレプリケーションのサブスクライバにおいて、データ型の入力関数を実行するときにスナップショットが確実に提供されるようになりました。 (Minh-Quan Tran, Álvaro Herrera) (10)
- ロジカルデコーディングのときのスナップショット処理について誤りが修正されました。 (Arseny Sher, Álvaro Herrera) (10)(9.6)(9.5)(9.4)
- ロジカルレプリケーションのテーブル同期ワーカにサブトランザクションを考慮した処理が加わりました。 (Amit Khandekar, Robert Haas) (10)
- インデックス作成が途中で失敗した後、テーブルのキャッシュされたインデックスリストが正しく再構築されるように修正されました。 (Peter Geoghegan) (10)(9.6)(9.5)(9.4)(9.3)
- GINインデックスの圧縮されていない空のポスティングリストページの誤った処理が修正されました。 (Sivasubramanian Ramasubramanian, Alexander Korotkov) (10)(9.6)(9.5)(9.4)
- キャッシュライン共用を減らすために、無名POSIXセマフォの配列を埋めこむようになりました。 (Thomas Munro) (10)
- パラレルインデックススキャンをしているプロセスが確実にシグナルに応対するようになりました。 (Amit Kapila) (10)
- VACUUM が Btreeインデックスのページ削除のループ内にあるとき、確実にシグナルに応対するように修正されました。 (Andres Freund) (10)(9.6)(9.5)(9.4)
- inner_unique最適化を加えた際に入り込んだ、ハッシュ結合のコスト計算の誤りが修正されました。 (David Rowley) (10)
- 複合型の列に関する同値クラスの誤った最適化が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- 複数行を返す関数を使った一部のクエリでの「ERROR: ORDER/GROUP BY expression not found in targetlist」エラーを回避するようにプランナが修正されました。 (Tom Lane) (10)(9.6)
- キーのデータ型が配列型のような多態のBtree演算子クラスを使っているものである場合の、パーティションキーの処理が修正されました。 (Amit Langote, Álvaro Herrera) (10)
- SQL標準の FETCH FIRST 構文が標準で期待される通り、パラメータを受け付けるように修正されました。 (Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
- パーティションキー列の重複に対するドキュメント化されていない制限が除去されました。 (Yugo Nagata) (10)
- 一時テーブルを非一時テーブルのパーティションにすることが禁止されました。 (Amit Langote, Michael Paquier) (10)
- 特にバッファアクセスについて、パラレルワーカーにおける EXPLAIN のリソース使用集計が修正されました。 (Amit Kapila, Robert Haas) (10)(9.6)
- SHOW ALL が pg_read_all_settings のメンバーであるロールに対して全ての設定を出力するように修正されました。また、そのようなロールは設定ファイル名と行番号を pg_settings ビューで参照できるようになりました。 (Laurenz Albe, Álvaro Herrera) (10)
- 内部実装関数 getObjectDescription の出力で、一部オブジェクト名のスキーマ修飾に失敗していたものが修正されました。 (Kyotaro Horiguchi, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- 並列化支援関数として VARIADIC を使った集約を与えることができるようにCREATE AGGREGATE の型チェックが修正されました。 (Alexey Bashtanov) (10)(9.6)
- COPY FROM の現在行番号カウンタを 32bit から 64bitに拡張しました。 (David Rowley) (10)(9.6)(9.5)(9.4)(9.3)
- シングルユーザモードでレプリケーションスロットを削除できるようになりました。 (Álvaro Herrera) (10)
- パラレル集約が動作するときの variance(int4)関数および関連する集約関数からの誤った結果が修正されました。 (David Rowley) (10)
- xmltable()の列式でTEXTノード、CDATAノードを適切に処理するようになりました。 (Markus Winand) (10)
- 起こりうる OpenSSL の RAND_bytes()関数の失敗を適切に処理するようになりました。 (Dean Rasheed, Michael Paquier) (10)
- hostaddr が指定されたときの一部の場合について libpq が修正されました。 (Hari Babu, Tom Lane, Robert Haas) (10)
- ecpg の pgtypesライブラリに文字列解放関数が追加されました。これによりWindowsでのモジュールをまたがるメモリ管理問題を回避できます。 (Takayuki Tsunakawa) (10)(9.6)(9.5)(9.4)(9.3)
- Windows での ecpg の long long 変数サポートが修正されました。必要な strtoll/strtoull ライブラリ関数を非標準的に宣言していたり、全く宣言していない他のプラットフォームも同様に修正されました。 (Dang Minh Huong, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- RULE変更を行った場合の PL/pgSQL でSQLステートメントタイプの誤識別が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- Windows で標準入力がターミナルでないとき、エコー出力が適切に無効化されるようにクライアントプログラムのパスワードプロンプトが修正されました。 (Matthew Stickney) (10)(9.6)(9.5)(9.4)(9.3)
- ダンプ出力でリスト値になっているGUI変数値のクォーティングがさらに修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- pg_dump で制約インデックスに対する REPLICA IDENTITY 属性のダンプに失敗していたものが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)
- pg_upgrade で古いサーバが正常にシャットダウンしたか検査するようになりました。 (Bruce Momjian) (10)(9.6)(9.5)(9.4)(9.3)
- contrib/hstore_plperl が Perlスカラ参照を調べて、あるはずのハッシュ参照が見つからないときにクラッシュしないように修正されました。 (Tom Lane) (10)(9.6)(9.5)
- contrib/ltree の lca() 関数で入力配列が空であるときのクラッシュが修正されました。 (Pierre Ducroquet) (10)(9.6)(9.5)(9.4)(9.3)
- 誤ったエラーコードが報告されるかもしれない、様々なエラー処理のコードパスが修正されました。 (Michael Paquier, Tom Lane, Magnus Hagander) (10)(9.6)(9.5)(9.4)(9.3)
- プログラムが既存のシステムライブラリディレクトリにあるものではなく、ビルドされたばかりのライブラリ(libpq.so など)に確実にリンクするように、Makefile が整理されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
- タイムゾーンデータファイルが tzdata release 2018e に更新されました。北朝鮮の夏時間法の変更とチェコスロバキアの歴史的修正が含まれます。 (10)(9.6)(9.5)(9.4)(9.3)
ある種の攻撃方法で dblink や postgres_fdw の権限の無いユーザが、サーバを実行する OSユーザが所有する ~/.pgpass などのサーバ側の認証情報ファイルの使用を防止する検査を迂回できました。ローカル接続に peer認証を許可しているサーバは特に影響を受けます。postgres_fdw セッションへの SQLインジェクションなどの他の攻撃も可能です。
この方法で postgres_fdw を攻撃するには指定の接続パラメータで外部サーバオブジェクトが作成できる必要があります。一方、dblink に対しては、dblink にアクセスできる任意のユーザで攻撃可能です。一般に libpq を使ったアプリケーションに対して接続パラメータを選べると攻撃可能になると考えられます。(CVE-2018-10915)
ビューの SELECTリストが元のテーブルの列と1対1で対応していない場合に、更新可能ビューの誤った展開がクラッシュや「ERROR: attribute ... has the wrong type」エラーをもたらす可能性がありました。
さらにセキュリティ上の問題もありました。攻撃者が同テーブルの他の列にINSERTとUPDATE権限を持っている場合に、この障害を利用してUPDATE権限の無い列を更新できました。また、あらゆるユーザがこの障害を使ってサーバメモリの読み取りが可能でした。(CVE-2018-10925)
障害動作例: (以下のようなテーブル、ビューで) db1=# CREATE TABLE t2 (id int primary key, c1 int, c2 int); db1=# CREATE VIEW v2 AS SELECT id, c2 FROM t2; db1=# GRANT UPDATE (id, c2) ON t2 TO foo; db1=# GRANT INSERT (id, c2) ON t2 TO foo; db1=# GRANT ALL ON v2 TO foo; db1=# INSERT INTO t2 VALUES (1,1,1), (2,2,2); (一般ユーザ foo で INSERT ... ON CONFLICT ... を実行) db1=> INSERT INTO v2 (id, c2) VALUES (1,100) ON CONFLICT (id) DO UPDATE SET c2 = EXCLUDED.c2; INSERT 0 1 (奇妙な結果: c2 が更新されず、権限が無い c1 が NULL に更新) db1=# SELECT * FROM t2; id | c1 | c2 ----+----+---- 2 | 2 | 2 1 | | 1 (3 rows)
過剰に楽観的なキャッシュ処理方式は、これらの更新が他のセッションから見えなくなるおそれがあり、偽性エラー、あるいは/および、データ破損をもたらす可能性がありました。古いキャッシュデータが既存セッションのみならず新たなセッションにまで残り続ける可能性があるため、この問題は pg_authid などの共有カタログにおいて特に悪質です。
以下のエラーが報告されて問題が発見されました。
ERROR: found xmin 2906288382 from before relfrozenxid 740087784
これは、テーブルに凍結したXID値(relfrozenxid)よりも手前のxmin値を持つレコードが見つかったという意味です。キャッシュ処理の誤りで実際の relfrozenxid値よりもずっと古い値が参照されていました。
同様に「ERROR: found multixact ... from before relminmxid ...」も起こる可能性があります。
本障害により、そのクラッシュ後のリカバリ起動でWALを適用する際に一貫性をもったデータベース状態に到達していないと判断され、起動に失敗しました。
クラッシュ後の起動失敗のときに「PANIC: WAL contains references to invalid pages」が出る動作が報告されています。
この誤りはアサート失敗として現れます。また、潜在的にホットスタンバイサーバで不必要な問い合わせキャンセルを起こすおそれがありました。
このような場合には破損したデータとして扱えるようになりました。これまでは、WALレコード内に書かれたレコード長の通りに大きいメモリ領域を確保しようと試みていました。その結果、以下のような強いエラーが生じてリカバリ不能になっていました。
FATAL: invalid memory alloc request size ...
本修正でWALの再読み込みを促す弱いエラーを出すように変更されました。
これにより、リカバリクリーンアップ中のエラー(二相コミットの状態ファイルの問題など)でディスク上に一貫性の無いタイムライン状態が生じるのを回避します。
以下のようにリカバリ完了時にrecovery.confが無いというエラーが出て、失敗する動作が報告されていました。
LOG: selected new timeline ID: 2 FATAL: could not open file "recovery.conf": No such file or directory LOG: startup process (PID 23456) exited with exit code 1
この変更はファイル削除を一括して行うことで、共有バッファがスキャンされる回数を減らして、特に shared_buffers 設定が大きい場合に処理を効率化します。
これまでは上流サーバに追いついているかどうかを誤判定していました。上流側(sender側)の起動時に、既に追いついているのに "streaming" でなく"catchup" 状態と報告することがありました。
この遺漏により、SQL言語の関数を使った制約を持つドメイン型などの一部の場合でクラッシュを起こしていました。
稀な場合において誤ったデコーディング結果を許容していました。ロジカルレプリケーション対象テーブルへのDDL操作や、サブトランザクション(SAVEPOINT)操作があるときに誤動作を起こすおそれがありました。
これまで、いくつかのサブトランザクションが同期テーブルを更新した後に中止(ABORT)された場合に、テーブル同期が誤った振る舞いをする可能性がありました。
これまでは、作成に失敗したインデックスの OID がリストに残り、同セッション内でその後に問題をひき起こしました。
インデックス作成失敗後に当該テーブルに対するSQL実行で「ERROR: could not open relation with OID 16567」エラーが出るケースが報告されました。
これは 9.4 より前の GINインデックスを pg_upgrade した後にアサート失敗をもたらします。9.4 以降のバージョンで GINインデックスを作った場合には問題ありません。
これは多CPUシステムでの競合を減らし、Linux と FreeBSD での旧リリースと比較しての性能退行を修正します。
これまで、パラレルワーカはインデックスページのロックを待機して止まったままとなる可能性がありました。
破損したBtreeインデックスがここでの無限ループをもたらす可能性があり、その場合、これまでは強制クラッシュさせる以外には割り込み不能となっていました。
本障害により、この最適化が適用できる場合に悪いプランが選択される可能性がありました。
inner_unique最適化とは、PostgreSQL 10 で導入されたユニーク保証を使った最適化の一つで、内部結合に適用されます。
本障害のために、複合列のインデックスがマージ結合に対してそれら列のソート順序を提供するかもしれないことが、見落とされていました。
以下のように複合列のインデックスが使われない動作が報告されました。
(このようなテーブルに対して) db1=# CREATE TYPE typ20c AS (c1 int, c2 int); db1=# CREATE TABLE tbl20a (c3 typ20c PRIMARY KEY); db1=# CREATE TABLE tbl20b (c3 typ20c PRIMARY KEY); db1=# INSERT INTO tbl20a SELECT ROW(g, g)::typ20c FROM generate_series(1, 100000) as g; db1=# INSERT INTO tbl20b SELECT ROW(g, g)::typ20c FROM generate_series(1, 100000) as g; db1=# ANALYZE; (以下の問い合わせで Merge Join の場合にインデックスが使われない) db1=# explain SELECT * FROM tbl20a a, tbl20b b WHERE a.c3 = b.c3;
配列型のパーティションキーを使った場合に、検索におけるパーティション除外(pruning)が働かない動作が報告されていました。
これまではプリペアドステートメントでパラメータとすることができませんでした。
(修正前の動作例、LIMIT/OFFSETでは可能だが FETCH FIRSTはエラーになる) db1=# PREPARE p1 (int, int) AS SELECT * FROM t23 LIMIT $2 OFFSET $1; PREPARE db1=# PREPARE p2 (int, int) AS SELECT * FROM t23 OFFSET $1 ROWS FETCH FIRST $2 ROWS ONLY; ERROR: syntax error at or near "$2"
これまで「PARTITION BY RANGE (x, x)」のように同じ列を複数指定すると「ERROR: column "x" appears more than once in partition key」エラーが生じていました。
これまでは許されていましたが、そのような場合は信頼できる動作をしません。
クエリがパラレル動作をするときに EXPLAIN (ANALYZE,BUFFERS) で出力される「Buffers: ...」値が不正確になる動作が報告されました。
照合順序、符号化方式変換、テキスト検索のオブジェクト名が、スキーマ修飾されるべきケースで修飾されませんでした。
PostgreSQL 10.x 系列においては、パブリケーション、拡張統計のオブジェクトも該当します。また、内部実装関数 getObjectIdentity も修正されています。
これにより、COPYの入力が4G(約42.9億、2の32乗)行を超える場合の二つの問題を回避します。一つは COPY FROM WITH HEADER で先頭行のみならず4G行毎に行が捨てられてしまうことで、一つはエラー報告が誤った行番号を報告する可能性があることです。
シングルユーザモードで「SELECT pg_drop_replication_slot('p');」を実行したときに「ERROR: epoll_ctl() failed: Bad file descriptor」となる動作が報告されました。10.0 で埋め込まれてしまった障害です。
varianceは入力値に対する標本分散を返す集約関数です。
稀な状況で本障害により「LOG: could not generate random cancel key」が繰り返し発生して、新たな接続が受け付けられない状態になり、PostgreSQLをサービス再起動する以外では解消できませんでした。
PQhost() が一部の場合に誤解を招く結果または誤った結果を返していました。これからは一定の様式で応答します。ホスト名が指定されていたならホスト名を、ホストアドレスだけ指定されていた場合に限ってホストアドレスを、いずれも指定されていない場合にはデフォルトホスト名(典型的には /tmp かlocalhost)を返すようになりました。
また、SSL証明書を検証するときに誤った値が証明書のサーバ名と比較されるかもしれませんでした。同様に、誤った値が ~/.pgpass のホスト名欄と比較されるかもしれませんでした。これからは、ホスト名が指定されていたならホスト名、ホストアドレスだけ指定されていたならホストアドレス、いずれも指定されていないなら「localhost」が比較対象の値となります。
また、hostaddr値がパース不能であるとき以下のような不適切な("(null)"部分)エラーメッセージが報告されていたものが修正されました。
$ psql "hostaddr=999.999.999.999" psql: could not parse network address "(null)": Name or service not known
また、host、hostaddr、portパラメータにカンマ区切りのリストが含まれる場合、libpq はデフォルト動作指定を意味するリスト内の空要素を注意深く扱うようになりました。
Windows で同じ DLLにて malloc して確保したのではないメモリを free すると、クラッシュが発生することがあります。pgtypesライブラリはときどき呼び出し側が解放する想定の文字列を返しますが、そのように使用することは不可能となっていました。PGTYPESchar_free() 関数が追加され、アプリケーションによる呼び出し側でのメモリ解放が可能となりました。
Windows上の ecpg を使用した DBクライアント実行でクライアント側エラー「unsupported type "long long" on line ...」が出るケースが報告されました。
この障害はアサート失敗をひき起こします。また、稀な場合に INTO STRICTオプションが期待通りに動作しなくなります。
以前の pg_dump出力での search_path や他のリスト値変数のクォーティングに対する修正は、空文字列リスト要素に対して誤動作をしていて、長いファイルパスが切り捨てられる危険性がありました。
手動で作成したユニークインデックスは適切に属性が付与されますが、UNIQUE や PRIMARY KEY 制約を宣言して作られる場合にはそうなりませんでした。
これまでは immediateモードのシャットダウンを誤って正常シャットダウンと判断していました。
以下のように hstore型にならない値を渡すときにクラッシュしていました。
db1=# CREATE EXTENSION hstore; db1=# CREATE EXTENSION plperl; db1=# CREATE EXTENSION hstore_plperl; db1=# CREATE FUNCTION test43() RETURNS hstore LANGUAGE plperl TRANSFORM FOR TYPE hstore AS $$ return 43; $$; db1=# SELECT test43(); server closed the connection unexpectedly
ライブラリ関数で使われる errno変数の退避やリセットが不十分な箇所が修正されました。ユーザに対しては、エラーメッセージ中のエラー理由を示す部分に誤ったメッセージが出力されるという形で問題があらわれます。
これにより、古いPostgreSQLライブラリのあるプラットフォームでビルドするときの問題を回避します。
この更新には、過去のナミビアとチェコスロバキアと同様の、アイルランド夏時間の再定義が含まれます。これらの管区では、法律上標準時間が夏で、冬に変更された時間帯が適用されるため、それにあわせた変更が適用されました。実際のUTCオフセットや使われているタイムゾーン略記法に変更はありませんが、pg_timezone_namesビューのis_dst列の値が変わり、冬にtrue、夏にfalseとなります。