リリース8.1

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

# E.58. リリース8.1

> リリース日: 2005-11-08

## E.58.1. 概要

このリリースの主な変更点を以下に示します。

共有バッファキャッシュへの同時アクセスの改良(Tom)

  共有バッファキャッシュへのアクセスが、特に、マルチCPUシステムにおいて深刻なスケーラビリティ問題であることは分かっていました。 本リリースでは、バッファマネージャ内で行われていたロックの方法を見直し、ロックの競合を軽減し、スケーラビリティを向上しました。 また、バッファマネージャは"clock sweep"置換ポリシーを使用するように変更されました。

インデックススキャンが中間でメモリ内ビットマップを使用することができるようになりました。

  過去のリリースでは、テーブル検索の実行において単一インデックスのみを使用することができました。 この機能により、`WHERE tab.col1 = 4 and tab.col2 = 9`を持つ問い合わせで、`col1`と`col2`に対する複数列インデックスが存在しない場合、`col1`に対するインデックスと`col2`に対するインデックスがあれば、両方のインデックスを検索し、結果をメモリ内で組み合わせ、`col1`と`col2`に関する両方の制約に一致する行のみをヒープから取り出すことができるようになります。 これは、問い合わせが構造化されておらず、すべての起こり得るアクセス条件に一致するインデックスを前もって作成できないような状況では、非常に有用です。 必要なランダムアクセスの総数を減少させるため、ビットマップスキャンは単一のインデックスの場合でも有用です。 ビットマップインデックススキャンはテーブル全体で多くの割合を占める部分を取り出す際に効率的です。 この場合、通常のインデックススキャンでは非効率的です。

二相コミットの追加(Heikki Linnakangas, Alvaro, Tom)

  二相コミットを使用して、トランザクションを複数のコンピュータで"準備"することができます。 すべてのコンピュータでトランザクションの準備を（失敗することなく）行った後、すべてのトランザクションをコミットすることができます。 準備した後でマシンがクラッシュしたとしても、マシンの再起動後に準備したトランザクションをコミットすることができます。 `PREPARE TRANSACTION`および`COMMIT/ROLLBACK PREPARED`という新しい構文があります。 また、新しい`pg_prepared_xacts`システムビューも追加されました。

ユーザとグループを置き換える、新しいロールシステムの作成(Stephen Frost)

  ロールとは、ユーザとグループを組み合わせたものです。 ユーザのようにロールはログイン機能を持つことができますし、グループのようにロールは他のロールをメンバとして持つこともできます。 基本的にロールは、ユーザとグループの区別を取り除きました。 例えば、ロールは以下のことを行うことができます。

  - ログイン機能を有す（省略可能）

  - オブジェクトを所有する

  - データベースオブジェクトに対するアクセス権限を保持する

  - 属している他のロールの権限を継承する

  ユーザがあるロールにログインした後、そのユーザはログインロールの能力の他、継承したロールの能力も持つことになります。 また、`SET ROLE`を使用して、属している他のロールに変わることもできます。 この機能は、標準SQLのロールの概念を汎用化したものです。 またこの変更により、`pg_shadow`と`pg_group`は、新しいロール機能の付いたカタログ`pg_authid`と`pg_auth_members`に置き換わりました。 古いテーブルは、新しいロールテーブルに対する読み取りのみのビューとして再定義されています。

`MIN()` と`MAX()`におけるインデックスの自動使用 (Tom)

  過去のリリースでは、`MIN()`または`MAX()`でインデックスを使用する方法は、問い合わせを`SELECT col FROM tab ORDER BY col LIMIT 1`に書き換える方法しかありませんでした。 インデックスが自動的に使用されるようになりました。

`/contrib/pg_autovacuum`を主サーバに移動しました。(Alvaro)

  autovacuumをサーバに統合することで、データベースサーバと同期して自動的にautovacuumが起動、停止できるようになりました。 また、`postgresql.conf`でautovacuumの設定を行うことができるようになりました。

`SELECT ... FOR SHARE`を使用した共有行レベルロックの追加(Alvaro)

  PostgreSQLのMVCCロックにより`SELECT`は書き込みによってブロックされることはありません。 そのため、通常の操作では共有行レベルロックは不要ですが、共有行ロックを必要とするアプリケーションでは共有ロックは有用です。 特に、これにより参照性合成検査で発生するロック要求が減少します。

共有オブジェクト、特にロールへの依存性を追加(Alvaro)

  依存性機構の拡張により、データベースオブジェクトを所有するロールが削除されることを防ぎます。 これまでは、所有者の削除により"親のいない"オブジェクトができてしまう可能性がありました。 これは復旧させることができましたが、厄介で好まれないものでした。

テーブルパーティションによる性能向上(Simon)

  新しい`constraint_exclusion`設定パラメータは、子テーブルに一致する行が存在しないことを制約が示している場合、子テーブルの検索を防ぎます。

  これにより、テーブルパーティションの基本的な種類を実現できます。 子テーブルが別々のキー範囲を格納し、これを適切な`CHECK`制約で強制している場合、オブティマイザは、この制約により子テーブル内に一致することがないことが保証されている時にその子テーブルへのアクセスを飛ばします。

## E.58.2. バージョン8.1への移行

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

8.0リリースでは、8.1でintervalに対する`to_char()`を削除するとアナウンスしましたが、より優れたAPIの提案がありませんでしたので、`to_char(interval)`は強化され、サーバに残りました。

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

