PostgreSQL 9.3 に関する技術情報

このページでは PostgreSQL 9.3 (2013/9/9リリース)に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートをもとに弊社で解説を加えたものです。

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

サーバ設定

    • replication_timeout から wal_sender_timeout に設定名が変更されました。 (Amit Kapila)

この設定は送出サーバ側の wal sender プロセスでチェックされるタイムアウトを指定するものであり、より実態に即した名称となりました。

    • 場合によっては他の接続にも遅延を発生させることができるため、commit_delay の設定に管理者権限が必要になりました。 (Simon Riggs)
    • メモリ内ソートで割り当てられたメモリ全体が使えるようになりました。 (Jeff Janes)

本変更により、同じ work_mem 設定値でも従来の振る舞いと比べてより多くのメモリを使用します。そのため設定の見直しが必要になるかもしれません。

その他

    • 行の更新、削除をする際に、BEFOREトリガによってその行が既に更新、削除されていた場合、エラーを出すようになりました。これまではエラーも警告も出さない動作となっていました。 (Kevin Grittner)
(9.3 でのエラー出力例、9.2 ではエラーとならない)
=# CREATE OR REPLACE FUNCTION btf1() RETURNS TRIGGER LANGUAGE plpgsql AS
   $$ BEGIN  DELETE FROM t1 WHERE id = OLD.id ; RETURN NEW; END; $$;
=# CREATE TRIGGER bt1 BEFORE UPDATE ON t1 FOR ROW EXECUTE PROCEDURE btf1();

=# UPDATE t1 SET v = v || 'x' WHERE id = 1;
ERROR:  tuple to be updated was already modified by an operation triggered
by the current command
HINT:  Consider using an AFTER trigger instead of a BEFORE trigger to
propagate changes to other rows.
    • マルチカラムの外部キー制約における ON UPDATE SET NULL、SET DEFAULT 動作が対象全カラムに影響を及ぼすようになりました。 (Tom Lane)

これまでは変更したカラムに関してだけ、NULL やデフォルト値への置き換えがされていました。これは、SQL92 で要求されている動作でした。しかし、新しいSQL標準では、変更後の本動作が指定されています。

(動作例)
=# CREATE TABLE t2m (a int, b int, c int, v text, primary key (a,b,c));
=# CREATE TABLE t2t (id int PRIMARY KEY,
   a int DEFAULT -1, b int DEFAULT -1, c int DEFAULT -1, ts timestamp,
   FOREIGN KEY (a,b,c) REFERENCES t2m (a, b, c) ON UPDATE SET DEFAULT);
=# INSERT INTO t2m VALUES (-1, -1, -1, 'dummy'), (1, 1, 1, 'm1');
=# INSERT INTO t2t VALUES (101, 1, 1, 1, now());

(9.3 の場合)
=# UPDATE t2m SET b = 5 WHERE (a,b,c) = (1,1,1);
UPDATE 1
=# SELECT * FROM t2t;
 id  | a  | b  | c  |             ts
-----+----+----+----+----------------------------
 101 | -1 | -1 | -1 | 2013-09-06 14:27:13.278141
(1 row)

(9.2 の場合)
=# UPDATE t2m SET b = 5 WHERE (a,b,c) = (1,1,1);
ERROR:  insert or update on table "t2t" violates foreign key constraint
"t2t_a_fkey"
DETAIL:  Key (a, b, c)=(1, -1, 1) is not present in table "t2m".
    • search_path が変更されるとキャッシュ済みプランを再作成するようになりました (Tom Lane)

これまでは、接続中に search_path を変更して、それ以前にキャッシュされたプラン(プリペアドステートメント)を実行すると、当初プラン作成時点のsearch_path を前提とした実行内容となっていました。

=# CREATE SCHEMA s1;  CREATE SCHEMA s2;
=# CREATE TABLE s1.t3 (v text);  CREATE TABLE s2.t3 (v text);
=# INSERT INTO s1.t3 VALUES ('s1');  INSERT INTO s2.t3 VALUES ('s2');
=# SET search_path TO 's1';
=# PREPARE p AS SELECT * FROM t3;
=# SET search_path TO 's2';

(9.2 の場合)
=# EXECUTE p;
 v
----
 s1

(9.3 の場合)
=# EXECUTE p;
 v
----
 s2

    • to_number() 関数が 3桁区切りのピリオド(.)を適切に扱えるように修正されました。 (Tom Lane)

これまでは、ロケール定義がそうではなく、’D’ 書式で小数点位置を指定していても、ピリオドが小数点であるように処理されていました。特に ‘FM’ 書式を使っている時、誤った結果となっていました。

(ピリオドが 3桁区切り、カンマが小数点となる、ポルトガル語の例)
=# SET lc_numeric TO portuguese;
=# SELECT to_number('5.000,12', 'FM9G999D99');

(9.2 の場合)
 to_number
-----------
      5.00

(9.3 の場合)
 to_number
-----------
    5000.1

この障害は長期にわたり存在し、既存アプリケーションの動作に影響が大きいため、9.2 以前の各バージョン系列へのバックポートは行われないものとなっています。

    • STRICT な単一行を返す関数が、複数行を返す関数を引数に取った場合の、NULL の扱いが修正されました。 (Tom Lane)

STRICT 関数は NULL を受け取ったら NULL を返さなければいけませんが、NULL の行自体が出力されないという振る舞いになっていました。

(9.2 の場合)
=# SELECT unnest('{1,NULL,4}'::int[])::int8;
 unnest
