リリースノート

PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 付録 E. リリースノート

# E.1. リリース8.0

> リリース日: 2005-01-19

## E.1.1. 概要

以下に本リリースにおける大きな変更点を示します。

Microsoft Windowsネイティブサーバ

  このリリースは、Microsoft Windows®上でサーバとしてネイティブに稼動する最初のPostgreSQLリリースです。 これはWindowsサービスとしても稼動可能です。 このリリースでは、Windows 2000、Windows XP、および、Windows 2003などのNTベースのWindowsをサポートします。 Windows 95、Windows 98、および、Windows MEなどの古めのリリースはサポートされていません。 これらのオペレーティングシステムではPostgreSQLをサポートするための基盤が存在しないためです。 別に、Windows上でのインストールを簡単に行うために、インストーラプロジェクトが設立されました。 http://pgfoundry.org/projects/pginstallerを参照してください。

  リリース工程を通して試験を行いましたが、Windowsへの移植においてはPostgreSQLがUnixプラットフォームで培ってきた長年の製作環境の経験という利点がありません。 そのため、新しい製品を使用する時と同等の注意をもってこれを扱ってください。

  以前のリリースでは、WindowsオペレーティングシステムでサーバをサポートするためにはCygwin Unixエミュレーションツールキットが必要でした。 PostgreSQLは数年に渡ってWindows上のネイティブなクライアントをサポートしていました。

セーブポイント

  セーブポイントにより、トランザクションの特定の一部を他の部分に影響することなく、アボートさせることができます。 以前のリリースではこうした機能はありませんでした。 トランザクション全体をアボートさせる以外に、トランザクション内のある文の失敗から復旧させる方法はありませんでした。 この機能は、複雑なトランザクション内でエラーからの復旧が必要なアプリケーション作成者にとって有意です。

ポイントインタイムリカバリ

  これまでのリリースでは、以前のバックアップからリストアする、もしくは、スタンバイ・リプリケーションサーバを使用する以外に、ディスク装置の障害から復旧させる方法はありませんでした。 ポイントインタムリカバリにより、サーバの連続的なバックアップが可能です。 障害発生時点まで復旧させることも過去のあるトランザクションまで復旧させることも可能です。

テーブル空間

  テーブル空間を使用して、管理者は個々のテーブル、インデックス、および、データベース全体を格納するために異なるファイルシステムを選ぶことができます。 これは、性能を改善し、また、ディスク領域全体の使用状況を制御できます。 これまでのリリースでは、initlocationを使用し、こうした処理のためには手作業によってシンボリックリンクを管理していました。

バッファ管理、`CHECKPOINT`、`VACUUM`の改良

  このリリースでは、より高度なバッファ交換戦略を使用します。 これにより、利用可能な共有バッファの使用が改善され、性能が向上します。 バキューム処理やチェックポイント処理が性能に与える影響も軽減されます。

列データ型の変更

  `ALTER TABLE`で列のデータ型が変更できるようになりました。

新しいPerlサーバサイド言語

  新しいバージョンのplperlサーバサイド言語では、永続的共有格納領域、トリガ、レコードを返すこと、レコードの配列を返すこと、データベースにアクセスするSPI呼び出しをサポートするようになりました。

`COPY`におけるカンマ区切り値書式(CSV)サポート

  `COPY`で、カンマ区切り値書式ファイルの読み書きが可能になりました。 これはまた、非標準的な引用符や文字の区切りを柔軟に解釈できます。

## E.1.2. バージョン8.0への移行

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

以下の非互換性に注意してください。

- `READ COMMITTED`シリアライゼーションモードにおいて、揮発性関数が、その関数の呼び出し元となったコマンドが始まるまでではなく、その関数内の各文が始まるまでに同時実行中のトランザクションによってコミットされた結果を参照できるようになりました。

- `STABLE`もしくは`IMMUTABLE`と宣言された関数は常に呼び出し中の問い合わせのスナップショットを使用します。 そのため、呼び出し中の問い合わせが始まってから行われた活動の影響を、その活動が自身のトランザクションであっても他のトランザクションであっても、参照しません。 こうした関数は読み取りのみでなければなりません。 つまり、`SELECT`以外のSQLコマンドを全く使用することができません。

- 非遅延の`AFTER`トリガが、現在の対話的コマンドの完了後ではなく、トリガの発行元となる問い合わせの完了後、即座に発行されるようになりました。 これはトリガの発行元となる問い合わせが関数内にある時に差異が現れます。 この場合トリガは、関数が次の操作を進める前に呼び出されます。

- サーバ設定パラメータ`virtual_host`と`tcpip_socket`が、より一般的なパラメータ`listen_addresses`に置き換えられました。 また、サーバはデフォルトで`localhost`に対する監視を行うようになりました。 これにより、多くの状況において`-i` postmasterスイッチの必要性がなくなりました。

- サーバ設定パラメータ`SortMem`および`VacuumMem`の名前が、より使用状況に合った`work_mem`および`maintenance_work_mem`という名前に変更されました。 元の名前は`SET`や`SHOW`でまだサポートされています。

- サーバ設定パラメータ`log_pid`、`log_timestamp`、`log_source_port`が、より柔軟な`log_line_prefix`に置き換えられました。

- サーバ設定パラメータ`syslog`がより論理的な`log_destination`変数に置き換えられ、この変数によってログの出力先を制御するようになりました。

- データ変更のみやデータ定義文のみを選択できるように、サーバ設定パラメータ`log_statement`が変更されました。 サーバ設定パラメータ`log_duration`は、`log_statement`が問い合わせを出力する場合にのみ出力するようになりました。

