リリース9.0

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 付録 E. リリースノート | 早送り | 次のページ

# E.8. リリース9.0

> リリース日: 2010-09-20

## E.8.1. 概要

このリリースのPostgreSQLで数年に渡り要望があった、簡単に利用できるレプリケーション、一括権限管理機能、匿名ブロックといった機能を追加しました。 これまでのメジャーリリースではその範囲は保守的なものでしたが、このリリースでは、これまでPostgreSQLを使用してきたユーザや新しく使い始めるユーザが喜ぶ機能を提供できることに大胆かつ新しい期待を持っています。 これはすべて非互換性がほぼないようになされました。 主な改良点を以下に示します。

- 組込みのログシッピングによるレプリケーション。 この進歩は次の2つの機能から構成されます。 ストリーミングレプリケーションにより、継続的なアーカイブ(WAL)ファイルをスタンバイサーバに対してネットワーク上にストリーミングさせることができます。 ホットスタンバイにより、継続的アーカイブを行うスタンバイデータベースサーバは読み取り専用の問い合わせを受け付けることができます。 これらを合わせた結果、シングルマスタと複数の読み取り専用のスレーブサーバをサポートします。

- より簡単なデータベースオブジェクトの権限管理。 `GRANT`/`REVOKE IN SCHEMA`は既存のオブジェクトに対するは一括権限変更をサポートし、そして、`ALTER DEFAULT PRIVILEGES`は将来作成されるオブジェクトの権限を制御します。 ラージオブジェクト（BLOB）も同様に権限管理をサポートするようになりました。

- ストアドプロシージャサポートの大きな改良。 `DO`文により、その場限り、または、"匿名"のコードブロックをサポートします。 関数は名前付きパラメータを使用して呼び出すことができるようになりました。 PL/pgSQLはデフォルトでインストールされるようになり、また、PL/PerlおよびPL/Pythonは、Python3のサポートを含む多くの点で改良されました。

- 64ビットWindowsを完全にサポートします。

- 追加されたウィンドウ処理オプション（`PRECEDING` and `FOLLOWING`）と集約関数に渡される値の順序を制御する機能による、より先端的な報告問い合わせ。

- SQL互換の列単位のトリガと条件付きのトリガ実行など、新しいトリガ機能。

- 遅延可能な一意性制約。工夫することなく一意キーの大量更新ができるようになります。

- 排他制約。 これらは、複雑な条件を強制させることができる、汎用的な一意性制約を提供します。

- 新しく高度なセキュリティ機能。 RADIUS認証、LDAP認証の改良、パスワード強度を検査する新しい`passwordcheck`オプションモジュールなどがあります。

- 新しい高性能な`LISTEN`/`NOTIFY`機能の実装。 待ち状態のイベントがテーブルではなく、メモリベースのキューに格納されるようになりました。 また、以前のようにイベント名だけを送信するのではなく、"ペイロード"文字列を各イベントといっしょに送信できるようになりました。

- 新しい`VACUUM FULL`の実装。 このコマンドは、容量を抑えるために行を一行一行移動するのではなく、テーブルおよびインデックス全体を書き換えるようになりました。 ほとんどの状況でかなり高速になり、また、インデックスが膨張することがなくなりました。

- 8.3または8.4から9.0へのその場での更新をサポートする`pg_upgrade`を追加しました。

- 不要な結合を除去するなど、特定の種類の問い合わせに対する複数の性能向上。 オブジェクト/リレーションマッパ(ORM)で生成されるなどの自動生成される問い合わせの一部を最適化する際に役に立ちます。

- `EXPLAIN`の改良。 この出力がJSON、XML、YAML形式で利用可能になりました。 これまでは利用できなかったバッファ使用状況などその他のデータが含まれるようになりました。

- 新しい関数やより多くのデータ能力など、`hstore`の改良。

上述の項目については、以下でより詳しく説明します。

## E.8.2. バージョン9.0への移行

全ての以前のリリースからデータの移行を行うためには、pg_dumpを使用したダンプ/リストア、または、pg_upgradeの使用が必要です。

バージョン9.0には、新機能のサポートおよびコード品質の向上のために、後方互換性を一部壊してしまう多くの変更が含まれます。 具体的にはPL/pgSQL、ポイントインタイムリカバリ（PITR）およびウォームスタンバイを多く使用しているユーザは、これらにユーザに影響する変更が多くありますので、自身のアプリケーションを試験しなければなりません。 以下の非互換性に注意してください。

### E.8.2.1. サーバの設定

- `add_missing_from`サーバパラメータがなくなりました。 これは長い間デフォルトで無効でした。(Tom Lane)

- `regex_flavor`サーバパラメータがなくなりました。 これは長い間デフォルトで`advanced`でした。(Tom Lane)

- `archive_mode`は`archive_command`のみに影響するようになりました。 新しい`wal_level`設定は先行書き込みログの内容に影響を与えます。

- `log_temp_files`がデフォルトのファイルサイズの単位としてキロバイトを使用するようになりました。(Robert Haas)

### E.8.2.2. 問い合わせ

- 親テーブルを問い合わせる場合、問い合わせの一部としてスキャンされる子テーブルに対する異なる権限検査がまったく行われません。(Peter Eisentraut)

  標準SQLではこの挙動を規定しています。 また、実際の所、親と同様に子それぞれに権限を検査するという以前の振舞いよりも非常に便利です。

### E.8.2.3. データ型

- `bytea`の出力はデフォルトで16進数書式になりました。(Peter Eisentraut)

  互換性が必要ならば`bytea_output`サーバパラメータを使用して伝統的な出力書式を選択することができます。

- 配列入力において通常のASCII空白文字のみを無視可能なものとみなすようになりました。 一部のロケールに従うと空白文字になるものであっても、ASCII文字以外を無視することはありません。

  これは、配列の値がサーバのロケール設定に依存して異なった解釈をされる場合の一部の境界問題を防止します。

- `SIMILAR TO`パターンとSQL形式の`substring()`パターンの標準互換性を高めました。(Tom Lane)

  これには、パターンのメタ文字としての`?`および`{...}`の扱いが含まれます。 これらの文字は以前は単なるリテラル文字でしたが、SQL:2008で追加された新しい機能に対応しました。 また`^`および`$`は単なるリテラル文字として扱われるようになりました。 これまでは、パターンがSQL規則ではなくPOSIXに従うかのようにメタ文字として扱われていました。 また、標準SQLの`substring()`では入れ子のための括弧が部分文字列の取得に影響を与えることがなくなりました。 同時に大括弧式(文字クラス)の処理の標準に対する互換性が高まりました。

- 標準SQLに従い、`substring()`の第3パラメータでは負の長さ値を拒絶します。(Tom Lane)

- `date_trunc`を秒の端数に対する精度を減らす時に四捨五入するのではなく切り捨てるようにしました。(Tom Lane)

  整数を基にした日付時刻では常にこのようにこのコードは動作していました。 浮動小数点を基にした日付時刻も同様に動作するようになりました。

### E.8.2.4. オブジェクトの改名

- 子テーブルが複数の関連がない親から同じ列を継承する場合、`RENAME`中の列名の一貫性をより厳しく強制します。(KaiGai Kohei)

- 背後にあるテーブル列が改名された場合にインデックス名とインデックス列名は自動的に改名されなくなりました。(Tom Lane)

  管理者はまだこうしたインデックスや列を手作業で改名することができます。 この変更は、改名後も一意性インデックスが正しく認識されるように、JDBCドライバとおそらく他のドライバの更新を要求します。

- `CREATE OR REPLACE FUNCTION`で宣言された関数パラメータの名前を変更できなくなりました。(Pavel Stehule)

  名前付きパラメータ呼び出しにおけるあいまい性を防ぐために、既存関数の宣言における入力変数に対する別名を変更できないようになりました。 （しかし過去に名前を付けていないパラメータには名前を割り当てることができます。） これを行うためには関数を`DROP`し再作成しなければなりません。

