リリース 8.3

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

# E.18. リリース 8.3

> リリース日: 2008-02-04

## E.18.1. 概要

重大な新機能と性能向上を伴うこのリリースは、PostgreSQLを大きく飛躍させたものと言えます。 これは開発速度が劇的に速くなったコミュニティの成長によりなされました。 このリリースは以下の主要機能を追加します。

- 全文検索がコアデータベースシステムに統合されました。

- SQL/XML標準をサポートしました。これに伴い、新しい演算子と`XML`データ型が含められました。

- 列挙データ型（`ENUM`）

- 複合型の配列

- 汎用一意識別子（`UUID`）データ型

- `NULL`のソートを先にするか後にするかに関する制御を追加

- 更新可能カーソル

- サーバ設定パラメータが関数単位で設定可能になりました。

- ユーザ定義型が型修飾子を持つことができるようになりました。

- テーブル定義の変更時または統計情報の更新時における、キャッシュされた問い合わせの自動計画再作成

- ログ処理および統計情報収集における多くの改良

- Windowsにおける認証のためのセキュリティサービスプロバイダインタフェース（SSPI）のサポート

- 複数の同時実行autovacuumプロセスのサポート。およびその他のautovacuumの改良

- Microsoft Visual C++を使用したPostgreSQL配布物全体のコンパイルを可能にしました。

主要な性能に関する改良を以下に列挙します。 これらの改善のほとんどは自動的なものですので、ユーザによる変更や調整は不要です。

- 非同期コミットは、トランザクションコミット時のWALへの書き出しを遅延します。

- 各チェックポイントにおけるI/Oのピークを抑えるために、チェックポイントの書き出しをより長い時間に分散させることができます。

- ヒープオンリータプル（HOT）は、ほとんどの`UPDATE`と`DELETE`における領域の再利用を促進します。

- ジャストインタイムのバックグランドライタ戦略はディスク書き出し効率を改善します。

- 読み取りのみのトランザクションに対して非永続的なトランザクションIDを使用することで、オーバーヘッドと`VACUUM`の必要性を削減します。

- フィールド単位および行単位の格納にかかるオーバーヘッドが削減されました。

- 大規模なシーケンススキャンがよく使用されるキャッシュされたページを押し出さないようになりました。

- 同時に行われる大規模なシーケンススキャンがディスク読み取りを共有できるようになりました。

- `ORDER BY ... LIMIT`がソートなしで行うことができるようになりました。

上記項目は後述の節でより詳細に説明します。

## E.18.2. バージョン8.3への移行

すべての過去のリリースからデータを移行する場合、pg_dumpを使用したダンプ/リストアが必要です。

既知の非互換性を以下に示します。

### E.18.2.1. 一般

- 文字以外のデータ型が`TEXT`への自動キャストが行われないようになりました。(Peter, Tom)

  これまでは、文字以外の値が`text`入力を必要とする演算子や関数に渡された場合、ほとんど（すべてではありません）の組み込みデータ型では自動的に`text`にキャストされました。 これが行われなくなりました。 すべての文字以外の型で`text`への明示的なキャストが必要になります。 例えば以下の式は以前は動作しました。

      substr(current_date, 1, 4)
      23 LIKE '2%'

  しかし、今回からそれぞれ"function does not exist"および"operator does not exist"というエラーメッセージが引き出されるようになります。 代わりに以下のように明示的なキャストを使用してください。

      substr(current_date::text, 1, 4)
      23::text LIKE '2%'

  （当然ですが、より冗長な`CAST()`構文を使用することも可能です。） 変更理由は、こうした自動キャストがよく思いもよらぬ動作を引き起こすためです。 過去のリリースにおけるこうした例を次に示します。 この式は受け付けられますが、想定した動作を行いません。

      current_date < 2017-11-17

  これは実際には日付と整数とを比較します。 これは拒絶すべきものです（このリリースでは拒絶するようになります）。 しかし、自動キャストの存在により、他に`<`演算子に一致するものがなければ`text < text`演算子がこの式に一致することができますので、両辺は`text`にキャストされ、テキストの比較が行われます。

  `char(`n`)`および`varchar(`n`)`型はまだ`text`に自動キャストされます。 また、`text`への自動キャストはまだ連結演算子（`||`）では、少なくとも1つの入力が文字型であれば、動作します。

- `contrib/tsearch2`の全文検索機能がコアサーバに移りましたが、いくつか小さな構文変更があります。

  `contrib/tsearch2`は互換性を保持するためのインタフェースを持つようになりました。

- `ARRAY(SELECT ...)`において`SELECT`が行を返さない場合、NULLではなく空の配列を返すようになりました。 (Tom)

- 基本データ型に対する配列型の名前が常にアンダースコアを基本型名称の前につけたものにならなくなりました。

  古い命名規約は可能ならばまだ尊重されますが、アプリケーションのコードはこれに依存すべきではありません。 指定した型に関連付いた配列データ型を識別する際は、代わりに新しい`pg_type.typarray`列を使用してください。

- `ORDER BY ... USING` `operator`がB-tree演算子クラスで定義される小なり`演算子`または大なり`演算子`を使用しなければならなくなりました。

  この制限は一貫性がない結果を防ぐために加えられました。

- `SET LOCAL`がロールバックされない限り、最も外側のトランザクションの終わりまで永続するように変わりました。(Tom)

  以前は`SET LOCAL`の効果は副トランザクションのコミット（`RELEASE SAVEPOINT`またはPL/pgSQL例外ブロックからの終了）後失われました。

- トランザクションブロック内で拒絶されたコマンドが、複数文からなる問い合わせ文字列内でも拒絶されるようになりました。(Tom)

  例えば`"BEGIN; DROP DATABASE; COMMIT"`は単一の問い合わせメッセージとして送信されたとしても拒絶されるようになります。

- トランザクションブロック外の`ROLLBACK`が`WARNING`ではなく`NOTICE`を発行するようになりました。(Bruce)

