PostgreSQL 9.2.3 に関する技術情報

このリリースは 9.2.2 からの修正リリース(2013/2/7リリース)です。
9.2.x からのアップデートではダンプ、リストアは不要です。

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

PostgreSQL 9.2.2 から 9.2.3 への変更点

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


  1. SQL から enum_recv 関数が実行できなくなりました。
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    enum_recv 関数の引数が誤って宣言されているため、enum_recv 関数を SQL コマンドから呼び出すことによりサーバをクラッシュさせることができました。

    原理上、攻撃者はそれを悪用してサーバメモリの内容を調査できる可能性があります。この問題は、Sumit Soni 氏 (Secunia SVCRP) によって報告されました (CVE-2013-0255)。

  2. WAL の再生中に行われる一貫性のあるデータベース状態に達したかどうかの検知において、複数の問題が修正されました。

    (Fujii Masao, Heikki Linnakangas, Simon Riggs, Andres Freund) (9.2)(9.1)(9.0)
  3. バックアップデータの最後がチェックポイントレコードなどで、redo 処理が 行われなかったときのバックアップ終了点の検知が修正されました。

    (Heikki Linnakangas) (9.2)

    以前は、この誤りによって、不正に「WAL ends before end of online backup」エラーが発生することがありました。

  4. リレーションファイルを切り詰めるときに使用する最小のリカバリーポイントを更新するようにしました。
    (Heikki Linnakangas) (9.2)(9.1)(9.0)(8.4)

    以前は、タイムラインの初期の時点でリカバリを停止する際に、必要なデータを破棄しており、以下のようなエラーが発生することがありました。

    WARNING:  page 0 of relation base/xxxxx/xxxxx does not exist
    PANIC:  WAL contains references to invalid pages
    
  5. リカバリ対象のタイムラインが変更された後の WAL セグメントの再利用が修正されました。
    (Heikki Linnakangas) (9.2)(9.1)
  6. タイムライン履歴ファイルを、カスケード接続されたスタンバイサーバのアーカイブから適切にリストアするようになりました。
    (Heikki Linnakangas) (9.2)
  7. ホットスタンバイサーバでのロック競合検知が修正されました。
    (Andres Freund, Robert Haas) (9.2)
  8. ホットスタンバイモードで問い合わせのキャンセルが失敗する不具合が修正されました。
    (Noah Misch, Simon Riggs) (9.2)(9.1)(9.0)

    競合するホットスタンバイ問い合わせをキャンセルするはずが、時々失敗して、一貫性のないデータが見えていました。

  9. リカバリが完了し、安全に pg_xlog_replay_pause() が実行できるようになるまでは、pg_xlog_replay_pause() を実行してもリカバリが中断されなくなりました。

    (Tom Lane) (9.2)(9.1)
  10. サブクエリの結果に対する添え字の使用やフィールドの選択ができるようにSQL 文法が修正されました。
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    以前は、以下のようにエラーが発生しました。

    =# select ((select array[1,2]))[1];
    ERROR:  syntax error at or near "["
    LINE 1: select ((select array[1,2]))[1];
    
  11. 高負荷状況における、自動バキュームの切り詰めに関する性能問題が修正されました。
    (Jan Wieck) (9.2)(9.1)(9.0)

    テーブルの末尾で空のページを切り詰めるには、排他ロックが必要ですが、自動バキュームは、ロック要求が競合したときに失敗(かつ、テーブルロックを解放)するコードになっていました。そのため、高負荷な状況下で切り詰めが行われないことはよくあり、テーブルの無駄な膨張を招きました。

    今回、自動バキュームは、テーブルを部分的に切り詰め、ロックを解放し、ロックの再獲得を試みて処理を継続するように修正されました。この修正は、競合する要求が届いた後、自動バキュームがロックを解放するまでの平均時間も大幅に削減します。

  12. SPI_execute と関連する関数の性能が改善されたことによって、PL/pgSQL の EXECUTE の性能も改善されました。
    (Heikki Linnakangas, Tom Lane) (9.2)

    計画キャッシング機構の改訂結果として 9.2 で加えられたいくつかのデータコピーによるオーバーヘッドが取り除かれました。これは、特に多くの SQL 文を含むクエリ文字列を実行したときの 9.1 と比較した性能劣化を防ぎ、メモリの消費も抑えます。

    この修正によって、マルチステートメント問い合わせ文字列は、現在、完全に直列に処理されます。つまり、後に続く文の解析と計画立案の前に、始めの文の実行が完了します。

  13. インデックス使用のためのコスト見積もりが pre-9.2 の時点に戻されました。
    (Tom Lane) (9.2)

    コスト見積もり時の調整用係数 (fudge factor) が、非常に大きなインデックスを使用する望ましくない高いコスト見積もりにつながっていました。

  14. DROP INDEX CONCURRENTLY にて時々発生していたクラッシュが修正されました。
    (Tom Lane) (9.2)
  15. CREATE/DROP INDEX CONCURRENTLY における共有メモリロックテーブルの潜在的な破壊が修正されました。
    (Tom Lane) (9.2)
  16. フィルファクタ部分を引いたページサイズより大きなタプルを挿入する際に呼び出される COPY のコードが修正されました。
    (Heikki Linnakangas) (9.2)

    以前のコードは、無限ループに陥ることがありました。

  17. pg_tablespace をスキャンするときの競合状態を防ぐようになりました。
    (Stephen Frost, Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    以前は、CREATE DATABASE と DROP DATABASE が、pg_tablespace のエントリを同時に更新すると、不正な結果になることがありました。

  18. データベースやテーブルスペースを丸ごと削除しようとする DROP OWNED を防ぐようになりました。
    (Álvaro Herrera) (9.2)(9.1)(9.0)(8.4)(8.3)

    安全上、それらのオブジェクトの所有権は削除ではなく、再割り当てする必要がありました。

    この不具合は、9.2.2 の修正で混入しました。

    =# create user testuser;
    =# create database testdb owner testuser;
    =# drop owned by testuser;
    ERROR:  unrecognized object class: 1262
    
  19. vacuum_freeze_table_age の代わりに vacuum_freeze_min_age を間違って使用していたコードが修正されました。
    (Andres Freund) (9.2)(9.1)(9.0)(8.4)

    デフォルト設定では、vacuum_freeze_table_age は vacuum_freeze_min_age よりトランザクション数が多いですが、この間違いによって、自動バキュームによる部分的なテーブルスキャンが妨げられ、代わりに全テーブルスキャンが常に行われていました。

  20. RowExpr や XmlExpr が、構文解析を 2 回行ったときの不正な処理が修正されました。
    (Andres Freund, Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    この不正な処理は、以下のように CREATE TABLE LIKE INCLUDING INDEXES 文などで表面化しました。

    =# CREATE TYPE my_type AS (x int, y int);
    =# CREATE TABLE t1 (a int, b int);
    =# CREATE INDEX t1_idx ON t1 (((a, b)::my_type));
    =# CREATE TABLE t2 (LIKE t1 INCLUDING INDEXES);
    ERROR:  column "" has pseudo-type record
    
  21. ハッシュテーブルのサイズ計算における、整数オーバーフローに対する防御が改善されました。
    (Jeff Davis) (9.2)(9.1)(9.0)(8.4)(8.3)
  22. データ型にのアクセス権限に関するいくつかの不具合が修正されました。
    (Tom Lane) (9.2)

    型のデフォルトのアクセス権限にいくつか問題があり、アクセス権限のダンプに失敗していました。

    以前は、以下のようにデータ型に対してデフォルトのアクセス権限を定義すると、pg_dump に失敗します。

    =# ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON TYPES TO my_group;
    $ pg_dump db
    pg_dump: unknown object type (84) in default privileges
    
  23. サーバクラッシュ後の残骸の一時テーブルを無視するのに失敗する障害が修正されました。
    (Tom Lane) (9.2)(9.1)

    クラッシュリカバリで一時テーブルの削除を行いますが、システムテーブルについては起動時すぐには削除しない設計となっています。このため、残骸の一時テーブルは無視するように作られていましたが、以前の修正で問題が混入してしまいました。

  24. Windows におけるログファイルのサイズによるローテーションの失敗が修正されました。
    (Jeff Janes, Heikki Linnakangas) (9.2)

    log_rotation_size で指定したサイズを超過してもローテーションしないことがありました。

  25. to_date()関数が範囲外の日付を拒否するようになりました。
    (Hitoshi Harada) (9.2)(9.1)(9.0)(8.4)

    以下のような SQL は「ERROR: date out of range ...」となります。

    (従来の動作)
    =# SELECT to_date('32 Dec 2012', 'DD Mon YYYY');
      to_date
    ------------
     2013-01-01
    
  26. pg_extension_config_dump() 関数が拡張モジュールを更新した場合に適切に対応するように修正されました。
    (Tom Lane) (9.2)(9.1)

    pg_extension_config_dump() 関数は、拡張モジュールにおける一部の(例えば設定を書き込むための)テーブルのデータを pg_dump/pg_dumpall の対象に含めるように指定するものです。

    拡張モジュールの更新スクリプトの中で本関数を呼び出すことで、対象テーブルに対する既存の指定を置き換えることができるようになりました。以前は指定を追加するたけで置き換えがされませんでした。

  27. PL/pgSQL がプラン作成時のエラーで本来より簡単な表現のエラーが出ることが修正されました。
    (Tom Lane) (9.2)

    以下のように実行すると、1回目の関数実行ではエラーが短く出ます。

    =# CREATE FUNCTION fail() RETURNS int LANGUAGE plpgsql
         AS $$ BEGIN RETURN 1/0; END $$;
    CREATE FUNCTION
    =# SELECT fail();
    ERROR:  division by zero
    CONTEXT:  PL/pgSQL function fail() line 1 at RETURN
    =# SELECT fail();
    ERROR:  division by zero
    CONTEXT:  SQL statement "SELECT 1/0"
    PL/pgSQL function fail() line 1 at RETURN
    
  28. PL/Python の複数テーブルむけのトリガ関数の扱いが修正されました。
    (Andres Freund) (9.2)(9.1)

    同じ関数を異なるテーブルのトリガ関数として使う場合に問題がありました。異なるテーブルのトリガ関数が同じキャッシュエントリに格納されていたため、一方のテーブルについて削除した後、残るテーブルのトリガを起動したとき、「ERROR: cache lookup failed for relation 12345」というエラーがでました。

  29. Windows にて 非ASCIIのプロンプト文字列が正しいコードページに変換されるように修正されました。
    (Alexander Law, Noah Misch) (9.2)(9.1)(9.0)(8.4)(8.3)

    psql などの付属クラアントツールで表示が乱れ、エラーが出ることがありました。

  30. データベースに接続していないとき、psql の \? コマンドがクラッシュする可能性があり、修正されました。
    (Meng Qingzhong) (9.2)(9.1)(9.0)(8.4)(8.3)
  31. pg_basebackup 実行中にリレーションのファイルが削除された場合にエラーが出る可能性があり、修正されました。
    (Heikki Linnakangas) (9.2)(9.1)
  32. 「pg_basebackup -X」で、スタンバイサーバのバックアップ取得している間にタイムラインが変更されるのが許容されるようになりました。
    (Heikki Linnakangas) (9.2)

    以前は、タイムラインを跨って取得することができませんでした。pg_receivexlog にも同様の変更が適用されています。

  33. pg_dump がホットスタンバイデータベースに対しては、UNLOGGEDテーブルのデータを除外するようになりました。
    (Magnus Hagander) (9.2)(9.1)

    UNLOGGEDテーブルはスタンバイサーバにデータが伝搬しませんので、いずれにせよスタンバイサーバから有効なバックアップは取れません。--no-unlogged-table-data オプションが自動で付加されるようになったともいえます。

  34. pg_upgrade で不正なインデックスを安全に扱えるように修正されました。
    (Bruce Momjian) (9.2)(9.1)(9.0)

    これまで壊れたインデックスが生じているかチェックされませんでした。

  35. pg_upgrade の -O、-o オプションが修正されました。
    (Bruce Momjian) (9.2)

    pg_ctl にスペース空けがない形でパラメータが渡ってしまう問題がありました。

  36. libpq の PQprintTuples における 1 バイトのバッファオーバランが修正されました。
    (Xi Wang) (9.2)(9.1)(9.0)(8.4)(8.3)

    この古い関数は PostgreSQL 自身の中ではどこでも使われていません。しかし、一部のクライアントプログラムのコードで未だ使われている可能性があります。

  37. ecpglib が翻訳されたメッセージを適切に使うようになりました。
    (Chen Huajun) (9.2)(9.1)(9.0)(8.4)
  38. ecpg_compat と pgtypes ライブラリが Visual C によるビルドで適切にインストールされるように修正されました。
    (Jiang Guiqing) (9.2)(9.1)(9.0)(8.4)
  39. 提供されない OS むけに、isinf() マクロの実装が libecpg に含まれるようになりました。
    (Jiang Guiqing) (9.2)(9.1)(9.0)
  40. configure スクリプトの関数テストにて標準関数を調べる時にlibedit、libreadline から供給される同名の関数を無視するようになりました。

    (Christoph Berg) (9.2)(9.1)(9.0)(8.4)(8.3)
  41. Windows むけビルドスクリプトにてビルド番号が確実に単調増加するように日付の上位桁がゼロ埋めされるようになりました。

    (Magnus Hagander) (9.2)(9.1)(9.0)(8.4)(8.3)
  42. pgxs が実行プログラムを作成する際に Windows むけのクロスコンパイルのときには .exe サフィックスを付けるようになりました。

    (Zoltan Boszormenyi) (9.2)(9.1)(9.0)(8.4)(8.3)
  43. 新しいタイムゾーン短縮形 FET が追加されました。
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)(8.3)

    現在いくつかの東ヨーロッパのタイムゾーンで使われています。