PostgreSQL 8.4 に関する技術情報

このリリースは PostgreSQL 8.4 (2009/04/16リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

概要

本リリースでは、仕様の追加、近年 SQL 標準で定義された機能の追加をしています。
主要な拡張内容は以下のとおりです。

  • ウィンドウ関数が追加されました。

    OVER 句、WINDOW 句を使った集計 SQL を記述することができます。

  • WITH 節によるテーブル式の構文が追加されました。

    再帰的 な SQL を記述することができます。

  • ユーザ定義関数の引数にデフォルト値や可変引数が使えるようになりました。
  • 並行リストアに対応しました。

    pg_restore コマンドで並列処理をさせることができます。

  • データベースごとにロケール指定ができるようになりました。

    従来はデータベースクラスタ作成(initdb)の際に 1 つ指定できるのみでした。

  • hash インデックスが改善されました。

    従来のものは、優位点が少なく使用を推奨されないものでした。

  • EXISTS、NOT EXISTS 句を使った結合処理の性能が改善されました。
  • アーカイブロギング関連の改善などにより、ウォームスタンバイ構成がより使いやすくなりました。
  • フリースペースマップの設定が自動化されました。

    設定 max_fsm_pages、max_fsm_relations は廃止されています。

  • ビジビリティマップが導入されました。

    ビジビリティマップとは、バキューム対象となる不要領域を記憶するものです。
    変更が少ないテーブルに対するバキューム処理の負荷が激減します。

  • psql が、バージョンを判断して動作するようになりました。

    過去バージョンのサーバに接続したときでもバックスラッシュコマンドが使えます。
    (とはいえ、全てのバックスラッシュコマンドが完全に使えるわけではありません)

  • 以下の新たな contrib モジュールが追加されました。
    • pg_stat_statements
    • auto_explain
    • citext
    • btree_gin

以下に詳細を説明します。

8.4 への移行 / 互換性のない変更点

PostgreSQL 8.3.X 以前のバージョンから、8.4 に移行するには、pg_dump によるダンプとリストアが必要となります。設定項目や SQL 言語において互換性のない変更点があります。

一般

  • ビルド時、日付時刻に 64bit 整数型を使うのが、デフォルトとなりました。

    従来は ./configure に –enable-integer-datetimes オプションが必要でした。8.4 では使わない場合に –disable-integer-datetimes オプションを指定します。

  • ipcclean コマンドが廃止されました。

    このコマンドは PostgreSQL がクラッシュした後に、OS の共有メモリやセマフォを解放するためのものでしたが、一部のプラットフォームでしか使えませんでした。8.4 では代わりに OS のツール(ipcsコマンド、ipcrm コマンドなど)を使うことになります。

サーバ設定

  • 設定 log_min_messages のデフォルトが、notice から warning に変更されました。
  • 設定 debug_print_parse、debug_print_rewritten、debug_print_plan を有効にしたときの出力が、LOG レベルに出力されるようになりました。

    従来は、DEBUG1 レベルで出力されていました。

  • 設定 debug_pretty_print がデフォルトで有効となりました。
  • 設定 explain_pretty_print が廃止されました。

    EXPLAIN VERBOSE の出力形式が変わったため、本設定は必要なくなりました。

  • 設定 log_temp_files が、他のログ設定と同様に、スーパーユーザのみが設定できるようになりました。
  • 設定 log_filename で、これまで指定のファイル名文字列の中に % エスケープが存在しない場合に、新規ログファイルの作成時刻が追加されていたのが、廃止されました。
  • 復旧コマンドファイル recovery.conf から、設定 log_restartpoints が廃止されました。

    postgresql.conf の設定 log_checkpoints で代替してください。

  • 安全でないクライアント認証方式 crypt がサポートされなくなりました。

    md5 方式の無い、7.2 以前の PostgreSQL との互換性は失われます。

  • 設定 krb_realm、krb_server_hostname が廃止されました。

    postgresql.conf でなく、pg_hba.conf に記述するようになります。

  • pg_hba.conf のオプションの記述方法が拡張されました。

    (詳しくは pg_hba.conf のセクション をご参照ください。)

問い合わせ言語

  • TRUNCATE と LOCK を親テーブルに行なったとき、全ての子テーブルにも適用されるようになりました。

    これまでは、親テーブルへの TRUNCATE では 子テーブルのデータは削除されず、親テーブルをロックしても、子テーブルは関係なくアクセス可能でした。

  • SELECT DISTINCT、UNION、INTERSECT、EXCEPT で出力が必ずしもソートされなくなりました。

    ソートが必要な場合には ORDER BY を足す必要があります。これは上記SQLコマンドの実行プランとしてハッシュ集約が使えるようになったためです。設定 enable_hashagg を無効にすると、従来と同じ動作になります。

  • 子テーブルに対して、親テーブルの制約を強制するようになりました。

    これまでは、子テーブルで親テーブルから継承した制約を、削除することができました。こうした従来の動作は不徹底で、SQL 標準に反しているといえます。

    =# CREATE TABLE parent (id int, val text, check (id > 0));
    CREATE TABLE
    
    =# CREATE TABLE child () INHERITS (parent);
    CREATE TABLE
    PostgreSQL 8.3
    =# ALTER TABLE child DROP CONSTRAINT parent_id_check;
    ALTER TABLE
    PostgreSQL 8.4
    =# ALTER TABLE child DROP CONSTRAINT parent_id_check;
    ERROR:  cannot drop inherited constraint "parent_id_check" of relation "child"
  • LIMIT、OFFSET で負の値を指定したとき、エラーになります。

    8.3 ではエラーにはならず、動作も定義されていませんでした。

  • トランザクションブロックの外側で LOCK を行なったとき、エラーになります。

    すぐにロック解放されるので意味の無い操作ですが、これまではエラーになりませんでした。

    PostgreSQL 8.3
    =# LOCK t1;
    LOCK TABLE
    PostgreSQL 8.4
    =# LOCK t1;
    ERROR:  LOCK TABLE can only be used in transaction blocks
  • シーケンスに start_value カラムが追加されました。

    ALTER SEQUENCE 〜 RESTART 構文でこの値が使われます。

関数と演算子

  • numeric 型の 0 に対する非負数の冪乗(0::numeric ^ 2.5 ⇒ 0、0::numeric ^ 0.0 ⇒ 1 など)が動作するようになりました。

    従来は、非負整数以外はエラーになっていました。

  • 浮動小数値の単項マイナスが「-0」を生み出すのを許すようになりました。

    この振る舞いの変更は、IEEE 標準に従っています。

  • エスケープ文字が LIKEパターンの最後にあった場合 (何もエスケープされない)、エラーになるようになりました。
  • 「~=~」演算子と「~<>~」演算子が廃止されました。

    過去に LIKE インデックスの比較に使われていました。現在は、パターンインデックスで通常の「=」演算子を使うことができます。

  • xpath() 関数は、引数を libxml に何ら変更を加えずに渡すようになりました。

    XML 引数には、整形式 XML ドキュメントを与えることが必須となります。従来の実装では、XML フラグメントを認めようと試みていましたが、うまく動作しませんでした。

  • xmlelement() 関数が、属性を内容と同じように整形するようになりました。

    従来は、属性は通常の SQL 出力形式の振る舞いに従っていましたが、XML 規則としてはしばしば奇妙でした。

    PostgreSQL 8.3
    =# SELECT xmlelement(name foo, xmlattributes(array[1,2] as arr), array[1,2]);
                               xmlelement
    -----------------------------------------------------------------
     <foo arr/="{1,2}"><element>1</element><element>2</element></foo>
    PostgreSQL 8.4
    =# SELECT xmlelement(name foo, xmlattributes(array[1,2] as arr), array[1,2]);
                                      xmlelement
    ----------------------------------------------------------------------------------------------------------------------------
    <foo arr="&lt;element&gt;1&lt;/element&gt;&lt;element&gt;2&lt;/element&gt;"><element>1</element><element>2</element></foo>
    
  • ハッシュ関数に、高速なアルゴリズムが適用されました。

    その影響で、組込みのハッシュ関数の多くが、プラットフォームのバイトオーダーによって異なる結果を返します。

時刻の関数と演算子

  • 設定 datestyle が、interval 型の出力に影響を与えなくなりました。

    代わりに設定 intervalstyle が影響を与えます。

  • 時間のマイクロ秒部分について、一貫性のある丸め処理が提供されるようになりました。
    postgreSQL 8.3
    postgres=# SELECT '12:12:12.125'::time(2);
        time
    -------------
     12:12:12.12
    PostgreSQL 8.4
    postgres=# SELECT '12:12:12.125'::time(2);
        time
    -------------
     12:12:12.13
  • to_char() 関数のローカライズされた月名、曜日名は LC_MESSAGES でなく、LC_TIME に従うようになりました。
  • to_date() 関数、to_timestamp() 関数は、無効な入力に対して、より一貫性のあるエラーを出すようになりました。
  • to_timestamp()関数が、「AM/PM」「BC/AD」において、大文字小文字の一致を要求しないように修正されました。

    フォーマット文字列に「AD」と書いてあるとき、「ad」と書かれた入力を受け付けることができます。

PostgreSQL 8.4 の変更点

以下に、PostgreSQL 8.4 と 8.3.X との違いを詳しく記載します。

パフォーマンス

  • オプティマイザによる統計情報の計算が改善されました。

    特に、全文検索演算子が改善されています。

  • SELECT DISTINCT、UNION、INTERSECT、EXCEPT が、ハッシュを使えるようになりました。

    従来は、これら SQL では、おのずとソートされた出力になっていましたが、そうではなくなります。ソートが必要な場合には ORDER BY を足す必要があります。なお、SELECT DISTINCT ON はハッシュを使いません。

    PostgreSQL 8.3
    =# EXPLAIN SELECT DISTINCT bid FROM accounts;
                                     QUERY PLAN
    ----------------------------------------------------------------------------
     Unique  (cost=12089.82..12589.82 rows=1 width=4)
       ->  Sort  (cost=12089.82..12339.82 rows=100000 width=4)
             Sort Key: bid
             ->  Seq Scan on accounts  (cost=0.00..2588.00 rows=100000 width=4)
    PostgreSQL 8.4
    =# EXPLAIN SELECT DISTINCT bid FROM accounts;
                                  QUERY PLAN
    ----------------------------------------------------------------------
     HashAggregate  (cost=2838.00..2838.01 rows=1 width=4)
       ->  Seq Scan on accounts  (cost=0.00..2588.00 rows=100000 width=4)
  • 計画タイプに、semi-join、anti-join が追加されました。

    semi-join は既存の IN join を置き換え、anti-join は NOT EXISTS 句に対する新たな方法です。これは最適化の改善につながります。

  • IN、ANY、EXISTS 句の処理が改善されました。

    これにより、IN と EXISTS で同内容の記述をした場合、一般的に性能も同じ程度となります。

    =# EXPLAIN SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
                                          QUERY PLAN
    -----------------------------------------------------------------------
     Merge Semi Join  (cost=0.00..9450.52 rows=100000 width=27)
       Merge Cond: (t1.id = t2.id)
       ->  Index Scan using t1_pkey on t1 (cost=0.00..3975.26 rows=100000 width=27)
       ->  Index Scan using t2_pkey on t2 (cost=0.00..3975.26 rows=100000 width=4)
  • text_position() 関数および、BMH(Boyer-Moore-Horspool)法による検索を使う関連の関数の性能が、改善されました。

    これは、特に長い検索パターンのとき有効です。

  • 要求されたときにだけファイルに書き込むことで、バックエンドによる統計情報のファイル書き込み頻度が減りました。

    (アクセス統計情報でなく、VACUUM、ANALYZE によって収集されるテーブル/カラム統計情報です。)

  • 大量挿入の性能が改善されました。
  • 設定 default_statistics_target のデフォルト値が、10 から 100 に増えました。また、最大値も 1000 から 10000 に増えました。
  • 設定 constraint_exclusion が on、off、partition の値をとるようになりました。

    デフォルトの partition では、テーブル継承か UNION ALL が使われたときにだけ、分割されたテーブルをチェックするようになりました。

  • ビットマップインデックススキャンで、I/O 先読みができるようになりました。

    先読み量は、設定 effective_io_concurrency で管理されます。OS が、posix_fadvice() システムコールをサポートしている必要があります。

  • FROM 節の複数行を返す単純な SQL 関数を、インライン展開するようになりました。
  • 複数回に分けて実行されるハッシュJOIN の性能が改善されました。

    対象が一度にメモリ上で処理できないほど巨大なテーブルで、結合キーの一部の値が外側テーブルで特に多い(偏っている)場合に効果があります。

  • CREATE INDEX CONCURRENTLY が、トランザクション中でアイドル状態の接続を待機してしまうのを、回避するようになりました。
  • 共有バッファの無効化の性能が改善されました。

サーバ

設定
  • pg_settings ビューに enumvals というカラムが追加され、列挙値を選ぶタイプの postgresql.conf設定について、候補値が容易に参照できるようになりました。
  • 設定 cursor_tuple_fraction が追加されました。

    「カーソルの行をどれほど読み込むか」の見積り係数を指定します。

  • postgresql.conf のカスタム設定名に、アンダースコア「_」の使用が許されるようになりました。
認証
  • 設定 db_user_namespace が有効で、MD5 認証を使っている場合に、適切なエラーメッセージがでるようになりました。

    この組み合わせはサポートされないため、pg_hba.conf を書き換えて、pg_ctl reload を行なっても反映されません。この組み合わせにして再起動した場合、起動しなくなります。

    LOG:  received SIGHUP, reloading configuration files
    LOG:  MD5 authentication is not supported when "db_user_namespace" is enabled
    WARNING:  pg_hba.conf not reloaded
  • pg_ident.conf で正規表現がサポートされるようになりました。
  • Kerberos 認証、GSSAPI 認証において、postmaster プロセスを再起動せずに、パラメータを変更できるようになりました。
pg_hba.conf
  • pg_hba.conf ファイルを postmaster プロセスが読み込むとき、pg_ctl reload 時にエラーを報告するようになりました。

    従来は、ファイル中の誤りはクライアントが接続を試みるまでは発見されず、誤ったファイルがロードされて放置されることがありました。

  • pg_hba.conf の構文エラーを、最初の一つだけでなく全て表示するようになりました。
  • ident 認証で、sameuser オプションが廃止されました。

    これまで sameuser オプションを指定した、同じユーザ名で認証するというのが、マップファイルを使わない場合のデフォルトの振る舞いとなります。

  • 全ての認証オプションのオプションが、name1=value1 name2=value2 … という形式に変更されました。
  • ユーザマップ(map パラメータ)が、全ての外部認証方式(LDAP、GSSAPI など)で利用可能になりました。

    従来は、ident 認証のみ対応していました。

  • pg_hba.conf の ssl 接続のオプションに、clientcert パラメータが追加されました。

    以前は、ルート証明書ファイルがサーバのデータディレクトリにあるか無いかで、クライアント認証をするかどうかが判断されていました。

  • pg_hba.conf の認証方法に cert が追加され、ユーザ認証を SSL 認証で行なえるようになりました。証明書の Common Name(cn) 属性がユーザ名になります。

    従来は、クライアント接続の認証であって、ユーザ認証にはなりませんでした。

  • 認証方法 krb5、gssapi、sspi の認証レルムおよび、krb5 のホスト設定について、pg_hba.conf で設定できるようになりました。

    postgresql.conf に記述された設定を上書きします。

  • 認証方法 krb5、gssapi、sspi の include_realm パラメータが追加されました。

    同一ユーザ名が、ユーザマップを使用して、異なるレルムから異なるデータベースユーザとして認証されるのを許容します。

  • Solaris において、UNIX ドメインソケットで ident 認証が使えるようになりました。
アーカイブロギング
  • pg_start_backup() 関数に、なるべく速く実行するというオプションが追加されました。

    これは即座のチェックポイント処理を強制し、I/O を発生させ、同時実行している問い合わせを遅くさせます。

  • pg_stop_backup()関数が、変更された WAL ファイルがアーカイブされるのを待つようになりました。これは pg_stop_backup() が完了した時点でバックアップが有効であることを保証します。
  • ベースバックアップ取得中の smart モードのシャットダウンは、バックアップが終わり、pg_stop_backup() が実行されるのを待ってから終了するようになりました。
  • ベースバックアップ取得中の fast モードのシャットダウンは、ベースバックアップ取得をキャンセルしてから終了するようになりました。
  • recovery.conf の 論理値に、postgresql.conf 同様の文字(on、off、yes、no、true、false、1、0)が
    使えるようになりました。
モニタリング
  • pg_conf_load_time() 関数が追加されました。

    postgresql.conf が最後にいつ読み込まれたかを報告します。

  • pg_terminate_backend()関数が追加されました。

    バックエンドを(SIGTERM シグナルを投げるのと同様に)安全に終了させます。

  • ユーザ定義関数の実行回数、実行時間を設定 track_functions で計測できるようになりました。

    これらの情報は、新たなシステムテーブル pg_stat_user_functions に集計されます。ただし、インライン展開された SQL 関数はカウントされません。

  • pg_stat_activity ビューの SQL 文字列サイズの最大値を、設定 track_activity_query_size で指定できるようになりました。
  • 最大行サイズを増やすことで、syslog ログ出力のパフォーマンスを改善しました。
  • 読み込み専用の、設定 segment_size、wal_block_size、wal_block_size を追加しました。
  • デッドロックが報告されたとき、関係するすべてのすべての接続の問い合わせを、サーバログに出力するようになりました。

    (8.4 サーバログ例)

    ERROR:  deadlock detected
    DETAIL: Process 27121 waits for ShareLock on transaction 809; blocked by process 27119.
            Process 27119 waits for ShareLock on transaction 808; blocked by process 27121.
            Process 27121: SELECT * FROM accounts WHERE aid = 1 FOR UPDATE;
            Process 27119: SELECT * FROM accounts WHERE aid = 2 FOR UPDATE;
  • pg_stat_get_activity(pid) 関数が新しく追加され、プロセス ID で指定したバックエンドの情報をひとまとめに取得できるようになりました。
  • サーバの統計情報ファイルが、pg_stat_tmp ディレクトリに移動しました。ディレクトリ位置を、設定stats_temp_directory で指定することもできます。

    これにより統計情報ファイルを RAM ディスクに配置して I/O 軽減をはかることができます。シャットダウン時には $PGDATA/global/ 下に保存されます。

問い合わせ言語

  • WINDOW 関数がサポートされました。
  • WITH 節がサポートされました。WITH RECURSIVE のサポートを含みます。

    再帰的 な SQL を記述することができます。

  • TABLE 文がサポートされました。

    「TABLE tablename;」は「SELECT * FROM tablename;」と同じ意味です。

    TABLE 文、WITH 節、WINDOW 関数の例 – セールスチームと売上集計
    =# TABLE member;
     id | boss_id |   name
    ----+---------+----------
      1 |         | 山部赤人
      2 |       1 | 在原業平
      3 |       1 | 源実朝
      4 |       1 | 大江千里
      5 |       2 | 小野小町
    (5 rows)
    
    =# TABLE sales;
     id | amount |    date
    ----+--------+------------
      4 |  20000 | 2005-01-30
      4 |  25000 | 2005-02-15
      3 |  40000 | 2005-02-06
      4 |  10000 | 2005-01-20
      1 |  10000 | 2005-02-19
      1 |  25000 | 2005-02-16
        :
    
    =# WITH RECURSIVE t(id, boss_id, name, lv, line) AS (
        SELECT m.id, m.boss_id, m.name, 1, ARRAY[1] FROM member m WHERE m.id = 1
        UNION ALL
        SELECT m.id, m.boss_id,
         (repeat('  '::text, t.lv) || '└'::text) || m.name, t.lv + 1,
         t.line || ARRAY[m.id] FROM member m, t WHERE m.boss_id = t.id
       )
       SELECT t.id, t.boss_id, t.name, t.lv, t.line FROM t ORDER BY t.line
    ;
     id | boss_id |      name      | lv |  line
    ----+---------+----------------+----+---------
      1 |         | 山部赤人       |  1 | {1}
      2 |       1 |   └在原業平   |  2 | {1,2}
      5 |       2 |     └小野小町 |  3 | {1,2,5}
      3 |       1 |   └源実朝     |  2 | {1,3}
      4 |       1 |   └大江千里   |  2 | {1,4}
    (5 rows)
    
    =# WITH v(name, count, amount) AS (
        SELECT m.name, count(*) AS count, sum(s.amount) AS amount FROM sales s
        JOIN member m USING (id) GROUP BY s.id, m.name
       )
       SELECT v.name, v.count, v.amount,
        round(sum(v.amount) OVER w / sum(v.amount) OVER () * 100::numeric, 1)
        AS recio, rank() OVER w AS rank
        FROM v WINDOW w AS (ORDER BY v.amount DESC)
    ;
       name   | count |  amount  | recio | rank
    ----------+-------+----------+-------+------
     山部赤人 |  1122 | 86690000 |  25.7 |    1
     在原業平 |  1034 | 78660000 |  49.0 |    2
     源実朝   |   898 | 68355000 |  69.3 |    3
     大江千里 |   733 | 57275000 |  86.3 |    4
     小野小町 |   588 | 46315000 | 100.0 |    5
    (5 rows)
  • SELECT 文または RETURNING 句において、出力用の列名を指定する際に AS が省略可能となりました。
    AS をつける場合
    postgres=# SELECT 1 + 1 AS result;
     result
    --------
          2
    PostgreSQL 8.3
    =# SELECT 1 + 1 result;
            ERROR:  syntax error at or near "result"
            LINE 1: SELECT 1 + 1 result;
    PostgreSQL 8.4
    =# SELECT 1 + 1 result;
     result
    --------
          2
  • タプルストアを通して結果を返す関数向けであっても、SELECT 結果リストで複数行を返す関数をサポートするようになりました。

    特に、PL/PgSQL やそのほか手続き言語で書かれた関数がそのように呼び出せることを意味します。

  • 8.4の場合
    postgres=# SELECT * FROM t();
     a | b
    ---+---
     1 | 2
     1 | 2
    
    =# SELECT t();
       t
    -------
     (1,2)
     (1,2)
    8.3の場合
    =# SELECT t();
    ERROR:  set-valued function called in context that cannot accept a set
    CONTEXT:  PL/pgSQL function "t" line 1 at RETURN QUERY
  • 集約、グループ化を行なう SQL の中で、複数行を返す関数をサポートしました。
    例 – エラーにならないことを示すだけで、意味はありません
    =# SELECT generate_series(1, count(tid)), max(tid) FROM tellers;
     generate_series | max
    -----------------+-----
                   1 |  10
  • SELECT FOR UPDATE、SELECT FOR SHARE 文が、継承テーブル間で使えるようになりました。

    PostgreSQL 8.3 – 以前は以下のようにエラーになっていました。

    =# BEGIN;
    =# SELECT * FROM child WHERE id = 1 FOR UPDATE;
         :
    
    =# BEGIN;
    =# SELECT * FROM parent WHERE id = 1 FOR UPDATE;
    ERROR:  SELECT FOR UPDATE/SHARE is not supported for inheritance queries
  • SQL/MED 対応のための基盤が追加されました。

    リモートまたは外部の SQL/MED 対応はまだありませんが、dblink や plproxy のようなモジュールのための、標準化され将来保証のある接続情報管理の仕組みが提供されます。

  • 参照しているスキーマ、関数、演算子、演算子クラスが変更されたときに、キャッシュされたプランを無効にします。

    これは稼働中に DDL による変更(関数差し替えなど)を行なう場合に、性能を改善します。

  • 複合型と、無名複合型の配列の比較ができるようになりました。

    row(1,1.1) = any (array[row(7,7.7), row(1,1.0)]) という条件が記述できます。特に再帰的な問い合わせで有用です。

    PostgreSQL 8.3
    =# SELECT array[row(1,2,3),row(4,5)] = array[row(1,2,3),row(4,5)];
    ERROR:  could not find array type for data type record
    PostgreSQL 8.4
    =# SELECT array[row(1,2,3),row(4,5)] = array[row(1,2,3),row(4,5)];
     ?column?
    ----------
     t
  • UNICODE 文字列および識別子の指定で、コードポイントがサポートされました。

    ‘abc’ を U&’¥+000061¥+000062¥+000063′ と表記することができます。

  • パーサにおけるエラー箇所の報告が改善されました。