- `NOTIFY`/`LISTEN`/`UNLISTEN`がスキーマ修飾された名前を受付ないようにしました。(Bruce)

  これまではこれらのコマンドは`schema.relation`を受け付けていましたが、スキーマ部分を無視していたため、混乱を招きました。

- `ALTER SEQUENCE`がシーケンスの`currval()`の状態に影響を与えないようになりました。 (Tom)

- 外部キーはデータ型をまたがる参照においてインデックス付け可能な状態に一致しなければならなくなりました。(Tom)

  これは意味的な一貫性を向上させ、また、性能に関する問題を防止する役に立ちます。

- オブジェクトサイズに関する情報を閲覧する合理的な権限を持つユーザに、オブジェクトサイズに関する関数を限定します。(Tom)

  例えば`pg_database_size()`は、デフォルトで全員に与えられている`CONNECT`権限を要求します。 `pg_tablespace_size()`はテーブル空間における`CREATE`権限を要求します。 また、テーブル空間がデータベースのデフォルトのテーブル空間である場合にも許可されます。

- 文書化されていない`!!=`（含まれていない）演算子を削除しました。(Tom)

  こうした操作を行うには`NOT IN (SELECT ...)`が適しています。

- 内部用ハッシュ関数がより均一に分布するようになりました。(Tom)

  アプリケーションコードがPostgreSQL内部用のハッシュ関数を使用してハッシュ値を計算し格納する場合、ハッシュ値は再生成されなければなりません。

- 可変長データ値の取扱いに関するCコード規約を変更しました。(Greg Stark, Tom)

  新しい`SET_VARSIZE()`マクロは、生成された`varlena`型の長さを設定するために使用しなければなりません。 また、より多くの状況で入力値の伸長（"TOAST解除"）を行う必要があるかもしれません。

- `DEBUG`レベルを使用しない限り、連続アーカイブ処理がアーカイブ操作の成功の度にサーバログに報告しないようになりました。

### E.18.2.2. 設定パラメータ

- サーバ管理用のパラメータで多くの変更があります。

  `bgwriter_lru_percent`、`bgwriter_all_percent`、`bgwriter_all_maxpages`、`stats_start_collector`、`stats_reset_on_server_start`が削除されました。 `redirect_stderr`の名前が`logging_collector`になりました。 `stats_command_string`の名前が`track_activities`になりました。 `stats_block_level`と`stats_row_level`は`track_counts`にまとめられました。 `archive_mode`という新しい論理型の設定パラメータはアーカイブ処理を制御します。 Autovacuumのデフォルト設定が変わりました。

- `stats_start_collector`パラメータが削除されました。(Tom)

  UDPソケットの作成に失敗しない限りコレクタプロセスを常に起動するようになりました。

- `stats_reset_on_server_start`パラメータが削除されました。(Tom)

  この目的に`pg_stat_reset()`を使用することができますので、このパラメータは削除されました。

- `postgresql.conf`でパラメータをコメントにすることで、そのデフォルト値に戻るようにしました。(Joachim Wieland)

  これまではコメント化された項目は、次にサーバを再起動するまで、その値は変わらずに残りました。

### E.18.2.3. 文字符号化方式

- 符号化が無効なデータに対して、より多くの検査を追加しました。(Andrew)

  この変更は、バックスラッシュでエスケープされた文字列リテラル処理と`COPY`のエスケープ処理に存在したいくつかの抜け穴を塞ぐものです。 これで、結果が無効なマルチバイト文字を作成したかどうか、エスケープを解除した文字列を再度検査しするようになりました。

- サーバのロケール設定と矛盾するデータベース符号化方式を不許可としました。(Tom)

  多くのプラットフォームでは、`C`ロケールがすべてのデータベース符号化方式で動作する唯一のロケールです。 他のロケール設定は特定の符号化方式を意味することになり、データベース符号化方式と多少異なると、誤動作します。 （典型的な症例として、間違ったテキストソート順や`upper()`もしくは`lower()`の誤動作があります。） サーバは互換性が無い符号化方式でデータベースを作成することを拒絶するようになりました。

- `chr()`が無効な符号化方式の値を生成できないことを確実にしました。(Andrew)

  UTF8で符号化されたデータベースでは、`chr()`の引数はUnicodeコードポイントとして扱われるようになりました。 他のマルチバイト符号化方式では、`chr()`の引数は7ビットASCII文字を指名しなければなりません。 ゼロは受け付けられません。 `ascii()`も併せて調整されました。

- `convert()`の動作を有効な符号化方式に確実になるように調整しました。(Andrew)

  2つの引数を取る`convert()`構文は削除されました。 3つの引数を取る構文は、最初の引数として`bytea`を取り、`bytea`を返すようになりました。 機能の欠落を補うために、新しい関数を3つ追加しました。

  - `convert_from(bytea, name)` returns `text` — 最初の引数を指定された符号化方式からデータベースの符号化方式に変換します。

  - `convert_to(text, name)` returns `bytea` — 最初の引数をデータベース符号化方式から指定された符号化方式に変換します。

  - `length(bytea, name)` returns `integer` —指定した符号化方式における最初の引数の文字長を返します。

- `convert(argument USING conversion_name)`を削除しました。(Andrew)

  この動作は標準SQLに合いませんでした。

- JOHAB符号化方式をクライアント側のみにしました。(Tatsuo)

  サーバ側の符号化方式としてJOHABは安全ではありません。

## E.18.3. 変更点

PostgreSQL 8.3と以前のメジャーリリースとの間の違いについて、以下に詳しく説明します。

### E.18.3.1. 性能

- 非同期コミットは、トランザクションコミット時のWALへの書き出しを遅延します。(Simon)

  この機能により、短期のデータ変更を行うトランザクションの性能が大きく向上しました。 欠点はディスクへの書き出しが遅れるため、データをディスクへの書き出す前にデータベースシステムまたはオペレーティングシステムがクラッシュした場合コミットしたデータが失われる点です。 この機能は多少のデータ損失を受け入れることができるアプリケーションでは役に立ちます。 `fsync`を無効にする場合と異なり、非同期コミットを使用する場合にはデータベースの一貫性に関する危険はありません。 最悪の場合でも、クラッシュの後、コミットされたと報告されている最後の数個のトランザクションが完全にコミットされていない可能性があるだけです。 この機能は`synchronous_commit`を無効にすることで有効になります（一部のトランザクションが極めて重要であり、その他は重要でないような場合、これはセッション単位やトランザクション単位で行うことができます。）。 `wal_writer_delay`を調整して、トランザクションが実際にディスクに書き出されるまでの最大遅延を制御することができます。

