PostgreSQL 9.1.4 に関する技術情報

このリリースは 9.1.3 からの修正リリース(2012/06/04リリース)です。
9.1.x からのアップデートではダンプ、リストアは不要です。

ただし、citext データ型を使用しており、かつ、pg_upgrade を使用してアップグレードを行っている場合には、本バージョンへのアップデート後に 3 番目の変更点 に従って操作を行う必要があります。

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

PostgreSQL 9.1.3 から 9.1.4 への変更点

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


  1. contrib/pgcrypto の crypt() 関数で DESアルゴリズムでのパスワードハッシュ化が修正されました。
    (Solar Designer) (9.1)(9.0)(8.4)(8.3)

    パスワード文字列に 0x80 という1バイトが含まれていると、その文字以降の文字列が無視されてしまい、パスワードが見た目よりも弱くなっていました。CYRILLIC CAPITAL LETTER KOPPA U+0480 (UTF8: 0xD2 0x80) など、0x80 はマルチバイト文字エンコーディングの 2バイト目以降として文字列データ型に含まれることがあります。

    0x80 バイトを含むパスワードのハッシュ化データは、本修正前と本修正後で異なるものとなるため、バージョンアップにともなって、パスワード再登録が必要となります。パスワードを ASCII文字に限っているのであれば、障害による問題も、修正による影響もありません。

    この問題は CVE-2012-2043 として登録されています。

    (9.1.3 実行例)
    postgres=# SELECT crypt(E'passxC2x80word', 'XX');
         crypt
    ---------------
     XXZ9QB82f805A
    (1 row)
    
    postgres=# SELECT crypt(E'passxC2x80', 'XX');
         crypt
    ---------------
     XXZ9QB82f805A
    (1 row)
    
    (9.1.4 実行例)
    postgres=# SELECT crypt(E'passxC2x80word', 'XX');
         crypt
    ---------------
     XXYXXMy.GzcWk
    (1 row)
    
    postgres=# SELECT crypt(E'passxC2x80', 'XX');
         crypt
    ---------------
     XXZ9QB82f805A
    (1 row)
    
  2. SECURITY DEFINER 属性と SET 属性を手続き言語呼び出しハンドラ関数むけには無視するようになりました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    これらの属性を手続き言語呼び出しハンドラ関数に適用するとサーバクラッシュが引き起こされる可能性がありました。手続き言語呼び出しハンドラ関数は、新たな手続き言語を作成するときに用意して、CREATE LANGUAGE 命令で指定するものです。

    この問題は CVE-2012-2655 として登録されています。

  3. 配列とドメインを扱えるように contrib/citext のアップグレードスクリプトが修正されました
    (Tom Lane) (9.1)

    citext は大文字小文字の区別がない文字列型を提供する追加モジュールです。

    9.1.2 バージョンから CREATE EXTENSION コマンドによるアップグレードの際に、既存の citext型のカラム定義とインデックス定義に変更を加えるようになっていましたがcitext型の配列やcitext型をベースとしたドメインについて対象となっていませんでした。

    以下のようなエラーが生じる可能性があります。

    ERROR:  could not determine which collation to use for string comparison
    HINT:  Use the COLLATE clause to set the collation explicitly.
    

    既にアップグレードをしていて問題が生じている場合には、管理者権限ユーザで、以下アップグレードスクリプト末尾に記述されている UPDATE コマンド群を手動実行してください。WITH節で始まる UPDATE コマンドがいくつか記述されています。

    《PGSQL_INSTALL_DIR》/share/extention/citext--unpackaged--1.0.sql
  4. timestamp型の入力におけるタイムゾーンの UTC からの時間差の数値表現で最大16時間の差異が扱えるようになりました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    いくつかの歴史的なタイムゾーンで15時間以上の時間差が必要でした。そのようなタイムゾーンをデフォルトにした場合、ダンプデータが本修正前のバージョンで読み込めない可能性が生じます。

    (9.1.3 の実行例)
    postgres=# SELECT '2012-06-04 12:00:00+15'::timestamptz;
    ERROR:  time zone displacement out of range: "2012-06-04 12:00:00+15"
    LINE 1: SELECT '2012-06-04 12:00:00+15'::timestamptz;
    
    (9.1.4 の実行例)
    postgres=# SELECT '2012-06-04 12:00:00+15'::timestamptz;
          timestamptz
    ------------------------
     2012-06-04 06:00:00+09
    (1 row)
    
  5. timestamp型の変換について、DST(夏時間)処理で境界ケースの振る舞いが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    ちょうど切り替わる日のときに正しく変換ができないケースがありました。

    (9.1.3 以前における障害報告例)
    postgres=# SET timezone TO 'Europe/Moscow';
    postgres=# SELECT '2011-03-27 23:00:00'::timestamptz;
          timestamptz
    ------------------------
     2010-12-17 21:04:06+03
    (1 row)
    
    (9.1.4 の実行例)
    postgres=# SET timezone TO 'Europe/Moscow';
    postgres=# SELECT '2011-03-27 23:00:00'::timestamptz;
          timestamptz
    ------------------------
     2011-03-27 23:00:00+04
    (1 row)
    
  6. text型からname型、char型からname型へのキャストについて修正されました。
    (Karl Schnaitter) (9.1)(9.0)(8.4)(8.3)

    マルチバイト文字エンコーディングで最大長(64バイト)以上部分を切り捨てる処理が修正されました。末尾がマルチバイト文字として正しくないことがありました。

  7. to_tsquery() 関数のメモリコピーの誤りが修正されました。
    (Heikki Linnakangas) (9.1)(9.0)(8.4)(8.3)

    正しくない処理結果を引き起こす可能性がありました。

  8. ホットスタンバイ側で実行する際に txid_current() 関数が確実に次の XID エポック値を返すようになりました。
    (Simon Riggs) (9.1)(9.0)

    トランザクション周回したときに、スタンバイ側で適切な値が返らないことが報告されていました。

  9. プランナのサブクエリ中の外側プレースホルダ変数の扱いが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)

    (9.1.3 再現例)
    postgres=# CREATE TABLE tbl (q1 int, q2 int);
    CREATE TABLE
    postgres=# SELECT * FROM tbl t1 LEFT OUTER JOIN
      (SELECT q1 AS x, 99 AS y FROM tbl t2) ss on t1.q2 = ss.x
       WHERE 1 = (SELECT 1 FROM tbl t3 WHERE ss.y IS NOT NULL );
    ERROR:  Upper-level PlaceHolderVar found where not expected
    

    外部結合で NULL の可能性のある外側クエリの変数を参照するサブクエリにおいて、問題が生じる可能性があります。該当する形状のクエリにおいて、本来発生すべきでないエラーが発生します。9.0.x、8.4.x においては、サブクエリに渡る値がNULL になるべきところそうならないため、おそらくは誤った値が黙って返ります。

  10. UNION ALL のサブクエリが単純な変数を返すのでない場合のプランが修正されました。
    (Tom Lane) (9.1)

    該当する場合に著しく悪いプランが選択されていました。

    (9.1.3 の悪いプラン例)
    postgres=# EXPLAIN SELECT (id, v) FROM
      (SELECT 1 as c, * FROM t1 UNION ALL SELECT 2 as c, * FROM t2) as s
       WHERE c = 2 ORDER BY  v, id;
                                  QUERY PLAN
    ----------------------------------------------------------------------
     Sort  (cost=43.17..43.19 rows=10 width=37)
       Sort Key: t1.v, t1.id
       ->  Result  (cost=0.00..43.00 rows=10 width=37)
             ->  Append  (cost=0.00..43.00 rows=10 width=37)
                   ->  Seq Scan on t1  (cost=0.00..21.50 rows=5 width=37)
                         Filter: (1 = 2)
                   ->  Seq Scan on t2  (cost=0.00..21.50 rows=5 width=37)
                         Filter: (2 = 2)
    
    (9.1.4 のプラン - 実際の実行時間はこちらが速い)
                                   QUERY PLAN
    -------------------------------------------------------------------------
     Sort  (cost=68.83..71.33 rows=1000 width=37)
       Sort Key: t2.v, t2.id
       ->  Result  (cost=0.00..19.00 rows=1000 width=37)
             ->  Append  (cost=0.00..19.00 rows=1000 width=37)
                   ->  Seq Scan on t2  (cost=0.00..19.00 rows=1000 width=37)
    
  11. pg_attribute システムテーブルが巨大なとき接続開始が遅くなるのが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    pg_attribute はテーブルにどのようなカラムが定義されているかを格納するシステムテーブルです。テーブル数が多いとき、大きくなりがちです。

    pg_attribute のサイズが shared_buffers の 1/4 を超える場合、セッションスタート時にしばしば必要となるキャッシュ再構築を行うコードが同期スキャン処理を引き起こし、通常よりも時間を要していました。一度に多数のセッション開始(接続)が発生する場合、特に深刻でした。

  12. シーケンシャルスキャンでクエリキャンセル確認を少なくとも1ページに1回は行うようになりました。
    (Merlin Moncure) (9.1)(9.0)(8.4)(8.3)

    有効行が無いページを読んでいる場合、その間、割り込みに反応することができませんでした。

  13. PGSemaphoreLock() 内部関数の Windows における実装が修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    クエリキャンセルの割り込みのタイミングによっては予期せぬ良くない結果を招く可能性がありました。

  14. ビューやルールにて行全体を表す変数(「*」)を安全に表示できるようになりました。
    (Abbas Butt, Tom Lane) (9.1)(9.0)(8.4)(8.3)

    曖昧なテーブル名、カラム名を伴う稀なケースで、ダンプリストア後に出力結果が変化してしまう危険性がありました。

  15. 不正なエンコーディングの扱いと調和するように COPY FROM コマンドのnullマーカー文字列の扱いが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)

    E'\0' は nullマーカーとして許されるべきですが、動作しませんでした。8.4 バージョンで入り込んだ問題で、8.3.x では動作していました。

    (9.1.3 エラー例)
    postgres=# COPY t FROM '/home/postgres/file.copy' NULL E'\0';
    ERROR:  invalid byte sequence for encoding "UTF8": 0x00
    HINT:  This error can also happen if the byte sequence does not match the
    encoding expected by the server, which is controlled by "client_encoding".
    CONTEXT:  COPY t2, line 9: "3   "
    
  16. RETURNING句を含む更新CTEクエリに対する EXPLAIN VERBOSE が修正されました。
    (Tom Lane) (9.1)

    (9.1.3 の誤った出力例 - aテーブルへのINSERT に Output: b.bc2 と出ている)
    postgres=# CREATE TABLE a (ac1 int, ac2 int);
    postgres=# CREATE TABLE b (bc1 int, bc2 int);
    postgres=# EXPLAIN (VERBOSE) WITH wcte AS
       (INSERT INTO a VALUES (42,47) RETURNING ac2)
        DELETE FROM b USING wcte WHERE bc1 = ac2;
    
                                   QUERY PLAN
    -------------------------------------------------------------------------
     Delete on public.b  (cost=0.04..39.58 rows=11 width=34)
       CTE wcte
         ->  Insert on public.a  (cost=0.00..0.01 rows=1 width=0)
               Output: b.bc2
               ->  Result  (cost=0.00..0.01 rows=1 width=0)
                     Output: 42, 47
       ->  Hash Join  (cost=0.03..39.57 rows=11 width=34)
             Output: b.ctid, wcte.*
             Hash Cond: (b.bc1 = wcte.ac2)
             ->  Seq Scan on public.b  (cost=0.00..31.40 rows=2140 width=10)
                   Output: b.ctid, b.bc1
             ->  Hash  (cost=0.02..0.02 rows=1 width=32)
                   Output: wcte.*, wcte.ac2
                   ->  CTE Scan on wcte  (cost=0.00..0.02 rows=1 width=32)
                         Output: wcte.*, wcte.ac2
    
  17. アドバイザリロックが存在する場合に PREPARE TRANSACTION が正しく動作するように修正されました。
    (Tom Lane) (9.1)

    歴史的に PREPARE TRANSACTION は、保持しているセッションレベルのアドバイザリロック(勧告的ロック)を無視する仕様ですが、エラーが出るようになっていました。

    (9.1.3 エラー例)
    postgres=# BEGIN;
    postgres=# SELECT pg_advisory_lock(1234);
    postgres=# PREPARE TRANSACTION 'P1234';
    ERROR:  cannot PREPARE when session locks exist
    

    9.1 でトランザクションレベルのアドバイザリロックが導入されたことに関連して本問題が入り込みました。

  18. UNLOGGED TABLE の TRUNCATE 処理が修正されました。
    (Robert Haas) (9.1)

    TRUNCATE で初期化フォークファイルが作られませんでした。クラッシュ時に初期化フォークから初期化しなければいけない場合に、問題が出る可能性がありました。

  19. インタラクティブでない search_path設定における存在しないスキーマの指定をエラーとせず適用するようになりました。
    (Tom Lane) (9.1)

    ALTER DATABASE SET などで存在しないスキーマを search_path に指定することができます。9.1.3 までは、ALTERコマンドまでは成功しますが、適用される段階でスキーマが存在しないとエラー扱いとなって実際には設定されない動作となっていました。

    これが 9.1.4 ではそのまま設定されます。

    9.1.4 でも SETコマンドで設定する場合(つまりインタラクティブな場合)には、存在しないスキーマを含んだ指定はエラーとなります。

  20. 拡張モジュールのスクリプトにおける一時テーブルの障害が修正されました。
    (Tom Lane) (9.1)

    拡張モジュールのアップデートスクリプトの中に ALTER TABLE がある場合などで発生し、拡張モジュールをアップデートする際に以下のようなエラーとなります。内部的に一時テーブルが使われていて、その扱いに問題がありました。

    (エラー発生例)
    postgres=# ALTER EXTENSION myext UPDATE TO '0.2';
    ERROR:  cannot drop table pg_temp_28906 because extension myext requires it
    HINT:  You can drop extension myext instead.
    
  21. 自動バキュームのワーカプロセスがスタック深度を確実に確認するようになりました。
    (Heikki Linnakangas) (9.1)(9.0)(8.4)(8.3)

    これまで通常のバックエンドプロセス以外の子プロセスにはスタック深度のチェックが行われていませんでしたが、これを行うようになりました。特に autovacuum のワーカプロセスは、
    任意のユーザコードを実行することがあるため、例えばインデックス定義に無限に再帰処理を行うような障害があった場合、インスタンス全体のダウンに至る危険がありました。

  22. ログコレクタが高負荷でもログの整合性を失わないように修正されました。
    (Andrew Dunstan) (9.1)(9.0)(8.4)(8.3)

    高負荷のときに大きいメッセージの再構築に失敗することがありました。これまで同時に行えるメッセージ再構築処理は20個までという恣意的な上限があったため、問題が生じていました。

  23. ログコレクタが SIGHUP (pg_ctl reload) を受けた後でも確実にファイルローテーションを継続できるように修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)
  24. "ERROR: too many LWLocks taken" が GiST インデックスで出る問題が修正されました
    (Heikki Linnakangas) (9.1)

    インデックス作成時に本エラーがでることが報告されていました。

  25. GINインデックスのWALリプレイのロジックが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)

    不要な PANIC が発生することが考えられました。

  26. クラッシュ後のスナップショット隔離レベル(9.1 の SERIALIZABLE モード) のプリペアトランザクションの衝突を正しく検知できるようになりました。
    (Dan Ports) (9.1)
  27. 一時テーブルだけを変更するトランザクションをコミットしたとき同期レプリケーションが遅延するのを回避するようになりました。
    (Heikki Linnakangas) (9.1)

    このようなケースではスタンバイサーバへの書き込みは必要ありませんが、一部のコードではそのことを認識せず待ってしまっていました。

  28. pg_basebackup のエラー処理が修正されました。
    (Thomas Ogrisegg, Fujii Masao) (9.1)

    エラーの場合でも正常返り値で終了してしまうことがありました。

  29. walsender が接続終了時にビジーループに入らないように修正されました。
    (Fujii Masao) (9.1)
  30. PL/pgSQL の RETURN NEXT コマンドのメモリリークが修正されました。
    (Joe Conway) (9.1)(9.0)(8.4)
  31. PL/pgSQL の GET DIAGNOSTICS コマンドが修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)

    対象が関数の最初の変数であるとき値が NULL になってしまいました。

    (9.1.3 再現例)
    postgres=# CREATE TABLE t1 (i int);
    postgres=# CREATE FUNCTION f1 (OUT r1 INT) LANGUAGE plpgsql AS $$
      BEGIN
       INSERT INTO t1 VALUES (1);
       GET DIAGNOSTICS r1 = row_count;
      END $$;
    postgres=# SELECT f1();   ⇒ 1 でなく NULL が返ってしまう
    
  32. PL/Perl が確実に _TD 変数でパッケージ資格を得るように修正されました。
    (Alex Hunsaker) (9.1)

    以下のようなエラーが出る例が、PL/Perl 関数中の動作で、PL/Perl関数によるトリガ起動を引き起こす場合に発生していました。

    ERROR:  couldn't fetch $_TD at line 4.
    CONTEXT:  PL/Perl function "myplperlfuxnc"
    
  33. 複合型を返す PL/Python 関数が返し値に文字列を受け入れるように修正されました。
    (Jan Urbanski) (9.1)

    9.1 にて、ディクショナリのような他の形式をサポートするようにした際に混入した障害です。

  34. psql の拡張表示モード(x)でバッファオーバランの可能性があり、修正されました。
    (Peter Eisentraut) (9.1)(9.0)(8.4)
  35. 多数のオブジェクトを含むデータベースにおける pg_dump のいくつかの性能問題が修正されました。
    (Jeff Janes, Tom Lane) (9.1)(9.0)(8.4)(8.3)

    pg_dump はデータベースに多数のスキーマが含まれていたり、多数のオブジェクトが依存関係のループをなしていたり、多数のシーケンスが在った場合に、非常に遅い動作となることがありました。

  36. pg_restore のディレクトリ形式のアーカイブを読む際における、メモリリーク、ファイル識別子リークが修正されました。
    (Peter Eisentraut) (9.1)
  37. データベースがデフォルト以外のテーブルスペースに配置されていて、デフォルトスペースに配置されているテーブルも含まれる場合について、pg_upgrade が修正されました。
    (Bruce Momjian) (9.1)(9.0)
  38. ecpg で稀にメモリリークとデータ上書きの可能性があり、修正されました。
    (Peter Eisentraut) (9.1)(9.0)
  39. contains/dblink の dblink_exec() 関数がエラー時に一時データベース接続をリークしないように修正されました。
    (Tom Lane) (9.1)(9.0)(8.4)(8.3)
  40. contrib/dblink がエラーメッセージに正しい接続名を報告するように修正されました。
    (Kyotaro Horiguchi) (9.1)(9.0)(8.4)
  41. contrib/vacuumlo が多数のラージオブジェクトを削除するときに複数のトランザクションを使うように修正されました。
    (Tim Lewis, Robert Haas, Tom Lane) (9.1)(9.0)

    これは max_locks_per_transaction 設定の上限を超えるのを避けるためです。この振る舞いは新たな -l オプションによって調整できます。

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

    南極、アルメニア、チリ、キューバ、フォークランド諸島、ガザ、ハイチ、ヘブロン、モロッコ、シリア、トケラウ諸島における夏時間法の変更、カナダにおける歴史的な修正が適用されています。