PostgreSQL 10.4 に関する技術情報

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

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

PostgreSQL 10.3 から 10.4 への変更点

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


  1. contrib/adminpack の pg_logfile_rotate() 関数から全ユーザに与えられていた実行権限が削除されました。 (Stephen Frost) (10)(9.6)
  2. adminpack がインストールされている場合、全てのユーザがログファイルのローテーションをリクエストすることができ、セキュリティ的な問題がありました。

    今回のアップデートを適用後、運用管理者は「ALTER EXTENSION adminpack UPDATE;」を実行して adminpack を更新する必要があります。これは adminpack がインストールされているすべてのデータベースが対象となります。(CVE-2018-1115)

  3. いくつかの組み込み関数の誤った変動性区分の指定が修正されました。 (Thomas Munro, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  4. 以下の関数は VOLATILE とすべきでした。変動する操作を含むかもしれないユーザから与えられた問い合わせを実行するためです。そうなっていなかったためプラン作成での誤った最適化が行われる危険がありました。

    query_to_xml
    cursor_to_xml
    cursor_to_xmlschema
    query_to_xmlschema
    query_to_xml_and_xmlschema
    

    既存データベースクラスタの関数定義はバージョンアップしただけでは修正されません。使用している各データベースにおいて管理者ユーザにて以下の SQLを実行して、修正することができます。

    ALTER FUNCTION pg_catalog.query_to_xml(text, boolean, boolean, text) VOLATILE;
    ALTER FUNCTION pg_catalog.cursor_to_xml(refcursor, int, boolean, boolean, text) VOLATILE;
    ALTER FUNCTION pg_catalog.cursor_to_xmlschema(refcursor, boolean, boolean, text) VOLATILE;
    ALTER FUNCTION pg_catalog.query_to_xmlschema(text, boolean, boolean, text) VOLATILE;
    ALTER FUNCTION pg_catalog.query_to_xml_and_xmlschema(text, boolean, boolean, text) VOLATILE;
    
  5. いくつかの組み込み関数で間違って parallel-safe とされていたものが修正されました。 (Thomas Munro, Tom Lane) (10)(9.6)
  6. 以下の関数が該当します。

    brin_summarize_new_values
    brin_summarize_range (10.x のみ)
    brin_desummarize_range (10.x のみ)
    gin_clean_pending_list
    cursor_to_xml
    cursor_to_xmlschema
    ts_rewrite
    ts_stat
    binary_upgrade_create_empty_extension
    pg_import_system_collations
    

    これらの関数は今まで parallel-restricted とされており予期せぬクエリエラーを発生させる可能性がありました。本修正は新規インストールの場合は問題ないですが、既にインストールされているものに関しては paralle-restricted のままになります。修正のためには、管理者ユーザで以下のように関数の pg_proc エントリを修正するか(全てのデータベースで実行する必要があります)、pg_upgrade を使用して本修正がされているバージョンに変更する必要があります。

    (brin_summarize_new_values 関数に対する補正 SQL 例:)
    ALTER FUNCTION pg_catalog.brin_summarize_new_values(regclass) PARALLEL UNSAFE;
    
  7. 削除済みで未 VACUUM の TOAST エントリに一致する TOAST 値 OID の再利用を回避するようになりました。 (Pavan Deolasee) (10)(9.6)(9.5)(9.4)(9.3)
  8. 一度 OID カウンタが周回していると、同じ TOAST テーブルで以前に削除されたエントリと OID が一致する TOAST 値を割り当てる可能性があります。そのエントリが未だ VACUUM されていない場合、以下のエラーがもたらされ、これが削除済みエントリが VACUUM で除去されるまで持続します。

    ERROR: unexpected chunk number 0 (expected 1) for toast value nnnnn
    

    新たな TOAST エントリを作るときにそのような OID を選ばないように修正されました。

  9. パーティション化されたテーブルに COPY をするときに、構成要素の個々パーティション上で正しくあらゆる CHECK 制約を強制するようになりました。 (Etsuro Fujita) (10)
  10. これまではパーティション化されたテーブル全体にむけて宣言された制約のみが検査されていました。

  11. パーティションキー比較関数むけのメモリ管理が修正されました。 (Álvaro Herrera, Amit Langote) (10)
  12. この誤りにより、パーティションキーにユーザ定義演算子クラスを使うときにクラッシュをひき起こす恐れがありました。

  13. パーティション化されたテーブル内の同一の行型を持たないいくつかの要素パーティションに問い合わせがタプルを挿入するときクラッシュする可能性があり、修正されました。 (Etsuro Fujita, Amit Langote) (10)
  14. ANALYZE の pg_class.reltuples を更新するアルゴリズムが変更されました。 (David Gould) (10)(9.6)(9.5)(9.4)(9.3)
  15. これまでは ANALYZE により実際にはスキャンされないページは、元のタプル密度を維持していると見做されていました。ANALYZE が全体の一部のみサンプリングする大きなテーブルでは、これは全体のタプル密度見積りが大幅に変化しないことを意味し、そのためテーブルの実際の変動にかかわらず、reltuples はテーブルの物理サイズ(relpages)におよそ比例する形で変化しました。これにより、事実上自動 VACUUM が遮断されるほど reltuples が実際より大きくなりすぎる動作がみられました。

    ANALYZE で抽出したサンプルが統計的に偏りの無いものと仮定して、観測されたサンプルのタプル密度をテーブル全体に外挿推定するように、修正されました。

  16. 拡張統計オブジェクトが、CREATE TABLE ... LIKE ... INCLUDING ALL で複製されたテーブルの属性に含まれるようになりました。 (David Rowley) (10)
  17. また、この個別制御をする INCLUDING STATISTICS オプションが追加されました。

  18. bigint型の IDENTITY列を伴う CREATE TABLE ... LIKE が修正されました。 (Peter Eisentraut) (10)
  19. long が 32 ビットのプラットフォーム(大部分の 32 ビットマシンのみならず 64ビット Windows が含まれます)では、コピーされたシーケンスパラメータが 32 ビットに切り捨てされていました。

  20. SERIALIZABLE または REPEATABLE READ トランザクション隔離レベルで同時実行する CREATE INDEX CONCURRENTLY コマンドでのデッドロックが回避されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)
  21. REFRESH MATERIALIZED VIEW CONCURRENTLY が遅く実行される可能性があり、修正されました。 (Thomas Munro) (10)(9.6)(9.5)(9.4)
  22. 参照されるカーソルが IndexOnlyScan 実行プランを使うときにUPDATE/DELETE ... WHERE CURRENT OF が失敗しないように修正されました。 (Yugo Nagata, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  23. 予期せぬエラー「ERROR: cannot extract system attribute from virtual tuple」が発生する例が報告されていました。

  24. パラメタ化されたパスにプッシュされたJOIN句の不正なプラン作成が修正されました。 (Andrew Gierth, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  25. この間違いは、単純なフィルタ条件であるべきときに外部結合に対する結合フィルタ条件の誤まった分別が生じ、誤った結合結果をもたらしました。

    以下の誤動作例が報告されました。

    db=# CREATE TABLE t AS SELECT 1 AS x, '{10,20}'::int[] AS ys;
    db=# SELECT * FROM t
    LEFT JOIN (VALUES (1, 10), (2, 20)) AS q1 (x, y) ON q1.x = t.x
    LEFT JOIN unnest(ys) q2 (y) ON q2.y = q1.y;
    x | ys | x | y | y
    ---+---------+---+----+----
    1 | {10,20} | 1 | 10 | 10
    1 | {10,20} | 2 | 20 |
    (2 rows)
    
  26. 複合インデックスの列に同じテーブルの列が現れて、これらインデックス列の一部だけが列の値を返せる演算子クラスを使うときに、誤った IndexOnlyScan プランが生成される可能性があり、修正されました。 (Kyotaro Horiguchi) (10)(9.6)(9.5)
  27. 以下のようなインデックスで該当します。

    CREATE INDEX ON text_tbl USING gist (text_col gist_trgm_ops, text_col);
    CREATE INDEX ON inet_tbl USING gist (inet_col gist_inet_ops, inet_col inet_ops);
    
  28. トップレベルに AND/OR 条件の NULL と証明可能な副句を持つ CHECK 制約の、誤った最適化が修正されました。 (Tom Lane, Dean Rasheed) (10)(9.6)(9.5)(9.4)(9.3)
  29. 例えば以下のように「制約による除外」の最適化で除外すべきでない子テーブルが除外されてしまうことがあり得ました。

    db=# CREATE TABLE cnullp (f1 int);
    db=# CREATE TABLE cnullc (check (f1 = 1 OR f1 = null)) INHERITS (cnullp);
    db=# INSERT INTO cnullc VALUES (1), (2), (null);
    db1=# EXPLAIN SELECT * FROM cnullp ;
    QUERY PLAN
    ----------------------------------------------------------------
    Append (cost=0.00..35.50 rows=2551 width=4)
    -> Seq Scan on cnullp (cost=0.00..0.00 rows=1 width=4)
    -> Seq Scan on cnullc (cost=0.00..35.50 rows=2550 width=4)
    (3 rows)
    
    db1=# EXPLAIN SELECT * FROM cnullp WHERE f1 = 2;
    QUERY PLAN
    ------------------------------------------------------------
    Append (cost=0.00..0.00 rows=1 width=4)
    -> Seq Scan on cnullp (cost=0.00..0.00 rows=1 width=4)
    Filter: (f1 = 2)
    (3 rows)
    
  30. 問い合わせが複数 GROUPING SETS を持ち、それらのいずれもがソートによる実行プランがとれないときのプランナのクラッシュが防止されました。 (Andrew Gierth) (10)
  31. (大小比較ができないのでソート不能な xid 型によるクラッシュをひき起こす SQL 例)
    db=# CREATE TABLE t18 (id int, x1 xid, x2 xid);
    db=# INSERT INTO t18 VALUES (1, '1', '1'), (2, '2', '2'), (3,'3','3');
    db=# SELECT x1, x2, count(*) FROM t18 GROUP BY GROUPING SETS ((x1), (x2));
    
  32. GROUPING SETS の一部の使用法において、エグゼキュータのメモリ二重解放によるクラッシュが修正されました。 (Peter Geoghegan) (10)(9.6)(9.5)
  33. トリガ関数内における遷移テーブルを自己結合する問い合わせの誤実行が修正されました。 (Thomas Munro) (10)
  34. UNION で遷移テーブルへの SELECT を繋ぐ場合なども該当します。

  35. テーブル書き換えのイベントトリガ追加が、そのようなトリガを呼び出すかもしれないコマンドと同時に行われた場合のクラッシュが回避されました。 (Álvaro Herrera, Andrew Gierth, Tom Lane) (10)(9.6)(9.5)
  36. 準備されたトランザクションのコミットをしているときに、問い合わせのキャンセルやセッション終了割り込みが起きた場合の障害が回避されました。 (Stas Kelvich) (10)(9.6)(9.5)(9.4)(9.3)
  37. 繰り返し実行されているハッシュ結合での問い合わせ処理の間のメモリリークが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  38. ビジビリティマップのバッファピンでメモリのリークまたは二重解放の可能性があり、修正されました。 (Amit Kapila) (10)(9.6)
  39. ページに全て可視であると偽性の印付けするのを回避しました。 (Dan Wood, Pavan Deolasee, Álvaro Herrera) (10)(9.6)
  40. これは一部タプルがロックされている(しかし削除されていない)場合に起きる可能性がありました。問い合わせが未だ正しく実行中の間、VACUUM は通常そのようなページを無視します。これはタプルがずっと凍結されないという長期の影響を伴います。

    最近のリリースでは、これによりエラー「ERROR: found multixact nnnnn from before relminmxid nnnnn」を出しました。

  41. heap_prepare_freeze_tuple の厳格すぎるサニティチェックが修正されました。 (Álvaro Herrera) (10)(9.6)(9.5)(9.4)(9.3)
  42. これは pg_upgrade で 9.2 以前のバージョンからアップグレードされたデータベースにて、誤った「ERROR: cannot freeze committed xmax ...」エラーをひき起こしました。

  43. C 言語で記述された更新前に実行される行トリガが OLD タプルを返すときのダングリングポインタ参照が防止されました。 (Rushabh Lathia) (10)(9.6)(9.5)(9.4)(9.3)
  44. 自動 VACUUM ワーカをスケジューリングする間のロックが軽減されました。 (Jeff Janes) (10)(9.6)(9.5)(9.4)(9.3)
  45. これまでの振る舞いは多テーブルデータベースにおいて潜在的なワーカの同時実行性を大幅に削いでいました。

  46. pg_stat_activity のデータをローカルメモリにコピーするときに、クライアントホスト名(client_hostname)が確実にコピーされるようになりました。 (Edmund Horner) (10)(9.6)(9.5)(9.4)(9.3)
  47. これまでは、ローカルとされるスナップショットが共有メモリへのポインタを含んでおり、いずれかの存在するセッションが切断された場合に client_hostname が予期せず変わることがあり得ました。

  48. 補助プロセスに対する pg_stat_activity の情報を正しく扱うようになりました。 (Edmund Horner) (10)
  49. 各種補助プロセス(autovacuum launcher や background writer など)に対する application_name、client_hostname、query 属性が正しくないデータを見せる可能性がありました。

  50. ispell 辞書で不正な複合接辞の処理が修正されました。 (Arthur Zakirov) (10)(9.6)(9.5)(9.4)(9.3)
  51. 未初期化メモリアクセスが生じていました。

  52. テキスト列に対する SP-GiST インデックスで照合を伴う検索(不等演算子を使うインデックススキャン)が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  53. C ロケール以外の場合に該当する検索では誤った行が選択されました。マルチバイト文字でも影響があります。

    (報告された例)
    db=# CREATE TABLE t32 (a text collate "cs_CZ");
    db=# INSERT INTO t32 VALUES ('c'), ('ch'); -- チェコ語では ch で1文字
    db=# SELECT * FROM t32 where a < 'd';
    a
    ----
    c
    (1 row)
    
    db=# CREATE INDEX ON t32 USING spgist (a);
    db=# SET enable_seqscan TO off;
    db=# SELECT * FROM t32 where a < 'd';
    a
    ----
    c
    ch
    (2 rows)
    
  54. 探索値(traversalValue)を使う SP-GiST 演算子クラスでの問い合わせの間のメモリリークが防止されました。 (Anton Dignös) (10)(9.6)
  55. SP-GiST インデックスの初期構築時に、インデックスタプルの数を正しく数えるようになりました。 (Tomas Vondra) (10)(9.6)(9.5)(9.4)(9.3)
  56. これまで、タプル数はインデックス対象のテーブルと同じと報告されていましたが、これは部分インデックスの場合には誤りでした。

  57. GiST インデックスの VACUUM 中にインデックスタプル数を正しく数えるようになりました。 (Andrey Borodin) (10)(9.6)(9.5)(9.4)(9.3)
  58. これまではヒープタプルの見積数を返していました。それは単なる推測であり、間違っている場合もありましたし、インデックスが部分的なものである場合は必ず間違っていました。

  59. ストリーミングレプリケーションのスタンバイが継続している WAL レコード内で滞ってしまった場合の動作が修正されました。 (Kyotaro Horiguchi) (10)(9.6)(9.5)(9.4)
  60. 今までは XLogPageRead() が既に読み込みを終えた部分であったとしても、WAL の最初からストリーミングレプリケーションを再開していました。これにより稀にストリーミングレプリケーションが止まってしまう現象が生じました。

  61. walsender が再起動した際に、WAL データを二重に処理してしまう可能性が排除されました。 (Craig Ringer) (10)(9.6)(9.5)(9.4)
  62. walsender が $PGDATA/pg_replslot 内にデータを残した状態で終了してしまった場合、次の walsender がそこに残ったデータを捨てることなく開始して、データが重複する可能性がありました。

  63. ロジカルレプリケーションにおいて、型の OID がローカルとリモートで一致すると仮定しないように修正されました。 (Masahiko Sawada) (10)
  64. リモートのものをローカルのものとして使用しており、「ERROR: cache lookup failed for type XYZ」エラー、もしくはランダムに意図していないものが選択される可能性がありました。

  65. scalarltsel と scalargtsel が組み込みデータ型以外の型も受け付けるようになりました。 (Tomas Vondra) (10)(9.6)(9.5)(9.4)(9.3)
  66. ユーザ定義の数値データ型で予期せぬ「ERROR: unsupported type: nnnnn」が生じることが報告されました。

  67. 大量のクエリ結果が収集された後にサーバエラーが報告された時のlibpq が消費するメモリ量が削減されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  68. エラーメッセージをパース後にクエリ結果を捨てていましたが、事前に捨てるようになりました。その結果メモリ消費量を抑え out-of-memory になる危険性が軽減されました。

  69. ecpg 内の連続した free() によるクラッシュが修正されました。 (Patrick Krecker, Jeevan Ladhe) (10)(9.6)(9.5)(9.4)(9.3)
  70. MSVC を使用したビルドにて ecpg が long long int 変数を扱えるように修正されました。 (Michael Meskes, Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
  71. ダンプ内でリストを値とする GUC 変数に対する間違ったクォーテーションが修正されました。 (Michael Paquier, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  72. pg_dump の結果で local_preload_libraries、session_preload_libraries、shared_preload_libraries と temp_tablespaces 変数に対するクォーテーションの付け方が間違っていました。もしもこれらの設定が CREATE FUNCTION ... SET や ALTER DATABASE/ROLE ... SET にある場合に問題になる可能性がありました。

  73. pg_recvlogicalが v10より前のPostgreSQLに対して失敗しないように修正されました。 (Michael Paquier) (10)(9.6)(9.5)(9.4)
  74. 前回のリリースにて変更された search_path へのプロテクトが追加されていましたが、10 より前のバージョンではレプリケーション接続で SQL を受け付けないため有効でなく、構文エラーが発生する可能性がありました。

  75. pg_rewind 起動中にソースサーバで削除されたファイルがターゲットサーバでも確実に削除されるようになりました。 (Takayuki Tsunakawa) (10)(9.6)(9.5)
  76. 失敗していた場合、ターゲットサーバがデータ不整合に陥っていました。

  77. pg_rewind がデフォルト以外のテーブルスペースにあるテーブルデータを正しく扱えるように修正されました。 (Takayuki Tsunakawa) (10)(9.6)(9.5)
  78. PL/pgSQL 整数 FOR ループのオーバーフロー処理が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  79. 以前のコードではいくつかの GCC 以外のコンパイラではオーバーフローが検知されず、無限ループに陥っていました。

  80. PL/Python のリグレッションテストが Python 3.7 の環境でも成功するように調整されました。 (Peter Eisentraut) (10)(9.6)(9.5)(9.4)(9.3)
  81. MSVC ビルドにて PL/Python と関連モジュールのリグレッションテストが Python 3 でもサポートされました。 (Andrew Dunstan) (10)(9.6)(9.5)(9.4)(9.3)
  82. contrib/bloom インデックスの初期ビルドでのエラーが修正されました。 (Tomas Vondra, Tom Lane) (10)(9.6)
  83. インデックス内のタプル数を推測でなく確実にカウントすることで最後のタプルが取りこぼされる可能性がなくなりました。

  84. b64_encode と b64_decode 内部関数の名前が Solaris 11.4 の組み込み関数名と被らないように変更されました。 (Rainer Orth) (10)(9.6)(9.5)(9.4)(9.3)
  85. b64_encode は pg_base64_encode に、b64_decode は pg_base64_decode に名前変更されました。

  86. タイムゾーンライブラリが IANA の tzcode release 2018e と同期されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  87. これは zic タイムゾーンデータコンパイラが負の夏時間オフセットで動作するように修正します。PostgreSQL はこのようなタイムゾーンデータに直ちには対応しませんが、zic を IANA から直接取得したタイムゾーンデータで使う可能性がありますので、確実を期してアップデートされました。

  88. タイムゾーンデータファイルが tzdata release 2018d に更新されました。 (10)(9.6)(9.5)(9.4)(9.3)
  89. パレスチナと南極(ケーシー基地)の DST 法の変更、ポルトガルとその植民地、エンダーベリー島、ジャマイカ、タークス・カイコス諸島、ウルグアイの歴史的修正が加えられています。

  90. Microsoft Visual Studio 2015 でのビルドがサポートされました。 (Michael Paquier) (9.5)
  91. 以前のリリースでも修正が行われていましたが、修正もれがありました。