2014-07-24
このリリースは9.3.4に対し、各種不具合を修正したものです。 9.3メジャーリリースにおける新機能については、E.30. リリース9.3を参照してください。
9.3.Xからの移行ではダンプ/リストアは不要です。
しかしながら、本リリースでは、pg_upgradeのロジックエラーや、いくつかのGiSTインデックスのインデックス破損問題を修正しています。 下記に示すはじめの2つの変更点を確認し、使用しているインストレーションが影響を受けるか、その場合どのような処置を施すべきか判断してください。
また、9.3.4よりも前のリリースからアップグレードする場合は、E.26. リリース9.3.4を参照して下さい。
pg_upgradeにおいて、initdbにより残されたpg_multixact
ファイルを削除しました。(Bruce Momjian)
9.3.5以前のバージョンのpg_upgradeでデータベースクラスタを9.3にアップグレードした場合、
残るべきではない$PGDATA/pg_multixact/offsets/0000
ファイルが残っており、
これはいずれVACUUM
コマンドで問題を引き起こす原因になっていました。
しかしながら、一般的なケースではこのファイルは実質的に有効であり、削除すべきではありません。
この問題があるかどうかは、以下のクエリをスーパーユーザでクラスタのどのデータベースにでも実行することで確認できます。
WITH list(file) AS (SELECT * FROM pg_ls_dir('pg_multixact/offsets')) SELECT EXISTS (SELECT * FROM list WHERE file = '0000') AND NOT EXISTS (SELECT * FROM list WHERE file = '0001') AND NOT EXISTS (SELECT * FROM list WHERE file = 'FFFF') AND EXISTS (SELECT * FROM list WHERE file != '0000') AS file_0000_removal_required;
このクエリがt
が返した場合、手動で$PGDATA/pg_multixact/offsets/0000
ファイルを削除してください。
クエリがf
を返した場合は、何もしないでください。
contrib/btree_gist
拡張モジュールにおけるbit
カラムのインデックスの初期化パディングバイトを修正しました。
(Heikki Linnakangas)
このエラーは、等価であるべき値を等価と見なさないことが原因で、正しくないクエリー結果を引き起こします。
bit
型またはbit varying
型のカラムにGiSTインデックスを使っている場合、このアップデート適用後にREINDEX
が必要です。
GINリストページを削除した際、ページを破損から保護します。(Heikki Linnakangas)
インデックスのページ更新をディスクへの書き込み中にシステムクラッシュが発生した場合、インデックス破損が起こる可能性を防ぐ修正です。
WALからの更新を再実行中にGiSTインデックスページのリンク先を削除しません。(Heikki Linnakangas)
このエラーはホットスタンバイ中にGiSTインデックススキャンを実施した場合、一時的に間違った回答を引き起こす可能性がありました。
SP-GiSTテキストインデックスへの挿入中に無限ループに陥る稀なケースを修正しました。(Tom Lane)
-|-
(隣接範囲)演算子を使ったSP-GiSTインデックス検索からの応答が間違っているのを修正しました。(Heikki Linnakangas)
pg_multixact/members
での周回データの処理を修正しました。(Álvaro Herrera)
pg_multixact
の切り詰めをVACUUM
中ではなく、チェックポイント中に行うようにしました。(Álvaro Herrera)
この変更により、クラッシュ後のWALリプレイにおいて、まだ必要とされるかもしれないpg_multixact
セグメントが削除されないことを保証しました。
WALリカバリー後にall-visibleフラグが不整合を起こす可能性があったのを修正しました。(Heikki Linnakangas)
ReceiveSharedInvalidMessages
関数を入れ子で呼ばれた場合、キャッシュの無効化が正しくない可能性があり、修正しました。(Andres Freund)
タプル更新の際、他プロセスによって同時にロックされ競合状態が発生するのを修正しました。(Andres Freund, Álvaro Herrera)
継承された子テーブルを読み込むUNION ALL
上のサブクエリによって、
プランナが「could not find pathkey item to sort」エラーになる障害を修正しました。
ターゲットリストに複数行を返す関数がある場合、サブクエリの出力が一意であると決めつけないようにしました。(David Rowley)
この見落としはWHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y)
のような構成で最適化ミスを引き起こす可能性がありました。
可能であればAND
/OR
条件の入力から null定数を除去するようにプランナを改善しました。(Tom Lane)
より積極的にパラメータ置換をすることにより、9.2以上の版において古いバージョンのものより悪いプランになるかもしれなかったのを、この変更で修正しました。
同等のVARIADIC
型の関数呼び出しと非VARIADIC
型の関数呼び出しを、プランナが同等の物として見なすことを保証しました。(Tom Lane)
この不具合では、例えば可変引数関数に対して要素インデックスを使うことに失敗する可能性がありました。 このようなインデックスを使うべき可変引数関数においては、インデックス或いはビューの再生成が必要でした。 この修正は既存の9.3がインストールされたシステムでも有効です。
json_populate_recordset()
とそれに類する関数において、入れ子のJSON
オブジェクトの扱いを修正しました。(Michael Paquier, Tom Lane)
入れ子のJSON
オブジェクトは出力表示ではなく、親オブジェクトの前フィールドの結果であるべきでした。
to_json()
および関連する関数で、入力型カテゴリの識別を修正しました。(Tom Lane)
JSON
の結果内でmoney
フィールドのクォートが不十分であることが知られており、他のデータタイプでも同様に誤った結果になっていたかもしれません。
複合要素の構造体のTOASTフィールド取り出し失敗を修正しました。(Tom Lane)
これは、TOASTポインタが参照している値を得ずに他のテーブルにコピーできたケースの修正です。 オリジナルデータが後から削除された場合、不正な領域を指し示すポインタ(dangling pointer)となってしまい、「missing chunk number 0 for toast value ...」のようなエラーを引き起こしていました。
Appendプラン出力の行全体を参照することによって、「record type has not been registered」エラーとなる問題を修正しました。(Tom Lane)
カーソルを巻き戻している間にユーザ定義関数を呼び出した場合、クラッシュする可能性があり、修正しました。(Tom Lane)
FROM
句で関数が引数を評価する際のメモリリーク(クエリー処理内限定)を修正しました。(Tom Lane)
正規表現処理中のメモリリーク(セッション内限定)を修正しました。(Tom Lane、Arthur O'Dwyer、Greg Stark)
hungarian.stop
のデータエンコーディングエラーを修正しました。(Tom Lane)
default_with_oidsがtrueの場合でも、外部テーブルがOID付で作成される事を防止しました。(Etsuro Fujita)
実行中のトランザクションで行を挿入し、当該行を削除したサブトランザクションがロールバックした場合の、行の有効性チェックを修正しました。(Andres Freund)
これを行った後、同一トランザクション内で、CREATE INDEX
またはCLUSTER
が実行された場合、
問題(少なくとも誤ったワーニングが出て、最悪の場合、無限ループに陥る)の原因となります。
PREPARE TRANSACTION
中は、pg_stat_activity
のxact_start
の値を消去します。(Andres Freund)
PREPARE
コマンド実行後、トランザクション内に元のセッションは最早存在しないので、トランザクション開始時刻を表示し続けるべきではありません。
テキスト検索オブジェクトに対するREASSIGN OWNED
が失敗しないように修正しました。(Álvaro Herrera)
VACUUM FULL
中にpg_class
のrelminmxid
の値が戻らないようにしました。(Álvaro Herrera)
ルールとビューのダンプで読みやすさの向上と過度の空白文字を避けるためにインデントを減らしました。(Greg Stark, Tom Lane)
この変更は、複数のユニオンのリストのように、恐らくユーザが入れ子だと考えていないケースを含め、入れ子構造に貼り付けられるインデントの総量を減らすものです。 恐らく深い入れ子構造では空白文字の総量はO(N^2)で増加し続け、パフォーマンスの問題やメモリ不足エラーを起こすリスクもありました。 現在、インデントは40の剰余数に減らしています。これは最初は奇妙に見えますが、単純にインデントを制限するよりも可読性を保つことが出来ます。 ユニオンのリストを括弧で括った場合の冗長性も同様に減らされています。
後から追加されるカラムによってUSING
節にマッチする複数の入力カラムがもたらされる場合の、ルールとビューのダンプを修正しました。(Tom Lane)
削除された列を含んだ複合型の値を返すFROM
句を持つ関数のビュー出力を修正しました。(Tom Lane)
postmaster起動中はシグナルをブロックします。(Tom Lane)
これにより、例えば起動途中にSIGINTを受け取っても、postmasterは適切に後片付けを行う事ができるようになります。
IPアドレスの代わりにホスト名がpg_hba.conf
に定義されている場合、クライアントのホスト名検索処理を修正しました。(Tom Lane)
DNSの逆引き検索に失敗した場合、エントリーがマッチしない事を黙認せず報告することを保証しました。 また、DNS逆引き検索に失敗した場合に発生していた、ホスト名エントリー毎でなく、コネクション毎に検索する事を保証しました。
rootユーザでも postgres -C 変数
およびpostgres --describe-config
を使うことができるようにしました。(MauMau)
これらの操作はルートでのサーバ起動禁止に必要では無く、制限を緩和することによってpg_ctlが失敗する幾つかのシナリオを回避できます。
make check
で一時的に起動されたpostmasterのUNIXドメインソケットを保護します。(Noah Misch)
ローカルユーザはサーバのブートストラップスーパーユーザとしてソケットファイルにアクセス出来、接続可能でした。
そのため、任意のコードをテストを実行しているオペレーティングシステムのユーザとして実行可能でした。
これは既にCVE-2014-0067の中で指摘されていました。
この変更では、サーバのソケットを一時ファイルシステム/tmp
配下のモード0700のサブディレクトリに配置することで、リスクを防御します。
UNIXソケットがサポートされていないプラットフォーム、特にWindowsでは一時postmasterがローカルTCP接続を必要とするため、この危険性は残ります。
この変更の有益な影響は、DEFAULT_PGSOCKET_DIR
を上書きするビルドのmake check
テストが簡単になることです。
よく使われるデフォルトではない/var/run/postgresql
のようなファイルには、
ビルドユーザに書き込み権限がないために必要とされる回避策が、今後必要とされなくなります。
テーブルスペース作成のWALリプレイをWindowsで動作するように修正しました。(MauMau)
Windowsでソケット生成失敗の判定処理を修正しました。(Bruce Momjian)
Windowsで、設定ファイルから(log_connectionsのような)PGC_BACKENDパラメータ値を、新しい接続への適用を許可します。(Amit Kapila)
以前は、起動後にファイルのパラメータを変更しても反映されませんでした。
Windowsの実行パス名を適切にクオートします。(Nikhil Deshpande)
この見落としは、インストールパスにスペースと@
が両方含まれる場合、
Windowsでinitdbやpg_upgradeがエラーになる原因となっていました。
OS Xでlibpythonのリンクを修正しました。(Tom Lane)
これまでの方式では、Xcode 5.0とそれ以降で提供されているPythonライブラリでエラーになります。
クライアントが取り込むよりも速くサーバがデータを送り続けた場合、libpq のバッファが肥大化することを回避しました。(Shin-ichi Morita、Tom Lane)
libpqはOut of Memoryになるまで入力バッファの拡張を強要していた可能性がありました
(「lost synchronization with server」の報告は誤解を招いたかもしれません)。
一般的な環境下では、recv()
ループが取り込むよりもずっと早くデータが送られ続けるというのは、かなりこじつけで、
クライアントが人為的にスケジューラによる制約で遅くなっている場合に観測されているくらいです。
libpqのLDAP照会で、意図した通りのタイムアウトを保証しました。(Laurenz Albe)
char ポインタ
の配列を複数行返すFETCHステートメントがターゲットの場合、ecpgが正しく動作するように修正しました。また、その他の配列操作も修正しました。(Ashutosh Bapat)
テーブルの主キーに依存したマテリアライズドビューに対応するため、pg_dumpを修正しました。(Tom Lane)
これはビューのクエリーがGROUP BY
でリストを纏める機能を利用している場合に発生します。
pg_dumpはそれらを混同してしまい、マテリアライズドビューを通常のビューとしてダンプしていました。
pg_dumpallの-i
オプションのパースを修正しました。(Tom Lane)
pg_restoreの、古いスタイルのラージオブジェクトのコメント処理を修正しました。(Tom Lane)
9.0までのバージョンのpg_dumpで生成したアーカイブファイルで、ラージオブジェクトに数件以上のコメントが含まれている場合、 アーカイブファイルを直接データベースにリストアすると失敗していました。
新しいサーバではTOASTテーブルを作るが古いバージョンでは作らないケースについてpg_upgradeを修正しました。(Bruce Momjian)
この稀な状況により「relation OID mismatch」エラーを引き起こす可能性がありました。
pg_upgradeでpg_database
.datminmxid
と
pg_class
.relminmxid
の古いバージョンの値を保持するか、9.3以前からのアップグレード時に適切な値を代入します。
また、コアサーバの不適切な値を防ぎます。(Bruce Momjian, Álvaro Herrera, Tom Lane)
これらの変更は、新しいデータベースサーバ起動時にオートバキュームが直ちにクラスタの全内容をスキャンを要求する、 或いは固定されていないマルチトランザクションID(MXID)の追跡が完全に出来なくなるシナリオを防ぎます。
contrib/auto_explain
によってユーザのEXPLAIN
の出力が変化するのを防ぎました。(Tom Lane)
auto_explain
が有効な場合、EXPLAIN (ANALYZE, TIMING OFF)
コマンドを実行してもタイミング情報が出力される可能性がありました。
contrib/dblink
のクエリー実行範囲内でのメモリリークを修正しました。(MauMau, Joe Conway)
contrib/pgcrypto
関数で、処理が戻る前にスタック変数から機密情報を削除する事を保証します。(Marko Kreen)
contrib/pgstattuple
のpgstat_heap()
が解放済メモリを使わないようにしました。(Noah Misch)
contrib/uuid-ossp
モジュールで、呼び出し間でOSSP UUIDライブラリの状態をキャッシュします。(Tom Lane)
この改善はUUID生成の効率を上げ、/dev/urandom
から取り出すエントロピー量を減らします。
タイムゾーンデータファイルをtzdataリリース2014eに更新しました。 クリミア、エジプト、モロッコでの夏時間の変更が含まれます。