- サーバ設定パラメータ`max_expr_depth`が`max_stack_depth`に置き換えられました。 これは、式の入れ子レベルではなく物理的なスタックサイズを単位とします。 再帰的な関数によって引き起こされるスタックオーバーフローが原因で、セッションが終了してしまうことを防止するために、これは役に立ちます。

- `length()`が、`CHAR(n)`の値の最後に含まれる空白を数えないようになりました。

- 整数から`BIT(N)`へのキャストにおいて、整数の右からNビットが選択されるようになりました。 以前は左からNビットを選択していました。

- NULL配列値の一要素もしくは一部を更新をすることで、非NULLの配列、すなわち、代入された位置だけからなる配列が生成されるようになりました。

- 配列への入力値の構文検査がかなり厳しくなりました。 これまではおかしな場所に入力でき、おかしな結果を返していたごみが、エラーになるようになりました。 空文字列の要素値は、何も入力しないのではなく、`""`と記述しなければなりません。 また、配列要素の前後の空白に関する動作も変更されました。 後にある空白が、前にある空白と同義（これはこれまでも無視されていました）となるようにに無視されるようになりました。

- 整数演算操作のオーバーフローが検出されるようになりました。エラーとして報告されます。

- 単一バイトの"char"データ型に関連する算術演算子が削除されました。

- extract()関数（`date_part`とも呼ばれます）が紀元前の時間に対して正確な年を返すようになりました。 以前は正しい値よりも1少ない値が返されていました。 また、この関数が千年紀や世紀についても正しい値を返すようになりました。

- `CIDR`値のマスクされないビットがゼロでなければならなくなりました。 例えば、`204.248.199.1/31`は`CIDR`の値としてもはや許されません。 こうした値はこれまでもPostgreSQLで受け付けられないはずでしたが、これが拒絶されるようになりました。

- `EXECUTE`が、実行した文に合った完了タグを返すようになりました。

- psqlの`\copy`コマンドが、psqlの`stdin/stdout`ではなく問い合わせの`stdin/stdout`を読み書きするようになりました。 新しい`pstdin`/`pstdout`パラメータ経由でアクセスすることで以前の動作を行うことができます。

- JDBCクライアントインタフェースが標準配布から削除され、http://jdbc.postgresql.orgから提供されるようになりました。

- TCLクライアントインタフェースも削除されました。 http://gborg.postgresql.orgで、複数のTCLインタフェースが提供されています。

- サーバが、オペレーティングシステムで提供されるものではなく、独自の時間帯データベースを使用するようになりました。 これにより全てのプラットフォームにおいて一貫性のある振舞いが提供されます。 ほとんどの場合、時間帯の動作における注意すべき差異はほぼありませんが、`SET`/`SHOW` `TimeZone`で使用される時間帯名称はプラットフォームが提供する名称と異なる可能性があることに注意してください。

- configureのスレッド用オプションのために、ユーザによる試験やファイルの編集が不要になりました。 スレッド用オプションが自動的に検出されるようになりました。

- テーブル空間が実装されました。 そのためinitlocationが削除されました。

## E.1.3. 廃止予定の機能

PostgreSQLの動作の一部は準最適となることが決定されています。 後方互換性のために、これらは8.0では削除されませんでしたが、非推奨であり、次のメジャーリリースで削除される予定です。

- リリース8.1では`to_char(interval, text)`関数は削除される予定です。

- `oid`/`float4`/`float8`データ型に空文字列を代入した時に、サーバが警告を発するようになりました。 これまで同様に、0として解釈して処理を継続します。 次のメジャーリリースでは、空文字列はこうしたデータ型では無効とみなす予定です。

- デフォルトでは、PostgreSQL 8.0以前のテーブルは`OID`付きで作成されます。 次のリリースでは、これは事実でなくなる予定です。 `OID`付きでテーブルを作成するためには、`WITH OIDS`句を指定する、あるいは、`default_with_oids`設定パラメータを設定する必要があります。 将来のリリースのPostgreSQLとの互換性のために、OIDが必要なテーブルを使用しているユーザは明示的に`WITH OIDS`を指定することを勧めます。

## E.1.4. 変更点

以下に、リリース8.0とこれまでのメジャーリリースとの間での変更点の詳細な内容を示します。

### E.1.4.1. 性能向上

- データ型を跨るインデックスの使用をサポート(Tom)

  この変更を行うまで、データ型が完全に一致しない場合、多くの問い合わせがインデックスを使用しませんでした。 この改良によりインデックスの使用がより直感的かつ一貫的になります。

- 新しいバッファ交換戦略によるキャッシュ処理の改良(Jan)

  これまでのリリースでは最長未使用時間（LRU）キャッシュを使用して、最近に参照されたページをメモリ内に保持していました。 このLRUアルゴリズムでは、特定のキャッシュ項目が何回アクセスされたかを考慮しませんでした。 そのため、大規模なテーブルスキャンにより、よく使用されるキャッシュページがメモリ外に追いやられてしまいます。 新しいキャッシュアルゴリズムは、4つの独立したリストを使用して、最も最近に使用されたキャッシュページ、最もよく使用されたキャッシュページを管理し、作業負荷に基づいてその交換を動的に最適化します。 これにより共有バッファキャッシュが非常に効率的に使用されるようになるはずです。 これまで共有バッファのサイズを試行錯誤して決定していた管理者は、この新しいキャッシュ交換ポリシーで再度決定してください。