- 各チェックポイントにおけるI/Oのピークを抑えるために、チェックポイントの書き出しをより長い時間に分散させることができます。(Itagaki Takahiro and Heikki Linnakangas)

  これまでは、すべての変更済みバッファはチェックポイント時可能な限り高速にディスクに書き出すことが強制されていました。 これによりI/Oが急激に増加するため、サーバの性能が劣化しました。 この新しい方式はチェックポイント時のディスク書き出しを分散させ、I/O使用のピークを抑えます。 （ユーザが要求したチェックポイントおよび停止時のチェックポイントではまだできる限り高速に書き出されます。）

- ヒープオンリータプル（HOT）は、ほとんどの`UPDATE`と`DELETE`における領域の再利用を促進します。(Pavan Deolaseeおよび他の多くからのアイディアによる)

  `UPDATE`および`DELETE`は、失敗した`INSERT`と同様、不要なタプルを背後に残します。 これまでは`VACUUM`のみが不要タプルにより占められた領域を回収することができました。 HOTにより、インデックス付けされた列に変更がなされていなければ、不要タプル領域を`INSERT`または`UPDATE`と同時に、自動的に回収できるようになりました。 これによりより一貫した性能が得られます。 また、HOTは重複したインデックス項目が追加されることを防止します。

- ジャストインタイムのバックグランドライタ戦略はディスク書き出し効率を改善します。(Greg Smith, Itagaki Takahiro)

  これはバックグランドライタの手作業による調整作業の必要性を大きく減らします。

- フィールド単位および行単位の格納にかかるオーバーヘッドが削減されました。(Greg Stark, Heikki Linnakangas)

  128バイト未満の長さのデータ値を持つ可変長データ型において、その格納が3から6バイト減少することがわかります。 例えば、隣接する2つの`char(1)`型のフィールドでは16バイトではなく4バイト使用するようになりました。 また、行ヘッダは以前に比べ4バイト短くなりました。

- 読み取りのみのトランザクションにて非永続トランザクションIDを使用することでオーバーヘッドと`VACUUM`の必要性が減少します。(Florian Pflug)

  非永続トランザクションIDは大域的なトランザクションカウンタを増加させません。 このため、これは`pg_clog`への負荷を低減し、トランザクションID周回を防ぐための強制的なバキュームの実行間隔を長くします。 同時実行性を向上させる性能向上も行われました。

- 読み取りのみのコマンドの後にコマンドカウンタの増加を行いません。(Tom)

  これまでは1トランザクション当たり232 (40億)コマンドという固定の限界がありました。 今回実際にデータベースを変更するコマンドのみが数えられるようになりました。 このため制限自体はまだ存在しますが、悩まされることはかなり減少したはずです。

- バックエンドから作業を分けるために専用のWALライタプロセスを作成しました。(Simon)

- `CLUSTER`および`COPY`で不要なWAL書き出しを行わないようにしました。(Simon)

  WALアーカイブ処理が有効でない限り、 システムは`CLUSTER`でのWAL書き出しを行わず、コマンドの終りでテーブルを`fsync()`するだけになりました。 また、テーブルが同じトランザクションで作成された場合の`COPY`でも同じことを行います。

- 大規模なシーケンススキャンがよく使用されるキャッシュされたページを押し出さないようになりました。(Simon, Heikki, Tom)

- 同時に行われる大規模なシーケンススキャンがディスク読み取りを共有できるようになりました。

  これは、（他のシーケンススキャンがすでに実行中の）テーブルの途中から新しいシーケンススキャンを開始すること、および、その開始から終わりまでを包み隠すことによりなされました。 これは`ORDER BY`の指定がない問い合わせで返される行の順序に影響を与えます。 必要ならば`synchronize_seqscans`設定パラメータを使用して無効にすることができます。

- `ORDER BY ... LIMIT`がソートなしで行うことができるようになりました。(Greg Stark)

  これは、テーブル全体を完全にソートする代わりに、テーブルのスキャンを断続的に行い、"上位N個の"候補行のみを追跡することで行われます。 これは対応するインデックスがない場合や`LIMIT`が大きな値でない場合に有用です。

- バックエンドから統計情報コレクタに送信されるメッセージの頻度に制限を加えました。(Tom)

  これは短めのトランザクションにおけるオーバーヘッドを低減します。 しかし、統計情報が計算される前の遅延が増加する場合もあります。

- 多くのNULLを持つ場合のハッシュ結合の性能を向上しました。(Tom)

- 正確にデータ型が一致しない場合の演算子検索が高速になりました。(Tom)

### E.18.3.2. サーバ

- 自動バキュームがデフォルトで有効になりました。(Alvaro)

  デフォルトに変更することを正当化するために、自動バキュームを有効にさせた場合の欠点を除去するための変更が多くなされました。 この他の自動バキュームに関するパラメータも複数変更されました。

- 複数の自動バキュームプロセスの同時実行をサポートします。(Alvaro, Itagaki Takahiro)

  これにより複数のバキュームを同時に実行できるようになります。 これは、大規模テーブルのバキュームによりより小さなテーブルのバキュームが遅延されることを防ぎます。

- テーブル定義の変更時または統計情報の更新時における、キャッシュされた問い合わせ計画を自動的に再作成します。(Tom)

  これまで一時テーブルを参照するPL/PgSQL関数は`EXECUTE`が使用されていない限り、その関数を呼び出し中に一時テーブルが削除、再作成された場合、失敗しました。 この改良により、この問題および関連する多くの問題が解消されます。