--------
      1
      4

(9.3 の場合)
=# pset null Null
=# SELECT unnest('{1,NULL,4}'::int[])::int8;
 unnest
--------
      1
   Null
      4
    • WAL ファイルのファイル名規則が変更され、末尾が「FF」であるファイルも生成されるようになりました。 (Heikki Linnakangas)

これまでは「0000000100000000000001FE」の次は「000000010000000000000200」で、末尾が「FF」であるファイルは作られませんでした。何らか WALファイルを処理するスクリプトを書いている場合、修正が必要となる可能性があります。

    • システムテーブル pg_constraint の confmatchtype カラムの表現方法が変更されました。 (Tom Lane)

pg_constraint は制約についての情報を格納するシステムテーブルです。外部キー制約の照合型について、MATCH SIMPLE であるとき「s」が格納されるようになりました。これまでは、MATCH FULL も MATCH PARTIAL も指定されていないという意味で unspecified の「u」でした。

バージョン 9.3 の変更点

サーバ

ロック
    • 外部キーのチェックでキー以外のカラム更新が妨げられないようになりました。 (Álvaro Herrera, Noah Misch, Andres Freund, Alexander Shulgin, Marti Raudsepp, Alexander Shulgin)

本修正は、外部キー制約を伴うテーブルの更新において、並列性を改善し、デッドロックの可能性を軽減します。

外部キーに参照されていないカラムに対する UPDATE は、新たなNO KEY UPDATE ロックモードの行ロックを取得します。一方で、外部キーのチェックには、NO KEY UPDATE と競合しない新たなKEY SHARE ロックモードが 使われるよ
うになります。

例:
=# CREATE TABLE t3m (id int primary key , v text);
=# INSERT INTO t3m VALUES (1, 'mas1');
=# CREATE TABLE t3t (id int primary key, mid int REFERENCES t3m (id), v text);

(以下のトランザクションが継続中として、)
=# BEGIN; UPDATE t3m SET v = 'mas1!' WHERE id = 1;

(別接続にて以下が、9.2 ではロック待ちとなり、9.3 ではロック待ちしません)
=# INSERT INTO t3t VALUES (1, 1, 'tra1');
    • 設定 lock_timeout が追加されました。 (Zoltán Böszörményi)

ロック待ちのタイムアウトを設定することができます。本設定は SET 文で各接続内にて変更可能です。

インデックス
    • SP-GiST インデックスが範囲データ型に利用可能となりました (Alexander Korotkov)

従来は GiST インデックスのみ対応していました。

  • GiSTインデックスを UNLOGGED 指定できるようになりました (Jeevan Chalke)
  • 同等の候補が複数ある場合にどのページに降りるかをランダム化することで、GiST インデックスへの挿入性能が改善されました (Heikki Linnakangas)
  • ハッシュインデックス操作の並列性が改善されました。 (Robert Haas)
プランナ
    • 範囲データ型についてプランナ統計情報として、下限上限のヒストグラムと範囲の長さが収集され使われるようになりました。 (Alexander Korotkov)

なお、これらの値は pg_stats ビューでは参照することができませんが、pg_statistic システムテーブルから確認することができます。

  • インデックスアクセスに対するプランナコスト見積もりが改善されました。 (Tom Lane)
  • DISTINCT 文でハッシュ集約をする際のハッシュテーブルサイズの見積もりが改善されました。 (Tom Lane)
  • プランナ処理にて、何もしない「Result」、「Limit」プランノードが出現しないように修正されました。 (Kyotaro Horiguchi, Amit Kapila, Tom Lane)
  • 余分なプラン保持を減らして、プランナ処理のオーバーヘッドが軽減されました。 (Tom Lane)
性能
    • COPY 命令に FREEZE オプションが追加されました。 (Simon Riggs, Jeff Davis)

空テーブルにデータを取り込む際、初めから VACUUM FREEZE 終了後状態としてテーブルに書き込みを行います。後から行の状態を変更するオーバーヘッドを軽減し、高速ローディングを実現します。ただし、トランザクション隔離
の規則に従わない処理となります。

    • NUMERIC データ型の計算の性能が改善されました。 (Kyotaro Horiguchi)
    • commit_delay を待つセッション同期が改善されました (Peter Geoghegan)

従来、性能改善に効果を発揮することの少なかった commit_delay の、有効性が高まりました。

    • 一時テーブルに触れないトランザクションについては、トランザクション内でテーブルを空にする処理を行わないことでCREATE TEMPORARY TABLE … ON COMMIT DELETE ROWS 命令の性能が改善されました。 (Heikki Linnakangas)
    • VACUUM が不要行削除を行った後で可視性の再チェックをするようになりました。 (Pavan Deolasee)

これによりページが全て可視の状態となる可能性が増します。

    • リソース所有者ごとのロックキャッシュが追加されました (Jeff Janes)

これは、多数のロックを保持する 複数 SQL命令からなるトランザクションで、ロックを記録する速度を向上させます。特に pg_dump で効果的です。

    • 新たなテーブル等を作るトランザクションのコミット時に、リレーションキャッシュ全体をスキャンするのを避けるようになりました。 (Jeff Janes)

これは連続するトランザクションで多数のテーブルを作る処理を高速化します。典型的には pg_restore が該当します。

  • テーブル等を多数削除するトランザクションの性能が改善されました (Tomas Vondra)