### E.8.2.5. PL/pgSQL

- 変数名が問い合わせで使用される列名と競合する場合にPL/pgSQLはエラーを発生するようになりました。(Tom Lane)

  これまでの動作は問い合わせの列名より優先してあいまいな名前をPL/pgSQL変数にバインドすることでした。 これはよく驚くほどの誤動作をもたらしていました。 エラーを発生させることにより、曖昧な状況を簡単に検知できるようになります。 こうしたエラーを発生させる関数を修正し、競合を解消させることを推奨しますが、`plpgsql.variable_conflict`サーバ変数または関数毎の`#variable_conflict`オプションにより従来の動作に戻すことができます。

- PL/pgSQLは特定のSQL予約語と一致する変数名を許さなくなりました。(Tom Lane)

  これはPL/pgSQLのパーサをよりコアのSQLパーサに近づけるように調整した結果です。 必要ならば、変数名を二重引用符でくくることでこの制限を回避することができます。

- PL/pgSQLは、基本型と同様に想定する型修飾子と一致する複合型結果の列を必要とするようになりました。(Pavel Stehule, Tom Lane)

  例えば、結果の列の型が`NUMERIC(30,2)`と宣言されていた場合、その列に多少異なる精度の`NUMERIC`を返すことを受け付けなくなりました。 これまでのバージョンでは修飾子の検査は省略され、その結果、実際には宣言された制限に従わない結果行が許されていました。

- PL/pgSQLが複合型のフィールドへの選択をより一貫性を持って扱うようになりました。(Tom Lane)

  これまでは、`SELECT ... INTO `rec`.`fld` FROM ...`のような文は`fld`レコードフィールドが複合型であったとしてもスカラの代入として扱われました。 これが、`INTO`の対象が通常の複合型の変数であった場合と同様に、レコードの代入として扱われるようになりました。 このため、このフィールドのサブフィールドに代入される値は、これまでのバージョンにおける`ROW(...)`式ではなく、`SELECT`リストの別々の列として記述されなければなりません。

  9.0と過去のリリースの両方で動作する方法で行う必要があれば、``rec`.`fld` := ROW(...) FROM ...`のように記述することができます。

- PL/pgSQLの`RENAME`宣言を削除しました。(Tom Lane)

  `RENAME`の代わりに`ALIAS`を使用してください。 これは、以前のような（例えば`$1`のような）ドル記号付きの変数だけではなく任意の変数に別名を作成することができるようになります。

### E.8.2.6. その他の非互換性

- 演算子名としての`=>`を使用を廃止する予定です。(Robert Haas)

  名前付きパラメータに関する標準SQL記法をサポートするために、将来のバージョンのPostgreSQLではおそらくこの演算子名を完全に拒絶します。 現時点ではまだ許されますが、このような演算子が定義された場合に警告が現れます。

- 64ビット整数データ型が動作しないプラットフォームのサポートを取りやめました。(Tom Lane)

  まだサポートされているプラットフォームはすべて64ビット整数データ型が動作するはずです。

## E.8.3. 変更点

バージョン9.0には予期しないほど多くの主要機能が追加され、また、増強、改良、新しいコマンド、新しい関数、その他の変更が200以上あります。

### E.8.3.1. サーバ

#### E.8.3.1.1. 継続的アーカイブ処理とストリーミングレプリケーション

PostgreSQLに存在するスタンバイサーバ機能は、スタンバイサーバにおいて読み取り専用の問い合わせをサポートすること、および、マスタサーバとスタンバイサーバとの間の遅延を大きく削減することができるように拡張されました。 多くのユーザにとって、これは有用かつ、高可用性、スケールアウト性を目的としたレプリケーションを構成する管理作業を低減します。

- スタンバイサーバで読み取り専用の問い合わせを受け付けることができます。(Simon Riggs, Heikki Linnakangas)

  この機能はホットスタンバイと呼ばれます。 この機能を制御するための新しい設定が`postgresql.conf`と`recovery.conf`にあります。 さらに広大な文書も存在します。

- 先行書き込みログ(WAL)データをスタンバイサーバに流し込むことができます。(Fujii Masao, Heikki Linnakangas)

  これはストリーミングレプリケーションと呼ばれます。 これまでWALデータはWALファイル全体（通常それぞれ16メガバイト）を単位としてのみスタンバイサーバに送付することができました。 ストリーミングレプリケーションはこの非効率性を減らし、マスタの変更をほとんど遅延なくスタンバイサーバに伝播できるようになります。 この機能を制御するための新しい設定が`postgresql.conf`と`recovery.conf`にあります。 さらに広範囲の文書も存在します。

- スタンバイサーバのWAL状況の監視に使用することができる、`pg_last_xlog_receive_location()`および`pg_last_xlog_replay_location()`を追加しました。(Simon Riggs, Fujii Masao, Heikki Linnakangas)

#### E.8.3.1.2. 性能

- `ALTER TABLESPACE ... SET/RESET`を使用して、テーブル空間単位の値をシーケンシャルおよびランダムページコスト推定（`seq_page_cost`/`random_page_cost`）に設定できます。(Robert Haas)

- 結合問い合わせにおけるEvalPlanQual再検査の性能と信頼性を改善しました。(Tom Lane)

  最近更新された行に対する、結合を含む`UPDATE`、`DELETE`および`SELECT FOR UPDATE/SHARE`問い合わせが非常によく動作するようになりました。

- 同じトランザクションにおいてテーブル生成またはテーブルデータの消去が以前に行われていた場合の、`TRUNCATE`の性能を改良しました。(Tom Lane)

- 継承された子テーブルの検索性能を改良しました。(Tom Lane)

#### E.8.3.1.3. オプティマイザ

- 不要な外部結合を除きました。(Robert Haas)

  内側が一意かつ結合の上位で参照されない場合の外部結合は不要ですので、削除されるようになりました。 これは、オブジェクト/リレーションマッパ（ORM）で作成される問い合わせなど、多くの自動生成される問い合わせを高速化します。

- `IS NOT NULL`制限でインデックスを使用できます。(Tom Lane)

  これは特に、インデックス内に多くのNULL値を含む場合の`MAX()`/`MIN()`値の検索に有用です。

- いつマテリアライズされたノードを使用するか、および、`DISTINCT`についてソート処理を使用するかハッシュ処理を使用するか、に関するオプティマイザの選択を改良しました。(Tom Lane)

- `boolean` `<>`演算子を含む式におけるオプティマイザの等価検知を改良しました。(Tom Lane)

#### E.8.3.1.4. GEQO

- GEQOが問い合わせ計画を作成する時毎回、同じランダムシードを使用します。(Andres Freund)

  遺伝的問い合わせオプティマイザ(GEQO)は無作為な計画を選択し続けますが、同一の問い合わせに対して同じ無作為な計画を選択するようになりました。 これによりより一貫した性能が得られます。 他の計画を試すために`geqo_seed`を変更することができます。

- GEQOの計画選択を改良しました。(Tom Lane)

  まれに発生する"failed to make a valid plan"エラーを防止します。 また計画作成速度も改良されたはずです。

#### E.8.3.1.5. オプティマイザの統計情報

- 継承ツリー統計情報をサポートする`ANALYZE`を改良しました。(Tom Lane)

  具体的にはこれはパーティション分けされたテーブルで有用です。 しかし子テーブルが変更された時に、自動バキュームはまだ自動的に親テーブルを再解析しません。

- 再解析が必要か否かに関するautovacuumの判定を改良しました。(Tom Lane)