- 一時テーブルおよび一時ファイル用のテーブル空間を制御する`temp_tablespaces`パラメータが追加されました。(Jaime Casanova, Albert Cervera, Bernd Helmle)

  このパラメータは使用されるテーブル空間のリストを定義します。 これにより複数のテーブル空間をまたがったI/O負荷分散が可能です。 一時オブジェクトが作成される度にランダムなテーブル空間が選択されます。 一時ファイルはデータベース単位の`pgsql_tmp/`ディレクトリに格納されず、テーブル空間単位のディレクトリに格納されるようになりました。

- 一時テーブル用のTOASTテーブルを特別な`pg_toast_temp_`nnn``という名前のスキーマに格納します。(Tom)

  これにより低レベルなコードでこれらのテーブルを一時的なものと認識できるようになります。 WALに記録されない変更や共有バッファではなくアクセスにローカルを使用するなど、各種最適化が可能です。 またこれは、バックエンドが予期せず一時TOASTテーブルへのファイル参照を開き続ける際の不具合を解消します。

- 新しい接続要求の固定的な処理フローが、postmasterの停止やクラッシュからの再起動を不定期間遅延させられるという問題を解消します。(Tom)

- 次のチェックポイントの後まで削除されたテーブルのrelfilenodeの再利用を防止することで、非常に可能性が低いデータが損失する状況を保護します。(Heikki)

- 古い形式の外部キートリガ定義を通常の外部キー制約に変換するように`CREATE CONSTRAINT TRIGGER`を修正しました。(Tom)

  これは、`contrib/adddepend`を使用して返還されていない、7.3以前のデータベースで持ち込まれた外部キー制約の移行を簡単にします。

- 継承されたデフォルトを上書きするよう`DEFAULT NULL`を修正しました。(Tom)

  これまで`DEFAULT NULL`はノイズ語句とみなされていました。 しかし、存在しなかった場合に親テーブルまたはドメインから継承される非NULLのデフォルトを上書きすべきでした（今回から上書きします）。

- 新しい符号化方式EUC_JIS_2004とSHIFT_JIS_2004を追加しました。(Tatsuo)

  これらの符号化方式とUTF-8は相互に変換可能です。

- サーバ起動時のログメッセージを "database system is ready"から"database system is ready to accept connections"へ変更しました。 また、その時期も調整しました。

  このメッセージは本当に接続を受け付ける準備が整った時にのみ現れるようになりました。

### E.18.3.3. 監視

- 自動バキュームの活動ログ処理の設定をサポートするための`log_autovacuum_min_duration`を追加しました。(Simon, Alvaro)

- ロック待機をログに記録するための`log_lock_waits`パラメータを追加しました。(Simon)

- 一時ファイルの使用状況をログに記録するための`log_temp_files`パラメータを追加しました。(Bill Moran)

- チェックポイントのログ処理を改良するための`log_checkpoints`パラメータを追加しました。(Greg Smith, Heikki)

- `log_line_prefix`がすべてのプロセス内で`%s`および`%c`エスケープをサポートするようになりました。(Andrew)

  これまでは、これらのエスケープはユーザセッションでのみ動作し、バックグランドデータベースプロセスでは動作しませんでした。

- ポイントインタイムリカバリの再起動点のログ処理を制御するための`log_restartpoints`を追加しました。(Simon)

- リカバリの終わり、および、記録された再起動点で最終トランザクションの終了時刻がログに記録されるようになりました。(Simon)

- 自動バキュームが`pg_stat_activity`内にその活動開始時刻を報告するようになりました。(Tom)

- サーバログをカンマ区切り値（CSV）書式で出力できるようになりました。(Arul Shaji, Greg Smith, Andrew Dunstan)

  後の解析のために、CSV書式のログファイルを簡単にデータベーステーブルにロードすることができます。

- PostgreSQLが提供する時間帯サポートをサーバログで表示されるタイムスタンプの書式に使用します。(Tom)

  間違った符号化方式のローカルの時間帯を使用した場合のWindows固有の問題を防止します。 クライアント側で可視の`timezone`パラメータとは独立した、ログメッセージで使用する時間帯を制御するための`log_timezone`パラメータが追加されました。

- 新しい`pg_stat_bgwriter`システムビューはバックグランドライタの活動に関する統計情報を表します。

- データベース全体のタプル統計情報のための列を`pg_stat_database`に新しく追加しました。(Magnus)

- `xact_start`（トランザクションの開始時刻）列を`pg_stat_activity`に追加しました。(Neil)

  これで、長期間実行中のトランザクションの識別が容易になります。

- `n_live_tuples`および`n_dead_tuples`列を`pg_stat_all_tables`と関連するビューに追加しました。(Glen Parker)

- `stats_block_level`と`stats_row_level`パラメータを1つの`track_counts`パラメータにまとめました。 これは、統計情報コレクタプロセスにすべてのメッセージを送信するかどうかを制御します。(Tom)

- `stats_command_string`パラメータの名前を`track_activities`に変更しました。(Tom)

- コミットされたトランザクションとアボートしたトランザクションが異なる影響を持つことを認識するために、有効タプルと無効タプルの統計的な数え方を修正しました。(Tom)

### E.18.3.4. 認証

- Windowsにおける認証用のセキュリティサービスプロバイダインタフェース（SSPI）をサポートします。(Magnus)

- GSSAPI認証をサポートします。(Henry Hotz, Magnus)

  GSSAPIは業界標準ですので、Kerberos認証そのものより好まれるはずです。

- グローバルなSSL設定ファイルをサポートします。(Victor Wagner)

- 受け付けるSSL暗号を制御するための`ssl_ciphers`パラメータを追加しました。(Victor Wagner)

- Kerberosレルムパラメータ`krb_realm`を追加しました。(Magnus)

### E.18.3.5. 先行書き込みログ（WAL）と連続的なアーカイブ処理

- トランザクションWAL記録に記録されるタイムスタンプがtime_tからTimestampTz表現に変わりました。(Tom)

  これは0.5秒という精度をWALに提供します。 これはポイントインタイムリカバリで役に立ちます。

