PostgreSQL 9.4 に関する技術情報

このページでは PostgreSQL 9.4 (2014年12月18日リリース)に関する技術情報をお届けします。

本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。


バージョン 9.4 への移行/互換性のない変更点

  • 多次元配列の入力チェックが厳格になりました。(Bruce Momjian) (9.4)
  • これまでは以下のようなデータが受け入れられていましたが、9.4 からは、
    要素数が揃っていないとエラー( ERROR: malformed array literal )となります。

    db=# SELECT '{{1}, {2,3}}'::int[];
           int4
    ------------------
     {{1,NULL},{2,3}}
    (1 row)
    

    9.3 以前から、以下のように要素数の多い副配列が先にあらわれるとエラーになっていましたので、
    9.4 で一貫性のある振る舞いになったといえます。

    =# SELECT '{{1,2,3}, {2,3}}'::int[];
    ERROR:  multidimensional arrays must have array expressions with matching dimensions
    
  • JSON 文字列のユニコードエスケープにおいて、バックスラッシュではエスケープされないようになりました。(Andrew Dunstan) (9.4)
  • これまでは JSON へ整形する文字列中の全てのバックスラッシュは、エスケープされていました。9.4 から、u と 16進数4桁 が後に続くバックスラッシュはエスケープされません。

    (元の文字列)
    db1=# INSERT INTO t1 VALUES (1, '\u00aa and \ ');
    db1=# SELECT * FROM t1;
     id |       v
    ----+---------------
      1 | \u00aa and \
    (1 row)
    
    (9.4 で JSON に変換)
    db1=# SELECT row_to_json(t1.*) FROM t1;
              row_to_json
    -------------------------------
     {"id":1,"v":"\u00aa and \\ "}
    (1 row)
    
    (9.3 で JSON に変換)
    =# SELECT row_to_json(t1.*) FROM t1;
              row_to_json
    --------------------------------
     {"id":1,"v":"\\u00aa and \\ "}
    (1 row)
    
  • date型、timestamp型、timestamptz型の値から JSON への変換のとき、ISO 8601 にしたがった形式の値にするようになりました。(Andrew Dunstan) (9.4)
  • これまでは DateStyle 設定に基づく PostgreSQL の表現形式にて変換していました。必要であれば、JSON変換関数に渡す前に日付時刻値を text 型に明示的にキャストすることで以前の振る舞いを実現できます。

    (9.4 で JSON に変換)
    db1=# SELECT to_json(now());
                  to_json
    ------------------------------------
     "2014-12-19T20:56:34.995251+09:00"
    (1 row)
    
    (9.3 で JSON に変換)
    db1=# SELECT to_json(now());
                 to_json
    ---------------------------------
     "2014-12-19 20:56:40.868847+09"
    (1 row)
    
  • json #> text[ ] 演算子で、右辺に空配列を与えた場合に、NULL ではなく、左辺値全体が返るようになりました。(Tom Lane) (9.4)
  • 抽出の適用を全くしないという意味で一貫性のある振る舞いとなります。

    (通常の使われ方)
    db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{A,X}'::text[];
     ?column?
    ----------
     100
    (1 row)
    
    (9.4 で空配列を与えると左辺値全体が返る)
    db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{}'::text[];
                ?column?
    ---------------------------------
     {"A":{"X":100,"Y":200},"B":"b"}
    (1 row)
    
    
    (9.3 で空配列を与えると NULL が返る)
    db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{}'::text[];
     ?column?
    ----------
    
    (1 row)
    
  • JSON 要素の抽出をする演算子で、例外的ないくつかのケースについて、エラーを出すのでなく NULL を返すようになりました。(Tom Lane) (9.4)
  • 一貫性がある振る舞いであるほか、左辺が妥当な JSONデータである限り、決してエラーにならないことで式インデックスを安全に作れるようになります。

    (9.3 での実行例。9.4 では NULL が返り、エラーにはならない)
    
    db1=# SELECT '["a", "b"]'::json -> 'a';
    ERROR:  cannot extract field from a non-object
    
  • FXモードでなくとも、to_timestamp() と to_date() の書式指定文字列の連続空白が、入力文字列に対応して使われるようになりました。(Jeevan Chalke) (9.4)
  • これまでは FXモード以外では書式中の連続空白は、単一の空白と同様に振る舞っていました。

    (9.3 の場合、書式に 'DD Mon YYYY' が指定されたのと同じ扱い)
    db1=# SELECT to_timestamp('05  Dec 2014', 'DD  Mon YYYY');
    ERROR:  invalid value "Ec " for "Mon"
    
    (9.4 の場合)
    db1=# SELECT to_timestamp('05  Dec 2014', 'DD  Mon YYYY');
          to_timestamp
    ------------------------
     2014-12-05 00:00:00+09
    (1 row)
    
  • ts_rank_cd() が位置と重みの情報を除去された語彙素を無視するように修正されました。(Alex Hill) (9.4)
  • これまでは、位置と重みの情報を除去された語彙素がデフォルト位置にあるかのように扱われていて、有用性が疑わしいランク値を生成していました。

    バージョンアップにより、同じ条件でも ts_rank_cd() が返すランク値が変る可能性があります。

  • 引数に VARIADIC "any" と宣言された関数について、VARIADIC 指定された実際のパラメータは決定可能な配列型でなければならなくなりました。(Pavel Stehule) (9.4)
  • 引数に修飾のない文字列リテラルや NULL を指定できなくなりました。適切な配列データ型にキャストすることが必要となります。なお、VARIADIC でない引数については従来から変更ありません。

    また、9.3 以前でも 9.4 でも引数に "any" が使えるのは C言語関数のみとなります。

  • 関数で行全体値の期待されるカラム名が確実に表示されるようになりました。(Tom Lane) (9.4)
  • row_to_json(tab.*) などで出力されるカラム名に呼び出し時点のカラム別名が使われるようになります。これまで、SQLで与えられた別名でなくテーブルの本当のカラム名が使われてしまうことがしばしばありました。

  • DISCARD コマンドがシーケンス関連の状態も破棄するようになりました。(Fabrízio de Royes Mello, Robert Haas) (9.4)
  • DISCARD ALL または DISCARD SEQUENCE コマンドを実行すると、保持している curval()、lastval() で返すための値が破棄されます。

  • EXPLAIN ANALYZE コマンドの出力で「total runtime」という項目名が、「Execution time」に名称変更されました。(Tom Lane) (9.4)
  • 他に「Planning time」も出力するため、プラン時間を含まないにも関わらず「total runtime」とするのは混乱を招きそうであるため、変更されました。

  • SHOW TIME ZONE コマンドが POSIX タイムゾーンフォーマットでUTC からの差分時間を出力するようになりました。(Tom Lane) (9.4)
  • これまでは interval型の形式で出力していました。なお、差分時間でなく 'Japan' など、時間帯名で指定されていた場合には、従来通り、そのまま時間帯名が出力されます。

    また、本変更は SHOW TimeZone 、SET TimeZone という書き方をした場合も同様に適用されています。

    db1=# SET TIME ZONE '+9';
    
    (9.3 の場合)
    db1=# SHOW TIME ZONE;
     TimeZone
    ----------
     09:00:00
    (1 row)
    
    (9.4 の場合)
    db1=# SHOW TIME ZONE;
     TimeZone
    ----------
     <+09>-09
    (1 row)
    
  • 外部テーブルでトリガーがサポートされたことで、更新できる外部データラッパーは AFTER 行トリガーがある可能性を考慮する必要があります。(Noah Misch) (9.4)
  • AFTER 行トリガーがある場合、トリガが読むかもしれないので、更新動作でテーブルの全カラムを返さなければいけません。これまで外部テーブルはトリガーを持てませんでしたので、外部テーブルラッパーで RETURNING 節を考慮しない最適化をしているかもしれません。

  • チェック制約が tableoid 以外のシステムカラムを参照できないようになりました。(Amit Kapila) (9.4)
  • これまで許されていましたが、リストア時にエラーをひき起こしていました。

  • recovery.conf で指定が複数あった場合に、最後に指定されたリカバリターゲット設定を使うようになりました。(Heikki Linnakangas) (9.4)
  • recovery_target や recovery_target_xxx という設定項目が該当します。これまでは優先順位が文書化されていませんでした。

  • Windows で、ユーザが記述した OS上で実行するコマンドの文字列中のダブルクオートを機械的に維持するようになりました。(Heikki Linnakangas) (9.4)
  • archive_command、restore_command、COPY TO/FROM PROGRAM、あるいは pgbench の \shell に与えるコマンド文字列が本変更の対象となります。ダブルクオートを維持するために "" と記述していた
    部分が " で済むことになり、コマンド文字列を修正する必要があります。

  • システムテーブル pg_class の カラム reltoastidxid が削除されました。(Michael Paquier) (9.4)
  • システムテーブル pg_rewrite のカラム ev_attr が削除されました。(Kevin Grittner) (9.4)
  • カラム単位のルールは PostgreSQL 7.3 以来サポートされておらず、不要な項目でした。

  • Kerberos認証のネイティブサポートが廃止されました。(Magnus Hagander) (9.4)
  • ビルド時に --with-krb5 を指定し、pg_hba.conf の認証メソッドに krb5 を指定する方式が廃止となります。本方式は PostgreSQL 8.3 以来、非推奨である旨が告知されていました。代替に GSSAPI認証を使う設定をして Kerberos認証を使うことができます。

  • PL/Python 手続き言語で配列の DOMAIN を配列型として扱うようになりました。(Rodolfo Campero) (9.4)
  • 従来は文字列として扱われていました。

  • libpq の PQconnectdbParams() 、PQpingParams() にてパラメータ値に "" (空文字列) をデフォルト値を使うという意味で受け入れるようになりました。(Adrian Vondendriesch) (9.4)
  • 従来は、一部のパラメータに限って、空文字列がデフォルトを使うという意味に解釈されていました。

  • intarrayモジュールから空配列が返るときゼロ次元配列が返るように変更されました。(Bruce Momjian) (9.4)
  • 従来は空配列は長さゼロの 1次元配列が返っていました。テキスト表現ではいずれも「{}」であって違いありませんが、配列操作に対する振る舞いが異なります。

    本変更は組み込みの配列演算子と振る舞いを揃えるものです。

    db1=# SELECT '{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[];
     ?column?
    ----------
     {}
    (1 row)
    
    (9.3 の場合)
    db1=# SELECT array_dims('{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[]);
     array_dims
    ------------
     [1:0]
    (1 row)
    
    (9.4 の場合)
    db1=# SELECT array_dims('{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[]);
     array_dims
    ------------
    
    (1 row)
    
  • pg_upgrade が -U と --username オプションでユーザ名指定をするようになりました。(Bruce Momjian) (9.4)
  • 従来は -u と --user でしたが、他のツールとの一貫性に欠けていました。

