(2003/11/17リリース)に関する技術情報をお届けします。リリースノートを元に弊社で解説を加えたものです。ここにあげた変更点は、すべてを網羅していない可能性があります。いうファイルを見てください>。互換性のない変更点データベースのフォーマットが変更され、7.3以前のデータベースは利用できません。pg_dump等を利用してデータベースをダンプ/リストアする必要があります。フロントエンド-バックエンド間のプロトコルが3.0になりました。これには以下のような変更が含まれます。高速で、ユーザー名の長さ制限が無く、COPY命令からの速やかな終了が可能になっています。トランザクション状態、テーブルID,カラムIDがおのおの追加されました。バイナリデータを直接バックエンドに送ることが出来るようになりました。エラーメッセージ、コード、詳細が追加されました。エラーコードは現在libpqでのみ実装、利用できます。サーバーサイドのautocommit設定が削除され、これらのAPIはlibpqをやpsqlを含むクライアント側で再実装されています。これにより、autocommit設定をサーバー側に依存していた場合には実装を見直す必要があります。on’コマンドに対しては、互換性維持のために今までと同じ反応が返ります。JOINの振る舞いが最適化されています。従来は文法通りJOINを評価していましたが、現在では完全な最適化を行いますので、明示的な最適化には使えなくなりました。Parameterのjoin_collapse_limitに1を設定してください。0は今までは「最終行に移動」/「残りすべての行を取得」という動作だったのが、両>方とも「何もしない」に変更されました。返り値の単位が列数、あるいはカーソルの最初/最後の場合は0を返すようになりました。従来は、処理された列数と異なる場合がありました。COPYコマンドが、行末の改行コードを従来のLFだけでなく、CR,CR/LFも解釈できるようになりました。データ内に直接CRを埋め込むことができなくなっています。CHAR->VARCHAR(n)/TEXTへのキャストが行われるときに、行末のスペースは自動的に取り除かれるようになりましたFLOAT(p)のpはビットで計算されます。桁数ではありませんDATESTYLE設定名が変更されました。MDY,DMY,YMDが正式名になります。USやEuropianは、互換性のために残されます。SHOWしたときの表現がSETするときと同じようになりました。XX/XX/XXのような日付表現はDataStyleに厳密に沿わなければならないようになりました。"10/20/12"以下の関数が削除されましたoidrand()oidsrand()userfntest()カラムのデフォルト値にnowは利用できなくなりました。now(),CURRENT_TIMESTAMPのいずれかを代替利用してください。カラムのデフォルト値にtodayは利用できなくなりました。CURRENT_DATEを代替利用してください他のデータベースとの互換性を改善するため、’$’について以下のように扱いが変更されました。INを使った副問い合わせをより効率的に実行できるようになりました。7.3以前のバージョンではこれらの副問い合わせはより上位の問い合わせとシーケンシャルスキャンを利用して結合するようにしていました。7.4ではたとえば副問い合わせを通常のJOINに変換するような方法で、これらの検索は非常に高速化されました。BYの実行効率がhashを利用することで改良されました。joinが実装されました。joinが最適化されるようになりました。高速で、しかも高機能な新しい正規表現エンジンが取り込まれました。単純なSQLを使った関数のインライン化を行うようになりましたIPv6がサポートされました。IPv6データ型が追加されました。IPv6接続がサポートされました。pageがFULLでないVACUUMで再利用されるようになりました。SCHEMAが実装されました。Parameterローカライゼーションのための、読み込み専用パラメーターが追加されました名称が変更になったものserver_min_messagesがlog_min_messageに変更されました。show_source_portはlog_source_portに変更されました。デフォルト値が変更になったものshared_buffersは、可能であればデフォルト値1000を利用するようになりました。これはinitdb時に決定されます。max_connectionsは、可能であればデフォルト値100を利用するようになりました。これはinitdb時に決定されます。動作が変更になった物log_min_message/client_min_messageがDEBUG出力を抑制するようになりました。追加になった物regex_flavorは、正規表現の「風味」を制御します。extendedで、下位互換性が高い物に変わります。デフォルトはadvancedで、新しい正規表現エンジンを利用しますす。log_error_verbosityは、エラー詳細の出力レベルをTERSE,DEFAULT,VERBOSEの3段階で制御します。JOINの最適化を行う時に一度に考慮するテーブル数を設定します。1にすることで従来と同じ動作になります。checkpoint_warningは、設定時間以内に連続でcheckpointが実行された場合に警告します。デフォルトは30秒です。preload_librariesは、サーバー開始時に読み込むライブラリ及び読み込み時に実行する関数を指定します。デフォルトは指定されていません。log_min_duration_statementは、log_durationで記録するステートメントの最低実行時間を指定します。デフォルトは-1(無効)です。extra_float_digitsは、浮動小数点や幾何データ型で表示する桁数を指定します。OSによって小数点の最後の桁が狂うような問題を回避するのに利用します。add_missing_fromは、falseにすることでFROM句に書かれていないテーブルを自動的にFROM句に追加しない、SQL準拠の挙動になります。デフォルトはtrueで、これは従来の動作と同じです。"branches"from_collapse_limitは、副問い合わせ->JOINの変換を行う時のFROM句上のテーブル数の上限を設定します。これは通例geqo_thresholdよりも小さくします。geqo_random_seedは削除されました。describe-configで、GUCパラメーターを出力するようになりましたlibpqとecpgがスレッドセーフになるconfigureのオプション、–enable-thread-safetyが追加になりました。配列型の実装が改善され、完全にサポートされたデータ型と同じように振る舞えるようになっています。APIのエラーを正しくハンドリングするようになりました。セキュリティとパフォーマンスの両面が改善されました。デッドロック時にロック情報を表示するようになりました。1828./tmpに置かれているソケットファイルが外部から削除されても自動的に再作成するようになりました。Xで有効になりましたB-treeWALで完全に保護されるようになりました。従来はサーバークラッシュにより、ごくまれにインデックスが破損する問題がありましたページ再利用の対象になりました。Map)割り当てロジックが改善されました。サーバー停止時に情報を保存/開始時に読み込みすることで、FSMを引き継げるようになりました。initdb時に、正しいスキーマ権限が割り当てられるようになりました。破損したディスクページを発見するコードが追加されました。サーバー関連デバッグ用のログメッセージは”LOG”ではなく”DEBUG”として出力するようになりました。スーパーユーザー以外がlog関連の機能をoff出来ないようになりました。XでRendezvousがサポートされました。有効にするにはconfigureの–with-rendezvousオプションを追加する必要があります。is_superuser変数が利用可能になりました。pg_settingにcontext,type,source,min-val,max-valカラムが追加されました。pg_hba.confCIDR形式の記述が可能になりました。接続形式にhostnossl(SSLを利用しない)が追加されました。BYと集約関数の組み合わせで、hashを用いるようになりました。Loopがより賢くなりました。複雑な関数でのメモリ使用量が減少しました。GEQOのパフォーマンスが改善されました。INをハッシュテーブルを使って処理できるようになりました。副問い合わせでオプティマイザのコスト計算が改善されました。BYが一致するケースで、ソートの回数を削減しました。42のような展開がされるようになりました。joinがより複雑なjoinで行われるようになりました。joinがよりたくさんのデータ型で行われるようになりました。</liオプティマイザでのリレーションのセットの内部表現に可変長のビットマップを用いるようになりました。バックエンドの開始にかかる時間を改善しました。indexごくまれに破損する問題を修正しました。同時実効性と性能が改善されました。共有バッファを一部CPUでのスピード改善のために32バイト境界にしました。NUMERIC型の内部表現が100進数から10000進数に変更になり、性能が向上しました。エラーメッセージにキー名および値が表示されるようになりました。pg_stat_activityテーブルは、一般ユーザーでも自分自身の問い合わせだけは見ることが出来るようになりました。副問い合わせの集約の上位問い合わせカラムを、SQL仕様にあうように修正しました。LIMIT/OFFSETに定数だけでなく数式が利用できるようになりました。ONLYが追加されました。これを使って実行開始したトランザクションは読み込み専用になります。SEQUENCEがよりSQL2003らしくなりました。STATEMENT句が追加されました。これは将来のリリースで利用される予定です。DOMAINCHECK制約が追加されました。DOMAINが追加されました。自動キャストが改善されましたカラムのないテーブルに関するいくつかのバグが修正されました。SEQUENCEでmix/max/increment/cache/cycleと言った値も変更可能になりました。COMMIT句が追加されました。これはTEMPと同時に利用され、COMMITと同時に一時テーブルが破棄されることを意味します。DEFAULTSが追加されました。これはカラム定義は継承しますが、検索で子テーブルの結果を同時に取得するような機能はありません。NULL制約を追加するようになりました。OIDSが追加されました。OIDSは無いことに注意してください。ONが追加されました。これはpg_dumpでテーブルのクラスタ化に関する情報を記録するために利用します。OPTION構文が追加されました。HOLD句が追加されました。これを指定したカーソルはトランザクションの終了によって破棄されません。EXPLAINで利用できるようになりました。CLUSTER行われたクラスター化についての情報を記録するようになりました。以前クラスター化されたインデックスがあるテーブルを再クラスター化できるようになりました。以前クラスター化されたテーブルを自動的に再クラスター化することができるようになりました。部分インデックスのクラスタ化を抑制するようになりました。リテラル中にCRを埋め込むことは出来なくなりました。代わりにCRをバックスラッシュでエスケープするか、を利用してください。IN/OUTが失敗したときにきれいに終了できるようになりました。メモリリークが修正されました。EXECUTEが、以下のような文中で利用できるようになりました。ASTRUNCATEがトランザクション中で安全に実行できるようになりました。FETCHやEXPLAINといったコマンドがPREPARE出来るようになりました。KEY,CHECK制約をサポートするようになりました。インデックスのVACUUM性能が改善されました。INDEXで作成できる関数インデックスが一般化され、より複雑な数式や関数をインデックスに利用できるようになりました。例では数式をインデックスに利用します。error”に変更になりました。TRANSACTION_ISOLATIONの出力がSETの時の入力に沿うようになりました。データベースコメントはデータベースローカルなテーブルに格納されるようになりました。LISTEN/NOTIFYの信頼性が改善されました。REINDEXでインデックス再構築出来るテーブルの範囲が増えました。pg_shadow,pg_groupだけは、今でもbackendからreindexしなければなりません。型精度のあるfloat(p)型が追加されました。timestampのサポートする日付範囲が拡大されました。intervalの秒数に’60’が利用できるようになりました。これは閏秒を表現するために使えます。NaNは、MIN/MAX関数で、常にあらゆる値より大きいと判断されるようになりました。intervalの表示で秒の”:00′′は表示されないようになりました。time型で、6桁の表現が許されるようになりました。row)タイムゾーンにFJST(+1300)が追加されました。ARRAY[ARRAY[ARRAY[2]]]以下のような演算子が定義されました。ALL(副問い合わせのように実行されます)配列を副問い合わせの中身として利用できます。インデックスを張ることが可能です。BYとDISTINCTで利用されます。各関数が追加されました。空の配列が割り当て可能になりました。0除算をトラップできないシステムで、PostgreSQL側でトラップするようになりました。initcap()がよりOracle互換になりました。contrib/pgcryptoにあったmd5()関数が取り込まれました。TIMESTAMP)が、GMTではなくローカルのタイムゾーンを利用するようになりました。to_char()のバグがいくつか修正されました。配列としてANYELEMENT,ANYARRAY型が使えるようになりました。polymorphic関数が利用可能になりました。これは関数の引数や返値としてANYELEMENTやANYARRAYを使うことで、様々な型に対して同一の関数を利用できるようになります。->textのキャストが追加になりましたロケールに関係なく、LIKE等でインデックスが利用可能になりました。不正なタイムゾーン名が利用不可能になりました。TIMEZONEが文字列からタイムゾーンのオフセットに変更になりました。row)以下の関数が追加されました。pg_get_triggerdef(prettyprint)pg_constraint_is_visible()アドレスの種類(IPv4/IPv6)を返すfamily()関数が追加されました。date_trunc(‘quarter’,...)の正しい値を返さない問題が修正されました。pager”コマンドにalwaysが追加されました。設定すると、常にページャーを使うようになります。tabキーによる補完が強化されました。helpの出力がグルーピングされました。スキーマ、キャスト、変換に関するコマンドが追加されました。encodingが、client_encoding変数ベースに変更になりました。CLIENT_ENCODINGしたのを検知できませんでした。eで入力したコマンドが、readlineの編集履歴に反映されるようになりました。VERBOSITY’が追加されました。トランザクション状態を表示するためのプロンプト文字列、%Tが追加されました。長いオプションがすべてのプラットフォームで有効になりました。pg_dump特定のスキーマをdump出来るようになりました。カラムの保管モードをdump出来るようになりました。クラスタ化に関する情報をdumpできるようになりました。小文字の識別子がコマンドラインから指定されるのを防ぐようになりました。–use-set-session-authorizationや–no-reconnectがデフォルトの動作になりました。リストア中のパスワード入力プロンプトなどの必要が減少します。長い文字列オプションが追加されました。その他、細々とした修正が行われました。formatやloの問題が含まれています。pg_dumpallデータベースレベルの権限を保存するようになりました。pg_dumpの-a,-s,-xオプションをサポートします。NEXTしたときにrowを返さない場合にクラッシュする不具合が修正されました。%ROWTYPEなしに複合型変数を定義できるようになりましたpolymorphic関数をサポートしました。コンパイル済み関数のキャッシュ手法もこれに対応しました。$0パラメーターが追加されました。これは関数の厳密な返値です。PL/python複数のテーブルで同じトリガーが使えるようになりました。spi_executeがNULLを適切に処理できるようになりました。_quote()関数がbigintを扱えるようになりました。PL/pythonは信頼できない関数と見なされるようになり、名称もplpythonuに変更になりました。PL/Tcl複数のテーブルで同じトリガーが使えるようになりました。spi_prepareで、完全qualifiedな型名を使えるようになりました。libpq追加された関数。PQFreemem()関数。これはlibpqが利用しているメモリをクリアするための関数です。将来のWin32版では必須ですが、他のプラットフォームでも推奨されます。PQprotocolVersion()。利用しているプロトコルのバージョンを取得します。PQparameterStatus()。各種パラメーターの状態をサーバーから取得します。PQsocket()。利用しているソケット記述子を取得します。PQtransactionStatus()。トランザクション状態を取得します。PQftable()。テーブルIDを取得します。PQftablecol()。テーブル上のカラムIDを取得します。PQfformat()。カラムが利用するフォーマット種別を取得します。現在は0(テキスト)/1(バイナリ)の2つです。PQbinaryTuples()。データがバイナリ情報を含むかどうかを取得します。PQresultErrorField()。エラー情報を取得します。PQsendQueryPrepared()。これらはPREPAREを利用するために使います。PQsendQueryParams()。これらはPREPAREされたものを利用するとき、あるいはバイナリデータをそのまま送るときにも使います。PQsetdbLogin()が、PQconnectDB()と同じデフォルト値を持つようになりました。PQcmdTuples()が、MOVE/FETCHの時も行数を返すようになりました。PGunescapeBytea()のパフォーマンスが向上しました。pgInternalNotice()関数で、単なる文字列だけでなく、フォーマットされた文字列と引数を受け入れるようになりました。いくつかのドキュメントと、サンプルファイルが追加されています。問い合わせ結果が大きすぎた場合でも、正しく失敗するようになりました。sslmode変数で、SSLのネゴシエーションを制御できるようになりました。“prefer”,”require”の4種類があります。</liecpgINFORMIX互換モードが追加されました。DECIMALが固定長になりました。pythonインターフェースが削除され、http://www.pygresql.org/に移動しました。その他pg_ctlで、5432番以外のポートを使っている場合の動作が改善されました。Darwinのスタートアップスクリプトが改良されました。Linuxでのスタートアップスクリプトが改良されました。CompilerやMinGW/Win32でコンパイルできるようになりました。Win32用のUNIX互換関数がいくつか追加されました。必要なら自前のgetopt_long()を利用するようになりました。管理ツールがCに書き直されました。エラーレポートのための関数、ereport()が追加されました。Compilerがサポートされました。Itaniumの両CPUがサポートされました。configureの–enable-recodeオプションが削除されました。spinlockのコードがない場合にはコンパイルエラーが発生するようになりました。そのようなプラットフォームではconfigureのオプション–disable-spinlocksが必要になります。