- ウォームスタンバイサーバで必要とするWALディスク容量を減少させました。 (Simon)

  この変更によりウォームスタンバイサーバは、不要になったWALファイルの自動削除を行いつつ、もっとも初期かつまだ必要なWALファイルの名前をリカバリスクリプトに渡すことができます。 これは`recovery.conf`の `restore_command`において`%r`を使用することで行われます。

- 新しい論理型の設定パラメータ`archive_mode`はアーカイブ処理を制御します。(Simon)

  これまでは、`archive_command`を空文字列に設定することでアーカイブ処理を無効にしました。 今回からは`archive_command`と独立した`archive_mode`がアーカイブ処理の有効無効を切替えます。 これは一時的にアーカイブ処理を停止する際に役に立ちます。

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

- 全文検索がコアデータベースシステムに統合されました。(Teodor, Oleg)

  テキスト検索が改良され、コアのコードに移り、デフォルトでインストールされるようになりました。 `contrib/tsearch2`は互換性を維持するためのインタフェースを含むようになりました。

- `NULL`のソートを先にするか後にするかに関する制御を追加しました。(Teodor, Tom)

  `ORDER BY ... NULLS FIRST/LAST`という構文です。

- インデックスにおいて、列単位の昇順/降順（`ASC`/`DESC`）順序付けオプションが可能です。(Teodor, Tom)

  これまでは、`ASC`/`DESC`指示子が混在した`ORDER BY`を使用する問い合わせでは、インデックスを十分使用することはできませんでした。 今回から、`ASC`/`DESC`指示子に一致するようにインデックスが作成された場合、こうした状況でもインデックスを十分に使用できるようになります。 インデックス内の`NULL`のソート順も制御できるようになりました。

- `col IS NULL`がインデックスを使用できるようになりました。(Teodor)

- 更新可能なカーソル(Arul Shaji, Tom)

  これは、カーソルで返される行を`UPDATE`または`DELETE`するためにプライマリキーを参照する必要をなくします。 `UPDATE/DELETE WHERE CURRENT OF`という構文です。

- カーソルで`FOR UPDATE`が使用可能です。(Arul Shaji, Tom)

- データ型のI/O関数を呼び出すことで、すべてのデータ型と標準文字列型（`TEXT`、`VARCHAR`、`CHAR`）との間の双方向のキャストをサポートする汎用機構を作成しました。(Tom)

  これまでは、こうしたキャストはこの目的に特化した関数を持つ型でのみ利用可能でした。 こうした新しいキャストは文字列へキャストする場合は代入のみ、逆は明示的のみです。 このため予期しない動作を行わないはずです。

- すべての入力がドメイン型の時、`UNION`とそれに関連する式がドメイン型を返すことができます。

  これまでは、出力はドメインの基本型になるものとみなされていました。

- 2つの異なるデータ型を使用する時限定されたハッシュ処理が可能です。(Tom)

  これにより、データ型を跨った比較を行う状況においてデータ型のハッシュ関数が互換性がある場合、ハッシュ結合、ハッシュインデックス、ハッシュ化副計画、ハッシュ集約を使用することができます。 現在、データ型を跨るハッシュ処理のサポートは、`smallint`/`integer`/`bigint`に対するもの、および`float4`/`float8`に対するものが存在します。

- `WHERE`句内に同じ変数があることを検知する、オプティマイザのロジックを改良しました。(Tom)

  これにより、マージ結合が降順ソート順で動作するようになります。 また、冗長なソート列の認識も改良されました。

- ほとんどのテーブルが制約による除外を行う大規模な継承構造の計画を作成する性能が向上しました。(Tom)

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

- 複合型の配列。(David Fetter, Andrew, Tom)

  明示的に宣言された複合型の配列の他、システムカタログ、シーケンス、TOASTテーブルの行型を除く、通常のテーブルやビューの行型の配列もサポートされます。

- サーバ設定パラメータを関数単位で設定できるようになりました。(Tom)

  例えば関数は、実行時に異なる`search_path`が存在する場合の誤動作を防ぐために、独自の`search_path`を設定することができます。 SECURITY DEFINER関数はセキュリティの抜け穴を防ぐために`search_path`を設定すべきです。

- `CREATE/ALTER FUNCTION`が`COST`および`ROWS`オプションをサポートするようになりました。(Tom)

  `COST`により関数呼び出しにかかるコストを指定できます。 `ROWS`により集合を返す関数で返される平均行数を指定できます。 これらの値は最善の計画を選択する際にオプティマイザにより使用されます。

- `CREATE TABLE LIKE ... INCLUDING INDEXES`を実装しました。(Trevor Hardcastle, Nikhil Sontakke, Neil)

- `CREATE INDEX CONCURRENTLY`は他のデータベース内のトランザクションを無視することができます。(Simon)

- `ALTER VIEW ... RENAME TO`および`ALTER SEQUENCE ... RENAME TO`を追加しました。(David Fetter, Neil)

  これまでは、`ALTER TABLE ... RENAME TO`経由でしか行うことができませんでした。

- `CREATE/DROP/RENAME DATABASE`が失敗する前に、競合するバックエンドの終了を短期間待機するようにしました。(Tom)

  これにより、これらのコマンドが成功する可能性が増えました。

- リプリケーションを目的とした、設定パラメータを使用してトリガとルールをまとめて無効化することができます。(Jan)

  これによりリプリケーションシステムは、システムカタログを直接変更することなく、トリガとルールをグループとして無効にすることができます。 この動作は`ALTER TABLE`と新しい`session_replication_role`パラメータにより制御されます。

- ユーザ定義型が型修飾子を持つことができるようになりました。(Teodor, Tom)

  これによりユーザ定義型は`ssnum(7)`のような修飾子を取ることができます。 以前は組み込み型のみが修飾子を持つことができました。

### E.18.3.8. ユーティリティコマンド

- スーパーユーザ以外のデータベース所有者が、デフォルトで所有するデータベースに信頼できる手続き言語を追加できるようになりました。(Jeremy Drake)

  これはかなり安全ですが、一部の管理者はこの権限を取り上げたいと考えるかもしれません。 これは`pg_pltemplate`.`tmpldbacreate`で制御されます。

