技術情報
PostgreSQL 8.3.1 に関する技術情報
PostgreSQL 8.3 から 8.3.1 への変更点
リリース日:2008/03/17
掲載日:2008/04/02
8.3.1 は PostgreSQL 8.3 からの累積的な修正です。
以下に変更点をまとめます。本ドキュメントは PostgreSQL のリリースノートを元に作成しています。
8.3.X を利用している場合はダンプ/リストアは必要ありません。 ただし下記の Windows locale 問題にあてはまる場合は REINDEX が必要な場合があります。
- Windows のロケールの文字列比較が、異なる文字を同一のものと認識するケースに対応しました (Tom)
- 稀に起こる VACUUM FULL のバグを修正しました (Tom)
- 文字やビットを含む列の外部キー制約チェックの誤動作を修正しました (Tom)
- no-op の外部キー制約チェック時に、不必要なデッドロックエラーを回避するようにしました (Stephan Szabo, Tom)
- プリペアドクエリの再計画時にコアダンプが発生する可能性を修正しました (Tom)
- SPI を利用する関数を呼び出すクエリの再計画時に失敗する可能性を修正しました (Tom)
- 異なる型からなる列に対する行比較の失敗を修正しました (Tom)
- 長い間修正されていなかった "LISTEN" と "NOTIFY" の競合問題を修正しました (Tom)
- プリペアドトランザクション内での "LISTEN" と "UNLISTEN" を拒否するようにしました (Tom)
- プリペアドトランザクション内での一時テーブル削除を拒否するようにしました (Heikki)
- ハッシュインデックスを使うクエリでエラーが発生すると稀にクラッシュする問題を修正しました (Heikki)
- tsquery の誤った値の比較を修正しました (Teodor)
- 1バイトエンコーディングで ASCII 以外の文字を含む LIKE の誤動作を修正しました (Rolf Jentsch)
- xmlvalidate を無効にしました (Tom)
- 複数行を返す関数でのメモリリークの可能性を修正しました (Neil)
- encode(bytea, 'excape') 関数が上位ビットが設定されているバイト値の全てを \"nnn" の8進エスケープシーケンスに変換するようにしました (Tom)
- 紀元前の閏日の日付時間型入力を修正しました (Tom)
- "ALTER OWNER" 関連における "unrecognized node type" エラーを修正しました (Tom)
- "CREATE TABLE LIKE INCLUDING INDEXES" におけるテーブルスペース権限エラーを修正しました (Tom)
- ロックの待ちがアボートされたときに、 pg_stat_activity.waiting のフラグが確実に取り除かれるようにしました (Tom)
- Windows Vista におけるプロセス権限の操作を修正しました (Dave, Magnus)
- タイムゾーンデータファイルを tzdata 2008a に更新しました(チリにおける変更)。 また、VET(Venezuela)を UTC-4:00 から UTC-4:30 に変更しました (Tom)
- ecpg における配列の問題を修正しました (Michael)
- pg_ctl がコマンドラインオプションから postmaster のポート番号を正しく抽出できるように修正しました (Itagaki Takahiro, Tom)
- 最近の gcc バージョンで誤った最適化が行なわれないように "-fwrapv" を使うようにしました (Tom)
- "contrib/uuid-ossp" が MSVC でビルドできるようにしました (Hiroshi Saito)
この修正は Windows で UTF-8 エンコーディングのデータベースを利用しているユーザーにのみ適用します。 この修正は2年以上前に適用されていましたが、Windows UTF-8 は異なるコードパスを利用しており、更新されていませんでした。 もしも利用中のロケールが異なる文字列を同一と認識してしまう場合は、文字列カラムにすでに張られているインデックスを REINDEX で再構築する必要があるかもしれません。
異なるシステムカタログに対する並列の VACUUM FULL 処理間でデッドロックが起こる可能性が 8.2 から存在していましたが、修正
されました。8.3 では問題が悪化しており、デッドロックがコードのクリティカルな部分で発生することで ERROR ではなく PANIC となっていました。
また、VACUUM FULL が処理の途中で失敗してしまった場合、セッション間でのキャッシュが破壊されてしまう可能性もありました。
8.3 で入り込んだもう1つの VACUUM FULL に関するバグは、有効なタプルがないページを処理しているときにクラッシュ、
もしくはメモリ不足のエラーが出る可能性がありました。
参照列が互換性のある型の場合(例えば varchar)、誤った制約が適用される可能性がありました。
このバグは SQL の "PREPARE" ではなく、プロトコルレベルでのプリペア処理時に影響がありました。 よって JDBC、DBI などのクライアントドライバでプリペアドステートメントを多く使っていた場合に発生していました。
稀なケースで "LISTEN" を実行したばかりのセッションが、受け取るべき通知を受け取れない可能性がありました。
これは並列に実行されているトランザクションで実行された "NOTIFY" が遅れてコミットされていたことによります。
この修正による副作用は、コミットされていない "LISTEN" コマンドが pg_listener に現れなくなります。
コミットされていない "LISTEN" をpg_listener で確認している、という報告はいままでにありませんが、
以前の動作に依存するアプリケーションは影響を受ける可能性があります。
今までこれらの動作は許可されていましたが、起点となるバックエンドが "UNLISTEN" がコミットされない限り終了できないなど、 いくつかの望まれない結果を招いていました。
これは 8.1 では拒否されていましたが、8.2 と 8.3 でバグが混入してしまいました。
この機能は 8.3 以前に削除されているはずでしたが、コードが削除されずに残っていました。 これは権限のないユーザが、サーバがアクセスできる全てのファイルの最初の数バイトを読み取るために利用することができるので、 小さなセキュリティリスクがあります。
これはデータベースエンコーディングがマルチバイト向けの場合に問題を回避するために必要です。 この修正により、エンコードからの特定の結果に左右されるアプリケーションは影響を受ける可能性があります。
以前のコードは閏年の判定に誤りがありました。
具体的には、この修正で PostgreSQL サービスを Administrator ユーザー権限で起動できるようになりました。
以前は「pg_ctl start -w」を実行すると異なるポート番号の postmaster に接続しようとし、 誤った起動失敗のエラーが表示される可能性がありました。
これは PostgreSQL を gcc 4.3 以降でビルドするときに必要となります。