バージョン 9.4 の変更点

サーバの変更

  • バックグラウンドワーカプロセスを動的に登録、開始、終了できるようになりました。(Robert Haas) (9.4)
  • worker_spi 拡張モジュールで本仕様の使用方法が例示されています。

  • 共有メモリセグメントを動的に割り当てできるようになりました。(Robert Haas, Amit Kapila) (9.4)
  • test_shm_mq 拡張モジュールで本仕様の使用方法が例示されています。

  • クラッシュリカバリ、あるいは immediate シャットダウンの際に、即座に停止しない子プロセスに KILL シグナル送るようになりました。(MauMau, Álvaro Herrera) (9.4)
  • これにより、シャットダウン後に子プロセスが残ってしまう可能性を減らし、また、いくつかの子プロセスが止まってしまった場合でもクラッシュリカバリを確実に進められるようにします

  • データベースのシステム識別子のランダム性が改善されました。(Tom Lane) (9.4)
  • システム識別子はストリーミングレプリケーションプロトコルにて使われます。

  • VACUUM が、削除済(dead)状態だがまだ除去できない行について統計情報収集プロセスに適切に報告するようになりました。(Hari Babu) (9.4)
  • これまでは有効(live)行であるものと報告されていました。

インデックスの変更
  • GINインデックスの物理サイズが減少しました。(Alexander Korotkov, Heikki Linnakangas) (9.4)
  • pg_upgrade を使ってアップグレードした場合、動作しますが、従来のサイズの大きい GIN 形式のままです。REINDEX で新たな形式でインデックスを作り直す必要があります。

  • 複合キーでの GINインデックス照会の速度が改善されました。(Alexander Korotkov, Heikki Linnakangas) (9.4)
  • GiST インデックスが inet型、cidr型に対応しました。(Emre Hasegeli) (9.4)
  • これらのインデックスは、サブネット・スーパーネットの照会や並べ替えのための比較を性能向上させます。

  • B-tree インデックスのページ削除における稀な競合状態が修正されました。(Heikki Linnakangas) (9.4)
  • 割り込みされた B-tree インデックスのページ分割処理の扱いがより頑健になりました。(Heikki Linnakangas) (9.4)