- より大きい/より小さいの比較についてオプティマイザの推定を改良しました。(Tom Lane)

  より大きい/より小さいの比較についての統計情報を検索する時、比較用の値がヒストグラムバケットの先頭または末尾にあれば、現在の列の最小と最大を得るために（利用可能であれば）インデックスを使用します。 これは データ範囲の終端に近い比較値に対する推定精度を、特に新しいデータの追加によりデータ範囲が定常的に変更する場合に、大きく改善します。

- `ALTER TABLE`を使用することで、個別値の個数に関する統計情報の設定が可能です。(Robert Haas)

  これにより、列の個別値の数もしくは割合をユーザが上書きすることができます。 この統計情報は通常`ANALYZE`で計算されますが、特に非常に多くの行があるテーブルでは推定値が悪化することがあり得ます。

#### E.8.3.1.6. 認証

- RADIUS (リモート認証ダイヤルインユーザサービス)認証サポートを追加しました。(Magnus Hagander)

- LDAP(軽量ディレクトリアクセスプロトコル)認証において"search/bind"モードで操作できます。(Robert Fleming, Magnus Hagander)

  これにより、まずユーザを検索し、その後にそのユーザ用に返されるDN(識別名)をシステムが使用することができるようになります。

- `samehost`および`samenet`指定を`pg_hba.conf`に追加しました。(Stef Walter)

  これらはそれぞれサーバのIPおよびサブネットアドレスに一致します。

- クライアントが適切なクライアント証明書を返すことができるように、クライアントに信頼できるSSLルート証明書の名前を渡します。(Craig Ringer)

#### E.8.3.1.7. 監視

- クライアントが`pg_stat_activity`で表示される、アプリケーション名を設定できる機能を追加しました。(Dave Page)

  これにより管理者は元となるアプリケーションによってデータベースの流量を特徴付けし、また、問題への対応を行うことができます。

- `log_line_prefix`にSQLSTATEオプション(`%e`)を追加しました。(Guillaume Smet)

  これによりユーザはエラーコード番号によりエラーとメッセージに関する統計情報を収集することができます。

- UTF16符号化方式でWindowsのイベントログに書き出します。(Itagaki Takahiro)

  これでWindowsのPostgreSQLのログメッセージに対する多言語サポートが実現しました。

#### E.8.3.1.8. 統計情報カウンタ

- クラスタ全体で共有するバックグラウンドライタの統計情報をリセットするための`pg_stat_reset_shared('bgwriter')`を追加しました。(Greg Smith)

- 個々のテーブルおよび関数用の統計情報カウンタのリセットを可能とする`pg_stat_reset_single_table_counters()`および`pg_stat_reset_single_function_counters()`を追加しました。(Magnus Hagander)

#### E.8.3.1.9. サーバ設定

- データベースまたはロールの組み合わせに基づく設定パラメータを設定することができます。(Alvaro Herrera)

  これまではデータベース単位およびロール単位の設定のみが可能で、組み合わせることができませんでした。 すべてのロールおよびデータベースの設定が新しい`pg_db_role_setting`システムカタログに格納されるようになりました。 新しいpsqlの`\drds`コマンドはこれらの設定を表示します。 古い`pg_roles`、`pg_shadow`および`pg_user`システムビューでは組み合わせた情報を表示しません。 このためこれらはユーザまたはデータベース用の設定を完全に表さなくなりました。

- `bonjour`サーバパラメータを追加しました。 これはBonjourが有効なサーバが自身をBonjour経由で広告するかどうかを制御します。(Tom Lane)

  デフォルトは無効で、広告を行わないことを意味します。 これによりパッケージ作成者は個々のユーザがこの機能を欲しないかどうか気にすることなく、Bonjourを有効として構築したものを配布することができます。

- オプティマイザ内でノードマテリアライゼーションの使用を制御する、`enable_material`サーバパラメータを追加しました。(Robert Haas)

  デフォルトは有効です。 無効の場合、オプティマイザは純粋に性能上の理由のためにマテリアライズされたノードを追加しません。 ですが正確性のために必要な場合は使用されます。

- デフォルトのファイルサイズの単位としてキロバイトを使用するように`log_temp_files`サーバパラメータを変更しました。(Robert Haas)

  これまでは単位指定がない場合、この設定はバイト単位として解釈されました。

- `postgresql.conf`が再読み込みされた場合、パラメータ値の変更記録が残ります。(Peter Eisentraut)

  これにより管理者およびセキュリティ担当者はデータベースが変更された時点を監査することができるようになります。 また`postgresql.conf`の変更が反映されたかどうか検査することもでき、非常に便利です。

- 独自のサーバパラメータに対して、適切にスーパーユーザ権限を強制します。(Tom Lane)

  スーパーユーザ以外のユーザが、その時にサーバが認識していないパラメータに対する`ALTER ROLE`/`DATABASE SET`を発行することができなくなりました。 これによりサーバは、スーパーユーザのみのパラメータがスーパーユーザのみにより設定されることを正しく検査することができます。 これまではセッション開始時に`SET`は受け付けられますが、無視されていました。 このためスーパーユーザのみの独自パラメータが本来の有用性を持っていませんでした。

### E.8.3.2. 問い合わせ

- 返される行数を常に予測できるように、`LIMIT`の適用後に`SELECT FOR UPDATE`/`SHARE`処理を行います。(Tom Lane)

  これまでは、同時実行のトランザクションによりなされた変更により、`SELECT FOR UPDATE`がその`LIMIT`で指定した行より少ない行が返ってしまうことが発生しました。 `ORDER BY`を付けた`FOR UPDATE`は今でも予想外の結果を生成することがあり得ますが、これは副問い合わせで`FOR UPDATE`を使用することで正しくすることができます。

- `LIMIT`/`OFFSET`構文に関して、伝統的な方法と標準SQLの方法を混在できるようにしました。(Tom Lane)

- ウィンドウ関数でサポートされるフレームオプションを拡張しました。(Hitoshi Harada)

  フレームは`CURRENT ROW`から始められるようになり、また、`ROWS n PRECEDING`/`FOLLOWING`オプションがサポートされるようになりました。

- `SELECT INTO`および`CREATE TABLE AS`はそのコマンドタグ内でクライアントに行数を返します。(Boszormenyi Zoltan)

  これにより、追加の`COUNT`問い合わせを行うことなく結果数やページ数を計算することができますので、クライアントとの往復作業を完全になくすことができます。

#### E.8.3.2.1. Unicode文字列

- Unicodeサロゲートペア(二重の16ビット表現)を`U&`文字列および識別子でサポートします。(Peter Eisentraut)

- `E'...'`文字列内のUnicodeエスケープをサポートします。(Marko Kreen)

### E.8.3.3. オブジェクトの操作

- ディスクへの吐き出しを遅延させることにより`CREATE DATABASE`を高速化しました。(Andres Freund, Greg Stark)

- テーブル、ビュー、複合型の列に対してのみにコメントを許します。 インデックスやTOASTテーブルのような他の種類のリレーションでは許されません。(Tom Lane)

- 値を持たない列挙型の作成が可能です。(Bruce Momjian)

- 行をページに合わせることができない場合を除き、`MAIN`格納型を持つ列の値を主ヒープページに保持させます。(Kevin Grittner)

  これまでは、`MAIN`値は行の容量がページ容量の1/4になるまで、強制的にTOASTテーブルとなりました。

#### E.8.3.3.1. `ALTER TABLE`

- `DROP COLUMN`および`DROP CONSTRAINT` に`IF EXISTS`を実装しました。(Andres Freund)

- テーブルを書き換える`ALTER TABLE`コマンドでWALロギングを飛ばすことができます。(Itagaki Takahiro)

  こうした操作は新しいテーブルのコピーが作成されるかロールバックされるかのいずれかです。 このため継続的アーカイブモードで実行している場合を除き、WALアーカイブ処理を飛ばすことができます。 これによりI/Oオーバーヘッドが減少し、性能が向上します。

