PostgreSQL 8.2.3 に関する技術情報

このリリースは 8.2.2 からの修正リリース(2007/02/07リリース)で、脆弱性の修正などのセキュリティ内容も含むほか、細かい修正がほどこされています。特に早急なアップグレードをお勧めします。
本ドキュメントは PostgreSQL のリリースノートを基に作成しています。
8.2.x からのアップデートではダンプ、リストアは不要ですが、が、8.2.1 については一部の修正を適用させるために dump/restore あるいは SQL の実行が必要になります。
修正を適用するために initdb が必要な不具合」の項も合わせてご確認ください。

PostgreSQL 8.2.2 から 8.2.3 への変更点


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

  • 常に関数の返り値の型がチェックされるようになりました。
    定義後に型を変更されるなどした場合にクラッシュ、あるいはサーバー上の権限のないデータが読み出せる可能性がありました。
    CVE-2007-0555 で公表されているものに相当します。
  • PREPARE 文などで利用中とされているテーブルは、ALTER TABLE 文による変更ができなくなりました。
    PREPARE した後に型を変更されるなどした場合にクラッシュ、あるいはサーバー上の権限のないデータが読み出せる可能性がありました。
    CVE-2007-0556 で公表されているものに相当します。
  • UTF-8 エンコーディングを使っていて、3 バイト以上の長さを持つ文字を使った場合にバッファオーバーランが発生する可能性がある問題を修正しました。

修正を適用するために initdb が必要な不具合

この修正は、新しいバージョンで新規に initdb したデータベースクラスタにのみ適用されます。
既存のデータベースクラスタをアップグレードする場合には、メジャーバージョンアップと同じように dump/restore を行うか、指示にしたがってデータベースをアップデートしてください。

  • information_schema.key_column_usage ビューの権限が間違っているためにエラーとなる問題が修正されました。
    この修正を適用するためには initdb か、以下の SQL 文をスーパーユーザーから全てのデータベースに対して実行する必要があります。

    CREATE OR REPLACE VIEW key_column_usage AS
       SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
              CAST(nc_nspname AS sql_identifier) AS constraint_schema,
              CAST(conname AS sql_identifier) AS constraint_name,
              CAST(current_database() AS sql_identifier) AS table_catalog,
              CAST(nr_nspname AS sql_identifier) AS table_schema,
              CAST(relname AS sql_identifier) AS table_name,
              CAST(a.attname AS sql_identifier) AS column_name,
              CAST((ss.x).n AS cardinal_number) AS ordinal_position,
              CAST(CASE WHEN contype = 'f' THEN
                     _pg_index_position(_pg_underlying_index(ss.coid),
                                        ss.confkey[(ss.x).n])
                        ELSE NULL
                   END AS cardinal_number)
                AS position_in_unique_constraint
       FROM pg_attribute a,
            (SELECT r.oid AS roid, r.relname, nc.nspname AS nc_nspname,
                    nr.nspname AS nr_nspname,
                    c.oid AS coid, c.conname, c.contype, c.confkey, c.confrelid,
                    _pg_expandarray(c.conkey) AS x
             FROM pg_namespace nr, pg_class r, pg_namespace nc,
                  pg_constraint c
             WHERE nr.oid = r.relnamespace
                   AND r.oid = c.conrelid
                   AND nc.oid = c.connamespace
                   AND c.contype IN ('p', 'u', 'f')
                   AND r.relkind = 'r'
                   AND (NOT pg_is_other_temp_schema(nr.oid))
                   AND (pg_has_role(r.relowner, 'USAGE')
                        OR has_table_privilege(r.oid, 'SELECT')
                        OR has_table_privilege(r.oid, 'INSERT')
                        OR has_table_privilege(r.oid, 'UPDATE')
                        OR has_table_privilege(r.oid, 'REFERENCES')) ) AS ss
       WHERE ss.roid = a.attrelid
             AND a.attnum = (ss.x).x
             AND NOT a.attisdropped;

その他の不具合の修正

  1. min()、max() が特定の条件でインデックススキャンに最適化出来ない問題が修正されました。
  2. b-tree インデックスが分割されるときに、以下の PANIC メッセージのいずれかが発生して、バックエンドが再起動してしまう問題が修正されました。
    この問題は特に 8.2 で頻繁に発生します。

    PANIC: failed to add item to the left sibling
    PANIC: failed to add item to the right sibling
  3. to_char(‘CC’) で、xx00 年を変換するときの問題が修正されました。
    例えば 2000 年は 20 世紀で、従来の出力である 21 世紀ではありません。
    8.1 以前のリリースについては、出力の互換性を重視するため、提供されません。
  4. contrib/tsearch2 が –no-locale を指定して動作するようになりました。
  5. 非常にたくさんのテーブルを含むデータベースを vacuum するときの性能が向上しました。
  6. UNION 文で、varchar(n) などの長さを指定出来る型を結合する場合で、まれに不要な assert が発生する問題が修正されました。
  7. すでに利用されている PL/pgSQL 関数を更新したときにクラッシュする問題が修正されました。
  8. PL/pgSQL の例外ブロックを処理中にエラーが発生する問題が修正されました。
  9. autovacuum が接続不可能なデータベースに対して vacuum freeze を実施するようになりました。
  10. Windows 版特有
    • Borland C++ コンパイラで libpq、psql をコンパイルできるようになりました。
    • 不要な「permission denied」エラーが発生する問題が修正されました。
    • 統計情報収集機がハングアップする可能性のある問題が修正されました。