監視
  • データページにチェックサムを加え、破損を報告するオプションが追加されました。 (Simon Riggs, Jeff Davis, Greg Smith, Ants Aasma)
  • initdb 時にチェックサムを有効にするか指定することができます。

  • 実行時統計情報コレクタのデータファイルが、データベース全体とデータベース毎とに分割されました (Tomas Vondra)
  • これは統計情報収集の I/O 量を減らします。

  • 実行時統計情報コレクタがシステム時計が巻き戻された場合に適切に処理できるようになりました。 (Tom Lane)
  • これまでは最新時刻に再び達するまで統計情報収集が止まってしまいました。

  • ログ出力先を切り替えるときに、マスタプロセスの標準エラーに参考情報を出力するようになりました。 (Tom Lane)
  • ユーザがログメッセージ出力先を知る助けとなります。

    (例)
    $ pg_ctl start
    server starting
    2013-09-10 16:52:43 JST LOG:  redirecting log output to logging collector process
    2013-09-10 16:52:43 JST HINT:  Future log output will appear in directory "pg_log".
    
認証
  • 認証に失敗した場合、pg_hba.conf の行に関連づけるログメッセージが出るようになりました。 (Magnus Hagander)
  • (パスワード認証に失敗したときの例)
    FATAL: password authentication failed for user "foo"
    DETAIL: Connection matched pg_hba.conf line 94: "host foodb foo 10.1.2.3/32 md5"
    
  • LDAP 認証におけるエラー報告とドキュメント記載が改善されました。 (Peter Eisentraut)
  • LDAP認証 のパラメータを RFC 4516 に基づく URLフォーマットで指定できるようになりました。 (Peter Eisentraut)
  • ssl_ciphers のデフォルト設定値が DEFAULT で始まるものに変更され、安全でない暗号法が取り除かれました (Magnus Hagander)
  • (9.2 デフォルト)
    ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'
    (9.3 デフォルト)
    ssl_ciphers = 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH'
    
  • pg_ident.conf を各接続毎でなく1回だけ読み込むようになりました。 (Amit Kapila)
  • pg_hba.conf と同様の扱いとなります。

サーバ設定
  • PostgreSQL共有バッファ用に System V 共有メモリを使わなくなりました (Robert Haas)
  • Unix系システムでは代わりに mmap() システムコールによる共有メモリを使用するようになりました。巨大な共有メモリを使用するにあたってカーネルパラメータを調整する必要がなくなります。

  • マスタプロセスが複数の UNIXドメインソケットを受付できるようになりました。 (Honza Horák)
  • 設定 unix_socket_directory は unix_socket_directories に置き換えられ、ディレクトリをカンマ区切りで複数指定できるようになります。

  • 設定ファイルディレクトリが利用可能になりました (Magnus Hagander, Greg Smith, Selena Deckelmann)
  • 設定 include_dir で指定したディレクトリ内の 〜.conf ファイルが設定ファイルの一部として読み込まれます。

  • shared_buffers の initdb 実行時の自動設定されるデフォルト値が最大 128MB となりました。 (Robert Haas)
  • これまでは 32MB でした。

  • 設定 external_pid_file で指定する外部PIDファイルをマスタプロセス終了時に削除するようになりました。 (Peter Eisentraut)

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

  • ストリーミングレプリケーションで、スタンバイがタイムライン変更に追随できるようになりました (Heikki Linnakangas)
  • スタンバイサーバが、新たに昇格したプライマリサーバから WALデータを受け取って、レプリケーションを継続できることを意味します。これまでは、新たなプライマリサーバから再全同期をする等が必要でした。

  • pg_is_in_backup() 関数、pg_backup_start_time() 関数が追加されました (Gilles Darold)
  • それぞれ、ベースバックアップ実行中かどうかと、ベースバックアップ開始時刻を返します。

  • ストリーミングレプリケーションで synchronous_commit 設定を無効とした場合の性能が改善されました (Andres Freund)
  • スタンバイからプライマリへの昇格が高速化されました (Simon Riggs, Kyotaro Horiguchi)
  • pg_controldata 出力内容に最後のチェックポイントの REDO 位置のWALファイル名が加わりました (Fujii Masao)
  • どの WALファイルがリストアに必要か判断するのに便利になります。

    (9.3 での実行例)
    $ pg_controldata | grep REDO
    Latest checkpoint's REDO location:    0/2A22F30
    Latest checkpoint's REDO WAL file:    000000010000000000000002
    
  • pg_receivexlog のようなツールを別アーキテクチャのマシンから利用できるようになりました (Heikki Linnakangas)
  • ストリーミングレプリケーションプロトコルがマシンアーキテクチャに依存しないようになりました。

    WALファイルを適用するためには同アーキテクチャマシンである必要がありますが、転送、ファイル保持するだけであれば、別アーキテクチャでも可能となります。

  • pg_basebackup ツールで --write-recovery-conf オプションを指定することで最小限の recovery.conf ファイルを自動作成するようになりました。 (Zoltán Böszörményi, Magnus Hagander)
  • これによりスタンバイサーバの設定を簡単にします。

  • pg_receivexlog と pg_basebackup --xlog-method=stream においてタイムライン変更を取り扱えるようになりました (Heikki Linnakangas)
  • wal receiver のタイムアウトを指定する wal_receiver_timeout 設定が追加されました。 (Amit Kapila)
  • WALレコードのフォーマットが変更され、レコードヘッダがページ間に跨ることができるようになりました。 (Heikki Linnakangas)
  • 新たなフォーマットは若干のサイズ縮小を実現し、書き込み負荷を軽減します。

