PostgreSQL 8.2.4 に関する技術情報

このリリースは 8.2.3 からの修正リリース(2007/04/23リリース)で、脆弱性の修正などのセキュリティ内容やデータ破損に関する修正も含み、全てのバージョンで速やかな修正をお勧めします。
本ドキュメントは PostgreSQL のリリースノートを基に作成しています。
8.2.x からのアップデートではダンプ、リストアは不要ですが、以前のマイナーバージョンアップには initdb あるいは SQL の実行を要求されている内容がありますので注意してください。

PostgreSQL 8.2.3 から 8.2.4 への変更点


セキュリティに関する修正

search_path と security definer 設定の関数を組み合わせることで、関数定義ロールの権限で意図しない動作を実行される可能性がある問題に対応するため、各種の変更が加えられました。これは CVE-2007-2138 が割り当てられています。なお、初期状態で security definer 設定されている関数は存在しません。従って、ユーザ定義関数で security definer 設定を用いている場合、問題になる可能性があります。

  • pg_temp スキーマが追加されました。これは仮想的なスキーマで、一時テーブルなどが使用するスキーマ (pg_temp_? のような名称で、必ずしも同じではありません) を指定するために利用します。
    従来では一時スキーマは常に search_path より優先して検索されるため、検索順を明示することができませんでした。例えば search_path = ‘public,pg_temp’ と指定することで、一時テーブルより現存するテーブルを優先させられます。以下に、スキーマ検索の例を示します。

    (以前)

    # SELECT * FROM test_search;
          ?column?
    --------------------
     public.test_search
    (1 row)
    
    # CREATE TEMP TABLE test_search(t text);
    CREATE TABLE
    
    # INSERT INTO pg_temp_1.test_search VALUES ('pg_temp.test_search');
    INSERT 0 1
    
    # SELECT * FROM test_search;
              t
    ---------------------
     pg_temp.test_search
    (1 row)

    (今回のバージョンで、pg_temp をサーチパスに追加)

    # SET search_path TO public,pg_temp;
    SET
    
    # SELECT * FROM test_search;
            text
    --------------------
     public.test_search
    (1 row)
    
    # CREATE TEMP TABLE test_search(t text);
    CREATE TABLE
    
    # INSERT INTO pg_temp.test_search VALUES ('pg_temp.test_search');
    INSERT 0 1
    
    # SELECT * FROM test_search;
            text
    --------------------
     public.test_search
    (1 row)
  • なお、security definer 設定している関数内で、必ず pg_temp スキーマ以外を優先して検索させるには、search_path がユーザによって書き換えられている可能性があることを考慮して、関数内で明示的に指定する必要があります。以下に PL/pgSQL での、pg_temp スキーマを優先させないような実際の書きかたの例を示します。また、これについてはマニュアルの CREATE FUNCTION の項目 もご参照ください。
    DECLARE old_path text;
        (中略: 他の変数定義)
    
    BEGIN
        -- 直前のsearch_pathを保存。
        old_path := pg_catalog.current_setting('search_path');
    
        -- 安全なsearch_pathを設定
        PERFORM pg_catalog.set_config('search_path', 'public, pg_temp', true);
    
        (中略: 実際の処理)
    
        -- 以前のsearch_pathに戻す
        PERFORM pg_catalog.set_config('search_path', old_path, true);
    
        (中略: ここで RETURN)
    END;
  • 一時スキーマ上の関数と演算子は、上記の serach_path 設定いかがによらずに利用されなくなりました。単に test() と書いた場合、pg_temp スキーマ上の test() 関数が選ばれることはありません。pg_temp.test() のように直接修飾することで実行できます。

    (以前)

    # SELECT test_search_path();
         test_search_path
    ---------------------------
     public.test_search_path()
    (1 row)
    
    # CREATE FUNCTION pg_temp_1.test_search_path() RETURNS text AS $$ SELECT 'pg_temp.test_search_path()'::text $$ LANGUAGE sql;
    CREATE FUNCTION
    
    # SELECT test_search_path();
          test_search_path
    ----------------------------
     pg_temp.test_search_path()
    (1 row)

    (現行)

    # SELECT test_search_path();
         test_search_path
    ---------------------------
     public.test_search_path()
    (1 row)
    
    # CREATE FUNCTION pg_temp.test_search_path() RETURNS text AS $$ SELECT 'pg_temp.test_search_path()'::text $$ LANGUAGE sql;
    CREATE FUNCTION
    
    # SELECT test_search_path();
          test_search_path
    ----------------------------
     public.test_search_path()
    (1 row)

それ以外の修正

  1. ごくまれにデータ破損する可能性のある問題など、vacuum full に関する問題がいくつか修正されました。
  2. shared_preload_libraries で定義されているライブラリについて、Windows ではバックエンド起動時に強制読み直しするように変更されました。
  3. to_char 関数が、アルファベットの大文字小文字変換を、ローカライズされた月/日名に対しても適切に扱えるようになりました。
  4. contrib/tsearch2 で、まれにクラッシュする問題が修正されました。
  5. 同じデータベース内で prepare されたトランザクションをコミットしたい場合にも、commit prepared 命令が必須になりました。
  6. Windows 版の pg_dump で、2GB 以上のバイナリバックアップが出来るようになりました。
  7. 中国語繁字体の FAQ が追加されました。
  8. 統計情報収集器が、ディスク書き込みが非常に多くなる問題が修正されました。
  9. ドメインで、配列型を使ったときに発生する問題が修正されました。
  10. pg_dump でシリアル型カラムに関連するシーケンスを -t オプションなどで指定、かつ親テーブルを含まないとき、リストア時にエラーになる問題が修正されました。
  11. プランナに関する修正がいくつかあります。
    外部結合、ビットマップスキャンの選択に関する修正を含みます。
  12. PL/pgSQL で、例外ブロック中で RETURN すると、間違った値を返す、あるいはクラッシュする問題が修正されました。
  13. ハッシュインデックスで、領域拡張が発生するときに PANIC が発生することがある問題が修正されました。
    • なお、この問題は 7.4.16、8.0.10、8.1.6 にてやはりハッシュインデックスの修正を行ったときに入り込んだものです。
  14. タイムゾーン DB が更新されました。
    また、新しい、POSIX スタイルの USA の DST 仕様に合うように修正されました。