一般的なパフォーマンス
  • 複数のバックエンドプロセスから WALバッファに同時並列に書き込みできるようになりました。(Heikki Linnakangas) (9.4)
  • 本変更は並列書き込み性能を改善します。

  • 条件によっては WAL に更新行のうち変更された部分だけを書き込むようになりました。(Amit Kapila) (9.4)
  • 結果として WAL出力量が圧縮されます。

  • WINDOW関数として使われる集約関数の性能が改善されました。(David Rowley, Florian Pflug, Tom Lane) (9.4)
  • numeric型を状態値に使う集約処理の性能が改善されました。(Hadi Moshayedi) (9.4)
  • テーブルが CLUSTER または VACUUM FULL コマンドで書き直されたときにタプルを凍結しようとするようになりました。(Robert Haas, Andres Freund) (9.4)
  • これにより、後でタプルをフリーズするのを避けることができます。

  • デフォルトがシーケンスの nextval() であるカラムに対する COPY の速度が改善されました。(Simon Riggs) (9.4)
  • 一つの接続で多数のシーケンスにアクセスする場合の性能が改善されました。(David Rowley) (9.4)
  • メモリ上でソートやインデックス構築をする際のタプル数の固定上限が拡大されました。(Noah Misch) (9.4)
  • PL/pgSQL 手続き言語の DO ブロックによるメモリ割り当てが小さくなりました。(Tom Lane) (9.4)
  • プランナが AND/OR 節が混在する中から、より積極的に制約節を抽出するようになりました。(Tom Lane) (9.4)
  • プランナが、揮発性の WHERE節を DISTINCT サブクエリにプッシュダウンしないようになりました。(Tom Lane) (9.4)
  • WHERE 節のプッシュダウンは概してプラン改善に効果的ですが、クエリによっては節の評価がより頻繁でコストとなると推定されます。そのため、節が VOLATILE 関数を含むときにはプッシュダウンを実施しません。

    プッシュダウンとは、より末端で条件を適用するようにすることで、以下のようなクエリに対して、
    
    SELECT * FROM (SELECT * FROM t6 JOIN t7 USING (id)) v WHERE c = 1;
    
    以下のようなプランではなく、
    
                 QUERY PLAN
    ------------------------------------
     Hash Join
       Hash Cond: (t6.id = t7.id)
       Join Filter: (t6.c = 1)
       ->  Seq Scan on t7
       ->  Hash
             ->  Seq Scan on t6
    (6 rows)
    
    以下のようなプランにすることを指す。
    
                  QUERY PLAN
    --------------------------------------
     Nested Loop
       ->  Seq Scan on t6
             Filter: (c = 1)
       ->  Index Scan using t7_pkey on t7
             Index Cond: (id = t6.id)
    (5 rows)
    
  • カタログキャッシュが自動でサイズ変更されるようになりました。(Heikki Linnakangas) (9.4)
  • 少数のテーブルにだけアクセスする接続に対してメモリ消費を減らします、また、多数のテーブルにアクセスする接続に対しては性能を向上させます。

モニタリング
  • WALアーカイバの活動を報告する pg_stat_archiver システムビューが追加されました。(Gabriele Bartolini) (9.4)
  • n_mod_since_analyze カラムが pg_stat_all_tables ほか関連するシステムビューに追加されました。(Mark Kirkwood) (9.4)
  • 本カラムは ANALYZE が行われて以降のタプルの変更回数の推計値を表示します。この推計値が自動 ANALYZE の駆動を決めるために使われます。

  • backend_xid カラム、backend_xmin カラムが、pg_stat_activity に追加され、backend_xmin カラムが pg_stat_replication に追加されました。(Christian Kruse) (9.4)
SSL
  • SSL ECDH(楕円曲線ディフィー・ヘルマン) 鍵交換がサポートされました。(Marko Kreen) (9.4)
  • 楕円曲線鍵でサーバ認証ができるようになります。RSA鍵よりも高速で安全です。新たな設定パラメータ ssl_ecdh_curve で曲線名を指定します。

  • ssl_ciphers 設定のデフォルト値が改善されました。(Marko Kreen) (9.4)
  • 「DEFAULT:!LOW:!EXP」はより明快な「HIGH:MEDIUM」になり、「!MD5」と「@STRENGTH」は不適切であるため外されています。

    (9.3) 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH'
     ↓
    (9.4) 'HIGH:MEDIUM:+3DES:!aNULL'
    
  • デフォルトで、クライアント側でなくサーバ側の SSL 暗号の優先順設定を使用するようになりました。(Marko Kreen) (9.4)
  • これまでは、ssl_ciphers 設定で指定した順番が、クライアント側のほとんど場合に設定不能なデフォルトの好みによってたいてい無視されていました。新たな設定パラメータ ssl_prefer_server_ciphers を off にすることで従来のクライアント側優先の振る舞いに戻すこともできます。

  • log_connections 設定で SSL 暗号化情報を出力するようになりました。(Andreas Kunert) (9.4)
  • SSL再ネゴシエーション処理が改善されました。(Álvaro Herrera) (9.4)
サーバ設定
  • postgresql.conf の設定を変更できる ALTER SYSTEM コマンドが追加されました。(Amit Kapila) (9.4)
  • 従来はファイルを編集するほかありませんでした。

  • 自動VACUUM におけるメモリ利用量を調整できる autovacuum_work_mem 設定パラメータが追加されました。(Peter Geoghegan) (9.4)
  • Linux 上で huge memory page を使用できるようにする huge_pages設定パラメータが追加されました。(Christian Kruse, Richard Poole, Abhijit Menon-Sen) (9.4)
  • 巨大なメモリを持つシステムでの性能改善につながります。

  • バックグラウンドワーカーの数を制限する max_worker_processes 設定パラメータが追加されました。(Robert Haas) (9.4)
  • スタンバイサーバでプライマリと異なるバックグラウンドワーカプロセスの制限をかけたい場合に役立ちます(max_connections はプライマリの値以上でなければいけないため、より限定的には制約できないため)。

  • 接続開始時にロードするライブラリを指定する session_preload_libraries設定パラメータが追加されました。(Peter Eisentraut) (9.4)
  • local_preload_libraries 設定パラメータと違い、$libdir/plugins ディレクトリ以外にある共有ライブラリでもロードできます。また、スーパーユーザであればSET コマンドで設定できる superuser コンテキストです。

  • ヒントビットの変更も WAL出力するようにする wal_log_hints 設定パラメータが追加されました(Sawada Masahiko) (9.4)
  • チェックサムを有効にしているとき以外では、ヒントビットは通常 WAL記録されません。本設定は外部配布されている拡張モジュール pg_rewind と組み合わせるとき有用です。

  • work_mem と maintenance_work_mem のデフォルト設定値が4倍に増えました。(Bruce Momjian) (9.4)
  • それぞれ 4MB と 64MB が新たなデフォルト値となります。

  • effective_cache_size のデフォルト値が増やされ、4GB になりました。(Bruce Momjian, Tom Lane) (9.4)
  • log_line_prefix 設定パラメータで printf 形式の空白パディングが指定可能になりました(David Rowley) (9.4)
  • 以下の postgresql.conf 設定をすると、
    
    log_line_prefix = '%t %6p %4l '
    
    以下のようにログに指定桁数の空白埋めがされます。
    
    2014-12-21 16:15:24 JST  26208    1 ERROR:  syntax error at or near "test" at character 1
    2014-12-21 16:15:24 JST  26208    2 STATEMENT:  test;
    2014-12-21 16:15:26 JST  26208    3 ERROR:  syntax error at or near "test" at character 1
    2014-12-21 16:15:26 JST  26208    4 STATEMENT:  test;
    
  • 設定ファイルにテラバイト単位 (TB) が記述可能になりました。(Simon Riggs) (9.4)
  • log_lock_waits 設定によるログメッセージでロックを保持しているプロセス、待っているプロセスの PID、および改善されたリレーション情報が出力されるようになりました。(Christian Kruse) (9.4)
  • 以下ログ例の「DETAIL: 〜」と「on tuple (0,1)」が 9.4 で追加された部分です。「Wait queue:」が待っているプロセス群の PID です。行ロックであれば、どのタプルで待っているかも ctid 形式で表示されます。

    LOG:  process 26924 still waiting for AccessExclusiveLock on tuple (0,1) of relation 16416 of database 16412 after 1000.290 ms
    DETAIL:  Process holding the lock: 26913. Wait queue: 26917, 26924.
    STATEMENT:  SELECT * FROM t3 FOR UPDATE;
    
  • 共有ライブラリをロードした際のログレベルが DEBUG1 に下げられました。(Peter Geoghegan) (9.4)
  • これまでは LOG レベルで出力されていましたが、接続ごとにロードされる場合には、冗長でした。

  • Windows にて SQL_ASCII 文字エンコーディングのデータベースと postmaster 等のサーバプロセスが、Windows ユーザロケールの文字エンコーディングでメッセージを出力するようになりました。
  • これまで Windows の ANSI コードページ(1252) にて出力されていました。