SQL

  • SELECT文 の FROM 節に LATERALオプションが実装されました。 (Tom Lane)
  • SQL標準で規定されている構文で、FROM にあらわれるテーブルを並びのサブクエリや関数呼び出しの中から参照できるようになります。

    以下のような書き方ができるようになります。

     =# SELECT s.id, i.*, u.*, s.ts FROM t_sales s,
         LATERAL (SELECT * FROM t_item WHERE iid = s.iid) i,
         LATERAL (SELECT * FROM t_user WHERE uid = s.uid) u;
    
       id | iid | name   | uid | name   | ts
     -----+-----+--------+-----+--------+----------------------------
     1001 | 1   | 商品 A | 101 | 顧客 a | 2013-05-01 13:06:41.910403
     1002 | 1   | 商品 A | 102 | 顧客 b | 2013-05-02 13:26:53.388375
     1003 | 2   | 商品 B | 101 | 顧客 a | 2013-05-03 13:47:02.461441
     1004 | 1   | 商品 A | 102 | 顧客 b | 2013-05-04 13:07:09.440439
    

  • COPY文や psql の copy コマンドでパイプによる外部プログラムとのデータ受け渡しに対応しました (Etsuro Fujita)
  • 以下のように使うことができます。

    =# COPY t6 (a1, a5, a15, p, pid) FROM PROGRAM 'cat /proc/loadavg' DELIMITER ' ';
    =# copy t6 to program './myscript.sh'
    
  • pg_basebackup ツールで --write-recovery-conf オプションを指定することで最小限の recovery.conf ファイルを自動作成するようになりました。 (Zoltán Böszörményi, Magnus Hagander)
  • これによりスタンバイサーバの設定を簡単にします。

  • pg_receivexlog と pg_basebackup --xlog-method=stream においてタイムライン変更を取り扱えるようになりました (Heikki Linnakangas)
  • wal receiver のタイムアウトを指定する wal_receiver_timeout 設定が追加されました。 (Amit Kapila)
  • WALレコードのフォーマットが変更され、レコードヘッダがページ間に跨ることができるようになりました。 (Heikki Linnakangas)
  • 新たなフォーマットは若干のサイズ縮小を実現し、書き込み負荷を軽減します。

SQL

  • SELECT文 の FROM 節に LATERALオプションが実装されました。 (Tom Lane)
  • SQL標準で規定されている構文で、FROM にあらわれるテーブルを並びのサブクエリや関数呼び出しの中から参照できるようになります。

    以下のような書き方ができるようになります。

     =# SELECT s.id, i.*, u.*, s.ts FROM t_sales s,
         LATERAL (SELECT * FROM t_item WHERE iid = s.iid) i,
         LATERAL (SELECT * FROM t_user WHERE uid = s.uid) u;
    
       id | iid | name   | uid | name   | ts
     -----+-----+--------+-----+--------+----------------------------
     1001 | 1   | 商品 A | 101 | 顧客 a | 2013-05-01 13:06:41.910403
     1002 | 1   | 商品 A | 102 | 顧客 b | 2013-05-02 13:26:53.388375
     1003 | 2   | 商品 B | 101 | 顧客 a | 2013-05-03 13:47:02.461441
     1004 | 1   | 商品 A | 102 | 顧客 b | 2013-05-04 13:07:09.440439
    

  • COPY文や psql の copy コマンドでパイプによる外部プログラムとのデータ受け渡しに対応しました (Etsuro Fujita)
  • 以下のように使うことができます。

    =# COPY t6 (a1, a5, a15, p, pid) FROM PROGRAM 'cat /proc/loadavg' DELIMITER ' ';
    =# copy t6 to program './myscript.sh'
    

  • ルールにて、複数行の VALUES 指定内容が OLD、NEW で参照できるようになりました。 (Tom Lane)

DDL

  • イベントトリガーがサポートされました。 (Dimitri Fontaine, Robert Haas, Álvaro Herrera)
  • DDL コマンドの実行に連動してトリガ関数を実行することができるようになりました。CREATE EVENT TRIGGER 文を使ってトリガ定義をします。

  • 外部データラッパーが外部テーブルに対する書き込み(INSERT、UPDATE、DELETE)をサポートしました。 (KaiGai Kohei)
  • CREATE SCHEMA .. IF NOT EXISTS 構文が追加されました。 (Fabrízio de Royes Mello)
  • REASSIGN OWNED 文が共有オブジェクトの所有者も変更できるようになりました。 (Álvaro Herrera)
  • データベースやテーブルスペースの所有者も変更できるようになります。

  • CREATE AGGREGATE 文が、状態値の初期設定がデータ型に対して無効な場合、エラーを出すようになりました。 (Tom Lane)
  • これまでは集約関数を実行した時点でエラーを出していました。

  • CREATE TABLE 文が暗黙的なインデックス、シーケンスの作成を報告しなくなります。 (Robert Haas)
  • これらのメッセージは DEBUG1 レベルに落とされました。これまでは、NOTICE レベルで以下のようなメッセージが出ていました。

    =# CREATE TABLE t7 (id serial primary key, v text);
    NOTICE:  CREATE TABLE will create implicit sequence "t7_id_seq" for serial column "t7.id"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t7_pkey" for table "t7"
    
  • DROP TABLE IF EXISTS 文で、存在しないスキーマ名をテーブル名部分の中に指定してもエラーがでなくなりました。 (Bruce Momjian)
  • 制約違反の詳細を項目ごとに分けてクライアントに提供するようになりました。 (Pavel Stehule)
  • これまではエラーメッセージ文字列から抽出する必要がありました。利用するには、クライアントライブラリがこれらの情報項目へのアクセスに対応している必要があります。

