
このページでは PostgreSQL 9.0 (2010/06/04リリース)に関する技術情報をお届けします(beta2 の段階で作成し、rc1 に合わせて加筆しています)。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
概要
本リリースの主な改良点は以下になります。
-
- トランザクションログ転送に基づく組み込みのレプリケーション機能が追加されました。この拡張は、連続的にアーカイブログ(WAL)をスタンバイサーバに転送する「ストリーミングレプリケーション」、スタンバイサーバにてアーカイブログの適用をしながら読み取りの問い合わせを受け付ける「ホットスタンバイ」という二つの機能によって実現されています。
- レポート作成むけの問い合わせが拡張されました。WINDOW関数で新たなオプション PRECEDING、FOLLOWING が加わり、集約関数の中で ORDER BY が使えるようになりました。
- いくつかセキュリティ仕様で拡張があります。接続認証に RADIUS が使用できるようになりました。また、LDAP による認証が改良されています。追加モジュールにパスワード強度を検査する passwordcheck が加わりました。
- 新規追加された GRANT/REVOKE IN SCHEMA 節により、スキーマごとにまとめて権限の変更を行えるようになりました。
- GRANT/REVOKE でラージオブジェクトの権限設定を行えるようになりました。
- DO 文を使って匿名関数を作成できるようになりました。
- 関数呼び出しにおいてパラメータ名を指定し、関数の定義のパラメータ名と照合できるようになりました。
- サーバサイド言語の PL/pgSQL が標準でインストールされるようになりました。
- PL/Perl が大幅に拡張されました。
- カラム単位のトリガが使用できるようになりました。
- 遅延可能なユニーク制約が追加されました。
- LISTEN/NOTIFY がイベントをシステムテーブルではなく、メモリ内のキューに格納するようになりました。また、NOTIFY がリスナーにオプションの文字列を渡せるようになりました。
- VACUUM FULL が領域を縮小するために行を一つ一つ移動していくのではなく、テーブルとインデックス全体を書き換えるように変更されました。VACUUL FULL後の REINDEX は必要なくなります。
- 全文検索の同義語辞書で接頭辞がサポートされました。
- GIN インデックスの作成に赤黒木(red-black tree)を使用するようになりました。
- ビット文字列用関数 get_bit() と set_bit() が追加されました。
- クライアントがアプリケーション名を指定できるようになりました。これは pg_stat_activity に表示されます。
- 64-bit Windows でのコンパイルと 64-bit モードでの動作がサポートされました。
- 新たな追加モジュール pg_upgrade により、8.3、8.4 から 9.0 への上書きアップグレードがサポートされます。
不要な結合を取り除く最適化が追加されました。ORマッパーにより自動生成される問い合わせの性能向上につながります。
- EXPLAIN が拡張されました。JSON、XML、YAML の各フォーマットで出力できます。また、バッファ利用状況など従来無かった情報も出力されます。
- hsotre型 (追加モジュール) が改良されました。新たな関数が追加され、容量の制限が緩和されました。
<? /* ———————————————————————————- */ ?>
バージョン 9.0 への移行 / 互換性のない変更点
<? /* ———————————————————————————- */ ?>
サーバ設定の非互換
- 設定 add_missing_from が廃止されました。これはかなり以前からデフォルトで off となっていました。 (Tom Lane)
- 設定 regex_flavor が削除されました。正規表現は常に以前からデフォルト値であった advanced となります。 (Tom Lane)
- 設定 archive_mode は、archive_command にのみ影響を及ぼすようになります。新たな設定 wal_level は WAL の内容に影響を与えます。
- 設定 log_temp_files のデフォルト単位が kB(キロバイト) となりました (Robert Haas)
<? /* ———————————————————————————- */ ?>
SQLの非互換
- 親テーブルに対してアクセスするときには、子テーブルに対して権限チェックを行わないようになりました。SQL標準ではこの振る舞いが規定されています。(Peter Eisentraut)例:
db=# CREATE TABLE p_tbl (id INT PRIMARY KEY); db=# CREATE TABLE c_tbl (c1 TEXT) INHERITS (p_tbl); db=# INSERT INTO p_tbl VALUES (1); db=# INSERT INTO c_tbl VALUES (2, 'vvv'); db=# GRANT ALL ON p_tbl TO PUBLIC; db=# c db user1
- 8.4.4 の場合
-
db=> SELECT * FROM p_tbl; ERROR: permission denied for relation c_tbl
- 9.0 の場合
-
db=> SELECT * FROM p_tbl; id ---- 1 2 (2 rows)
データ型に関する非互換
- SIMILAR TO で、SQL:2008規格にしたがった POSIX互換の解釈をサポートするようになりました。 (Tom Lane)これまで単なる文字であった「?」と「{…}」がパターンマッチキャラクタとして扱われるようになります。これは SQL:2008 の新仕様に対応するものです。先頭と末尾を表す「^」と「$」は逆に単なる文字として扱われます。これまでこれらはメタ文字として扱われていました(とはいえドキュメント記載はなく、また不要な機能でした)。なお、文字クラスを表現するときに使う「^」は引き続き同様に使用できます。
- 8.4.x 以前で使えて 9.0 で使えないパターン例
-
db=# SELECT 'ABC' SIMILAR TO '^ABC$'; ?column? ---------- t (1 row)
- 9.0 で使えて 8.4.x 以前で使えないパターン例
-
db=# SELECT 'ABBB' SIMILAR TO 'AB{2,3}C?'; ?column? ---------- t (1 row)
- 9.0 でも引き続き使えるパターン例
-
db=# SELECT 'ABBB' SIMILAR TO '[^CDE]+'; ?column? ---------- t (1 row)
また、SQL標準の substring() 関数では、ネストした括弧が部分文字列の取得をもはや妨げません。さらに文字クラスを表すブラケット表現の処理がより標準に準拠するようになりました。
- SQL標準に従い、ビット文字列に対する3つのパラメータを指定する substring() で負の長さの値が拒否されるようになりました。なお、2番目のパラメータに負の開始位置を指定することは 9.0 でもできます。
- 8.4.4 の振る舞い – 長さ指定無しのようになっていた
-
postgres=# SELECT substring(B'1100111000', 2, -1); substring ----------- 100111000 (1 row)
- 9.0 の振る舞い
-
postgres=# SELECT substring(B'1100111000', 2, -1); ERROR: negative substring length not allowed
- bytea型の出力がデフォルトで 16進形式となります (Peter Eisentraut)設定 bytea_output で従来の形式にさせることができます。
- 配列の入力において無視される可能性がある文字がプレーンASCIIの空白文字だけとなりました。(Tom Lane)これはサーバのロケール設定に依存して配列の解釈が異なるケースを回避します。
- 浮動小数点型による日時で、小数秒の変換を丸めではなく切り捨てで行うようになりました。(Tom Lane)なお、標準のビルドでは「64bit整数型による日時」が使われます。ビルド時に –disable-integer-datetimes を指定した場合の振る舞いとなります。殆どの場合に差異は出ませんがまれに日付時刻の秒の小数点以下部分で結果が異なる場合があることを認識ください。新たな振る舞いは整数型による日時の振る舞いと同じになります。
- 8.4.4 の場合
-
db=# SELECT date_trunc('microsecond', '2010-07-07 07:07:07.999999'::timestamp); date_trunc ---------------------------- 2010-07-07 07:07:07.999999 (1 row)
- 9.0 の場合
-
db=# SELECT date_trunc('microsecond', '2010-07-07 07:07:07.999999'::timestamp); date_trunc ---------------------------- 2010-07-07 07:07:07.999998 (1 row)
<? /* ———————————————————————————- */ ?>
オブジェクトのリネームに関する非互換
- 子テーブルが改名したカラムを継承したとき、厳格なカラム改名の強制を行うようになりました。(KaiGai Kohei)
- (例)
-
postgres=# CREATE TABLE t1 (a int, b int); CREATE TABLE postgres=# CREATE TABLE s1 (b int, c int); CREATE TABLE postgres=# CREATE TABLE ts (d int) INHERITS (t1, s1); NOTICE: merging multiple inherited definitions of column "b" CREATE TABLE
- 8.4.4 の場合 – t1 だけ b が bb に変わっていて、s1 は b のまま
-
postgres=# ALTER TABLE t1 RENAME b TO bb; ALTER TABLE
- 9.0 の場合
-
postgres=# ALTER TABLE t1 RENAME b TO bb; ERROR: cannot rename inherited column "b"
- テーブルのカラムがリネームされた時、インデックス名とインデックスのカラム名がリネームされないようになりました。管理者は手動でそのようなカラムをリネームすることができます。(Tom Lane)あくまで pg_attribute システムテーブルのインデックスのカラムに対するattname 値を元のままに放置するというだけで、psql の
d
などはテーブルのカラム名を参照して表示するのでユーザレベル操作で差異はありません。システムテーブルを参照するツールに影響があるかもしれません。 - CREATE OR REPLACE FUNCTION は関数のパラメータ名を変更しなくなります。(Pavel Stehule)パラメータ名を使った関数呼び出しにおいて曖昧さを避けるため、既存の関数のパラメータ名を変えることができなくなります。(未だ名前をつけていないパラメータにパラメータ名を割り当てることはできます)。変更するには一度 DROP をして、関数を再作成する必要があります。
<? /* ———————————————————————————- */ ?>
PL/pgSQL変数に関する非互換
- PL/pgSQL でクエリに使用されるカラム名と変数名が衝突する場合はエラーとなります。 (Tom Lane)エラーは定義した関数の実行時に発生します。この動作はサーバ変数 plpgsql.variable_conflict もしくは関数単位のオプション #variable_conflict で変更できます。以前の動作ではカラム名を覆い隠して変数名と解釈されていました。
- PL/pgSQL の RENAME 宣言オプションが廃止されました。 (Tom Lane)ALIAS で 引数の $1 のような $ つき変数だけでなく任意の変数に別名を付けられるため、そちらを使用してください。
- PL/pgSQL で変数名に SQL の予約語を使用することができなくなりました。変数名をダブルクォートで括ることでこの制限を回避できます。(Tom Lane)変数名に予約語 (createなど) を使った場合、関数登録時にエラーになります。以前のバージョンでも構文解析で問題のでる場合にはエラーとなっていました。
- PL/pgSQL で、複合型による返し値において要素データ型のより厳格な適合が要求されるようになりました。(Pavel Stehule, Tom Lane)例えば NUMERIC(30,2) 型は 他の精度の NUMERIC型カラムの値を受け入れることができなくなります。これまではデータ型修飾(精度指定など)を含む厳密な型チェックをしていませんでした。
その他の非互換
- 演算子として => を使わないように警告がでます (Robert Haas)SQL標準の関数パラメータ名の表記法に従って、将来的には完全に禁止される予定です。暫くは許容されますが、この演算子を定義すると警告(WARNING) が出力されます。
- 64bit整数型をもたないプラットフォームがサポート対象外となります (Tom Lane)現時点でのサポートプラットフォームは全て 64bit整数をサポートしていると考えられます。
<? /* ———————————————————————————- */ ?>
PostgreSQL 9.0 の変更点
サーバ
継続的アーカイブとストリーミングレプリケーション
- 継続的アーカイブのスタンバイ側のシステムで読み取りのみの問い合わせを受け付けるようになりました。(Simon Riggs, Heikki Linnakangas)この機能はホットスタンバイと呼ばれます。
- 継続的アーカイブ(WAL)ファイルをスタンバイシステムにストリーミングできるようになりました。(Fujii Masao, Heikki Linnakangas)以前は、 WAL ファイルを16MBごとのファイルとしてのみスタンバイシステムに送ることができました。この変更により、マスタ側の変更が非常に少ない遅延でスレーブに反映されるようになりました。
- pg_last_xlog_receive_location() と pg_last_xlog_replay_location() が追加されました。これはスタンバイサーバの WAL の活動状況を監視するのに使えます。(Simon Riggs, Fujii Masao, Heikki Linnakangas)
性能
- 親テーブルから継承された子テーブルの検索速度が向上しました。 (Tom Lane)
- テーブルスペース単位のシーケンシャル/ランダムページコスト変数 (seq_page_cost/random_page_cost) が ALTER TABLESPACE … SET/RESET 経由で利用できるようになりました。 (Robert Haas)
- テーブルの作成と同じトランザクション内で TRUNCATE を実行したときの性能が向上しました。 (Tom Lane)
- プランナの EvalPlanQual が結合クエリで再チェックを行うことで、性能と信頼性が改善されました (Tom Lane)新たに更新された行に出くわすとき UPDATE、DELETE、SELECT FOR UPDATE/SHARE の問い合わせがより良く振舞います。
オプティマイザ
- インデックス使用時に IS NOT NULL 制約が利用できるようになりました。(Tom Lane)これは NULL を含むインデックスで MAX()、MIN() の値を求めるのに特に有用です。
- 不要な OUTER JOIN を取り除くようになりました。 (Robert Haas)LEFT JOIN の内側がユニークで JOIN 上で参照されないケースが該当します。
- (差がつく例)
-
db=> EXPLAIN SELECT id, c FROM (SELECT tm.id, tm.c, tc1.c1, tc2.c2 FROM (tm LEFT OUTER JOIN tc1 ON tm.id = tc1.id) LEFT OUTER JOIN tc2 ON tm.id = tc2.id) AS v;
- 9.0 の実行プラン – 結局ひとつのテーブルしか見ないので結合はいらない
-
QUERY PLAN ------------------------------------------------------ Seq Scan on tm (cost=0.00..44.00 rows=3000 width=8) (1 row)
- 8.4.4 の実行プラン – 不要な結合処理を行ってしまう
-
QUERY PLAN ------------------------------------------------------------------------- Merge Left Join (cost=449.33..4535.88 rows=245009 width=8) Merge Cond: (tm.id = tc1.id) -> Merge Left Join (cost=299.56..653.73 rows=22898 width=8) Merge Cond: (tm.id = tc2.id) -> Sort (cost=149.78..155.13 rows=2140 width=8) Sort Key: tm.id -> Seq Scan on tm (cost=0.00..31.40 rows=2140 width=8) -> Sort (cost=149.78..155.13 rows=2140 width=4) Sort Key: tc2.id -> Seq Scan on tc2 (cost=0.00..31.40 rows=2140 width=4) -> Sort (cost=149.78..155.13 rows=2140 width=4) Sort Key: tc1.id -> Seq Scan on tc1 (cost=0.00..31.40 rows=2140 width=4) (13 rows)
- オプティマイザによる <> による真偽値テストの等価性検出が改良されました。(Tom Lane)
- マテリアライズを使うときの選択、DISTINCTに対してソートを使うかハッシュを使うかの選択において、オプティマイザが改善されました。(Tom Lane)
GEQO
- GEQO でプランニングを行う場合に毎回同じ乱数の種が使用されるようになりました。(Andres Freund)同じクエリに対する GEQO によるプランニングが特定の seed 値の下で同じ結果が出るようになりました。 geqo_seed 変数を変更すると、ランダムプラン生成の開始値を変化させることができます。
- GEQOのプラン選択が改良されました。 (Tom Lane)”failed to make a valid plan” という稀なエラーが出なくなりました。
オプティマイザ統計情報 (プランナ統計情報)
- ANALYZE が継承ツリーの統計をサポートするように改良されました。 (Tom Lane)特にパーティショニングされたテーブルに有用です。
- 自動バキュームがいつ ANALYZE の再実行が必要かを検出する処理が改良されました。 (Tom Lane)
- 大なり/小なりの比較に対するオプティマイザの統計が改良されました (Tom Lane)比較対象の値がヒストグラムの先頭または末尾にある場合、実際の統計を生成するのにインデックスを使います。これは特に常に増加していき、しばしば不正確な統計になっているカラムに有効です。
- ALTER TABLE文で、カラム統計情報の distinct値 (値の種類数) を手動で設定できるようになりました。(Robert Haas)これにより、各カラム(子テーブルのものでも)に上書きして distinct値 を指定できるようになります。通常 ANALYZE コマンドで値は計算されます。
認証
- RADIUS (Remote Authentication Dial In User Service) 認証がサポートされました。 (Magnus Hagander)
- LDAP認証において search/bind モードで動作できるようになりました。(Robert Fleming, Magnus)search/bindモードとは、ディレクトリからユーザを検索して、見つかったDNに結びつける方法です。 DNが決定しない場合に使えます。旧来の DN を生成するsimple-bind のほうが速いので、旧来式も残ります。
- pg_hba.conf の指定方式 samehost、samenet が追加されました。 (Stef Walter)接続元が postgresサーバと同じホストか、同じネットワーク内かで判断されます。
- クライアントが適当なクライアント証明書を返せるように、クライアントむけの信頼された SSL ルート証明書の名前を渡すようになりました。(Craig Ringer)特に いくつかのJavaクライアントからの接続でこの修正が要望されていました。
監視
- クライアントが接続時にアプリケーション名を指定できるようになりました。これは pg_stat_activity ビューに表示されます。 (Dave Page)
- log_line_prefix に %e を指定することでログに SQLSTATE を入れられるようになりました。 (Guillaume Smet)
- Windowsのイベントログに UTF-16 で出力するようになりました。 (Itagaki Takahiro)
統計カウンタ (実行時統計情報)
- pg_stat_reset_shared(‘bgwriter’) が追加され、クラスタ全体の bgwriter の統計をリセットできるようになりました。 (Greg Smith)
- pg_stat_reset_single_table_counters()、pg_stat_reset_single_function_counters() が追加され、各テーブルとインデックスの統計カウンタをリセットできるようになりました。 (Magnus Hagander)
サーバ設定
- データベースとロールの組み合わせに基づいた設定が可能になりました。(Alvaro Herrera)以前は、データベースごと、もしくはロールごとのみの設定が可能でした。
すべてのロールとデータベースの設定は新たに pg_db_role_setting システムテーブルに格納されるようになりました。pgsqlのdrds
コマンドでこれらの設定を表示できます。後方互換用のシステムビューではこの情報は表示されません。db=# SELECT * FROM pg_db_role_setting; setdatabase | setrole | setconfig -------------+---------+------------------------------------------------------------------------------------- 16387 | 0 | {lc_messages=C,lc_monetary=C,lc_numeric=C,lc_time=C,timezone_abbreviations=Default} (1 row)
- bonjour という真偽値の設定変数が追加されました。
bonjour を有効にしてビルドされている場合に Bonjour 経由でそのことを通知するかどうかを制御します。 (Tom Lane)デフォルトでは off (通知しない)です。 - enable_material という真偽値の設定変数が追加されました。オプティマイザでマテリアライズノードを使用するかどうかを制御します。 (Robert Haas)デフォルトでは on です。
- postgresql.conf で設定が変更されてリロードされたことがログ記録されるようになりました。(Peter Eisentraut)
- カスタム設定変数に対して適切な権限が追加されました。 (Tom Lane)カスタム設定変数はスーパーユーザによってのみ作成できるようになりました。ただし、変数の権限によって許可されている場合は、一般ユーザが変更できます。これにより、セキュリティ設定にカスタム変数を適切に使用できるようになります。以前は、誰でもカスタム変数を作成、変更することができました。
<? /* ———————————————————————————- */ ?>
問い合わせ (DML)
- SELECT FOR UPDATE/SHARE を LIMIT の適用後に行うようになりました。これにより、返る行数が常に予測できるようになりました。 (Tom Lane)以前は、同時実行されるトランザクションで SELECT が LIMIT 指定より少ない行を返す可能性がありました。 FOR UPDATE は依然として ORDER BY の順序に影響を与えますが、これは FOR UPDATE をサブクエリで使用することで訂正できます。
- LIMIT/OFFSET において従来の文法と SQL 標準の文法を同じクエリ内で混在させることができるようになりました。 (Tom Lane)
- ウィンドウ関数内でサポートされるフレームのオプションが増えました。(Hitoshi Harada)これにより、フレーム(RANGE もしくは ROWS)を START ROW で始めることができるようになり、また ROWS n PRECEDING/FOLLOWING 節を使用できるようになりました。移動平均の計算が容易に記述できるようになります。
- SELECT と CREATE TABLE AS がクライアントに行数を返すようになりました。(Boszormenyi Zoltan)なお、psql はこれらの数値を表示しません。
- ALTER DEFAULT PRIVILEGES 文が追加されました。以降に作られるオブジェクトのデフォルト権限を設定できます。(Petr Jelinek)これは複雑なデータベースアプリケーションの権限設定を容易にします。テーブル、ビュー、シーケンス、関数に対してデフォルトの権限をスキーマ単位、あるいはデータベース単位で設定できます。
UNICODE
- ユニコード U& 表現の文字列と識別子でサロゲートペアがサポートされました。(Peter Eisentraut)
- E’…’ 文字列にユニコードエスケープ表現が使えるようになりました。(Marko Kreen)E’
u12A4
U1234ABEF9999'
などが使えるようになります。
<? /* ———————————————————————————- */ ?>
オブジェクト操作 (DDL)
- ディスクへの書き出しを遅延させることによって CREATE DATABASE が高速化されました。 (Andres Freund, Greg Stark)
- コメントをテーブルのカラム、ビュー、複合型にのみ付けられるようになりました。インデックスや TOAST テーブルなどには付けられません。 (Tom Lane)
- ラベルのない列挙型を作成できるようになりました。 (Bruce Momjian)バイナリのアップグレードへの対応で役立ちます。
- カラムのストレージタイプが MAIN であるとき、行をページに収めるのに必要でなければ外出ししないようになりました。(Kevin Grittner)これまでは行サイズがページサイズの 1/4 (以下) でないと強制的に TOASTテーブルに外出しされていました。
ALTER
- ALTER DEFAULT PRIVILEGES コマンドが追加されました。新しく作られるオブジェクトのデフォルトの権限を設定できます。(Petr Jelinek)現在テーブル、ビュー、シーケンス、関数に対応しています。また、スキーマ単位の制御も可能です。
- DROP COLUMN、DROP CONSTRAINT で IF EXISTS節が使えるようになりました。(Andres Freund)DROP FUNCTION、DROP TABLE などは 以前から IF EXISTS が使えていました。
- ALTER TABLE で WAL の書き込みをスキップするようになりました。(Itagaki Takahiro)このような操作は完全に処理が完了するかロールバックされるかなので、継続的アーカイブモードでない限り、 WALアーカイブをスキップできます。
CREATE TABLE
- CREATE TABLE … LIKE INCLUDING コマンドで COMMENTS と STORAGE のコピーが可能になりました。 (Itagaki Takahiro)
- CREATE TABLE … LIKE INCLUDING コマンドで全属性がコピーできるようになりました。(Itagaki Takahiro)
- SQL 標準の CREATE TABLE … OF type コマンドが追加されました。(Peter Eisentraut)ある複合型から同じ構造のテーブルを作成することができます。追加の制約やデフォルトを追加で指定することもできます。
制約
- ユニーク制約を遅延(DEFERRABLE指定)できるようになりました。 (Dean Rasheed)これにより、制約定義で DEFERRABLE として、制約検査時期を DEFERRED と指定することで、UPDATE tab SET key = key + 1 などの操作を一意インデックスをもつカラムやプライマリキーのカラムに適用できるようになりました。
- 例
-
db=# BEGIN; db=# SET constraints all DEFERRED; db=# UPDATE test SET id = id + 1 ; db=# END; COMMIT db=# d test Table "public.test" Column | Type | Modifiers --------+---------+----------- id | integer | not null v | text | Indexes: "test_pkey" PRIMARY KEY, btree (id) DEFERRABLE
- ユニーク制約に等号だけでなく、任意の演算子比較が使えるようになり、ユニーク制約が一般化されました。(Jeff Davis)CREATE TABLE CONSTRAINT … EXCLUDE 節で使うことができます。一意性のチェックをこの文法で指定できますが、組み込みの制約をもたない複合演算子を使用する際にこの機能の本来の価値があります。組み込みのデータ型では幾何データに対する演算子 && (重なっているか)をユニーク制約の代わりに指定できます。
- 例
-
db=# CREATE TABLE test_exclude db-# (id int primary key, obj circle, EXCLUDE USING gist (obj WITH &&)); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_exclude_pkey" for table "test_exclude" NOTICE: CREATE TABLE / EXCLUDE will create implicit index "test_exclude_obj_exclusion" for table "test_exclude" CREATE TABLE db=# INSERT INTO test_exclude VALUES (1, '<(1.0,1.0),1.0>'); INSERT 0 1 db=# INSERT INTO test_exclude VALUES (2, '<(2.0,2.0),5.0>'); ERROR: conflicting key value violates exclusion constraint "test_exclude_obj_exclusion" DETAIL: Key (obj)=(<(2,2),5>) conflicts with existing key (obj)=(<(1,1),1>).>
- 制約違反の際のメッセージが改善されました。 (Itagaki Takahiro)どの値が違反したのかを報告するようになります。
- 8.4.4 の場合
-
postgres=# INSERT INTO t (id) VALUES (1); ERROR: duplicate key value violates unique constraint "t_pkey"
- 9.0 の場合
-
postgres=# INSERT INTO t (id) VALUES (1); ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (id)=(1) already exists.
オブジェクト権限
- GRANT/REVOKE IN SCHEMA 節でスキーマに対してまとめて権限設定ができるようになりました。 (Petr Jelinek)
- 例
-
db=# GRANT SELECT,INSERT ON ALL TABLES IN SCHEMA app_schema TO app_role1; GRANT
- GRANT/REVOKE にラージオブジェクトのアクセス権限管理機能が追加されました。 (KaiGai Kohei)ALTER LARGE OBJECT文でラージオブジェクトの所有者を設定できます。デフォルトでは他のユーザが所有者のラージオブジェクトにアクセスできないようになります。権限情報は pg_largeobject_metadata に格納さます。
- 例
-
db=# GRANT SELECT, UPDATE ON LARGE OBJECT 16577 TO foo; GRANT
<? /* ———————————————————————————- */ ?>
ユーティリティ操作
- LISTEN/NOTIFY がイベントをシステムテーブルではなく、メモリ内のキューに格納するようになりました。 (Joachim Wieland)これにより、これらの操作の動作速度が大幅に向上しました。
- NOTIFY がリスナーにオプションの文字列を渡せるようになりました。(Joachim Wieland)
- 例
-
db=# NOTIFY operation_a_done, 'success'; NOTIFY
- CLUSTER をすべてのシステムテーブルに使用できるようになりました。 (Tom Lane)グローバルシステムテーブル (共有システムテーブル、pg_authid など) に関しては依然としてクラスタ化はできません。
COPY
- 「*」が COPY CSV の FORCE QUOTE パラメータに追加されました。(Itagaki Takahiro)これを使うと CSV の全出力カラムがクォートされます。
- 新たな COPY 構文が追加され、パラメータを括弧内に複数指定できるようになりました。 (Robert Haas, Emmanuel Cecchet)これにより、将来の COPY オプションの柔軟性が高まりました。旧構文も引き続きサポートされています。
- 例
-
db=# COPY accounts TO STDOUT WITH (FORMAT csv, NULL 'nil', FORCE_QUOTE *); "1","1","0"," " "2","1","0"," " : (以下略)
EXPLAIN
- クエリバッファの活動を報告する EXPLAIN (BUFFERS) が追加されました。(Itagaki Takahiro)
- EXPLAIN の出力にハッシュの使用状況が追加されました。 (Robert Haas)
- EXPLAIN 文で XML、JSON、YAML 形式の出力ができるようになりました。(Robert Haas, Greg Sabino Mullane)
- EXPLAIN 文で括弧内にオプションを指定することができるようになりました。(Robert Haas)これにより、将来の EXPLAIN のオプションの拡張が可能になります。旧構文も引き続きサポートされています。
- 例
-
db=# EXPLAIN (ANALYZE, VERBOSE, COSTS, BUFFERS, FORMAT yaml) SELECT * FROM t; QUERY PLAN -------------------------------- - Plan: + Node Type: Seq Scan + Relation Name: t + Schema: public + Alias: t + Startup Cost: 0.00 + Total Cost: 34.00 + Plan Rows: 2400 + Plan Width: 4 + Actual Startup Time: 0.014+ Actual Total Time: 0.018 + Actual Rows: 1 + Actual Loops: 1 + Output: + - id + Shared Hit Blocks: 1 + Shared Read Blocks: 0 + Shared Written Blocks: 0 + Local Hit Blocks: 0 + Local Read Blocks: 0 + Local Written Blocks: 0 + Temp Read Blocks: 0 + Schema: public + Alias: t + Startup Cost: 0.00 + Total Cost: 34.00 + Plan Rows: 2400 + Plan Width: 4 + Actual Startup Time: 0.014+ Actual Total Time: 0.018 + Actual Rows: 1 + Actual Loops: 1 + Output: + - id + Shared Hit Blocks: 1 + Shared Read Blocks: 0 + Shared Written Blocks: 0 + Local Hit Blocks: 0 + Local Read Blocks: 0 + Local Written Blocks: 0 + Temp Read Blocks: 0 + Temp Written Blocks: 0 + Triggers: + Total Runtime: 0.070 (1 row)
VACUUM
- VACUUM FULL が領域を縮小するために行を一つ一つ移動していくのではなく、テーブルとインデックス全体を書き換えるように変更されました。(Itagaki Takahiro, Tom Lane)以前の処理方法は通常の場合遅く、インデックスの増大を引き起こしていました。
- VACUUM に括弧内にパラメータを指定する構文が追加されました。(Itagaki Takahiro)これにより、将来の VACUUM のオプションに大幅な柔軟性をもつことができます。旧構文も引き続きサポートされています。
- 例
-
db=# VACUUM (FULL, FREEZE, VERBOSE, ANALYZE); INFO: vacuuming "pg_catalog.pg_statistic" INFO: vacuuming "pg_catalog.pg_type" INFO: analyzing "pg_catalog.pg_type" : :
インデックス
- CREATE INDEX でインデックス名を指定しない場合は自動的に名前を付けるようになりました。 (Tom Lane)CREATE INDEX ON table (column) とすると、テーブル名とカラム名から自動的に適切な名前が付けられます。
db=# CREATE INDEX ON t (id, c1); CREATE INDEX db=# CREATE INDEX ON t ((1 + id)); CREATE INDEX db=# d t Table "public.t" Column | Type | Modifiers --------+---------+----------- id | integer | c1 | text | Indexes: "t_expr_idx" btree ((1 + id)) "t_id_c1_idx" btree (id, c1)
- システムインデックスに REINDEX ができるようになりました。 (Tom Lane)以前は共有システムテーブルのインデックスは、シングルユーザモードに切り替えない限り REINDEX ができませんでした。
- 8.4.4
-
=# REINDEX TABLE pg_database; ERROR: shared table "pg_database" can only be reindexed in stand-alone mode
- 9.0
-
postgres=# REINDEX TABLE pg_database; REINDEX
- GiST 用の命令クラス point_ops が追加されました。 (Teodor Sigaev)
- GIN インデックスの作成に赤黒木(red-black tree)を使うようになりました。(Teodor Sigaev)赤黒木はバランス木であるため、高速なインデックス作成が可能になります。
<? /* ———————————————————————————- */ ?>
データ型
- bytea 型を16進数表現で指定できるようになりました。 (Peter Eisentraut)bytea の出力に16進数(デフォルト) か8進エスケープが使われるかをbytea_output 設定変数で指定できます。 libpq の PQescapeByteaConn() はサーバが PostgreSQL 9.0 の場合に16進フォーマットを使用します。
- 例
-
=> SELECT E'\xDEADBEEF'::bytea; bytea ------------ xdeadbeef (1 row)
- 設定変数 extra_float_digits で 3 まで指定できるようになりました (Tom Lane)以前は 2 まで指定できました。
- int2vector の入力値チェックが厳しくなりました。(Caleb Welton)本来は空白文字区切りが正しいところ、これまでは以下のような入力もエラーになりませんでした。
db=> SELECT '1not 2really_an 3int2vector'::int2vector; int2vector ------------ 1 2 3 (1 row) db=> SELECT '1, 2,3'::int2vector; int2vector ------------ 1 2 (1 row)
全文検索
- シノニム辞書(同義語辞書)で接頭辞(変換後に前方部分一致にするもの)がサポートされました。(Teodor Sigaev)辞書ファイルの右側の語(変換先の語)に * を付けて記述することができます。
- 辞書ファイル例
-
Postgres Postgre* PostgreSQL Postgre* (実行例 - 問い合わせ文字列に前方一致を使ったシノニムが加わっている) db=# SELECT to_tsquery('english', 'PostgreSQL'); to_tsquery ------------- 'postgre':* (1 row)
- 全文検索フィルタリング辞書が追加されました。 (Teodor Sigaev)フィルタリング辞書はトークンを修正し、後続の辞書に渡すことができます。
- 全文検索テキスト内のメールアドレスでアンダースコアが許されるようになりました。 (Teodor Sigaev)
- URL のパースに、より標準に準拠したルールを使用するようになりました。(Tom Lane)
<? /* ———————————————————————————- */ ?>
関数
- データベースが UTF8 のとき、正規表現関数に大文字小文字区別なしマッチやロケール依存の文字分類をするように教えます。これまではシングルバイト文字のみ対応していました。なお、9.0 でも UTF8 以外のマルチバイト文字エンコーディングでは対応していません。
- 例
-
$ createdb -U postgres -T template0 -E UTF8 -l ja_JP.UTF-8 ja
- 9.0 の場合
-
ja=# SELECT 'AA' ~* '^a+'; ?column? ---------- t (1 row)
- 8.4.4 の場合
-
ja=# SELECT 'AA' ~* '^a+'; ?column? ---------- f (1 row)
- 関数呼び出しで引数名を指定する形式がサポートされました。 (Pavel Stehule)例えば func(a int, b int) という関数を SELECT func(b := 12, a := 7)として呼び出すことができます。
- to_char() 関数が数値の科学表記を行う EEEE フォーマットをサポートするようになりました。(Pavel Stehule, Brendan Jurd)
- to_char() 関数で、’Y’、’YY’、’YYY’ 形式に対して ‘FM’ (字詰めモード)の指定を尊重する振る舞いになりました。 (Bruce Momjian, Tom Lane)’YYYY’ については既にそのようになっていました。
- 9.0
-
db=# SELECT 'x' || to_char('2010-01-01'::timestamp, 'FMYYY') || 'x'; ?column? ---------- x10x
- 8.4.4
-
postgres=# SELECT 'x' || to_char('2010-01-01'::timestamp, 'FMYYY') || 'x'; ?column? ---------- x010x
- to_char() 関数が、Windows において適切にローカライズされた数字、金額の文字列を出力するように修正されました。 (Hiroshi Inoue, Itagaki Takahir, Bruce Momjian)
- polygon型データに対するオーバーラップ(&&)、包含(@>、@<) の演算子が正しい計算をするようになりました。(Teodor Sigaev)
- 例
- 以下は false を返さなければいけませんが、8.4.4 では true でした。このほかにいくつか問題となるケースがありました。
db=> SELECT '((1,1),(1,4),(5,4),(5,3),(2,3),(2,2),(5,2),(5,1))'::polygon db-> @> '((3,2),(3,3),(4,3),(4,2))'::polygon; +-----------------+ | | | +---*---*-----+ | | | | | +---*---*-----+ | | +-----------------+
集約関数
- 集約関数の中で ORDER BY が使えるようになりました。(Andrew Gierth)array_agg() 関数などは集約する順番に意味があるため有用です。集約対象とは別のカラムでソートすることもできます。
- 例
-
db=> SELECT array_agg(id ORDER BY id DESC) FROM test; array_agg ----------------- {101,100,3,2,1} (1 row)
- string_agg() 関数が追加されました。 (Pavel Stehule)複数行の値を一つの文字列に連結することができます。オプションの 2番目引数で区切り文字列を指定することもできます。
- 例
-
db=> SELECT * FROM t_agg; id | v ----+----- 1 | AAA 2 | BBB 3 | CCC (3 rows) db=> SELECT string_agg(v, ',') FROM t_agg; string_agg ------------- AAA,BBB,CCC (1 row)
- 集約関数の中で DISTINCT を使ったとき、集約関数を定義している状態遷移関数にSTRICT 指定がないなら、NULL値を無視するようになりました。(Andrew Gierth)組み込みの集約関数では array_agg 関数で NULL値を無視しないようになるという振る舞いの変化があります。sum や count では以前と同様に NULL は無視されます。
- 例 – 以下のように振る舞いが変わります
-
db=> SELECT * FROM test1; id | v -----+--- 1 | a 2 | b 3 | (NULL) 100 | d 101 | d (5 rows)
- 8.4.4の場合
-
db=> SELECT array_agg(DISTINCT v) FROM test1; array_agg ----------- {a,b,d} (1 row)
- 9.0 の場合
-
db=> SELECT array_agg(DISTINCT v) FROM test1; array_agg -------------- {a,b,d,NULL} (1 row)
- 複数引数の関数で DISTINCT が使えるようになりました。(Andrew Gierth)
ビット文字列
- bit文字列型むけの get_bit() 関数、set_bit() 関数が追加されました。もともと bytea型には存在していました。(Leonardo F)
- bit文字列型、byte型むけにt overlay() 関数が追加されました。もともと text型むけには存在していました。 (Leonardo F)
オブジェクト情報関数
- pg_table_size() 関数、pg_indexes_size() 関数が追加されました。pg_relation_size() 関数よりもユーザフレンドリなインターフェイスを提供します。(Bernd Helmle)
- has_sequence_privilege() 関数が追加されました。(Abhijit Menon-Sen)シーケンスの権限チェックを行うものです。
- インフォメーションスキーマが date型のオクテット長について適切な表示をするようになりました。(Peter Eisentraut)現在最大オクテット長が報告されるところ、これまで巨大な値が報告されていました。
- 情報スキーマの権限ビューが高速化されました。(Joachim Wieland)
- information_schema ビュー群が SQL:2008 に準拠するように更新されました (Peter Eisentraut)
関数/トリガーの作成
- 匿名関数を DO コマンドを使って作成できるようになりました。(Petr Jelinek, Joshua Tolley, Hannu Valtonen)手続き言語のコードを関数を作ることなく実行できます。
- 例
-
db=> DO LANGUAGE plpgsql db-> $$ BEGIN FOR i IN 1..5 LOOP RAISE NOTICE 'hello'; END LOOP; END; $$; NOTICE: hello NOTICE: hello NOTICE: hello NOTICE: hello NOTICE: hello DO
- SQL標準に従ったカラムごとのトリガーに対応しました。(Itagaki Takahiro)UPDATE文で SET対象に指定されたなど、指定したカラムに対して作用したときだけトリガーが起動します。情報スキーマ(information_schema)でカラムごとのトリガー定義情報を参照することができます。
- CREATE TRIGGER コマンドでトリガーを動作させる条件を指定できるようになりました。(Takahiro Itagaki)これまでトリガー関数内部でおこなっていたチェックを、WHEN句で記述してトリガー関数が呼ばれる前に行うことができます。これは性能上有利です。WHEN句には、条件として任意のTRUE/FALSEを返す式を指定でき、NEW.col、OLD.col も参照可能です。ただしサブクエリは書けません。
<? /* ———————————————————————————- */ ?>
サーバ側手続き言語
- CREATE LANGUAGEコマンドに「OR REPLACE」節が追加されました。(Tom Lane)これにより、追加で言語をインストールするときに、もし存在しなければインストールするという処理ができます。
PL/pgSQL
- PL/pgSQL がデフォルトでデータベースにインストールされるようになりました。(Bruce Momjian)
- PL/pgSQL が削除済みカラムを含む ROWTYPE を扱えるようになりました。(Pavel Stehule)a_table%ROWTYPE で型を指定したあとで ALTER TABLE a_table DROP col1を行っても動作するようになります。
- IN 引数に値を代入することができるようになりました。(Steve Prentice)
- エラー箇所の報告が改善されました。(Tom Lane)
- PL/pgSQL の字句解析処理が通常のSQLの字句解析処理に統合されました。これまで PL/pgSQL用に専用の字句解析ルーチンを使っていました。
- PL/pgSQLの変数名がSQLの識別子と衝突した場合の取り扱いが改善されました(Tom Lane)衝突した場合には(不可解な動作を回避して)エラーになるようになりました。この動作は設定 plpgsql.variable_conflict または 関数毎のオプション #variable_conflict で、変数名を優先する(「use_variable」)か、問い合わせの中のカラム名を優先する(「use_column」)か、エラーにする(「error」)かを調整できます。いかなる場合でも構文的に有効でない場所では変数名に置換することはありません。関数前のオプションは、以下のように関数本体テキストデータの冒頭に記載します。
CREATE FUNCTION f() RETURNS int AS $$ #variable_conflict use_column DECLARE : (中略) END; $$
- 不正なレコード参照での不要なエラー発行を回避するようになりました(Tom Lane)式に至ったときではなく、行を実際に取り出したときに不正ならエラーが発生するようになります。トリガー中でしばしば試みられる以下のようなコードが動作するようになります。
if TG_OP = 'INSERT' AND NEW.col1 = ... then
- PL/pgSQL におけるカーソルで、MOVE FORWARD/BACKWARD コマンドで件数指定と ALL オプションがサポートされました。(Pavel Stehule)
- PL/pgSQL で「WHERE CURRENT OF カーソル変数」の指定ができるようになりました。(Tom Lane)
- PL/pgSQL の「OPEN cursor FOR EXECUTE」に「USING expressions」コマンドによるパラメータ指定が使えるようになました。(Pavel Stehule, Itagaki Takahiro)
PL/Perl
-
- 以下の PL/Perl 内の関数が追加されました (Tim Bunce)quote_literal()
quote_nullable()
quote_ident()
encode_bytea()
decode_bytea()
looks_like_number()
encode_array_literal()
encode_array_constructor() - 設定変数 plperl.on_init が追加されました。PL/Perl を初期化する関数を指定するものです。(Tim Bunce)
- 以下の PL/Perl 内の関数が追加されました (Tim Bunce)quote_literal()
設定変数 plperl.on_plperl_init、plperl.on_plperlu_init でtrusted、untrusted を指定することもできます。
- PL/Perl のエラーコンテキストのサポートが改善されました。 (Alexey Klyukin)
- PL/Perl で ENDブロックがサポートされました。(Tim Bunce)現時点では END ブロックからはデータベースにアクセスすることができません。
- PL/Perl で strict が使えるようになりました。(Tim Bunce)設定変数 plperl.use_strict で有効にするか設定します。
- PL/Perl で require が使えるようになりました。 (Tim Bunce)これはモジュールが既にロードされているかテストして、なければエラーを出すというものです。
- Perl バージョン 5.10 以上であれば PL/Perl で feature が使えるようになりました。 (Tim Bunce)
- PL/Perl が返す値がサーバエンコーディングにおいて有効か検証するようになりました。(Andrew Dunstan)
PL/Python
- PL/Python でユニコードがサポートされます。(Peter Eisentraut)文字列は自動的にサーバエンコーディングに、またサーバエンコーディングから変換されます。
- PL/Python で bytea型のサポートが改善されました。(Caleb Welton)bytea型の値はテキスト形式でなく、バイナリデータとして表現されます。
Nullバイトも適切にPL/Python から出力できます。
PL/Python での Boolean型、numeric型の値の受け渡しも改善されています。 - PL/Python で 配列パラメータ、配列返し値がサポートされました。
- PL/Python での ドメインの Python基本型へのマッピングが改善されました。(Peter Eisentraut)
- PL/Python で Python 3 がサポートされました。(Peter Eisentraut)
これは手続き言語名としては「plpython3u」と呼ばれます。 - PL/Python でエラー箇所と例外の報告が改善されました。(Peter Eisentraut)
<? /* ———————————————————————————- */ ?>
アプリケーションツール
- vacuumdb に –analyze-only オプションが追加されました。(Bruce Momjian)
psql
- psql の変数と識別子が適切にエスケープできるようになりました。(Pavel Stehule, Robert Haas):’var’ はリテラルとしてエスケープされます。
:”var” はSQL識別子としてエスケープされます。- 例 – 「SELECT * FROM “test_table” WHERE id = ‘A123’」を実行します
-
db=> set tbl test_table db=> set keyid A123 db=> SELECT * FROM :"tbl" WHERE id = :'keyid';
- psql で先頭の UTF-8 エンコーディングのバイトオーダーマーク(BOM) を無視するようになりました。(Itagaki Takahiro)この振る舞いはクライアントエンコーディングが UTF8 であるとき有効になります。
- psql –file – 」としてデータを読み込むとき、合わせて指定した「–single-transaction」オプションを尊重するように修正されました。 (Bruce Momjian)
- 複数の psqlセッションが同時に実行された場合に、psql コマンドラインヒストリが上書きされてしまうのを防ぐようになりました。(Tom Lane)
- psql の TABキー補完が改善されました。(Itagaki Takahiro)
- iming の出力が有効であれば、quiet モードでも、出力するようになりました (Peter Eisentraut)
psql表示
- psql で ユニコードの罫線文字を使った表示が選択できるようになりました。「
pset
linestyle unicode」と指定します。(Roger Leigh) - psql でカラムの折り返し表示が改善されました。(Roger Leigh)改行のあるカラムでは行末に + が表示されます。以前の表示形式にするには「pset linestype old-ascii」と指定します。
- 8.4.4
-
db=> SELECT '改行 db'> のある文字列'; ?column? -------------- 改行 のある文字列 (1 row)
- 9.0
-
db=> SELECT '改行 db'> のある文字列'; ?column? -------------- 改行 + のある文字列 (1 row)
psql d
コマンド
d
が継承した子テーブルも表示するようになりました。d
では子テーブルの数を、d
+ では子テーブルのリストを返します。直接の継承先のみが表示されます(孫テーブルは出ない)。- 例
-
db=> d oya Table "public.oya" Column | Type | Modifiers --------+---------+----------- id | integer | Number of child tables: 1 (Use d+ to list them.)
- 「
d
インデックス名」でインデックスの定義が表示されます。(Khee Chin) d
でなくd
+ を指定したときのみビュー定義を表示するようになりました。(Peter Eisentraut)
pg_dump
- pg_dump と pg_restore の –clean オプションでラージオブジェクトも削除されるようになりました。(Itagaki Takahiro)
- standard_conforming_strings が有効になっている場合に、pg_dump が適切にラージオブジェクトをダンプするように修正されました。(Tom Lane)
- pg_dump で複合型のカラムへのコメントがダンプできるようになりました。(Taro Minowa (Higepon))
- pg_dump –verbose がテキストモードの場合に pg_dump とサーバのバージョンを出力するようになりました。(Jim Cox, Tom Lane)カスタムモードの出力では既に存在する仕様です。
- pg_restore はラージオブジェクトデータを hexフォーマットで(サーバに対して)発行するようになります。(Tom Lane)9.0 より前のサーバに対してロードするときに互換性の問題が生じます。
- pg_restore はファイル名指定の後にあるオプション指定について警告を出すようになりました (Tom Lane)これまでは単に無視されていました。
pg_ctl
- pg_ctl がブート時に安全に postmaster を起動できるようになりました。(Tom Lane)これまでは pg_ctl が 古い postmaster.pid ファイルをもとに判断し、postmaster の起動を誤認する可能性がありました。
- pg_ctl で initdb ができるようになりました。(Zdenek Kotala)
<? /* ———————————————————————————- */ ?>
開発ツール
libpq
- libpq に関数 PQconnectdbParams()、PQconnectStartParams() が追加されました。これらは 接続文字列の代わりに null終端の配列により接続オプションを与える点以外は、PQconnectdb() と PQconnectStart() と同様の関数です。
- libpq に関数 PQescapeLiteral()、PQescapeIdentifier() が追加されました。(Robert Haas)これら関数は、文字列リテラルと識別子を適切にクオートして返します。また、呼び出し側は PQescapeStringConn() のようにあらかじめ結果文字列の領域を割り当てておく必要がありません。
- ユーザごとにサービスファイル(.pgservice.conf)を確認するようになりました。以前はサイトごとのサービスファイルだけが適用可能でした。(Peter Eisentraut).pg_service.conf はユーザのホームディレクトリにあるものとされます。サービスファイルとは接続オプションをサービス名に関連付けるもので、libpq ではサービス名によって接続オプションを指定することができます。
- libpq で指定のサービスが見つからない場合のエラー報告が適切なものになりました。(Peter Eisentraut)
- .pgpass ファイルから取り出したパスワードで接続に失敗したときに、警告を出すようになりました。(Bruce Momjian)
- SSL証明書チェインを読み込みするようになりました (Tom Lane)これは、間接的に署名されたSSLクライアント証明書の処理を改善するものです。
- libpq に TCP keepalive の設定が加わりました(Tollef Fog Heen, Fujii Masao, Robert Haas)keepalive設定はサーバ側では既にサポートされていました。
- 別の方式を要求するプラットフォームで PIGPIPEシグナルをブロック/ブロック解除する余分なシステムコールを無効にしました (Jeremy Kerr)
ecpg
- ecpg で SQLDA (SQL Descriptor Area) がサポートされました。(Boszormenyi Zoltan)
- ecpg で DESCRIBE [OUTPUT] がサポートされました。(Boszormenyi Zoltan)
- ecpg ライブラリ関数に現在のトランザクション状態を返す関数が追加されました。(Bernd Helmle)
- ecpg の Informix互換モードに文字列データ型が追加されました(Zoltan Boszormenyi)
- ecpg で新旧の変数名が制約なしに使用できるようになりました。(Michael Meskes)
- ecpg で free() に変数名が使えるようになりました。 (Michael Meskes)
- ecpg で SQL3 でないデータ型にはゼロを返すようになりました。(Michael Meskes)これまでは データタイプの oid をマイナスにした値を返していました。
- ecpg で 64bit のプラットフォームで long long 型をサポートしました。(Michael Meskes)
ecpgカーソル
- ecpg で ネイティブモードのときスコープ外のカーソルをサポートします(Boszormenyi Zoltan)これは DECLARE で OPEN をしたとき スコープになかった変数を使うことができるというものです。Informix互換モードでは既に可能でした。
- 動的な ecpg カーソル名に対応しました。(Boszormenyi Zoltan)
- ecpg で FROM と IN を FETCHコマンド と MOVEコマンドの中で書くことができるようになりました。(Zoltan Boszormenyi)構文上のノイズに過ぎませんので書かない場合と動作は同じです。
<? /* ———————————————————————————- */ ?>
ビルドオプション
-
- クライアントをスレッドセーフにするビルド設定がデフォルトになりました。(Bruce Momjian)
無効にするには ./configure で –disable-thread-safety を指定します。
- Linux の OOM Killer (out-of-memory killer) がバックエンドプロセスを殺すのを許すコンパイル時オプションが追加されました。(Alex Hunsaker, Tom Lane)現在 /proc/self/oom_adj で Linux の OOM Killer を postmaster と子プロセスに対して無効にすることができます。新たなコンパイル時オプション-DLINUX_OOM_ADJ=0 は、バックエンドの子プロセスについて OOM Killer の調整をするものです。pg_config コマンドでコンパイル時にこの設定をしたか確認できます。
- DocBook XSL スタイルシートを manページにも使うようになりました。(Peter Eisentraut)
Makefiles
- 新たな Makefile のターゲット world、install-world、installcheck-worldが導入されました。(Andrew Dunstan)これらは all、install、installcheck と似ていますが、HTMLドキュメント、contrib もビルドする点、手続き言語、ecpg もテストする点が異なります。
- PGXS の Makefile に データ位置、ドキュメント位置が含まれるようになりました。
- TMLドキュメントの Makefile が作り直されました。 (Peter Eisentraut)
ビルド要件
- ソースからのビルドに Autoconf 2.63 が必要になります。(Peter Eisentraut)
- ソースからのビルドに Flex 2.5.31 以上が必要になります。(Tom Lane)
- リポジトリ配布のソースからのビルドに Perl 5.8 以上が必要となります。(John Naylor, Andrew)
Windows
- 64bit Windows でのコンパイル、64bit モードでの動作がサポートされました。(Tsutomu Yamada, Magnus)これにより大きいサイズの共有メモリが Windows で使用できます。
- Visual Studo 2008 でビルドできるようになりました。(Magnus Hagander)
<? /* ———————————————————————————- */ ?>
ソースコード
- メインの配布tarball内にtarアーカイブファイルとして在った文書を各適切なディレクトリに分散するようにしました。(Peter Eisentraut)例えば HTMLドキュメントは doc/src/sgml/html にあります。manページも同様で doc/src/sgml/man1 などにあります。
- サーバ字句解析がリエントラントになりました。(Tom Lane)PL/pgSQLから同じ字句解析ルーチンを使うために必要でした。
- メモリ割り当ての速度が改善されました。(Tom Lane, Greg Stark)
- システムカタログのカラム pg_constraint.conindid と pg_trigger.tgconstrindid について、制約のためにインデックスを使う方法のより良いドキュメントが追加されました (Tom Lane)
- 同じ OS シグナルを使って複数アクションを実行できるようになりました。
新たな機能を加える際などのバックエンドの通信を改善します。 - ソースコードのテストカバレッジが改善されました。contrib、PL/Python、PL/Perl が含まれます。(Peter Eisentraut, Andrew Dustan)
- ユーザ定義制約トリガーが pg_trigger だけでなく pg_constraint にもエントリを持つようになりました (Tom Lane)この変更は pg_constraint.pgconstrname が冗長で削除されたためです。
- 初期化時のシステムカタログにおいて pg_attribute の初期内容が自動的に生成されるようになりました。(John Naylor)これは初期化時のシステムカタログを大変にシンプルにします。
- psql文字列が翻訳しやすく改善されました。(Peter Eisentraut)
- ファイルパスが100文字以内になるように一部のファイル名を短くしました。(Tom Lane)一部の解凍プログラムが長いファイル名で問題をおこしていました。
- int2 配列の入力で入力要件を厳しくしました。(Caleb Welton)
- 新たな SQLSTATE エラーコード ERRCODE_INVALID_PASSWORD を追加しました。(Bruce Momjian)
- 僅かに残っていた個人のソースコード著作権表記を適切に取り除きました。(Bruce Momjian)大きな問題ではありませんでしたが、コミュニティは時折、それについての質問に答えなければいけませんでした。
- INSERT/UPDATE/DELETE の処理が execMain.c の外へ分離されました (Marko Tiikkaja)更新処理は現在 ModifyTable の中で行われます。この変更は将来の改良のための基盤となるために必要です。
- 性能改善のために永続性のないモードで動作させることに関するセクションがドキュメントに追加されました (Bruce Momjian)
- HTML文書の makefile ルールが、不必要な再ビルドを回避するように再構築しました (Peter Eisentraut)
- Docbook2X でなく DocBook XSLスタイルシートを manページ構築に使うようになりました (Peter Eisentraut)この変更により man pages のビルドにツール一式が必要になります。
- PL/Perl コード構造を改善しました (Tim Bunce)
- PL/Perlのエラーコンテキストの報告が改善されました (Alexey Klyukin)
ポータビリティ
- Bonjour のより新しいAPIを使うようになりました。(Tom Lane)Bonjour を使うには OS X 10.3 以上が必要となります。
- superH アーキテクチャ むけに CPUによる test-and-test ロックをサポートしました。(Nobuhiro Iwamatsu)
- GCC 以外のコンパイラでのインライン関数に対応しました。(Kurt Harriman)
- 64bit整数型をサポートしないプラットフォームをサポート対象から外しました。全てのこれまでサポートしてきたプラットフォームは 64bit整数型をサポートしていると思われます。(Tom Lane)
- LDFLAGS の使用がよりプラットフォーム間で一貫性を持つように再構成されました (Tom Lane)LDFLAGS は現在、実行ファイルと共有ライブラリの両方にむけて使われます。他に、実行ファイルむけの LDFLAGS_EX、共有ライブラリむけの LDFLAGS_SL を追加しました。
サーバプログラミング
- C++関数をバックエンドコードに安全に使えるようにしました。(Kurt Harriman, Peter Eisentraut)C++の使用を困難にしてきたキーワード衝突を除きました。「extern “C” { }」を適切な場所に書くことは現在でも必要です。
- C関数が集約処理で呼ばれているのかを検出する関数 AggCheckCallContext() が追加されました。(Hitoshi Harada)
- NULL でない4番目の引数を使うのにバックエンドマクロ fastgetattr() とheap_getattr() が必要になります。(Robert Haas)
- C関数が集約として呼び出されているかを検出する AggCheckCallContext() が追加されました (Hitoshi Harada)
- キャッシュキーの最大数が固定記述になるのを避けるために、SearchSysCache() と関連関数への呼び出し規約が変更されました (Robert Haas)既存の呼び出しは暫くは動作しますが、次バージョン以降において対応しなくなります。
- カスタムのANALYZE関数が渡されるデータのタイプを決めるのに VacAttrStats.attr に依存しなくなります。この変更は、格納タイプが基本データ型と異なるインデックスカラムの統計情報を収集できるようにするためのものです。実際のデータ型がANALYZEされているかを伝える新たなフィール
ドが設置されます。
サーバフック
- パーサ(構文解析器)に問い合わせのカラムアクセスとパラメータ参照のフックが追加されました。(Tom Lane)
- 追加ロードモジュールをユーティリティコマンドを制御できるようにフックを追加しました。(Itagaki Takahiro)
- SPI とキャッシュされたプラン経由での、パーサコールバックフックの呼び出しがサポートされました。(Tom Lane)
<? /* ———————————————————————————- */ ?>
バイナリアップグレードサポート
- relfilenodes の維持がサポートされました。バイナリアップグレードに使います。(Bruce Momjian)
- pg_type と pg_enum の OID の維持がサポートされました。バイナリアップグレードに使います。(Bruce Momjian)ユーザ定義の複合型、配列、列挙型 を使っている場合に必要です。
- テーブルスペースのデータディレクトリを PostgreSQLバージョン固有のサブディレクトリに移動しました。(Bruce Momjian)バイナリアップグレードを容易にするものです。
- バイナリアップグレード中に relfilenode値を維持するようになりました(Bruce Momjian)
<? /* ———————————————————————————- */ ?>
contrib
- contrib/pg_upgrade が加わりました。データを置き換えてバージョンアップ(バイナリアップグレード)するものです。(Bruce Momjian)
これによりメジャーバージョンアップをする際のダンプ、リストアを回避することができます。バージョン 8.3、8.4 からのアップグレードをサポートします。 - contrib/pgbench にマルチスレッドオプション -j が加わりました。(Itagaki Takahiro)これにより複数CPUコアマシンで pgbench テストを有効に行うことができます。
- contrib/pgbench に
shell 、
setshell メタコマンドが追加されました。(Michael Paquier)シェルコマンド実行をさせたり、結果の値を使ったりすることができます。
- contrib/dist_xsyn に新たな機能が加わりました。(Sergey Karpov)新オプション matchorig、matchsynonyms、keepsynonyms が使用できます。
- テキスト全文検索の辞書 contrib/unaccent が加わりました。(Teodor Sigaev)アクセント記号をトークンから取り除くフィルター辞書です。
- contrib/dblink に dblink_get_notify() 関数が追加されました。(Marcus Kempe)dblink で非同期通知を使うことができます。
- contrib/hstore でハッシュ要素長の上限が大幅に拡大されました。GROUP BY、DISTINCT がハッシュで使えるようになりました。(Andrew Gierth)
ほかにも関数、演算子が追加されています。 - contrib/passwordcheck が追加されました。設定したパスワードの強さをチェックすることができます。(Laurenz Albe)
このモジュールのソースコードはサイト毎のパスワードポリシーに従って修正してください。 - contrib/auto_explain で SQL文を出力できるようになりました。(Andrew Dunstan)
- contrib/pg_stat_statements にバッファアクセスカウンターが追加されました。(Itagaki Takahiro)
- contrib/start-script/linux が新しくなりました。/proc/self/oom_adj で OOM (out-of-memory) Kill を無効にするようになっています。(Alex Hunsaker, Tom Lane)