レプリケーションとリカバリ

  • スタンバイノードの活動を調整するレプリケーションスロットが導入されました。(Andres Freund, Robert Haas) (9.4)
  • レプリケーションスロットにより、スタンバイサーバが必要としなくなるまでプライマリ上の WALファイルなどのリソースを保持することができます。

  • レプリケーションを遅延させる recovery.conf の設定パラメータ
    recovery_min_apply_delay が追加されました。(Robert Haas, Fabrízio de Royes Mello, Simon Riggs) (9.4)
  • レプリケーション適用を遅延させることでユーザ操作ミスに対する復旧に
    役立ちます。

  • recovery.conf に recovery_target 設定パラメータが追加されました。(MauMau, Heikki Linnakangas) (9.4)
  • 'immediate' を指定すると整合性のある状態に達し次第 WAL リカバリを停止します。

  • リカバリターゲットの処理が改善されました。(Heikki Linnakangas) (9.4)
  • 停止を判定する pg_last_xact_replay_timestamp() が報告するタイムスタンプが、コミットされる予定のトランザクションでなく、コミット済みのレコードを反映するようになりました。指定のリス
    トアポイントよりも早すぎる時点でリプレイが止まってしまうのを防ぎます。

  • pg_switch_xlog() が古い WAL ファイル上の使われない末尾領域をクリアするようになりました。(Heikki Linnakangas) (9.4)
  • これにより WAL ファイルの圧縮率を改善します。

  • recovery.conf で指定する各種リカバリ用外部コマンドからの失敗コードを報告するようになりました。(Peter Eisentraut) (9.4)
  • WAL リプレイ時のスピンロックが削減されました。(Heikki Linnakangas) (9.4)
  • トランザクション実行における WALレコードの書き出しがより頻繁になりました。(Andres Freund) (9.4)
  • これによりスタンバイサーバの起動が早くなり、より積極的にリソースのクリーンアップができるようになります。

ロジカルデコーディング
  • WALデータのロジカルデコーディングがサポートされました。(Andres Freund) (9.4)
  • データベースの論理レベルでの変更内容をカスタマイズ可能な書式で連続的に出力することができます。

  • wal_level 設定パラメータに論理変更セットを WAL に組み入れる 'logical' 設定が加わりました。(Andres Freund) (9.4)
  • 論理レプリケーション制御用にテーブル単位の属性 REPLICA IDENTITY が追加されました。(Andres Freund) (9.4)
  • 行識別に何を使うかを指定するもので、ALTER TABLE コマンドで設定することができます。

  • テーブル単位のストレージパラメータに user_catalog_table が追加されました。(Andres Freund) (9.4)
  • ロジカル変更セット出力にあたり、管理用のテーブルであるかを識別するために使用します。

  • ロジカルデコーディングデータを受け取る pg_recvlogical ツールが追加されました。(Andres Freund) (9.4)
  • SQL レベルでのロジカルデコーディングを例示する test_decoding モジュールが追加されました。(Andres Freund) (9.4)

クエリ

  • WITH ORDINALITY 構文が追加されました。(Andrew Gierth, David Fetter) (9.4)
  • SELECT コマンド FROM 節の複数行を返す関数に指定して行番号を付加するもので、SQL標準で規定された機能です。

    (使用例)
    db1=# SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY;
     unnest | ordinality
    --------+----------
     a      |        1
     b      |        2
     c      |        3
     d      |        4
     e      |        5
     f      |        6
    (6 rows)
    
  • ROWS FROM() 構文で FROM 節の中で複数行を返す関数の水平結合ができるようになりました。(Andrew Gierth) (9.4)
  • (使用例)
    db1=# SELECT * FROM ROWS FROM(generate_series(1,4), generate_series(11,15));
     generate_series | generate_series
    -----------------+-----------------
                   1 |              11
                   2 |              12
                   3 |              13
                   4 |              14
                     |              15
    (5 rows)
    
  • SELECT で空のターゲットリストが許されるようになりました。(Tom Lane) (9.4)
  • (使用例)
    db1=# SELECT * FROM generate_series(1,3);
     generate_series
    -----------------
                   1
                   2
                   3
    (3 rows)
    
    db1=# SELECT FROM generate_series(1,3);
    --
    (3 rows)
    
  • SELECT ... FOR UPDATE NOWAIT が例外的なケースでも既に同時更新されているタプルを待つことがなくなりました。(Craig Ringer and Thomas Munro) (9.4)

ユーティリティコマンド

  • シーケンスの状態を破棄する DISCARD SEQUENCES コマンドが追加されました。(Fabrízio de Royes Mello, Robert Haas) (9.4)
  • また、DISCARD ALL コマンドはシーケンスの状態も破棄するようになります。

  • COPY FROM コマンドに FORCE NULL オプションが追加されました。(Ian Barwick, Michael Paquier) (9.4)
  • CSV モードでクオートされた文字列が指定された NULL を表す文字列と一致していた場合に、それを NULL に変換します。

  • トランザクションブロックの外で意味をなさないコマンドを実行したとき、WARNING を出すようになりました。(Bruce Momjian) (9.4)
  • SET LOCAL、SET CONSTRAINTS、SET TRANSACTION、ABORT コマンドが該当します。