TRUNCATE 関連
  • 文レベルの ON TRUNCATE トリガーがサポートされました。
  • TRUNCATE TABLE 文に、RESTART/CONTINUE IDENTITY 句が追加されました。

    テーブルのカラムで使われているシーケンスを、初期化するかしないかを指定できます。シーケンスを初期化する値は ALTER SEQUENCE START WITH で指定します。

  • TRUNCATE tab1, tab1 (同じテーブル名を複数指定) が、エラーではなくなりました。
  • GRANT/REVOKE 文で、DELETE 権限とは別に、TRUNCATE 権限が用意されました。
EXPLAIN 関連
  • EXPLAIN VERBOSE 文が、プランノードごとに出力カラムを表示するようになりました。

    従来の EXPLAIN VERBOSE 文は、クエリプランの内部表現を表示するものでした。(従来の振る舞いは、設定 debug_print_plan により得ることができます。)

  • EXPLAIN 文が、サブプランと初期プランを個別のラベルで識別するようになります。
    例 – 上記 WITH RECURSIVE 例の EXPLAIN 出力
                                        QUERY PLAN
    -----------------------------------------------------------------------------------
     Sort  (cost=26.45..26.70 rows=101 width=76)
       Sort Key: t.line
       CTE t
         ->  Recursive Union  (cost=0.00..21.07 rows=101 width=76)
               ->  Subquery Scan "*SELECT* 1"  (cost=0.00..1.16 rows=1 width=40)
                     ->  Seq Scan on member m  (cost=0.00..1.15 rows=1 width=40)
                           Filter: (id = 1)
               ->  Hash Join  (cost=0.33..1.79 rows=10 width=76)
                     Hash Cond: (m.boss_id = t.id)
                     ->  Seq Scan on member m  (cost=0.00..1.12 rows=12 width=40)
                     ->  Hash  (cost=0.20..0.20 rows=10 width=40)
                           ->  WorkTable Scan on t  (cost=0.00..0.20 rows=10 width=40)
       ->  CTE Scan on t  (cost=0.00..2.02 rows=101 width=76)
    (13 rows)
  • EXPLAIN が 設定 debug_print_plan を尊重した動作をするようになりました。

    従来バージョンの VERBOSE 指定時の表示を debug_print_plan = on のときにエラーレベル debug1 で出力します。

  • CREATE TABLE AS 文に対して EXPLAIN を実行できるようになりました。
