PostgreSQL 9.2.2 に関する技術情報

このリリースは 9.2.1 からの修正リリース(2012/12/6リリース)です。
9.2.x からのアップデートではダンプ、リストアは不要です。

ただし、下記の最初修正項目に記述されている通り、CONCURRENTLY で作成されたインデックスの問題を修正するために REINDEX が必要な場合があります。

また、9.2.0 からアップデートを行う場合は 9.2.1 に関する技術情報を参照してください。

PostgreSQL 9.2.1 から 9.2.2 への変更点

9.2.2、9.1.7、9.0.11、8.4.15, 8.3.22 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。


  1. CREATE/DROP INDEX CONCURRENTLY 文のいくつかの障害が修正されました
    (Andres Freund, Tom Lane, Simon Riggs, Pavan Deolasee) (9.2)(9.1)(9.0)(8.4)(8.3)

    障害の一つは DROP INDEX CONCURRENTLY が導入された際に混入したもので、CREATE INDEX CONCURRENTLY にて壊れたインデックスを生成してしまうことがありました。

    本マイナーアップ後に REINDEX を行うことが推奨されます。

    DROP INDEX CONCURRENTLY で対象インデックス使用中のクエリが終わるまでそのインデックスへの挿入ができなくなってしまう問題が修正されました。

    DROP INDEX CONCURRENTLY がキャンセルされた場合の誤った振る舞いが修正されました。以前は、裏に DROP できないインデックスが残ってしまうことがありました。

    以下2点は 9.1〜8.3 の各バージョン系列でも共通に修正されています。

    pg_index の行を更新する際に in-place updates を使うように修正されました。同時更新による競合で、更新が失敗し、壊れたインデックスが生じるのを防ぎます。

    いくつかの DDL命令および VACUUM で、誤ったインデックス検索結果を無視するように修正されました。

  2. DROP INDEX CONCURRENTLY に対する述語ロックが修正されました
    (Kevin Grittner) (9.2)

    修正前は、SSI(直列化スナップショット隔離)の述語ロックが誤ったタイミングで処理されていました。これは DROP と並行してシリアライザブルトランザクションを実行した際に誤った振る舞いを引き起こすおそれがありました。

  3. WALリプレイ時のバッファロックが修正されました
    (Tom Lane) (9.2)(9.1)(9.0)

    WALリプレイが複数ページに影響を及ぼす場合にバッファロックが不十分でした。ホットスタンバイ問い合わせで一時的に一貫性のない状態が見えてしまい、誤った結果や予想外のエラーを引き起こす可能性がありました。

  4. GINインデックスに関するWAL生成ロジックの誤りが修正されました
    (Tom Lane) (9.2)(9.1)(9.0)

    この誤りは WALページ分割失敗のときにインデックス破損を引き起こします。

  5. SP-GiSTインデックスのWALリプレイロジックの誤りが修正されました
    (Tom Lane) (9.2)

    この誤りは、クラッシュ後またはスタンバイサーバにてインデックス破損を引き起こします。

  6. WALリカバリにおけるベースバックアップ終了位置検出の誤りが修正されました
    (Heikki Linnakangas) (9.2)

    この誤りにより、ホットスタンバイモードでデータベースが一貫性のある状態に達する前に起動してしまいます。

  7. ホットスタンバイサーバが通常起動状態に昇格する際に、起動プロセスのバーチャルXID ロックが適切に解除されるようになりました
    (Simon Riggs) (9.2)(9.1)(9.0)

    この誤りは、以降の CREATE INDEX CONCURRENTLY などいくつかの操作を妨げていました。

  8. スタンバイモードにおいて "ERROR: out-of-sequence timeline ID" が不必要に生じるのを回避するように修正されました
    (Heikki Linnakangas) (9.2)(9.1)(9.0)
  9. マスタープロセスがシャットダウンのシグナルを受けた後で新たな子プロセスを生成するのを防止するようになりました
    (Tom Lane) (9.2)(9.1)(9.0)

    この障害により、シャットダウン処理が長くなる、あるいは、追加的なユーザ操作なしにはずっと終わらない可能性がありました。

  10. sysloggerプロセス("logger process")が、log_rotation_age が 2^31 ミリ秒 (=25日間くらい) を超えているときに障害発生しないように修正されました
    (Tom Lane) (9.2)

    "FATAL: XX000: poll() failed: Invalid argument" というメッセージが出るケースが報告されていました。

  11. タイムアウト超過したとき、内部関数 WaitLatch() が直ぐに処理を返すように修正されました
    (Jeff Janes, Tom Lane) (9.2)

    修正前は割り込みが殺到することで際限なく待たされる可能性がありました。この動作は autovacuum lancherプロセスにおいて問題となっており、その他、同様の問題を引き起こしていたものと考えられます。

    内部関数 WaitLatch() は タイムアウトや何らかのイベントが起きるまで処理を休止する動作をさせるもので PostgreSQLの様々な箇所で使われています。

  12. メモリ不足の際に内部ハッシュが破壊されるのを防止するように修正されました
    (Hitoshi Harada) (9.2)(9.1)(9.0)(8.4)(8.3)

    多くの場合、予期せぬエラーで処理が失敗するだけで済みますが、relcache など長期に利用するシステムキャッシュが破壊された場合、テーブルデータが壊れる可能性があります。

  13. 終了済みトランザクションが削除されたテーブルのファイルディスクリプタを保持し続けるのを防止するように修正されました
    (Tom Lane) (9.2)(9.1)

    この修正は DROP済みのテーブルが長期にディスクを占有してしまう問題を軽減します。

  14. 新たな子プロセスがラッチ用の pipe を生成できなかった際に、データベースインスタンス全体のクラッシュと再起動が生じないようになりました。
    (Tom Lane) (9.2)(9.1)

    新プロセス生成は失敗しますが、全体を強制再起動する理由に乏しいため、そのようにしないものとされました。この改良は OS がファイルディスクリプタ数の上限に近付いているときの動作を頑健にします。

  15. サブクエリ無しに展開できない形のサブクエリに対する JOIN にてプランナがクラッシュするケースがあり、修正されました
    (Tom Lane) (9.2)

    以下のような SQL でクラッシュが生じるケースが報告されていました。

    EXPLAIN
      SELECT * FROM t1 LEFT OUTER JOIN (
        SELECT DISTINCT t2.id FROM t2 WHERE t2.id > 100
        ) AS _t ON _t.id = t1.id
      WHERE t1.id > 100 OR (t1.id < 100 AND _t.id IS NOT NULL);
    
  16. 外部結合に対する厳密でない等価条件のプラン作成が修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    該当する SQL に対してプランナが条件句から誤った制約を導出することがありました。COALESCE や CASE に外部結合によって null になりうるカラムが指定されていて、それが選択条件に使われている場合に該当します。各バージョンに問題がありますが、特に 9.2.x で良く出やすくなっています。

    障害例を示します。実行プラン末行に奇妙な条件式があらわれています。

    =# CREATE TABLE ta (q1 int PRIMARY KEY);
    =# CREATE TABLE tb (u1 int UNIQUE, c1 int, c2 int);
    =# EXPLAIN (COSTS OFF)
       SELECT q1, u1, c1, c2 FROM ta LEFT JOIN tb ON q1 = u1
       WHERE coalesce (c1, 123) = q1 AND coalesce (c2, 123) = q1;
                                      QUERY PLAN
    -------------------------------------------------------------------------------
     Hash Left Join
       Hash Cond: (ta.q1 = tb.u1)
       Filter: (ta.q1 = COALESCE(tb.c1, 123))
       ->  Seq Scan on ta
       ->  Hash
             ->  Seq Scan on tb
                   Filter: (COALESCE(c1, 123) = COALESCE(c2, 123))
    
  17. 継承テーブルにおけるインデックス最適化された MIN/MAX を伴う SELECT DISTINCT についてプランナが修正されました
    (Tom Lane) (9.2)(9.1)

    障害例を示します。以下のエラーが発生します。

    =# CREATE TABLE tp (id int, f1 int);
    =# CREATE TABLE tc1 (UNIQUE(f1)) INHERITS (tp);
    =# CREATE TABLE tc2 (UNIQUE(f1)) INHERITS (tp);
    =# CREATE TABLE tc3 (UNIQUE(f1)) INHERITS (tp);
    
    =# SELECT DISTINCT min(f1), max(f1) FROM tp;
    ERROR:  failed to re-find MinMaxAggInfo record
    
  18. 意味の差異が存在する少数のケース以外で、プランナは、暗黙的キャストと明示的キャストを同等のものとみなすようになりました。
    (Tom Lane) (9.2)
  19. JOIN節を考慮して部分インデックスが使えるか判断するようになりました
    (Tom Lane) (9.2)

    従来は検索条件節(WHERE句)のみを見ていました。

  20. 同じインデックスについて多数のインデックス利用可能な JOIN があるときにプラン作成時間が長くなりすぎないように修正されました
    (Tom Lane) (9.2)

    以下パターンで処理が長時間戻らないことが報告されています。プラン検討対象リレーション数の上限が内部的に設けられました。

    =# CREATE TABLE tx (id int PRIMARY KEY);
    
    =# EXPLAIN  SELECT 1 FROM tx AS a
        JOIN (SELECT 2 as aid) AS ag1 ON (ag1.aid = a.id)
        JOIN (SELECT 3 as aid) AS ag2 ON (ag2.aid = a.id)
        JOIN (SELECT 4 as aid) AS ag3 ON (ag3.aid = a.id)
        JOIN (SELECT 5 as aid) AS ag4 ON (ag4.aid = a.id)
          : 中略
        JOIN (SELECT 22 as aid) AS ag22 ON (ag22.aid = a.id)
        JOIN (SELECT 23 as aid) AS ag23 ON (ag23.aid = a.id)
        JOIN (SELECT 24 as aid) AS ag24 ON (ag24.aid = a.id)
        JOIN (SELECT 25 as aid) AS ag25 ON (ag25.aid = a.id);
    
  21. プランナの等価クラス(「=」条件)に対する排他制約の検証が改良されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  22. ハッシュ作成されたサブプランにおける部分行マッチングが、型の異なる場合も扱うように修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

     ... WHERE (a, b) NOT IN (SELECT x, y FROM ...)

    という形の問い合わせで、b と y がそれぞれ int4 と int8 であるなど、型が異なる場合に該当します。

    本障害では、特定の型を含む場合に、誤った結果が返ったり、クラッシュが生じたりする可能性がありました。

  23. btree の スキャン位置記録関数(btmarkpos)、スキャン位置戻し関数(btrestrpos)における配列キーの扱いが修正されました
    (Tom Lane) (9.2)

    本障害により、内側のインデックススキャンが「インデックスカラム = ANY(配列)」という条件であるようなマージJOIN で誤った結果が返る可能性があります。

  24. スナップショットを減らす 9.2 の変更が元に戻されました
    (Tom Lane) (9.2)

    9.2 の問い合わせ実行中のスナップショット取得数を減らす変更は、問い合わせで使われるテーブルをロックする前にスナップショット取得を伴う処理が実行されることによって、以前には無かった望ましくない振る舞いを引き起こしました。

    例えば、ある問い合わせで、先立つトランザクションによってコミットされた更新データが見えることが排他ロックを取得していたとしても保証されません。

  25. AFTER ROW UPDATE/DELETE トリガのために古い行を再読み出しする際にバッファロックを取得するようになりました
    (Andres Freund) (9.2)(9.1)(9.0)(8.4)(8.3)

    ごく稀な状況でこの誤りは、トリガの WHEN条件、または、外部キー制約トリガの事前チェックロジックに不正なデータを渡してしまい、クラッシュやトリガ誤動作を引き起こします。

  26. ALTER TABLE ... ALTER COLUMN ... TYPE で継承されたチェック制約を適切に扱うように修正されました
    (Pavan Deolasee) (9.2)(9.1)(9.0)(8.4)

    8.4 以降バージョンで問題がおきていました。

  27. ALTER EXTENSION SET SCHEMA の付属オブジェクトを新スキーマに移動する際の失敗が修正されました
    (Álvaro Herrera, Dimitri Fontaine) (9.2)(9.1)
  28. CREATE TABLE AS EXECUTE が拡張問い合わせプロトコルで正しく扱えるようにされました
    (Tom Lane) (9.2)
  29. DROP RULE IF NOT EXISTS と DROP TRIGGER IF NOT EXISTS で構文解析木を書き換えしないようになりました
    (Tom Lane) (9.2)

    キャッシュされた SQL が再実行される場合にエラーを引き起こしていました。

  30. テーブルスペース に対する reassign owned が修正されました
    (alvaro herrera) (9.2)(9.1)(9.0)(8.4)(8.3)
  31. システムビューのカラムにおける 不正な pg_attribute 行を無視するようになりました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    ビューはシステムカラムをもたないため、もともと不要なデータでした。

  32. INSERT INTO table DEFAULT VALUES をダンプ出力する際の規則が修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  33. 問い合わせに UNION、INTERSECT、EXCEPT節が多数あるときのスタックオーバーフローを防止するようになりました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  34. 整数型の最小値を -1 で除算したときにプラットフォーム依存の失敗が起きるを防止するようになりました
    (Xi Wang, Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  35. 日付の解析で文字列末尾を超えてアクセスされる可能性があり、修正されました
    (Hitoshi Harada) (9.2)(9.1)(9.0)(8.4)(8.3)
  36. チェックポイント中にXID周回が起き、wal_level が hot_standby である場合に、XID基点を進めるのに失敗するのが修正されました
    (Tom Lane, Andres Freund) (9.2)(9.1)(9.0)

    この障害は PostgreSQL自体には大きな影響はありませんが、txid_current() 関数や関連の関数に依存したアプリケーションでは TXID 値が逆行したように見えてしまいます。

  37. pg_terminate_backend() 関数、pg_cancel_backend() 関数に指定したプロセスが存在しなくてもエラーにならない問題があり、修正されました
    (Josh Kupershmidt) (9.2)

    管理者ユーザで実行する場合には正しく動作していました。

  38. システムビュー pg_stat_replication の sync_state カラムのページ境界における表示が修正されました
    (Kyotaro Horiguchi) (9.2)(9.1)
  39. UNIXドメインソケットのパス名の長さがプラットフォーム固有の制限を超えた場合に意味不明なエラーメッセージでていたものが修正されました

    (Tom Lane, Andrew Dunstan) (9.2)(9.1)(9.0)(8.4)(8.3)

    ERROR: Non-recoverable failure in name resolution

    などが出ていました。

  40. 複合カラムの値をクライアントに送出するときのメモリーリークが修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  41. コミット時のサブトランザクションのロックを検査しないことにより、処理を軽減するようになりました
    (Simon Riggs) (9.2)

    トランザクションが多数の排他ロックを保持している場合に、不要な処理が大きな負担となる可能性がありました。

  42. postmaster.pid 読み取りについて pg_ctl が頑健になりました
    (Heikki Linnakangas) (9.2)(9.1)(9.0)(8.4)(8.3)

    これまで処理競合によりファイルディスクプリタがリークする可能性がありました。

  43. client_encoding が SJIS のようなクライアント側専用の文字エンコーディングのときに不正なエンコーディングのデータに対して psql がクラッシュするのが修正されました
    (Jiang Guiqing) (9.2)(9.1)(9.0)(8.4)(8.3)
  44. pg_dump でシーケンスへの値の設定が data セクションに記録されるようになりました。
    (Tom Lane) (9.2)

    --section=data、pg_dump --section=pre-data といったオプションを指定した際の振る舞いが変ります。以前は、値の設定が pre-data セクションに含まれていました。以前から --data-only を指定した場合には、シーケンスに対する値の設定は含まれていました。

    また、シーケンスが拡張モジュール設定テーブルとして指定されている場合のダンプ出力が改善されました。

  45. pg_dump の --clean オプション動作における DROP DATABASE コマンドの扱いが修正されました
    (Guillaume Lelarge) (9.2)

    仕様変更を伴う修正となります。

    pg_dump で --clean と --create を合わせた指定が可能になりました。対象データベースに接続する前に DROP DATABASE を行い、次に CREATE DATABASE を行うという手順を出力します。以前は両指定を同時に与えることができませんでした。

    --create を指定せずに --clean を指定した場合、データベース削除は行わないようになりました。9.2.0 から pg_dump --clean は DROP DATABASE を発行するようになりましたが、これは役に立たずで時に危険でした。

  46. pg_dump で「ALTER VIEW foo SET ()」が出力される障害が修正されました
    (Tom Lane) (9.2)

    VIEW に循環参照があって、オプション指定(WITH〜)が無い場合に pg_dump にて誤った構文のALTER VIEW が出力されていました。

  47. tarフォーマットでの pg_dump 出力に含まれる restore.sql スクリプトの障害が修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    テーブル名に大文字が含まれている場合に、それらが小文字に変っていて正しく動作しない内容を出力してしまいます。

    また、--insert モードのときにも 通常の COPYモード同様にリストアできるようになりました。

  48. pg_restore が POSIX に適合した tar ファイルを受け付けるようになりました
    (Brian Weaver, Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    pg_dump の tar 出力モードは POSIX標準に完全に準拠した tarファイルを出力するわけではありませんでした(これは 9.3 バージョンで修正されます)。本修正により、これまでの形式も、POSIX準拠の tar形式も読み込めるようになります。

  49. pg_basebackup で tarファイルが POSIX準拠の形式で出力されるようになりました
    (Brian Weaver, Tom Lane) (9.2)(9.1)
  50. データディレクトリに相対パスが指定された場合に pg_resetxlog が postmaster.pid を正しく見つけられるように修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    本障害によりデータディレクトリを使用中の postmaster がいるのを見落とす可能性がありました。

  51. libpq の lo_import() 関数、lo_export() 関数が I/O エラーを正しく出すように修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  52. ecpg でネスト構造のポインタ値の処理が修正されました
    (Muhammad Usama) (9.2)(9.1)(9.0)(8.4)(8.3)
  53. ecpg で ecpg_get_data() 関数が配列を適切に扱えるように修正されました
    (Michael Meskes) (9.2)(9.1)(9.0)
  54. pg_upgrade が システムカタログの TOASTテーブルを処理しないように修正されました
    (Bruce Momjian) (9.2)

    本障害のために information_schema が削除され再作成されるときにエラーが生じていました。そのほかの失敗の可能性もありました。

  55. pg_upgrade の性能が改良されました
    (Bruce Momjian) (9.2)

    新たなデータベースクラスタには synchronous_commit = off とします。

  56. contrib/pageinsepect 拡張モジュールの Btreeページ解析解析にて検査中のページにバッファロックを取得する問題があり、修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)
  57. malloc(0) および realloc(NULL, 0) 関数の移植性が低い部分が回避されました
    (Tom Lane) (9.2)

    これらの関数にいくつかのプラットフォームは NULL を返しますが、out-of-memory と誤認する恐れがありました。

  58. make install で拡張モジュール用のディレクトリが確実に作られるように修正されました
    (Cedric Villemain) (9.2)(9.1)
  59. pgxs が AIX におけるモジュールのビルドに対応しました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    これまでソースツリー外でのビルドはサポートされていませんでした。

  60. タイムゾーンデータが tzdata release 2012j に更新されました
    (9.2)(9.1)(9.0)(8.4)(8.3)

    キューバ、イスラエル、ヨルダン、リビア、パレスチナ、西サモア、ブラジルの夏時間法の変更を含みます。