EXPLAIN
  • EXPLAIN ANALYZE コマンドがプラン作成時間も出力するようになりました。(Andreas Karlsson) (9.4)
  • EXPLAIN コマンドが HashAgg、GroupAgg と Group プラン要素にてグルーピングしているカラムを出力するようになりました。(Tom Lane) (9.4)
  • (9.4)
    postgres=# EXPLAIN SELECT i, count(*) FROM t1 GROUP BY i;
                             QUERY PLAN
    ------------------------------------------------------------
     HashAggregate  (cost=28.45..30.45 rows=200 width=4)
       Group Key: i
       ->  Seq Scan on t1  (cost=0.00..22.30 rows=1230 width=4)
    (3 rows)
    
    (9.3以前)
    postgres=# EXPLAIN SELECT i, count(*) FROM t1 GROUP BY i;
                             QUERY PLAN
    -------------------------------------------------------------
     HashAggregate  (cost=28.45..30.45 rows=200 width=4)
       ->  Seq Scan on t1  (cost=0.00..22.30 rows=1230 width=4)
    (2 rows)
    
  • EXPLAIN ANALYZE コマンドで BitmapHeapScan において精確なブロックカウントと lossy ブロックカウントを出力するようになりました。(Etsuro Fujita) (9.4)
  • postgres=# EXPLAIN ANALYZE SELECT * FROM table1 WHERE i BETWEEN 100000
    AND 200000;
                                                                QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------------------------
     Bitmap Heap Scan on table1  (cost=2086.96..47807.93 rows=98198 width=4)
    (actual time=21.496..1544.865 rows=100001 loops=1)
       Recheck Cond: ((i >= 100000) AND (i <= 200000))
       Rows Removed by Index Recheck: 8797574
       Heap Blocks: exact=332 lossy=39367
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       ->  Bitmap Index Scan on table1_index  (cost=0.00..2062.41 rows=98198 width=0) (actual time=21.399..21.399 rows=100001 loops=1)
             Index Cond: ((i >= 100000) AND (i <= 200000))
     Planning time: 0.200 ms
     Execution time: 1553.015 ms
    (8 rows)
    
ビュー
  • マテリアライズドビューで他トランザクションからの参照をブロックせずに
    リフレッシュできるようになりました。(Kevin Grittner) (9.4)
  • その場合、REFRESH MATERIALIZED VIEW CONCURRENTLY 構文を使います。

  • たとえ更新不能カラムが含まれていてもビューが自動的に更新可能となります。(Dean Rasheed) (9.4)
  • これまでは、式やリテラル、関数呼び出しのような更新不能のカラムが含まれている場合には、自動で更新可能にはなりませんでした。

    (使用例)
    
    postgres=# CREATE TABLE t1 (i int, t text);
    CREATE TABLE
    postgres=# INSERT INTO t1 VALUES (1, 'abc'), (2, 'def');
    INSERT 0 2
    postgres=# CREATE VIEW v1 AS SELECT 'literal'::text as literal, * FROM
    t1;
    CREATE VIEW
    postgres=# SELECT * FROM v1;
     literal | i |  t
    ---------+---+-----
     literal | 1 | abc
     literal | 2 | def
    (2 rows)
    
    postgres=# INSERT INTO v1 (i, t) VALUES (3, 'ghi');
    INSERT 0 1
    postgres=# SELECT * FROM v1;
    literal | i |  t
    ---------+---+-----
    literal | 1 | abc
    literal | 2 | def
    literal | 3 | ghi
    (3 rows)
    
    postgres=# UPDATE v1 SET t = 'cba' WHERE i = 1;
    UPDATE 1
    postgres=# SELECT * FROM v1;
     literal | i |  t
    ---------+---+-----
     literal | 2 | def
     literal | 3 | ghi
     literal | 1 | cba
    (3 rows)
    
    postgres=# DELETE FROM v1 WHERE i = 2;
    DELETE 1
    postgres=# SELECT * FROM v1;
     literal | i |  t
    ---------+---+-----
     literal | 3 | ghi
     literal | 1 | cba
    (2 rows)
    
  • 自動で更新可能となったビューについて、ビューではあらわれない行を追加する、あるいはそのように変更することが可能か、制御できるようになりました。(Dean Rasheed) (9.4)
  • 追加された WITH CHECK OPTION 節で指定します。

  • セキュリティバリアビューも自動的に更新可能となりました。(Dean Rasheed) (9.4)

オブジェクト操作

  • 外部テーブルにトリガーを付加できるようになりました。(Ronan Dunklau) (9.4)
  • オブジェクト群をまとめてテーブルスペース移動させることができるようになりました。(Stephen Frost) (9.4)
  • ALTER TABLE、ALTER INDEX、ALTER MATERIALIZED VIEW コマンドに追加された ALL IN TABLESPACE ... SET TABLESPACE 構文を使用します。

  • ALTER TABLE ... ALTER CONSTRAINT 構文で外部キー制約が DEFERRABLE かどうかを変更できるようになりました。(Simon Riggs) (9.4)
  • ALTER TABLE コマンドのいくつかの指定について、ロック強度が下がりました。(Simon Riggs, Noah Misch, Robert Haas) (9.4)
  • 以下指定では ACCESS EXCLUSIVE モードのロックを必要としません。

    ALTER TABLE ... VALIDATE CONSTRAINT
    ALTER TABLE ... CLUSTER ON
    ALTER TABLE ... SET WITHOUT CLUSTER
    ALTER TABLE ... ALTER COLUMN SET STATISTICS
    ALTER TABLE ... ALTER COLUMN SET (attribute_option)
    ALTER TABLE ... ALTER COLUMN RESET (attribute_option)
    
  • テーブルスペースオプションを CREATE TABLESPACE で指定できるようになりました。(Vik Fearing) (9.4)
  • これまでは ALTER TABLESPACE でしか指定できませんでした。

  • CREATE AGGREGATE コマンドで状態遷移データの予想サイズを定義できるようになりました。(Hadi Moshayedi) (9.4)
  • プランナに集約処理で使われるメモリ量をよりよく推定させるために使用します。

  • DROP ... IF EXISTS コマンドでオブジェクトが無い場合にエラーが出てしまわないように修正されました。(Pavel Stehule, Dean Rasheed) (9.4)
  • いくつかそのようなケースがありました。

  • システムリレーションの扱いについて改善されました。(Andres Freund, Robert Haas) (9.4)
  • これまでは pg_catalog スキーマに移動した後には修正も削除もできませんでした。

データ型

  • line データ型が完全な形で実装されました。(Peter Eisentraut) (9.4)
  • 線分をあらわす lseg データ型はすでにサポートされていました。以前あった line データ型 (コンパイル時オプションで指定) はバイナリでもダンプでも互換性がありません。

  • WALログのログシーケンスナンバーをあらわす pg_lsn データ型が追加されました。(Robert Haas, Michael Paquier) (9.4)
  • 1点だけからなる polygon 型データを circle 型に変換できるようになりました。(Bruce Momjian) (9.4)
  • (使用例)
    
    db1=# SELECT circle(polygon '(1,1)');
      circle
    -----------
     <(1,1),0>
    (1 row)
    
  • UTCオフセットが変化するタイムゾーン省略形がサポートされるようになりました。(Tom Lane) (9.4)
  • これまで PostgreSQL では、ある UTC オフセットは特定ロケールにおいては変更されない単一のタイムゾーン省略形に関連づけられるものと想定していました。しかし、実際には変更されているケー
    スがありました。そのようなタイムゾーン省略形に対して、IANA タイムゾーンデータベースに基づいて、指定された日付によって適切な UTC オフセットを対応づけるようになります。

  • ISO形式以外の timestamp 型、data 型の表現文字列で5桁以上の年を適宜に扱えるようになりました。(Bruce Momjian) (9.4)
  • interval 型の値についてオーバーフロー、アンダーフローのチェックが行われるようになりました(Bruce Momjian) (9.4)
  • (9.4)
    db1=# SELECT '178956971 years'::interval;
    ERROR:  interval out of range
    LINE 1: SELECT '178956971 years'::interval;
                   ^
    
    (9.3 以前)
    db1=# SELECT '178956971 years'::interval;
             interval
    --------------------------
     -178956970 years -4 mons
    