- 定期的にダーティバッファを書き出すサブプロセスの追加によりチェックポイント時の書き出しを低減(Jan)

  これまでのリリースでは、数分程度の周期で実行されるチェックポイントプロセスが全てのダーティバッファをオペレーティングシステムのキャッシュに書き込み、オペレーティングシステムのダーティバッファをディスクに書き出していました。 これによりディスクの使用に関して周期的なピークが現れるようになり、性能を悪化させることがよく起こりました。 新しいコードでは、バックグランドライタを使用して、一定のペースで小刻みに書き出すようにしたので、チェックポイントの際にダーティページの書き出しがかなり少なくなりました。 更に新しいコードでは、大域的な`sync()`を呼び出さずに、直前のチェックポイント以降に書き込まれたファイルのみに対する`fsync()`を呼び出します。 これにより性能は向上し、チェックポイント時の性能劣化も最小限になります。

- バキュームを延長する機能の追加により性能への影響を軽減(Jan)

  負荷が高いシステムにおいて`VACUUM`処理は、多くのI/O要求を行いますので、他のユーザにとっての性能を悪化させてしまいます。 このリリースでは、`VACUUM`速度を低めることで、他のユーザへの影響を低減させることができます。 しかし、これは`VACUUM`の処理時間を多くしてしまいます。

- 重複キーに対するB-Treeインデックス性能の向上(Dmitry Tkach, Tom)

  インデックス内に重複する値が多い場合のインデックスのスキャン方法が改良されました。

- 計画作成時、動的に生成されるテーブルサイズ推定値を使用する(Tom)

  これまでプランナは、最後に実行した`VACUUM`または`ANALYZE`によって判明した値を使用して、テーブルの物理サイズ(ページ数)や行数などのテーブルサイズを推定していました。 現在のテーブルの物理サイズをカーネルから取得し、このテーブルサイズに最後に実行した`VACUUM`または`ANALYZE`によって判明した値を乗じて行数を推定するようになりました。 これにより、最後に保守用のコマンドを実行してからテーブルサイズに大きな変更があった場合でも、より信頼できる推定ができるようになるはずです。

- `OR`句のある場合のインデックス使用の改良(Tom)

  これにより、オプティマイザは、インデックス付けされていない、多くのOR句を持つ文に対してインデックスを使用できるようになりました。 また、複数列に対するインデックスが、その最初の列が指定され、2番目の列が`OR`句の一部である場合でも使用できるようになりました。

- 部分インデックス句の一致処理の改良(Tom)

  サーバが、複雑な`WHERE`句を持つ問い合わせにおける部分インデックスの使用に関してより賢明になりました。

- GEQOオプティマイザの性能向上(Tom)

  多く（デフォルトでは12以上）のテーブルを持つ問い合わせの計画を作成する時、GEQOオプティマイザが使用されます。 このリリースでは、最適化に費やされる時間を減らすために、問い合わせの解析方法を高速化しました。

- 雑多なオプティマイザの改良

  実施された小規模な改良を全てここで示すことはできませんが、特定状況における多くの改善がこれまでのリリースよりなされています。

- C関数の検索速度の改良(Tom)

  このリリースでは、動的にロードされたC関数の情報を検索する時にハッシュテーブルを使用します。 これにより、検索がサーバの実行形式に組み込まれた関数とほぼ同等の速度で実行されますので、速度が向上します。

- 型固有の`ANALYZE`統計処理機能の追加(Mark Cave-Ayland)

  この機能により、より柔軟な非標準のデータ型用の統計情報の生成が可能です。

- `ANALYZE`が式インデックスに対する統計情報を収集するようになりました(Tom)

  式インデックス（関数インデックスとも呼ばれます）により、ユーザは単なる列だけではなく式や関数呼び出しの結果に対してインデックスを付けることができます。 このリリースでは、オプティマイザは式インデックスの内容に関する統計情報を収集、使用することができます。 これにより式インデックスが最適な問い合わせに対して作成される計画の質がかなり向上します。

- `ANALYZE`用の新しい2段階サンプリング手法(Manfred Koizar)

  これにより、テーブルの領域によって有効な行の密度が非常に異なる場合により優れた統計情報が得られます。

- `TRUNCATE`の速度向上 (Tom)

  7.4で見受けられた`TRUNCATE`の性能劣化を、トランザクションセーフのまま取り戻しました。

### E.1.4.2. サーバにおける変更

- WALファイルアーカイブとポイントインリカバリの追加(Simon Riggs)

- ディスクレイアウトの制御ができるテーブル空間の追加(Gavin)

- 組み込みログ回転プログラムの追加(Andreas Pflug)

  syslogや他のログ回転プログラムに依存することなく簡単にサーバメッセージのログができるようになりました。

- 以下のサーバコンパイル時の設定を表示するための、読み取りのみのサーバ設定パラメータの追加 `block_size`、`integer_datetimes`、`max_function_args`、`max_identifier_length`、`max_index_keys` (Joe)

- `sameuser`、`samegroup`、`all`という引用符付けによる`pg_hba.conf`での特殊な意味付けを取消し(Andrew)

- デフォルトの`pg_hba.conf`内にてより明瞭な`localhost`用のIPv6名`::1/128`を使用(Andrew)

- `pg_hba.conf`の例においてCIDR書式を使用(Andrew)

- サーバ設定パラメータ`SortMem`と`VacuumMem`の名前を`work_mem`と`maintenance_work_mem`に変更(古い名前もまだサポートします)(Tom)

  この変更は、インデックスや外部キーの作成などのバルク操作には`maintenance_work_mem`、問い合わせの実行中に使用される作業空間用には`work_mem`、と明確に分けるために行われました。

- `log_disconnections`サーバ設定を使用したセッション切断のログを可能にした (Andrew)

- 各ログ行に発行される情報を制御できるように`log_line_prefix`サーバ設定パラメータを新規追加(Andrew)

  ユーザ名、データベース名、リモートのIPアドレス、セッションの開始時刻を含めることができます。