- テーブル所有者以外により実行された時の`ALTER TABLE `table` ADD COLUMN `col` serial`の失敗を修正しました。(Tom Lane)

#### E.8.3.3.2. `CREATE TABLE`

- `CREATE TABLE ... LIKE`コマンドにおいて、`COMMENTS`および`STORAGE`設定の複製サポートを追加しました。(Itagaki Takahiro)

- `CREATE TABLE ... LIKE`コマンドに全属性コピーの省略形を追加しました。(Itagaki Takahiro)

- 標準SQLの`CREATE TABLE ... OF type`コマンドを追加しました。(Peter Eisentraut)

  これにより、既存の複合型に一致するテーブルを作成することができます。 コマンド内で制約やデフォルトを追加で指定することができます。

#### E.8.3.3.3. 制約

- 遅延可能な一意性制約を追加しました。(Dean Rasheed)

  これにより、列が一意性インデックスを持つ場合でもプライマリキーと印付けされている場合でも`UPDATE tab SET col = col + 1`などの大量更新が確実に動作できるようになります。 制約が`DEFERRABLE`であると指定されている場合、各行が更新された後ではなく、文の最後で検査されるようになります。 また制約検査を現在のトランザクションの最後まで遅延させ、複数のSQLコマンドをまたがって更新を行うこともできます。

- 排他制約を追加しました。(Jeff Davis)

  排他制約は等価だけではなく任意の比較演算を許すことにより、一意性制約を汎用化します。 これは`CREATE TABLE CONSTRAINT ... EXCLUDE`句により作成されます。 排他制約のもっともよくある使用方法は、単に一致しないではなく、重複を許さない列項目を指定することです。 時間間隔やその他配列などの範囲に対して有用です。 この機能は、多くの予定帳、時間管理、科学アプリケーションにおけるデータ整合性検査を改良します。

- 失敗の原因となる値を報告する、一意性制約違反エラーメッセージを改良しました。(Itagaki Takahiro)

  例えば、一意性制約違反では`Key (x)=(2) already exists`(キー(x)=(2)はすでに存在します)のように報告されます。

#### E.8.3.3.4. オブジェクトの権限

- 新しい`GRANT`/`REVOKE IN SCHEMA`句を使用してスキーマ全体にまたがった大量な権限変更を行う機能を追加しました。(Petr Jelinek)

  オブジェクト権限管理を簡略化すると共に、アプリケーションのデータセキュリティのためにデータベースロールを使用することをより簡単にします。

- 今後作成されるオブジェクトの権限を制御するための`ALTER DEFAULT PRIVILEGES`を追加しました。(Petr Jelinek)

  これは複雑なデータベースアプリケーションにおけるオブジェクト権限の割り当てを大きく簡略化します。 テーブル、ビュー、シーケンス、関数に対してデフォルトの権限を設定することができます。 デフォルトはスキーマ単位またはデータベース全体に対して割り当てることができます。

- `GRANT`/`REVOKE`によりラージオブジェクト（BLOB）の権限を制御する機能を追加しました。(KaiGai Kohei)

  これまでは、すべてのデータベースユーザは任意のラージオブジェクトを読み取り、変更することができました。 読み取り権限、書き込み権限をラージオブジェクト毎に付与したり取り上げたりできるようになりました。 また、ラージオブジェクトの所有権も追跡されます。

### E.8.3.4. ユーティリティ操作

- `LISTEN`/`NOTIFY`をシステムテーブルではなく、メモリキュー内に待ちイベントを格納するようにしました。(Joachim Wieland)

  既存のトランザクションのサポートと配送保証機能を保ちつつ、これは性能を大きく改良しました。

- `NOTIFY`はリスナに省略可能な"ペイロード"文字列を渡すことができます。(Joachim Wieland)

  これにより汎用目的のイベントキューシステムとしての`LISTEN`/`NOTIFY`の有用性を大きく改良します。

- すべてのデータベース単位のシステムカタログに`CLUSTER`を行うことができます。(Tom Lane)

  共有カタログはまだクラスタ化できません。

#### E.8.3.4.1. `COPY`

- `COPY ... CSV FORCE QUOTE *`を受け付けます。(Itagaki Takahiro)

  `FORCE QUOTE`句において`*`が"すべての列"を表す省略形として使用できるようになりました。

- オプションを括弧内で指定する新しい`COPY`構文を追加しました。(Robert Haas, Emmanuel Cecchet)

  これにより今後の`COPY`オプションの柔軟性が改良されます。 過去に存在したオプションのためだけに、古い構文もまだサポートされます。

#### E.8.3.4.2. `EXPLAIN`

- `EXPLAIN`がXML、JSON、YAML形式で出力することができます。(Robert Haas, Greg Sabino Mullane)

  新しい出力形式はマシンによる可読性が簡単になり、`EXPLAIN`出力の解析用の新しいツールの開発を補助します。

- `EXPLAIN ANALYZE`時に問い合わせバッファの活動を報告する、新しい`BUFFERS`オプションを追加しました。(Itagaki Takahiro)

  これにより個々の問い合わせに対してより良い問い合わせプロファイリングを行うことができます。 log_statement_statsと関連する設定の出力では、バッファ使用量は報告されなくなりました。

- `EXPLAIN`の出力にハッシュ使用状況に関する情報を追加しました。(Robert Haas)

- 括弧内でオプションの指定を行うことができる、新しい`EXPLAIN`構文を追加しました。(Robert Haas)

  これにより将来の`EXPLAIN`オプションに対する柔軟性が大きく高まりました。 過去に存在したオプションのためだけに、古い構文もまだサポートされます。

#### E.8.3.4.3. `VACUUM`

- 容量を抑えるために行を一行一行移動するのではなく、テーブル全体を書き換え、インデックスを再構築するように`VACUUM FULL`を変更しました。(Itagaki Takahiro, Tom Lane)

  これまでの方式では通常低速であり、インデックスの膨張を引き起こしました。 新しい方式では`VACUUM FULL`実行時に一時的により多くのディスク領域を使用することに注意してください。 通常テーブルとインデックスにより占められる領域の２倍程度使用する可能性があります。

- オプションを括弧内に指定することができる、新しい`VACUUM`構文を追加しました。(Itagaki Takahiro)

  これにより将来の`VACUUM`オプションに対する柔軟性が大きく高まりました。 過去に存在したオプションのためだけに、古い構文もまだサポートされます。

#### E.8.3.4.4. インデックス

- `CREATE INDEX`においてインデックス名を省略した場合、インデックス名が自動的に付与できるようにしました。(Tom Lane)

- デフォルトで、複数列に対するインデックスが対象列すべてにちなんだ名前が付けられるようになり、また、式インデックス列はその式にちなんだ名前が付けられるようになりました。

- 共有システムカタログのインデックス再作成が完全にトランザクションを守るようになり、かつ、クラッシュに対して安全になりました。(Tom Lane)

  これまでは共有インデックスに対するインデックス再作成はスタンドアローンモードでのみ許されていました。 またこの操作中のクラッシュによりインデックスは操作前よりも悪化した状態になり得ました。

- GiSTに`point_ops`演算子クラスを追加しました。(Teodor Sigaev)

  この機能により`point`列に対するGiSTインデックス付けが可能です。 このインデックスは`point` `<@` `polygon`（多角形内の点）などのいろいろな種類の問い合わせに使用することができます。 これにより多くのPostGIS問い合わせが高速になるはずです。

- GINインデックス生成において赤黒バイナリツリーを使用します。 (Teodor Sigaev)

  赤黒ツリーは自身でバランスを保ちます。 これは入力順序がランダムではない場合に起こる低速化を防ぎます。

### E.8.3.5. データ型