ALTER
  • ALTER TYPE .. ADD VALUE .. 文で IF NOT EXISTS オプションがサポートされました。 (Andrew Dunstan)
  • 列挙型に新たな格納可能値を加える際に、無かったら加える、という書き方ができるようになります。

  • 全てのユーザにデフォルト設定を与える ALTER ROLE ALL SET ... 構文が追加されました。 (Peter Eisentraut)
  • 全てのデータベースで全てのユーザに影響を与えます。

  • ALTER RULE .. RENAME 構文がサポートされました。 (Ali Dar)
VIEW
  • マテリアライズドビューが使用可能となりました。 (Kevin Grittner)
  • 元テーブルを毎回アクセスする通常のビューと違い、マテリアライズドビューは、実体のあるテーブルを作成時またはリフレッシュ時に作り、ビューへのアクセス時には実体テーブルが参照されます。

    差分リフレッシュや、元テーブルへのアクセスに連動した自動更新、元テーブルに対するクエリにおける暗黙的なマテリアライズドビュー参照には対応していません。

  • 単純なビューは自動で更新可能となりました (Dean Rasheed)
  • 一つの元テーブルからなる単純なビューは、デフォルトで更新可能となります。INSERT、UPDATE、DELETE が可能で、元テーブルが更新されます。

    より複雑なビューの更新には、従来同様に INSTEAD OF トリガや INSTEAD ルールを定義する必要があります。

  • CREATE RECURSIVE VIEW 構文が追加されました。 (Peter Eisentraut)
  • 機能的にはビュー定義の中で WITH RECURSIVE 構文による再帰処理を記述するのと同じですが、よりシンプルに記述することが可能となります。

  • 参照元のテーブル名変更、カラム名変更、カラム追加削除があった場合についてビュー、ルールの定義表示が改善されました。 (Tom Lane)
  • psql の d+ が出力するビュー定義が不明瞭で、CREATE VIEW 文に投入すると、「ERROR: column reference "..." is ambiguous」といったエラーが生じることがあり、これを防ぐようになりました。

データ型

  • ラージオブジェクトの最大サイズが 2GB から 4TB に拡張されました。 (Nozomi Anzai, Yugo Nagata)
  • 64bit 対応したラージオブジェクトアクセス関数も追加されました。

  • T区切りを使った ISO形式のタイムゾーン付きタイムスタンプ型に、タイムゾーンのテキスト表記(「America/Chicago」など)が使用可能となりました (Bruce Momjian)
  • (例:以下は 9.2 ではエラーとなる)
    =# SELECT '2013-05-12T12:12:13 America/Chicago'::timestamptz;
          timestamptz
    ------------------------
     2013-05-13 02:12:13+09
    
JSON型
  • JSON 値から要素を抽出する関数と演算子がいくつか追加されました。 (Andrew Dunstan)
  • JSON 値を行に変換できるようになりました。 (Andrew Dunstan)
  • スカラデータ、行、hstore型の値を JSON に変換する関数が追加されました (Andrew Dunstan)

関数

  • array_remove()、array_replace() 関数が追加されました。 (Marco Nenciarini, Gabriele Bartolini)
  • contat()、format() 関数が、VARIADIC ラベルの付いた引数を扱えるようになりました。 (Pavel Stehule)
  • (例)
    =# select format('%2$s, %1$s', variadic array[1, 2]);
     format
    --------
     2, 1
    
  • format() 関数が フィールド幅と左右アラインメントオプションを指定できるようになりました。 (Pavel Stehule)
  • (例)
    =# SELECT format('|%-10s|', 'foo');
        format
    --------------
     |foo       |
    
  • to_char()、to_data()、to_timestamp() 関数にて 紀元前の値を適切に扱えるようになりました。 (Bruce Momjian)
  • これまでは、誤っているか、紀元後との一貫性に欠けた振る舞いをしていました。

  • to_data()、to_timestamp() 関数が ISO表記と Gregorian week/day 表記が混在しているときに適切な結果を返すようになりました。 (Bruce Momjian)
  • pg_get_viewdef() 関数の出力が SELECT 句の対象リストと FROM 句の項目ごとに改行するようになりました。 (Marko Tiikkaja)
  • pg_get_viewdef() 関数はビュー定義を出力するもので psql の d+ 表示やpg_dump 出力に使われます。

  • map_sql_value_to_xml_value() 関数が、ドメインタイプの値を出力するのにそれらのベースタイプと同じ方法をとるようになりました。 (Pavel Stehule)
  • boolean のような特定の組み込みタイプには特別な整形規則がありますが、これらのタイプにも適用されます。

サーバサイド言語

PL/pgSQL
  • PL/pgSQL で RETURN 文に複合型表現を使えるようになりました (Asif Rehman)
  • これまでは複合型を返すには、RETURN で変数を指定するほかありませんでした。

  • PL/pgSQL で制約違反に関する詳細情報を項目ごと参照できるようになりました。 (Pavel Stehule)
  • PL/pgSQL で COPY 件数を参照することができるようになりました。 (Pavel Stehule)
  • PL/pgSQL の関数中で COPY を実行した後 、「GET DIAGNOSTICS x = ROW_COUNT」として件数値を取得できます。

  • PL/pgSQL で予約されていないキーワードは識別子としてどの場所でも使えるようになりました。 (Tom Lane)
  • 名目上は未予約なキーワードであっても、文法上の特定の場所では識別子に使うにはクオートが必要となっていました。