- セッションの現在のパラメータ設定を今後のセッションにおけるデフォルトとして使用できます。(Tom)

  これは`CREATE/ALTER FUNCTION`、`ALTER DATABASE`、`ALTER ROLE`で`SET ... FROM CURRENT`を付けることで行われます。

- 新しいコマンド`DISCARD ALL`、`DISCARD PLANS`、`DISCARD TEMPORARY`、`CLOSE ALL`、`DEALLOCATE ALL`を実装しました。(Marko Kreen, Neil)

  これらのコマンドは単にデータベースセッションをその初期状態に再設定します。 特に接続プールソフトウェアで有用です。

- `CLUSTER`をMVCCセーフにしました。(Heikki Linnakangas)

  これまでは`CLUSTER`は、不要と確定したすべてのタプルを、たとえMVCCの可視性規則の下でそのタプルを参照することができるはずのトランザクションが他にあったとしても破棄しました。

- `CLUSTER`に新しい構文、`CLUSTER `table` USING `index``を追加しました。(Holger Schurig)

  古い`CLUSTER`構文もまだサポートされますが、新しい構文の方が論理的であるとみなされています。

- 複雑な計画をより正確に表示できるように`EXPLAIN`を修正しました。(Tom)

  副計画出力への参照が、複雑な場合`?column`N`?`を使わずに、常に正しく表示されるようになりました。

- ユーザが削除された時に報告される情報量を制限しました。(Alvaro)

  これまでは、多くのオブジェクトを所有するユーザを削除した（または削除しようとした）時、そのオブジェクトすべてを列挙する、多くの`NOTICE`または`ERROR`メッセージが生成されました。 これは一部のクライアントアプリケーションで問題になりました。 メッセージ長は制限されるようになりましたが、サーバログにはまだすべてのリストが送信されます。

### E.18.3.9. データ型

- SQL/XML標準をサポートしました。これに伴い、新しい演算子と`XML`データ型が含められました。(Nikolay Samokhvalov, Pavel Stehule, Peter)

- 列挙データ型（`ENUM`）。(Tom Dunstan)

  この機能は、小さく、固定の集合のみの値を許すフィールドに対して簡便なサポートを提供します。 `ENUM`型の作成例は`CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy')`です。

- 汎用一意識別子（`UUID`）データ型。(Gevik Babakhani, Neil)

  これはRFC 4122にほぼ合致します。