LIMIT/OFFSET 関連
  • LIMIT/OFFSET の指定に、サブクエリを記述できるようになりました。
  • LIMIT/OFFSET の指定を、SQL 標準の構文 OFFSET 〜 FETCH 〜 ONLY でも記述できるようになりました。
    以下が同義になります
    =# SELECT aid FROM accounts  OFFSET 5;
    =# SELECT aid FROM accounts OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;

DDL 関連

  • カラムレベルの権限がサポートされました。

    GRANT/REVOKE 文に、カラムの指定が追加されています。

  • DROP 文で依存関係の報告が改善されました。
  • 複数対象を指定する DROP 文を改修し、依存関係の衝突でエラーがでないようになりました。
    =# CREATE TABLE a (id int primary key);
    =# CREATE TABLE b (id int REFERENCES a(id));
    PostgreSQL 8.3
    =# DROP TABLE a,b;
    NOTICE:  constraint b_id_fkey on table b depends on table a
    ERROR:  cannot drop table a because other objects depend on it
    HINT:  Use DROP ... CASCADE to drop the dependent objects too.
    PostgreSQL 8.4
    =# DROP TABLE a,b;
    DROP TABLE
  • CREATE TABLE AS 文に WITH [NO] DATA 句が追加されました。SQL 標準に基づきます。
  • ユーザ定義入出力変換キャストがサポートされました。
  • CREATE AGGREGATE 文で internal 状態遷移データ型が使えるようになりました。
  • CREATE TYPE 文に LIKE パラメータが追加されました。

    既存の型を指定することで、いくつかのパラメータについてその型と同じである、という意味になります。

  • ユーザ定義基本型で、型カテゴリ(CATEGORY)および優先(PREFERRED)を指定できるようになりました。

    あいまいな状況での暗黙的キャストの振る舞いを、コントロールできます。

  • CREATE OR REPLACE VIEW 文で、カラムを末尾に追加することが可能になりました。
