このリリースは 9.4.12 からの修正リリース(リリース日 2017/8/10)です。
9.4.x からのアップデートではダンプ、リストアは不要です。
ただし、項目1番には追加の対処が必要です。
また、9.4.12 より前のバージョンからアップデートを行う場合は 9.4.12 に関する技術情報を参照してください。
PostgreSQL 9.4.12 から 9.4.13 への変更点
9.6.4、9.5.8、9.4.13、9.3.18、9.2.22 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- ユーザマッピングオプションとして格納されたパスワードを保護するため、システムテーブル pg_user_mappings の umoptions列の可視性が厳格化されました。
- 全てのパスワードによる認証方式で空パスワードがサーバ側で禁止されました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
- lo_put() 関数が対象ラージオブジェクトの UPDATE権限を検査するように修正されました。 (Tom Lane, Michael Paquier) (9.6)(9.5)(9.4)
- pg_upgrade でスタンバイサーバをアップグレードする手順についてドキュメントが修正されました。 (Bruce Momjian) (9.6)(9.5)
- タプル更新チェーンの同時ロックが修正されました (Álvaro Herrera) (9.6)(9.5)(9.4)(9.3)
- XMAXフィールドが未だ有効なメンバーを1つだけ持つ multixact として使われているタプルをフリーズするときにデータ破損の可能性があり、修正されました。 (Teodor Sigaev) (9.6)(9.5)(9.4)(9.3)
- メモリ内で 10億個以上のタプルをソートする際に、整数のオーバーフローやその後のクラッシュがあり、修正されました。 (Sergey Koposov) (9.6)(9.5)(9.4)
- Windows では、新しいプロセスで共有メモリのアドレス範囲を確保できない場合、プロセスの作成を再試行するようになりました。 (Tom Lane, Amit Kapila) (9.6)(9.5)(9.4)(9.3)(9.2)
- Windowsビルドにおける、低い発生確率で生じる共有述語ロックハッシュテーブルの破損が修正されました。 (Thomas Munro, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- SSL接続を正常にクローズしたときに 非SSL接続と同様に特にログ出力しないように修正されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
- SSLセッションチケットをクライアントに送信しないように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- Solaris上の tcp_keepalives_idle設定に向けてコード修正が行われ、本設定が利用可能になりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- サービス(postmaster)のシャットダウンと即時再起動の直後に発行された問い合わせメッセージを無視しないように統計コレクタが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- 統計コレクタの受信バッファサイズが 100KB 以上になりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- 「XLOG_SWITCH」WALレコードを処理した直後にスタンバイが昇格したときに、無効な WALセグメントを作成しないように修正されました。 (Andres Freund) (9.6)(9.5)(9.4)(9.3)(9.2)
- クライアントがシャットダウンをリクエストしたときにすぐに終了するように、walsender が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
- walsenderプロセスの SIGHUP と SIGUSR1 の処理が修正されました。 (Petr Jelinek, Andres Freund) (9.6)(9.5)(9.4)(9.3)(9.2)
- シャットダウンに伴うチェックポイント処理の間にwalsenderがパニックをひき起こすのが防止されました。 (Andres Freund, Michael Paquier) (9.6)(9.5)(9.4)
- マスタプロセス(postmaster)での競合状態による walreceiver の不必要に遅い再起動が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- ロジカルデコーディングの際にディスクにあふれ出す小さなサブトランザクションのリークが修正されました。 (Andres Freund) (9.6)(9.5)(9.4)
- ロジカルデコーディングスロットの作成中にスナップショットを作成するために必要な作業が削減されました。 (Andres Freund, Petr Jelinek) (9.6)(9.5)(9.4)
- ロジカルデコーディングスロット作成を遅延させる可能性のある競合状態が修正されました。 (Andres Freund, Petr Jelinek) (9.6)(9.5)(9.4)
- syscache無効化イベントの処理におけるオーバーヘッドが軽減されました。 (Tom Lane) (9.6)(9.5)(9.4)
- 一部の場合に使われた外部キー制約の存在に基づいて結合の選択率を推定する誤ったヒューリスティックが削除されました。 (David Rowley) (9.6)
- INSERT または UPDATE が、ドメイン型配列の複数の要素に値を割り当てる場合の問題が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- 集約関数の引数内にある sub-SELECT でウィンドウ関数を使用できるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
- 元テーブルが外部テーブルの場合にビューの CHECK OPTIONS句が適切に実行されるようになりました。 (Etsuro Fujita) (9.6)
- ALTER ... RENAME実行時に、自動生成された配列型の列名を退避するようになりました。 (Vik Fearing) (9.6)(9.5)(9.4)(9.3)(9.2)
- テーブルの制約にコメントがある場合について、ALTER TABLEのダングリングポインタ障害が修正されました。 (David Rowley) (9.6)(9.5)
- ALTER ROLE ... SET で実行できるすべての構文が ALTER USER ... SET でも実行できるようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
- 外部テーブルの CHECK制約を NOT VALID で初期化できるようになりました。 (Amit Langote) (9.6)
- データ型 I/O 関数の引数または戻り値の型を opaque から正しい型に変更するときに、依存関係情報が適切に更新されるようになりました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
- COPY がクエリの結果をコピーするときに、クエリプランが並列処理を許可するようになりました。 (Andres Freund) (9.6)
- ANALYZE が tsvector列を処理するときのメモリ使用量が削減されました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
- money型の値を整数または浮動小数点型の数で乗じたり除算したりするときに不必要な精度損失やいいかげんな丸めがあり、修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- regprocedurein() などの識別子を解析する関数の空白のチェックが厳格化されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- PL/Perlをコンパイルする際に、Perl由来の適切な #define シンボルを使用するようになりました。 (Ashutosh Sharma, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- libpq で接続に失敗した後に GSS/SASL と SSPI の認証状態が正しくリセットされるようになりました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)
- キーボードの EOF 信号で COPY FROM STDIN が終了した後に、別の COPY FROM STDIN が試行されたときに発生する psql のエラーが修正されました。 (Thomas Munro) (9.6)(9.5)(9.4)(9.3)(9.2)
- pg_dump と pg_restore が REFRESH MATERIALIZED コマンドを最後に出力するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
- pg_dump/pg_restore の zlib に由来するエラー状況の報告が改善されました。 (Vladimir Kunschikov, Álvaro Herrera) (9.6)(9.5)(9.4)
- pg_dump の --clean オプションが期待されるイベントトリガを削除するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
- pg_dump の --clean オプションが修正されました。 (Stephen Frost) (9.6)
- pg_dump が空のオペレータクラスに対して無効な SQLを出力しないように修正されました。 (Daniel Gustafsson) (9.6)(9.5)(9.4)(9.3)(9.2)
- Windows での pg_dump の標準出力への出力が修正されました。 (Kuntal Ghosh) (9.6)(9.5)(9.4)(9.3)(9.2)
- SQL関数 pg_get_ruledef() が、後から名前変更された列を含むビューのON SELECT ルールを正しく出力するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- 結合条件の記述を持たない外部結合のダンプが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
- FROM句の関数式のダンプが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- Windows で pg_basebackup の 標準出力への出力が修正されました。 (Haribabu Kommi) (9.6)(9.5)(9.4)(9.3)(9.2)
- 2GB 以上のファイルを正しく扱えるように pg_rewind が修正されました。 (Kuntal Ghosh, Michael Paquier) (9.6)(9.5)
- 末尾のWALレコードが wal_level = minimum にならないことを保証するように、pg_upgrade が修正されました。 (Bruce Momjian) (9.6)(9.5)(9.4)(9.3)(9.2)
- pg_xlogdump のWALレコード長の計算が修正されました。 (Andres Freund) (9.6)(9.5)
- postgres_fdw で ALTER SERVER および ALTER USER MAPPING コマンドの後にリモートサーバへの接続を再確立するようになりました。 (Kyotaro Horiguchi) (9.6)(9.5)(9.4)(9.3)
- postgres_fdw で、リモートのトランザクション制御コマンドのキャンセルが可能になりました。 (Robert Haas, Rafia Sabih) (9.6)(9.5)(9.4)(9.3)
- 拡張モジュール向けにより多くの空間を提供するため、実装内の定数 MAX_SYSCACHE_CALLBACKS が 32 から 64 に変更されました。 (Tom Lane) (9.6)(9.5)(9.4)
- gcc で共有ライブラリをビルドするときに、常に -fpic ではなく -fPIC を使用するようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- MSVCビルドで opensslライブラリが VCサブディレクトリ内に無い場合を扱えるようになりました。 (Andrew Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)
- MSVCビルドで libxml2 ヘッダファイル向けの適切なインクルードパスが追加されました。 (Andrew Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)
- MSVCビルドで tcl86.lib という名前の Tclライブラリを認識するようになりました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
- MSVCビルドで vcregress.pl のコマンドラインでPROVE_FLAGS設定を尊重するようになりました。 (Andrew Dunstan) (9.6)(9.5)(9.4)
- Microsoft MSVC 向けのビルドスクリプトでエスケープされていないブレース({、})を出しているのが修正されました。 (Andrew Dunstan) (9.5)(9.4)(9.3)(9.2)
- 非常に幅が広いタプルでのロジカルデコーディングの障害が修正されました。 (Andres Freund) (9.4)
これまで、ユーザは関連する外部サーバに USAGE権限を持たなくとも、自身のユーザマッピングのオプションを参照できました。このようなオプションにはユーザ自身ではなく管理者によって設定されたパスワードが含まれているかもしれません。
本バージョンアップは新たに initdb でデータベースクラスタを作るときの振る舞いを修正するだけです。既存のデータベースクラスタを修正するには、以下の手順を実行する必要があります。
postgresql.conf で以下設定を与えて PostgreSQLサービスを再起動します。ALTER SYSTEM コマンドが利用可能なら、それを使っても良いです。
allow_system_table_mods = true
データベースクラスタ内の各データベースでスーパーユーザにて以下を実行します。
SET search_path = pg_catalog; CREATE OR REPLACE VIEW pg_user_mappings AS SELECT U.oid AS umid, S.oid AS srvid, S.srvname AS srvname, U.umuser AS umuser, CASE WHEN U.umuser = 0 THEN 'public' ELSE A.rolname END AS usename, CASE WHEN (U.umuser <> 0 AND A.rolname = current_user AND (pg_has_role(S.srvowner, 'USAGE') OR has_server_privilege(S.oid, 'USAGE'))) OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE')) OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN U.umoptions ELSE NULL END AS umoptions FROM pg_user_mapping U LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN pg_foreign_server S ON (U.umserver = S.oid);
このとき、template0 と template1 についても実行してください。さもなくば、新たにデータベースを作る度にその新たなデータベースに上記手順を実行してください。
template0データベースに書き込みするには、接続可能ないずれかのデータベース上で以下のSQLを実行します。
(9.5以降の場合) 書き込み可能にする: ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true; 書き込み不能に戻す: ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false; (9.4以前の場合) 書き込み可能にする: UPDATE pg_database SET datallowconn = true WHERE datname = 'template0'; 書き込み不能に戻す: UPDATE pg_database SET datallowconn = false WHERE datname = 'template0'; 最後に allow_system_table_mods 設定を削除して、PostgreSQLサービスを再起動します。
libpq は md5 などのパスワードを使う認証方式について、空パスワード指定の場合には、これをサーバに送りません。そのため、ユーザのパスワードが空に設定されていた場合、psql や、その他の libpqベースのクライアントからパスワード認証で接続できません。これにより、管理者はユーザのパスワードを空にすることはパスワードを使った認証での接続を禁止するのに等しいと認識しているかもしれません。しかしながら、改造されているクライアントや libpqベースでないクライアントでは空パスワードでのログインは可能でした。
本修正では、全ての場合で空パスワードをサーバが拒絶するように変更されました。(CVE-2017-7546)
ラージオブジェクトに書き込みを行う SQL関数 lo_put() は、クライアントインタフェース向け関数 lowrite() と同様の権限が必要でしたが、検査が欠落していて、任意のユーザでラージオブジェクトのデータ変更が可能となっていました。(CVE-2017-7548)
これまでは、pg_upgrade を実行した後、スタンバイサーバをデータ同期する前に、wal_level設定を変更するためにプライマリサーバを起動停止するように記述していました。この手順は安全ではありません。
いくつかのセッションが同時にタプル更新チェーンを競合しないモードで古いスナップショットを使ってロックして成功した場合、結果として有効行が無い状態となるので、稀な状況においてエラーを起こすことがありました。
その結果、参照先テーブルの該当行が同時更新されている場合に、該当行は在るにもかかわらず、それを参照する外部キー制約違反のエラーが発生しました。
おそらくアンチウイルス製品により稀におきていた子プロセスの起動失敗が、これにより修正されると考えられます。
この修正により、チケットを認識するクライアント側の SSLコードによる再接続の失敗を防止します。
シャットダウン後 0.5秒以内に発行された統計情報の問い合わせは、事実上無視されていました。
これによりデフォルトの受信バッファサイズがこれよりも小さい古いプラットフォームで、統計情報データを取りこぼすリスクを軽減できます。
結果として一時ファイルでディスク領域が過度に消費されていました。
以前のアルゴリズムはオープンしているトランザクションが多いサーバ上では実行不能なほど高コストでした。
これは特に、頻繁にキャッシュ無効化を起こすロジカルデコーディングに有益です。
複数列の外部キー制約が存在していて、しかし、クエリの結合構造と完全に一致しない場合、プランナは全く役に立たないヒューリスティック推定を使用していました。このような場合に、9.6 より前の推定方法に戻されました。
エラー発生例: db1=# CREATE DOMAIN d25 int[]; db1=# CREATE TABLE t25 (c1 d25); db1=# INSERT INTO t25 (c1[1], c1[2]) VALUES (100, 200); ERROR: multiple assignments to same column "c1" 単なる配列型であれば実行できる: db1=# CREATE TABLE t25_2 (c1 int[]); db1=# INSERT INTO t25_2 (c1[1], c1[2]) VALUES (100, 200); db1=# SELECT * FROM t25_2; c1 ----------- {100,200} (1 row)
以下のような形の SQL がエラーになっていましたが本来制限されるものではありませんでした。
db1=# SELECT sum((SELECT row_number() OVER () FROM t1 )) FROM t1; ERROR: aggregate function calls cannot contain window function calls
以前は、ビュー条件を確認する必要がある場合でも、確認せずに、更新を完全に外部サーバにプッシュしてしまう可能性がありました。
以前の修正では、CREATE実行時に競合する自動生成された配列型の名前を変更していました。本修正は以前の修正を名前変更操作に拡張したものです。
再作成した制約にコメントを再適用すると、奇妙なエラーメッセージ(現れ方は様々です)が表示されたり、クラッシュすることがありました。
CREATE TABLE は暗黙に CHECK制約に対する NOT VALID 指定を外します。作った時点ではテーブルは空なので制約は即座に検証済にできるからです。しかし、これは外部テーブルにはあてはまりません。
CREATE TYPE は以前から使われていないこのスタイルで宣言された I/O 関数を更新しますが、型に依存関係を記録することを忘れ、後続の DROP TYPE が関数定義を壊れたままにしていました。
本修正を適用した結果、money型の値の演算結果(多くは末尾桁部分)が変わる可能性があります。
広く使われているものを含め、ロケールによっては、これらの関数がマルチバイト文字の断片を空白として誤って解釈する可能性がありました。マルチバイトの識別子(テーブル名等)を使っている場合の問題となります。
これによって移植性の問題が回避されます。典型的には、最近の Perlバージョンで作業する場合、ライブラリの読み込み中にハンドシェイク不一致が表示されていました。
これを行わないと、SSL から non-SSL 接続へのフォールバック時に、SSL試行における GSS/SASLの失敗により常に非SSLの試行の失敗をひき起こしました。SSPIは失敗しませんでしたが、メモリがリークしました。
この誤動作は、BSD プラットフォーム (macOS を含む) で観測されましたが、他のほとんどのプラットフォームでは検出されませんでした。
権限を与える命令よりも後ろにすることで、マテリアライズドビューが他ユーザが所有するテーブルを参照しているときの、ダンプ/リストアでのエラーを防ぎます。
また、イベントトリガの所有者を適切に割り当てるようになりました。これまではリストアスクリプトを実行したスーパーユーザが所有者になっていました。
publicスキーマが無い場合に失敗しないようになりました。
ファイルディスクリプタをバイナリモードにしそこなっていたため、標準出力に書き出されたダンプに壊れたデータが含まれていました。圧縮されたプレーンテキスト(-Z -Fp オプション)を標準出力に書き出す(すなわち -f オプションではない)場合に該当します。
一部の限られたケースで pg_dump がビューをダンプするのにpg_get_ruledef() 関数に依存することがありました。その場合、誤ったダンプ出力が生じて、リストア時に失敗してしまいます。
共通列を持たない NATURAL LEFT JOIN で ON句を持たない定義になっていました。これは文法違反でエラーになります。
誤動作例: db1=# CREATE TABLE t47_1 (id1 int, c1 int); db1=# CREATE TABLE t47_2 (id2 int, c2 int); db1=# CREATE VIEW v47 AS SELECT * FROM t47_1 NATURAL LEFT JOIN t47_2; db1=# q $ pg_dump -d db1 -t v47 (出力中略) CREATE VIEW v47 AS SELECT t47_1.id1, t47_1.c1, t47_2.id2, t47_2.c2 FROM (t47_1 LEFT JOIN t47_2);
関数呼び出しと似た形の式が正しく復元できませんでした。
(例: FROM句の4つの式はいずれも正しくダンプできませんでした) CREATE VIEW v48 as SELECT * FROM COALESCE(1,2) AS c, COLLATION FOR ( 'x'::text ) col, CURRENT_DATE AS d, CAST( 1 + 2 as int ) AS i4;
ファイルディスクリプタをバイナリモードにしそこなっていたため、標準出力に書き出されたバックアップに壊れたデータが含まれていました。
通常は PostgreSQLのデータディレクトリにこのようなファイルは現れませんが、一部の場合に存在する可能性があります。
これはアップグレードされたスタンバイサーバが再接続するのを防ぎます。
報告されるレコード長が誤っていました。
これにより接続パラメータに影響するオプション変更が即座に反映されることを保証します。
従来よりもより多くのケースで、応答しないリモートサーバの待機から迅速に抜け出すことができるようになります。
本変更は大きい拡張ライブラリのビルドを助けます。一部のプラットフォームで -fpic では大きい共有ライブラリにおいて失敗していました。
本修正により、MSVCビルドで標準の libxml2 インストールの状態からファイルを移動する必要がなくなります。
これにより最近の Perlバージョンで警告やエラーが発生するのを回避します。
圧縮後、インラインデータで 64KB 以上のタプルにおいて、ロジカルデコーディングがクラッシュしていました。これは REPLICA IDENTITY FULL が有効なテーブルでのみ発生します。