PostgreSQL 9.5.10 に関する技術情報

このリリースは 9.5.9 からの修正リリース(リリース日 2017/11/9)です。
9.5.x からのアップデートではダンプ、リストアは不要です。
ただし、項目4番に該当する場合は追加の対処が必要です。

最終更新:2018/2/27

PostgreSQL 9.5.9 から 9.5.10 への変更点

10.1、9.6.6、9.5.10、9.4.15、9.3.20、9.2.24 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。


  1. INSERT ... ON CONFLICT DO UPDATE がすべての場合にテーブルのアクセス許可とRLS(行単位セキュリティ)ポリシーをチェックするようになりました。 (Dean Rasheed) (10)(9.6)(9.5)
  2. INSERT ... ON CONFLICT DO UPDATE の更新パスは、競合インデックスの列に対してSELECT のアクセス許可を必要としますが、制約名で指定された競合の場合はアクセス許可をチェックできませんでした。

    (以下のようなテーブルに対して)
    db1=# CREATE TABLE t1a (a int PRIMARY KEY);
    db1=# GRANT UPDATE ON t1a TO foo ;
    db1=# GRANT INSERT ON t1a TO foo ;
    
    (これまでfooユーザで以下のSQLがエラーになりませんでした)
    db1=> INSERT INTO t1a VALUES (1) ON CONFLICT
            ON CONSTRAINT t1a_pkey DO NOTHING;
    ERROR:  permission denied for relation t1a
    

    また、行単位セキュリティが有効なテーブルでは、(競合インデックスの指定方法に関係なく) テーブルの SELECT ポリシーに対して更新された行をチェックできませんでした。(CVE-2017-15099)

  3. json_populate_recordset()、jsonb_populate_recordset() の行型の不一致によるクラッシュが修正されました。 (Michael Paquier, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  4. これらの関数は、FROM ... AS 句で指定された結果の行型を、指定されたタプル値の実際の行型と一致するかどうかをチェックせずに使用していました。チェックしなければクラッシュすることになりますが、サーバのメモリ内容が露出してしまう可能性もありました。(CVE-2017-15098)

    (以下は第一引数の行型とASで指定する型が一致しません)
    db1=# SELECT * FROM json_populate_recordset(ROW(NULL::int,NULL::int), '[{"b":"2"},{"a":"3"}]') AS q (a text, b text);
    ERROR:  invalid memory alloc request size 18446744073709551613
    (クラッシュまたは奇妙なエラーが発生します)
    
  5. $PGLOG を開く前に $PGUSER になるように、サンプルのサーバ起動スクリプトが修正されました。 (Noah Misch) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  6. 以前は、root として実行中に postmaster ログファイルが開かれました。したがって、データベースの所有者は、$PGLOG をほかのファイルへのシンボリックリンクにすることで、ログメッセージが追加されて壊れ、別のシステムユーザに対して攻撃をしかけることができます。

    デフォルトでは、これらのスクリプトはどこにもインストールされません。それらのスクリプトを使用しているユーザは、手動で再コピーするか、変更されたバージョンに同じ変更を適用する必要があります。既存の $PGLOG
    ファイルが root 所有の場合は、修正されたスクリプトでサーバを再起動する前に、そのファイルを削除するか名前を変更する必要があります。(CVE-2017-12172)

  7. 同時実行のテーブル拡張を正しく処理するようにBRINインデックスのサマリ処理が修正されました。 (Álvaro Herrera) (10)(9.6)(9.5)
  8. 以前は競合状態により、インデックスから一部のテーブル行が漏れる可能性がありました。この問題が過去に発生した状態から回復するには、既存の BRINインデックスを再構築する必要があります。

  9. BRINインデックスの同時更新中で発生する可能性のある障害が修正されました。 (Tom Lane) (10)(9.6)(9.5)
  10. これらの競合状態は「ERROR: invalid index offnum: NN」や「ERROR: corrupted BRIN index: inconsistent range map」のようなエラーにつながる可能性があります。

  11. ロジカルレプリケーションで、UPDATEを伝播するのに対象外の列をNULL に設定しないようになりました。 (Petr Jelinek) (10)
  12. これまで発行元テーブルが購読先テーブルよりも少ない列しか持たない場合、UPDATEをレプリケーションすると不足している列をNULLにしていました。これからは元の値を残すようになります。

  13. 期待されたときにBEFORE ROW DELETEトリガを駆動するようにロジカルレプリケーションが修正されました。 (Masahiko Sawada) (10)
  14. 以前はテーブルにBEFORE ROW UPDATEトリガとBEFORE ROW DELETEトリガの両方がないと駆動されませんでした。

  15. SPI を使用する関数、とくに手続き言語で記述された関数から、ロジカルデコーディングが呼び出されたときのクラッシュが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)
  16. 以下のようなロジカルデコーディングの関数を呼び出すだけの PL/pgSQL のユーザ定義関数を実行してクラッシュする例が報告されました。

    CREATE FUNCTION logical_replication_slot_lsn_delta(slot text)
      RETURNS pg_lsn AS $$
        BEGIN
          RETURN location FROM pg_logical_slot_peek_changes(slot,null,1) ;
        END
    $$ LANGUAGE plpgsql;
    
  17. INSERT、UPDATE、DELETE の対象テーブルを調べるときに、CTE を無視するようになりました。また、スキーマ修飾された対象テーブル名とトリガ遷移テーブル名が一致するのを防止するようになりました。 (Thomas Munro) (10)
  18. これにより、DMLコマンドに付加されたCTEに対するバージョン10より前の動作が、復元されます。

    (10.0では以下がエラーになっていました)
    db1=# CREATE TABLE t9 (i int);
    CREATE TABLE
    db1=# WITH test AS (SELECT 123) INSERT INTO t9 VALUES (1);
    ERROR:  relation "t9" cannot be the target of a modifying statement
    
  19. FILTERテストが失敗した行で、集約関数の引数式を評価しなくなりました。 (Tom Lane) (10)
  20. これにより、バージョン10より前 (およびSQL標準) の動作が復元されます。

    (10.0では以下がエラーになっていました)
    db1=# CREATE TABLE t10 AS SELECT generate_series(0, 10)::real AS r;
    SELECT 11
    db1=# SELECT sum(1/r) FILTER (WHERE r > 0) FROM t10;
    ERROR:  division by zero
    
  21. 複数の GROUPING SETS列に同じ単純変数が含まれているときの、誤った問い合わせ結果が修正されました。 (Tom Lane) (10)(9.6)
  22. (このようなデータに対して)
    db1=# CREATE TABLE t11 (i1 int, i2 int);
    db1=# INSERT INTO t11 VALUES (1,100),(2,201),(2,202),(3,301),(3,302),(3,303);
    
    (以下のように応答すべきところが)
    db1=# SELECT i1, i1 AS a1, count(i2) FROM t11 GROUP BY i1, ROLLUP (a1);
     i1 | a1 | count
    ----+----+-------
      1 |  1 |     1
      3 |  3 |     3
      2 |  2 |     2
      2 |    |     2
      3 |    |     3
      1 |    |     1
    (6 rows)
    
    (修正前バージョンでは以下のようになっていました)
    db1=# SELECT i1, i1 AS a1, count(i2) FROM t11 GROUP BY i1, ROLLUP (a1);
     i1 | a1 | count
    ----+----+-------
      1 |  1 |     1
      3 |  3 |     3
      2 |  2 |     2
      2 |  2 |     2
      3 |  3 |     3
      1 |  1 |     1
    (6 rows)
    
  23. SELECT の対象リスト内の集合を返す関数を評価している間の、問い合わせ処理内限定のメモリリークが修正されました。 (Tom Lane) (10)
  24. 汎用的な計画をもつプリペアド文の並列実行ができるようになりました。 (Amit Kapila, Kuntal Ghosh) (10)
  25. ネストされた問い合わせの誤った並列化の判断が修正されました。 (Amit Kapila, Kuntal Ghosh) (10)(9.6)
  26. 最近使用されたロールが削除されたときに、パラレルクエリ処理が失敗しないように修正されました。 (Amit Kapila) (10)(9.6)
  27. BitmapOrノードの下に BitmapAndノードをもつビットマップスキャンを並列実行するとクラッシュする問題が修正されました。 (Dilip Kumar) (10)
  28. 明示的な VARIADIC引数を正しく処理するようにjson_build_array()、json_build_object()、およびそれらの jsonb に相当する関数が修正されました。 (Michael Paquier) (10)(9.6)(9.5)(9.4)
  29. (明示的な VARIADIC引数とは以下のような呼び出し方で、以下は誤った応答です)
    db=# SELECT jsonb_build_array(VARIADIC '{a,b,c,d}'::text[]);
       jsonb_build_array
    ------------------------
     [["a", "b", "c", "d"]]
    (1 row)
    
    (以下の呼び出し方であれば該当しません)
    SELECT jsonb_build_array('a','b','c','d');
      jsonb_build_array
    ----------------------
     ["a", "b", "c", "d"]
    (1 row)
    
  30. クラッシュや作業項目の気づかぬうちの消失を防ぐために autovacuum の作業項目ロジックが修正されました。 (Álvaro Herrera) (10)
  31. ビューの最後に列が追加されたときの、めったに発生しないクラッシュが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  32. ここでのビューに列を追加するとは、既存のビューをCREATE OR REPLACE VIEWコマンドでより列が多い定義に上書きすることを指します。

  33. ビューまたはルールに FieldSelect または FieldStore 式ノードが含まれている場合に、適切な依存関係を記録するようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  34. これらの依存関係がないと、失敗させる必要があるときに列またはデータ型の DROP を通過させることができ、あとでビューまたはルールを使用してエラーが発生する可能性があります。このパッチは、既存のビュー/ルールを保護するためのものではなく、今後作成されるもののみを保護します。

    FieldSelect と FieldStore は実装上の要素名です。本障害により、TYPE定義を含むデータベースオブジェクトのCASCADE付きDROPで「ERROR: could not open relation with OID 34567」などの奇妙なエラーが報告されました。

  35. 範囲データ型がハッシュできるかを正しく検出するようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  36. プランナは、誤って範囲型がハッシュ結合またはハッシュ集約で使用するためにハッシュできると仮定していましたが、実際には範囲の派生元型にハッシュサポートがあるかどうかをチェックする必要があります。いずれにしても、すべての組み込みの範囲型はハッシュ可能なので、それらには影響しません。

  37. 関数従属性の統計を調べるときに、RelabelType式ノードを正しく無視するようになりました。 (David Rowley) (10)
  38. これにより、たとえば、varchar列の拡張統計を適切に使用することができます。

  39. 順序集合集約間の遷移状態の共有を防ぐようになりました。 (David Rowley) (10)(9.6)
  40. これにより、組み込みの順序集合集約でクラッシュし、おそらくユーザ記述の集約でもクラッシュします。バージョン 11 以降では、このようなケースを安全に処理するための規定が含まれる予定ですが、リリースされたブランチでは最適化を無効にするだけです。

  41. statement_timeout が先に発生した場合に、idle_in_transaction_session_timeout が無視されないようになりました。 (Lukas Fittl) (10)(9.6)
  42. XID周回に起因する NOTIFYメッセージの確率の低い損失が修正されました。 (Marko Tiikkaja, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  43. セッションが問い合わせを実行せず、単に通知を聞いた場合、20億回を超えるトランザクションでは、同時にコミットするトランザクションからいくつかの通知が欠落していきました。

  44. 特に新たな APFSファイルシステムを使用したときの、macOS のパフォーマンス上の問題を回避するため、バルクファイルコピー中のデータフラッシュ要求の頻度が減らされました。 (Tom Lane) (10)(9.6)
  45. トランザクション分離レベルが REPEATABLE READ 以上の場合に、 COPY の FREEZE オプションが機能するようになりました。 (Noah Misch) (10)(9.6)(9.5)(9.4)
  46. このケースは、以前のバグ修正(9.6.2、9.5.6、9.4.11で適用されたもの)によって意図せずに壊れていました。

  47. 遷移計算がマージされている集約の最終関数に正しい Aggref ノードを返すように、AggGetAggref() が修正されました。(Tom Lane) (10)(9.6)
  48. これは集約関数のための内部実装関数です。

  49. pg_dump と psql の新しい問い合わせで、不十分なスキーマ修飾が修正されました。 (Vitaly Burovoy, Tom Lane, Noah Misch) (10)
  50. pg_dump がエラーで終わるケースが報告されました。

  51. psql の d の問い合わせで @> 演算子を使用しないようになりました。 (Tom Lane) (10)
  52. これにより、parray_gin 拡張がインストールされているときに、競合する演算子が定義されたときの、問題を回避できます。

  53. テーブル空間パスを比較する前に両方のパスを正規化するように、pg_basebackup のマッチングが修正されました。 (Michael Paquier) (10)(9.6)(9.5)
  54. これは Windows でとくに役立ちます。

  55. libpq がユーザのホームディレクトリを必要としないように修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  56. バージョン10.0では、~/.pgpass を読み込もうとしてホームディレクトリが見つからなかった場合、誤って致命的なエラーとして扱っていました。

    ~/.pg_service.conf を読むとき、バージョン10.0 と以前のリリースのブランチは同様の誤りを犯していましたが、サービス名が指定されていなければ、そのファイルが探し出されないので気づきませんでした。

  57. ecpglib で、standard_conforming_strings が設定されているかどうかに応じて、文字列リテラルのバックスラッシュを正しく処理するようになりました。 (Tsunakawa Takayuki) (10)(9.6)(9.5)(9.4)
  58. ecpglib の Informix互換モードが、整数入力文字列の小数点部分を無視するようになりました。 (Gao Zengqi, Michael Meskes) (10)(9.6)(9.5)(9.4)(9.3)
  59. check のような Make ターゲットに欠落している temp-install の前提条件が修正されました。 (Noah Misch) (10)(9.6)(9.5)
  60. make check のように動作することを意図したデフォルト以外のテスト手順では、一時的なインストールが最新であることを確認できませんでした。

  61. アラスカ、アピア、ビルマ、カルカッタ、デトロイト、アイルランド、ナミビア、パゴパゴの歴史的修正に加え、フィジー、ナミビア、北キプロス、スーダン、トンガ、タークス・カイコス諸島の DST 法の変更を含む tzdata リリース 2017c にタイムゾーンデータファイルが更新されました。 (10)(9.6)(9.5)(9.4)(9.3)(9.2)
  62. ドキュメントで、HTML アンカーが大文字の文字列に戻されました。 (Peter Eisentraut) (10)
  63. ツールチェーンが変更されたため、10.0 のユーザマニュアルにはイントラページアンカーに小文字の文字列が含まれていたため、Web サイトのドキュメントの外部リンクが壊れていました。前の大文字の文字列の使用法に戻ります。

  64. 無限の浮動小数点値を numeric 型に変換しようとする試みを適切に拒否するようになりました。 (Tom Lane, KaiGai Kohei) (9.6)(9.5)(9.4)(9.3)(9.2)
  65. 以前は、この動作はプラットフォームに依存していました。

  66. プランナで、リレーションの明確性を決定する際に、RelabelType 式ノードを正しく無視するようになりました。 (David Rowley) (9.6)(9.5)
  67. これにより、副問い合わせに varchar 型の結果列がある場合に、意図した最適化が行われます。

  68. DSM (動的共有メモリ)のメモリ要求が tmpfs で使用可能なスペースを超えたとき、Linux上での SIGBUSクラッシュを回避するようになりました。(Thomas Munro) (9.6)(9.5)(9.4)
  69. ネストされたトリガの起動時に発生する可能性の低いクラッシュが防止されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  70. COPY または lo_export() でファイル作成が失敗した場合、umask設定が正しく復元されるようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
  71. ANALYZE で列名が重複しているとき、よりよいエラーメッセージが表示されるようになりました。 (Nathan Bossart) (9.6)(9.5)(9.4)(9.3)(9.2)
  72. log_statement が ddl に設定されているときに特定の SQLコマンドが使用されたときのエラーを防止するため、GetCommandLogLevel() で不足しているケースが追加されました。 (Michael Paquier) (9.6)
  73. 改行で終わらない pg_hba.conf ファイルの最後の行の誤った解析が修正されました。

  74. 正しい順序で GRANT コマンドを発行するように pg_dump が修正されました。 (Stephen Frost) (9.6)
  75. PGresult の行数の整数オーバーフローを防ぐために libpq が修正されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  76. ポインタまたは配列変数による ecpg のスコープ外のカーソル宣言の処理が修正されました。 (Michael Meskes) (9.6)(9.5)(9.4)(9.3)
  77. ecpg のリグレッションテストが Windows上で確実に動作するように修正されました。 (Christian Ullrich, Michael Meskes) (9.6)
  78. 時間帯ライブラリのコピーが IANA のリリース tzcode2017c と同期されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  79. これにより、さまざまな問題が修正されました。唯一、ユーザに見える可能性が高いのは、POSIX スタイルのゾーン名のデフォルトの DST ルールは、時間帯データディレクトリに posixrules ファイルが存在しない場合、数十年前のではなく、現在の米国の法律と一致していることです。