このリリースは 9.1.20 からの修正リリース(2016年3月31日リリース)です。
9.1.x からのアップデートではダンプ、リストアは不要です。
また、9.1.16 より前のバージョンからアップデートを行う場合は 9.1.16 に関する技術情報 を参照してください。
PostgreSQL 9.1.20 から 9.1.21 への変更点
9.5.2、9.4.7、9.3.12、9.2.16、9.1.21 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
Cロケール以外をお使いの場合、本バージョンへのアップデート後に REINDEX が必要になります。
- Cロケール以外での文字列ソートに短縮キーが使えなくなりました。 (Robert Haas) (9.5)
- キャッシュされたプランで行セキュリティ状態を適切に保つようになりました。 (Stephen Frost) (9.5)
- contrib/pageinspect拡張モジュールの新たな関数に管理者ユーザであるかのチェックが追加されました。 (Andreas Seltenreich) (9.5)
- インデックス付けされた ROW() の比較について修正されました。 (Simon Riggs) (9.5)
- インデックス付けされた ROW() の比較において、NULLインデックス項目の誤った扱いが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- 前後に適切な fsync() 実行の無いファイル名変更によるデータ損失シナリオを回避するように修正されました。 (Michael Paquier, Tomas Vondra, Andres Freund) (9.5)(9.4)(9.3)(9.2)(9.1)
- SELECT ... FOR UPDATE/SHARE を行い、かつ、ロックを必要としないリレーションも含むクエリにおいて、同時に変更された行の再チェックを行うときの振る舞いが修正されました。 (Tom Lane) (9.5)
- json_to_record() 関数の障害が修正されました。 (Tom Lane) (9.5)(9.4)
- jsonb_object() 関数を 2引数で空配列にて呼び出した場合について修正されました。 (Michael Paquier, Andrew Dunstan) (9.5)
- jsonb_set() 関数にて、パス配列の要素が配列添え字として使う整数に変換されるときの誤動作が修正されました。 (Michael Paquier) (9.5)
- to_char() のテンプレートパターン「OF」による負のタイムゾーンオフセットの誤った整形が修正されました。 (Thomas Munro, Tom Lane) (9.5)(9.4)
- INSERT ... ON CONFLICT による待機について誤ったログ出力の可能性があり、修正されました。 (Peter Geoghegan) (9.5)
- リカバリが一貫性のある状態に達するまで、recovery_min_apply_delay パラメータを無視するようになりました。 (Michael Paquier) (9.5)(9.4)
- サーバのスタートアップ中、pg_subtrans が XID周回に近い場合について正しく処理するように修正されました。 (Jeff Janes) (9.5)(9.4)(9.3)(9.2)(9.1)
- ロジカルデコーディングにおけるいくつかの障害が修正されました。 (Andres Freund) (9.5)(9.4)
- 入れ子になったセキュリティバリアビューについて、外側のビューが相関サブクエリを含むWHERE句を持つときのプランナの誤りが修正されました。 (Dean Rasheed) (9.5)(9.4)
- GINインデックス検索でメモリリークが修正されました。 (Tom Lane) (9.5)
- ロケール機能の実装コードが稀な状況でメモリ二重解放によりクラッシュすることがあり、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- 全文検索の ispell辞書むけ接辞ファイル(AffFile)の読み取りが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- ispell辞書ファイルの読み取りで sscanf() を使わないようになりました。 (Artur Zakirov) (9.5)(9.4)(9.3)(9.2)(9.1)
- IBM xlcコンパイラでの PPC 上のアトミック操作コードが修正されました。 (Noah Misch) (9.5)
- Visual Studio 2013 でビルドした PostgreSQL が、AVX2-capable CPU を使ったサーバ上の古いバージョンの Windows (7 sp1 / 2008R2 sp1より古い) でクラッシュするのを回避するように修正されました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
- psql のタブ補完がマルチバイト文字を適切に扱えるように修正されました。 (Kyotaro Horiguchi, Robert Haas) (9.5)(9.4)(9.3)(9.2)(9.1)
- SECURITY LABEL に対する psql のタブ補完が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_ctl がコマンドラインに指定がなくとも PGCTLTIMEOUT環境変数による待機タイムアウトを受け入れるようになりました。 (Noah Misch) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_ctl にて Windowsサービス状態の検査が修正されました。 (Manuel Mathar) (9.5)(9.4)(9.3)(9.2)(9.1)
- pgbench が -C と -M prepared オプションの組み合わせを正しく扱えるように修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_upgrade で、新データディレクトリが旧データディレクトリ内にあるとき削除スクリプトの作成を省略するようになりました。 (Bruce Momjian) (9.5)(9.4)(9.3)
- PL/Perl で空の PostgreSQL配列を空の Perl配列に適切に変換できるように修正されました。 (Alex Hunsaker) (9.5)(9.4)(9.3)(9.2)(9.1)
- PL/Python で有効な Python識別子でない関数名をうまく処理できるようになりました。 (Jim Nasby) (9.5)(9.4)(9.3)(9.2)(9.1)
- contrib/pgstattuple の pgstatindex()関数が返す統計について、いくつかの誤りが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- psed が Perl本体で提供されなくなったため、MSVCビルドで psed への依存が除かれました。 (Michael Paquier, Andrew Dunstan) (9.5)(9.4)(9.3)(9.2)(9.1)
- タイムゾーンデータファイルが tzdata release 2016c に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
PostgreSQL 9.5 から、strcoll() に代えて strxfrm() を使うことで文字列比較を高速化する仕組みが導入されました。現在ほとんどのバージョンの glibc で、一部ロケールにおいて strxfrm()の実装が誤っていて、比較結果が strcoll() と一致しないことが明らかになりました。この問題がよく把握されるまで、この最適化はCロケール以外では無効となりました(Cロケールの場合、strcoll() も strxfrm() 使わないので安全です)。
この変更は、文字列データ型に対するソートのみならず B-treeインデックス上の並び順にも影響します。バージョンアップ後に REINDEX が必要です。
ここで影響のあるロケールの網羅的なリストを示すことはできません。Cロケールは安全です。en_US のような英語ベースのロケールは問題ないと見られます。de_DE など、その他の一般的なロケールは、ほとんどのglibc バージョンで影響があります。
2つ以上のロールで問い合わせが実行されるセッションでは、プランキャッシュが他のロールで生成されたプランを誤って再利用する可能性があり、これにより、行単位セキュリティが使われているとき、間違ったポリシーセットが適用されるおそれがありました。(CVE-2016-2193)
bytea型データを解析する pageinspect拡張モジュールの大部分の関数は、一般ユーザからの呼び出しを許可していませんが、brin_page_type() とbrin_metapage_info() ではチェックが漏れていました。
作りこまれた byteaデータをこれらの関数に渡すことで、サーバをクラッシュさせたり、わずかなサーバメモリを露出させることができるかもしれません。(CVE-2016-3065)
ここで ROW() とは複数カラムの1行データを指します。ROW(1, 100, 'A') のように記述しますが、単に (1, 100, 'A') のようにも書きます。
複数カラムに条件を付けて検索した場合に、インデックス順序が一部だけ適合するような複合インデックスが使われると誤った結果が返ることがありました。以下に例を示します。
db=# CREATE TABLE t1 AS SELECT (10 + random() * 10)::int AS c1, round((10 + random() * 10)::numeric, 5) AS c2 FROM generate_series(1, 10000) g; db=# SELECT count(*) FROM ( SELECT * FROM t1 WHERE (c1, c2) < (20, 11) ORDER BY c1 DESC, c2) v; db=# CREATE INDEX idx_t1 ON t1 USING btree (c1 DESC, c2 ASC); → インデックス作成後、再度、上記の SELECT を行うと結果が異なることがある
9.5.0 で導入された最適化が原因です。より良い修正方法が得られるまで、ひとまず当該の最適化を除去するものとなりました。
「 ROW(a, b) > ROW('x', 'y') 」のような行比較をするインデックス検索が、bカラムで NULLに当たるとそこで止まってしまいました。そのため誤った結果が返る可能性があります。
以下に問題発生例を示します。本例末尾の SELECT文は、"Seq Scan" 以外の全てのインデックスを使うプランタイプにおいて誤った出力になります。
(間に b=NULL の行が1000行挟まっているデータを作成) db=# CREATE TABLE t2 (id int primary key, a text, b text); db=# INSERT INTO t2 VALUES (0, 'a', 'b'); db=# INSERT INTO t2 SELECT g, 'a', NULL FROM generate_series(1, 1000) AS g; db=# INSERT INTO t2 VALUES (1001, 'z', 'y'); (正しい出力) db=# SELECT a, b FROM t2 WHERE (a, b) > ('a', 'a') ORDER BY a, b; a | b ---+--- a | b z | y (2 rows) (インデックスが使われて、誤った出力) db=# CREATE INDEX idx_ab_t2 ON t2 (a, b); db=# SELECT a, b FROM t2 WHERE (a, b) > ('a', 'a') ORDER BY a, b; a | b ---+--- a | b (1 row)
電源断など OS/ハードウェアが異常停止した際にデータが壊れるおそれがありました。ただし、発生の可能性は低いといえます。
ロックされないリレーションに由来する行が、再チェックの間、全て NULL であるかのように誤って扱われていました。このことで、更新された行が WHERE条件を満たさなくなったと誤って判断されたり、誤って NULL が出力される可能性がありました。
以下の再現例が報告されています。
db=# CREATE TABLE t3 (id int primary key, v text); db=# CREATE TABLE t4 (id int primary key, v text, CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES t3 (id)); db=# INSERT INTO t3 VALUES (1, 'A'); db=# INSERT INTO t4 VALUES (1, 'B'); (接続その1) (接続その2) db=# BEGIN; db=# UPDATE t3 SET v = 'A' WHERE id = 1; db=# db=# pset null *null* db=# SELECT t3.v AS t3v, (SELECT t4.v FROM t4 WHERE t3.id = t4.id) AS t4v FROM t3 WHERE t3.id = 1 FOR UPDATE OF t3; ...ロック待ち... db=# COMMIT; ...ロック待ち解除後に応答に NULL が混入... t3v | t4v -----+-------- A | *null* (1 row)
入力オブジェクトがサブオブジェクトを含み、そのフィールド名が要求された出力カラム名のどれかに一致していた場合に、エラーになったり、出力が不正になったりしていました。
以下に例を示します。
db=# SELECT * FROM json_to_record('{"a":0,"b":{"c":1,"a":2}}'::json) AS t(a int , b text); ERROR: invalid input syntax for integer: "{"c":1,"a":2" 正しい出力は以下です。 a | b ---+--------------- 0 | {"c":1,"a":2} (1 row) db=# pset null *null* db=# SELECT t.c FROM json_to_record('{"a":1,"b":{"c":16,"d":2},"x":8}'::json) AS t(a int, b json, c text, x int); c --------- {"c":16 (1 row) 正しい出力は以下です。サブオブジェクトは取得できないのが正常です。 c -------- *null* (1 row)
以下のようなエラーが発生していました。
db=# SELECT jsonb_object('{}'::text[], '{}'::text[]); ERROR: unknown type of jsonb container 正しい出力は以下。空のJSONBオブジェクトが返る。 jsonb_object -------------- {} (1 row)
与える添え字用の値によっては不適切なエラーが出ることがあります。また、最悪の場合にはクラッシュをひき起こす可能性があります。
(正常動作の場合) db=# SELECT jsonb_set('{"a":[1],"b":[]}'::jsonb, '{"a",1}'::text[], '100'); jsonb_set ----------------------- {"a": [1, 100], "b": []} (1 row) db=# SELECT jsonb_set('{"a":[1],"b":[]}'::jsonb, '{"a",9999}'::text[], '100'); ERROR: path element at the position 2 is not an integer
(9.5.2 実行例) db=# SET timezone = '00:30'; SET db=# SELECT to_char(now(), 'OF'); to_char --------- -00:30 (1 row) (9.5.1 実行例) db=# SET timezone = '00:30'; SET db=# SELECT to_char(now(), 'OF'); to_char --------- +00:30 (1 row) (9.4.6 実行例) db=# SET timezone = '00:30'; SET db=# SELECT to_char(now(), 'OF'); to_char --------- +00:-30 (1 row)
原因となる制約が無いにも拘らず、排他制約のために待ちが生じたとログ出力されていました。
log_lock_waits = on を設定した時のログで CONTEXT: に以下のように出力されます。
LOG: process 12345 acquired ShareLock on transaction 1234 after 12345.678 ms CONTEXT: while checking exclusion constraint on tuple (1,2) in relation "t3"
これまでスタンバイサーバは、データベースを有効な状態にするために必要とされるWALの初期部分を再生するときであっても、recovery_min_apply_delay 設定に対応して WALレコード適用を遅延していました。
スタンバイサーバは一貫性のある状態に到達するまで使えないため、この動作は役に立たないと判断されました。
上記の「スタートアップ中」は、リカバリ中やスタンバイサーバ稼動中の状態が含まれます。
pg_subtrans/ 以下にファイルが大量に作られる現象が報告されています。
問題ケースには以下が含まれます。
テーブルに指定された REPLICA IDENTITY が FULL であって変更タプル群が 1ページよりも大きい場合にアサート失敗を、またアサート無しのビルドで何らかの不正動作を、引き起こします。
ディスクへのスプールを要するほどに大きいトランザクション内でのプライマリキーを変更する UPDATE で新旧データが入れ替わってしまいました。
不正なエラー「ERROR: subxact logged without previous toplevel record」が発生することがありました。
9.5.x で誤ったトランザクションのコミット時刻が報告されました。
以下の v2 のような形のビュー定義が該当します。
CREATE VIEW v1 WITH (security_barrier = true) AS SELECT * FROM t1 WHERE (c1 > 0) WITH CHECK OPTION; CREATE VIEW v2 WITH (security_barrier = true) AS SELECT * FROM v1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.c1 = v1.c1) WITH CHECK OPTION;
ビューの参照時に予期せぬエラー「ERROR: XX000: plan should not reference subplan's variable」がでるケースが報告されました。
大文字小文字変換でバイト長が変わる文字が含まれている接辞ファイルに対して動作が狂うかもしれませんでした。例えばトルコ語で UTF8 のロケールにおける「I」が該当します。
これにより Mac OS X を含む FreeBSD派生のプラットフォームにおける移植性の問題を回避します。
この誤りは該当プラットフォーム上で稀に同時操作の失敗をもたらします。
修正は Microsoft が修正しないと表明している Visual Studio 2013 のランタイムライブラリのバグを回避するものです。
SECURITY LABEL の後 TAB を押すとクラッシュしたり、あるいは、不適切なキーワードが提示される可能性がありました。
本環境変数の参照は本マイナーバージョンで追加された動作となります。
前のマイナーリリースで、ログメッセージを Windowsイベントログに出すかどうか適切に判断する修正が試みられましたが、逆さまに検査していました。
これまでは当該オプション組み合わせでは動作しませんでした。
上記ケースで盲目的にこのスクリプトを適用すると結果として新データディレクトリが失われてしまいます。
デッドページが有効なページと報告されていました。インデックスメタページがインデックスサイズに含まれていませんでした。ルートページが internal_pages に含まれていませんでした。ドキュメントもいくつか修正されました。
本修正前後のマイナーバージョンでの結果と数値比較をする場合には注意が必要となります。
アゼルバイジャン、チリ、ハイチ、パレスチナ、ロシア(アルタイ、アストラハン、キーロフ、サハリン、ウリヤノフスク地域)の夏時間法の変更、加えて、リトアニア、モルドバ、ロシア(カリーニングラード、サマラ、ヴォルゴグラード)の歴史的修正が含まれます。