このリリースは 9.0.22 からの修正リリース(2015年10月8日リリース)です。
9.0.x からのアップデートではダンプ、リストアは不要です。
また、9.0.22 より前のバージョンからアップデートを行う場合は 9.0.22 に関する技術情報 を参照してください。
PostgreSQL 9.0.22 から 9.0.23 への変更点
9.4.5、9.3.10、9.2.14、9.1.19、9.0.23 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- jsonのパースでスタックオーバーフローが防止されました。 (Oskari Saarenmaa) (9.4)(9.3)
- pgcrypto拡張モジュールが crypt()関数の短すぎるソルトを検出して報告するように修正されました。 (Josh Kupershmidt) (9.4)(9.3)(9.2)(9.1)(9.0)
- 外側サブトランザクションに属するポータル(カーソル)が失敗した後のサブトランザクションのクリーンアップが修正されました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- commit_delay が有効であるとき WAL挿入の際にデッドロックする可能性があり、修正されました。 (Heikki Linnakangas) (9.4)
- UPDATE実行時に更新可能ビューから参照されている全てのリレーションが適切にロックされるようになりました。 (Dean Rasheed) (9.4)(9.3)
- リレーションのリレーションキャッシュinitファイルへの格納について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- SPIクエリ結果に多数の行を投入するとき、O(N^2) の所要時間を要する振る舞いを回避するようになりました。 (Neil Conway) (9.4)(9.3)(9.2)(9.1)(9.0)
- 読まれない通知が多数ある場合の LISTEN 開始の所要時間が改善されました。 (Matt Newell) (9.4)(9.3)(9.2)(9.1)(9.0)
- 多数の外部キー制約を変更したセッションでの性能問題が修正されました。 (Jan Wieck, Tom Lane) (9.4)(9.3)
- SSL再ネゴシエーションがデフォルトでは無効となりました。 (Michael Paquier, Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
- *_freeze_max_age パラメータの下限値が引き下げられました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
- サーバクラッシュを避けるため wal_buffers の上限を 2GB までに限定しました。 (Josh Berkus) (9.4)(9.3)(9.2)(9.1)(9.0)
- postgresql.conf の読み込みについて修正されました。 (Tom Lane) (9.4)(9.3)
- NUMERIC 値の掛け算における稀な内部オーバーフローが修正されました。 (Dean Rasheed) (9.4)(9.3)(9.2)(9.1)(9.0)
- レコード型、範囲型、json型、jsonb型、tsquery型、ltxtquery型、および、query_int型に関連する稀なスタックオーバーフローを防ぐようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- 日付時刻の入力において DOW と DOY の扱いが修正されました。 (Greg Stark) (9.4)(9.3)(9.2)(9.1)(9.0)
- 正規表現照合中にクエリキャンセルのチェックをさらに追加しました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 正規表現、SIMILAR TO、LIKE の照合に再帰深度の保護が加えられました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 正規表現の実行で無限ループをひき起こす可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 正規表現の実行で、たとえマッチがゼロ長であったとしても、数量指定を含む括弧で捕捉されたマッチデータを正しく記録するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
- 正規表現のコンパイルでメモリ不足によるクラッシュの可能性があり、修正されました。 (Andreas Seltenreich) (9.4)(9.3)(9.2)(9.1)(9.0)
- 低確率で生じる正規表現の実行時のメモリリークが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- トランザクションがアボートした際のロック解放処理における、稀なメモリ不足時の障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 小さい work_mem設定でタプルストアを使用する場合に「unexpected out-of-memory situation during sort」エラーが生じる問題が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- qsort におけるごく稀なスタックオーバーランが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 大きな work_mem 設定でのハッシュ結合にて、無効なメモリ割り当て要求サイズでエラーになることがあり、修正されました。 (Tomas Vondra, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- プランナ関連の各種障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 大きな継承セットにおける UPDATE/DELETE のプランナ性能が改善しました。 (Tom Lane, Dean Rasheed) (9.4)(9.3)(9.2)
- スタンバイ昇格トリガファイルがマスタプロセス(postmaster)起動時に確実に削除されるようになりました。 (Michael Paquier, Fujii Masao) (9.4)(9.3)(9.2)(9.1)
- マスタプロセス(postmaster) がシャットダウンするとき、pidファイルが削除される前に、確実にソケット毎のロックファイルが削除され、リッスンソケットが閉じられるようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- たとえ immediate シャットダウンであっても、全ての子プロセスがいなくなるまではマスタプロセス(postmaster) は終了しないようになりました。 (Tom Lane) (9.4)
- クラッシュリカバリ中にクラッシュしたスタートアッププロセスの扱いが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- マルチトランザクション周回に対する緊急自動VACUUM がより頑健になりました。 (Andres Freund) (9.4)(9.3)
- シグナルを送ろうとしたら autovacuum worker プロセスが既にいなくなっていた場合に警告を出さないようになりました。また、自動VACUUM 関連シグナルのログ出力が減りました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- サーバ時計が大きく戻ったときに、autovacuum launcherプロセスが過度に長く休止するのが防止されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
- GIN インデックスの挿入保留リストのクリーンアップがキャンセル要求により確実に割り込み可能になりました。 (Jeff Janes) (9.4)(9.3)(9.2)(9.1)(9.0)
- GIN インデックスで全てゼロのページが再利用可能になりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- SP-GiST インデックスにおける全てゼロのページの扱いが修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)
- サブトランザクション、マルチトランザクションの切捨て処理が修正されました。 (Thomas Munro) (9.4)(9.3)(9.2)(9.1)(9.0)
- PL/pgSQL エラーのコンテキストメッセージで CONTINUE と MOVE のステートメントタイプを誤って報告していたのが修正されました。 (Pavel Stehule, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- PL/Perl が非ASCII のエラーメッセージ文面を正しく扱うように修正されました。 (Alex Hunsaker) (9.4)(9.3)(9.2)(9.1)
- PL/Python でレコード結果の文字列表現を返すときにクラッシュする障害が修正されました (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- PL/Tcl で malloc() 呼び出し失敗のチェックを怠っているいくつかの箇所が修正されました。 (Michael Paquier, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
- contrib/isn で 979 から始まる ISBN-13 番号の出力が修正されました。 (Fabien Coelho) (9.4)(9.3)(9.2)(9.1)
- contrib/pg_stat_statements の問い合わせ文字列のガベージコレクションが改良されました。 (Peter Geoghegan) (9.4)
- contrib/postgres_fdw で照合関連の判定処理が改善されました。 (Tom Lane) (9.4)(9.3)
- libpq でメモリ不足状態のときの処理が改善されました。 (Michael Paquier, Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- ecpg でメモリリークと、メモリ不足ケースのチェックが欠けている箇所があり、修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- psql でロケールを意識した数の出力形式について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- psql で現在の接続が無いときに c コマンドでクラッシュするのが防止されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump が継承されたテーブルの NOT VALID の CHECK制約を正しく扱うようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
- pg_dump のディレクトリ出力フォーマットでデフォルトの zlib 圧縮レベル指定について修正されました。 (Andrew Dunstan) (9.4)(9.3)(9.2)(9.1)
- tarフォーマット出力の pg_dump で作られる一時ファイルのファイルモードが誰でも読み取り可能とならないようになりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump と pg_upgrade が postgres や template1 データベースがデフォルトテーブルスペース以外にある場合に対応するように修正されました。 (Marti Raudsepp, Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump が旧バージョン PostgreSQL からのダンプでオブジェクト権限を正常に扱うように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump がシェル型をダンプするように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump ほかいくつかのクライアントプログラムで影響度の低いメモリリーク等が修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)
- クエリや pgbench自身が固まった場合の pgbench の進捗報告の振る舞いが修正されました。 (Fabien Coelho) (9.4)
- Alpha アーキテクチャむけのスピンロックのアセンブリコードが修正されました。 (Tom Lane) (9.4)
- PPC アーキテクチャむけのスピンロックのアセンブリコードが AIX のネイティブアセンブラに対応するように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- AIX でこれまで単に使えるものと想定していた -qlonglong コンパイラオプションをテストするようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- AIX で実行時にシンボル解決できるようにする -Wl,-brtllib リンクオプションを使うようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- コンパイラバグのため 32bit xlc でインライン関数展開を使わないようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- 必要に応じて sched_yield() むけに librt を使うようになりました。いくつかの Solaris バージョンで該当します。 (Oskari Saarenmaa) (9.4)(9.3)(9.2)(9.1)(9.0)
- UHC エンコーディングを Windows コードページ 949 として変換するようになりました。 (Noah Misch) (9.4)
- Windows でトランザクション外での UTF16 への文字エンコーディング変換(ログメッセージ用など) で失敗するのが防止されました。 (Noah Misch) (9.4)
- setlocale() の返し値をコピーしないことによる、マスタープロセス(postmaster) の起動失敗が修正されました。 (Noah Misch) (9.4)
- Windows の install.bat スクリプトについて、空白文字を含む対象ディレクトリ名の処理が修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- PostgreSQLバージョン番号の数値表現(90405 など) が、拡張モジュールのMakefile で VERSION_NUM 変数として利用可能になりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- タイムゾーンデータファイルが tzdata release 2015g に更新されました。 (9.4)(9.3)(9.2)(9.1)(9.0)
- 9.3 以降で加わったリソース所有者ごとのロックキャッシュが後方適用されました。 (Jeff Janes) (9.2)(9.1)
- contrib/sepgsql の SELECT INTO 命令の扱いが修正されました。 (Kohei KaiGai) (9.2)
- プランナにおけるあいまいパスコストの同点決勝ルールが後方適用されました。 (Tom Lane) (9.1)(9.0)
アプリケーションが PostgreSQL の json や jsonb の値を任意のユーザ入力から構成する場合、アプリケーションユーザは確実にサーバをクラッシュさせることができて、一時的なサービス不能をひき起こせます。
ある種の無効なソルト引数はサーバーをクラッシュさせるか、数バイトのサーバメモリを露出させました。露出した数バイトに秘密情報が在るように仕込む攻撃の可能性は排除しませんが、実現性は低いと見られます。(CVE-2015-5288)
外側サブトランザクションのカーソルで実行された関数が、内側サブトランザクションで作られたリレーション(一時テーブル等)を参照することで、アサート失敗かクラッシュを引き起こすことがありました。
直近のマイナーリリースでの不注意により、システムインデックスpg_trigger_tgrelid_tgname_index が initファイルで除外されていました。その後のセッションでこのことが検出され、initファイルが壊れていると見なされ、initファイルが無視されます。この結果、新規接続での所要時間が顕著に劣化しました。
本バグ修正では加えて、将来の類似の誤りが見つかるようにする防止策がいくつか導入されました。
SPIクエリで結果行数が多いSQLを実行した場合に該当します。これまで必要メモリを追加するのに固定増分での追加確保をしていたため、処理回数が不要に多くなっていました。
LISTEN/NOTIFY利用時において、一部の遅れたリスナーのために通知が大量に溜まっている状態で新たなリスナーを加えると、それらの溜まった通知を読み飛ばしていくのに処理コストを要していました。
これは主に数千テーブルを持つデータベースのダンプをリストアするときに見られます。
理論的には SSL再ネゴシエーションを使うことは良い考えですが、実際のところ OpenSSLライブラリに起因するもの、PostgreSQLにおけるライブラリの使い方に起因するもの、の双方で多数の障害が見られました。
再ネゴシエーションは PostgreSQL 9.5 以降では削除されます。9.4 以前のバージョン系列では、postgresql.conf の ssl_renegotiation_limit のデフォルト値が無効を意味する 0 に変更されます。
主としてこれらパラメータに関するテストで時間がかからないようにするためですが、少ないディスクスペースにインストールする際にも価値があるかもしれません。
autovacuum_freeze_max_age 100000 → 10000 autovacuum_multixact_freeze_max_age 100000000 → 100000000 (9.3以降)
上記のように変更されました。
巨大な値を指定したとき整数オーバーフローによるクラッシュをひき起こしていました。なお、上限値 2GB は、実際には INT_MAX / XLOG_BLCKSZ の計算結果です。XLOG_BLCKSZ はビルド時の --with-wal-blocksize 指定値 × 1024 となります。
サーバ開始時にしか指定できないパラメータが postgresql.conf の中に複数回あらわれた場合に苦情がログ出力されないようになりました。pg_ctl reload を行ったときに以下のようなメッセージが出ていました。
LOG: parameter "..." cannot be changed without restarting the server
また、postgresql.conf のエラーを報告する際に include_dir 指定の後では行番号が誤って出力されており、修正されました。
NUMERIC型の掛け算の結果に誤った値が返る可能性がありました。
欠けていた max_stack_depth 設定値を超えていないかのチェック処理が、これらデータ型の各処理箇所に加えられました。
これらのトークンは日付時刻値では使えないはずですが、これまでは「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"
正規表現処理がより迅速に中断要求に応じるようになります。
ある種の検索パターンと低いスタック深度制限により、スタックオーバーランによるクラッシュに至るおそれがありました。
一見ゼロ長文字列にマッチするけれども実際は後方参照によりマッチしないという検索パターンで無限ループに至る可能性がありました。
SELECT 'a' ~ '$()|^1'; -- f SELECT 'a' ~ '.. ()|1'; -- f SELECT 'a' ~ '()*1'; -- t SELECT 'a' ~ '()+1'; -- t
修正前バージョンでは上記のパターンマッチで無限ループに陥ります。
メモリ取得に失敗した場合の処理に不備があり、メモリ不足状態のサーバにおいて、NULLポインタ参照によるクラッシュを招く可能性がありました。
メモリ不足時にアサート失敗またはクラッシュをひき起こす可能性がありました。
タプルストアとは SQL処理過程で一時的にデータを保持する内部的な仕組みです。
ここでの qsort は、ソート処理の内部実装の一つで、いわゆるクイックソートを実装しています。本障害によりクラッシュの可能性がありました。
「ERROR: invalid memory alloc request size」をひき起こすことがありました。
これら誤りは、間違った応答を返したり、アサート失敗したり、奇妙なプランナエラーを出したりするであろう不適切なクエリ実行プランを導きます。
(本障害のプランナエラー例) 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
これまで、継承テーブル数に対して O(N^2) 処理を要する箇所がありました。
新たなスタンバイサーバを作るためのデータベースバックアップにトリガファイルが含まれていた場合に、望まない昇格が起きるのを防ぎます。
外部スクリプトが pg_ctl stop のすぐ後に PostgreSQL を起動した場合に、競合して起動に失敗するのを防ぎます。
クラッシュリカバリ処理はスタートアッププロセスの中で行われます。これまで、データベース一貫性が無い状態でスタートアッププロセスがクラッシュした場合、新たにスタートアッププロセス起動を試みていましたが、これは通常は再度クラッシュすることになり、無限ループに至ります。
スタートアップ中のクラッシュの後は自動再起動せず、終了するようになります。
これまでは必要でも必ずしも自動VACUUM が駆動されないというケースがありました。
相手プロセスが居ない場合に「WARNING: could not send signal to process ...」が出ていました。 また、ロック競合した自動VACUUM をキャンセルする際に発生する「LOG: sending cancel to blocking autovacuum PID ...」メッセージが、DEBUG1 レベルに変更されました。
このクリーンアップ処理は通常 GIN インデックスを持つカラムの INSERT、UPDATEで発生します。
このようなページはクラッシュ後にできることがあります。これまで全てゼロのページは再利用されず、無駄に領域を占めていました。
VACUUM でこのようなページを再利用しようとしますが、WAL出力を伴うクラッシュセーフな方法で処理していませんした。
「LOG: could not truncate directory "...": apparent wraparound」メッセージが不必要に出力されることがありました。なお、修正前においてもログメッセージを出す以外は無害です。
CONTINUE であるべきところが EXIT と、MOVE であるべきところが FETCH と報告されていました。
ERROR: ...(何らかメッセージ)... CONTEXT: PL/pgSQL function myfunc() line 123 at FETCH (← この部分)
(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)
問い合わせ文字列が格納される外部ファイルは巨大なサイズに膨らむことがありえました。これまではファイルサイズが一度 1GB を超えると読み込みできませんでした。このサイズ上限が引き上げられ、また、読み込み失敗したときにファイルをリセットするようになりました。
目に見える変化としては、varcharカラムを含む比較が以前より多くのケースでリモートサーバに送られて実行されるようになります。
これまでそのように報告していなかった箇所でメモリ割り当てに失敗したときに「out of memory」とエラーメッセージを出すようになりました。
「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)
(クラッシュ例 - サーバ側からの強制切断後に 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 セグメンテーション違反です (コアダンプ)
リストアするとエラーが生じる誤ったダンプを出力することがありました。
これまでマニュアルに記載された「中間レベル」ではなく、速さ優先の圧縮レベルがデフォルト動作になっていました。
PostgreSQL 9.2 より前のサーバからデータ型をダンプするとき(※1)、あるいは、7.3 より前のサーバから関数や手続き言語をダンプするとき、pg_dump は、所有者の権限を剥奪して代わりに PUBLIC に全ての権限を与えるようなGRANT/REVOKE コマンドを出力していました。
該当するのは USAGE と EXECUTE 権限だけですのでセキュリティ問題ではありません。この場合はデフォルト権限状態のままにするように修正しました。
※1 これは 9.2.x、9.3.x、9.4.x の場合のみ
シェル型は未だ定義が無いプレースホルダとして名前だけ与えられたデータ型です。
これにより、データベースに紐づかないプロセス(postmaster等)から非ASCII のログメッセージが出るのを修正しました。
本現象は ANSI コードページを CP936 (中国語 簡体字/PRC) に設定した Windows で報告され、他のマルチバイトコードページでも発生するとみられます。
ケイマン島、フィジー、モルドバ、モロッコ、ノーフォーク島、北朝鮮、トルコ、ウルグアイの夏時間方式が変更されました。新しいタイムゾーン名としてカナダ・ノーザンロッキーの America/Fort_Nelson が加わりました。
pg_dump で多数のテーブルをダンプするときの性能を改善します。
本変更により、同コストプランの選択においてプラットフォーム固有の振る舞いを避けることができます。