- `add_missing_from`のデフォルトがfalseになりました(Neil)

  `FROM`参照を持たない問い合わせでテーブルが使用された場合、デフォルトでエラーとなるようになりました。 まだ過去の動作を使用することができますが、そのためにはこのパラメータを'true'にしなければなりません。

  ダンプに暗黙的な`FROM`構文を使用して作成したビューやルールがある場合、既存のダンプファイルをロードするために、`add_missing_from`を真に設定しなければならないかもしれません。 これに悩まされるのは一回だけのはずです。 PostgreSQL 8.1は、こうしたビューやルールを標準の明示的な`FROM`構文に変換するためです。 したがって、今後のダンプではこの問題は起こりません。

- `float4`/`float8`/`oid`に長さが0の文字列(`''`)が入力された場合、ゼロとして扱わずエラーとなるようになりました(Neil)

  この変更により、現行の整数に対する長さが0の文字列の扱いと矛盾がなくなりました。 この変更の時期については8.0でアナウンスしていました。

- `default_with_oids`のデフォルトがfalseになりました(Neil)

  このオプションをfalseに設定した場合、`CREATE TABLE`で`WITH OIDS`を指定しない限り、ユーザが作成したテーブルはOID列を持たなくなります。 すべてのPostgreSQLリリースでOIDは存在していましたが、4バイト長しかなく、インストールされたデータベース全体で共有アクセスされていることから、OIDの利用は制限されてきました。 一意に行を識別するには、シーケンスまたは`SERIAL`型を使用することを勧めます。 これはPostgreSQL 6.4からサポートされています。

- `E''`構文が追加されました。 そのため、普通の文字列でバックスラッシュ文字を扱うことができます。(Bruce)

  現在のPostgreSQLは文字列リテラル内のバックスラッシュを、特別なエスケープシーケンスの始まりとして扱います。 例えば、`\n`や`\010`です。 これで簡単に特別な値を埋め込むことができますが、非標準であり、他のデータベースからのアプリケーションの移植を困難にしています。 このため、PostgreSQLプロジェクトでは、文字列内のバックスラッシュが特別な意味を持たないようにすることを計画しています。 後方互換性と、特別なバックスラッシュ処理を使用したいユーザのために、新しい文字列構文を作成しました。 この新しい文字列構文は、例えば`E'hi\n'`のように、`E`、直後に単一引用符、そして文字列を始めるという形です。 このリリースでは文字列内のバックスラッシュの扱いに変更はありませんが、今後のリリースに向けたアプリケーションの移行を補助するために、以下の設定パラメータが追加されました。

  - `standard_conforming_strings`。 このリリースで普通の文字列内のバックスラッシュをそのまま扱うかどうかを指定します。

  - `escape_string_warning`。 普通の文字列（非E）内でバックスラッシュが存在した場合に警告する。

  `standard_conforming_strings`の値は読み取りのみです。 アプリケーションでは、この値を読み取ることで、どのようにバックスラッシュが解釈されるかが分かります。 （また、このパラメータが存在するかどうかで、`E''`文字列構文がサポートされているかどうかが分かります。） 今後のリリースでは、`standard_conforming_strings`は真になる予定です。 つまり、非E文字列でのバックスラッシュは文字そのものとして扱われます。 この変更に備えて、バックスラッシュの特別処理が必要な場所に`E''`を使用し、かつ、`E''`を使用するように返還しなければならない文字列を更に検出するために`escape_string_warning`を有効にしてください。 また、文字列内に単一引用符そのものを埋め込む場合には、PostgreSQLがサポートするバックスラッシュ+単一引用符（`\'`）という構文ではなく、2つの単一引用符（`''`）を使用してください。 後者は標準に準拠しており、また、`E''`文字列構文を使用する必要がありません。 また、バックスラッシュを特別に扱わない、`$$`文字列構文も使用することができます。

- `REINDEX DATABASE`がデータベース内のすべてのインデックスの再作成を行うようになりました。(Tom)

  これまでは、`REINDEX DATABASE`はシステムテーブルのみのインデックスを再作成しました。 この新しい動作の方がより直感的です。 新しい`REINDEX SYSTEM`コマンドが、システムテーブルのみのインデックス再作成という以前の機能を提供します。

- 読みとりのみのラージオブジェクト記述子がMVCCスナップショットセマンティックスに従うようになりました。

  ラージオブジェクトが`INV_READ` (かつ`INV_WRITE`なし)で開かれた場合、 その記述子から読みとられるデータが、`lo_open()`を呼び出した問い合わせで使用するトランザクションスナップショットの時点のラージオブジェクトの状態"スナップショット"を反映するようになりました。 常に最新のコミットされたデータを返すという以前の動作に戻すには、`lo_open()`のモードフラグに`INV_WRITE`を付与して下さい。

