
このページでは PostgreSQL 9.1 (2011/07/11リリース)に関する技術情報をお届けします(beta3の段階で作成しています)。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
概要
このリリースのPostgreSQLでは、以下を含む多数の主要機能が追加されます。
- 変更内容の転送を保証する、同期レプリケーションが可能です。
- 外部テーブルのサポートを追加しました。
- 列単位の照合順序のサポートを追加しました。
- PostgreSQLの追加パッケージを簡略化する拡張を追加しました。
- 本物のシリアライザブル隔離レベルを追加しました。
- CREATE TABLE内のUNLOGGEDオプションを使用する、トランザクションログを取らないテーブルをサポートします。
- WITH句内でデータ変更コマンド(INSERT/UPDATE/DELETE)が可能です。
- GiSTインデックスに(演算子で順序付けされた)近傍検索を追加しました。
- SECURITY LABELコマンドとSELinux権限制御のサポートを追加しました。
- PL/Pythonサーバサイド言語を更新しました。
上述の項目については、以下のセクションでより詳しく説明します。
バージョン 9.1 への移行
全ての以前のリリースからデータの移行を行うためには、pg_dumpを使用したダンプ/リストア、または、pg_upgradeの使用が必要です。バージョン9.1には、以前のリリースとの互換性に影響を与える変更がいくつか含まれます。以下の非互換性に注意してください。
文字列の非互換
-
standard_conforming_stringsのデフォルト値はonに変更されました。(Robert Haas)
長い間存在した、SQL標準との非互換性がなくなります。escape_string_warningによって警告が出ていました。
文字列がエスケープを必要とする場合、E” 形式の文字列を使うのが適切です。また E” 形式の文字列には、この変更による影響はありません。
キャスティングの非互換
-
複合型に対する、関数スタイルのキャストが禁止されました。(Tom Lane)
代わりに CAST コマンドや :: 演算子を使ってください。
例:
=# CREATE TYPE ct_test1 AS (id int, c1 text, t1 timestamp); =# CREATE TABLE test1 (id int primary key, v ct_test1); =# INSERT INTO test1 VALUES (1, (1, 'hello', now()));
- 9.0 の動作
-
=# SELECT text(v) FROM test; text ------------------------------------------ (1,hello,"2011-06-13 09:44:31.11951+09")
- 9.1 の動作
-
=# SELECT text(v) FROM test1; ERROR: function text(ct_test) does not exist HINT: No function matches the given name and argument types. You might need to add explicit type casts.
-
配列型を元にしたドメイン型に対してキャスト時のチェックが厳しくなりました。(Tom Lane)
以下のように型に合わないデータはエラーになります。
=# CREATE DOMAIN numeric42 AS NUMERIC(4,2)[1]; =# SELECT '{146.8944}'::numeric42; ERROR: numeric field overflow
しかし、9.0 以前で以下のように関数を通したときチェックが働きませんでした。
=# CREATE FUNCTION mul_num(n numeric42) RETURNS numeric42 LANGUAGE plpgsql AS $$ DECLARE n2 numeric42; BEGIN n2[1] := n[1] * n[1]; RETURN n2; END; $$;
(9.0以前 – 桁数制限を越えて結果が出力されてしまう)
=# SELECT mul_num(ARRAY[12.12]) mul_num ------------ {146.8944} (1 row)
(9.1)
=# SELECT mul_num(ARRAY[12.12]); ERROR: numeric field overflow
配列に関する非互換
- string_to_array()は長さ 0 の文字列に対して、空の配列を返すように変更されました。以前は NULL 値を返していました。(Pavel Stehule)
-
string_to_array() は NULLセパレータによって、文字列を文字に分割するように変更されました。(Pavel Stehule)
以前は NULL を返していました。
オブジェクトの変更に関する非互換
-
BEFOREトリガー、AFTERトリガーの不適切な検査が修正されました。(Tom Lane)
現在トリガーは BEFORE、AFTER、INSTEAD OF action の3つのケースで駆動できます。トリガー関数の作者は、そのロジックが3つすべてのケースで正常に動作するか確認する必要があります。
- ロールのコメントを設定するには、スーパーユーザか CREATEROLE 権限が必要になります。(Tom Lane)
サーバ設定に関する非互換
-
pg_last_xlog_receive_location() が返すWALロケーションが戻らないようになりました。(Fujii Masao)
以前の pg_last_xlog_receive_location() は、ストリーミングレプリケーションで wal receiver が再起動されると、戻ることがありました。
-
レプリケーション接続のログ記録は log_connections に従うようになりました。(Magnus Hagander)
以前はレプリケーション接続は常に記録されていました。
PL/pgSQL 手続き言語
-
PL/pgSQL でパラメータなしの RAISE コマンドが、付随する例外ブロックで捕捉できるようになりました。(Piyush Newe)
以前は、RAISE を捕捉したブロック内で再度 RAISE を行った場合に、同スコープ内で捕捉ができず、Oracle の PL/SQL の振る舞いと異なっていました。
ソースの src/test/regress/sql/plpgsql.sql に動作例を示す raise_test()関数が含まれます。
-
PL/pgSQL のエラー行を報告する処理が、他のPL言語と一致するように調整されました。(Pavel Stehule)
以前は PL/pgSQL は関数ボディの始まりにある空行を無視していました(数えていなかった)。これは他の言語と矛盾していたので、この特別なケースは削除されました。
-
PL/pgSQL の関数定義で IN、OUT パラメータに衝突がある場合にエラーが出るようになりました。
これまでは衝突を検知できず、OUT パラメータだけが参照されていました。
(9.1 でのエラー発生例)
=# CREATE FUNCTION inout_test(IN foo int, OUT foo int) LANGUAGE plpgsql AS $$ DECLARE foo int := 1; BEGIN foo := 2; END; $$; ERROR: parameter name "foo" used more than once CONTEXT: compilation of PL/pgSQL function "inout_test" near line 1
-
PL/pgSQL変数の型修飾子が SQLパーサから見えるようになりました。
型修飾子とは、varchar(10) において長さ制限を示す 10 などの、データ型のパラメータのことです。これまで型修飾子は、割り当て時には機能していましたが、その他においては無視されていました。これらがよりテーブルカラム同様の振る舞いをするようになりました。本変更でほとんどの場合、目に見える変化はないと予想されますが、PL/pgSQL 関数から実行される SQLコマンド結果に微妙な変化をもたらす可能性があります。(Tom Lane)
その他の非互換
-
pg_stat_reset() によりすべてのデータベースレベルの統計がリセットされます。(Tomas Vondra)
これまでは、いくつかの pg_stat_database カウンタがリセットされていませんでした。
- infomation_schema.triggers のいくつかのカラムは、新しいSQL標準名に合致するように修正されました。(Dean Rasheed)
- ECPG のカーソル名は大文字小文字を区別しないで扱われます。(Zoltan Boszormenyi)
PostgreSQL 9.1 の変更点
サーバ
パフォーマンス
-
CREATE TABLE 文に UNLOGGED を指定して、トランザクションログを書き出さないテーブルを作ることができるようになりました。(Robert Haas)
これにより通常テーブルよりも優れた更新性能をもつテーブルを実現できます。一方で、クラッシュに対して安全ではありません。サーバクラッシュ時には変更内容が消えてしまいます。また、レプリケーションサーバに変更が伝播しません。
-
FULL OUTER JOIN で hash join が使えるようになりました。また、LEFT OUTER JOIN あるいは RIGHT OUTER JOIN の両側でハッシュをとれるようになりました。(Tom Lane)
従来は FULL OUTER JOIN には merge join しか実施できませんでした。また、LEFT OUTER JOIN と RIGHT OUTER JOIN は NULL を含むことのできる片側のみでハッシュが使えました。本変更により、実行プラン最適化の幅が広がります。
- 高負荷のシステムで、重複した fsync 要求を合併して実行するようになりました。(Robert Haas, Greg Smith)
-
commit_siblings 設定の性能が改善されました。(Greg Smith)
より少ないオーバーヘッドで commit_siblings を使うことができます。
- テキスト全文検索における大規模な ispell 辞書に必要なメモリ量が減りました。(Pavel Stehule, Tom Lane)
オプティマイザ
-
継承テーブルへの問い合わせで有意なソート済結果を返せるようになりました。(Greg Stark, Hans-Jurgen Schonig, Robert Haas, Tom Lane)
これにより、テーブル継承に対し ORDER BY、LIMIT、あるいは MIN、MAX を使うときに、より良い実行プランの最適化ができるようになります。具体的には各子テーブルで top-N ソートを行い、その結果を Merge Append するという実行プランが選択できるようになりました。
-
継承テーブルへの問い合わせで MIN/MAX 関数の最適化ができるようになりました。(Tom Lane)
継承テーブルへの問い合わせであっても、インデックスがあるとき、Aggregate でなく、Sort と Limit 1 の処理を選択できるようになります。
- 集約とウィンドウ関数についてコスト見積もりが改善されました。(Tom Lane)
- GINインデックスについてコスト見積もりが改善されました。(Teodor Sigaev)
認証
-
pg_hba.conf にて、ホスト名とホストサフィックス( .example.com など)に対応しました。(Peter Eisentraut)
これまでは IPアドレスと CIDR値のみに対応していました。
-
pg_hba.conf のホスト列にて all キーワードに対応しました。(Peter Eisentraut)
これまでは 0.0.0.0/0 あるいは ::/0 と記述する必要がありました。
-
GSSAPI 指定にて SSPI を通したサーバ認証が可能になりました。(Christian Ullrich)
これにより Windowsサーバーで SSPI認証をするために、Unixベースの GSSAPIクライアントが利用可能になります。
-
Unix-socket 接続をサポートしないプラットフォームでは pg_hba.conf のlocal行を拒絶するようになりました。(Magnus Hagander)
これまでは、そのような行は無視されていました。本変更でサポートされない場合にふさわしい振る舞いとなります。
-
ローカル接続上の ident認証は peer 認証方式として扱われるようになりました。(Magnus Hagander)
後方互換性のため、旧来の記述方法もまだ受け付けられます。
-
peer認証方式では証明書管理メッセージを無視するようになりました。(Tom Lane)
これは 9.1 開発版からの変更内容となります。
この変更は peer認証のコードをシンプルにし、性能を向上させます。これにより peer認証が働かなくなったプラットフォームは、これまで知られている限り、5.0 以前の NetBSD のみです。
モニタリング
-
log_checkpoints = on とした場合にメッセージログにリスタートポイントとチェックポイントについて詳細が出力されるようになりました。(Fujii Masao, Greg Smith)
WALファイルと同期動作についての詳細が記録されるようになります。
-
log_file_mode 設定が追加されました。(Martin Pihlak)
logging_collector設定によるメッセージログ出力についてファイルパーミッションを設定することができます。
統計情報ビュー
- これまではクライアントアドレスだけが報告されていました。(Peter Eisentraut)
-
実行時統計カウンタのビューおよび関数に pg_stat_xact_* が追加されました。(Joel Jacobson)
データベース全体についての現在のトランザクションに限定した情報を返します。
- 最後に実行時統計情報をリセットした時刻が pg_stat_databaseビューと pg_stat_bgwriter ビューに追加されました。(Tomas Vondra)
- 実行時統計情報ビュー pg_stat_*_tables に VACUUM と ANALYZE 回数を表示するカラムが追加されました。(Magnus Hagander)
-
実行時統計情報のビュー pg_stat_bgwriter に buffers_backend_fsync カラムが追加されました。(Greg Smith)
バックエンドが各バッファに fsync を実行した回数をカウントします。
サーバ設定
-
wal_buffers 設定の自動チューニングができるようになりました。(Greg Smith)
デフォルトでは shared_buffers 設定値に基づき自動チューニングが行われます。手動設定もできます。
-
deadlock_timeout、log_min_duration_statement、log_autovacuum_min_duration設定値の最大値が増えました。これまでは最大 35min(35分)でした。(Peter Eisentraut)
より大きな値(〜21億ミリ秒)まで設定できます。
レプリケーションとリカバリ
ストリーミングレプリケーション
-
同期レプリケーションができるようになりました。(Simon Riggs, Fujii Masao)
プライマリを、スタンバイでトランザクション情報をディスクに書くのを待ってからコミットを報告するようにさせるようにできます。プライマリの synchronous_standby_names 設定にしたがって、スタンバイが同期スタンバイであるかが指定されます。同期レプリケーションを有効とするか無効とするかは、トランザクション単位で synchronous_commit 設定により、指定できます。
-
ストリーミングレプリケーションのネットワーク接続を使ってファイルシステムバックアップをスタンバイに送るためのプロトコルが追加されました。(Magnus Hagander, Heikki Linnakangas)
これにより、スタンバイサーバを作る際に手動でファイルシステムバックアップを転送する必要がなくなります。
-
replication_timeout設定が追加されました。(Fujii Masao, Heikki Linnakangas)
指定時間を越えてレプリケーション接続のアイドル状態が続く場合、自動で切断されます。これまでは TCPタイムアウトが経過するまで接続障害が検知できませんでした。これは多くの場合長くて不便でした。
-
コマンドラインツール pg_basebackup が追加されました。(Magnus Hagander)
スタンバイサーバの新設やベースバックアップ作成に利用できます。
-
ロールに REPLICATION権限の属性が追加されました。(Magnus Hagander)
ストリーミングレプリケーションのための参照権限が与えられ、これによりスーパーユーザ(管理者ユーザ)でなくてもレプリケーション接続を開始することができるようになります。
これまではスーパーユーザのみがレプリケーション接続を開始できました。なお、スーパーユーザはデフォルトで本権限を持ちます。
レプリケーションのモニタ
-
WAL sender プロセスの状態を表示するシステムビュー pg_stat_replication が追加されました。(Itagaki Takahiro, Simon Riggs)
プライマリの本ビューから、接続している各スタンバイのレプリケーション状態を見ることができます。
-
システム監視の関数 pg_last_xact_replay_timestamp() が追加されました。(Fujii Masao)
直近にスタンバイに適用されたコミットまたはアボートのトランザクションログレコードがプライマリにおいて生成された時刻を返します。
ホットスタンバイ
-
hot_standby_feedback 設定項目が追加されました。(Simon Riggs)
スタンバイで本設定を有効にすることで、プライマリにおける古い行バージョンの整理を遅延できるようにします。本設定はスタンバイでの長時間クエリがキャンセルされることを防ぐのに役立ちます。
-
システムビュー pg_stat_database_conflicts が追加されました。(Magnus Hagander)
スタンバイサーバにて、データベースごとに原因ごとにキャンセルされたクエリ数がカウントされます。キャンセル理由は DROP TABLESPACE、ロックタイムアウト、スナップショットが古いこと、バッファの Pin(内部ロックの一種)、およびデッドロックのいずれかです。
プライマリサーバ内で単独に発生したキャンセルは含まれません。
-
実行時統計情報のビュー pg_stat_database に conflicts カラムが追加されました。(Magnus Hagander)
データベースで発生したレプリケーションに伴う衝突の回数が示されます。
-
max_standby_streaming_delay と max_standby_streaming_delay の最大値が増やされました。
これまで最大 35min(分)でしたが、ずっと大きい値(〜21億ミリ秒)まで指定できるようになります。
- DROP DATABASE によるリカバリ衝突の報告のためのエラーコード ERRCODE_T_R_DATABASE_DROPPED が追加されました。(Tatsuo Ishii)
リカバリ制御
-
ストリーミングレプリケーションのリプレイ(スタンバイへの適用)を管理する関数が追加されました。(Simon Riggs)
新たに追加された関数は、リプレイを停止する pg_xlog_replay_pause()、再開するpg_xlog_replay_resume()、および状態を表示する pg_is_xlog_replay_paused() の3つです。
-
recovery.conf に pause_at_recovery_target 設定項目が追加されました。(Simon Riggs)
ターゲット時間(あるいは xid、リストアポイント名で指定)に達したとき、リカバリをポーズ状態にできます。希望するリカバリ時点を探すのに有用です。
-
pg_create_restore_point() 関数によりリストアポイントに名前が付けれるようになりました。(Jaime Casanova)
ここで命名したものは recovery.conf の中の recovery_target_name 設定でターゲットとして指定することができます。
-
スタンバイのリカバリで新タイムラインに自動で切り替わることとができるようになりました。(Heikki Linnakangas)
recovery_target_timeline = ‘latest’ であるとき、スタンバイサーバは新たなタイムラインがないか定期的にアーカイブディレクトリを調べます。
マスターサーバのタイムラインが変わっても、レプリケーションを継続できます。別スタンバイサーバが昇格して新たなプライマリサーバとなった場合に有用です。
-
restart_after_crash 設定が追加されました。(Robert Haas)
off にすることで、バックエンドプロセスのひとつがクラッシュした際の自動的なサーバプロセス全体の再起動をさせないようにできます。これにより外部のクラスタ管理ソフトウェアが PostgreSQLを再起動するかどうか制御できるようになります。
-
recovery.conf で postgresql.conf と同じクオート記述のルールが適用されます。(Dimitri Fontaine)
これまでは recovery.conf では全ての値をクオート(’)で囲う必要がありました。
問い合わせ
-
本物の SERIALIZABLE トランザクション隔離レベルが導入されました。(Kevin Grittner, Dan Ports)
これまで、SEIALIZABLE は、ひとつの MVCC スナップショットがそのトランザクションの間ずっと使われることだけを保障しており、ある程度の文書化された例外事項がありました。
REPEATABLE READ トランザクション隔離レベルを指定した場合、従来の SEIALIZABLE の振る舞いをするようになります。
-
INSERT、UPDATE、DELETE 文を WITH 節の中で使えるようになりました。(Marko Tiikkaja, Hitoshi Harada)
これらコマンドで RETURNING を使いデータを続く問い合わせに渡すことができます。
-
WITH 節を INSERT、UPDATE、DELETE 文に付けることができるようになりました。(Marko Tiikkaja, Hitoshi Harada)
以下使用例ではテーブル tbl01 から tbl02 に grp_id = 1 の行を移動します。
WITH moving AS (DELETE FROM tbl01 WHERE grp_id = 1 RETURNING *) INSERT INTO tbl02 SELECT * FROM moving;
-
GROUP BY 節で主キーが指定してある場合には、クエリのターゲットリストに GROUP BY で指定していないカラムも記述できるようになりました。(Peter Eisentraut)
いくつかの他のデータベース製品ではこのような動作ができました。また、主キーが指定されているため、結果が不定となることはありません。
以下のような SQL が実行できるようになります。
=# SELECT * FROM test1 GROUP BY id; id | val ----+----- 2 | bb 1 | aa 3 | cc (3 rows)
-
UNION、INTERSECT、EXCEPT 節の中で DISTINCT を指定できるようになりました。(Tom Lane)
これらの集合演算においては DISTINCT を指定したかのような動作をするのがデフォルトの振る舞いであるため、冗長な指定となりますが、SQL標準では記述することが許されています。
-
RULE を使用した通常の問い合わせで、EXPLAIN ANALYZE での場合と同じスナップショットを使うようになりました。(Marko Tiikkaja)
これまで、EXPLAIN ANALYZE の場合と RULE を伴うクエリの場合とで、微妙に異なるスナップショットを使用していました。EXPLAIN ANALYZE の場合の振る舞いがより論理的と判断されました。
文字列
- カラム単位でのロケール文字列照合に対応しました。(Peter Eisentraut, Tom Lane)
これまでロケールを反映した文字列照合はデータベース単位にしか設定できませんでした。本拡張で、カラム単位に、ドメインに、インデックスに、また、ORDER BY 式に、SQL標準である COLLATE節を使って設定することができます。
以下のように同じテーブルに対して、都度異なるロケールを指定してソートしたりすることができます。なお、ロケール対応状況は OS に依存します。
=# CREATE COLLATION c_c (LOCALE = 'C'); =# CREATE COLLATION c_en (LOCALE = 'en_US.UTF-8'); =# SELECT v FROM test2 ORDER BY v COLLATE c_c; -- 文字コード順 v ----- ABC XYZ abc xyz (4 rows) =# SELECT v FROM test2 ORDER BY v COLLATE c_en; -- 英語辞書順 v ----- abc ABC xyz XYZ (4 rows)
オブジェクト操作
-
追加モジュール(contrib ツール等)をコマンドで管理できるようになりました。(Dimitri Fontaine, Tom Lane)
「CREATE EXTENTION」「ALTER EXTENTION」「DROP EXTENTION」コマンドで追加提供のモジュールの管理が行えます。これにより、提供されるオブジェクト群を導入するアドホックな方式を置き換えます。
-
外部テーブルに対応しました。(Shigeru Hanada, Robert Haas, Jan Urbanski, Heikki Linnakangas)
これによりデータベースの外部に格納されたデータを PostgreSQL のデータと同じように扱うことができます。しかしながら、現時点の外部テーブル機能は、参照のみアクセスしかできません。
- enumデータ型に ALTER TYPE 文で新たな値を追加できるようになりました。(Andrew Dunstan)
-
ALTER TYPE … ADD/DROP/ALTER/RENAME ATTRIBUTE … という構文が追加されました。(Peter Eisentraut)
これにより複合型を修正することができます。
例 =# CREATE TYPE comp_t AS (x int ,y int); CREATE TYPE =# ALTER TYPE comp_t ALTER ATTRIBUTE x TYPE float; ALTER TYPE =# ALTER TYPE comp_t ALTER ATTRIBUTE y TYPE float; ALTER TYPE =# ALTER TYPE comp_t ADD ATTRIBUTE z float; ALTER TYPE
ALTER
-
ALTER TYPE に RESTRICT、CASCADE オプションを与えることができます。(Peter Eisentraut)
これにより ALTER TYPE … ADD/DROP/ALTER/RENAME ATTIBUTE の振る舞いを変えることができます。RESTRICT を指定した場合の動作がデフォルトでしたが、CASCADE を指定して、その複合型に型付けされたテーブルがある場合には変更が伝播するようになりました。
例
=# CREATE TYPE comp_t AS (x int, y, int, flg boolean); CREATE TYPE =# CREATE TABLE comp_tbl OF comp_t; CREATE TABLE =# INSERT INTO comp_tbl VALUES (10, 10, true); INSERT 0 1 # ALTER TYPE comp_t DROP ATTRIBUTE flg RESTRICT; ERROR: cannot alter type "comp_t" because it is the type of a typed table HINT: Use ALTER ... CASCADE to alter the typed tables too. =# ALTER TYPE comp_t DROP ATTRIBUTE flg CASCADE; ALTER TYPE
-
ALTER TABLE … {OF .. | NOT OF} 構文に対応しました。(Noah Misch)
型付きテーブルを ALTER TABLE .. NOT OF で単独定義されたテーブルに変更することができます。また、単独に定義済みのテーブルを後から複合型に結びつけることができます。
複合型に結びついた型付きテーブルを作る
=# CREATE TABLE test4 OF comp_a; CREATE TABLE
複合型の束縛を解除
=# ALTER TABLE test4 NOT OF; ALTER TABLE
再び型付きにする
=# ALTER TABLE test4 OF comp_a; ALTER TABLE
-
ALTER … SET SCHEMA 構文が、より多種のデータベースオブジェクトに対応しました。(Dimitri Fontaine)
CONVERSION、OPERATOR CLASS、OPERATOR FAMILIES、TEXT SEARCH CONFIGRATION、TEXT SEARCH DICTIONARY、TEXT SEARCH PARSER、TEXT SEARCH TEMPLATE に対応しています。
CREATE/ALTER TABLE
-
Add ALTER TABLE … ADD UNIQUE/PRIMARY KEY USING INDEX という構文が追加されました。
既存インデックスを使ってユニーク制約や主キー制約を追加することができるようになりました。CREATE INDEX CONCURRENTLY で同時作成したインデックスにも摘要できます。
これまで主キー用のインデックスをロック待ちなしに再作成するよい方法がありませんでしたが、この追加により実現できるようになります。
-
ALTER TABLE で外部キーを検査なしで追加できるようになりました。(Simon Riggs)
外部キー制約は新たなオプション NOT VALID を持ちます。NOT VALID である場合には値のチェックが行われません。後で、ALTER TABLE .. VALIDATE CONSTRAINT コマンドで有効にしますとそこから値のチェックが行われるようになります。
例
=# SELECT * FROM test5; id | x -----+----- 100 | 1 101 | 3 (2 rows) =# SELECT * FROM test5m; id | v ----+------ 1 | xxxx 2 | xxxx (2 rows) =# ALTER TABLE test5 add constraint "test5_x_fkey" FOREIGN KEY (x) REFERENCES test5m(id) NOT VALID; ALTER TABLE =# ALTER TABLE test5 VALIDATE CONSTRAINT "test5_x_fkey"; ERROR: insert or update on table "test5" violates foreign key constraint "test5_x_fkey" DETAIL: Key (x)=(3) is not present in table "test5m". =# INSERT INTO test5m VALUES (3, 'xxxxx'); INSERT 0 1 =# ALTER TABLE test5 VALIDATE CONSTRAINT "test5_x_fkey"; ALTER TABLE
-
ALTER TABLE … SET DATA TYPE で不要なテーブル書き換えを避けることができるようになりました。(Noah Misch, Robert Haas)
たとえば、varchar型から text型への変更でテーブルの書き換えは必要なくなります。しかしながら、カラム長を増やす場合には必要となります。
-
CREATE TABLE … IF NOT EXISTS 構文が追加されました。(Robert Haas)
テーブルがない場合だけテーブルを作るという処理をエラーを出さずに行えます。
-
二つのバックエンドプロセスが同時に同じテーブルに親テーブルを追加する場合に “tuple concurrently updated” エラーが発生する可能性があったものが修正されました。(Robert Haas)
同時に子テーブルが更新されるのを防ぐため、ALTER TABLE 文は、親テーブルに対してより強いロックを取るようになります。
アクセス制御
-
SECURITY LABEL 文が追加されました。(KaiGai Kohei)
セキュリティラベルをデータベースオブジェクトに設定することができます。
ユーティリティ操作
-
トランザクションレベルの勧告的ロックが追加されました。(Marko Tiikkaja)
これまでのセッションレベルの勧告的ロックと似ていますが、トランザクション終了時点で自動的にロックが解放されます。
-
TRUNCATE … RESTART IDENTITY 文でテーブルに付随するシーケンスをトランザクションにしたがって再初期化できるようになりました。(Steve Singer)
RESTART IDENTITY オプション自体は以前からありましたが、トランザクション中断時にシーケンスがロールバックしない動作でした。
例
=# CREATE TABLE test6 (id serial, v text); =# INSERT INTO test6 (v) VALUES ('A'), ('B'); =# SELECT * FROM test6; id | v ----+--- 1 | A 2 | B (2 rows) =# BEGIN; =# TRUNCATE test6 RESTART """""""""""""""""""""""""""IDENTITY; """"""""""""""""""""""""""" =# INSERT INTO test6 (v) VALUES ('a'); =# SELECT * FROM test6; id | v ----+--- 1 | a (1 row) =# ABORT; =# INSERT INTO test6 (v) VALUES ('x'); =# SELECT * FROM test6; postgres=# SELECT * FROM test6; id | v ----+--- 1 | A 2 | B 3 | x (3 rows)
ここで 9.0 だと以下のようになってしまいました。
id | v ----+--- 1 | A 2 | B 2 | x
COPY
-
COPY TO、COPY FROM に ENCODING オプションが追加されました。(Hitoshi Harada, Itagaki Takahiro)
コピーファイルのエンコーディングをクライアントエンコーディングとは別に指定できるようになります。
-
両方向の COPYプロトコルがサポートされました。(Fujii Masao)
これはいまのところストリーミングレプリケーションだけで使われます。
EXPLAIN
-
EXPLAIN VERBOSE の出力で Function Scan のときに関数呼び出し式を表示するようになりました。(Tom Lane)
例
=# EXPLAIN VERBOSE SELECT id FROM f2(1); QUERY PLAN ------------------------------------------------------------------ Function Scan on public.f2 (cost=0.25..10.25 rows=1000 width=4) Output: id Function Call: f2((1)) (3 rows)
VACUUM
-
VACUUM FULL VERBOSE と CLUSTER VERBOSE で、より詳細を出力するようになりました。(Itagaki Takahiro)
有効タプル・デッドタプルの数、所要時間、CLUSTER が インデックスを使ったかどうか、などが出力されます。これまでは「VACUUM VERBOSE」のときだけ、詳しい出力がされていました。
-
自動VACUUM がロック待ちするのを防ぐようになりました。(Robert Haas)
ロックが取れない場合には後で再試行するようになります。
CLUSTER
- CLUSTER が、インデックスを全スキャンする方法のほかに、テーブルをソートする方法を選択するようになりました。テーブル状態から、負荷の低いと思われるほうを自動的に選択します。(Leonardo Francalanci)
インデックス
-
GiSTインデックスに最近傍探索が追加されました。(Teodor Sigaev, Tom Lane)
GiSTインデックスを、ある要素に近いもの上位いくつかを取り出す問い合わせに使うことができます。
例
=# CREATE TABLE test8 (id int, p point); =# CREATE INDEX ON test8 USING gist (p); =# INSERT INTO test8 SELECT g, point(random(), random()) FROM generate_series(1, 10000) as g; =# EXPLAIN SELECT * FROM test8 ORDER BY point(0.5,0.5) <-> p ; QUERY PLAN ---------------------------------------------------------------------------------- Limit (cost=0.00..0.35 rows=5 width=20) -> Index Scan using test8_p_idx on test8 (cost=0.00..696.25 rows=10000 width=20) Order By: (p <-> '(0.5,0.5)'::point) (3 rows)
-
NULL や空要素に対して GINインデックスが使えるようになりました。(Tom Lane)
これにより完全な GIN インデックススキャンができます。また、一部例外的な場合に GINスキャンが失敗するケースが修正されました。
例
=# CREATE TABLE test9 (id int primary key, a text[]); =# CREATE INDEX idx_test9_a ON test9 USING gin (a); =# INSERT INTO test9 VALUES (1, ARRAY[NULL]::text[]);
ここで 9.0.x の場合は GINインデックスがあるために以下エラーになりました。
ERROR: array must not contain null values
-
GIN インデックスで項目の重複についてよりよく認識できるようになりました。(Tom Lane)
不要なインデックス全スキャンを回避できるケースで特に、インデックススキャンの負荷を減らします。
-
GiST インデックスが完全にクラッシュセーフになりました。(Heikki Linnakangas)
これまでは稀に REINDEX を必要とすることがありました。
データ型
-
配列値のハッシュ取得がサポートされました。(Tom Lane)
これによりクエリ最適化の幅が広がります。たとえばキーが配列であるときにも Hash Join が適用できるようになります。
-
すべてのカラム型がソート可能でない限り、複合型をソート可能として扱わないようになりました。(Tom Lane)
これは、ソートなしの問い合わせを実行する場合に、実行時に比較関数の障害を確認できないというケースを回避します。ALANYZE においてもそのような複合型に対して不適切な統計情報方法を試みないようになります。
-
NUMERIC型の物理サイズが小さくなりました。多くの場合、2バイトヘッダが使われるようになります。(Robert Haas)
これまでは、常に4バイトヘッダが使われていました。これによりディスク領域を節約できます。
-
MONEY型をMONEY型で割る演算がサポートされました。(Andy Balholm)
例
=# SELECT 10000::money / 2000::money; ?column? ---------- 5 (1 row)
- バイナリモードの入出力で void型を使えるようになりました。(Radoslaw Smogura)
-
幾何演算子での斜辺の計算が改善されました。(Paul Matthews)
不必要なオーバーフローを避け、おそらくより正確になります。
キャスト
- MONEY型とNUMERIC型との型キャストに対応しました。(Andy Balholm)
-
テーブル行型から、テーブルの元となったデータ型へキャストができるようになりました。(Peter Eisentraut)
なお、逆向きのキャストには対応していません。
例
=# CREATE TYPE comp_x AS (id1 int, id2 int); =# CREATE TABLE t_comp_x OF comp_x; =# SELECT ('(1,2)'::t_comp_x)::comp_x; comp_x -------- (1,2) (1 row) =# SELECT ('(1,2)'::comp_x)::t_comp_x; ERROR: cannot cast type comp_x to t_comp_x
XML
- XML関数に XMLEXISTS と xpath_exists() が追加されました。(Mike Fowler)
-
XML関数 functions xml_is_well_formed()、xml_is_well_formed_document()、xml_is_well_formed_content() が追加されました。(Mike Fowler)
これらは整形式 XML であるかチェックします。これまで追加モジュール contrib/xml2 として提供されていたものです。
関数
-
C言語の printf()関数に似た format()関数が追加されました。(Pavel Stehule, Robert Haas)
いまのところ、文字列、SQLリテラル、識別子の整形に対応しています。数値の整形には対応していません。
例
=# SELECT format('array:%L table:%I', ARRAY[1,2,3], 'Tbl01'); format ------------------------------- array:'{1,2,3}' table:"Tbl01"
-
concat()、concat_ws()、left()、right()、reverse()関数が追加されました。(Pavel Stehule)
これらは他のデータベース製品にある関数で、互換性を改善します。
- サーバ側のバイナリファイル内容を取得する pg_read_binary_file()関数が追加されました。(Dimitri Fontaine, Itagaki Takahiro)
- pg_read_file()関数に引数がひとつだけの版が追加されました。ファイル内容全体を取得します。(Dimitri Fontaine, Itagaki Takahiro)
- array_to_string()、string_to_array()関数の3引数版が追加されました。新たな引数でNULLの扱いを指定します。(Pavel Stehule)
オブジェクト情報関数
-
pg_describe_object()関数が追加されました。(Alvaro Herrera)
データベースオブジェクトを人間が読める記述にした文字列を返します。pg_classテーブルの OID、オブジェクトの OID、副オブジェクトID で指定します。pg_dependテーブルの内容を読み取るのに役立ちます。
例
=# SELECT pg_describe_object(classid,objid,objsubid) AS obj, pg_describe_object(refclassid,refobjid,refobjsubid) AS refobj, deptype FROM pg_depend; : (前略) -[ RECORD 5954 ]------------------------------------------------------------ obj | type tbl01 refobj | table tbl01 deptype | i -[ RECORD 5955 ]------------------------------------------------------------ obj | type tbl01[] refobj | type tbl01 deptype | i -[ RECORD 5956 ]------------------------------------------------------------ obj | table tbl01 refobj | schema public deptype | n -[ RECORD 5957 ]------------------------------------------------------------ : (後略)
-
組込みの演算子とその元となる関数のコメントが更新されました。(Tom Lane)
どの演算子の処理を実装した関数であるかが記述されます。
-
設定変数 quote_all_identifiers が追加されました。(Robert Haas)
EXPLAIN や pg_get_viewdef()などのシステムカタログ関数で全ての識別子をクオートして出力するようにできます。スキーマ定義を各種ツールや他のデータベース製品むけに書き出すとき、異なるクオート処理ルールへの対応を容易にします。
-
information_schema.sequence システムビューにカラムが追加されました。(Peter Eisentraut)
これまでビューは存在していましたが、シーケンスパラメータに関するカラムは実装されていませんでした。
- has_table_privilege()および関連の関数でロール名に public を指定できるようになりました。(Alvaro Herrera)
トリガー
-
ビューに INSTEAD OF トリガーを設定できるようになりました。(Dean Rasheed)
これにより完全な更新可能ビューが定義できるようになります。
手続き言語
PL/pgSQL
-
PL/pgSQL に FOREACH .. IN ARRAY 構文が追加されました。(Pavel Stehule)
配列の要素毎に処理を行うループが読みやすく効率的に記述できます。
-
PL/pgSQL で、同じ場所における RAISE ERROR を捕捉できる場所から、パラメータなしの RAISE も捕捉できるようになりました。(Piyush Newe)
これまでのコーディングは実行中の例外ハンドラを含むブロックからエラーを投げていました。新しい振る舞いは、他のデータベース製品とより整合します。
PL/Perl
-
PL/Perl関数でレコード型を引数にとれるようになりました。(Andrew Dunstan)
レコード型引数は複合型の引数と同じように扱えます。
-
PL/Perl の配列引数を Perl の配列に変換します。(Alexey Klyukin, Alex Hunsaker)
文字列表現も引き続き利用可能です。
-
PL/Perl の複合型引数を Perl のハッシュに変換します。(Alexey Klyukin, Alex Hunsaker)
文字列表現も引き続き利用可能です。
PL/Python
-
PL/Python でテーブル関数をサポートしました。(Jan Urbanski)
複数カラムを複数行返すことができるようになります。
=# CREATE TYPE v AS (x float8, y float8); =# CREATE FUNCTION pyf01 (x int) RETURNS SETOF v LANGUAGE plpython2u AS $$ return ( [1,1], [2,2], [3,3], ) $$; =# SELECT * FROM pyf01(4); x | y ---+--- 1 | 1 2 | 2 3 | 3 (3 rows)
-
PL/Python にバリデータが追加されました。(Jan Urbanski)
PL/Python関数を作成する時点で構文チェックを行うことができます。
-
PL/Python で SQL問い合わせの例外が扱えるようになりました。(Jan Urbanski)
PL/Python の例外ブロックで SQL 例外のエラーコードにアクセスできます。
- PL/Python で明示的なサブトランザクションがサポートされました。(Jan Urbanski)
- 文字列をクオートする関数 plpy.quote_ident、plpy.quote_literal、plpy.quote_nullable が追加されました。(Jan Urbanski)
- PL/Python エラーにトレースバック情報が加わりました。(Jan Urbanski)
- PL/Python の iterator のエラーが PLy_elog で出るようになりました。(Jan Urbanski)
-
Python 3 における例外の扱いが修正されました。(Jan Urbanski)
例外クラスはこれまで Python 3 の PL/Python では使えませんでした。
クライアントアプリケーション
-
createlang と droplang コマンドは、将来削除される旧式コマンドという位置づけになりました。(Tom Lane)
代替に SQL の CREATE EXTENTION コマンドを使用します。
psql
-
psql に conninfo コマンドが追加されました。(David Christensen)
現在の接続情報を表示します。
- psql に sf コマンドが追加されました。関数定義を表示します。(Pavel Stehule)
- psql に dL コマンドが追加されました。手続き言語のリストが表示されます。(Fernando Ike)
-
psql の スキーマを表示する dn コマンドで S オプションが加わりました。(Tom Lane)
dnS でなく dn とした場合、システムスキーマは表示されなくなります。
-
psql の e および ef コマンドで、行番号を受けつけるようになりました。(Pavel Stehule)
psql変数 EDITOR_LINENUMBER_SWITCH にしたがってエディタに行番号を渡します。
- psql のクライアントエンコーディングのデフォルトをOS ロケールから設定するようになりました。(Heikki Linnakangas)
- d コマンドがユニークインデックスとユニーク制約を区別するようになりました。(Josh Kupershmidt)
-
dt+ が 9.0 以降のサーバについては pg_relation_size に替えてpg_table_size のサイズ情報を出力するようになりました。(Bernd Helmle)
これはテーブルサイズについてより有用な指標ですが、同様に表示されていたこれまでの値とは意味が異なる点に注意が必要です。
- psql の TAB入力補完が追加されました。(Itagaki Takahiro, Pavel Stehule, Andrey Popp, Christoph Berg, David Fetter, Josh Kupershmidt)
pg_dump
- pg_dump および pg_dumpall に --quote-all-identifiers オプションが追加されました。すべての識別子がクオートされます。(Robert Haas)
-
pg_dump に ディレクトリ形式が追加されました。(Joachim Wieland, Heikki Linnakangas)
pg_restore コマンドでリストアするための形式で、ひとつのディレクトリが作られます。内部的には tar形式と似ています。
pg_ctl
-
pg_ctl が修正され、不適切な、サーバプロセスが動作していないという報告がなくなりました。(Bruce Momjian)
これまでサーバプロセスは稼動していても、pg_ctl がそれを確認できない場合に、サーバが稼動していないと報告されることがありました。
-
pg_ctl start の -w オプションが改善されました。(Bruce Momjian)
待機モードがより頑健になりました。デフォルト以外のポート番号や Unixドメインソケットの位置、ファイルパーミッションや 古い postmaster のロックファイルなどで混乱することがなくなりました。
-
pg_ctl promote サブコマンドが追加されました。(Fujii Masao)
スタンバイサーバをプライマリに切り替えます。これまではトリガーファイルを置く方法で行われていました。
開発ツール
libpq
-
libpq 接続オプションに client_encoding が追加されました。(Heikki Linnakangas)
PGCLIENTENCODING 環境変数を指定したのと同様の振る舞いとなります。
指定しない場合、クライアントの OS ロケールに基づくエンコーディングがデフォルト値となります。
-
libpq に PQlibVersion() 関数が追加されました。(Magnus Hagander)
libpq ライブラリバージョンを返します。
libpq にはサーババージョンを返す PQserverVersion() 関数が既にありました。
-
libpq で Unixドメインソケット経由の接続のとき、サーバプロセスのユーザ名をチェックできるようになりました。(Peter Eisentraut)
サーバから Unixドメインソケットのクライアント側ユーザ名を判定することは、これまでのバージョンでも既にできていました。
-
libpq に PQping()、PQpingParams()関数が追加されました。(Bruce Momjian, Tom Lane)
新たな接続を開かずにサーバ状態を検出することができます。
ecpg
- ecpg で動的カーソル名を WHERE CURRENT OF 節でも受け付けることができるようになりました。
ビルドオプション
- HP-UX Cコンパイラで +Olibmerrno コンパイルフラグを使うようになりました。(Dimitri Fontaine, Tom Lane)
Makefiles
-
並列 make の対応が改善されました。(Peter Eisentraut)
より早くコンパイルができます。また、make -k がより一貫性をもって動作します。
-
GNU make 3.80 以上が必要となりました。(Peter Eisentraut)
これは並列 make の改善にともなうものです。
-
makeターゲット「make maintainer-check」が追加されました。(Peter Eisentraut)
これは、ビルドや再帰テストに含むには相応しくない各種のソースコードチェックを実行するものです。現在は、初期データにおけるOID重複チェック、SGML文法とtabのチェック、NLS文法チェックが含まれます。
-
contrib/ 以下の追加モジュールでも make check がサポートされました。
これまでは make installcheck のみが有効でしたが、テンポラリインストールを使った再帰テストに対応するようになりました。
これはトップレベルでの make check-world の対象に含まれます。
Windows
- Windows にて pg_ctl でサービスを登録する際に 自動起動か手動起動かを指定できるようになりました。(Quan Zongliang)
-
Windows のクラッシュダンプに対応しました。(Craig Ringer, Magnus Hagander)
デバッグ版でない Windows版バイナリで標準的なデバッグツールで解析できるminidumpデータが生成できます。
-
Mingw64 コンパイラによるビルドに対応しました。(Andrew Dunstan)
これにより 64bit Windows バイナリを Windows 以外のプラットフォームからクロスコンパイルすることができます。
ソースコード
-
GUC変数(設定値)を割り当てるフックのAPIが改定されました。
これまでの割り当てフックは、チェックフックと割り当てフック分割されました。この変更はカスタム設定パラメータを持つ追加モジュールに影響があります。
- イベントを待つソースコード箇所にラッチが追加されました。(Heikki Linnakangas)
- データ変更における権限チェックのロジックが集約されました。(KaiGai Kohei)
- 欠けていた get_{オブジェクト}_oid() 関数群が追加されました。(Robert Haas)
- 追加モジュールに C++コンパイラ が使えるように、C++キーワードとの衝突を除去する改修が行われました。(Tom Lane)
- DragonFly BSD 対応が追加されました。(Rumko)
- quote_literal_cstr()関数が src/include/utils/builtins.h に含まれるようになりました。以前は static関数でした。(Robert Haas)
-
再帰テストをデフォルトエンコーディングで行うようになりました。(Peter Eisentraut)
これまでは常に SQL_ASCII で行っていました。
-
src/tools に git_changelog スクリプトが追加されました。(Robert Haas, Tom Lane)
cvs2clスクリプト、pgcvslogスクリプトを置き換えるものです。
-
src/tools に git-external-diff スクリプトが追加されました。(Bruce Momjian)
git から context diff を生成するのに使います。
サーバフック
- 権限チェック部分ソースコードにフックが追加されました。(Robert Haas, Stephen Frost)
- セキュリティフレームワークのために post-object-creation関数フックが追加されました。(KaiGai Kohei)
- クライアント認証のフックが追加されました。(KaiGai Kohei)
追加モジュール(contrib)
- contrib モジュールと手続き言語のインストールに、新たな拡張の機構を使うように変更されました。(Tom Lane, Dimitri Fontaine)
-
外部データラッパー contrib/file_fsw が追加されました。(Shigeru Hanada)
COPYコマンドで入出力する形式と似た形式のテキストファイルのデータを外部テーブルとして読むことができます。
-
contrib/trgm および contrib/btree_gist でインデックスを使用した近傍検索がサポートされました。(Teodor Sigaev)
マニュアルより抜粋、下記例で a に gist インデックスがあれば利用可能。
SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 ;
- contrib/btree_gist で不一致検索のサポートが追加されました。(Jeff Davis)
- contrib/fuzzystrmatch の levenshtein()関数がマルチバイト文字を扱えるようになりました。(Alexander Korotkov)
- contrib/sslinfo に ssl_cipher()、ssl_version() 関数が追加されました。(Robert Haas)
-
contrib/intarray、contrib/hstore が空配列のインデックスについて一貫した結果を返すように修正されました。(Tom Lane)
これまで空配列を伴う問い合わせはシーケンシャルスキャンの場合とインデックスを使う場合とで、異なる結果が返っていました。
- contrib/intarray が多次元配列で適切に動作するようになりました。(Tom Lane)
- contrib/intarray で 実際には NULL が無いにもかかわらずNULL が存るというエラーが出る問題が修正されました。(Tom Lane)
-
contrib/intarray で 空配列に関して格納オペレータの振舞いが修正されました。(Tom Lane)
空配列が他の配列に含まれていると正しく認識されます。
-
contrib/xml2 における xslt_process() で扱える parameter=value ペア数の恣意的な制限が撤廃されました。(Pavel Stehule)
これまでは 10個が最大でした。
-
contrib/pageinspect で heap_page_item が 32bit値を返していたのが修正されました。(Alvaro Herrera)
本修正はマイナス値が返るのを防ぎます。本来の値は符号なし16bit整数です。
セキュリティ
-
SE-Linux と連携してアクセス制御を行う contrib/sepgsql が追加されました。(KaiGai Kohei)
これは新たに導入された SECURITY LABEL 機構を使うものです。
-
contrib/auth_delay が追加されました。(KaiGai Kohei)
認証に失敗したとき応答を遅延します。パスワード総当たり攻撃の防御に使用します。
-
contrib/dummy_seclabel が追加されました。(KaiGai Kohei)
SECURITY LABEL の再帰テスト用に使います。
パフォーマンス
-
contrib/pg_tgram で LIKE、ILIKE によるインデックス検索に対応しました。(Alexander Korotkov)
以下のように中間一致検索でもインデックスが利用できることになります。
=# CREATE INDEX ON test10 USING gist (v gist_trgm_ops); =# EXPLAIN SELECT * FROM test10 WHERE v LIKE '%京都%'; QUERY PLAN ---------------------------------------------------------------------------- Index Scan using test10_v_idx on test10 (cost=0.00..8.27 rows=1 width=36) Index Cond: (v ~~ '%京都%'::text) (2 rows)
- contrib/fuzzystrmatch に小さい距離に最適化された levenshtein_less_equal()関数が追加されました。(Alexander Korotkov)
- contrib/seg カラムのインデックス検索の性能が改善されました。(Alexander Korotkov)
- テーブルが多数ある場合の pg_upgrade の性能が改善されました。(Bruce Momjian)
- contrib/pgbench に SQL文ごとの所要時間を出力するフラグが追加されました。(Florian Pflug)
Fsync
- src/tools/test_fsync が contribツールのひとつになりました。(Bruce Momjian, Tom Lane)
- contrib/pg_test_fsync が O_DIRECT に対応しました。(Bruce Momjian)
- contrib/pg_test_fsync にテストが追加されました。(Bruce Momjian)
ドキュメント
- 広範囲に ECPGについての文書の改善が行われました。(Satoshi Nagayasu)
- 文書の広範囲に校正と改善が行われました。(Thom Brown, Josh Kupershmidt, Susanne Ebrecht)
-
exit_on_error についてドキュメント追加されました。(Robert Haas)
本パラメーターはエラーでセッション(接続)を終了させるものです。
-
pg_options_to_table関数について文書に追加されました。(Josh Berkus)
本関数はテーブル格納オプションを出力します。
- 複合型の全要素を (compositeval).* という構文で書けることが記述されました。(Peter Eisentraut)
- translate関数の説明に対応する文字がないものについては削除される旨が記述されました。(Josh Kupershmidt)
- CREATE CONSTRAINT TRIGGER の文書と CREATE TRIGGER の文書が併合されました。(Alvaro Herrera)
- バージョンアップと認証の記述がそれぞれ一箇所に集約されました。(Bruce Momjian)
-
Solaris 10 むけのカーネルチューニングの文書が追加されました。(Josh Berkus)
これまで Solaris 9 むけのものしかありませんでした。
-
HISTORYファイルのASCII外の文字について一貫性のある扱いとなりました。(Peter Eisentraut)
HISTORYファイルは英語ですが、貢献者名に含まれるASCII外の文字に対処が必要です。文字セットの前提なしに読めるようにこれらは翻訳されました。