- `bytea`値を16進数記法で記述できます。(Peter Eisentraut)

  `bytea_output`サーバパラメータは`bytea`出力において16進数か伝統的な書式のどちらを使用するかを制御します。 libpqの`PQescapeByteaConn()`関数は、PostgreSQL 9.0以降のサーバに接続する場合、自動的に16進数書式を使用します。 しかし9.0より前のバージョンのlibpqは新しいサーバからの16進数書式を正しく処理しません。

  新しい16進数書式は、バイナリデータを使用するより多くのアプリケーションと直接的な互換性を持つことになり、余計な変換を行うことなく格納、抽出を行うことができるようになります。 また伝統的な書式よりもかなり高速に読み書きすることができます。

- extra_float_digitsサーバパラメータを`3`に増やすことができます。(Tom Lane)

  これまでの最大の`extra_float_digits`は`2`でした。 `float4`値を正確にダンプ/リストアするために3桁が必要な場合があります。 pg_dumpは、3桁を許すサーバからのダンプを行う時に3という設定を使用するようになります。

- `int2vector`入力に対する入力検査を厳しくしました。(Caleb Welton)

#### E.8.3.5.1. 全文検索

- `synonym`辞書において接頭辞サポートを追加しました。(Teodor Sigaev)

- フィルタ処理辞書を追加しました。(Teodor Sigaev)

  フィルタ処理用辞書により、トークンを変更した後に後続の辞書に渡すことができます。

- メールアドレストークンにおいてアンダースコアを認めます。(Teodor Sigaev)

- URLトークンの解析処理においてより標準互換の規則を使用します。(Tom Lane)

### E.8.3.6. 関数

- 関数呼び出しにおいて、パラメータ名を提供し、それらを関数定義における名前付きパラメータに一致させることができます。(Pavel Stehule)

  例えば、関数が`a`および`b`というパラメータを取るものと定義されている場合、その関数を`func(a := 7, b := 12)`や`func(b := 12, a := 7)`のように呼び出すことができます。

- UTF-8サーバ符号化方式で処理する、ロケール固有正規表現をサポートしました。(Tom Lane)

  ロケール固有の正規表現機能には、大文字小文字を区別しない一致およびロケール固有の文字クラスが含まれます。 これまでは、これらの機能は（LATIN1など）シングルバイトサーバ符号化方式を使用している場合、ASCII以外の文字でのみ正しく動作していました。 これらはまだ他のUTF-8以外のマルチバイト符号化方式では適切ではありません。