- `log_pid`、`log_timestamp`、`log_source_port`サーバ設定パラメータの削除。これらの機能は`log_line_prefix`で置き換えられました。(Andrew)

- `virtual_host`と`tcpip_socket`パラメータを統合し`listen_addresses`パラメータに置き換えた(Andrew, Tom)

  `virtual_host`では単一の接続監視用IPアドレスしか指定できませんでした。 `listen_addresses`では複数のアドレスを指定することができます。

- デフォルトでローカルホストの接続監視を行い、多くの状況で`-i` postmasterスイッチの必要性を省いた(Andrew)

  ローカルホスト(`127.0.0.1`)の接続監視によってセキュリティ問題が発生することはありません。 更に、ローカルソケットをサポートしないWindowsやJDBCなどの設定において特別な調整を行うことなく動作させることができます。

- `syslog`サーバ設定パラメータを削除。ログ出力先を制御する、より論理的な`log_destination`変数を追加。

- どの問い合わせをログに記録するかを選択するために`log_statement`サーバ設定パラメータが`all`、`mod`、`ddl`、`none`を取るように変更(Bruce)

  これにより、管理者はデータ定義の変更のみやデータ変更文のみのログを取得することができます。

- 一部のログ取得関連の設定パラメータは以前から普通のユーザによって調整可能でしたが、"より冗長"方向でのみにしか調整できませんでした。 これらがより厳密に扱われるようになり、スーパーユーザのみがこれらを設定することができます。 しかし、スーパーユーザは`ALTER USER`を使用して、ユーザ単位で非スーパーユーザ用の設定を提供することができます。 また、スーパーユーザは`PGOPTIONS`を介してスーパーユーザのみの設定パラメータの値を設定することもできます。

- 設定ファイルをデータディレクトリ外に格納できるようにした(mlw)

  デフォルトでは、設定ファイルはクラスタの最上位ディレクトリにあります。 この追加によって、設定ファイルをデータディレクトリ以外に格納することができるようになり、管理しやすくなりました。

- 最初に実行される時のみに準備済み問い合わせの計画を作成。これで定数を統計処理に使用することが可能。(Oliver Jowett)

  準備済み文はその計画を一度作成し、何回も実行します。 準備済み文では、その使用時に再計画分のオーバヘッドを防ぐことができますが、計画の質は、問い合わせで使用される正確なパラメータが不明である分劣化します。 このリリースでは、無名の準備済み分の計画作成は最初の実行まで遅延され、そしてその実行時に使用された実際のパラメータ値を最適化のヒントとして使用します。 これにより、行外のパラメータ渡しを性能を落とすことなく使用できるようになりました。

- パラメータを取る`DECLARE CURSOR`が可能(Oliver Jowett)

  パラメータ付き`Parse`メッセージにて`DECLARE CURSOR`を発行する際に有用です。 `Bind`時点で送信されるパラメータ値が、カーソルの問い合わせの実行時に置き換えられます。

- `inet`と`cidr`データ型に対するハッシュ結合と集約の修正(Tom)

  リリース7.4における、`inet`と`cidr`値が混在した場合のハッシュ処理に不具合がありました。 （これらの型のハッシュを作成することはありませんので、この不具合はそれまでのリリースでは存在しません。）

- `log_statement`が問い合わせを出力する場合のみに `log_duration`を出力するようにしました。(Ed L.)

### E.1.4.3. 問い合わせにおける変更

- セーブポイント(入れ子のトランザクション)機能の追加(Alvaro)

- 未サポートの隔離レベルを受け付け、サポートされたレベルの中で最も近いレベルに移るようになりました。(Peter)

  SQL仕様では、データベースが指定した隔離レベルをサポートしない場合はその次に厳しいレベルを使用すべきであると規定しています。 この変更はこの推奨に従ったものです。

- `START TRANSACTION`同様`BEGIN WORK`でトランザクション隔離レベルを指定可能です。

- 受け付けた元の問い合わせと異なる問い合わせ型を生成するルールについてテーブル権限の検査を修正(Tom)

- 単一引用符の使用を簡単にするドル引用符の実装(Andrew, Tom, David Fetter)

  これまでのリリースでは、関数本体に引用符を付けるために単一引用符が使用されていましたので、関数テキストの内部の単一引用符を、二重の単一引用符、もしくはエラーが起こりやすい記述とする必要がありました。 このリリースでは、テキストブロックの引用符付けに「ドル引用符付け」を使用できるように機能を追加しました。 この機能により、異なる入れ子レベルで異なる引用符区切り文字を使用できますので、正確な引用符付けという処理がかなり簡単になりました。

- `CASE val WHEN compval1 THEN ...`における`val`の評価を1回だけにしました(Tom)

  `CASE`が試験済みの式を複数回評価しないようになりました。 式が複雑な場合や揮発性がある場合に利点があります。

- 集約問い合わせの目的リストを計算する前の`HAVING`検査(Tom)

  `SELECT SUM(win)/SUM(lose) ... GROUP BY ... HAVING SUM(lose) > 0`などの場合における不適切な失敗を改修しました。 これは正常動作すべきでしたが、これまではゼロ割で失敗することがありました。

- `max_expr_depth`パラメータを、スタックサイズをキロバイトで指定した`max_stack_depth`パラメータで置き換えました(Tom)

  再帰的な関数の暴走によるクラッシュに対する防弾処理として提供される機能です。 式の入れ子の深さを単位にするのではなく、直接実行スタックのサイズを単位にするようになりました。

- 任意の行式の許可(Tom)

  このリリースでは、SQL式が任意の複合型、つまり行値を持つことができます。 これにより、関数がより簡単に行を引数として取ることも行値を返すことができます。

