PostgreSQL 9.0.9 に関する技術情報

このリリースは 9.0.8 からの修正リリース(2012/8/17リリース)です。
9.0.x からのアップデートではダンプ、リストアは不要です。

また、9.0.6 より前のバージョンからアップデートを行う場合は 9.0.6 に関する技術情報を参照してください。

PostgreSQL 9.0.8 から 9.0.9 への変更点

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


  1. XML のエンティティ参照を通して外部のファイルや URL にアクセスするのを防ぐようになりました。
    (Noah Misch, Tom Lane) (9.1)(9.0)(8.4)(8.3)

    定義済みエンティティを持つドキュメント型定義 (DTD) を使用している XML文書では、&entityName; という構文でエンティティを参照できます。

    xmlparse() 関数は XMLデータ内のエンティティ参照を解決するために、外部のファイルや URL からデータ取得しようとします。このように権限のないデータベースユーザが OS におけるデータベースサーバプロセスのユーザ権限でデータを取得できてしまいます。

    本セキュリティ問題は CVE-2012-3489 として登録されています。

    pg_hba.conf に以下の行があったとして、

    host    all     all   10.1.2.3/32  trust # <-- this is a trust machine

    以下の SQL を一般DBユーザで実行すると、エラーメッセージを通じてファイル内容が見えてしまいます。また、ファイル内容は出ない場合でも、ファイルの存在確認はできてしまいます。

    foo=> SELECT XMLPARSE (DOCUMENT '<?xml version="1.0"?>
    foo'> <!DOCTYPE book [ <!ENTITY hba SYSTEM "pg_hba.conf"> ]>
    foo'> <book>&hba;</book>');
    
    ERROR:  invalid XML document
    DETAIL:  pg_hba.conf:89: parser error : StartTag: invalid element name
    host    all     all   10.1.2.3/32  trust # <-- this is a trusted machine
                                                ^
    Entity: line 3: parser error : Failure to process entity hba
    &hba;
               ^
    Entity: line 3: parser error : Entity 'hba' not defined
    &hba;
    
    foo=> SELECT XMLPARSE (DOCUMENT '<?xml version="1.0"?>
    foo'> <!DOCTYPE book [ <!ENTITY file SYSTEM "/proc/12345"> ]>
    foo'> <book>&file;</book>');
    
    ERROR:  invalid XML document
    DETAIL:  I/O warning : failed to load external entity "/proc/12345"
    Entity: line 3: parser error : Failure to process entity file
    <book>&file;</book>
                ^
    Entity: line 3: parser error : Entity 'file' not defined
    <book>&file;</book>
    
  2. contrib/xml2 において、xslt_process() 関数を通して外部のファイルやURL にアクセスするのを防ぐようになりました。
    (Peter Eisentraut) (9.1)(9.0)(8.4)(8.3)

    xml2 モジュールで使用している libxslt ライブラリは、スタイルシートコマンドを通してファイルや URL に読み書きを提供します。したがって、データベースサーバプロセスのユーザ権限にて、データベース上のユーザからファイル読み書きができてしまいます。本修正は libxslt のセキュリティオプションでこれを防ぎます。

    なお、xslt_process() 関数は以前から、使用にあたってセキュリティリスクがあることがマニュアルで示されていました。また、ビルド時に --with-libxslt を指定していない場合、xslt_process() 関数は利用できません。

    本セキュリティ問題は CVE-2012-3488 として登録されています。

  3. Btreeインデックスのページの早すぎる再利用を防ぐようになりました。
    (Noah Misch) (9.1)(9.0)(8.4)(8.3)

    読み取り専用トランザクションでは XID (トランザクションID) を割り当てなくても良いようにした際に、本障害が導入されてしまいました。読み取り専用トランザクションが未だ走っている削除済ページを再利用してしまう可能性があります。

    本障害で誤ったインデックス検索結果が返ることがありえますが、タイミングが限定されるため、発生確率は低いといえます。

  4. シーケンスの作成、リセット操作におけるクラッシュ安全性の障害が修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    シーケンスを作成あるいはリセットして、次に ALTER SEQUENCE を実行して、そこで nextval() を実行した後、クラッシュリカバリを経ると、シーケンスの値が nextval() の実行を反映していない値となっていました。

    以下に障害発生例を示します。

    $ psql
    =# CREATE SEQUENCE newseq;
    =# ALTER SEQUENCE newseq INCREMENT 10;
    =# SELECT nextval('newseq');
     nextval
    ---------
           1
    
    $ pg_ctl stop -m immediate
    $ pg_ctl start
    $ psql
    =# SELECT nextval('newseq');
     nextval
    ---------
           1
    (1 row)
    
  5. enum型の値の比較で競合状態が発生するのが修正されました。
    (Robert Haas, Tom Lane) (9.1)

    enum型の要素追加(ALTER TYPE) と同時に実行する enum型の値を比較するクエリが失敗することがあります。以下のエラーが出ることが報告されています。

    ERROR:  XX000: enum value 117745 not found in cache for enum myenumtype
  6. txid_current() 関数が XID周回時に正しく動作するように修正されました。
    (Heikki Linnakangas) (9.1)(9.0)

    起動直後、非ホットスタンバイのとき正しくない XID が返ることがありました。本障害は直前のマイナーリリースバージョンの修正で入ってしまったものです。

  7. 同期スタンバイとして不適切な接続が選ばれることを防止するようになりました。
    (Fujii Masao) (9.1)

    プライマリが pg_receivexlog や pg_basebackup などの疑似的なスタンバイ接続を同期スタンバイと誤認してしまい、それらを待ち続けてしまう可能性がありました。

  8. プライマリで多数のサブトランザクション(SAVEPOINT)が動作しているときにホットスタンバイ起動に失敗する障害が修正されました。
    (Andres Freund) (9.1)(9.0)

    以下のようなエラーメッセージが現れます。

    FATAL: out-of-order XID insertion in KnownAssignedXids
    LOG: startup process (PID 12345) exited with exit code 1
    
  9. backup_label ファイルが pg_start_backup() 関数実行で作成される際に fsync される(ディスク書き込みされる)ようになりました。
    (Dave Kerr) (9.1)(9.0)(8.4)(8.3)

    ストレージ装置が提供するバックアップ手段と組み合わせる時に、不都合がありました。

  10. walsenderプロセスでタイムアウトの取り扱いが修正されました。
    (Tom Lane) (9.1)(9.0)

    これまで SIGALARM を無視するようになっていたものをシグナルハンドラで処理をするようにしました。稀なケースで処理がブロックしてしまう(ずっと待ってしまう)ことを防ぐねらいです。

  11. walsenderプロセスが walwriterプロセスによるフラッシュが行われる度に動作するようになりました。
    (Andres Freund, Simon Riggs) (9.1)

    非同期コミットのトランザクションだけであるときにレプリケーション遅延を大幅に減らします。

  12. LISTEN/NOTIFY がディスク容量不足などの I/O 問題により良く対処できるように修正されました。
    (Tom Lane) (9.1)(9.0)

    書き込みに失敗した後、それ以降の全ての NOTIFY メッセージ送信は以下のような不適切なエラーメッセージが出て失敗していました。Success となっている箇所に I/O 問題のエラーが表示されるべきでした。

    ERROR: could not access status of transaction 0
    DETAIL: Could not read from file "pg_notify/01A3" at offset 112345: Success
    
  13. 直接ブロックされたプロセスによってのみ autovacuum が自動キャンセルするように修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    修正前は一貫性に欠けた振る舞いをしていました。本修正により自動VACUUM が deadlock_timeout よりも短い時間で自動にキャンセルされることはなくなります。

  14. 自動VACUUM キャンセルのログ出力が改善されました。
    (Robert Haas) (9.1)(9.0)(8.4)(8.3)

    「sending cancel to blocking autovacuum PID ...」というメッセージが DEBUG2 レベルで出ていましたが、LOG レベルで出るようになりました。
    「DETAIL: Process ... waits for ... on ...」というロック待ちの詳細も出力されるようになりました。

  15. log collector (ロガープロセス)の log_truncate_on_rotation 指定が、サーバ起動後の初回ログローテーションでも動作するように修正されました。

    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    サーバ再起動が頻繁に行われる環境下では、ローテーションに伴う古いログメッセージの切捨てが機能しませんでした。

  16. WITH 節における入れ子の集合演算(UNION、INTERSECT、EXCEPT)について修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)

    以下のような SQL が動作するようになります。

    =# WITH outermost(x) AS ( SELECT 1 UNION (
        WITH innermost AS ( SELECT 2 )
        SELECT * FROM innermost UNION SELECT 3))
       SELECT * FROM outermost;
     x
    ---
     1
     2
     3
    (3 rows)
    

    修正前は以下エラーが出て、動作しませんでした。

    ERROR:  relation "innermost" does not exist
    LINE 1: ...UNION (WITH innermost as (SELECT 2) SELECT * FROM innermost ...
    
  17. サブクエリに対する行全体参照で余計なカラムが含まれないように修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    GROUP BY や ORDER BY で指定したカラムが追加されてしまっていました。以下は修正前の実行例です。本来は1カラム出力になります。

    =# CREATE TABLE int4_tbl (f1 int4);
    =# INSERT INTO int4_tbl VALUES (1), (2), (3);
    =# SELECT q FROM (SELECT max(f1) FROM int4_tbl GROUP BY f1 ORDER BY f1) q;
       q
    -------
     (1,1)
     (2,2)
     (3,3)
    (3 rows)
    
    (正しい出力)
    =# SELECT q FROM (SELECT max(f1) FROM int4_tbl GROUP BY f1 ORDER BY f1) q;
       q
    -------
     (1)
     (2)
     (3)
    (3 rows)
    
  18. ALTER TABLE ... ADD { UNIQUE | PRIMARY KEY } USING INDEX 文で生成される依存関係について修正されました。
    (Tom Lane) (9.1)

    不要な pg_depend システムテーブルの項目が残っていて、その後の操作、特にインデックスのカラムに対する ALTER TABLE ... ALTER COLUMN TYPE に混乱が生じていました。

    以下の手順でエラーが発生してしまう現象が報告されています。

    =# CREATE TABLE z (i int4);
    =# CREATE UNIQUE INDEX q ON z (i);
    =# ALTER TABLE z ADD PRIMARY KEY USING INDEX q;
    =# ALTER TABLE z ALTER COLUMN i TYPE int8;
    ERROR:  could not open relation with OID 76087
    
  19. CREATE EXTENTION を行ったロールに対する REASSIGN OWNED に失敗する障害が修正されました。
    (Alvaro Herrera) (9.1)

    以下のようなエラーが出ることが報告されています。

    =# REASSIGN OWNED BY user1 TO user2;
    ERROR:  unexpected classid 3079
    
  20. CREATE TABLE ... LIKE/INHERITS において CHECK制約とインデックス定義で行全体参照が禁止されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    以下のようにテーブル全体を指定する制約があるテーブルをベースに子テーブルを作ると、制約定義と矛盾した動作をしてしまいます。

    =# CREATE TABLE pt (id int primary key, v text,
         CHECK(length((pt.*)::text) < 10));
    =# CREATE TABLE ct (cid int) INHERITS (pt);
    
    =# \d ct
          Table "public.ct"
     Column |  Type   | Modifiers
    --------+---------+-----------
     id     | integer | not null
     v      | text    |
     cid    | integer |
    Check constraints:
        "pt_check" CHECK (length(ct.*::text) < 10)
    Inherits: pt
    
    =# INSERT INTO ct VALUES (1, 'AAAA', 100);
    =# SELECT length(ct.*::text), ct.* FROM ct;
     length | id |  v   | cid
    --------+----+------+-----
         12 |  1 | AAAA | 100
    

    また、CERATE TABLE ... LIKE の場合には以下のようなエラーが生じます。

    =# CREATE TABLE lt (cid int, LIKE pt INCLUDING ALL);
    =# INSERT INTO lt VALUES (101, 2, 'A');
    ERROR:  table row type and query-specified row type do not match
    DETAIL:  Table has type integer at ordinal position 2, but query expects text.
    

    修正後バージョンは以下のようにエラーになります。

    =# CREATE TABLE ct (cid int) INHERITS (pt) ;
    ERROR:  cannot convert whole-row table reference
    DETAIL:  Constraint "pt_check" contains a whole-row reference to table "pt".
    

    なお、インデックスについては以下のようなインデックスがあるテーブルを CREATE TABLE .. LIKE で参照したテーブル定義が禁止されます。

    =# CREATE UNIQUE INDEX pt_unique_all ON pt ((pt.*));
    =# CREATE TABLE lt (cid int, LIKE pt INCLUDING ALL);
    ERROR:  cannot convert whole-row table reference
    DETAIL:  Index "pt_unique_all" contains a whole-row table reference.
    
  21. サブクエリとして、ARRAY(SELECT ...) を実行した場合、メモリリークとなる不具合が修正されました。
    (Heikki Linnakangas, Tom Lane) (9.1)(9.0)(8.4)(8.3)

    メモリリークを避けるため、当該コードで使われている値を空にするタイミングを修正しています。

  22. 正しい文字配列順を評価選択オペレータに渡すようにプランナが修正されました。
    (Tom Lane) (9.1)

    以前は、コア機能においては、必要とされていませんでしたが、サードパーティには必要になると判断されました。

  23. 正規表現から共通の接頭辞を抽出する処理が修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    「^(foo)?bar」のような、括弧内の部分正規表現に対する検索で、不正なインデックス最適化を引き起こしていました。

  24. interval型定数の「hh:mm」と「hh:mm:ss」フィールドの解析における不具合が修正されました。
    (Amit Kapila, Tom Lane) (9.1)(9.0)(8.4)

    以下のようなケースとなります。時分秒の判別に失敗しています。

    SELECT interval '1 +2:03' minute to second;
     正: 1 day 00:02:03
     誤: 1 day 02:03:00
    
    SELECT interval '1 +2:03:04' minute to second;
     正: 1 day 02:03:04
     誤: 1 day -00:02:03
    
    SELECT interval '1 -2:03' minute to second;
     正: 1 day -00:02:03
     誤: 1 day -02:03:00
    
    SELECT interval '123 2:03 -2:04';
     正: ERROR:  invalid input syntax for type interval: "123 2:03 -2:04"
     誤: 123 days 02:03:00
    

    '123 day 2 hour 3 minute' のような書き方であれば本障害は関係しません。

  25. 部分的な GROUP BY リストを含むビューを適切に扱うように、pg_dump が修正されました。
    (Tom Lane) (9.1)

    pg_dump で以下のような形のビューについて、プライマリキーへの依存関係が不適切に判断されててしまいました。

     CREATE VIEW v AS
      SELECT t1.id, t1.v1, t1.v2 FROM t1
       LEFT JOIN t2 ON t1.id = t2.t1id
       GROUP BY t1.id;
    

    プライマリキーへの依存関係を不適切に扱っている pg_dump 出力では、良くても非効率なリストアとなり、最悪の場合、並行動作オプション (-j) での pg_restore が完全に失敗していました。

    pg_restore で以下のようなエラーが出る可能性があります。

    pg_restore: [archiver (db)] could not execute query:
    ERROR:  column "t1.v1" must appear in the GROUP BY clause or be used
    in an aggregate function
    

    カスタム形式(-Fc)アーカイブを使って並行リストアをさせる場合の問題となります。

  26. PL/Perl において、SQL_ASCII エンコードの場合、UTF8フラグを避けるよう修正されました。
    (Alex Hunsaker, Kyotaro Horiguchi, Alvaro Herrera) (9.1)
  27. PL/Python で Python ユニコードをサーバエンコードに変換するとき、Python ではなく、PostgreSQL のエンコード変換ファンクションを使うように修正されました。

    (Jan Urbanski) (9.1)(9.0)

    この修正はいくつか特定ケースでの問題を回避します。特に、PostgreSQL でサポートする文字エンコーディングを Python でサポートしていないことによる問題が避けられます。

    大きな機能的な変化は、サーバエンコーディングが SQL_ASCII の場合、UTF-8 文字コードを得ることになるということです。いままでは、非ASCII文字の文字列は全てエラーとなっていました。

  28. PL/Python の Python エンコード に対する PostgreSQLエンコードマップを修正しました。
    (Jan Urbanski) (9.1)(9.0)
  29. contrib/xml2 の xslt_process() におけるエラーを報告するようになりました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    以前は、xsltApplyStylesheet() から返ってくるエラーのチェックをしていませんでした。

  30. タイムゾーンデータファイルが tzdata release 2012e に更新されました。
    (9.1)(9.0)(8.4)(8.3)

    モロッコ、トケラウ諸島における夏時間法の変更、カナダにおける歴史的な修正が適用されています。

  31. 9.1 で改良された fsync 要求キュー圧縮処理が取り込まれました。
    (9.0)(8.4)(8.3)

    この修正は、チェックポイントの間、パフォーマンスを向上させます。9.1の変更は、バックパッチするのに安全であり、十分なフィールドテストがされていると判断されました。