2005-11-08
このリリースの主な変更点を以下に示します。
共有バッファキャッシュへのアクセスが、特に、マルチCPUシステムにおいて深刻なスケーラビリティ問題であることは分かっていました。 本リリースでは、バッファマネージャ内で行われていたロックの方法を見直し、ロックの競合を軽減し、スケーラビリティを向上しました。 また、バッファマネージャは「clock sweep」置換ポリシーを使用するように変更されました。
過去のリリースでは、テーブル検索の実行において単一インデックスのみを使用することができました。
この機能により、WHERE tab.col1 = 4 and tab.col2 = 9
を持つ問い合わせで、col1
とcol2
に対する複数列インデックスが存在しない場合、col1
に対するインデックスとcol2
に対するインデックスがあれば、両方のインデックスを検索し、結果をメモリ内で組み合わせ、col1
とcol2
に関する両方の制約に一致する行のみをヒープから取り出すことができるようになります。
これは、問い合わせが構造化されておらず、すべての起こり得るアクセス条件に一致するインデックスを前もって作成できないような状況では、非常に有用です。
必要なランダムアクセスの総数を減少させるため、ビットマップスキャンは単一のインデックスの場合でも有用です。
ビットマップインデックススキャンはテーブル全体で多くの割合を占める部分を取り出す際に効率的です。
この場合、通常のインデックススキャンでは非効率的です。
二相コミットを使用して、トランザクションを複数のコンピュータで"準備"することができます。
すべてのコンピュータでトランザクションの準備を(失敗することなく)行った後、すべてのトランザクションをコミットすることができます。
準備した後でマシンがクラッシュしたとしても、マシンの再起動後に準備したトランザクションをコミットすることができます。
PREPARE TRANSACTION
およびCOMMIT/ROLLBACK PREPARED
という新しい構文があります。
また、新しいpg_prepared_xacts
システムビューも追加されました。
ロールとは、ユーザとグループを組み合わせたものです。 ユーザのようにロールはログイン機能を持つことができますし、グループのようにロールは他のロールをメンバとして持つこともできます。 基本的にロールは、ユーザとグループの区別を取り除きました。 例えば、ロールは以下のことを行うことができます。
ログイン機能を有す(省略可能)
オブジェクトを所有する
データベースオブジェクトに対するアクセス権限を保持する
属している他のロールの権限を継承する
ユーザがあるロールにログインした後、そのユーザはログインロールの能力の他、継承したロールの能力も持つことになります。
また、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
は書き込みによってブロックされることはありません。
そのため、通常の操作では共有行レベルロックは不要ですが、共有行ロックを必要とするアプリケーションでは共有ロックは有用です。
特に、これにより参照性合成検査で発生するロック要求が減少します。
依存性機構の拡張により、データベースオブジェクトを所有するロールが削除されることを防ぎます。 これまでは、所有者の削除により「親のいない」オブジェクトができてしまう可能性がありました。 これは復旧させることができましたが、厄介で好まれないものでした。
新しいconstraint_exclusion
設定パラメータは、子テーブルに一致する行が存在しないことを制約が示している場合、子テーブルの検索を防ぎます。
これにより、テーブルパーティションの基本的な種類を実現できます。
子テーブルが別々のキー範囲を格納し、これを適切なCHECK
制約で強制している場合、オプティマイザは、この制約により子テーブル内に一致することがないことが保証されている時にその子テーブルへのアクセスを飛ばします。
全ての以前のリリースからデータの移行を行うためには、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
は入力ファイル全体をメモリに読み込みますので、この処理のためにダンプを複数の小さなファイルに分割する必要があるかもしれません。
PostgreSQL8.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)
トランザクション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)
一時ビューを追加しました。(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
が即座に行ロックを獲得できなかった時、すぐに問い合わせをキャンセルすることができます。
共有オブジェクトの依存関係の追跡(Alvaro)
PostgreSQLでは、グローバルテーブル(ユーザ、データベース、テーブル空間)の情報を複数のデータベースから参照することができます。 今回の変更でグローバルテーブルに関する依存性情報が追加されました。 従って、例えば、ユーザの所有権をデータベースに跨って確認できますので、他のデータベースで何かを所有しているユーザを削除できないようにすることができます。 データベースに局所的なオブジェクトに関する依存関係の追跡はすでに存在します。
オブジェクト所有者が制限付きのALTER OWNER
コマンドを実行できるようになりました。(Stephen Frost)
以前のリリースでは、スーパーユーザのみがオブジェクトの所有権を変更できました。 今では、コマンドを実行したユーザがオブジェクトを所有し、かつ、新しい所有者として作成できる場合(つまり、そのユーザが新しい所有者のロールのメンバであり、そのロールが新規にオブジェクトを作成する時に必要なCREATE権限を持つ場合)、所有権を移すことができます。
一部のオブジェクト型(テーブル、関数、型)に対するALTER
object SET SCHEMA
機能を追加しました。(Bernd Helmle)
これによりオブジェクトを異なるスキーマに移すことができるようになります。
トリガを無効にするALTER TABLE ENABLE/DISABLE TRIGGER
を追加しました。(Satoshi Nagayasu)
単一の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)
配列型に対する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)
より一貫性を高め、かつ、国際的な標準に従うように一部の符号化方式の名前を変更しました。
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実装に対応付けすることでなされました。
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)
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)
大規模な結果セットを効率的に返すことが可能になりました。(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)
トランザクション内の文がトランザクションの残りに影響することなくエラーになることができるように、\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との間でメジャーリリース番号が異なる場合に警告を発します。
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
パスワードファイルのファイル名を指定するPGPASSFILE
環境変数を追加しました。(Andrew)
lo_create()
を追加しました。
これはlo_creat()
と同じですが、ラージオブジェクトのOIDを指定することができます。(Tom)
libpqがmalloc()
失敗に関するエラーを一貫性を持ってクライアントアプリケーションに返すようにしました。 (Neil)
場所を変更したインストレーションに対して構築をサポートするように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()
を使用して割り当てられたメモリを解放する必要がなくなりました。
/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
サポートの削除。