ALTER文
  • ALTER TYPE RENAME 構文が追加されました。
  • ALTER SEQUENCE 〜 RESTART 構文が追加されました。

    シーケンスを初期値に戻します。

  • ALTER TABLE 構文が修正され、テーブル、インデックス、シーケンス、ビューについて、より簡易な書き方ができるようになりました。

    この変更により、以下の構文が可能になります。

    ALTER SEQUENCE OWNER TO
    ALTER VIEW ALTER COLUMN SET/DROP DEFAULT
    ALTER VIEW OWNER TO
    ALTER VIEW SET SCHEMA

    機能の追加はありません。

  • ALTER TABLE 〜 ALTER COLUMN 〜 SET DATA TYPE 構文をサポートしました。

    SQL 標準に従ったものです。機能としては既にサポートされていたものです。

  • ALTER TABLE SET WITHOUT OTDS がテーブルを書き換えて OID 値を取り除きます。

    ALTER TABLE SET WITH OIDS がテーブルを書き換えて、OID 値を追加します。従来は、再度テーブルに OID を保存する命令はありませんでした。

データベース操作
  • コミットされていない準備されたトランザクション(二相コミット用)がある場合の CREATE/DROP/RENAME DATABASE のエラー報告が、改善されました。
  • LC_COLLATE と LC_CTYPE を、データベースごとに設定できるようになりました。

    従来は、initdb を実行する際にしかロケールを指定できませんでした。

  • データベースエンコーディングとロケール(LC_COLLATE、LC_CTYPE)が合っているかの検査が、改善されました。
  • ALTER DATABASE SET TABLESPACE 文が追加されました。

    データベースを新たなテーブルスキーマに移動します。