PL/Python
  • PL/Python で結果オブジェクト文字列のハンドラが追加されました。 (Peter Eisentraut)
  • plpy.debug(rv) として内容を確認するのが容易になります。

  • PL/Python が OID 値を適切な Python の数値型に変換するようになりました。 (Peter Eisentraut)
  • PL/Python にて、SPI エラーが(raise 命令などで)明示的に出された際に、内部的な SPI エラーと同様に扱うようになりました。 (Oskari Saarenmaa and Jan Urbanski)

SPI

  • サブトランザクションのアボートで SPI 行セットがリークしてしまうのを防ぐようになりました。 (Tom Lane)
  • コアSPIコードが失敗したサブトランザクションの最後で、SPIコマンド実行関数によって作成された全ての行セットを開放するようになります。これにより、SPI利用コードがエラーリカバリコードの中で行セットを自ら追跡して解
    放する必要がなくなります。

    SPI_freetuptable() 関数は2重解放を防ぐようになっており、既存のコードが本変更により使えなくなってしまうことはありません。

  • SPI関数が COPY処理行数を参照できるようになりました。 (Pavel Stehule)

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

  • サーバが接続を受け付けるかを確認する pg_isready ユーティリティが追加されました。 (Phil Sorber)
  • pg_restore 、clusterdb、reindexdb および vacuumdb コマンドが複数の--table 引数を受け付けることができるようになりました。 (Josh Kupershmidt)
  • pg_dump の --table オプションと同様に働きます。

  • pg_dumpall、pg_basebackup、および pg_receivexlog に --dbname オプションが追加されました。 (Amit Kapila)
  • 以下のようにデータベース接続文字列を指定するオプションとなります。

    # pg_dumpall --dbname "dbname=template1 user=postgres password=pass" > out.dump
    

  • libpq の関数に接続情報を返す PQconninfo() が追加されました。 (Zoltán Böszörményi, Magnus Hagander)
  • 既存の接続から、接続オプションを取り出すことできます。

psql
  • psql のタブ補完とパターンサーチがより効率的になるように関数コスト設定が調整されました。 (Tom Lane)
  • psql のタブ補完の対応範囲が増えました。 (Jeff Janes, Dean Rasheed, Peter Eisentraut, Magnus Hagander)
  • psql の --single-transaction オプションが標準入力からの読み込みでも利用可能となりました。 (Fabien Coelho, Robert Haas)
  • これまではファイルから読み込むときしか利用できませんでした。

  • psql が旧バージョンのサーバに接続する際に警告を出さなくなりました。 (Peter Eisentraut)
  • psql よりも新しいバージョンに接続する際には、従来通り警告が出ます。

psql/バックスラッシュコマンド
  • psql に watch コマンドが追加されました。 (Will Leinweber)
  • 指定秒数毎に繰り返し SQL コマンドを実行します。

    (例)
    =# watch 10 SELECT granted, count(*) FROM pg_locks GROUP BY granted;
    Watch every 2s  Sun Sep 15 18:23:31 2013
    
     granted | count
    ---------+-------
     f       |     4
     t       |    54
    (2 rows)
    
    Watch every 2s  Sun Sep 15 18:23:41 2013
    
     granted | count
    ---------+-------
     f       |     4
     t       |    49
    (2 rows)
    ^C
    
  • psql に gset コマンドが追加されました。 (Pavel Stehule)
  • 実行した SQL の結果を psql の変数に格納します。

    (例)
    =# select now() AS a;
                   a
    -------------------------------
     2013-09-15 18:29:59.719432+09
    (1 row)
    
    =# gset
    =# echo :a
    2013-09-15 18:30:05.148331+09
    
  • psql の conninfo コマンドで SSL 情報も出力されるようになりました。 (Alastair Turner)
  • psql の df+ で Security カラムが追加されました。 (Jon Erdman)
  • 関数が SECURITY INVOKER であるか、SECURITY DEFINER であるかが出力されます。

  • psql の l コマンドがデータベース名パターンに対応しました。 (Peter Eisentraut)
  • psql で有効な接続がないときに connect コマンドがデフォルトで使えなくなりました。 (Bruce Momjian)
  • サーバクラッシュしたケースが該当します。

  • psql の g コマンドで SQL が失敗した後に、適切に状態を初期化するようになりました。 (Tom Lane)
  • g コマンドは SQL実行結果をファイルまたはパイプに出力するものです。これまでは以降の SQLコマンド実行が同ファイルに予想しえない形で続いていました。

psql/出力
  • psql で latex-longtable 出力形式が追加されました。 (Bruce Momjian)
  • この形式は複数ページにわたるテーブルを扱えます。

  • psql の latex 出力形式において border=3 出力モードが追加されました。 (Bruce Momjian)
  • psql にて、タプルのみ、かつ、拡張テーブル形式モードであるとき、0行結果に対して「No rows」を出力しなくなりました。 (Peter Eisentraut)
  • 以下のように 0行であるときには何も出力されないようになります。psql を使ったシェルスクリプトにおいては非互換の変更といえます。

    $ psql -t -x -c 'SELECT * FROM t0 WHERE false'
    $
    

  • psql の unaligned で 拡張テーブル形式モードであるとき、0行結果に対して空行を出力しなくなりました。 (Peter Eisentraut)
  • 以下のように 0行であるときには何も出力されないようになります。これまでは空行が1行出力されていました。

    $ psql -A -x -c 'SELECT * FROM t0 WHERE false'
    $
    

