PostgreSQL 7.4 に関する技術情報

このリリースは PostgreSQL 7.4 (2003/11/17リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

PostgreSQL 7.3.4 から 7.4 への変更点

注意: ここにあげた変更点は、すべてを網羅していない可能性があります。詳しくはリリースノート、あるいはソースに付属の HISTORY というファイルを見てください>。

互換性のない変更点

    • データベースのフォーマットが変更され、7.3以前のデータベースは利用できません。pg_dump等を利用してデータベースをダンプ/リストアする必要があります。
    • フロントエンド-バックエンド間のプロトコルが3.0になりました。下位互換性は
      維持されていますので、新機能は使えませんが、古いバージョンのクライアントやサーバとも問題なく接
      続できます。これには以下のような変更が含まれます。

      • 高速で、ユーザー名の長さ制限が無く、COPY命令からの速やかな終了が可能になっています。
      • トランザクション状態、テーブルID,カラムIDがおのおの追加されました。
      • バイナリデータを直接バックエンドに送ることが出来るようになりました。
      • エラーメッセージ、コード、詳細が追加されました。ただし、エラーコードは現在libpqでのみ実装、利用できます。
    • サーバーサイドのautocommit設定が削除され、これらのAPIはlibpqをやpsqlを含むクライアント側で再実装されています。 これにより、autocommit設定をサーバー側に依存していた場合には実装を見直す必要があります。
      なお、’set autocommit to on’コマンドに対しては、互換性維持のために今までと同じ反応が返ります。
    • INNER JOINの振る舞いが最適化されています。従来は文法通りJOINを評価していましたが、現在では完全な最適化を行いますので、明示的な最適化には使えなくなりました。
      これを無効化するにはGUC Parameterのjoin_collapse_limitに1を設定してください。
    • MOVE/FETCH
      • MOVE/FETCH 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に厳密に沿わなければならないようになりました。かつては自動で読替えされていました
(7.3)
yutaka=# set DATESTYLE=ISO,Europian;
SET
yutaka=# show DATESTYLE;
           DateStyle
-------------------------------
 ISO with European conventions
(1 row)

yutaka=# select '10/20/12'::timestamp;
      timestamp
---------------------
 2020-12-10 00:00:00
(1 row)

(7.4)
yutaka=# set DATESTYLE=ISO,YMD;
SET
yutaka=# show DATESTYLE;
 DateStyle
-----------
 ISO, YMD
(1 row)

yutaka=# select '10/20/12'::timestamp;
ERROR:  date/time field value out of range: "10/20/12"
  • 以下の関数が削除されました
    • oidrand()
    • oidsrand()
    • userfntest()
  • カラムのデフォルト値にnowは利用できなくなりました。now(),CURRENT_TIMESTAMPのいずれかを代替利用してください。
  • カラムのデフォルト値にtodayは利用できなくなりました。CURRENT_DATEを代替利用してください
  • 他のデータベースとの互換性を改善するため、’$’について以下のように扱いが変更されました。
    • 語頭でなければ識別子に利用できるようなりました
    • 演算子に利用できなくなりました
    (7.3)
    yutaka=# create temp table a(a$a int);
    ERROR:  parser: parse error at or near "$" at character 22
    yutaka=# create operator $~~~ ( LEFTARG=int, RIGHTARG=int, PROCEDURE=myadd );
    CREATE OPERATOR
    
    (7.4)
    yutaka=#  create temp table a(a$a int);
    CREATE TABLE
    yutaka=#  create operator $~~~ ( LEFTARG=int, RIGHTARG=int, PROCEDURE=myadd );
    ERROR:  syntax error at or near "$" at character 18
    
  • pg_stat_activityテーブルに、start_timeカラムが追加されました

主な変更点

  • IN/NOT INを使った副問い合わせをより効率的に実行できるようになりました。
    7.3以前のバージョンではこれらの副問い合わせはより上位の問い合わせとシーケンシャルスキャンを利用して結合するようにしていました。7.4ではたとえば副問い合わせを通常のJOINに変換するような方法で、これらの検索は非常に高速化されました。
  • GROUP BYの実行効率がhashを利用することで改良されました。
  • 複数のキーを使ったhash joinが実装されました。
  • ANSI joinが最適化されるようになりました。
  • 高速で、しかも高機能な新しい正規表現エンジンが取り込まれました。
  • 単純なSQLを使った関数のインライン化を行うようになりました
  • IPv6がサポートされました。
    • IPv6データ型が追加されました。
    • IPv6接続がサポートされました。
  • index pageがFULLでないVACUUMで再利用されるようになりました。
  • SQLのINFORMATION SCHEMAが実装されました。
  • GUC Parameter
    • ローカライゼーションのための、読み込み専用パラメーターが追加されました
    • 名称が変更になったもの
      • server_min_messagesがlog_min_messageに変更されました。
      • show_*_statsに該当するものはすべてlog_*_stats に変更されました。
      • show_source_portはlog_source_portに変更されました。
      • hostname_lookupはlog_hostname に変更されました。
    • デフォルト値が変更になったもの
      • 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_collapse_limitは、ANSI 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で、これは従来の動作と同じです。
      yutaka=# set add_missing_from to true;
      SET
      yutaka=# select branches.bid where false;
       bid
      -----
      (0 rows)
      
      yutaka=# set add_missing_from to false;
      SET
      yutaka=# select branches.bid where false;
      ERROR:  missing FROM-clause entry for table "branches"
      
      • from_collapse_limitは、副問い合わせ->JOINの変換を行う時のFROM句上のテーブル数の上限を設定します。これは通例geqo_thresholdよりも小さくします。デフォルトは8です。
    • geqo_random_seedは削除されました。
    • postgres — describe-configで、GUCパラメーターを出力するようになりました
  • libpqとecpgがスレッドセーフになるconfigureのオプション、–enable-thread-safetyが追加になりました。
  • 配列型の実装が改善され、完全にサポートされたデータ型と同じように振る舞えるようになっています。
  • SSL接続
    • SSL APIのエラーを正しくハンドリングするようになりました。
    • セキュリティとパフォーマンスの両面が改善されました。
  • デッドロック時にロック情報を表示するようになりました。
  • yutaka=# lock table tellers ;
    ERROR:  deadlock detected
    DETAIL:  Process 1828 waits for AccessExclusiveLock on relation 17147 of databas
    e 17142; blocked by process 3312.
    Process 3312 waits for AccessExclusiveLock on relation 17151 of database 17142;
    blocked by process 1828.
    
  • /tmpに置かれているソケットファイルが外部から削除されても自動的に再作成するようになりました。
  • PAM認証がMacOS Xで有効になりました
  • B-tree
    • WALで完全に保護されるようになりました。従来はサーバークラッシュにより、ごくまれにインデックスが破損する問題がありました
    • ページ再利用の対象になりました。
  • FSM(Free Space Map)
    • 割り当てロジックが改善されました。
    • サーバー停止時に情報を保存/開始時に読み込みすることで、FSMを引き継げるようになりました。
  • initdb時に、正しいスキーマ権限が割り当てられるようになりました。
  • 破損したディスクページを発見するコードが追加されました。

サーバー関連

  • デバッグ用のログメッセージは”LOG”ではなく”DEBUG”として出力するようになりました。
  • スーパーユーザー以外がlog関連の機能をoff出来ないようになりました。
  • Mac OS XでRendezvousがサポートされました。有効にするにはconfigureの–with-rendezvousオプションを追加する必要があります。
  • is_superuser変数が利用可能になりました。
  • pg_settingにcontext,type,source,min-val,max-valカラムが追加されました。
  • pg_hba.conf
    • CIDR形式の記述が可能になりました。
    • 接続形式にhostnossl(SSLを利用しない)が追加されました。

パフォーマンス面の変更

  • GROUP BYと集約関数の組み合わせで、hashを用いるようになりました。
  • 複数カラム用インデックスでのNested Loopがより賢くなりました。
  • 複雑な関数でのメモリ使用量が減少しました。
  • GEQOのパフォーマンスが改善されました。
  • IN/NOT INをハッシュテーブルを使って処理できるようになりました。
  • 主に副問い合わせでオプティマイザのコスト計算が改善されました。
  • 副問い合わせのORDER BYが一致するケースで、ソートの回数を削減しました。
  • WHERE a.x = b.y and b.y = 42のようなケースで、a.x = 42のような展開がされるようになりました。
  • hash/marge joinがより複雑なjoinで行われるようになりました。
  • hash joinがよりたくさんのデータ型で行われるようになりました。</li
  • オプティマイザでのリレーションのセットの内部表現に可変長のビットマップを用いるようになりました。
  • バックエンドの開始にかかる時間を改善しました。
  • DEFERREDを指定したトリガーと、それを利用する外部キーの性能が改善されました
  • hash index
    • ごくまれに破損する問題を修正しました。
    • 同時実効性と性能が改善されました。
  • 共有バッファを一部CPUでのスピード改善のために32バイト境界にしました。
  • NUMERIC型の内部表現が100進数から10000進数に変更になり、性能が向上しました。

問い合わせ言語に関する変更

    • 参照整合性違反のエラーメッセージにキー名および値が表示されるようになりました。
    • pg_stat_activityテーブルは、一般ユーザーでも自分自身の問い合わせだけは見ることが出来るようになりました。
    • 副問い合わせの集約の上位問い合わせカラムを、SQL仕様にあうように修正しました。
    • LIMIT/OFFSETに定数だけでなく数式が利用できるようになりました。
(7.3)
yutaka=# select * from f order by i limit 1+1 offset 1-1 ;
ERROR:  parser: parse error at or near "+" at character 35
(7.4)
yutaka=# select * from f order by i limit 1+1 offset 1-1 ;
 i
---
 1
 2
(2 rows)
  • START TRANSACTIONにREAD ONLYが追加されました。これを使って実行開始したトランザクションは読み込み専用になります。
    yutaka=# start transaction read only;
    START TRANSACTION
    yutaka=# delete from accounts;
    ERROR:  transaction is read-only
    
  • CREATE SEQUENCEがよりSQL2003らしくなりました。
  • <li>CREATE TRIGGERにFOR EACH STATEMENT句が追加されました。これは将来のリリースで利用される予定です。
  • DOMAIN
    • CHECK制約が追加されました。
    • ALTER DOMAINが追加されました。
    • 自動キャストが改善されました
  • カラムのないテーブルに関するいくつかのバグが修正されました。
  • ALTER SEQUENCEでmix/max/increment/cache/cycleと言った値も変更可能になりました。
  • CREATE TABLE
    • ON COMMIT句が追加されました。これはTEMPと同時に利用され、COMMITと同時に一時テーブルが破棄されることを意味します。
    • SQL200Xの継承構文であるLIKE,INCLUDING DEFAULTSが追加されました。これはカラム定義は継承しますが、検索で子テーブルの結果を同時に取得するような機能はありません。
  • ALTER TABLE
    • ALTER TABLE … ADD PRIMARY KEYが暗黙にNOT NULL制約を追加するようになりました。
    • WITHOUT OIDSが追加されました。WITH OIDSは無いことに注意してください。
    • ALTER TABLE … CLUSTER ONが追加されました。これはpg_dumpでテーブルのクラスタ化に関する情報を記録するために利用します。
  • GRANTにWITH GRANT OPTION構文が追加されました。
  • DECLARE CURSOR
    • WITH HOLD句が追加されました。これを指定したカーソルはトランザクションの終了によって破棄されません。
    • MOVE/FETCHのオプションとしてFIRST, LAST, ABSOLUTE n, RELATIVE nが実装されました。
    • EXPLAINで利用できるようになりました。
  • CLUSTER
    • 行われたクラスター化についての情報を記録するようになりました。
    • 以前クラスター化されたインデックスがあるテーブルを再クラスター化できるようになりました。
    • 以前クラスター化されたテーブルを自動的に再クラスター化することができるようになりました。
    • 部分インデックスのクラスタ化を抑制するようになりました。
  • リテラル中にCRを埋め込むことは出来なくなりました。代わりにCRをバックスラッシュでエスケープするか、
    を利用してください。
  • COPY
    • COPY IN/OUTが失敗したときにきれいに終了できるようになりました。
    • メモリリークが修正されました。
  • EXECUTEが、以下のような文中で利用できるようになりました。
  • TRUNCATEがトランザクション中で安全に実行できるようになりました。
  • FETCHやEXPLAINといったコマンドがPREPARE出来るようになりました。
  • pg_get_constraintdef()関数がUNIQUE,PRIMARY KEY,CHECK制約をサポートするようになりました。
  • インデックスのVACUUM性能が改善されました。
  • CREATE INDEXで作成できる関数インデックスが一般化され、より複雑な数式や関数をインデックスに利用できるようになりました。例では数式をインデックスに利用しま
    す。

    yutaka=# create index t_expr on t ((i + j));
    CREATE INDEX
    
  • 文法エラーが”parse error”から”syntax error”に変更になりました。
  • SHOW TRANSACTION_ISOLATIONの出力がSETの時の入力に沿うようになりました。
  • データベースコメントはデータベースローカルなテーブルに格納されるようになりました。
  • LISTEN/NOTIFYの信頼性が改善されました。
  • REINDEXでインデックス再構築出来るテーブルの範囲が増えました。pg_database, pg_shadow,pg_groupだけは、今でもbackendからreindexしなければなりません。

データ型、演算子、関数等に関する変更

  • 型精度のあるfloat(p)型が追加されました。
  • timestampのサポートする日付範囲が拡大されました。
  • timestamp, time, intervalの秒数に’60’が利用できるようになりました。これは閏秒を表現するために使えます。
  • NaNは、MIN/MAX関数で、常にあらゆる値より大きいと判断されるようになりました。
  • intervalの表示で秒の”:00″は表示されないようになりました。
  • time型で、6桁の表現が許されるようになりました。
    (7.3)
    yutaka=# select '010203'::time;
    ERROR:  Bad time external representation '010203'
    
    (7.4)
    yutaka=# select '010203'::time;
       time
    ----------
     01:02:03
    (1 row)
    
    
  • タイムゾーンにFJST(+1300)が追加されました。
  • 配列型
    • 以下のような例に従って定義できます
        ARRAY[1,2,3]
        ARRAY[['a','b'],['c','d']]
        ARRAY[ARRAY[ARRAY[2]]]
      
    • 以下のような演算子が定義されました。
      • 比較
      • || による連結
      • ANY SOME ALL(副問い合わせのように実行されます)
    • 配列を副問い合わせの中身として利用できます。
    • インデックスを張ることが可能です。ORDER BYとDISTINCTで利用されます。
    • array_append(), array_cat(), array_lower(), array_prepend(), array_to_string(), array_upper(), string_to_array() の各関数が追加されました。
    • 空の配列が割り当て可能になりました。
  • 0除算をトラップできないシステムで、PostgreSQL側でトラップするようになりました。
  • initcap()がよりOracle互換になりました。
  • contrib/pgcryptoにあったmd5()関数が取り込まれました。
  • EXTRACT(EPHCH FROM TIMESTAMP)が、GMTではなくローカルのタイムゾーンを利用するようになりました。
  • to_char()のバグがいくつか修正されました。
  • 配列としてANYELEMENT,ANYARRAY型が使えるようになりました。
  • polymorphic関数が利用可能になりました。これは関数の引数や返値としてANYELEMENTやANYARRAYを使うことで、様々な型に対して同一の関数を利用できるようになります。
    yutaka=#CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS boolean AS
    '
    yutaka'#     SELECT $1 > $2;
    yutaka'# ' LANGUAGE SQL;
    CREATE FUNCTION
    yutaka=T#SELECT is_greater(1, 2);
     is_greater
    ------------
     f
    (1 row)
    
    yutaka=T#SELECT is_greater(1.0, 2.0);
     is_greater
    ------------
     f
    (1 row)
    
  • CIDR ->textのキャストが追加になりました
  • ロケールに関係なく、LIKE等でインデックスが利用可能になりました。
  • 不正なタイムゾーン名が利用不可能になりました。
  • EXTRACT(TIMEZONE)とSET/SHOW TIMEZONEが文字列からタイムゾーンのオフセットに変更になりました。
    (7.3)
    yutaka=# show TIMEZONE;
     TimeZone
    ----------
     JST-9
    (1 row)
    
    (7.4)
    yutaka=# show TIMEZONE;
     TimeZone
    -----------
     -09:00:00
    (1 row)
    
  • 以下の関数が追加されました。
    • pg_get_triggerdef(prettyprint)
    • pg_constraint_is_visible()
  • アドレスの種類(IPv4/IPv6)を返すfamily()関数が追加されました。
  • date_trunc(‘quarter’,…)の正しい値を返さない問題が修正されました。

コマンド、言語、問い合わせインターフェース

  • psql
    • “pset pager”コマンドにalwaysが追加されました。設定すると、常にページャーを使うようになります。
    • tabキーによる補完が強化されました。
    • ? helpの出力がグルーピングされました。
    • スキーマ、キャスト、変換に関するコマンドが追加されました。
    • encodingが、client_encoding変数ベースに変更になりました。従来は独自にSET CLIENT_ENCODINGしたのを検知できませんでした。
    • eで入力したコマンドが、readlineの編集履歴に反映されるようになりました。
    • dの出力が改良されました
    • HTML modeの出力がより標準に準拠するようになりました
    • set AUTOCOMMIT が追加されました。
    • エラー詳細レベルを制御する ‘set VERBOSITY’が追加されました。
    • トランザクション状態を表示するためのプロンプト文字列、%Tが追加されました。
    • 長いオプションがすべてのプラットフォームで有効になりました。
  • pg_dump
    • 特定のスキーマをdump出来るようになりました。
    • カラムの保管モードをdump出来るようになりました。
    • クラスタ化に関する情報をdumpできるようになりました。
    • 小文字の識別子がコマンドラインから指定されるのを防ぐようになりました。
    • –use-set-session-authorizationや–no-reconnectがデフォルトの動作になりました。リストア中のパスワード入力プロンプトなどの必要が減少します。
    • 長い文字列オプションが追加されました。
    • その他、細々とした修正が行われました。これにはtar formatやloの問題が含まれています。
  • pg_dumpall
      • データベースレベルの権限を保存するようになりました。

    pg_dumpの-a,-s,-xオプションをサポートします。

  • PL/pgSQL
    • RETURN 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()。 エラー情報を取得します。
      • PQexecPrepared() / PQsendQueryPrepared()。これらはPREPAREを利用するために使います。
      • PQExecParams() / PQsendQueryParams() 。これらはPREPAREされたものを利用するとき、あるいはバイナリデータをそのまま送るときにも使います。
  • PQsetdbLogin()が、PQconnectDB()と同じデフォルト値を持つようになりました。
  • PQcmdTuples()が、MOVE/FETCHの時も行数を返すようになりました。
  • PGunescapeBytea()のパフォーマンスが向上しました。
  • pgInternalNotice()関数で、単なる文字列だけでなく、フォーマットされた文字列と引数を受け入れるようになりました。
  • いくつかのドキュメントと、サンプルファイルが追加されています。
  • 問い合わせ結果が大きすぎた場合でも、正しく失敗するようになりました。
  • sslmode変数で、SSLのネゴシエーションを制御できるようになりました。これには”disable”,”allow”, “prefer”,”require”の4種類があります。</li
  • ecpg
    • INFORMIX互換モードが追加されました。
    • DECIMALが固定長になりました。
  • pythonインターフェースが削除され、http://www.pygresql.org/に移動しました。

その他

  • pg_ctlで、5432番以外のポートを使っている場合の動作が改善されました。
  • Darwinのスタートアップスクリプトが改良されました。
  • Linuxでのスタートアップスクリプトが改良されました。
  • Windows
    • Windows用libpqがBorland C++ CompilerやMinGW/Win32でコンパイルできるようになりました。
    • Win32用のUNIX互換関数がいくつか追加されました。
  • 必要なら自前のgetopt_long()を利用するようになりました。
  • 管理ツールがCに書き直されました。
  • エラーレポートのための関数、ereport()が追加されました。
  • Intel Linux Compilerがサポートされました。
  • AMD Opteron及びIntel Itaniumの両CPUがサポートされました。
  • configureの–enable-recodeオプションが削除されました。
  • spinlockのコードがない場合にはコンパイルエラーが発生するようになりました。そのようなプラットフォームではconfigureのオプション–disable-spinlocksが必要になります。