その他のコマンド

  • CLUSTER 文に VERBOSE オプションが追加されました。

    clusterdb コマンドでも -v –verbose オプションが追加されています。

  • 保留中のトリガーイベントを記録する際に必要なメモリが減りました。
インデックス
  • hash インデックスの作成速度、アクセス速度が大幅に改善されました。

    場合によっては btree インデックスよりも高速となりえます。しかし、hash インデックスは未だクラッシュセーフではありません。クラッシュ時に再作成が必要になる場合があります。

  • hash インデックスには、インデックス対象の全カラムではなく、ハッシュ値だけが格納されるようになりました。

    これにより、長いインデックス値の hash インデックスについて、サイズが軽減し速度が向上します。

  • GIN インデックスの高速な更新が実装されました。

    インデックス作成時に FASTUPDATE オプションを指定して有効にできます。このオプションは、わずかに検索速度が劣化しますが、更新速度を大きく改善します。

  • xxx_pattern_ops 演算子クラスのインデックスが、LIKE だけでなく、通常の比較でも使えるようになりました。
全文検索インデックス
  • 全文検索における GIN 重み付け検索で、@@@ 演算子を使う必要がなくなりました。

    通常のテキスト検索演算子 @@ を、代わりに使うことができます。

  • テキスト検索演算子 @@ にオプティマイザの選択関数が加わりました。

    tsvector 型のカラム統計情報に、このための情報を書き込むようになります。

  • GIN インデックスに、部分一致がサポートされました。
  • 全文検索で、前方一致検索が可能になりました。
  • マルチカラムの GIN インデックスがサポートされました。
  • ネパール言語とデーヴァナーガリー文字への対応が改善されました。
VACUUM 関連
  • フリースペースマップ管理に、テーブルなど毎のファイルを使うようになりました。

    VACUUM で発見されたすべてのフリースペースが、*_fsmファイルに記録されます。

    設定 max_fsm_pages、max_fsm_relations は廃止されます。これまでは、これらの設定で指定した共有メモリ上の、固定サイズの領域に記録していました。

  • VACUUM の必要のないページを記録するビジビリティマップファイルが、新たに導入されました。

    これにより、テーブルのごく一部だけが VACUUM を必要としているときに、VACUUM がテーブル全体を順スキャンするのを避けます。*_vm というファイル名で記録されます。

    データベースクラスタのファイル群の例 – *_fsm、*_vm があります
    $ ls $PGDATA/base/16666
    112        11477      2328      2611      2658  2696      3600
    113        11479      2600      2612      2659  2699      3600_fsm
    11447      11481      2600_fsm  2612_fsm  2660  2701      3600_vm
    11447_fsm  1247       2600_vm   2612_vm   2661  2702      3601
    :
  • 明らかなトランザクションのスナップショットを追跡します。

    これは VACUUM による空間再利用を改善します。

  • 設定 vacuum_freeze_table_age が追加されました。

    VACUUM の際に、ビジビリティマップを無視してテーブルの全スキャンを行ない、凍結 XID をセットするするかどうかを調整します。

  • autovacuum、および TOAST に関するパラメータを、CREATE TABLE に付与することができるようになりました。

    テーブルごとの Autovacuum の設定は、従来はシステムテーブルに行を追加して行なう必要がありました。

  • vacuumdb コマンドに –freeze オプションが追加されました。

データ型

  • テキストサーチの同義語辞書に、CaseSensitive オプションが追加されました。

    大文字小文字を区別することができます。

  • numeric 型の除算の精度が改善されました。
  • int2 型(smallint型)と int8 型(bigint型)との間の基本的な算術演算子が、追加されました。

    これまでは(おそらくint8 型への)明示的なキャストが必要でした。

  • UUID 型の入力として、任意の 4 桁ごとの位置にハイフンを追加したものを受け付けるようになりました。
    PostgreSQL 8.3
    =# SELECT 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11'::UUID;
    ERROR:  invalid input syntax for uuid: "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11"
    PostgreSQL 8.4
    =# SELECT 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11'::UUID;
                     uuid
    --------------------------------------
     a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
    (1 row)
  • boolean 型の入力として ‘on’ ‘off’ を受け付けるようになりました。
  • ‘NaN’ 前後のスペースを、numeric 型の入力として受け付けるようになりました。

    double precision型などでは、もともと受け付けていました。

    PostgreSQL 8.3
    =# SELECT ' NaN  '::numeric;
    ERROR:  invalid input syntax for type numeric: " NaN "
    PostgreSQL 8.4
    =# SELECT ' NaN  '::numeric;
     numeric
    ---------
         NaN
    (1 row)