JSON
  • jsonb データ型が追加されました。(Oleg Bartunov, Teodor Sigaev, Alexander Korotkov, Peter Geoghegan, Andrew Dunstan) (9.4)
  • 従来の json 型と比べて、JSON文書により高速にアクセスでき、また、 より有効にインデックスを適用できます。従来の json 型が JSON 文書全体をテキストとして格納するのに対し、jsonb 型では
    文書構造を解析してバイナリで格納します。

  • 複雑な JSON ツリーを構築する関数が追加されました。(Andrew Dunstan, Laurence Rowe) (9.4)
  • 以下の関数が追加されました。
    json_array_elements_text()
    json_build_array()
    json_object()
    json_object_agg()
    json_to_record()
    json_to_recordset()

  • JSON データの JSON文書におけるデータタイプを返す json_typeof() 関数が追加されました。(Andrew Tipton) (9.4)

関数

  • より柔軟に休止する pg_sleep_for(interval)、pg_sleep_until(timestamp) が追加されました。(Vik Fearing, Julien Rouhaud) (9.4)
  • 従来からある pg_sleep() 関数は指定秒の休止しかできませんでした。

  • 配列を引数とする cardinality() 関数が追加されました。(Marko Tiikkaja) (9.4)
  • 含まれる要素の総数を返します。

  • ラージオブジェクトを任意のオフセットで読み書きする関数が追加されました。(Pavel Stehule) (9.4)
  • (使用例)
    db1=# SELECT lo_from_bytea(0, E'\\xffffff00');
     lo_from_bytea
    ---------------
             16390
    (1 row)
    
    db1=# SELECT lo_put(16390, 1, E'\\xaa');
     lo_put
    --------
    
    (1 row)
    
    db1=# SELECT lo_get(16390, 0, 3);
      lo_get
    ----------
     \xffaaff
    (1 row)
    
  • unnest() 関数で複数引数を取れるようになりました。(Andrew Gierth) (9.4)
  • それらは水平に結合されます。

    (使用例)
    
    db1=# SELECT * FROM unnest(ARRAY[1,2], ARRAY['foo','bar','baz']);
     unnest | unnest
    --------+--------
          1 | foo
          2 | bar
            | baz
    (3 rows)
    
  • 時間、時刻、日付、タイムスタンプのデータ型を構築する関数が追加されました。(Pavel Stehule) (9.4)
  • make_date()、make_time()、make_timestamp()、make_timestamptz()、make_interval()など、データ型名に make_ プリフィックスが付いた名前の関数が追加されます。

    (例)
    db1=# SELECT make_timestamptz(2014, 12, 18, 15, 31, 10, '+00');
        make_timestamptz
    ------------------------
     2014-12-19 00:31:10+09
    (1 row)
    
    db1=# SELECT make_interval(days := 10, hours := 5);
      make_interval
    ------------------
     10 days 05:00:00
    (1 row)
    
  • to_char() 関数で書式指定子に 'TZ' を指定したとき、タイムゾーンにオフセット数値が入っていた場合に有効な値を返すようになりました。(Tom Lane) (9.4)
  • これまではタイムゾーン名が指定されていない限り、空文字列が返っていました。

    db1=# SET TimeZone TO Japan;
    db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ');
     to_char
    ---------
     JST
    (1 row)
    
    db1=# SET TimeZone TO +9;
    
    (9.3 の場合)
    db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ');
     to_char
    ---------
    
    (1 row)
    
    (9.4 の場合)
    db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ');
     to_char
    ---------
     +09
    (1 row)
    
  • to_char() でタイムゾーンオフセットの書式指定子 OF がサポートされました。(Bruce Momjian) (9.4)
  • タイムゾーン名や地域名が指定されている場合でもオフセット値が出力されます。

    db1=# SET TimeZone TO Japan;
    db1=# SELECT to_char(CURRENT_TIMESTAMP, 'OF');
     to_char
    ---------
     +09
    (1 row)
    
  • random() 関数のランダムシードが改善されました。(Honza Horak) (9.4)
  • chr() 関数におけるユニコードのコードポイントの正当性チェックがより厳しくなりました。(Tom Lane) (9.4)
  • RFC 3629 にしたがった UTF8 文字のみを有効な値として受け入れます。

システム情報関数
  • システムテーブル pg_class、pg_proc、pg_type および pg_operator からオブジェクト名を照会し、エラーは返さない関数がいくつか追加されました。(Yugo Nagata, Nozomi Anzai, Robert Haas) (9.4)
  • to_regclass() 関数は regclass 入力関数のように pg_class を照会しますが、存在しないオブジェクトでも NULL を返すだけでエラーにしません。

  • テーブルスペース番号とファイルノード番号からリレーション名を照会する
    pg_filenode_relation() 関数が追加されました。(Andres Freund) (9.4)
  • information_schema.parameters ビューに parameter_default カラムが追加されました。(Peter Eisentraut) (9.4)
  • 関数引数のデフォルト値が格納されます。

  • information_schema.schemata ビューがアクセス可能なスキーマを全て表示するようになりました。(Peter Eisentraut) (9.4)
  • これまでは現在ユーザが所有者であるスキーマしか表示していませんでした。

集約関数
  • どの行を集約関数に渡すかを制御する FILTER 節がサポートされました。(David Fetter) (9.4)
  • 以下のように実行できます。

    db1=# SELECT avg(score) FILTER (WHERE category = 1),
                 avg(score) FILTER (WHERE category = 2) FROM t8;
             avg         |         avg
    ---------------------+---------------------
     51.0303951367781155 | 36.1878612716763006
    (1 row)
    
  • WITHIN GROUP 構文による順序付けされた集合の集約がサポートされました。(Atri Sharma, Andrew Gierth, Tom Lane) (9.4)
  • (使用例)
    db1=# SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY score) FROM t8;
     percentile_disc
    -----------------
                  44
    (1 row)
    
  • SQL標準で規定された順序集合の集約関数 percentile_cont()、percentile_disc()、mode()、rank()、dense_rank()、percent_rank()、cume_dist() が追加されました。(Atri Sharma, Andrew Gierth) (9.4)
  • VARIADIC 引数を使う集約関数がサポートされました。(Tom Lane) (9.4)
  • 引数に any 等をとる多態集約が多態でない状態データ型を持てるようになりました。(Tom Lane) (9.4)
  • 組み込みの array_agg() のような集約関数を適切に宣言できるようになります。