- `to_char()`において科学技術表記法をサポートしました。 （(`'EEEE'`規定）(Pavel Stehule, Brendan Jurd)

- `to_char()`が`Y`、`YY`および`YYY`指定において`FM`(字詰めモード)を尊重するようにしました。(Bruce Momjian, Tom Lane)

  `YYYY`ではすでに尊重されていました。

- Windowsにおいて翻訳された数値および貨幣文字を正しい符号化方式で出力するように`to_char()`を修正しました。(Hiroshi Inoue, Itagaki Takahir, Bruce Momjian)

- 多角形をまたがる"重複"および"含有"演算の計算を正しくしました。(Teodor Sigaev)

  多角形の`&&`（重複）演算子はこれまで、２つの多角形を囲む矩形が重複するかどうかのみを検査していました。 これがより正しく検査するようになりました。 多角形の`@>`および`<@`（含有する/含有される）演算子はこれまで、多角形の頂点がすべてもう片方に含まれているかどうかを検査していました。 これは一部の非凸多角形で間違って"真"を返す可能性がありました。 多角形のすべての線分がもう片方に含まれているかどうかを検査するようになりました。

#### E.8.3.6.1. 集約

- 集約関数で`ORDER BY`を使用することができます。(Andrew Gierth)

  例えば`array_agg(a ORDER BY b)`がサポートされるようになりました。 これは入力値の順序が重要な集約で有用であり、順序を決定するための非標準的な副問い合わせを使用する必要がなくなります。

- 複数引数を持つ集約関数が`DISTINCT`を使用できるようになりました。(Andrew Gierth)

- 値を単一の文字列にまとめる`string_agg()`集約関数を追加しました。(Pavel Stehule)

- 集約遷移関数が`STRICT`と印付けされていない場合、`DISTINCT`付きで呼び出される集約関数がNULL値を渡すようになりました。(Andrew Gierth)

  例えば`agg(DISTINCT x)`はNULLという`x`値を`agg()`に渡す可能性があります。 これは`DISTINCT`指定がない場合の動作との一貫性を高めます。

#### E.8.3.6.2. ビット列

- `bit`列に対する`get_bit()`および`set_bit()`を追加しました。 これらは`bytea`に対するものを射影したものです。(Leonardo F)

- `bit`列および`bytea`に対する`OVERLAY()`を実装(置き換え)しました。(Leonardo F)

#### E.8.3.6.3. オブジェクト情報関数

- `pg_relation_size()`関数よりもよりユーザ向けのインタフェースを提供する`pg_table_size()`および`pg_indexes_size()`を追加しました。(Bernd Helmle)

- シーケンスの権限検査のための`has_sequence_privilege()`を追加しました。(Abhijit Menon-Sen)

- information_schemaビューをSQL:2008に従うように更新しました。(Peter Eisentraut)

- `information_schema`ビューが`char`および`varchar`列の最大オクテット長を適切に表示するようにしました。(peter Eisentraut)

- `information_schema`の権限ビューを高速化しました。(Joachim Wieland)

#### E.8.3.6.4. 関数およびトリガの作成

- `DO`文を使用した匿名コードブロックの実行をサポートしました。(Petr Jelinek, Joshua Tolley, Hannu Valtonen)

  これにより一時的な関数の作成と削除を行う必要なく、サーバサイドのコードを実行できるようになりました。 ユーザが関数を定義する権限を持つ、任意の言語でコードを実行することができます。

- 標準SQL互換の列単位のトリガを実装しました。(Itagaki Takahiro)

  例えば`UPDATE`の`SET`リスト内にあるなど、問い合わせにより指定された列が影響を受けた時にのみ、こうしたトリガは発行されます。 情報スキーマにもこうした情報が表示されるようになりました。

- トリガの発行を行うか否かを制御できるように、`CREATE TRIGGER`に`WHEN`句を追加しました。(Itagaki Takahiro)

  トリガの中で同様の検査を常に行うことができますが、外部の`WHEN`句で検査を行う方が性能が上がります。

### E.8.3.7. サーバサイド言語

- `CREATE LANGUAGE`に`OR REPLACE`句を追加しました。(Tom Lane)

  これはまだ存在しない省略可能な言語をインストールする際に役に立ちます。 また、PL/pgSQLがデフォルトでインストールされるようになったことに部分的に役に立ちます。

#### E.8.3.7.1. PL/pgSQLサーバサイド言語

- デフォルトでPL/pgSQLをインストールします。(Bruce Momjian)

  この言語を利用可能とすることに関して、セキュリティや性能を問題とする管理者は、この言語を特定のデータベースから削除することができます。

- 関数内の問い合わせにおいて識別子と競合するPL/pgSQL変数名が使用される状況の取り扱いを改良しました。(Tom Lane)

  デフォルトでは予想外の動作を防ぐために競合があるとエラーになるようになりました。 これは`plpgsql.variable_conflict`設定パラメータや関数単位の`#variable_conflict`オプションを使用して、変数か問い合わせが提供する列を使用させるように、変更することができます。 どちらの場合でもPL/pgSQLは文法的に有効でないところで変数置換を行わないようになりました。

- PL/pgSQLが独自版ではなく主レクサを使用するようにしました。(Tom Lane)

  これにより確実に文字列のエスケープ処理など主システムの詳細な振舞いを正確に追従します。 PL/pgSQL内で予約されたとみなされるキーワード群など、ユーザから見える詳細も当然変更されました。

- 無効なレコード参照に対する不要なエラーを発生させないようにしました。(Tom Lane)

  周りの式に達する度ではなく、参照が実際に取り出された時のみにエラーが発生するようになりました。 例えば、多くの方がトリガで以下を行おうとしています。

      if TG_OP = 'INSERT' and NEW.col1 = ... then

  これは想定通りに動作しなくなりました。

- 削除された列を持つ行型を扱うPL/pgSQLの機能を改良しました。(Pavel Stehule)

- PL/pgSQL関数において入力パラメータを変数に代入することができます。(Steve Prentice)

  これまでは、入力パラメータは`CONST`と宣言されたものと扱われていました。 このため関数のコードではこれらを変更することができませんでした。 同じ制限を持たせない他のDBMSからの関数移植を容易にするために、この制限は削除されました。 入力パラメータは渡された値で初期化された局所変数のように動作するようになりました。

- PL/pgSQLにおいてエラー発生箇所の報告を改良しました。(Tom Lane)

- PL/pgSQLの`MOVE FORWARD`/`BACKWARD`に`count`および`ALL`オプションを追加しました。(Pavel Stehule)

- PL/pgSQLの`WHERE CURRENT OF`でカーソル変数を使用することができます。(Tom Lane)

- PL/pgSQLの`OPEN cursor FOR EXECUTE`はパラメータの使用できます。(Pavel Stehule, Itagaki Takahiro)

  これは新しい`USING`句を用いて実現しました。

#### E.8.3.7.2. PL/Perlサーバサイド言語

- 次のPL/Perl関数を新規に追加しました。 `quote_literal()`、`quote_nullable()`、`quote_ident()`、`encode_bytea()`、`decode_bytea()`、`looks_like_number()`、`encode_array_literal()`、`encode_array_constructor()` (Tim Bunce)

- PL/Perlの初期化関数を指定する、`plperl.on_init`サーバパラメータを追加しました。(Tim Bunce)

  また`plperl.on_plperl_init`および`plperl.on_plperlu_init`を使用して、それぞれ信頼できる/信頼できない場合に特化した初期化を行うことができます。

- PL/Perlにおいて`END`ブロックをサポートします。(Tim Bunce)

  現在`END`ブロックではデータベースにアクセスすることはできません。

- PL/Perlにおいて`use strict`を使用できます。(Tim Bunce)

  またPerlの`strict`検査は新しい`plperl.use_strict`サーバパラメータで大域的に有効にすることができます。

- PL/Perlにおいて`require`を使用できます。(Tim Bunce)

  これは基本的に、そのモジュールがロードされているかどうか確認することを試験します。 ロードされなければエラーとなります。 管理者が初期化パラメータを通して前もってロードしていないモジュールをロードすることはできません。

- Perlバージョン5.10以降が使用されている場合、PL/Perlにおいて`use feature`を使用できます。(Tim Bunce)

- PL/Perlの戻り値がサーバ符号化方式において有効かどうかを検証します。(Andrew Dunstan)

#### E.8.3.7.3. PL/Pythonサーバサイド言語

- PL/PythonにUnicodeサポートを追加しました。(Peter Eisentraut)

  文字列は必要に応じて、サーバ符号化方式から、サーバ符号化方式へ自動的に変換されます。

- PL/Pythonの`bytea`サポートを改良しました。(Caleb Welton)

  PL/Pythonに渡される`Bytea`値は、PostgreSQLの`bytea`テキスト書式ではなく、バイナリとして表現されるようになりました。 またPL/Pythonからヌルバイトを含む`Bytea`値が適切に出力されるようになりました。 PL/Pythonに渡す論理値、整数値、浮動小数点値も改良されました。

- PL/Pythonにおいてパラメータおよび戻り値として配列がサポートされるようになりました。(Peter Eisentraut)

- SQLドメインとPythonの型との対応付けを改良しました。(Peter Eisentraut)

- PL/PythonにPython 3のサポートを追加しました。(Peter Eisentraut)

  この新しいサーバサイド言語は`plpython3u`と呼ばれます。 これは同じセッションでPython 2サーバサイド言語と一緒に使用することはできません。

- PL/Pythonにおけるエラー発生箇所および例外の報告を改良しました。(Peter Eisentraut)

### E.8.3.8. クライアントアプリケーション

- `vacuumdb`にバキュームを行わずに解析を行う`--analyze-only`オプションを追加しました。(Bruce Momjian)

#### E.8.3.8.1. psql

- SQL文字列や識別子と同様にpsqlの変数の値の引用符付け処理とエスケープ処理のサポートを追加しました。(Pavel Stehule, Robert Haas)

  例えば、`:'var'`は`var`の値を引用符付けしリテラル文字列としてエスケープされます。 一方、`:"var"`はその値を引用符付けしSQL識別子としてエスケープされます。

- psqlによって読み取られるスクリプトファイル内の先頭のUTF-8で符号化されたUnicodeバイトオーダ印を無視します。(Itagaki Takahiro)

  これはクライアント符号化方式がUTF-8の場合に有効です。 これは、大抵はWindowsですが、こうした印の挿入を要求する特定のエディタの互換性を改良します。

- `--single-transaction`を適切に尊重するように`psql --file -`を修正しました。(Bruce Momjian)

- 2つのpsqlのセッションが同時に実行している場合にpsqlのコマンドライン履歴の上書きを防止します。(Tom Lane)

- psqlのタブ補完サポートを改良しました。(Itagaki Takahiro)

- 有効な場合、"quiet"モードか否かに関係なく`\timing`出力を表示します。(Peter Eisentraut)

##### E.8.3.8.1.1. psql表示

- psqlにおける改行を含む列の表示を改良しました。(Roger Leigh)

  この動作がデフォルトになりました。 `\pset linestyle old-ascii`を使用することで、これまでの書式を利用することができます。

- psqlで`\pset linestyle unicode`を使用してUnicodeの装飾描画文字を使用できます。(Roger Leigh)

##### E.8.3.8.1.2. psql `\d`コマンド

- `\d`が指定された親テーブルから継承された子テーブルを表示するようにしました。(Damien Clochard)

  `\d`では子テーブルの個数のみを表示し、`\d+`はすべての子テーブルの名前を表示します。

- `\d index_name`でインデックス列の定義を表示します。(Khee Chin)

  この定義は式インデックスで有用です。

- psqlにおいて、`\d`ではなく`\d+`のみでビューを定義した問い合わせを表示します。(Peter Eisentraut)

  常に問い合わせを含めることはあまりにも冗長であると思われました。

#### E.8.3.8.2. pg_dump

- pg_dump/pg_restore `--clean`が同時にラージオブジェクトを削除するようにしました。(Itagaki Takahiro)

- `standard_conforming_strings`が有効な場合に適切にラージオブジェクトをダンプするようにpg_dumpを修正しました。(Tom Lane)

  これまでのコードでは、アーカイブファイルにダンプしpg_restoreからスクリプト出力を生成する時に失敗しました。

- pg_restoreがスクリプト出力を生成する時に16進書式でラージオブジェクトを出力するようになりました。

  スクリプトがその後9.0より前のサーバにロードされる場合に互換性に関する問題を引き起こすかもしれません。 これを回避するには代わりにサーバに直接リストアしてください。

- pg_dumpは複合型の列に割り当てられたコメントをダンプすることができます。(Taro Minowa (Higepon))

- pg_dump `--verbose`がテキスト出力モードにおいてpg_dumpとサーバのバージョンを出力するようにしました。(Jim Cox, Tom Lane)

  これらはカスタム出力モードではすでに提供されていました。

- スイッチと省略可能なファイル名の後にコマンドライン引数が残っていた場合に、pg_restoreが注意するようになりました。(Tom Lane)

  これまではこうした引数すべては警告なく無視されました。

#### E.8.3.8.3. pg_ctl

- ブート時にpostmasterを起動するためにpg_ctlを安全に使用することができます。(Tom Lane)

  これまでは、無効なpostmasterロックファイルに基づき、pg_ctl親プロセスが間違ってpostmasterが起動中であると認識することがありました。 その結果データベースを起動させる際に一時的な失敗が起こりました。

- pg_ctlに(initdbを呼び出す)データベースの初期化機能を付与しました。(Zdenek Kotala)

### E.8.3.9. 開発ツール

#### E.8.3.9.1. libpq

- 新しいlibpq関数、`PQconnectdbParams()`および`PQconnectStartParams()`を追加しました。(Guillaume Lelarge)

  これらの関数は`PQconnectdb()`と`PQconnectStart()`と似たものですが、1つの文字列として必要とするすべてのオプションを提供するのではなく、接続オプションのヌル終端の配列を受け付けます。

- libpq関数、`PQescapeLiteral()`および`PQescapeIdentifier()`を追加しました。(Robert Haas)

  これらの関数は適切に引用符付け、およびエスケープされたSQLリテラル文字列および識別子を返します。 `PQescapeStringConn()`では必要でしたが、呼び出し元で前もって文字列結果を割り当てておく必要はありません。

- ユーザ単位のサービスファイル(`.pg_service.conf`)のサポートを追加しました。 これはサイト全体のサービスファイルの前に検査されます。(Peter Eisentraut)

- 指定されたlibpqサービスが見つからない場合に適切にエラーを報告します。(Peter Eisentraut)

- libpqにTCPキープアライブに関する設定を追加しました。(Tollef Fog Heen, Fujii Masao, Robert Haas)

  キープアライブに関する設定はTCP接続のサーバ側ではすでにサポートされていました。

- 代替方法があるプラットフォームでは、libpqにおける`SIGPIPE`をブロックおよびブロック解除するための余計なシステムコールを防止します。(Jeremy Kerr)

- `.pgpass`が提供するパスワードが失敗した場合、エラーメッセージにそのパスワードの源を記載します。(Bruce Momjian)

- クライアント証明書ファイル内で与えられるすべてのSSL証明書をロードします。(Tom Lane)

  これは間接的に署名されたSSLクライアント証明書のサポートを改良します。

#### E.8.3.9.2. ecpg

- ecpgにSQLDA(SQL記述子領域)サポートを追加しました。(Boszormenyi Zoltan)

- ecpgに`DESCRIBE` [`OUTPUT` ]文を追加しました。(Boszormenyi Zoltan)

- 現在のトランザクション状態を返すECPGtransactionStatusを追加しました。(Bernd Helmle)

- ecpgのinformix互換モードに`string`データ型を追加しました。(Boszormenyi Zoltan)

- ecpgで`new`および`old`変数名を制限なく使用できます。(Michael Meskes)

- ecpgにおいて`free()`内の変数を使用することができます。(Michael Meskes)

- SQL3以外のデータ型に対して`ecpg_dynamic_type()`がゼロを返すようにしました。(Michael Meskes)

  これまではOIDデータ型の否定を返しました。 しかしこれは有効なOID型と混乱を招くことがありました。

- 64ビットの`long`型をすでに持っていたプラットフォームにおいて`long long`型をサポートします。(Michael Meskes)

##### E.8.3.9.2.1. ecpgのカーソル

- ecpg本来のモードにてスコープ外のカーソルサポートを追加しました。(Boszormenyi Zoltan)

  これにより`DECLARE`で`OPEN`を呼び出した時にスコープ範囲外にある変数を使用することができます。 この機能はすでにecpgのInformix互換モードに存在していました。

- ecpgにおいて動的なカーソル名が可能です。(Boszormenyi Zoltan)

- ecpgは `FETCH`および`MOVE`でノイズの単語`FROM`と`IN`を使用することができます。(Boszormenyi Zoltan)

### E.8.3.10. 構築オプション

- デフォルトでクライアントスレッドセーフを有効にします。(Bruce Momjian)

  スレッドセーフに関するオプションは`configure`の`--disable-thread-safety`により無効にすることができます。

- Linuxのout-of-memory killerの制御のサポートを追加しました。(Alex Hunsaker, Tom Lane)

  `/proc/self/oom_adj`によりLinuxのout-of-memory（OOM）killerを無効にすることができますが、 これはpostmasterに対するOOMによる停止を無効にする際に推奨されるものです。 postmasterの子プロセスに対するOOMによる停止を再度有効にすることが望まれることがあります。 新しい`LINUX_OOM_ADJ`コンパイルオプションにより子プロセスに対するkillerを再度有効にすることができます。

#### E.8.3.10.1. Makefile

- `world`、`install-world`および`installcheck-world`という`Makefile`のターゲットを追加しました。(Andrew Dunstan)

  これらは既存の`all`、`install`、`installcheck`と似ていますが、HTML文書の構築、`contrib`の構築及び試験、サーバサイド言語とecpgの試験も行います。

- データおよび文書のインストール場所の制御をPGXS Makefileに追加しました。(Mark Cave-Ayland)

- 1つのHTMLファイルもしくは1つのテキストファイルとしてPostgreSQL文書を構築するMakefileのルールを追加しました。(Peter Eisentraut, Bruce Momjian)

#### E.8.3.10.2. Windows

- 64ビットWindowsでのコンパイルと64ビットモードでの実行サポートを追加しました。(Tsutomu Yamada, Magnus Hagander)

  これによりWindows上で大容量の共有メモリをとることができます。

- Visual Studio 2008を使用してサーバを構築することをサポートします。(Magnus Hagander)

### E.8.3.11. ソースコード

- 配布用のtarballに含まれるtarアーカイブファイルとしてではなく、前もって構築された文書をサブディレクトリツリーに配備します。(Peter Eisentraut)

  例えば、前もって構築されたHTML文書は`doc/src/sgml/html`に配備されます。 マニュアルページも同様にまとめられます。

- サーバのレクサを再入可能にしました。(Tom Lane)

  PL/pgSQLによるレクサの使用において必要でした。

- メモリ割り当て速度を改良しました。(Tom Lane, Greg Stark)

- ユーザ定義の制約トリガが`pg_trigger`同様に`pg_constraint`内に項目を持つようになりました。(Tom Lane)

  この変更のため、`pg_constraint`.`pgconstrname`が冗長になりましたので、削除されました。

- 制約の強制用のインデックスの使用をより良く提供するために`pg_constraint`.`conindid`および`pg_trigger`.`tgconstrindid`システムカタログ列を追加しました。(Tom Lane)

- 一つのオペレーティングシステムのシグナルを使用して、複数条件でバックエンドと通信できるようにしました。(Fujii Masao)

  多くのシグナル条件にあるプラットフォーム固有の制約を持たずに、新しい機能を追加できるようになります。

- ソースコード試験の適用範囲を改良し、`contrib`、PL/Python、PL/Perlを含むようになりました。(Peter Eisentraut, Andrew Dunstan)

- システムテーブルの起動処理用のフラットファイルの使用を削除しました。(Tom Lane, Alvaro Herrera)

  これは多くのロールとデータベースを使用する場合の性能を改良し、一部の失敗条件を取り除きます。

- "bootstrapped"カタログ用の`pg_attribute`の初期内容を自動的に生成します。(John Naylor)

  これはこれらのカタログの変更を大きく簡略化します。

- `execMain.c`の外部に`INSERT`/`UPDATE`/`DELETE`操作処理を分けました。(Marko Tiikkaja)

  更新が別のModifyTableノードで実行されるようになりました。 この変更は今後の改良のための基盤として必要とされます。

- psqlのSQLヘルプテキストの翻訳機能を簡易化しました。(Peter Eisentraut)

- 配布用tarball内のすべてファイルパスが100文字未満になるように一部のファイル名を短くしました。(Tom Lane)

  一部の伸長プログラムで長いファイル名に関する問題があります。

- 新しい`ERRCODE_INVALID_PASSWORD` `SQLSTATE`エラーコードを追加しました。(Bruce Momjian)

- 作者の許可を得て、わずかに残っていた個人的なソースコード内の著作権注記を適切に削除しました。(Bruce Momjian)

  個人的な著作権注記は無意味になりましたが、コミュニティはそれに対する問い合わせに時折回答しなければなりませんでした。

- PostgreSQLを永続性を持たせないモードで実行させる場合の性能向上に関する節を文書に追加しました。(Bruce Momjian)

- 依存性検査を正しく動作させ、不要な再構築を防ぐように、HTML文書構築用の`Makefile`ルールを再構成しました。(Peter Eisentraut)

- マニュアルページを作成する際にDocbook2XではなくDocBook XSLを使用します。(Peter Eisentraut)

  これはマニュアルページの構築に必要となるツール群を変更します。

- PL/Perlのコード構成を改良しました。(Tim Bunce)

- PL/Perlにおけるエラー文脈報告を改良しました。(Alexey Klyukin)

#### E.8.3.11.1. 構築に関する新しい要求

これらの要求が配布用のtarballから構築する場合には適用されないことに注意してください。 構築するために以下のプログラムが使用されたファイルがtarballには含まれているためです。

- configureを構築する場合にAutoconf 2.63が必要です。(Peter Eisentraut)

- CVSから取り出したソースから構築する場合にFlex 2.5.31以降が必要です。(Tom Lane)

- CVSから取り出したソースから構築するためにはPerlバージョン5.8以降が必要です。(John Naylor, Andrew Dunstan)

#### E.8.3.11.2. 移植性

- Bonjourに関してより近代的なAPIを使用します。(Tom Lane)

  BonjourのサポートはOS X 10.3以降を必要とするようになりました。 より古いAPIはAppleにより廃止されました。

- SuperHアーキテクチャ用のスピンロックサポートが追加されました。(Nobuhiro Iwamatsu)

- GCC以外のコンパイラがインライン関数をサポートする場合にそれを使用できるようにしました。(Kurt Harriman)

- 64ビット整数のデータ型が動作しないプラットフォームのサポートを削除しました。(Tom Lane)

- プラットフォームを跨る一貫性を高めるために`LDFLAGS`の使用を再構成しました。(Tom Lane)

  `LDFLAGS`は実行形式ファイルと共有ライブラリの2つをリンクする場合に使用されるようになりました。 実行形式ファイルをリンクする場合の`LDFLAGS_EX`と共有ライブラリをリンクする場合の`LDFLAGS_SL`を追加しました。

#### E.8.3.11.3. サーバのプログラミング

- バックエンドヘッダファイルを安全にC++でインクルードできるようにしました。(Kurt Harriman, Peter Eisentraut)

  これらの変更はバックエンドのコードにおいてこれまでC++の使用を困難にしていたキーワードの競合を除去しました。 しかしまだバックエンド関数でC++を使用する場合には多少複雑さが残っています。 適切なところで`extern "C" { }`がまだ必要です。 またメモリ管理とエラー処理はまだ解決が困難です。

- C関数を集約として呼び出されるかどうかの確認に使用される`AggCheckCallContext()`を追加しました。(Hitoshi Harada)

- キャッシュキーの最大数をコードに直接書き込むことを防ぐために`SearchSysCache()`と関連する関数の呼び出し規約を変更しました。(Robert Haas)

  現時点では既存の呼び出しもまだ動作しますが、新しい形式に変更しなければ9.1以降で動作しなくなることが想定されます。

- 第4引数で非NULLを提供するためには`fastgetattr()`および`heap_getattr()`バックエンドマクロの呼び出しが必要です。(Robert Haas)

- 独自の型解析関数は、渡されるデータの型を決定するために`VacAttrStats`.`attr`に依存してはいけません。

  これは、背後にある列のデータ型と異なる格納方式のインデックス列上の統計情報を収集できるように変更されました。 解析すべき実際のデータ型を通知する新しいフィールドが存在します。

#### E.8.3.11.4. サーバフック

- ColumnRefノードとParamRefノードを処理するためのパーサフックを追加しました。(Tom Lane)

- ロード可能なモジュールがユーティリティコマンドを制御できるようにProcessUtilityフックを追加しました。(Itagaki Takahiro)

#### E.8.3.11.5. バイナリ更新のサポート

- その場での更新をサポートする`contrib/pg_upgrade`を追加しました。(Bruce Momjian)

  これによりPostgreSQLの新しいメジャーリリースに更新する時にデータベースのダンプ/リストア処理の必要性がなくなり、停止時間が桁違いに少なくなります。 これはPostgreSQL 8.3および8.4から9.0への更新をサポートします。

- バイナリ更新中に`relfilenodes`リレーションの値の保護サポートを追加しました。(Bruce Momjian)

- バイナリ更新中に`pg_type`と`pg_enum`のOIDの保護サポートを追加しました。(Bruce Momjian)

- テーブル空間内のデータファイルをそのPostgreSQLバージョンに特化したサブディレクトリに移します。(Bruce Momjian)

  これはバイナリ更新を簡単にします。

### E.8.3.12. Contrib

- `contrib/pgbench`にマルチスレッドオプション(`-j`)を追加しました。(Itagaki Takahiro)

  これにより複数のCPUを使用したpgbench試験ができ、pgbench自体が試験のボトルネックとなる危険が軽減します。

- `contrib/pgbench`に`\shell`および`\setshell`メタコマンドを追加しました。(Michael Paquier)

- `contrib/dict_xsyn`に機能を追加しました。(Sergey Karpov)

  新しいオプションは`matchorig`、`matchsynonyms`、`keepsynonyms`です。

- 全文検索辞書`contrib/unaccent`を追加しました。(Teodor Sigaev)

  このフィルタ処理辞書は文字から発音記号を取り除きます。 複数言語に対する全文検索がより簡単になります。

- `contrib/dblink`に`dblink_get_notify()`を追加しました。(Marcus Kempe)

  これによりdblinkにおいて非同期通知を行うことができます。

- `contrib/dblink`の削除された列の取り扱いを改良しました。(Tom Lane)

  これは`dblink_build_sql_insert()`と関連する関数に影響します。 これらの関数は物理的な列番号ではなく論理的な列番号に従って列を番号付けするようになりました。

- `contrib/hstore`のデータ長に関する制限を大きく増加しました。 また、`hstore`列に対する`GROUP BY`および`DISTINCT`操作ができるようにB-treeおよびハッシュ機能を追加しました。(Andrew Gierth)

  新しい関数や演算子も追加されました。 これらの改良により`hstore`はPostgreSQLに組み込まれた、すべての機能を持つキー/バリューストアになりました。

- パスワード強度に関するサイト固有のポリシーをサポートする`contrib/passwordcheck`を追加しました。(Laurenz Albe)

  このモジュールのソースコードはサイト独自のパスワードポリシーに合わせるように変更しなければなりません。

- `contrib/pg_archivecleanup`ツールを追加しました。(Simon Riggs)

  これは、不要になったアーカイブファイルを削除するための`archive_cleanup_command`サーバパラメータで使用されるために設計されました。

- `contrib/auto_explain`の出力に問い合わせテキストを追加しました。(Andrew Dunstan)

- `contrib/pg_stat_statements`にバッファアクセスカウンタを追加しました。(Itagaki Takahiro)

- `/proc/self/oom_adj`を使用してLinux out-of-memory(OOM) killerを無効にできるように`contrib/start-scripts/linux`を更新しました。(Alex Hunsaker, Tom Lane)

前のページ | ホーム | 次のページ
リリース9.0.1 | 上に戻る | リリース8.4.9