時刻のデータ型
  • date 型や timestamp 型で、BC 0 年、西暦 0 年を、受け付けないようになりました。

    ‘000’ や ‘0000’ を年部分に指定するとエラーとなります。
    なお、’0′ と ’00’ は、2000 年であるとして処理されます。

    PostgreSQL 8.3
    =# SELECT '01/02/0000'::date;
         date
    ---------------
     0001-01-02 BC
    (1 row)
    PostgreSQL 8.4
    =# SELECT '01/02/0000'::date;
    ERROR:  date/time field value out of range: "01/02/0000"
  • SGT(シンガポール時間)が、有効なタイムゾーン略語として追加されました。
  • date 型の値として ‘infinity’ がサポートされました。

    以前は、timestamp 型にはあっても、date 型にはありませんでした。

  • interval 型の秒の精度を SQL標準に準拠して指定できるようになりました。

    以前は interval(p) として精度を指定していましたが、この文法はまだ残ります。テーブル定義などの出力時にも新しい書式が使われます。

  • interval 型で、ISO8601 による表現をサポートしました。
    =# SELECT interval 'P1Y2M3DT4H5M6.7S';
                interval
    ---------------------------------
     1 year 2 mons 3 days 04:05:06.7
    (1 row)
  • 設定 IntervalStyle が追加されました。

    interval 型の出力様式を指定します。曖昧な入力に対する振る舞いにも影響します。

  • interval 型の出力における秒の丸め処理が、より正確になりました。
Arrays
  • ARRAY[1,2,3]::interger[] のような、ARRAY 生成構文に対するキャストの扱いが改善されました。

    これまで、は空の配列に適用できませんでした。

    PostgreSQL 8.4
    =# SELECT ARRAY[]::integer[];
     array
    -------
     {}
  • ARRAY 生成構文でも、配列の次元を指定しないで記述できるようになりました。
    PostgreSQL 8.4
    =# CREATE TABLE t1 (a1 int ARRAY);
    CREATE TABLE
  • array_ndims() 関数が追加されました。

    配列の次元を返します。

  • array_length() 関数が追加されました。

    指定した次元での配列の長さを返します。

  • array_agg() 集約関数が追加されました。

    各値を 1 つの配列に集約します。

    =# SELECT id FROM t1;
     id
    ----
      1
      2
      3
    (3 rows)
    
    =# SELECT array_agg(id) FROM t1;
     array_agg
    -----------
     {1,2,3}
    (1 row)
  • unneset() 関数が追加されました。
    =# SELECT unnest(ARRAY[1,2,3]);
     unnest
    --------
          1
          2
          3
    (3 rows)
  • array_fill() 関数が追加されました。

    値を指定して配列を生成します。

    =# SELECT array_fill('x'::text, ARRAY[3,3]);
            array_fill
    ---------------------------
     {{x,x,x},{x,x,x},{x,x,x}}
    (1 row)
  • generate_subscripts() 関数が追加されました。

    配列の指定した次元の添え字の並びを、複数行で返します。次元は 1 から数えます。

    =# SELECT generate_subscripts('{{9,9,9},{9,9,9}}'::int[], 2);
     generate_subscripts
    ---------------------
                       1
                       2
                       3
TOAST
  • TOAST 圧縮にて、値が 32 バイト以下で短いとみなすようになりました

    従来は 256 バイト以下でした。

  • TOAST 圧縮をする際に、25 % のスペース節約を必要とするようになりました。

    従来は 20 % でした。

  • 大小の TOAST 格納可能なフィールドをもつ行に対するヒューリスティックが改善されました。

    大きいデータを押し出す一方、小さいデータを不要に圧縮しないようになります。

関数

  • setseed() 関数が、(0 から 1.0 でなく)-1.0 から 1.0 までの値を指定できることを、ドキュメント記載しました。
  • 以下の関数が追加されました。
    関数名 機能
    lo_import(filename, oid) (サーバ側関数)
    quote_nullable() quote_literal() 関数と似た振る舞いをしますが、NULL に文字列 ‘NULL’ を返します。
    suppress_redundant_updates_trigger() UPDATE のトリガーとして設定することで、データを変更しない UPDATE 処理を回避します。
    div(numeric, numeric) 値丸めなしで numeric 型同士の除算ができます。
  • 以下の関数が変更・改善されました。
    関数名 変更点
    heardline() (全文検索)複数の断片を生成できるようになりました。
    generate_series() timestamp 型、timestamptz 型を引数とできるものが追加されました。

    =# SELECT generate_series('2009-01-01'::timestamp,
       '2009-12-31'::timestamp, '7 day'::interval);
       generate_series
    ---------------------
     2009-01-01 00:00:00
     2009-01-08 00:00:00
     2009-01-15 00:00:00
     2009-01-22 00:00:00
             :
オブジェクト情報関数
  • 以下の関数が追加されました。
    関数名 機能
    current_query() 関数の中から使い、現在の SQL を取得するために使います。
    pg_get_keywords() 定義済みパーサキーワードの一覧が返ります。
    pg_get_functiondef() 関数の定義内容が返ります。

    =# SELECT pg_get_functiondef('f1'::regproc);
                  pg_get_functiondef
    -------------------------------------------------
     CREATE OR REPLACE FUNCTION public.f1(integer)
      RETURNS integer
      LANGUAGE sql
     AS $function$ SELECT 1; $function$
    pg_typeof() 値のデータ型を返します。
    has_column_privilege()
    has_any_column_privilege()
  • 以下の関数・ビューが変更されました。
    関数名 変更点
    pg_relation_size() フリースペースマップファイル(〜.fsm)のサイズも取得できるようになりました。
    pg_relation_size() regclass を使うように変更されました。
    name 型を引数とするバリエーションは、使えなくなります。

    例 – ‘t’::name と明示しない限り、暗黙キャストでエラーとはなりません
    =# SELECT pg_relation_size('t');
     pg_relation_size
    ------------------
                 8192
    pg_settings boot_val と reset_val カラムが出力に追加されました。
    それぞれ、起動時の設定値、pg_ctl reset をした後の設定値です。
    version() サーバが 32bit か 64bit なのかを返すようになりました。
    pg_*_is_visible()
    has_*_privilege()
    不正な OID に対し、エラーを出すのではなく、NULL を返すようになりました。
  • インフォメーションスキーマの振る舞いが修正され、is_insertable_into と is_updatable カラムが一貫性をもつようになりました。
  • 組込みで複数行を返す関数を、OUT パラメータを使うようになりました。

    以下の関数をカラムリストを指定しなくとも呼び出せるようになります。

    pg_show_all_settings(), pg_lock_status(), pg_prepared_xact(),
    pg_prepared_statement(), pg_cursor()

関数作成
  • 可変引数関数がサポートされました。

    配列として一つの型を任意個数受け取ります。一番最後の引数として置くことができます。

    =# CREATE FUNCTION printf_like (text, VARIADIC int[])
      RETURNS text LANGUAGE plpgsql AS $$
      〜 プログラム本体 〜$$;
  • 関数の引数に、デフォルト値を設定できるようになりました。
  • CREATE FUNCTION 〜 RETURNS TABLE 構文が追加されました。
  • SQL 関数で、返し値に INSERT 文、UPDATE 文、DELETE 文の RETURNING 節を使えるようになりました。