手続き言語

  • PL/Perl と PL/Tcl でイベントトリガーを記述できるようになりました。(Dimitri Fontaine) (9.4)
  • numeric 型の値が PL/Python の decimal 型に変換されるようになりました。(Szymon Guz, Ronan Dunklau) (9.4)
  • 従来は Python の浮動小数点型に変換されていましたが、精度が失われる可能性がありました。

  • GET DIAGNOSTICS を使って PL/PgSQL の現在のコールスタックを取得できるようになりました。(Pavel Stehule, Stephen Frost) (9.4)
  • 「GET DIAGNOSTICS stack_text = PG_CONTEXT;」として、コールスタックが記述された文字列データを取得できます。

  • STRICT 制約に違反したクエリを表示する print_strict_params オプションが追加されました。(Marko Tiikkaja) (9.4)
  • (以下のようにオプションを関数定義冒頭のブロック外側に記述します)
    
    CREATE FUNCTION get_uid(p_uname name) RETURNS int LANGUAGE plpgsql
    AS $func$
    #print_strict_params on
    DECLARE
      r int;
    BEGIN
      SELECT usesysid::int INTO STRICT r FROM pg_user WHERE usename = p_uname;
      RETURN r;
    END
    $func$;
    
    (以下の DETAIL: は print_strict_params on のときだけ出力されます)
    
    db1=# SELECT get_uid('foo');
    ERROR:  query returned no rows
    DETAIL:  parameters: $1 = 'foo'
    CONTEXT:  PL/pgSQL function f_uid(name) line 5 at SQL statement
    
  • 追加的な警告とエラーを出す plpgsql.extra_warnings、plpgsql.extra_errors 変数が追加されました。(Marko Tiikkaja, Petr Jelinek) (9.4)
  • いまのところは、隠し変数についての警告/エラーが有効になるだけです。

libpq

  • libpq の PQconndefaults() 関数が無効なサービスファイルを無視するようになりました。(Steve Singer, Bruce Momjian) (9.4)
  • これまでは無効なサービスファイルに遭遇すると NULL を返していました。

  • libpq が TLSv1 以降の TLS プロトコルバージョンを受け入れるようになりました。(Marko Kreen) (9.4)
  • これまでは TLSv1 バージョンだけを受け入れていました。

クライアントアプリケーションなど

  • createuser コマンドに、所属するロールを指定する -g オプションが追加されました。(Chistopher Browne) (9.4)
  • vacuumdb コマンドに、複数の異なる設定で analyze を行う --analyze-in-stages オプションが追加されました。(Peter Eisentraut) (9.4)
  • これにより最低限の統計情報を高速に生成することができるようになりました。

  • pg_resetxlog の -n オプションの実行で現在の値と今後変化する値を出力するようになりました。(Rajeev Rastogi) (9.4)
  • initdb が誤ったロケール設定に黙って代替にデフォルトを選択するのでなくエラーを出すようになりました。(Tom Lane) (9.4)
  • pg_ctl がデータディレクトリにアクセス不能であるとき、終了コード 4 を返すようになりました。(Amit Kapila, Bruce Momjian) (9.4)
  • これは LSB (Linux Standard Base) コア仕様により適合した振る舞いとなります。

  • Windows で相対パスで指定された -D オプションを確実に pg_ctl のカレントディレクトリからの相対パスと解釈するようになりました。(Kumar Rajeev Rastogi) (9.4)
  • これまで Windowsサービスが開始されたディレクトリを起点にして解釈されていました。

  • ECPG で C 言語の配列定義に sizeof() が利用可能になりました。(Michael Meskes) (9.4)
  • ECPG で入れ子になった C 言語スタイルのコメントを C 言語中でも SQL中でも
    適切に扱えるようになりました。(Michael Meskes) (9.4)
psql
  • psql にて footer の設定が off の場合、expanded モードで 0行のときに表示されていた (No rows) が表示されなくなりました。(Bruce Momjian) (9.4)
  • コネクション開始時にハングアップした場合に Control-C 押下げで、終了できるようになりました。(Peter Eisentraut) (9.4)
psql/バックスラッシュコマンド
  • psql の \db+ でテーブルスペースオプションが表示されるようになりました。(Magnus Hagander) (9.4)
  • psql の \do+ で演算子を実装している関数が表示されるようになりました。(Marko Tiikkaja) (9.4)
  • psql の \d+ が OID カラムがある場合だけ「Has OIDs: ...」を表示するようになりました。(Bruce Momjian) (9.4)
  • これまでは OID カラムが無くても「Has OIDs: no」が表示されていました。

  • psql の \d が無効なシステムトリガーも表示するようになりました。(Bruce Momjian) (9.4)
  • これまで無効なトリガーはユーザトリガに限って表示されていました。

  • psql の \copy が「stdin」と「;(セミコロン)」の間に空白を必要としなくなりました。(Etsuro Fujita) (9.4)
  • psql の \copy で最後に行数を出力するようになりました。(Kumar Rajeev Rastogi) (9.4)
  • COPY コマンドでは既にそのようになっています。

  • psql の \conninfo が hostaddr を指定して接続した場合にサーバの IPアドレスを表示するように修正されました。(Fujii Masao) (9.4)
  • これまでそのような場合にサーバの IPアドレスが表示されませんでした。

  • psql の \conninfo で SSLプロトコルバージョンが表示されるようになりました。(Marko Kreen) (9.4)
  • psql の \pset で TAB キーによる入力補完できるようになりました。(Pavel Stehule) (9.4)
  • psql の \pset で引数無しのときに設定一覧が表示されるようになりました。(Gilles Darold) (9.4)
  • psql の \s で入力ヒストリをファイルに書き出す際に、ファイル名を絶対パスに変換することなく表示するようになりました。(Tom Lane) (9.4)
  • これまでのコードでは表示するのにパスを変換しようと試みていましたが、しばしば誤っていました。

    (9.3 での望ましくない動作例)
    db1=# \s ./my-history.txt
    Wrote history to file "././my-history.txt".
    
pg_dump
  • pg_restore でオプション -I、-P、-T、-n を複数指定できるようになりました。(Heikki Linnakangas) (9.4)
  • 既存オブジェクトを削除する指定の時に出力される DROP コマンドに IF EXISTS 節を追加できるようになりました。(Pavel Stehule) (9.4)
  • pg_dump、pg_dumpall、pg_restore に --if-exists オプションが加わりました。 --clean を指定した際に働きます。

pg_basebackup
  • pg_basebackup に pg_xlog ディレクトリを指定するオプション --xlogdir が追加されました。(Haribabu Kommi) (9.4)
  • pg_basebackup でテーブルスペースを別の場所に配置できるようになりました。(Steeve Lennmark) (9.4)
  • これは同マシン内で pg_basebackup を実行するときに便利です。

  • ネットワークストリーム経由のベースバックアップ取得を減速できるようになりました。(Antonin Houska) (9.4)
  • pg_basebackup に追加された --max-rate パラメータで指定します。