- `MONEY`データ型を64ビットに広げました。 (D'Arcy Cain)

  これは `MONEY`型の値がサポートする範囲を大きく増やします。

- 一貫して`Infinity` and `NAN` (Not A Number)を扱うことができるように`float4`/`float8`を修正しました。(Bruce)

  以前のコードでは`Infinity` とオーバーフロー条件の区別に一貫性がありませんでした。

- `boolean`値の入力の際、前後の空白文字が許されます。(Neil)

- 区切り文字として数字と小文字を使用することを`COPY`は防止するようになりました。(Tom)

### E.18.3.10. 関数

- 新しい正規表現関数`regexp_matches()`、`regexp_split_to_array()`、`regexp_split_to_table()`を追加しました。(Jeremy Drake, Neil)

  これらの関数は正規表現副式の抽出を提供し、POSIX正規表現を使用した文字列の分割を行うことができます。

- ラージオブジェクトの切り詰めを行う`lo_truncate()`を追加しました。(Kris Jurka)

- `float8`データ型に対する`width_bucket()`を実装しました。(Neil)

- 現在のトランザクションで収集された統計情報のスナップショットを破棄する`pg_stat_clear_snapshot()`を追加しました。(Tom)

  トランザクションにおける最初の統計情報の要求はトランザクション期間で変更されない統計情報のスナップショットを取ることです。 この関数によりこのスナップショットを破棄し、次の統計情報問い合わせで新しいスナップショットを読み込むことができます。 これは特に、単一トランザクション内に制限されるPL/PgSQL関数で有用です。

- `EXTRACT()`および`date_part()`に`isodow` オプションを追加しました。(Bruce)

  これは日曜を7とした週内日数を返します（`dow`は日曜を0とします）。

- `to_char()`、`to_date()`、`to_timestamp()`に`ID`（ISO週内日数）および`IDDD`（ISO年内日数）書式コードを追加しました。(Brendan Jurd)

- `to_timestamp()`および`to_date()`が、長さが可変となる可能性があるフィールドに対して`TM` (trim)オプションを前提とするようにしました。

  これはOracleの動作と合致します。

- `to_date()`/`to_timestamp()`の`D`（非ISO週内日数）の変換における一つ違いのエラーを修正しました。(Bruce)

- `setseed()`を、無意味な整数値ではなくvoidを返すようにしました。(Neil)

- `NUMERIC`用のハッシュ関数を追加しました。(Neil)

  これにより`NUMERIC`列でハッシュインデックスとハッシュを基にした計画が利用できるようになりました。

- `LIKE`/`ILIKE`の効率を、特にUTF-8のようなマルチバイト文字セットで、向上させました。(Andrew, Itagaki Takahiro)

- `currtid()`が対象テーブルについての`SELECT`を必要とするようにしました。(Tom)

- 活動中のトランザクションIDを問い合わせるための`txid_*()`関数を複数追加しました。(Jan)

  これは各種リプリケーションソリューションで有用です。

### E.18.3.11. PL/PgSQLサーバサイド言語

- `FETCH`での方向指定を含む、スクロール可能なカーソルのサポートを追加しました。(Pavel Stehule)

- バックエンドの`FETCH`コマンドと合わせ、PL/PgSQLの`FETCH`にて`FROM`の代わりに`IN`を使用可能にしました。(Pavel Stehule)

- PL/PgSQLに`MOVE`を追加しました。(Magnus, Pavel Stehule, Neil)

- `RETURN QUERY`を実装しました。(Pavel Stehule, Neil)

  これは、PL/PgSQLの集合を返す関数で問い合わせの結果を返したい場合向けに簡便な構文を追加します。 `RETURN QUERY`は、 `RETURN NEXT`をループさせるよりも簡単で効率的です。

- 関数のパラメータ名を関数名で修飾できるようにしました。(Tom)

  例えば、`myfunc.myvar`です。 これは特に、列名と名前が一致する可能性がある変数を問い合わせ内で指定する場合に役に立ちます。

- ブロックレベルの変数修飾が適切に動作するようにしました。(Tom)

  これまでは、より外側のブロックラベルがより内側のレコードや行参照の認識に意図せず干渉していました。

- `FOR`ループの`STEP`値の必要条件を厳密にしました。(Tom)

  非正の`STEP`値を許しません。 また、ループのオーバーフローを取り扱います。

- 構文エラーで報告する発生位置の精度を高めました。(Tom)

### E.18.3.12. 他のサーバサイド言語

- PL/Perl `spi_prepare()`への型名引数が`pg_type`内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

- PL/Python `plpy.prepare()`への型名引数が`pg_type`内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

- PL/Tcl `spi_prepare`への型名引数が`pg_type`内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

- PL/PythonUがPython 2.5でコンパイルできるようになりました。 (Marko Kreen)

- Python版と互換性のある、本当のPL/Python論理型をサポートします。(Marko Kreen)

- スレッドが有効な`libtcl`を使用した場合にバックエンド内で複数のスレッドが生成されるPL/Tclの問題を修正しました。(Steve Marshall, Paul Bayer,Doug Knight)

  これはまったく不愉快な事象を引き起こしました。

### E.18.3.13. psql

- `\d`の出力で無効なトリガを別途列挙します。(Brendan Jurd)

- パターン指定の`\d`で、常に`$`そのものに一致します。(Tom)

- `\da`出力にて集約の戻り値型を示します。(Greg Sabino Mullane)

- `\df+`の出力に関数の揮発性状態を追加しました。 (Neil)

- `\prompt`機能を追加しました。(Chad Wagner)

- `\pset`、`\t`、`\x`が単に切替えるだけでなく`on`または`off`を指定できるようになりました。(Chad Wagner)

- `\sleep`機能を追加しました。(Jan)

- `\copy`で`\timing`出力を有効にしました。(Andrew)

- Windowsにおいて`\timing`の解像度を向上させました。(Itagaki Takahiro)

- 各バックスラッシュコマンドの後`\o`出力をフラッシュします。(Tom)

- `-f`で指定された入力ファイルの読み取り時に正確にエラーを検知し報告します。(Peter)

- `-u`オプションを削除しました（これはかなり前から廃止予定でした）。(Tom)

### E.18.3.14. pg_dump

- pg_dumpallに`--tablespaces-only`および`--roles-only`オプションを追加しました。(Dave Page)

- pg_dumpallに出力ファイルオプションを追加しました。(Dave Page)

  これは主に、pg_dump子プロセスの出力リダイレクションが動作しない、Windowsで有用です。

- pg_dumpallが初期接続用にデフォルトの`template1`以外のデータベース名を受け付けられるようになりました。(Dave Page)

- `-n`および`-t`スイッチにて、常に`$`そのものに一致します。(Tom)

- データベースが数千のオブジェクトを持つ場合の性能を向上しました。(Tom)

- `-u`オプションを削除しました（これはかなり前から廃止予定でした）。(Tom)

### E.18.3.15. 他のクライアントアプリケーション

- initdbで、`pg_xlog`ディレクトリの場所を指定できるようになりました。(Euler Taveira de Oliveira)

- サポートされるオペレーティングシステムでは、pg_regress内でサーバコアファイルの生成が有効になりました。(Andrew)

- pg_ctlに`-t`（時間切れ）パラメータを追加しました。(Bruce)

  これは、サーバ起動時または停止時にpg_ctlが待機する時間をを制御します。 これまでの待機時間は固定で60秒でした。

- サーバコアダンプの生成を制御するためにpg_ctlのオプションを追加しました。(Andrew)

- Control-Cでclusterdb、reindexdb、vacuumdbをキャンセルできるようにしました。(Itagaki Takahiro, Magnus)

- createdb、createuser、dropdb、dropuserでコマンドタグの出力を抑制します。(Peter)

  `--quiet`オプションは無視され、8.4で削除される予定です。 全データベースを実行している場合の進行メッセージは、実際のエラーではありませんので、標準エラー出力ではなく標準出力に出力されるようになりました。

### E.18.3.16. libpq

- `PQsetdbLogin()`の`dbName`パラメータが等号記号を含む時`conninfo`文字列として解釈されます。(Andrew)

  まだ`PQsetdbLogin()`を使用しているクライアントプログラムで`conninfo`文字列を使用できるようになります。

- 大域的なSSL設定ファイルをサポートします。(Victor Wagner)

- SSLハードウェアキーを制御する`PGSSLKEY`環境変数を追加しました。(Victor Wagner)

- ラージオブジェクトを切り詰めるための`lo_truncate()`を追加しました。(Kris Jurka)

- サーバがパスワードを必要としているが、何も与えられていない場合に真を返す`PQconnectionNeedsPassword()`を追加しました。(Joe Conway, Tom)

  接続試行に失敗した後に真を返した場合、クライアントアプリケーションはユーザにパスワードの入力を促すべきです。 これまでのアプリケーションでは、パスワードが必要かどうかを決めるために、特定エラーメッセージの検査を行う必要がありました。 この方法は推奨されなくなりました。

- 与えたパスワードが実際に使用された場合に真を返す`PQconnectionUsedPassword()`を追加しました。(Joe Conway, Tom)

  ユーザが与えたパスワードが実際に有効だったかどうかの確認が重要となる一部のセキュリティコンテキストで、これは役に立ちます。

### E.18.3.17. ecpg

- V3フロントエンド/バックエンドプロトコルを使用します。(Michael)

  これは、サーバサイドの準備済み文のサポートを追加します。

- Windowsでpthreadではなくネイティブのスレッドを使用します。(Magnus)

- ecpglibのスレッド安全性を向上しました。(Itagaki Takahiro)

- ecpgライブラリが必要なAPIシンボルのみをエキスポートするようにしました。(Michael)

### E.18.3.18. Windowsへの移植

- Microsoft Visual C++を使用したPostgreSQL配布物全体のコンパイルを可能にしました。(Magnus and others)

  これによりWindowsを基に開発する開発者が慣れた開発ツール、デバッグツールを使用できるようになりました。 また、Visual C++で作成されたWindows実行形式ファイルは、他のツールセットで作成されたファイルより優れた安定性と性能を持ちます。 クライアントのみを構築するVisual C++のスクリプトは削除されました。

- 多くの子プロセスを持つ時のpostmasterのメモリ使用量を劇的に減少させました。(Magnus)

- リグレッション試験が管理者ユーザで起動できるようになりました。(Magnus)

- ネイティブな共有メモリの実装を追加しました。(Magnus)

### E.18.3.19. サーバプログラミングインタフェース(SPI)

- SPIにカーソル関連の機能を追加しました。(Pavel Stehule)

  カーソル関連の計画作成オプションにアクセスすることができます。 また、`FETCH`/`MOVE`処理を追加しました。

- `SPI_execute`経由でカーソルコマンドを実行することができます。 (Tom)

  `SPI_ERROR_CURSOR`はまだ存在しますが、何も返しません。

- SPI計画ポインタは`void *`ではなく`SPIPlanPtr`として宣言されます。(Tom)

  これはアプリケーションコードを壊しませんが、単純なプログラムミスを見付けやすくするために変更することを勧めます。

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

- コードプロファイリング（gccでのみ動作）を有効にするためにconfigureのオプションに`--enable-profiling`を追加しました。(Korry Douglas and Nikhil Sontakke)

- オペレーティングシステムの時間帯データベースを使用するためにconfigureのオプションに`--with-system-tzdata`を追加しました。(Peter)

- pg_configプログラムが`PATH`の先頭にないPostgreSQLインストレーションに対して拡張を構築できるようにPGXSを修正しました。(Tom)

- SGML文書の構築時の`gmake draft`をサポートします。(Bruce)

  `draft`を使わない場合、インデックス更新を確実にするために必要ならば、文書の構築が2回行われます。

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

- サードパーティにより`DLLIMPORT`が宣言されたインクルードファイル（Tclのような）との競合を防ぐために、`DLLIMPORT`マクロ名を`PGDLLIMPORT`に変更しました。(Magnus)

- データ型を跨った比較を含む問い合わせの計画作成を改良するために"演算子族"を作成しました。(Tom)

- 問い合わせを満たすことができるものが存在しなかったことを通知できるようにGINの`extractQuery()` APIを更新しました。(Teodor)

- `NAMEDATALEN`定義を`postgres_ext.h`から`pg_config_manual.h`に移動しました。(Peter)

- すべてのプラットフォームで`strlcpy()`および`strlcat()`を提供します。 また、エラーが起こりがちの`strncpy()`、`strncat()`などの使用を置き換えました。(Peter)

- 外部のプラグインによりプランナを監視（置き換えることすら可能）させる、および、仮定の状況に対する計画を作成するためのフックを作成しました。(Gurjeet Singh, Tom)

- プラグインにプランナの結合検索順の位置を上書きさせるための`join_search_hook`関数変数を作成しました。(Julius Stroffek)

- ルネサスM32Rプロセッサ向けの`tas()`サポートを追加しました。(Kazuhiro Inaoka)

- `quote_identifier()`およびpg_dumpは、文法に従い保持されないキーワードに引用符を付けません。(Tom)

- `sign_dscale`ワードが重みより前に来るように、`NUMERIC`データ型のディスク上の表現を変更しました。

- Darwin >= 6.0、つまりOS X 10.2以上でPOSIXではなくSYSVセマフォを使用します。(Chris Marcellino)

- acronymおよびNFSに関する節を文書に追加しました。(Bruce)

- "PostgreSQL"の別名として受け入れられるものとして"Postgres"が文書化されました。(Peter)

- データベースサーバが停止している場合のサーバなりすまし防止に関する文書を追加しました。(Bruce)

### E.18.3.22. Contrib

- `contrib` `README`の内容を主PostgreSQL文書に移しました。(Albert Cervera i Areny)

- 低レベルなページ検査を行う`contrib/pageinspect`モジュールを追加しました。(Simon, Heikki)

- ウォームスタンバイ操作を制御する`contrib/pg_standby`モジュールを追加しました。(Simon)

- OSSP UUIDライブラリを使用して`UUID`値を生成する`contrib/uuid-ossp`モジュールを追加しました。(Peter)

  configure `--with-ossp-uuid`を使用して有効にします。 これは新しく組込まれた`UUID`型を使用します。

- テキスト検索辞書テンプレートとパーサを追加するためのサンプルを提供する`contrib/dict_int`、`contrib/dict_xsyn`、`contrib/test_parser`モジュールを追加しました。(Sergey Karpov)

- contrib/pgbenchでフィルファクタを設定できるようにしました。(Pavan Deolasee)

- contrib/pgbench `-l`にタイムスタンプを追加しました。(Greg Smith) (Greg Smith)

- `contrib/pgbuffercache`に使用カウントに関する統計情報を追加しました。(Greg Smith)

- `contrib/hstore`にGINサポートを追加しました。(Teodor)

- `contrib/pg_trgm`にGINサポートを追加しました。(Guillaume Smet, Teodor)

- `contrib/start-scripts`のOS/X用起動スクリプトを更新しました。(Mark Cotner, David Fetter)

- `pgrowlocks()`と`dblink_get_pkey()`を対象テーブルに`SELECT`権限を持つユーザに制限しました。(Tom)

- `contrib/pgstattuple`関数をスーパーユーザに制限しました。(Tom)

- `contrib/xml2`は推奨しません。8.4で削除される予定です。

  PostgreSQLのコアにある新しいXMLサポートがこのモジュールに取って代わりました。

前のページ | ホーム | 次のページ
リリース8.3.1 | 上に戻る | リリース8.2.17