このリリースは 9.0.19 からの修正リリース(2015年5月22日リリース)です。
9.0.x からのアップデートではダンプ、リストアは不要です。
また、9.0.19 より前のバージョンからアップデートを行う場合は 9.0.19 に関する技術情報を参照してください。
PostgreSQL 9.0.19 から 9.0.20 への変更点
9.4.2、9.3.7、9.2.11、9.1.16、9.0.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- 認証タイムアウトになる直前にクライアントが切断した時に、クラッシュする可能性が回避されました。 (Benkocs Norbert Attila) (9.4)(9.3)(9.2)(9.1)(9.0)
- システムコール失敗の判定が改善されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- contrib/pgcrypto の復号失敗時のメッセージを、間違ったキーか不正なデータかによらず統一しました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- マルチトランザクションID 処理の周回対策が行われました。 (Álvaro Herrera, Robert Haas, Thomas Munro) (9.4)(9.3)
- contrib/citext モジュールの regexp_matches() 関数の間違っていた宣言が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- json 型への変換で、無限大の日付や時刻はエラーにせず 'infinity' にするようになりました。 (Andrew Dunstan) (9.4)
- json/jsonb の populate_record() と to_record() 関数が、空の入力を正しく扱うようになりました。 (Andrew Dunstan) (9.4)
- HOT 更新後の遅延された排他制約の誤った検査が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- ALTER TABLE ... ALTER CONSTRAINT で外部キー制約の遅延可能状態を変更するときの振る舞いが修正されました。 (Tom Lane) (9.4)
- スタースキーマ式クエリのプラン作成が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)
- 他の外部結合に対する anti-join (NOT EXISTS 結合) の不適切な配置換えを防止するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 外部結合プランノードでの部分式の誤ったマッチングが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 結合順序のヒューリスティック手法が失敗した場合に対応できるように GEQO プランナが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- UPDATE、DELETE 対象がセキュリティバリアビューであるとき、適切に行ロックが確実に生じるように修正されました。 (Stephen Frost) (9.4)
- PostgreSQL 起動時にレプリケーションスロットのデータを同期するとき、ファイルを read/write で開くようになりました。 (Andres Freund) (9.4)
- max_prepared_transactions が小さすぎる場合に PostgreSQL 起動時のデッドロックの可能性があり、修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- タイムラインが切り替わった後に使えない事前割り当てされた WAL ファイルをアーカイブしないようになりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- クラッシュ後に再帰的にデータディレクトリの fsync() を行うようになりました。 (Abhijit Menon-Sen, Robert Haas) (9.4)(9.3)(9.2)(9.1)(9.0)
- autovacuum ランチャープロセスが、SIGTERM シグナルを受け取った後にエラーが起きた場合に、シャットダウンに失敗していたものが修正されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
- セッション開始初期のシステムカタログに対する無効化メッセージの扱いが修正されました。 (Tom Lane) (9.4)
- BackendIdGetTransactionIds() で、ちょうど終了したバックエンドプロセスの状態取得を試みたときのクラッシュが修正されました。 (Tom Lane) (9.4)
- LockBufferForCleanup() での予期せぬシグナルに対処するようになりました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
- 行全体を参照するチェック制約の付いたテーブルに対する COPY IN 実行時のクラッシュが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)
- read-only であるトランザクションのコミットでは、そのユーザに限り、WAL フラッシュや同期レプリケーションを待たないようになりました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
- recovery_min_apply_delay に短い時間が設定されているときのビジーウェイトを回避するようになりました。 (Andres Freund) (9.4)
- 一時テーブル上のハッシュインデックスを操作するときに生じるクラッシュが修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- 他プロセスが同時にインデックスを変更している場合、ハッシュインデックスのバケツ分割に失敗する可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- GIN インデックスの VACUUM におけるメモリリークが修正されました。 (Heikki Linnakangas) (9.4)
- インデックス式の ANALYZE 中に割り込みをチェックするようになりました。 (Jeff Janes) (9.4)(9.3)(9.2)(9.1)(9.0)
- 行ロック後に READ COMMITTED 再チェックが生じたときに、外部テーブルのテーブルOID が確実に正しく報告されるようになりました。 (Etsuro Fujita) (9.4)(9.3)(9.2)(9.1)
- 外部サーバユーザマッピングのオブジェクト説明文字列にターゲットサーバ名が追加されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
- 符号化方式変換オブジェクトのオブジェクト識別文字列にスキーマ名が含まれるようになりました。 (Álvaro Herrera) (9.4)(9.3)
- Kerberos/GSSAPI/SSPI 認証でオプション設定に include_realm=1 を推奨するようになりました。 (Stephen Frost) (9.4)(9.3)(9.2)(9.1)(9.0)
- IPv4 の pg_hba.conf 項目を IPv4-in-IPv6 アドレスと照合する機能が除去されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 実際には起動しなかったバックグラウンドワーカが終了したときの状態報告が修正されました。 (Robert Haas) (9.4)
- データベースクラッシュ後、BGW_NEVER_RESTART 属性が指定されているバックグラウンドワーカは再起動しないようになりました。 (Amit Khandekar) (9.4)
- レプリケーションコマンド IDENTIFY_SYSTEM の応答で WAL 挿入でなく、WALフラッシュの位置を報告するようになりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)
- Windows でサービス停止するときに、サービスが早くに強制終了されてしまうのを防ぐために、サービスコントロールマネージャに周期的に状態を送るようになりました。 (Krystian Bigaj) (9.4)(9.3)(9.2)(9.1)(9.0)
- libpq でノンブロッキングモードを使うときのネットワークデッドロックの危険性が軽減されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- libpq でURI接続文字列の空値の解析の誤りが修正されました。 (Thomas Fanghaenel) (9.4)(9.3)(9.2)
- ecpg で配列の扱いが修正されました。 (Michael Meskes) (9.4)(9.3)(9.2)(9.1)(9.0)
- psql が connect の最初の引数として URI と接続文字列を正常に扱えるように修正されました。 (David Fetter, Andrew Dunstan, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
- 一部プラットフォームにおいて、終了時に ~/.psql_history を書くのに失敗した、という psql の誤ったメッセージを抑止するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump にて、システム提供されたダンプ不要のキャストを判断する規則が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump で -Fd が指定されたとき -Z で指定した圧縮レベルを尊重するように修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)
- pg_dump がダンプ順序の選択において、拡張モジュールの設定テーブル間の外部キー関係を考慮するようになりました。 (Gilles Darold, Michael Paquier, Stephen Frost) (9.4)(9.3)(9.2)(9.1)
- 同時実行で一時関数の作成削除をしている場合に pg_dump が失敗する可能性があり、これを防ぐようになりました。 (Tom Lane) (9.4)(9.3)
- 定義が VALUES (...) だけでカラム別名を持つビューのダンプが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- ダンプ/リストアでビューのレプリケーション識別(pg_class.relreplident) が確実に正しく 'n' (REPLICA_IDENTITY_NOTHING) になるように修正されました。 (Marko Tiikkaja) (9.4)
- pg_upgrade で新データベースクラスタのタイムラインを強制的に 1 にするようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_upgrade で不適切な接続不能データベースが無いか検査するようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_upgrade で生成される delete_old_cluster スクリプトの中でディレクトリパスを適切にクオートするようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_upgrade でデータベースレベルの凍結情報を適切に保持するようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- Windows 上で pg_upgrade と pg_resetxlog を制限された権限で実行するようになりました。 (Muhammad Asif Naeem) (9.4)(9.3)(9.2)(9.1)(9.0)
- initdb と pg_basebackup でディレクトリを読み取るときに readdir() が失敗した場合の扱いが改善されました。 (Marco Nenciarini) (9.4)(9.3)(9.2)(9.1)
- contrib/intarray モジュールの遅いソートアルゴリズムが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- SPARC V8 機でのコンパイル失敗が修正されました。 (Rob Rowan) (9.4)(9.3)(9.2)(9.1)(9.0)
- OS X でビルドする際のいくつかの警告が出なくなりました。 (Tom Lane) (9.4)(9.3)
- タイムゾーンデータファイルが tzdata release 2015d に更新されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_receivexlog の障害が修正されました。 (Andres Freund) (9.2)
タイムアウトの割り込みが、セッション切断処理中に発生すると、SSL 関連情報が二重解放されクラッシュし、その結果、他のセッションへの DoS となります。実験では認証されていないリモート攻撃者が、一貫してバグを引き起こすことが可能なため、セキュリティ上の問題として扱っています。(CVE-2015-3165)
snprintf() などの代替実装では、下位のシステムライブラリ呼び出しでのエラーチェックに間違いがありました。主な問題は、メモリ不足の状況での対応不足にあります。最悪の場合、実装コードでは、バッファが上書きされていないのに、上書きされたとみなすことにより、情報が漏洩する可能性があります。
他の *printf() ファミリ関数呼び出しにも、悪い時にメモリ不足を起こすと、情報漏洩する脆弱性が残っている可能性があります。開発コミュニティは、大きなリスクではないと判断していますが引続き解析を続けるとのことです。(CVE-2015-3166)
以前は、間違ったキーによる復号では、異なったエラーメッセージが報告されていました。その様なエラーメッセージの違いは、他のシステムを使ってキーを見つけようとする攻撃者への助けになることが知られています。pgcrypto のこの振る舞いが攻撃に利用できるかは不明ですが、単一のメッセージを使う方が、リスクを避けるのに良いと考えられます。(CVE-2015-3167)
特定の利用パターンだと、既存の対策が不十分なため pg_multixact/members ファイルが早くに削除されてしまい、結果としてデータを損失します。
サーバ側修正として、古いマルチトランザクションメンバ ID を上書きしそうな場合、トランザクションを「multixact "members" limit exceeded」エラーで失敗させるようになります。
autovacuum の改良として、トランザクション ID の周回と同様、マルチトランザクション ID の周回防止の活動を行なうようになります。
この関数は text 型に対する定義と同様に citext型に対しても setof text[] を返すべきですが、text[] を返すように宣言されていました。このため、マッチしない場合に 0 行が返るのでなく NULL が返る、'g' フラグを指定しても実質的には無視される、という振る舞いになっていました。
db1=# SELECT id, v AS v_is_citext FROM t5; id | v_is_citext ----+---------------- 1 | pgsql is PGSQL 2 | pgSQL (2 rows) db1=# SELECT id, regexp_matches(v, 'xxxxx'::citext) FROM t5; 【本来期待された振る舞い】 id | regexp_matches ----+---------------- (0 rows) 【これまでの振る舞い】 id | regexp_matches ----+---------------- 1 | 2 | (2 rows) db1=# SELECT id, regexp_matches(v, 'pgsql'::citext, 'g') FROM t5; 【本来期待された振る舞い】 id | regexp_matches ----+---------------- 1 | {pgsql} 1 | {PGSQL} 2 | {pgSQL} (3 rows) db1=# SELECT id, regexp_matches(v, 'pgsql'::citext, 'g') FROM t5; 【これまでの振る舞い】 id | regexp_matches ----+---------------- 1 | {pgsql} 2 | {pgSQL} (2 rows)
これまでの振る舞いに依存するアプリケーションが存在する可能性があるため、デフォルトの宣言は PostgreSQL 9.4 以前では変更されません。9.4 以前では、従来の宣言は拡張モジュールのバージョン 1.0 として提供され、正しい宣言は拡張モジュールのバージョン 1.1 として提供されます。以下のようにしてバージョン 1.1 に上げることができます。
db1=# ALTER EXTENSION citext UPDATE TO '1.1'; db1=# dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+-------------------------------------------------- citext | 1.1 | public | data type for case-insensitive character strings plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)
本来は無視されるべき排他制約違反が報告されることがありました。
遅延された排他制約に違反する可能性のある新しい行が同トランザクションで後に HOT更新された場合、後に削除される行が新たな行と当初に衝突していた場合でも、排他制約違反が最後のチェックで報告されることがありえました。
これまで、後に続く同セッションでの操作、または同時実行の別セッションにて、変更を即座に尊重しないことがありました。
大きなテーブルの効果的なスキャンでは、インデックスパラメータが複数の結合テーブルから提供されることがしばしば必要となります。プランナはこのような計画を発見できないといけませんが、これまで、あまりに制限的なヒューリスティック検索がこれを妨げていました。
t10_fact が行数の非常に多いテーブル、t10_dim_a と t10_dim_b が行数の少ないテーブルであるとしたときの、以下のようなクエリであって、a.c1 = 1 と b.c1 = 2 の二つの条件で選択行を大幅に限定できるという場合が該当します。
SELECT * FROM t10_fact f, t10_dim_a a, t10_dim_b b WHERE f.aid = a.id AND f.bid = b.id AND a.c1 = 1 AND b.c1 = 2;
プランナにおける本障害により「could not find RelOptInfo for given relids」エラーがあらわれます。しかし時には、誤ったクエリプランが一貫性チェックをパスして、エラーを出すことなく誤ったクエリ実行結果を返す可能性もあります。
これまでは、外形上同一の STRICT でない(すなわち NULL入力が認められる) 部分式が外部結合の上位と下位とで使われているとき、プランナが結合の下位で計算した値を再利用しようとすることがありました。
エグゼキュータは外部行にマッチしない場合は値を NULL にするため、これは誤った動作でした。
以下に障害動作例を示します。
db1=# CREATE TABLE t12 (c1 int, c2 int); db1=# INSERT INTO t12 VALUES (1,NULL),(NULL,2); db1=# SELECT a.c1 AS a_c1, b.c2 AS b_c2 FROM t12 a LEFT JOIN t12 b ON a.c2 = coalesce(b.c1, 1) WHERE coalesce(b.c1, 1) > 0; 【9.4.2 での結果】 a_c1 | b_c2 ------+------ | 1 | (2 rows) 【9.4.1 での誤った結果】 a_c1 | b_c2 ------+------ (0 rows)
本障害により、LATERALを含むクエリでエラー「failed to join all relations together」が出ます。また、その他の場合でも発生する可能性があります。
これまで行ロック処理が欠落してしまうことがありました。
一部のプラットフォームでは、これまでのコードでは「could not fsync file "pg_replslot/...": Bad file descriptor.」というエラーをひき起こしていました。
未コミットのプリペアドトランザクションよりも小さい max_prepared_transactions を指定して、再起動すると、PostgreSQL のマスタプロセスが残ったまま起動に失敗する例が報告されました。
これにより、別のシステムレベルのクラッシュがすぐ後に起きた場合でも、一貫性を確実にします。
本障害は システムカタログに対する VACUUM FULL を同時に開始するセッションで失敗をひき起こしていました。
この誤りは「multiple backends attempting to wait for pincount 1」という偽性の(本来はエラーではない)エラーをひき起こしていました。
なお、ピンとはバッファページに対するアクセスを排他制御する内部的なロック機構の一つです。
クラッシュすることが知られているのは 9.4 以上だけですが、同様のコードが 9.3、9.2 にあるため、合わせて修正されています。
(障害再現例) db1=# CREATE TABLE t23 (id int primary key , c1 int, c2 int); db1=# CREATE FUNCTION check_con_func(t23) RETURNS boolean LANGUAGE plpgsql IMMUTABLE AS $$ BEGIN RETURN ($1.c1 > 0); END $$; db1=# ALTER TABLE t23 ADD CHECK (check_con_func(t23.*)); db1=# COPY check_con_tbl FROM STDIN; >> 0 0 0 >> 1 1 1 >> . server closed the connection unexpectedly
これまでは(参照処理でも)HOT ページ掃除のために WALを書くトランザクションにおいて遅延がありえ、全スタンバイがダウンしている場合には、固まってしまいました。また、同期レプリケーションのときのキャッチアップ割り込み処理でも固まることがありました。本修正はこれらの問題を解消します。
ミリ秒以下の遅延設定は無視されるようになります。
ANALYZE ではインデックスの式を多数実行します。この式の中に遅い関数があった場合、ANALYZE を処理ループが終わる前にキャンセルできることが望まれます。
これまで外部テーブルのテーブルOID には無効な値が設定されていましたが、上記ケースでは意味のある値が必要とされ、適切に動作しませんでした。
出力メッセージにあらわれる「user mapping for {ユーザ名}」が、「user mapping for {ユーザ名} on server {サーバ名}」となります。
ドキュメントのみ修正されています。PostgreSQL 9.5 からデフォルトで include_realm=1 となる予定です。
本機能は 2003年に追加されましたが、9.0 で適切に動作していませんでした。この壊れたコードが一部のシステムでクラッシュをひき起こすことが報告されました。
拡張モジュール作成用の API の動作変更となります。GetBackgroundWorkerPid() の応答が変更されました。
PostgreSQLソースコードに含まれる機能や拡張モジュールの中で、contrib/worker_spi と contrib/test_shm_mq 以外で本変更の影響を受けるものはありません。
これにより pg_receivexlog が、取得しようとしたデータがまだ WALファイルに書き込まれていないことで、起動失敗する可能性を回避します。
また、pg_ctl が確実にシャットダウンを待つようになりました。
大きいデータを送るとき、サーバが出力をブロックするほどの応答データを送ってくることに備えて、入力バッファが時々に捌けることが重要となります。典型的なシナリオは、サーバが COPY FROM STDIN の実行中に連続して NOTICE メッセージを送ってくる場合です。このとき、通常のブロッキングモードなら問題ありませんが、ノンブロッキングモードの場合、デッドロックの危険性があります。
libpq は日和見的に可能であれば入力を排出するように修正されました。完全にネットワークデッドロックを防ぐためには、アプリケーションの協力が必要です。アプリケーションは write-ready 状態だけでなく、read-ready に気を付けなければならず、read-ready 状態で確実に PQconsumeInput() を呼ばなければいけません。
1文字分の配列オーバーラン参照が生じていました。クライアント側のメモリ読み取りであり、セキュリティ上の危険性はありません。
一次元配列について C 言語の配列へのマッピングがサポートされました。
本構文はドキュメント化されていませんが、永らく受け入れられてきました。本修正でドキュメント記載されました。
本構文を使った場合に、一部のパラメータで与えられた値でなく旧の接続の値が使われる誤りがあり、修正されました。
(本構文の実行例) postgres=# connect "dbname=db1 user=postgres" You are now connected to database "db1" as user "postgres". db1=# c postgresql://localhost:5432/db2 You are now connected to database "db2" as user "postgres" on host "localhost" at port "5432". db2=#
この誤動作は 2006 年以前の古いバージョンの libedit の障害を回避するために生じていました。回避策のコードを除去することで修正しました。そのため、古い libedit では再び問題が生じます。libedit をバージョンアップをするか、libreadline を使うことを推奨します。
キャスト名が「pg_」で始まっているかではなく、キャストの OID で判断するようになりました。
修正前には常にデフォルト圧縮レベルになっていました。
本修正前では、一過性の外部キー制約違反によりダンプ読み込み失敗をひき起こすことがありました。
これまで、ダンプ内容からカラム名が欠落してしまっていました。
これまで、ビューが循環依存している場合、レプリケーション識別属性がおかしくなることがありました。
この変更は、WALヒストリファイルが無いという誤ったエラーによるアップグレード失敗を防ぎます。
postgres データベースと template1 データベースにて pg_database.datfrozenxid と pg_database.datminmxid が維持されていませんでした。アップグレード後、これらデータベース上のテーブルやインデックスにアクセスすると、pg_clog 下のファイルが無いというエラーをひき起こしていました。
これにより、Administratorユーザから実行されても失敗しなくなります。これまで「Permission denied」が出て失敗するケースが報告されていました。
readdir()システムコールが設定する errno 変数値が失われないように修正されました。エラーメッセージに失敗理由が正しく表示されるようになります。
これまでは挿入ソートで実装されていて、最大で O(N^2) の処理時間を必要としていました。クイックソートで置き換えられました。
エジプト、モンゴル、パレスチナにおける夏時間規則の変更、カナダ、チリの歴史的変更、America/Adak の時間帯省略形の改定(HAST/HADT でなく HST/HDT となる)が、適用されています。
9.2.10 で障害が入りこみ、エラー「could not create archive status file」をひき起こしていました。