- 行内の演算子や副問い合わせの比較として`LIKE`/`ILIKE`が使用できます(Fabien Coelho)

- 識別子やキーワード内の基本ASCII文字についてロケール固有の大文字小文字の変換を行わない(Tom)

  `I`と`i`を含む単語が誤動作する"トルコ語問題"を解消します。 7ビットASCIIセット以外の文字の組み合わせは依然ロケールを無視します。

- 構文エラー報告の改良(Fabien, Tom)

  構文エラーの報告が以前より使いやすくなりました。

- 実行した文に対応する完全なタグを返すよう`EXECUTE`を変更(Kris Jurka)

  これまでのリリースでは、全ての`EXECUTE`呼び出しは`EXECUTE`タグを返していました。 このリリースでは、実行されたコマンドを反映したタグを返します。

- ルールの展開において`NATURAL CROSS JOIN`の発行を行わない(Tom)

  こうした句は論理的な意味がありません。 しかし、ルールでコンパイラがこの構文を生成することがありました。

### E.1.4.4. オブジェクト操作における変更

- キャスト、変換、言語、演算子クラス、ラージオブジェクトに対する`COMMENT ON`の追加(Christopher)

- デフォルトで`OID`付きのテーブルを作成するかどうかを制御する`default_with_oids`サーバ設定パラメータの新規追加(Neil)

  これにより管理者は`CREATE TABLE`をデフォルトで`OID`列を持つテーブルを作成するか持たないテーブルを作成するかを制御することができます。 (現在の出荷時でデフォルトでは、`default_with_oids`は`TRUE`ですが、将来のリリースではデフォルトで`FALSE`となります。)

- `CREATE TABLE AS` に`WITH` / `WITHOUT OIDS`句を追加(Neil)

- `ALTER TABLE DROP COLUMN`で`OID`列を削除することが可能(`ALTER TABLE SET WITHOUT OIDS`もまだ動作します) (Tom)

- テーブル列として複合型が可能(Tom)

- SQL仕様通りの、`ALTER ... ADD COLUMN`でのデフォルトと`NOT NULL`制約が可能(Rod)

  NULLではなく指定されたデフォルト値を初期値として列を生成する`ADD COLUMN`が可能になりました。

- 列の型を変更する`ALTER COLUMN TYPE`が可能(Rod)

  列を削除し、再度追加することなく、列のデータ型が変更できるようになりました。

- 複数の`ALTER`操作を単一の`ALTER TABLE`コマンドにまとめることが可能(Rod)

  これは特に、テーブルの書き換えを行う`ALTER`コマンド(`ALTER COLUMN TYPE`とデフォルト付きの`ADD COLUMN`があります)で便利です。 `ALTER`コマンドをまとめることにより、必要なテーブルの書き換えは1回だけになります。

- `SERIAL`列を追加する`ALTER TABLE`が可能(Tom)

  これは、新規列にデフォルトを付与する新機能の結果によるものです。

- 集約、変換、データベース、関数、演算子、演算子クラス、スキーマ、型、テーブル空間の所有者の変更が可能(Christopher, Euler Taveira de Oliveira)

  これまでは、直接システムテーブルを変更する必要がありました。

- 一時オブジェクトの作成を`SECURITY DEFINER`関数に制限することを許可(Sean Chittenden)

- `ALTER TABLE ... SET WITHOUT CLUSTER`を追加 (Christopher)

  これまでのリリースでは、システムテーブルを変更する他、自動クラスタ指定を削除する方法がありませんでした。

- スキーマ内での一意性を保証するために制約/インデックス/`SERIAL`名が番号付きの`table_column_type`になりました(Tom)

  SQL仕様では、こうした名前はスキーマ内で一意であるべきと規定してます。

- `SERIAL`列のシーケンス名を返す`pg_get_serial_sequence()`の追加(Christopher)

  これにより自動スクリプトが確実に`SERIAL`シーケンス名を見つけることができます。

- プライマリ/外部キーのデータ型の不一致が高価な検索になる時の警告

- テーブル空間間でインデックスを移動することができる新しい`ALTER INDEX`コマンドの追加(Gavin)

- `ALTER TABLE OWNER`により依存するシーケンスの所有者も変更するようにした(Alvaro)

### E.1.4.5. ユーティリティコマンドにおける変更

- `CREATE SCHEMA`によりトリガ、インデックス、シーケンスの作成が可能(Neil)

- `CREATE RULE`に`ALSO`キーワードを追加(Fabien Coelho)

  `ALSO`がルール生成に追加できるようになりました。 これは`INSTEAD`ルールと反対です。

- `LOCK`に`NOWAIT`オプションを追加(Tatsuo)

  `LOCK`が、要求したロックを待機する必要がある場合に失敗することができるようになりました。

- `COPY`により、カンマ区切り値(CSV)ファイルの読み書きが可能(Andrew, Bruce)

- `COPY`の区切りとNULL文字列が競合する場合にエラーを生成(Bruce)

- `GRANT`/`REVOKE`の動作をよりSQL仕様に従うように変更

- `CREATE INDEX`と`CHECKPOINT`間のロック競合を防止(Tom)

  7.3と7.4では、長時間実行されるB-treeインデックスの構築により同時実行される`CHECKPOINT`の完了がブロックされることがありました。 これにより、WALログの再利用を行うことができないためWALが膨れ上がることがありました。

- データベース全体の`ANALYZE`はテーブルを跨ってロックを保持しない(Tom)

  これは、テーブルの排他ロックを必要とする他のバックエンドがデッドロックする可能性を低減します。 この変更をうまく使用するために、データベース全体に対する`ANALYZE`をトランザクションブロック(`BEGIN`ブロック)内で実行しないでください これは各テーブルに対してコミットされ新しいトランザクションが生成できなければなりません。

