このリリースは 9.1.21 からの修正リリース(2016年5月12日リリース)です。
9.1.x からのアップデートではダンプ、リストアは不要です。
また、9.1.16 より前のバージョンからアップデートを行う場合は 9.1.16 に関する技術情報 を参照してください。
PostgreSQL 9.1.21 から 9.1.22 への変更点
9.5.3、9.4.8、9.3.13、9.2.17、9.1.22 の各バージョンが同時にリリースされており、
本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を
項目末尾に括弧書きで記載しています。
- OpenSSLのエラーキューを既にクリアされているとみなすのでなく、OpenSSL呼び出し前にクリアするようになりました。また、確実に呼出し後にクリアしておくようにしました。 (Peter Geoghegan, Dave Vitek, Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)(9.1)
- LEFT JOIN の右手側の中の FULL JOIN で、プランナエラー「ERROR: failed to build any N-way joins」が出るのが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- 多段の入れ子ループ内における等価クラステストの誤った扱いが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
- operator_precedence_warning = on のときの稀なパーサエラーが修正されました。 (Tom Lane) (9.5)
- GINインデックススキャンでの問い合わせ処理内のメモリリークが修正されました。 (Julien Rouhaud) (9.5)(9.4)
- GINインデックス挿入において、問い合わせ処理内のメモリリークと、インデックス破損の可能性が修正されました。 (Tom Lane) (9.5) (9.4)
- to_timestamp() における整形コード TH、th、Y,YYY に誤動作の可能性があり、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- 「値 演算子 ANY ( 配列 )」という構造の「配列」が副問い合わせである場合について、ルールとビューのダンプが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- ALTER SYSTEM パラメータ値で改行が禁止されました (Tom Lane) (9.5)(9.4)
- ALTER TABLE ... REPLICA IDENTITY USING INDEX で、OID のインデックスが指定された場合でも適切に動作するように修正されました。 (David Rowley) (9.5)(9.4)
- テーブルスペースのシンボリックリンクを削除するのに失敗した後に起きる可能性があった誤動作を回避するようになりました。 (Tom Lane) (9.5)
- アラインメントにうるさいプラットフォーム上でのロジカルデコーディングのクラッシュが修正されました。 (Tom Lane, Andres Freund) (9.5)(9.4)
- walsenderプロセスが停止しようとしている間、receiverからのフィードバックのためのリクエストが繰り返されるのを回避するようになりました。 (Nick Cleaton) (9.5)(9.4)
- pg_regress が PGCTLTIMEOUT環境変数で指定された起動タイムアウトを使うようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_upgrade が、拡張モジュールの一つだけの演算子クラスを含む演算子族の所属を正しくリストアできるように、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_upgrade が、新クラスタの TOAST規則が旧クラスタと異なるときに失敗しないように、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)
- IBM の XLCコンパイラを使ったときの PPCアーキテクチャむけアトミック操作が修正されました。 (Noah Misch) (9.5)
- --disable-spinlocks を指定したビルドから使われる SysVセマフォの数を減らしました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
- NetBSD のライブラリ関数との衝突を避けるため、内部関数 strtoi() が strtoint() に名前変更されました。 (Thomas Munro) (9.5)(9.4)(9.3)(9.2)(9.1)
- Windows における bind()、listen() からのエラー報告が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- Visual Studio むけビルドスクリプトで、コンパイラ出力の verbosity設定(冗長さ)を detailed から normal に減らしました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
- Visual Studio 2015 でのビルドをサポートしました。 (Michael Paquier, Petr Jelínek) (9.5)
- Visual Studio 2013 で正しく動作するように putenv() を修正しました。 (Michael Paquier) (9.5)(9.4)(9.3)
- Windows の FormatMessage() 関数の安全でない可能性がある利用を避けるようにしました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
- タイムゾーンデータが tzdata release 2016d に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
- 9.4系でのメモリバリアコードの変更を 9.2 と 9.3 にバックポートしました。 (Tom Lane) (9.3)(9.2)
この変更は単一プロセス内に OpenSSLを使った複数の接続があって、エラーキューをクリアするときの規則が一貫していない場合の問題を防止します。
具体的には、クライアントアプリケーションが、OpenSSL の PHP、Python、または Ruby によるラッパーを使った SSL接続と並行して、libpq で SSL接続を使用した場合に、障害が報告されました。OpenSSL を使用する命令で予想外のエラーが発生します。
サーバ内でも、拡張モジュールが SSL接続をしにいく場合には同様の問題が起きる可能性があります。
メッセージ中の N-way の N には実際には数字が入ります。
「LEFT JOIN の右手側の中の FULL JOIN」とは以下のような形状の SQL を意味します。
SELECT * FROM (SELECT 1 AS id) AS xx LEFT JOIN (SELECT 1 AS id) AS a1 FULL JOIN (SELECT 1 AS id) AS yy ON (a1.id = yy.id) ON (xx.id = coalesce(yy.id));
X.X = Y.Y = Z.Z のような 3つ以上からなる値の等価クラスが与えられたとき、同値であるようにするために必要な検査の一部を、プランナが無視する可能性があり、出力される結合結果が WHERE句を満たさないことがありえました。
様々な理由により実際には誤ったプランは滅多に選択されません。そのため、本障害は長い間みつかりませんでした。
以下のようなプラン形状のときに該当します。
Nested Loop -> Scan X -> Nested Loop -> Scan Y -> Scan Z Filter: Z.Z = X.X
以下に発生例を示します。
db1=# SELECT (ARRAY[])::text[]; array ------- {} (1 row) db1=# SET operator_precedence_warning TO on; SET db1=# SELECT (ARRAY[])::text[]; ERROR: cannot determine type of empty array db1=# SELECT ARRAY[]::text[]; array ------- {} (1 row)
このメモリリークは単純な問い合わせにおいては通常は大きな量になりません。しかし、大きな maintenance_work_mem 値で巨大な GINインデックスを作成するときには、かなりの量になることがありえます。
これらが入力文字列の終端を超えた参照をして、以降の整形コードでゴミが読み取られるおそれがありました。
また、本障害をデータ露出させる攻撃に使うことは極めて困難と判断されました。
実行するとエラーになる誤った定義がダンプ出力されていました。以下に障害動作例を示します。
(正常に実行できる SQL) db1=# SELECT 'c'::text = ANY ((SELECT array['a','b','c']::text[])::text[]) c1; c1 ---- t (1 row) db1=# CREATE VIEW v1 AS SELECT 'c'::text = ANY ((SELECT array['a','b','c']::text[])::text[]) c1; (ビュー定義して、定義を出力すると変形している) db1=# SELECT pg_get_viewdef('v1', true); pg_get_viewdef -------------------------------------------------------------------------------------------------------- SELECT 'c'::text = ANY ((( SELECT ARRAY['a'::text, 'b'::text, 'c'::text] AS "array"))) AS c1; (1 row) (これを再度定義に適用するとエラーになる) db1=# CREATE VIEW v1_restore AS SELECT 'c'::text = ANY ((( SELECT ARRAY['a'::text, 'b'::text, 'c'::text] AS "array"))) AS c1; ERROR: operator does not exist: text = text[]
設定ファイルのパーサは文字列リテラル中に改行が含まれることに対応していません。したがって、ALTER SYSTEM でも禁止すべきでした。
WITH OIDS を指定したテーブルの OID列のインデックスを指定した場合に、クラッシュや奇妙なメッセージが生じることがありました。
トランザクションが溢れてディスクに書き出されるだけの大きさであり、かつ、トランザクション中で主キーが変更される場合に限って、障害が発生します。
一つ前のマイナーリリースで pg_ctl が PGCTLTIMEOUT を参照するようになっていて、これと一貫性を持たせるための変更です。遅いマシンでのテストを容易にします。
このような場合、演算子族は新しいデータベースにリストアされますが、拡張モジュールの一部であるとマークされませんでした。即座には悪影響は生じませんが、後に pg_dump を実行して、それをリストアする時に(無害ですが)エラーが生じます。
pg_upgrade には、あるテーブルに旧バージョンでは TOASTテーブルが無く、新PostgreSQLバージョンではそのテーブルは TOASTテーブルを持つべきという場合を扱う処理実装が含まれていました。
この実装が壊れていたため、このような場合には何もしないように修正されました。実際のところ、アップグレード後のクラスタで旧バージョンの規則にしたがってテーブルに付随する TOASTテーブルが無かったとしても、特に問題ないと考えられます。
ソケットエラーについて Windows と Unix のエラー番号変換が拡充されました。これまで「could not bind IPv4 socket: No error」といったエラーが出ていたケースで有益なエラーメッセージが得られるようになります。
VS2015 でビルドされたプログラムは、Windows Vista より以前の Windows では動作しません。(locale 判定の方法が変更されたため)
FORMAT_MESSAGE_IGNORE_INSERTS フラグを適切な箇所で使います。既知のバグはありませんが、注意するのは良いことです。
ロシアとベネズエラの夏時間の変更。新しいゾーン名 Europe/Kirov と Asia/Tomsk があり、これらの地域は、隣接する地域とは異なるタイムゾーンの歴史を持っています。
これらの変更は 9.4以前のブランチでは元々は不要でした。しかし最近、バリアコードを正しく動作させる修正がバックパッチされました。IA64(iccを使った時), HPPA, Alpha のプラットフォームが影響を受けます。