PostgreSQL 9.4.16 に関する技術情報

このリリースは 9.4.15 からの修正リリース(2018/2/8リリース)です。
9.4.x からのアップデートではダンプ、リストアは不要です。

また、9.4.15 より前のバージョンからアップデートを行う場合は 9.4.15 に関する技術情報を参照してください。

PostgreSQL 9.4.15 から 9.4.16 への変更点

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


  1. 複数の式を含むパーティションキーの処理が修正されました。 (Álvaro Herrera, David Rowley) (10)
  2. 本障害はクラッシュをひき起こす他、攻撃を意図した作りこまれた入力によってサーバプロセス上の任意のメモリが露出してしまう可能性がありました。

    PARTITION BY 構文を使ったテーブルパーティショニングで「PARTITION BY RANGE ((col1 / 1000), substr(col2, 1, 5))」など、複数の式でパーティションキーを指定した場合に問題が生じます。 (CVE-2018-1052)

    (クラッシュ発生例 - CREATE TABLE でクラッシュします)
    db1=# CREATE TABLE ptest (col1 int, col2 text, col3 text)
            PARTITION BY RANGE ((col1 / 1000), substr(col2, 1, 5));
    db1=# CREATE TABLE ptest_1 PARTITION OF ptest
            FOR VALUES FROM (0,'00000') TO (1, '10000');
    db1=# CREATE TABLE ptest_2 PARTITION OF ptest
            FOR VALUES FROM (0,'10000') TO (1, '20000');
    server closed the connection unexpectedly
    
  3. pg_upgrade で作られる全ての一時ファイルが誰でも見れるパーミッションにならないように修正されました。 (Tom Lane, Noah Misch) (10) (9.6) (9.5) (9.4) (9.3)
  4. pg_upgrade は通常は一時ファイルを実行ユーザのみ読み書きできるように制限します。しかしながら、実行したユーザの umask 設定で許可されていると、「pg_dumpall -g」の出力を含む一時ファイルがグループ参照可能、または、全ユーザ参照可能、更には書き込み可能になることがありました。

    複数ユーザで使用するマシンにおいて、umask 設定や実行するディレクトリのパーミッションによっては、データベースのパスワードが露出することになります。(CVE-2018-1053)

  5. KEY SHARE 行ロック中に更新されたタプルの VACUUM 処理が修正されました。 (Andres Freund, Álvaro Herrera) (10) (9.6) (9.5) (9.4) (9.3)
  6. 一部のケースで VACUUM はこのようなデッドタプルの除去に失敗していました。これによりデータ破損を起こすことがあります。

  7. 新たなオーバーフローページを追加した後にハッシュインデックスのメタページを壊してしまう障害が修正されました。 (Lixian Zou, Amit Kapila) (10)
  8. インデックス破損をもたらす可能性があります。

  9. VACUUM が常に GIN インデックスのペンディングリストをクリーンアップするようになりました。 (Masahiko Sawada) (10) (9.6)
  10. これには削除済みのインデックスエントリが確実に除去されることが必要です。従来コードでは他プロセスが同時にクリーンアップを実行しているとき VACUUM がクリーンアップをスキップするのを許していて、その結果、無効なエントリがインデックスに置き去りにされてしまう危険がありました。

  11. 一部の LSN 取得で不十分なバッファロックが修正されました。 (Jacob Champion, Asim Praveen, Ashwin Agrawal) (10) (9.6) (9.5) (9.4) (9.3)
  12. この誤りにより同時データ読み込みにおいて誤動作のおそれがありました。どのような結果が生じるか完全には分かっていません。

  13. 結果が GROUPING SETS で使われるサブクエリの平坦化を伴う場合に生じる誤った問い合わせ結果が修正されました。 (Heikki Linnakangas) (10) (9.6) (9.5)
  14. リストパーティショニング制約の boolean または配列型によるパーティションキーに対する扱いが修正されました。 (Amit Langote) (10)
  15. 必ず col = ANY(ARRAY[val1, val2, ...]) という式で制約が書かれていたものが、col = val1 OR col = val2 という形でも生成されるようになります。

  16. ALTER TABLE .. NO INHERIT での子テーブル削除が同時実行されたとき、継承テーブルの問い合わせで、不要なエラーを回避するようになりました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  17. 以下のエラーが発生していました。

    ERROR:  could not find inherited attribute "col1" of relation "tbl1"
    
  18. CREATE INDEX CONCURRENTLY を複数同時実行したときに本来必要のない偽性のデッドロックエラーが生じていたのが修正されました。 (Jeff Janes) (10) (9.6) (9.5) (9.4)
  19. VACUUM FULL において、pg_class のテーブルサイズ属性をより早くに更新するようになりました。 (Amit Kapila) (10)
  20. テーブルのハッシュインデックスを再構築するとき、初期ハッシュサイズを定めるのに pg_class 統計情報が使われます。本修正で古い情報が使われるのを防ぐことができます。

  21. 列がない場合における UNION/INTERSECT/EXCEPT が修正されました。 (Tom Lane) (10)
  22. 例えば以下は同じ行内容(列なし行)なので結果は「1 row」であるべきです。

    (修正前バージョンの動作例)
    db1=# SELECT FROM generate_series(1,5) UNION SELECT FROM generate_series(1,3);
    --
    (8 rows)
    
  23. TYPE を指定するテーブルやパーティションで IDENTITY 列が使えなくなりました。 (Michael Paquier) (10)
  24. 使用したときクラッシュが生じていました。このような使い方は今のところサポートされない仕様とします。

    (クラッシュ発生例)
    db1=# CREATE TYPE type13 AS (f1 integer, f2 text, f3 bigint);
    db1=# CREATE TABLE tbl13 OF type13 (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY);
    The connection to the server was lost. Attempting reset: Failed.
    
  25. IDENTITY 列に挿入するときに正しいデフォルト値を適用するように様々な誤りが修正されました。 (Michael Paquier, Peter Eisentraut) (10)
  26. いくつかの場合、特に COPY、ALTER TABLE .. ADD COLUMN において、期待されたデフォルト値が適用されず、NULL 値が挿入されていました。

  27. 継承テーブルに外部子テーブルが含まれている場合のエラーが修正されました。 (Etsuro Fujita) (10) (9.6) (9.5)
  28. 通常テーブルと外部テーブルが継承テーブルのツリーに混在していると、UPDATE、DELETE の問い合わせで不正なプランが作られました。一部のケース、特に行レベルトリガが外部子テーブルにある場合に、目に見えるエラーとしてあらわれます。

    UPDATE 文で以下のエラーが出るケースが報告されました。

    ERROR:  could not open file "base/12345/34567": No such file or directory
    
  29. LATERAL 中の VALUES の中の相関サブクエリで生じていたエラーが修正されました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  30. (サブクエリ無しで実行できる例とエラー例)
    db2=# SELECT * FROM generate_series(1, 2) g,
            LATERAL (VALUES (g*3), (g*5)) AS v(x);
     g | x
    ---+----
     1 |  3
     1 |  5
     2 |  6
     2 | 10
    (4 rows)
    
    db2=# SELECT * FROM generate_series(1, 2) g,
            LATERAL (VALUES ((SELECT g*3)), ((SELECT g*5))) AS v(x);
    ERROR:  SubPlan found with no parent plan
    
  31. LATERAL サブクエリ内の入れ子になった UNION ALL を伴う場合にプランナが「ERROR: could not devise a query plan for the given query」でエラーになるのが修正されました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  32. 関数依存性の統計が boolean 列にも使えるようになりました。 (Tom Lane) (10)
  33. これまでは拡張統計の定義ができて情報収集も行われるにもかかわらず、プランナがこれらを適用しませんでした。

  34. グルーピング列において複数行を返す関数を含むサブクエリにより出力されたグループの数を過小評価しないようになりました。 (Tom Lane) (10)
  35. PostgreSQL 10.0、10.1 では「SELECT DISTINCT unnest(foo)」のようなケースで旧リリース系列よりもより少ない行数見積が得られており、最適でないプランが選択される可能性がありました。

  36. ロジカルレプリケーションワーカでのトリガ利用が修正されました。 (Petr Jelinek) (10)
  37. ロジカルデコーディングがクラッシュしたトランザクションのファイルを正しくクリーンアップするように修正されました。 (Atsushi Torikoshi) (10) (9.6) (9.5) (9.4)
  38. ロジカルデコーディングは多数の WAL レコードを生成するトランザクションのために、溢れた WAL レコードをディスクに書き出すことがあります。通常これらのファイルはトランザクションのコミットまたはアボートのレコードに達した後にクリーンアップされます。しかし、そのようなレコードがずっと見つからない場合、削除を行うコードは不適切な動作をしていました。

  39. 大きいトランザクションの処理中に wal sender がタイムアウトせず、割り込みに応答しない動作が修正されました。 (Petr Jelinek) (10) (9.6) (9.5) (9.4)
  40. レプリケーション起点を削除する間の競合状態が修正されました。 (Tom Lane) (10)
  41. 削除処理が無期限に待たされる可能性がありました。

  42. pg_read_all_stats ロールのメンバーは wal sender の統計を pg_stat_replication ビューで見れるようになりました。 (Feike Steenbergen) (10)
  43. pg_read_all_stats ロールはあらかじめ用意されているロールの一つです。

  44. ベースバックアップ送出中の wal sender が pg_stat_activity ビューで active として見えるようになりました。 (Magnus Hagander) (10)
  45. これまで idle と表示されていました。

  46. pg_hba_file_rules ビューでの scram-sha-256 認証メソッドの報告が修正されました。 (Michael Paquier) (10)
  47. これまでは「scram-sha256」と表示されていて、ユーザに混乱をもたらす恐れがあるので綴りが修正されました。

  48. 他の権限検査関数と同様に WITH GRANT OPTION に対応するように has_sequence_privilege() 関数が修正されました。 (Joe Conway) (10) (9.6) (9.5) (9.4) (9.3)
  49. UTF8 エンコーディングを使うデータベースで、異なるエンコーディングを主張するあらゆる XML 宣言を無視するようになりました。 (Pavel Stehule, Noah Misch) (10) (9.6) (9.5) (9.4) (9.3)
  50. XML 文字列は常にデータベースのエンコーディングで格納されます。そのため、libxml に他のエンコーディング宣言で動作できるようにすることは誤った結果をもたらしました。UTF8 以外のエンコーディングでは何にせよ非 ASCII の XML データのサポートは保証されませんので、バグ互換性のために以前の振る舞いを維持します。

    この変更は xpath() と関連する関数のみに影響があります。他の XML 処理コードは既にこのように振舞います。

  51. 将来のマイナープロトコルバージョンに対する前方互換性が提供されました。 (Robert Haas, Badrul Chowdhury) (10) (9.6) (9.5) (9.4) (9.3)
  52. 本変更でクライアントがバージョン 3.x を要求できるようになりました。これにより将来のプロトコルのマイナーバージョンアップを迅速に適用できるようになるはずです。

    これまで、プロトコルバージョン番号のメジャー部とマイナー部の間で機能的な違いがなく、PostgreSQL サーバは 3.0 より新しいバージョンの使用を単に拒絶していました。

  53. SCRAM チャンネルバインドに対応したクライアント(バージョン 11 以降の libpq など)がバージョン 10 サーバに接続できるようになりました。 (Michael Paquier) (10)
  54. バージョン 10 にはこの機能はありません。加えて、接続時のこれを使うかどうかのネゴシエーションが誤って行われていました。

  55. 内部実装関数 ConditionVariableBroadcast() が書き換えられました。 (Tom Lane, Thomas Munro) (10)
  56. 繰り返し不運なタイミングが生じるとプロセスが無限ループに陥る恐れがありました。バージョン 10 では条件変数の使用が限定されているため、これはパラレルインデックススキャンと一部のレプリケーションスロット上の操作にだけ影響があります。

  57. サブトランザクション(SAVEPOINT 等)がアボートするときに、条件変数の待機を正しくクリーンアップするようになりました。 (Robert Haas) (10)
  58. 条件変数を待機している子プロセスは postmaster プロセスが終了したなら確実に直ちに終了するようになりました。 (Tom Lane) (10)
  59. 二つ以上の Gather ノードを使う並列問い合わせでのクラッシュが修正されました。 (Thomas Munro) (10)
  60. 並列インデックススキャンでの削除された、あるいは half-dead のインデックスページを処理しているときのハングアップが修正されました。 (Amit Kapila) (10)
  61. 並列ビットマップスキャンで共有メモリセグメントを割り当てできなかったときのクラッシュが回避されました。 (Robert Haas) (10)
  62. パラレルワーカプロセスの開始失敗をうまく処理できるようになりました。 (Amit Kapila, Robert Haas) (10) (9.6) (9.5) (9.4)
  63. これまで並列問い合わせは、fork() の失敗や他の低確率な問題でワーカが開始できないときにハングアップしがちでした。

  64. 並列問い合わせを開始する際にパラレルワーカを一つも取得できなかった場合の不要な失敗を回避するようになりました。 (Robert Haas) (10)
  65. パラレルワーカからの EXPLAIN 統計の収集が修正されました。 (Amit Kapila, Thomas Munro) (10) (9.6)
  66. パラレルワーカに渡される問い合わせ文字列が確実に正しく NULL 終端するようになりました。 (Thomas Munro) (10)
  67. パラレルワーカからの postmaster ログ出力でゴミが吐き出されるのを防止します。

  68. __int128 を使う場合に安全でないアライメントの想定を回避するようになりました。 (Tom Lane) (10) (9.6) (9.5)
  69. これまでに知られている症状は一部の並列集約問い合わせでクラッシュすることです。

  70. 非常に深く入れ子になった集合操作 (UNION/INTERSECT/EXCEPT) のプラン作成での、スタックオーバーフローによるクラッシュが防止されました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  71. マージ結合内側のインデックススキャンにおける EvalPlanQual リチェック処理中のクラッシュを回避しました。 (Tom Lane) (10)
  72. これは同時に選択された行の更新が行われているときに、結合を伴う UPDATE または SELECT FOR UPDATE を行った場合にのみ発生します。

  73. テーブルに計算不能な拡張統計が定義されているときの、autovacuum のクラッシュが修正されました。 (Álvaro Herrera) (10)
  74. pg_hba.conf にある種の LDAP URL が現れた場合の NULL ポインタによるクラッシュが修正されました。 (Thomas Munro) (10) (9.6) (9.5) (9.4) (9.3)
  75. LDAP URL としてホスト名の無い「ldap://」やベース DN の無い「ldap://localhost」などがあると、pg_hba.conf を読み込む際にクラッシュが発生します。バインド DN が無い設定の場合は NULL ポインタをエラーメッセージで出力しようとして、一部のプラットフォームではクラッシュするかもしれません。

  76. 単純ハッシュテーブルの過度な成長によるモリ不足エラーが防止されました。 (Tomas Vondra, Andres Freund) (10)
  77. 以下のような単純な SELECT 文で応答が無くなったり、メモリ不足エラーになる動作が報告されていました。

    SELECT DISTINCT bigint_val FROM tbl46 ;
    
  78. PL/pgSQL ドキュメントにおける INSTR() 関数のサンプルコードが修正されました。 (Yugo Nagata, Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  79. Oracle のものと同じ動作をする instr 関数と記載されていますが、第 3 引数が負の値であった場合、第 4 引数がゼロまたは負の値であった場合の動作が Oracle の instr 関数と異なっていて、修正されました。

  80. ACL(アクセス制御)、コメント、およびセキュリティラベルのエントリをアーカイブ出力フォーマットで確実に識別できるように pg_dump が修正されました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  81. アーカイブするエントリに付与するタグが修正されました。修正前の動作は、LARGE OBJECT で始まるタグを見てラージオブジェクト関連のエントリと認識しようとします。このため、スキーマ(オブジェクト定義)ではなくデータとして間違って分類されて、スキーマのみ、あるいは、データのみのダンプの際に望ましくない結果になる可能性があります。

    この変更は pg_restore --list の出力で目に見える結果としてあらわれます。

  82. pg_rewind の実装関数 copy_file_range の名前が、新たな Linux システムコール名との競合を回避するため変更されました。 (Andres Freund) (10) (9.6) (9.5)
  83. ecpg で、正しい長さを持たない指示子の配列を見つけてエラーを出すようになりました。 (David Rader) (10) (9.6) (9.5) (9.4) (9.3)
  84. contrib/cube の cube ~> int 演算子の振る舞いが KNN 検索と互換性を持つように変更されました。 (Alexander Korotkov) (10) (9.6)
  85. 第二引数(次元指定)の意味が、様々な次元数であっても、どの値が選ばれるか予想可能になるように変更されました。

    これは非互換の変更です。これを使った式インデックスは再作成が必要ですし、マテリアライズドビューはリフレッシュが必要です。

  86. contrib/hstore で、ソースと宛先を同一にして memcpy() を使ったことによる libc のアサート発生が回避されました。 (Tomas Vondra) (10) (9.6) (9.5) (9.4) (9.3)
  87. contrib/pageinspect でタプルの NULL ビットマップの誤った表示が修正されました。 (Maksim Milyutin) (10) (9.6)
  88. contrib/pageinspect の hash_page_items() 関数の誤った出力が修正されました。 (Masahiko Sawada) (10)
  89. contrib/postgres_fdw でリモート結合を伴うプラン作成時に「ERROR: outer pathkeys do not match mergeclauses」というプランナエラーが出るのが回避されました。 (Robert Haas) (10) (9.6)
  90. contrib/postgres_fdw で、GROUP BY が重複している場合のプランナのエラーが回避されました。 (Jeevan Chalke) (10)
  91. GROUP BY の重複とは以下のようなケースです。選択リストの1番目も2番目もc1列で同一列ですが、どちらも GROUP BY 対象です。

    SELECT c1, c1 FROM ft56 WHERE c1 > 5 GROUP BY 1, 2;
    

    以下のエラーが報告されました。

    ERROR:  targetlist item has multiple sortgroupref labels
    
  92. macOS むけの PostgreSQL 自動起動のやり方について、現代的なサンプルが提供されるようになりました。 (Tom Lane) (10) (9.6) (9.5) (9.4) (9.3)
  93. contrib/start-scripts/osx は廃れた基盤を使っていて近年の macOS リリースでは動作しません。新たに contrib/start-scripts/macos にて新たな起動基盤を使ったスクリプトが提供されます。

  94. Windows でビルド時に設定で指定する OpenSSL ライブラリの誤選択が修正されました。 (Andrew Dunstan) (10) (9.6) (9.5) (9.4) (9.3)
  95. libperl の MinGW ビルドバージョンのリンクに対応しました。 (Noah Misch) (10) (9.6) (9.5) (9.4) (9.3)
  96. これはいくつかの一般的な Windows むけ Perl 配布物で PL/Perl をビルド可能にします。

  97. MSVC ビルドが 32bit libperl が -D_USE_32BIT_TIME_T を必要とするかを検査するように修正されました。 (Noah Misch) (10) (9.6) (9.5) (9.4) (9.3)
  98. Windows で postmaster 起動時にクラッシュダンプハンドラをより早期にインストールするようになりました。 (Takayuki Tsunakawa) (10) (9.6) (9.5) (9.4) (9.3)
  99. これにより起動時初期の従来ダンプが生成されなかった障害で、コアダンプ取得が可能になるでしょう。

  100. Windows で postmaster 起動時の早い時点でメッセージを出力するときの、文字エンコーディング変換関連のクラッシュが回避されました。 (Takayuki Tsunakawa) (10) (9.6) (9.5) (9.4) (9.3)
  101. 既存の NetBSD の Motorola 68K のスピンロックのコードを OpenBSD むけにも使用するようになりました。 (David Carlier) (10) (9.6) (9.5) (9.4) (9.3)
  102. Motorola 88K のスピンロックに対応しました。 (David Carlier) (10) (9.6) (9.5) (9.4) (9.3)
  103. タイムゾーンデータファイルが tzdata release 2018c に更新されました。 (10) (9.6) (9.5) (9.4) (9.3)
  104. ブラジル、サントメ・プリンシペの夏時間法の変更、ボリビア、日本、南スーダンの歴史的な修正が含まれます。US/Pacific-New ゾーンは削除されました(これは America/Los_Angeles の別名にすぎません)。