- `REINDEX`はインデックスの親テーブルの排他的ロックを全く取得しません。

  インデックス自体はまだ排他的にロックされます。 しかし構築中のインデックスを使用していない場合はテーブルの読み込みを続行することができます。

- ユーザ名を変更したときにMD5ユーザパスワードを消去(Bruce)

  PostgreSQLは、MD5を使用してパスワードを暗号化する時にユーザ名をソルトとして使用します。 ユーザ名が変更された場合、そのソルトは保存されたMD5パスワードと一致しませんので、過去のパスワードを使用することができなくなります。 このリリースでは、注意が表示され、パスワードが削除されます。 その後、そのユーザでパスワード認証を行う場合には、新しいパスワードを割り当てなければなりません。

- Windows用の新しいpg_ctl `kill` オプション(Andrew)

  Windowsはバックエンドにシグナルを送信するための`kill`コマンドがありません。 そこでpg_ctlにこの機能が追加されました。

- 情報スキーマの改良

- GUIツールで初期パスワードを設定できるようにinitdbに`--pwfile`オプションを追加(Magnus)

- initdbにおけるロケール/符号化方式の不一致の検出 (Peter)

- Windowsオペレーティングシステムサービスに登録するための`register`コマンドをpg_ctlに追加(Dave Page)

### E.1.4.6. データ型および関数における変更

- より完全な複合型(行型)のサポート(Tom)

  これまでスカラ型の値のみが動作していた多くの場所で複合型の値が使用できるようになりました。

- 非長方配列値をエラーとして拒絶(Joe)

  これまでは`array_in`は何もメッセージを出さずにおかしな結果を構築しました。

- 整数算術計算におけるオーバーフローの検出(Tom)

- 単一バイトの`"char"`データ型に関する算術演算子の削除

  これまでは、パーサは、`null * null`など"unable to select an operator"エラーとなることがより適切である多くの場合で、こうした演算子を選択していました。 実際に`"char"`列に対する算術演算を行いたいのであれば、明示的に整数型にキャストしてください。

- 配列への入力における構文検査をできるだけ厳密化(Joe)

  これまでおかしな場所に許され、おかしな結果を生成したごみが`ERROR`になるようになりました。 例えば、右閉じ括弧の後の空白以外の文字。

- 空文字列配列要素値は何も記述しないのではなく`""`と記述しなければならない(Joe)

  これまでは、どちらの方法でも空文字列要素値を記述できましたが、引用符付きの文字列のみが有効になりました。 何も指定しないところは、おそらく将来のリリースではNULL要素値とみなされる予定です。

- 配列要素の終わりの空白を無視(Joe)

  これまでは要素値と区切り文字もしくは右括弧の間で、前方の空白は無視され、後方の空白は意味がありました。 現在は、後方の空白も無視されます。

- 下限が1でない場合、明示的な配列境界付きで配列値を発行 (Joe)

- 日付文字列として`YYYY-monthname-DD`を受け付ける(Tom)

- `netmask`と`hostmask`関数が最大のマスク長を返す(Tom)

- 階乗関数が`numeric`を返すように変更(Gavin)

  `numeric`を返すことにより、階乗関数はより広範な入力値で動作するようになりました。

- `to_char`/`to_date()`による日付変換の改良(Kurt Roeckx, Fabien Coelho)

- `CHAR(n)`において`length()`が最後の空白を考慮しないようにした (Gavin)

  この変更は整合性を高めるために行われました。 `CHAR(n)`データにおける最後に続く空白は重要な意味を持ちません。 ですので、これらを`length()`で数えるべきではありません。

- `OID`/`float4`/`float8`データ型に空文字列を渡した場合の警告(Neil)

  8.1ではエラーになる予定です。

- `int2`/`int4`/`int8`/`float4`/`float8`入力関数で値の前後の空白文字を許可(Neil)

- `float4`, `float8`におけるIEEE `Infinity`と`NaN`のサポートの改良(Neil)

  IEEE準拠の浮動小数点演算をサポートする全てのプラットフォームで動作するようになりました。

- `date_trunc()`に `week`オプションの追加(Robert Creager)

- `1 BC`に対する`to_char`の修正(以前は`1 AD`を返しました)(Bruce)

- BC日付用の`date_part(year)`を修正(以前は正しい年から1引いた値を返していました)(Bruce)

- `date_part()`が適切な千年紀と世紀を返すように修正(Fabien Coelho)

  これまでのバージョンでは、世紀と千年紀は、標準的な計算方法と比べて、間違った値を返し、また、間違った年から数えていました。

- 標準に従うように、`ceil()`の別名`ceiling()`、`pow()`の別名`power()`を追加(Neil)

- 特定のエラー条件でSQL:2003で指定された正しい`SQLSTATE`エラーコードを発行するように`ln()`、`log()`、`power()`、`sqrt()`を変更 (Neil)

- SQL:2003の定義通りの`width_bucket()`関数の追加(Neil)

- 数値集合への操作を簡略化する`generate_series()`関数の追加(Joe)

- マルチバイト符号化方式を扱う`upper/lower/initcap()`関数の修正(Tom)

- booleanおよびビット単位の整数に対する`AND`/`OR`集約の追加(Fabien Coelho)

- クライアント、サーバのネットワークアドレスを返すセッション情報関数の追加(Sean Chittenden)

- 閉経路の領域を求める関数の追加(Sean Chittenden)

- 他のバックエンドにキャンセル要求を送信する関数の追加(Magnus)

- `interval`に`datetime`を加算する演算子(Tom)

  順番が反対の`datetime`に`interval`を加算するほうは既にサポートされていましたが、標準SQLでは両方とも必要です。