PL/pgSQL
  • EXECUTE USING 句に対応しました。
    例 – $1、$2 に checked_user、checked_date が入る
    EXECUTE 'SELECT count(*) FROM tbl WHERE inserted_by = $1 AND inserted <= $2'
     INTO tbl_count USING checked_user, checked_date;
  • FOR ループで、カーソルによるループが使用できるようになりました。
  • RETURN QUERY EXECUTE 構文がサポートされました。
  • RAISE 文が改善されました。

    DETAIL 欄、HINT 欄、SQLSTATE エラーコード、状態名をサポートしました。RAISE 文を例外ブロック内でパラメータ無しで実行すると、現在のエラーを再度投げることができます。

  • EXCEPTION リストで、例外を SQLSTATE 数値コードで指定できるようになりました。

    以前は状態名のみに対応していました。

  • CASE 文に対応しました。
  • RETURN QUERY 文で、実行結果ステータスの取得(FOUND と GET DIAGNOSTICS)をサポートしました。
  • 例外ブロックの深さを変えて同じ関数が呼ばれるとき、メモリリークを回避するようになりました。

コマンドアプリケーション

  • pg_ctl restart が、コマンドライン引数を保存するように改修されました。

    この修正は、以前のバージョンにもバックポートされています。

  • -W、–password オプションを持つすべてのユーティリティに -w、–no-password オプションが追加されました。

    このオプションによって、パスワードプロンプトを出すのを抑制することができます。

  • create*、drop* コマンド群から、-q オプション(quiet)を取り除きました。

    PostgreSQL 8.3 から、このオプションは何の影響のないものとなっていました。

psql
  • 起動時のバナーがなくなりました。
  • help コマンドで、h?q などの案内が表示されるようになりました。
    $ psql
    psql (8.4beta1)
    Type "help" for help.
    
    postgres=# help
    You are using psql, the command-line interface to PostgreSQL.
    Type:  copyright for distribution terms
           h for help with SQL commands
           ? for help with psql commands
           g or terminate with semicolon to execute query
           q to quit
    postgres=#
  • pset format wrapped モードが追加されました。

    画面幅に合わせて折り返し表示されるようになります。ファイルやパイプに出力するときには pset column で出力幅を指定できます。

  • 幅の大きい出力に対してもページャを使うようになりました。

    これまでは行数の大きい出力だけでした。

  • バックスラッシュコマンドと最初の引数の間にスペースを必要とするようになりました。

    !ls」などが動作しなくなります。

  • アクセス権限の表示が、複数行になりました。
    =# z t1
     Schema | Name | Type  |     Access privileges     | Column access privileges
    --------+------+-------+---------------------------+--------------------------
     public | t1   | table | postgres=arwdDxt/postgres | id:
                           : foo=r/postgres            :   bar=w/postgres
                                                       : arr:
                                                       :   foo=w/postgres
  • タブ補完機能が改良されました。

    スキーマ名付きのオブジェクトや、クォートされた識別子をサポートします。

  • pset における指定に、boolean型の通常の各種表現が使えるようになりました。

    on、off だけでなく、true、false、1、0 なども使えるようになります。

  • iming で on/off を、引数に指定することができるようになりました。
  • l で、データベースのアクセス権限を表示するようになりました。
  • l+ で、データベースのサイズを(アクセス権限があれば)表示するようになりました。
  • ef コマンドが追加されました。

    エディタが起動され、関数定義を編集できるようになりました。
    引数無しで起動すると、新しい関数の雛形でエディタが起動されます。

psql (特に d コマンド)
  • d で、テーブルが外部キー制約で参照されている場合は、それが表示されるようになりました。
  • d で、シーケンスカラムの値が表示されるようになりました。
  • d+ の表示に、ストレージタイプや、その他オプションのカラムが追加されました。
  • d+ でテーブルサイズも表示されるようになりました。
  • パターン引数を持たない d* コマンド全般が、S 修飾を指定したときにだけ、システムオブジェクトを表示するようになりました。

    これまでは一貫性の無い振る舞いで、ユーザーオブジェクトだけを見る簡単な方法がありませんでした。

  • ddt が、システムテーブルの表示について一貫性をもつようになりました。

    従来は d pg_class が表示され、dt pg_class が表示されませんでした。

  • dT+ で列挙値が表示されるようになりました。
    =# CREATE TYPE e1 AS ENUM ('A','B','C');
    CREATE TYPE
    =# dT+ e1
                          List of data types
     Schema | Name | Internal name | Size | Elements | Description
    --------+------+---------------+------+----------+-------------
     public | e1   | e1            | 4    | A        |
                                          : B
                                          : C
  • dC で、ワイルドカードパターンが使えるようになりました
  • d* コマンド全般が、PostgreSQL 7.4 までの過去バージョンで使えるようになりました。

    (必ずしも完全ではありません。)

  • df が、cstring の引数または返し値を取る関数を、隠さないようになりました。

    従来は、これらの関数はデータ型のI/O関数であるとして、隠していました。

pg_dump
  • pg_dump、pg_dumpall、pg_restoreコマンドに、--no-tablespaces オプションが追加されました。

    テーブルスペースを無視して処理を行ないます。これを利用したバックアップデータは、リストア時に、あらかじめ同じテーブルスペース配置を用意する必要がありません。

  • pg_dump、pg_dumpall から、-d および -D オプションが除かれました。

    他のクライアントアプリケーションで、データベース名を指定するのにこれらの文字をオプションに使うため、しばしば混乱のもととなっていました。機能自体は削除されません。--inserts、--column-inserts オプションを代わりに指定します。

  • pg_dump、pg_dumpall から、-i および --ignore-version オプションが除かれました。

    これらオプションを指定してもエラーを出力しなくなるだけで、動作に影響はありませんでした。

  • ダンプ、リストアを行なう際に、設定 statement_timeout が無効になるようになりました。
  • pg_dump、pg_dumpall に --lock-wait-timeout オプションが追加されました。

    指定時間内に共有ロックを取得できない場合に処理を失敗させることができます。

  • pg_dump --data-only の出力について、外部キー制約で参照されているテーブルを、参照しているテーブルより先になるように、並び替えをするようになりました。

    これにより、外部キーがある状態でもデータロードができます。ただし、循環参照には対応できません。その場合、NOTICE メッセージが発行されます。

  • pg_dump、pg_dumpall、pg_restore で接続ユーザ指定(-U)とは別に、ロールを指定して実行できるようになりました。
  • pg_restore でカスタムフォーマットのバックアップを、複数同時接続でリストアできるようになりました。

    オプション --jobs で同時実行数を設定します。

開発ツール

