このリリースは 9.1.19 からの修正リリース(2016年2月11日リリース)です。
9.1.x からのアップデートではダンプ、リストアは不要です。
また、9.1.16 より前のバージョンからアップデートを行う場合は 9.1.16 に関する技術情報 を参照してください。
PostgreSQL 9.1.19 から 9.1.20 への変更点
9.5.1、9.4.6、9.3.11、9.2.15、9.1.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- 正規表現での無限ループやバッファオーバーランの問題が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- ハッシュ結合で内側リレーションの一部タプルがまれに結合で欠ける場合があり、修正されました。 (Tomas Vondra, Tom Lane) (9.5)
- グループ化セットが使われる時は HAVING 句のプッシュダウンはされないようになりました。 (Andrew Gierth) (9.5)
- ON CONFLICT構文の WHERE句の SQL文再構成について、修正されました。 (Peter Geoghegan) (9.5)
- log_line_prefix 設定におけるエスケープ %h、%r を log_connections 設定によるメッセージにも機能するようにしました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- SSPI認証でトークンハンドルのリーク(クローズ漏れ)が修正されました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
- psql det コマンドでのパターン引数の解釈が修正されました。 (Reece Hart) (9.5)(9.4)(9.3)(9.2)(9.1)
- Windows における pg_ctl でサービス状態を確認して、ログメッセージの出力先を決めるようになりました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_dump が拡張モジュールに属するデータベースオブジェクトを処理するときの例外的なケースの障害がいくつか修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pg_dump におけるドメイン名の不適切なクオート付けが修正されました。 (Elvis Pranskevichus) (9.5)
- pg_dump がビューのトリガにそのルールの後に処理される必要があると印づけするようになり、パラレルpg_restore での失敗の可能性が予防されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- pgbench でスクリプトに指定された除算や剰余演算子の評価における例外的なオーバーフロー条件での浮動小数点例外が防止されました。 (Fabien Coelho, Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
- 9.3.x 以前のサーバに接続するときに pg_receivexlog が出力する無意味で混乱を招く警告メッセージが抑止されました。 (Marco Nenciarini) (9.5)
- plpython2 と plpython3 を両方使うときのダンプ読み込みの問題を回避するようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
- PL/Python の回帰テストが Python 3.5 で通るようになりました。 (Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)
- ある種の PL/Javaパラメータがスーパーユーザ以外から設定できてしまうのが防止されました。 (Noah Misch) (9.5)(9.4)(9.3)(9.2)(9.1)
- ecpgで提供されるヘッダファイルが、プリプロセッサ命令行にコメントを含まないように修正されました。 (Michael Meskes) (9.5)(9.4)(9.3)(9.2)(9.1)
- hstore拡張モジュールの hstore_to_json_loose() 関数で、値を JSON数値に変換可能であるかの判定が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)
- postgres_fdw 拡張モジュールで、更新命令の AFTER ROW トリガーまたはRETURNING 式で tableoid を使う場合の障害が修正されました。 (Etsuro Fujita, Robert Haas) (9.5)(9.4)
- 実装上の定数 NAMEDATALEN (識別子の最大長) とMAX_LEVENSHTEIN_STRLEN (レーベンシュタイン距離計算における最大長)との間で NAMEDATALEN <= MAX_LEVENSHTEIN_STRLEN という限定が除かれました。 (Robert Haas, Tom Lane) (9.5)
- ワイルドカードでリンカに与えられるファイル名を固定順にすることで、ビルド出力の再現性が改善されました。 (Christoph Berg) (9.5)(9.4)(9.3)
- MSVCビルドで dynloader.h がインストールされるヘッダファイルに含まれるようになりました。 (Bruce Momjian, Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
- タイムゾーンデータファイルが tzdata release 2016a に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
- json_path_ops 演算子クラスの GIN インデックスにおける一貫性に欠けたハッシュ計算が修正されました。 (Tom Lane) (9.4)
- postmaster.pid ファイルが削除されたなら imediateシャットダウンを行うようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- SERIALIZABLEトランザクション隔離モードで、INSERT時の競合状態のために直列化例外が見逃されることがあり、修正されました。 (Kevin Grittner, Thomas Munro) (9.4)(9.3)(9.2)(9.1)
- UNLOGGEDテーブルに対して ALTER TABLE ... SET TABLESPACE を実行したとき、適切なWALレコードが出力されない障害が修正されました。 (Michael Paquier, Andres Freund) (9.4)(9.3)(9.2)(9.1)
- クラッシュリカバリの最後に UNLOGGED なテーブル・インデックスが初期化されない可能性があり、修正されました。 (Andres Freund, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
- wal sender のスロットが再使用時に完全に再初期化されるようになりました。 (Magnus Hagander) (9.4)(9.3)
- ALTER TABLE ... ALTER COLUMN TYPE が CHECK制約を適切に継承するように改修されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- REASSIGN OWNED コマンドが複合型の所有者も変更するように修正されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
- REASSIGN OWNED コマンドおよび ALTER ... OWNER コマンドが、データ型、外部データラッパ、外部サーバの所有者変更にあたって、適切にアクセス制御リストを更新するように修正されました。 (Bruce Momjian, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
- REASSIGN OWNED コマンドが外部ユーザマッピング(ユーザマップ)を無視するように変更されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
- 更新可能ビューむけの問い合わせ書換えの後にクラッシュする可能性があり、修正されました。 (Stephen Frost) (9.4)(9.3)
- LATERAL参照の扱いについてプランナが修正されました。 (Tom Lane) (9.4)(9.3)
- インデックス内部の統計情報が古い場合に、GINインデックススキャンの粗悪なプランナコスト見積もりが生じるのを防ぐように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- GINインデックスのプランナコスト見積りが、インデックスアドバイザプラグインによる仮定のインデックスに対して改善されました。 (Julien Rouhaud) (9.4)(9.3)(9.2)(9.1)
- EXPLAIN とルールのダンプで重複しないテーブル別名の生成が高速化されました。また、生成される別名が確実に最大識別子長を超えないように修正ました。 (Tom Lane) (9.4)(9.3)
- ROW() や VALUES() 内の行変数のダンプが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- dete型、timestamp型の -infinity値を、json型、jsonb型に変換するとき、+infinity になってしまう障害が修正されました。 (Tom Lane) (9.4)
- numeric型データの除算で内部オーバーフローが生じる可能性があり、修正されました。 (Dean Rasheed) (9.4)(9.3)(9.2)(9.1)
- 正規表現で先行検索制約の制限が無視される誤りがあり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- 先行参照制約が含まれるとき、正規表現のインデックススキャン範囲への変換で不正確な範囲が生じる可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- 正規表現のコンパイラが ^、$、先行参照制約のループを扱えるように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- 正規表現のコンパイラにおいてメモリ利用の計算が改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- 正規表現のコンパイラの性能が改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- Windowsにおいて、共有メモリを必要としない子プロセスで共有メモリマッピングハンドルを確実にクローズするようになりました。 (Tom Lane, Amit Kapila) (9.4)(9.3)(9.2)(9.1)
- Windows のノンブロッキングモードでソケットの EOF を検知するのに失敗する可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- psql で端末ウィンドウのサイズが変更されたとき、確実に libreadline のスクリーンサイズの認識が更新されるようになりました。 (Merlin Moncure) (9.4)(9.3)(9.2)(9.1)
- psql にて、これまでの接続が Unixドメインソケット経由であってc コマンドに新ホスト名と同ユーザ名を指定した場合に、クラッシュする可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- pg_ctl start -w で子プロセス状態の検査をヒューリスティックに頼らず直接行うようになりました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
- pg_ctl start -w で接続試験にワイルドカードのリッスンアドレスを使おうとしないように修正されました。 (Kondo Yuta) (9.4)(9.3)(9.2)(9.1)
- pg_dump と pg_basebackup で、8GB を超える tarアーカイブ要素を扱うため、GNU 慣例が採用されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- pg_dump でリレーションのオプション値が確実に適切にクオートされるようになりました。 (Kouhei Sutou, Tom Lane) (9.4)(9.3)(9.2)(9.1)
- パラレル pg_dump でパスワードプロンプトが繰り返し出るのが防止されました。 (Zeus Kronion) (9.4)(9.3)
- Windows における pg_upgrade のファイルコピーでエラーを適切に扱うようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)
- pg_receivexlog と pg_recvlogical でローカライズメッセージ出力の失敗が修正されました。 (Ioseph Kim) (9.4)(9.3)(9.2)
- ソケットの EOF を検知したときの libpq 入力バッファの早すぎる消去が修正されました。 (Tom Lane) (9.4)(9.3)
- libpq のメモリ不足状況での振る舞いが改善されました。 (Michael Paquier, Amit Kapila, Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)
- ecpg が出力する typedef 文の引数順序が修正されました。 (Michael Meskes) (9.4)(9.3)(9.2)(9.1)
- ecpg 実装の PGTYPESnumeric_from_double() で sprintf による変換で %f でなく %g を使うように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
- contrib/pgcrypto の crypt() 関数で確実に問い合わせキャンセルが可能となりました。 (Andreas Karlsson) (9.4)(9.3)(9.2)(9.1)
- flex バージョン 2.5.x 以降に対応しました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
- config/missing スクリプトをインストールするようになりました。 (Jim Nasby) (9.4)(9.3)(9.2)(9.1)
- 現在の libxml2 の振る舞いに適合する、別種のリグレッションテスト想定出力ファイルが追加されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
非常に大きな文字範囲のブラケット式で、無限ループになったり、メモリのオーバーライトが起こっていました。本問題は CVE-2016-0773 として登録されています。
(障害発生する例) SELECT regexp_matches('a', '[x0-x7fffffff]', 'i');
一部のケースで ON ONFLICT .. WHERE を含むルール定義の出力が正しくなく、ダンプ/リストアに失敗する可能性があります。
これまで %h と %r は新たなセッションが確立した後にしか出力されませんでした。
(9.5.0 で log_line_prefix = ' [%h/%r] '、log_connections = on のログ例) [/] LOG: connection received: host=127.0.0.1 port=42424 [127.0.0.1/127.0.0.1(42424)] LOG: connection authorized: user=postgres database=db1 [127.0.0.1/127.0.0.1(42424)] ERROR: syntax error at or near "x" at character 1 [127.0.0.1/127.0.0.1(42424)] STATEMENT: x;
スキーマ修飾付きかもしれないパターンに対して他の d コマンドが行うのと同様の動作となります。
(dt だとスキーマ名だけ指定してもマッチしません) db1=# dt scm1 No matching relations found. db1=# dt scm1.* List of relations Schema | Name | Type | Owner --------+------+-------+---------- hoge | t1 | table | postgres (1 row) (det は、これまで例外的な動作でした) db1=# det scm1 List of foreign tables Schema | Table | Server --------+-------+-------- scm1 | ft1 | srv1 (1 row)
これまで pg_ctl から出力されるメッセージをリダイレクションで取得できない問題がありました。
クオートを重複して付ける動作がありました。
9.3.x 以前のサーバは IDENTIFY_SYSTEM コマンドに対応していないために、「could not identify system: ...」というメッセージが出ていました。
(複数バージョンの libpython は安全に並行使用できませんが)同一セッションでなければ、原則として両バージョンの PL/Python を同一データベースで使用可能です。しかしながら、pg_restore と pg_upgrade はこの同一セッションの制約に抵触することがあります。これを PL/Python が読み込むコードをチェックするタイミングを変えることで回避しています。
この変更は PL/Java のセキュリティ障害(CVE-2016-0766)を軽減します。PL/Java は PostgreSQL本体には含まれませんが、本修正によりカスタム設定パラメータ pljava.classpath は、superuserコンテキストに設定されます。
これまで本関数では構文的に不正な JSON を出力することがありました。以下の「2016-01-01」部分は「"2016-01-01"」と出力されるべきです。
(修正前の挙動) db1=# SELECT hstore_to_json_loose(hstore('abc', '2016-01-01')); hstore_to_json_loose ---------------------- {"abc": 2016-01-01} (1 row)
上記の場合にこれまで外部テーブルの tableoid カラム値として正しくない値が返っていました。
同じ条件で生成された実行ファイルにビットレベルでの差異が生じるのを防ぎます。
ケイマン諸島、メトラカトラ、ザバイカリエ地方(Zabaykalsky Krai) の夏時間法が変更され、パキスタンの歴史的な訂正が加わりました。
同じ入れ子レベルにスカラとサブオブジェクトの両方を含む jsonb 値を処理するとき、見つかるべき項目が見つからないことがありえました。本修正を適用するには、アップグレード後に該当のインデックスを REINDEX する必要があります。
json_path_ops 演算子クラスは jsonb型に対する "@>" 演算子に GINインデックスを適用するのに使われます。
PostgreSQL のマスタープロセスは postmaster.pid ファイルが在り、自身の PID が書かれているかを毎分確認し、無かったり PID が違った場合には immediate シャットダウンをするようになりました。
リリース情報に明記されていませんが、PostgreSQL 9.5.0 では既にそのようになっています。
ごく限定されたタイミングでの同時実行で発生し、エラーを出すべきところで直列化されていない結果が返される動作となります。
テーブルのデータについては WAL出力対象外であるとしても、テーブルスペース移動は WAL出力すべきでした。そうでないと、スタンバイサーバが昇格したときにアクセス不能になります。
よくある症状として、スタンバイを昇格させた後に以下のエラーが出ます。
ERROR: index "..." contains unexpected zero page at block 0
ここでのスロットは wal sender プロセスのための共有メモリ上のデータ構造であって、pg_create_physical_replication_slot 関数で作る物理レプリケーションスロットとは別物です。
親テーブルでカラムデータ型を変更すると当該カラムに対する CHECK制約の継承関係が壊れてしまいます。また、以下の奇妙なエラーが生じていました。
db1=# ALTER TABLE parenttable DROP CONSTRAINT parentconstraint_1; ERROR: relation 23456 has non-inherited constraint "parentconstraint_1"
所有者だけ変えて、アクセス制御リストは更新しない動作がありました。
以下のような奇妙なエラーが出るケースが報告されていて、これを回避します。
ERROR: unexpected classid 1418 SQL state: XX000"
キャッシュを参照する部分が更新処理を含む場合には安全ではありませんでした。
例外的な場合に以下のエラーが生じることがありました。
ERROR: failed to build any N-way joins (N-way の N には 2-way など数字が入る) ERROR: could not devise a query plan
実在しないGINインデックスには内部統計情報が無いため、ダミーの代替データを用意する必要があり、これまでは不十分な実装でした。
以下のようなビュー定義に対して、ダンプ出力が実際には適用できない内容になっていました。
(修正前の動作) db1=# CREATE TABLE t2 (c1 int, c2 int); db1=# CREATE TYPE nestedcomposite AS (c1c2 t2); db1=# CREATE VIEW v1 AS SELECT ROW(t2)::nestedcomposite FROM t2; db1=# SELECT pg_get_viewdef('v1', true); pg_get_viewdef --------------------------------------------- SELECT ROW(t2.*)::nestedcomposite AS "row"+ FROM t2; (1 row) (上記のビュー定義 SELECT は正しくない、実行するとエラーになる) db1=# SELECT ROW(t2.*)::nestedcomposite AS "row" FROM t2; ERROR: cannot cast type record to nestedcomposite (以下が正しい) db1=# SELECT pg_get_viewdef('v1', true); pg_get_viewdef ------------------------------------------------- SELECT ROW(t2.*::t2)::nestedcomposite AS "row"+ FROM t2; (1 row)
(修正前の誤った振る舞い例) db1=# SELECT to_json('-Infinity'::date); to_json ------------ "infinity" (1 row)
マニュアル記載では、先行検索制約には、後方参照(1、2 など)を含むことが許されておらず、また、先行検索制約の中の括弧は常に捕捉されないとされていますが、これらの仕様に反する動作がありました。
(修正前動作/括弧を加えた 2番目の SQL も 1番目と同じくエラーになるのが正しい) db1=# SELECT 'xyz' ~ 'x(w)(?=1)'; ERROR: invalid regular expression: invalid backreference number db1=# SELECT 'xyz' ~ 'x(w)(?=(1))'; ?column? ---------- t (1 row) (修正前動作/括弧を加えると NULL が捕捉されていた) db1=# SELECT regexp_matches('abcfoo','(abc)(?=foo)'); regexp_matches ---------------- {abc} (1 row) db1=# SELECT regexp_matches('abcfoo','(abc)(?=((foo)))'); regexp_matches ---------------- {abc,NULL} (1 row)
インデックスが利用される場合に不正な検索結果が返る可能性がありました。
(修正前の動作/正しくは「(v >= 'abcd'::text) AND (v < 'abce'::text)」) db1=# explain (costs off) SELECT * FROM t1 WHERE v ~ '^abcd(x|(?=ww)q)'; QUERY PLAN -------------------------------------------------------------- Index Scan using t1_v_idx on t1 Index Cond: ((v >= 'abcdx'::text) AND (v < 'abcdy'::text)) Filter: (v ~ '^abcd(x|(?=ww)q)'::text) (3 rows) (正しくは以下が返るとして、インデックススキャンでは id=5 の行が欠けることになる) db1=# SELECT * FROM t1 WHERE v ~ '^abcd(x|(?=ww)q)'; id | v ----+--------- 5 | abcdqBB 2 | abcdx (2 rows)
これらを扱えるようにセキュリティ障害 CVE-2007-4772 の修正が以前(7.4.19 など) に適用されていましたが、それは不十分なものでした。
(以下の正規表現は無限ループやキャンセル時のクラッシュを引き起こしていました) db1=# SELECT 'a' ~ '(^$)*'; ?column? ---------- t (1 row) db1=# SELECT 'dd x' ~ '(^(?!aa)(?!bb)(?!cc))+'; ?column? ---------- t (1 row)
これまで途方もない時間とメモリを要していたいくつかの場合について、「ERROR: invalid regular expression: regular expression is too complex」を出すようになりました。
これまでも似た意味で「ERROR: invalid regular expression: nfa has too many states」を出すことはありました。メッセージは前述のものに統合されています。
この誤りは、logging_collector = on のとき、バックエンドクラッシュ後の自動再起動におけるリカバリの失敗を引き起こしていました。
修正対象の 9.4.x 以前の各バージョンで問題が起きるか明らかではありませんが、起きていたとすれば、その症状は walsender プロセスが接続は失われているのに際限なく待つというものであるはずです。
9.5.x では既に修正済みです。
これまでは libreadline は問い合わせ出力中にウィンドウがリサイズされても気づかず、その後での複数行にわたる問い合わせの入力で奇妙な振る舞いをひき起こしていました。
これまで pg_ctl は新たなマスタープロセスは常に 5秒以内に postmaster.pidを作るであろうという仮説に依存していました。これは高負荷システムでは失敗する可能性があり、「could not start server」という誤った報告をひき起こします。
Windows 以外では、本修正で、pg_ctl start -w を他の PostgreSQL起動コマンドの直後に実行したときに確実に失敗するようにもなります。これまでは最初のコマンドから 2秒以内に実行したときは (既存のプロセスが自身で起動したプロセスと見做されて) 成功と報告されました。
pg_ctl は PostgreSQLサーバプロセスの起動確認にて、listen_addresses に 0.0.0.0 や :: が指定されていると、これらの値をそのままアドレスとして使用しますが、Windows では失敗します。それぞれ代わりに 127.0.0.1、::1 を使うべきでした。
Windows 以外では pg_ctl は Unixドメイン接続を使うので問題となりませんでした。
tarフォーマットの POSIX標準では 8GB を超える tarアーカイブの要素を許可していませんが、ほとんどの近代的な tar の実装ではこれを可能とする拡張をサポートしています。
本修正で、pg_dump -Ft において 8GB 以上のテーブルが、また、pg_baesbackup -Ft において 8GB 以上のファイルが扱えるようになりました。これまでは 4GB から 8GB の間のサイズの要素についても、一部プラットフォームでは失敗し、リカバリできない問題がありました。
ここでのリレーションのオプション値とは、テーブル、インデックス、ビューの定義に WITH (options) で与えられるものを指します。システムカタログの pg_class.reloptions に定義が格納されます。
これまで、オプション値がシンプルな識別子や数値でない場合にダンプ/リロードにて pg_dump による CREATE文の構文エラーで失敗していました。
PostgreSQL本体でサポートされているオプション値では問題ありませんが、拡張モジュールによるオプション値で問題が発生しました。
この誤りにより libpq が、サーバからの予期せぬ切断を報告する手前の、バックエンドの最後のエラーメッセージを報告しないことが起こりまし
これまで libpq が応答データを構成しているときにメモリ不足になると、サーバからのデータを待つ状態でハングアップしてしまいました。これが適切にエラーを出してクライアントに処理を戻すようになりました。
バッファオーバランの対策も加えられました。
現在 flex 2.6.0 がリリースされていて、ビルドスクリプトにおけるバージョンチェックを調整する必要がありました。
bison などのビルドツールが無いマシン上で PGXSビルドを正常に行えるようになります。
libxml2 ライブラリは、セキュリティ障害 CVE-2015-7499 に対する修正で、ある種の場合にエラーコンテキストレポートが出力されなくなりました。これに対応した追加となります。