- 整数から`BIT(N)`へのキャストにて、整数の右側からNビットを選択 (Tom)

  これまでのリリースでは、左から数えてNビットが選択されていましたが、いうまでもありませんが、BITからintへのキャスト時に整合性がないため、役に立つものとは思われません。

- `CIDR`値の非マスクビットは0でなければなりません(Kevin Brintnall)

### E.1.4.7. サーバサイド言語における変更

- `READ COMMITTED`シリアライゼーションモードにて、volatile関数は、その関数の呼び出しに対応するコマンドの始まるまでではなく、その関数内の各行が始まるまでに同時実行トランザクションがコミットした結果を参照するようになりました。

- `STABLE`または`IMMUTABLE`と宣言された関数は常に問い合わせ呼び出し時のスナップショットを使用します。 従って、問い合わせ呼び出し開始後に行われた操作は、それが自身のトランザクション内であろうと他のトランザクション内であろうと、その影響を受けません。 関数は読み取りのみでなければなりません。 つまり、`SELECT`以外のSQLコマンドを使用することはできません。 関数を`VOLATILE`で宣言するのではなく`STABLE`または`IMMUTABLE`で宣言することで、かなりの性能向上があります。

- 非遅延の`AFTER`トリガは、対応するコマンドの完了時ではなく、トリガを発行した問い合わせの完了直後に発行されるようになりました。 関数内にある問い合わせがトリガを発行する時に違いが現れます。 トリガは関数が次の操作に進む前に実行されます。 例えば、関数がテーブルに新規行を挿入する場合、関数の処理が進む前に非遅延の外部キー検査が行われます。

- 名前付きで宣言した関数パラメータの許可(Dennis Bjorklund)

  関数の文書化を改善することができます。 この名前を実際にどう使用できるかは使用する関数言語に依存します。

- PL/pgSQLパラメータ名による関数内での参照を許可(Dennis Bjorklund)

  これは基本的に、名前付きパラメータに対する別名を自動的に作成します。

- PL/pgSQL生成時の最低限の構文検査の実施(Tom)

  これにより、より早く構文エラーを検出することができます。

- PL/pgSQLにおける複合型(行変数とレコード変数)のサポートの強化

  例えば、関数に単一の値として行型の値を渡すことができるようになりました。

- 前もって宣言された変数を参照するPL/pgSQL変数のデフォルト値の許可

- PL/pgSQL FORループの解析の改良(Tom)

  `FOR`変数のデータ型ではなく`".."`の存在によって解析が開始されるようになりました。 これは、正常な関数では違いがありませんが、結果として失敗があった時のエラーメッセージがより判りやすくなります。

- PL/Perlサーバサイド言語の大規模な改良(Command Prompt, Andrew Dunstan)

- PL/Tclにおいて、SPIコマンドが副トランザクション内で実行されるようになりました。 エラーが発生した場合、副トランザクションは消え、通常のTclエラーと同様にエラーが報告されます。 このエラーは`catch`で捕捉可能です。 これまでは、こうしたエラーを捕捉できませんでした。

- PL/pgSQLで`ELSEIF`を受け付けるようになりました。(Neil)

  これまではPL/pgSQLでは`ELSIF`しか解釈できませんでした。 しかし、多くのユーザはこの`ELSEIF`キーワードという綴りに慣れています。

### E.1.4.8. psqlにおける変更

- データベースオブジェクトに関するpsqlの情報表示の改良(Christopher)

- psqlの`\du`と`\dg`におけるグループメンバシップの表示を許可(Markus Bertheau)

- psqlの`\dn`による一時スキーマを表示を防止(Bruce)

- psqlのファイル名の扱いにてチルダユーザ展開を許可(Zach Irmen)

- readline経由、配色を含む、psqlの装飾付きプロンプトの表示を許可 (Reece Hart, Chet Ramey)

- psqlの`\copy`を`COPY`コマンドの構文に完全に一致するように変更(Tom)

- 構文エラーの場所を表示(Fabien Coelho, Tom)

- psqlの`\d`表示に`CLUSTER`情報を追加 (Bruce)

- psqlの`\copy stdin/stdout`をコマンドの入出力を使用するように変更(Bruce)

- psqlの`stdin`/`stdout`から読み取る`pstdin`/`pstdout`を追加(Mark Feit)

- グローバルなpsql設定ファイル`psqlrc.sample`の追加 (Bruce)

  これにより、全体的なpsql起動コマンドを格納できる中核的なファイルを持つことができます。

- テーブルが`OID`列を持つ場合のpsql `\d+`に指示子を持たせる(Neil)

- Windowsでは、Control-Zがend-of-fileと取られないようにpsql内でバイナリモードを使用する

- `\dn+`でスキーマの権限と説明を表示させる(Dennis Bjorklund)

- タブ補間サポートの改良(Stefan Kaltenbrunn, Greg Sabino Mullane)

- 論理値を大文字でも小文字でも設定可能にした(Michael Paesold)

### E.1.4.9. pg_dumpにおける変更

- pg_dumpの信頼性を向上させるために依存性情報を使用(Tom)

  これにより、関連するオブジェクトが稀に間違った順序でダンプされるという長い間存在した問題が解決したはずです。

- 可能な限りアルファベット順でpg_dumpにオブジェクトの出力を行う(Tom)

  これによりダンプファイル間の変更を簡単に区別できるようになるはずです。

- pg_restoreにおけるいくつかのSQLエラーを無視(Fabien Coelho)

  これにより、pg_restoreの動作は、pg_dumpの出力スクリプトをpsqlに渡した時の動作と同様になりました。 ほとんどの場合、エラーを無視して先に進めることは使いやすくなるでしょう。 また、エラー時に終了する旧来の動作を指定するためにpg_restoreにオプションが追加されました。