- シーケンス関数の引数に対して、適切な依存性を追加しました。(Tom)

  以前のリリースでは、`nextval()`、`currval()`、`setval()`に渡されるシーケンス名は、単なるテキスト文字列として保持されていました。 つまり、`DEFAULT`句で使用中のシーケンスの名称変更や削除により、`DEFAULT`句が無効となりました。 このリリースでは、すべて新しく作成した、内部用OIDを引数として持つシーケンス関数を保持します。 これにより、シーケンス名の変更を追跡できるようになり、また、不適切なシーケンスの削除を防ぐために依存情報も追加されました。 また、これにより、スキーマ名称の変更や検索パスの変更から、こうした`DEFAULT`句を保護できるようになりました。

  アプリケーションの中には、以前の実行時にシーケンス名を検索する動作に依存しているものがあるかもしれません。 これは、`nextval('myseq'::text)`のように、明示的に引数を`text`にキャストすることで実現することができます。

  8.1より前のデータベースダンプを8.1にロードした場合、古いテキストを基とした表現が使用されますので、OIDを引数として保持させる機能は持てません。 しかし、テキスト版の`DEFAULT`句を持つデータベースを更新することができます。 まず、以下の問い合わせを`fixseq.sql`などという名前のファイルに保存してください。

      SELECT  'ALTER TABLE ' ||
          pg_catalog.quote_ident(n.nspname) || '.' ||
          pg_catalog.quote_ident(c.relname) ||
          ' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) ||
          ' SET DEFAULT ' ||
          regexp_replace(d.adsrc,
                         $$val\(\(('[^']*')::text\)::regclass$$,
                         $$val(\1$$,
                         'g') ||
          ';'
      FROM    pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d
      WHERE   n.oid = c.relnamespace AND
          c.oid = a.attrelid AND
          a.attrelid = d.adrelid AND
          a.attnum = d.adnum AND
          d.adsrc ~ $$val\(\('[^']*'::text\)::regclass$$;

  次に、調整が必要であることが分かったデータベースに対してこの問い合わせを実行してください。 以下では`db1`というデータベースに対して実行しています。

      psql -t -f fixseq.sql db1

  これにより、データベースを新しいOID版の表現に変換するための`ALTER TABLE`コマンドが表示されます。 このコマンドが問題ないことを確認した後に、以下を実行してデータベースを更新してください。

      psql -t -f fixseq.sql db1 | psql -e db1

  この手続きを更新すべきデータベースそれぞれに対して繰り返し実行しなければなりません。

- psqlにおいて、引用符で括られていない`\{digit}+`という並びを8進数として扱うようになりました。(Bruce)

  以前のリリースでは、`\{digit}+`という並びは10進数として扱われ、`\0{digit}+`のみが8進数として扱われました。 この変更は一貫性のために行われました。

- `%`および`^`演算子の接頭辞と接尾辞の文法積を削除しました。

  これは文書化されておらず、また、負値の剰余演算子 (`%`)の使用を複雑にしていました。

- 多角形用の`&<`と`&>`をボックス型の"over"演算子と矛盾がないようにしました。(Tom)

- `CREATE LANGUAGE`は、`pg_pltemplate`の情報によって指定された引数を無視することができます。(Tom)

  新しい`pg_pltemplate`システムカタログが、手続き言語の好みの定義（検証関数をもつかどうかなど）についての情報を保持するために定義されました。 作成しようとする言語に関する項目がこのカタログに存在する場合、`CREATE LANGUAGE`は言語名以外のパラメータをすべて無視し、カタログの情報を使用します。 古いダンプファイルからロードされる古い言語定義に伴う問題が増大したため、この方式が取られました。 8.1では、ロード時にテンプレート項目が存在することに依存し、pg_dumpは手続き言語定義を単なる `CREATE LANGUAGE `name``としてダンプします。 これがより将来を見込んだ表現になることを期待しています。

- `pg_cancel_backend(int)`が`integer`ではなく`boolean`を返すようになりました。(Neil)

- UTF-8のデータを8.1.Xにロードする場合に問題が起きる可能性があります。 これは、 以前のバージョンでは無効なUTF-8のバイト列をデータベースに投入することができましたが、今回のリリースでは正しく有効なUTF-8列のみを受付けるようになったことが原因です。 ダンプファイルを修正する方法の1つとして、`iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql`を実行することがあります。 `-c`オプションにより無効な文字列が削除されます。 この2つのファイルの違いを見ることで、無効な列を表示することができます。 `iconv`は入力ファイル全体をメモリに読み込みますので、この処理のためにダンプを複数の小さなファイルに分割する必要があるかもしれません。

## E.58.3. その他の変更点

PostgreSQL8.1と以前のメジャーリリースとの間でなされた、その他の変更点について詳細を以下に示します。

### E.58.3.1. 性能向上

- GiSTとR-treeインデックスの性能を向上しました。(Neil)

- ハッシュ結合の自動サイズ変更を含む、オプティマイザの改良を行いました。 (Tom)

- 様々な所で内部用のAPIを見直しました。

- WALレコードのCRCを64ビットから32ビットに変更しました。(Tom)

  64ビットのCRCを計算するコストが過大で、信頼性に関する長所は無視できるものであると考えました。

- WALページに巨大な空のギャップを書き出さないように変更しました。(Tom)

- SMPマシン、特にOpteronマシンにおけるスピンロック動作を改良しました。(Tom)

- 連続していないインデックス列を複数列に対するインデックスで試用できるようにしました。(Tom)

  例えば、これによりa,b,c列に対するインデックスを`WHERE a = 4 and c = 10`といった問い合わせで使用することができます。

- `CREATE TABLE AS`/`SELECT INTO`に対するWALロギングを飛ばします。(Simon)

  `CREATE TABLE AS`実行中のクラッシュにより復旧中にテーブルが削除されてしまいますので、そのテーブルをロードするためにWALに記録する意味がありません。 （しかし、WALアーカイブが有効な場合はロギングを行います。）

- GiSTインデックスへの同時アクセスを可能にしました。(Teodor, Oleg)

- `full_page_writes`設定パラメータを追加し、WALへページ全体を書き出すかどうか制御できるようになりました。(Bruce)

  破損したデータベースから部分的なディスク書き出しを防ぐために、チェックポイントの後に変更されたディスクページを最初に書き出す時に、PostgreSQLは各データベースディスクページ全体のコピーをWALに書き出します。 このオプションにより、この機能を無効にすることができ、より高速になります。 部分的なページ書き出しが起こることがない、バッテリでバックアップされたディスクキャッシュを持つ場合、これは安全です。

- `wal_sync_method`で`O_SYNC`を使用している場合、利用できるのであれば`O_DIRECT`を使用します。 (Itagaki Takahiro)

  `O_DIRECT`によりディスクへの書き出しがカーネルキャッシュを介さずに行われます。 そのため、WALへの書き出しが高速になり、性能が向上します。

- `COPY FROM`の性能を向上しました。(Alon Goldshuv)

  `COPY`入力を一文字ずつではなくより巨大なまとまり内に読み込むことで実現しました。

- `COUNT()`、`SUM`、`AVG()`、`STDDEV()`、`VARIANCE()`を改良しました。(Neil, Tom)

### E.58.3.2. サーバの変更

- トランザクションID(XID)周回問題を防止しました。(Tom)

  トランザクションカウンタが周回点に近づいた時にサーバは警告を発します。 カウンタが周回点に近づき過ぎている場合、サーバは問い合わせの受付を停止します。 これにより、必要なバキューム処理の実行を行う前にデータが損失されることは確実になくなります。

- OIDカウンタが周回した後に生じる、既存のシステムオブジェクトとオブジェクトID（OID）が競合する問題を修正しました。

- `VACUUM`時に`max_fsm_relations`と`max_fsm_pages`を増大させる必要がある場合の警告を追加しました。

- `temp_buffers`設定パラメータを追加し、一時テーブルアクセス用のローカルバッファのサイズをユーザが決定できるようになりました。

- `pg_stat_activity`にセッションの開始時刻とクライアントIPアドレスを追加しました。(Magnus)

- ビットマップスキャンのために`pg_stat`ビューを調整しました。(Tom)

  一部のフィールドの意味が少し変わりました。

- `pg_locks`ビューを改良しました。(Tom)

- クライアント側における`PREPARE`および`EXECUTE`のログを記録するようにしました。(Simon)

- Kerberos名とユーザ名に関する大文字小文字の区別を`postgresql.conf`で指定できるようにしました。(Magnus)

- `krb_server_hostname`設定パラメータを追加し、サーバプリンシパルの一部としてサーバのホスト名を指定できるようになりました。(Todd Kover)

  設定されていない場合、keytab内の一致するサービスプリンシパルが使用されます。 これは本リリースにおける新しいKerberosの検索動作です。

- `log_line_prefix`オプションにミリ秒(`%m`)とリモートホスト(`%h`)を追加しました。(Ed L.)

- GiSTインデックスに対するWALロギングを追加しました。(Teodor, Oleg)

  GiSTインデックスはクラッシュに対してもポイントインタイムリカバリに対しても安全になりました。

- `pg_stop_backup()`を実行した時に古い`*.backup`ファイルを削除するようにしました。(Bruce)

  これにより、多くの`*.backup`ファイルが`pg_xlog`に残らないようになります。

- TCP/IPキープアライブ時間について待機、間隔、個数を制御する設定パラメータを追加しました。(Oliver Jowett)

  これらの値を変更することで、クライアント接続の喪失を素早く検知できるようになります。

- ユーザ毎およびデータベース毎の接続上限を追加しました。(Petr Jelinek)

  `ALTER USER`および`ALTER DATABASE`を使用して、特定ユーザが同時に接続できる、もしくは特定のデータベースへ同時に接続できる、最大セッション数に制限をかけることができるようになりました。 この制限をゼロにすると、ユーザからの接続またはデータベースへの接続が無効になります。

- 64ビットマシンにおいて、2ギガバイト以上の共有メモリとバックエンド単位の作業メモリを使用できるようになりました。(Koichi Suzuki)

- 新しい`pg_pltemplate`によりダンプファイル内の廃止された手続き言語定義を上書きできるようになりました。(Tom)

### E.58.3.3. 問い合わせの変更

- 一時ビューを追加しました。(Koju Iijima, Neil)

- 集約関数や`GROUP BY`を持たない`HAVING`を、単一グループを返すように修正しました。(Tom)

  これまでこうした状況では、`HAVING`句を`WHERE`句と同様に扱っていました。 これは仕様に従っていませんでした。

- `DELETE`にテーブルを追加指定できるように`USING`句を追加しました。(Euler Taveira de Oliveira, Neil)

  以前のリリースでは、`DELETE`文内で結合に使用するテーブルを追加指定する明確な方法はありませんでした。 `UPDATE`には、すでにこの目的のための`FROM`があります。

- バックエンドおよびecpg文字列における`\x`16進数エスケープのサポートを追加しました。(Bruce)

  これは、標準Cの`\x`エスケープ構文そのものです。 8進数エスケープはサポート済みです。

- `BETWEEN SYMMETRIC`問い合わせ構文を追加しました。(Pavel Stehule)

  この機能により`BETWEEN`比較で、1番目の値が2番目より小さいことを必要としなくなりました。 例えば、`2 BETWEEN [ASYMMETRIC] 3 AND 1`は偽を返しますが、`2 BETWEEN SYMMETRIC 3 AND 1`は真を返します。 `BETWEEN ASYMMETRIC`はすでにサポート済みです。

- `SELECT ... FOR UPDATE/SHARE`のオプションに`NOWAIT`を追加しました。(Hans-Juergen Schoenig)

  `statement_timeout`設定パラメータにより、一定以上の時間がかかる問い合わせをキャンセルすることができますが、この`NOWAIT`オプションにより、`SELECT ... FOR UPDATE/SHARE`が即座に行ロックを獲得できなかった時、すぐに問い合わせをキャンセルすることができます。

### E.58.3.4. オブジェクト操作の変更

- 共有オブジェクトの依存関係の追跡(Alvaro)

  PostgreSQLでは、グローバルテーブル（ユーザ、データベース、テーブル空間）の情報を複数のデータベースから参照することができます。 今回の変更でグローバルテーブルに関する依存性情報が追加されました。 従って、例えば、ユーザの所有権をデータベースに跨って確認できますので、他のデータベースで何かを所有しているユーザを削除できないようにすることができます。 データベースに局所的なオブジェクトに関する依存関係の追跡はすでに存在します。

- オブジェクト所有者が制限付きの`ALTER OWNER`コマンドを実行できるようになりました。(Stephen Frost)

  以前のリリースでは、スーパーユーザのみがオブジェクトの所有権を変更できました。 今では、コマンドを実行したユーザがオブジェクトを所有し、かつ、新しい所有者として作成できる（つまり、そのユーザが新しい所有者のロールのメンバであり、そのロールが新規にオブジェクトを作成する時に必要なCREATE権限を持つ場合）場合、所有権を移すことができます。

- 一部のオブジェクト型（テーブル、関数、型）に対する`ALTER` object `SET SCHEMA`機能を追加しました。(Bernd Helmle)

  これによりオブジェクトを異なるスキーマに移すことができるようになります。

- トリガを無効にする`ALTER TABLE ENABLE/DISABLE TRIGGER`を追加しました。(Satoshi Nagayasu)

### E.58.3.5. ユーティリティコマンドの変更

- 単一の`TRUNCATE`コマンドで複数のテーブルの消去ができるようになりました。(Alvaro)

  参照整合性検査のため、参照整合性制約の一部となるテーブルを消去することはできません。 この新しい機能を使用することで、参照整合性制約に含まれる両テーブルが単一の`TRUNCATE`コマンドで消去される場合、`TRUNCATE`を使用してこうしたテーブルを消去できるようになりました。

- `COPY CSV`モードにおける復帰コード、改行コードの処理が適切になりました。(Andrew)

  8.0リリースでは、`CSV COPY TO`における復帰コードと改行コードは一貫性のある方法で処理されていませんでした。 （これはTODOリストに記載されていました。）

- `COPY`にて、先頭行にヘッダ行を記載できるように`COPY WITH CSV HEADER`を追加しました。(Andrew)

  これにより、データファイルの先頭行に列名を記載するという一般的な`CSV`の使用方法を扱うことができます。 `COPY TO`では先頭行には列名が記載され、 `COPY FROM`では先頭行は無視されます。

- Windowsにおいて、`EXPLAIN ANALYZE`の表示を秒以下の精度にしました。 (Magnus)

- `EXPLAIN ANALYZE`の表示にトリガ期間を追加しました。 (Tom)

  以前のリリースではトリガの実行時間は総実行時間に含まれていました。 各トリガで費やされる時間がどのくらいかがわかるようになりました。

- `COPY`にて、`\x`16進数エスケープのサポートを追加しました。 (Sergey Ten)

  以前のリリースでは8進数エスケープのみをサポートしていました。

- `SHOW ALL`が変数の説明を含むようにしました。 (Matthias Schmidt)

  `SHOW` varname はまだ変数の値のみを表示し、説明を表示しません。

- initdbが`postgres`という新しい標準データベースを作成するようになりました。 このためユーティリティが標準データベースを検索する時に`template1`ではなく`postgres`を使用するように変更されました。(Dave)

  以前のリリースでは、createuserなどのユーティリティのデフォルト接続用、および、新規データベースのテンプレート用として、`template1`が使用されていました。 テンプレートデータベースにだれかが接続しているために新しいデータベースを作成することができず、`CREATE DATABASE`の失敗の原因となることがありました。 この変更により、デフォルトの接続データベースが`postgres`になりました。 つまり、`CREATE DATABASE`時にだれかが`template1`を使用している可能性がかなり減少しました。

- `/contrib/reindexdb`をサーバへ移動し、新しくreindexdbコマンドラインユーティリティを作成しました。(Euler Taveira de Oliveira)

### E.58.3.6. データ型および関数の変更

- 配列型に対する`MAX()`および`MIN()`集約を追加しました。(Koju Iijima)

- `CC`、`YY`、またはこの両方のフィールドが使用されている場合に合理的な動作を行うように`to_date()`および`to_timestamp()`を修正しました。(Karel Zak)

  `CC` が書式指定にあり、`YYY`以上の長さが年指定にあると、`CC` を無視します。 年指定の長さが`YY`以下の場合、`CC`を直前の世紀であると解釈します。

- `md5(bytea)`を追加しました。 (Abhijit Menon-Sen)

  `md5(text)`はすでに存在していました。

- `power(numeric, numeric)`を基にした`numeric ^ numeric`のサポートを追加しました。

  関数はすでに存在していましたが、対応する演算子がありませんでした。

- 計算処理中に適切に商を除去するように`NUMERIC`の剰余を修正しました。

  以前のリリースでは、巨大な値に対する剰余が商の丸めにより負の値を返すことがありました。

- `lastval()`関数を追加しました。(Dennis Björklund)

  `lastval()`は`currval()`を簡単にしたものです。 これは、現在のセッションで実行されたもっとも最近の`nextval()`または`setval()`に基づいて自動的に適切なシーケンス名を決定します。

- `to_timestamp(DOUBLE PRECISION)`を追加しました。(Michael Glaesemann)

  1970年からのUnix秒を`TIMESTAMP WITH TIMEZONE`に変換します。

- `pg_postmaster_start_time()`関数を追加しました。(Euler Taveira de Oliveira, Matthias Schmidt)

- `AT TIME ZONE`で完全なゾーン名を使用できるようになりました。 以前は省略形のみが使用できました。(Magnus)

  以前は、定義済みのタイムゾーン名の一覧のみが`AT TIME ZONE`でサポートされていました。 現在では、サポート済みのタイムゾーン名すべてを使用することができます。 以下に例を示します。

      SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';

  上の問い合わせでは、タイムゾーンは指定した日付に影響する夏時間規則に従って調整されます。

- `GREATEST()`および`LEAST()`可変長引数関数を追加しました。(Pavel Stehule)

  これらの関数は可変数の引数を取り、引数の中で最大もしくは最小の値を返します。

- `pg_column_size()`を追加しました。 (Mark Kirkwood)

  これは列の格納サイズを返します。圧縮が使用されている場合もあります。

- `regexp_replace()`を追加しました。 (Atsushi Ogawa)

  これによりsedのように正規表現による置換を行うことができます。 省略可能なフラグ引数により、全領域の選択（全置換）や大文字小文字の区別モードを指定することができます。

- intervalの除算、乗算を修正しました。(Bruce)

  以前のバージョンでは、 `'4 months'::interval / 5`が`'1 mon -6 days'`といった不揃いの結果を返すことがありました。

- timestamp、time、interval出力における端数処理を修正しました。(Tom)

  上位部分を増加させずに秒部分が`60`と表示される問題を修正したものです。

- `INTERVAL`に別途日フィールドを追加し、1日という間隔と24時間という間隔を区別できるようになりました。(Michael Glaesemann)

  夏時間による時間調整を含む日にちは24時間ではなく、よく23時間や25時間となります。 この変更により、"何日間"という時間間隔と"何時間"という時間間隔の間に概念的な違いが生じます。 timestampに`1 day`を加えると、その間に夏時間による時間調整があったとしても、同じローカル時間における次の日になるようになりました。 一方で`24 hours`を加えると、時間調整があると異なるローカル時間となります。 US DSTの例を以下に示します。

      '2005-04-03 00:00:00-05' + '1 day' = '2005-04-04 00:00:00-04'
      '2005-04-03 00:00:00-05' + '24 hours' = '2005-04-04 01:00:00-04'

- `justify_days()`および`justify_hours()`を追加しました。 (Michael Glaesemann)

  これらの関数はそれぞれ、日数を適切な月数と日数に、時間数を適切な日数と時間数に調整します。

- `/contrib/dbsize`をバックエンドに移し、一部の関数の名前を変更しました。 (Dave Page, Andreas Pflug)

  - `pg_tablespace_size()`

  - `pg_database_size()`

  - `pg_relation_size()`

  - `pg_total_relation_size()`

  - `pg_size_pretty()`

  `pg_total_relation_size()`にはインデックスとTOASTテーブルが含まれます。

- クラスタディレクトリへの読み取りのみのファイルアクセス用の関数を追加しました。(Dave Page, Andreas Pflug)

  - `pg_stat_file()`

  - `pg_read_file()`

  - `pg_ls_dir()`

- 設定ファイルを強制的に再読み込みする`pg_reload_conf()`を追加しました。(Dave Page, Andreas Pflug)

- サーバログファイルを強制的にローテートする`pg_rotate_logfile()`を追加しました。(Dave Page, Andreas Pflug)

- TOASTテーブルを含めるように`pg_stat_*`ビューを変更しました。(Tom)

### E.58.3.7. 符号化方式およびロケールの変更

- より一貫性を高め、かつ、国際的な標準に従うように一部の符号化方式の名前を変更しました。

  - `UNICODE` は`UTF8`になりました。

  - `ALT`は`WIN866`になりました。

  - `WIN`は`WIN1251`になりました。

  - `TCVN`は`WIN1258`になりました。

  以前の名前もまだ使用できます。

- `WIN1252`符号化方式のサポートを追加しました。(Roland Volkmann)

- 4バイトの`UTF8`文字のサポートを追加しました。(John Hansen)

  これまでは1バイト、2バイトおよび3バイトの`UTF8`文字がサポートされていました。 これは特に一部の中国語文字セットをサポートするために重要です。

- `EUC_JP`、`SJIS`間の直接変換を可能とし、性能を向上しました。(Atsushi Ogawa)

- WindowsにおいてUTF8符号化方式が動作できるようになりました。(Magnus)

  これはUTF8をWindows独自のUTF16実装に対応付けすることでなされました。

### E.58.3.8. サーバサイド言語の一般的な変更

- `ALTER LANGUAGE RENAME`を修正しました。(Sergey Yatskevich)

- 厳密性、揮発性などの関数特性を`ALTER FUNCTION`で変更できるようにしました。(Neil)

- 関数引数の最大数を100まで増加しました。(Tom)

- SQL関数およびPL/PgSQL関数で`OUT`および`INOUT`パラメータを使用できるようにしました。(Tom)

  `OUT`は、関数の戻り値をあらわす別の方法です。 `RETURN`の代わりに使用して、`OUT`または`INOUT`で宣言されたパラメータに割り当てて、値を返します。 これにより、特に複数の値を返さなければならない場合、記述がより簡単になる場合があります。 以前のリリースでも関数から複数の値を返すことは可能でしたが、これによりその手続きが非常に簡単になりました （今後のリリースでこの機能は他のサーバサイド言語にも拡張される予定です）。

- 言語ハンドラ関数を`pg_catalog`スキーマに移動しました。

  これによりpublicスキーマの削除が簡単にできるようになりました。

- `SPI_getnspname()`をSPIに追加しました。(Neil)

### E.58.3.9. PL/PgSQLサーバサイド言語の変更

- PL/PgSQL関数のメモリ管理を全面的に見直しました。(Neil)

  各関数の解析ツリーが異なるメモリコンテキストに保存されるようになりました。 これにより、不要になった時にメモリの回収が簡単にできるようになりました。

- 実行時ではなく、`CREATE FUNCTION`時に関数の構文を検査します。(Neil)

  以前は、構文エラーのほとんどが関数を実行した時にのみ報告されていました。

- `OPEN`により、`EXPLAIN` や`SHOW`などの`SELECT`以外の問い合わせを開くことができるようになりました。(Tom)

- 関数で`RETURN`文を実行する必要がなくなりました。(Tom)

  これは`OUT`および`INOUT`機能の新規追加に伴う副産物です。 関数の戻り値を提供する必要がない場合`RETURN`を省略することができます。

- PL/PgSQLの`EXECUTE`文における省略可能な`INTO`句サポートを追加しました。(Pavel Stehule, Neil)

- `CREATE TABLE AS`が`ROW_COUNT`を設定するようにしました。(Tom)

- 現在の例外に関する`SQLSTATE`とエラーメッセージを返す`SQLSTATE`と`SQLERRM`を定義しました。(Pavel Stehule, Neil)

  これらの変数は、例外ブロック内でのみ定義されます。

- `RAISE`文のパラメータを式とすることが可能になりました。 (Pavel Stehule, Neil)

- ループの`CONTINUE`文を追加しました。(Pavel Stehule, Neil)

- ブロックラベルとループラベルを追加しました。(Pavel Stehule)

### E.58.3.10. PL/Perlサーバサイド言語の変更

- 大規模な結果セットを効率的に返すことが可能になりました。(Abhijit Menon-Sen)

  これにより関数で、結果セット全体をメモリ内に構築することなく`return_next()`が使用できるようになりました。

- 一度に一行という形で、問い合わせ結果の取り出しが可能になりました。(Abhijit Menon-Sen)

  これにより関数で、結果セット全体をメモリ内に保存することなく`spi_query()`と`spi_fetchrow()`が使用できるようになりました。

- サーバの符号化方式が`UTF8`の場合、PL/Perlは文字列を強制的に`UTF8` として扱うようになりました。(David Kamholz)

- PL/Perlで検証関数を追加しました。(Andrew)

  これにより、構文エラーを実行時ではなく定義時に報告できるようになりました。

- 関数が配列型を返す場合にPL/PerlがPerlの配列を返すことができるようになりました。(Andrew)

  これは基本的にはPostgreSQL配列をPerl配列に対応付けします。

- Perlの非致命的警告で`NOTICE`メッセージを生成できるようになりました。(Andrew)

- Perlの`strict`モードを有効にできるようになりました。(Andrew)

### E.58.3.11. psqlの変更

- トランザクション内の文がトランザクションの残りに影響することなくエラーになることができるように、`\set ON_ERROR_ROLLBACK`を追加しました。(Greg Sabino Mullane)

  これは、基本的に、すべての文を副トランザクション内で行うことで実装しています。

- psql変数内で`\x`16進数文字列のサポートを追加しました。(Bruce)

  8進数エスケープはすでにサポートされていました。

- `troff -ms`出力書式のサポートを追加しました。(Roger Leigh)

- 履歴ファイルの格納場所を`HISTFILE`で制御可能にしました。 (Andreas Seltenreich)

  これによりデータベースごとに履歴ファイルの格納設定が可能になります。

- `\x` (拡張モード)が`\d tablename`の結果に影響しないようにしました。(Neil)

- セッションのログを記録するための`-L`オプションをpsqlに追加しました。 (Lorne Sunley)

  オペレーティングシステムの中には簡単にコマンドライン操作をログ記録する機能がないものがありましたので、このオプションが追加されました。

- `\d`がインデックスのテーブル空間を表示できるようにしました。(Qingqing Zhou)

- psqlのヘルプ（`\h`）が適切なヘルプ情報について最善の推測を行うようになりました。 (Greg Sabino Mullane)

  これによりユーザは単に構文エラーとなった問い合わせの前に`\h`を付けるだけで、サポートしている構文のヘルプ情報を得ることができるようになりました。 これまでは、`\h`を使用する前にコマンド名以外の問い合わせテキストを削除しなければなりませんでした。

- ロケールを考慮した書式で数値を出力できるように`\pset numericlocale`を追加しました。(Eugen Nedelcu)

  例えば、`C`ロケールでは`100000`は`100,000.0`として、Europeanロケールでは `100.000,0`として出力されます。

- 起動時のバナーでサーバのバージョン番号とpsqlのバージョン番号が異なる場合に両方とも表示するようにしました。(Bruce)

  また、サーバとpsqlとの間でメジャーリリース番号が異なる場合に警告を発します。

### E.58.3.12. pg_dumpの変更

- pg_restoreに`-n`および`--schema`スイッチを追加しました。 (Richard van den Berg)

  これにより指定したスキーマのオブジェクトのみをリストアすることができます。

- テキストモードでもpg_dumpがラージオブジェクトをダンプできるようになりました。(Tom)

  この変更により、ラージオブジェクトが常にダンプで切るようになりました。 以遠の`-b`スイッチは何も行いません。

- pg_dumpが一貫性を持ったラージオブジェクトのスナップショットをダンプできるようになりました。(Tom)

- ラージオブジェクトのコメントをダンプします。(Tom)

- pg_dump に`--encoding` を追加しました。 (Magnus Hagander)

  これにより、サーバの符号化方式と異なる符号化方式でデータベースをダンプできるようになりました。 これは、異なる符号化方式のマシンでダンプを転送する時有用です。

- 手続き言語の`pg_pltemplate`に依存します。(Tom)

  手続き言語用の呼び出しハンドラが`pg_catalog`スキーマ内に存在する場合、pg_dumpはそのハンドラをダンプしません。 代わりに、ロード時に言語の生成パラメータを提供する`pg_pltemplate`カタログに依存した、単なる`CREATE LANGUAGE `name``を使用してその言語をダンプします。

### E.58.3.13. libpqの変更

- パスワードファイルのファイル名を指定する`PGPASSFILE`環境変数を追加しました。(Andrew)

- `lo_create()`を追加しました。 これは`lo_creat()`と同じですが、ラージオブジェクトのOIDを指定することができます。(Tom)

- libpqが`malloc()`失敗に関するエラーを一貫性を持ってクライアントアプリケーションに返すようにしました。 (Neil)

### E.58.3.14. ソースコードの変更

- 場所を変更したインストレーションに対して構築をサポートするようにpgxsを修正しました。

- Intelコンパイラを使用するItaniumプロセッサをサポートするスピンロックを追加しました。 (Vikram Kalsi)

- Windows用のKerberos 5サポートを追加しました。(Magnus)

- 中国語版FAQを追加しました。(laser@pgsqldb.com)

- OS/Xの機能名称変更に合わせ、RendezvousをBonjourに名前を変更しました。(Bruce)

- Darwinにおける`fsync_writethrough`のサポートを追加しました。(Chris Campbell)

- サーバ、オプティマイザ、ロックシステム内の情報の渡し方を合理化しました。 (Tom)

- pg_configがMSVCを使用してコンパイルできるようになりました。(Andrew)

  これには、MSVCを使用した DBD::Pgの構築が必要です。

- Kerberos V4のサポートをやめました。(Magnus)

  Kerberos 4 にはセキュリティ上の欠陥があり、保守もされていません。

- コードを整理しました。（EnterpriseDBを使用してカバレッジに関する静的解析を行いました。）

- `postgresql.conf`のドキュメント上のデフォルトを、`true`/`false`ではなく`on`/`off`に変更しました。(Bruce)

- pg_configを改良し、より多くの構築時の値を報告できるようにしました。(Tom)

- Windowsにおいてスレッドセーフなlibpqを構築できるようにしました。(Dave Page)

- WindowsにおいてIPv6接続が利用できるようになりました。(Andrew)

- I/Oサブシステムの信頼性に関するサーバ管理用文書を追加しました。(Bruce)

- 秘匿可能な宣言を`gist.h`から`gist_private.h`に移しました。(Neil)

  以前のリリースでは、`gist.h`には公開GiST API（GiSTインデックス実装者向け）とGiST自体を実装するために使用する秘匿可能な宣言が混在していました。 後者が`gist_private.h`という別のファイルに移りました。 ほとんどのGiSTインデックス実装には影響がないはずです。

- GiSTメモリ管理を再作成しました。(Neil)

  GiSTのメソッドが常に短命のメモリコンテキスト内で呼び出されるようになりました。 そのため、`palloc()`で割り当てられたメモリは自動的に回収されます。 これにより、GiSTインデックス実装では`pfree()`を使用して割り当てられたメモリを解放する必要がなくなりました。

### E.58.3.15. Contribの変更

- `/contrib/pg_buffercache` contribモジュールを追加しました。(Mark Kirkwood)

  これはデバッグや性能の調整を目的としたもので、バッファキャッシュの内容を表示します。

- 古くなりましたので`/contrib/array`が削除されました。(Tom)

- `/contrib/lo`モジュールを整理しました。(Tom)

- `/contrib/findoidjoins`を`/src/tools`に移動しました。(Tom)

- `/contrib/cube`から`<<`、`>>`、`&<`、`&>` 演算子を削除しました。

  これらの演算子が有用ではないからです。

- `/contrib/btree_gist`を改良しました。(Janko Richter)

- `/contrib/pgbench`を改良しました。 (Tomoaki Sato, Tatsuo)

  固定のコマンド群だけではなく、ユーザが用意したSQLコマンドスクリプトで試験を行なう機能が追加されました。

- `/contrib/pgcrypto`を改良しました。(Marko Kreen)

  - OpenPGP対称キーと公開キー暗号の実装。

    RSAおよびElgamal公開キーアルゴリズムの両方をサポートします。

  - 単体での構築。SHA256/384/512ハッシュ、Fortuna PRNGを含みます。

  - OpenSSLの構築。3DESのサポート。OpenSSL < 0.9.7での内部AESの利用。

  - `configure`の結果を使用した構築パラメータ（OpenSSL、zlib）の取得。

    `Makefile`を編集する必要がまったくなくなりました。

  - `libmhash`および`libmcrypt`サポートの削除。

前のページ | ホーム | 次のページ
リリース8.1.1 | 上に戻る | リリース8.0.25