pg_dump
  • pg_dump に複数テーブルを並行処理する --jobs オプションが追加されました。 (Joachim Wieland)
  • pg_dump が関数を出力する際により予想可能な順番で出力されるようになりました。 (Joel Jacobson)
  • pg_dump が出力する tarファイルが POSIX に準拠するようになりました。 (Brian Weaver, Tom Lane)
  • pg_dump にデータベース名を指定する --dbname オプションが追加されました。 (Heikki Linnakangas)
  • 他のクライアントコマンドと一貫性をもたせるための追加です。

initdb
  • initdb が新たにデータベースクラスタディレクトリを作る際に fsync をを行うようになりました。 (Jeff Davis)
  • initdb を行って間もなくクラッシュした場合にデータが保護されます。--nosync オプションを与えることで fsync をしないようにもできます。

  • initdb に --sync-only オプションが追加されました。 (Bruce Momjian)
  • データベースクラスタディレクトリをストレージに同期書き込みさせます。pg_updateユーティリティの中から使われます。

  • initdb がデータベースクラスタディレクトリの場所がマウントポイントのトップディレクトリであるとき、警告を出すようになりました。 (Bruce Momjian)

ソースコード

  • 拡張モジュールでバックグラウンドワーカプロセスを追加するための基盤が用意されました。 (Álvaro Herrera)
  • 集中化されたタイムアウト処理の API が用意されました。 (Zoltán Böszörményi)
  • libpgcommon ライブラリが作られ、pg_malloc() などの関数がその中に移されました。 (Álvaro Herrera, Andres Freund)
  • libpgport はポータビリティ関連のコードだけになります。

  • 構造体の中に組み込むリストのインタフェースがサポートされました。 (Andres Freund)
  • ヘッダファイル ilist.h が追加されました。

  • SA_RESTART が SIGALRM を含むすべてのシグナルに使われるようになりました。 (Tom Lane)
  • errcontext() のメッセージが翻訳されているとき正しいテキストドメインが確実に使われるようになりました。 (Heikki Linnakangas)
  • クライアント側のメモリ割り当て関数名が標準化されました。 (Tom Lane)
  • コンパイル時にいくつかのコンパイル時定数の条件により失敗する静的なアサーションがサポートされました。 (Andres Freund, Tom Lane)
  • クライアント側コードで Assert() がサポートされました。 (Andrew Dunstan)
  • ereport() と elog() が戻らないことをコンパイラに知らせるように修飾されました。 (Peter Eisentraut, Andres Freund, Tom Lane, Heikki Linnakangas)
  • 再帰テストの出力比較ユーティリティに PG_REGRESS_DIFF_OPTS を通してオプションを渡せるようになりました。 (Peter Eisentraut)
  • CREATE INDEX CONCURRENTLY の隔離性テストが追加されました。 (Abhijit Menon-Sen)
  • int2、int4 型定義が削除されました。代替に int16、int32 が使われます。 (Peter Eisentraut)
  • Mac OS X に対する install-strip が修正されました。 (Peter Eisentraut)
  • configure オプション --disable-shared が廃止されました。 (Bruce Momjian)
  • pgindent が Perl で書き直されました。 (Andrew Dunstan)
  • PostgreSQL の Perl書式に適合させる Emacsマクロ が提供されました。 (Peter Eisentraut)
  • キーワードを検査するツールが文法が変更されたときにはいつでも実行されるようになりました。 (Tom Lane)
  • UESCAPE 方法が変更され、字句解析テーブルが小さくなりました。 (Heikki Linnakangas)
  • flex、bison の make ルールが集中化されました。 (Peter Eisentraut)
  • 多数の内部関数が void でなく OID を返すように変更されました。 (Dimitri Fontaine)
  • トランザクションコールバックむけに pre-commit、pre-prepare、pre-subcommitイベントが用意されました。 (Tom Lane)
  • データベースオブジェクト説明を生成する pg_identify_object() 関数が追加されました。 (Álvaro Herrera)
  • サーバフック post-ALTER-object が追加されました。 (KaiGai Kohei)
  • 汎用バイナリヒープが実装されました。 (Abhijit Menon-Sen)
  • マージ、アペンド操作でつかわれます。

  • src/timezone/data ファイルの更新に対して、タイムゾーン省略形の変更を発見するツールが作られました。 (Tom Lane)
  • libpq と ecpg ライブラリについて pkg-config がサポートされました (Peter Eisentraut)
  • src/tool/backend ディレクトリが削除されました。 (Bruce Momjian)
  • WAL読み込みのコードが分離されました。 (Heikki Linnakangas, Andres Freund)
  • src/backend/access/transam/xlogreader.c ファイルが新設されました。

  • WAL位置(XLogRecPtr)を表現するのに 32bit整数ペアでなく 64bit整数が使われるようになりました。 (Heikki Linnakangas)
  • PL/Python でプラットフォーム固有のインクルードディレクトリがサポートされました。 (Peter Eisentraut)
  • OS X にて PL/Python がカスタムバージョンの Python でビルドできるようになりました。 (Peter Eisentraut)