ソースコード

  • タプルを調査情報を保持して凍結する方法が改善されました。(Robert Haas, Andres Freund) (9.4)
  • この変更は、タプルをできるだけ早く凍結させることの難点を除去します。タプルのフラグビットを解析するツールは本バージョンに対応した修正が必要となります

  • 関数宣言には PG_FUNCTION_INFO_V1 マクロが不要になりました。(Peter Eisentraut) (9.4)
  • なお、関数定義の手前には必要です。

  • SnapshotNow と HeapTupleSatisfiesNow() が除去されました。(Robert Haas) (9.4)
  • 既存の使用箇所はより適切なスナップショットタイプに切り替えられました。システムカタログのスキャンにも MVCC スナップショットが使われます。

  • 1GB 以上のメモリ割り当てが可能な API が追加されました。(Noah Misch) (9.4)
  • 文字列構成用にメモリ割り当てを内部で行う psprintf() が追加されました。(Peter Eisentraut, Tom Lane) (9.4)
  • size_t 値を表示するのに elog() 等で printf() サイズ修飾子 z を使えるようになりました。(Andres Freund) (9.4)
  • appendStringInfoVA() API が改善されました。(David Rowley, Tom Lane) (9.4)
  • 新たな種類の 外部TOASTデータがサポートされました。(Andres Freund) (9.4)
  • 単一リーダ、単一ライタの軽量な共有メッセージキューが追加されました。(Robert Haas) (9.4)
  • x86_64 CPU におけるスピンロックが改善されました。(Heikki Linnakangas) (9.4)
  • サポートされないプラットフォームのスピンロックコードが除去されました。(Robert Haas) (9.4)
  • IRIX への移植が除去されました。(Robert Haas) (9.4)
  • --disable-spinlocks 指定でビルドしたときの必要セマフォ数が削減されました(Robert Haas) (9.4)
  • duplicate_oids スクリプトが Perl で書き直されました。(Andrew Dunstan) (9.4)
  • クライアントプログラムむけに TAP (Test Anything Protocol) テストが追加されました。(Peter Eisentraut) (9.4)
  • いまのところ、--enable-tap-tests オプションを指定してビルドして、make check-world を行った場合にのみ実行されます。将来デフォルトとなるかもしれません。

  • make ターゲットに個別に実行できるテストの check-tests と installcheck-tests が追加されました。(Andrew Dunstan) (9.4)
  • makefile ルールの maintainer-check が除去されました。(Peter Eisentraut) (9.4)
  • デフォルトのビルドルールにこれまでオプションであったテストが全て含まれています。

  • PGXS モジュールの VPATH ビルド対応が改善されました。(Cédric Villemain, Andrew Dunstan, Peter Eisentraut) (9.4)
  • 使用する Autoconf が 2.69 となりました。(Peter Eisentraut) (9.4)
  • configure オプション --with-extra-version で PG_VERSION 文字列に任意の文字列を足せるようになりました。(Oskari Saarenmaa) (9.4)
  • カスタムバイナリパッケージャーにむけに便利です。

  • DocBook XML の検証が改善されました。(Peter Eisentraut) (9.4)
  • Coverity スキャナーで報告されたいくつかのセキュリティ、健全性の問題について修正されました。(Stephen Frost) (9.4)
  • Valgrind による不正なメモリ使用の探知が改善されました。(Noah Misch) (9.4)
  • emacs.samples が改善されました。(Peter Eisentraut) (9.4)
  • また .dir-locals.el がソースツリーのトップに追加されました。

  • pgindent が typedefs のコマンドラインリストに対応しました。(Bruce Momjian) (9.4)
  • pgindent がプリプロセッサ条件周辺の空白行についてより賢明になりました。(Bruce Momjian) (9.4)
  • Cygwin と Mingw ビルドで dlltool をほとんど使用しないようになりました。(Marco Atzeri, Hiroshi Inoue) (9.4)
  • MSVC ビルドでクライアントのみインストールがサポートされました。(MauMau) (9.4)

追加モジュール

  • データを共有バッファ等に事前読み出しする pg_prewarm モジュールが追加されました。(Robert Haas) (9.4)
  • ランダムな UUID を生成する gen_random_uuid() が追加されました。(Oskari Saarenmaa) (9.4)
  • uuid-ossp が OSSP UUID ライブラリだけでなく、BSD および e2fsprogs の UUIDライブラリに対応しました。(Matteo Beccati) (9.4)
  • auto_explain モジュールにトリガ実行時間を含めるオプションが追加されました。(Horiguchi Kyotaro) (9.4)
  • pgstattuple モジュールが未コミットトランザクションの行を不要行(dead) と報告しないように修正されました。(Robert Haas) (9.4)
  • pgstattuple() 関数が regclass 型の引数を使うようになりました。(Satoshi Nagayasu) (9.4)
  • text 型引数もまだサポートされますが将来除去されるかもしれません。

  • pgrowlock のスナップショット取得動作の一貫性が改善されました。(Robert Haas) (9.4)
  • pg_trgm で正規表現のインデックス検索に対するトリグラム選択が改善されました(Alexander Korotkov) (9.4)
  • 本変更で空白を含むトリグラムは選択されにくくなります。

  • pg_xlogdump にオンラインの WALデータを継続的に報告できる --follow オプションが追加されました。(Heikki Linnakangas) (9.4)
  • cubeデータ型の格納サイズが小さくなりました。(Stas Kelvich) (9.4)
  • 既存データはダンプリストアをして新フォーマットに変換する必要があります。旧フォーマットのデータもまだ読み取り可能です。

  • カーソルを使うことで vacuumlo コマンドのクライアント側メモリ使用量が削減されました。(Andrew Dunstan) (9.4)
  • pg_upgrade のメモリ使用量が大幅に削減されました。(Bruce Momjian) (9.4)
  • pg_upgrade のユーザ指定する -U オプションが、生成される分析スクリプトに渡されるようになりました。(Bruce Momjian) (9.4)
pgbench
  • pgbench スクリプトの行の長さ制限が除かれました。(Sawada Masahiko) (9.4)
  • 以前は BUFSIZ (stdio.h で宣言されている) が上限でした。

  • pgbench の各オプションにロングオプション名が追加されました。(Fabien Coelho) (9.4)
  • pgbench にトランザクション速度を指定する --rate オプションが追加されました。(Fabien Coelho) (9.4)
  • pgbench に定期的に経過を報告する --progress オプションが追加されました。(Fabien Coelho) (9.4)
pg_stat_statements
  • pg_stat_statements がクエリ文字列を格納するのに共有メモリでなくファイルを使うようになりました。(Peter Geoghegan) (9.4)
  • これにより従来あったクエリ文字列の上限が無くなりました。また、デフォルトでより多くのクエリ種類を観測できるようになります。

  • pg_stat_statements の内部クエリハッシュ識別子を報告できるようになりました。(Daniel Farina, Sameer Thakur, Peter Geoghegan) (9.4)
  • pg_stat_statements のクエリ文字列以外の全情報を取得するということができるようになりました。(Peter Geoghegan) (9.4)
  • モニタリングツールの性能を改善します。どのクエリ文字列のデータであるかは、ハッシュ識別子(queryid)で識別することになります。

  • pg_stat_statements が DEALLOCATE コマンドを無視するようになりました。(Fabien Coelho) (9.4)
  • 既に PREPARE を無視するようになっていましたので、一貫性を持たす変更となります。

  • PostgreSQL停止時に pg_stat_statements の 統計ファイルを $PGDATA/global/ でなく、$PGDATA/pg_stat/ に保存するようになりました。(Fujii Masao) (9.4)