PostgreSQL 9.3.10 に関する技術情報

このリリースは 9.3.9 からの修正リリース(2015年10月8日リリース)です。

9.3.x からのアップデートではダンプ、リストアは不要です。

また、9.3.9 より前のバージョンからアップデートを行う場合は 9.3.9 に関する技術情報 を参照してください。

PostgreSQL 9.3.9 から 9.3.10 への変更点

9.4.5、9.3.10、9.2.14、9.1.19、9.0.23 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。


  1. jsonのパースでスタックオーバーフローが防止されました。 (Oskari Saarenmaa) (9.4)(9.3)
  2. アプリケーションが PostgreSQL の json や jsonb の値を任意のユーザ入力から構成する場合、アプリケーションユーザは確実にサーバをクラッシュさせることができて、一時的なサービス不能をひき起こせます。

  3. pgcrypto拡張モジュールが crypt()関数の短すぎるソルトを検出して報告するように修正されました。 (Josh Kupershmidt) (9.4)(9.3)(9.2)(9.1)(9.0)
  4. ある種の無効なソルト引数はサーバーをクラッシュさせるか、数バイトのサーバメモリを露出させました。露出した数バイトに秘密情報が在るように仕込む攻撃の可能性は排除しませんが、実現性は低いと見られます。(CVE-2015-5288)

  5. 外側サブトランザクションに属するポータル(カーソル)が失敗した後のサブトランザクションのクリーンアップが修正されました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  6. 外側サブトランザクションのカーソルで実行された関数が、内側サブトランザクションで作られたリレーション(一時テーブル等)を参照することで、アサート失敗かクラッシュを引き起こすことがありました。

  7. commit_delay が有効であるとき WAL挿入の際にデッドロックする可能性があり、修正されました。 (Heikki Linnakangas) (9.4)
  8. UPDATE実行時に更新可能ビューから参照されている全てのリレーションが適切にロックされるようになりました。 (Dean Rasheed) (9.4)(9.3)
  9. リレーションのリレーションキャッシュinitファイルへの格納について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  10. 直近のマイナーリリースでの不注意により、システムインデックスpg_trigger_tgrelid_tgname_index が initファイルで除外されていました。その後のセッションでこのことが検出され、initファイルが壊れていると見なされ、initファイルが無視されます。この結果、新規接続での所要時間が顕著に劣化しました。

    本バグ修正では加えて、将来の類似の誤りが見つかるようにする防止策がいくつか導入されました。

  11. SPIクエリ結果に多数の行を投入するとき、O(N^2) の所要時間を要する振る舞いを回避するようになりました。 (Neil Conway) (9.4)(9.3)(9.2)(9.1)(9.0)
  12. SPIクエリで結果行数が多いSQLを実行した場合に該当します。これまで必要メモリを追加するのに固定増分での追加確保をしていたため、処理回数が不要に多くなっていました。

  13. 読まれない通知が多数ある場合の LISTEN 開始の所要時間が改善されました。 (Matt Newell) (9.4)(9.3)(9.2)(9.1)(9.0)
  14. LISTEN/NOTIFY利用時において、一部の遅れたリスナーのために通知が大量に溜まっている状態で新たなリスナーを加えると、それらの溜まった通知を読み飛ばしていくのに処理コストを要していました。

  15. 多数の外部キー制約を変更したセッションでの性能問題が修正されました。 (Jan Wieck, Tom Lane) (9.4)(9.3)
  16. これは主に数千テーブルを持つデータベースのダンプをリストアするときに見られます。

  17. SSL再ネゴシエーションがデフォルトでは無効となりました。 (Michael Paquier, Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  18. 理論的には SSL再ネゴシエーションを使うことは良い考えですが、実際のところ OpenSSLライブラリに起因するもの、PostgreSQLにおけるライブラリの使い方に起因するもの、の双方で多数の障害が見られました。

    再ネゴシエーションは PostgreSQL 9.5 以降では削除されます。9.4 以前のバージョン系列では、postgresql.conf の ssl_renegotiation_limit のデフォルト値が無効を意味する 0 に変更されます。

  19. *_freeze_max_age パラメータの下限値が引き下げられました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  20. 主としてこれらパラメータに関するテストで時間がかからないようにするためですが、少ないディスクスペースにインストールする際にも価値があるかもしれません。

    autovacuum_freeze_max_age               100000  →      10000
    autovacuum_multixact_freeze_max_age  100000000  →  100000000 (9.3以降)
    

    上記のように変更されました。

  21. サーバクラッシュを避けるため wal_buffers の上限を 2GB までに限定しました。 (Josh Berkus) (9.4)(9.3)(9.2)(9.1)(9.0)
  22. 巨大な値を指定したとき整数オーバーフローによるクラッシュをひき起こしていました。なお、上限値 2GB は、実際には INT_MAX / XLOG_BLCKSZ の計算結果です。XLOG_BLCKSZ はビルド時の --with-wal-blocksize 指定値 × 1024 となります。

  23. postgresql.conf の読み込みについて修正されました。 (Tom Lane) (9.4)(9.3)
  24. サーバ開始時にしか指定できないパラメータが postgresql.conf の中に複数回あらわれた場合に苦情がログ出力されないようになりました。pg_ctl reload を行ったときに以下のようなメッセージが出ていました。

    LOG:  parameter "..." cannot be changed without restarting the server
    

    また、postgresql.conf のエラーを報告する際に include_dir 指定の後では行番号が誤って出力されており、修正されました。

  25. NUMERIC 値の掛け算における稀な内部オーバーフローが修正されました。 (Dean Rasheed) (9.4)(9.3)(9.2)(9.1)(9.0)
  26. NUMERIC型の掛け算の結果に誤った値が返る可能性がありました。

  27. レコード型、範囲型、json型、jsonb型、tsquery型、ltxtquery型、および、query_int型に関連する稀なスタックオーバーフローを防ぐようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  28. 欠けていた max_stack_depth 設定値を超えていないかのチェック処理が、これらデータ型の各処理箇所に加えられました。

  29. 日付時刻の入力において DOW と DOY の扱いが修正されました。 (Greg Stark) (9.4)(9.3)(9.2)(9.1)(9.0)
  30. これらのトークンは日付時刻値では使えないはずですが、これまでは「invalid input syntax」でなく、意味の分からない内部エラーが出ていました。

    (以前の誤ったエラーメッセージ)
    db1=# SELECT 'doy'::timestamptz;
    ERROR:  unexpected dtype 33 while parsing timestamptz "doy"
    
    (修正後の本来のエラーメッセージ)
    db1=# SELECT 'doy'::timestamptz;
    ERROR:  invalid input syntax for type timestamp with time zone: "doy"
    
  31. 正規表現照合中にクエリキャンセルのチェックをさらに追加しました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  32. 正規表現処理がより迅速に中断要求に応じるようになります。

  33. 正規表現、SIMILAR TO、LIKE の照合に再帰深度の保護が加えられました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  34. ある種の検索パターンと低いスタック深度制限により、スタックオーバーランによるクラッシュに至るおそれがありました。

  35. 正規表現の実行で無限ループをひき起こす可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  36. 一見ゼロ長文字列にマッチするけれども実際は後方参照によりマッチしないという検索パターンで無限ループに至る可能性がありました。

    SELECT 'a' ~ '$()|^1';  -- f
    SELECT 'a' ~ '.. ()|1'; -- f
    SELECT 'a' ~ '()*1';    -- t
    SELECT 'a' ~ '()+1';    -- t
    

    修正前バージョンでは上記のパターンマッチで無限ループに陥ります。

  37. 正規表現の実行で、たとえマッチがゼロ長であったとしても、数量指定を含む括弧で捕捉されたマッチデータを正しく記録するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
  38. 正規表現のコンパイルでメモリ不足によるクラッシュの可能性があり、修正されました。 (Andreas Seltenreich) (9.4)(9.3)(9.2)(9.1)(9.0)
  39. メモリ取得に失敗した場合の処理に不備があり、メモリ不足状態のサーバにおいて、NULLポインタ参照によるクラッシュを招く可能性がありました。

  40. 低確率で生じる正規表現の実行時のメモリリークが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  41. トランザクションがアボートした際のロック解放処理における、稀なメモリ不足時の障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  42. メモリ不足時にアサート失敗またはクラッシュをひき起こす可能性がありました。

  43. 小さい work_mem設定でタプルストアを使用する場合に「unexpected out-of-memory situation during sort」エラーが生じる問題が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  44. タプルストアとは SQL処理過程で一時的にデータを保持する内部的な仕組みです。

  45. qsort におけるごく稀なスタックオーバーランが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  46. ここでの qsort は、ソート処理の内部実装の一つで、いわゆるクイックソートを実装しています。本障害によりクラッシュの可能性がありました。

  47. 大きな work_mem 設定でのハッシュ結合にて、無効なメモリ割り当て要求サイズでエラーになることがあり、修正されました。 (Tomas Vondra, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  48. 「ERROR: invalid memory alloc request size」をひき起こすことがありました。

  49. プランナ関連の各種障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  50. これら誤りは、間違った応答を返したり、アサート失敗したり、奇妙なプランナエラーを出したりするであろう不適切なクエリ実行プランを導きます。

    (本障害のプランナエラー例)
     ERROR: could not devise a query plan for the given query
     ERROR: could not find pathkey item to sort
     ERROR: plan should not reference subplan's variable
     ERROR: failed to assign all NestLoopParams to plan nodes
    
  51. 大きな継承セットにおける UPDATE/DELETE のプランナ性能が改善しました。 (Tom Lane, Dean Rasheed) (9.4)(9.3)(9.2)
  52. これまで、継承テーブル数に対して O(N^2) 処理を要する箇所がありました。

  53. スタンバイ昇格トリガファイルがマスタプロセス(postmaster)起動時に確実に削除されるようになりました。 (Michael Paquier, Fujii Masao) (9.4)(9.3)(9.2)(9.1)
  54. 新たなスタンバイサーバを作るためのデータベースバックアップにトリガファイルが含まれていた場合に、望まない昇格が起きるのを防ぎます。

  55. マスタプロセス(postmaster) がシャットダウンするとき、pidファイルが削除される前に、確実にソケット毎のロックファイルが削除され、リッスンソケットが閉じられるようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  56. 外部スクリプトが pg_ctl stop のすぐ後に PostgreSQL を起動した場合に、競合して起動に失敗するのを防ぎます。

  57. たとえ immediate シャットダウンであっても、全ての子プロセスがいなくなるまではマスタプロセス(postmaster) は終了しないようになりました。 (Tom Lane) (9.4)
  58. クラッシュリカバリ中にクラッシュしたスタートアッププロセスの扱いが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  59. クラッシュリカバリ処理はスタートアッププロセスの中で行われます。これまで、データベース一貫性が無い状態でスタートアッププロセスがクラッシュした場合、新たにスタートアッププロセス起動を試みていましたが、これは通常は再度クラッシュすることになり、無限ループに至ります。

    スタートアップ中のクラッシュの後は自動再起動せず、終了するようになります。

  60. マルチトランザクション周回に対する緊急自動VACUUM がより頑健になりました。 (Andres Freund) (9.4)(9.3)
  61. これまでは必要でも必ずしも自動VACUUM が駆動されないというケースがありました。

  62. シグナルを送ろうとしたら autovacuum worker プロセスが既にいなくなっていた場合に警告を出さないようになりました。また、自動VACUUM 関連シグナルのログ出力が減りました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  63. 相手プロセスが居ない場合に「WARNING: could not send signal to process ...」が出ていました。 また、ロック競合した自動VACUUM をキャンセルする際に発生する「LOG: sending cancel to blocking autovacuum PID ...」メッセージが、DEBUG1 レベルに変更されました。

  64. サーバ時計が大きく戻ったときに、autovacuum launcherプロセスが過度に長く休止するのが防止されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  65. GIN インデックスの挿入保留リストのクリーンアップがキャンセル要求により確実に割り込み可能になりました。 (Jeff Janes) (9.4)(9.3)(9.2)(9.1)(9.0)
  66. このクリーンアップ処理は通常 GIN インデックスを持つカラムの INSERT、UPDATEで発生します。

  67. GIN インデックスで全てゼロのページが再利用可能になりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  68. このようなページはクラッシュ後にできることがあります。これまで全てゼロのページは再利用されず、無駄に領域を占めていました。

  69. SP-GiST インデックスにおける全てゼロのページの扱いが修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)
  70. VACUUM でこのようなページを再利用しようとしますが、WAL出力を伴うクラッシュセーフな方法で処理していませんした。

  71. サブトランザクション、マルチトランザクションの切捨て処理が修正されました。 (Thomas Munro) (9.4)(9.3)(9.2)(9.1)(9.0)
  72. 「LOG: could not truncate directory "...": apparent wraparound」メッセージが不必要に出力されることがありました。なお、修正前においてもログメッセージを出す以外は無害です。

  73. PL/pgSQL エラーのコンテキストメッセージで CONTINUE と MOVE のステートメントタイプを誤って報告していたのが修正されました。 (Pavel Stehule, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  74. CONTINUE であるべきところが EXIT と、MOVE であるべきところが FETCH と報告されていました。

    ERROR:  ...(何らかメッセージ)...
    CONTEXT:  PL/pgSQL function myfunc() line 123 at FETCH (← この部分)
    
  75. PL/Perl が非ASCII のエラーメッセージ文面を正しく扱うように修正されました。 (Alex Hunsaker) (9.4)(9.3)(9.2)(9.1)
  76. PL/Python でレコード結果の文字列表現を返すときにクラッシュする障害が修正されました (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  77. PL/Tcl で malloc() 呼び出し失敗のチェックを怠っているいくつかの箇所が修正されました。 (Michael Paquier, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  78. contrib/isn で 979 から始まる ISBN-13 番号の出力が修正されました。 (Fabien Coelho) (9.4)(9.3)(9.2)(9.1)
  79. (9790 ではなく) 979 から始まる EAN は ISBN と見做せますが、10桁形式ではなく、新しい13桁の形式で出力される必要がありました。

    (修正前)
    db1=# SELECT ('9791234567896'::EAN13)::ISBN;
        isbn
    -------------
     123456789-X
    (1 row)
    
    (修正後)
    db1=# SELECT ('9791234567896'::EAN13)::ISBN;
          isbn
    -----------------
     979-123456789-6
    (1 row)
    
  80. contrib/pg_stat_statements の問い合わせ文字列のガベージコレクションが改良されました。 (Peter Geoghegan) (9.4)
  81. 問い合わせ文字列が格納される外部ファイルは巨大なサイズに膨らむことがありえました。これまではファイルサイズが一度 1GB を超えると読み込みできませんでした。このサイズ上限が引き上げられ、また、読み込み失敗したときにファイルをリセットするようになりました。

  82. contrib/postgres_fdw で照合関連の判定処理が改善されました。 (Tom Lane) (9.4)(9.3)
  83. 目に見える変化としては、varcharカラムを含む比較が以前より多くのケースでリモートサーバに送られて実行されるようになります。

  84. libpq でメモリ不足状態のときの処理が改善されました。 (Michael Paquier, Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  85. これまでそのように報告していなかった箇所でメモリ割り当てに失敗したときに「out of memory」とエラーメッセージを出すようになりました。

  86. ecpg でメモリリークと、メモリ不足ケースのチェックが欠けている箇所があり、修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  87. psql でロケールを意識した数の出力形式について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  88. 「pset numericlocale on」を指定した場合に一部のケースで誤動作をしていました。

    (修正前の障害動作例)
    =# pset numericlocale on
    Locale-adjusted numeric output is on.
    
    =# SELECT 1000000::real;
     float4
    --------
     1e,+06
    (1 row)
    
    =# SELECT 10000::money;
        money
    --------------
     $,10,,000.00
    (1 row)
    
  89. psql で現在の接続が無いときに c コマンドでクラッシュするのが防止されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  90. (クラッシュ例 - サーバ側からの強制切断後に c 実行)
    
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    !> c db1 dbuser1 localhost 5432
    セグメンテーション違反です (コアダンプ)
    
  91. pg_dump が継承されたテーブルの NOT VALID の CHECK制約を正しく扱うようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
  92. リストアするとエラーが生じる誤ったダンプを出力することがありました。

  93. pg_dump のディレクトリ出力フォーマットでデフォルトの zlib 圧縮レベル指定について修正されました。 (Andrew Dunstan) (9.4)(9.3)(9.2)(9.1)
  94. これまでマニュアルに記載された「中間レベル」ではなく、速さ優先の圧縮レベルがデフォルト動作になっていました。

  95. tarフォーマット出力の pg_dump で作られる一時ファイルのファイルモードが誰でも読み取り可能とならないようになりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  96. pg_dump と pg_upgrade が postgres や template1 データベースがデフォルトテーブルスペース以外にある場合に対応するように修正されました。 (Marti Raudsepp, Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  97. pg_dump が旧バージョン PostgreSQL からのダンプでオブジェクト権限を正常に扱うように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  98. PostgreSQL 9.2 より前のサーバからデータ型をダンプするとき(※1)、あるいは、7.3 より前のサーバから関数や手続き言語をダンプするとき、pg_dump は、所有者の権限を剥奪して代わりに PUBLIC に全ての権限を与えるようなGRANT/REVOKE コマンドを出力していました。

    該当するのは USAGE と EXECUTE 権限だけですのでセキュリティ問題ではありません。この場合はデフォルト権限状態のままにするように修正しました。

    ※1 これは 9.2.x、9.3.x、9.4.x の場合のみ
    
  99. pg_dump がシェル型をダンプするように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  100. シェル型は未だ定義が無いプレースホルダとして名前だけ与えられたデータ型です。

  101. pg_dump ほかいくつかのクライアントプログラムで影響度の低いメモリリーク等が修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  102. クエリや pgbench自身が固まった場合の pgbench の進捗報告の振る舞いが修正されました。 (Fabien Coelho) (9.4)
  103. Alpha アーキテクチャむけのスピンロックのアセンブリコードが修正されました。 (Tom Lane) (9.4)
  104. PPC アーキテクチャむけのスピンロックのアセンブリコードが AIX のネイティブアセンブラに対応するように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  105. AIX でこれまで単に使えるものと想定していた -qlonglong コンパイラオプションをテストするようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  106. AIX で実行時にシンボル解決できるようにする -Wl,-brtllib リンクオプションを使うようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  107. コンパイラバグのため 32bit xlc でインライン関数展開を使わないようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  108. 必要に応じて sched_yield() むけに librt を使うようになりました。いくつかの Solaris バージョンで該当します。 (Oskari Saarenmaa) (9.4)(9.3)(9.2)(9.1)(9.0)
  109. UHC エンコーディングを Windows コードページ 949 として変換するようになりました。 (Noah Misch) (9.4)
  110. これにより、データベースに紐づかないプロセス(postmaster等)から非ASCII のログメッセージが出るのを修正しました。

  111. Windows でトランザクション外での UTF16 への文字エンコーディング変換(ログメッセージ用など) で失敗するのが防止されました。 (Noah Misch) (9.4)
  112. setlocale() の返し値をコピーしないことによる、マスタープロセス(postmaster) の起動失敗が修正されました。 (Noah Misch) (9.4)
  113. 本現象は ANSI コードページを CP936 (中国語 簡体字/PRC) に設定した Windows で報告され、他のマルチバイトコードページでも発生するとみられます。

  114. Windows の install.bat スクリプトについて、空白文字を含む対象ディレクトリ名の処理が修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  115. PostgreSQLバージョン番号の数値表現(90405 など) が、拡張モジュールのMakefile で VERSION_NUM 変数として利用可能になりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  116. タイムゾーンデータファイルが tzdata release 2015g に更新されました。 (9.4)(9.3)(9.2)(9.1)(9.0)
  117. ケイマン島、フィジー、モルドバ、モロッコ、ノーフォーク島、北朝鮮、トルコ、ウルグアイの夏時間方式が変更されました。新しいタイムゾーン名としてカナダ・ノーザンロッキーの America/Fort_Nelson が加わりました。

  118. 9.3 以降で加わったリソース所有者ごとのロックキャッシュが後方適用されました。 (Jeff Janes) (9.2)(9.1)
  119. pg_dump で多数のテーブルをダンプするときの性能を改善します。

  120. contrib/sepgsql の SELECT INTO 命令の扱いが修正されました。 (Kohei KaiGai) (9.2)
  121. プランナにおけるあいまいパスコストの同点決勝ルールが後方適用されました。 (Tom Lane) (9.1)(9.0)
  122. 本変更により、同コストプランの選択においてプラットフォーム固有の振る舞いを避けることができます。