追加モジュール

  • 他の PostgreSQLサーバにアクセスできる Postgres外部データラッパー拡張モジュールが追加されました。 (Shigeru Hanada)
  • 書き込みもサポートされます。

  • pg_xlogdump プログラムが追加されました。 (Andres Freund)
  • WALファイルを読むことができます。

  • pg_trgm 拡張モジュールで正規表現検索にてインデックスが使えるようになりました。 (Alexander Korotkov)
  • pg_trgm のマルチバイト取扱いが改善されました。 (Tom Lane)
  • wcstombs() または towlower() ライブラリ関数を持たないプラットフォームにて、非ASCIIデータの pg_trgm インデックス内容と矛盾した変換が生じていました。pg_upgrade でデータを 9.3 対応させた場合、その後、REINDEX を
    行って正しい検索結果とさせることができます。

    なお、pg_trgm のインデックスでマルチバイトを取り扱うにはソースコード contrib/pg_trgm/trgm.h の「#define KEEPONLYALNUM」をコメントアウトしてビルドする必要があります。

  • pgstattuple 拡張モジュールに pgstatginindex() 関数が追加されました。 (Fujii Masao)
  • GINインデックスの保留リストのサイズを報告します。

    (例)
    =# SELECT * FROM pgstatginindex('idx_gin_t8_tag');
     version | pending_pages | pending_tuples
    ---------+---------------+----------------
           1 |             1 |              5
    (1 row)
    
  • oid2name、pgbench、vacuumlo の各ツールが接続時に fallback_application_nameを設定するようになりました。 (Amit Kapila)
  • pg_test_timing コマンドの出力が改善されました。 (Bruce Momjian)
  • pg_test_fsync コマンドの出力が改善されました。 (Peter Geoghegan)
  • 独自のオプションバリデータを持つ dblink の外部データラッパーdblink_fdw が追加されました。 (Shigeru Hanada)
  • dblink_fdw を使って接続先を定義する場合、固定的な接続オプションリストを使うのでなく、libpq ライブラリにどのオプションがサポートされているか確認されます。

pg_upgrade
  • pg_upgrade がダンプ、リストアを並列で行えるようになりました。 (Bruce Momjian, Andrew Dunstan)
  • データベース群の定義のダンプリストアを並列に行い、また、テーブルスペースごとのデータファイルのコピーを並列に行います。--jobs オプションで並列度を指定することができます。

  • pg_upgrade がカレントディレクトリに Unix-domainソケットを作るようになりました。 (Bruce Momjian, Tom Lane)
  • これはアップグレード中に接続されてしまう危険を減らします。

  • pg_upgrade の --check モードが適切にデフォルト以外のソケットディレクトリを見つけるようになりました。 (Bruce Momjian, Tom Lane)
  • 多数のテーブルがある場合に pg_upgrade の性能が改善されました。 (Bruce Momjian)
  • pg_upgrade のログが実行されたコマンドが見せるように改善されました。 (Álvaro Herrera)
  • pg_upgrade のコピー、リンク中の状態表示が改善されました。 (Bruce Momjian)
pgbench
  • pgbench に --foreign-keys オプションが追加されました。 (Jeff Janes)
  • 標準作成されるテーブルに外部キー制約が付加されます。

  • pgbench が性能統計を一定時間ごとに集約して出力できるようになりました。 (Tomas Vondra)
  • -l オプションと --aggregate-interval オプションを組み合わせて使用します。本機能は Windows では使えません。

    (例:時刻値、トランザクション数、所要時間の合計、二乗和、最小、最大値が記録されます)
    $ pgbench -c 5 -T 20 --aggregate-interval 5 -l > pgbench.out
    $ ls
    pgbench.out  pgbench_log.5803
    $ cat pgbench_log.5803
    1379482943 483 21645765 1462456873587 8038 328469
    1379482948 575 24978959 1269543520163 8325 150283
    1379482953 550 25008263 1402251875331 8254 191985
    1379482958 558 25018548 1355359776780 8286 183956
    
  • pgbench に --sampling-rate オプションが追加されました。 (Tomas Vondra)
  • -l オプションでトランザクションごとの記録を取るときに、指定したパーセンテージでサンプリングして記録することができます。

  • pgbench の初期化モードにおけるメッセージ出力が減りました。 (Robert Haas, Peter Eisentraut)
  • pgbench に -q モードが追加されました。初期化時に 5秒ごとに状況表示します。 (Tomas Vondra)
  • (例)
    $ pgbench -i -q -s 50
    creating tables...
    1781400 of 5000000 tuples (35%) done (elapsed 5.01 s, remaining 9.05 s).
    3388700 of 5000000 tuples (67%) done (elapsed 10.01 s, remaining 4.76 s).
    4799900 of 5000000 tuples (95%) done (elapsed 15.00 s, remaining 0.63 s).
    5000000 of 5000000 tuples (100%) done (elapsed 15.62 s, remaining 0.00 s).
    vacuum...
    set primary keys...
    done.
    
  • pgbench が初期化時に経過時間と所要時間の予測を表示するようになりました。 (Tomas Vondra)
  • pgbench がより大きいスケールファクタを指定できるようになりました。 (Greg Smith)
  • スケールファクタ 20000 を超える場合には、関連するカラムが int型からbigint型に変ります。

ドキュメント

  • EPUB形式ドキュメントに対応しました。 (Peter Eisentraut)
  • FreeBSD カーネル設定の記述が更新されました。 (Brad Davis)
  • WINDOW 関数についての記述が改善されました。 (Bruce Momjian, Florian Pflug)
  • ドキュメントビルドのためのツールの説明に Mac OS X のための項目が加わりました (Peter Eisentraut)
  • commit_delay の記述が改善されました。 (Peter Geoghegan)