- pg_restore `-l`で、含有するオブジェクトのスキーマ名を表示

- pg_dumpのテキスト出力にbegin/end印を追加(Bruce)

- pg_dump/pg_dumpallの冗長モードで開始時刻、終了時刻を追加(Bruce)

- pg_dumpallでpg_dumpのほとんどのオプションを許可(Christopher)

- pg_dumpはデフォルトで`SET SESSION AUTHORIZATION`ではなく`ALTER OWNER`を使用する(Christopher)

### E.1.4.10. libpqにおける変更

- libpqの`SIGPIPE`例外処理をスレッドセーフに変更(Bruce)

- 表示用の文字長を返す`PQmbdsplen()`の追加(Tatsuo)

- SSLとKerberos接続をロックするスレッドを追加(Manfred Spraul)

- `PQoidValue()`、`PQcmdTuples()`、および`PQoidStatus()`が`EXECUTE`コマンドで動作可能(Neil)

- サーバのバージョン番号により簡単なアクセスを提供する`PQserverVersion()`の追加

- パラメータのデータ型を指定する必要がない文の準備をサポートする`PQprepare/PQsendPrepared()`の追加(Abhijit Menon-Sen)

- `SET DESCRIPTOR`など、多くのECPGの改良(Michael)

### E.1.4.11. ソースコードにおける変更

- データベースサーバがWindows上でネイティブに動作可能(Claudio, Magnus, Andrew)

- WindowsをサポートするためにシェルスクリプトコマンドをC言語版に変換(Andrew)

- 拡張メークファイル基盤の作成(Fabien Coelho, Peter)

  元のソースツリーの外部で拡張を構築する作業を簡単にします。

- 再割当て可能なインストレーションのサポート(Bruce)

  再設定や再構築を行わずにインストレーションのツリーを別の場所に移動できるように、インストールされるファイルのディレクトリパス(`/share`ディレクトリなど)が実行ファイルの実際のパスから相対的に計算されるようになりました。

- 文書のインストール先を指定するための`--with-docdir`の使用。`--infodir`も可能(Peter)

- 文書のインストールを防止する`--without-docdir`の追加(Peter)

- DocBook V4.2 SGMLへの更新 (Peter)

- 新しい`PostgreSQL` CVSタグ(Marc)

  PostgreSQLのCVSレポジトリの独自のコピーを管理する組織でより簡単に行うことができるようにするために変更されました。 マスタリポジトリのファイルバージョンスタンプが、コピーされたレポジトリへのチェックイン、チェックアウトによって破壊されないようになります。

- ロック処理の明確化(Manfred Koizar)

- バッファ管理の整理(Neil)

- プラットフォーム試験からCPUスピンロックコードを分離(Bruce, Tom)

- PA-RISCのgcc用のインラインのtest-and-setコードを追加(ViSolve, Tom)

- i386スピンロックコードの改良(Manfred Spraul)

- 最近のgccリリースでの警告を防ぐためのスピンロックアセンブルコードの整理(Tom)

- ソースツリーからJDBCを削除。別のプロジェクトになりました。

- ソースツリーからlibpgtclを削除。別のプロジェクトになりました。

- メモリとファイル記述子の使用状況の推定を高精度化(Tom)

- Mac OS X用の起動スクリプトの改良(Ray A.)

- 新しい`fsync()`試験プログラム(Bruce)

- 文書の大規模な改良(Neil, Peter)

- pg_encodingの削除。もはや不要

- pg_idの削除。もはや不要

- initlocationの削除。もはや不要

- スレッドフラグの自動検出(手作業での試験は不要) (Bruce)

- Olsonのパブリックドメインのtimezoneライブラリの使用(Magnus)

- スレッド処理が有効であれば、Unixwareではバックエンド実行形式同様にスレッドフラグを使用(Bruce)

  Unixwareでは、スレッド化されたオブジェクトとスレッド化されないオブジェクトを混在させることができません。 そのため全てスレッド化されるものとしてコンパイルされなければなりません。

- コマンド文字列の解析にpsqlはflexが生成する字句解析を使用

- バックエンド全体で使用されるリンクリストデータ構造を再実装(Neil)

  リストへの追加ができることにより性能が向上します。また、length操作がより効率的になります。

- 動的にロードされるモジュールが独自のサーバ設定パラメータを生成可能(Thomas Hallgren)

- ブラジル語によるFAQの追加(Euler Taveira de Oliveira)

- フランス語によるFAQの追加(Guillaume Lelarge)

- Windowsのログ処理用のpgeventを追加

- OS Xにおいて、libpqとECPGが適切な共有ライブラリとして構築可能(Tom)

### E.1.4.12. Contribにおける変更

- `contrib/dblink`の修正(Joe)

- `contrib/dbmirror`の改良(Steven Singer)

- `contrib/xml2`の追加(John Gray, Torchbox)

- `contrib/mysql`の更新

- 新バージョンの`contrib/btree_gist` (Teodor)

- PostgreSQL用trigramマッチング、`contrib/trgm`の追加。(Teodor)

- `contrib/tsearch2`の多くの改良(Teodor)

- `contrib/fuzzystrmatch`に二重metaphoneを追加(Andrew)

- `contrib/pg_autovacuum`がWindowsサービスとして動作可能(Dave Page)

- `contrib/dbsize`に機能追加(Andreas Pflug)

- `contrib/pg_logger`の削除 ログ取得副プロセスへの統合によって廃止されました。

- `contrib/rserv`の削除。各種の別プロジェクトにより廃棄されました。

前のページ | ホーム | 次のページ
サポートされていない機能 | 上に戻る | リリース7.4.6