libpq
  • ラージオブジェクトをインポートするときに、lo_import_with_oid()関数で OID を指定できるようになりました。
  • イベントがサポートされました。

    PGconnオブジェクト(接続)、PGresultオブジェクト(結果)の生成、破棄に対して、コールバックを登録することができます。

  • エラー処理が改善されました。

    複数のエラーメッセージを、複数行にして報告できます。

  • PQexecParams() 関数が、空の問い合わせに対して PGRES_EMPTY_QUERY を返すようになりました。

    従来は、PGRES_COMMAND_OK を返していました。

  • Windows の WSACleanup() API のオーバーヘッドを避ける方法が、ドキュメントに記載されました。
libpq SSL
  • SSL 接続で証明書の認証が修正されました。

    libpq は SSL接続をする際にデフォルトで、証明書とサーバ名の両方で認証を行なうようになります。認証にあたり、ルート証明書が有効でない場合には、SSL 接続は失敗します。必要に応じて、接続文字列の設定 sslverify で、サーバと証明書の認証を無効にできます。

  • クライアント証明書の場所を、接続文字列の設定によって指定できるようになりました。
  • 接続文字列の設定 sslverify でサーバ証明書の認証について設定できるようになりました。

    デフォルトでは完全な認証を求めます。

  • PQinitOpenSSL 関数が追加されました。

    OpenSSL/libcrypt 初期化でより高度な指定ができるようになります。

  • libpq の接続が終了したときに、OpenSSL のコールバック関数を、適切に登録解除するようになりました。

    これはアプリケーションが libpqライブラリ をアンロードする際に必要で、そうでないと不正なコールバック関数が残ってしまいます。

ecpg
  • メッセージのローカライズのサポートが追加されました。
  • ecpg パーサが、サーバ側パーサから自動的に生成されるようになりました。

    これまでは、別個の ecpg パーサとして保守されていました。

SPI(サーバプログラミングインターフェイス)
  • ライン外パラメータによる single-use プランのサポートが追加されました。
  • SPI_execute() 関数に、SPI_OK_REWRITTEN 返しコードが追加されました。
  • 不要なインクルードが executor/spi.h から除かれました。

ビルドオプション

  • Autoconf 2.61 が使われるようになりました。
  • GNU bison がビルドに必要となりました。

    他のパーサツールはサポートされなくなります。

  • pg_config に --htmldir オプションが追加されました。
  • サーバ内部で、float4 型を値で渡すようになりました。

    ビルドオプション --disable-float4-byval を指定すると、従来の振る舞いになります。

  • サーバ内容で float8 型、int8 型を可能であれば値で渡すようになりました。

    ビルドオプション --disable-float8-byval を指定すると、従来の振る舞いになります。

  • ビルドオプション --with-segsize、--with-blocksize、--with-wal-blocksize、
    --with-wal-segsize が追加されました。

    それぞれ、リレーションファイルの上限サイズ(1GB)、ブロックサイズ(8kB)、WALのブロックサイズ(8kB)、WALファイルサイズ(16MB)を指定します。

  • Solaris 2.5 で、スレッド対応のビルドができるようになりました。
  • Solaris で、システム付属の getopt_long() 関数を使うようになりました。

    オプション指定の挙動が Solarisユーザの期待に沿ったものになります。

  • Linux 上において、Sun Studio コンパイラに対応しました。
  • メジャーバージョン番号が gettext ドメインと、ライブラリの soname メジャーバージョン番号に追加されました。

    複数バージョンインストールが容易になります。

  • コードカバレッジテストツール gcov に対応しました。
  • Mingw と Cygwin で、ツリー外ビルドができるようになりました。
  • Mingw をクロスコンパイルのソースプラットフォームとして使う場合について、修正されました。

ソースコード

  • 64 bit タイムゾーンデータファイルがサポートされました。

    これにより 2038 年以降も夏時間の計算ができます。

  • プラットフォームの time_t データ型を使わないようになりました。

    64 bit の pg_time_t 型を定義して使います。

  • クロスコンパイル時の、タイムゾーンデータベースのバグが修正されました。
  • バックエンドオブジェクトファイルのリンクを、一度に行なうようになりました。
  • gettext サポートが改善され、複数形の適切な翻訳ができます。
  • 手続き言語むけに、メッセージ翻訳がサポートされました。
  • DTrace 試験が追加されました。
  • Mac OS X Leopard で、DTrace がサポートされました。
  • 新たな cstring から text への変換関数が追加されました。
  • relistemp カラムが、pg_classシステムテーブルに追加されました。

    一時テーブルを容易に識別できます。

  • 共有キャッシュ無効化のロジックが改良されました。
  • name 型が char-aligned になりました。
  • エグゼキュータに、プラグインを追加できるフックが追加されました。
  • プランナ統計参照の振る舞いを上書きできるフックが追加されました。
  • カスタム共有メモリ要求用に、shmem_startup_hook() 関数が追加されました。
  • pg_class システムテーブルの reltrigger カラムが、boolean型の relhastriggersカラムに置き換えられました。
  • SQL コマンドマニュアルが、man1 から man7 に移動されました。
  • プラットフォーム FAQ がメインドキュメントの中に移動されました。
  • ビルド時に、競合があるパーサ入力ファイルを拒絶するようになりました。
  • KOI8U (ウクライナ) エンコーディング対応が追加されました。
  • 日本語メッセージが追加されました。

    従来は、別プロジェクトで保守されていました。

  • MSVC ビルドで、LC_MESSAGES 設定 の誤りが修正されました。

Contribツール

  • 以下の contrib ツールが変更・改善されました。
    contrib ツール名 変更点
    pgbench

    ・クエリーモードオプション(-M)が追加されました。
    拡張プロトコルを使う、拡張プロトコルを prepared statements と共に使う、という設定を与えることができます。

    ・実行時間指定オプション(-T)が追加されました。
    トランザクション数ではなく、何秒間実行して計測する、という指定ができます。

    pgstattuple 20 億ページ以上のテーブル、インデックスに対応しました。
    fuzzystrmatch 文字列のレーベンシュタイン距離の関数が、ユーザが挿入、削除、更新のコストを指定できるようになりました。
    dblink dblink_current_query() 関数が削除されました。current_query() 関数を代わりに使用します。
    ltree マルチバイトエンコーディングをサポートするようになりました。
    dblink ユーザから指定されるパスワードを確実に使うようになりました。サーバの .pgpass ファイルを偶然に使ってしまわないようにする、セキュリティ強化です。
    pageinstpect fsm_page_contents() 関数が追加されました。get_raw_page() 関数がフリースペースマップファイルをサポートするようになりました。また、contrib/pg_freespacemap も改定されています。
    intarray 演算子「<@」「@>」の定義が廃止されました。ビルトイン演算子との混乱を避けるためで、必要であれば実装コードは「@」「~」という名前でまだ残されています。
  • 以下の contrib ツールが追加されました。
    contrib ツール名 機能
    citext 大文字小文字を区別しない、マルチバイトをサポートした、テキストデータ型です。
    btree_gin より多くのデータ型をサポートする GIN インデックスです。
    pg_trgm マルチバイト文字をサポートするようになりました。
    intagg array_agg()関数、unnest()関数が追加されました。
    auto_explain 指定した時間を超える SQL に、自動で EXPLAIN ANALYZE を取ることができます。
    pgstat_statements SQL 実行統計を取ることができます。