PostgreSQL 9.0.7 に関する技術情報

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

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

PostgreSQL 9.0.6 から 9.0.7 への変更点

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


  1. CREATE TRIGGER を行うのにトリガ関数に対する実行権限が必要になりました(Robert Haas) (9.1)(9.0)(8.4)(8.3)

    以下のように一般ユーザ foo が テーブル t0 にトリガを作る権限をもっているとき、以前のバージョンでは、指定したトリガ関数に実行権限が無くともトリガが作れてしまいました。

    db=# CREATE FUNCTION f0_trig () RETURNS TRIGGER LANGUAGE PLPGSQL
         AS $$ BEGIN 《何らかの処理定義》RETURN NEW ; END $$;
    db=# REVOKE EXECUTE ON FUNCTION f0_trig() FROM public;
    
    db=> CREATE TABLE t1 (id int, v text);
    db=> CREATE TRIGGER tr0 BEFORE INSERT ON t1 EXECUTE PROCEDURE f0_trig();
    (修正後は「ERROR:  permission denied for function f0_trig」となる)
    

    トリガ関数が、関数所有者の権限で実行される SECURITY DEFINER 設定で定義されている場合、アクセス制限における脆弱性となりえます。別テーブル用の本来実行できないトリガ関数が、一般ユーザが作ったダミーのテーブルに対してトリガ設定することで、実行できてしまいます。この問題は CVE-2012-0866 として登録されています。

  2. SSL認証におけるコモンネーム(common name)の恣意的な長さ制限が撤廃されました (Heikki Linnakangas) (9.1)(9.0)(8.4)

    libpq と サーバは共にSSL証明書から抽出したコモンネームを 32バイトで切捨てていました。通常は予期せぬ認証失敗が生じる以上の問題は起きません。しかし、ある証明書の保持者が他人に成りすますことができるシナリオがありえました。ちょうど 32バイトのコモンネームをもつ被害者に対して、攻撃者は信頼されたCA(認証局)に、その文字列をプレフィックスとして持つコモンネームの証明書を発行させて成りすましを実現します。

    なお、本方法でサーバに成りすますには更にクライアント接続を乗っ取ることが必要となります。本件は CVE-2012-0867 として登録されております。

  3. pg_dump のコメントにあるオブジェクト名の中の改行がスペースに変換されます (Robert Haas) (9.1)(9.0)(8.4)(8.3)

    pg_dump は以下のようにコメントを伴った出力をします。このとき、オブジェクト名に改行が含まれない想定の実装となっていました。

    --
    -- Name: t1; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
    --
    
    CREATE TABLE t1 (
        id integer NOT NULL,
        v text
    );
    

    以下のような改行を含むようなテーブル名でテーブルを定義してダンプを取ると、

    db=> CREATE TABLE "t2
    db"> drop database x;
    db"> -- :P" (id int);
    

    以下のようなダンプデータが生成されて、命令(この例では DROP DATABASE文)が混入してしまいます。

    -- Name: t2
    drop database x;
    -- :P; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
    --
    
    CREATE TABLE "t2
    drop database x;
    -- :P" (
        id integer
    );
    

    本件は CVE-2012-0868 として登録されています。

  4. 挿入と VACUUM の同時実行で btree インデックスが破損する問題が修正されました (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    データ挿入によって生じるインデックスページ分割が、同時実行の VACUUM がインデックス要素を削除するのを失敗させることがありました。対応するテーブルの行が削除された後、誤ったインデックス要素が "ERROR: could not read block N in file ..." などを引き起こします。また、インデックス先に別のデータが置かれることで、誤った問い合わせ結果が返ることも考えられます。

    本障害はバージョン 8.2 から存在していましたが、発生頻度が低いため、これまで明らかにされませんでした。本障害で破損したインデックスは、REINDEX で修復されます。

  5. WAL再生における一時的な共有バッファのゼロ埋めが修正されました (Tom Lane) (9.1)(9.0)

    再生ロジックでは共有バッファをゼロ埋めすることがあり、バッファ内容は一時的に無効になります。これにより、ホットスタンバイモードでは、並行して実行している問い合わせが無効なデータを見てしまうことが起こり得ます。

    本障害による様々な症状が考えられますが "ERROR: invalid memory alloc request size ... " が出ることが一般的です。

  6. READ COMMITTED モードにおける WITH句によるデータ変更の処理が修正されました (Tom Lane) (9.1)

    INSERT、UPDATE、DELETE を含む WITH節は、親の UPDATE または DELETE 文が、READ COMMITTED モードにて、同時実行の更新により行の再評価を要する場合にクラッシュします。

  7. SERIALIZABLEトランザクションのクリーンアップの稀なケースについて修正されました (Dan Ports) (9.1)

    read-write の SERIALIZABLE トランザクションを終了するとき、残っているアクティブな SERIALIZABLE トランザクションが全て read-only である場合に、クラッシュする可能性がありました。

    SSI(Serializable Snapshot Isolation)トランザクションが採用された 9.1.x バージョンで該当します。

  8. ホットスタンバイがクラッシュした後に postmaster が再起動を試みる動作が修正されました (Tom Lane) (9.1)(9.0)

    ロジックに誤りがあり、ホットスタンバイモードで動作しているときバックエンドプロセスがクラッシュすると、インスタンスを再起動するのではなく、終了させるようになっていました。

  9. CLUSTER、VACUUM FULLの最近更新された行に属するTOASTデータに対する処理が修正されました (Tom Lane) (9.1)(9.0)

    TOASTテーブルのインデックスを CLUSTER、VACUUM FULL で処理するとき、"ERROR: duplicate key value violates unique constraint .. " を引き起こす可能性がありました。

  10. テーブル所有者が変更されたときに、テーブル単位の権限だけでなくカラム単位の権限も変更するようになりました (Tom Lane) (9.1)(9.0)(8.4)

    本修正以前には、ALTER TABLE .. OWNER TO を行っても、以下のようにカラム単位権限が更新されず、元の所有者名が残ってしまいます。

    db=# z t2
                              Access privileges
     Schema | Name | Type  | Access privileges | Column access privileges
    --------+------+-------+-------------------+--------------------------
     public | t2   | table | baz=arwdDxt/baz  +| c1:                     +
            |      |       | foo=r/baz         |   bar=r/baz
    
    db=# ALTER TABLE t2 OWNER TO foo;
    db=# z t2
                              Access privileges
     Schema | Name | Type  | Access privileges | Column access privileges
    --------+------+-------+-------------------+--------------------------
     public | t2   | table | foo=arwdDxt/foo   | c1:                     +
            |      |       |                   |   bar=r/baz
    
  11. 外部データラッパーと外部サーバーが REASSIGN OWNED コマンドに対応しました (Alvaro Herrera) (9.1)(9.0)

    これまで REASSIGN OWNED で外部データラッパー、外部サーバを持つ所有者の変更を試みると "ERROR: unexpected classid" が出ていました。

  12. ALTER USER .. SET 文、ALTER DATABASE .. SET 文で、いくつかの設定項目で実在しない値を設定できるようになりました (Heikki Linnakangas) (9.1)(9.0)(8.4)(8.3)

    default_text_search_config、default_tablespace、temp_tablespaces で設定が可能になります。未だ有効でないテキスト検索設定や、未だ作られていないテーブルスペースを指定することができます。search_path については以前から実在しないスキーマを設定できるようになっていました。

  13. INSERT文で COLLATE句を使う場合に "ERROR: unsupported node type ..." が出る問題が修正されました (Tom Lane) (9.1)

    以下のようなケースでエラーが発生します。

    db=> CREATE TABLE t3 (v varchar(25));
    db=> INSERT INTO t3 VALUES ('AA' COLLATE "C");
    ERROR:  unsupported node type: 325
    STATEMENT:  INSERT INTO t3 VALUES ('AA' COLLATE "C");
    
  14. コミット後にテーブルファイル削除に問題が生じたときにクラッシュを回避するようになりました (Tom Lane) (9.1)(9.0)(8.4)

    DROP TABLE はトランザクションコミット後に対応するファイルの削除を引き起こします。例えばファイルアクセス権限の問題などでファイル削除に失敗した場合、トランザクションをアボートさせるには遅いので、警告メッセージを出して処理を継続します。バージョン 8.4 からこのロジックが壊れており、同状況で PANIC(クラッシュ終了)とデータベース再起動の失敗を引き起こしていました。

  15. DROP TABLESPACE の WAL再生 のエラーに対して回復できるようになりました (Tom Lane) (9.1)(9.0)

    WAL再生でテーブルスペースのディレクトリを削除しようとして、何らかの理由(アクセス権限不足などで)で失敗することがあります。以前は、リカバリ処理が PANIC となり、データベースは手動で補正しないかぎり再起動できない状態になりました。本修正でログに問題を報告し、処理は継続するようになりました。

  16. ホットスタンバイでの AccessExclusiveLock のログ出力の競合が修正されました (Simon Riggs) (9.1)(9.0)

    0番トランザクションによってロック待ちが生じたという誤ったログが出力されることがありました。本障害により、スタンバイサーバでアサートエラーが発生することが知られています。それ以外にも深刻な問題を引き起こす可能性があります。

  17. WAL再生のとき OIDカウンタを番号が周回した場合でも追跡するようになりました (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    これまでは WAL再生モード(リカバリ)を終了するまで、OIDカウンタは最大値で止まったままとしていました。これでおよそ実用的には問題ありませんでした。しかし、スタンバイサーバがプライマリに昇格する場合に OID カウンタを適切な値まで進めるのに時間を要することがあり、修正されました。

  18. クラッシュリカバリの最初に "consistent recovery state reached ..." という誤解を招くログメッセージが出力されないようになりました (Heikki Linnakangas) (9.1)(9.0)
  19. pg_stat_replication ビューの replay_location カラムの初期値が修正されました (Fujii Masao) (9.1)(9.0)

    これまでは一つの WALレコードが再生されるまでは誤った値を見せていました。

  20. 正規表現の「*」による後方参照が修正されました (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    本来マッチすべき文字列よりも幅広く、マッチしたものとしていました。以下例ではパターン '^([bc])1*$' に対して、実際には '^([bc])(1+|[bc]*)$' というパターンであるかのような処理がこれまで行われていました。

    (本来マッチするパターン)
    db=> SELECT 'c' ~ '^([bc])1*$';   ⇒ TRUE
    db=> SELECT 'ccc' ~ '^([bc])1*$'; ⇒ TRUE
    
    (修正前)
    db=> SELECT 'bcc' ~ '^([bc])1*$'; ⇒ TRUE
    
    (修正後)
    db=> SELECT 'bcc' ~ '^([bc])1*$'; ⇒ FALSE
    
  21. 最近に混入した inet型、cidr型の処理におけるメモリリークが修正されました (Heikki Linnakangas) (9.1)(9.0)(8.4)(8.3)

    前回マイナーリリースにて導入された障害となります。メモリリークを引き起こし、特にこれら型のカラムに Btreeインデックスを作るときに大きく現れます。

  22. プランナの UNION ALL のときインデックス適用が制限される振る舞いが修正されました (Tom Lane) (9.1)

    9.1.2 バージョンの修正の際に混入した誤りとなります。

  23. WITH節が 継承されたテーブルの UPDATE、DELETE に参照されている場合におけるプラン作成について修正されました (Tom Lane) (9.1)

    以下のような再帰問い合わせ実行時にプランナのエラーが発生していました。

    db=> CREATE TABLE parent (id int, val text);
    db=> CREATE TABLE child1 () INHERITS (parent);
    db=> CREATE TABLE child2 () INHERITS (parent);
    db=> INSERT INTO parent VALUES (1, 'p1');
    db=> INSERT INTO child1 VALUES (11, 'c11'),(12, 'c12');
    db=> INSERT INTO child2 VALUES (23, 'c21'),(24, 'c22');
    
    db=> WITH wcte AS ( INSERT INTO child1 VALUES (42, 'new')
         RETURNING id AS newid )
             UPDATE parent SET id = id + newid FROM wcte;
    ERROR:  could not find plan for CTE "wcte"
    
    db=> WITH rcte AS ( SELECT max(id) AS maxid FROM parent )
         DELETE FROM parent USING rcte WHERE id = maxid;
    ERROR:  could not find plan for CTE "rcte"
    
  24. GIN のコスト見積もりが「column IN ( ... )」構文でインデックス条件を扱えるようになりました (Marti Raudsepp) (9.1)
  25. 失敗したトランザクションを開いた状態で接続を終了するときアサートエラーが生じるのを防ぐようになりました。 (Tom Lane) (9.1)

    本障害は通常の --enable-cassert を指定しないビルドでは影響ありません。

  26. SQL関数中の CREATE TABLE AS あるいは SELECT INTO におけるポインタ処理の誤りが修正されました (Tom Lane) (9.1)(9.0)(8.4)

    ほとんどの場合、--enable-cassert を設定している場合にアサートエラーが発生するだけですが、そのほかの問題が発生する可能性もあります。

  27. Windows で PostgreSQL付属のログ管理モジュールがファイルの2重クローズをしてしまうのを防ぐようになりました (MauMau) (9.1)(9.0)(8.4)(8.3)

    通常は本エラーは表面化しません。しかし、デバッグ版の Windows では Exception を引き起こします。

  28. PL/pgSQL関数でのデータ型 I/O変換関連のメモリリークが修正されました (Andres Freund, Jan Urbanski, Tom Lane) (9.1)(9.0)(8.4)(8.3)

    本来より短いコンテキストで回収されるべきメモリが、関数終了時まで回収されません。

  29. Perl API の SvPVutf8() 関数の障害を回避するようになりました (Andrew Dunstan) (9.1)

    本関数は、型グロブまたは $^V のような読み込み専用オブジェクトを扱う際にクラッシュします。PL/Perl でこれを避けるようになりました。

  30. pg_dump は拡張モジュールの設定テーブルはダンプしないようになりました (Tom Lane) (9.1)

    --schema や --table オプションで拡張モジュール自体をダンプ対象としている場合を除いて、拡張モジュールの設定テーブルはダンプ対象外となります。

  31. pg_dump で継承テーブルのカラムの扱いが改善されました (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    子テーブルのカラムが親テーブルのカラムにおけるデフォルト式あるいは NOT NULL 指定について、文面上は一致していてもスキーマサーチパスの違いなどで実際には同一でないような指定があるとき、同一のものと誤認してしまう問題がありました。

    以下をダンプ、リストアすると、s1.t1 テーブルと s2.t1 テーブルが同一シーケンスをデフォルト値とするように変ってしまっていました。

    db=> CREATE SCHEMA s1;
    db=> CREATE SCHEMA s2;
    db=> CREATE TABLE s1.t1(c1 bigserial primary key, c2 text);
    db=> CREATE TABLE s2.t1(c1 bigserial primary key) inherits (s1.t1);
    
  32. pg_restore で INSERT形式テーブルデータをデータベース指定してリストアする場合について修正されました (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    pg_dump にて --inserts または --column-inserts オプションを指定して取得したダンプファイルを pg_restore でリストアするときにエラーが発生します。ダンプファイル自体には誤りはなく、pg_restore の問題となります。また、直接リストアするのでなくテキストモードで出力させる場合には問題となりません。

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

    $ pg_dump -Fc --inserts db > dump
    $ createdb dbx
    $ pg_restore -d dbx dump
    pg_restore: [archiver (db)] Error while PROCESSING TOC:
    pg_restore: [archiver (db)] Error from TOC entry 2635; 0 16519 TABLE DATA t postgres
    pg_restore: [archiver (db)] could not execute query: ERROR:  syntax error at or near "INT"
    LINE 66: INSERT INT
                    ^
        Command was: INSERT INTO t VALUES (1, 'AAAAAAAAAAAAAA');
    

    9.1.0 は当初から障害がありましたが、9.0.x 系クA係.3.x系については前回、あるいは前々回のマイナーバージョンアップで混入した障害となります。

  33. pg_upgrade が PL/Python の共有ライブラリの名前が変わったことに対応しました (Bruce Momjian) (9.1)

    PL/Python を含む 9.1.x 以前のデータベースを pg_upgrade でアップグレードする場合、本障害により失敗していました。

  34. pg_upgrade が regclass型カラムを含むテーブルを処理できるようになりました (Bruce Momjian) (9.1)(9.0)

    pg_upgrade が pg_class の OID を保護するようになったため、regclass カラムを扱えない制約がなくなります。

  35. libpq が SSLクライアント証明書ファイルを探す時に ENOTDIR エラーを無視するようになりました (Magnus Hagander) (9.1)(9.0)

    これによりユーザホームディレクトリが /dev/null などに設定してあって証明書がない場合にも SSL接続が可能となります。

  36. ecpg の SQL記述領域(SQLDA)のフィールドアライメントの問題がいくつか修正されました (Zoltan Boszormenyi) (9.1)(9.0)
  37. ecpg で DEALLOCATE 文に ATオプションが利用可能になりました (Michael Meskes) (9.1)(9.0)(8.4)

    本機能はすでに実装されていましたが、誤ってエラーチェックで弾くようになったままとなっていました。

  38. ecpg で varchar 構造体を定義するときに 変数名を使わないようになりました (Michael Meskes) (9.1)(9.0)

    連番を付加した自動的な命名が行われるようになります。

  39. contrib/auto_explain モジュールの JSON出力モードが正しいJSON形式を出力するように修正されました (Andrew Dunstan) (9.1)(9.0)

    トップレベルにブランケット([])が使われていましたが、ブレース({})が適切でした。

  40. contrib/pgcrypto の encrypt_iv() と decrypt_iv() のエラー検出が修正されました (Marko Kreen) (9.1)(9.0)(8.4)(8.3)

    これらの関数はある種の無効入力エラーを報告せず、誤った入力に対し、ランダムなゴミ値を返していました。

  41. contrib/test_parser での1バイトバッファオーバーランが修正されました (Paul Guyot) (9.1)(9.0)(8.4)(8.3)

    コードは本来よりも1バイト多く読み込もうとしており、まれにクラッシュを引き起こします。contrib/test_parser はサンプルであるため、これ自体はセキュリティ問題ではありません。

  42. 利用可能な時は ARMでのスピンロックに __sync_lock_test_and_set()を使います (Martin Pitt) (9.1)(9.0)(8.4)(8.3)

    この関数は、以前使っていた ARMv6 以降では推奨されず使えない SWPB 命令を置き換えます。報告によると、古いコードは最近のARM基盤でも直接的な失敗にはなりません。しかし、同時アクセスの連動が行なえず、マルチプロセス処理での奇妙な失敗が起こります。

  43. -fexcess-precision=standard オプションを受け付ける gccバージョンでビルドする時は、それを使います (Andrew Dunstan) (9.1)(9.0)(8.4)(8.3)

    これは最近の版の gcc が独創的な結果を生成し、分裂したシナリオになるのを防ぎます。

  44. FreeBSD でスレッド化した Python を使えるようになりました (Chris Rees) (9.1)(9.0)(8.4)(8.3)

    configureスクリプトでは、これまでこの組合せは動かないとしていました。しかし FreeBSD が問題を修正したので、エラーチェックを外しました。

  45. MinGW ビルドで標準的な名前の OpenSSL ライブラリを使うようになりました (Tomasz Ostrowski) (9.1)