このリリースは 8.4.21 からの修正リリース(2014/7/24リリース)です。
8.4.x からのアップデートではダンプ、リストアは不要です。
本バージョンで修正された GiST インデックスの不具合による影響がある場合、本バージョンへのアップデート後に REINDEX が必要になります。
また、8.4.19 より前のバージョンからアップデートを行う場合は 8.4.19 に関する技術情報を参照してください。
PostgreSQL 8.4.21 から 8.4.22 への変更点
9.3.5、9.2.9、9.1.14、9.0.18、8.4.22 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- pg_upgrade で正しくアップグレードできない問題が修正されました (Bruce Momjian) (9.3)
- contrib/btree_gist 拡張モジュールの bit型カラムに対するインデックスの初期パディングバイトが修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
- GINインデックスでページ破損を防ぐように修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
- リカバリ中における GiSTインデックスの処理が修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- text_ops 演算子クラスを適用した SP-GiSTインデックスにおいて、稀に無限ループが生じる可能性があり、修正されました。 (Tom Lane) (9.3)(9.2)
- SP-GiSTインデックスによる隣接演算子(-|-)を使った検索結果が誤っている場合があり、修正されました。 (Heikki Linnakangas) (9.3)
- pg_multixact/members ディレクトリのファイルに対するトランザクションID周回処理が修正されました。 (Álvaro Herrera) (9.3)
- pg_multixact の切り詰めを VACUUM 時でなく、チェックポイント時に行うようになりました (Álvaro Herrera) (9.3)
- WALリカバリの後、all-visibleフラグについて不整合が生じる可能性があり、VACUUM 処理が修正されました (Heikki Linnakangas) (9.3)
- 内部関数 ReceiveSharedInvalidMessages が入れ子で呼ばれた場合にキャッシュ無効化の不整合が出る可能性があり、修正されました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
- 他のプロセスのロックされた行の同時更新にて競合があり、修正されました (Andres Freund, Álvaro Herrera) (9.3)
- 継承機能における子テーブルを読むサブクエリに対する UNION ALL でプランナが失敗する障害があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)
- 複数行を返す関数がターゲットリストに含まれている時、サブクエリの出力がユニークである前提としないように、修正されました (David Rowley) (9.3)(9.2)(9.1)(9.0)(8.4)
- プランナが改善され、可能なら AND/OR 条件の入力から null定数を除去するようになりました (Tom Lane) (9.3)(9.2)
- プランナが VARIADIC キーワードを使った関数呼び出しと、そうでない関数呼び出しを同一にみなすように修正されました (Tom Lane) (9.3)
- json_populate_recordset() 関数における入れ子のJSONオブジェクトの扱いが修正されました (Michael Paquier, Tom Lane) (9.3)
- to_json() 関数などで引数型を型カテゴリで識別していたものが修正されました (Tom Lane) (9.3)(9.2)
- TOAST格納された複合型の配列などに対するアクセスでエラーがでる問題があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- Append を伴う実行プランの出力の行全体を参照するときに「ERROR: record type has not been registered」が出る問題が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- カーソルを巻き戻したときユーザ定義関数を呼び出す場合にバックエンドプロセスがクラッシュする可能性があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- FROM 句にある関数の引数を処理する際のメモリリークが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- 正規表現処理でメモリリークが修正されました (Tom Lane, Arthur O'Dwyer, Greg Stark) (9.3)(9.2)(9.1)(9.0)(8.4)
- テキスト全文検索におけるハンガリー語のストップワードの誤りが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- 外部テーブルを OID 列を含めて作ることができないようになりました (Etsuro Fujita) (9.3)(9.2)(9.1)
- 行の有効性チェックについて修正されました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
- pg_stat_activity ビューの xact_start 列の値が PREPARE TRANSACTION のとき表示しないようになりました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
- REASSIGN OWNED 命令がテキスト全文検索用オブジェクトに対してエラーをひき起こしていたものが修正されました (Álvaro Herrera) (9.3)(9.2)(9.1)(9.0)(8.4)
- pg_class テーブルの relminmxid 列の値が VACUUM FULL で後戻りしてしまうことを防ぐように修正されました (Álvaro Herrera) (9.3)
- ルールとビューの定義出力でインデントが削減されました (Greg Stark, Tom Lane) (9.3)
- ルールとビューの定義出力で、USING 節で指定した列名に当てはまる列を後からビューの元テーブルに追加した場合について、修正されました (Tom Lane) (9.3)
- 除去された列を含む複合型を返す関数を FROM句に持つビューの定義出力が修正されました (Tom Lane) (9.3)
- マスタープロセス(postmaster) が起動するときにシグナルをブロックするようになりました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- pg_hba.conf のIPアドレスの替わりにホスト名が書かれた項目の処理について修正されました (Tom Lane) (9.3)(9.2)(9.1)
- rootユーザでも postgres コマンドの -C および --describe-config オプションが使用可能となりました (MauMau) (9.3)(9.2)
- リグレッションテスト実行中の一時的な PostgreSQLサーバプロセスの UNIXドメインソケットがより安全になるように修正されました (Noah Misch) (9.3)(9.2)(9.1)(9.0)(8.4)
- テーブルスペース作成の WALリプレイが Windows で動作するように修正されました (MauMau) (9.3)(9.2)(9.1)(9.0)
- Windows でソケット作成失敗を正しく判断できるように修正されました (Bruce Momjian) (9.3)(9.2)(9.1)(9.0)
- Windows で backend コンテキストの設定パラメータを設定ファイルから変更したときに新しい接続で適用できるようになりました (Amit Kapila) (9.3)(9.2)(9.1)(9.0)(8.4)
- Windows の実行パス名が適切にクオートされるようになりました (Nikhil Deshpande) (9.3)(9.2)(9.1)(9.0)(8.4)
- OS X で libpython のリンクについて修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- クライアントが取り込むよりも速くサーバがデータを送り続けた場合に、libpq のメモリ大量使用を回避するように修正されました (Shin-ichi Morita, Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- libpq の接続時 LDAP 照会におけるタイムアウトについて修正されました (Laurenz Albe) (9.3)(9.2)(9.1)(9.0)(8.4)
- ecpg における char 型のポインタの配列の扱いについて修正されました (Ashutosh Bapat) (9.3)(9.2)(9.1)(9.0)
- pg_dump が GROUP BY で元テーブルの主キーに依存したマテリアライズドビューを正しく処理できるように修正されました (Tom Lane) (9.3)
- pg_dumpall の -i オプションのパースが修正されました (Tom Lane) (9.3)
- pg_restore で古いスタイルのラージオブジェクトのコメントの処理にについて修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- pg_upgrade で旧バージョンでは TOASTテーブルを作らず、新バージョンで作るという場合について修正されました。 (Bruce Momjian) (9.3)(9.2)
- pg_upgrade で pg_database.datminmxid と pg_class.relminmxid の旧バージョンにおける値を維持するか、妥当な値を入れるようになりました (Bruce Momjian, Álvaro Herrera, Tom Lane) (9.3)
- contrib/auto_explain 拡張モジュールが通常の EXPLAIN コマンドの出力内容を変えてしまうのが修正されました (Tom Lane) (9.3)(9.2)
- contrib/dblink 拡張モジュールでメモリリークが修正されました (MauMau, Joe Conway) (9.3)(9.2)
- contrib/pgcrypto 拡張モジュールの関数が、処理が返る前に機微情報を確実にスタック変数から削除するように修正されました (Marko Kreen) (9.3)(9.2)(9.1)(9.0)(8.4)
- contrib/pgstattuple 拡張モジュールの pgstat_heap() 関数で解放済みメモリが使われるのを防ぐ修正がされました (Noah Misch) (9.3)(9.2)
- contrib/uuid-ossp 拡張モジュールで、OSSP UUID ライブラリの状態をキャッシュするようになりました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
- タイムゾーンデータが tzdata release 2014e に更新されました (9.3)(9.2)(9.1)(9.0)(8.4)
- hot_standby_feedback 設定が稼動中に off に変更された場合の振る舞いが修正されました (Simon Riggs) (9.2)(9.1)
- プランナの入れ子になったプレースホルダ値の誤った扱いが修正されました (Tom Lane) (9.2)
initdb により取り残された pg_multixact ディレクトリのファイルを削除するようになりました。
9.3.5 以前の 9.3系列バージョンに付属する pg_upgrade を使用して、9.2.x 以前のデータベースクラスタを 9.3系列にアップグレードした場合に $PGDATA/pg_multixact/offsets/0000 ファイルが残ってしまいます。これは VACUUM 処理にて後に問題を引き起こします。とはいえ一般的なケースでは本ファイルを削除する必要はありません。
アップグレードしたデータベースクラスタに問題があるかは、以下の SQLを管理者ユーザで実行することで確認できます。
WITH list(file) AS (SELECT * FROM pg_ls_dir('pg_multixact/offsets')) SELECT EXISTS (SELECT * FROM list WHERE file = '0000') AND NOT EXISTS (SELECT * FROM list WHERE file = '0001') AND NOT EXISTS (SELECT * FROM list WHERE file = 'FFFF') AND EXISTS (SELECT * FROM list WHERE file != '0000') AS file_0000_removal_required;
「t」が返った場合には、手動で「$PGDATA/pg_multixact/offsets/0000」ファイルを削除してください。
本障害は、カラム値のイコール比較で誤ることで、誤った問い合わせ結果をひき起こします。GiSTインデックスを bit型または bit varying型のカラムに適用している場合には、 バージョンアップ後に REINDEX が必要となります。
これまでインデックスのページ更新をディスク書き込みしているときにシステムクラッシュがおきると、インデックスが壊れる可能性がありました。
WALリプレイに基づき GiSTインデックスのページを更新する際に、右リンク(次ページ番号)をクリアしないように修正されました。
本障害にて、ホットスタンバイサーバにおける GiSTインデックスを使った検索で誤った問い合わせ結果をひき起こす可能性があります。
本修正は、以下エラーメッセージが出る問題に対し行われた 9.3.3 での修正の不備を補うものです。
ERROR: could not access status of transaction NNNNNNNN DETAIL: Could not open file "pg_multixact/members/XXXX": No such file or directory.
この変更により、クラッシュ後の WALリプレイで未だ必要な pg_multixactセグメントが削除されないことを確実にします。
all-visibleフラグとは、ページの中にデッドタプル(不要行バージョン)が無いことを示すものです。
「ERROR: could not find pathkey item to sort」というエラーが発生します。以下に障害発生例を示します。
db=# CREATE TABLE events (event_id int PRIMARY KEY); db=# CREATE TABLE other_events (event_id int primary key); db=# CREATE TABLE events_child () INHERITS (events); db=# EXPLAIN SELECT event_id FROM (SELECT event_id FROM events UNION ALL SELECT event_id FROM other_events) ss ORDER BY event_id; ERROR: could not find pathkey item to sort
本障害は「WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y)」といった問い合わせ記述に対して、誤った最適化をひき起こしました。
以下のような問い合わせで t1.a、t1.b にインデックスがあっても、IN 条件に null が混じっているためにシーケンシャルスキャンになってしまう問題がありました。
db=# EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE (a, b) IN ((1, 1000), (null, null)); QUERY PLAN ------------------------------------------------------- Seq Scan on t1 Filter: (((a = 1) AND (b = 1000)) OR NULL::boolean) (2 rows)
可変引数を持つ関数に対して、関数インデックスを定義した場合、関数インデックス定義時の書き方通りに呼び出さないと、インデックスが使われませんでした。
(test_func が可変引数関数であるとして、このようにインデックスを作ると) CREATE INDEX test_idx ON test USING btree ((test_func(val, 'a', 'b'))); (こちらではインデックスが使われるが) SELECT * FROM test WHERE test_func(val, 'a', 'b') > 60; (こちらでは文の意味は同じだがインデックスが使われない) SELECT * FROM test WHERE test_func(val, VARIADIC ARRAY['a'::text, 'b'::text]) > 60;
以下のような JSON データを行データに展開するとして、その中にもJSONデータ型が含まれている場合が該当します。
(以下のように誤った結果となります) db=# CREATE TYPE jpop2 AS (a int, b json, c int, d int); db=# SELECT * FROM json_populate_recordset(null::jpop2, '[{"a":2,"c":3,"b":{"z":4},"d":6}]', true) q; a | b | c | d ---+---------+---+--- | {"z":4} | | 6 (本修正を適用したバージョンでは以下のように正しく出力されます) a | b | c | d ---+---------+---+--- 2 | {"z":4} | 3 | 6
to_json() 関数は anyelement疑似型を受け取って JSON に変換する関数です。これまで PostgreSQL上のデータ型の型カテゴリを使って、どの JSON型にあてはめるかを判定していましたが、誤認する可能性があるた
め、個別のデータ型ごとに場合分けするようになりました。
「ERROR: missing chunk number 0 for toast value ...」というエラーが出ることが報告されています。TOAST 処理について修正が必要でした。
以下の SELECT で本エラーが発生します。
db=# CREATE TABLE t (f1 int); db=# INSERT INTO t (f1) VALUES (-1), (+1); db=# SELECT (SELECT q FROM (SELECT 1,2,3 WHERE f1 > 0 UNION ALL SELECT 4,5,6.0 WHERE f1 <= 0 ) q ) from t;
以下のようにカーソルに対応した SQL の LIMIT句に関数呼び出しがある場合などが該当します。
CREATE FUNCTION NOCHANGE(int) RETURNS int AS 'SELECT $1 ' LANGUAGE SQL STABLE; BEGIN; DECLARE c CURSOR FOR SELECT * FROM t LIMIT nochange(3); FETCH ALL FROM c; MOVE BACKWARD ALL IN c; FETCH ALL FROM c; COMMIT;
一つの SQL文実行の中でのメモリリークであり、本修正以前でも SQL完了後は当該メモリは解放されます。
ある接続内でのメモリリークで、切断するまでメモリリークが残ります。現象ではなくコードロジックから発見された障害で、発生の可能性は低いものといえます。
これまでも WITH OIDS を指定することはできませんでしたが、default_with_oids = true の設定を通して OID列を作ることが可能でした。ただし、OID列を含めたとしても適切に処理できていませんでした。
実行中トランザクションにより挿入され、ロールバックされたサブトランザクションの中で削除された行に対して、その後に同トランザクション内でCREATE INDEX や CLUSTER を実施すると、少なくとも不審な WARNING が生じ、最悪の場合には無限ループに陥ります。
以下に再現例を示します。
db=# BEGIN; db=# INSERT INTO t1 VALUES (1, '111'); db=# SAVEPOINT x; db=# DELETE FROM t1; db=# ROLLBACK TO x; db=# CREATE INDEX idx_t1a ON t1 (a); WARNING: concurrent delete in progress within table "t1"
二相コミット用に準備されたトランザクションは、PREPARE TRANSACTION を実行した時点で接続(セッション)はトランザクション実行中状態ではなくなっているので、本修正のようにするのが適切でした。
以下に発生例を示します。
=# ! touch /usr/local/pgsql/share/tsearch_data/mystop.stop =# CREATE TEXT SEARCH DICTIONARY my_dic (template = snowball, language = russian, stopwords = mystop); =# CREATE ROLE foo; =# CREATE ROLE bar; =# ALTER TEXT SEARCH DICTIONARY my_dic OWNER TO foo; =# REASSIGN OWNED BY foo TO bar; ERROR: unexpected classid 3600
読みやすさの改善と過剰な空白文字出力を避けるためです。
多重の入れ子構造の SQL であるとき、性能劣化やメモリ不足の恐れがありました。例えば、これまで 5 つの SELECT を UNION ALL でつないだビューは、以下のように出力されていました。
View definition: ( ( ( SELECT t1.a, t1.b FROM t1 UNION ALL SELECT t1.a, t1.b FROM t1) UNION ALL SELECT t1.a, t1.b FROM t1) UNION ALL SELECT t1.a, t1.b FROM t1) UNION ALL SELECT t1.a, t1.b FROM t1;
以下のように別名が自動的に付与されるようになりました。
db=# SELECT pg_get_viewdef('vv6', true); pg_get_viewdef --------------------------- SELECT tt11.x, + tt11.y, + tt12.z, + tt13.q + FROM tt11 + JOIN tt12 USING (x) + JOIN tt13 USING (z); (1 row) db=# ALTER TABLE tt11 ADD COLUMN z int; db=# SELECT pg_get_viewdef('vv6', true); pg_get_viewdef ------------------------------ SELECT tt11.x, + tt11.y, + tt12.z, + tt13.q + FROM tt11 tt11(x, y, z_1)+ JOIN tt12 USING (x) + JOIN tt13 USING (z); (1 row)
以下のように不適切な出力になっていました。
db=# CREATE TABLE tt14t (f1 text, f2 text, f3 text, f4 text); db=# INSERT INTO tt14t VALUES ('foo', 'bar', 'baz', 'quux'); db=# ALTER TABLE tt14t DROP COLUMN f2; db=# CREATE FUNCTION tt14f() RETURNS SETOF tt14t AS $$ declare rec1 record; begin for rec1 in select * from tt14t loop return next rec1; end loop; end; $$ language plpgsql; db=# CREATE VIEW tt14v AS SELECT t.* FROM tt14f() t; db=# SELECT pg_get_viewdef('tt14v', true); pg_get_viewdef -------------------------------------- SELECT t.f1, + t.f3, + t.f4 + FROM tt14f() t(f1, "<>", f3, f4); (1 row)
本修正により、起動途中に INTシグナルを受けて終了する場合などで適切に各種リソースの後片付けができるようになります。
DNS逆引き失敗について単に失敗とせず、確実に報告するようになりました。また、DNS逆引きにあたり pg_hba.conf の各ホスト名ではなく、接続対象のホストだけについて試みるようになりました。
「ERROR: no pg_hba.conf entry for ...」メッセージが出て接続できないけれども原因が分かりにくいケースが報告されていました。
これらは起動中の PostgreSQLサーバの設定値を確認するオプションです。root で実行を禁止する理由が無いものと判断され、規制が緩められました。-C オプションは pg_ctl の中でも使われる場合があり、root で操作できないことで不都合がありました。
これまで make check コマンドによるリグレッションテストを実行している間、同ホスト内の OSユーザは PostgreSQLスーパーユーザとして接続可能であり、結果として任意のコードをテストを実行しているユーザとして実行可能でした。このことは CVE-2014-0067 として脆弱性として報告されていました。
本修正でソケットファイルを 0700 モードのサブディレクトリ下に作るようになり、他のユーザの接続を防ぎます。なお、Windows では ローカル TCP 接続を使用するため、本セキュリティリスクが残ります。
既存のシンボリックリンクを削除する処理が、Windows の場合に対応していませんでした。削除に失敗して「ERROR: could not remove symbolic link ...」が出ます。
Windows の場合、障害がより後段の処理まで隠されてしまう可能性がありました。
これまでは、Windows では PostgreSQL再起動なしには変更を反映させることができませんでした。本来は、reload 後の次の新たな接続からは変更が反映されなければいけません。backend コンテキストの設定パラメータには log_connectionsや local_preload_libraries があります。
本誤りにより Windows でインストールパスにスペースと「@」記号が含まれているとき、initdb と pg_upgrade が失敗することがありました。
これまで使っていた方式は Xcode 5.0 以降で供給される Python ライブラリでは使用できませんでした。
これまで libpq は入力バッファ拡大を繰り返して、メモリ不足になり、「lost synchronization with server」エラーをひき起こしていました。
これまでタイムアウトが設定されておらず、LDAPサーバの応答が無い場合に長くハングアップすることがありえました。
これまで、char型ポインタの配列を複数行を返す FETCH コマンドのターゲットとしたとき、全結果を最初の要素に格納するように動作していました。
以下のように定義したマテリアライズドビューをダンプすると、「CREATE TABLE mat1 ...」という出力がされてしまいました。その結果、リストア時に「REFRESH MATERIALIZED VIEW mat1」に対して「ERROR: "mat1" is not a table or materialized view」というエラーが発生していました。
db1=# CREATE TABLE t1 (id int PRIMARY KEY, v text); db1=# CREATE MATERIALIZED VIEW mat1 AS ( SELECT id, v FROM t1 GROUP BY id);
pg_dumpall の -i はバージョンを無視するというオプションで、引数は取りませんが、以下のようなエラーが出ていました。なお、--ignore-version と指定した場合は正しく機能していました。
$ pg_dumpall -i > all.dump pg_dumpall: オプションには引数が必要です -- i
8.4 以前バージョンの pg_dump で取得されたダンプで、多数のラージオブジェクトにコメントが付いていた場合に、リストアに失敗していました。
本障害は OID不一致によるエラーを引き起こします。
本障害に該当するのは比較的稀なケースです。9.0系から 9.1系の間で NUMERIC型のデータ長さの計算方法が変わっているので、それに連動してTOASTテーブルを作る、作らないが変わるということがありえました。
本修正は、バージョンアップ後にサーバ起動してすぐに autovacuum がデータベースクラスタ全体のスキャンを要求したり、凍結されていないマルチトランザクションID(MXID)値の追跡ができなくなったりするのを防ぎます。
auto_explain が有効であるとき、EXPLAIN (ANALYZE, TIMING OFF) と指定して実行しても、タイミング情報が出力されていました。
一つの SQL文実行の中でのメモリリークであり、本修正以前でも SQL完了後はメモリは解放されます。
バックエンドプロセスのクラッシュを引き起こす可能性がありました。
この改良により、UUID 生成が効率的になり、/dev/urandom からのエントロピーの汲み上げ量を減らすことができます。
クリミア、エジプト、モロッコの夏時間法の変更が含まれます。
スタンバイサーバが明示的にプライマリサーバに以降はフィードバックを送らないと示すようになりました。
Nested Loop が入れ子になっている実行プランのとき、以下のエラーが出るケースがありました。
ERROR: variable not found in subplan target list