PostgreSQLリリース情報 一括表示

こちらは 9.3.1 から 16.2 までのマイナーバージョンリリース情報をまとめて表示するページです。
本ページでは各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。

16.2、15.6、14.11、13.14、12.18 (2024年2月8日リリース)の変更点

  1. REFRESH MATERIALIZED VIEW CONCURRENTLY 内でのセキュリティ上の制限を厳格化しました。 (Heikki Linnakangas) (16)(15)(14)(13)(12)
  2. 同時リフレッシュのある一段階が弱いセキュリティ制限のもとで実行されていました。マテリアライズドビューの所有者が、何らか説きつけて、スーパーユーザや他の高権限ユーザにそのビューの同時リフレッシュをさせた場合、REFRESH を実行したユーザの権限でコードを実行させることができました。

    全てのユーザ定義コードはマテビュー所有者として実行されるように修正されました。これが期待される動作でした。

    この誤りを使った権限奪取は PostgreSQL 16.x では実施できないことが知られていて、おそらく 16.x では実際には脆弱性が無いと見られます。(CVE-2024-0985)

  3. JIT のインライン化を実行する時のメモリリークが修正されました。 (Andres Freund, Daniel Gustafsson) (16)(15)(14)(13)(12)
  4. 多数の JITコンパイルの後にバックエンドプロセスがメモリ不足状態になることが報告されていました。

  5. 不正なパーティション結合のプランが生成されないように修正されました。 (Richard Guo) (16)(15)(14)(13)(12)
  6. LATERAL参照を伴うまれな状況で、不正な実行プランが作られる可能性がありました。影響を受ける場合には、誤った問い合わせ結果が返る、「ERROR: variable not found in subplan target list」などの奇妙なエラーになる、あるいは、エグゼキュータでプロセスがクラッシュする可能性がありました。

  7. PlaceHolderVar でサブクエリ出力式の不正なラッピングが修正されました。 (Tom Lane) (16)(15)(14)(13)(12)
  8. サブクエリが、外部結合の下にあって、外部結合のスコープ外にあるものを LATERAL参照する出力列を持っているとき、誤った問い合わせ結果が生じる可能性がありました。外部結合により生じるべき出力列の NULL が、異なる値になる可能性がありました。

    PlaceHolderVar はプランナの実装コードにおいて別のプランノード結果から値が充当される変数を意味します。

  9. ウィンドウ関数の条件実行(EXPLAIN で「Run Condition:」と出力される動作)の誤動作が修正されました。 (Richard Guo) (16)(15)
  10. 本誤りにより予期せぬエラー「ERROR: WindowFunc not found in subplan target lists」が生じるおそれがありました。

  11. Memoize プランについて内側のユニーク性の検出について修正されました。 (Richard Guo) (16)
  12. この誤りにより「ERROR: cache entry already complete」が生じるおそれがありました。

  13. 定数畳み込みをするフィールドを選択するときの varnullingrels の計算が修正されました。 (Richard Guo) (16)
  14. 「ERROR: wrong varnullingrels (b) (expected (b 3)) for Var 2/2」といった予期せぬエラーが発生することがありました。

    varnullingrels はプランナの実装コードにおける変数ノードの修飾情報の一つです。

  15. MERGE がパーティションにまたがる更新をするときに、不適切な動作を行わないようになりました。 (Dean Rasheed) (16)(15)
  16. パーティションテーブルに対して MERGE UPDATE 動作をするときに、パーティションキーを変更するために UPDATE が DELETE と INSERT に置き換えられる場合に「AFTER UPDATE ROW」トリガを発効しないようになりました。RLS 検査などの他の UPDATE 後のアクションも同様に行われなくなります。

    これらのアクションは一般的には失敗します。このことは通常の UPDATE で実行しない理由であり、MERGE でも実行すべきではありません。

  17. パーティションにまたがる MERGE の更新で、BEFORE ROW DELETE トリガが動作するようになりました。 (Dean Rasheed) (16)(15)
  18. このようなトリガが NULL を返すことで更新を妨げようとした場合、MERGE がエラーやアサート失敗を引き起こしていました。

    「ERROR: could not open file "base/16384/16393.1" (target block 3081245700): previous segment is only 1 blocks」というエラーが出るケースが報告されました。

  19. BEFORE ROW UPDATEトリガで PINされていないバッファへのアクセスが防止されました。 (Alexander Lakhin, Tom Lane) (16)(15)(14)
  20. 更新中タプルが別セッションによって更新されて別ページに移動されたばかりの場合、バッファへの PINなしに新しいタプルバージョンからデータを取得しようとするタイミングがありました。これにより原理的には、新タプルの未更新列にガベージデータが表示される可能性がありました。

    実際に問題が生じる可能性は低いと見られます。

  21. パラレルハッシュ結合で巨大な共有メモリ領域の要求が回避されました。 (Thomas Munro, Andrei Lepikhov, Alexander Korotkov) (16)(15)(14)(13)(12)
  22. 上限値が大きすぎたために、予想ハッシュテーブルサイズが大きい場合に「ERROR: invalid DSA memory alloc request size ..」エラーが発生することがありました。

  23. 一時テーブルを拡張しようとしてエラーが発生するときに、ローカルバッファ状態が破損されることがあり、修正されました。 (Tender Wang) (16)
  24. ディスク不足時にエラーが生じた後、アサート失敗が生じるケースが報告されました。

  25. 複数引数を持つ DISTINCT 指定された集約を評価するときに、誤ったタプルスロットの使用が修正されました。 (David Rowley) (16)
  26. この誤りにより、エグゼキュータで「ERROR: attribute 1 of type record has wrong type」などのエラーが生じる可能性がありました。

    (エラー発生例)
    db1=# SELECT
            string_agg(DISTINCT 'a', ','),
            sum((SELECT sum(1) FROM (VALUES(1)) b(id) WHERE a.id = b.id))
            FROM unnest(array[1]) a(id);
    ERROR:  attribute 1 of type record has wrong type
    DETAIL:  Table has type text, but query expects integer.
    
    (正しい応答)
     string_agg | sum
    ------------+-----
     a          |   1
    (1 row)
    
  27. 外部キーの制約トリガで更新されるタプルが追加の可視性検査に失敗するときに、heap_update() と heap_delete() でアサート失敗にならないように修正されました。 (Alexander Lakhin) (16)(15)(14)(13)(12)
  28. この誤りはアサートを無効にした実運用むけビルドでは、何ら影響はありません。

  29. 複雑な継承テーブルツリーに対する ALTER TABLE .. ADD COLUMN でエラーになることがあり、修正されました。 (Tender Wang) (16)(15)(14)(13)(12)
  30. 孫テーブルが複数の中間の親テーブルを通して新たな列を継承した場合、「ERROR: tuple already updated by self」エラーが生じました。

  31. ALTER TEXT SEARCH CONFIGURATION ... MAPPING で指定するトークン名が重複している場合の問題が修正されました。 (Tender Wang, Michael Paquier) (16)(15)(14)(13)(12)
  32. これまでは「ERROR: tuple already updated by self」が発生していました。

  33. DROP RULE で重複したロール名を指定した場合について修正されました。 (Michael Paquier) (16)
  34. これまでは「ERROR: tuple already updated by self」が発生していましたが、これからは重複した指定を無視してエラーを出さないようになります。

    (これまでのエラー例)
    db1=# CREATE ROLE u;
    db1=# DROP ROLE u, u;
    ERROR:  tuple already updated by self
    
  35. DROP STATISTICS が関連するテーブルに適切にロックを取得するようになりました。 (Tomas Vondra) (16)(15)(14)(13)(12)
  36. ロック取得不足のため、DROP STATISTICS を ANALYZE と同時に実行した場合に、「ERROR: tuple concurrently deleted」が発生していました。

  37. GENERATED と DEFAULT の式で関数の揮発性検査が修正されました。 (Tom Lane) (16)(15)(14)(13)(12)
  38. これらの場所では、関数のデフォルト引数に VOLATILE 関数が指定されているのを検出できなかったり、使われる具体的なデータ型について実際には IMMUTABLE であるのに多様関数を VOLATILE と判断したりする可能性がありました。

    これにより GENERATED句を不適切に拒否または受け入れしたり、ALTER TABLE .. ADD COLUMN で定数デフォルト値の最適化を誤って適用したりする可能性がありました。

  39. フィールドを TOAST から展開するときに、新たなカタログキャッシュエントリが古くなったことを検出するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)
  40. カタログタプルの行外フィールドは何であれ、カタログキャッシュに挿入する前に、TOAST展開されます。これはカタログキャッシュエントリを無効化するかもしれないデータベースアクセスと関わりますが、新たなエントリはまだキャッシュに存在していません。その結果、既に古くなったキャッシュエントリが作られて永続化するかもしれないという競合動作になります。これにより(例えば DDL の同時実行で稀に)予期せぬ振る舞いがもたらされました。

    TOAST展開後にタプルの可視性を再チェックすることで修正されました。

  41. 一部プラットフォームにおけるエッジケースの整数オーバーフロー検知の誤りが修正されました。 (Dean Rasheed) (16)(15)(14)(13)(12)
  42. 「0 - INT64_MIN」の計算はオーバーフローエラーとなるべきで、大部分のプラットフォームではそうなっています。しかしながら、組み込みの整数オーバーフローが無く、128-bit整数も無いプラットフォームの場合、オーバーフローを検知できず、INT64_MIN の値を返していました。

  43. timestamp型の値に interval型の値を足し引きするときに、ユリウス日のオーバーフローを検出するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)
  44. timestamp型の範囲を越えていて「ERROR: timestamp out-of-range」を出すべき一部の場合で、ERROR ではなく誤った問い合わせ結果を返していました。

  45. interval_mul() と interval_div() でオーバーフロー検査を更に追加しました。 (Dean Rasheed) (16)(15)(14)(13)(12)
  46. interval型の値の掛け算と割り算で、「ERROR: interval out of range」を出すべき一部ケースで、ERROR ではなく誤った問い合わせ結果を返していました。

  47. 内部実装関数 scram_SaltedPassword() が割り込み可能になりました。 (Bowen Shi) (16)
  48. 大きな scram_iterations(イテレーション回数が多い)場合に、本関数は時間を要します。本関数は例えば password_encryption が scram-sha-256 であるときに ALTER ROLE ... PASSWORD '...' でパスワード変更するときに使われます。本修正により本関数実行中に問い合わせのキャンセルが可能になりました。

  49. 設定パラメータ stats_fetch_consistency が変更されたときに、キャッシュされた統計情報が確実に破棄されるようになりました。 (Shinya Kato) (16)(15)
  50. 一部のコードパスで、古い統計情報が返される可能性がありました。本修正は以下のビューの応答に影響があります。

     pg_stat_archiver
     pg_stat_bgwriter
     pg_stat_checkpointer
     pg_stat_io
     pg_stat_slru
     pg_stat_wal
    
  51. pg_file_settingsビューが backend および superuser-backend コンテキストの設定について未適用の値の妥当性を検査するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)
  52. これまで、該当の設定パラメータについて無効な値であっても error列に何も出力されませんでした。

    (16.x での該当設定パラメータ)
     ignore_system_indexes
     jit_debugging_support
     jit_profiling_support
     log_connections
     log_disconnections
     post_auth_delay
    
  53. 新たなパーティションインデックスに既存インデックスを当てはめるときに、照合順序も一致させるようになりました。 (Peter Eisentraut) (16)(15)(14)(13)(12)
  54. これまではパーティションキーの対応する要素から、異なる照合順序を持つインデックスも受け入れていて、誤動作を引き起こす可能性がありました。

  55. パーティションインデックスに対する REINDEX INDEX で、子インデックスが同時に削除された場合のエラーを回避するようになりました。 (Fei Changhong) (16)(15)(14)
  56. 予期せぬ「ERROR: could not open relation with OID」が発生していました。

  57. GINインデックスの内部ページの不完全な分割をクリーンアップする時の、不十分なロックが修正されました。 (Fei Changhong, Heikki Linnakangas) (16)(15)(14)(13)(12)
  58. バッファへの(排他ロックではなく)共有ロックでこれを行おうとしていましたが、二つのプロセスが同時にクリーンアップを行おうとするとインデックス破損が生じる可能性がありました。

  59. GINインデックスの挿入で早すぎるバッファPIN の解放が回避されました。 (Tom Lane) (16)(15)(14)(13)(12)
  60. インデックスのルートページの分割が自身の挿入と同時に生じると、「ERROR: buffer NNNN is not owned by resource owner」になる可能性がありました。

  61. パーティションテーブルに対する SP-GiSTインデックス のエラーが回避されました。 (Tom Lane) (16)(15)(14)(13)(12)
  62. このようなインデックスを使用しようとして、「ERROR: could not open file "pg_tblspc/0/PG_16_202307071/0/0": No such file or directory」といったエラーが生じる可能性がありました。

  63. ラージオブジェクトの所有者検査が修正されました。 (Tom Lane) (16)
  64. 所有者権限が必要なラージオブジェクト操作(例えば GRANT や COMMENT)で、所有者ユーザであってもスーパーユーザでない限り、「ERROR: unrecognized class ID: 2613」といったエラーが出て失敗しました。

  65. ラージオブジェクトの所有者変更の報告について修正されました。 (Tom Lane) (16)(15)(14)(13)(12)
  66. 何もしない ALTER LARGE OBJECT OWNER コマンド(元の所有者を指定するなど)が、誤った class ID を PostAlterHook に渡していました。本フックを使っている拡張に混乱をもたらしていたと考えられます。

  67. EXPLAIN (BUFFERS) での I/O タイミングデータの報告が修正されました。 (Michael Paquier) (16)(15)
  68. 「shared/local」ラベルの数は実際には共有バッファだけを参照していました。本修正で、このラベルは「shared」に変更されました。

  69. CREATE DATABASE の耐久性が保証されるようになりました。 (Noah Misch) (16)(15)
  70. これまで、CREATE DATABASE の実行中や直後に OSクラッシュが生じた場合、リカバリに失敗したり、起動後にそのデータベースへの接続に失敗する可能性がありました。同様のタイミングでベースバックアップを取得した場合にも、そのバックアップを使用する時に似た問題が起きる可能性がありました。症状としては、データベースディレクトリや PG_VERSIONファイル、pg_filenode.mapファイルが欠損するか空になります。

  71. バックアップからのリカバリ開始時、終了時に「LOG」メッセージをより多く出すようになりました。 (Andres Freund) (16)(15)
  72. リカバリの問題を診断するのに役立つ追加情報がマスタプロセスのログとして提供されます。具体的には以下のメッセージです。

    LOG:  starting backup recovery with redo LSN XX/XXXXXXXX, checkpoint LSN XX/XXXXXXXX, on timeline ID NN
    LOG:  restarting backup recovery with redo LSN XX/XXXXXXXX
    LOG:  completed backup recovery with redo LSN XX/XXXXXXXX and end LSN XX/XXXXXXXX
    
  73. スタンバイサーバがサブトランザクションでデッドインデックスタプルを不正に処理するのが、防止されました。 (Fei Changhong) (16)(15)(14)(13)(12)
  74. 実装においてサブトランザクションで startedInRecoveryフラグが正しく設定されていませんでした。これはデッドインデックスタプルの処理にのみ影響があります。この誤りにより、サブトランザクション中の問い合わせが返すべき(プライマリではデッドだがスタンバイでは未だ有効な)インデックスエントリを無視してしまう可能性があり、誤った問い合わせ結果が生じます。あるいは、未だプライマリではデッドになっていないインデックスエントリにデッドと早すぎる印付けをしてしまう可能性がありました。後者は深刻な結果になるか明らかではありませんが、想定された動作ではありません。

  75. walreceiverプロセスのシグナル処理が修正されました。 (Heikki Linnakangas) (16)
  76. レプリケーション接続確立まで待つ間、walreceiver を SIGTERM に応答しないようにした変更を、旧に戻しました。以前の変更内容では、スタンバイ昇格が妨げられることがありました。

  77. レコードが WALデコーディングのバッファに収まるかどうかの検査で、整数オーバーフローの危険があり、修正されました。 (Thomas Munro) (16)(15)
  78. このバグは 64-bitプラットフォーム上で 32-bit ビルドした PostgreSQL を稼働させる場合を除き、顕在化しないと考えられます。

  79. ロジカルレプリケーションの apply worker と、その tablesync worker、および、ALTER SUBSCRIPTION を試みるセッションプロセスの間のデッドロックが修正されました。 (Shlok Kyal) (16)(15)(14)(13)(12)
  80. このデッドロックの一端はロック待ちと無関係であるため、デッドロックに陥ると自動では検出できず、(コマンドキャンセルやプロセス停止など)手動で介入しない限り永続的に止まってしまいます。

    tablesync worker はロジカルレプリケーションのテーブル初期同期を行うものです。apply worker は変更差分の適用を行います。

  81. pgoutput 論理レプリケーション・プラグインで、列のデフォルト値が正しく転送されることが保証されました。 (Nikhil Benesch) (16)(15)
  82. 新しい列にデフォルトの定数値を持つ ALTER TABLE ... ADD COLUMN ... は、既存のタプルの書き換えをせず、代わりにタプルの読み取りコードが正しいデフォルト値を挿入することを期待していました。

    その後、そのテーブルでレプリケーションが開始された場合、pgoutput は正しいデフォルト値の代わりに NULL を送信し、サブスクライバで不正なレプリケーションを引き起こしていました。

  83. 列のないテーブルに対する論理レプリケーションの初期同期の失敗が修正されました。 (Vignesh C) (16)(15)
  84. このケースでは、不適切な形式の COPY コマンドが生成されていました。

  85. 使用する前にサブスクリプションの接続文字列を再検証するようになりました。 (Vignesh C) (16)
  86. これは、password_required=true のサブスクリプションがスーパーユーザを所有者として接続文字列にパスワードなしで作成されたけれども、その後に所有者が非スーパーユーザに変更されたケースを検出することを目的としています。

    これまではパスワードファイルや PGPASSWORD環境変数でパスワードが供給されれば、接続文字列にパスワードの無いサブスクリプションを一般ユーザで利用可能でした。

  87. 新しいクライアントが、サーバのパスワードチャレンジに応答せずに切断した場合に、CheckPWChallengeAuth が正しいステータスコードを返すようになりました。 (Liu Lang, Tom Lane) (16)(15)(14)(13)(12)
  88. CheckPWChallengeAuth は PostgreSQL実装内部の関数です。これまで一部ケースでこの場合をログ出力されるエラーとして扱っていました。これは意図したものではなく、psql のような一般的なクライアントで頻繁にある動作であるため、ログスパムの生成につながっていました。

    また、この誤りは ClientAuthentication_hook を使用する拡張を混乱させたかもしれません。

  89. OpenSSL 3.2 との非互換性が修正されました。 (Tristan Partin, Bo Andreson) (16)(15)(14)(13)(12)
  90. 「data」フィールドの使用に代えて BIO「app_data」フィールドを使用するようになりました。以前のバージョンでは問題ありませんでしたが、3.2 ではクラッシュや二重解放のエラーを引き起こしていました。

  91. OpenSSLがエラー時に errno を設定しないことに、より注意するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)
  92. 以前の実装では、errno が設定されていない場合、報告されたエラーの原因は EOF の読み込みだと決めつけていました。 これにより「could not accept SSL connection: Success」のような奇妙なエラー報告が稀に発生していました。

  93. 外部データラッパーの ForeignAsyncRequest関数が失敗した場合の、ファイルディスクリプタのリークが修正されました。 (Heikki Linnakangas) (16)(15)(14)
  94. 外部テーブルから構成されたパーティションテーブルへの問い合わせなどで、非同期実行が使われたときに ERROR を出す場合に、該当している可能性があります。

  95. CREATE SUBSCRIPTION の接続文字列検証における軽度のメモリリークが修正されました。 (Jeff Davis) (16)
  96. ファイル関連のシステムコールによる ENOMEM エラーを「internal_error」(SQLSTATE: XX000) ではなく、「out_of_memory」(SQLSTATE: 53200) として報告するようになりました。 (Alexander Kuzmenkov) (16)(15)(14)(13)(12)
  97. PL/pgSQL の中で SQL標準形式の本体を持つ CREATE FUNCTION / CREATE PROCEDURE をサポートするようになりました。 (Tom Lane) (16)(15)(14)
  98. 以前は、関数本体にセミコロンが含まれているため、構文エラーとなっていました。

    (本マイナーバージョンから実行可能になった PL/pgSQL の例)
    db1=# DO LANGUAGE plpgsql $$
          BEGIN
            CREATE FUNCTION f1() RETURNS int
              BEGIN ATOMIC
                SELECT 1;
              END;
            END $$;
    
    (以前は以下のようなエラーになった)
    ERROR:  syntax error at end of input
    LINE 5:             SELECT 1;
    
  99. libpq によるパイプラインのエラー処理が修正されました。 (Álvaro Herrera) (16)(15)(14)
  100. クエリの問題以外の理由 (接続が失われた場合など) でエラーが返された場合、パイプラインの状態が同期しなくなる可能性があります。これにより、呼び出し側のアプリケーションでビジーループが発生する可能性がありました。

  101. libpq の PQsendFlushRequest() 関数が、他の「PQsend」関数と同じルールの下でクライアント出力バッファをフラッシュするようになりました。 (Jelte Fennema-Nio) (16)(15)(14)
  102. パイプラインモードでも、引き続き PQflush() を呼び出す必要がある場合がありますが、この変更により一部の不整合が解消されます。

  103. libpq が 2つの異なるスレッドで OpenSSL を同時に初期化するときの競合状態を、回避するようになりました。 (Willi Mann, Michael Paquier) (16)(15)(14)(13)(12)
  104. GSSAPI データ送信におけるタイミング依存のエラーが修正されました。 (Tom Lane) (16)(15)(14)(13)(12)
  105. ノンブロッキングモードで GSSAPI 暗号化を使用すると、libpq が「GSSAPI caller failed to retransmit all data needing to be retried」というエラーを出して、サーバへのデータ送出に失敗することがありました。

  106. postgresql.conf の lc_ で始まる設定パラメータ(例えば lc_messages)のコメントを常に解除するように、initdb が変更されました。 (Kyotaro Horiguchi) (16)
  107. initdb は V16以前は postgresql.conf の「lc_...」パラメータのコメントを常に解除していて、本マイナーバージョンアップで再び元の動作に戻されました。16.0 の変更により、initdb の --no-locale オプションがlc_messages に意図した効果を及ぼさなくなっていました。

  108. pg_dump で、拡張のメンバーオブジェクトのRLSポリシーまたはセキュリティラベルをダンプしなくなりました。 (Tom Lane, Jacob Champion) (16)(15)(14)(13)(12)
  109. 以前は、コマンドがこれらのプロパティを設定するためダンプに含まれていましたが、これらのプロパティは拡張機能の内部事項として考慮される必要があるため、全く誤った動作でした。さらに、復元するユーザにはそれらを設定するための十分な権限がない可能性があり、(RLSポリシーをダンプするにはテーブルのロックを取得する必要があるため)ダンプするユーザにもそれらをダンプするための十分な権限がない可能性がありました。

  110. pg_dump で、元となるテーブルがダンプされていない場合は、拡張統計オブジェクトをダンプしないようになりました。 (Rian McGuire, Tom Lane) (16)(15)(14)(13)(12)
  111. 典型的には「--exclude-table」などの指定で一部テーブルを除外したときに、除外したテーブルの拡張統計オブジェクトも除外するということです。これはインデックスなどの他の依存オブジェクトの動作に準拠します。

  112. pg_dump のあるコードパスで、メモリ不足を適切に検出するようになりました。 (Daniel Gustafsson) (16)
  113. pgbenchスクリプトが、開いたままのパイプラインで終了することをエラーとして扱うようになりました。 (Anthonin Bonnefoy) (16)(15)(14)
  114. 以前は、\startpipeline コマンドに一致する\endpipeline がない場合、pgbench は奇妙な動作をしていました。これは、pgbench が適切に処理する必要があるケースというよりは、スクリプトのミスのように見えるため、エラーを投げるようになりました。

  115. BRIN インデックスの bloom演算子クラス で、false_positive_rate に関する過度に厳密なアサートが修正されました。 (Alexander Lakhin) (16)(15)(14)
  116. false_positive_rate パラメータに最大値を指定したときに、アサート失敗が生じる動作が報告されました。

  117. contrib/intarray で、INT_MAX に等しい値の要素を持つ配列がgist__int_ops インデックスに挿入された場合のクラッシュが修正されました。 (Alexander Lakhin, Tom Lane) (16)(15)(14)(13)(12)
  118. contrib/pageinspect の hash_bitmap_info() 関数がパーティション化されたハッシュインデックスに適用されるときに、より適切なエラーを報告するようになりました。 (Alexander Lakhin, Michael Paquier) (16)(15)(14)(13)(12)
  119. 「ERROR: could not open file "....": No such file or directory」といったエラーが生じる動作が報告されました。

  120. contrib/pgstattuple の pgstathashindex() 関数がパーティション化されたハッシュ インデックスに適用されるときに、より適切なエラーを報告するようになりました。 (Alexander Lakhin) (16)(15)(14)(13)(12)
  121. 「ERROR: could not open file "....": No such file or directory」といったエラーが生じる動作が報告されました。

  122. Windows では、pg_ctl および pg_regress でサブプロセスを起動するときに自動実行オプションを抑制するようになりました。 (Kyotaro Horiguchi) (16)(15)(14)(13)(12)
  123. cmd.exe 経由で子プロセスを起動するときは、/D フラグを渡して、レジストリで指定された自動実行コマンドが実行されないようになりました。これにより予想外の副作用が回避できます。

  124. ソースコードにおいて、is_valid_ascii() が mb/pg_wchar.h から utils/ascii.h に移動されました。 (Jubilee Young) (16)(15)
  125. この変更により、pg_wchar.h で「include 」を行う必要がなくなりました。一部のサードパーティコードで問題が発生していました。

  126. libxml2 のバージョン 2.12.0 以降でのコンパイル失敗が修正されました。 (Tom Lane) (16)(15)(14)(13)(12)
  127. Windows での WAL_DEBUG を有効にしたときのコードのコンパイル失敗が修正されました。 (Bharath Rupireddy) (16)(15)(14)(13)
  128. Python のヘッダーファイルからのコンパイラ警告が抑制されるようになりました。 (Peter Eisentraut, Tom Lane) (16)(15)(14)(13)(12)
  129. PostgreSQL のビルドで選択されるコンパイラオプションは、Python のヘッダファイルの最新バージョンに含まれる構造体に関する警告を引き起こしました。gcc を使用する場合、プラグマを使用してこれらの警告を抑制するようになります。

  130. LLVM 18 でのコンパイル時に非推奨の警告が出ないようになりました。 (Thomas Munro) (16)(15)(14)(13)(12)
  131. タイムゾーンデータファイルが tzdata release 2024a に更新されました。 (16)(15)(14)(13)(12)
  132. グリーンランド、カザフスタン、パレスチナの夏時間法の変更、南極観測点のケーシーとボストークの修正、ベトナム、トロント、ミクロン島の歴史的修正が含まれます。

  133. LWLock のキューから取り出しするときに、待機中のプロセスのリストを検索する必要がなくなりました。 (Andres Freund) (15)(14)(13)(12)
  134. これにより、待ちリストが長い場合の O(N^2) の動作が修正されました。一部のユースケースでは、これによりスループットが大幅に向上します。

  135. ロジカルデコーディング中に間違ったスナップショットでシステムカタログを検査することが防止されました。 (Fei Changhong) (15)(14)
  136. システムカタログを変更するトランザクションの途中でデコーディングが開始されると、デコーダがそれを認識できず、そのトランザクションをカタログ検索の進行中として扱うことができない場合がありました。

    この修正は、トップレベルのトランザクションにはすでにカタログ変更が含まれているとマークされているけれども、そのサブトランザクションにはマークがついていない場合に対処します。

    「ERROR: could not map filenode "..." to relation OID」という奇妙なエラーメッセージが出るケースが報告されました。

16.1、15.5、14.10、13.13、12.17、11.22 (2023年11月9日リリース)の変更点

  1. DISTINCT を付けて "any" 型の引数をとる集約関数を実行するときに、不明なデータ型の引数の扱いが修正されました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  2. 本障害により、実行時にテキスト型の値が不明なデータ型の値(即ち 0x00 で終わる文字列)として解釈されて、テキスト値に続くサーバメモリの露出をもたらす可能性がありました。(CVE-2023-5868)

  3. 新たな配列次元を計算する時に整数オーバーフローを検知するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  4. 現在の配列範囲の外側にある配列の添え字に新たな要素を割り当てるとき、境界値ケースで検知されない整数オーバーフローが生じる可能性がありました。潜在的に任意コード実行の攻撃が可能なメモリ上書きや、サーバメモリ暴露が可能でした。(CVE-2023-5869)

  5. pg_signal_backend ロールがバックグラウンドワーカと autovacuum のプロセスにシグナル送信することを防ぐようになりました。 (Noah Misch, Jelte Fennema-Nio) (16)(15)(14)(13)(12)(11)
  6. ドキュメントでは pg_signal_backend はスーパーユーザ所有のプロセスにはシグナルを投げれないとされていますが、これらプロセスには送信可能でした。紐づくロールの ID が ゼロになっていたため、スーパーユーザ所有でないと見做されていました。これらをスーパーユーザ所有として扱うように修正されました。

    PostgreSQL本体コードの範囲ではセキュリティ影響は軽微です。しかし、バックグラウンドワーカを使う拡張が脆弱になるかもしれません。(CVE-2023-5870)

  7. GiSTインデックス作成で再帰的なページ分割中の誤動作が修正されました。 (Heikki Linnakangas) (16)(15)(14)(13)(12)
  8. ページのダウンリンク位置が不正確に追跡される場合について修正されて、そのような状態から復旧できるロジックが導入されました。この誤りはその後のインデックス検索で誤った問い合わせ結果をもたらします。マイナーバージョンアップ後に GiSTインデックスを再作成することを推奨します。

  9. interval型の列に対する Btreeインデックスエントリの重複排除が防止されました。 (Noah Misch) (16)(15)(14)(13)
  10. interval型には「24:00:00」と「1 day」のように、区別できるけれども比較すると等しい値があります。これは Btree 重複排除における前提を破ります。そのため、interval型の列は重複排除の対象外とする必要がありました。この見落としにより index only スキャンで誤った問い合わせ結果が返る可能性がありました。さらに、amcheck がほぼ全てのこのようなインデックスをエラー報告するように改定されました。

    マイナーバージョンアップ後に interval型列の btreeインデックスは再作成すべきです。

  11. datetime_minmax_multi_ops の BRINインデックスで date型の値をより適切に処理するようになりました。 (Tomas Vondra) (16)(15)(14)
  12. 日付の距離計算が逆方向であったため、マージするエントリを適切に決定できませんでした。このようなインデックスは正しい結果を返すものの、本来よりも大幅に非効率でした。該当する BRIN インデックスは再作成することを推奨します。

  13. datetime_minmax_multi_ops の BRINインデックスで、timestamp および timestamptz 型の無限値や大きな値をより適切に処理するようになりました。 (Tomas Vondra) (16)(15)(14)
  14. 無限(infinity、-infinity)が、他の値から大きな距離ではなく、距離ゼロと誤って処理されていて、マージするエントリを適切に決定できませんでした。また、無限ではないけれども巨大な値(タイムスタンプとして表現できる上限に近い値)では、内部オーバーフローを起こして、やはり、マージするエントリを適切に決定できませんでした。このようなインデックスは正しい結果を返すものの、本来よりも大幅に非効率でした。該当する BRIN インデックスは再作成することを推奨します。

  15. interval_minmax_multi_ops の BRINインデックスで極端な interval型の値での演算オーバーフローを回避するようになりました。 (Tomas Vondra) (16)(15)(14)
  16. このバグは大きな interval型の値を該当するインデックスに挿入するときに、予期せぬエラー「ERROR: interval out of range」をもたらします。

  17. 複合パーティションキーを持つハッシュパーティションテーブルに対するステップ生成と実行時プルーニングが修正されました。 (David Rowley) (16)(15)(14)(13)(12)(11)
  18. プルーニングとはパーティションテーブルへの問い合わせで一部パーティションの走査を省略することを意味し、ここでのステップとはそのための情報が格納されたデータ構造を意味します。

    複数あるパーティションキーの 1つに IS NULL条件がある一部の場合にクラッシュする可能性がありました。

  19. MERGE での同時行更新の再チェックの不整合が修正されました。 (Dean Rasheed) (16)(15)
  20. READ COMMITTED モードでは UPDATEは、対象行が同時実行トランザクションから更新されたことを検知したなら、対象行に関する問い合わせの WHERE句を再チェックします。MERGE において、この再チェック処理が適切に動作しておらず、新たに更新された行を再度更新すべきかの判断を誤る可能性がありました。

    本障害により、READ COMMITTEDモードでの同時実行で、MERGE が誤った問い合わせ結果(誤った更新結果)となる可能性がありました。

  21. 継承テーブルに対する UPDATE、DELETE、MERGE で、親テーブルが制約で除外されるときでも、対象テーブルを正しく識別するようになりました。 (Amit Langote, Tom Lane) (16)(15)(14)
  22. コマンドで指定したテーブルが制約により処理対象から除外されているけれども、その子孫テーブルは除外されていない場合、最初の除外されていない子孫テーブルを主対象テーブルとみなしていました。

    この誤りにより、文レベルのトリガが子テーブルに対して発火する誤動作が生じました。加えて、バージョン16 では予期せぬエラーも発生しました。

    (16.0 でのエラー発生例)
    db1=# CREATE TABLE t8p (f1 int, f2 int, f3 int, check (f1 < 10) NO INHERIT);
    db1=# CREATE TABLE t8c () INHERITS (t8p);
    db1=# INSERT INTO t8c SELECT i, i+1, 0 FROM generate_series(1,1000) i;
    db1=# CREATE INDEX ON t8c (f1, f2);
    db1=# UPDATE t8p SET f3 = 11 WHERE f1 = 12 and f2 = 13;
    ERROR:  invalid perminfoindex 0 in RTE with relid 16648
    
  23. btree の ScalarArrayOpExprノードのマーク/リストア処理で、境界値の誤りが修正されました。 (Peter Geoghegan) (16)(15)(14)(13)(12)(11)
  24. ScalarArrayOpExpr は「indexcol = ANY(ARRAY[...])」や「indexcol IN (...)」といった検索条件で使われるエグゼキュータノードです。マーク/リストア処理とは、処理位置を覚えておいて再開する btreeインデックス検索の内部処理です。

    本障害により、誤った問い合わせ結果が生じて、結果に含まれるべき行が失われる可能性がありました。

  25. Memoizeプラン要素の実行における問い合わせ実行内でのメモリリークが修正されました。 (Orlov Aleksej, David Rowley) (16)(15)(14)
  26. 集合を返す関数が、繰り返しゼロ行を返す場合のクエリ内メモリリークが修正されました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  27. 行数の多いテーブルに対する jsonb_array_elements() 関数実行で引数でjsonb型の列の存在しないキーを指定したときにメモリリークが発生する現象が報告されました。

  28. cursor_to_xmlschema() 関数がデータを返さないポータルに適用された場合でもクラッシュしないようになりました。 (Boyu Yang) (16)(15)(14)(13)(12)(11)
  29. 連続した pg_logical_slot_get_changes() 関数の呼び出しの間でオリジンフィルタ条件の不適切な共有が修正されました。 (Hou Zhijie) (16)
  30. この関数の 1つの呼び出しで設定されたオリジン条件が、オリジン引数を指定しなかった後の呼び出しで再使用されていました。これは意図された動作ではありません。

  31. contrib/pgrowlocks の pgrowlocks() 関数がパーティションテーブルに適用された場合に意図したエラーが表示されるようになりました。 (David Rowley) (16)(15)(14)(13)(12)
  32. 以前は「ERROR: only heap AM is supported」という的外れなエラーが発生していました。「ERROR: ".." is a partitioned table」が本来出るべきエラーです。

  33. さまざまな SQL関数で無効なインデックスをよりきれいに処理するようになりました。 (Noah Misch) (16)(15)(14)(13)(12)(11)
  34. pgstatindex()、pgstatginindex()、pgstathashindex()、または pgstattuple() が無効なインデックスに適用された場合、エラーを報告するようになりました。brin_desummarize_range()、brin_summarize_new_values()、brin_summarize_range()、または gin_clean_pending_list() が無効なインデックスに適用された場合は、デバッグ・レベルのメッセージを報告する以外は何もしない動作になります。

    以前は、これらの関数はインデックスを処理しようとして、失敗した CREATE INDEX の残骸の内容によっては奇妙なエラーを出すことがありました。「ERROR: could not read block 0 in file」が出るケースが報告されました。

  35. to_tsvector() への長い入力に対する、早すぎるメモリ割り当てエラーを回避するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  36. 実際には処理可能な場合でも、「ERROR: invalid memory alloc request size .....」が発生することがありました。

  37. tsvector型のバイナリ入力関数 tsvectorrecv() で構築された tsvectorデータの過剰なサイズ割り当てが修正されました。 (Denis Erokhin) (16)(15)(14)(13)(12)(11)
  38. 受信ベクトルに位置データが含まれている場合、バイナリ受信関数は、完成した tsvector に無駄なスペース(位置データのサイズにほぼ等しい)を残していました。極端な場合、これにより出力時に長さ制限を下回っていたベクトルに対して「ERROR: lexeme length exceeded maximum total lexeme length」が発生する可能性がありました。いずれの場合もディスクスペースが無駄になる可能性がありました。

  39. 破損した PGLZ圧縮データの検査が改善されました。 (Flavien Guedez) (16)(15)(14)(13)
  40. 以前はクラッシュ(セグメンテーション違反)が発生していました。

  41. run_as_ownerオプションのコマンドによる変更が実際に適用されるようにALTER SUBSCRIPTION が修正されました。 (Hou Zhijie) (16)
  42. これまでは ALTER SUBSCRIPTION ... SET (run_as_owner = ...) を実行しても効いていませんでした。

  43. パーティションテーブルへの一括テーブル挿入が修正されました。 (Andres Freund) (16)
  44. パーティション間での挿入状態の不適切な共有により、COPY FROM 中に失敗する可能性があり、典型的には「ERROR: could not read block NNNN in file XXXX: read only 0 of 8192 bytes」が発生していました。

  45. COPY FROM で必要のない列のデフォルト値評価を避けるようになりました。 (Laurenz Albe) (16)
  46. これにより、デフォルト値が実際にはその列で有効でない場合や、デフォルトの式が現在の実行コンテキストで失敗する場合に発生するエラーが回避されます。このような特殊なケースは、ダンプのリストア時に発生することがありました。15.x 以前のリリースではこのような状況にならなかったため、16.x 以降について修正されました。

  47. COPY FROM でサポートされていないエンコーディング変換が必要な場合に正常に失敗するようになりました。 (Tom Lane) (16)(15)(14)
  48. 最近のリファクタリングで、意図していたエラーチェックが誤って削除され、有用なエラーメッセージの代わりに「ERROR: cache lookup failed for function 0」が出力されていました。

  49. EXPLAIN によって表示されるようにマークされたパラメータの起動時の値がNULL である場合に、EXPLAIN でのクラッシュを回避するようになりました。 (Xing Guo, Aleksander Alekseev, Tom Lane) (16)(15)(14)(13)(12)
  50. PostgreSQL本体には、これに適合する組み込みパラメータはありませんが、拡張機能でそのようなパラメータを定義することができます。

  51. 「ON COMMIT DROP」での一時テーブル削除中にスナップショットがあることを確認するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  52. これにより、一時テーブルのカタログエントリが(非常に複雑な「CHECK」条件などで)TOAST を必要とするほど大きい幅のフィールドを持つ場合の誤動作が防止されます。

    CREATE TEMP TABLE でアサート失敗が発生する動作が報告されました。

  53. system() によってフォークされたばかりの子プロセスの、シャットダウン信号に対する不適切な応答が回避されました。 (Nathan Bossart) (16)(15)(14)(13)(12)(11)
  54. Cライブラリ関数の system() は archive_command 設定などでPostgreSQL が外部コマンドを呼ぶ動作で使用されています。system() によってフォークされたものの、目的の子プログラムをまだ実行していない子プロセスが、親サーバープロセス向けのシグナルを受信して動作するおそれがありました。これにより、終了時にクリーンアップ処理が重複して実行されてしまいます。

    fastシャットダウンに対してアサート失敗する動作が報告されました。

  55. フロントエンドプログラム(pg_ctl や pg_controldata、pg_checksums)で、pg_control の不正な読み取りに対応するようになりました。 (Thomas Munro) (16)(15)(14)(13)(12)
  56. ファイルシステムによっては、サーバがそのファイルに同時に書き込むときに、pg_control の読み込みがアトミックな動作にならないことがあります。これは不正な CRC によって検出できます。エラーを報告する前に、数回再試行してファイルが有効になるかどうかを確認するようになりました。

  57. 関連する SQL関数で pg_control の不正な読み取りが回避されました。 (Thomas Munro) (16)(15)(14)(13)(12)(11)
  58. ファイルの一貫したビューを確実に取得できるように、pg_control を読み取る前に適切なロックを取得するようになりました。関数 pg_control_system()、pg_control_checkpoint()、pg_control_recovery()、pg_control_init() で修正が行われました。

  59. 「ORDER BY」または「DISTINCT」を使用した集計関数の計画時に発生するエラー「ERROR: could not find pathkey item to sort」が修正されました。 (David Rowley) (16)
  60. バックエンドアクティビティの文字列配列のサイズを計算するときに、整数オーバーフローの発生が回避されました。 (Jakub Wartak) (16)(15)(14)(13)(12)
  61. 64ビットマシンでは、track_activity_query_size 設定値は、許可される接続数を乗算したときに 32ビットのオーバーフローを引き起こすのに十分大きな数となります。

    該当する処理が実行される代表的な操作は pg_stat_activityビューの参照です。max_connections が 3000 以上、track_activity_query_size = 1MB のとき、「SELECT * FROM pg_stat_get_activity(NULL)」に対して、「ERROR: invalid memory alloc request size 18446744072590721024」が発生するケースが報告されました。

  62. 継承テーブルの ANALYZE に対して、pg_stat_progress_analyzeビューで一貫性のない進捗状況統計が一時的に表示される問題が修正されました。 (Heikki Linnakangas) (16)(15)(14)(13)
  63. current_child_table_relidフィールドの更新と同時に、ブロックレベルのカウンタをゼロにリセットする必要がありました。

  64. 統計カウンタに WAL書き込みを報告するようにbackground writer が修正されました。 (Nazir Bilal Yavuz) (16)(15)(14)
  65. background writerプロセスからの WAL書き込みがこれまでpg_stat_walビューで参照できる統計情報に反映されませんでした。

  66. pgstat_report_wal() で強制フラッシュ動作の混乱が修正されました。 (Ryoga Yoshida, Michael Paquier) (16)(15)
  67. 本障害により、WAL と I/O に関する一部の統計情報が PostgreSQLサービス停止で失われてしまうおそれがありました。

  68. 一時テーブルの拡張(ブロック追加)に関する統計追跡が修正されました。 (Karina Litskevich, Andres Freund) (16)
  69. 以前は、一時テーブルの書き込みが通常テーブルの書き込みとしてカウントされていました。

  70. track_io_timing が有効なときにリレーション拡張操作にかかる時間を書き込み時間に含めるようになりました。 (Nazir Bilal Yavuz) (16)
  71. キャッシュされたCALL文の依存関係を追跡し、必要に応じて再計画するようになりました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  72. CALL文の引数でインライン化されている関数を置き換えする DDLコマンドでは、PL/pgSQL によるキャッシュを捨てる必要がありました。これが行われなかったため、誤動作や「ERROR: cache lookup failed」などの奇妙なエラーが発生していました。

    (誤動作例)
    db1=# CREATE FUNCTION f(int) RETURNS int LANGUAGE sql AS $$ SELECT $1 + 1 $$;
    db1=# CREATE PROCEDURE p1(p int) LANGUAGE plpgsql
            AS $$ BEGIN CALL p2(f(p)); END $$;
    db1=# CREATE PROCEDURE p2(p int) LANGUAGE plpgsql
            AS $$ BEGIN RAISE NOTICE '%', p; END $$;
    db1=# CALL p1(10);
    NOTICE:  11
    db1=# DROP FUNCTION f(int);
    db1=# CREATE FUNCTION f(int) RETURNS int LANGUAGE sql AS $$ SELECT $1 + 2 $$;
    db1=# CALL p1(10);
    ERROR:  cache lookup failed for function 16699
    CONTEXT:  SQL statement "CALL p2(f(f1))"
    PL/pgSQL function p1(integer) line 1 at CALL
    
  73. OpenSSL接続のセットアップでエラーが出た後に発生する可能性があった、NULLポインタを解放することによるクラッシュを回避するようになりました。 (Sergey Shinderuk) (16)(15)
  74. 外側の問い合わせレベルから レコード型の値を解析するときに、正しくネストの深さを追跡するようになりました。 (Richard Guo) (16)(15)(14)(13)(12)(11)
  75. この見落としにより、アサート失敗やクラッシュ、または「ERROR: bogos varno: ..」エラーが引き起こされる可能性がありました。レコード型を出力する共通テーブル式(WITH句)を使った問い合わせで現象の発生が報告されました。

  76. ScalarArrayOpExprプランノードにおけるハッシュ関数と否定関数の依存関係を追跡するようになりました。 (David Rowley) (16)(15)(14)
  77. これらの関数はノードの元の演算子が存在している間は消えないと考えられるためこれはほとんどの場合に無害です。

  78. レコート型のキャッシュ管理でエラー処理のバグが修正されました。 (Thomas Munro) (16)(15)(14)(13)(12)(11)
  79. 誤った個所でちょうどメモリ不足エラーが起きると、無限ループをもたらす一貫しない状態が生じる可能性がありました。

  80. WALの読み取り中のメモリ不足エラーを FATAL として扱うようになりました。 (Michael Paquier) (16)(15)(14)(13)(12)
  81. 以前はでたらめなデータ状態として扱っており、WAL の終わりに到達したものと解釈していましたが、それは間違っていて一貫しない WAL再生が引き起こされる可能性がありました。

  82. でたらめな WALレコード長フィールドに基づいてメモリーを割り振ろうとして起こりうるリカバリのエラーが修正されました。 (Thomas Munro, Michael Paquier) (16)(15)(14)(13)(12)
  83. プライマリ停止後にスタンバイが「FATAL: invalid memory alloc request size ....」を出して止まる現象が報告されました。

  84. Windows で min_dynamic_shared_memory を 0 より大きくに設定したときに、パラレルクエリの SQL実行で「ERROR: could not duplicate handle ...」エラーが生じる障害が修正されました。 (Thomas Munro) (16)(15)(14)
  85. 内部実装関数 GenericXLogFinish の処理順序が修正されました。 (Jeff Davis) (16)(15)(14)(13)(12)(11)
  86. このコードは、変更されたバッファをダーティとしてマークする前に WAL を書き込むことで、クラッシュ安全性に必要な条件に違反していました。この関数を使用する PostgreSQL本体コードはありませんが、拡張機能(例えば contrib/bloom)は使用します。

  87. PL/Python例外処理の誤ったアサートが削除されました。 (Alexander Lakhin) (16)(15)(14)(13)(12)(11)
  88. サブスクリプションの新しいオプション run_as_owner をダンプするよう pg_dump が修正されました。 (Philip Warner) (16)
  89. この見落としにより、サブスクリプションは run_as_owner を意図して true に設定していたとしても、常に false として復元されていました。これはバージョン16 より前のリリースの動作とは同等ではありません。

  90. 選択的リストアが選択されたテーブルのテーブルレベルとカラムレベルのACL 両方を含むように pg_restoreが修正されました。 (Euler Taveira, Tom Lane) (16)(15)(14)(13)(12)(11)
  91. 以前は両方のタイプとも存在する場合にテーブルレベルの ACL のみが復元されていました。

  92. pg_upgrade に abstime、reltime、tinterval のデータ型の使用について検査するロジックが追加されました。 (Álvaro Herrera) (16)(15)(14)(13)(12)
  93. これらのデータ型は PostgreSQLバージョン12 で廃止されたため、アップグレード可能と主張する前に古いデータベースに存在しないことを確認します。

  94. Windows での pgbench で偽性のエラー「ERROR: too many client connections」を回避するようになりました。 (Noah Misch) (16)(15)(14)(13)(12)
  95. vacuumdb の -N オプションを複数与えた場合の処理が修正されました。 (Nathan Bossart, Kuwamura Masaki) (16)
  96. 複数の -N オプションは、複数スキーマについてスキーマ内テーブルを除外すべきですが、クエリ生成の誤りで、実際には何も除外されていませんでした。

  97. vacuumdb が ANALYZEのみの動作モード(-Z、--analyze-only オプション)であっても、--buffer-usage-limit オプションに従うように修正されました。 (Ryoga Yoshida, David Rowley) (16)
  98. contrib/amcheckで中断されたページ削除を破損として扱わなくなりました。 (Noah Misch) (16)(15)(14)(13)(12)(11)
  99. この修正で以下のような誤った報告が防止されます。

    ERRPR:  the first child of leftmost target page is not leftmost of its level ...
    ERROR:  block NNNN is not leftmost ...
    ERROR:  left link/right link pair in index XXXX not in agreement
    

    リカバリを終えたデータベースクラスタで、btree インデックスぺージを削除するWALレコードが中途であって、VACUUM がそれらをクリーンアップする前に、amcheck を実行するとこれらのエラーが発生していました。

  100. contrib/btree_ginで「<」または「<=」を使用して interval型のインデックスに対するインデックススキャンを行った際の障害が、修正されました。 (Dean Rasheed) (16)(15)(14)(13)(12)(11)
  101. このようなインデックススキャンは本来返すべきすべての値を返せず、誤った問い合わせ結果が生じました。

  102. LLVM 16 および 17のサポートが追加されました。 (Thomas Munro, Dmitry Dolgov) (16)(15)(14)(13)(12)
  103. 最近の macOSでのビルド時の警告を抑制しました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  104. Xcode 15 (macOS Sonoma とともにリリース) では、PostgreSQL のビルド中にライブラリの重複に関する警告が多数発生するようにリンカの動作が変更されました。これらは無害ですが目障りなため、同じライブラリを複数回引用することは避けるようになりました。

    また、-multiply_define の使用も削除されました。これは明らかに無効なものでした。

  105. contrib/unaccent のルールファイルをビルドするとき、PostgreSQLビルドで --with-python が指定されておらず、PYTHON変数も設定されていない場合に、エラーにするのではなくパス指定無しの「python」コマンドを使うようになりました。 (Japin Li) (16)(15)(14)(13)
  106. デフォルトのタイムゾーンの略語リストから「PHOT」(フェニックス諸島時間)が削除されました。 (Tom Lane) (16)(15)(14)(13)(12)(11)
  107. 最近の Debian および Ubuntuリリースでは、基礎となる tzdbエントリがデフォルトでインストールされなくなったため、デフォルトリストにこの略語が存在すると、エラーが発生する可能性があります。必要であれば、カスタム略語ファイルを介して元に戻すことができます。

  108. 共有カタログに対して正しい動作を行うように pg_stat_reset_single_table_counters() が修正されました。 (Masahiro Ikeda) (15)
  109. これまでは本関数でリセットしても共有カタログには効果がありませんでした。

  110. gtsvector_picksplit() の誤った実装が修正されました。 (Alexander Lakhin) (15)(14)(13)(12)(11)
  111. tsvector列の GiSTインデックスでのページ分割の決定が適切に行われない可能性がありました。

    この障害により不正メモリ読み取りが生じるケースが報告されました。

  112. エラー後に同セッションでロジカルデコーディングが再試行されるときの、アサート失敗が修正されました。 (Hou Zhijie) (15)(14)(13)(12)(11)
  113. autovacuum launcherプロセスの動作を止めてしまう可能性のある、データベース削除時の競合状態が修正されました。 (Andres Freund, Will Mortensen, Jacob Speidel) (15)
  114. 競合で削除されたデータベースの統計エントリが残り、そのためにどのデータベースを処理するかの選択が混乱する可能性がありました。

  115. 外部ソート処理における論理テープ制御でデータ型サイズの混乱が修正されました。 (Ranier Vilela) (15)(14)(13)
  116. Linux などの long が int よりも大きいプラットフォーム(Windows なら同サイズ)において、数テラバイトの一時ファイルを必要とする巨大なソート処理について、整数オーバーフローで誤動作を引き起こす可能性がありました。

  117. sysloggerプロセスの標準入力が意図せず閉じられることが回避されるようになりました。 (Heikki Linnakangas) (15)(14)(13)
  118. SQLのパース解析中に意味のある処理を行わないユーティリティコマンドのプランキャッシュ再検証を行わないようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  119. これにより CPUサイクルが節約されるだけでなく、スナップショットを設定してはならないトランザクション制御コマンドでのキャッシュ無効化後のエラーが防止されます。

    プロシージャ内で COMMIT の次に SET TRANSACTION ISOLATION LEVEL を実行して、「ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query」が発生する障害ケースが報告されました。

  120. テーブルの行データを処理するコードにおいて、値が使用されている間は参照渡しの attmissingval値を長期間有効なコンテキストに保持するようになりました。 (Andrew Dunstan) (15)(14)(13)(12)(11)
  121. これにより、タプルスロットの寿命がその値を構築したタプル記述子よりも長くなった場合に、不正なポインタが使用される可能性が回避されます。

    予期せぬエラー「ERROR: unsupported byval length: 32639」が生じて、その後にアサート失敗やクラッシュが生じるケースが報告されました。

  122. ALTER ROLE の後に search_path の有効な値を再計算するようになりました。 (Jeff Davis) (15)(14)(13)(12)(11)
  123. これにより、ロール名を変更後に特別な文字列「$user」の意味が再決定されます。

  124. pg_dump で pg_catalog スキーマのダンプを要求された場合のアサート失敗が修正されました。 (Peter Eisentraut) (15)
  125. pg_basebackup で無効な一時スロット名が生成されないようになりました。 (Jelte Fennema) (15)(14)(13)(12)(11)
  126. サーバー接続が pgbouncer を介して実行されている場合でのみ発生が確認されています。

  127. 未解放のセーブポイントがある場合に COMMIT AND CHAIN/ROLLBACK AND CHAIN が正しく動作するように修正されました。 (Liu Xiang, Tom Lane) (14)(13)(12)
  128. 現在のトランザクションのプロパティを新しいトランザクションに伝播する代わりに、以前のトランザクションのプロパティをいくつか伝播していました。

    以下のように実行したときに「SHOW transaction_isolation」に対して不適切な出力が得られるケースが報告されました。

    db1=# START TRANSACTION ISOLATION LEVEL SERIALIZABLE; COMMIT;
          START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
          SAVEPOINT s; COMMIT AND CHAIN;
          SHOW transaction_isolation; 
          COMMIT;
    
  129. スタンバイモードの WALリカバリで無効なページヘッダが見つかった場合にエラーが報告されるようになりました。 (Yugo Nagata, Kyotaro Horiguchi) (14)(13)(12)
  130. これまでは無効なページヘッダに対するエラー出力なしにページ読み込みのリトライが行われていました。

  131. 複合型の定数フィールドへの参照を含むビューを逆解析するときに、「ERROR: record type has not been registered」が発生していたのが回避されました。 (Tom Lane) (13)(12)(11)
  132. SEARCH/CYCLE を含む再帰問い合わせの EXPLAIN 出力でエラーが発生するケースが報告されました。

  133. RECORD型 の ROW() 式からフィールドを展開できるようになりました。 (Tom Lane) (12)(11)
  134. PostgreSQL 13 以降では、下記例のように f1、f2、… というフィールド名でレコード型から要素を参照することができます。本機能が PostgreSQL 11.x、12.x にもバックポートされました。

    db1=# SELECT (ROW(1,2,3)).f3;
     f3
    ----
      3
    (1 row)
    

15.4、14.9、13.12、12.16、11.21 (2023年8月10日リリース)の変更点

  1. 拡張のスクリプトで、クォートやバックスラッシュ、ドル記号を含む名前のスキーマや所有者名を置き換えすることが禁止されました。 (Noah Misch) (15)(14)(13)(12)(11)
  2. この制限は信頼された拡張に対する SQLインジェクションを防止するものです。

    拡張のスクリプトには @extschema@ や @extowner@ といったプレースホルダを使うことができます。これに対して、作りこまれたスキーマ名や所有者名を適用させることで、SQLインジェクションが狙えました。標準で付属している拡張には脆弱性はありません。また、攻撃者はデータベース作成権限が必要です。(CVE-2023-39417)

  3. MERGE が行単位セキュリティ(RLS)ポリシーを適切に適用するように修正されました。 (Dean Rasheed) (15)
  4. MERGE が UPDATE アクションを実行するとき、ターゲットテーブルに定義された UPDATE と SELECT の RLSポリシーを適用して、通常の WHERE句 を持つ UPDATE の動作と一貫性を持たせるべきです。しかしながら、そうなっておらず、MERGEではINSERT の RLSポリシーを INSERT と UPDATE のアクションに適用していました。(CVE-2023-39418)

    加えて、MERGE が DO NOTHING アクションを行うとき、ターゲットテーブルのDELETE の RLSポリシーを、既存行に適用していました。こちらはセキュリティ障害ではありませんが、予期せぬエラーを引き起こす可能性がありました。

  5. 揮発性の関数を含む結合条件のラテラル結合で、Memoize を使わないように修正されました。 (Richard Guo) (14)(15)
  6. 揮発性のフィルタ条件を含むサブプランに Memoize を適用すると、誤った問い合わせ結果がもたらされます。この検査が一部漏れていて、LATERAL を使う場合にこのような実行プランが発生する可能性がありました。

  7. BRINインデックスで、行の無い範囲と全てが NULL の範囲を混同して、誤った問い合わせ結果を返す誤りが修正されました。 (Tomas Vondra) (15)(14)(13)(12)(11)
  8. 本障害により、返すべき NULL値の結果を返さない可能性があります。NULL を検索するかもしれない BRINインデックスは、バージョンアップ後に再構築してください。

    (誤動作例: SELECT結果で 1000行が返るべきところで 0行が返っている)
    db1=# CREATE TABLE t_brin (id int, v text);
    db1=# CREATE INDEX ON t_brin USING brin (id);
    db1=# INSERT INTO t_brin SELECT null, null FROM generate_series(1, 1000);
    db1=# INSERT INTO t_brin SELECT g, g::text FROM generate_series(1001, 2000) g;
    db1=# SET enable_seqscan TO false;
    db1=# SELECT id FROM t_brin WHERE id IS NULL;
     id
    ----
    (0 rows)
    
  9. DROP DATABASE が中断されたときに破損したデータベースが残ってしまうのを回避するようになりました。 (Andres Freund) (15)(14)(13)(12)(11)
  10. これまで DROP DATABASE が取消できない段階に進んだ後に中断された場合、対応する pg_database の行の削除はロールバックされてしまうため、DROP を中断したデータベースは(中身はおそらく破損しているにもかかわらず)アクセス可能な状態で残りました。

    取消不能な操作を開始する前に、データベースに使用不能(invalid) の印付けをするように修正されました。この印付けをした後の何らか失敗で、データベースは部分的に残った状態になりますが、再度 DROP DATABASE をする以外のことはできなくなります。例えば接続を試みると「ERROR: cannot connect to invalid database "..."」というエラーになります。

  11. パーティションインデックスで、有効であるか未作成であるかが正しく印付けされるようになりました。 (Michael Paquier) (15)(14)(13)(12)(11)
  12. 新たなパーティションインデックスが既存インデックスと一致するけれども、一部パーティションにおいては無効なインデックスである場合に、パーティションインデックスは有効と印付けしてしまう可能性がありました。これにより、その後のパーティションテーブルに対する問い合わせで、誤動作(誤った問い合わせ結果)やアサート失敗を引き起こす可能性がありました。

  13. ALTER TABLE .. ATTACH PARTITION で、パーティションインデックスと子インデックスを照合するとき、無効な子インデックスを無視するようになりました。 (Michael Paquier) (15)(14)(13)(12)(11)
  14. アタッチするテーブルの無効なインデックスは無視されて、その代わりに新たな子インデックスが作成されるようになりました。

  15. 全てのパーティションがアタッチされた後、パーティションインデックスを有効と印付けするとき、エラーになることがあり、修正されました。 (Michael Paquier) (15)(14)(13)(12)(11)
  16. インデックスの pg_index エントリの更新では、有効フラグ(indisvalid)列以外の列について古いデータを使う可能性がありました。報告された症状の例は、トランザクション内でいくつかの DDL 操作をした後にパーティションのアタッチを行うと「ERROR: attempted to update invisible tuple」が出ることです。

  17. 拡張に拡張の指定スキーマ外のオブジェクトが含まれている場合に、ALTER EXTENSION SET SCHEMA が、エラーをだすようになりました。 (Michael Paquier, Heikki Linnakangas) (15)(14)(13)(12)(11)
  18. このような場合には以前から以下のエラーが出る実装になっていましたが、検出できないケースがあり、予期せぬ振る舞いが生じていました。

    ERROR:  extension "ext1" does not support SET SCHEMA
    DETAIL:  obj1 is not in the extension's schema "extscm1"
    
  19. テーブルアクセスメソッドの依存関係の追跡について修正されました。 (Michael Paquier) (15)
  20. ALTER TABLE ... SET ACCESS METHOD は、テーブルのアクセスメソッドを変更するときに、関連する pg_depend のエントリを更新することに失敗していました。

    この障害により、組み込みでないアクセスメソッドを使っているとき、依存するオブジェクトが未だあるのにアクセスメソッドを DROP できてしまう危険性がありました。

    なお、バージョンアップで本修正を適用しても、既に欠損している pg_depend のエントリが修復されることはありません。

  21. プランナで一意性の証明に部分的なユニークインデックスを使わないようになりました。 (David Rowley) (15)(14)(13)(12)(11)
  22. テーブルをスキャンするときにその部分インデックスを使わない場合には読み取った行の一意性が保たれないかもしれないため、これにより誤ったプランを作ってしまう可能性がありました。結果として誤った問い合わせ結果も生じます。

  23. 偽性の定数の JOIN句を伴う外部テーブルの結合で、不正なプラン生成を回避するようになりました。 (Etsuro Fujita) (15)(14)(13)(12)(11)
  24. 不正なプランにより、結果として誤った問い合わせ結果が生じる可能性もあります。

    以下の例では、リモートサーバ側で結合を行うプランとなっていますが、「CURRENT_USER = SESSION_USER」の条件が消えてしまっています。このような結合をリモートサーバ側にプッシュダウンすることは、今のところサポートされていません。このような結合対象テーブルと無関係な条件が付加されている場合には、ローカルサーバ側で結合するプランを生成するように修正されました。

    (不正なプラン生成の例)
    db1=# explain (verbose, costs off) 
            SELECT t1.c1, t2.c1 FROM ft1 t1
    	      JOIN ft2 t2 ON (t1.c1 = t2.c1 AND CURRENT_USER = SESSION_USER)
              ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
                                                                                  QUERY PLAN                                                                        
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Limit
       Output: t1.c1, t2.c1, t1.c3
       ->  Foreign Scan
             Output: t1.c1, t2.c1, t1.c3
             Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
             Remote SQL: SELECT r1.c1, r2.c1, r1.c3 FROM (public.t1 r1 INNER JOIN public.t2 r2 ON (((r1.c1 = r2.c1)))) ORDER BY r1.c3 ASC NULLS LAST, r1.c1 ASC NULLS LAST
    (6 rows)
    
  25. RLS(行単位セキュリティ)の式とセキュリティバリアビューにおいて、ルールアクションを展開するときに、副問い合わせを正しく扱うようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  26. プラン作成時にアサート失敗や奇妙なエラーを引き起こす可能性がありました。

  27. SERIALIZABLE分離モードにおける衝突検出での競合条件が修正されました。 (Thomas Munro) (15)(14)(13)(12)(11)
  28. ビットマップヒープスキャンを使っていて、GINインデックスを使っていて、さらに、最初は空の btree インデックスを調べるときに、衝突が見落とされる可能性がありました。

    このような場合、不適切に衝突しているトランザクションのコミットを許すことになるため、トランザクション分離に失敗する結果を招きます。これにより、誤った問い合わせ結果や誤った更新結果が生じる可能性がありました。

  29. 継承テーブルまたはパーティションテーブルを対象とした、EvalPlanQual検査の誤動作が修正されました。 (Tom Lane) (15)(14)
  30. EvalPlanQual検査は、READ COMMITTED分離モードのトランザクションで実行される処理です。この誤りにより、READ COMMITTED分離モードで UPDATE や DELETE動作が、同時更新と衝突しているためスキップされるべきところでも、実行されました。これにより、誤った問い合わせ結果や誤った更新結果が生じる可能性がありました。

    (報告された誤動作ケース)
    db1=# CREATE TABLE t12p (id int, v int);
    db1=# CREATE TABLE t12c1 () INHERITS (t12p);
    db1=# CREATE TABLE t12c2 () INHERITS (t12p);
    db1=# INSERT INTO t12c1 VALUES (1,1);
    db1=# INSERT INTO t12c2 VALUES (1,1);
    
    (トランザクション1)
    db1=# BEGIN;
    BEGIN
    db1=*# UPDATE t12p SET v = 2 WHERE v = 1;
    UPDATE 2
                  (トランザクション2)
                  db1=# BEGIN;
    	          BEGIN
                  db1=*# DELETE FROM t12p WHERE v = 1;
    			  (ここでロック待ちになる)
    
    db1=*# COMMIT;
    COMMIT
                   (ロック待ちが解放されるが 1行だけ DELETEされる誤動作)
                   DELETE 1        
                   db1=*# SELECT * FROM t12p;
                     id |  v
                    ----+-----
                      1 |  2
                   (1 row)
    
                   db1=*# COMMIT;
                   COMMIT
    
  31. 外側の入れ子ループ(Nested Loop)に由来するパラメータを含むキーのハッシュを伴うハッシュ結合について、修正されました。 (Tom Lane) (15)(14)(13)(12)
  32. そのようなパラメータの値が変更された後で結合を再スキャンするとき、ハッシュテーブルを再構築しなければなりませんが、それをしていませんでした。その結果、結合の出力行が失われて誤った問い合わせ結果が生じることがありました。

    (バージョン15.3 での障害動作例)
    db1=# CREATE TABLE t13a AS SELECT generate_series(1, 10)::int AS c1;
    db1=# CREATE TABLE t13b AS SELECT c1 AS c2 FROM t13a;
    db1=# CREATE TABLE t13c AS SELECT c1 AS c3 FROM t13a;
    db1=# SET enable_hashjoin TO off;
    db1=# SELECT ta.c1, s.* from t13a ta, LATERAL (
            SELECT tb.c2, tc.c3 from t13b tb
              JOIN t13c tc ON tb.c2 = tc.c3 + ta.c1 ORDER BY 1,2) s;
     ⇒ 45行の結果が返る(Hash Join 以外の方式で、正しい結果)
    
    db1=# SET enable_hashjoin TO on;
    db1=# SET enable_mergejoin TO off;
    db1=# SELECT ta.c1, s.* from t13a ta, LATERAL (
            SELECT tb.c2, tc.c3 from t13b tb
              JOIN t13c tc ON tb.c2 = tc.c3 + ta.c1 ORDER BY 1,2) s;
     ⇒ 9行の結果が返る(Hash Join が使われて、誤った結果)
    
  33. 複合型列のフィールドを更新しようとするときの間欠的に生じる障害が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  34. 複合型列の値全体が TOAST外部格納を必要とするほど大きい場合、内部的なキャッシュ処理のタイミングによってはエラー(「ERROR: unsupported byval length: ...」)やサーバプロセスのクラッシュが発生しました。

  35. トリガを伴う UPDATE 文のいくつかの場合で、問い合わせ処理内におけるメモリリークが防止されました。 (Tomas Vondra) (15)(14)(13)(12)
  36. Incremental Sort 実行プランノードが再スキャンされるときの、問い合わせ処理内におけるメモリリークが防止されました。 (James Coleman, Laurenz Albe, Tom Lane) (15)(14)(13)
  37. jsonpath の datetime() メソッドの入力として、小数点以下の秒を受け付けできるようになりました。 (Tom Lane) (15)(14)(13)
  38. (修正前バージョンの動作、修正後は 2つ目の SELECT も成功する)
    db1=# SELECT jsonb_path_query('"2023-08-10 12:34:56+9"', '$.datetime()');
          jsonb_path_query
    -----------------------------
     "2023-08-10T12:34:56+09:00"
    (1 row)
    
    db1=# SELECT jsonb_path_query('"2023-08-10 12:34:56.789+9"', '$.datetime()');
    ERROR:  datetime format is not recognized: "2023-08-10 12:34:56.789+9"
    
  39. 極めて複雑なテキスト検索で、スタックオーバーフローによるクラッシュが防止されました。 (Tom Lane) (15)(14)(13)(12)(11)
  40. 修正後は max_stack_depth 設定に基づいて、スタックの上限超過を報告する ERROR で問い合わせが終了するようになります。

  41. pg_hba.conf と pg_ident.conf で 10240バイトまでのトークンが使えるようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  42. これまでは 256バイトが上限で、場合によっては長さが不足することがありました。そのような場合、「LOG: authentication file token too long, skipping: ...」が出て、設定ファイルの読み込みに失敗します。LDAP認証で長いオプション設定値を与えるときに失敗するケースが報告されました。

  43. 拡張が GUCプレフィックスの予約を宣言しているときに、該当する既存の設定項目が確実に検査されるようになりました。 (Karina Litskevich, Ekaterina Sokolova) (15)
  44. 誤って一部のエントリが読み飛ばされて、見逃されることがありました。

  45. C++ の out of memory の条件に誤解があり、修正されました。 (Heikki Linnakangas) (15)(14)(13)(12)(11)
  46. JIT が使われている場合に、C++ の「new」で out of memory になるとき、想定された C++ の例外に進むべきところ、PostgreSQL の FATAL エラーになっていました。

  47. plancache.c での稀なヌルポインタのクラッシュが修正されました。 (Tom Lane) (15)(14)(13)
  48. ロジカルレプリケーションのサブスクリプションが DROP されたときに、そのサブスクリプションに対する統計エントリのリークが回避されました。 (Masahiko Sawada) (15)
  49. ページ解放が結果としてフリースペース範囲を合体させる場合に、おそらく有用な共有メモリセグメントの追跡を失うことがあり、修正されました。 (Dongming Liu) (15)(14)(13)(12)(11)
  50. セグメントは新しいフリースペースの大きさに対して適切な bin (集計区間) に移動されて、後続の検索で見つかるようになりました。この問題により、解放されたメモリが十分あるはずであるのに、動的共有メモリの割り当てに失敗することが報告されました。

  51. VACUUM がある種の btreeインデックスの破損を検出した後も継続できるようになりました。 (Peter Geoghegan) (15)(14)(13)(12)(11)
  52. 無効な隣接ページリンクを検出すると、問題をログ出力しますが VACUUM処理は継続するようになります。これまでは ERROR を出して中断していました。REINDEX をしなければ壊れたインデックスは修復されませんが、そうするまで VACUUM を完了できないことは、より悪い問題を引き起こすリスクになります。

  53. VACUUM が pg_database.datfrozenxid や pg_database.datminmxid で無効なデータを検出した後、WrapLimitsVacuumLock が確実に解放されるようになりました。 (Andres Freund) (15)(14)(13)(12)(11)
  54. このロックはセッション終了や何らか他のエラーに遭遇した時には解放されますが、ロック解放に失敗することで後にデッドロックを引き起こす可能性がありました。

  55. クラッシュリカバリ時にプリペアドトランザクションの二重リプレイが回避されました。 (suyu.cmj, Michael Paquier) (15)(14)(13)(12)(11)
  56. いくつかの既にディスクにフラッシュされた 2相トランザクション状態データを伴うチェックポイント途中でのクラッシュの後、クラッシュリカバリがプリペアドトランザクションを 2回リプレイしようとして、startup プロセスで「FATAL: lock is already held」などの致命的なエラーが発生する可能性がありました。

  57. 新しく作成されたけれどもまだ空のテーブルが、次のチェックポイントでfsync されるようになりました。 (Heikki Linnakangas) (15)(14)(13)(12)(11)
  58. これを行わないと、オペレーティングシステムのクラッシュによって空のファイルが失われた場合、その後のテーブル操作が「could not open file」エラーで失敗する可能性がありました。

  59. UNLOGGED なインデックスの初期フォーク作成を必ず WAL に記録するようになりました。 (Heikki Linnakangas) (15)(14)(13)(12)(11)
  60. UNLOGGEDインデックスのメインデータフォークは WAL に記録されませんが、クラッシュ後にインデックスをリストアするための一貫した状態を確保するために、その初期フォークは WAL に記録する必要があります。初期フォークが空の場合に WAL書き出しが行われていなかったため、修正されました。これは標準的インデックスアクセスメソッド(AM) では生じないケースですが、一部の拡張ではおそらく該当します。

  61. 偽性の「missing contrecord」エラーが出力されないようになりました。 (Thomas Munro) (15)
  62. pg_waldump と walsender からの不正確な苦情がログに記録されるのを避けるために、この場合を単純な WAL の終了として扱います。WALレコードに問題がない場合でも、pg_waldump 実行時に下記のエラーメッセージが出力されていました。

    pg_waldump: error: error in WAL record at 0/1FFFF98: missing
                       contrecord at 0/1FFFFE0
    
  63. jsonpath コードの過度に厳密なアサーションが修正されました。 (David Rowley) (15)(14)(13)(12)
  64. クエリが「like_regex」の結果に「.type()」演算子を適用した場合にアサート失敗していました。非アサートビルドではバグはありません。

    (アサートビルドでバックエンドプロセスが終了する SQL文の例)
    SELECT jsonb_path_query('["string", "string"]',
                            '($[0] like_regex ".{7}").type()');
    
  65. 既にアボートされたトランザクションで、拡張クエリプロトコルを使用して空ステートメントを処理する際のアサート失敗を回避するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  66. stats_fetch_consistency 設定がトランザクション内で変更された場合のアサート失敗を回避するようになりました。 (Kyotaro Horiguchi) (15)
  67. contrib/fuzzystrmatch の Soundex の difference() 関数が空の入力を正常に処理できるように修正されました。 (Alexander Lakhin, Tom Lane) (15)(14)(13)(12)(11)
  68. アルファベット文字を含まない入力文字列を使用すると、予測不能な出力が発生しました。

  69. contrib/hstore で入力の空白チェックが強化されました。 (Evan Jones) (15)(14)(13)(12)(11)
  70. 場合によっては、文字が誤って空白文字として認識されて捨てられてしまうことがありました。

    Mac OS X の en_US.UTF-8 ロケールは isspace(0x85) をバグで真と返すため、UTF-8 では \u0105 が 0xc4 0x85 とエンコードされ、0x85 が空白文字と解釈されていました。

  71. contrib/intarray の gist__int_ops インデックス演算子クラスを使用した最大サイズを超過した入力配列が禁止されました。 (Ankit Kumar Pandey, Alexander Lakhin) (15)(14)(13)(12)(11)
  72. 以前は、このような場合に NOTICE メッセージで報告しますが、そのまま続行して無効なインデックスエントリを作成していました。これはインデックスの読み取り時にクラッシュを引き起こす危険があります。「ERROR: input array is too big (.. maximum allowed, .. current), ...」というエラーメッセージを出して、データ更新するコマンドを中断するようになりました。

    (これまで報告されていた NOTICEメッセージ例)
    NOTICE:  input array is too big (199 maximum allowed, 3001 current), use gist__intbig_ops opclass instead
    
  73. contrib/intarray の GiSTインデックスエントリで無駄な二重展開を回避するようになりました。 (Konstantin Knizhnik, Matthias van de Meent, Tom Lane) (15)(14)(13)(12)(11)
  74. contrib/pageinspect の gist_page_items()関数が、インデックスに INCLUDE句で追加された列が含まれている場合でも動作するように修正されました。 (Alexander Lakhin, Michael Paquier) (15)(14)
  75. インデックスが INCLUDE指定によりインデックスキー以外の列を含んでいた場合、gist_page_items() はインデックスのリーフページで情報を表示できなかったり、非リーフページで無条件にクラッシュしていました。

  76. psql で標準入出力が端末でない場合に、PSQL_WATCH_PAGER環境変数を無視し、ページャを使わないようになりました。 (Tom Lane) (15)
  77. \watch 以外のコマンドでの PSQL_PAGER と同じ扱いになります。

  78. pg_dump で、関数定義時に一意インデックスへの依存関係を必要とする、BEGIN ATOMIC を用いた SQL関数を正しく処理できるように修正されました。 (Tom Lane) (15)(14)
  79. GROUP BY や ON CONFLICT句を使っている場合に該当する可能性がありました。そのような関数は一意インデックスの後にダンプする必要がありますが、そうなっておらず、「warning: could not resolve dependency loop」という警告が出力されました。

  80. pg_dumpで、依存関係ループの問題に関する詳細情報の表示が改善されました。 (Tom Lane) (15)
  81. 詳細情報は infoレベルで出力されていましたが、-v (--verbose ) 指定無しのデフォルトのログレベルでは出力されないため、warningレベルで出力するようになりました。

  82. pgbenchで、preparedモードで空のパイプラインに対して生じるクラッシュが回避されました。 (Álvaro Herrera) (15)
  83. ここでの空のパイプラインとは pgbenchスクリプトで \startpipeline の直後に\endpipeline を記述した場合を指します。

  84. pg_index.indisreplident がリレーションキャッシュのエントリ内で常に最新となるようになりました。 (Shruthi Gowda) (15)(14)(13)(12)(11)
  85. 場合によっては値が古い可能性がありました。リレーションキャッシュのコピーに依存するコードは本体にないため、PostgreSQL に限って言えば潜在的なバグに過ぎません。ただし、これに起因してバグが発生する拡張が存在する可能性があります。

  86. make_etagsスクリプトで、Exuberant ctags 以外の ctag が動作するように修正されました。 (Masahiko Sawada) (15)
  87. アーカイブが有効で、二相トランザクションのリカバリが必要な場合に、スタンバイサーバの昇格時に発生する障害が修正されました。 (Julian Markwort) (14)(13)
  88. 必要な二相トランザクションが最新の (部分的な) ログセグメントに記録されている場合、「ERROR: requested WAL segment .. has already been removed」という誤ったメッセージが出力され、昇格に失敗していました。

  89. 遅延チェックポイント終了フラグの再初期化漏れが修正されました。 (suyu.cmj) (14)(13)(12)(11)
  90. チェックポイントが不必要に遅延したり、アサート有効ビルドでアサート失敗したりする可能性がありました。

  91. OpenSSL 3.0.0 以降でのコンパイル時に非推奨の警告を表示しないようになりました。 (Peter Eisentraut) (13)(12)(11)

15.3、14.8、13.11、12.15、11.20 (2023年5月11日リリース)の変更点

  1. CREATE SCHEMA が search_path の変更をオーバーライドしないようになりました。 (Alexander Lakhin) (15)(14)(13)(12)(11)
  2. CREATE SCHEMA は 1つの文の中でスキーマ内要素も作成することができます。CREATE SCHEMA の中では、安全な search_path に変更される場合でも、新たに作るスキーマと元々有効であったスキーマが有効な状態で動作していました。これを利用して、スキーマを作れる権限を持つユーザは SECURITY DEFINER の関数や拡張のスクリプトの権限を奪取することができました。(CVE-2023-2454)

  3. 集合(複数行)を返す関数のインライン化の後にも、行単位セキュリティポリシーが正しく働くように修正されました。 (Stephen Frost, Tom Lane) (15)(14)(13)(12)(11)
  4. 集合を返す SQL言語関数が、行単位セキュリティ(RLS)ポリシーを持つテーブルを参照していて、呼び出し元の問い合わせにインライン化できる場合に、その RLSポリシーは異なるロールでキャッシュされたプランの再使用を伴う一部の場合に正しく働きませんでした。

    これにより、ユーザが本来見ることのできない行を参照したり更新したりすることができてしまいました。(CVE-2023-2455)

  5. STRATEGY WAL_LOG オプションを伴う CREATE DATABASE の後に、元となるテンプレートデータベースが破損する可能性があり、修正されました。 (Nathan Bossart, Ryo Matsumura) (15)
  6. 不適切なバッファ処理が後のテンプレートの pg_classカタログの修正を喪失するリスクをもたらしていました。CREATE DATABASE 直後にテンプレートデータベース上で CREATE TABLE などのDDL を実行して、チェックポイントを行うと、DDL結果が失われたり、サービスのクラッシュ終了が発生することがありました。

  7. STRATEGY WAL_LOG オプションで CREATE DATABASE を実行したときのメモリリークと不要なディスク読み込みが修正されました。 (Andres Freund) (15)
  8. CREATE SCHEMA で新たなスキーマ名を省略した場合のクラッシュを回避するようになりました。 (Michael Paquier) (15)(14)(13)(12)(11)
  9. SQL標準では「CREATE SCHEMA AUTHORIZATION role_name」と書くことができて、新たなスキーマ名は role_name になります。しかしながら、一部のコードパスはスキーマ名が指定されている想定になっていて、障害を引き起こしました。

    (クラッシュ発生例)
    db=# CREATE ROLE role1;
    db=# CREATE SCHEMA scm1;
    db=# CREATE SCHEMA AUTHORIZATION role1 CREATE TABLE scm1.t1 (id int);
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  10. MERGEコマンドの様々なプランナの障害が修正されました。 (Tom Lane) (15)
  11. プラン作成時に「ERROR: variable not found in ...」や「ERROR: PlaceHolderVar found where not expected」などのエラーが出て、失敗することがありました。

  12. 一部の場合における MERGE で報告される行数が修正されました。 (Dean Rasheed) (15)
  13. MERGE ではコマンドタグで報告する行数として、NULL を返す BEFORE ROWトリガにより実際には変更されない行数も数えていました。これは通常の UPDATE や DELETE の動作と整合しませんので、修正されました。また、MERGE が行をパーティション間で移動するときに、行を重複して数えないように修正されました。

    (誤動作例)
    db=# CREATE TABLE t7 (id int PRIMARY KEY, v text);
    db=# INSERT INTO t7 VALUES (1, 'A');
    db=# CREATE FUNCTION f_trg7() RETURNS TRIGGER LANGUAGE plpgsql AS
           $$ BEGIN RETURN NULL; END; $$;
    db=# CREATE TRIGGER trg7 BEFORE UPDATE ON t7 FOR EACH ROW
            EXECUTE FUNCTION f_trg7();
    
    (いずれも実際には 0件更新だが UPDATEでは 0、MERGEでは 1 になっていた)
    db=# UPDATE t7 SET v = 'X' WHERE id = 1;
    UPDATE 0
    
    db=# MERGE INTO t7 t USING (VALUES (1, 'Y')) s (id, v) ON t.id = s.id
           WHEN MATCHED THEN UPDATE SET v = s.v
    	   WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.v);
    MERGE 1
    
  14. 同時更新を伴う MERGE の問題が修正されました。 (Dean Rasheed, Álvaro Herrera) (15)
  15. MERGE により更新または削除される行が同時実行トランザクションで更新されるとき、一部の場合に不適切な振る舞いをしていました。MERGE の実行で、クラッシュや誤ったマージ動作、あるいは、何も行われない、という振る舞いが生じる可能性がありました。

  16. 欠けていた MERGEコマンドの逆コンパイルに対応しました。 (Álvaro Herrera) (15)
  17. MERGEコマンドを追加したときに見落とされていました。新形式の SQL関数で MERGE を使うときに必要で、ダンプや psql の \sf+ がエラーになりました。

    (エラー発生例)
    db=# CREATE TABLE t9_src (id int primary key, dat text);
    db=# CREATE TABLE t9_tgt (id int primary key, dat text);
    db=# CREATE FUNCTION f9() RETURNS void LANGUAGE SQL
         BEGIN ATOMIC
         MERGE INTO t9_tgt USING t9_src s on s.id = t9_tgt.id
           WHEN MATCHED THEN UPDATE SET dat = s.dat
           WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.dat);
         END;
    db=# \q
    $ pg_dump -s db
    pg_dump: error: query failed: ERROR:  unrecognized query command type: 5
    pg_dump: detail: Query was: EXECUTE dumpFunc('33892')
    
  18. パーティションテーブルにおける外部キー制約のトリガの有効化/無効化について修正されました。 (Tom Lane) (15)
  19. RE そのような場合にパーティション上の複製されたトリガを名前から探していたため、ALTER TABLE ... ENABLE/DISABLE TRIGGER がエラーになっていました。OID を使う実装に修正されました。

    (エラー発生例)
    db=# CREATE TABLE t10fk (id int PRIMARY KEY);
    db=# CREATE TABLE t10 (id int PRIMARY KEY,
           fk_id int NOT NULL REFERENCES t10fk (id)) PARTITION BY RANGE (id);
    db=# CREATE TABLE t10p1 PARTITION OF t10 FOR VALUES FROM (1) TO (100);
    db=# ALTER TABLE t10 DISABLE TRIGGER ALL;
    ERROR:  trigger "RI_ConstraintTrigger_c_33906" for table "t10p1" does not exist
    
  20. インデックスで使われている複合型の変更が禁止されました。 (Tom Lane) (15)(14)(13)(12)(11)
  21. ALTER TYPE はテーブル列で使われている複合型に対するバイナリ互換性の無い変更を、今のところ許していません。これまでインデックスで使われている場合について見落とされており、本修正で禁止されました。

  22. システム列を外部キーの要素とすることが禁止されました。 (Tom Lane) (15)(14)(13)(12)
  23. システム列として行ごと OID が廃止されたことにより、システム列に対する外部キー制約の用途は無くなったと考えられます。また、現状いくつかのコードはもはや対応していません。

  24. 行単位セキュリティ(RLS) が設定されている親テーブルからの COPY TO が子テーブルの行をコピーしないようになりました。 (Antonin Houska) (15)(14)(13)(12)(11)
  25. ドキュメントには COPY TO は継承子テーブルの行をコピーしないと書かれています。しかしながら、RLS が有効な場合に誤って子テーブルの行がコピーされていました。

  26. array_position() および array_positions() 関数に空配列を渡した場合のクラッシュが修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  27. to_char() 関数で範囲外データ取得の可能性があり、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  28. 場合によってはクラッシュを引き起こす可能性がありました。

  29. translate() 関数におけるバッファオーバーラン読み出しが回避されました。 (Daniil Anisimov) (15)(14)(13)(12)(11)
  30. translate('54321', '12345', 'abcd') など、文字を削除させる動作をさせた場合に、範囲外バイトの読み込みが生じて、可能性は低いですがクラッシュを引き起こすおそれがありました。

  31. テキスト検索における文字クラス処理のロジックが、有効なロケールが C であるかを正しく検出できるように修正されました。 (Jeff Davis) (15)
  32. これまでデータベースのデフォルト照合順序に ICU を使っている場合に混乱がありました。

  33. interval型に対する空文字列の入力によるクラッシュが修正されました。 (Tom Lane) (15)
  34. (クラッシュ発生例)
    db=# SET IntervalStyle TO sql_standard;
    db=# SELECT ''::interval;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  35. ISO-8601形式の interval値の表現で、フィールドの指数表現が再び使用可能になりました。 (Tom Lane) (15)
  36. interval型に対する「P0.1e10D」のような入力は ISO-8601 で公式には認可されていませんが、PostgreSQLではバージョン 15.0 まで長らく許容していました。15.0 で一度禁止されましたが、本バージョンから許容するようになりました。

  37. JSON文字列リテラルでのパースエラーに対するエラーカーソル設定が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  38. JSON値の中の文字列リテラルで構文エラーが検出されたほとんど場合に、エラーカーソルを適切に設定することに失敗していました。これは、少なくとも(違う箇所を示す)役に立たないエラーメッセージをもたらし、14.x、15.x では場合によってはクラッシュを引き起こすことがありました。

    (15.x でクラッシュを引き起こす例)
    db=# SELECT E'\n"\\u00000"'::jsonb;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  39. 現在の 64-bit XID よりも大きい vacuum_defer_cleanup_age設定によるデータ破損が修正されました。 (Andres Freund) (15)(14)(13)(12)
  40. そのような vacuum_defer_cleanup_age が設定されているとき、PostgreSQL 14.x、15.x では vacuum が誤って未だ有効な行バージョンを除去してしまう可能性がありました。PostgreSQL 13.x、12.x では GiST インデックスにのみ影響があり、インデックスページの早すぎる再利用が生じる可能性がありました。

    結果として以下のような予期せぬエラーがあらわれることが報告されています。

    ERROR:  MultiXactId ... has not been created yet -- apparent wraparound
    ERROR:  could not open file "base/12345/16789" (target block 999): ...
    ERROR:  attempted to lock invisible tuple
    ERROR:  could not access status of transaction 3456789
    
  41. パーサが誤った入れ子の集約を検出するのに失敗する場合があり、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  42. 集約関数は入れ子にできないため、「ERROR: aggregate function calls cannot be nested」を出すのが正しい動作です。この見落としにより、パース時点で拒絶されるべき無効な問い合わせで、エグゼキュータでクラッシュやアサート失敗を引き起こす可能性がありました。

    (クラッシュ動作例)
    db=# WITH cte22 (col1) AS (SELECT 1)
         SELECT avg((
             SELECT avg(a1.col1 ORDER BY (SELECT avg(a2.col2) FROM cte22))
           FROM cte22 a1)) FROM cte22 AS a2(col2);
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  43. GENERATED .. AS IDENTITY による serial型列の定義で SEQUENCE NAME オプションのパース時にパースツリーのデータ構造を破損しており、修正されました。 (David Rowley) (15)(14)(13)(12)(11)
  44. イベントトリガが壊れたパースツリーを取得する場合に問題が起きる可能性がありました。なお、SEQUENCE NAME はドキュメントに記載がありませんが、以下のように使用できます。

    CREATE TABLE t23 (id int GENERATED ALWAYS AS IDENTITY (SEQUENCE NAME seq23));
    
  45. Initプランをあるノードから別ノードに移動するときに、プランノードの並列安全性マークを正しく更新するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  46. この誤りにより、実行時に「ERROR: subplan "..." was not initialized」というエラーが生じる可能性がありました。Initプランはプランツリーやサブプランツリーの開始点です。

  47. 拡張統計のコードで PlaceHolderVars での障害が回避されました。 (Tom Lane) (15)(14)
  48. 統計の種別に dependencies を含む拡張統計を使用した問い合わせの実行時に予期せぬエラー「ERROR: PlaceHolderVar found where not expected」が発生することがありました。

  49. サブクエリに適用される検索条件句をサブクエリ内のウィンドウ集約の実行時条件(Run Condition)に変換できるかについての、誤ったテストが修正されました。 (David Rowley) (15)
  50. このような形状の問い合わせでは、アサート失敗や、誤った問い合わせ結果、その他の異常が生じるが起きる可能性がありました。

    (予期せぬエラーが出るSQL例)
    db=# SELECT * FROM (
           SELECT empno, salary, count((SELECT 1)) OVER (ORDER BY empno DESC) c
             FROM t26) emp WHERE c = 1;
    ERROR:  WindowFunc not found in subplan target lists
    
  51. 集約関数の引数や FILTER句に副問い合わせが含まれるとき、ウィンドウ集約に対して逆変換による最適化が禁止されました。 (David Rowley) (15)(14)(13)(12)(11)
  52. この最適化では集約の引数式が繰り返し可能な結果を持つ必要があり、副問い合わせでは実現できないと考えられます。アサート失敗が報告されました。

  53. 入れ子になった ARRAY[] コンストラクタの実行で、誤りが修正されました。 (Alexander Lakhin, Tom Lane) (15)(14)(13)(12)(11)
  54. 配列に対する必要サイズのオーバーフローを正しく検知できるように修正され、不正メモリアクセスによるクラッシュが回避されました。また、生成される配列の末尾のパディングをゼロ埋めするようになり、後の配列利用で奇妙な動作が生じる可能性が回避されました。

  55. 複合型ドメイン配列内フィールドを更新するときのクラッシュが防止されました。 (Dmitry Dolgov) (15)(14)(13)(12)
  56. 制約の無いドメインで発生します。

    (障害発生例)
    db=# CREATE TYPE typ1 AS (c1 int, c2 int);
    db=# CREATE DOMAIN dom1 AS typ1;
    db=# CREATE TABLE t29 (a dom1[]);
    db=# INSERT INTO t29 VALUES ('{"(10,20)","(30,40)"}');
    db=# UPDATE t29 SET a[1].c1 = -1;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  57. boolean型の列に対するパーティション除去のロジックが修正されました。 (David Rowley) (15)(14)(13)(12)(11)
  58. 「boolcol IS NOT TURE」のような条件での除去が正しく働かず、boolcol が NULL である行を返さない、誤った問い合わせ結果が生じる可能性がありました。この他に「(NOT boolcol)」でのパーティション化も誤って処理されていました。

    パーティション除去とは enable_partition_pruning = on で有効となる、プラン作成でのパーティションテーブルに対する最適化です。

  59. パラレルハッシュ結合(Parallel Hash Join)でバッチ毎のクリーンアップでの競合状態を修正しました。 (Thomas Munro, Melanie Plageman) (15)(14)(13)(12)(11)
  60. parallel_leader_participation = off (デフォルトは on)の場合に、タイミングによってはクラッシュを起こす可能性がありました。

  61. EvalPlanQual の検査後、GENERATED列を再計算するようになりました。 (Tom Lane) (15)(14)(13)(12)
  62. READ COMMITTED 隔離レベルでは、問い合わせが最初に見つけたものよりも新しい行バージョンに、行更新の影響を再適用する必要があるかもしれません。その場合、同時の更新で変化した列に依存する GENERATED列を再計算する必要がありました。

    EvalPlanQual は READ COMMITTED 隔離レベルの問い合わせで実行される内部処理です。本障害により、被参照列だけ更新されて、それに連動して計算される GENERATED列は元の値まま、という状態で行が読み取られる動作が報告されました。

  63. Memoizeプランの実行におけるメモリリークが修正されました。 (David Rowley) (15)(14)
  64. パーティションテーブルに含まれる外部テーブルに対してバッチ挿入を使うときの、バッファの参照カウント漏れが修正されました。 (Alexander Pyhalov) (15)(14)
  65. 警告ログメッセージ「WARNING: buffer refcount leak: ...」が発生しました。

  66. ミリ秒以下の vacuum_cost_delay 設定が再び利用可能になりました。 (Thomas Munro) (15)(14)
  67. 以前の修正の誤りのために 14.x、15.x ではミリ秒以下の値が捨てられて処理されていました。

  68. リレーション毎の vacuum_cost_delay設定が 0 のとき、遅延バランス処理をしないようになりました。 (Masahiko Sawada) (15)(14)(13)(12)(11)
  69. autovacuum がリレーション毎 vacuum_cost_delay設定付のテーブルを処理するときにはいつでも、遅延バランスは無効と考えられていましたが、設定値が 0 の場合にも誤って有効と判断されていました。

  70. 列がビュー末尾に追加されたときの、稀な場合のクラッシュが修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  71. 更新可能ビューの元となるビューを CREATE OR REPLACE VIEW で列が増えるように作成しなおした場合に、その後の更新可能ビューへの読み書きで、予期せぬ警告(「WARNING: problem in alloc set MessageContext: req size > alloc size ...」)や、トリガの奇妙な動作、クラッシュが生じることがありました。

  72. パーティションテーブルの更新における、MULTIEXPR_SUBLINKサブプラン実行での稀な障害が修正されました。 (Andres Freund, Tom Lane) (15)(14)(13)(12)(11)
  73. パーティションテーブルに対して、「INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...)」という構文を使用するとき、いずれかの子テーブルが親テーブルと同形でない場合(例えば列の物理順序が異なるなど)、クラッシュや誤ったデータ更新を引き起こす可能性がありました。一般的にはエグゼキュータの整合性チェックでエラーになるだけで済みます。

    MULTIEXPR_SUBLINKサブプランは、実行プランツリーにおいて、複数の対象リスト要素を持つサブプランを意味します。

  74. DO ALSO INSERT ... SELECT ルールを持つビューに対する複数行の INSERT ... VALUES 内での DEFAULTマーカの処理が修正されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
  75. このような場合、一般的には「ERROR: unrecognized node type: ...」エラーか、アサート失敗が生じます。

    (エラー発生例)
    db=# CREATE TABLE t39 (a int, b int DEFAULT -1);
    db=# CREATE VIEW v39 AS SELECT * FROM t39;
    db=# CREATE RULE r39 AS ON INSERT TO v39 DO ALSO INSERT INTO t39 SELECT 1;
    db=# INSERT INTO v39 VALUES (0, DEFAULT), (1, DEFAULT);
    ERROR:  unrecognized node type: 148
    
  76. ルールアクションでサブクエリ内の OLD と NEW を参照できるようになりました。 (Dean Rasheed, Tom Lane) (15)(14)(13)(12)(11)
  77. このような参照は実際にはラテラル参照ですが、明示的に LATERAL と指定していない場合、クラッシュが生じる可能性がありました。

    以下のような処理でアサート失敗が報告されました。

    db=# CREATE TABLE t40 (a int, b int DEFAULT -1);
    db=# CREATE VIEW v40 AS SELECT * FROM t40;
    db=# CREATE RULE r40i AS ON INSERT TO v40 DO ALSO
           INSERT INTO t40 SELECT * FROM (SELECT a FROM t40 WHERE NEW.a = t40.a) tt;
    db=# INSERT INTO v40 VALUES (1), (2);
    
  78. WITH句内に INSERT/UPDATE/DELETE を含む、ルールや SQL関数の逆コンパイル時に、ターゲットテーブルの別名を正しく出力するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  79. ダンプした結果、もとのコードと異なる内容が出力されてリストア不能になる動作が報告されました。

    (障害を起こす関数例)
    db=# CREATE TABLE t41_1 (c1 int);
    db=# CREATE TABLE t41_2 (c1 int);
    db=# CREATE FUNCTION f41 (c1 int) RETURNS void LANGUAGE SQL
           BEGIN ATOMIC
           WITH delete_t41 AS ( DELETE FROM t41_1 WHERE c1 = $1 )
            INSERT INTO t41_1 (c1) SELECT $1 FROM t41_2;
           END;
    
  80. SERIALIZABLE READ ONLY の最適化の欠陥が修正されました。 (Thomas Munro) (15)(14)(13)(12)(11)
  81. 既に失敗したものと印付けされているトランザクションが、SERIALIZABLE で READ ONLY のトランザクションに対する安全なスナップショットの最適化について混乱させていました。一部の場合に最適化が不必要に省略されていました。また、別のある場合にはアサート失敗が起きていました(アサート無しのビルドでは何ら問題ありません)。

  82. ロジカルデコーディングプラグインの pgoutput で、キャッシュのコールバックスロットのリークを回避するようになりました。 (Shi Yu) (15)(14)(13)(12)(11)
  83. 単一セッション内でプラグインの開始と停止を繰り返すと、「ERROR: out of relcache_callback_list slots」が生じました。

  84. インデックス演算子クラスのオプションに対するカスタムバリデータの不要な呼び出しを回避するようになりました。 (Alexander Korotkov) (15)(14)(13)
  85. この変更は一部の予期せぬエラーが発生していた現象を修正します。

  86. 複数列の BRINインデックスを複数のキーで走査するときに、無用な動作が回避されました。 (Tomas Vondra) (15)(14)
  87. 現行コードは範囲にマッチするか判断するときに最後のスキャンキーだけを考慮していました。そのため、たいていインデックスを必要とするより多くスキャンしていました。

    (障害動作例)
    db=# CREATE TABLE t45 (a int, b int); 
    db=# INSERT INTO t45 SELECT g, g FROM generate_series(1, 1000000) g;
    db=# CREATE INDEX ON t45 USING brin (a,  b);
    db=# SELECT * FROM t45 WHERE a = 12345 AND b > 1; -- 遅く動作する
    db=# SELECT * FROM t45 WHERE a > 1 AND b = 12345; -- 適切に高速動作する
    
  88. BRIN の inet_minmax_multi_ops 演算子クラスでネットマスク処理が修正されました。 (Tomas Vondra) (15)(14)
  89. この誤りはアサート失敗を引き起こしますが、実運用むけビルドではほぼ無害です。

  90. GiSTインデックスのバッファ処理モード作成時に無効ポインタへのアクセスがあり、修正されました。 (Alexander Lakhin) (15)(14)(13)(12)(11)
  91. 取得される値は重要では無いため、この誤りは実運用ビルドにおいて通常は無害と考えられます。原理的にはサーバクラッシュを引き起こす可能性があります。

  92. UPDATE や DELETE 動作のロジカルレプリケーションにおいて、除去した列と生成列を無視するようになりました。 (Onder Kalaci, Shi Yu) (15)(14)(13)(12)
  93. REPLICA IDENTITY FULL オプションのロジカルレプリケーションは、テーブルにこのような列が含まれていると、正しく行の特定ができず、変更がサブスクリプション側に反映されない挙動が発生しました。

  94. コミットタイムスタンプに対する SLRU バッファのストレージ I/O の待機イベント名が修正されました。 (Alexander Lakhin) (15)(14)(13)
  95. ドキュメントでは CommitTsBuffer という名前でしたが、CommitTSBuffer と実装されていました。関連の待機イベント名と一貫するように、ドキュメントの通りに修正されました。

  96. 待機イベント SLRUFlushSync の報告が再び有効化されました。 (Thomas Munro) (15)(14)
  97. この待機タイプは 14.0 むけのコードリファクタリングの際に誤って削除されてしまっていました。

  98. 保持する WALセグメントの数を計算するときに、アンダーフローの可能性があり回避されました。 (Kyotaro Horiguchi) (15)(14)(13)
  99. 結果として wal_keep_size設定に正確には従わない可能性ありました。

  100. スタンバイモードにおけるスタートアップ進捗報告のオーバーヘッドが取り除かれました。 (Bharath Rupireddy) (15)
  101. スタンバイモードでは実際のところリカバリ進捗をしませんが、その場合でも追跡処理が行われていました。

  102. SCRAM-SHA-256 チャンネルバインディングで RSA-PSS 証明書がサポートされました。 (Jacob Champion, Heikki Linnakangas) (15)(14)(13)(12)(11)
  103. この機能には OpenSSL 1.1.1 以降でのビルドが必要です。この機能追加はサーバ・クライアントの両方に影響します。

  104. Windows におけるプロセスID 追跡での競合を回避しました。 (Thomas Munro) (15)(14)(13)(12)(11)
  105. PostgreSQLマスタプロセス(postmaster)が子プロセスが消えたことを観測する前に、OS がその子プロセスの PID を再利用する可能性がありました。これにより、同じ PID で複数の子プロセスが記録されることがあり、混乱を招きました。

    本障害が原因と思われるアサート失敗が報告されました。

  106. 実装内部の汎用リスト処理関数 list_copy_head() が空リストを正しく扱えるように修正されました。 (David Rowley) (15)
  107. PostgreSQL のコードでは問題に該当する使い方はありませんでしたが、拡張モジュールで問題が生じるかもしれません。

  108. SPI_result_code_string() で "SPI_OK_MERGE" と "SPI_OK_TD_REGISTER" を返す場合について欠けていたため、対応されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
  109. AllocSetRealloc() で誤った Valgrind むけの印付けが修正されました。 (Karina Litskevich) (15)(14)(13)(12)(11)
  110. 大きい(8kBを越える)pallocチャンクのサイズが減るという一般的でない場合に、Valgrind検知を有効にしたビルドではチャックからのメモリ解放の定義された状態の印付けを誤っていて、Valgrindのテストで誤った結果が生じる可能性がありました。

  111. 行単位セキュリティが有効なパーティションテーブルに対する MERGE でのアサート失敗が修正されました。 (Dean Rasheed) (15)
  112. トランザクションになっているロジカルレプリケーションのメッセージをデコードするときのアサート失敗が回避されました。 (Tomas Vondra) (15)(14)(13)(12)(11)
  113. 正規表現のエスケープ処理でロケールの影響を回避しました。 (Jeff Davis) (15)(14)(13)(12)(11)
  114. 非ASCII文字が後に続くバックスラッシュで、有効なロケールによってはアサート失敗が生じる可能性がありました。そのロケールの言語で数字を意味する非ASCII文字で問題が報告されました。

  115. log_newpage_range() で、指定範囲の最後の数ページが空の場合は、空の WALレコードを書き込もうとしないようになりました。 (Matthias van de Meent) (15)(14)(13)(12)(11)
  116. リリースされたバージョンでこのケースに到達可能かどうかは完全には明らかではありませんが、到達した場合はアサート失敗が発生する可能性があります。

  117. キャスト式を使用する PL/pgSQL の DOブロック での、セッション存続期間のメモリリークが修正されました。 (Ajit Awekar, Tom Lane) (15)(14)(13)(12)
  118. Perl のリスト構造を多次元 SQL配列に変換する時の、配列の次元チェックが強化されました。 (Tom Lane) (15)(14)(13)(12)(11)
  119. PL/perl は、データが値の長方形配列を成しておらずサブリストのネストが揃っていないときに、誤動作することがありました。このような場合、クラッシュやゴミ出力(誤った問い合わせ結果)が発生する可能性がありました。これからはエラーを出すようになります。

  120. Python のリスト構造を多次元 SQL配列に変換する時の、配列の次元チェックが強化されました。 (Tom Lane) (15)(14)(13)(12)(11)
  121. PL/Python は、空のサブリストを処理するときや、データが値の長方形配列を成しておらずサブリストのネストが揃っていないとき、誤動作することがありました。前者は出力配列が空になり、後者はエラーが発生します。ただし、一部のケースではクラッシュしたり、予期せぬ出力(誤った問い合わせ結果)が発生していました。

  122. PL/Python の例外スタックの巻き戻しが修正されました。 (Xing Guo) (15)(14)(13)(12)(11)
  123. 稀な障害例としては、PG_TRY 例外スタックをクリーンアップせずに戻ることがあり、次のスタックレベルが巻き戻される前に別のエラーが発生した場合にクラッシュする危険性がありました。

  124. libpq の PQconnectPoll() における一貫性のない GSS暗号化のエラー処理が修正されました。 (Michael Paquier) (15)(14)(13)(12)
  125. gssencmode が require に設定されていると、GSS の初期化に失敗した後でも、接続は dead とマークされませんでした。 TLS暗号化の同等のケースで以前から行われてきたように、直ちにエラーを返すように変更されました。

  126. -C ORACLE オプションでビルドされた ecpg プログラムで発生する可能性のあるデータ破損が修正されました。 (Kyotaro Horiguchi) (15)(14)(13)(12)(11)
  127. varcharsize をゼロに設定して ecpg_get_data() を呼び出すと、直前のフィールドの最後のバイトに終端ゼロ文字が書き込まれ、そのフィールドのデータが切り捨てられることがありました。

  128. 列挙(enum)型の列でハッシュ分割されたパーティションテーブルを正常にリストアできるように pg_dump が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  129. 列挙値のハッシュコードは列挙値に割り当てられた OID に依存するため、通常、ダンプとリストアの後は異なります。つまり、多くの場合、行は元のパーティションとは異なるパーティションに入る必要があります。ユーザは --load-via-partition-root オプションを指定することでこの問題を回避できますが、それが無ければ成功する可能性はほとんど無いため、pg_dump がこのようなテーブルで自動的にオプション適用するように変更されました。

    また、--load-via-partition-root モードが使用されている場合、リストア前にターゲットテーブルを TRUNCATE を試行しないよう pg_restore が修正されました。これにより、デッドロックやデータの喪失の危険性が回避されます。

  130. Windows でシークできないファイルを正しく検出するようになりました。 (Juan Jose Santamaria Flecha, Michael Paquier, Daniel Watzinger) (15)(14)
  131. このバグにより、pg_dump がパイプに書き込む時、または pg_restore がパイプから読み込む時に誤動作が発生していました。ファイルに対して成功していた同じ処理がパイプ経由だと予期せぬエラーが出る動作が報告されました。

  132. pgbench の preparedモードでは、パイプラインを開始する前にパイプライン内のすべてのコマンドを準備(prepare)するようになりました。 (Álvaro Herrera) (15)(14)
  133. これにより、pgbench スクリプトがパイプライン内でSERIALIZABLEトランザクションを開始しようとした時の以下エラーの発生を回避できます。

    ERROR:  SET TRANSACTION ISOLATION LEVEL must be called before any query
    
  134. contrib/amcheck のヒープを検査するコードで、xmin または xmax がゼロのタプルを正しく処理するようになりました。 (Robert Haas) (15)(14)
  135. これまでそのような異常を見逃していました。

  136. contrib/amcheck では、エポックゼロより前にあると思われる xid を適切に扱うようになりました。 (Andres Freund) (15)(14)
  137. 破損した場合、最初の xidエポックより前にあるように見える周回した 32ビットxid が表示されることがありました。このような値を 64ビット形式に昇格させると、はるか未来の値が生成され、結果として誤った報告が作成されることになります。このような場合には FirstNormalFullTransactionId を返すことで、合理的に正常に動作するようになりました。

  138. contrib/basebackup_to_shell で、パイプのオープン失敗を適切に検出するようになりました。 (Robert Haas) (15)
  139. contrib/hstore_plpython で、変換される Python 値がマッピングでない場合のクラッシュが回避されるようになりました。 (Dmitry Dolgov, Tom Lane) (15)(14)(13)(12)(11)
  140. これはエラーを出すべきですが、Python 3 ではチェックが誤動作するようにいくつかの API が変更されたため、クラッシュを起こしていました。

  141. ltree列の GiSTインデックスの siglen オプションを指定する場合は、4 の倍数であることが必要となりました。 (Alexander Korotkov) (15)(14)(13)
  142. それ以外の値を指定すると、インデックスコンテンツへのアクセスが不整合になります。インテル互換のハードウェアでは無害ですが、他のアーキテクチャではクラッシュを引き起こす可能性があります。

  143. contrib/pageinspect で、gist_page_items() 関数の不正な入力に対する防御が追加されました。 (Dmitry Koval) (15)(14)
  144. クラッシュする動作が報告されました。

  145. contrib/pg_trgm で満たす文字列が存在しない正規表現による誤動作が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  146. $foo のような正規表現は定義として正当ですが、この表現を満たす文字列は存在しません。正規表現コンパイラはそれを認識し、空の「非決定性オートマトン(NFA)」グラフを生成します。このようなグラフを pg_trgm の GIN または GiST インデックス修飾に最適化しようとすると、作業配列の末尾からアクセスすることになり、クラッシュが発生する可能性がありました。

  147. contrib/postgres_fdw の application_name パラメータにおけるエスケープシーケンスの処理が修正されました。 (Kyotaro Horiguchi, Michael Paquier) (15)
  148. エスケープを展開するコードは、例えば外部テーブルの自動ANALYZE の中など、バックグラウンドプロセスで実行されるとクラッシュする可能性がありました。

  149. contrib/pg_walinspect で pg_get_wal_records_info() のメモリ使用量が制限されました。 (Bharath Rupireddy) (15)
  150. これまで大容量メモリを使う動作をすることがありました。

  151. GNU互換の strip を使用して静的ライブラリを削除する場合は、--strip-unneeded オプションを使用するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  152. 以前は、 make install-strip で -x オプションが使用されていました。本変更により、llvm-strip の誤動作が回避され、出力もわずかに小さくなります。

  153. ドキュメント構築における DTDファイルの自動ダウンロードを、ドキュメントで推奨しなくなりました。また、Makefile で無効化されました。 (Aleksander Alekseev, Peter Eisentraut, Tom Lane) (15)(14)(13)(12)(11)
  154. SGMLドキュメントを構築するには、現在では DocBook の DTDファイルをローカルにインストールすることが必須となっています。以前は xsltproc が sourceforge.net からこれらのファイルを実行中にダウンロードできましたが、sourceforge.net は現在 HTTPS アクセスのみを許可しており、これをサポートする xsltproc の一般的なバージョンはありません。これに対応して、そのようなことが可能または有用であることを示唆するドキュメント箇所が削除され、代わりに xsltproc の --nonet オプションがMakefile に追加されました。

  155. PGXSビルドで TAPテストを実行する場合、一時的な portlockディレクトリとしてより安全な場所を使用するように変更されました。 (Peter Eisentraut) (15)(14)(13)(12)(11)
  156. ビルドディレクトリの tmp_check の下に置くように変更されました。以前のコーディングでは、PGXSビルドは、必ずしも書き込み可能でないインストールディレクトリに配置しようとしていました。

  157. エジプト、グリーンランド、モロッコ、パレスチナの夏時間法改正に伴い、タイムゾーンデータファイルが tzdata release 2023c に更新されました。 (15)(14)(13)(12)(11)
  158. モスクワ時間に従っている場合、Europe/Kirov および Europe/Volgograd は、モスクワ時間に従う他のタイムゾーンとの整合性を保つため、数字による略語ではなく MSK/MSD という略語を使用するようになりました。また、America/Yellowknife は America/Edmonton と区別されなくなり、この地域の 1948年以前のタイムスタンプの一部に影響します。

  159. パーティションテーブルでのクローントリガの有効化/無効化が修正されました。 (Tom Lane) (14)(13)
  160. ALTER TABLE ... ENABLE/DISABLE TRIGGER USER はクローントリガをシステムトリガと誤解してスキップしていました。ENABLE/DISABLE TRIGGER の他の形式ではそれらを処理しますが、それらはスーパーユーザチェックを不適切に実施した後でのみ行っていました。

  161. 更新または削除アクションのロジカルレプリケーション中に、ドロップされた列を無視するようになりました。 (Onder Kalaci, Shi Yu) (11)
  162. テーブルにそのような列が含まれている場合、REPLICA IDENTITY FULL オプションを使用したレプリケーションは失敗していました。

15.2、14.7、13.10、12.14、11.19 (2023年2月9日リリース)の変更点

  1. libpq は GSSAPIトランスポート暗号化の開始に失敗した後にメモリ内容をリークする可能性があり、修正されました。 (Jacob Champion) (15)(14)(13)(12)
  2. 改変されたサーバや信頼できない中間者は、Kerberos のトランスポート暗号化の確立中にゼロ終端されていない文字列を送信できます。次に libpq はその文字列とアプリケーションメモリ内の次のゼロバイトまでのバイトをエラー報告にコピーします。呼び出し側のアプリケーションがエラー報告に対して行なう処理によっては、アプリケーションのメモリ内容が漏洩する可能性がありました。また、メモリ終端を超えた読み取りによるクラッシュの可能性もわずかにありました。

    サーバメッセージを適切にゼロ終端させることで修正されました。(CVE-2022-41862)

  3. パーティションテーブルまたは継承ツリーの UPDATE中に、子テーブルで更新する必要がある GENERATED列の計算が修正されました。 (Amit Langote, Tom Lane) (15)(14)(13)
  4. 親テーブルに存在しない、または親列の生成式とは異なる依存関係を持つGENERATED列を更新できない問題が生じていました。誤った更新結果が生じるおそれがありました。

    (修正前バージョンの誤動作例)
    db=# CREATE TABLE t2p (c1 int);
    db=# CREATE TABLE t2c (c2 int GENERATED ALWAYS AS (c1 + 1) STORED) INHERITS (t2p);
    db=# INSERT INTO t2c VALUES (10);
    db=# SELECT * FROM t2c;
     c1 | c2
    ----+----
     10 | 11
    (1 row)
    
    db=# UPDATE t2p SET c1 = c1 * 10;
    
    (以下で c2列は 101 が正しい)
    db=# SELECT * FROM t2c;
     c1  | c2
    -----+----
     100 | 11
    (1 row)
    
  5. MERGE で GENERATED列の計算が失敗する可能性があったのが修正されました。 (Dean Rasheed) (15)
  6. MERGE の最初の行単位アクションが UPDATE の場合、後続の INSERTアクションでは(UPDATEターゲット列のいずれにも依存していないため)UPDATEアクションで計算する必要がないとみなされた GENERATED列の計算に失敗しました。誤った更新結果が生じるおそれがありました。

    (修正前バージョンの誤動作例)
    db=# CREATE TABLE t3 (id int PRIMARY KEY, c1 int, c2 int,
                          g3 int GENERATED ALWAYS AS (c1 * 2) STORED,
                          g4 int GENERATED ALWAYS AS (c2 * 2) STORED);
    db=# INSERT INTO t3 (id, c1, c2) VALUES (1, 5, 100);
    db=# SELECT * FROM t3;
     id | c1 | c2  | g3 | g4
    ----+----+-----+----+-----
      1 |  5 | 100 | 10 | 200
    (1 row)
    
    db=# MERGE INTO t3 USING (VALUES (1,10),(2,20)) v(id, c1) ON t3.id = v.id
           WHEN MATCHED THEN UPDATE SET c1 = v.c1
           WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.c1, 200);
    
    (以下の id=1 の行の g3 は 20 が正しく、id=2 の行の g3、g4 は 40、400 が正しい)
    db=# SELECT * FROM t3;
     id | c1 | c2  |   g3   |   g4
    ----+----+-----+--------+--------
      1 | 10 | 100 |     10 |    200
      2 | 20 | 200 | *null* | *null*
    (2 rows)
    
  7. MERGE で到達不可能な WHEN句に対するチェックが修正されました。 (Dean Rasheed) (15)
  8. 無条件の WHEN句に続く WHEN句は下記のエラーで到達不能として拒否されるべきですが、このケースは常に検出されるわけではありませんでした。

    ERROR:  unreachable WHEN clause specified after unconditional WHEN clause
    
  9. MERGE のルール検出テストが修正されました。 (Dean Rasheed) (15)
  10. MERGE はルールのあるテーブルには対応していません。しかし、かつてルールを持っていて今は持っていないテーブルでも以下のエラーが生じていました。

    ERROR:  cannot execute MERGE on relation "..."
    DETAIL:  MERGE is not supported for relations with rules.
    
  11. MERGE では「DO NOTHING」アクションを処理された行数として数えないようになりました。 (Álvaro Herrera) (15)
  12. これにより、コードの動作がドキュメントと一致するようになります。本障害および修正で変わるのは、MERGE 実行後の影響を受けた行数の出力値、すなわち、psql で「MERGE 10」などと表示され、libpq の PQcmdTuples(res) で取得できる値だけです。

  13. 「WITH RECURSIVE ... CYCLE」という共通テーブル式(CTE) が出力列にアクセスできるようになりました。 (Tom Lane) (15)(14)
  14. これまで CTE内から SET句で指定した列を参照すると下記のエラーが生じていました。

    (修正前バージョンのエラー発生例)
    db=# WITH RECURSIVE cte7(x, y) AS (
           SELECT 0, 0 UNION ALL SELECT x, y FROM cte7 AS r WHERE r.is_cycle
    	 ) CYCLE x, y SET is_cycle USING path
    	 SELECT * FROM cte7;
    ERROR:  cache lookup failed for type 0
    
  15. 外部テーブルへのバルクインサートを行なう際の保留中のインサート処理について修正されました。 (Etsuro Fujita) (15)(14)
  16. 保留中のインサートがすぐに外部テーブルラッパー(FDW)にフラッシュされず、BEFORE ROWトリガで本来見えるはずの行が見えないなど、論理的な不整合が発生することがありました。

    本障害により、結果としてトリガによる誤った更新が生じる可能性がありました。

  17. その時点では有効でないインデックスに REPLICA IDENTITY が設定できるようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  18. pg_dump が REPLICA IDENTITY と印付けされたパーティションインデックスをダンプする時、パーティションインデックスが有効となる前に「REPLICA IDENTITY」を適用するコマンド実行順で生成され、リストア失敗の原因となっていました。 この順序で実行することを禁止する正当な理由はないと判断され、許可するようになりました。インデックスが有効になるまで、REPLICA IDENTITY の印付けは何の効果も持ちません。

  19. 複数行の VALUESリストから INSERT を実行するルールにおける、DEFAULT の処理が修正されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
  20. DEFAULT指定箇所を適切なデフォルト値の式に置き換えられず、「ERROR: unrecognized node type」が発生することがありました。

    (修正前バージョンの誤動作例)
    db=# CREATE TABLE t10 (val int);
    db=# INSERT INTO t10 VALUES (100);
    db=# CREATE TABLE t10_log (ts timestamptz DEFAULT now(), val int, dsc text);
    db=# CREATE RULE r10 AS ON UPDATE TO t10
           DO ALSO INSERT INTO t10_log VALUES
             (DEFAULT, OLD.val, 'old'), (DEFAULT, NEW.val, 'new');
    db=# UPDATE t10 SET val = 101 WHERE val = 100;
    ERROR:  unrecognized node type: 148
    
  21. jsonpath の存在チェックで未定義変数の使用が拒否されるようになりました。 (Alexander Korotkov, David G. Johnston) (15)(14)(13)(12)
  22. jsonpath の一致演算子ではパスパターンに未定義の変数があるとエラーになりますが、存在演算子ではエラーや警告を出さずに一致するものとして扱っていました。

    (正しい動作)
    db=# SELECT jsonb_path_match('[{"a": 1}]', '$undefined_var');
    ERROR:  could not find jsonpath variable "undefined_var"
    
    (修正前バージョンの誤動作例、jsonb_path_match と同様にエラーとなるべき)
    db=# SELECT jsonb_path_exists('[{"a": 1}]', '$undefined_var');
     jsonb_path_exists
    -------------------
     t
    (1 row)
    
  23. TOAST格納された添え字の値を扱えるように、jsonb の添え字処理が修正されました。 (Tom Lane, David G. Johnston) (15)(14)
  24. テーブルから直接フェッチされた長いテキスト値を jsonb 添え字として使用すると、エラーを起こす可能性がありました。フェッチ(値の取り出し)では、たいてい一致する要素を見つけられません。この問題を引き起こすほどの長いキーはフィールドではおそらく稀ですが、代入ではガベージキーを使用して値を格納できました。

    (修正前バージョンの誤動作例)
    db=# CREATE TABLE t12 (id text, test_json jsonb);
    db=# INSERT INTO t12 VALUES ('foo', '{"foo": "bar"}');
    db=# INSERT INTO t12
           SELECT s, ('{"' || s || '": "bar"}')::jsonb FROM repeat('longsub', 500) s;
    
    (添え字に対する値が見つけられない結果になる)
    db1=# SELECT substr(id, 1, 20), test_json[id] FROM t12;
            substr        | test_json
    ----------------------+-----------
     foo                  | *null*
     longsublongsublongsu | *null*
    (2 rows)
    
  25. 並列ハッシュ結合における稀な場合のデータ破損が修正されました。 (Dmitry Astapov) (15)(14)(13)(12)(11)
  26. 一時ファイルに書き出される大きなタプルの最後のチャンクがちょうど 32760バイトである場合、境界バグにより破損する可能性がありました。典型的には後に問い合わせがデータ破損の症状でエラーを出します。例えば(何らかデータ長を示す部分の値が壊れていることによる)「ERROR: XX000: invalid memory alloc request size 1702125924」が出るケースが報告されました。

    ここでのデータ破損はメモリ上や一時ファイルで生じるものです。しかし、更新をする並列問い合わせでデータ破損を含む処理がエラーを起こさずに実行されてしまう可能性が無いとは確認されていません。

  27. checkpoint_completion_target のデフォルト以外の設定を尊重するようになりました。 (Bharath Rupireddy) (15)(14)(13)(12)(11)
  28. checkpoint_completion_target の変更後に内部状態が更新されなかったため、特に設定を reload で変更した場合、チェックポイント I/O の実行が設定値に基づいて期待されるよりも高速または低速になることがありました。

  29. recovery_target_xid モードでログに正しい終了タイムスタンプが記録されるようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  30. recovery_target_inclusive = "off" で recovery_target_xid 設定に基づいてリカバリを終了すると「LOG: recovery stopping before ... transaction」のログメッセージに誤ったタイムスタンプ(常に 2000-01-01)が出力されました。

  31. バッファリングされたファイル読み込みの失敗に対するエラー報告が改善されました。 (Peter Eisentraut) (15)(14)(13)
  32. 短くしか読めなかった場合について正しく報告するようになりました。不適切なエラーコードに基づくメッセージではなく、期待されたバイト数と読んだバイト数が出力されるようになります。ロジカルレプリケーションやベースバックアップに関するコードで修正が適用されました。

  33. int2vector と oidvector で要素数の恣意的な上限が取り除かれました。 (Tom Lane) (15)
  34. 以前は、これらの型の入力関数は 100 以上の要素を拒否してきました。論理レプリケーションの列をリスト指定できる仕様の導入に伴って、int2vector が最大で 1600列分の要素を受け付ける必要が生じました。

    列数の多いテーブルに対して、論理レプリケーションが「ERROR: int2vector has too many elements」エラーを出して、止まってしまう動作が報告されました。

  35. 拡張問い合わせプロトコルで、パイプラインを実行していた場合、ANALYZE の後に即時コミットをしないようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  36. 明示的なトランザクション開始命令(BEGIN TRANSACTION など)が無い場合、ANALYZE は勝手にコミットしていました。これはパイプライン化された一連のコマンドの中では望ましくないと判断されました。

  37. 間違った長さのキャンセルリクエストパケットを拒否するようになりました。 (Andrey Borodin) (15)(14)(13)(12)(11)
  38. これまで、長さが短いキャンセルリクエストも処理されていて、割り当てられたバッファの最後を超えた読み込みが発生していました。理論的にはセグメンテーション違反が起きる可能性がありましたが、そのバッファはメモリ末尾にとても近いため、実際にはほとんど発生しません。良く起きることは、間違ったバックエンド PID やキャンセルコードを指摘するでたらめなログメッセージを出力してしまうことです。

    本修正でキャンセルリクエストについても間違った長さであることを示す「LOG: invalid length of startup packet」が報告されるようになりました。

  39. ウィンドウ関数の実行条件式に対するプランナの前処理の誤りが修正されました。 (Richard Guo, David Rowley) (15)
  40. これにより「ERROR: WindowFunc not found in subplan target lists」のようなプランナのエラーが出力されていました。

  41. ウィンドウ関数の実行条件式を実行する際に、無効な領域へのポインタアクセスが修正されました。 (David Rowley) (15)
  42. 実際には、実行条件の最適化は int8 を返すいくつかのウィンドウ関数にのみ適用されるので、32-bit でビルドされた時のみの問題です。

  43. サブクエリのプルアップにおいて、再帰呼び出しやループに対する防御機構が追加されました。 (Tom Lane) (15)(14)(13)(12)(11)
  44. 作りこまれた問い合わせにより、結果として深い再帰になって、サブクエリの平坦化を試みるのに不合理に長時間を費やす可能性がありました。

    これに対する適切な修正は後方適用するには修正量が大きくなります。本修正では、スタックの深さチェックと、問い合わせをキャンセルするための割り込み検査を加えています。

  45. Memoizeノードと、パーティション横断の結合やパラメタ化された入れ子ループを組み合わたのときの、プランナの問題が修正されました。 (Richard Guo) (15)(14)
  46. 本障害により、Memoize が利用可能なときでも使われない劣った実行計画や、場合よっては誤った実行計画が生じる可能性がありました。

  47. パーティション横断の結合で、各パーティションに対するプラン生成の失敗に寛容になるように修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  48. 本障害により「ERROR: could not devise a query plan for the given query」というエラーが生じることがありました。エラーを出すのではなく、パーティション横断の結合をしない実行計画を選択するようになりました。

  49. get_actual_variable_range によって実行されるクリーンナップ作業の量が制限されるようになりました。 (Simon Riggs) (15)(14)(13)(12)(11)
  50. get_actual_variable_range は最大値・最小値を調べる PostgreSQLの内部実装関数で、プランナで使われます。

    プランナは、インデックスの最後に現れる大量のタプルを削除した後にこれらのインデックスエントリに killedビットをセットする膨大な仕事をしなければならないことがありました。

    本修正で 1つのクエリでの処理量が 100 ヒープページに制限されました。最終的には全てのタプルの削除は必要ですが、これにより突然の大幅な性能低下は回避できます。

  51. リレーションの relkind が変わった時、統計計算が混乱してしまった問題が防止されました。 (Andres Freund) (15)
  52. テーブルをビューに変更するとクラッシュやアサート失敗になる可能性がありました。

  53. 括弧で囲まれた「AT TIME ZONE」構文の表示が修正されました。 (Tom Lane) (15)(14)
  54. これは「AT TIME ZONE」の引数自体が式になっているルールやビューに対するダンプ/リストアの失敗をもたらしました。

    (誤動作例、括弧が外れてしまっている)
    db=# CREATE VIEW v27 AS
           SELECT ('2022-12-01'::date + '1 day'::interval) AT TIME ZONE 'Europe/Paris';
    
    db=# SELECT pg_catalog.pg_get_viewdef('v27'::regclass, true);
                                             pg_get_viewdef                         
    -------------------------------------------------------------------------------------------------
      SELECT ('2022-12-01'::date + '1 day'::interval AT TIME ZONE 'Europe/Paris'::text) AS timezone;
    (1 row)
    
  55. SQL関数でユーティリティコマンドに対するキャッシュされたパースツリーの誤った上書きを防止するようになりました。 (Tom Lane, Daniel Gustafsson) (15)(14)
  56. SQL言語の関数が同じユーティリティコマンドを 1つの問い合わせの中で複数回実行した場合、クラッシュやアサート失敗、「ERROR: unrecognized node type: ..」のような奇妙なエラーが引き起こされる可能性がありました。

    (アサート失敗が報告されたSQL実行例)
    db=# CREATE FUNCTION f28() RETURNS INT LANGUAGE SQL AS $$
           CREATE TABLE t28 (col0 INT CHECK ('x' = 'x')); SELECT 1; $$;
    db=# SELECT f28() FROM (VALUES (1), (1)) AS a0;
    
  57. 全文検索の問い合わせの実行がフレーズ一致を処理しているときに確実にキャンセルできるようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
  58. 非決定的な照合順序を持つ文字列のハッシュ作成におけるメモリリークが修正されました。 (Jeff Davis) (15)(14)(13)(12)
  59. DROP DATABASE と論理レプリケーションワーカプロセスと間のデッドロックが修正されました。 (Hou Zhijie) (15)(14)
  60. これは、ワーカで論理レプリケーションスロットを作成する際に、割り込みをブロックするという不用意な選択によって引き起こされていました。

    バージョン15 では検出されないデッドロックをもたらす可能性がありました。バージョン14 ではデッドロックは観測されていませんが、ネットワークI/O を待っている間に割り込みをブロックすることは、やはり望ましくありません。

  61. レプリケーション接続の試行に失敗した後に、libpq の接続オブジェクトをクリーンアップするようになりました。 (Andres Freund) (15)(14)(13)(12)(11)
  62. 以前のコードでは接続オブジェクトをリークしていました。 バックグラウンドのコードパスでは呼び出し元のプロセスが終了してしまうので無害です。 しかし、CREATE SUBSCRIPTION のようなコマンドでは、このような失敗により、セッション内での小さなメモリリークが発生していました。

  63. ホットスタンバイサーバで、プライマリ上でアクティブと知られている XID を調べる処理負荷が軽減されました。 (Simon Riggs, Michail Nikolaev) (15)(14)(13)(12)(11)
  64. KnownAssignedXids配列のクリーンアップが不十分な場合、特にスタンバイ側で max_connections が大きな値に設定されている場合、性能が低下する可能性がありました。

  65. カタログの最も古い xmin を決定する際に、無効な論理レプリケーションスロットを無視するようになりました。 (Sirisha Chamarthi) (15)(14)(13)
  66. レプリケーションスロットは、max_slot_wal_keep_size を超過して無効となった後も、システムカタログ内のデッドタプルのクリーンアップを妨げることができました。そのため、レプリケーションの消費者に障害が発生すると、カタログが際限なく肥大化する可能性がありました。

  67. 論理デコーディングで、トランザクションのクラッシュが検出されたときにリモートノードに通知するようになりました。 (Hou Zhijie) (15)(14)
  68. サーバ再起動の後、再起動の直前に発生したトランザクションの変更を再ストリームします。 これらのトランザクションのいくつかは、完了しませんでした。理由は、1つのトランザクションが完了しなかったことに気づいたとき、関連するデコーディング状態をそのサーバでは捨てますが、それについてサブスクライバに伝えていなかったからです。そのため、サブスクライバは、次に再起動するまで、無駄なストリーミングファイルを保持することになっていました。

  69. 論理デコーディングにおける未初期化メモリの使用が修正されました。 (Masahiko Sawada) (15)(14)(13)(12)(11)
  70. いくつかのケースで論理デコードの再開時に解放済の XID データの再利用を試み、予測不可能な動作を引き起こすことがありました。

  71. 論理デコーディングのコンテキスト作成に際して共有状態を更新している間、スピンロックを取得するようになりました。 (Masahiko Sawada) (15)
  72. 2フェーズトランザクションに関するデータを更新する際に、適切なロックを取得していなかったため、他プロセスから不整合データを見られる可能性がありました。

  73. pgoutput レプリケーションプラグインが、テーブルレプリケーションの列一覧に列挙されていない列を送信しないよう修正されました。 (Hou Zhijie) (15)
  74. UPDATE と DELETE のイベントは設定された列一覧に注意を払わないため、予想以上に多くのデータを送信していました。 この問題はレシーバが組み込みの論理レプリケーションコードである場合は発生しませんが、他のレシーバを混乱させる可能性があり、いずれにしてもネットワーク帯域幅を無駄にするものでした。

  75. ハッシュインデックスのページ分割操作の WALリプレイ時に稀に発生する「PANIC: failed to acquire cleanup lock」を回避するようになりました。 (Robert Haas) (15)(14)(13)(12)(11)
  76. WALリプレイ中にその全可視ビットを設定する際に、ヒープページの LSN が前進するようになりました。 (Jeff Davis) (15)(14)(13)(12)(11)
  77. これを行わなかった場合、スタンバイサーバとプライマリサーバでページが異なる可能性があり、LSN が変更されるタイミングに関する他のいくつかの想定に反しました。 PostgreSQL自体に関する限り、これは理論的な危険性だけであるように思えますが、サードパーティツールを混乱させる可能性がありました。

  78. int64_div_fast_to_numeric() がより広い範囲の入力に対して動作するように修正されました。 (Dean Rasheed) (15)(14)
  79. この関数はその第2引数における一部の値で誤動作していました。 PostgreSQL本体ではそのような使用法は存在していませんが、外部モジュールでは明らかに危険でしたので、修正されました。

  80. WaitEventSetロジックにおける潜在的なバッファオーバーランの問題が修正されました。 (Thomas Munro) (15)(14)(13)(12)(11)
  81. epollベースおよび kqueueベースでの実装は、その内部バッファのサイズが呼び出し元の出力バッファのサイズと異なる場合、カーネルにあまりにも多くのイベントを要求する可能性がありました。

    このケースはリリース済みの PostgreSQL のバージョンでは発生しないことが知られていますが、この誤りは外部モジュールや将来のバグ修正にとって有害です。

  82. 32-bitビルドで共有メモリにアクセスする際に、名目上未定義の挙動を回避するようになりました。 (Andres Freund) (15)(14)(13)(12)(11)
  83. clang の未定義動作サニタイザは、アラインメントが取れていないポインタの使用についてエラーを出します。これが非デバッグビルドで問題を起こす可能性は非常に低いですが、テストのために修正する価値があると判断されました。

  84. BRIN minmax-multi 演算子クラスのアサート失敗が修正されました。 (Tomas Vondra) (15)(14)
  85. このアサートは過度に厳密でした。アサート無しビルドでは無害です。

  86. 不要な RESULT RTE 最適化ロジックでの不完全なアサートが削除されました。 (Tom Lane) (15)(14)(13)(12)
  87. 問い合わせ実行で予期せぬアサート失敗が報告されました。

  88. ACLチェックに対する「ERROR: cache lookup failed ..」エラーメッセージのコピーアンドペースト誤りが修正されました。 (Justin Pryzby) (15)(14)(13)(12)(11)
  89. 原理的には、このエラーに到達することはありませんが、それらのいくつかは間違ったタイプのオブジェクトを報告していました(cache lookup failed for schema とすべきところがcache lookup failed for function となる等)。

  90. pg_basebackup で多数のテーブルスペース対応付けを指定した場合に、壊れたテーブル空間マップ(tablespace_map)ファイルを生成する可能性があり、修正されました。 (Antonin Houska) (15)
  91. pg_dump で --if-exists オプションを使用したときに、無害な警告が出ないようになりました。 (Tom Lane) (15)
  92. これまで publicスキーマにデフォルト(pg_database_owner)以外の所有者がいる場合、pg_dump で --if-exists オプションを使用すると、ダンプ出力自体には問題はありませんが、以下のような警告メッセージが表示されていました。

    pg_dump: 警告: 文"-- *not* dropping schema, since initdb creates it
    "中に IF EXISTS を挿入すべき場所が見つかりませんでした
    
    pg_dump: warning: could not find where to insert IF EXISTS in statement "--
    *not* dropping schema, since initdb creates it
    "
    
  93. psqlメタコマンドの \sf と \ef がSQL標準の関数本体を持つ SQL言語関数を処理できるように修正されました。 (Tom Lane) (15)(14)
  94. これらのコマンドは、SQL標準の構文を使用したときに関数本体の開始を誤認していました。

    SQL標準の関数本体とは、文字列定数ではなく単一の RETURN 文やBEGIN ATOMIC ~ END のブロックで記述したものを指します。

  95. psql で ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA のタブ補完が修正されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
  96. contrib/pageinspectモジュールが更新され、そのディスクアクセス機能を「PARALLEL RESTRICTED(パラレル制限)」としてマークするようになりました。 (Tom Lane) (15)
  97. セッションの一時テーブルは並列ワーカからアクセスできないため、これらの関数のいずれかを使用して一時テーブルを調べる場合に、パラレル実行で結果が取得できない可能性がありました。

  98. contrib/segモジュールで seg型の値として入力した数が 127桁を超える場合に、クラッシュしたり、ごみデータを出力したりすることがあり、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  99. Microsoft Visual Studio 2013 でのビルドが修正されました。 (Tom Lane) (15)(14)(13)(12)
  100. 以前のパッチでは、対象のすべてのプラットフォームで snprintf() に対応していると想定されていましたが、MSVC 2013 ではまだ完全に対応されていません。MSVC 2013 では sprintf() を使用するように戻されました。

  101. Strawberry Perl 5.30. 以上を使用して、MSVC で PL/Perl をビルドする際のコンパイルエラーが修正されました。 (Andrew Dunstan) (15)(14)(13)(12)(11)
  102. MSVC でビルドされた PL/Perl と gcc でビルドされた Perlライブラリの不一致が修正されました。 (Andrew Dunstan) (15)(14)(13)(12)(11)
  103. このような組み合わせで、以前は「loadable library and perl binaries are mismatched」というエラーでPL/Perl のロードに失敗することがありました。

  104. Perl のヘッダファイルからのコンパイラ警告が抑制されました。 (Andres Freund) (15)(14)(13)(12)(11)
  105. 推奨しているコンパイラオプションは、Perl のヘッダファイルの最近のバージョンで構造についての警告を引き起こします。 gcc を使用する場合、プラグマを使用してこれらの警告を抑制することができます。

  106. pg_waldump が未使用の静的インライン関数を破棄しないコンパイラでビルドされるように、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
  107. タイムゾーンデータファイルが tzdata release 2022g に更新されました。グリーンランドとメキシコの夏時間法の変更に加え、カナダ北部、コロンビア、およびシンガポールの歴史的修正が適用されました。 (15)(14)(13)(12)(11)
  108. 注目すべき点としては、新しいタイムゾーン America/Ciudad_Juarez が America/Ojinaga から分割されました。

  109. リレーションキャッシュエントリの rd_smgrポインタの安全でない使用を防ぐようになりました。 (Amul Sul) (14)(13)(12)(11)
  110. rd_smgr は PostgreSQL内部実装における RelationData構造体のメンバ変数です。

    必要に応じて再計算する関数で rd_smgr のすべての使用をラップすることにより、一連の操作で rd_smgr が有効であり続けるというさまざまな仮定を取り除きます。これにより、一連の処理の途中で予期しないキャッシュフラッシュが発生した場合に発生するバグが防止されました。

  111. pg_dump で、検査対象のテーブルをロックする前に安全でないサーバ関数を呼び出さないようになりました。 (Tom Lane, Gilles Darold) (14)(13)(12)(11)
  112. pg_dump は、調べているテーブルが同時に削除されると失敗する可能性のあるいくつかのサーバ関数を使用します。テーブルのプロパティを深く調べる前にアクセス共有ロックを取得し、ダンプするつもりのないテーブルにそのような関数を適用しないようにすることで、この種の失敗が回避されました。

  113. VACUUM実行の最後での「ERROR: wrong tuple length」の発生が防止されました。 (Ashwin Agrawal, Junfeng Yang) (13)(12)
  114. これは、VACUUM が現在のデータベースの datfrozenxid値を更新する必要があり、datacl値が行外に押し出されるほどデータベースに大量の権限付与がある場合に、発生していました。

  115. contrib/sepgsqlモジュールで、最近の libselinuxのバージョンでビルド時に出力されていた非推奨の警告が出ないように修正されました。 (Michael Paquier) (13)(12)(11)
  116. contrib/postgres_fdwモジュールの誤ったアサートが修正されました。 (Etsuro Fujita) (12)
  117. 正常な外部テーブルへの問い合わせでアサート失敗することがありました。

15.1、14.6、13.9、12.13、11.18、10.23 (2022年11月10日リリース)の変更点

  1. 大きなテーブルの最初以外のセグメントを削除できない問題が修正されました。 (Tom Lane) (15)
  2. PostgreSQL は大きなテーブルを複数のファイル(通常 1ファイルあたり 1GB のファイル)に分割します。 テーブルを削除するロジックが壊れており、一時テーブルの削除と、通常テーブルを削除する WAL の再生の 2つのケースで、そのようなファイルの最初のファイル以外を削除しそこなうことがありました。 数ギガバイトの一時テーブルを日常的に作成するアプリケーションは、重大なディスク領域のリークを被る可能性がありました。

    孤立した一時テーブルファイルは postmaster の起動時に削除されるため、15.1 に更新するだけで、一時テーブルのストレージのリークが解消されます。しかし、15.0 を使用中にデータベースがクラッシュし、その直前に大きなテーブルが削除された可能性がある場合、データベースディレクトリに「NNNN.NN」というパターンに従った名前のファイルがないか確認することが推奨されます。「NNNN」(「.NN」サフィックスなし)という名前の一致するファイルがない場合、これらのファイルは手動で削除する必要があります。

  3. 更新可能ビューへの INSERT で、複数行 VALUES句にある DEFAULTトークンの処理が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)(10)
  4. この障害により、「ERROR: cache lookup failed for type ..」エラーが発生したり、古いブランチではクラッシュの原因になることもありました。

    (障害発生例)
    db=# CREATE TABLE t2 (a int, b text);
    db=# CREATE TABLE t2_hist (ts timestamptz DEFAULT now(), a int, b text);
    db=# CREATE VIEW v2 AS SELECT * FROM t2;
    db=# CREATE RULE r_t2_log AS ON INSERT TO v2
           DO ALSO INSERT INTO t2_hist (a,b) VALUES (NEW.a, NEW.b);
    db=# INSERT INTO v2 VALUES (1, DEFAULT), (10, DEFAULT);
    ERROR:  cache lookup failed for type 0
    
  5. 「ON SELECT」でない「_RETURN」という名前のルールが禁止されました。 (Tom Lane) (15)(14)(13)(12)(11)(10)
  6. これにより、ビューの「ON SELECT」ルールと他のルールとの間の混乱が回避されます。

  7. 定数初期値で「SEARCH BREADTH FIRST」を使用する問い合わせがEXPLAIN VERBOSE でエラーを出さないようになりました。 (Tom Lane) (15)(14)
  8. (問い合わせ自体は実行できる)
    db=# WITH RECURSIVE cte4 AS (
           SELECT 1 AS x UNION ALL SELECT x + 1 FROM cte4
         ) SEARCH BREADTH FIRST BY x SET y
         SELECT * FROM cte4 LIMIT 3;
     x |   y
    ---+-------
     1 | (0,1)
     2 | (1,2)
     3 | (2,3)
    (3 rows)
    
    (explain verbose を付けるとエラーになる)
    db=# explain (verbose) WITH RECURSIVE cte4 AS (
           SELECT 1 AS x UNION ALL SELECT x + 1 FROM cte4
         ) SEARCH BREADTH FIRST BY x SET y
         SELECT * FROM cte4 LIMIT 3;
    ERROR:  record type has not been registered
    
  9. 外部テーブルパーティションを含むパーティションテーブルでMERGE の使用が禁止されました。 (Álvaro Herrera) (15)
  10. MERGE で外部テーブルを直接ターゲットにすることは既に禁止されていましたが、このケースはサポートされておらず、理解できないエラーが発生していました。

    「ERROR: unexpected operation: ...」のようなエラーが出ることが報告されました。修正により「ERROR: cannot execute MERGE on relation ...」が出るようになります。

  11. ALTER TABLE ATTACH PARTITION 実行中に行われるパーティションごとの外部キー制約の構築が修正されました。 (Jehan-Guillaume de Rorthais, Álvaro Herrera) (15)(14)(13)(12)
  12. 以前は、新しく追加されたパーティションに対して、不正確または重複した制約が作成されることがありました。

  13. パーティションテーブルまたは継承されたテーブルの拡張統計を参照する際のプランナエラー発生が修正されました。 (Richard Guo, Justin Pryzby) (15)
  14. 問い合わせ実行に対して「ERROR: cache lookup failed for statistics object」というエラーが発生する場合がありました。

  15. GINインデックスの高速挿入パスでの WAL操作の順序の誤りが修正されました。 (Matthias van de Meent, Zhang Mingli) (15)(14)(13)(12)(11)(10)
  16. この間違いは、PostgreSQLのコア部分で悪影響を与えることは知られていませんが、一部の拡張機能で問題が発生していました。

  17. トランザクションの開始とそのサブトランザクションの開始の間からリプレイが開始される場合の、論理デコードのバグが修正されました。 (Masahiko Sawada, Kuroda Hayato) (15)(14)(13)(12)(11)(10)
  18. これらのエラーは、デバッグビルドでのアサート失敗や、メモリリークを引き起こす可能性がありました。

  19. 論理デコード中に、より多くの場所で割り込みを受け付けるようになりました。 (Amit Kapila, Masahiko Sawada) (15)(14)(13)(12)(11)(10)
  20. これにより、レプリケーションワーカのシャットダウンが遅いという問題が改善されます。

  21. レプリケーションワーカで外部テーブルのパーティションにデータ同期を試みる動作が防止されました。 (Shi Yu, Tom Lane) (15)(14)(13)
  22. パーティションテーブルは外部テーブルをパーティションとすることができますが、そのようなパーティションへの論理レプリケーションは今のところサポートされていません。実行しようとすると論理レプリケーションワーカのプロセスはこれまでクラッシュしていましたが、エラーを出すようになりました。

  23. レプリケーションワーカでの関数構文エラー後のクラッシュを回避するようになりました。 (Maxim Orlov, Anton Melnikov, Masahiko Sawada, Tom Lane) (15)(14)(13)(12)(11)(10)
  24. 論理レプリケーションワーカで実行された SQL言語または PL/pgSQL言語のCREATE FUNCTION または DO コマンドで構文エラーが発生した場合、ワーカプロセスは nullポインターの逆参照またはアサート失敗でクラッシュしていました。

    サブスクリプション側にそのようなトリガを定義した場合に現象が報告されました。

  25. アーカイバモジュールのシャットダウンコールバックの二重呼び出しを回避するようになりました。 (Nathan Bossart, Bharath Rupireddy) (15)
  26. テーブルアクセスメソッドを持たないテーブルへのアクセスに対して、プラン作成時の検査が追加されました。 (Tom Lane) (15)(14)(13)(12)
  27. これにより、例えば「ON SELECT」ルールが欠落しているビューの使用など、一部のカタログ破損シナリオにおけるクラッシュが防止されます。そのような場合には「ERROR: cannot open relation ...」が出るようになりました。

  28. 共有メモリ状態が破損しているときの postmaster のクラッシュが防止されました。 (Tom Lane) (15)(14)(13)(12)(11)(10)
  29. postmasterプロセスは、共有メモリが破損した場合にも存続し、データベースの再起動を行うはずですが、コードのある 1箇所で対応が不十分でした。

  30. libpq がパイプラインモードのときに単一行モードを正しく処理するように修正されました。 (Denis Laxalde) (15)(14)
  31. パイプラインモードも有効である場合、単一行フラグが正しいタイミングでリセットされませんでした。

  32. コマンドラインクエリがキャンセルされた時の psql の終了ステータスが修正されました。 (Peter Eisentraut) (15)
  33. クエリがキャンセルされた場合、「psql -c query」は正常終了していました。他のエラーの場合と同様に、ゼロ以外のステータスで終了するようになりました。

  34. pg_basebackup でクロスプラットフォームのテーブルスペースの再配置を許可するようになりました。 (Robert Haas) (15)(14)(13)(12)(11)(10)
  35. --tablespace-mapping のリモートパスを Unixスタイルまたは Windowsスタイルの絶対パスにすることができるようになりました。これは、ソースサーバがローカルシステムとは異なる OS 上にある可能性があるためです。

  36. 一部の CHECK制約に付加されたコメントを pg_dump がダンプできない問題が修正されました。 (Tom Lane) (15)
  37. CREATE DATABASE で oidパラメータが 2^31 を超えることができるように修正されました。 (Tom Lane) (15)
  38. このパラメータの最大値を見落としにより、ソースインストールにそれより大きい OID を持つデータベースが含まれている場合、pg_upgrade が成功しませんでした。

  39. pg_stat_statements で既に解放されたメモリへのアクセスが修正されました。 (zhaoqigui) (15)(14)(13)(12)(11)(10)
  40. これは、拡張問い合わせプロトコルで発行された ROLLBACK コマンドをトラックしている時に発生します。デバッグビルドでは、これによりアサート失敗が発生しました。製品ビルドでは、目立った問題は発生しません。しかし、解放されたメモリが既に再利用されていた場合、クエリ文字列にゴミデータが格納される結果になると考えられます。

  41. LLVM 15 との非互換性が修正されました。 (Thomas Munro, Andres Freund) (15)(14)(13)(12)(11)
  42. どのようなマシンであってもスピンロックのために__sync_lock_test_and_set() が使えるようになりました。 (Tom Lane) (15)(14)(13)(12)(11)(10)
  43. この GCC ビルトイン関数をサポートしているコンパイラを使っていさえすれば、新しいマシンアーキテクチャへポーティングが簡単になります。

  44. 最近の macOS で起きるコンパイル障害を避けるために、シンボル「REF」が「REF_P」にリネームされました。 (Tom Lane) (15)(14)(13)(12)(11)(10)
  45. コンパイル時の非推奨の警告を避けるため、sprintf が使われなくなりました。 (Tom Lane) (15)(14)(13)(12)
  46. タイムゾーンデータファイルが tzdata release 2022f に更新されました。チリ、フィジー、イラン、ヨルダン、メキシコ、パレスチナ、シリアの夏時間法が変更と、チリ、クリミア、イラン、メキシコの歴史的な修正が含まれます。 (15)(14)(13)(12)(11)(10)
  47. また、Europe/Kiev ゾーンは Europe/Kyiv にリネームされました。さらに、以下のゾーンは 1970年以来承認されている時計のある人口の多い近傍のゾーンに併合されました:

    Antarctica/Vostok、Asia/Brunei、Asia/Kuala_Lumpur、Atlantic/Reykjavik、
    Europe/Amsterdam、Europe/Copenhagen、Europe/Luxembourg、Europe/Monaco、
    Europe/Oslo、Europe/Stockholm、
    Indian/Christmas、Indian/Cocos、Indian/Kerguelen、Indian/Mahe、Indian/Reunion、
    Pacific/Chuuk、Pacific/Funafuti、Pacific/Majuro、Pacific/Pohnpei、
    Pacific/Wake、Pacific/Wallis
    

    (これは Arctic/Longyearbyen、Atlantic/Jan_Mayen、Iceland、Pacific/Ponape、Pacific/Truk、Pacific/Yap のうちの一つに既にリンクされているゾーンにも、間接的に影響します。)1970年以降に主張されたこれらゾーンとの差異が誤りであるようだと判明した後、America/Nipigon、America/Rainy_River、America/Thunder_Bay、Europe/Uzhgorod、Europe/Zaporozhye も近傍のゾーンに併合されました。

    これらの全てのケースでは以前のゾーンの名前は別名として残されています。しかし、実際のデータはマージされたゾーンにあります。これらのゾーン併合は 1970年以前のタイムゾーンの歴史を失うことになります。これは timestamptz 表示の一貫性を期待するアプリケーションには問題となるかもしれません。例えば、保存されている値が「1944-06-01 12:00 UTC」の場合、以前は「1944-06-01 13:00:00+01」と表示されましたが、Europe/Stockholm が選択されている場合は「1944-06-01 14:00:00+02」となります。

    より古いゾーンデータをリストアするオプションを付けたタイムゾーンデータファイルを作ることも可能ですが、この選択はたくさんの他の古い(かつ典型的には証明に乏しい) ゾーンデータを追加してしまうことになります。結果として、この上位変更を受け入れる場合よりも、以前のリリースの全体の変更は多くなってしまいます。

    PostgreSQL は tzdb の移行を推奨してきましたが、知る限りではほとんどの主要なオペレーティングシステムのディストリビューションでも同様のことをやっています。しかしながら、もしこれらの変更があなたのアプリケーションに重要な問題を起こすならば、可能性のある解決方法は tzdb の後方互換オプションを使ってタイムゾーンデータファイルをローカルにビルドしてインストールする方法です(PACKRATDATAオプションと PACKRATLISTオプションを見てください)。

  48. VACUUM と並行に実行される更新で稀に起きていた PANIC が回避されました。 (Tom Lane, Jeff Davis) (14)(13)(12)
  49. 並行する VACUUM が UPDATE または DELETE で更新中のページの全ての可視フラグビットをセットするなら、その更新コマンドはそのビットをもう一度クリアする必要があります。しかし、いくつかのコードパスはそれに失敗し、PANIC で終了していました。

    これはバージョン 14 と 15 で起きる可能性があることが知られています。それより前のブランチでは顕在化しないかもしれません。

  50. AFTERトリガに対してタプルを保存する際の資源管理のバグが修正されました。 (Tom Lane) (14)(13)(12)
  51. 正常な状態において「ERROR: tupdesc reference ... is not owned by resource owner ...」というエラーが出た後、「PANIC: ERRORDATA_STACK_SIZE exceeded」によるサービス全体の停止または再起動が発生しました。

  52. パーティションごとの外部キー制約に対する制約名の生成が修正されました。 (Jehan-Guillaume de Rorthais) (14)(13)(12)
  53. 最初に与えられた名前がそのパーティションの何らかの制約として既に使われていたら、新しい制約名が選ばれますが、意図した名前になっていませんでした。誤って「リレーション名__fkey」という制約名が生じていました。

  54. パーティションインデックスを作るときの、インデックスの式と述語の誤った照合が修正されました。 (Richard Guo, Tom Lane) (14)(13)(12)(11)
  55. パーティションテーブルにインデックスを作るときに、定義が一致する各パーティション上の既存インデックスを識別して、それを子インデックスとして取り込みしようとします。このとき、式の照合が正しく行われず、パーティション上の利用可能な既存インデックスが無視されて、重複したインデックスが作成されることがありました。

  56. スタンバイ昇格後の WAL破損を防止するようになりました。 (Dilip Kumar, Robert Haas) (14)(13)(12)(11)(10)
  57. アーカイブリカバリ中の(スタンバイモードではない)PostgreSQLインスタンスが昇格するときに、最後に読み込もうとした WALセグメントが部分レコードで終わっていた場合、新しいタイムライン上に無効な WAL セグメントを書き込んでいました。

  58. 論理デコード中に、間違ったスナップショットでシステムカタログを検査することを防止するようになりました。 (Masahiko Sawada) (14)(13)(12)(11)(10)
  59. システムカタログを変更するトランザクションの途中でデコードが開始されると、デコーダがそれを認識できないことがあり、その結果、カタログ検索でそのトランザクションが進行中として扱われませんでした。

  60. パーティションテーブルのレプリカアイデンティティ設定についての無意味なチェックが除去されました。 (Hou Zhijie) (14)(13)
  61. 重要なのはリーフパーティションのレプリカアイデンティティの設定であり、それが親テーブルに設定されていない場合にエラーを投げる必要はありません。

  62. SQL関数に渡される読み書き可能な拡張データムの取り扱いを修正しました。 (Tom Lane) (14)(13)(12)(11)(10)
  63. インライン化されていない SQL関数が 2つ以上の場所で引数を使用し、そのうちの 1箇所で読み書き可能なデータムを上書きで変更できると期待した場合、後でそのパラメータを使用した時に間違った値が観測されました。

    配列を引数に取る再帰的な SQL関数の実行で、誤った問い合わせ結果が生じるケースが報告されました。PostgreSQL本体内では拡張データム機構は、配列と複合型の値に対してのみ使用されています。

  64. circle型の等価比較で NaN を適切に処理するように修正されました。 (Ranier Vilela) (14)(13)(12)
  65. 左側の円の半径が浮動小数点数の NaN であった場合、中心座標が同じで任意の半径を持つ円と等しいと見なされるようになりました。

  66. Snowball辞書で過度に長い単語を語幹処理しないようになりました。 (Olly Betts, Tom Lane) (14)(13)(12)(11)(10)
  67. 入力単語が 1000バイトを超える場合、Snowballコードを通すのではなく、大文字小文字を揃えた後、そのまま返すようになりました。

    この制限は、トルコ語の語幹機能における recursion-to-stack-overflow への既知問題から保護し、Snowballの語幹機能におけるその他の安全性や性能の問題に対する良い保険になると考えられます。

  68. 文字列比較における解放後メモリアクセスが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  69. 文字列比較関数の不適切なメモリ管理により、もはや割り当てられていないバッファに書き込みが生じて、そのメモリを現在使用している何かが壊れる可能性がありました。

    これは、かなり長い文字列(1kB以上)で ICU照合順序が使用されている場合にのみ、発生しました。

  70. スタックオーバーランに至るまでの再帰に対するさらなる防御(検査コード)が追加されました。 (Richard Guo, Tom Lane) (14)(13)(12)(11)(10)
  71. 巨大な SQL文で「ERROR: stack depth limit exceeded」のエラーを出さずに、バックエンドプロセスがクラッシュする動作が報告されていました。

  72. 非常に小さな work_mem と大きなタプル(1行が大きい)の組み合わせでハッシュテーブルのサイズを選択するときの、誤動作を回避するようになりました。 (Zhang Mingli) (14)(13)
  73. autovacuum launcherプロセスでメモリリークを回避するようになりました。 (Reid Thompson) (14)(13)(12)(11)(10)
  74. 以前からのバグであるにもかかわらず現場からの報告がないことから、この問題はバージョン15 より前のブランチでは顕在化しないと思われますが、確かではないため、各バージョン系列にバックパッチが行われました。

  75. PL/pgSQL が RECORD として宣言されたパラメータを処理する能力が改善されました。 (Tom Lane) (14)(13)(12)(11)
  76. 多相パラメータに対して行うのと同じように、セッション中に RECORDパラメータに渡される各具象型に対して、個別の関数キャッシュ項目を構築するようになりました。これにより、以前は「ERROR: type of parameter ... does not match that when preparing the plan」などのエラーで失敗していたいくつかの使用法が動作するようになりました。

  77. libpq内の NULL のコネクションポインタに対する欠落していた検査が追加されました。 (Daniele Varrazzo, Tom Lane) (14)(13)(12)(11)(10)
  78. libpq の関数は、NULL の PGconn 引数を検査して、クラッシュする代わりにエラーを出す、という慣習があります。PQflush() と PQisnonblocking() でこれが守られていなかったため修正されました。

  79. ecpgで、複数の varchar または bytea 変数が同じ宣言内で宣言されている時の変数ストレージクラスの省略を修正しました。 (Andrey Sokolov) (14)(13)(12)(11)(10)
  80. これまで「static varchar str1[10], str2[20], str3[30];」を以下のように変換していました。

    (不適切な出力例)
    static struct varchar_1  { int len; char arr[ 10 ]; }  str1 ;
           struct varchar_2  { int len; char arr[ 20 ]; }  str2 ;
           struct varchar_3  { int len; char arr[ 30 ]; }  str3 ;
    
  81. postgres_fdwで、EvalPlanQual の実行計画むけに構築されたターゲットリストが、必要なすべての列を持つことになりました。 (Richard Guo, Etsuro Fujita) (14)(13)(12)(11)(10)
  82. これにより「ERROR: variable not found in subplan target list」エラーが防止されます。EvalPlanQual は READ COMMITTED 隔離レベルの問い合わせで使われる処理です。

  83. プラットフォームの uuid_create() 関数からの不要な出力を拒否するようになりました。 (Nazir Bilal Yavuz) (14)(13)(12)(11)(10)
  84. uuid-osspモジュールでは libc の uuid_create() がバージョン1 の UUID を生成すると期待していますが、最近の NetBSD のリリースでは、代わりにバージョン4 の (ランダムな) UUID を生成します。これを検査して、そうであればエラーを出すようになりました。

    ドキュメントの、NetBSD の実装が uuid-ossp に使用可能という記載も削除されました。(バージョン4 の UUID が必要な場合には、uuid-ossp モジュールではなく、本体付属の関数 gen_random_uuid() を使ってください。)

  85. 新しい Perlテストモジュールが標準インストールに含まれるようになりました。 (Álvaro Herrera) (14)(13)(12)(11)(10)
  86. PostgreSQL/Test/Cluster.pm と PostgreSQL/Test/Utils.pm をバージョン15 より前のブランチの標準インストールファイルに追加しました。これは、古いブランチで新しく書かれたテストコードを使いたい拡張のためです。

  87. NetBSD で、postmaster 起動時に動的シンボル解決を強制するようになりました。 (Andres Freund, Tom Lane) (14)(13)(12)(11)(10)
  88. これにより、NetBSD 10 におけるダイナミックリンカでのデッドロックの危険性を回避できるようになりました。

  89. clang 15 以降のコンパイラからの警告が出ないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  90. VACUUM が btreeインデックスでのページ削除でページの親ダウンリンクを見つけるのに失敗した場合でも進行するように修正されました。 (Peter Geoghegan) (13)(12)(11)(10)
  91. エラーを投げるのではなく、むしろ問題を記録し、空のページを削除せずに続行するようになりました。以前は、バグのある演算子クラスまたは破損したインデックスにより、インデックスのバキューム処理がいつまでも完了せず、最終的に XID周回の問題につながっていました。

    以下メッセージが ERROR から LOG に変更されます。「failed to re-find parent key in index ... for deletion target page ...」

  92. 継承された更新で稀に生じる MULTIEXPR_SUBLINK のサブプランのエラーが修正されました。 (Tom Lane) (13)(12)(11)(10)
  93. 構文 UPDATE tab SET (c1, ...) = (SELECT ... ) を継承テーブルやパーティション化された対象テーブルに使用すると、子テーブルが十分に異なっている場合、失敗することがありました。

    これは通常、エグゼキュータでの一貫性チェックの失敗のエラーとして現れます。しかし、クラッシュや不正なデータ更新(すなわち論理的なデータ破損)も起こり得ます。

    本構文の UPDATE に対して、「ERROR: invalid attribute number ...」などの予期せぬエラーの発生が報告されました。

  94. 外側の問い合わせがグループ化セットを持つ場合、FROM のないサブクエリの平坦化を回避するようになりました。 (Tom Lane) (11)(10)
  95. この誤りは、アサート失敗や「ERROR: variable not found in subplan target list」 などのプランナエラーにつながる可能性があります。

14.5、13.8、12.12、11.17、10.22 (2022年8月11日リリース)の変更点

  1. 拡張のスクリプトが、拡張に属していないオブジェクトを置換しないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  2. この変更は、拡張に属さない既存オブジェクトがある場合に、拡張のスクリプトが CREATE OR REPLACE を行うことを防止します。また、同じ状況での CREATE IF NOT EXISTS も防止します。 これにより、敵対的なデータベースユーザが拡張のオブジェクトの所有者になって、それを変更して将来の他ユーザによるオブジェクト使用を危機にさらすという、トロイの木馬型の攻撃を防ぐことができます。 副次的な利点として、意図しないオブジェクトを誤って置換してしまうリスクも軽減されます。(CVE-2022-2625)

  3. スタンバイサーバでの「CREATE DATABASE」WALレコードのリプレイが修正されました。 (Kyotaro Horiguchi, Asim R Praveen, Paul Guo) (14)(13)(12)(11)(10)
  4. スタンバイサーバがデータベース作成の WALレコードをリプレイする時に、テーブルスペースのディレクトリが見つからないことがあります。 本パッチ適用前は、このような場合、スタンバイはリカバリに失敗していましたが、このようなディレクトリが合法的に欠落している可能性がありました。テーブルスペースを(通常のディレクトリとして)作成し、リプレイが一貫した状態に達したら、再び削除されていることを確認する動作に変更されました。

  5. 「構内」テーブルスペースがサポートされました。 (Thomas Munro, Michael Paquier, Álvaro Herrera) (14)(13)(12)(11)(10)
  6. 通常、PostgreSQL のテーブルスペースは、他のファイルシステム上のディレクトリへのシンボリックリンクですが、この変更により、データベースクラスタディレクトリ内の単なるディレクトリにすることができます。

    これはテストには便利な仕組みです。さらに、CREATE DATABASE リプレイの修正(前項の修正)で、欠落しているテーブルスペースを構内テーブルスペースとして一時的に作成するために必要となります。

    設定パラメータ allow_in_place_tablespaces が追加されています。以下のように使用できます。

    (以下を実行すると pg_tblspc 以下にテーブルスペース用ディレクトリが作られる)
    db1=# SET allow_in_place_tablespaces TO on;
    db1=# CREATE TABLESPACE sp1 LOCATION '';
    CREATE TABLESPACE
    
  7. CREATE INDEX における権限チェックが修正されました。 (Nathan Bossart, Noah Misch) (14)(13)(12)(11)(10)
  8. CVE-2022-1552 むけの修正により、CREATE INDEX が演算子クラスやその他のオブジェクトの検索を実行する際に、以前は呼び出しユーザのパーミッションを適用していたところで、テーブル所有者のパーミッションを適用するようになっていました。pg_dump はパーミッションを再度付与する前に CREATE INDEX を発行するため、これによりダンプ/リストアのシナリオが壊れていました。

    本修正で問題を回避するように調整されました。

  9. 拡張問い合わせプロトコルでは、トランザクションブロック内で実行できないCREATE DATABASE 等のコマンド後に、即時コミットを強制するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  10. クライアントがそのようなコマンドの直後に Sync メッセージを送信せず、代わりに別のコマンドを送信した場合、そのコマンドで障害が発生すると、直前のコマンドがロールバックされ、通常ディスク上に矛盾した状態が残りました(欠落しているデータベースディレクトリや余分なデータベースディレクトリなど)。

    そのような状況を防ぐためのメカニズムは、簡易問い合わせメッセージ内の複数コマンドに対しては機能しますが、拡張問い合わせの一連のメッセージに対しては機能しません。現在動作しているユースケースを壊さずに矛盾を防ぐため、そのようなコマンドの後に暗黙のコミットを強制するものとなりました。

  11. トランザクションの可視性をチェックする際の競合状態が修正されました。 (Simon Riggs) (14)(13)(12)(11)(10)
  12. 内部実装関数 TransactionIdIsInProgress(xid) が、対象のトランザクションが可視とみなされる前に「false」を報告し、さまざまな誤動作を引き起こす可能性がありました。競合状態のウィンドウは通常、非常に狭いですが、同期レプリケーションを使用すると同期レプリカの待機がそのウィンドウ内で発生するため、より広くなります。

    代表的な誤動作は以下のエラーが出ることです。

    ERROR:  t_xmin is uncommitted in tuple to be updated
    
  13. 最上位以外に集合を返す関数を含む式でソートした場合の誤った計画が修正されました。 (Richard Guo, Tom Lane) (14)(13)
  14. 以下ような形状の問い合わせについて、予期せぬエラー「ERROR: set-valued function called in context that cannot accept a set」が生じるケースが報告されました。

    SELECT unnest(ARRAY[]::integer[]) + 1 AS pathkey
      FROM ta JOIN tb ON ta.c1 = tb.c1 ORDER BY pathkey
    
  15. 拡張統計情報の誤った権限検査コードが修正されました。 (Richard Guo) (14)
  16. ユーザが不十分な SELECT権限しか持たないテーブルに拡張統計情報がある場合、一部の問い合わせが「ERROR: permission denied ...」ではなく、「ERROR: unrecognized node type」で失敗していました。

  17. ブール値式の MCV(最頻値)型の統計情報を処理するために、拡張統計情報の仕組みが修正されました。 (Tom Lane) (14)
  18. 統計収集は正常に動作しますが、WHERE にその式を含む問い合わせは、プラン作成時に「ERROR: unknown clause type ...」で失敗していました。

    (エラー発生例)
    db=# CREATE TABLE t9 (a int, b int);
    db=# CREATE STATISTICS stat_ex1 ON
           (CASE a WHEN 1 THEN true ELSE false END), b FROM t9;
    db=# INSERT INTO t9 SELECT g % 10, g FROM generate_series(1,10000) g;
    db=# ANALYZE t9;
    db=# SELECT * FROM t9 WHERE (CASE a WHEN 1 THEN true ELSE false END) AND b = 2;
    
    ERROR:  unknown clause type: 134
    
  19. 配列変数に MCV(最頻値)タイプの拡張統計情報がある場合に「constant = ANY(array)」句に対してプランナでクラッシュが生じていて、修正されました。 (Tom Lane) (14)(13)
  20. (障害発生例)
    db=# CREATE TABLE t10 (c int, a int[]);
    db=# CREATE STATISTICS stat_ex10 (mcv) ON c, a FROM t10;
    db=# INSERT INTO t10 SELECT g, ARRAY[g] FROM generate_series(1, 10) g;
    db=# ANALYZE t1
    db=# SELECT * FROM t10 WHERE c = ANY (ARRAY[1,2,3]) AND 1 = ANY(a);
    
    server closed the connection unexpectedly
    
  21. 「ALTER TABLE ... ENABLE/DISABLE TRIGGER」がパーティションテーブル上のトリガの再帰を正しく処理するように修正されました。 (Álvaro Herrera, Amit Langote) (14)(13)(12)(11)
  22. 場合によっては、コマンドがトリガを持たない子パーティションでトリガを調整しようとするため、「ERROR: trigger does not exist」が発生することがありました。

  23. 拡張統計情報の計算中に ANALYZE をキャンセルできるようになりました。 (Tom Lane, Justin Pryzby) (14)
  24. 高コストな統計情報対象を伴うシナリオでは、キャンセルできないソート操作に何秒も費やす可能性がありました。

  25. jsonpath型の構文エラーメッセージが改善されました。 (Andrew Dunstan) (14)(13)(12)
  26. 「ERROR: syntax error, unexpected IDENT_P at or near " " of jsonpath input」のような、パーサ実装のトークン名を伴うメッセージが出ていました。

  27. pg_stop_backup() がセッションの状態を適切にクリーンアップするようになりました。 (Fujii Masao) (14)(13)(12)(11)(10)
  28. これまで省略されていたため、セッションの後半でアサート失敗やクラッシュを引き起こす可能性がありました。

  29. ゼロ次元の配列の引数を適切に処理するように trim_array() が修正されました。 (Martin Kalcher) (14)
  30. 不正メモリアクセスにより、潜在的にクラッシュが生じる可能性がありました。

  31. 「FOR [KEY] UPDATE/SHARE」句における結合エイリアスのマッチングが修正されました。 (Dean Rasheed) (14)(13)(12)(11)(10)
  32. 稀なケースでは、誤解を招くエラーが報告されることがありました。

    「ERROR: FOR UPDATE cannot be applied to a join」とするべきところで、「ERROR: relation "..." in FOR UPDATE clause not found in FROM clause」が出力される動作が報告されました。

  33. 多すぎる列を持つ FROM の中の ROW() 表現と関数を拒絶するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  34. おおよそ 1600列を超えるケースはサポートされておらず、必ず実行に失敗します。しかしながら、32K を超える列を持った問い合わせによって、アサート失敗またはクラッシュが発生する以前のコードが一部ありました。これを避けるために構文解析するときに検査するようになりました。

  35. ビューが作られて複合型の列がドロップされた場合、複合型を返す FROM の中の関数を使っているビューのダンプが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  36. ダンプされたビューはこの関数に対する過剰な列エイリアスを持っているため、ダンプ/リストアや pg_upgrade でのエラーを引き起こしました。

    (障害動作例)
    db=# CREATE TYPE typ18 AS (c1 int, c2 int, c3 int);
    db=# CREATE VIEW v18 AS SELECT * FROM fn18();
    db=# ALTER TYPE typ18 DROP ATTRIBUTE c2;
    db=# SELECT pg_get_viewdef('v18', true); -- ダンプ時の出力を確認
              pg_get_viewdef
    ----------------------------------
      SELECT fn18.c1,                +
         fn18.c2,                    +
         fn18.c3                     +
        FROM fn18() fn18(c1, c2, c3);
    (1 row)
    db=# SELECT fn18.c1, fn18.c2, fn18.c3 FROM fn18() fn18(c1, c2, c3);
    ERROR:  table "fn18" has 2 columns available but 3 columns specified
    
  37. 論理レプリケーションの walsender で、同セッション内からの入れ子のベースバックアップ取得処理を禁止するようになりました。 (Fujii Masao) (14)(13)(12)(11)(10)
  38. クラッシュやアサート失敗を起こす可能性がありました。

  39. 論理レプリケーションのサブスクライバのメモリリークが修正されました。 (Hou Zhijie) (14)(13)(12)(11)(10)
  40. ターゲットテーブルがパーテション化されている場合、論理レプリケーションのレプリカアイデンティティ(REPLICA IDENTITY)の検査が修正されました。 (Shi Yu, Hou Zhijie) (14)(13)
  41. 子パーティションについてのレプリカアイデンティティ列の検査が抜け落ちていました。

    サブスクライバ側でアサート失敗を引き起こす動作が報告されました。

  42. 論理レプリケーションにおいてパブリッシャのスキーマを変更した後にサブスクライバでキャッシュされたスキーマデータの更新に失敗していて、これが修正されました。 (Shi Yu, Hou Zhijie) (14)(13)
  43. 「BRIN_EVACUATE_PAGE」フラグを正しく処理するように、WAL一貫性の検査ロジックが修正されました。 (Haiyang Wang) (14)(13)(12)(11)(10)
  44. 共有ハッシュテーブル管理における誤ったアサート検査が修正されました。 (Thomas Munro) (14)(13)(12)(11)
  45. min_dynamic_shared_memory がデフォルトでない値にセットされた時に起きるアサート失敗が回避されました。 (Thomas Munro) (14)
  46. SPI_commit() のなかでコミット時のエラーが起きた時、呼び出し元がクリーンアップしてくれることを期待せずに自動で行うようになりました。 (Peter Eisentraut, Tom Lane) (14)(13)(12)(11)
  47. 適切なクリーンアップには複雑で低レベルな機能を必要とします。従って、どの既知の呼び出し元もクリーンアップしないことがあり得ます。このために、手続き言語が COMMIT を発行したが(例えば遅延制約検査などで)エラーが起きてしまった場合に誤動作を招きます。

    これを改善するために SPI_commit() を次のように再定義しました。即ち、前トランザクションの特性を保存せずに新しいデフォルトトランザクションの特性を取ること以外は、SPI_commit_and_chain() と等価な新しいトランザクションを開始するものとしました。この変更を透過的にするため、SPI_start_transaction() を no-op(何もしない動作)に再定義しました。全ての SPI_commit() の既知の呼び出し元は直後に SPI_start_transaction() を呼びます。これにより全ての呼び出し元は本変更の影響を受けません。同じ変更は SPI_rollback() にも行われています。

    PL/Python の修正も行われました。PL/Python では、このようなエラー処理が完全に省略されていて、Python 3.11 ではクラッシュすると報告されており、古いバージョンでは何も問題ないように見えますがメモリリークが起きます。

  48. パイプラインモードでの libpq のアイドル状態の処理が改善されました。 (Álvaro Herrera, Kyotaro Horiguchi) (14)
  49. 時々「WARNING: message type 0x33 arrived from server while idle」が出る動作が報告されていました。また、PQgetResult() から問い合わせの最後の NULL の結果が失われる可能性がありました。

  50. ecpglib で予想外の順序の操作でのクラッシュが回避されました。 (Tom Lane) (14)(13)(12)(11)(10)
  51. EXEC SQL PREPARE などの特定の操作をデータベース接続を確立する前に呼び出すと、エラーを報告するのではなくクラッシュしました。

  52. ecpglib で冗長な newlocale() 呼び出しが回避されました。 (Noah Misch) (14)(13)(12)(11)(10)
  53. クエリごとにロケールオブジェクトを作成して解放するのではなく、最初の接続時にプロセスごとに C ロケールオブジェクトを割り当てるように修正されました。これにより、AIX における libc の メモリリークが軽減され、また、どのプラットフォームでも性能向上が見込まれます。

  54. psql の \watch コマンドで、Ctrl-C でキャンセルした後に改行をエコーするようになりました。 (Pavel Stehule) (14)(13)(12)(11)(10)
  55. これにより、libedit (およびおそらく libreadline) でカーソルがどの列にあるかについて混乱するのを防ぎます。

    (動作例)
    db=# SELECT 1;
     ?column?
    ----------
            1
    (1 row)
    
    db=# \watch
    2022年08月16日 07時53分10秒 (every 2s)
    
     ?column?
    ----------
            1
    (1 row)
    
    (修正前の動作)
    ^Cdb=#
    
    (修正後の動作)
    ^C
    db=#
    
  56. pg_upgrade がアップグレード不可能な anyarray を取る関数を検出するように修正されました。 (Justin Pryzby) (14)
  57. バージョン 14 では、いくつかの組み込み関数が、anyarray ではなく anycompatiblearray 型を取るように変更されました。これはほとんど透過的ですが、これらの関数の上に構築されたユーザ定義の集約関数と演算子は、正確に一致する型で宣言する必要があります。古いシグネチャを参照するオブジェクトが存在すると、pg_upgrade が失敗する原因となるため、アップグレードを開始する前に、そのようなケースを検出して報告するように変更されました。

    (修正後の動作)
    $ pg_upgrade -b /usr/local/pgsql-13.8/bin -B /usr/local/pgsql-14.5/bin \
        -d /usr/local/pgsql-13.8/data -D /usr/local/pgsql-14.5/data
    Performing Consistency Checks
    -----------------------------
    Checking cluster versions                                   ok
    Checking database user is the install user                  ok
    Checking database connection settings                       ok
    Checking for prepared transactions                          ok
    Checking for system-defined composite types in user tables  ok
    Checking for reg* data types in user tables                 ok
    Checking for contrib/isn with bigint-passing mismatch       ok
    Checking for user-defined encoding conversions              ok
    Checking for user-defined postfix operators                 ok
    Checking for incompatible polymorphic functions             fatal
    
    Your installation contains user-defined objects that refer to internal
    polymorphic functions with arguments of type "anyarray" or "anyelement".
    These user-defined objects must be dropped before upgrading and restored
    afterwards, changing them to refer to the new corresponding functions with
    arguments of type "anycompatiblearray" and "anycompatible".
    A list of the problematic objects is in the file:
        incompatible_polymorphics.txt
    
    Failure, exiting
    $ cat incompatible_polymorphics.txt
    In database: postgres
      aggregate: public.array_accum(anyelement)
    
  58. pg_upgrade で --clone オプションを使用した場合に、clone() が失敗した後に誤った(OSからの)エラーメッセージが報告される可能性があり、修正されました。 (Justin Pryzby) (14)(13)(12)
  59. contrib/pg_stat_statements が 32 ビットプラットフォームでの巨大な(数ギガバイトの)問い合わせ文字列ファイルでの整数オーバフローを回避するように修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  60. これに伴って、pg_stat_statements.max の最大値が 2147483647 から 1073741823 に変更されました。

  61. contrib/postgres_fdw で「WITH CHECK OPTION」制約がある場合に一括挿入を防止するようになりました。 (Etsuro Fujita) (14)
  62. 外部テーブルのビューが WITH CHECK OPTION 制約を持つ場合、リモートで挿入されるデータを取得し、制約をチェックしますが、一度に複数の行が挿入されると、最初の 1行しかリモートのデータを取得できず、残りの行はローカルのデータで制約をチェックしていました。そのため、リモートのテーブルが行単位 BEFORE INSERT トリガをもち、リモートでデータが変更される場合、制約を適切にチェックできませんでした。

    db=# CREATE SERVER loopback
           FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbname 'db');
    db=# CREATE USER MAPPING FOR CURRENT_USER SERVER loopback;
    db=# CREATE FUNCTION row_before_insupd_trigfunc()
           RETURNS trigger LANGUAGE plpgsql AS $$
             BEGIN NEW.a := NEW.a + 10; RETURN NEW; END; $$;
    db=# CREATE TABLE base_tbl (a int, b int);
    db=# CREATE TRIGGER row_before_insupd_trigger
           BEFORE INSERT OR UPDATE ON base_tbl FOR EACH ROW
           EXECUTE PROCEDURE row_before_insupd_trigfunc();
    db=# CREATE FOREIGN TABLE foreign_tbl (a int, b int)
           SERVER loopback OPTIONS (table_name 'base_tbl');
    db=# CREATE VIEW rw_view AS
           SELECT * FROM foreign_tbl WHERE a < b WITH CHECK OPTION;
    db=# ALTER SERVER loopback OPTIONS (ADD batch_size '10');
    
    (修正前の動作: Batch Size が 10 のまま、
      2行目の挿入が変更前データでチェックされ、制約違反のデータが格納される)
    db=# EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO rw_view VALUES (0, 15), (0, 5);
                                       QUERY PLAN
    --------------------------------------------------------------------------------
     Insert on public.foreign_tbl
       Remote SQL: INSERT INTO public.base_tbl(a, b) VALUES ($1, $2) RETURNING a, b
       Batch Size: 10
       ->  Values Scan on "*VALUES*"
             Output: "*VALUES*".column1, "*VALUES*".column2
     Query Identifier: -8082510435137086002
    (6 rows)
    
    db=# INSERT INTO rw_view VALUES (0, 15), (0, 5);
    INSERT 0 2
    
    (修正後の動作: Batch Size が 1 になり、
      2行目の挿入が変更後のデータでチェックされ、制約違反でエラーになる)
    db=# EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO rw_view VALUES (0, 15), (0, 5);
                                       QUERY PLAN
    --------------------------------------------------------------------------------
     Insert on public.foreign_tbl
       Remote SQL: INSERT INTO public.base_tbl(a, b) VALUES ($1, $2) RETURNING a, b
       Batch Size: 1
       ->  Values Scan on "*VALUES*"
             Output: "*VALUES*".column1, "*VALUES*".column2
     Query Identifier: 9094516644014608466
    (6 rows)
    
    db=# INSERT INTO rw_view VALUES (0, 15), (0, 5);
    ERROR:  new row violates check option for view "rw_view"
    DETAIL:  Failing row contains (10, 5).
    
  63. contrib/postgres_fdw が非同期データフェッチクエリの送信失敗を検出するように修正されました。 (Fujii Masao) (14)
  64. contrib/postgres_fdw が regconfig およびその他の reg* タイプの定数を適切なスキーマ pg_catalog 修飾で送信するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  65. Linux で動的共有メモリの割り当て中にシグナルをブロックするようになりました。 (Thomas Munro) (14)(13)(12)(11)(10)
  66. これにより、シグナルが posix_fallocate() に割り込むときのバスエラー (SIGBUS) が回避されます。

  67. shm_open() からの予期しない「EEXIST」エラーを検出するようになりました。 (Thomas Munro) (14)(13)(12)(11)(10)
  68. これにより、Solaris で発生する可能性のあるクラッシュが回避されます。

  69. オープンソースの Unix 系 OS illumos では signalfd() を使用しないようになりました。 (Thomas Munro) (14)
  70. これにより、ハングアップやカーネルパニックが発生するように見えるため、修正が利用可能になるまでこの機能は使用されません。

  71. 複合型に対するドメインを返す関数の結果を行全体の変数で参照する問い合わせ処理が修正されました。 (Tom Lane) (13)(12)(11)
  72. (修正前のエラー動作例)
    db=# CREATE TYPE ctyp4 AS (c1 boolean, c2 boolean);
    db=# CREATE DOMAIN dom4 AS ctyp4 NOT NULL;
    db=# CREATE FUNCTION f_ctyp4() RETURNS ctyp4 LANGUAGE sql
         AS $$ SELECT (true, true) $$;
    db=# CREATE FUNCTION f_dom4() RETURNS dom4 LANGUAGE sql
         AS $$ SELECT (true, true) $$;
    
    (複合型を返す場合は動作する)
    db=# SELECT f_ctyp4 FROM f_ctyp4();
     f_ctyp4
    ------------------------
     (t,t)
    (1 row)
    
    (複合型のドメインを返す場合にエラーになっていた - 修正後は動作する)
    db1=# SELECT f_dom4 FROM f_dom4();
    ERROR:  type dom4 is not composite
    
  73. プランナで GROUPING 関数で参照されている副問い合わせをプルアップする(上位の問い合わせに統合する)ときに、「ERROR: variable not found in subplan target list」が生じる問題が修正されました。 (Richard Guo) (13)(12)(11)(10)
  74. (修正前バージョンでのエラー発生例)
    db=# CREATE TABLE t5 AS SELECT generate_series(1, 100)::int i ;
    db=# SELECT GROUPING(ss.x) FROM t5 CROSS JOIN LATERAL (
           SELECT (SELECT t5.i) as x) ss GROUP BY ss.x;
    ERROR:  variable not found in subplan target list
    
  75. pg_stat_get_subscription() 関数がゴミデータを含んだ追加の行を返す可能性があり、防止されました。 (Kuntal Ghosh) (13)(12)(11)(10)
  76. pg_stat_get_subscription() 関数は pg_stat_subscription ビューから使われます。

  77. XMLTABLE や JSON_TABLE に多すぎる列別名を付加した場合のクラッシュが回避されました。 (Álvaro Herrera) (13)(12)(11)(10)
  78. そのような問い合わせに適切なエラーを返すようになりました。これまでは奇妙なエラーが出たり、クラッシュしたりしていました。

    (修正後の動作、f(v1,v2) で実際の列数より多く別名が指定されている)
    db=# SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp)
         AS f (v1, v2);
    ERROR:  XMLTABLE function has 1 columns available but 2 columns specified
    
    (修正前のエラーメッセージ)
    ERROR:  no relation entry for relid 0
    
  79. ビューやルールを(ダンプ出力や psql での表示のため)逆コンパイルする際、それが他で参照されうる場合には、SELECT 出力列の「AS "?column?"」別名句を見せるようになりました。 (Tom Lane) (13)(12)(11)(10)
  80. これまでは、自動生成されたこの別名は常に隠されていましたが、結果としてビューやルールがリストア不能になる稀なケースがありました。

  81. 暗黙的に作成された演算子族がイベントトリガに通知されるようになりました。 (Masahiko Sawada) (13)(12)(11)(10)
  82. 以前は、CREATE OPERATOR CLASS によって演算子族が暗黙的に作成された場合、イベントトリガに通知されませんでした。

  83. スタンバイサーバの昇格中にリスタートポイントが実行されている時に行われるコントロールファイルの更新が、修正されました。 (Kyotaro Horiguchi) (13)(12)(11)(10)
  84. 以前は、リスタートポイント完了時にコントロールファイルの最終チェックポイントのフィールドが誤って更新される可能性があり、次の通常チェックポイント完了前にサーバがクラッシュした場合、PANIC が発生して再起動に失敗する可能性がありました。

  85. 大規模トランザクションの論理レプリケーション中に、スタンバイの wal_receiver_timeout を発動させないようになりました。 (Wang Wei, Amit Kapila) (13)(12)(11)(10)
  86. 以前は、プライマリサーバ上の大規模トランザクションが(おそらく変更されたテーブルがパブリッシュされていないために)スタンバイにデータを送信しない場合、スタンバイがタイムアウトする可能性がありました。キープアライブメッセージを定期的に送信することで修正されました。

  87. 無効なタイムゾーン省略形ファイルを読み取る際のファイルクローズ漏れが防止されました。 (Kyotaro Horiguchi) (13)(12)(11)(10)
  88. このような場合には無害な警告メッセージが生じることがありました。

  89. カスタムサーバパラメータの短い説明に NULL を指定できるようになりました。 (Steve Chavez) (13)(12)(11)(10)
  90. 短い説明は SHOW ALL の description などに表示されるもので、以前は、拡張でここに NULL を指定していると表示処理がクラッシュしていました。

  91. libpq で SSL 秘密鍵の誤った所有者チェックが削除されました。 (Tom Lane) (13)(12)(11)(10)
  92. 以前のマイナーリリースで、サーバでの SSL 秘密鍵のアクセス権チェック方式を libpq にも適用しましたが、所有者チェックまで同様に行うべきではありませんでした。鍵ファイルにアクセス可能であるけれども所有者と異なるユーザでクライアントを実行するときに、予期せぬエラーが生じることがありました。

    (エラー例: root で root 以外のユーザが所有者の鍵ファイルを指定して psql を実行)
    $ su -
    # PGSSLCERT=/ssl/cert.pem PGSSLKEY=/ssl/key.pem PGSSLROOTCERT=/ssl/rcert.pem \
      PGSSLMODE=verify-ca psql -h localhost -U postgres -d postgres
    psql: error: private key file "key.pem" must be owned by the current user or root
    
  93. ecpg でサーバ接続が失われた場合のエラーを適切に報告するようになりました。 (Tom Lane) (13)(12)(11)(10)
  94. 接続が失われた場合などに、libpq で生成されたエラー結果を誤って処理していたため、有用なエラーメッセージではなく「(null)」と出力されていました。また、古いリリースではクラッシュする可能性がありました

  95. PL/Perl のテストケースが Perl 5.36 で動作するように調整されました。 (Dagfinn Ilmari Mannsaker) (13)(12)(11)(10)
  96. PostgreSQL ビルド中に複数の OpenLDAP がインストールされている場合に、古い libldap_r ライブラリを誤って使用しないように configure が修正されました。 (Tom Lane) (13)(12)(11)(10)
  97. 論理レプリケーションでマテリアライズドビューのヒープ書き換え一時テーブルを無視するようになりました。 (Euler Taveira) (10)
  98. 「FOR ALL TABLES」指定のパブリケーションは、個別にテーブルを指定せず、全テーブルが複製対象となり、一時テーブルを複製しようとします。DDL 中のヒープ書き換え一時テーブルは除外されますが、マテリアライズドビューの書き換え中に作成された内部一時テーブルをカバーできませんでした。これにより、REFRESH MATERIALIZED VIEW 中に「logical replication target relation ... does not exist」というエラーが発生するリスクがありました。

14.4 (2022年6月16日リリース)の変更点

  1. CONCURRENTLYオプションを付与したインデックス作成または再作成で、インデックス破損の可能性があり、防止されました。 (Álvaro Herrera) (14)
  2. バージョン14 で追加された最適化のため、CREATE INDEX ... CONCURRENTLY と REINDEX ... CONCURRENTLY が時々インデックスエントリ作成に失敗していました。その結果、誤った問い合わせ結果が生じる可能性があります。本修正でこの最適化が取り消されました。

    CONCURRENTLYオプションを付与して作成された全てのインデックスをバージョンアップ後に再作成することが推奨されています。

  3. 非決定的な等価関数に対して Memorizeプランノードが堅牢になりました。 (David Rowley) (14)
  4. データ型の等価関数またはハッシュ関数が各呼び出しで一貫性に欠ける結果を返す場合に、Memorize がクラッシュを起こす可能性がありました。これからは、そのような場合にエラー「ERROR: could not find memoization table entry」が出るようになります。

  5. Memorizeプランの誤ったコスト見積もりが修正されました。 (David Rowley) (14)
  6. この誤りにより、それが最善でない場合でも Memorize が使われたり、Memorizeノードにおける巨大なハッシュ表の初期化のためにエグゼキュータの起動時間が非常に長くなったりしました。

  7. 複合型に対するドメインを返す関数の結果を行全体の変数で参照する問い合わせ処理が修正されました。 (Tom Lane) (14)
  8. (修正前のエラー動作例)
    db=# CREATE TYPE ctyp4 AS (c1 boolean, c2 boolean);
    db=# CREATE DOMAIN dom4 AS ctyp4 NOT NULL;
    db=# CREATE FUNCTION f_ctyp4() RETURNS ctyp4 LANGUAGE sql
         AS $$ SELECT (true, true) $$;
    db=# CREATE FUNCTION f_dom4() RETURNS dom4 LANGUAGE sql
         AS $$ SELECT (true, true) $$;
    
    (複合型を返す場合は動作する)
    db=# SELECT f_ctyp4 FROM f_ctyp4();
     f_ctyp4
    ------------------------
     (t,t)
    (1 row)
    
    (複合型のドメインを返す場合にエラーになっていた - 修正後は動作する)
    db1=# SELECT f_dom4 FROM f_dom4();
    ERROR:  type dom4 is not composite
    
  9. プランナで GROUPING 関数で参照されている副問い合わせをプルアップする(上位の問い合わせに統合する)ときに、「ERROR: variable not found in subplan target list」が生じる問題が修正されました。 (Richard Guo) (14)
  10. (修正前バージョンでのエラー発生例)
    db=# CREATE TABLE t5 AS SELECT generate_series(1, 100)::int i ;
    db=# SELECT GROUPING(ss.x) FROM t5 CROSS JOIN LATERAL (
           SELECT (SELECT t5.i) as x) ss GROUP BY ss.x;
    ERROR:  variable not found in subplan target list
    
  11. pg_stat_get_subscription() 関数がゴミデータを含んだ追加の行を返す可能性があり、防止されました。 (Kuntal Ghosh) (14)
  12. pg_stat_get_subscription() 関数は pg_stat_subscription ビューから使われます。

  13. クライアント文字エンコーディングがマルチバイト文字エンコーディングで、データベースの文字エンコーディングが SQL_ASCII の場合における、COPY FROM のエラー検査が修正されました。 (Heikki Linnakangas) (14)
  14. このバグにより、正しいデータに対しても「ERROR: invalid byte sequence for encoding "UTF8": 0xe5」などの入力データが不正であるという偽性のエラーが生じる可能性がありました。

  15. XMLTABLE や JSON_TABLE に多すぎる列別名を付加した場合のクラッシュが回避されました。 (Álvaro Herrera) (14)
  16. そのような問い合わせに適切なエラーを返すようになりました。これまでは奇妙なエラーが出たり、クラッシュしたりしていました。

    (修正後の動作、f(v1,v2) で実際の列数より多く別名が指定されている)
    db=# SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp)
         AS f (v1, v2);
    ERROR:  XMLTABLE function has 1 columns available but 2 columns specified
    
    (14.3 でのエラーメッセージ)
    ERROR:  no relation entry for relid 0
    
  17. ビューやルールを(ダンプ出力や psql での表示のため)逆コンパイルする際、それが他で参照されうる場合には、SELECT 出力列の「AS "?column?"」別名句を見せるようになりました。 (Tom Lane) (14)
  18. これまでは、自動生成されたこの別名は常に隠されていましたが、結果としてビューやルールがリストア不能になる稀なケースがありました。

  19. 暗黙的に作成された演算子族がイベントトリガに通知されるようになりました。 (Masahiko Sawada) (14)
  20. 以前は、CREATE OPERATOR CLASS によって演算子族が暗黙的に作成された場合、イベントトリガに通知されませんでした。

  21. スタンバイサーバの昇格中にリスタートポイントが実行されている時に行われるコントロールファイルの更新が、修正されました。 (Kyotaro Horiguchi) (14)
  22. 以前は、リスタートポイント完了時にコントロールファイルの最終チェックポイントのフィールドが誤って更新される可能性があり、次の通常チェックポイント完了前にサーバがクラッシュした場合、PANIC が発生して再起動に失敗する可能性がありました。

  23. 大規模トランザクションの論理レプリケーション中に、スタンバイの wal_receiver_timeout を発動させないようになりました。 (Wang Wei, Amit Kapila) (14)
  24. 以前は、プライマリサーバ上の大規模トランザクションが(おそらく変更されたテーブルがパブリッシュされていないために)スタンバイにデータを送信しない場合、スタンバイがタイムアウトする可能性がありました。キープアライブメッセージを定期的に送信することで修正されました。

  25. 無効なタイムゾーン省略形ファイルを読み取る際のファイルクローズ漏れが防止されました。 (Kyotaro Horiguchi) (14)
  26. このような場合には無害な警告メッセージが生じることがありました。

  27. カスタムサーバパラメータの短い説明に NULL を指定できるようになりました。 (Steve Chavez) (14)
  28. 短い説明は SHOW ALL の description などに表示されるもので、以前は、拡張でここに NULL を指定していると表示処理がクラッシュしていました。

  29. libpq で SSL秘密鍵の誤った所有者チェックが削除されました。 (Tom Lane) (14)
  30. 以前のマイナーリリースで、サーバでの SSL秘密鍵のアクセス権チェック方式を libpq にも適用しましたが、所有者チェックまで同様に行うべきではありませんでした。鍵ファイルにアクセス可能であるけれども所有者と異なるユーザでクライアントを実行するときに、予期せぬエラーが生じることがありました。

    (エラー例: rootで root以外のユーザが所有者の鍵ファイルを指定して psqlを実行)
    $ su -
    # PGSSLCERT=/ssl/cert.pem PGSSLKEY=/ssl/key.pem PGSSLROOTCERT=/ssl/rcert.pem \
      PGSSLMODE=verify-ca psql -h localhost -U postgres -d postgres
    psql: error: private key file "key.pem" must be owned by the current user or root
    
  31. ecpg でサーバ接続が失われた場合のエラーを適切に報告するようになりました。 (Tom Lane) (14)
  32. 接続が失われた場合などに、libpq で生成されたエラー結果を誤って処理していたため、有用なエラーメッセージではなく「(null)」と出力されていました。また、古いリリースではクラッシュする可能性がありました(本修正は 10.x 以降に適用されています、次リリース 13.8、12.12、11.17、10.22 に含まれます)。

  33. pg_amcheck でサーバ接続が失われた場合のクラッシュが修正されました。 (Tom Lane) (14)
  34. 接続が失われた場合などに、libpq で生成されたエラー結果を誤って処理していたため、クラッシュが生じていました。

  35. PL/Perl のテストケースが Perl 5.36 で動作するように調整されました。 (Dagfinn Ilmari Mannsaker) (14)
  36. PostgreSQL ビルド中に複数の OpenLDAP がインストールされている場合に、古い libldap_r ライブラリを誤って使用しないように configure が修正されました。 (Tom Lane) (14)

14.3、13.7、12.11、11.16、10.21 (2022年5月12日リリース)の変更点

  1. 「セキュリティ限定された操作」のサンドボックス内では追加操作を制限するようにしました。 (Sergey Shinderuk, Noah Misch) (14)(13)(12)(11)(10)
  2. 自動VACUUM、CLUSTER、CREATE INDEX、REINDEX、REFRESH MATERIALIZED VIEW、pg_amcheck では「セキュリティ限定された操作」による保護が有効化されるのが遅すぎたり、全く働かなかったりしていました。

    データベース内に永続オブジェクトを作成する権限を持ったユーザは、スーパーユーザ権限で任意の SQLコードを実行するオブジェクトを定義できました。仕込まれた SQLコードは、次に自動VACUUM が行われるときに、あるいは、スーパーユーザがそのオブジェクトに作用するいずれかのコマンドを実行したときに、実行されます。

    本脆弱性は CVE-2022-1552 として登録されています。

  3. gist_ltree_ops のインデックスについて、デフォルトのシグネチャ長が修正されました。 (Tomas Vondra, Alexander Korotkov) (14)(13)
  4. ltree拡張を演算子クラスパラメータをサポートするようにアップグレードするときに、ltree列に対する GiSTインデックスのデフォルトのシグネチャ長(ハッシュサイズ)が、意図せず変更されてしまいました。最初から ltree をバージョン 1.2 にアップグレードしている場合を除き、このようなインデックスに何らか操作が行われた場合、シグネチャ長が 8バイトではなく 28バイトと見做されて動作します。したがって、おそらくそのインデックスは壊れています。安全のためバージョンアップ後に全ての ltree の列に対する GiSTインデックスを再作成(REINDEX)することを推奨します。なお、ltree[] 配列の列に対する GiSTインデックスには影響しません。

  5. 素のテーブルを参照する行全体の値の列に対して、問い合わせで指定された列の別名を使わないようにしました。 (Tom Lane) (14)(13)(12)(11)(10)
  6. 選択リストの最上位以外での tbl.*などの行全体変数から作られたタプルの列名は、今後は、もしあるなら常に関連して名前付けされた複合型の要素名になります。これまでは FROM のエントリに適用された全ての列の別名を追跡させるように試みていました。しかし、これは意味がないと判断されました。

    従来実装では、行全体をあらわす列を使用したテーブルを作った後、行全体の列の元となるテーブルの列名を付け直した場合に、そのようなテーブルのSELECT で予期せぬエラーが発生して、格納したデータが読めなくなってしまうことがありました。

    (報告された障害発生ケース)
    db=# CREATE TABLE t3 (data int);
    db=# CREATE VIEW v3 AS SELECT t3 FROM t3;
    db=# CREATE TABLE t3_log (ts timestamp, what v3);
    
    (列名を付け直す操作)
    db=# ALTER TABLE t3 ADD big_data bigint;
    db=# UPDATE t3 SET big_data = data;
    db=# UPDATE t3_log SET what.t3.big_data = (what).t3.data;
    db=# ALTER TABLE t3 DROP data;
    db=# ALTER TABLE t3 RENAME big_data TO data;
    db=# INSERT INTO t3 VALUES (123456);
    db=# INSERT INTO t3_log SELECT now(), v3 FROM v3;
    
    (この時は正しく出力)
    db=# SELECT * FROM t3_log;
                 ts             |     what
    ----------------------------+--------------
     2022-05-16 13:49:54.862458 | ("(123456)")
    (1 row)
    db=# \c
    
    (接続し直した後にはエラーになる)
    db=# SELECT * FROM t3_log;
    ERROR:  record type has not been registered
    

    列名を付け直したい場合の本障害の回避策は、副問い合わせの階層を追加して、行全体の変数が副問い合わせの出力を参照して、素のテーブルを参照しないようにすることです。これは上記のエラー発生例で言えば「CREATE VIEW ...」を「CREATE VIEW v3 AS SELECT v::t3 AS t3 FROM (SELECT * FROM t3) v(d);」と記述することです。

  7. interval型からエポック値を抽出するときの誤った丸めが修正されました。 (Peter Eisentraut) (14)
  8. numeric型を返すようになった新しい EXTRACT の実装コードで、誤って DAYS_PER_YEAR 定数を整数型に変換して切り捨てていたため、13.x バージョン以前の float型を返すコードと戻り値が異なっていました。

  9. pg_stat_get_replication_slot(NULL) 実行時のクラッシュが防止されました。 (Andres Freund) (14)
  10. この関数はカタログデータで STRICT と定義されるべきでしたが、バージョン14 ではこれが指定されていなかったため、代替策として、関数実装に実行時のチェックが追加されました。

  11. table_to_xmlschema() などの XML関数における timestamptz型、timetz型の誤った出力が修正されました。 (Renan Soares Lopes) (14)(13)(12)(11)(10)
  12. これらのデータ型に対する XMLスキーマ出力では文字列パターンの正規表現が壊れていました。

  13. 列数がゼロの「VALUES」句のパーサ処理のクラッシュが回避されました。 (Tom Lane) (14)(13)(12)(11)(10)
  14. (報告された障害発生ケース)
    db=# CREATE TEMP TABLE nocols();
    db=# INSERT INTO nocols DEFAULT VALUES;
    db=# SELECT * FROM nocols n, LATERAL (VALUES(n.*)) v;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
  15. プランノードの Result が Append ノードのすぐ下にあらわれる場合のプランナのエラーやクラッシュが修正されました。 (Etsuro Fujita) (14)
  16. 非同期リモートクエリをサポートするために最近追加されたコードは、このケースを処理できず、クラッシュや「ERROR: unrecognized node type ..」などの認識されないノードタイプに関するエラーが引き起こされました。

  17. 「SEARCH」句または「CYCLE」句を使用するクエリに重複するテーブル式の名前が含まれている場合のプランナのエラーやクラッシュが修正されました。 (Tom Lane, Kyotaro Horiguchi) (14)
  18. 再帰的な WITH クエリの名前が自身の中で再利用されると、プランナがクラッシュしたり、奇妙なエラーを報告したりする可能性がありました。

    (障害発生例)
    db=# WITH RECURSIVE x(col) as (
           SELECT 1 UNION (
    	     WITH x AS (SELECT * FROM x)
               SELECT * FROM x)
         ) SEARCH DEPTH FIRST BY col SET seq
         SELECT * FROM x;
    ERROR:  could not find attribute 2 in subquery targetlist
    
  19. 外側のクエリ階層を参照する GROUPING() 構文のプランナエラーが修正されました。 (Richard Guo, Tom Lane) (14)(13)(12)(11)(10)
  20. 奇妙なエラーやアサート失敗が報告されました。

    (エラー発生例)
    db=# SELECT (SELECT GROUPING(v1)) FROM (VALUES ((SELECT 1))) v(v1) GROUP BY v1;
    ERROR:  plan should not reference subplan's variable
    
  21. 返却可能な列と返却不可能な列の両方を持つインデックスに対するインデックスオンリースキャンのプラン生成が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  22. 以前のコーディングでは、返却可能な列に加え、返却不可能な列も読み取ろうとする可能性がありました。 これは実際には無効な値に対して何も行わなかったためおよそ無害でしたが、最近追加されたエラーチェックでそのようなプランを拒否して、下記のエラーメッセージを出していました。

    ERROR:  XX000: variable not found in subplan target list
    
  23. EvalPlanQual の実行中に古いタプルをロックしようとする際に、ピン(PIN)で固定されなくなった共有バッファにアクセスしないようになりました。 (Tom Lane) (14)(13)(12)
  24. EvalPlanQual は READ COMMITTED 隔離レベルの問い合わせにおける内部的な処理です。

    従来コードはピンを解放した後、さらに数回バッファにアクセスしていました。理論的には別プロセスがピンがなくなった時点ですぐにバッファを再利用し(あるいは、より可能性が高いのは、その空き領域をデフラグしようとし)、タプルの新しいバージョンを見つけるのに失敗する可能性があります。

  25. 再並べ替えを実行している IndexScanノードでの、クエリ存続期間におけるメモリリークが修正されました。 (Aliaksandr Kalenik) (14)(13)(12)(11)(10)
  26. 関数の並列性属性と「SET」変数リストを同じコマンドで変更できるように ALTER FUNCTION が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  27. 一つの ALTER FUNCTION コマンドで関数の「SET」句も更新した場合、並列性属性の変更が失われていました。

    (誤動作例/「PARALLEL safe」を指定したので proparallel は 「s」が正しい)
    db=# CREATE FUNCTION public.f14() RETURNS int LANGUAGE sql AS 'SELECT 1';
    db=# ALTER FUNCTION public.f14() SET timezone TO 'UTC' PARALLEL safe;
    db=# SELECT proname, proparallel, proconfig FROM pg_proc WHERE proname = 'f14';
     proname | proparallel |   proconfig
    ---------+-------------+----------------
     f14     | u           | {TimeZone=UTC}
    (1 row)
    

  28. 制約に「所有されている」インデックスの検出が厳格化されました。 (Tom Lane, Japin Li) (14)
  29. 一部のコードパスで、外部キー制約が依存しているインデックスを、ユニーク制約または主キー制約によって所有されているインデックスと取り違えていました。その結果、外部キー制約を持つテーブルに対する特定の ALTER TABLE 操作に際して、下記のような奇妙なエラーが発生していました。

     ERROR:  relation 145678 has multiple clustered indexes 
    または
     ERROR:  "t15_pkey" is not an index for table "t15" 
    
  30. ALTER TABLE でテーブルのシステム列を変更しようとすると、間違ったエラーが発生する問題が修正されました。 (Tom Lane) (14)(13)(12)
  31. システムは「ERROR: cannot alter system column "cmax"」などと、それができないことを通知するべきですが、代わりに「ERROR: no owned sequence found」を報告する場合がありました。

  32. 先頭キーが式であるインデックスを使用して CLUSTER 処理を行った場合に、テーブルの行が誤った並べ替えになる問題が修正されました。 (Peter Geoghegan, Thomas Munro) (14)(13)(12)(11)(10)
  33. テーブルは正しいデータで再構築されますが、インデックスの順序とはほとんど関係のない順序になりました。

  34. ソートされた GiSTインデックスのビルド直後にシステムクラッシュが発生した場合のデータ損失が防止されました。 (Heikki Linnakangas) (14)
  35. ソートを使用して GiSTインデックスを構築するコードパスは、完了時にファイルの fsync を怠っていました。このため、その後すぐにオペレーティングシステムがクラッシュした場合、インデックスが破損する可能性がありました。

  36. パーティション化されたインデックスを削除する際にデッドロックエラーのリスクがあり、修正されました。 (Jimmy Yih, Gaurab Dey, Tom Lane) (14)(13)(12)(11)
  37. 必要なテーブルとインデックスのロックが確実に標準的な順序(子の前に親、インデックスの前にテーブル)で取られるようになりました。DROP INDEX の以前のコーディングでは、これとは異なる方法でロックを取っていたため、標準的な順序でこれらのロックを取る同時実行の問い合わせに対してデッドロックが発生する可能性がありました。

  38. DROP TABLESPACE とチェックポイントの間の競合状態が修正されました。 (Nathan Bossart) (14)(13)(12)(11)(10)
  39. DROP TABLESPACE によって強制されるチェックポイントが、テーブルスペースのディレクトリからすべてのデッドファイルを削除することに失敗して、以下のような偽のエラーが発生する場合がありました。

    ERROR:  tablespace "tblspc20" is not empty
    
  40. チェックポイント実行と並行して TRUNCATEコマンドを実行した後に、クラッシュリカバリが失敗する可能性があり、修正されました。 (Kyotaro Horiguchi, Heikki Linnakangas, Robert Haas) (14)(13)(12)(11)(10)
  41. チェックポイントが完了できるようになる前に、テーブルのディスクファイルが全削除されることをTRUNCATE は保証しなければなりません。そうでないと、そのチェックポイントから開始したリプレイが、削除されているはずのページの予期せぬデータを見つけて、リプレイ失敗を引き起こすおそれがありました。

  42. 一時オブジェクト削除中における安全でないTOASTデータアクセスが修正されました。 (Andres Freund) (14)(13)(12)(11)(10)
  43. サーバプロセス終了時に「FATAL: cannot fetch toast data without an active snapshot」のエラーを出して、一時オブジェクトの削除に失敗することがありました。次に一時スキーマを使う際に正常にクリーンアップされるため、通常は無害です。

  44. カスタム設定名の最初の文字に「_」が再度使えるようになりました。 (Japin Li) (14)
  45. バージョン14 ではそのような名前が意図せず使えなくなってしまっていました。

  46. compute_query_id 設定に指定可能な値として「regress」が追加されました。 (Michael Paquier) (14)
  47. これはリグレッションテストを容易にすることを目的としており、クエリID が計算されるけれども EXPLAIN の出力には表示されません。

  48. RegisterSyncRequest の待機ロジックが改善されました。 (Thomas Munro) (14)(13)(12)
  49. RegisterSyncRequest は局所的にストレージ同期の要求を受け付けたり、要求を checkpointerプロセスに転送したりする、内部実装関数です。

    その中で checkpointer への同期要求キューが溢れた場合(shared_buffers が小さい場合に起こりえます)、その待ち行列が減るのを待つ動作をします。このときの待機を示す待機イベント「RegisterSyncRequest」が追加されました。

  50. 書き込みと書き込みの間で checkpointerプロセスが待機しているときにはラッチイベントを起こすようになりました。 (Thomas Munro) (14)
  51. これは同期リクエストを送信するバックエンドの反応性を改善します。更にこの待機に対応した待機イベント「CheckpointerWriteDelay」も追加されました。

  52. WAL の後続レコードが欠けている時にスタンバイを昇格すると「PANIC: xlog flush request is not satisfied」が発生する問題が修正されました。 (Sami Imseih) (14)(13)(12)(11)(10)
  53. ホットスタンバイのコンフリクトを処理する際に自己デッドロックが起きる可能性があり、修正されました。 (Andres Freund) (14)(13)(12)(11)(10)
  54. 不運なタイミングのとき、WAL を適用するプロセスが他プロセスのバッファロックの解放を待って、動作が止まってしまう可能性がありました。

  55. ロジカルレプリケーションの変更を送信する際、パーティションの先祖関係を間違ってしまう可能性があり、修正されました。 (Tomas Vondra, Hou zj, Amit Kapila) (14)(13)
  56. publish_via_partition_root オプションが true に指定されていて、更新するリレーションに対する異なる先祖で指定された複数のパブリケーションがある場合(即ち親子関係にあるリレーション各々にパブリケーションを作っている場合)、サブスクリプションへの変更の報告に際して間違った先祖リレーションを選択することがありました。

  57. max_sync_workers_per_subscription 設定の制限に抵触する場合でもロジカルレプリケーションの apply workerプロセスが再起動されるようになりました。 (Amit Kapila) (14)(13)(12)(11)(10)
  58. 本設定に対する上限検査コードの欠陥により、これまでは再起動されたワーカを直ぐに終了してしまっていて、ほとんどのワーカが存続できませんでした。

  59. UPDATE に対して、変更されていないレプリカアイデンティティ(REPLICA IDENTITY)のキー列を、それが外部TOAST格納されている場合には WALログに含めるようになりました。 (Dilip Kumar, Amit Kapila) (14)(13)(12)(11)(10)
  60. この対処をしないと、サブスクライバはその値を見ることができないので、更新を正しく複製できないことになります。

  61. psコマンドにおけるサーバプロセス表示の置き換えに対応していないプラットフォームを適切に処理できるようになりました。 (Andrew Dunstan) (14)(13)
  62. このようなプラットフォームはほとんどありません。そのため、これまでリファクタリングが潜在的なメモリ破壊をもたらすことに気づかれませんでした。サポートされているプラットフォームで該当する唯一のものは Cygwin で、バックエンドプロセスのクラッシュが報告されました。

  63. タイマ割り込みの見逃しに対して、より頑健になりました。 (Michael Harris, Tom Lane) (14)
  64. バージョン14 で追加された最適化は、なんらかの理由でサーバプロセスがタイマ割り込みを逃してしまった場合は他についてもカーネルに要求を繰り返さないというもので、セッションの以降においてタイムアウト検出に失敗することになりました。

    これでは脆弱すぎると判断され、リカバリパスが追加されました。

  65. PL/Perl関数のコンパイル時には SPI関数は実行できないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  66. PL/Perl関数のコンパイル時には Perl はユーザ定義コードを実行すると考えられます。しかしながら、SPI 経由の SQL操作を行うコードは望ましくなく、クラッシュかセキュリティ障害を起こす可能性がありました。関数の検証に際して本当にコード実行をしたいわけではありません。そこで、代わりに親切なエラーメッセージを出す検査が加えられました。

  67. libpq が root所有の SSL秘密鍵ファイルを受け入れるようになりました。 (David Steele) (14)(13)(12)(11)(10)
  68. この変更により、libpq の SSL鍵ファイルの所有者とアクセス許可の安全チェックが、バージョン9.6 以降のサーバと統一されます。すなわち、現在のルールに加え、鍵ファイルの所有者が root であって、パーミッションが 0640 以下の場合を許容するようになりました。これは、鍵ファイルのシステム全体での管理に役立ちます。

  69. libpq の PQisBusy()関数の接続エラー後の動作が修正されました。 (Tom Lane) (14)(13)(12)
  70. 書き込みエラーを検出した場合、PQisBusy() は常に真を返しましたが、これは誤りでした。サーバから何か読み取れるまで、通常は入力処理を継続したいところでした。

    この障害の実際の影響は、libpq の非同期クエリAPI を使用するアプリケーションが、PQconsumeInput() が致命的なエラーを返した場合にしか接続断を検出しないことです。この修正により、接続断が順当にエラーの PGresult オブジェクトを介して報告されるようになりました。これはほとんどのアプリケーションにとって相応しい動作です。

  71. psql、pg_dump、および pg_amcheck で「データベース.スキーマ.テーブル」という構文を再度許容するようになりました (Mark Dilger) (14)
  72. 14 より前のバージョンは、2つ以上の「.」を含むパターンにおけるスキーマとテーブル以外の全ての修飾名を黙って無視していました。バージョン14 でのリファクタリングの誤りで、そのユースケースがエラーになるようになってしまいました。本バージョンで復活しましたが、先頭の修飾名がカレントデータベースの名前と一致しない場合にはエラーが発生します。

    (バージョン 14.2 で以下エラー/13.x 以前と 14.3 以降では実行可能)
    db1=# \d db1.public.t1
    Did not find any relation named "db1.public.t1".
    
    (バージョン14.3 で以下エラー/13.x 以前では実行可能)
    db1=# \d foo.bar.public.t1
    improper qualified name (too many dotted names): foo.bar.public.t1
    
  73. pg_ctl は、stop/restart/promote の動作を待機している間、postmasterプロセスが動作していることを再チェックするようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  74. pg_ctl は、stop または promote シグナルを送信する一方で postmasterプロセスが動作していること(PID が有効であるか)を 1回確認しますが、その後は単純に PIDファイルが削除されるまで待機していました。postmaster が PIDファイルを削除したり、制御ファイルを更新したりせず、非正常に終了した場合、pg_ctl はタイムアウトになるまで待機していました。

    これに替えて postmasterプロセスがまだ存在しているかをときどき再チェックするようになりました。

  75. pg_waldump のエラー処理が修正されました。 (Kyotaro Horiguchi, Andres Freund) (14)(13)(12)(11)
  76. WALセグメントサイズを知るために WALファイルを読み取ったとき、ファイルサイズが XLOG_BLCKSZ よりも小さい場合(例えば 0バイト)、pg_waldump は誤ったエラー報告をしていました。また、このエラーメッセージおよび関連するエラーメッセージで報告されるファイル名は無効である可能性がありました。

    (報告された誤ったメッセージ/正しくないファイル名や要因が示される)
    pg_waldump: fatal: could not read file ".....": .....
    
  77. contrib/pageinspect の関数が全てゼロのページに対応するようになりました。 (Michael Paquier) (14)(13)(12)(11)(10)
  78. これは正当な境界条件的ケースでしたが、このモジュールではほぼ想定されていませんでした。必要に応じて、NULL を返すか、行を返さないように変更されました。これは、エラーを発生させるよりも有効です。

  79. contrib/pageinspect で、破損したページの「特別な領域」に対する保護を追加し、正しいページサイズのチェックを強化し、不足していたインデックスの型チェックが追加されました。 (Michael Paquier, Justin Pryzby, Julien Rouhaud) (14)(13)(12)(11)(10)
  80. これらの変更により、モジュールが不良データでクラッシュする可能性が低くなりました。

  81. contrib/postgres_fdw で BEFORE INSERT ... FOR EACH ROW トリガが外部テーブルに存在する場合、バッチ挿入が無効にされました。 (Etsuro Fujita) (14)
  82. このようなトリガはテーブルを照会する際、手前で挿入した行を参照するかもしれません。バッチ挿入では、これらの行がまだ可視となってない可能性があるため、予期せぬ動作を回避するため、無効にされました。

  83. contrib/postgres_fdw で、リモートで順序付けされたクエリを要求する前にORDER BY句が安全に渡せることを検証し、必要に応じて USING句を含めるようになりました。 (Ronan Dunklau) (14)(13)(12)(11)(10)
  84. この修正はリモートサーバが意図と異なる順序で並べ替えるケースを防止します。これは見た目だけの場合もありますが、リモートデータがローカルで実行されるマージ結合の入力として使用されると、完全に間違った結果が生じる可能性がありました。

  85. sys/epoll.h があり、sys/signalfd.h はないプラットフォームを扱えるようにconfigure が修正されました。 (Tom Lane) (14)
  86. LLVM 14 で動作するように JITコードが更新されました。 (Thomas Munro) (14)(13)(12)(11)
  87. clang の -fsanitize=undefined オプションで様々な障害をクリーンアップするようになりました。 (Tom Lane, Andres Freund, Zhihong Yu) (14)(13)(12)(11)(10)
  88. これらの変更のほとんどは、C および POSIX 標準の文書に型通りに準拠するためのものであり、本番ビルドに影響を与える可能性はほとんどありません。

  89. OpenSSL なしでビルドする場合は、libpq の pkg-config ファイルに OpenSSL の依存関係を追加しないように修正されました。 (Fabrice Fontaine) (14)
  90. 式の中にネストされたステートメントをサポートしない CコンパイラでビルドできるようにPL/Perl が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  91. Windows でビルドに MSVC を使用していない場合に、pg_dumpall のビルドエラーが発生する可能性があり、修正されました。 (Andres Freund) (14)(13)(12)(11)(10)
  92. mingw の gcc によるビルドで問題が報告されました。

  93. Windowsビルドでは、pexports の代わりに gendef を使用してDEFファイルを作るようになりました。 (Andrew Dunstan) (14)(13)(12)(11)(10)
  94. これにより、ビルドプロセスが最新の MSys ツールチェーンで機能するように調整されました。

  95. MinGW でビルドされたプログラムでの余分なワイルドカードパターンの展開が防止されました。 (Andrew Dunstan) (14)(13)(12)(11)(10)
  96. 何らかの理由で、MinGW によって提供される Cライブラリは、デフォルトでプログラムのコマンドライン引数のシェルワイルドカード文字を展開してしまいます。MSVC では特に発生しないため、これは混乱を招くのでパターン展開が無効化されました。

  97. タイムゾーンデータファイルが tzdata release 2022a に更新されました。パレスチナでの夏時間法の変更に加えて、チリ、ウクライナの歴史的修正が含まれます。 (14)(13)(12)(11)(10)
  98. 論理レプリケーションのサブスクライバにおける、サポートされていないテーブル種別に対するエラーメッセージが改善されました。 (Tom Lane) (12)(11)(10)
  99. バージョン13 以降のサーバは、パーティションテーブルのパブリッシュがサポートされるようになりました。バージョン13 より古いバージョンのサーバは、パーティションテーブルのサブスクライブを処理できず、「table ... not found on publisher」のような誤解を招くエラーメッセージを表示していましたが、より的確なメッセージを表示するように修正されました。

PostgreSQL 14.2、13.6、12.10、11.15、10.20 (2022年2月10日リリース)の変更点

  1. REINDEX CONCURRENTLY の問題を防止するため、TOAST テーブルの更新に標準のロックプロトコルが適用されました。 (Michael Paquier) (14)(13)(12)
  2. REINDEX CONCURRENTLY を TOASTテーブルまたは TOASTテーブルのインデックスに 適用した場合、破損したインデックスを生成することがよくありました。これは TOASTエントリを更新するセッションが、他の更新の動作と同様にトランザクションがコミットされるまで ROW EXCLUSIVE ロックを保持するのではなく、ROW EXCLUSIVE ロックをすぐに解放したために発生しました。今回 TOAST 更新が通常のルールに従ってテーブルロックを保持するよう修正されました。既存の破損したインデックスは、再度 REINDEX を実行することで修復できます。

  3. ページプルーニング中に RECENTLY_DEAD タプルが状態を完全に DEAD に変更した時の HOTチェーンの破損が修正されました。 (Andres Freund) (14)
  4. VACUUM では、それを指すリダイレクトアイテムが残っている状態で RECENTLY_DEAD のタプルを削除することがありえました。そのようなタプルのアイテムスロットが後に新しいタプルで再利用されると、既存の HOTチェーンの一部とみなされ、インデックス破損が形成されます。

    発生した場合はテーブルのインデックス再作成で修復できます。しかし、これは非常に確率の低いシナリオであるため、発生したかもしれないという可能性だけでインデックスを再作成することは推奨されません。

  5. ローカルパーミッションと外部パーティションが混在するテーブルのEvalPlanQual再チェックでのクラッシュが修正されました。 (Etsuro Fujita) (14)
  6. EvalPlanQual再チェックは READ COMMITTED 隔離レベルの問い合わせで使われる処理です。

  7. COPY TO でのメモリ処理の誤りが修正されました。 (Bharath Rupireddy) (14)
  8. この見落としにより、COPY でエラーが発生した後、誤ったエラーメッセージやクラッシュが発生することがありました。

  9. 同時に DROP STATISTICS で統計オブジェクトが削除された時に発生する ALTER STATISTICS での NULLポインタ参照によるクラッシュが回避されました。 (Tomas Vondra) (14)(13)
  10. マルチ範囲型データから範囲を抽出する際に、アライメントのパディングが正しく処理されるようになりました。 (Alexander Korotkov) (14)
  11. この誤りは可変長データ型のマルチ範囲を処理する際にクラッシュを引き起こす可能性がありました。

  12. 無名 RECORD データ型に対するハッシュの過度な楽観的使用が修正されました。 (Tom Lane) (14)
  13. これにより、「ERROR: could not identify a hash function for type record」(型レコードのハッシュ関数を識別できない)のエラーが防止されます。

  14. パラレルで単一の子ノードを持つ Appendノードに対する誤ったプラン作成が修正されました。 (David Rowley) (14)(13)(12)
  15. 場合によっては、Append が単純化されるべきではない時に単純化され、誤った問い合わせ結果(重複した行)が発生することがありました。

    単一の子ノードを持つ Appendノードは、例えば「SELECT id, c FROM t1 UNION ALL SELECT id, c FROM t2 WHERE false」といった形を持つ問い合わせのプランで出現する可能性がありました。

  16. インデックスに返却不能の列が含まれる場合について、インデックスオンリースキャンプランが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  17. インデックスの列にはインデックスオンリースキャンで返すことができるか(返却可能列か返却不能列か)を示す、returnable属性があります。

    インデックスが返却可能列と返却不能列の両方を持ち、返却不能列の 1つが返却可能列にあらわれるテーブル列を使用した式である場合、その式を使用した問い合わせは、返却可能列から式を再計算するのではなく、返却不能列を読もうとするインデックスオンリースキャンプランとなる可能性がありました。返却不能列は NULL として読み込まれるため、誤った問い合わせ結果が発生しました。

    (障害動作例/ここでの lower(c) は返却不能列)
    db=# CREATE TABLE t9 (c text);
    db=# INSERT INTO t9 VALUES (md5('A')), (md5('B'));
    db=# CREATE INDEX ON t9 USING gist(lower(c) gist_trgm_ops) INCLUDE (c);
    db=# SET enable_seqscan TO off;
    db=# \pset null *NULL*
    db=# SELECT lower(c), c FROM t9;
     lower  |                c
    --------+----------------------------------
     *NULL* | 7fc56270e7a70fa81a5935b72eacbe29
     *NULL* | 9d5ed678fe57bcca610140957afab571
    (2 rows)
    
  18. Memoize の上位からきたパラメータを使用するサブプランを処理できるように、Memoizeプランノードが修正されました。 (David Rowley) (14)
  19. この障害により誤った問い合わせ結果が生じるケースが報告されました。

  20. Memoizeプランノードがハッシュ不可能な結合の演算子で正しく動作するように修正されました。 (David Rowley) (14)
  21. 結合条件に不等号を使っている場合や浮動小数点データ型で 0.0 と -0.0 がある場合などで問題が生じました。この障害により、クラッシュや誤った問い合わせ結果が生じる可能性があります。

  22. 指定されていない型修飾へのキャストにより、長さの強制関数の呼び出しではなく、RelabelTypeノードが生成されるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  23. 強制関数は正しい動作(何もしないこと)を実行しますが、この変換は非効率で望ましくありません。

    character(N) 型を bpchar 型にキャストする場合が該当します。

  24. anycompatible で始まる名前の疑似データ型(以下「anicompatible*」と記載)について一致判定が修正されました。 (Tom Lane) (14)(13)
  25. anicompatible* 型の多相パラメータを持つ関数や演算子が、実際には本当は一致しないはずの引数の集合に一致したと、パーサが誤判断することがありました。

    報告されたケースでは、一つの呼び出しに複数の演算子を一致させることになり、「ERROR: operator is not unique: ...」「HINT: Could not choose a best candidate operator. You might need to add explicit type casts.」などのあいまいな演算子だというエラーを引き起こしました。一方、より後の処理段階でエラーを起こすこともあり得ました。

  26. ちょうど WALページの境界でデータベースが整合性を持つ状態に到達した場合の、WALリプレイ失敗が修正されました。 (Álvaro Herrera) (14)(13)(12)(11)(10)
  27. 修正されませんが、これは 9.6.x でも該当します。

  28. 物理ストリーミングレプリケーションのスタンバイサーバの startup処理がトランザクションID 周回を許容するように修正されました。 (Abhijit Menon-Sen, Tomas Vondra) (14)(13)(12)(11)(10)
  29. プライマリ上のアクティブなトランザクションのセットが周回境界を越えている間にスタンバイサーバが起動すると(古いトランザクションよりも小さい XID を持つ新しいトランザクションがいくつか存在するため)、「ERROR: out-of-order XID insertion in KnownAssignedXids」エラーが生じました。再試行されますがこのエラーを乗り越えることはできません。

  30. ロジカルレプリケーションで子テーブルのデータの二重送信が回避されるようになりました。 (Hou Zhijie) (14)(13)
  31. パブリケーションに子テーブルと親テーブルの両方が含まれ、publish_via_partition_root オプションが設定されている場合、サブスクライバは子テーブルと親テーブルの両方で無駄な同期を開始していました。このような場合は親テーブルのみが同期されるようになりました。

  32. ロジカルレプリケーション接続で発行される SQLコマンドの字句制限が撤廃されました。 (Tom Lane) (14)(13)(12)(11)(10)
  33. これまでは、引用符で囲まれていないセミコロンを含む SQLコマンド、奇数の一重引用符または二重引用符を含むドル引用符で囲まれたリテラル、または SQLコマンドがコメントで始まる場合、walsenderプロセスがエラーを起こしました。

    さらに、不完全なエラーからの回復処理により以降のコマンドでも予期せぬエラーが発生する可能性がありました。

  34. ROLLBACK PREPARED 操作のレプリケーションに際して、レプリケーション元のタイムスタンプが確実に設定されるようになりました。 (Masahiko Sawada) (14)
  35. トランザクションの最後のサブトランザクションのコミットタイムスタンプが記録されない可能性があり、修正されました。 (Alex Kingsborough, Kyotaro Horiguchi) (14)(13)(12)(11)(10)
  36. チェックポイントに際して、pg_logical/mappingsサブディレクトリを必ず fsync するようになりました。 (Nathan Bossart) (14)(13)(12)(11)(10)
  37. 一部のファイルシステムでは、この見落としによりシステムクラッシュ後に論理書き換えの状態ファイルが失われる可能性がありました。

  38. パーティションテーブルの拡張統計情報が作成されるようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  39. 以前のバグ修正により、古い形式の継承ツリーに対する拡張統計の構築が無効になりましたが、パーティションテーブルに対する構築も無効になっており、不要な制限となっていました。今回の変更により、ANALYZE はパーティションテーブルの統計オブジェクトの値を計算できるようになりました。(しかし、autovacuum はパーティションテーブルを自動処理しないので、パーティションテーブルの統計情報を維持したい場合は、パーティションテーブルに対して定期的に手動 ANALYZE を実行する必要があることに注意してください。)

  40. 継承ツリーの拡張統計情報を無視するようになりました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  41. 現在、拡張統計情報の値は継承ツリー全体ではなく各テーブルに対してローカルでのみ計算されます。しかし、この値が継承ツリーをまたがる問い合わせを計画する際に誤って参照されたため、デフォルトよりも悪い推定値になる可能性がありました。

  42. パーティションテーブルの行型が他の場所で複合型として使用されている場合、パーティションテーブルの列のデータ型を変更することが禁止されました。 (Tom Lane) (14)(13)(12)(11)(10)
  43. この制限は通常のテーブルでは長い間存在していましたが、見落としによりパーティションテーブルではチェックされていませんでした。

  44. レプリカアイデンティティ(REPLICA IDENTITY) のインデックスの一部である列に対する ALTER TABLE ... DROP NOT NULL が禁止されました。 (Haiying Tang, Hou Zhijie) (14)(13)(12)(11)(10)
  45. 同じ禁止事項はすでに主キーインデックスに存在していました。

  46. ALTER TABLE .. ADD PRIMARY KEY USING INDEX の実行に際して、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Hou Zhijie) (14)(13)(12)(11)
  47. 同時実行中のセッションが、テーブルに主キーがあるかどうかに関する判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。

    パブリケーションしているテーブルの UPDATE で、テーブルに ALTER TABLE で主キーを設定した後であっても、以下エラーが発生する動作が報告されました。

    ERROR:  cannot update table ... because it does not have a replica identity and publishes updates
    
  48. REPLICA IDENTITY インデックスから切り替えを行う際、キャッシュされたテーブルの状態が正しく更新されるようになりました。 (Tang Haiying, Hou Zhijie) (14)(13)(12)(11)(10)
  49. 同時実行中のセッションが、どのインデックスが REPLICA IDENTITY であるかの判定を更新できなかったため、不正なロジカルレプリケーションの動作が発生する可能性がありました。

  50. SP-GiSTインデックス作成で、インデックス対象列のデータ型が演算子クラスの宣言された入力型とバイナリ互換性がある場合でもエラーとなっていたのが修正されました。 (Tom Lane) (14)
  51. このような場合は動作すべきでしたが以下のエラーが発生していました。

    ERROR:  compress method must be defined when leaf type is different from input type
    
  52. 最も古い xmin値を計算する際、並列のバキュームとインデックス同時構築を無視できるようにようになりました。 (Masahiko Sawada) (14)(13)
  53. 並列化されていない処理では既に無視されていましたが、並列化されたロジックでは機能していませんでした。その結果、xmin の限界値の前進が抑えられることで、バキュームのクリーンアップが遅れるなどの望ましくない影響がありました。

  54. 式インデックスを更新するときのメモリリークが修正されました。 (Peter Geoghegan) (14)
  55. 式インデックスを持つテーブルの多くの行を更新する UPDATE 文は、大量のメモリを消費する可能性がありました。

  56. 多数のオブジェクトの所有権を変更する REASSIGN OWNED BY コマンド実行中にメモリリークが発生しないように修正されました。 (Justin Pryzby) (14)(13)(12)(11)(10)
  57. 不要なキャッシュアクセスを回避することにより、ロジカル変更を送信する walsender のパフォーマンスが向上しました。 (Hou Zhijie) (14)(13)
  58. pg_hba_file_rules ビューでの cert認証方式のオプションの表示が修正されました。 (Magnus Hagander) (14)(13)(12)
  59. 認証方式が cert の場合、clientcert=verify-full が暗黙的に指定されますが、pg_hba_file_rules ビューは誤って clientcert=verify-ca と報告していました。

  60. pg_log_backend_memory_contexts() で対象とされるセッションが、結果をサーバのログのみに送信するよう修正されました。 (Fujii Masao) (14)
  61. 以前は、client_min_messages のレベルを高く設定すると、接続しているクライアントにもログメッセージが送信される可能性がありました。これはクライアントが要求していない動作です(そしておそらくワイヤープロトコル違反でした)。

  62. INSERT .. VALUES のルールにおける行全体の変数の表示方法が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  63. 行全体の変数は、var.* として出力されますが、ルールが再ロードされたときに個々の列に展開されるため、異なるセマンティクスとなっていました。これを防ぐために他の場所と同様に明示的なキャストが行われるようになりました。

  64. SQL標準の関数本体を逆コンパイルによって再構築したときに、INSERT ... SELECT 内の関数パラメータが適切に表示されるようになりました。 (Tom Lane) (14)
  65. これまでは、パラメータに名前が付いていても $n と出力されていました。

  66. 空文字列に対して Unicode 文字列正規化を適用する場合の 1バイトのバッファオーバーランが修正されました。 (Michael Paquier) (14)(13)
  67. これによる実際の影響は、アライメントを考慮すれば限定的なものですが、デバッグビルドでは警告が発生していました。

  68. いくつかの誤ったアサートが修正または削除されました。 (Simon Riggs, Michael Paquier, Alexander Lakhin) (14)(13)(12)(11)(10)
  69. これらの誤りは、製品ビルドではなく、デバッグビルドのみ影響を受けました。

  70. libpq と ecpglib でマルチスレッド使用時における gettext() 初期化の競合状態が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  71. エラーメッセージのローカライズに失敗する可能性がありました。

  72. libpq の PQcancel関数から strerror を呼び出さないようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  73. PQcancel はシグナルハンドラから安全に呼び出すことができるはずですが、strerror は安全ではありません。誤った使用法は、サーバへのキャンセルメッセージ送信に失敗した場合にのみ発生しますので、そのためおそらくこれまで報告がありませんでした。

  74. psql の \password コマンドで設定するパスワードは、接続元のユーザのものではなく、CURRENT_USER のものがデフォルトとなりました。 (Tom Lane) (14)(13)(12)(11)(10)
  75. これはドキュメントの動作と一致し、セッション開始後の SET ROLE または SET SESSION AUTHORIZATION を実行した場合に発生し得るパーミッションエラーを避けます。また、混乱を防ぐために操作対象のロール名がパスワードプロンプトに含まれるようになりました。

  76. 親テーブルのトリガを識別するように psql の \d コマンドのクエリが修正されました。 (Justin Pryzby) (14)(13)
  77. パーティションにトリガがあり、親テーブルにも同じ名前の無関係な文レベルトリガが存在した場合、以前のコードでは「ERROR: more than one row returned by a subquery used as an expression」というエラーが発生していました。

  78. psql の \d コマンドで、テーブルの拡張統計オブジェクトが OID でなく名前でソートされるようになりました。 (Justin Pryzby) (14)
  79. psql の列挙型のラベルをタブを使って補完する機能が修正されました。 (Tom Lane) (14)(13)
  80. Windows の標準入力からの読み込みをデータソースまたは宛先に使用したときの障害が修正されました。 (Dmitry Koval, Juan Jose Santamaria Flecha, Michael Paquier) (14)
  81. これは、psql の \copy コマンド、または pg_recvlogical で「-f -」を付けた場合に影響がありました。「could not stat file」エラーが発生しました。

  82. psql や 他のクライアントプログラムでは、Ctrl+C シグナルハンドラからのgettext() 呼び出しを避けるようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  83. この誤りに起因する障害報告は確認されていませんが、gettext() は非同期シグナル安全な関数ではなく、安全とは言えません。

  84. pg_receivewal と pg_recvlogical の初期パスワード入力がキャンセルできるようになりました。 (Tom Lane, Nathan Bossart) (14)(13)(12)(11)(10)
  85. 以前は、パスワード入力を求められている間、Ctrl+C でこれらのプログラムを終了することができませんでした。

  86. pg_dump がユーザ定義キャストをダンプするときの順序が、TYPE の直後、FUNCTION の手前に修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  87. まれに、出力スクリプトがユーザ定義キャストを作成する前に参照してしまう場合がありました。

  88. pg_dump の --inserts と --column-inserts モードが修正され、以前削除された列と生成列の両方を含むテーブルを扱えるようになりました。 (Tom Lane) (14)(13)(12)
  89. pg_dump と pg_basebackup での誤ったエラー報告の可能性が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  90. 以前のコードでは、一部のカーネル呼び出しからのエラーをチェックできず、他のケースでは誤った errno 値を報告する可能性がありました。

  91. char(N) 列に対する contrib/btree_gist のインデックスによるインデックスオンリースキャン結果が修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  92. インデックスオンリースキャンでは末尾の空白が削除された列値が返されましたが、これはインデックス格納方法に起因したもので、想定の動作ではありませんでした。末尾空白の違いだけですが誤った問い合わせ結果です。

    空白埋めをした char(N) 値を格納するようにコードが修正されました。インデックスの動作は REINDEX をしない限りすぐには反映されません。 REINDEX(インデックス再作成)をしない場合、空白が削除された値は、更新を行っていくなかで徐々に置き換えられていきます。インデックスオンリースキャン実行計画を使用しない問い合わせは、どの場合でも影響を受けません。

  93. postgres_fdw の非同期クエリの処理における稀なケースが修正されました。 (Etsuro Fujita) (14)
  94. これらのエラーは、外部テーブルのスキャンを並列化しようとすると、クラッシュまたは誤った問い合わせ結果を引き起こす可能性がありました。

  95. PL/Pythonの ビルド方法を決定するために、非推奨の distutils モジュールではなく、Python の sysconfig モジュールを使用するように configure が変更されました。 (Peter Eisentraut, Tom Lane, Andres Freund) (14)(13)(12)(11)(10)
  96. これにより Python 3.10 では distutils が非推奨になり Python 3.12 での削除が予定されている configure-time の警告が回避されます。 おそらく、Python 3.12 以降では configure --with-python は完全に失敗します。

    sysconfig が Python 2.7 より前、また、Python 3.2 より前にも存在しなかったため、古くなった Python バージョンでの PL/Python のビルドはもはやできなくなります。

  97. OpenSSL なしでクロスコンパイルが再度可能となりました。 (Tom Lane) (14)
  98. configure ではターゲットシステムで /dev/urandom が使用可能であるはずと想定すべきでしたが、代わりに configure が失敗していました。

  99. Windows 環境で Perl 5.28 以降を使用する PL/Perl コンパイルの失敗が修正されました。 (Victor Wagner) (14)(13)(12)(11)(10)
  100. Python 3.11 以降での PL/Python コンパイルの失敗が修正されました。 (Peter Eisentraut) (14)(13)(12)(11)(10)
  101. Visual Studio 2022 を使用したビルドがサポートされました。 (Hans Buschmann) (14)(13)(12)(11)(10)
  102. MSVC ビルドシステムで .bat ラッパースクリプトを事前にディレクトリに移動することなく呼び出せるようになりました。 (Anton Voloshin, Andrew Dunstan) (14)(13)(12)(11)(10)

PostgreSQL 14.1、13.5、12.9、11.14、10.19 (2021年11月11日リリース)の変更点

  1. PostgreSQLサーバが SSL暗号化または GSS暗号化においてハンドシェイクが完了するまでは外来データを拒絶するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)(9.6)
  2. これまで TCP接続にデータを挿入できる中間者は、暗号化で保護されているはずのデータベースセッションの冒頭に平文データを投入可能でした。サーバが認証データを要求してこない場合(例えば SSL証明書認証のみを使っている場合)に限られますが、これを悪用して偽の SQLコマンドをサーバに送ることができました。(CVE-2021-23214)

  3. libpq が SSL暗号化または GSS暗号化のハンドシェイクが完了する前は、外来データを拒絶するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)(9.6)
  4. これまで TCP接続にデータを挿入できる中間者は、暗号化で保護されているはずのデータベースセッションの冒頭に平文データを投入可能でした。libpq の問い合わせ応答以外の細かい振る舞いのために実現は容易ではありませんが、これを悪用してクライアントの最初の問い合わせに偽の応答を挿入することがおそらく可能でした。別の攻撃は、セッションの初期に送られたクライアントのパスワードやその他の機微データを抜き出すことです。これは前項のサーバ側脆弱性と組み合わせて可能となります。(CVE-2021-23222)

  5. 物理レプリケーションで、プライマリが部分的な WALレコードで終わっているWALセグメントを渡した後にクラッシュした場合について、修正されました。 (Álvaro Herrera) (14)(13)(12)(11)(10)(9.6)
  6. ダウンするプライマリが不完全な WALレコードの残りを書き込み完了できなかった場合、以前のクラッシュリカバリロジックでは、それをバックアップして、不完全な WALレコードの最初から WAL を上書きしました。スタンバイサーバは既にその WALセグメントのコピーを持っているかもしれないので、これは問題がありました。不整合な次セグメントに遭遇して、手動の介入なしにはリカバリできないことになりました。

    本障害により、更新処理を実行中のプライマリのクラッシュ後にスタンバイがレプリケーション継続できなくなる可能性があり、対処策はスタンバイで WALファイルを手動削除して再起動することでした。

    クラッシュ後の再起動時に WALセグメント境界を越えたバックアップをしないように修正されました。その代わりに、次の WALセグメントの始めに新しいタイプ(OVERWRITE_CONTRECORD)の WALレコードを書いて、不完全な WALレコードは無視しなければならないことを知らせるようになりました。

    この修正を適用する場合、新しい WALレコードタイプが生じるようになるため、プライマリより先にスタンバイサーバをアップデートするのが良いです。

  7. 並列VACUUM がインデックスを取りこぼさないように修正されました。 (Peter Geoghegan, Masahiko Sawada) (14)
  8. テーブルが min_parallel_index_scan_size を上回る 2つ以上のインデックスを持つ場合に、並列VACUUM が min_parallel_index_scan_size を下回るインデックスを処理していませんでした。この結果、これらのインデックスは VACUUM で除去済みのヒープ上のエントリに対する参照を持つことになって、破損した状態となる可能性があります。

    この問題は並列VACUUM を行わない autovacuum には影響しません。発生条件に該当する、サイズの大小が異なる複数のインデックスを持っていて手動VACUUM を行ったことがあるテーブルについて、REINDEX を行うことが推奨されます。

  9. CREATE INDEX CONCURRENTLY が直近の準備されたトランザクションを待つように修正されました。 (Andrey Borodin) (14)(13)(12)(11)(10)(9.6)
  10. 準備されたトランザクションから直近に挿入された行が、新たなインデックスから無視されるかもしれませんでした。その結果、インデックスに依存する問い合わせが、その行を取りこぼすおそれがありました。

    この問題に対する以前の修正は、CREATE INDEX CONCURRENTLY が検査したときに進行中の PREPARE TRANSACTIONコマンドを考慮できていませんでした。max_prepared_transactions > 0 の準備されたトランザクション(二相コミット)が有効なサーバでは、CONCURRENTLY指定で作成されたインデックスを全て REINDEXすることが推奨されます。

  11. 同時作成をしているインデックスで、新たな行に対するエントリ追加の失敗を引き起こす可能性のある競合状態が回避されました。 (Noah Misch, Andrey Borodin) (14)(13)(12)(11)(10)(9.6)
  12. これにより破損したインデックスが生じる可能性があります。実際には稀にしか発生しないとみられますが、この誤りは潜在的に CONCURRENTLY指定を付けたあらゆるインデックス構築または再構築に影響する可能性があります。同時作成したインデックスの全てを REINDEXすることが推奨されます。

  13. 対象インデックスに付加された演算子クラスのパラメータを維持するようにREINDEX CONCURRENTLY が修正されました。 (Michael Paquier) (14)(13)
  14. REINDEX CONCURRENTLY 実行後にデフォルトパラメータになってしまう現象が発生していました。

  15. 組込オブジェクト以外を含んだデータベースを複製するときの共有依存関係の誤作成が修正されました。 (Aleksander Alekseev) (14)
  16. データベースの複製は、テンプレートデータベースから新たなデータベースを作成するとき行われます。本誤動作の結果 pg_shdepend の内容が不正になります。原理的には本障害でオブジェクトを所有しているロールが削除可能になってしまう可能性がありますが、本障害の実際の影響は限定的と考えられます。

  17. パーティションテーブルにアタッチあるいはデタッチしているテーブルについて、リレーションキャッシュが確実に無効化されるようになりました。 (Amit Langote, Álvaro Herrera) (14)(13)(12)(11)(10)
  18. 本障害により、アタッチ/デタッチの後に既存のセッションからそのパーティションに対する直接の挿入/更新を行ったときに、アタッチ/デタッチ操作がリレーションキャッシュに反映されていないことによる、不適切な制約の適用等の誤動作を起こす可能性がありました。

  19. 範囲型の作成時にパースツリーが破損する障害が、修正されました。 (Alex Kozhemyakin, Sergey Shinderuk) (14)
  20. CREATE TYPE がパースツリーの要素を誤って解放していて、続くイベントトリガや CREATE TYPE コマンドがプランキャッシュに格納されて後に再使用される場合に、(クラッシュや予期せぬエラー等の)問題が起きる可能性がありました。

  21. 複合型のドメインの配列の要素の更新について修正されました。 (Tom Lane) (14)(13)(12)(11)
  22. 「UPDATE tab SET fld[1].subfld = val」のようなコマンドが、配列要素が複合型ではなく複合型のドメインである場合に失敗して、クラッシュや誤った更新結果を引き起こしました。

    (障害発生例/クラッシュが生じる)
    db=# CREATE TYPE typ11 AS (subfld1 int, subfld2 int);
    db=# CREATE DOMAIN dom11 AS typ11 NOT NULL;
    db=# CREATE TABLE tbl11 (id int, fld dom11[]);
    db=# INSERT INTO tbl11 VALUES (1, '{"(1,2)","(3,4)"}'::dom11[]);
    db=# UPDATE tbl11 SET fld[1].subfld1 = 1;
    server closed the connection unexpectedly
    
  23. FETCH FIRST WITH TIES と FOR UPDATE SKIP LOCKED の組み合わせが禁止されました。 (David Christensen) (14)(13)
  24. FETCH FIRST WITH TIES は同順位でない行を見つけるまで停止しないため、返すべき行数に加えてもう 1行を取り出す必要があります。また、現在の実装では FOR UPDATE が使われた場合は返さない行についてもロックを取得します。その結果、SKIP LOCKED オプションが指定された場合に望ましくない振る舞いが生じました。当面の対処として、この組み合わせが禁止されました。

    以下の動作例では id=3 の行が応答に登場しない結果となります。

    (望ましくない動作の例)
    db=# CREATE TABLE t12 (id int, n int);
    db=# INSERT INTO t12 VALUES (1,10),(2,10),(3,30),(4,40);
    db=# BEGIN;
         SELECT * FROM t12 ORDER BY n FETCH FIRST ROW WITH TIES FOR UPDATE SKIP LOCKED;
     id | n
    ----+----
      1 | 10
      2 | 10
    (2 rows)
    
    (別セッションで以下を実行)
    db=# SELECT * FROM t12 ORDER BY n FETCH FIRST ROW WITH TIES FOR UPDATE SKIP LOCKED;
     id | n
    ----+----
      4 | 40
    (1 row)
    
  25. ALTER INDEX .. ALTER COLUMN .. SET (..) でのオプション指定が禁止されました。 (Nathan Bossart, Michael Paquier) (14)(13)
  26. これまでパーサが受け付けていて、ALTER TABLE の場合と同じパラメータが指定可能でしたが、これは文書記載がなく、実際には機能しない一方、オプションを付与するとその列やテーブルの削除ができなくなりました。

  27. numeric型の power() 関数で稀な場合の精度損失が修正されました。 (Dean Rasheed) (14)(13)(12)(11)(10)(9.6)
  28. 第一引数が 1 に非常に近い場合に不正確な結果が生じる可能性がありました。「^」演算子の左辺が 1 に近い場合についても同様に該当します。

  29. Memoizeプランでハッシュ等価演算子の誤選択が回避されました。 (David Rowley) (14)
  30. 本障害により、クラッシュまたは誤った問い合わせ結果が生じるおそれがありました。

  31. 副問い合わせの式を関数にプルアップする際のプランナエラーが修正されました。 (Tom Lane) (14)(13)
  32. FROM にある関数が FROM句の副問い合わせの出力をラテラル参照する場合で、副問い合わせを外側の問い合わせに平坦化が可能である場合、関数の式へコピーされた式は完全には処理されませんでした。その結果、プランの実行時にクラッシュを引き起こすおそれがありました。

    (本障害でクラッシュを起こす問い合わせの例)
    db=# SELECT * FROM (
           SELECT jsonb_path_query_array(mod->'lecs', '$[*]') AS lec
             FROM unnest(array['{"lecs": [{"id": "1"}]}'::jsonb]) AS um(mod)) AS ss,
               jsonb_to_recordset(ss.lec) AS j (id text);
    
  33. 列の範囲の見積に不完全な MCV のみのプランナ統計情報を信用して使わないように修正されました。 (Tom Lane) (14)(13)(12)(11)(10)
  34. ANALYZE で稀に MCV(most-common-values、最頻値)リストが作られてヒストグラムは作られないことがあります。このような場合、MCVリストのみでデータ全体をあらわせそうな場合に限って、MCVリストのみで列値の範囲を見積をするようになりました。

  35. サブトランザクション内でのポータルのスナップショット復旧について修正されました。 (Bertrand Drouvot) (14)(13)(12)(11)
  36. プロシージャがあるトランザクションをコミットやロールバックして、その次の明示的な動作が新たなサブトランザクション内である場合にスナップショット管理を誤っていました。その結果、不正なポインタが生じて、クラッシュを引き起こす可能性がありました。

    典型的には PL/pgSQL で以下のような処理を行う場合に該当します。

      FOR i IN 1..100 LOOP -- 何らかのループ
        BEGIN 
          {問い合わせを実行}
        EXCEPTION
          {条件に応じて COMMIT や ROLLBACK を実行してループを継続}
        END;
      END LOOP;
    
  37. スナップショットのエクスポート後にトランザクションが失敗した場合に、正しくクリーンアップするようになりました。 (Dilip Kumar) (14)(13)(12)(11)(10)(9.6)
  38. この誤りは、同じセッションがスナップショットを再びエクスポートしようとした場合に限って問題を引き起こします。ありそうな該当シナリオは、レプリケーションスロットを作成して、それが何らかエラーで失敗して、その後に続けて他のレプリケーションスロットを作成しようとすることです。

    予期せぬ「ERROR: clearing exported snapshot in wrong transaction state」が発生する動作が報告されました。

  39. スタンバイサーバでオーバーフローしたサブトランザクション追跡の周回を防止しました。 (Kyotaro Horiguchi, Alexander Korotkov) (14)(13)(12)(11)(10)(9.6)
  40. この誤りにより、スタンバイサーバで顕著な性能低下をもたらすおそれがあります。該当した場合、SubtransSLRU についての過大な処理量がはっきり現れました。

  41. スタンバイサーバの昇格中に、(二相コミット機能の)準備されたトランザクションが適切に考慮されるようになりました。 (Michael Paquier, Andres Freund) (14)(13)(12)(11)(10)(9.6)
  42. 同時実行中のセッションが取得したスナップショットで、準備されたトランザクションが省略される可能性がある限られた時間帯がありました。その後、そのセッションがスナップショットを使用してデータを更新すると、誤った結果やデータの破損が発生する可能性がありました。

  43. EXPLAIN が WorkTableScanノードにアタッチされたフィルタ条件を表示しようとした時の予期せぬエラーが修正されました。 (Tom Lane) (14)
  44. CTE (WITH句)を伴う問い合わせの EXPLAIN で、以下のエラーが出る動作が報告されました。

    ERROR:  could not find RecursiveUnion for WorkTableScan with wtParam 0
    
  45. ALTER INDEX コマンドを使ってテーブルの名前を変更する際に、正しいロックレベルを使用するように修正されました。 (Nathan Bossart, Álvaro Herrera) (14)(13)(12)
  46. 歴史的な理由から、ALTER INDEX ... RENAME はあらゆる種類のリレーションに適用できます。インデックス名を変更するのに必要なロックレベルは、テーブル等その他のリレーション名を変更する場合より低いのですが、ALTER INDEX を使った場合には対象がインデックス以外であっても、誤って低いロックレベルが使用されていました。

    (誤動作例)
    db=# CREATE TABLE t24a (id int);  CREATE TABLE t24b (id int);
    db=# BEGIN;
    db=*# ALTER TABLE t24a RENAME TO t24x;
    db=*# ALTER INDEX t24b RENAME TO t24y;
    db=*# ^Z
    
    (別セッションでロックを確認)
    db=# SELECT relation::regclass, locktype, mode FROM pg_locks WHERE relation IS NOT NULL;
     relation | locktype |           mode
    ----------+----------+--------------------------
     pg_locks | relation | AccessShareLock
     t24b     | relation | ShareUpdateExclusiveLock
     t24a     | relation | AccessExclusiveLock
    (3 rows)
    
  47. オブジェクトとそのオブジェクトを所有するロールが並行して同時に削除された場合に null-pointer-dereference によるクラッシュが発生することがあり、回避されました。 (Álvaro Herrera) (14)(13)(12)(11)(10)(9.6)
  48. lo_export() または関連する関数が失敗した場合のスナップショット参照のリーク警告が防止されました。 (Heikki Linnakangas) (14)(13)(12)(11)(10)(9.6)
  49. 以前は下記のようなメッセージが出力されましたが、実際のリークはほとんど害のないものでした。

    WARNING:  Snapshot reference leak: Snapshot 0x5634afd61cb8 still referenced
    
  50. CoerceToDomain式ノードの非効率なコード生成が修正されました。 (Ranier Vilela) (14)(13)
  51. 本修正は DOMEIN型の列に値を投入したり、DOMAIN型に型キャストする場合のエグゼキュータ処理を効率化します。

  52. いくつかのリスト操作で O(N^2) の動作が回避されるようになりました。 (Nathan Bossart, Tom Lane) (14)(13)
  53. これにより、 (1)プライマリ上で多数の排他ロックを保持しているトランザクションをスタンバイでリプレイする場合、 (2)チェックポイント後に削除(unlink)されることになっているファイルが多数ある場合、 (3)ハッシュ集約に多くのバッチ(ディスク書き出し)が含まれる場合、 (4)pg_trgm が複雑な正規表現からインデックス可能な条件を抽出する場合、を含むいくつかのシナリオで処理速度低下が修正されました。

    これらのうち、実際にユーザから報告されたのは (1) だけですが、それ以外も非効率なリスト削除により該当すると見られます。

  54. B-tree のポスティングリスト分割に関する防御的な検査が追加されました。 (Peter Geoghegan) (14)(13)
  55. この変更により、テーブルの TID の重複を含むインデックスの破損を検出できるようになります。

  56. BRIN の float8 または float4 の minmax_multi_ops インデックスにNaN を挿入する時のアサート失敗が回避されました。 (Tomas Vondra) (14)
  57. アサートを無効にした実運用むけビルドにおいては、このような場合、いくらか非効率的ですが間違ってはいないインデックスになります。

  58. 自動VACUUM のランチャープロセスが pg_log_backend_memory_contexts() の要求に対してより迅速に応答できるようになりました。 (Koyu Tanigawa) (14)
  59. これまで数秒を要することがありました。

  60. 認証処理で使われる HMACハッシュ計算におけるメモリリークが修正されました。 (Sergey Shinderuk) (14)
  61. shared_memory_type が sysv の場合、huge_pages を on に設定することが禁止されました。 (Thomas Munro) (14)(13)(12)
  62. 以前はこの設定は受け入れられていましたが、実装がないため何もしませんでした。

  63. PL/pgSQL の RETURN QUERY文における、クエリ型のチェックが修正されました。 (Tom Lane) (14)
  64. RETURN QUERY は、UPDATE RETURNING のようにタプルを返すことができる任意のクエリを受け入れるべきです。 v14 では誤って SELECT 以外のものを禁止していました。さらに、可変の RETURN QUERY EXECUTE では、クエリ型チェックがまったく適用されていませんでした。

  65. 大域的でないデフォルト権限を正しくダンプするように、pg_dump が修正されました。 (Neil Chen, Masahiko Sawada) (14)(13)(12)(11)(10)(9.6)
  66. 大域的な(限定なしの)ALTER DEFAULT PRIVILEGES コマンドが関数の EXECUTE などデフォルトである権限を取り消した後、限定付きの ALTER DEFAULT PRIVILEGES コマンドが選択されたロールやスキーマに対してその権限を再び付与した場合、pg_dump は制限付きの権限付与を正しくダンプできませんでした。

  67. ダンプされるパーティションテーブルに対して、pg_dump が共有ロックを取得するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)
  68. pg_dump が子のパーティションのいずれかをロックすれば、パーティションテーブル自体に対する重要な DDL を防ぐのに十分であるためこの見落としはたいていの場合は無害なものでしたが、関連するロックが保持されないため、子のないパーティションテーブルをダンプするときに問題が発生する可能性がありました。

  69. PostgreSQL 8.3 より前のサーバからトリガ定義をダンプしようとした際のpg_dump のクラッシュが修正されました。 (Tom Lane) (14)(13)(12)(11)
  70. pg_restore の無効なラージオブジェクトの TOCファイルに関するエラーメッセージ中の誤ったファイル名が修正されました。 (Daniel Gustafsson) (14)(13)(12)(11)(10)(9.6)
  71. 以前は以下のようなファイル名が空のエラーメッセージが表示されていました。

    pg_restore: error: invalid line in large object TOC file "": ..
    
  72. ソケットレベルの障害発生後、pgbench がゼロ以外のステータスで終了するようになりました。 (Yugo Nagata, Fabien Coelho) (14)(13)(12)
  73. 望ましい動作は実行を完了した後、ステータス 2 で終了することで、そのように修正されました。また、ソケットレベル障害のエラー報告が修正されました。

  74. pg_amcheck が一時的なリレーションや、無効または準備ができていないインデックスをチェックしないようにしました。 (Mark Dilger) (14)
  75. これにより、ほぼ確実に矛盾しているように見える、役に立たないリレーションのチェックが回避されます。

  76. contrib/amcheck がスタンバイサーバで実行される際に、UNLOGGEDテーブルをスキップするようになりました。 (Mark Dilger) (14)
  77. このようなテーブルは空になりますし、UNLOGGEDインデックスもすでにスキップするようになっているため、このようにするのが適切です。

  78. pg_stat_statements が最大 1GB 単位でクエリテキストファイルを読み込むようになりました。 (Tom Lane) (14)(13)(12)(11)(10)(9.6)
  79. 2GB 以上のファイルを一度に読み込もうとするとすると失敗する可能性があるため、複数回に分けて読み込むようになりました。

  80. postgres_fdw がデータ変換エラーを報告しようとする際に発生しうる NULLポインタのクラッシュが修正されました。 (Tom Lane) (14)(13)(12)(11)(10)(9.6)
  81. 内部実装の関数 GetSharedSecurityLabel() が、クリティカルなリレーションキャッシュエントリがまだ構築されていない新たに開始したセッションでも使用できるようになりました。 (Jeff Davis) (14)(13)(12)(11)(10)(9.6)
  82. (サードパーティモジュール以外で)影響があるのは contrib/sepgsql のみです。

  83. TAPテストを実行する際、モジュール自体のディレクトリを PATH に含めるようになりました。 (Andrew Dunstan) (14)
  84. これによりインストールされていないプログラムを検出できるようになりました。

  85. Windows のタイムゾーン名を IANAタイムゾーンに割り当てるのにCLDRプロジェクトのデータを利用するようになりました。 (Tom Lane) (14)(13)(12)(11)(10)(9.6)
  86. initdb は新たなクラスタのタイムゾーンパラメータに、システムのタイムゾーンに対応した IANAタイムゾーンを設定しようとします。これまで Windows で利用していたマッピングテーブルは何年も前に生成され、更新も散発的にしか行われないため、エラーが含まれていたり、最近追加されたゾーンが存在していなかったりと問題がありました。既存インストレーションには影響はなく、新しく初期化されたデータベースクラスタにのみ影響します。

  87. タイムゾーンデータファイルが tzdata release 2021e に更新されました。 (14)(13)(12)(11)(10)(9.6)
  88. フィジー、ヨルダン、パレスチナ、サモアで夏時間法が変更され、バルバドス、クック諸島、ガイアナ、ニウエ、ポルトガル、トンガの歴史的修正が行われています。

    また、Pacific/Enderbury は Pacific/Kanton に名称変更されました。また、Africa/Accra、America/Atikokan、America/Blanc-Sablon、America/Creston、America/Curacao、America/Nassau、America/Port_of_Spain、Antarctica/DumontDUrville、Antarctica/Syowa の各ゾーンは、近くのより人口の多いゾーンに統合されました。これらの名前はエイリアスとして残されています。

  89. float4 と float8 のハッシュ関数が NaN に対して均一の結果を生成するように修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  90. PostgreSQL は浮動小数点型は全ての NaN が等しいと見なすため、ハッシュ関数が IEEE 754 規格に従って NaN である全てのパターンに対して同じハッシュコードを生成することが重要です。今までそれができていなかったため、ハッシュインデックスやハッシュを伴った実行計画で、正規化されていない NaN値('-NaN'::float8 など)に対して、誤った問い合わせ結果がもたらされるおそれがありました。

    このような NaN値が含まれる可能性がある場合には、浮動小数点型の列に対するハッシュインデックスを再作成することが推奨されます。

  91. wal_level が minimal に設定されている時 CREATE TABLESPACE のクラッシュリカバリでのデータ損失が防止されました。 (Noah Misch) (13)(12)(11)(10)(9.6)
  92. CREATE TABLESPACE から次のチェックポイントまでの間にサーバがクラッシュした場合、クラッシュリカバリが実施されても完全にデータが復元されない可能性がありました。wal_level が minimal 以外の場合には該当しません。

  93. パーティションテーブルがパブリケーションへ追加もしくは削除される際に、全てのパーティションのリレーションキャッシュが無効化されるようになりました。 (Hou Zhijie, Vignesh C) (13)
  94. 無効化が行われていなかったことによって、既存セッションでロジカルレプリケーションが誤動作を起こす可能性がありました。

  95. FOR ALL TABLES と指定されたパブリケーションを作成もしくは削除する際に、リレーションキャッシュが無効化されるようになりました。 (Hou Zhijie, Vignesh C) (13)(12)(11)(10)
  96. 無効化が行われていなかったことによって、既存セッションでロジカルレプリケーションが誤動作を起こす可能性がありました。

  97. 修飾子が指定されていない同じ型へのキャストを破棄しないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  98. 例えば、numeric(18,3) と定義されている f1列の場合、パーサは f1::numeric の様なキャストを実行時には影響がないという理由で破棄していました。しかし、外側にあらわれる型は、numeric(18,3) ではなく numeric であるべきです。これは再帰的な UNION など、より大きな構造の型を正しく解決するために重要です。

    (ビュー定義で型キャストが無視される誤動作例)
    db=# CREATE TABLE t51 (f1 numeric(18, 3));
    db=# CREATE VIEW v51 AS SELECT f1::numeric AS n1 FROM t51;
    db=# \d+ v51
                                    View "public.v51"
     Column |     Type      | Collation | Nullable | Default | Storage | Description
    --------+---------------+-----------+----------+---------+---------+-------------
     n1     | numeric(18,3) |           |          |         | main    |
    View definition:
     SELECT t51.f1 AS n1
       FROM t51;
    

    旧動作が誤っていると考えられますが、非互換性を含む修正となります。

  99. 現在のデータベースエンコーディングがサポートしていない ICU照合順序は作成できないようになりました。 (Tom Lane) (13)(12)(11)(10)
  100. これまでは作成はできていましたが、実際には照合順序は使用できず、削除することもできない状態となっていました。

  101. {0} 内の括弧をキャプチャする際の正規表現エラーを回避するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  102. (.){0}...\1 の様な正規表現において、間違った後方参照番号が引き出され、下記のようなエラーやクラッシュ、アサート失敗が生じる可能性がありました。エラーを発生させずに後方参照がマッチしないと判断するように修正されました。

    ERROR:  invalid regular expression: invalid backreference number
    ERROR:  invalid regular expression: quantifier operand invalid
    
  103. 正規表現の後方参照が、本来マッチすべきでない時にマッチしてしまうのを防ぐようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  104. 正規表現エンジンは部分的なマッチを拒否した後のキャプチャした括弧のマッチデータ排除に関して不注意でした。これにより、定義された参照先がないために失敗するはずの場所で、後方参照が一致する可能性がありました。

    (誤動作例)
    db=# select 'abcdef' ~ '^(.)\1|\1.';
     ?column?
    ----------
     t
    (1 row)
    
    (先頭で同文字が連続していないので部分マッチせず、全体としても f になるのが正しい)
    
  105. 反復ノード内の後方参照による正規表現の性能上のバグが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  106. 後方参照のロジックが正しくなく、必要以上に時間を要する箇所がありました。幸いなことに、この問題はほとんどの場合に他の最適化によって顕在化することがありませんでした。

  107. タイムゾーン付きの時刻を AT TIME ZONE に適用した際に、間違った結果を返す問題が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  108. 動的な TZ 略語でゾーンが指定されている場合に誤った問い合わせ結果が生じる可能性があります。

    (報告された誤動作例、CLT は -03 または夏時間で -04)
    db=# SELECT '12:34 -02'::timetz AT TIME ZONE 'CLT';
         timezone
    -------------------
     09:51:14-04:42:46
    (1 row)
    
  109. PlaceHolderVars の継承子テーブルへの転換の誤りが修正されました。 (Tom Lane) (13)(12)
  110. PlaceHolderVars は内部実装上のデータ構造です。この誤りにより、パーティションテーブルや継承テーブルを外部結合の外側(無ければ NULL になる側)に持つ問い合わせで、アサート失敗や実行計画の異常が生じる可能性がありました。実際の問題発生は稀であると考えられます。

  111. バックグラウンドワーカが LISTEN を実行できないようになりました。 (Tom Lane) (13)
  112. 実行するための基盤が無いため、実行されてしまうと単に NOTIFY によるキューのクリーンアップを妨げる結果となります。

  113. 他のバックエンドへの NOTIFY シグナル送信をトランザクションコミットの時に行うようになりました。 (Artur Zakirov, Tom Lane) (13)
  114. この変更によってプロシージャ内の COMMIT 直後に通知を送信できるようになりました。また、ロジカルレプリケーションワーカが通知を送信できるようになりました。これまではアイドル状態にならないと送信されず、これらのことができませんでした。

  115. WITH HOLD オプションによって前トランザクションから保留されている NO SCROLL指定のカーソルの巻き戻しを、拒否するようになりました。 (Tom Lane) (13)(12)(11)
  116. 長い間 NO SCROLL カーソルを逆方向にフェッチすることは禁止されていましたが、歴史的背景により、クエリを完全に巻き戻してから再度フェッチすることは禁止されていませんでした。この例外は、特に巻き戻しに必要なデータを全て保持していない可能性のある保留されたカーソルの場合には不整合を引き起こしました(クラッシュが報告されています)。最悪のケースを防ぐためにスクロールできない保留されたカーソルの巻き戻しを禁止するようになりました。

    非互換性を含む修正となります。

  117. WITH HOLD カーソルをトランザクション終了時点で保存するときに、既にカーソルが読み込み完了していた場合に、失敗しないように修正されました。 (Tom Lane) (13)(12)(11)
  118. クラッシュが生じる動作が報告されました。

  119. 許可された最大長に増大したリレーションの検出が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  120. これまでも 2^32 - 1 ブロックという最大長を超えてテーブルやインデックスを拡張する試みはストレージ処理の段階で拒絶されました。しかし、不整合な内部状態を防ぐにはより早い検知が必要で、バッファマネージャにおいてエラーを出すようになりました。

    アサート失敗が報告されました。

  121. DO INSTEADルールを展開するときに、データ変更を伴う CTE(WITH句)の存在を確認するようになりました。 (Greg Nancarrow, Tom Lane) (13)(12)(11)(10)(9.6)
  122. これが行われなったため、安全でないパラレルプラン選択などの問題が生じるおそれがありました。ルールが適用される問い合わせの実行時に「ERROR: cannot assign XIDs during a parallel operation」が生じる動作が報告されました。

    これからは、データ変更を伴う CTE を持つ問い合わせには DO INSTEDルールの適用はできず、そのことを示すエラーになります。

    (修正後の振る舞い例)
    db=# CREATE TABLE t63a (i int);
    db=# CREATE TABLE t63b (i int);
    db=# CREATE RULE r63a AS ON INSERT TO t63a DO INSTEAD
           INSERT INTO t63b SELECT NEW.i;
    db=# WITH cte1 AS (DELETE FROM t63a RETURNING *)
           INSERT INTO t63a SELECT * FROM cte1;
    ERROR:  INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH
    
  123. 拡張統計情報オブジェクトへの権限のない操作に対する誤ったパーミッションエラー報告が修正されました。 (Tomas Vondra) (13)(12)(11)(10)
  124. 以前は意図したメッセージではなく以下のようなキャッシュルックアップエラーが出力されていました。

    ERROR:  cache lookup failed for type 27447
    
  125. 並列ワーカの誤ったスナップショット処理が修正されました。 (Greg Nancarrow) (13)(12)(11)(10)
  126. 以前はトランザクション分離レベルが REPEATABLE READ よりも低かった場合、パラレルクエリで誤動作をすることがありました。

    アサート失敗が報告されました。

  127. 一時テーブルの TOASTテーブル変更を適切に無視するように、ロジカルデコーディングが修正されました (Bertrand Drouvot) (13)(12)(11)
  128. ロジカルデコーディングは、ALTER TABLE によるヒープ書き換えなどで作られる一時テーブルの変更を通常は無視しますが、関連する TOASTテーブルについてそのようになっていませんでした。

    これにより、パブリッシュされたテーブルを ALTER TABLE すると、その後で予期せぬエラーが生じることがありました。

  129. TOASTデータを正しく処理するために論理デコーディングのメモリ使用量計算が修正されました。 (Bertrand Drouvot) (13)
  130. アサート失敗やクラッシュを引き起こす可能性がありました。

  131. walreceiverプロセスが、終了する前に全ての必要なアーカイブ通知ファイルを 作成するのを保証するようになりました. (Fujii Masao) (13)(12)(11)(10)(9.6)
  132. 通知ファイルとは archive_status ディレクトリ下に作られる.ready や .done のサフィックスを持ったファイルです。

    これまで walreceiver はちょうど WALセグメント境界で終了した場合、最後に受信したセグメントの通知ファイル作成に失敗していました。その結果、スタンバイでセグメントをアーカイブするのが遅れていました.

  133. バックアップマニフェスト生成における WAL範囲の計算が、タイムライン変更が伴う場合について修正されました。 (Kyotaro Horiguchi) (13)
  134. 昇格直後のベースバックアップがpg_veryfybackup で失敗するケースが報告されていました。

  135. SELECT .. FOR UPDATE を使うルールで疑似リレーション OLD、NEW にロック処理を行わないように修正されました。 (Masahiko Sawada, Tom Lane) (13)(12)(11)(10)(9.6)
  136. OLD や NEW を指定して SELECT .. FOR UPDATE を行うルールの実行で予期せぬエラーやクラッシュが生じていました。

  137. 集約の FILTER句のパーサ処理が修正されました. (Tom Lane) (13)(12)(11)(10)(9.6)
  138. FILTER式が単純な boolean型の列の場合に、誤った意味解釈が行われて仕様外の動作(即ち、誤った問い合わせ結果)が生じる可能性がありました。また、FILTER式自体が boolean型を返す集約である場合にはエラーを出すべきですが、そのようになっておらず、実行時にクラッシュを起こすことがありました。

    (修正前バージョンでの障害発生例)
    db=# CREATE TABLE t71 (i int, b boolean);
    db=# INSERT INTO t71 VALUES (1, 't'),(2, 't'), (3, 'f');
    db=# SELECT (SELECT max(0) FILTER (WHERE b IS TRUE)) FROM t71;
     max
    -----
       0
    (1 row)
    
    db=# SELECT (SELECT max(0) FILTER (WHERE b)) FROM t71; -- 誤動作する
     max
    -----
       0
       0
    
    (3 rows)
    
    db=# SELECT (SELECT array_agg(z.b) FILTER (WHERE bool_or(z.i > 0))
           FROM t71) FROM t71 z; -- クラッシュする
    server closed the connection unexpectedly
    
  139. ALTER TYPE/DOMAIN/OPERATOR .. SET が拡張のメンバシップを変更しないように修正されました。 (Tom Lane) (13)
  140. 拡張のスクリプトで実行された ALTER .. SET は、ターゲットとなるオブジェクトが拡張のメンバになっていなかった場合に、それを拡張のメンバにしてしまうことがありました。

    拡張のスクリプトがその拡張に属さないオブジェクトにアクセスする理由はほとんど無いため、これ自体は大きな問題はありません。しかし、ALTER TYPE .. SET はその型に依存するドメインにも再帰的に効果を及ぼすため、それらも拡張のメンバになり、拡張のアップグレードスクリプトで望まない副作用を引き起こしました。

  141. LLVM 内でのエラー後に LLVM状態のクリーンアップを試みないように修正されました。 (Andres Freund, Justin Pryzby) (13)(12)(11)
  142. これにより、致命的な LLVM のエラーが起きた後にバックエンドが終了する際に起こりうるクラッシュを防止します.

  143. SP-GiSTインデックスのスキャンが統計ビューでカウントされることを保証するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  144. SP-GiST のコードでは、タプルのカウンタは正しく進む一方で、インデックススキャン回数の加算が欠落していました。

  145. リカバリ中に recovery_min_apply_delay が変更された場合には、関連する待機間隔を再計算するようになりました。 (Soumyadeep Chakraborty, Ashwin Agrawal) (13)(12)(11)(10)(9.6)
  146. これにより設定変更が直ぐに効くようになります。

  147. simplehash.h のハッシュテーブルが 2^32 要素を超えた場合に無限ループになる誤りを修正しました. (Yura Sokolov) (13)(12)(11)(10)
  148. これは数百GB の work_mem が設定されていない限り顕在化しないため、実際には発生していなかったものと見られます。

  149. ANALYZE実行における拡張統計の計算中のメモリ使用量が削除されました。 (Justin Pryzby, Tomas Vondra) (13)(12)(11)(10)
  150. AIX において libpq の関数が欠落しており、修正されました。 (Tony Reix) (13)
  151. コード再編成の誤りで以下のドキュメント記載された関数がエクスポートされていませんでした。

      pg_encoding_to_char()
      pg_utf_mblen()
      pg_char_to_encoding()
      pg_valid_server_encoding()
      pg_valid_server_encoding_id()
    
  152. 接続を試みている途中で malloc() に失敗してもエラー後に正しく回復できるように、ecpg が修正されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  153. ecpg を使うクライアントで pthread の mutex が残ったままになっていて、リソースリークやデッドロックを起こす恐れがありました。

  154. PL/pgSQL の CALL文の引数で呼ばれる STABLE の関数を誤って評価していたものが修正されました。 (Tom Lane) (13)(12)(11)
  155. 静的関数は古いスナップショットを使って呼ばれており、そのため、セッションのトップレベルコマンドの開始後に行われたデータベースの変更が見えていませんでした。

  156. PL/pgSQL で最も外側のブロックからの EXIT が可能になりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  157. 明示的な RETURN を必要としないルーチンであれば、この使い方は有効でしたが、これまでは許されていませんでした。

  158. pg_ctl のハードコーディングされた生成されたコマンド長の上限が取り除かれました。 (Phil Krylov) (13)(12)(11)(10)(9.6)
  159. これにより、例えば postmaster に渡すコマンドラインオプションを多数指定する場合の制限がなくなります。なお、pg_ctl が扱うパス名についての制限は未だあり、殆どの場合 MAXPGPATH(デフォルト1024)バイトで制限されます。

  160. RLS(行単位セキュリティ)ポリシーむけにテーブルごとの問い合わせ作成を回避することで、また、反復的な format_type() の呼び出しを回避することで、pg_dump の性能が改善されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  161. これらの変更はローカルサーバからのダンプでは重要ではありませんが、リモートサーバからのダンプではネットワーク往復が少なくなることで顕著なメリットがあります。

  162. contrib/btree_gin の(char(n)ではなく)"char" 列に対するインデックスの誤りが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  163. < や <= 演算子を使ったインデックススキャンが実行されたときに、誤った問い合わせ結果(返るべきエントリが返らない)が生じました。インデックス破損ではなく、検索ロジックの誤りに起因します。

  164. RISC-V アーキテクチャむけのスピンロックのサポートが追加されました。 (Marek Szuba) (13)(12)(11)(10)(9.6)
  165. OpenSSL 3.0.0 がサポートされました。 (Peter Eisentraut, Daniel Gustafsson, Michael Paquier) (13)(12)(11)(10)
  166. 作成した OpenSSL の BIO(I/O 抽象化)オブジェクトに正しい型識別子を設定するようになりました。 (Itamar Gafni) (13)(12)(11)(10)(9.6)
  167. この誤りは、おそらく OpenSSL のインストールを監査する類のタスクを行うコードでのみ問題となります。しかし、形としては OpenSSL API に違反しているため修正されました。

  168. libpq の静的リンクのための pkg-configファイルが修正されました。 (Peter Eisentraut) (13)(12)
  169. PostgreSQL 12 以降から、長らく正しい pkg-configファイルが提供されていませんでした。

  170. pg_regexec() が範囲外の search_start パラメータに対してより頑健になりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  171. pg_regexec() は PostgreSQL の正規表現機能の内部実装関数です。

    search_start が文字列の終わりを過ぎている場合に、これまではクラッシュの可能性がありましたが、REG_NOMATCH を返すようになります。この場合はおそらく PostgreSQLコアコードでは生じませんが、拡張モジュールから使われるかもしれません。

PostgreSQL 13.4、12.8、11.13、10.18、9.6.23 (2021年8月12日リリース)の変更点

  1. 射影ステップの繰り返し適用による誤った実行計画の作成が修正されました。 (Tom Lane) (13)(12)(11)
  2. 2つの ProjectionPath(射影、ターゲットリストの処理を行うパス)が互いにスタックした場合、プランナが誤った実行計画を作成する可能性がありました。これを再現させる既知の手順は並列ソートのみですが、それ以外の発生パターンもあるかもしれません。本障害によりクラッシュまたは誤った問い合わせ結果が生じます。また、障害動作を狙って起こしてサーバのメモリ内容の漏洩を狙う攻撃も可能です。(CVE-2021-3677)

    以下に再現例を示します。

    db=# CREATE TABLE t1 (c1 int, c2 int);
    db=# INSERT INTO t1 VALUES (1, 2), (3, 4);
    db=# SET parallel_setup_cost TO 0;
    db=# SET parallel_tuple_cost TO 0;
    db=# SET min_parallel_table_scan_size TO 0;
    db=# SET max_parallel_workers_per_gather TO 4;
    
    db=# SELECT generate_series(1, c1), array(SELECT generate_series(1, c1)) FROM t1 ORDER BY c2;
    (修正前の誤った問い合わせ結果)
     generate_series |   array
    -----------------+-----------
                   1 | {1,2}
                   2 | {1,2}
                   1 | {1,2,3,4}
                   2 | {1,2,3,4}
                   3 | {1,2,3,4}
                   4 | {1,2,3,4}
    (6 rows)
    
    (修正後の正しい応答)
     generate_series |  array
    -----------------+---------
                   1 | {1}
                   1 | {1,2,3}
                   2 | {1,2,3}
                   3 | {1,2,3}
    (4 rows)
    
    (修正前の誤ったプラン、一部で c1列と c2列が取り違えられている)
    db=# EXPLAIN (VERBOSE, COSTS off)
           SELECT generate_series(1, c1), array(SELECT generate_series(1, c1)) FROM t1 ORDER BY c2;
                          QUERY PLAN
    -------------------------------------------------------
     ProjectSet
       Output: generate_series(1, t1.c2), (SubPlan 1), t1.c1
       ->  Gather Merge
             Output: t1.c2, t1.c1
             Workers Planned: 3
             ->  Sort
                   Output: t1.c2, t1.c1
                   Sort Key: t1.c2
                   ->  Parallel Seq Scan on public.t1
                         Output: t1.c2, t1.c1
       SubPlan 1
         ->  ProjectSet
               Output: generate_series(1, t1.c2)
               ->  Result
    (14 rows)
    
  3. SSL再ネゴシエーションがより完全に禁止されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  4. SSL再ネゴシエーションはしばらく前から無効になっていましたが、クライアイントから再ネゴシエーションの要求があれば受けつけてしまい、悪意の狙って作られた要求によりクラッシュを起こすおそれがありました(OpenSSL の脆弱性 CVE-2021-3449 を参照)。OpenSSL 1.1.0h 以降のそれが可能なバージョンについて、再ネゴシエーションが完全に無効化されました。

  5. プロシージャ内の COMMIT または ROLLBACK の後にポータルレベルのスナップショットを復元するようになりました。 (Tom Lane) (13)(12)(11)
  6. この変更により、COMMIT または ROLLBACK の直後に TOAST化された値を取得しようとし、「no known snapshots」または「missing chunk number 0 for toast value」のエラーとなる場合が修正されます。

    一部の拡張はポータル外で SQL を実行するかもしれません。このような拡張は事前に外部スナップショットの存在確認をする必要があります。以前はスナップショットを存在せずとも動作する場合もありましたが、今後は「cannot execute SQL without an outer snapshot or portal」のエラーとなります。

    (修正前の障害動作例)
    db=# CREATE TABLE t3 (c text);
    db=# INSERT INTO t3 VALUES ((SELECT string_agg(random()::text, ':') FROM generate_series(1, 1000)));
    db=# INSERT INTO t3 VALUES ((SELECT string_agg(random()::text, ':') FROM generate_series(1, 1000)));
    db=# DO $$
         DECLARE
           r record;
         BEGIN
           FOR r in SELECT c FROM t3 LOOP
             INSERT INTO t3 VALUES (r.c);
             COMMIT;
           END LOOP;
         END;
         $$;
    ERROR:  no known snapshots
    CONTEXT:  PL/pgSQL function inline_code_block line 5 at FOR over SELECT rows
    
  7. 不安定なクエリを読み取るカーソルの結果を保持する際の誤った動作が修正されました。 (Tom Lane) (13)(12)(11)
  8. 以前は、クエリ結果全体を常に巻き戻して再読み取りしていましたが、行を再度取り出した際に以前とは異なる結果となる可能性があり、あとで大きな問題となっていました。NO SCROLL指定のカーソルは順序どおりにしか行を取り出せないため、読み取っていない部分のみを保持することで修正されました。SCROLL指定のカーソルは問題が残ったままですが、不安定なクエリで使用するのは安全でないことがすでにマニュアルに記述されています。そこで、その記述をより強調することで対処されました。

    また、PL/pgSQL のクエリ結果による FORループで使用される暗黙カーソルに NO SCROLL指定を強制し、プロシージャ内のコミットでそのようなカーソルを保持する際の同様の問題が修正されました。

    (修正前の誤った問い合わせ結果の例)
    db=# CREATE TABLE t4 (c1 int, c2 text);
    db=# INSERT INTO t4 VALUES (1, 'foo'), (2, 'bar'), (3, 'baz');
    db=# DO $$
         DECLARE
           c CURSOR FOR SELECT c1 FROM t4 ORDER BY c1 FOR UPDATE;
         BEGIN
           FOR r IN c LOOP
             UPDATE t4 SET c2 = c2 || ' ' || c2 WHERE c1 = r.c1;
             COMMIT;
           END LOOP;
         END;
         $$;
    
    db=# SELECT * FROM t4;
     c1 |   c2
    ----+---------
      2 | bar
      1 | foo foo
      3 | baz baz
    (3 rows)
    
    (修正後の正しい結果)
     c1 |   c2
    ----+---------
      1 | foo foo
      2 | bar bar
      3 | baz baz
    (3 rows)
    
  9. SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE が拒否されるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  10. グループ化セットなしの GROUP BY と同様に FOR UPDATE は拒否すべきですが、以前は、空のグループ化セットを正しく処理できず、エグゼキュータでクラッシュしていました。

    (修正前のクラッシュする問い合わせ例)
    db=# SELECT NULL FROM t1 GROUP BY GROUPING SETS (()) FOR UPDATE;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    (修正後)
    db=# SELECT NULL FROM t1 GROUP BY GROUPING SETS (()) FOR UPDATE;
    ERROR:  FOR UPDATE is not allowed with GROUP BY clause
    
  11. WITH 内のクエリが NOTIFY のみに書き換えられる場合を拒否するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  12. 以前はクラッシュしていました。

    (修正前のクラッシュ発生例)
    db=# CREATE RULE r AS ON INSERT TO t DO INSTEAD NOTIFY n;
    db=# WITH w AS (INSERT INTO t VALUES (0)) VALUES (0);
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    (修正後は以下のエラーが出ます)
    ERROR:  DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH
    
  13. 結果が小数点以下 16383 桁を越える乗算をした場合にエラーとせずに結果を丸めるようになりました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  14. (修正前の動作)
    db=# SELECT (0.1 - 2e-16383) * (0.1 - 3e-16383);
    ERROR:  value overflows numeric format
    
    (修正後の応答)
                                       ?column?
    -------------------------------------------------------------------------------
     0.010000000000000000000000000000000(中略)000000000000000000000000000000000000
    (1 row)
    
  15. 非常に大きな累乗をした際のごく稀なエラーと精度の低下が修正されました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  16. (修正前の誤動作例:エラーになる場合)
    db=# SELECT 0.9999999999 ^ 70000000000000;
    ERROR:  value overflows numeric format
    
    (修正前の誤動作例:誤った問い合わせ結果が返る場合)
    db=# SELECT 0.9999999999 ^ 23300000000000;
                                       ?column?
    -------------------------------------------------------------------------------
     1.000000000000000000000000000000000...中略...000000000000000000000000000000000
    (1 row)
    
  17. to_char() に EEEE書式で 10 ^ (-10001) 未満の値を与えた場合のゼロ除算エラーが修正されました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  18. (障害動作例)
    db=# SELECT to_char(1.2345e-16379::numeric, '9.999EEEE');
    ERROR:  division by zero
    
    (修正後の正しい応答)
         to_char
    ---------------
      1.235e-16379
    (1 row)
    
  19. pg_size_pretty(bigint) が numeric版と同様に正の値と同じ方法で負の値を丸めるように修正されました。 (Dean Rasheed, David Rowley) (13)(12)(11)(10)(9.6)
  20. (正の値の応答)
    db=# SELECT pg_size_pretty(10485247::bigint);
     pg_size_pretty
    ----------------
     10239 kB
    (1 row)
    
    (負の値に対する障害動作)
    db=# SELECT pg_size_pretty(-10485247::bigint);
     pg_size_pretty
    ----------------
     -10 MB
    (1 row)
    
    (修正後の正しい応答)
     pg_size_pretty
    ----------------
     -10239 kB
    (1 行)
    
  21. pg_filenode_relation(0, 0) がエラーを出すのではなく NULL を返すようになりました。 (Justin Pryzby) (13)(12)(11)(10)(9.6)
  22. 無効なテーブル空間の OID とファイルノード番号に対しては NULL を返すべきですが、以前は 0 を与えた場合に紛らわしいエラーとなっていました。

    (修正前のエラー応答)
    db=# SELECT pg_filenode_relation(0, 0);
    ERROR:  unexpected duplicate for tablespace 0, relfilenode 0
    
  23. ALTER EXTENSION が拡張にオブジェクトを追加または削除する際に、ロックを取得するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  24. 以前は ALTER EXTENSION ADD/DROP と DROP EXTENSION が同時に実行できて、その結果、システムカタログを破損する可能性がありました。

  25. ALTER SUBSCRIPTION が空文字列のスロット名を拒絶するように修正されました。 (Japin Li) (13)(12)(11)(10)
  26. (修正後のエラーが返る動作)
    db=# ALTER SUBSCRIPTION s SET (slot_name = '');
    ERROR:  replication slot name "" is too short
    
  27. パーティションテーブルのトリガを新たなパーティションに複製するときに、トリガの有効/無効ステータスを確実にコピーするようになりました。 (Álvaro Herrera) (13)(12)(11)
  28. これまではパーティションテーブルのトリガのステータスが、子テーブルに伝搬しませんでした。

  29. REFRESH MATERIALIZED VIEW CONCURRENTLY むけに生成された問い合わせで、別名の衝突を回避するようになりました。 (Tom Lane, Bharath Rupireddy) (13)(12)(11)(10)(9.6)
  30. mv と newdata など、特定の名前の列を含むマテリアライズドビューでコマンドが失敗していました。「ERROR: column reference "mv" is ambiguous」といったエラーが発生しました。

  31. PREPARE TRANSACTION がセッション寿命のロックとトランザクション寿命のロックの衝突を正しく検査するように修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  32. 同じ勧告的ロックID値に対してセッション寿命とトランザクション寿命の両方のロックを持っている場合、トラザクションは準備された状態にできません。この制限は完全には検査されておらず、PREPARE TRANSACTION 実行時に PANIC を引き起こすおそれがありました。

  33. RLS(行単位セキュリティ)のポリシーに複数回リストされているロールをターゲットにした DROP OWNED BY の誤動作が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  34. そのような場合、アサート失敗や「ERROR: tuple already updated by self」が引き起こされました。

  35. DROP OWNED BY 実行中に RLS ポリシーからロールを削除する際の不要なエラーチェックが削除されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  36. 特に、DROP OWNED BY を使うのにスーパーユーザであることを必須とする場合について、修正されています。

  37. CREATE COLLATION にて古い形式の Windowsロケール名を許容するようになりました。 (Thomas Munro) (13)
  38. ある時点から、古い形式のロケールに対して OS がバージョン情報を提供できないためにエラーにしていましたが、そのようなロケールを再度許容するようになりました。

    (13.3 バージョンでエラーになる例)
    db=# CREATE COLLATION public.ja_jp (LOCALE = 'Japanese_Japan.932');
    ERROR:  could not get collation version for locale "Japanese_Japan.932":
    error code 87
    
  39. 行全体の変数を GENERATED句で利用できなくなりました。 (Tom Lane) (13)(12)
  40. GENERATED句で行全体の変数を利用することは、生成列がそれ自体もしくは他の生成列を参照できないというルールに違反しており、そのようなケースの動作が明白に定義されていませんでした。実際の動作としては、しばしばクラッシュを引き起こしました。

    (GENERATED句に行全体の変数を使用する例)
    db=# CREATE TABLE t20 
           (a int PRIMARY KEY, b int GENERATED ALWAYS AS (num_nulls(t20)) STORED);
    ERROR:  cannot use whole-row variable in column generation expression
    
  41. GENERATED の式における tableoid の使用について修正されました。 (Tom Lane) (13)(12)
  42. システム列 tableoid に対して 0 や誤った値が取得される場合がありました。ALTER TABLE で後から生成列を加えた場合や、生成列を持つ外部テーブルにINSERT や UPDATE を行う時に誤動作が発生します。

  43. 外部テーブルに対して高速デフォルトをセットしないようになりました。 (Andrew Dunstan) (13)(12)(11)
  44. 外部テーブルのようにローカルにヒープストレージが存在しない場合、高速デフォルトは役に立たず、その後の操作で混乱が生まれます。バージョン11 で高速デフォルトが追加された際に対象のテーブルが通常テーブルであるかのチェックがなかったため追加されました。

  45. インデックス状態フラグをトランザクションとして更新できるようになりました。 (Michael Paquier, Andrey Lepikhov) (13)(12)(11)(10)(9.6)
  46. これにより、インデックス述部が IMMUTABLE と宣言されているけれども実際にはそうではない場合の処理で失敗するのを回避できます。CREATE INDEX CONCURRENTLY でアサート失敗が生じるケースが報告されました。

  47. CREATE/ALTER DOMAIN がキャッシュされた実行プランにあらわれたときに、プランのキャッシュエントリが破損しないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  48. プリペアドステートメントとして、これら命令を実行したときに、「ERROR: unrecognized node type: N」(Nは数値)という予期せぬエラーが生じるケースが報告されました。

  49. pg_stat_activity にて walsender の最新のレプリケーションコマンドが表示されるようになりました。 (Tom Lane) (13)(12)(11)(10)
  50. 今までは最新の SQL コマンドが表示されており、実際には表示されている SQL コマンドではなくレプリケーションコマンドが実行されている場合に紛らわしいものとなっていました。

  51. postgresql.conf から設定項目が削除された場合でもpg_settings.pending_restart が true にセットされるようになりました。 (Álvaro Herrera) (13)(12)(11)(10)(9.6)
  52. pending_restart は再起動が必要な設定項目が変更された際は正しく表示されていましたが、設定項目自体が削除された場合に対応できていませんでした。

  53. 64 ビットの Windows で work_mem × hash_mem_multiplier が 2GB を超えることが許容されました。 (Tom Lane) (13)
  54. これにより hash_mem_multiplier を数ギガバイトを超えるような大きなハッシュ集約のディスク書き出しを防ぐ目的で利用できるようになりました。

  55. 外部テーブルを継承する通常テーブルに関する問い合わせにおける、誤った実行プラン作成が修正されました。 (Amit Langote) (13)(12)
  56. SELECT FOR UPDATE や関連するコマンドで、アサート失敗、もしくは、「ERROR: could not find junk column」が発生していました。

  57. プラン作成において、FROM 要素が LATERAL であるときの、不変の FROM句内関数結果のプルアップが修正されました。 (Tom Lane) (13)
  58. 問い合わせでクラッシュやアサート失敗を起こす動作が報告されました。

  59. 新しいスタンバイが新しいプライマリに追随する際に稀に発生する障害が修正されました。 (Dilip Kumar, Robert Haas) (13)(12)(11)(10)(9.6)
  60. いくつかの条件が組み合わさった際にスタンバイが間違った WALタイムラインに従おうとする可能性がありました。

  61. トランザクションアボートのレコードの WALリプレイがファイル切り捨てを引き起こすときに、最小のリカバリポイントが更新されるようになりました。 (Fujii Masao) (13)(12)(11)(10)(9.6)
  62. ファイル切り捨ては元に戻せないため、そのレコードよりも前の時点でリカバリを止めることは安全ではありません。トランザクションがコミットされた場合で該当するケースは数年前に修正されていましたが、アボートのケースは修正されていませんでした。

  63. レプリケーションスロットが無効となった後に「必要とされる最も古いWALセグメント」の境界値を適切に進めるようになりました。 (Kyotaro Horiguchi) (13)
  64. 全てのレプリケーションスロットが無効となった際に境界値を再計算しておらず、最終的にサーバの WAL ストレージが溢れる可能性がありました。

  65. walreceiver で、エラー発生後にキャッシュからのカタログ検索を試みなくなりました。 (Masahiko Sawada, Bharath Rupireddy) (13)(12)(11)(10)
  66. これはエラー後において安全な方法ではありません。

  67. スタンバイサーバにシャットダウンシグナルが送信された場合、まだ起動処理中でWAL受信を待っているであっても、直ちにシャットダウンを実行するようになりました。 (Fujii Masao, Soumyadeep Chakraborty) (13)(12)(11)(10)(9.6)
  68. トランザクションコミットグループへの参加に失敗した際に、共有状態が正しくクリアされるようになりました。 (Amit Kapila) (13)(12)(11)
  69. タイミングによっては、後のセッションが同じ PGPROCオブジェクトを再利用する場合にアサート失敗が発生する可能性がありました。

  70. 他のプロセスからの同時書き込みに際しても不正な relmapper のデータを読み込みを回避できるように、ロックが追加されました。 (Heikki Linnakangas) (13)(12)(11)(10)(9.6)
  71. relmapper は OID とファイルノードの対応を保持するデータで、ファイル名は pg_filenode.map です。

  72. 並列B-treeインデックス構築の、ソート段階に関する進捗報告が改善されました。 (Matthias van de Meent) (13)(12)
  73. パラレルワーカによるソート処理の開始前にも状態報告するようになりました。

  74. レプリケーションプロトコル違反の検査が改善されました。 (Tom Lane) (13)(12)(11)(10)
  75. ロジカルレプリケーションワーカは多くの箇所でアサートを用いて、不適切なレプリケーションコマンドの検査を行っていましたが、通常のエラー処理に変更されました。

    不正な入力に対して、デバッグビルドでアサート失敗で停止することも、実運用ビルドで検査が行われないことも、望ましくありません。

  76. パーティションテーブルのロジカルレプリケーションで更新時に発生しうるクラッシュが幾つか修正されました。 (Amit Langote, Tom Lane) (13)
  77. ロジカルレプリケーションワーカでパーティションテーブルのAFTERトリガが発動する時に生じる可能性のあったクラッシュが修正されました。 (Tom Lane) (13)
  78. 複数ロジカルレプリケーションワーカが同じテーブルを TRUNCATEしようとする際に起こるデッドロックが修正されました。 (Peter Smith, Haiying Tang) (13)(12)(11)
  79. TRUNCATE実行時にサブスクライバ側で「ERROR: deadlock detected」が発生していました。

  80. 投機的挿入(speculative insertions)のロジカルデコーディングにおける幾つかの誤りが修正されました。 (Dilip Kumar) (13)(12)(11)(10)(9.6)
  81. 投機的挿入は INSERT .. ON CONFLICT .. で使われる処理です。メモリリークや予期せぬエラー、アサート失敗がもたらされる可能性がありました。

  82. ロジカルレプリケーションのデコーディングによるメモリリークが修正されました。 (Amit Langote) (13)
  83. エラー発生後、データ型キャッシュのハッシュテーブルに無効なレコード型のエントリが残る問題が回避されました。 (Sait Talha Nisanci) (13)(12)(11)
  84. これは後のクラッシュやメモリリークを引き起こす原因となっていました。

  85. CREATE TABLE ... AS EXECUTE構文でエラー発生する一部の場合における、プランキャッシュの参照カウントの取りこぼしが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  86. 結果としてメモリリークが生じる可能性がありました。

  87. パラレルワーカ間のタプル記述子を共有するコードで競合状態が修正されました。 (Thomas Munro) (13)(12)(11)
  88. 場合によってはクラッシュが発生する可能性がありました。

  89. checkpointerプロセスによる使われなくなったレプリケーションスロット無効化が、そのスロットを削除や更新しようとする処理と並行して行われたときの競合状態が修正されました。 (Andres Freund, Álvaro Herrera) (13)
  90. バックグランドワーカスロット(BackgroundWorkerSlots)を解放する際の潜在的な競合状態が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  91. Intelハードウェアでは明白にバグが修正されたという結果が観察できないかもしれませんが、メモリオーダリング制御が弱いマシン上では問題が起きる可能性がありました。

  92. ソートのコードにおける潜在的なクラッシュが修正されました。 (Ronan Dunklau) (13)(12)(11)(10)(9.6)
  93. あるコードパスで NULLポインタを解放しようとする可能性がありました。本ケースは、コアサーバのソート利用では到達できないように見えますが、拡張から引き起こされる可能性がありました。

  94. 破損データに対して B-tree ポスティングリストを分割するコードが堅牢化されました。 (Peter Geoghegan) (13)
  95. 既存のエントリと同一の TID を持つアイテムを挿入しようとすると、クラッシュするのではなく、エラーを投げるようになりました。 これは決して起こるべきではありませんが、インデックスがそのテーブルと矛盾している時に場合に起こることが報告されています。

  96. SP-GiST のインデックス挿入における無限ループが防止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  97. INCLUDE列がリーフインデックスタプルがページに収まらないほどのスペースを占めている場合、text_ops演算子クラスはタプルを収めるために無駄に無限ループに陥ってしまいました。11以前のバージョンには INCLUDE列がありませんが、演算子クラスのバグに対する良い防御策と思われるので、このループ防止の修正が後方適用されました。

  98. SP-GiST のインデックス挿入が、クエリキャンセル要求によって終了できることが保証されました。 (Tom Lane, Álvaro Herrera) (13)(12)(11)(10)(9.6)
  99. PL/pgSQL で INTO句に STRICT が指定されていないにもかかわらず、あたかも STRICT が指定されているかのように動作する可能性がある、初期化されていない変数のバグが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  100. libpq の出力関数(PQprint)において、メモリ不足障害が発生しても処理を中断しないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  101. これまでは abort(3) でプログラムを終了させていました。

  102. ecpg で numaric型の INT_MIN(通常は -2147483648)を integer に変換できるようになりました。 (John Naylor) (13)(12)(11)(10)(9.6)
  103. 以前の ecpg の範囲チェックでは INT_MIN ではなく -INT_MAX を範囲内としていたため、-2147483648 が範囲外として拒否されていました。

  104. psql やその他のクライアントプログラムで不正にエンコードされたデータを扱う際に、文字列の末尾をオーバーランしないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  105. 文字列の終わり近くに不適切にエンコードされたマルチバイト文字があると、様々な処理ループが文字列の最後の NUL を越えて実行される可能性があり、その結果、後続のメモリに何があるかによって、検出不能な問題からプログラムのクラッシュまで様々な問題が発生します。これは CVE-2006-2313 を想起させますが、これらの特定ケースが注意を喚起させるセキュリティ上の重要性を持つとは思われません。

  106. 有効/無効(あるいは REPLICA/ALWAYS)の状態が親テーブルのトリガと異なるパーティションテーブルのトリガを正しく処理するようにpg_dump が修正されました。 (Justin Pryzby, Álvaro Herrera) (13)(12)(11)
  107. このような場合にダンプで指定されていた状態が失われていました。

  108. 異なるタイムゾーンで作成されたダンプファイルで pg_restore を実行した場合に発生する「invalid creation date in header」という警告が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  109. 新しい glibc バージョンの mktime() の移植性の問題により、異なるタイムゾーンで作成されたダンプファイルに対して pg_restore を実行した時、下記のメッセージが出ていました。

    pg_restore: warning: invalid creation date in header
    pg_restore: while PROCESSING TOC:
    
  110. pg_upgrade が古いインストールの「oldestXID」の値を引き継ぐようになりました。 (Bertrand Drouvot) (13)(12)(11)(10)(9.6)
  111. 以前、新しいインストールの「oldestXID」は(通常)すぐに周回防止の自動バキュームが強制実行されるような古い値に設定されていました。これはパフォーマンスの観点からは望ましくありません。さらに悪いことに、大きな値の autovacuum_freeze_max_age を使用しているインストールでは、アップグレード直後に不必要な強制シャットダウンが発生する可能性がありました。

  112. アップグレードすべき拡張を検出して警告を出すように pg_upgrade が拡張されました。 (Bruce Momjian) (13)(12)(11)(10)(9.6)
  113. これからは、拡張を新PostgreSQLバージョンでデフォルトとされるバージョンにアップグレードするのに必要な ALTER EXTENSION UPDATE コマンドを含む、スクリプトファイルが作成されます。

  114. pg_receivewal を圧縮WAL格納と非圧縮WAL格納の間で切り替える際の問題が回避されました。 (Michael Paquier) (13)(12)(11)(10)
  115. contrib/postgres_fdw が生成列について有効に動作するよう修正されました。 (Etsuro Fujita) (13)(12)
  116. 外部テーブルの生成列が外部テーブルの生成列をあらわす場合については、適切に動作するようになりました。

    postgres_fdw は IMPORT でリモートテーブルの生成列を通常の列として取り込み、外部テーブルに INSERT を行う時に「ERROR: cannot insert a non-DEFAULT value into column "..."」というエラーが出ていました。import_generated オプション(デフォルトtrue)が追加され、true なら、IMPORT FOREIGN SCHEMA は生成列を取り込むようになりました。

  117. contrib/postgres_fdw で、エラーの後にカタログ検索を試みないようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  118. 通常はこの方法で動作しますが、カタログアクセスが機能しないエラーが発生している可能性があるため、あまり安全ではありませんでした。この修正の副作用として、データ変換エラーに関するメッセージで、外部テーブルや外部列の実際の名前ではなく、クエリのテーブルやカラムのエイリアス(使用されている場合)が言及されるようになりました。

  119. トランザクション隔離のテストの基盤が改善されました。 (Tom Lane, Michael Paquier) (13)(12)(11)(10)(9.6)
  120. キャッシュ上書きの検査のオーバヘッドが軽減されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  121. PL/Python のリグレッションテストが Python 3.10 でも通るように修正されました。 (Honza Horak) (13)(12)(11)(10)(9.6)
  122. PostgreSQLコード内の実装における printf("%s", NULL) がクラッシュする代わりに (null) を出力するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  123. これにより、ごく稀な場合でのサーバの堅牢性が向上し、printf の実装が一般的なライブラリと同様となります。

  124. ポイントインタイムリカバリが ROLLBACK PREPARED レコードで停止した際に出力する誤ったログメッセージが修正されました。 (Simon Riggs) (13)(12)(11)(10)(9.6)
  125. 「recovery stopping before abort of transaction %u, time %s」と出力すべきメッセージが、これまでは、「recovery stopping before commit of transaction %u, time %s」と出力されていました。

  126. ALTER TABLEで誤ったリレーションタイプに対するエラーメッセージが改善されました。 (Kyotaro Horiguchi) (13)(12)(11)
  127. (メッセージ改善例)
    db=# CREATE VIEW v69 AS SELECT * FROM t1;
    db=# ALTER TABLE v69 ALTER c SET STATISTICS 0;
    ERROR:  "v69" is of the wrong type
    (修正後のメッセージ)
    ERROR:  "v69" is not a table, materialized view, index, partitioned index, or foreign table
    
  128. エラーメッセージ内の「負でない (non-negative)」等がゼロを含むか明確な表現に置き換えられました。 (Bharath Rupireddy) (13)(12)(11)(10)(9.6)
  129. db=# CREATE TABLE t70 (c int) PARTITION BY HASH (c);
    db=# CREATE TABLE p70 PARTITION OF t70 FOR VALUES WITH (MODULUS 4, REMAINDER 0);
    
    (修正前)
    db=# SELECT satisfies_hash_partition('t70'::regclass, 0, 0, NULL);
    ERROR:  modulus for hash partition must be a positive integer
    db=# SELECT satisfies_hash_partition('t70'::regclass, 1, -1, NULL);
    ERROR:  remainder for hash partition must be a non-negative integer
    
    (修正後)
    db=# SELECT satisfies_hash_partition('t70'::regclass, 0, 0, NULL);
    ERROR:  modulus for hash partition must be an integer value greater than zero
    db=# SELECT satisfies_hash_partition('t70'::regclass, 1, -1, NULL);
    ERROR:  remainder for hash partition must be an integer value greater than or equal to zero
    
  130. 個別の libldap_rライブラリがなくなった OpenLDAP 2.5 で動作するように configure が修正されました。 (Adrian Ho, Tom Lane) (13)(12)(11)(10)(9.6)
  131. libldap_rライブラリが存在しない場合は、libldapライブラリは暗黙的にスレッドセーフであると想定されます。

  132. make ターゲットに新たに world-bin および install-world-bin が追加されました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  133. これらは、ドキュメントをビルドまたはインストールしないことを除き、world および install-world と同じです。

  134. TAPテストの makeルール(prove_installcheck)がPGXS の使い方に沿って動作するように修正されました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  135. JITのコードが今後の LLVM API の変更に備えて調整されました。 (Thomas Munro, Andres Freund) (13)(12)(11)
  136. LLVM 13 では、以前の JIT コンパイラではクラッシュをもたらす、互換性のない API の変更が行われています。

  137. GSSAPIライブラリから返る文字列が null終端していることを前提としないように修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  138. GSSAPI の仕様では文字列ポインタと長さを返すことになっています。実際には文字列は通常 null終端されているため、従来コードでもエラーは発生していませんが、AddressSanitizer から問題が報告されました。

  139. MSVC で GSSAPI を使ったビルドが可能になりました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  140. 最新の Kerberosビルドとのさまざまな非互換性が修正されました。

  141. MSVC ビルドで --with-pgport が指定されている場合、pg_config が出力する configure オプションに含めるようになりました。 (Andrew Dunstan) (13)(12)(11)(10)(9.6)
  142. PostgreSQL 10 を ICU 69 以降でビルドできるようになりました。 (Peter Eisentraut) (10)
  143. contrib/pgcrypto で、シンボル名が OpenSSL と競合しないように修正されました。 (Tom Lane) (9.6)
  144. SHA224ハッシュを使った操作で valgrid がエラーを検知する可能性がありました。これは、アライメント用パディングバイトのメモリ破壊にすぎないため、実際には影響なさそうですが、念のため修正されました。

PostgreSQL 13.3、12.7、11.12、10.17、9.6.22 (2021年5月13日リリース)の変更点

  1. 配列の添え字の計算において、整数オーバーフローが防止されました。(CVE-2021-32027) (Tom Lane) (13)(12)(11)(10)(9.6)
  2. これまでの配列の実装では、配列の下限と長さが整数をオーバーフローさせる場合を問題としていませんでした。その結果、(添え字を整数として書けないため)配列後方のエントリがアクセス不能になり、さらに重要なことには、続く代入操作を混乱させました。このことは、確実なクラッシュや望まないデータ書き換えを伴うメモリ上書きをもたらすおそれがありました。

    サポート終了バージョンであるため修正はリリースされませんが、9.5以前のバージョンについても同様の問題があると考えられます。

  3. 「INSERT ... ON CONFLICT ... UPDATE」の対象リストで不要列の扱いが修正されました。 (CVE-2021-32028) (Tom Lane) (13)(12)(11)(10)(9.6)
  4. UPDATE のリストが、適切な結果に加えて不要列(使われない不要な列、ごみ列)を発生させるような複数列の副問い合わせを持つ場合、UPDATE の処理コードは最終的に余分な不要列の値を含むタプルを格納していました。これは短い実行ではおよそ無害ですが、テーブルに新たな列が追加された場合、その値がアクセス可能になってしまい、追加した列とデータ型が合わない場合には不具合になるおそれがありました。

    加えて、パーティションをまたがる更新に対応したバージョンでは、このようなケースで引き起こされたパーティションをまたがる更新が、逆に対象リストから不要列が削除される問題をもたらし、典型的には即座のクラッシュを引き起こしました。

    この障害を利用して、一時テーブルを含む、テーブル作成権限を持ったユーザによる、サーバ側の任意メモリを読み取る攻撃も可能でした。

    (クラッシュ発生例)
    db=# CREATE TABLE t2 (a int PRIMARY KEY, b text) PARTITION BY LIST (a);
    db=# CREATE TABLE t2_1 PARTITION OF t2 FOR VALUES IN (1);
    db=# CREATE TABLE t2_2 (b TEXT, a INT PRIMARY KEY);
    db=# ALTER TABLE t2 ATTACH PARTITION t2_2 FOR VALUES IN (2);
    db=# INSERT INTO t2 VALUES(1, 'Boo'), (2, 'Zoo');
    
    db=# WITH aaa AS (SELECT 1 AS a, 'Foo' AS b)
         INSERT INTO t2 VALUES (1, 'Bar') ON CONFLICT (a)
           DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *;
     (a=1、b='Foo' の 1行が返る)
    
    db=# WITH aaa AS (SELECT 1 AS ctea, ' Foo' AS cteb)
         INSERT INTO t2 VALUES (1, 'Bar'), (2, 'Baz') ON CONFLICT (a)
           DO UPDATE SET (b, a) = (SELECT t2.b || cteb, t2.a FROM aaa) RETURNING *;
     (ここでクラッシュ発生)
    
  5. 結合を伴いパーティションをまたがる更新に対する UPDATE ...RETURNING 出力の計算が間違っている可能性があり、修正されました。(CVE-2021-32029) (Amit Langote, Etsuro Fujita) (13)(12)(11)
  6. パーティションテーブルの UPDATE により、行が物理的に異なる行タイプを持つ別のパーティション(例えば、削除された列のセットが異なるパーティション)に移動された場合、その行に対する RETURNING 結果の計算でエラーや間違った答えが生じる可能性がありました。UPDATE で他のテーブルが対象テーブルに結合されない限り、エラーは発生しません。

    以下は本障害によりパーティションテーブルの UPDATE で発生するエラーの一例です。

    ERROR:  attribute 5 of type record has wrong type
    DETAIL:  Table has type record, but query expects integer.
    

    この障害を利用して、一時テーブルを含む、テーブル作成権限を持ったユーザによる、サーバ側の任意メモリを読み取る攻撃が可能でした。

  7. パーティションテーブルにおける遅延プロパティ制約の調整が修正されました。 (Álvaro Herrera) (13)(12)(11)
  8. 遅延プロパティをパーティションテーブルの外部キー制約に適用するとき、ALTER TABLE ... ALTER CONSTRAINT は、リーフパーティション(末端のパーティション)の制約およびトリガの DEFERRABLE および INITIALLY DEFERRED の印付け調整に失敗しました。これにより、これらの制約の予期しない動作が発生しました。

    バージョンアップ後に ALTER コマンドを実行して、必要なプロパティを設定することで、誤動作しているパーティションテーブルを修正できます。

    本修正により、リーフパーティションの制約に直接このような ALTER を適用することもできなくなりました。 唯一サポートされているケースは、パーティショニング階層全体が同一の制約プロパティを持つことであるため、このような ALTER はルートパーティション(親テーブル)で適用される必要があります。

  9. ALTER TABLE ... INHERIT で子テーブルをアタッチする場合、子テーブルで親テーブルの生成列と同じ定義を持つことを確認するようになりました。 (Peter Eisentraut) (13)(12)
  10. これまでは子テーブルの定義が異なっていても、無視して子テーブルの定義を捨てていました。本修正で親子で生成列の定義が異なる場合にエラーが出るように変更されました。

    db=# CREATE TABLE t13_p1 (a int, b int GENERATED ALWAYS AS (a * 2) STORED);
    db=# CREATE TABLE t13_c1 (a int, b int GENERATED ALWAYS AS (a * 3) STORED);
    
    (13.2 での動作)
    db=# ALTER TABLE t13_c1 INHERIT pp1;
    ALTER TABLE
    
    (13.3 での動作)
    db=# ALTER TABLE t13_c1 INHERIT pp1;
    ERROR:  column "b" in child table has a conflicting generation expression
    
  11. IDENTITY列を NULL可能とすることが禁止されました。 (Vik Fearing) (13)(12)(11)(10)
  12. GENERATED ALWAYS AS IDENTITY は NOT NULL を意味しますので、明示的な NULL 指定と組み合わせて使用することはできません。

  13. ALTER ROLE/DATABASE ... SET で role、session_authorization、temp_buffers のパラメータを設定できるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  14. 以前は、後で使用する際に値が有効であったとしても、過剰な有効性チェックによってこれらのコマンドが拒否されることがありました。 このため、ダンプ/リロードや pg_upgrade の際に、コマンドの順序が乱れてしまうことがありました。

  15. REINDEX CONCURRENTLY が、インデックスに設定されている統計情報対象を維持するようになりました。 (Michael Paquier) (13)(12)
  16. これまでは実行前に設定されていた pg_attribute.attstattarget が REINDEX CONCURRENTLY を実行して作成される新しいインデックスで失われていました。

  17. 現在のトランザクションにセーブポイントが存在する場合に、COMMIT AND CHAIN が正しく動作するように修正されました。 (Fujii Masao) (13)(12)
  18. 以下に本修正による動作の違いを示します。

    (13.2 での動作)
    db=# BEGIN;
    db=*# SAVEPOINT foo;
    db=*# COMMIT AND CHAIN;
    db=#
    (↑トランザクションが終了、プロンプトが # に変わっています)
    
    (13.3 での動作)
    db=# BEGIN;
    db=*# SAVEPOINT foo;
    db=*# COMMIT AND CHAIN;
    db=*#
    (↑正しく動作して再びトランザクション内になります、プロンプトが *# です)
    
  19. WITH RECURSIVE 処理におけるリスト操作のバグが修正されました。 (Michael Paquier, Tom Lane) (13)
  20. 7レベル以上の十分に深い WITH構造の入れ子によりクラッシュや、WITH 入れ子に対する誤ったエラー(下記)が発生していました。

    ERROR:  stack depth limit exceeded
    
  21. COLLATE式の結果を照合不能な型に強制変換する際のバグが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  22. 本障害により、COLLATE が照合不能な値に適用されているように見える解析ツリーが作成されていました。COLLATE は実行時には影響しないため、通常の使用上の影響はありませんが、ダンプ/リロード時に拒否されるビューを作成することがありえました。

    (誤動作例: \d 出力のビュー定義の COLLATE句 が余計で、この SELECT はエラーになる)
    db=# CREATE VIEW v9 AS
           SELECT c1+1 AS c1p FROM (SELECT ('4' COLLATE "C")::INT AS c1) ss;
    db=# \d+ v9
                                 View "public.v9"
     Column |  Type   | Collation | Nullable | Default | Storage | Description
    --------+---------+-----------+----------+---------+---------+-------------
     c1p    | integer |           |          |         | plain   |
    View definition:
     SELECT ss.c1 + 1 AS c1p
       FROM ( SELECT 4 COLLATE "C" AS c1) ss;
    
  23. AFTERトリガのタプルを保存する際に生じていたメモリを解放した後に再使用する、use-after-free バグが修正されました。 (Amit Langote) (13)(12)
  24. これにより状況によってはクラッシュをおこす可能性がありました。

  25. fastpathプロトコル(関数呼び出しサブプロトコル)のメッセージによるウィンドウ関数およびプロシージャの呼び出しが禁止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  26. ここでは普通の関数のみがサポートされます。集約関数の呼び出しはすでにエラーとなっていましたが、ウィンドウ関数の呼び出しはクラッシュし、プロシージャの呼び出しはそのプロシージャがトランザクション制御を行わない場合にのみ機能していました。

  27. イベントトリガをサポートするために pg_identify_object_as_address() が拡張されました。 (Joel Jacobson) (13)(12)(11)(10)(9.6)
  28. 以前は、pg_event_trigger に対する本関数の実行で、予期せぬエラー「ERROR: requested object address for unsupported object class 32: text result "ddl_postgrest"」が発生していました。

  29. to_char() による負の間隔を持つローマ数字の月形式コードの処理が修正されました。 (Julien Rouhaud) (13)(12)(11)(10)(9.6)
  30. 以前そのような時は通常クラッシュを引き起こしてました。

    (修正前 13.2 ではクラッシュ)
    db1=# SELECT * from TO_CHAR(interval '-1Mon', 'rm');
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    (修正後 13.3 の動作例)
    db=# SELECT * from TO_CHAR(interval '-1Mon', 'rm');
     to_char
    ---------
     xii
    (1 row)
    
  31. pg_import_system_collations() の引数が有効なスキーマの OID かを確認して、無効ならエラーを出すようになりました。 (Tom Lane) (13)(12)(11)(10)
  32. これまで不正な値に対してアサート失敗が生じていました。アサート無効のビルドでは、おそらく無害ですが pg_collation に無効な collnamespace列の値を持ったエントリができる可能性がありました。

  33. 基本RE(BRE)モードの正規表現で \{m,n\} 数量詞を解析する際に初期化されていない値の使用が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  34. この誤りにより、数量詞が欲張りでない動作をする可能性がありました。すなわち、完全な正規表現(ARE) における {m,n}? 数量詞の動作と同様に振る舞いました。

  35. ソートキーに集約関数やウィンドウ関数が含まれている状況で、プランナのエラー「ERROR: could not find pathkey item to sort」が出る問題が修正されました。 (James Coleman, Tom Lane) (13)
  36. 拡張統計を用いてグループ数を推定する際、システム列を無視しないように修正されました。 (Tomas Vondra) (13)(12)(11)(10)
  37. これまでは (a, b) の拡張統計が存在するテーブルに対する「SELECT ... GROUP BY a, b, ctid」といったシステム列を含めた問い合わせの推定値がおかしくなっていました。

  38. 長い固定プレフィックスを持つ正規表現に対する選択度(selectivity)の評価を行う際に発生するゼロ除算問題が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  39. 通常、選択度は NaN と評価され、後にアサート失敗や奇妙なプランナ動作を引き起こす可能性がありました。

    下記の正規表現を使用してアサート失敗が発生するケースが報告されました。

    SELECT * FROM test WHERE t ~* ('^' || repeat('-', 500));
    
  40. BRINインデックスを使用するとき、ビットマップインデックススキャンを行う際にテーブル範囲外にアクセスしようとするエラーが発生する可能性があり、修正されました。 (Tomas Vondra) (13)(12)(11)(10)(9.6)
  41. BRINインデントのページ範囲サイズが 2 の累乗でなければ、ビットマップスキャンがテーブル実際の終りより先のページを読み込もうと試み、稀に「ERROR: could not open file」が出ることがありました。

  42. GINインデックスの検索でマッチするタプルが複数存在する場合、間違った値を返す可能性があり、修正されました。 (Tom Lane) (13)
  43. マッチするインデックス数が過大になると(閾値は work_mem 設定値で決まります)、保持しているビットマップは損失を伴うもの(lossy)になります。このとき、再チェック(recheck)は不要と誤判断する可能性があり、誤った問い合わせ結果を返すことがありました。

  44. Windows における WALセグメント再利用時の同時実行問題が修正されました。 (Michael Paquier) (13)
  45. 以前(13.0 リリース前)の修正によって「LOG: could not rename file ...: Permission denied」というログメッセージが断続的に出力されていて、その修正が元に戻されました。深刻な問題ではありませんでしたが大量のログ出力が迷惑でした。

  46. コミットされていない二相トランザクションを WAL からリカバリする時に発生する、不適切なタイムライン変更が回避されました。 (Soumyadeep Chakraborty, Jimmy Yih, Kevin Yeap) (13)(12)(11)(10)
  47. この不具合により、後続の WALレコードは間違ったタイムラインID で記録され、整合性が取れなくなる問題や、サーバが再起動できなくなる問題が起きる可能性がありました。

  48. スタンバイサーバが起動中にシャットダウンされた場合に、確実にロックが全て解放されるようになりました。 (Fujii Masao) (13)(12)(11)(10)(9.6)
  49. スタンバイサーバがリカバリの途中で切断されると、保持しているロックが一部残る可能性があり、デバッグが有効なビルドではアサート失敗が発生していました。本番ビルドで重大な問題が発生するかは不明です。

  50. 論理レプリケーションワーカが「ALTER SUBSCRIPTION ... REFRESH PUBLICATION」を実行するときにクラッシュしてしまう問題が修正されました。 (Peter Smith) (13)(12)(11)(10)
  51. 通常のコマンド実行では問題がありませんが、レプリカのトリガから実行するときにクラッシュが発生しました。

  52. 最近のバージョンの FreeBSD において、wal_sync_method 設定がデフォルトで fdatasync になるように修正されました。 (Thomas Munro) (13)(12)(11)(10)(9.6)
  53. FreeBSD 13 は open_datasyncをサポートしているため、通常、それがデフォルトで選択されました。しかしながら PostgreSQLにとってそれがより優れた選択とは限られませんので、既存のデフォルト設定のままにするようになりました。

  54. vacuum_cleanup_index_scale_factor設定とストレージオプションが無効にされました。 (Peter Geoghegan) (13)
  55. 古くなった統計情報を追跡するという考えはautovacuum_vacuum_insert_threshold設定とは相性が悪く、結果として必要のないフルインデックススキャンが行われ、autovacuum のパフォーマンス劣化につながりました。autovacuum_vacuum_insert_threshold の仕組みがより優れていると判断されて、古い統計情報のロジックが削除されました。

    vacuum_cleanup_index_scale_factor設定はバージョン14 から完全に削除されます。既存の設定ファイルにも影響を及ぼすという懸念から、バージョン13 ではまだパラメータが残されていますが、機能はしなくなりました。

  56. ALTER CONSTRAINT 内で、ALTER 処理後に実行されるフックに正しくトリガの OID を渡すように、修正されました。 (Álvaro Herrera) (13)(12)
  57. ALTER CONSTRAINT の中でトリガを更新する際、ALTER 処理後のフックはトリガを更新するものと知らされますが、ここでトリガの OID ではなくトリガのための制約の OID が渡されていました。ALTER 後に誤った制約の動作が生じました。

    (修正前バージョン 13.2 での障害動作例)
    db=# CREATE TABLE pt27m (k1 int, k2 int, PRIMARY KEY (k1, k2)) PARTITION BY LIST (k1);
    db=# CREATE TABLE p27m1 PARTITION OF pt27m FOR VALUES IN (1);
    db=# CREATE TABLE pt27t (k1 int, k2 int, v int) PARTITION BY LIST (k1);
    db=# CREATE TABLE p27t1 PARTITION OF pt27t FOR VALUES IN (1);
    
    db=# BEGIN;
    db=*# ALTER TABLE pt27t ADD CONSTRAINT fkey1 FOREIGN KEY (k1, k2) REFERENCES pt27m;
    db=*# ALTER TABLE pt27t ALTER CONSTRAINT fkey1 DEFERRABLE INITIALLY DEFERRED;
    
    db=*# INSERT INTO pt27m VALUES (1, 2);
    db=*# INSERT INTO pt27t VALUES (1, 2, 100);
    db=*# DELETE FROM pt27m;
    ERROR:  update or delete on table "p27m1" violates foreign key constraint "pt27t_k1_k2_fkey" on table "pt27t"
    DETAIL:  Key (k1, k2)=(1, 2) is still referenced from table "pt27t".
    
    (最後の DELETE による制約違反はコミット時までエラーにならないのが本来の期待される動作です)
    
  58. DSM(動的共有メモリ)のセグメントをデタッチする時に、割り込まれても片付けが完了できることが保証されました。 (Thomas Munro) (13)(12)(11)(10)(9.6)
  59. パラレルクエリで作成されたテンポラリファイルが即時に削除されない問題が発生する可能性がありました。

  60. 幾つかの軽微なメモリリークが修正されました。 (Tom Lane, Andres Freund) (13)(12)(11)(10)(9.6)
  61. 共有メモリにある walreceiver の統計情報中の変数が初期化されない問題が、修正されました。 (Fujii Masao) (13)
  62. この誤りは殆どのプラットフォームで無害ですが、アトミック変数やスピンロックがサポートされないプラットフォームでは下記のエラーが発生する可能性がありました。

    ERROR:  invalid spinlock number: 0
    
  63. dtrace が無効になっているとしても、コンパイルされていたなら軽量ロック(LWLock)を追跡するプローブが実行されていたものが修正され、オーバーヘッドが軽減されました。 (Peter Eisentraut) (13)
  64. PL/pgSQL の DOブロックで複合型変数とトランザクション制御を両方使用する際に、エラーが発生していたものが、修正されました。 (Tom Lane) (13)(12)(11)
  65. 修正前は以下のようなエラーが発生していました。

    ERROR:  tupdesc reference ... is not owned by resource owner TopTransaction
    
  66. メッセージ長が破損している ParameterDescriptionメッセージを受信したときに発生していた libpq の無限ループが防止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  67. Windows で、initdb 実行後、最後に出力されるサーバの起動方法を示すコマンド例における pg_ctl のパスが、バックスラッシュを用いて表示するように修正されました。 (Nitin Jadhav) (13)(12)(11)(10)
  68. (initdb 出力メッセージの例)
    
    成功しました。以下のようにしてデータベースサーバを起動できます。
    
     ^"C^:^/Install^ Dir^/bin^/pg^_ctl^" -D ^"C^:^\database^\data^" -l <ログファイル> start
    
    (↓上記が以下のように出力されるようになります)
    
     ^"C^:^\Install^ Dir^\bin^\pg^_ctl^" -D ^"C^:^\database^\data^" -l <ログファイル> start
    
  69. psql で \connect service=something が以前の振る舞いに戻されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  70. 以前のバグ修正により、PGPORT などの環境変数が接続サービスファイルのエントリを上書きしていました。サービスファイルでの指定が優先される、以前の振る舞いに戻されました。

  71. COMMIT AND CHAIN コマンドが正しく処理されるように、psql の ON_ERROR_ROLLBACK機能が修正されました。 (Arthur Nascimento) (13)(12)
  72. psql が COMMIT AND CHAIN によって既に解放済みの自動発行セーブポイントを解放しようとして、「ERROR: savepoint "pg_psql_temporary_savepoint" does not exist」というエラーになっていました。

  73. psql コマンドで「could not print result table: ...」メッセージが繰り返し出力される動作が回避されました。 (Álvaro Herrera) (13)
  74. psql の \e および関連コマンドによるファイル変更を検出する際の競合状態が修正されました。 (Laurenz Albe) (13)(12)(11)(10)(9.6)
  75. 高速な入力を行うと、一時編集ファイルの変更をファイルタイムスタンプから検知できないことがありえました。直近のファイル変更内容が反映されない動作をすることが報告されました。

  76. pg_dump でパーティションテーブルの生成列のダンプが修正されました。 (Peter Eisentraut) (13)(12)
  77. 前マイナーリリースで導入された修正はパーティションテーブルには適用すべきではなく、従来からの継承テーブルにのみ適用すべきでした。

  78. pg_restore でのファイルのバージョンチェックの誤りが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  79. シークできないカスタム形式のダンプファイルを読み取る場合、pg_restore はダンプファイルのバージョンを確認していませんでした。サポートされているものより新しいダンプファイルの形式が提供された場合、リストアに失敗することになります。

    pg_restore が「pg_restore: [archiver] unsupported version (...) in file header」のエラーを出す代わりにクラッシュする動作が報告されました。

  80. pg_upgrade に、アップデートできないデータ型を含むユーザーテーブルの検査が追加されました。 (Tom Lane) (13)(12)(11)(10)(9.6)
  81. アップグレード不可能なデータ型がコンテナ型(配列や範囲など)に埋め込まれている場合の検出が改善されました。

    また、ユーザーテーブルにシステム定義の複合型の列(システムテーブルを複合型として使っている場合など)が含まれている場合には、それらの型の OID はバージョン間で安定していないため、アップグレードを許可しないようになりました。

  82. pg_checksums の進行報告が最後に 100%に到達しない不具合が修正されました。 (Shinya Kato) (13)(12)
  83. pg_waldump が、レコード毎の統計を生成するとき XACTレコードを正しくカウントするように、修正されました。 (Kyotaro Horiguchi) (13)(12)(11)(10)(9.6)
  84. contrib/amcheck で、タプルフラグ HEAP_XMAX_LOCK_ONLY と HEAP_KEYS_UPDATED の両方が設定されていることに対して、エラーを出さないように修正されました。 (Julien Rouhaud) (13)(12)(11)(10)(9.6)
  85. これは SELECT FOR UPDATE 実行後においては正常な状態でした。

  86. VPATH構築が Oracle Developer Studio の最新版のコンパイラをサポートするように調整されました。 (Noah Misch) (13)(12)(11)(10)(9.6)
  87. Solaris 上で稼働する Python 3 用の PL/Python のテストが修正されました。 (Noah Misch) (13)(12)(11)(10)(9.6)
  88. サーバ側SSLパラメータを初期化するときのメモリリークが修正されました。 (Michael Paquier) (12)(11)(10)
  89. 通常、深刻な影響はありませんが、postmaster に SIGHUPシグナルが繰り返し送信されると、時間の経過と共にメモリリークが増大する可能性があります。

PostgreSQL 13.2、12.6、11.11、10.16、9.6.21、9.5.25 (2021年2月11日リリース)の変更点

  1. 一部の結合の問い合わせで列単位の SELECT権限の検査に失敗していたものが、修正されました。 (Tom Lane) (13)
  2. 結合を伴う一部のケースで、問い合わせで読み込まれた全ての列をパーサが権限検査に使う使用列ビットマップに記録することに失敗していました。エグゼキュータは問い合わせ実行のためにいくつかの種類の SELECT権限を依然として要求するものの、これはテーブルの一列にのみ SELECT権限を持ったユーザが、工夫をこらした問い合わせを通して全ての列を読むことができることを意味します。

    本問題に該当する問い合わせの格納されたビューは、不完全な使用列ビットマップを持ちます。そのため、アップデート後でもビューに適切なパーミッションが強制されません。セキュリティが列単位のアクセス制御に依存したインストレーションでは、全てのユーザ定義ビューに「CREATE OR REPLACE ...」を実行し直して、再パースさせることが推奨されます。(CVE-2021-20229)

  3. 制約違反エラーメッセージでの情報漏洩が修正されました。 (Heikki Linnakangas) (13)(12)(11)
  4. UPDATEコマンドで異なるパーティションに行を移動しようとして、宛先パーティションでの何らか制約違反になって、かつ、そのパーティションの列が親テーブルと異なる物理位置である場合、エラーメッセージにユーザが SELECT権限を持たない列の内容が露出する可能性がありました。(CVE-2021-3393)

  5. GiSTインデックスに挿入する際の同時ページ分割の誤検知が修正されました。 (Heikki Linnakangas) (13)(12)
  6. 同時挿入により、誤ったページにエントリが配置されるインデックス破損が起きる可能性がありました。バージョンアップ後、同時挿入をしたかもしれない全ての GiSTインデックスを再作成をすることが推奨されます。

  7. CREATE INDEX CONCURRENTLY が同時実行の準備されたトランザクションを待機するように修正されました。 (Andrey Borodin) (13)(12)(11)(10)(9.6)(9.5)
  8. CREATE INDEX CONCURRENTLY が全ての同時実行トランザクションで挿入した行が可視になるようにそれらが完了するのを待機する箇所で、同じく全ての準備されたトランザクションが完了するのも待機しなければなりませんでした。これを行っていなかったことで、準備されたトランザクションにより挿入された行が新たなインデックスから無視されて、インデックスを使った問い合わせでそのような行が取りこぼされて、誤った問い合わせ結果が生じる可能性がありました。

    プリペアドトランザクションを使っているインストレーション(max_prepared_transaction が 1以上)では、本障害が起きている場合に備えて、全ての同時作成したインデックスを REINDEX することが推奨されます。

  9. ハッシュされたグルーピングセットとソートされたグルーピングセットの両方を持った集約プランノードの再スキャンを試みたときのクラッシュが回避されました。 (Jeff Davis) (13)
  10. (クラッシュが生じるプラン形状の例)
    db=# CREATE TABLE t5 (i int, j int);
    db=# INSERT INTO t5 SELECT g/10, g FROM generate_series(1,40) g;
    db=# explain (costs off) SELECT * FROM (VALUES (1),(2)) v(a),
           LATERAL (SELECT v.a, i, j, count(*) FROM t5 GROUP BY cube(i,j)) s
           ORDER BY v.a, i, j;
                     QUERY PLAN
    --------------------------------------------
     Sort
       Sort Key: "*VALUES*".column1, t5.i, t5.j
       ->  Nested Loop
             ->  Values Scan on "*VALUES*"
             ->  MixedAggregate
                   Hash Key: t5.i, t5.j
                   Hash Key: t5.i
                   Hash Key: t5.j
                   Group Key: ()
                   ->  Seq Scan on t5
    (10 行)
    
  11. ハッシュ集約ノードが一部のテーブルについてディスク書き出しを行うときに、誤った問い合わせ結果の可能性があり、修正されました。 (Tom Lane) (13)
  12. タプルが読み戻されたときに、集約のグルーピング値が NULL に置き換わる可能性があって、誤った問い合わせ結果につながりました。

  13. インクリメンタルソートにおける境界条件的なケースの障害が修正されました。 (Neil Chen) (13)
  14. ソートバッチの最後のタプルが偶然に既にソート済みの次グループの最初のタプルになった場合、これまでのコードは誤動作しました。これは「ERROR: retrieved too many tuples in a bounded sort」エラーか、エラー無しに誤った問い合わせ結果をもたらします。

  15. トランザクションのロールバックを行う CALL文または DO文が実行されたときのクラッシュが回避されました。 (Thomas Munro, Tom Lane) (13)(12)(11)
  16. PostgreSQL 13.x では、本ケースで確実に NULLポインタ参照が起きます。PostgreSQL 12.x、11.x では目に見える症状は現れないようですが、問題が決して起きないとは言えません。

    以下を拡張問い合わせとして実行して、クラッシュする動作が報告されました。

     DO $$ BEGIN ROLLBACK; END $$;
    
  17. パーティションテーブルにおける BEFORE UPDATEトリガでの不要なエラーを回避しました。 (Alvaro Herrera) (13)
  18. 行を変更した BEFORE UPDATE FOR EACH ROW トリガーは、何であれ、UPDATE が行を他パーティションに移動するのを妨げました。しかし、この制限をもうける必要がもはやありませんでした。

    本状況でこれからは以下のエラーが発生しなくなります。

    ERROR: moving row to another partition during a BEFORE trigger is not supported
    
  19. 問い合わせにおけるパーティション除外のロジックが、非対称なハッシュパーティションセットを扱えるように修正されました。 (Tom Lane) (13)(12)(11)
  20. ハッシュパーティションテーブルがサイズの異なるパーティション(即ち一様でない法の値)を持っている場合、あるいは、一部の残余の値に対してパーティションが欠けている場合、プランナの除外ロジックが除外可能なパーティションについて誤判断して、在るべき行が欠けた誤った問い合わせ結果が生じる可能性がありました。

  21. WHERE CURRENT OF が MergeAppendノードを含む実行プランに対するカーソルに使用されたときの誤った結果を回避するようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  22. このケースは本来サポートされません(一般に ORDER BY を使ったカーソルが必ず更新可能となることは保証されません)。しかしながら、これまでの実装では拒絶しておらず、エラー無しに誤った問い合わせ結果(誤った更新)が生じる可能性がありました。

  23. CustomScanノードを含む実行プランに対するカーソルにWHERE CURRENT OF が使われたときのクラッシュが修正されました。 (David Geier) (13)(12)(11)(10)(9.6)(9.5)
  24. プランナで外部結合のために遅延評価すべきプレースホルダに対する誤った処理が修正されました。 (Tom Lane) (13)(12)
  25. これは特に外部結合の出力に対する LATERAL参照を含む副問い合わせで発生します。この誤りにより異常な形状のプランが生じるおそれがありました。報告されているケースでは「ERROR: failed to assign all NestLoopParams to plan nodes:...」が生じましたが、それ以外の症状になる可能性もあります。

    以下の形状の SQL で上記エラーが生じる動作が報告されました。

    SELECT t13u.znum, g.v
      FROM t13u
      LEFT JOIN t13b on t13b.txt ~ 'xxx'
      LEFT JOIN LATERAL (SELECT regexp_replace(t13b.txt, 'xxx', '')::int v)
        AS g ON true
      LEFT JOIN t13r WHERE t13r.bnum = g.v;
    
  26. プランナで不要な RESULT RTE を削除する際のプレースホルダ処理が修正されました。 (Tom Lane) (13)(12)
  27. RESULT RTE とは問い合わせの結果出力で使うリレーションを意味します。

    この誤りにより、「ERROR: no relation entry for relid N」(Nは数値)というエラーが生じる可能性がありました。

    (本障害を発生させる SELECT文の例)
     SELECT z, a, b FROM (SELECT 0 AS z) AS t1
       LEFT JOIN (SELECT true AS a) AS t2 ON true,
       LATERAL (SELECT true AS b UNION ALL SELECT a AS b) AS t3 WHERE b;
    
  28. プランナで、ある結合レベルで計算されて、その同じレベルでしか使われないプレースホルダの処理が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  29. この誤りにより「ERROR: failed to build any N-way joins」(Nは数値)というプランナのエラーが生じる可能性がありました。

    結合に LATERAL参照を使っている場合に発生が報告されました。

  30. Gather Merge操作をプラン作成するときにソートされていない副パスを考慮するように修正されました。 (James Coleman) (13)
  31. 明示的に Sortノードを加えることでこのようなパスの使用は可能で、一部のケースではより優れたプランを生み出します。

  32. ソートを並列化しようとするときに、PARALLEL RESTRICTED な関数や集合を返す関数を伴う ORDER BY式については考慮外とするようにプランナが修正されました。 (James Coleman) (13)
  33. この場合、安全にワーカプロセスにプッシュすることはできませんが、インクリメンタルソート機能で誤ってこれらをプラン候補に含めてしまっていました。本障害でバックエンドプロセスのクラッシュが報告されています。

  34. インデックスのAM(アクセスメソッド)が mark/restore をサポートするかどうかについて、より注意深く扱われるようになりました。 (Andrew Gierth) (13)(12)(11)(10)(9.6)(9.5)
  35. これは稀なケースでサポート関数が欠けていることによるエラーを防止します。

    GiSTインデックスを使った Merge Join でエラー「ERROR: function ammarkpos is not defined for ...」が生じる動作が報告されました。

  36. 並列問い合わせで必要とする共有メモリ量の過大見積が修正されました。 (Takayuki Tsunakawa) (13)(12)(11)
  37. ALTER DEFAULT PRIVILEGES が重複する引数を安全に扱うように修正されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)(9.5)
  38. 同コマンド内の重複したロール名やスキーマ名は、「ERROR: tuple already updated by self」エラーやユニーク制約違反をもたらす可能性がありました。

  39. pg_authid が変更されたときに、ACL関連のキャッシュがフラッシュされるようになりました。 (Noah Misch) (13)(12)(11)(10)(9.6)(9.5)
  40. この変更により、ALTER ROLE ... [NO] INHERITの結果が迅速に反映されて権限判定が行われるようになります。

  41. 現在のトランザクションで書き換えられたテーブルについて、スナップショットが古すぎるかの判定に失敗する不具合が修正されました。 (Kyotaro Horiguchi, Noah Misch) (13)
  42. この不具合は、wal_level が minimal に設定された状態で、テーブルがALTER TABLE SET TABLESPACE で書き換えされていた場合でのみ発生します。 問い合わせで「ERROR: snapshot too old」が報告されない可能性がありました。

  43. 現在のトランザクション内でテーブルを作成または書き換えしている場合にの CREATE PUBLICATION の偽性のエラーが修正されました。 (Kyotaro Horiguchi) (13)
  44. 「ERROR: cannot access temporary or unlogged relations during recovery」や「ERROR: table ... cannot be replicated」が出る可能性がありました。この不具合は、wal_level が minimal に設定されている場合のみ発生します。 したがって、以下の警告が出るべきでした。「WARNING: wal_level is insufficient to publish logical changes」

  45. あいまいな CREATE TABLE の LIKE句の誤処理が防止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  46. CREATE TABLE ... LIKE ではテーブルを新しく作成した後、インデックスなどの取り込みを処理するために、LIKE句の再検査をします。この再検査で同じ名前の別のテーブルが見つかり、予期しない動作が発生する可能性がありました。一例として、新しく作成されるテーブルが、LIKE の対象と同じ名前の一時テーブルである場合が挙げられます。

    (以下を実行すると主キーインデックスの無い s24.t24 が作られてしまいます)
    db=# CREATE TABLE public.t24 (id int PRIMARY KEY);
    db=# BEGIN;
    db=# CREATE SCHEMA s24;
    db=# SET LOCAL search_path TO s24, public;
    db=# CREATE TABLE t24 (LIKE t24 INCLUDING ALL);
    db=# COMMIT;
    
  47. 外部キー制約を作成する前にインデックスが複製されるように、CREATE TABLE ... LIKE の処理順序を並べ替えるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  48. これにより、CREATE TABLE で宣言された自己参照外部キー制約が、LIKE句によるインデックスに依存するケースが修正されました。

    以下のような SQL が以前は動作していたものが、直近のマイナーバージョンからエラーになることが報告されました。

    db=# CREATE TABLE t25_base (id int PRIMARY KEY);
    db=# CREATE TABLE t25_inherited (
           LIKE id_base INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES,
           self_ref_if INT,
           FOREIGN KEY (self_ref_if) REFERENCES t25_inherited (id)
       ) INHERITS (t25_base);
    ERROR:  there is no unique constraint matching given keys for referenced table "t25_inherited"
    
  49. システムカタログに対する拡張統計オブジェクトの作成が禁止されました。 (Tomas Vondra) (13)(12)(11)(10)
  50. ただし、allow_system_table_mods = on であれば引き続き作成可能です。

  51. 継承された子テーブルをビューに変換することが禁止されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  52. 元々、ビューをテーブルの継承ツリーに加える操作は禁止されています。このような変換を含む継承ツリーに対する問い合わせでエラーやクラッシュが生じる可能性がありました。

    db=# CREATE TABLE t27a (id int);
    db=# CREATE TABLE t27b (id int);
    db=# CREATE TABLE t27c () INHERITS (t27a);
    
    (通常のテーブルは CREATE RULE でビューに変換できます)
    db=# CREATE RULE "_RETURN" AS ON SELECT TO t27b DO INSTEAD SELECT id FROM t27a;
    
    (継承の子テーブルはビューに変換できなくなります)
    db=# CREATE RULE "_RETURN" AS ON SELECT TO t27c DO INSTEAD SELECT id FROM t27a;
    ERROR:  could not convert table "t27c" to a view because it has child tables
    
  53. 削除されたリレーションに割り当てられたディスクスペースが、コミット時にすぐ解放されることが保証されました。 (Thomas Munro) (13)(12)(11)(10)(9.6)(9.5)
  54. これまでは、そのテーブルやインデックスが複数セグメントにわたっている場合に、先頭セグメントだけは即座にサイズゼロになりますが、残りのセグメントは単純にファイル削除を行っていたため、他のバックエンドがファイルオープンしている間はディスクスペースが解放されませんでした。

  55. パーティションテーブルによって参照されているけれども、実際のデータは格納されないテーブルスペースを削除できないようになりました。 (Alvaro Herrera) (13)(12)(11)
  56. 以前は削除できましたが、パーティション化されたリレーションに対して、その後に行われる操作が失敗しました。 クラッシュが生じるケースが報告されています。

  57. CLUSTERコマンドの進捗状況報告が正しく行われるようになりました。 (Matthias van de Meent) (13)(12)
  58. pg_stat_progress_cluster の heap_blks_scanned列の値が誤っていました。

  59. COPY FROM でバックスラッシュでエスケープされたマルチバイト文字を正しく処理できるようになりました。 (Heikki Linnakangas) (13)(12)(11)(10)(9.6)(9.5)
  60. これまではバックスラッシュとそれに続くマルチバイト文字は正しく処理されませんでした。一部のクライアント文字エンコーディングでは、この影響によりマルチバイト文字の一部がフィールドセパレータまたはコピーデータの終わりを表すマーカーとして、誤って解釈される可能性がありました。

  61. ANALYZEオプションのない EXPLAIN で、エグゼキュータのハッシュテーブルが事前に割り当てられないようになりました。 (Alexey Bashtanov) (13)(12)(11)(10)(9.6)(9.5)
  62. 実際の問い合わせ実行はしないので不要な動作でした。

  63. 最近の修正により発生するようになった、LISTEN/NOTIFY のキュー処理における競合状態が修正されました。 (Tom Lane) (13)
  64. 新しく LISTEN しているバックエンドが、切り捨てられている途中の SLRU ページを読み取ろうとして、エラーが発生する可能性がありました。

    「WARNING: NOTIFY queue is NN% full」(NNは数値)や、「ERROR: too many notifications in the NOTIFY queue」が生じます。

  65. jsonb 連結演算子が JSONデータ型のすべての組み合わせを処理できるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  66. 2つの JSONオブジェクト、または 2つの JSON配列を連結できるようになりました。配列以外のオブジェクトを 1要素の JSON配列でラップした後、JSON配列の連結を実行することにより、すべての組み合わせを処理できるようになりました。

    修正以前は、オブジェクト結合のいくつかの組み合わせは、この方式で結合されていましたが、その他の組み合わせはエラーになりました。

  67. BREモードの正規表現で「*」数量詞を解析する際の、未初期化値の使用による不具合が修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  68. この不具合により、「*」数量詞が完全な正規表現(ARE)で実行された最短マッチの動作、すなわち「*?」のように動作する可能性があります。

  69. 指数がちょうど INT_MIN(-2147483648)である場合について、numeric を返す power() の動作が修正されました。 (Dean Rasheed) (13)(12)(11)(10)(9.6)
  70. 「^」演算子も同様に該当します。

    (報告された誤動作例、2行目の pow は正しくは 0.7678656556403084 )
    db=# SELECT n, 1.000000000123^n AS pow FROM (VALUES (-2147483647), (-2147483648), (-2147483649)) AS v(n);
          n      |        pow
    -------------+--------------------
     -2147483647 | 0.7678656557347558
     -2147483648 | 1.0000000000000000
     -2147483649 | 0.7678656555458609
    (3 rows)
    
  71. substring() 関数の整数オーバーフローの不具合が修正されました。 (Tom Lane, Pavel Stehule) (13)(12)(11)
  72. 引数に指定された開始インデックスと長さを加算して、整数のオーバーフローが発生した場合、誤動作を引き起こしていました。「ERROR: negative substring length not allowed」が生じるか、あるいは、エラーは出ずに単に文字列全体が返されました(大部分のケースはこちらです)。

  73. SLRUログ周回点の誤検出によるデータ損失の可能性が防止されました。 (Noah Misch) (13)(12)(11)(10)(9.6)(9.5)
  74. 通常、周回点にはページの半ばで到達し、これをページの境界に丸める必要がありましたが、正しく行われていませんでした。データベースクラスタが SLRUオーバーフローまでの 1ページ以内に到達しない限り、この問題は発生せず、適切に機能しているシステムで起こる可能性は低いです。

    この問題が発生した場合、後の「apparent wraparound」を含むログメッセージや「ERROR: could not access status of transaction」のエラーで顕在化します。「LOG: could not truncate directory "pg_xact": apparent wraparound」が出るケースが報告されました。

  75. タイムラインスイッチを正しく処理するように、WAL読み取りロジックが修正されました。 (Kyotaro Horiguchi, Fujii Masao) (13)
  76. 以前は、WALアーカイブが有効になっていると、スタンバイが新しいタイムラインで実行されているプライマリを追跡できず「ERROR: requested WAL segment ... has already been removed」などのエラーが発生する可能性がありました。

  77. 論理デコード用に新しいスナップショットを送信する際の、walsenderプロセスのメモリリークが修正されました。 (Amit Kapila) (13)(12)(11)(10)(9.6)(9.5)
  78. 論理レプリケーション中にパーティションテーブルのルートを介して行の変更を送信する際の、walsenderプロセスのリレーションキャッシュの解放漏れが修正されました。 (Amit Langote, Mark Zhao) (13)
  79. レプリケーション終了後に追加のコマンドを受け入れるように walsenderプロセスが修正されました。 (Jeff Davis) (13)(12)(11)(10)(9.6)(9.5)
  80. pg_basebackup 実行時にアサート失敗が生じる問題が報告されました。

  81. ホットスタンバイのバックエンドと startup(WAL適用)プロセスの間のデッドロックを検出するようになりました。 (Fujii Masao) (13)(12)(11)(10)(9.6)
  82. startupプロセスはデッドロックの検出処理を行っていないため、startupプロセスが最後に循環待機に参加した場合は、デッドロックが検出されない可能性がありました。

  83. HOTチェインを参照するインデックスエントリの削除中にリカバリの競合を検出できない問題が修正されました。 (Peter Geoghegan) (13)(12)
  84. 以前は HOTチェインを辿るのに失敗して古すぎるトランザクションID限界を計算してしまい、ホットスタンバイでリカバリ競合を誤って処理する可能性がありました。ほとんどの場合、正しいトランザクションID限界は HOTチェインを調べなくとも取得できるため、このバグによる影響は限定的です。

  85. krb_server_keyfileパラメータ値が空でない場合は、常にサーバの KRB5_KTNAME環境変数による設定を上書きするようになりました。 (Tom Lane) (13)(12)
  86. 以前は、どちらの設定が優先されるかはクライアントが GSS暗号化を要求するかによって異っていました。

  87. pg_hba.confファイルに一致するエントリがないときのログメッセージに、GSS暗号化が有効化されているかを詳細情報を含めるようになりました。 (Kyotaro Horiguchi, Tom Lane) (13)(12)
  88. hostgssenc または hostnogssenc のエントリが存在する場合は関連データがログメッセージに含まれます。

  89. サーバの GSS暗号化対応に関する様々な問題が修正されました。 (Tom Lane) (13)(12)
  90. GSS暗号化接続では GSS認証しか使用できないという無意味な制限が解除されました。GSS暗号化情報が接続認証時のログメッセージに追加されました。

    共有メモリの必要サイズを計算するときに GSS暗号化関連の領域を含めるようになりました。以前は max_connectionsパラメータの値を非常に大きくした場合に問題が発生する可能性がありました。

    復旧不能な GSS暗号化エラーを報告するときの無限再帰が回避されました。

  91. サーバが smart または fast モードで停止を開始するとき、バックグラウンドワーカに対する保留中の要求をキャンセルするようになりました。 (Tom Lane) (13)(12)(11)(10)
  92. 以前は、停止直前にバックグラウンドワーカを要求したプロセスが無限に待機し、停止が完了しなくなる競合状態が発生していました。

  93. recovery_target_xidパラメータ値を解析する際の移植性の問題が修正されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)
  94. 指定されるトランザクションID はエポックを含めて 64ビット幅になりえますが、strtoul() 関数で解析されていたため、long型が 32ビットのプラットフォーム(Windows など)で不正な値としてエラーが発生していました。

  95. シングルユーザモードではパラレルインデックス作成が機能しないため、使用しないようになりました。 (Yulin Pei) (13)(12)(11)
  96. backend> SET log_min_messages TO debug5;
    backend> CREATE INDEX ON t (c);
    
    (修正前)
    DEBUG:  building index "t_c_idx" on table "t" with request for 2 parallel workers
    
    (修正後)
    DEBUG:  building index "t_c_idx" on table "t" serially
    
  97. インデックスの AM が複数列インデックスに対応していなくてもINCLUDE句に対応できるようになりました。 (Tom Lane) (13)(12)(11)
  98. ベースバックアップを取得するとき、バックアップマニフェストが不要な場合にSHA256ハッシュを初期化しないようになりました。 (Michael Paquier) (13)
  99. FIPSモードの OpenSSLを使用する場合、SHA256ハッシュは拒否され、エラーが発生します。エラーを解消するには EVPハッシュへの書き換えが必要ですが、マイナーリリースでは互換性を維持するためにできません。この修正により、--no-manifest オプションを指定すれば、そのような場合でもベースバックアップを取得できます。

  100. STRICTでないデシリアライズ関数を指定した集約関数のパラレル処理中でアサート失敗が回避されました。 (Andrew Gierth) (13)(12)(11)
  101. そのような集約関数は PostgreSQL本体には存在しませんが、PostGIS などの一部の拡張では提供されています。いずれにしてもアサートを有効にしたビルドでなければ影響はありません。

  102. pg_get_functiondef() で、TRANSFORMオプションを伴う関数の検査時におけるアサート失敗が回避されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  103. pg_get_functiondef() は psql で関数定義を出力するときなどに使われます。

    (他に以下のようなフォーマットの乱れも生じました)
    db=# CREATE FUNCTION f(bool) RETURNS void AS $$
       $$ LANGUAGE plperl TRANSFORM FOR TYPE bool;
    
    (修正前)
    db=# \sf f
    CREATE OR REPLACE FUNCTION public.f(boolean)
     RETURNS void
    
     TRANSFORM FOR TYPE boolean LANGUAGE plperl
    AS $function$
    $function$
    
    (修正後)
    =# \sf f
    CREATE OR REPLACE FUNCTION public.f(boolean)
     RETURNS void
     TRANSFORM FOR TYPE boolean
     LANGUAGE plperl
    AS $function$
       $function$
    
  104. PL/pgSQL の CALL文でデータ構造の誤った割り当てが修正されました。 (Tom Lane) (13)(12)(11)
  105. 以前はプロシージャ内で INOUT引数を持つ別のプロシージャを呼び出すと、呼び出し先で COMMIT または ROLLBACK 文を実行した場合にエラーになりました。

    (障害動作例)
    db=# CREATE PROCEDURE p1(INOUT a int) LANGUAGE plpgsql AS $$
           BEGIN COMMIT; a := 1; END; $$;
    db=# CREATE PROCEDURE p2() LANGUAGE plpgsql AS $$
           DECLARE a int := 2;
           BEGIN CALL p1(a); END; $$;
    db=# CALL p2();
    ERROR:  unsupported target type: 0
    CONTEXT:  PL/pgSQL function p2() line 5 at CALL
    
  106. libpq で GSS暗号化接続の後に SSL暗号化接続を試すようになりました。 (Tom Lane) (13)(12)
  107. 以前は GSS暗号化接続を確立した後、認証中に失敗した場合、SSL暗号化接続を試すことなく、非暗号化接続にフォールバックしていました。これにより、予期しない接続エラーが発生したり、暗号化が期待される場所で黙って暗号化されていなかったりする可能性がありました。

  108. libpq の PQconndefaults() 関数が channel_binding接続パラメータの正しいデフォルト値を返すようになりました。 (Daniele Varrazzo) (13)
  109. 以前は NULL を返していました。

  110. psql の \connect コマンドが引数の接続文字列にパスワードを指定できるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  111. 以前は機能していましたが、最近のバグ修正でパスワード指定が無視され、パスワード入力が求められるようになっていました。

  112. psql の \dコマンドで、列のデフォルト値が切り捨て表示されないようになりました。 (Tom Lane) (13)(12)
  113. 以前は、128 文字で勝手に切り捨てられていました。

    =# CREATE TABLE t (c text DEFAULT '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');
    CREATE TABLE
    
    (修正前)
    =# \d t
                                                                                Table "public.t"
     Column | Type | Collation | Nullable |                                                             Default
    --------+------+-----------+----------+----------------------------------------------------------------------------------------------------------------------------------
     c      | text |           |          | '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
    
    (修正後)
    =# \d t
                                                                                     Table "public.t"
     Column | Type | Collation | Nullable |                                                                  Default
    --------+------+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------
     c      | text |           |          | '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'::text
    
  114. psql の \help コマンドの様々なバグが修正されました。 (Kyotaro Horiguchi, Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  115. 以前は引数が複数の単語からなる場合に最初の単語を使ってヘルプが見つけられませんでした。例えば、\help RESET ALL で RESET文のヘルプを表示できませんでした。また、必要な場合にページャを呼び出せないことがよくあり、メモリリークも発生していました。

    (修正前)
    db=# \help RESET ALL
    No help available for "RESET ALL".
    Try \h with no arguments to see available help.
    
    (修正後)
    db=# \help RESET ALL
    Command:     RESET
    Description: restore the value of a run-time parameter to the default value
    Syntax:
    RESET configuration_parameter
    RESET ALL
    
    URL: https://www.postgresql.org/docs/13/sql-reset.html
    
  116. pg_dump での継承された生成列のダンプが修正されました。 (Peter Eisentraut) (13)(12)
  117. 以前の動作ではリストア時に無害ですが余計なエラーが発生していました。

    (該当するテーブル定義例)
    CREATE TABLE t61p (c1 int, c2 int GENERATED ALWAYS AS (c1 * 2) STORED);
    CREATE TABLE t61c () INHERITS (t61p);
    
    (リストア時のエラー例)
    pg_restore: from TOC entry 3432; 2604 33854 DEFAULT t61c c2 postgres
    pg_restore: error: could not execute query: ERROR:  column "c2" of relation "t61c" is a generated column
    Command was: ALTER TABLE ONLY public.t61c ALTER COLUMN c2 SET DEFAULT (c1 * 2);
    
  118. pg_dump でリストアスクリプトが ALTER PUBLICATION ADD TABLE コマンドをパブリケーションの所有者として実行するようになりました。 (Tom Lane) (13)(12)(11)(10)
  119. (11.x 以降バージョンでは)同様に ALTER INDEX ATTACH PARTITION コマンドもパーティションインデックスの所有者として実行するようになりました。

    以前は、これらのコマンドはリストアスクリプトを開始したロールによって実行されていました。これらは通常動作しますが、場合によってはそのロールが十分な権限を持っていない可能性がありました。

  120. 拡張の初期権限で WITH GRANT OPTION を扱うように pg_dump が修正されました。 (Noah Misch) (13)(12)(11)(10)(9.6)
  121. 拡張のスクリプトがオブジェクトを作成し、そのオブジェクトに GRANT OPTIONで権限を付与した場合、後にユーザがそのような権限を取り消すとpg_dump はその状況を再現するために誤ったSQLを生成してしまいます。

    ただし、この誤動作に該当する拡張は今日ほとんどありません。

  122. pg_rewind でスタンバイサーバを巻き戻す際にすべてのWALを考慮するようになりました。 (Ian Barwick, Heikki Linnakangas) (13)(12)(11)(10)(9.6)(9.5)
  123. 巻き戻しが必要であるときに、巻き戻し不要と判断するケースがありました。

  124. pgbench で変数名の最初の文字として数字の使用が禁止されました。 (Fabien Coelho) (13)(12)(11)
  125. これにより、変数を「12:34」のような文字列を含むタイムスタンプのリテラル値に代入しようとする動作を防ぎます。

  126. 一部のクライアントプログラムからの接続失敗エラーメッセージで正しいデータベース名が報告されるようになりました。 (Alvaro Herrera) (13)(12)(11)(10)(9.6)(9.5)
  127. データベース名がコマンドラインで指定されるのではなくデフォルトで設定されていた場合、pg_dumpall、pgbench、oid2name、vacuulo は、接続失敗後に誤解を招くエラーメッセージを出力していました。

    (データベース名が空欄のエラーメッセージ例)
    [user1@host1 ~]$ pgbench
    pgbench: error: connection to database "" failed: FATAL:  role "user1" does not exist
    
  128. contrib/auto_explain のメモリリークが修正されました。 (Japin Li) (13)(12)(11)(10)(9.6)(9.5)
  129. EXPLAIN 出力を生成中に消費されたメモリは、現在のトランザクションが終了するまで(最上位の文の場合)、または周囲の文が終了するまで(入れ子になった文の場合)解放されませんでした。これは log_nested_statements が有効な場合に特に問題でした。

  130. contrib/postgres_fdw でユーザマッピングや外部サーバオブジェクトが削除された場合に、リモートサーバへのオープンしている接続がクローズされずに残る動作が回避されました。 (Bharath Rupireddy) (13)(12)(11)(10)(9.6)(9.5)
  131. これからは削除されたユーザーマッピングや外部サーバに依存する接続は切断されて参照できなくなります。以前はローカルセッションの間は何であれ維持されていました。

  132. contrib/postgres_fdw の誤ったアサーションが修正されました。 (Etsuro Fujita) (13)
  133. contrib/pgcrypto で、OpenSSL の EVP関数からのエラー応答を確認するようになりました。 (Michael Paquier) (13)(12)(11)(10)(9.6)(9.5)
  134. 実際にはここでエラーは発生しないと考えられますが、この変更により静的分析ツールからの警告が表示されなくなりました。

  135. プレウォームが完了する前にクラスタがシャットダウンされた場合について、contrib/pg_prewarm がより頑健になりました。 (Tom Lane) (13)(12)(11)
  136. 以前は、autoprewarm はこれまでにロードできたブロック番号のみでステータスファイルに書き換えていました。そのため、次回の起動時にプレウォーム機能が大幅に無効化されてしまう可能性がありました。本修正により、最初のロードパスが完了するまでステータスファイルの更新を抑制するようになりました。

  137. contrib/pg_trgm の GiSTインデックスのサポートにおいて、picksplit が正確に 2つのインデックス項目で呼び出された場合におけるクラッシュが回避されるようになりました。 (Andrew Gierth, Alexander Korotkov) (13)(12)(11)(10)(9.6)(9.5)
  138. contrib/pg_prewarm および contrib/postgres_fdw における誤ったタイムアウトの計算が修正されました。 (Alexey Kondratov, Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  139. contrib/pg_prewarm の autoprewarm 親プロセスのメインループは、望ましいスリープ時間を 1000分の 1 に過小評価しており、意図したよりもはるかに多くの CPUを消費していました。リモートサーバからの結果を待つ場合、contrib/postgres_fdw は、希望するタイムアウト時間を 1000倍に過大評価していました。(ただしこの誤りは 60秒の上限を設けていたことで軽減されていました)

    これらのエラーはどちらも、秒とマイクロ秒をミリ秒に誤って変換することに起因していました。新しい API TimestampDifferenceMilliseconds() を導入して、将来的にこれをより簡単に正しく取得できるようにしました。

  140. macOS で PG_SYSROOT を選択する際の configure のヒューリスティックが改善されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  141. この新しい方式により、Xcode が基盤となるオペレーティングシステムよりも新しい場合に、望ましい結果が得られる可能性が高くなります。OS のバージョンと一致しない sysroot を選択すると、実行可能ファイルが機能しなくなるかもしれません。

  142. macOS 上でビルドする場合は、コンパイルステップと同様にリンクステップでも -isysroot を指定するようになりました。 (James Hilliard) (13)(12)(11)(10)(9.6)(9.5)
  143. これにより、Xcode がオペレーティングシステムと同期していない場合の結果も同様に改善されます。

  144. LLVM 11 および LLVM 12 と互換性があるように JITコンパイルが修正されました。 (Andres Freund) (13)(12)(11)
  145. JIT式のコンパイルでブーリアン変数への参照が誤って処理される可能性があり、修正されました。 (Andres Freund) (13)(12)(11)
  146. これに起因する障害報告は確認されていませんが、一部のアーキテクチャでは問題が発生する可能性がありました。

  147. ICU 68 以降でのコンパイル失敗が修正されました。 (Tom Lane) (13)(12)(11)
  148. パーティションインデックス作成時に、NULL のソースポインタとコピー数がゼロの memcpy() 実行を回避するようになりました。 (Alvaro Herrera) (13)(12)(11)
  149. このような呼び出し自体が問題を引き起こすことは知られていませんが、一部のコンパイラは memcpy() の引数が決して NULL ではないと仮定しているため、近くのコードが正しく最適化されない可能性があります。

  150. タイムゾーンデータファイルが tzdata release 2021a に更新されました。 (13)(12)(11)(10)(9.6)(9.5)
  151. ロシア(ボルゴグラードゾーン)と南スーダンでの夏時間法の変更に加えて、オーストラリア、バハマ、ベリーズ、バミューダ、ガーナ、イスラエル、ケニア、ナイジェリア、パレスチナ、セーシェル、バヌアツの歴史的修正が含まれます。

    特に、Australia/Currie は、Australia/Hobart と同じになるように修正されました。

  152. パラレルクエリを頻繁に使用しているときに、DSMスロットを使い切ることがないように設定が調整されました。 (Thomas Munro) (12)(11)(10)
  153. ソースコード内の定数値が変更されました。

  154. LISTEN/NOTIFY のキュー処理で最近組み込まれた競合状態が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  155. 新たに LISTEN しているバックエンドが、切り捨てられている途中のSLRUページを読み取ろうとして、エラーが発生する可能性がありました。

    キューの末尾ポインタがバックエンドのキュー位置と等しくない値に設定される可能性があり、その結果、キュー切り捨てロジックが実際には無効になります。その後 NOTIFY の継続的な使用は、キューがいっぱいの警告を発生させ、最終的にはサーバが再起動されるまで NOTIFY を送ることができなくなりました。

PostgreSQL 13.1、12.5、11.10、10.15、9.6.20、9.5.24 (2020年11月12日リリース)の変更点

  1. インデックス式およびマテリアライズドビュー定義内での、DECLARE CURSOR ... WITH HOLD と遅延トリガの駆動が禁止されました。 (Noah Misch) (13)(12)(11)(10)(9.6)(9.5)
  2. これらはアクセス制限の仕組みの抜け穴となっていて、テンポラリでない SQLオブジェクトを作る権限を持った攻撃者はスーパーユーザとして任意の SQL実行が可能でした。(CVE-2020-25695)

    これからは該当する操作について、それぞれ以下のエラーが生じます。

    ERROR:  cannot create a cursor WITH HOLD within security-restricted operation
    
    ERROR:  cannot fire deferred trigger within security-restricted operation
    
  3. pg_dump、pg_restore、clusterdb、reindexdb、vacuumdb の各コマンドにおける複合的な接続文字列パラメータの使用方法について修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  4. pg_dump と pg_restore の -d パラメータや他コマンドの --maintenance-db パラメータには、単一のデータベース名ではなく、複合的な接続パラメータを含む接続文字列を与えることもできます。

    これらのコマンドが、並列処理や複数データベース処理などで、追加的な接続を開始する必要がある場合、指定した接続文字列が無視されて、通常の接続パラメータ(データベース名、ホスト、ポート、ユーザ名)が使われていました。

    デフォルトと異なる SSL や GSS のパラメータなど、接続文字列に何らか重要な情報が含まれている場合、この振る舞いのために接続失敗が生じる可能性がありました。さらに悪いことに、接続は成功するけれども意図通りに暗号化されていないというセキュリティ上の危険を伴う動作もあり得ました。(CVE-2020-25694)

    (以下コマンドで --jobs 指定があるとき失敗するという発生例が報告されました)
    $ pg_dump --dbname="sslmode=verify-ca sslrootcert=server-ca.pem \
       sslcert=client-cert.pem sslkey=client-key.pem \
       hostaddr=1.2.3.4 user=postgres dbname=app" \
       --format=directory --file=dump.dat --jobs=3 
    
  5. psqlの \connect コマンドが接続パラメータを再使用したとき、以前の接続文字列から上書きされていない全てのパラメータが確実に再使用されるようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  6. これまでは、デフォルトでない SSL や GSS のオプションなどのパラメータが無視されて再接続に失敗することがありました。さらに悪いことに、再接続は成功するけれども意図通り暗号化されず、セキュリティ上の危険を伴う動作もあり得ました。(CVE-2020-25694)

  7. psql の \gset コマンドが特別に扱われる変数を変更してしまう動作が防止されました。 (Noah Misch) (13)(12)(11)(10)(9.6)(9.5)
  8. PROMPT1 などのプロンプトの変数にはコマンド実行結果を含めることができるため、安全でないサーバから意図せぬ SQL実行結果が返ることで、クライアント側で任意のシェルコマンドが実行されてしまう危険がありました。(CVE-2020-25696)

    (特別に扱われる変数を上書きしてしまう動作例)
    db1=# SELECT 'off' as "AUTOCOMMIT", '%`hostname`> ' as "PROMPT1"; \gset
     AUTOCOMMIT |    PROMPT1
    ------------+---------------
     off        | %`hostname`>
    (1 row)
    
    host1> \echo :AUTOCOMMIT
    off
    host1>
    
  9. レプリケーションプロトコルの意図せぬ動作が修正されました。 (Álvaro Herrera) (13)
  10. 13.0 以降で wal sender は START_REPLICATION に対してコマンド完了イベントを二つ報告します。これはドキュメントに記載されておらず、明らかに意図されたものではありません。しかしながら、wal receiver が一部のコードパスで余分なイベントを必要とすることが判明したため、二つのコマンド完了イベントが返る動作を正として修正され、そのようにドキュメント記載されました。

  11. チェックポイント時に SLRUディレクトリが適切に fsync されることが保証されました。 (Thomas Munro) (13)(12)(11)(10)(9.6)(9.5)
  12. これは OS のクラッシュによるデータ損失を防止します。SLRUディレクトリとして、トランザクション制御に使われる pg_xact (pg_clog)、pg_commit_ts、pg_subtrans、共有行ロック制御に使われる pg_multixact などが該当します。

  13. BYPASSRLS属性を伴うユーザに対する ALTER ROLE が修正されました。 (Tom Lane, Stephen Frost) (13)(12)(11)(10)(9.6)(9.5)
  14. BYPASSRLS属性の変更はスーパーユーザによってのみ行えます。しかし、パスワード変更など、他の ALTER ROLE操作は、通常のパーミッション検査によって許可されるべきです。これまでは誤って、BYPASSRLS属性を持ったユーザに対するすべての変更にスーパーユーザ権限が必要となっていました。

    (修正前の動作例: BYPASSRLS属性があると自身のパスワード変更に失敗)
    db1=# ALTER ROLE foo BYPASSRLS;
    ALTER ROLE
    db1=# \c db1 foo
    You are now connected to database "db1" as user "foo".
    db1=> ALTER ROLE foo PASSWORD 'newpass';
    ERROR:  must be superuser to change bypassrls attribute
    
  15. 子テーブルに対して ALTER TABLE ONLY ... DROP EXPRESSION が禁止されました。 (Peter Eisentraut) (13)
  16. これは生成列を通常の列にするコマンドですが、現在の実装では子テーブルに対して正しく処理できないため、当面は単にこれを禁止することになりました。

  17. ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER が子テーブルを再帰的に処理しないようになりました。 (Álvaro Herrera) (13)(12)(11)
  18. これまで ONLYフラグが無視されていました。

  19. LOCK TABLE が自己参照ビューに対しても成功するようになりました。 (Tom Lane) (13)(12)(11)
  20. これまでは無限再帰を理由としたエラー(ERROR: infinite recursion detected ...)が出ていましたが、禁止する実装上の理由はありませんでした。定義可能な自己参照ビューの pg_dump に失敗する問題が報告されていました。

  21. REINDEX CONCURRENTLY の前後でインデックス式のプランナ統計情報が維持されるようになりました。 (Michael Paquier, Fabrízio de Royes Mello) (13)(12)
  22. これは CONCURRENTLY ではない通常の REINDEX と同じ動作です。

  23. REINDEX CONCURRENTLY からの誤った進捗報告が修正されました。 (Matthias van de Meent, Michael Paquier) (13)(12)
  24. pg_stat_progress_create_index ビューに異なるテーブルやインデックスのOID が現れる動作が報告されました。

  25. ルールや更新可能ビューを通して依存する列が更新されたときに、生成列が確実に更新されるようになりました。 (Tom Lane) (13)(12)
  26. 以下のような定義のテーブルとビューに対して、

    CREATE TABLE t13 (id serial, idplus1 int GENERATED ALWAYS AS (id + 1) STORED);
    CREATE VIEW v13 AS SELECT * FROM t13;
    

    以下のような更新に失敗する場合が報告されました。

    UPDATE v13 SET id = 1000 WHERE id = 1;
    

    更新可能ビューを通した更新による列指定トリガの駆動に失敗する可能性もあり、本修正はこちらにも対応しています。

  27. 照合順序に依存したパーティション境界の式でのエラーが修正されました。 (Tom Lane) (13)(12)
  28. 以下のように照合順序(COLLATE)によって結果が変わる式を指定すると、これまではエラーになっていました。これからは、定義時点のデフォルト照合順序で境界条件の式が評価されるようになります。

    (従来の動作例)
    db1=# CREATE TABLE pt14 (b boolean, v text) PARTITION BY LIST (b);
    db1=# CREATE TABLE pt14_1 PARTITION OF pt14 FOR VALUES IN ('foo' < 'bar');
    ERROR:  could not determine which collation to use for string comparison
    HINT:  Use the COLLATE clause to set the collation explicitly.
    
  29. テキスト配列のハッシュ作成がサポートされました。 (Peter Eisentraut) (13)(12)
  30. 配列要素が照合順序に影響を受ける場合に配列のハッシュ作成が失敗していました。特に、テキスト配列の列をキーとしたハッシュパーティショニングの利用を妨げていました。

    これまでは以下のように行を挿入した時点でエラーが発生していました。これからはデフォルトの照合順序が適用されてエラーが回避されます。

    db1=# CREATE TABLE pt15 (ta text[], v text) PARTITION BY HASH (ta);
    db1=# CREATE TABLE pt15_0 PARTITION OF pt15 FOR VALUES
            WITH (MODULUS 2, REMAINDER 0);
    db1=# CREATE TABLE pt15_1 PARTITION OF pt15 FOR VALUES
            WITH (MODULUS 2, REMAINDER 1);
    db1=# INSERT INTO pt15 VALUES (ARRAY['abc'], 'val1');
    ERROR:  could not determine which collation to use for string hashing
    HINT:  Use the COLLATE clause to set the collation explicitly.
    
  31. データ型の異なる日付時刻の比較で、内部オーバーフローが防止されました。 (Nikita Glukhov, Alexander Korotkov, Tom Lane) (13)
  32. date型と timestamp型の比較で、date型の値が timestamp の有効範囲を超える場合にエラーが生じていました。また、timestamp型 と timestamptz型の比較で、タイムゾーンを適用すると有効範囲を超える場合にもエラーが生じていました。

    型キャストできない場合でも正しく比較ができるように修正されました。

    (修正前の動作: 修正後はいずれも true が返ります)
    db1=# SELECT '2202020-10-05'::date > '2020-10-05'::timestamp;
    ERROR:  date out of range for timestamp
    db1=# SET TimeZone = 'UTC-2';
    db1=# SELECT '4714-11-24 BC'::date < '2020-10-05'::timestamptz;
    ERROR:  date out of range for timestamp
    db1=# SELECT '4714-11-24 BC'::timestamp < '2020-10-05'::timestamptz;
    ERROR:  timestamp out of range
    
  33. to_date() と to_timestamp() におけるマイナス年から紀元前日付への1年ずれた変換が修正されました。 (Dar Alathar-Yemen, Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  34. また、マイナス年と明示的な BC指定は打ち消し合って、紀元後の年になります。このことがドキュメントにも明記されました。

    (誤動作例: 正しくは「0001-01-01 BC」)
    db1=# SELECT to_date('-1-01-01','yyyy-mm-dd');
        to_date
    ---------------
     0002-01-01 BC
    (1 row)
    
    (誤動作例: 修正後はマイナス年と BC が打ち消し合って紀元後の年になる)
    db1=# SELECT to_timestamp('-44-02-01 11:12:13 BC', 'YYYY-MM-DD HH24:MI:SS BC');
              to_timestamp
    ---------------------------------
     0045-02-01 11:12:13+09:18:59 BC
    (1 row)
    
  35. jsonpath の .datetime() メソッドが ISO 8601 書式のタイムスタンプに対応しました。 (Nikita Glukhov) (13)
  36. これは SQL標準では必須ではありませんが、to_json() 関数は Javascript互換のtimestamp書式を生成するため、対応するのが適切と判断されました。

    ISO 8601 書式は「T」を使った「2017-03-10T12:34:56+3:10」といったものです。

  37. archive_mode が 'always' であるときスタンバイサーバが WALタイムラインヒストリファイル(.historyファイル)をアーカイブするように修正されました。 (Grigory Smolkin, Fujii Masao) (13)(12)(11)(10)(9.6)(9.5)
  38. これまではプライマリサーバからストリーミングレプリケーションで取得した本ファイルをアーカイブしませんでした。その結果、スタンバイサーバの PITRリカバリに失敗する可能性がありました。

  39. kqueue() システムコールを使うプラットフォームで、早すぎる postmasterダウンを判定をするときの境界条件的な場合が修正されました。 (Thomas Munro) (13)
  40. postmasterダウン後の動作が適切ではありませんでした。

  41. ソートキーが揮発的な式であるときの、誤ったインクリメンタルソートのプランの生成を回避するように修正されました。 (James Coleman) (13)
  42. 本障害により、SQL実行時に以下のエラーが出ることがありました。

    ERROR:  ORDER/GROUP BY expression not found in targetlist
    
  43. プランナが GEQO によるプラン作成でパーティション毎の結合を検討するときにクラッシュする可能性があり、修正されました。 (Tom Lane) (13)(12)
  44. TOASTデータの展開で無限ループや破損データ出力をする可能性があり、修正されました。 (Tom Lane) (13)
  45. クリーンアップのみを行う VACUUM で、B-treeインデックスのエントリ数のカウントについて修正されました。 (Peter Geoghegan) (13)
  46. 結果として、プランナ統計情報の pg_class.reltuples が誤って 0 となる可能性がありました。

  47. BRINインデックスに挿入される前に、データが確実に TOAST展開されるように、修正されました。 (Tomas Vondra) (13)(12)(11)(10)(9.6)(9.5)
  48. インデックスエントリは 行外の TOASTポインタを含むことができませんが、BRIN では考慮されていませんでした。この結果、「ERROR: missing chunk number 0 for toast value NNN」といったエラーが発生する可能性がありました。

    既存のインデックスでこのようなエラーに遭遇した場合には、REINDEX で修正できます。

  49. INCLUDEカラムを持つインデックスでのバッファ付き GiSTインデックス構築が動作するように修正されました。 (Pavel Borisov) (13)(12)
  50. CREATE INDEX で格納オプションに buffering=on を指定していたり、インデックスサイズが effective_cache_size 設定値に達した場合に、バッファ付きインデックス構築が行われます。

    本障害でクラッシュを引き起こす可能性がありました。

  51. pg_hba_file_rules ビューでの getnameinfo() の移植性のない使用が修正されました。 (Tom Lane) (13)(12)(11)(10)
  52. FreeBSD 11、そしておそらく他のプラットフォームでは、このエラーのためにビューのアドレスとネットマスクの列が常に null になっていました。

  53. パラレルワーカの起動時に debug_query_string が NULL の場合のクラッシュが回避されました。 (Noah Misch) (13)(12)(11)
  54. 上記の debug_query_string は PostgreSQL実装内のグローバル変数名です。

  55. OLD を返す BEFORE ROW UPDATE トリガについて修正されました。 (Amit Langote, Tom Lane) (13)(12)
  56. OLD を返す BEFORE ROW UPDATEトリガは更新を抑止するために使われます。このようなトリガが、削除されていたり見つからない列を持つテーブルについてOLD を返した場合、これらの列が NULL として読み取られてしまうため、クラッシュ、予期しない CHECK制約の失敗、または正しくない RETURNING の出力が発生する可能性がありました。

    トリガ作成後に列を削除したり、非NULLのデフォルト値を持つ列を追加したりした場合にこれらの問題が報告されました。

  57. XML出力モードでの EXPLAIN 出力で、インクリメンタルソートプランのタグが正しく対応するように修正されました。 (Daniel Gustafsson) (13)
  58. 開始タグと終了タグが一致しない不正なXMLが出力されていました。

  59. PostgreSQLプロトコルにおけるメッセージ送出で、共有メモリキューを介して非常に大きなペイロードを転送する場合の余計なエラーが回避されました。 (Markus Wanner) (13)(12)(11)(10)(9.6)(9.5)
  60. 以下のエラーが発生して失敗する可能性がありました。

    ERROR:  invalid memory alloc request size .....
    

    修正により、真に失敗する必要には、メッセージ送出におけるサイズ超過の問題と分かるエラーメッセージが出るようになっています。

  61. SQL言語で書かれた関数で、いくつかのケースで結果データ型強制の省略が修正されました。 (Tom Lane) (13)
  62. 関わるデータ型によっては、誤った結果やクラッシュにつながる可能性がありました。

    (障害動作例: 関数内で型を明示していない場合に戻り値が壊れています)
    db1=# CREATE TYPE typ33 AS (a float, b float);
    db1=# CREATE FUNCTION f33() RETURNS SETOF typ33 AS $$
            SELECT 1, 2 UNION SELECT 3, 4 ORDER BY 1;
          $$ language sql immutable;
    
    db1=# SELECT f33();
            f33
    -------------------
     (5e-324,1e-323)
     (1.5e-323,2e-323)
    (2 rows)
    
  63. JITコード生成におけるテンプレート関数属性の不適切な処理が修正されました。 (Andres Freund) (13)(12)(11)
  64. 以前は関数の属性だけをコピーして、パラメータの属性はコピーしていませんでしたが、これが s390x でクラッシュの原因となることが示されており、他のプラットフォームでもその他の問題がある可能性がありました。

  65. PPC で compare_exchange と fetch_add 操作用に生成されるコードが改善されました。 (Noah Misch) (13)
  66. 行レベルセキュリティ(RLS)ポリシーでのリレーションキャッシュのメモリリークが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  67. index_get_partition() の境界条件的なケースでのメモリリークが修正されました。 (Justin Pryzby) (13)(12)
  68. SIGHUP処理で、再起動をしないと新しいGUC変数の値が適用できないと判断した場合の小さなメモリリークが修正されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  69. PL/pgSQL の CALL処理でのメモリリークが修正されました。 (Pavel Stehule, Tom Lane) (13)(12)(11)
  70. Windows 版の libpq では、WSAStartup() をプロセスごとに一度だけ呼び出し、WSACleanup() は全く呼び出さないようになりました。 (Tom Lane, Alexander Lakhin) (13)(12)(11)(10)(9.6)(9.5)
  71. 以前の libpq は、接続開始時に WSAStartup() を呼び出し、接続のクリーンアップ時に WSACleanup() を呼び出していました。しかし、 WSACleanup() を呼び出すと、他のプログラム操作に干渉する可能性があるようです。特に、期待された出力を標準出力に出力する際にまれに失敗することが観測されています。WSACleanup() の呼び出しを省略しても悪影響はなさそうなので、呼び出さなくなりました。

    これにより、プログラムが一連のデータベース接続を実行する際にDLL のロードとアンロードが繰り返されることによるパフォーマンスの問題も解消されます。

  72. Windows用の ecpgライブラリのスレッドごとの初期化ロジックが修正されました。 (Tom Lane, Alexander Lakhin) (13)(12)(11)(10)(9.6)(9.5)
  73. マルチスレッドの ecpg アプリケーションでは、不適切なロックが原因でまれに誤動作が発生する可能性がありました。

  74. ecpg でのビット文字列 B'...' と X'...' の誤ったリテラル処理が修正されました。 (Shenhao Wang) (13)
  75. Windowsでは、psql が バッククォートコマンドの出力をバイナリモードではなくテキストモードで読み込むようになりました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  76. これにより、改行を適切に扱えるようになりました。

  77. pg_dump が拡張の設定テーブルに関する列ごとの情報を確実に収集するようになりました。 (Fabrízio de Royes Mello, Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  78. これに失敗すると --inserts を指定したときにクラッシュしたり、COPY を使用してテーブルのデータを再ロードする際に(通常は正しいのですが)列指定の無い COPYコマンドとなる場合がありました。

  79. pg_upgrade で対象クラスタ内にテーブル空間のディレクトリが既に存在するかどうかを確認するようになりました。 (Bruce Momjian) (13)(12)(11)(10)(9.6)(9.5)
  80. contrib/pgcrypto の潜在的なメモリリークが修正されました。 (Michael Paquier) (13)(12)(11)(10)(9.6)(9.5)
  81. contrib/pgcrypto に起こりそうもない失敗ケースのチェックが追加されました。 (Daniel Gustafsson) (13)(12)(11)(10)(9.6)(9.5)
  82. アメリカがサマータイムを遵守していない場合にも動作するように、最近追加された timetz のテストケースが修正されました。 (Tom Lane) (13)(12)(11)(10)
  83. タイムゾーンデータファイルが tzdata release 2020d に更新されました。 (13)(12)(11)(10)(9.6)(9.5)
  84. フィジー、モロッコ、パレスチナ、カナダのユーコン準州、マッコーリー島、南極のケーシー基地の夏時間法の変更に加えて、フランス、ハンガリー、モナコ、パレスチナの歴史的修正が含まれます。

  85. タイムゾーンライブラリのコピーが IANA tzcode リリース2020d と同期されました。 (Tom Lane) (13)(12)(11)(10)(9.6)(9.5)
  86. この変更は、アップストリームで zicコマンドのデフォルトの出力オプションがfat から slim へ変更されたことへの対応です。v13 より前のブランチでは引き続き fatモードを選択しているため、これは単なる見た目を整えるための修正です。この変更により、strftime() が失敗しない限り errno が変更されないことも保証されます。

  87. SLRUログの並列切り捨てによるデータ損失の可能性があり、修正されました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)
  88. これはごく稀に発生する障害で、後の xid の周回で明らかになるか、または「ERROR: could not access status of transaction」エラーを引き起こしていました。

  89. パーティションテーブルに対する ALTER TABLE SET NOT NULL コマンドの実行時、対象となるカラムがすでに NOT NULL としてマークされている場合は、不要な再帰処理を回避するようになりました。 (Tom Lane) (12)
  90. これにより、並列実行された pg_restore での潜在的なデッドロックが回避されるようになりました。

  91. 継承を使用した CREATE TABLE LIKE の式の処理を修正しました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  92. CREATE TABLE が LIKE と従来の継承の両方を使用する場合、CHECK制約の列参照と LIKE の親テーブルからの式インデックスに誤った番号が付けられることがよくあり、間違った結果や奇妙なエラーメッセージが出力されていました。 同じことが、その機能を備えたブランチの 生成列(GENERATED) の式でも発生する可能性がありました。

    本障害の結果、間違った列のマージが行われ、データ挿入時に以下のような列の型が違うというエラーが生じました。CREATE TABLE時のアサート失敗も報告されています。

    ERROR:  attribute 1 of type record has wrong type
    
  93. パーティションテーブルに対する DROP INDEX CONCURRENTLY が禁止となりました。 (Álvaro Herrera, Michael Paquier) (12)(11)
  94. この処理は必ず失敗していて、以下のような紛らわしいエラーメッセージが出力されていました。

    ERROR:  DROP INDEX CONCURRENTLY must be first action in transaction
    

    エラーメッセージは以下のように変更されました。

    ERROR:  cannot drop partitioned index "《インデックス名》" concurrently
    
  95. 挿入または更新されたタプルを正しいパーティションにルーティングするときに、デフォルトのパーティション制約を再確認するようになりました。 (Amit Langote, Álvaro Herrera) (12)
  96. これにより、挿入と同時にパーティションが追加された場合に競合が発生する問題が修正されました。

  97. 論理レプリケーションワーカで、不正なキャッシュ無効化ロジックにより発生していた relation 0 キャッシュルックアップ失敗の不具合が修正されました。 (Tom Lane) (12)(11)(10)
  98. この障害が発生する可能性は低いため、実際の影響は小さく、発生した場合もワーカプロセスが再起動されるだけです。

  99. 論理レプリケーションワーカが冗長な pingリクエストを送信しないようになりました。 (Tom Lane) (12)(11)(10)
  100. スマートシャットダウン中は、すべての(フォアグラウンドの)クライアントセッションが完了するまで、バックグラウンドプロセスを終了しないようになりました。 (Tom Lane) (12)(11)(10)(9.6)
  101. この変更前は、postmaster が既存の並列ワーカーを終了し、新しい(並列)ワーカーの起動を拒否するため、並列クエリ処理は中断されていました。また、自動バキュームが機能しなくなり、存続しているクライアントセッションが大量のデータ変更を行うと、長期的に深刻な影響を与える可能性がありました。

  102. postmaster がシグナルを処理している間、スタック領域の再帰的な消費を行わないようになりました。 (Tom Lane) (12)(11)(10)(9.6)
  103. この変更前には、並列処理を多用すると、並列ワーカープロセスの作成を要求する同時シグナルが多すぎるため、postmaster がクラッシュすることが確認されています。

  104. SIGQUITシグナルが原因で終了するときは、atexit ハンドラを実行しないようになりました。 (Kyotaro Horiguchi, Tom Lane) (12)(11)(10)(9.6)(9.5)
  105. ほとんどのサーバプロセスはすでにこの慣行に従っていましたが、アーカイバプロセスは見落とされていました。クライアントの起動パケットをまだ待っている状態のバックエンドも、同様にこの慣行に従っていませんでした。

  106. 定数であることが明らかなグループ化列を参照する副問合せ条件に対する誤った最適化が、回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  107. 定数サブクエリ出力列は、一部のグループ化セットにのみ表示されるグループ化列である場合、実際には一定ではありませんでした。

    これにより、グループ化セットを含む問い合わせで誤った結果が返ることがありました。

  108. SQL関数のインライン化によって、ハッシュ可能なサブプラン比較式の形が変更された場合に失敗しないようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  109. 問い合わせの実行でクラッシュする動作が報告されていました。

  110. インデックスを構築または再構築している間、同時更新による新しい HOTチェインの発生を許容するようになりました。 (Anastasia Lubennikova, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
  111. この修正前は、HOT のエラーのために親タプルを見つけられない可能性がありました。その結果、インデックス作成に対して以下のエラーがもたらされました。

    ERROR:  failed to find parent tuple for heap-only tuple at (XX,YY) in table "tbl"
    
  112. インデックス条件が満たされないときの並列Bツリーインデックススキャンで、予期せぬエラーや誤った結果が生じることがあり、修正されました。 (James Hunter) (12)(11)(10)
  113. インデックス列に対する INリストと別の条件とを与える、以下の障害再現手順が確認されています。最後の SELECT結果が変動してしまいます。

    db1=# CREATE TABLE t63 AS SELECT generate_series(1,999999) i;
    db1=# ALTER TABLE t63 SET (parallel_workers=2, autovacuum_enabled=off);
    db1=# CREATE INDEX ON t63 (i);
    db1=# SET parallel_leader_participation=off;
    db1=# SET min_parallel_table_scan_size=0;
    db1=# SET enable_bitmapscan=off;
    db1=# SET enable_indexonlyscan=off;
    db1=# SET enable_seqscan=off;
    db1=# SELECT COUNT(1) FROM t63 WHERE i > 555 AND i IN (
            333,334,335, …中略… ,664,665,666) ORDER BY 1;
    
  114. BRINインデックスのスキャン中に並行して行われるインデックスの要約の解除が正しく行われるようになりました。 (Alexander Lakhin, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
  115. これまではインデックスのスキャンでインデックス破損と誤認した以下のようなエラーが生じるおそれがありました。

    ERROR: corrupted BRIN index: inconsistent range map
    
  116. 複数列 GINインデックスのスキャンで「ERROR: lost saved point in index」が稀に生じることがあり、修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  117. 不必要なエラー発生が防止されたのに加えて、メッセージ文面も「ERROR: failed to re-find tuple within index 《インデックス名》」に変更されました。

  118. イベントトリガが ALTER TABLE 操作を監視するときに、解放済みメモリ使用の危険性があり、修正されました。 (Jehan-Guillaume de Rorthais) (12)(11)(10)(9.6)(9.5)
  119. これによりクラッシュを引き起こす可能性があります。

  120. 一貫性のない移動集約のデータ型に関する誤ったエラーメッセージが修正されました。 (Jeff Janes) (12)(11)(10)(9.6)(9.5)
  121. CREATE AGGREGATE に指定する関数のデータ型が一致していない場合に以下のようなメッセージが出ますが、そこで示すデータ型が誤っていました。

    ERROR:  moving-aggregate implementation returns type 《データ型》, but plain implementation returns type 《データ型》.
    
  122. 並列ワーカが非常に長いエラーメッセージを報告するときのハングアップが回避されました。 (Vignesh C) (12)(11)(10)(9.6)(9.5)
  123. libpq が .pgpassファイルの任意の長さの行をサポートするようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  124. これは主に、非常に長いセキュリティトークンをパスワードとして使用できるようにする場合に役立ちます。

  125. 並列で実行する pg_restore が、パーティションテーブルを参照する外部キーに対して、正しい順序で処理するようになりました。 (Álvaro Herrera) (12)
  126. 以前は、必要なインデックスがすべて配置される前に外部キー制約を復元しようとして、エラーが発生する可能性がありました。

  127. configure のテストプログラムで exit() ではなく return を使用するようになりました。 (Peter Eisentraut) (9.6)(9.5)
  128. これにより一部の開発環境における configure の失敗を回避しました。

PostgreSQL 12.4、11.9、10.14、9.6.19、9.5.23 (2020年8月13日リリース)の変更点

  1. 論理レプリケーションの walsender と apply worker で、search_path を安全な設定で上書きするようになりました。 (Noah Misch) (12)(11)(10)
  2. パブリッシャデータベースまたはサブスクライバデータベースの悪意のあるユーザが、レプリケーションを実行するロール(スーパーユーザであることが多い)によって任意のSQLコードの実行を引き起こす可能性がありました。このリスクのいくつかは CVE-2018-1058で説明されているものと同等で、本修正は、レプリケーションの送信者と受信者が空の search_path 設定で実行されるようにして、リスクを緩和します。CVE-2018-1058 の修正と同様に、この変更によりレプリケートされたテーブルの定義で使用されるスキーマ修飾されていないオブジェクト名で問題が生じるかもしれません。

    信頼されていないロールに属するオブジェクトのレプリケートには他にも危険性があり、そのことについてドキュメント記載されました。(CVE-2020-14349)

  3. contribモジュールのインストールスクリプトをより安全にしました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  4. 攻撃者が拡張のターゲットスキーマまたは必須とされているスキーマにオブジェクトを作成できる場合、拡張のインストールスクリプトに対して CVE-2018-1058 と同様の攻撃が行われる可能性があります。拡張のインストールにはスーパーユーザ権限を必要とすることが多いため、これによりスーパーユーザ権限を取得するための道が開かれてしまいます。このリスクを軽減するために、スクリプトの実行で使用される search_path により注意を払う、check_function_bodies 設定を無効にしてインストール時のコード実行を回避する、一部の contrib モジュールで使用されているカタログ調整クエリを安全にする、ということが行われました。

    ドキュメントに、サードパーティの拡張の作者がインストールスクリプトを安全にするための記述が追加されました。これは完全な解決策ではありません。不注意にインストールされた場合、他の拡張に依存する拡張は依然としてリスクがあります。(CVE-2020-14350)

  5. パーティション除外処理の境界ケースについて修正されました。 (Etsuro Fujita, Dmitry Dolgov) (12)(11)
  6. パーティションキー列が複数あるとき、一部の列に値を限定する WHERE句が無かったり、限定を与える句が複数あったりする場合に、パーティション除外のための検査の生成が誤動作するおそれがありました。これはサーバプロセスのクラッシュ、不正なクエリ結果、アサート失敗をもたらす可能性がありました。

    (クラッシュする例の一つ / この場合「b >= 2」が無ければクラッシュしない)
    db=# CREATE TABLE pt3 (a int, b int, c int, d int) PARTITION BY RANGE (a, b, c, d);
    db=# CREATE TABLE pt3_p1 PARTITION OF pt3 FOR VALUES FROM (1,1,1,0) TO (1,1,1,10);
    db=# CREATE TABLE pt3_p2 PARTITION OF pt3 FOR VALUES FROM (2,2,2,0) TO (2,2,2,10);
    db=# SELECT * FROM pt3 WHERE a >= 1 AND b >= 1 AND b >= 2 AND c >= 2 AND d >= 0;
    server closed the connection unexpectedly
    
  7. パーティション同士の入れ子ループ結合の内部でパラメータ化されたBitmapAnd と BitmapOr のインデックススキャンの構造が修正されました。 (Tom Lane) (12)(11)
  8. このようなスキャンで結合の外側から値を使用する必要がある実行計画は、通常、実行時にクラッシュします。

    (実行するとクラッシュするプラン形状の例 / pt4a と pt4b はパーティションテーブル)
    
    db=# EXPLAIN (costs off) SELECT * FROM pt4a WHERE NOT EXISTS (
           SELECT FROM pt4b WHERE pt4b.a = pt4a.a AND pt4b.b = pt4a.b + 1 AND pt4b.c = 123)
           AND a = 1 AND c = 120;
                              QUERY PLAN
    ---------------------------------------------------------------
     Nested Loop Anti Join
       ->  Seq Scan on pt4a_p1
             Filter: ((a = 1) AND (c = 120))
       ->  Bitmap Heap Scan on pt4b_p1
             Recheck Cond: ((c = 123) AND (b = (pt4a.b + 1)))
             Filter: ((a = 1) AND (a = pt4a_p1.a))
             ->  BitmapAnd
                   ->  Bitmap Index Scan on pt4b_p1_c_idx
                         Index Cond: (c = 123)
                   ->  Bitmap Index Scan on pt4b_p1_b_idx
                         Index Cond: (b = (pt4b.b + 1))
    (11 rows)
    
  9. パーティショニングテーブルが同一の問い合わせで静的パーティショニング除外と実行時パーティショニング除外の両方の対象で、かつ、問い合わせと同時に新しいパーティションが追加された場合に誤った計画が実行されることがあり、修正されました。 (Amit Langote, Tom Lane) (12)
  10. 本障害によりアサート失敗が報告されました。アサートを無効にしている場合、誤った結果やクラッシュがもたらされる可能性があります。また、発生を防ぐ修正に加えて、本ケースはアサートではなく問い合わせのエラーとして報告されるようになりました。

  11. 論理レプリケーションの walsender で、キープアライブメッセージ送信の後にフィードバックメッセージを送信できなかったのが修正されました。 (Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
  12. 組み込みの論理レプリケーションを使用している場合は、組み込みの walreceiver が(誤った状態をクリアする)フィードバック返信をいずれにせよかなり頻繁に送信するため、これは比較的小さな問題です。しかし、pglogical のような他のレプリケーションシステムでは、重大な性能問題が発生していました。

  13. 論理レプリケーションのサブスクライバにおける、列指定 UPDATEトリガの起動が修正されました。 (Tom Lane) (12)(11)(10)
  14. これまでのコードでは、パブリッシャテーブルとサブスクライバテーブルで列番号が異なる可能性を考慮していませんでした。実際に列番号が異なっていた場合、どのトリガを実行するかについて誤った判断をする可能性がありました。

  15. pg_replication_slot_advance() の実行中に最も古い xmin値とLSN値が更新されるようになりました。 (Michael Paquier) (12)(11)
  16. pg_replication_slot_advance() 関数は以前これができなかったため、レプリケーションスロットを手動で進めた後にリソースのクリーンアップ(不要になったWALセグメントの削除など)を妨げる可能性がありました。

  17. ts_headline() の実行遅延が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  18. 以前の一連のマイナーリリースで追加されたフレーズ検索の修正により、長い文書に対して ts_headline() が不合理に時間を要する可能性がありました。さらに悪いことに時間を要することのあるループ内でキャンセルできませんでした。

  19. repeat() 関数がクエリキャンセルで確実に中断できるようになりました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)
  20. Windows上での結果にキャリッジリターン("\r")が含まれないようにpg_current_logfile() が修正されました。 (Tom Lane) (12)(11)(10)
  21. pg_read_file() と関連する関数が EOF に達するまで確実に読み込まれるようになりました。 (Joe Conway) (12)(11)
  22. 以前は読み込むデータの長さが指定されていない場合、これらの関数は stat() によって報告されたファイルの長さで停止していました。これはパイプやその他の種類の仮想ファイルには不適切な動作です。

  23. jsonpath の計算で数値の「NaN」値が禁止されました。 (Alexander Korotkov) (12)
  24. SQL にも JSON にも 「NaN」(not-a-number) という概念はありませんが、jsonpath のコードはそのような値を許可しようとしていました。これは必然的に非標準の動作につながるため、最初からそのような値を拒否する方が良いと判断されました。

  25. 浮動小数点の集約で、単一の「Inf」または「NaN」の入力が正しく処理されるようになりました。 (Tom Lane) (12)
  26. 影響を受ける集約は以下です。

          corr()
          covar_pop()
          regr_intercept()
          regr_r2()
          regr_slope()
          regr_sxx()
          regr_sxy()
          regr_syy()
          stddev_pop()
          var_pop()
    

    このような場合の集約された値として「NaN」を返すべきですが、PostgreSQL v12 で導入されたアルゴリズム変更のために 0 を返すようになっていました。

  27. 数値型列のパラレル集計時の「NaN」入力の処理が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  28. 一部の部分集計ワーカーが「NaN」のみを検出し、他のワーカーが「NaN」以外のもののみを検出した場合、結果は誤って結合され全体的に誤った結果(つまり「NaN」であるべき時に「NaN」ではない)になる可能性がありました。

  29. 24時間を超えて表現された時刻を拒否するようになりました。 (Tom Lane) (12)(11)(10)
  30. 日付時刻入力の仕様は、"24:00:00" またはそれに相当する "23:59:60" を許容しますが、それ以上の値は許容しません。しかし、非ゼロの少数秒を伴う "23:59:60.nnn" を受け入れるように範囲チェックが誤って実装されていました。

    タイムスタンプ値では翌日の1秒目に折り返される結果になりました。time や timetz の値では、保存された値は実際には 24時間より大きくなり、ダンプ/リストアの失敗やその他の誤動作を引き起こす可能性がありました。

  31. EXPLAIN の非テキスト出力フォーマット(JSON等)において、インデックス名に余計なダブルクォートを付けなくなりました。 (Tom Lane, Euler Taveira) (12)(11)(10)(9.6)(9.5)
  32. Gather Merge を使用している実行計画のパラレルワーカにおいて、EXPLAIN のリソース使用量、特にバッファアクセスに関するリソース使用量の計算が修正されました。 (Jehan-Guillaume de Rorthais) (12)(11)(10)
  33. ALTER TABLE における制約の再検証のタイミングが修正されました。 (David Rowley) (12)(11)(10)(9.6)(9.5)
  34. ALTER TABLE が(例えば、列のデータ型の変更により)テーブル内容を完全に書き換える必要がある場合で、外部キーや CHECK制約を再検証するためにテーブルをスキャンする必要がある場合に、これらが時々間違った順序で行われ、以下のような奇妙なエラーを引き起こしていました。

     ERROR:  could not read block 0 in file "base/16543/17654": read only 0 of 8192 bytes
    
  35. インデックスのレプリカアイデンティティのフラグを保持するようにREINDEX CONCURRENTLY が修正されました。 (Michael Paquier) (12)
  36. 以前は、テーブルのレプリカID のインデックスをインデックス再構築すると設定が失われ、将来の論理デコード出力に古いタプル値が含まれなくなる原因となっていました。

  37. pg_subscription.subslotname と pg_subscription_rel.srsublsn の不正確な非NULLの印付けが修正されました。 (Tom Lane) (12)(11)(10)
  38. 初期化時のカタログデータは、これら 2つのカタログ列を常に非NULLであると誤って印付けしていました。その印付けが正しいかどうかに依存している主な場所は、JIT有効時のタプル分解です。本修正では影響が出る箇所でこれらの誤った印付けを無視するようにしています。初期化時のカタログデータはバージョン13以降で修正されます。

    また、これらの項目の NULL確認を行うコードが追加されました。ただし、NULL確認が無いためにクラッシュする可能性はほとんど無いと考えられます。

  39. FROM句にある平坦化されていない副問合せに付加された条件句でLATERAL参照が正常に使えるようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  40. アサート失敗や、クエリ実行時のクラッシュにつながる可能性がありました。

    (クラッシュを引き起こす問い合わせ例)
    db=# CREATE TABLE t22 (a int);
    db=# INSERT INTO t22 VALUES (0), (1), (2);
    db=# SELECT * FROM t22, LATERAL (
           SELECT t22.a > 1 AS b, 1 AS c FROM (SELECT random() ORDER BY 1) AS v
           UNION ALL
           SELECT true AS b, 2 AS c
         ) AS vt22 WHERE b AND a >= 0;
    server closed the connection unexpectedly
    
  41. 選択度推定中に呼び出された演算子にクエリ指定の照合順序を使用するようになりました。 (Tom Lane) (12)
  42. 以前は、データベースの列の照合順序を使用していましたが、正しくクエリの照合順序を使用するようになりました。

    現在は非決定的な照合順序があるので、修正前は非決定的な照合順序が与えられた場合に演算子が完全に失敗するケースがありました。クエリ自体が動作するようなケースでプラン作成が失敗することは望ましくないため、推定の目的で演算子を呼び出す際には、クエリの照合順序を使用しなければなりませんでした。

  43. 一度も ANALYZE されていない外部テーブルのタプルを 0行と想定しないようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  44. これは主に、GROUP BY で得られるグループ数のプランナ推定に影響を与えていました。

  45. BRINインデックスの要約情報の展開で「WARNING: leftover placeholder tuple detected in BRIN index "..."」という偽りの警告が削除されました。 (Álvaro Herrera) (12)(11)(10)
  46. 本ケースはキャンセルされたバキュームの後に合法的に発生する可能性があるので、それに関する警告は過度なものでした。

  47. 共有ファイルセットの一時ファイルが配置されるテーブルスペースの選択が修正されました。 (Magnus Hagander, Tom Lane) (12)(11)
  48. temp_tablespaces が空か、データベースのテーブルスペースを明示的に指定している場合に、(パラレルハッシュ結合などで用いられる)共有ファイルセットの一時ファイルが期待通りデータベースのテーブルスペースに配置されるのではなく、pg_defaultテーブルスペースに配置されていました。

  49. WALの整合性をチェックする時の SP-GISTインデックスページのマスキングにおいて稀な場合に発生するエラーが修正されました。 (Alexander Korotkov) (12)(11)
  50. これにより、wal_consistency_checking設定が有効な場合に偽のエラー報告をする可能性がありました。

    (報告されたエラー例)
    FATAL:  inconsistent page found, rel 1663/16385/22133, forknum 0, blkno 15
    CONTEXT:  WAL redo at 0/739CEDE8 for SPGist/VACUUM_REDIRECT: newest XID 4619
    
  51. サーバの buffileモジュールでのエラー処理が改善されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)
  52. I/O エラーが EOF に到達したことと区別がつかなかったり、全く報告されなかったりするいくつかのケースが修正されました。また、ブロック番号やバイト数などの詳細が追加されました。

    buffileモジュールは内部的な一時ファイルの読み書きに使われるものです。

  53. SERIALIZABLE モードでのコンフリクトチェックの異常を修正しました。 (Peter Geoghegan) (12)(11)(10)(9.6)(9.5)
  54. 並行して挿入されたタプルが別の並行トランザクションによって更新され、どちらのタプルのバージョンも現在のトランザクションのスナップショットには見えなかった場合、シリアライズ競合チェックは、タプルが現在のトランザクションの結果に関連しているかどうかについて誤った結論を導き出す可能性がありました。 これにより、直列化失敗でエラーにすべき SERIALIZABLEトランザクションのコミットを許容してしまう可能性がありました。

  55. デッド状態の btreeインデックスエントリを繰り返しデッド判定しないように修正されました。 (Masahiko Sawada) (12)(11)(10)(9.6)(9.5)
  56. 機能的には無害ですが、チェックサムが有効な場合や wal_log_hints = on の場合、無駄な WAL量増大を引き起こしていました。デッド状態とは無効なエントリであることを示すフラグの付いた状態を意味します。

  57. fsync が無効の場合に、ファイル同期リクエストを破棄するように、checkpointer プロセスが修正されました。 (Heikki Linnakangas) (12)
  58. そのようなリクエストは fsync が無効の場合には無視されますが、保留中の処理を保持するハッシュテーブルから削除する対応が漏れていました。この問題によりハッシュテーブルが肥大化し、再度 fsync を有効化した場合に、アサート失敗が発生する可能性がありました。

  59. バックアップ中に JITコンパイルを動作させたときに、非排他的ベースバックアップのクリーンアップ処理中に問題が生じることがあり、回避されました。 (Robert Haas) (12)(11)
  60. 偽性の警告「WARNING: aborting backup due to backend exiting beforepg_stop_backup was called」や、アサート失敗が報告されました。

  61. pg_control の変更前に正しいロックを取得するように、一部のコードパスの問題が修正されました。 (Nathan Bossart, Fujii Masao) (12)(11)(10)(9.6)(9.5)
  62. この問題により、一貫性のないチェックサムで pg_control が書き込まれる可能性があり、次に書き込む前にクラッシュした場合、データベースを再起動できないなど、あとで問題が発生する可能性がありました。

  63. 関数 currtid() および currtid2() のエラーが修正されました。 (Michael Paquier) (12)(11)(10)(9.6)(9.5)
  64. これらの関数(文書化されておらず、ODBC ドライバの古いバージョンのみで使用)には、クラッシュを発生させたり、パーティションテーブルなど、ストレージのないテーブルに対して呼び出すと、「could not open file」などの混乱を招くエラーメッセージを表示する問題が含まれていました。

  65. スピンロックの取得中に elog() または palloc() を呼び出さないように修正されました。 (Michael Paquier, Tom Lane) (12)(11)(10)(9.6)(9.5)
  66. レプリケーションスロット関連の処理の一部では、このコーディング規則に違反していました。そのため、関数の呼び出し中にエラーが発生すると、ごくまれにスピンロックがスタックする可能性がありました。

  67. 論理レプリケーションのサブスクライバで「REPLICA IDENTITY FULL」が使用できるように、アサートが修正されました。 (Euler Taveira) (12)(11)(10)
  68. この問題は、アサートが誤っていただけで、通常の製品ビルドには影響ありません。

  69. libpq が書き込みに失敗した後もデータベース接続ソケットから読み込みを試し続けるようになりました。 (Tom Lane) (12)
  70. この修正は、停止しかけのサーバプロセスから最後のエラーメッセージを確実に取得するためだけでなく、読み取りエラーが発生するまで接続が失われたことを考慮せず済ますためにも重要です。これまで、COPY データの転送中に接続が失なわれた場合に、アプリケーションにエラーを報告することなく、永遠に送信し続ける可能性がありました。

  71. libpq で GSS暗号化状態の管理についてバグが修正されました。 (Tom Lane) (12)
  72. GSS暗号化を使用した接続では、サーバの再起動後にリセットしようとしたとき、または候補サーバのリストの次に移動しようとしたとき、フリーズしてしまう可能性がありました。

  73. bytea およびカーソル変数による ecpgコマンドのクラッシュが修正されました。 (Jehan-Guillaume de Rorthais) (12)
  74. pg_dump および pg_basebackup でディスク容量不足エラーが正しく報告されるようになりました。 (Justin Pryzby, Tom Lane, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
  75. 一部のコードパスでは「could not write file: Success」などのおかしな報告が生成される可能性がありました。

  76. pg_restore で、データオフセットなしのカスタム形式のダンプファイルでも、順不同のデータ項目をリストアできるように改善されました。 (David Gilman, Tom Lane) (12)
  77. pg_dump では、出力をシークできない(例えば、出力が何かにパイプされている)場合に、そのようなダンプファイルを生成します。この修正により、そのようなダンプファイルでも並列リストアができるようになります。

  78. テーブル単位と列単位のアクセス権限を両方とも設定したテーブルを並列リストアする場合の問題が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  79. アクセス権限はテーブル単位を先に付与する必要がありますが、並列リストアではそれを確実に順序づけできていませんでした。この問題により、「tuple concurrently updated」のエラーが発生したり、列単位のアクセス権限が付与されない可能性がありました。この問題はアクセス権限間の依存関係をダンプファイルに含めることで修正しています。そのため、問題が再発しないようにするには、修正された pg_dump でダンプを取得しなおす必要があります。

  80. pg_upgrade の実行時に対象クラスタで vacuum_defer_cleanup_age が 0 に設定されるようになりました。 (Bruce Momjian) (12)(11)(10)(9.6)(9.5)
  81. これまで、対象クラスタで vacuum_defer_cleanup_age が 0 以外に設定されている場合、システムカタログの凍結処理が正しく動作せず、混乱を招くメッセージとともにアップグレードが失敗していました。アップグレード中は設定が上書きされることに注意してください。

  82. pg_recvlogical で終了前に保留中のメッセージを送信するように修正されました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)
  83. この修正がないと、レプリケーションの senderプロセスが送信障害を検出した場合に、レプリケーションスロットの LSN 位置に対して予期した最後の更新をせずに終了する可能性があります。この問題により、再接続時にデータが再送信されたり、pg_recvlogical が受信しようとした最後のデータの後に送信されたエラーメッセージを見逃す可能性がありました。

  84. pg_rewind でソースクラスタ内の削除されたばかりのファイルの処理が修正されました。 (Justin Pryzby, Michael Paquier) (12)(11)(10)(9.6)(9.5)
  85. オンラインのソースクラスタを使用する場合、ファイルを同時に削除できますが、これまで、ファイルのディレクトリエントリを確認してから、stat() でそれを調査するまでの間に削除されると、pg_rewind の動作に混乱が生じていました。

  86. Windows で pg_test_fsync がバイナリ I/O モードを使用するようになりました。 (Michael Paquier) (12)(11)(10)(9.6)(9.5)
  87. これまで、テキストモードでテストファイルに書き込んでいましたが、これはPostgreSQL での実際の使用方法を正しく反映したものではありませんでした。

  88. contrib/amcheck で空の削除済みインデックスページに対してエラーが発生しないように修正されました。 (Alexander Korotkov) (12)(11)
  89. この状態は WAL の再生中は正常です。

  90. contrib/dblink でローカル状態を正しく初期化できない問題が修正されました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)
  91. 状況の組み合わせによっては、この問題は dblink_close() が予期しないリモート COMMIT を発行する可能性がありました。

  92. contrib/pgcrypto で deflate() の誤った使用方法が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  93. これまで、pgp_sym_encrypt 関数では、zlib の API 要件を正しく処理していなかったため、誤った圧縮データを生成する可能性がありました。標準的なzlib でこのエラーが発生したとの報告はありませんが、IBM の zlibNX 実装を使用した場合に問題が確認されました。

  94. contrib/pgcrypto の pgp_sym_decrypt 関数でごく稀に発生する解凍処理の問題が修正されました。 (Kyotaro Horiguchi, Michael Paquier) (12)(11)(10)(9.6)(9.5)
  95. 圧縮されたストリームは空のパケットで正常に終了する可能性がありますが、解凍処理はこれに対応しておらず、データが破損しているとのエラーが発生していました。

  96. Microsoft Visual Studio 2015 以降で NLSコードのビルドに対応しました。 (Juan José Santamaría Flecha, Davinder Singh, Amit Kapila) (12)(11)(10)(9.6)(9.5)
  97. ソースツリー上に configure という名前のファイルが複数ある場合に、MSVC インストールスクリプトが失敗する問題が修正されました。 (Arnold Müller) (12)(11)(10)(9.6)(9.5)
  98. この問題により、ソースツリーのトップレベルを識別するために、configureを検索する処理に混乱が発生していました。

  99. BSD系の sys_siglist[] の代わりに POSIX 標準の strsignal() を使用するようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)
  100. この修正により、最新バージョンの glibc でもビルドエラーが発生しなくなります。

PostgreSQL 12.3、11.8、10.13、9.6.18、9.5.22 (2020年5月14日リリース)の変更点

  1. 生成列(GENERATED 指定された列)で起こりうるクラッシュが修正されました。 (David Rowley) (12)
  2. 生成列が、テーブル内の他の列の単なるコピーで、かつ、リファレンス渡しのデータ型(文字列型など)である場合、テーブルに壊れたデータが投入されるかクラッシュを引き起こす可能性がありました。他の列を単に複製する GENERATED式という役に立たない使い方に限られればよいですが、時に入力そのものを返す関数を使っている式で本状況が生じる可能性があります。

    本障害で以下のようなデータ投入時に巨大なメモリ要求によるエラーが出るケースも報告されました。

    ERROR:  XX000: invalid memory alloc request size 18446744073709551613
    
  3. 生成列の継承の扱いが改善されました。 (Peter Eisentraut) (12)
  4. CREATE TABLE ... INHERITS でテーブルの列が継承された場合、親の列が生成列(GENERATED)であるときに子の列で生成列であるという属性を変更することが禁止され、一方で、親の列が生成列でないときに子の列で GENERATED を指定して生成列にできるようになりました。

    これらの規則が不明瞭であったことに起因して、生成列と継承の組み合わせを含むテーブル定義のダンプがリストアできない場合が報告されました。

  5. CREATE TABLE ... LIKE ... INCLUDING GENERATED で、列をまたがる参照が修正されました。 (Peter Eisentraut) (12)
  6. 物理的に後ろにある列を参照する GENERATED式をコピーしようとするときに CREATE TABLE ... LIKE が以下のようなエラーを起こしました。

    (報告されたエラー発生例)
    db=# CREATE TABLE t3 (
         funds float GENERATED ALWAYS AS (cast(funds_t AS double precision)) STORED,
         funds_t text,
         id bigserial not null);
    
    db=# CREATE TABLE IF NOT EXISTS t3_temp (LIKE t3 INCLUDING GENERATED);
    ERROR:  XX000: unexpected varattno 3 in expression to be mapped
    
  7. ALTER TABLE ... SET STORAGE がインデックスに伝搬するようになりました。 (Peter Eisentraut) (12)(11)
  8. 式でないインデックス列は作成時には常に、そのテーブル列の attstorage属性をコピーしていました。整合性を維持するように、ALTER TABLE ... SET STORAGE ... が実行されたときにインデックスに対しても属性を変更するようになりました。

  9. ALTER TABLE で書き換えられたインデックスの indisclustered属性を維持するようになりました。 (Amit Langote, Justin Pryzby) (12)(11)(10)(9.6)(9.5)
  10. indisclustered は pg_indexシステムテーブルの列で、前回テーブルを当該インデックスを使って CLUSTERコマンドを実行した場合にtrue となります。これまで、当該列を対象に ALTER TABLE を実行すると、この情報が失われていました。

  11. ALTER TABLE で書き換えられたインデックスの REPLICA IDENTITY属性が維持されるようになりました。 (Quan Zongliang, Peter Eisentraut) (12)(11)(10)(9.6)(9.5)
  12. REPLICA IDENTITY属性は、論理レプリケーション用に使われ、ALTER TABLE ... REPLICA IDENTITY USING INDEX ... コマンドで指定されます。pg_indexシステムテーブルの列名としては indisreplident です。これまで、当該列を対象に ALTER TABLE を実行すると、この情報が失われていました。

  13. REINDEX CONCURRENTLY で再構築されたインデックスの indisclustered属性が維持されるようになりました。 (Justin Pryzby) (12)
  14. これまで、このような場合に属性が失われ、REINDEX CONCURRENTLY後のCLUSTERコマンド実行が失敗する可能性がありました。

  15. DROP OWNED BY コマンドにおいて、オブジェクトをより早くロックするようになりました。 (Álvaro Herrera) (12)(11)(10)(9.6)(9.5)
  16. これにより、他セッションがいくつかの同オブジェクトを削除している場合の競合状態によるエラーを回避します。以下のエラーが出るケースが報告されました。

    ERROR:  cache lookup failed for relation 41019
    
  17. CREATE ROLE ... IN ROLE ... のエラー処理が修正されました。 (Andrew Gierth) (12)(11)(10)(9.6)(9.5)
  18. 一部のエラーケースでは意図通りのメッセージの代わりに「unexpected node type」といったエラーメッセージが報告されていました。

  19. パーティションがデタッチされたときに、旧親テーブルから複製されたトリガが確実に除去されるように修正されました。 (Justin Pryzby) (12)(11)
  20. これまで、パーティションをデタッチした際にトリガが残ってしまう動作があり、そのようなトリガは、旧親テーブルとの依存関係のために以下のようなエラーが出て、削除不能となっていました。

    db=# ALTER TABLE t10p DETACH PARTITION t10c;
    db=# DROP TRIGGER trig ON t10c;
    ERROR:  cannot drop trigger trig on table t10c because trigger trig on table t10p requires it
    
  21. パーティション境界の式で、COLLATE が照合不可能な型に適用されるとクラッシュする不具合があり、修正されました。 (Dmitry Dolgov) (12)
  22. (該当する例: 整数型に COLLATE を指定する式を与えている)
    db=# CREATE TABLE t11p (i int) PARTITION BY LIST (i);
    db=# CREATE TABLE t11c1 PARTITION OF t11p FOR VALUES IN ('1' COLLATE "POSIX");
    
  23. パーティショニングされたテーブル上のユニークインデックスが、パーティショニングキーの等価性セマンティクスと一致するかどうかを確認するようになりました。 (Guancheng Luo) (12)(11)
  24. これは独自の等価性演算子を持つインデックス演算子クラスだけの問題ですが、理論的には間違っていたので、確認するように修正されました。

  25. pg_read_all_statsロールのメンバが、期待通りにすべての統計情報ビューを参照できるようになりました。 (Magnus Hagander) (12)(11)(10)
  26. pg_read_all_statsロールのメンバ は pg_stat_progress_* ビューを参照できるとドキュメントに記載されていましたが、実際には参照できませんでした。

  27. information_schema.triggersビューのパフォーマンス劣化が修正されました。 (Tom Lane) (12)(11)
  28. この修正は、テーブル名を制約する外側の WHERE句がプッシュダウンされるようにビューを再定義し、計算がデータベース内の全トリガではなく、対象テーブルに属するトリガに対してのみ行われるようにします。多くのトリガを持つデータベースでは、この変更でかなりの速度差が出ます。

    バージョン11より前には修正後と同様に動作していたので、これは潜在的なパフォーマンス劣化でした。

    本修正は既存のデータベースクラスタには適用されませんが、明示的にビュー定義を置き換えることで修正することができます。information_schema.triggersビューを含む情報スキーマの定義はソースコードの以下パスにあります。

    src/backend/catalog/information_schema.sql
    
  29. 浮動小数点オーバーフローおよびアンダーフロー検出のパフォーマンス低下が修正されました。 (Emre Hasegeli) (12)
  30. 以前のリファクタリングで、いくつかのホットなコードパスで isinf() を余分に呼び出すようになっていました。

  31. 全文検索がフレーズ検索上の NOT を正しく処理できるように修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  32. これまで、GiST や GIN インデックス検索として実行されている場合、「!(foo <-> bar)」のようなクエリで、マッチする行が見つからない問題が発生していました。

  33. 全文検索のフレーズ検索で、前方一致と重み限定の両方を持つ項目が含まれる場合に、マッチ漏れが発生する不具合が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  34. 以下のような場合が該当します。

    (マッチすべきところでマッチしない障害動作例)
    db=# SELECT 'wa:1D wb:2A'::tsvector @@ 'w:*D <-> w:*A'::tsquery as "true";
     true
    ------
     f
    (1 行)
    
  35. フレーズ検索を使うときにより良い見出しが選択されるように、ts_headline() 関数が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  36. 検索条件部分が適切に強調されない動作が報告されました。

  37. gin_fuzzy_search_limit の処理の不具合が修正されました。 (Adé Heyward, Tom Lane) (12)(11)(10)(9.6)(9.5)
  38. gin_fuzzy_search_limit の値が小さいと、意図せずに同じインデックスページを何度も再スキャンしてしまい、予期せず遅くなる可能性がありました。別のコードパスでは、意図したフィルタリングの適用に失敗しており、多すぎる値を返す可能性がありました。

  39. ドキュメント通りに circle型の入力として「(x,y),r」形式を受け付けるようになりました。 (David Zhang) (12)(11)(10)(9.6)(9.5)
  40. (修正前のエラー発生例)
    db=# SELECT '( 1 , 1 ) , 5'::circle;
    ERROR:  invalid input syntax for type circle: "( 1 , 1 ) , 5"
    
  41. get_bit() と set_bit() 関数が 256MB より長い bytea文字列に対応しました。 (Movead Li) (12)(11)(10)(9.6)(9.5)
  42. ビット数の引数が int4 のみなので、これらの関数を使用して長い bytea の最初の256MB を超えるビットにアクセスすることはできません。バージョン 13 では引数が int8 に拡張される予定ですが、それまでの間は、これらの関数が長い bytea の最初の部分文字列で動作します。

    修正前は、このような場合に以下エラーが発生していました。

    ERROR:  index 0 out of valid range, 0..-1
    
  43. pg_ls_waldir() とその関連関数で、ファイルが見つからないというエラーを無視するようになりました。 (Tom Lane) (12)(11)(10)
  44. これは、ディレクトリエントリが参照されてからstat() を実行しようとするまでの間にファイルが削除された場合の競合状態による失敗を防ぎます。

  45. pg_ls_dir()、pg_timezone_names()、pg_tablespace_databases()、および、関連関数で、ディレクトリの開いたファイルディスクリプタがリークする可能性があり、回避されました。 (Justin Pryzby) (12)(11)(10)(9.6)(9.5)
  46. 多様関数の型解決が修正されました。anyrange の入力のみを与えられた場合に、anyarray の出力が実際の型を正しく推論するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  47. そのような場合に以下のエラーが出るケースが報告されました。

    db=# CREATE FUNCTION f24(x anyrange, out lu anyarray, out ul anyarray)
         LANGUAGE SQL
         AS 'SELECT array[lower(x),upper(x)], array[upper(x),lower(x)]';
    
    db=# SELECT * FROM foo24(int4range(6,9));
    ERROR:  cache lookup failed for type 0
    
  48. GSSAPI対応でコンパイルされていないために GSSAPI接続が拒否され、クライアントが代わりに SSL 接続を試みる場合の、サーバの接続開始ロジックが修正されました。 (Andrew Gierth) (12)
  49. これまで、以下の FATALメッセージで失敗していました。

    FATAL:  unsupported frontend protocol 1234.5679: server supports 2.0 to 3.0
    
  50. GSSAPI暗号化でのメモリリークが修正されました。 (Tom Lane) (12)
  51. これまで、GSSAPI暗号化が使用されている場合、バックエンドと libpq の両方がセッション中に送信されたデータの総量に相当するメモリリークが発生していました。

  52. クエリの FROM句で使用される集合を返す関数のメモリリークが修正されました。 (Andres Freund) (12)
  53. これにより以下のような問い合わせのメモリ使用量が巨大になっていました。

    db=# SELECT sum(f) FROM generate_series(1, 1000000) g(i),
                            generate_series(i, i+1) f;
    
  54. 複数回使われるハッシュ化されたサブプランのハッシュテーブルのリークが回避されました。 (Andreas Karlsson, Tom Lane) (12)(11)
  55. この誤りは、ハッシュ化されたサブプランのクエリを十分な回数再実行した時に、深刻なメモリの肥大化を引き起こす可能性がありました。

  56. プランナによる何もしないドメインに型変換する処理が改善されました。 (Tom Lane) (12)
  57. 何もしないドメインへの型変換が式から完全に取り除かれない場合があり、修正されました。旧メジャーバージョンと比べて動作が遅くなっていたことが報告されていました。

  58. REINDEX が SIGTERM(セッションシャットダウン)シグナルで終了した時のクラッシュが回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  59. 実際には上記の状況であっても本障害でのクラッシュ発生は稀です。

  60. EXPLAIN でおそらく不正とみられるハッシュ結合テーブルの統計情報が出力されていたものが、防止されました。 (Konstantin Knizhnik, Tom Lane, Thomas Munro) (12)(11)(10)(9.6)(9.5)
  61. 以下のような EXPLAIN出力(一部抜粋)が報告されていました。

    ->  Hash  (cost=0.11..0.11 rows=10 width=12) (actual time=0.002..0.002 rows=1 loops=8)
          Buckets: 2139062143  Batches: 2139062143  Memory Usage: 8971876904722400kB
          ->  Function Scan on unnest init_1  (cost=0.01..0.11 rows=10 width=12) (actual time=0.001..0.001 rows=1 loops=8)
    
  62. VACUUM VERBOSE でのヒープ切り捨て段階の経過時間の報告が修正されました。 (Tatsuhito Kasahara) (12)(11)(10)(9.6)(9.5)
  63. これまで不正確な経過時間が報告されていました。

  64. VACUUM VERBOSE の出力で、削除された B-treeインデックスについてページ数が過小に報告されていたものが、修正されました。 (Peter Geoghegan) (12)(11)
  65. B-treeインデックスで最も古い削除されたページに対する誤った記録付けが修正されました。 (Peter Geoghegan) (12)(11)
  66. これによって、VACUUM がインデックスのクリーンアップスキャンをスキップできる場合について、微妙に間違った判断をする可能性がありました。

  67. TimelineHistoryRead と TimelineHistoryWrite の待機状態が、.historyファイルを読み書きするすべてのコードパスで報告されるようになりました。 (Masahiro Ikeda) (12)(11)(10)
  68. プロセスの PS状態で「waiting」が重複して表示されないように修正されました。 (Masahiko Sawada) (12)(11)(10)(9.6)(9.5)
  69. (誤った psコマンドの出力行の例)
    46510   ??  Ss     0:00.05 postgres: startup   recovering 000000010000000000000003 waiting waiting
    
  70. 拡張統計データのカタログタプルを ANALYZE で置き換えた場合の競合状態が回避されました。 (Dean Rasheed) (12)
  71. VACUUM FULL などの操作が同時に行われた場合に、ANALYZE が間違ったタプルを置換してしまう可能性がありました。

  72. 「冗長な」周回防止バキュームの不用意なスキップが回避されました。 (Michael Paquier) (12)
  73. これにより、自動バキュームが何度もトライしては同じバキュームジョブをスキップすることを繰り返すというまれなケースが回避されます。

  74. B-tree のピボットタプルから INCLUDEされたカラムが常に削除されるようになりました。 (Peter Geoghegan) (12)
  75. この誤りはまれにスペースを無駄にしましたが、それ以外は無害です。

  76. REINDEX CONCURRENTLY に失敗した後に残る可能性のある無効な TOASTインデックスを適切に扱うようになりました。 (Julien Rouhaud) (12)
  77. REINDEX CONCURRENTLY に失敗した後に REINDEX TABLE を行った場合に、使用できず、削除もできない重複したインデックスが作成されてしまう問題が生じていました。

  78. REINDEX CONCURRENTLY が失敗した後でも、有効なインデックスの依存関係が維持されるように対応されました。 (Michael Paquier) (12)
  79. 以前は pg_depend のリンクがまったくない古いインデックスを残すことがありえたため、例えば親テーブルが削除されてもインデックスは削除されずに残ってしまいました。

  80. autovacuum がドロップされたばかりの一時スキーマにアクセスしようとした場合にクラッシュする障害が回避されました。 (Tom Lane) (12)(11)
  81. この障害はスーパーユーザが一時スキーマを手動で削除した場合にのみ発生します。これは一般的な状況ではありませんが、この場合も動作すべきでした。

  82. クラッシュリカバリ中の WALセグメントの早すぎるリサイクルが回避されました。 (Jehan-Guillaume de Rorthais) (12)(11)(10)(9.6)(9.5)
  83. クラッシュリカバリの間にアーカイブされる準備が整った WALセグメントがアーカイブされずにリサイクルされる可能性がありました。

  84. アーカイブリカバリ中に無関係なタイムラインがスキャンされないようになりました。 (Kyotaro Horiguchi) (12)(11)(10)(9.6)(9.5)
  85. これにより、アーカイブストレージから存在しない WAL ファイルをフェッチしようとする多くの試みを排除することが可能となり、アーカイブへのアクセスが遅い場合に役立ちます。

  86. 論理デコーディングでの「subtransaction logged without previous top-level txn record」 というエラーの検査が削除されました。 (Arseny Sher, Amit Kapila) (12)(11)(10)(9.6)(9.5)
  87. この条件は様々なシナリオで正当に到達可能なため取り除かれました。

  88. レプリケーションスロットのコピー後に障害が発生する可能性があり、回避されました。 (Masahiko Sawada, Arseny Sher) (12)
  89. WALデータが適切に取りおかれず、早くに削除されてしまう可能性がありました。

  90. レプリケーションスロットの「io_in_progress_lock」がエラー時のコードパスで確実に解放されるようになりました。 (Pavan Deolasee) (12)(11)(10)(9.6)(9.5)
  91. 本障害のため walsender が後でロックを待機したまま動けなくなる可能性がありました。

  92. 論理レプリケーションによって発行された更新のときに、生成列が正しく確実に処理されるようになりました。 (Peter Eisentraut) (12)
  93. これまで、このような場合に生成列が更新されませんでした。

  94. 同期スタンバイ管理での競合状態が修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  95. synchronous_standby_names の設定を変更している間、同期コミットを待っているトランザクションをリリースしてもよいかどうかについて、誤った判断を下す可能性がありました。 また、walsenderプロセスが終了してすぐにプロセスが再起動された場合にも、同様に誤った判断を下す危険性がありました。

  96. いくつかのエラー報告に欠落していた SQLSTATE値が追加されました。 (Sawada Masahiko) (12)(11)(10)(9.6)(9.5)
  97. イベントトリガ関数の通常関数としての実行を確実に拒否するようにPL/pgSQL が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  98. そのような関数実行でクラッシュが発生していました。

  99. 「sslmode=verify-full」を使用した時の libpq でのメモリリークが修正されました。 (Roman Peshkurov) (12)(11)(10)(9.6)(9.5)
  100. 接続開始時の証明書の検証は、いくらかのメモリリークの可能性があり、クライアントプロセスの起動中にデータベース接続を多数オープンした場合に問題となる可能性がありました。

  101. すべてのプラットフォームで「-」引数を「標準入力からの読み込み」を意味するものとして扱うように ecpg が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  102. AIX で動作しないケースが報告されていました。

  103. psql で失敗した接続を復旧しようとした時に発生するクラッシュが修正されました。 (Michael Paquier) (12)
  104. psql の \gx コマンドが引数(ファイル名)のタブ補完できるようになりました。 (Vik Fearing) (12)(11)(10)
  105. \gx コマンドは直前の SQL 実行結果を拡張出力モードで引数に指定したファイルへ書き込みます。

  106. pg_dump で ALTER ... DEPENDS ON EXTENSION がサポートされました。 (Álvaro Herrera) (12)(11)(10)(9.6)
  107. 以前の pg_dump はこの依存関係を無視してしまい、ダンプ/リストアや pg_upgrade時にそれらが反映されませんでした。

  108. pg_dump が RLSポリシーオブジェクトのコメントをダンプするように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  109. pg_dump がイベントトリガのリストアを最後に行なうようになりました。 (Fabrízio de Royes Mello, Hamid Akhtar, Tom Lane) (12)(11)(10)(9.6)(9.5)
  110. これにより、イベントトリガが他のオブジェクトの復元に干渉するリスクを最小限に抑えることができます。

  111. pg_basebackup が有効な tarファイルを確実に生成するようになりました。 (Robert Haas) (12)
  112. ファイルの末尾にゼロ埋めされたブロックが追加されることがありました。これは一般的なバージョンの tar では問題ないようですが、POSIXファイル形式の仕様としては問題がありました。

  113. pg_checksums および pg_verify_checksums がメジャーバージョンの異なるテーブル空間のサブディレクトリをスキップするようになりました。 (Michael Banck, Bernd Helmle) (12) (11)
  114. このようなサブディレクトリは実際にはデータベースクラスタには属していないので、処理してはいけませんでした。

  115. pg_checksums および pg_verify_checksums と関連プログラムで、pg_internal.init の一時的なコピーを無視するようになりました。 (Michael Paquier) (12) (11)
  116. createdb の --encoding、--lc-ctype、--lc-collate の値のクォート処理が修正されました。 (Michael Paquier) (12)(11)(10)(9.6)(9.5)
  117. 以下の通り、正しくクォートされた文字列を認識できるようになりました。

    (PostgreSQL 12.2 の createdb コマンド)
    $ createdb --lc-collate "foo'; SELECT '1" 'foobar2'
    createdb: error: database creation failed: ERROR:  CREATE DATABASE cannot run inside a transaction block
    
    (PostgreSQL 12.3 の createdb コマンド)
    $ createdb --lc-collate "foo'; SELECT '1" 'foobar2'
    createdb: error: database creation failed: ERROR:  invalid locale name: "foo'; SELECT '1"
    
  118. contrib/lo の lo_manage()関数が、トリガとしてではなく直接呼ばれた場合でもクラッシュしなくなりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  119. contrib/ltree で、ltree と lquery のフィールド長がオーバーフローしないようになりました。 (Nikita Glukhov) (12)(11)(10)(9.6)(9.5)
  120. これまではフィールド長が 65535 を超えると 0 になっていましたが、本修正によって ERROR が返るようになりました。

    (修正前の動作)
    db=# SELECT nlevel(('1' || repeat('.1', 65534))::ltree);
     nlevel
    --------
      65535
    (1 row)
    
    db=# SELECT nlevel(('1' || repeat('.1', 65535))::ltree);
     nlevel
    --------
          0
    (1 row)
    
    
    (修正後の動作)
    db=# SELECT nlevel(('1' || repeat('.1', 65535))::ltree);
    ERROR:  number of ltree levels (65536) exceeds the maximum allowed (65535)
    
  121. oldest_xact値が 2^31-1 を超えても contrib/pageinspect の bt_metap() 関数が失敗しなくなりました。 (Peter Geoghegan) (12)(11)
  122. このような XID は負の整数として報告されるようになりました。これはワークアラウンドですが、エラーを投げるよりは良いと判断されました。これまで、以下のようなエラーが発生していました。

    db=# SELECT * FROM bt_metap('index');
    ERROR: value "2180413846" is out of range for type integer
    
  123. contrib/sepgsql で誤った「WARNING: cache reference leak」メッセージが出力されなくなりました。 (Michael Luo) (12)(11)(10)(9.6)(9.5)
  124. Windows で pg_ctl start 時の早すぎるログファイル作成を回避するようになりました。 (Alexander Lakhin) (12)
  125. Windows の pg_ctl で、-l で指定したログファイルがまだ存在せず、pg_ctl が Administrator権限で実行されている場合、postmaster から書き込みできないパーミッションでログファイルが作成されて、権限不足のエラーが生じる可能性がありました。

  126. Windows で Unixスタイルのロケール名を扱う際に失敗しないようになりました。 (Juan José Santamaría Flecha) (12)(11)(10)(9.6)(9.5)
  127. Unixスタイルのロケール文字列(たとえば "et_EE.UTF-8")の場合、ドットの後にあるのはエンコーディング名です。これを Windows のコードページ番号として扱って、以下のエラーが生じていました。

    > initdb.exe --locale et_EE.UTF-8 -D C:\data
    initdb: ERROR:  invalid locale name "et_EE.UTF-8"
    

    そのため、ドットの後の文字がすべて数字であるかどうかを確認し、そうでない場合はコードページ番号ではなくエンコーディング名として扱うようになりました。

  128. Windows で、PG_COLOR のカラー化をサポートするプログラムでコンソールの VT100 互換モードを設定するようになりました。 (Juan José Santamaría Flecha) (12)
  129. これを設定していないと、カラー化オプションが実際には動作しませんでした。

  130. ereport() の呼び出しで余分な括弧が要求されなくなりました。 (Andres Freund, Tom Lane) (12)
  131. これはソースコード内のインターフェースに関連する修正です。

  132. configure で libxml2 の位置を確認するために、利用可能な場合は pkg-config を使用するようになりました。 (Hugh McMaster, Tom Lane, Peter Eisentraut) (12)(11)(10)
  133. pkg-config が存在しないか、libxml2 に関する情報がない場合は、これまで通りxml2-config に問い合わせます。

    この変更により、PostgreSQL がデフォルトではないバージョンの libxml2 を使用する場合、そのバージョンの xml2-config を PATH に設定すると、ビルドプロセスが中断される可能性があります。代わりに、XML2_CONFIG にデフォルトではない xml2-config を設定してください。この方法は、古いバージョンの PostgreSQL でも新しいバージョンの PostgreSQL でも動作します。

  134. libpq と ecpg の、Makefile の依存関係を修正しました。 (Dagfinn Ilmari Mannsaker) (12)
  135. MSVCビルドで Python のパス名のスペースに対処するようになりました。 (Victor Wagner) (12)(11)(10)(9.6)(9.5)
  136. Visual Studio のバージョン検出が修正され、MSVC ビルドがより多くの言語設定で動作するようになりました。 (Andrew Dunstan) (12)(11)(10)(9.6)(9.5)
  137. Windows 以外のビルドではすでにそうなっているように、MSVC ビルドでも、3.0 より新しいバージョンの bison では "-Wno-deprecated" を使用するようになりました。 (Andrew Dunstan) (12)(11)(10)(9.6)(9.5)
  138. タイムゾーンデータファイルが tzdata release 2020a に更新されました。モロッコとカナダのユーコンの DST法の変更と上海の歴史的な修正が含まれます。 (12)(11)(10)(9.6)(9.5)
  139. America/Godthabゾーンは、現在の英語の使用法を反映するために America/Nuuk に名称変更されました。変更前の名前も互換性のために利用可能なままです。

    また、initdb の既知の Windowsタイムゾーン名のリストが最近追加されたものを含むように更新され、そのプラットフォーム上のシステムのタイムゾーン設定が正しく翻訳される可能性が高まりました。

  140. パーティショニングされたテーブルで、制約違反エラーが発生した後に低頻度で発生するクラッシュが修正されました。 (Andres Freund) (11)(10)
  141. nextXid がスタンバイサーバ上で後戻りしないようになりました。 (Eka Palamadai) (11)(10)(9.6)(9.5)
  142. この競合状態により、誤ったホットスタンバイフィードバックメッセージがプライマリサーバに送り返される可能性があり、VACUUM がプライマリ上ですぐに実行されてしまう可能性がありました。

  143. 共有ライブラリのビルドする時に CXXFLAGS に CFLAGS_SL を含めるようになりました。 (Oleksii Kliukin) (10)
  144. これにより、必要に応じて "-fPIC" を追加するなど、C++ のソースファイルが正しくコンパイルされるようになります。11.x以降バージョンでは既にそのようになっています。

PostgreSQL 12.2、11.7、10.12、9.6.17、9.5.21、9.4.26 (2020年2月13日リリース)の変更点


  1. 欠けていた ALTER ... DEPENDS ON EXTENSION 文の権限検査が追加されました。(CVE-2020-1720) (Álvaro Herrera) (12)(11)(10)(9.6)
  2. 関数、プロシージャ、トリガ、マテリアライズドビュー、インデックスに対する本SQL文について修正が行われました。本SQL文はデータベースオブジェクトが拡張に依存していると印付けするものです。依存関係があると、拡張を DROPする際にそのデータベースオブジェクトも削除されます。

    本SQLの実行際して何ら権限チェックが行われていませんでした。そのため、拡張を削除できるユーザは権限の無いオブジェクトを削除可能でした。また、管理者が拡張を削除する際に権限の無いオブジェクトを削除させるように仕組むことができました。

    本SQLの実行には対象オブジェクトの所有者であることが要求されるように修正されました。

  3. TRUNCATE ... CASCADE が関連する全てのパーティションを確実に空にするように修正されました。 (Jehan-Guillaume de Rorthais) (12)
  4. パーティションテーブルのパーティションが CASCADEオプション付きでTRUNCATEされた場合で、かつ、パーティションテーブルが他テーブルからの外部キー参照を持っていた場合、参照しているテーブルも空にされるべきです(通常のテーブルもそのように動作します)。参照しているテーブルがパーティションテーブルである場合に検査に取りこぼしがあり、外部キー制約違反の行が残る可能性がありました。

    このため、データベースにパーティションテーブル間の外部キー制約があり、これまでに被参照テーブルにパーティション単位で TRUNCATE を行っていたなら、外部キー違反が無いかを確認することを推奨します。

    最も簡単な確認方法は新たに同定義の外部キー制約を加えることです(確認用なので追加に成功したら、削除します)。ロック取得の観点から、これが実施しにくい場合には、SELECT文で制約違反の行を探してください。

  5. 外部キー制約が追加した副パーティションに付加されない障害が修正されました。 (Jehan-Guillaume de Rorthais) (12)
  6. 複数階層パーティションテーブルの第二階層以下にパーティションをアタッチするとき、そのパーティションテーブルを参照する外部キー制約が新たなパーティションに複製されず、その結果、後で制約違反を引き起こす可能性がありました。

    簡単な修復方法は、そのパーティションをデタッチしてアタッチすることです。修復すべきパーティションが大量にある場合には、新たに同定義の外部キー制約を追加する方法が良いでしょう。

  7. パーティションテーブルまたは継承ツリーで同時更新中にクラッシュが生じる可能性があり、修正されました。 (Tom Lane) (12)
  8. パーティションテーブルの行トリガが適時に正しく副パーティションに複製されるように修正されました。 (Álvaro Herrera) (12)(11)
  9. (外部キー制約やユニーク制約のトリガではなく)ユーザ定義トリガについて、パーティションの作成やアタッチをするときに取りこぼしが生じるおそれがありました。

  10. ロジカルレプリケーションのサブスクライバ側のコードが、適時に列ごとの UPDATEトリガを実行するように修正されました。 (Peter Eisentraut) (12)(11)(10)
  11. このようなトリガが実行されないことがありました。

  12. 大きいトランザクションを多数の分割された一時ファイルに書き出ししなければならないときの、ロジカルデコーディングでのエラーが回避されました。 (Amit Khandekar) (12)(11)(10)(9.6)(9.5)(9.4)
  13. ファイル識別子を使いすぎて、以下のようなエラーが出るケースが報告されていました。

    ERROR:  exceeded maxAllocatedDescs (492) while trying to open file "pg_replslot/logical/xid-2362-lsn-0-24000000.spill"
    
  14. ロジカルレプリケーションのサブスクライバが行更新を処理するときに、クラッシュやデータ破損の可能性があり、修正されました。 (Tom Lane, Tomas Vondra) (12)(11)(10)
  15. 本障害は、サブスクライバのテーブルがパブリッシャからコピーされていないリファレンス渡しのデータ型の列を含む場合に限って、顕在化した問題を発生させます。

    text や numeric など格納サイズが大きいデータ型はリファレンス渡しです。ビルドオプションによっては int8 や float8 もリファレンス渡しになります。

  16. ロジカルレプリケーションのサブスクライバのクラッシュが修正されました。サブスクライブしているテーブルで DDL変更(ALTER TABLE)をした後にクラッシュが発生しました。 (Jehan-Guillaume de Rorthais, Vignesh C) (12)(11)(10)
  17. ロジカルレプリケーションのパブリッシャにおける、データベースがクラッシュ終了して再起動した後に起きるアサートエラーが修正されました。 (Vignesh C) (12)(11)(10)(9.6)(9.5)(9.4)
  18. 物理レプリケーションスロットにおいて pg_replication_slot_advance() の効果が再起動後も維持されるようになりました。 (Alexey Kondratov, Michael Paquier) (12)(11)
  19. REPLICA IDENTITY FULL を用いたロジカルレプリケーションの効率が改善されました。 (Konstantin Knizhnik) (12)(11)(10)
  20. 更新や削除の操作に際して、既存タプルを探すときに最初に一致したタプルを返すようになりました。これまでは全てを調べる動作になっていました。

  21. ベースバックアップが INT32_MAX より大きいデータベースの OID を扱えるように修正されました。 (Peter Eisentraut) (12)
  22. 大きい OID値を持つデータベースがあるときに、以下のようなエラーが報告されていました。

    pg_basebackup: error: could not get write-ahead log end position from server: ERROR:  value "3000000000" is out of range for type integer
    
  23. 常に適切なタイミングでパラレルプランノードが終了(shutdown)されるようになりました。 (Kyotaro Horiguchi) (12)(11)
  24. この障害は、複数バッチの(即ち、件数が多くてメモリに載らない場合の)パラレルハッシュ結合の際に、以下のような予期せぬ警告を発生させました。

    WARNING:  temporary file leak: File 15 still referenced
    
  25. Limitノードの下の Gather または GatherMerge プランノードの早すぎる終了(shutdown) が防止されました。 (Amit Kapila) (12)(11)(10)(9.6)
  26. これにより、入れ子ループの内側にある等、このようなプランノードを複数回スキャンする必要がある場合の障害を回避します。本障害でクラッシュする動作が報告されました。

  27. 多コアCPU でのパラレルハッシュ結合の効率が改善されました。 (Gang Deng, Thomas Munro) (12)(11)
  28. 無駄な処理を削って、それによる CPUキャッシュ間の同期処理の発生を回避します。

  29. パラレル CREATE INDEX での動的共有メモリスロットの空きが無いときのクラッシュが回避されました。 (Thomas Munro) (12)(11)
  30. そのような場合には非パラレルのインデックス作成が行われるようになります。

  31. 動的共有メモリスロットが無いときのメモリリークが修正されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)(9.4)
  32. 以下のエラーが発生する場合にリークが発生しました。

    ERROR: too many dynamic shared memory segments
    
  33. 一時テーブルに対するインデックス作成、削除、再構築時にCONCURRENTLYオプションを無視するようになりました。 (Michael Paquier, Heikki Linnakangas, Andres Freund) (12)(11)(10)(9.6)(9.5)(9.4)
  34. これにより一時テーブルが ON COMMITアクションを持っていた場合の奇妙なエラーを回避します。以下のような発生ケースが報告されました。

    =# CREATE TEMP TABLE t0(c1 INT PRIMARY KEY) ON COMMIT DELETE ROWS;
    =# REINDEX TABLE CONCURRENTLY t0;
    ERROR:  index "t0_pkey_ccnew" already contains data
    

    他のセッションは一時テーブルにアクセスできないため、一時テーブルに対するインデックス作成で CONCURRENTLY を使う利点はありません。

  35. ON COMMIT DELETE ROWS を伴う一時テーブルに対する式インデックスをコミット時にリセットするときに起こりうる誤動作が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  36. box型、範囲型、inet型に対する BRINインデックスの操作でクラッシュの可能性があり、修正されました。 (Heikki Linnakangas) (12)(11)(10)(9.6)(9.5)
  37. GiSTインデックス作成での再帰的なページ分割中に起きるクラッシュが修正されました。 (Heikki Linnakangas) (12)
  38. GINインデックスで削除済みページの処理が修正されました。 (Alexander Korotkov) (12)(11)(10)(9.6)(9.5)(9.4)
  39. 本障害ではデッドロックや、削除済みページの誤った状態更新、最近に削除されたページを辿る動作の失敗、を起こす可能性があり、これらが回避されました。

  40. 複数行の VALUESリスト内の SubPlan(副SELECT)でクラッシュの可能性があり、修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  41. 一例として、以下のような形状の問い合わせが該当します。

    SELECT * FROM (
     SELECT * FROM (
      VALUES ('A'::text NOT IN (
       SELECT 'E'::text AS col_1 FROM (
        VALUES (NULL), (NULL), (NULL), (NULL)) AS tab_1 (col_2)
         WHERE false),
       NULL, 'B'::text, 3::int),
      (false, 4::int, 'B'::text, 0::int)) AS tab_3 (col_4, col_5, col_6, col_7)
     WHERE tab_3.col_4) AS tab_8 ORDER BY 1, 2, 3, 4;
    
  42. ALTER TABLE で、GENERATED句の式で参照されている列が、同じ ALTER文中の手前で追加されたり型変更されている場合のエラーが修正されました。 (Tom Lane) (12)
  43. 例えば以下のような操作でエラーが発生していました。

    db=# CREATE TABLE t25 (a int, b int, c int, x int);
    db=# INSERT INTO t25 VALUES (1, 1, 1, 1), (2, 2, 2, 2);
    db=# ALTER TABLE t25
           DROP COLUMN x,
           ALTER COLUMN a TYPE bigint,
           ALTER COLUMN b TYPE bigint,
           ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED;
    ERROR:  attribute 1 of type t25 has wrong type
    DETAIL:  Table has type integer, but query expects bigint.
    
  44. タプル変換時に、失った属性に対するデフォルト値の挿入に失敗していたものが修正されました。 (Vik Fearing, Andrew Gierth) (12)(11)
  45. この障害で、定数デフォルトを伴う ALTER TABLE .. ADD COLUMN で追加された列の値が誤って NULL と読み取られる可能性がありました。

    タプル変換とは行データをレコード型に代入するときなどに必要となる内部処理です。

  46. チェックポイント処理にて、削除されているかもしれないリレーションのセグメントを開くことで、稀に PANIC になる可能性があり、修正されました。 (Thomas Munro) (12)
  47. FileClose() 失敗後におきるクラッシュが修正されました。 (Noah Misch) (12)(11)(10)
  48. この問題は data_sync_retry = on の場合のみ該当します。off の場合には FileClose() 失敗は(仕様通りに)PANIC になるはずです。

  49. 外部テーブルに対する複数の AFTER ROW トリガの処理が修正されました。 (Etsuro Fujita) (12)
  50. トリガを駆動されたときにアサートエラーが生じる動作が報告されました。

  51. リファレンス渡しのデータ型の集約関数の遷移状態でクラッシュの可能性があり、修正されました。 (Andres Freund, Teodor Sigaev) (12)(11)(10)(9.6)(9.5)(9.4)
  52. PL/pgSQL関数を使ってユーザ定義した集約関数を実行したときにアサートエラーが生じるケースが報告されました。

  53. to_date() と to_timestamp() のエラー報告が改善されました。 (Tom Lane, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
  54. 入力文字列中の誤った月や曜日に関するエラー報告が、誤った部分を示すときマルチバイト文字の途中で切り出すことがあり、続くエラーの元になる不適切なエンコードのエラーメッセージをもたらしました。

    これを回避するため、次の空白文字までを切り出し範囲とするようになりました。

  55. 紀元前の日付に対する EXTRACT(ISOYEAR FROM timestamp) に一年ずれた結果を返す誤動作があり、修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  56. (障害動作例: B.C. 7年について -7 を返すのが正しい動作)
    db=# SELECT EXTRACT(ISOYEAR FROM 'Feb 03 04:05:06 0007 PST BC'::timestamp);
     date_part
    -----------
            -6
    (1 row)
    
  57. char型に対する <> 演算子があいまいな照合順序のエラーを適切に報告するようになりました。 (Tom Lane) (12)
  58. 以下のように、どの照合順序を使って処理すべきか判別できない場合に、予期せぬエラーメッセージや、アサートエラーが出ていました。

    db=# CREATE TABLE t33 (c0 char(2) COLLATE "C", c1 char(2) COLLATE "POSIX");
    db=# INSERT INTO t33 VALUES ('', '');
    
    db=# SELECT * FROM t33 WHERE c1 <> c0;
    ERROR:  cache lookup failed for collation 0
    (予期せぬエラー出力)
    
    db=# SELECT * FROM t33 WHERE c1 = c0;
    ERROR:  could not determine which collation to use for string comparison
    HINT:  Use the COLLATE clause to set the collation explicitly.
    (こちらは望ましいエラー出力)
    
  59. TIDスキャンがシーケンシャルスキャンとして処理されないように修正されました。 (Tatsuhito Kasahara) (12)
  60. リファクタリングの誤りで、TIDスキャン(ctid列による選択)が実行時統計情報ビューでシーケンシャルスキャンとして数えられており、さらに、シーケンシャルスキャンのようにテーブル全体の術部ロックを取りました。後者の動作は SERIALIZABLE トランザクションモードで不要な直列化失敗エラーを引き起こす可能性がありました。

  61. システムカタログに自己参照ビューがあるときの information_schemaビューでのスタックオーバフローが回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  62. リレーションが更新可能かを調べる内部実装関数が、自己参照ビューに対して無限再帰を起こすため、そのような場合に処理を打ち切るように修正されました。

  63. walsenderプロセスが pg_stat_activity のトランザクション開始時刻に常に NULL を見せるようになりました。 (Álvaro Herrera) (12)(11)(10)
  64. これまでは xact_start 列にプロセス開始時刻があらわれることがありました。

  65. ハッシュ結合で、内側リレーションが巨大な場合の性能が改善されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)(9.4)
  66. 多数の稼働中 walsenderプロセスがあるときの、スピンロック競合が軽減されました。 (Pierre Ducroquet) (12)
  67. EXPLAIN の出力で "Subplans Removed" フィールドの配置が修正されました。 (Daniel Gustafsson, Tom Lane) (12)(11)
  68. テキスト以外の出力形式では、このフィールドは Plans 副グループの内側に出力されて、構文的に不正な出力になっていました。

    JSON形式であれば以下のような形の不正な出力があり得ました。

        "Plans": [
            { ..サブプラン.. },
            "Subplans Removed": 5,
            { ..サブプラン.. }
        ]
    

    "Subplans Removed" は親の Append や MergeAppend プランノードに付けるように修正されました。

    この変更はテキスト形式にも反映されます。これまで InitPlan の下にあった Subplans Removed は、InitPlan よりも手前に現れるようになります。

  69. EXPLAIN の SETTINGS オプションが非テキストの出力フォーマットで空で出力されるように修正されました。 (Tom Lane) (12)
  70. 非テキストの出力フォーマットでは、たとえ値が空やゼロであっても、各フィールドが存在することが期待されます。

  71. ユーザが問い合わせに明示的に現れるテーブルの対応する列を読める場合には、プランナが潜在的に漏洩のあるテストを子テーブル(パーティション)の統計情報に適用できるようにしました。 (Dilip Kumar, Amit Langote) (12)(11)
  72. この変更は、CVE-2017-7484 セキュリティ障害の修正で生じた、パーティションテーブルの性能問題を修正します。先のセキュリティ修正では、現在ユーザが直接には読むことのが許可されない列の統計情報に、漏洩のある演算子を適用できないようにしました。

    一方で、親のパーティションテーブルのみに参照権限があって、個々のパーティションには権限が無いというのは、ごく一般的な状態です。ユーザは親のパーティションテーブルを通して、子パーティションの列を参照できます。このような場合に、先のセキュリティ修正のためにプランナの見積もりが必要以上に劣化していました。

  73. 単一行副問い合わせの結合に対する積極的すぎる組み換えによって引き起こされるプランナのエラーが修正されました。 (Tom Lane) (12)
  74. この誤りは、以下のような予期せぬエラーをもたらしました。また、アサートエラーになる可能性もありました。

    (本エラーを発生させる問い合わせ例)
    db=# SELECT FROM (
          SELECT FROM pg_stat_bgwriter AS r0
           LEFT JOIN pg_stat_bgwriter AS r1 ON (true), LATERAL (
            SELECT FROM pg_publication AS r2, LATERAL (
             SELECT FROM pg_class WHERE r1.buffers_alloc IS NOT NULL
             ) AS sq0 LIMIT 1) AS sq1) AS sq2;
    ERROR:  failed to construct the join relation
    
  75. 「no = operator for opfamily NNNN」というプランナのエラーが修正されました。 (Tom Lane) (12)
  76. LIKE や正規表現のパターンマッチ演算子をバイナリ互換のインデックス演算子クラスでマッチさせようとするときに発生しました。

    (発生例: text型とバイナリ互換の char型に対応した bpchar_ops を使用しています)
    db=# CREATE TABLE t43 (c text);
    db=# CREATE INDEX i43 ON t43 (c bpchar_ops);
    db=# SELECT * FROM t43 WHERE t43.c LIKE '';
    ERROR:  no = operator for opfamily 426
    
  77. 範囲型に対する <@ および @> 演算子に対する選択度の計算で、境界ケースでのクラッシュ、または、誤った見積もりが、修正されました。 (Michael Paquier, Andrey Borodin, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  78. 列のプランナ統計情報と比較条件の値とが特定条件に合致する場合に問題が発生します。

  79. MVC(最頻値)の拡張統計情報を使っているときの、OR句に対するプランナの不正確な見積もりが修正されました。 (Tomas Vondra) (12)
  80. 拡張統計情報が a と b の間に作られているところで、以下のような問い合わせを実行するとき、アサートエラーが出る動作が報告されました。アサート無効のときにはプランナの見積もりが不正確になります。

    SELECT * FROM t45 WHERE (a = 1) OR (b = 1) OR (c = 1)
    
  81. MCV(最頻値)拡張統計情報を適用するときに、システム列を無視するようになりました。 (Tomas Vondra) (12)(11)(10)
  82. これにより以下のように、システム列を参照する問い合わせで予期せぬエラーが発生するのを防止します。

    db=# CREATE TABLE t46 (id int, c1 int, c2 int);
    db=# INSERT INTO t46 SELECT g, g, g FROM generate_series(1, 1000) as g;
    db=# CREATE STATISTICS s46 ON id, c1 FROM t46 ;
    db=# ANALYZE t46;
    db=# SELECT (ctid::text::point)[0] blkno, count(*) cn FROM t46
           GROUP BY blkno ORDER BY cn DESC LIMIT 10;
    ERROR:  negative bitmapset member not allowed
    
  83. BRINインデックスのロジックが、仮定の BRINインデックスに対応するように修正されました。 (Julien Rouhaud, Heikki Linnakangas) (12)(11)(10)
  84. これまでは、何らかインデックスアドバイザ拡張が仮定の BRINインデックスを伴うプランを生成させようとすると、BRINコスト見積もりコードが常にインデックスのメタページに物理的にアクセスしようするため、失敗しました。

  85. 条件付き INSTEADルールを伴うビューの自動更新を使おうとするときのエラー報告が改善されました。 (Dean Rasheed) (12)(11)(10)(9.6)(9.5)(9.4)
  86. これはサポートされていないものですが、これまでは、そのことを示すエラーがエグゼキュータによる実行時にしか出ませんでした。そのため、不明瞭なプランナのエラーで原因が隠されてしまうおそれがありました。

    リライタの段階で以下のようなエラーメッセージが出るようになりました。

    db=# CREATE TABLE t48 (a int PRIMARY KEY, b text);
    db=# INSERT INTO t48 VALUES (2, '2');
    db=# CREATE VIEW v48 AS SELECT a, b, a AS aa FROM t48;
    db=# CREATE RULE v48_upd_rule AS ON UPDATE TO v48
           WHERE OLD.a > 0 DO INSTEAD UPDATE t48 SET b=NEW.b WHERE a=OLD.a;
    db=# UPDATE v48 SET b = 'ROW 2' WHERE a = 2;
    ERROR:  cannot update view "v48"
    DETAIL:  Views with conditional DO INSTEAD rules are not automatically updatable.
    HINT:  To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
    
    (以下は修正前バージョン 12.1 でのエラーメッセージ)
    ERROR:  no relation entry for relid 2
    
  87. 複合型が範囲型を通して間接的に自身に含まれることを防止しました。 (Tom Lane, Julien Rouhaud) (12)(11)(10)(9.6)(9.5)(9.4)
  88. 元々自分自身を含む複合型は作成できない仕様でした。本修正で以下の操作がエラーになります。

    db=# CREATE TYPE two_ints AS (a int, b int);
    db=# CREATE TYPE two_ints_range AS RANGE (subtype = two_ints);
    db=# ALTER TYPE two_ints ADD ATTRIBUTE c two_ints_range;
    ERROR:  composite type two_ints cannot be made a member of itself drop type two_ints cascade;
    NOTICE:  drop cascades to type two_ints_range
    (上記は修正後の動作、修正前はエラーにならない)
    
  89. record のような疑似データ型を返すパーティションキーの式が禁止されました。 (Tom Lane) (12)(11)(10)
  90. そのようなパーティションテーブルに対する問い合わせで、何らかエラーやスタックオーバーフロー(ERROR: stack depth limit exceeded)が起きる動作が報告されました。定義時点でエラーが出るようになります。

  91. インデックスを作成できないデータ型を返す式に対するインデックスの作成時のエラーメッセージが修正されました。 (Amit Langote) (12)(11)(10)(9.6)(9.5)(9.4)
  92. 空の列名でなく自動生成した列名が出力されるようになります。

    (修正前)
    =# CREATE INDEX ON t ((ROW(c)));
    ERROR:  column "" has pseudo-type record
    
    (修正後)
    =# CREATE INDEX ON t ((ROW(c)));
    ERROR:  column "row" has pseudo-type record
    
  93. VALUESリストのみからなるマテリアライズドビューのダンプ時に、指定した列名を出力するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  94. =# CREATE MATERIALIZED VIEW mv (c) AS VALUES (1);
    CREATE MATERIALIZED VIEW
    
    (修正前のpg_dump出力)
    CREATE MATERIALIZED VIEW public.mv AS
     VALUES (1)
      WITH NO DATA;
    
    (修正後のpg_dump出力)
    CREATE MATERIALIZED VIEW public.mv AS
     SELECT "*VALUES*".column1 AS c
       FROM (VALUES (1)) "*VALUES*"
      WITH NO DATA;
    
  95. ビューまたはルールの依存関係の計算時に xmltable関数で参照されているデータ型と照合順序を考慮するように修正されました。 (Tom Lane) (12)(11)(10)
  96. 修正前は、xmltable関数で参照されているデータ型や照合順序を削除することで、ビューやルールを壊すことができました。この修正は新たに作成したビューとルールに適用され、既存のものには適用されません。

    =# CREATE EXTENSION seg;
    =# CREATE TABLE t53 AS SELECT '<s>1 .. 2</s>'::xml AS c;
    =# CREATE VIEW v53 AS SELECT s::text FROM t53, xmltable('//s' PASSING c COLUMNS s seg);
    
    (修正前)
    =# DROP EXTENSION seg;
    DROP EXTENSION
    =# SELECT * FROM v53;
    ERROR:  cache lookup failed for type 16499
    
    (修正後)
    =# DROP EXTENSION seg;
    ERROR:  cannot drop extension seg because other objects depend on it
    DETAIL:  view xmlview depends on type seg
    HINT:  Use DROP ... CASCADE to drop the dependent objects too.
    
  97. RADIUS認証のオプションのパラメータ値に対して、小文字への変換と63バイトへの切り詰めを行わないように修正されました。 (Marcos David) (12)(11)(10)
  98. 修正前はパラメータ値を誤って SQL識別子として処理していました。

  99. 受信した NOTIFYメッセージを ReadyForQuery 送信後でなく送信前にクライアントに送信するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)
  100. この修正により、libpq のようなクライアントライブラリでは、トランザクション内で受信した通知をクライアントがトランザクション完了と判断するまで受信可能になります。実際には通知を非同期で受信する必要があるため、動作の違いはおそらくありません。ただ、セッションをまたがる通知のテストケースを作成するのに便利です。

  101. GSSAPI暗号化使用時のノンブロッキングI/O処理のバグが修正されました。 (Tom Lane) (12)
  102. この誤りにより、データが損失したり、それに伴って接続が切断したり、データを残して送信が完了したと判断してスリープ状態となったりする可能性があります。さらに、libpq では接続ごとに暗号化状態を管理できなかったため、複数の暗号化接続を使用する場合にエラーが発生する可能性があります。

  103. ビルド時に GSSAPI が無効の場合にも libpq が GSS 関連の接続パラメータを解析するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  104. この修正により、SSL と同様に機能が無効の場合でも、関連するすべてのパラメータを常に受けつけるようになります。

  105. ECPG の PGTYPEStimestamp_fmt_asc() 関数で、%b、%B 書式指定時の誤った処理が修正されました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
  106. %b、%B は月の略称、名称に置換されますが、修正前は、1 始まりの月数を 0始まりの月名の配列の添字に使用しており、11月までは翌月の月名に置換され、12月はクラッシュする可能性がありました。

  107. ecpglib でメモリ不足によるエラー発生後にクラッシュが発生しないように修正されました。 (Tom Lane) (12)
  108. 並列の pg_dump や pg_restore でワーカプロセスの作成に失敗した場合にクラッシュや無限ループが発生しないように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  109. pg_dump や pg_restore の並列実行をシグナルを介して終了しようとしたときに、クラッシュまたはハングアップが発生する可能性があり、防止されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  110. pg_upgrade で、テーブル内のアップグレードできないデータ型を調べるときに、配列と範囲のベースとなるデータ型を調べるようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  111. 複合型やドメインには対応していましたが、これらについて見逃されていました。

  112. createuser の --connection-limit オプションの引数に、より厳格な構文チェックを適用するようになりました。 (Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
  113. より多くの場合で、PL/pgSQL の複合型変数によって参照される指定型の変更に対応できるになりました。 (Ashutosh Sharma, Tom Lane) (12)(11)
  114. PL/pgSQL の変数によって参照される複合型やテーブルを削除して再作成したとき、以下のようなエラーが生じることがありました。

    ERROR:  could not open relation with OID 34567
    
  115. postgres_fdw で「UPDATE remote_tab SET (x, y) = (SELECT ...) 」などのコマンドをリモートサーバに送信しようとするときに、クラッシュしないようになりました。 (Tom Lane) (12)(11)(10)(9.6)
  116. contrib/dict_int で、1 未満の maxlen 設定を拒否するようになりました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
  117. これにより、そのパラメータの無意味な設定によるクラッシュを防止します。

  118. contrib/tablefunc の crosstab() 関数で NULL のカテゴリ値を許可しないようになりました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)(9.4)
  119. このケースは役に立たず、一部のプラットフォームではクラッシュしました。

  120. OpenSSL の SSL_clear_options() 関数に対する configure の調査を修正して、1.1.0 より前の OpenSSLバージョンで動作するようになりました。 (Michael Paquier, Daniel Gustafsson) (12)(11)
  121. この問題により、PostgreSQL が古いバージョンの OpenSSL で構築されている場合、SSL圧縮オプションを必要に応じて設定できなくなる可能性がありました。

  122. いくつかのタイムアウトおよび統計情報収集の設定パラメータの変数をPGDLLIMPORT としてマークし、拡張機能が Windows でそれらにアクセスできるようになりました。 (Pascal Legrand) (12)(11)(10)(9.6)(9.5)(9.4)
  123. これは、idle_in_transaction_session_timeout、lock_timeout、statement_timeout、track_activities、track_counts、およびtrack_functions に適用されます。

  124. slabメモリコンテキストの健全性チェックでメモリリークを回避するようになりました。 (Tomas Vondra) (12)(11)(10)
  125. プロダクションビルドでは通常、メモリコンテキストチェックが有効にならないため、これは問題ではありません。ただし、デバッグビルド(--enable-cassert や-DUSE_VALGRIND)ではリークが非常に深刻になる可能性があります。

  126. LWLock 統計情報メカニズムによって報告された複数の統計情報エントリが修正されました。 (Fujii Masao) (12)(11)(10)
  127. LWLock 統計情報のコード (デフォルトではビルドされません。-DLWLOCK_STATSを使用してコンパイルする必要があります) は、ハッシュテーブルキーの作成が失敗した結果、同じ LWLock およびバックエンドプロセスの複数のエントリを報告する可能性がありました。

  128. Windows でプロセス間シグナルの配信が遅延する原因となった競合状態が修正されました。 (Amit Kapila) (12)(11)(10)(9.6)(9.5)(9.4)
  129. これは、NOTIFY で目に見えるタイミングの異常を引き起こし、おそらく他の誤動作も引き起こしました。

  130. Windows の ReadFile() 関数からのまれなエラー結果の処理が修正されました。 (Thomas Munro, Juan José Santamaría Flecha) (12)
  131. 知られている限り、この見落としは、実際のクエリの誤動作ではなく、不要な情報を含む以下のようなログメッセージをもたらしました。

    LOG:  unrecognized win32 error code: ...
    
  132. Windows で、ERROR_ACCESS_DENIED でファイルアクセスの失敗後に数回再試行するようになりました。 (Alexander Lakhin, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  133. これは、対象ファイルに削除のフラグが設定されているが、実際には削除されていないためにファイルを開くことができない場合の対処に役立ちます。例えば、pg_ctl は、postmaster がすでに停止しているかどうかを調べるときに、以下ようなエラーでしばしば失敗しました。

    pg_ctl: could not open PID file "c:/pgsql/data/postmaster.pid": Permission denied
    
  134. Windows で、例えば pg_ctl restart によって停止された直後にpostmaster を起動する場合に、postmaster のログファイルの共有違反を回避するようになりました。 (Alexander Lakhin) (12)

PostgreSQL 12.1、11.6、10.11、9.6.16、9.5.20、9.4.25 (2019年11月14日リリース)の変更点


  1. ALTER TABLE でテーブル書き換えを要する他の変更と共に、デフォルト値無しの列を追加したときのクラッシュが修正されました。 (Andres Freund) (12)
  2. 以下のような発生例が報告されました。c1列の追加がテーブル書き換えを要する変更で、デフォルト値無しの列追加が c2 です。

    db=# CREATE TABLE t1 (id int);
    db=# CREATE SEQUENCE seq1;
    db=# ALTER TABLE t1
           ADD COLUMN c1 numeric(10,0) NOT NULL DEFAULT nextval('seq1'),
           ADD COLUMN c2 varchar(20);
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  3. REINDEX CONCURRENTLY のロック処理が修正されました。 (Michael Paquier) (12)
  4. REINDEX CONCURRENTLY は新たな版のインデックスに対してセッションレベルのロックを取得しておらず、潜在的に他セッションによる早すぎる操作を許していました。また、悪いタイミングでの問い合わせキャンセルや割り込みによるセッション終了により、REINDEX CONCURRENTLY が持つセッションレベルロックが解放されない恐れがありました。

  5. CREATE INDEX CONCURRENTLY や REINDEX CONCURRENTLY が進行状況を報告するときの、競合状態によるクラッシュが回避されました。 (Álvaro Herrera) (12)
  6. REINDEX CONCURRENTLY で重複した依存関係エントリが作成されてしまうのが回避されました。 (Michael Paquier) (12)
  7. この障害により pg_depend の肥大化が生じますが、それ以外の害はありません。既存の重複エントリは pg_depend システムテーブルを操作するか、インデックスを一度削除することで除去できます。

  8. VACUUM が未だ実行中のトランザクションに関連する古いマルチトランザクションIDをフリーズしようとするのが防止されました。 (Nathan Bossart, Jeremy Schneider) (12)(11)(10)(9.6)(9.5)
  9. この障害により、古い実行中のトランザクションが終了するまでの間、VACUUM が失敗していました。

    VACUUM 実行で以下のようなエラーが出るケースが報告されました。

    ERROR:  multixact ... from before cutoff ... found to be still running
    
  10. 式インデックスに対して CLUSTER を実行する時の、「wrong type of slot」エラーが修正されました。 (Andres Freund) (12)
  11. CLUSTERコマンドで以下のような予期せぬメッセージが発生していました。

    ERROR:  trying to store a heap tuple into wrong type of slot
    
  12. パーティションテーブルに対する SET CONSTRAINTS ... DEFERRED が失敗していたものが修正されました。 (Álvaro Herrera) (12)(11)
  13. トリガが無い、という不適切なエラーが生じていました。以下に発生例を示します。

    db=# CREATE TABLE t7p (a int PRIMARY KEY) PARTITION BY LIST (a);
    db=# CREATE TABLE t7p12 PARTITION OF t7p FOR VALUES IN (1, 2)
                            PARTITION BY LIST (a);
    db=# CREATE TABLE t7p1 PARTITION OF t7p12 FOR VALUES IN (1);
    db=# CREATE TABLE t7p2 PARTITION OF t7p12 FOR VALUES IN (2);
    db=# CREATE TABLE t7p3 PARTITION OF t7p FOR VALUES IN (3);
    db=# CREATE TABLE t7fk (a int REFERENCES t7p DEFERRABLE INITIALLY IMMEDIATE);
    db=# BEGIN;
    db=# SET CONSTRAINTS t7fk_a_fkey DEFERRED;
    ERROR:  no triggers found for constraint with OID 24861
    
  14. 親のパーティションテーブルに削除された列が含まれている場合に生じる、パーティションのインデックスを作る際のエラーが修正されました。 (Michael Paquier) (12)(11)
  15. 条件に該当するCREATE INDEXコマンドに対して以下のような予期せぬエラーが出るケースが報告されました。

    ERROR:  unexpected varattno 4 in expression to be mapped
    
  16. パーティションテーブルでインデックスのある列の削除について修正されました。 (Amit Langote, Michael Paquier) (12)
  17. これまではインデックスの依存性に関するエラーを出して失敗していましたが、自動的にインデックスも削除されるべきでした。

  18. パーティションインデックスが、インデックス同時再作成に失敗した後に削除できるようになりました。 (Michael Paquier) (12)
  19. このような場合に、インデックスの pg_class.relispartition フラグが誤った状態で残っていて、DROP INDEX の失敗をもたらしていました。DROP INDEX で、以下のようなエラーが出る動作が報告されました。

    ERROR:  could not find tuple for parent of relation ...
    
  20. パーティション単位での結合(partition-wise join)で、同値クラスメンバーの処理が修正されました。 (Amit Langote) (12)
  21. この誤りで、本来可能なパーティション単位での結合プランを使えなくなるか、「could not find pathkey item to sort」というプランナのエラーになる可能性があります。

  22. 問い合わせの式が操作されているときに、WINDOW句でオフセット式が確実に処理されるようになりました。 (Andrew Gierth) (12)(11)(10)(9.6)(9.5)(9.4)
  23. この誤りは、オフセットが自明でない式のときに様々なエラーをひき起こす可能性がありました。一例として、関数内の問い合わせが WINDOW句のオフセット式で関数パラメータを参照していて、関数がインライン化されている場合に以下のようなエラーを出すことがありました。

    ERROR:  no value found for parameter 1
    
  24. 子プロセス配列に空き枠が無いときにパラレル問い合わせがバックグラウンドワーカを要求した場合の、postmaster (サーバの親プロセス) のエラーが回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
  25. 以下のエラーが発生するケースが報告されました。稀ですが本障害で postmaster のクラッシュをひき起こす可能性もあります。

    FATAL:  no free slots in PMChildFlags array
    
  26. BEFORE UPDATEトリガを伴うテーブルの EvalPlanQual再チェックでひき起こされるクラッシュが修正されました。 (Andres Freund) (12)
  27. 本障害で更新SQL処理のバックエンドプロセスのクラッシュが生じます。EvalPlanQual再チェックは、READ COMMITTEDトランザクション隔離レベルでのSQL実行における内部的な処理です。

  28. 問い合わせが TOASTテーブルにアクセスしようとしたときの、「unexpected relkind」エラーが修正されました。 (John Hsu, Michael Paquier, Tom Lane) (12)(11)
  29. 本来、権限が無いというエラーが出るべきところで、不適切なエラーが出ていました。

    (本障害によるエラー例)
    db=> REINDEX TABLE pg_toast.pg_toast_16388;
    ERROR:  unexpected relkind: 116
    
    (本来生じるべきエラーは以下)
    ERROR:  must be owner of table pg_toast_16388
    
  30. パラレルワーカ起動時に GUCパラメータを設定する際のエラー発生時に、関連するエラーコンテキスト行を出力するようになりました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)
  31. 設定パラメータの誤りでパラレル問い合わせがエラーになったときに、エラーメッセージから誤っている個所が分かりにくいという問題がありました。

  32. read/write でオープンされたファイルにだけ fsync() が適用されるようになりました。 (Andres Freund, Michael Paquier) (12)(11)(10)(9.6)(9.5)(9.4)
  33. 一部のコードパスではリードオンリーで開いたファイルにも fsync() を試みていました。これは一部プラットフォームではエラーをひき起こし、サービスダウンの原因となりました。

    (Windowsプラットフォームで以下PANICの発生が報告されました)
    PANIC:  could not fsync file "pg_replslot/xxx/state": Bad file descriptor
    
  34. 文字エンコーディング変換が以前より長い文字列を扱えるようになりました。 (Álvaro Herrera, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  35. これまでは入力文字列で 0.25GB が上限でしたが、これからは変換後の出力が1GB を超えない限り処理できるようになります。

  36. ウィンドウ関数で不要に巨大なタプルストアが作成されるのが回避されました。 (Andrew Gierth) (12)(11)(10)(9.6)
  37. タプルストアとは、問い合わせの中間結果の表形式データを格納する領域です。一部の場合にタプルストアがソーステーブルの、問い合わせに必要な列だけではなく、全列を含むことがありました。

    本修正は問い合わせで生じる不要に大きい一時ファイルを小さくします。

  38. repalloc() がサイズを大幅に縮小したときには、システムにメモリ空間を返却するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  39. repalloc() は PostgreSQL のメモリマネージャモジュールが提供する標準ライブラリの realloc() に似た動作をする関数です。

  40. アーカイブリカバリの最後に、一時的な WAL とヒストリファイルが確実に削除されるようになりました。 (Sawada Masahiko) (12)(11)(10)(9.6)(9.5)
  41. これまで、アーカイブリカバリ後のオンラインWALディレクトリにRECOVERYHISTORYファイルが残る動作がありました。

  42. recovery_min_apply_delay設定が有効な場合のアーカイブリカバリでのエラーが回避されました。 (Fujii Masao) (12)(11)(10)(9.6)(9.5)(9.4)
  43. recovery_min_apply_delay はアーカイブリカバリの際の設定では通常使われませんが、動作すべきでした。これまでは設定すると常にアーカイブリカバリに失敗し、アサート有効のビルドではアサート失敗が生じました。

  44. クラッシュリカバリ時には、restore_command、recovery_end_command、recovery_min_apply_delay の設定が無視されるようになりました。 (Fujii Masao) (12)
  45. これらは バージョン12 から postgresql.conf に記述するようになったため、クラッシュリカバリ時にも有効になっていることが有り得ますが、このときこれら設定に従うことは望ましくありません。クラッシュリカバリが完了するまで、これらの設定は無視されるようになります。

  46. パブリッシャとサブスクライバがテーブルの REPLICA IDENTITY列について異なる認識を持っている場合のロジカルレプリケーションのエラーが修正されました。 (Jehan-Guillaume de Rorthais, Peter Eisentraut) (12)(11)(10)
  47. パブリッシャにその列が存在しないときに、サブスクライバで REPLICA IDENTITYの一部として列を宣言すると、下記のエラーをひき起こしました。

    ERROR:  negative bitmapset member not allowed
    
  48. ロジカルレプリケーションの walsenderプロセスの停止における不要な遅延が回避されました。 (Craig Ringer, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
  49. これまでは場合によっては wal_sender_timeout の時間だけ停止が滞留することがあり、PostgreSQLサービス停止を遅らせました。

  50. ロジカルレプリケーションの walreceiverプロセスでタイムアウト処理が修正されました。 (Julien Rouhaud) (12)(11)(10)
  51. 誤ったロジックがロジカルレプリケーションにおけるwal_receiver_timeout の働きを妨げていました。パブリッシャ側の walsender が終了したのにサブスクライバ側のlogical worker が待ち続けるという動作が報告されました。

  52. ロジカルデコーディングに対するレプリケーションメッセージに正しくタイムスタンプを付与するように修正されました。 (Jeff Janes) (12)(11)(10)(9.6)(9.5)(9.4)
  53. この誤りで、例えば pg_stat_subscription.last_msg_send_time がたいてい NULL になりました。

  54. バックエンドプロセスがそれまで同期レプリケーションが発生するのを待機していたとき、バックエンド終了時の競合状態が修正されました。 (Dongming Liu) (12)(11)(10)(9.6)(9.5)(9.4)
  55. この障害によりバックエンドプロセス終了が遅くなりました。

  56. PAM認証が使われているとき、接続中断についてログメッセージを出さないようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  57. libpqベースのクライアントは一般的に、最初の接続試行が失敗するまでユーザにパスワード入力を促さないため、パスワードが必要な場合には二回接続を試みます。それゆえ、サーバはクライアントがパスワードを要する接続を閉じたときに無駄なログメッセージを出さないように書かれています。しかしながら、PAM認証ではそのようになっておらず、余計な認証失敗メッセージを複数出力していました。

  58. bitshiftright() の誤動作が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  59. bitshiftright() はビット列データ型(bit、bit varying)の右シフト演算子の実装関数です。ビット列の長さが 8 の倍数ではないときに、結果の最終バイトにあるシフトされた桁のゼロ埋めに失敗していました。

    ほとんどの場合、異常になるのは不可視部分のデータです。しかし、ビット列比較では余分なビットも無視されず、常に 0 であると想定されるところに非ゼロビットが存在することで予期せぬ比較動作が生じます。

    ビット列の右シフト結果をテーブルに格納している場合、不整合データを以下のような SQL で補正できます。

    UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
    
  60. 文字列の position()関数(あるいは strpos()関数)の空の検索文字列に対する結果が修正されました。 (Tom Lane) (12)
  61. 歴史的に、また、SQL標準により、このような場合に結果は 1 であるべきですが、12.0 では 0 を返していました。

    (以下の応答は 1 が正しい)
    db=# SELECT strpos('ABCDE', '');
     strpos
    --------
          0
    (1 row)
    
  62. interval型の掛け算で境界値の整数オーバーフローの検出が修正されました。 (Yuya Watari) (12)(11)(10)(9.6)(9.5)(9.4)
  63. (オーバーフローが検出されない例)
    db1=# SELECT extract(epoch from '256 microseconds'::interval * (2^55)::float8);
         date_part
    --------------------
     -9223372036854.775
    (1 row)
    
    (修正後は以下エラーがでるようになります)
    ERROR: interval out of range
    
  64. ispell のテキスト検索辞書が誤った接辞データを含む場合にクラッシュすることがあり、回避されました。 (Arthur Zakirov) (12)(11)(10)(9.6)
  65. GiSTインデックスを VACUUMするときのメモリリークが回避されました。 (Dilip Kumar) (12)
  66. Windowsで、「Norwegian (Bokmål) 」ロケール名の追加の書き方も認識するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  67. 括弧を記載しない書き方も受け入れるようになりました。

  68. libpq が整数パラメータの文字列に末尾の空白を許容するように修正しました。 (Michael Paquier) (12)
  69. バージョン12で整数パラメータの検査が厳しくなっていましたが、末尾の空白まで許容しないのは望ましくないと判断されました。

  70. libpq で、構文的に無効な connect_timeoutパラメータ値によってひき起こされたエラーの後に CONNECTION_BAD接続状態を正しく報告するようになりました。 (Lars Kanis) (12)
  71. これまでは接続状態に CONNECTION_BAD がセットされませんでした。

  72. ENABLE_NLS が定義されていて、ECPGクライアントが ecpglib.h を含む場合のコンパイル失敗が回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  73. ecpg_gettext() の定義をクライアントコードから見えない適切な位置に移すことで修正されています。

  74. パーティションテーブルの外部キー制約について、パラレルリストアのスケジューリングが修正されました。 (Álvaro Herrera) (12)
  75. pg_dump がパーティションテーブルの外部キーについて完全な依存情報の出力に失敗していました。このため、pg_restore で早すぎるタイミングで外部キー制約を再作成しようとして、パラレルリストアが時々失敗することがありました。

  76. pg_dump で、似た名前のトリガと行単位セキュリティポリシーオブジェクトについて、安定した出力順序が保証されました。 (Benjie Gillam) (12)(11)(10)(9.6)(9.5)(9.4)
  77. これまでは、同じ名前を持ち異なるテーブルに付く二つのトリガは OID でソートされましたが、これからはテーブル名でソートされます。RLS(行単位セキュリティポリシー)についても同様です。

  78. PostgreSQL 12 から sql_identifier型の元となる型がvarchar型から name型に変更されため、pg_upgrade で sql_identifier型の列を持つテーブルが拒否されるようになりました。 (Tomas Vondra) (12)
  79. line型など表現が変更されたデータ型に対して、pg_upgrade のチェックが改善されました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
  80. 以前は、データ型がドメインや複合型の格納列が元となっている場合に誤判定をして、本来不要な pg_upgrade 失敗をひき起こしたり、pg_upgrade 実行後のクラスタを壊してしまったりすることがありました。

  81. --dry-runオプション付きの pg_rewind で pg_control の更新を避けるようになりました。 (Alexey Kondratov) (12)
  82. これは、それに続く pg_rewind の実行の失敗につながる可能性がありました。

  83. -sオプション付きの pg_waldump の不具合が修正されました。 (Andrey Lepikhov) (12)(11)(10)(9.6)(9.5)(9.4)
  84. 継続WALレコードがページの境界で丁度終わるような特別なケースの場合、-sオプションによりそのWALレコードを指定した際に正常にレコードを処理できずアサーションエラーが発生していました。

  85. --bkp-detailsオプション付きの pg_waldump でフルページライトを伴うWALレコードに対する余分な改行の出力を避けるようになりました。 (Andres Freund) (12)(11)(10)(9.6)(9.5)
  86. pg_waldump での小さなメモリリークが修正されました。 (Andres Freund) (12)(11)(10)(9.6)(9.5)
  87. pqsignal() がエクスポートされた libpq のシンボルとして復帰しました。 (Tom Lane) (12)
  88. この関数は、どのクライアントも使用しないであろうという理由で以前に削除されましたが、とても古いバージョンの psql(および、おそらく他のアプリケーション)と組み合わせて使用した際に正常に動作しなくなってしまいました。

  89. libperl の存在有無に対する configure のテストが修正され、最近の RedHat のリリースでも動作するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
  90. 以前では、ユーザがCFLAGSに -O0 を設定した場合に失敗する可能性がありました。

  91. PowerPC上におけるスピンロックの正しいコード生成が保証されました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)(9.4)
  92. 以前のスピンロックのコードでは、それが許容されないアセンブリ命令に対してレジスタ0 を選択できたため、ビルドの失敗を引き起こしてました。

    このバグに一致する報告は今までに 1回のみでしたが、修正された PostgreSQL のコードや変則的なコンパイラオプションによるビルドを実行した際に問題を起こす可能性がありました。

  93. AIX上で -qsrcmsgコンパイラオプションを使用しなくなりました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)(9.4)
  94. これにより xlc v16.1.0 での内部的なコンパイルエラーが避けられます。この変更は、コンパイラのエラーメッセージ形式が変わること以外ほとんど影響はありません。

  95. OpenSSL のファイルパス上に空白がある場合にも処理できるようにMSVC のビルド処理が修正されました。 (Andrew Dunstan) (12)(11)(10)(9.6)(9.5)(9.4)
  96. カスタムリレーションオプションを設定するALTER TABLE ... SET ... の不具合が修正されました。 (Michael Paquier) (11)(10)(9.6)
  97. bloom_index専用のオプションなど、特殊なオプションを ALTER TABLE で変更した場合に失敗することがありました。

    (報告されたエラー例)
    ERROR:  XX000: unrecognized lock mode: 2139062143
    
  98. すべての親テーブルが変更されていない限り、多重に継承された列の型の変更が許可されなくなりました。 (Tom Lane) (11)(10)(9.6)(9.5)
  99. 無関係な複数の親テーブルを継承した子テーブルがあって、継承した列が重複している場合、親テーブルでその列の型の変更するとエラーが返されるようになりました。以前は実行可能でしたが、そうすると、同期が取れなくなった親への問い合わせが失敗していました。

    (該当する操作の例)
    db=# CREATE TABLE pt53_1 (f1 int, f2 int);
    db=# CREATE TABLE pt53_2 (f1 int, f3 bigint);
    db=# CREATE TABLE ct53 (f4 int) INHERITS (pt53_1, pt53_2);
    NOTICE:  merging multiple inherited definitions of column "f1"
    db=# ALTER TABLE pt53_1 ALTER COLUMN f1 TYPE bigint;
    ERROR:  cannot alter inherited column "f1" of relation "ct53"
    

    いったん ALTER TABLE .. NO INHERIT .. で継承関係を外して、各テーブルでデータ型を変更して、ALTER TABLE .. INHERIT .. で再び継承関係を付与するという手順で同様の操作を行うことができます。

  100. トランザクション内の ANALYZEコマンドで同じテーブルが 2回指定された場合のエラーが回避されました。 (Tom Lane) (11)
  101. これまでは以下のようなエラーが生じていました。

    db=# CREATE TABLE t54 (id int);
    db=# INSERT INTO t54 VALUES (1), (2);
    db=# BEGIN;
    db=# ANALYZE t54,t54;
    ERROR:  duplicate key value violates unique constraint "pg_statistic_relid_att_inh_index"
    DETAIL:  Key (starelid, staattnum, stainherit)=(16391, 1, f) already exists.
    
  102. ICU照合を用いた ILIKE文で大文字小文字を区別できるようプランナーのテストが修正されました。 (Tom Lane) (11)(10)
  103. プランナは ICU照合が使われていた場合に、大文字小文字が区別できるかを適切に判定できていなかったため、多くのパターンで固定された接頭語として扱ってしまい、ILIKE句から派生したインデックススキャン時に見つけるべきエントリを見逃す可能性がありました。

    (誤動作例)
    db=# CREATE TABLE t55 (
           normal text UNIQUE, icu text COLLATE "de-x-icu" UNIQUE);
    db=# INSERT INTO t55 VALUES ('ABC', 'ABC');
    db=# SELECT * FROM t55 WHERE normal ILIKE 'abc';
     normal | icu 
    --------+-----
     ABC    | ABC
    (1 row)
    
    db1=# SELECT * FROM t55 WHERE icu ILIKE 'abc';
     normal | icu 
    --------+-----
    (0 rows)
    
  104. WITH CHECK OPTION式と行セキュリティポリシーの式における行全体の変数の扱いが修正されました。 (Andres Freund) (11)(10)(9.6)(9.5)(9.4)
  105. 以前は、行セキュリティポリシーが設定されていた場合に、行タイプの不一致に関する偽のエラーが生じる可能性がありました。

    (エラー発生例)
    db=> CREATE TABLE t56 (a int, b int, c int);
    db=> CREATE POLICY p56 ON t56 USING (t56 >= ROW(1,1,1));
    db=> ALTER TABLE t56 ENABLE ROW LEVEL SECURITY;
    db=> ALTER TABLE t56 FORCE ROW LEVEL SECURITY;
    db=> INSERT INTO t56 SELECT 10, 20, 30;
    db=> INSERT INTO t56 SELECT * FROM (SELECT b, c FROM t56 ORDER BY a) ss;
    ERROR:  table row type and query-specified row type do not match
    DETAIL:  Table row contains 2 attributes, but query expects 3.
    (3番目の値を NULL として INSERT に成功する動作が正しい)
    
  106. BEFORE UPDATEトリガが古いタプルをそのまま返し、それが最後のトリガではない場合のダブルフリーが防止されました。 (Thomas Munro) (11)(10)(9.6)(9.5)(9.4)
  107. 該当の場合にバックエンドプロセスがクラッシュする可能性がありました。

  108. x = ANY(配列)、もしくは同様の操作で、定数の NULL配列が含まれる場合のクラッシュが修正されました。 (Tom Lane) (11)
  109. 以下の形の SQL でクラッシュが報告されました。

    SELECT * FROM t58 WHERE x = ANY(NULL::bigint[]);
    
  110. SERIALIZABLEモードで、確実に正しい行バージョンで行レベルの述語ロックが取得されるように修正されました。 (Thomas Munro, Heikki Linnakangas) (11)(10)(9.6)(9.5)(9.4)
  111. 可視の行バージョンが HOT更新された場合、デッドタプルとなった以前のバージョンでロックが取得されるかもしれず、直列化の保証に微妙に失敗する可能性がありました。

  112. HOTによるヒープページ除去中の不要なカタログ参照が回避されました。 (Thomas Munro) (11)(10)
  113. このタイミングでログに記録されないインデックスの検査をする必要はありませんでした。この検査はいくつかのワークロードでかなりのパフォーマンスの問題を引き起こしていました。また、理論的にはデッドロックを引き起こす可能性もありました。

  114. ハッシュテーブルをグループ化するための JITコンパイルの等値比較の失敗が修正されました。これは性能低下をもたらしていました。 (Andres Freund) (11)
  115. ロジカルデコーディングで、スナップショットの再構築時にサブトランザクションが正しく考慮されるようになりました。 (Masahiko Sawada) (11)(10)(9.6)(9.5)(9.4)
  116. この誤りはアサート失敗をもたらします。アサートを無効にした本番ビルドに悪影響があるかどうかは不明です。

  117. ALTER SYSTEM で postgresql.auto.conf の重複エントリに対処するようになりました。 (Ian Barwick) (11)(10)(9.6)(9.5)(9.4)
  118. ALTER SYSTEM自体ではそのような状態は発生しませんが、postgresql.auto.conf を変更する外部ツールでは発生する可能性があります。対象パラメータの重複したエントリが削除され、新しい設定が (ある場合) 最後に追加されるようになります。

    これまでは ALTER SYSTEMコマンドは重複エントリに対して、実際に適用されるのは末尾エントリであるにもかかわらず、先頭のエントリだけを書き換えしていました。

  119. 設定ファイルで空のファイル名を持つ include ディレクティブを拒否し、再帰的なファイルのインクルードをより明確に報告するようになりました。 (Ian Barwick, Tom Lane) (11)(10)(9.6)(9.5)
  120. 以下にメッセージの違いを示します。

    (変更前: include = '')
    LOG:  input in flex scanner failed at file "/var/lib/pgsql/11/data" line 1
    FATAL:  configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors
    
    (変更前: include = '/var/lib/pgsql/11/data/postgresql.conf')
    LOG:  could not open configuration file "postgresql.conf": maximum nesting depth exceeded
    FATAL:  configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors
    
    (変更後: include = '')
    LOG:  empty configuration file name: ""
    FATAL:  configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors
    
    (変更後: include = '/var/lib/pgsql/11/data/postgresql.conf')
    LOG:  configuration file recursion in "/var/lib/pgsql/11/data/postgresql.conf"
    FATAL:  configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors
    
  121. time with time zone 入力で不完全な日付指定が検出されないいくつかのケースが修正されました。 (Alexander Lakhin) (11)(10)(9.6)(9.5)(9.4)
  122. 時期によって変化する UTCオフセットを持つ時間帯が指定されている場合、オフセットを解決できるように日付も必要です。使用される構文によっては、この検査が強制されず、誤った出力が生成される場合がありました。

    (誤動作の例)
    =# SELECT '12:53:57 m11'::timetz;
          timetz
    -------------------
     12:53:57+09:18:59
    (1 row)
    
    (エラーになるのが修正後の正しい動作です)
    ERROR:  invalid input syntax for type time with time zone: "12:53:57 m11"
    
  123. json[b]_populate_record() および json[b]_populate_recordset() のAS句から型情報を取得する機能が復元されました。 (Tom Lane) (11)
  124. レコード引数が NULL であり、複合型が宣言されていない場合は、代わりに AS句を使用してみてください。これは推奨される使用法ではありませんが、バージョン11 より前は機能しており、今では再び使用できます。AS句を使用するなら、json[b]_to_record() 関数を使用すべきです。

    (変更前)
    =# SELECT * FROM json_populate_record(null::record, '{"a":1,"b":2}')
         AS x(a int, b int);
    ERROR:  record type has not been registered
    
    (変更後)
    =# SELECT * FROM json_populate_record(null::record, '{"a":1,"b":2}')
         AS x(a int, b int);
     a | b
    ---+---
     1 | 2
    (1 row)
    
    (推奨される方法)
    =# SELECT * FROM json_to_record('{"a":1,"b":2}') AS x(a int, b int);
     a | b
    ---+---
     1 | 2
    (1 row)
    
  125. XMLTABLE で名前空間ノードを選択する際のクラッシュが修正されました。 (Chapman Flack) (11)(10)
  126. (クラッシュの再現例)
    =# SELECT * FROM xmltable('.' PASSING '<foo/>'
                              COLUMNS a text PATH 'foo/namespace::node()');
    server closed the connection unexpectedly
    
  127. ICU 照合を使用する場合の lower()、upper()、および initcap()関数のメモリリークが修正されました。 (Konstantin Knizhnik) (11)(10)
  128. GIN ポスティングリストの誤った圧縮ロジックが修正されました。 (Heikki Linnakangas) (11)(10)(9.6)(9.5)(9.4)
  129. GIN ポスティングリストの項目は、隣接するインデックス付き TID間の距離が16TB を超える場合、7 バイトを必要とします。ロジックの 1 つのステップがそれと同期していなかったため、6バイトのバッファに値を書き込もうとする可能性がありました。原則としてこれはスタックオーバーランを引き起こす可能性がありますが、ほとんどのアーキテクチャでは、次のバイトが未使用のアライメントパディングである可能性が高く、バグは無害です。いずれにせよバグに遭遇することは稀です。

  130. KNN-GiST の Infinity、NaN、および NULL 値の処理が修正されました。 (Alexander Korotkov) (11)(10)(9.6)(9.5)(9.4)
  131. NULL 以外の列値に対して計算された距離の一部が Infinity または NaN である場合、問い合わせの出力順序が誤っている(通常の並び替えの結果とは異なる)可能性があります。

    以下に順序が異常である例を示します。

    (変更前)
    =# SELECT * FROM point_tbl ORDER BY f1 <-> '0,1';
            f1
    -------------------
     (10,10)
     (NaN,NaN)
     (0,0)
     (1e-300,-1e-300)
     (-3,4)
     (-10,0)
     (-5,-12)
     (5.1,34.5)
    
     (1e+300,Infinity)
    (10 rows)
    
    (修正後)
    =# SELECT * FROM point_tbl ORDER BY f1 <-> '0,1';
            f1
    -------------------
     (0,0)
     (1e-300,-1e-300)
     (-3,4)
     (-10,0)
     (10,10)
     (-5,-12)
     (5.1,34.5)
     (1e+300,Infinity)
    
     (NaN,NaN)
    (10 rows)
    
  132. GiST および SP-GiST インデックスを使った KNN検索で、NULL の処理が修正されました。 (Nikita Glukhov) (11)(10)(9.6)(9.5)(9.4)
  133. NULL をインデックスのサポート関数まで廻さないようにして、クラッシュの可能性を回避します。

  134. psqlで、予期しない接続の切断と再接続の成功後に、サーバに関する内部状態を再同期するようになりました。 (Peter Billen, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  135. 通常は内部状態は変わらないため再同期は不要です。しかし、接続がいくつかのサーバの内の 1つにつながる場合など、稀なケースでは問題になる可能性がありました。

    この変更により、psql は、たとえば SSL が使用されているかどうかなど、起動時に発行される対話型メッセージを再発行します。

    (問題の再現例)
    $ psql
    psql (11.5)
    Type "help" for help.
    
    postgres=#
    
    (ここでPostgreSQL11サーバを停止して、PostgreSQL12サーバを起動する)
    
    postgres=# SELECT 1; 
    FATAL:  terminating connection due to administrator command
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Succeeded.
    
    postgres=# df
    ERROR:  column p.prokind does not exist
    LINE 5:  CASE p.prokind
                  ^
    HINT:  Perhaps you meant to reference the column "p.probin".
    
    (サーバが変わったことを認識していないためエラーが生じました)
    
  136. psql でプラットフォーム固有の NULL ポインタ参照が修正されました。 (Quentin Rameau) (11)(10)(9.6)(9.5)(9.4)
  137. 「psql -f」など、引数のあるオプションを引数無しで渡したときに、musl の libc ライブラリでクラッシュしました。

  138. pg_dump が 8.3 より前のサーバに対して再び動作するように修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  139. 以前の修正により、pg_dump は常に pg_opfamily を参照するようになりましたが、そのカタログはバージョン 8.3 より前には存在しませんでした。

  140. pg_restore で、「-f -」を標準出力への出力と解釈するようになりました。 (Álvaro Herrera) (11)(10)(9.6)(9.5)(9.4)
  141. これにより、pg_restore の動作が他のいくつかのアプリケーションと統一されます。特に、12 より前のバージョンは 12 の pg_restore と同様に動作し、複数の PostgreSQL バージョン間で動作するダンプ/リストアスクリプトの作成が簡単になります。この変更の前、pg_restore はそのようなオプションを - という名前のファイルへの出力を意味すると解釈していましたが、それを望む人はほとんどいませんでした。

  142. pg_basebackup中のファイル読み取りエラーを検出するようになりました。 (Jeevan Chalke) (11)(10)(9.6)(9.5)(9.4)
  143. これまではファイル読み取りエラーを、読み取り中のファイル内容削除と見做して、無視していました。今後はそれ以外のケースについてエラーを出すようになります。

  144. pg_basebackup で、バックアップが終了するまで出力ファイルをfsync しないようになりました。 (Michael Paquier) (11)(10)
  145. fsync が遅い場合、以前のコーディングではタイムアウトエラーが発生する可能性がありました。

  146. pg_rewind で起動中の同期元クラスタを使用した場合に、pg_dump と同様にタイムアウトを無効にするようになりました。 (Alexander Kukushkin) (11)(10)(9.6)(9.5)
  147. pg_waldump で、btree ページ分割レコードに newitemoff フィールドを含めるようになりました。 (Peter Geoghegan) (11)(10)(9.6)(9.5)
  148. vacuumdb で --jobs オプションに大きな値を使用した場合にファイル記述子の不足をより適切に処理するように修正されました。 (Michael Paquier) (11)(10)(9.6)(9.5)
  149. ジョブ数が多すぎるエラーを出すかどうかの判断を、より正確にファイル記述子の数を調べて行うように変更されました。

  150. PL/pgSQL で複合型の置換をより適切に処理するように修正されました。 (Tom Lane) (11)
  151. 複合型が完全に削除され、PL/pgSQL 関数の実行の間に同じ名前の新しい型が作成される場合が対象となります。複合型の変数は、新しい定義に一致するように更新されます。

  152. contrib/amcheck でホットスタンバイ中にログ取得なし(UNLOGGED)インデックスをスキップするように修正されました。 (Andrey Borodin, Peter Geoghegan) (11)(10)
  153. ログ取得なしインデックスには、この状況で有効なデータが含まれているとは限らないため、チェックしなくなりました。

  154. contrib/intarray の GiST 演算子クラスが修正され、空配列が <@ で失敗しないようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  155. array_column <@ constant_array のような句はインデックス可能と見なされますが、インデックス検索では空の配列値が見つからない場合があります。

    このための唯一の実用的なバックパッチ可能な修正では、<@ のインデックス検索でインデックス全体をスキャンする必要があります。つまり、単純なシーケンシャルスキャンよりも問い合わせの性能が低下する可能性が高いことを意味します。

    この変更によって性能に悪影響が及ぶアプリケーションには、いくつかの選択肢があります。このバグのない GIN インデックスに切り替えるか、array_column <@ constant_array をarray_column <@ constant_array AND array_column && constant_array に置き換えることができます。これにより、以前とほぼ同じ性能が得られ、指定された定数配列の空ではないすべてのサブセットが検索されます。

  156. PowerPC で、xlc コンパイラの __fetch_and_add() 関数に依存しないようになりました。 (Noah Misch) (11)(10)(9.6)(9.5)
  157. xlc 13 以降では、この関数を PostgreSQL での使用方法と互換性のない方法で解釈するため、使用できない PostgreSQL のビルドが発生しました。代わりにカスタムアセンブリコードを使用して修正されました。

  158. タイムゾーンデータファイルが tzdata release 2019c に更新されました。 (11)(10)(9.6)(9.5)(9.4)
  159. フィジーおよびノーフォーク島の夏時間法の変更に加えて、アルバータ、オーストリア、ベルギー、ブリティッシュコロンビア、カンボジア、香港、インディアナ(ペリー郡)、カリーニングラード、ケンタッキー、ミシガン、ノーフォーク島、韓国およびトルコの歴史的な修正が含まれます。

  160. pg_dump でビューの循環的な依存関係の処理が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  161. 場合によっては、ビューは、pg_dump がビューよりも後にダンプする必要があるオブジェクトに依存する場合があります。最も一般的な例は、主キー列で GROUP BY を使用する問い合わせが、主キーなしでは意味的に無効である可能性があることです。これは、ビューの列名と型を確定するだけのダミーの CREATE VIEW コマンドを発行し、その後、完全なビュー定義で CREATE OR REPLACE VIEW を発行することで処理されます。以前は、ダミー定義は実際には CREATE TABLE コマンドであり、これは後の CREATE RULE コマンドによって自動的にビューに変換されました。新しいアプローチは、PostgreSQL バージョン 10 以降で正常に使用されています。以前の方法ではビューのレプリカアイデンティティの状態に関して誤ったエラーメッセージが発生するという報告のため、古いリリースにパッチが適用されました。また、この変更により、このようなビューを含むリストア中に --clean オプションを使用しようとする際の問題も回避されます。

    (変更前のダンプ出力)
    $ pg_dump
    
    CREATE TABLE public.v (
        c1 integer,
        c2 text
    );
    
    COPY public.t (c1, c2) FROM stdin;
    .
    
    ALTER TABLE ONLY public.t
        ADD CONSTRAINT t_pkey PRIMARY KEY (c1);
    
    CREATE RULE "_RETURN" AS
        ON SELECT TO public.v DO INSTEAD  SELECT t.c1,
        t.c2
       FROM public.t
      GROUP BY t.c1;
    
    (変更後のダンプ出力)
    $ pg_dump
    
    CREATE VIEW public.v AS
    SELECT
        NULL::integer AS c1,
        NULL::text AS c2;
    
    COPY public.t (c1, c2) FROM stdin;
    .
    
    ALTER TABLE ONLY public.t
        ADD CONSTRAINT t_pkey PRIMARY KEY (c1);
    
    CREATE OR REPLACE VIEW public.v AS
     SELECT t.c1,
        t.c2
       FROM public.t
      GROUP BY t.c1;
    
  162. python3 または python2 しか見つからない場合に configure --with-python が成功するようになりました。 (Peter Eisentraut, Tom Lane) (9.6)(9.5)(9.4)
  163. python、python3、python2 の順番で検索し、configure が、単なる python という名前の実行ファイルが存在しないという、ごく一般的な状況で成功するようになりました。PYTHON 環境変数を設定することにより、この選択をオーバライドすることも可能です。

PostgreSQL 11.5、10.10、9.6.15、9.5.19、9.4.24 (2019年8月8日リリース)の変更点


  1. 関数風のキャスト構文を使うとき、一時データ型へのキャストではスキーマ修飾を必須とするようになりました。(CVE-2019-10208) (Noah Misch) (11)(10)(9.6)(9.5)(9.4)
  2. 一時関数の発効には長らく、pg_temp.func_name(args) という明示的な一時スキーマの指定が必要でした。これは、pg_temp.type_name(arg) と関数風の構文を使って一時データ型にキャストする場合も同様に必要です。そうでないと一時オブジェクトを使って関数呼び出しを横取りすることができて、8.2.4バージョンで防止された CVE-2007-2138 の脆弱性と同様の方法で、権限拡大を狙うことが可能でした。

    一時スキーマとは一時オブジェクトのためのスキーマです。pg_temp_1 など番号を伴う名前が自動付与されますが、指定する場合には pg_temp という名前で代表させることができます。また、search_path に明示的な pg_temp の指定が無いと一時スキーマは優先して選択されます。

    本修正後は、以下例の最初の型キャストは使用できず、型キャストのための処理に進む前にエラーになります(後者の 2つもエラーですが、これらは型キャスト処理が働いた結果のエラーです)。

    db=# CREATE DOMAIN pg_temp.nonempty AS text CHECK (VALUE <> '');
    
    db=# SELECT nonempty('');
    ERROR:  function nonempty(unknown) does not exist
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    
    db=# SELECT pg_temp.nonempty('');
    ERROR:  value for domain nonempty violates check constraint "nonempty_check"
    
    db=# SELECT ''::nonempty;
    ERROR:  value for domain nonempty violates check constraint "nonempty_check"
    
  3. 型を跨る比較を要するハッシュ化された副プランの実行が修正されました。(CVE-2019-10209) (Tom Lane, Andreas Seltenreich) (11)
  4. ハッシュ化された副プランは、ハッシュ要素を比較するために外側の問い合わせの元の比較演算子を使用していました。その演算子が型を跨る場合は、全てのハッシュ要素が副問い合わせの出力型になるので、これは誤りでした。PostgreSQL本体に含まれるハッシュ可能な型を跨る演算子に対して、64bitマシンでは、この誤りはほぼ無害です。しかし、32bitマシンでは、クラッシュやサーバメモリの不当なデータ露出になる可能性があります。

    以下の問い合わせは = 演算子が text型と副問い合わせからの name型(外側と異なるデータ型)との間で適用され、副問い合わせ結果が「hashed SubPlan 1」として扱われるので、問い合わせの形状としては本問題に該当します。

    explain (verbose)
      SELECT 'foo'::text IN (SELECT 'bar'::name UNION ALL SELECT 'bar'::name);
    

    拡張モジュールが、より大きなリスクをもたらすハッシュ可能な型を跨る演算子を提供しているかもしれません。

  5. 複数列の型を1つのコマンドで変更するとき、ALTER TABLE ... ALTER COLUMN TYPE が失敗する動作が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  6. これは一つ前のマイナーリリースで混入した障害です。変更された列のインデックスが適切に処理されていませんでした。

    インデックスを持つ列をいくつかデータ型変更する ALTER TABLE に対して、以下のエラーになる動作が報告されました。

    ERROR:  relation "《インデックス名》" already exists
    
  7. 子パーティションに保留中のトリガイベントがある場合には、パーティションテーブルのトリガを削除できないようになりました。 (Álvaro Herrera) (11)
  8. 特にトリガで実現されている外部キー制約で該当します。

    本修正前には、トランザクションのコミット時に処理すべきトリガが削除されてしまったことで COMMIT時にエラーが生じる可能性がありました。

    (例)
    db=# CREATE TABLE t4_1(f1 int primary key);
    db=# CREATE TABLE t4_2(f1 int REFERENCES t4_1 DEFERRABLE INITIALLY DEFERRED)
           PARTITION BY RANGE (f1);
    db=# CREATE TABLE t4_2_p1 PARTITION OF t4_2 FOR VALUES FROM (0) TO (10);
    db=# INSERT INTO t4_1 VALUES (1);
    db=# BEGIN;
    db=# INSERT INTO t4_2 VALUES (1);
    db=# ALTER TABLE t4_2 DROP CONSTRAINT t4_2_f1_fkey;
    (修正後はここで以下のようなエラーが生じる)
    ERROR:  cannot ALTER TABLE "t4_2" because it has pending trigger events
    db=# COMMIT;
    (修正前はここで以下のようなエラーが生じる)
    ERROR:  relation 16123 has no triggers
    
  9. パーティションテーブルから属するパーティションにトリガ定義をコピーする際に、ユーザ指定のトリガ引数が含まれるようになりました。 (Patrick McHardy) (11)
  10. 本修正前は「CREATE TRIGGER ... EXECUTE FUNCTION my_trigger_func('my params', 123);」などとして付与した引数が欠落してコピーされていました。

  11. パーティションのキー列の削除を防止する依存性が導入されました。 (Tom Lane) (11)(10)
  12. ALTER TABLE ... DROP COLUMN はパーティションキーである列の削除を拒絶します。しかしながら、間接的な削除(キー列のデータ型をカスケード削除する場合など)では、このようなチェックが働かず、キー列の削除を許していました。この結果、パーティションテーブルが壊れて、アクセスも削除もできなくなるおそれがありました。

    本修正は、キー列の削除を要するカスケード削除の際にはパーティションテーブル全体を削除するという要素を pg_depend に追加します。これはパーティションテーブルが作られるときに追加されます。したがって、バージョンアップ前に作られた既存パーティションテーブルでは、キー列のみ削除されてしまうリスクが残ります。

    この問題は組み込みのデータ型のパーティションキー列では発生しません。したがって、大部分のユーザには無害であると考えられます。

  13. パーティションテーブルとそのデフォルトパーティションの間で列番号が確実に正しく対応付けされるようにしました。 (Amit Langote) (11)
  14. デフォルトパーティションでのみ一部の列を削除してあるなど、列が1対1対応でない場合に誤動作することがありました。

    その後の有効なパーティションテーブルに対する操作(パーティション追加など)で、以下のようなエラーが生じる可能性がありました。

    ERROR:  attribute 4 of type t7_partition_1 has been dropped
    
  15. インデックスをパーティションテーブル全体に作成するときに、外部テーブルである所属パーティションを無視するようになりました。 (Álvaro Herrera) (11)
  16. これまではインデックスを作成しようとしたり、インデックスのあるパーティションテーブルに外部テーブルをアタッチするときに、以下のようなエラーが発生していました。

    ERROR: cannot create index on foreign table "t8_parted"
    

    これからは外部テーブルのパーティションについては単にインデックスが作られない動作になります。ただし、ユニークインデックスである場合には例えば以下のようなエラーになります。

    ERROR: cannot create unique index on partitioned table "t8_parted"
    
  17. より多くの場合にパーティションテーブルのデフォルトパーティションが検索時にスキャン対象から除外できるようになりました。 (Yuzuko Hosoya) (11)
  18. RANGEパーティションで boolean型の複数パーティションキー列があるときに検索でのパーティション除外に失敗する可能性があり、修正されました。 (David Rowley) (11)
  19. 対象のテーブルが継承親テーブルであるときには、GROUP BY列を最適化で消し去らないようになりました。 (David Rowley) (11)(10)(9.6)
  20. 通常、テーブルの主キー列が GROUP BY に含まれる場合は他のグループ化列を安全に除去することができます。主キー列でグループを特定できるからです。しかし、継承テーブルを読む場合には、親子テーブル間、子テーブル間をまたがるユニーク性は保証されないため、この最適化は使えません。

    以下の誤動作が報告されました。最後の SELECT は 2行が返るのが正しい動作です。実行プランで c1列がグループ化対象から外れてしまっていました。

    db1=# CREATE TABLE t11  (c0 INT PRIMARY KEY, c1 INT);
    db1=# CREATE TABLE t11c (c0 INT) INHERITS (t11);
    db1=# INSERT INTO t11  (c0, c1) VALUES (0, 0);
    db1=# INSERT INTO t11c (c0, c1) VALUES (0, 1);
    db1=# SELECT c0, c1 FROM t11 GROUP BY c0, c1;
     c0 | c1
    ----+----
      0 |  0
    (1 row)
    
  21. semi-join問い合わせに対する並列ハッシュの誤使用が回避されました。 (Thomas Munro) (11)
  22. この障害により、一部の EXISTS問い合わせからの結果行が重複し、誤った結果が返ります。

  23. GROUPING SETSを伴う一部の問い合わせに対して、不要なソート処理の使用が回避されました。 (Andrew Gierth, Richard Guo) (11)(10)(9.6)(9.5)
  24. 修正前も、処理が非効率にはなりますが、問い合わせ結果は正しいです。

  25. プランナがインデックス端点を調べるのに失敗する可能性があり、修正されました。 (Tom Lane) (11)
  26. PostgreSQLのプランナはインデックスを使って値の最大値、最小値を調べる動作をすることがあります。

    プランナが列の最小値や最大値を知るために最近に作られたインデックスを使うとき、最近に無効になった実際には端点値を含まないタプルを誤って選択してしまう可能性がありました。

    誤選択したタプルには NULL が入っているかもしれず、最悪の場合は、以下のエラーになります。

    ERROR: found unexpected null value in index ...
    

    本障害でよくある挙動は、誤った値が使われてプラン作成におけるデータ推測の品質が劣化することです。

  27. EvalPlanQual の再チェックにおいて、トリガの遷移テーブルにアクセスするのに失敗していたものが修正されました。 (Alex Aktsipetrov) (11)(10)
  28. 遷移テーブルを使った処理で以下のエラーが出るケースが報告されました。

    ERROR:  executor could not find named tuplestore "《NEW遷移テーブル》"
    

    EvalPlanQual処理は、READ COMMITTEDトランザクション隔離モードでの行の更新で使われる内部的な仕組みです。

  29. 外部キー制約を再構築するときの複数列の外部キーの誤った処理が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  30. 外部キーの全列が同じデータ型でない場合に、ALTER TABLEが外部キーの再検証が必要かどうかの判断を誤る可能性がありました。この判断の誤りは常に保守的な方向で、再検証が不要なものを必要と判断すると見られます。したがって、不要な処理による性能上のバグと言えます。

  31. 継承ツリーに対して拡張統計情報を作らないようになりました。 (Tomas Vondra) (11)(10)
  32. これにより、ANALYZE の際に以下のエラーが出るのを回避します。

    ERROR:  tuple already updated by self
    
  33. タプルロックを格上げする際の偽性のデッドロックエラーが回避されました。 (Oleksii Kliukin) (11)(10)(9.6)
  34. 複数のトランザクションがトランザクションT1 が行ロックを解放するのを待っていて、T1 がそのロックレベルを格上げするとき、T1終了時に待っているトランザクションの間で偽性の(実際にはデッドロックではない)デッドロックが報告されました。

    ここでのロックレベルの格上げとは、「SELECT ... FOR KEY SHARE」 の行ロックを取得している行に対して、次に「UPDATE ...」を行う場合などを指します。

  35. 複数のパラレルワーカプロセスに関わるデッドロック解決の失敗が修正されました。 (Rui Hai Jiang) (11)(10)(9.6)
  36. 本障害に該当した場合、デッドロック状態がデッドロックエラーにならず、問い合わせがキャンセルされるまで処理がブロックされてしまいます。

    本障害が人工的な問い合わせ以外で発生するのかは明らかではありません。通常パラレルワーカがリーダプロセスで取得済みのロック以外を必要とすることは無いため、実際には問題はほぼ起きないと考えられます。

  37. 端点に infinity や -infinity を持つ日付範囲の誤った標準化が防止されました。 (Laurenz Albe) (11)(10)(9.6)(9.5)(9.4)
  38. 範囲データ型は、ある値以上である値より小さいという半開区間になるように境界値を標準化させます。これを誤って無限値(infinity、-infinity)に対しても同様に試みていました。無限値の場合には干渉しないようになりました。

    修正前は以下のような奇妙な振る舞いが生じていました。

    db1=# SELECT '[-infinity,infinity]'::daterange @> '-infinity'::date "include?";
     include?
    ----------
     t
    (1 row)
    
    db1=# SELECT '[-infinity,infinity]'::daterange @> 'infinity'::date "include?";
     include?
    ----------
     f
    (1 row)
    
    db1=# SELECT '[-infinity,infinity]'::daterange;
          daterange
    ----------------------
     [-infinity,infinity)
    (1 row)
    
  39. 大きい money型の値を numeric型に変換するときの端数の損失が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  40. money型の最大値(あるいは負の最小値)に近い値で以下のように不正確な変換が生じる可能性がありました。

    db=# select '-92233720368547758.07'::money, '-92233720368547758.07'::money::numeric(30,2);
               money            |       numeric
    ----------------------------+----------------------
     $92,233,720,368,547,758.07 | 92233720368547758.00
    (1 row)
    
  41. BTREE_META_CLEANUP の WALレコードの表示が修正されました。 (Michael Paquier) (11)
  42. これは pg_waldump のクラッシュをひき起こしました。

  43. version-2 の Btreeメタページに対する誤った処理によるアサート失敗が防止されました。 (Peter Geoghegan) (11)
  44. 10以前のバージョンで作った Btreeインデックスがあって、それを pg_upgrade でバージョンアップした後のアクセスで問題が生じました。11 でも修正されていますが、実際にアサート失敗が起きるのは 12 の betaバージョンです。

  45. MIPS r6 で動作するように、MIPS CPUむけのスピンロックのアセンブラコードが修正されました。 (YunQiang Su) (11)(10)(9.6)(9.5)(9.4)
  46. PL/pgSQL関数から返されるレコードまたは ROW値が複合型として型付けされるようになりました。 (Tom Lane) (11)
  47. これによって結果がテーブルに直接格納された場合の問題が回避されます。これまでは以下の処理でエラーが発生していました。

    db=# CREATE TYPE two_int8s AS (q1 int8, q2 int8);
    db=# CREATE FUNCTION compresult(int8) RETURNS two_int8s LANGUAGE plpgsql AS
           $$ DECLARE r record; BEGIN r := ROW($1,$1); RETURN r; END $$;
    db=# CREATE TABLE two_int8s_tab (f1 two_int8s);
    db=# INSERT INTO two_int8s_tab VALUES (compresult(42));
    db=# SELECT f1 FROM two_int8s_tab;
       f1
    ---------
     (42,42)
    (1 row)
    
    (再接続後に実行)
    db=# SELECT f1 FROM two_int8s_tab;
    ERROR:  record type has not been registered
    
  48. libpqライブラリで接続サービスファイル内の復帰コード(
    )が無視されるようになりました。 (Tom Lane, Michael Paquier) (11)(10)(9.6)(9.5)(9.4)
  49. ごくまれな場合に、Windows形式の改行コードを含むサービスファイルが誤って解析され、接続エラーになっていました。

  50. psqlコマンドで、SET variable = の後について、variable が既知のパラメータ名でない場合にはタブ補完を行わないようになりました。 (Tom Lane) (11)(10)(9.6)
  51. psql の d コマンドの軽微なメモリリークが修正されました。 (Tom Lane) (11)(10)
  52. pg_dump コマンドが修正され、カスタム演算子クラスが正しい順序でダンプされるようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  53. ユーザ定義 opclass がユーザ定義範囲型のサブタイプ opclass である場合、関連するオブジェクトが誤った順序でダンプされ、リストアできないダンプが生成されていました。

    opclass の依存関係を処理する潜在的なエラーはほかのケースでも発生する可能性がありますが、これは唯一知られているケースです。

  54. -Rオプションの使用時に発生しうる pgbenchコマンドのハングアップが修正されました。 (Fabien Coelho) (11)(10)
  55. contrib/amcheck のインデックス検証の信頼性が改善されました。 (Peter Geoghegan) (11)
  56. contrib/jsonb_plperl で Perl の undef値の処理が修正されました。 (Ivan Panchenko) (11)
  57. NULL を Perl の undef値として扱わせて、それを jsonb に変換する場合に以下エラーが出るケースが報告されました。

    ERROR:  cannot transform this Perl type to jsonb
    
  58. contrib/passwordcheck が修正され、check_password_hook がほかのユーザと共存できるようになりました。 (Michael Paquier) (11)(10)(9.6)(9.5)(9.4)
  59. contrib/sepgsql のテストが修正され、最近の SELinuxリリースでも動作するようになりました。 (Mike Palmiotto) (11)(10)(9.6)(9.5)(9.4)
  60. src/test/kerberos および src/test/ldap のリグレッションテストの安定性が改善されました。 (Thomas Munro, Tom Lane) (11)
  61. src/test/recovery のリグレッションテストの安定性が改善されました。 (Michael Paquier) (11)(10)(9.6)
  62. pg_upgradeコマンドのテストスクリプトからの標準エラーへの出力が削減されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  63. pgbenchコマンドのリグレッションテストがWindows でも動作するように修正されました。 (Fabien Coelho) (11)
  64. ビルドディレクトリがルート以外の msysマウントポイントにある場合でも、TAP テストが msys の Perl で動作するように修正されました。 (Noah Misch) (11)(10)(9.6)
  65. Microsoft Visual Studio 2019 でのビルドに対応しました。 (Haribabu Kommi) (11)(10)(9.6)(9.5)(9.4)
  66. Visual Studioビルドでは、環境変数 WindowsSDKVersion が設定されている場合、それを優先するようになりました。 (Peifeng Qiu) (11)(10)(9.6)(9.5)(9.4)
  67. これにより、VS 2017 と SDK v10 の組み合わせでビルドする際にSDK v8.1 が無いとビルドに失敗する問題が回避されます。

  68. Visual Studio ビルドで OpenSSL 1.1.0 以降に対応しました。 (Juan José Santamaría Flecha, Michael Paquier) (11)(10)(9.6)(9.5)(9.4)
  69. GNU 以外の makeコマンドが最上位のディレクトリで呼び出されたときにmakeコマンドのオプションが gmakeコマンドに渡されるようになりました。 (Thomas Munro) (11)(10)(9.6)(9.5)
  70. initdbコマンドの実行中に TimeZoneパラメータとして localtime または posixrules が選択されないようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  71. 場合によっては initdbコマンドは実際のゾーン名より優先して、これらの人工的なゾーン名のいずれかを選択していました。

    これらの 2 つよりも C ライブラリのタイムゾーンの動作に一致するほうが優先されるようになります。

  72. pg_timezone_namesビューが調整され、短い省略形をもつ場合に限って Factoryタイムゾーンを表示するようなりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  73. 歴史的に IANA では、この人工的なゾーンに「Local time zone must be set--see zic manual page」のような省略形を設定します。tzdbデータベースの最新バージョンでは代わりに -00 が表示されますが、一部のプラットフォームでは何らか歴史的なフレーズを表示するためにデータを変更します。

    最新の省略形が使用される場合に限ってこのタイムゾーンを表示することで、非常に長い文字列が abbrev列に出力されるのが防止されました。

  74. タイムゾーンライブラリのコピーが IANA の tzcode release 2019b と同期されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  75. これによって zicコマンドに新しい -b slim オプションが追加され、インストールされたゾーンファイルのサイズを削減できます。現在は使用されていませんが、将来的には有効になる可能性があります。

  76. タイムゾーンデータファイルが tzdata release 2019b に更新されて、ブラジルでの夏時間規則の変更に加えて、香港、イタリア、およびパレスチナの歴史的な修正が適用されました。 (11)(10)(9.6)(9.5)(9.4)

PostgreSQL 11.4、10.9、9.6.14、9.5.18、9.4.23 (2019年6月20日リリース)の変更点


  1. SCRAM検証のパース処理におけるバッファオーバフロー障害が修正されました。 (Jonathan Katz, Heikki Linnakangas, Michael Paquier) (11)(10)
  2. 認証を受けるユーザは誰でも、パスワードを意図的に作りこんだ値に変更することで、スタックのバッファオーバフローを起こすことができました。さらに PostgreSQLサーバをクラッシュさせることもできました。これにより PostgreSQLを実行するOSユーザで任意コードを実行できる可能性がありました。

    類似のオーバフロー障害が libpq にもあり、これはよからぬサーバがクライアントをクラッシュさせたり、クライアント側OSユーザで任意コードを実行させたりできる可能性がありました。(CVE-2019-10164)

  3. 実行時パーティション除外のロジックで、いくつかの誤りが修正されました。 (Tom Lane, Amit Langote, David Rowley) (11)
  4. 除外に使われる比較値が(プリペアドステートメントのパラメータで)動的に決定される場合や、複数のレンジパーティション列が除外の判断に関わる場合、あるいは、STABLEな(IMMUTABLE でない)比較演算子が関わる場合に、本障害がパーティションテーブルに対する問い合わせに誤った結果をもたらすおそれがありました。

    (上記の内「複数レンジパーティション列が関与する」ときの障害動作例)
    db=# CREATE TABLE t2p (a int, b int, c int) PARTITION BY RANGE (a, abs(b), c);
    db=# CREATE TABLE t2p0 PARTITION OF t2p
           FOR VALUES FROM (0, 0, 0) to (0, maxvalue, maxvalue);
    db=# CREATE TABLE t2p1 PARTITION OF t2p
           FOR VALUES FROM (1, 1, 1) TO (2, minvalue, minvalue);
    db=# CREATE TABLE t2p2 PARTITION OF t2p
           FOR VALUES FROM (2, minvalue, minvalue) TO (3, maxvalue, maxvalue);
    db=# INSERT INTO t2p VALUES (0, 1, 1), (1, 1, 1), (2, 1, 1);
    
    (以下は 3行返るのが正しい)
    db=# SELECT * FROM t2p WHERE a < 3 AND abs(b) = 1;
     a | b | c
    ---+---+---
     1 | 1 | 1
    (1 row)
    
  5. 新たなパーティションにトリガ定義をコピーするときにクラッシュする可能性があり、修正されました。 (Tom Lane) (11)
  6. パーティションテーブルにトリガが定義されている状態で、属するパーティションを新たに追加したときにクラッシュする動作が報告されました。

  7. テーブルが部分的な排他制約を持つ場合に、ALTER TABLE ... ALTER COLUMN TYPE ... がエラーになる動作が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  8. (以下のエラー発生パターンが報告されました)
    db=# CREATE TABLE t4 (id int);
    db=# ALTER TABLE t4 ADD EXCLUDE USING btree (id WITH =) WHERE (id IS NOT NULL);
    db=# ALTER TABLE t4 ALTER COLUMN id TYPE bigint;
    ERROR:  relation "t4_id_excl" already exists
    

    発生するエラーは以下のようにバージョンによって様々です。「ERROR: could not open relation with OID 123456」「ERROR: cache lookup failed for relation 654321」「ERROR: relation "t4_id_excl" already exists」

  9. ドメインの制約に対するコメントでCOMMENTコマンドがエラーになる動作が修正されました。 (Daniel Gustafsson, Michael Paquier) (11)(10)(9.6)(9.5)
  10. 一般ユーザで実行時に以下のような奇妙なエラーが報告されました。

    db=> CREATE DOMAIN ddd AS text CONSTRAINT ccc CHECK (TRUE);
    db=> COMMENT ON CONSTRAINT ccc ON DOMAIN ddd IS 'test';
    ERROR:  type with OID 16413 does not exist
    
  11. ハッシュ集約のハッシュキーのリストに重複する列があるとき、不適切なメモリ上書きの可能性があり、防止されました。 (Andrew Gierth) (11)(10)
  12. 例えば、以下の形状の問い合わせで HashAggregate が生じた場合に該当する可能性があります。

    db=# CREATE TABLE t6a (v text);
    db=# CREATE TABLE t6b (v1 text, v2 text);
    db=# SELECT * FROM t6b WHERE (v1, v2) IN (SELECT v, v FROM t6a);
    
  13. ゼロ個または複数個の引数を伴う集約関数の部分集約における、引数の誤ったNULL検査が修正されました。 (David Rowley, Kyotaro Horiguchi, Andres Freund) (11)
  14. 部分集約(Partial Aggregate)は集約をパラレル実行するときに生じるプラン要素です。パラレル実行時に単一引数でない集約関数に不正な結果が返る動作が報告されました。

  15. Merge Appendプランの誤った生成が修正されました。 (Tom Lane) (11)(10)(9.6)
  16. 以下のエラーが発生する可能性があります。

    ERROR:  could not find pathkey item to sort
    

    SELECT DISTINCT ... FROM (SELECT ... UNION ALL SELECT ...) という形状の問い合わせで発生が報告されました。

  17. 重複する結合名を伴う問い合わせの誤った出力が修正されました。 (Philip Dubé) (11)(10)(9.6)(9.5)(9.4)
  18. この誤りで、このような問い合わせを含むビューのダンプ/リストア失敗が生じます。同様に psql の d+ コマンドでも誤った出力が生じます。

    以下例の「same」が重複する結合名で、このビューは正しくダンプされません。

    CREATE TABLE t9_1 (c1 int);
    CREATE TABLE t9_2 (c2 int);
    CREATE TABLE t9_3 (c3 int);
    CREATE TABLE t9_4 (c4 int);
    CREATE VIEW v9 AS
      SELECT * FROM (
        SELECT * FROM (t9_1 CROSS JOIN t9_2) same) ss,
          (t9_3 CROSS JOIN t9_4) same;
    
  19. json_to_record() と json_populate_record() で、JSON文字列リテラルからJSON型出力列への変換を修正しました。 (Tom Lane) (11)(10)
  20. エスケープを要する文字を含むリテラルで誤動作が生じていました。jsonb型むけ同様の関数では正しく動作していました。

    (エラーが発生する誤動作の例)
    db=# SELECT * FROM json_to_record('{"out": "{"key": 1}"}') as x(out json);
    ERROR:  invalid input syntax for type json
    
    (正しくは以下の出力)
          out       
    ----------------
     "{"key": 1}"
    (1 row)
    
  21. 正規表現で {1,1} 量指定子の誤った最適化が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  22. このような量指定子は何もしないものとして最適化で無きものとされていました。しかし、{1,1}? と最短マッチ指定が付いた場合には、この最適化は不適切です。誤動作は副式が取り込み括弧を含むか後方参照を含む場合のみ発生します。

    (誤動作例: 最初の取り込み括弧が最短マッチであることが反映されていない)
    db=# SELECT regexp_matches('AAbbbccc', '^(A*){1,1}?(.*)(c*)$');
     regexp_matches
    ----------------
     {AA,bbbccc,""}
    (1 row)
    
    (修正後の正しい応答)
      regexp_matches  
    ------------------
     {"",AAbbbccc,""}
    (1 row)
    
  23. ページ分割の際にINCLUDEされた列を処理して失敗するという稀な場合に、無効な空のBtreeインデックスページを書き出す動作が回避されました。 (Peter Geoghegan) (11)
  24. この無効なページは通常のインデックス操作では動作に影響ありませんが、後の VACUUM でエラーを起こす可能性があります。インデックス再構築(REINDEX)を行って復旧することができます。

  25. 新たなプロセスの pg_stat_activity むけデータを初期化する際に失敗することがあり、回避されました。 (Tom Lane) (11)(10)(9.6)(9.5)
  26. SSL証明書から取り出した文字列をデータベースエンコーディングに変換する等の場合に失敗する可能性がありました。これはクリティカルセクション内で実行されるため、共有の pg_stat_activityデータに対するアクセス手順を妨げ、データベース全体のハングアップをひき起こしました。

  27. 既存の共有メモリセグメントが別のpostmasterから未だ使用中かどうかを検査する際の競合状態が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  28. 実行タイミングによっては検査をすり抜けて他のpostmasterが使用中の共有メモリを削除してしまうことがあり得ました。

  29. walreceiverのシグナルハンドラにおける安全でないコーディングが修正されました。 (Tom Lane) (11)(10)
  30. これにより、walreceiverプロセスが終了シグナル(SIGTERM)を受けたときにクラッシュまたはデッドロックするという、稀に起こりうる問題を回避します。

  31. 特定データベースに接続していないプロセス(walsender等)がパラメータ検査のためにデータベースアクセスを試みる動作が回避されました。 (Vignesh C, Andres Freund) (11)(10)(9.6)(9.5)(9.4)
  32. この誤りは「FATAL: cannot read pg_class without having selected a database」のようなエラーをもたらしました。

  33. SSL を使っていて OpenSSL のデータバッファにちょうど 256×N バイトが含まれる場合の libpq でのハングアップが回避されました。 (David Binderman) (11)(10)(9.6)(9.5)
  34. initdb でシステムタイムゾーンに対する複数の等価な名前の扱いが改善されました。 (Tom Lane, Andrew Gierth) (11)(10)(9.6)(9.5)(9.4)
  35. initdb は /etc/localtime シンボリックリンクを調べて、シンボリックリンクが存在するなら、システムタイムゾーンに対して等価な名前の中から、それを選ぶようになりました。

    これにより initdb は同一タイムゾーンが複数存在する場合にユーザーが予期するタイムゾーン名を選択します。 /etc/localtime がゾーンデータファイルへのシンボリックリンクでない場合や、タイムゾーンが TZ環境変数から決定される場合の振る舞いは変更ありません。

    これとは別に、TZ も /etc/localtime もヒントとして提供されていない時、そのタイムゾーンの他のスペルよりも UTC を優先するようになりました。これにより tzdata 2019a によってもたらされた煩わしい変更を修正します。それは UCT と UTC のゾーン名を同等にするための変更で、initdb は UCT を好むようになりましたが、ほとんど誰も望んでいません。

  36. pg_dump と pg_dumpall によって発行されたデータベースとテーブルスペースに対するGRANTコマンドの順序が修正されました。 (Nathan Bossart, Michael Paquier) (11)(10)(9.6)
  37. カスケードしている GRANT が発行されている場合、それらの相互依存性に考慮しない順序で GRANTコマンドが並んでいるために、リストアが失敗する可能性がありました。

  38. pg_dump がテーブルパーティションを再作成する際、作成コマンドにCREATE TABLE ... PARTITION OF ... ではなく、CREATE TABLE の後に ALTER TABLE ... ATTACH PARTITION をするように変更されました。 (Álvaro Herrera, David Rowley) (11)(10)
  39. これによりパーティションの列の順序が親の列から変更されている可能性があるという問題を回避します。また、親テーブルがまだリストアされていなくても、パーティションは(スタンドアロンテーブルとして)ダンプからリストア可能となりました。 ATTACH は失敗しますが、それは無視することができます。

  40. reindexdb でのエラー時に誤解を招く余計なエラー報告が修正されました。 (Julien Rouhaud) (11)(10)(9.6)(9.5)(9.4)
  41. インデックスやスキーマを指定して実行して失敗した場合に、以下のようなデータベースに対する reindexdb に失敗したというメッセージが出力されることがありました。

    reindexdb: reindexing of database "db" failed: ....
    
  42. vaccumdb で並列ジョブ実行中にエラーが発生した場合、正しい終了ステータスを確実に返すようになりました。 (Julien Rouhaud) (11)(10)(9.6)(9.5)
  43. これまで、-j を付与して並列実行させている場合、エラーが起きていてもコマンドが正常終了(0)を返すことがありました。

  44. auto_explain でパラレルクエリの時に問題が発生しないように修正されました。 (Tom Lane) (11)(10)(9.6)
  45. 以前は、auto_explain で親のクエリがログに記録されていない場合であっても、パラレルワーカーが自分自身のクエリをログに記録しようとしていました。これは時々動作することもありますが紛らわしいですし、時には「ERROR: could not find key 3 in shm TOC at 0x7f45a0334000」のようなエラーを発生させる原因となっていました。

    また、サンプリングレートが 1.0 に設定されている場合ですら、必ずしもすべてのクエリーが記録されるとも限らないという、off-by-oneバグも修正されました。

  46. postgres_fdw で BEFORE ROW UPDATEトリガーによるデータ変更がある可能性を新たに考慮するようになりました。 (Shohei Mochizuki) (11)(10)(9.6)(9.5)(9.4)
  47. これまでは不必要なデータ転送を避けるために UPDATE処理で明示的に対象となったデータだけが転送対象でした。しかし外部テーブルに BEFORE ROW UPDATEトリガーが存在している場合、トリガーは対象となっていない列も変更する可能性があり、そのような場合はそれらの列の変更された値を送り損ねてしまいます。今回の変更で BEFORE ROW UPDATEトリガーが存在するときはすべての列を送信するようにします。

  48. Windows上でデータベースエンコーディングが SQL_ASCII に設定されている時にASCII 以外の文字列を記録する試みが失敗しないようになりました。 (Noah Misch) (11)(10)(9.6)(9.5)(9.4)
  49. これまでの実装では記録する文字列が必ず UTF-8 である前提となっていて、妥当なエンコードではないように見える時はエラーを投げていました。これからは変換していないバイト列を単純にログに送信します。

    該当の関数は pgwin32_message_to_UTF16() で、新しい挙動は pg_do_encoding_conversion() と整合性があります。

  50. PL/pgSQLのヘッダファイル等の変数名が C++の予約語と衝突しないように変更されました。 (George Tarasov) (11)(10)(9.6)(9.5)(9.4)
  51. これまで PL/pgSQL のヘッダファイルや Cソースファイルの変数名が(new、typeid、typemod など)C++の予約語と衝突していました。

PostgreSQL 11.3、10.8、9.6.13、9.5.17、9.4.22 (2019年5月9日リリース)の変更点


  1. 行単位セキュリティポリシーが、プランナの選択性見積り処理を通して、すり抜けされてしまうことがあり、防止されました。(CVE-2019-10130) (Dean Rasheed) (11)(10)(9.6)(9.5)
  2. 一部のプランナの選択性見積り処理ではプランナ統計情報(pg_statistic の 最頻値など)で見つかった値にユーザ定義演算子を適用します。そのため、実行したユーザにその列を参照する権限がなくとも、漏洩のある演算子が一部行の列データ値を露出させることができます。9.6.3、9.5.7、9.4.12、9.3.17、9.2.21 での CVE-2017-7484 セキュリティ障害の修正で同様の問題に対する対処が行われていましたが、行単位セキュリティについては対応されていませんでした。

    本修正により、漏洩のある(LEAKPROOF属性が真でない)演算子は関連する行単位セキュリティ(RLS)ポリシーが無い場合に限ってプランナ統計情報に適用が許されるようになります。

  3. パーティション振り分けのエラーを報告する際に解放済みメモリへのアクセスを回避するように修正されました。(CVE-2019-10129) (Michael Paquier) (11)
  4. この障害はクラッシュをひき起こします。また、原理的にはサーバメモリ内容を露出させる攻撃に利用できる可能性があります。なお、上記のパーティション振り分けのエラーとは以下の類です。

    db=# CREATE TABLE parted_tbl (id int, v text) PARTITION BY RANGE (id);
    db=# CREATE TABLE part1 PARTITION OF parted_tbl FOR VALUES FROM (1) TO (100);
    db=# INSERT INTO parted_tbl VALUES (105, 'XX');
    ERROR:  no partition of relation "parted_tbl" found for row
    DETAIL:  Partition key of the failing row contains (id) = (105).
    
  5. パーティションテーブルに対する ALTER TABLE がインデックス再利用可能と判断した場合にシステムテーブルのデータが破損することがあり、修正されました。 (Amit Langote, Tom Lane) (11)
  6. 例えば、ALTER TABLE .. ALTER COLUMN TYPE 実行時に物理テーブルの書き換えは不要と判断したケースで発生します。ALTER TABLE を行って定義情報の破損が生じたパーティションテーブルを、次に DROP したときにバックエンドプロセスがクラッシュ終了する動作が報告されました。

  7. 単文のトランザクションで ON COMMIT DROP と IDENTITY列を伴う一時テーブルが作られたときにシステムテーブルのデータが破損する障害があり、修正されました。 (Peter Eisentraut) (11)(10)
  8. 以下のような発生例が報告されました。

    (あるセッションで以下のように一時テーブルを作った後、)
    db=# CREATE TEMP TABLE t4 (c int GENERATED BY DEFAULT AS IDENTITY)
           ON COMMIT DROP;
    
    (別セッションで別の一時テーブルを作ろうとした際に不明なエラーが出る)
    db=# CREATE TEMPORARY TABLE t4_2 (d text);
    ERROR: could not open relation with OID 16345
    
  9. パーティションテーブルが属するパーティション(子テーブル)以上に削除された列を含む場合に、ALTER INDEX ... ATTACH PARTITION がエラーになる動作が修正されました。 (Álvaro Herrera) (11)
  10. これにより pg_upgrade を失敗させる可能性もあります。以下の予期せぬエラーが発生します。

    ERROR:  incorrect attribute map
    
  11. パーティションの既存インデックスを、新たに作成されたパーティションインデックス(親テーブルのインデックス)にアタッチするときのエラーが修正されました。 (Amit Langote, Álvaro Herrera) (11)
  12. この障害は、アタッチ後に実行する当該パーティションインデックスを使う DDL で以下のような予期せぬエラーを発生させます。

    ERROR:  index ... not found in partition ...
    
  13. パーティション化された問い合わせ結果に対して他セッションによる更新を反映させる処理で、バックエンドプロセスのクラッシュが回避されました。 (Amit Langote) (11)(10)
  14. これは、READ COMMITTED 隔離レベルを使用していて、他のセッションが問い合わせの対象行を同時並行に更新していた場合にEPQ(EvalPlanQual)の再チェック処理で発生します。

  15. 削除された属性を持つ複数階層のパーティションテーブルでの、行の振り分けが修正されました。 (Amit Langote, Michael Paquier) (11)
  16. パーティションテーブルに列削除が行われていた場合に INSERT 実行に対して、以下の予期せぬエラーが発生する場合がありました。

    ERROR: cannot extract attribute from empty tuple slot SQL state: XX000
    
  17. 外部キー制約の初期検査の slow-path処理がパーティションテーブルに適用されるときの失敗が修正されました。 (Hadi Moshayedi, Tom Lane, Andres Freund) (11)
  18. (権限の問題などで)fast-path処理が使えない場合という、一般的でない場合以外では、この問題は顕在化しません。fast-path、slow-path は検査処理実装の内部的な区別です。前者が使えない場合に後者が使われます。

    以下のようなエラー発生が報告されました。

    db=# CREATE ROLE test_role WITH LOGIN;
    db=# CREATE TABLE t9_ref(a int PRIMARY KEY);
    db=# GRANT REFERENCES ON t9_ref TO test_role;
    db=# SET ROLE test_role;
    db=> CREATE TABLE t9(a int, b int) PARTITION BY LIST (a);
    db=> ALTER TABLE t9 ADD CONSTRAINT t9_b_key
            FOREIGN KEY (b) REFERENCES t9_ref(a);
    ERROR:  could not open file "base/16432/49876": No such file or directory
    
  19. 継承ツリーやパーティションテーブルの全てのテーブルが除外されうるUPADTE や DELETE の振る舞いが修正されました。 (Amit Langote, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  20. このような場合、RETURNING句があっても問い合わせが正しい列セットを報告せず、文レベルトリガがあっても実行されませんでした。

    (障害動作例: WHERE false の場合の RETURNING句の応答は列が無く不正)
    db=# CREATE TABLE t10 (a int, b int);
    db=# CREATE TABLE t10c () inherits (t10);
    db=# INSERT INTO t10c VALUES (1,2);
    db=# UPDATE t10 SET a = a + 1 WHERE false RETURNING b, a;
    --
    (0 rows)
    UPDATE 0
    
    db1=# UPDATE t10 SET a = a + 1 WHERE true RETURNING b, a;
     b | a
    ---+---
     2 | 2
    (1 row)
    UPDATE 1
    
  21. constraint_exclusion = on でパーティションに直接アクセスするとき、除外のための CHECK制約と同様に各パーティションのパーティション制約を使用するようになりました。 (Amit Langote, Tom Lane) (11)
  22. この変更は 10.xバージョンの振る舞いに戻したことになります。

    db=# CREATE TABLE t11p (a int) PARTITION BY LIST (a);
    db=# CREATE TABLE t11c PARTITION OF t11p FOR VALUES IN (1);
    db=# SET constraint_exclusion TO on;
    db=# EXPLAIN SELECT * FROM t11c WHERE a = 2;
    (修正前の結果、範囲外の値でもテーブルスキャンが発生)
                         QUERY PLAN
    ----------------------------------------------------
     Seq Scan on t11c (cost=0.00..41.88 rows=13 width=4)
       Filter: (a = 2)
    (2 rows)
    
    (本来期待される結果)
                    QUERY PLAN
    ------------------------------------------
     Result  (cost=0.00..0.00 rows=0 width=4)
       One-Time Filter: false
    (2 rows)
    
  23. トランザクションコミットをまたがるようにカーソル問い合わせを永続化しようとしてエラーが生じたときのクラッシュが回避されました。 (Tom Lane) (11)
  24. プロシージャがオープンされた明示的あるいは暗黙的なカーソル(PL/pgSQLのFORループ問い合わせなど)を持つときにコミットしようとした場合、カーソルはコミット前に完全に実行され結果を保存して以降で利用可能にします。このような処理の中でエラーが生じた場合にバックエンドプロセスのクラッシュが起こっていました。

  25. ロジカルレプリケーションにおける FOR ALL TABLES指定のパブリケーションが存在するときに、一時テーブルとUNLOGGEDテーブルの更新に対する不正なエラー発行が修正されました。 (Peter Eisentraut) (11)(10)
  26. このようなテーブルはパブリケーション用には無視されるべきでしたが、一部コードでそうなっていませんでした。

  27. 更新可能ビューに複数行を挿入する INSERT ... VALUESコマンドでの明示的なデフォルト要素の処理が修正されました。 (Amit Langote, Dean Rasheed) (11)(10)(9.6)(9.5)(9.4)
  28. 以下例のように複数行を同時に挿入した場合、ビューにデフォルト値が無い列で元テーブルのデフォルト値ではなく NULL が使われてしまいます。

    (障害動作発生例: a=14 の行と a=15,16 の行で振る舞いが違う)
    db=# CREATE TABLE t14 (a int, b text default 'Table default',
                           c text default 'Table default', d text, e text);
    db=# CREATE VIEW v14 AS SELECT * FROM t14
    db=# ALTER VIEW v14 ALTER b SET DEFAULT 'View default';
    db=# ALTER VIEW v14 ALTER d SET DEFAULT 'View default';
    db=# INSERT INTO v14 VALUES (14, default, default, default, default);
    db=# INSERT INTO v14 VALUES (15, default, default, default, default),
                                (16, default, default, default, default);
    db=# SELECT * FROM t14;
     a  |      b       |       c       |      d       | e
    ----+--------------+---------------+--------------+---
     14 | View default | Table default | View default |
     15 | View default |               | View default |
     16 | View default |               | View default |
    (3 rows)
    
  29. CREATE VIEW がゼロ列ビューを作れるように修正されました。 (Ashutosh Sharma) (11)(10)(9.6)(9.5)(9.4)
  30. これによりゼロ列テーブルが作成可能であることと一貫性を持ち、テーブルをビューで置き換える際に失敗するケースを回避できます。

    db=# CREATE TABLE t15 (id int primary key, v text);
    db=# CREATE TABLE t15_0 ();
    db=# CREATE VIEW v15 AS SELECT FROM t15;
    db=# CREATE VIEW v15_0 AS SELECT * FROM t15_0;
    (修正前バージョンでは上記両CREATE VIEVで以下のエラーが出ました)
    ERROR:  view must have at least one column
    
  31. 欠けていた CREATE TABLE IF NOT EXISTS ... AS EXECUTE ... 構文が追加されました。 (Andreas Karlsson) (11)(10)(9.6)(9.5)
  32. AS の後に問い合わせにプリペアド文を実行する EXECUTE文を記述することは可能であるべきでしたが対応していませんでした。

  33. 行単位セキュリティポリシーの式に現れる副問い合わせが、確実に正しいユーザ権限で実行されるようになりました。 (Dean Rasheed) (11)(10)(9.6)(9.5)
  34. これまで、行単位セキュリティ(RLS)ポリシーを持つテーブルがビューを通してアクセスされる場合に、セキュリティ検査がビューを呼び出したユーザで行われ、ビュー所有者ユーザで行われませんでした。後者が本来の正しい動作です。

  35. SQL:2006 以降の要件に基づき、xmloption = content が設定されているとき、xml型の有効な値としてXMLドキュメントを受け入れるようになりました。 (Chapman Flack) (11)(10)(9.6)(9.5)(9.4)
  36. これまでは PostgreSQL は SQL:2003 の定義に従っていて、このような場合にはデータを受け入れませんでした。しかし、ダンプ/リストアで全ての有効なXMLデータを受け入れる xmloption の設定値が無いという重大な問題が問題が生じることから、SQL:2006 の定義に変更されました。

    加えて、確実にダンプ/リストアできるように pg_dump が SET xmloption = contentを出力するようになりました。

  37. サーバ起動時の既存共有メモリセグメントが未だ使われているかどうかの検査が改善されました。 (Noah Misch) (11)(10)(9.6)(9.5)(9.4)
  38. PostgreSQLのマスタプロセス(postmaster)は、たとえ postmaster.pid ファイルが削除されていても、以前の postmasterから生じた実行中プロセスが無いかを調べるようになりました。

    これにより PostgreSQL二重起動によるデータ破損を予防します。

  39. BtreeインデックスのVACUUM で、起こりうるゼロ除算が回避されました。 (Piotr Stefaniak, Alexander Korotkov) (11)
  40. これは vacuum_cleanup_index_scale_factor 設定値に基づいてインデックスのクリーンアップが必要かどうかについて不正確な判断をひき起こします。

  41. パラレルワーカのトランザクションを別々のトランザクションと数えないように修正されました。 (Haribabu Kommi) (11)(10)(9.6)
  42. パラレル問い合わせ実行があるときに、実行時統計情報のトランザクション数が本来より多く計数されていました。

  43. GINインデックスのWALレコードにおける非互換性が修正されました。 (Alexander Korotkov) (11)(10)(9.6)(9.5)(9.4)
  44. 前回のマイナーリリースには後方互換性に問題がありました。ストリーミングレプリケーション等で更に以前のマイナーバージョンが生成したWAL を適用する場合にロック処理の問題からハングアップする動作が報告されました。

    本修正で WALレコードを適用する際に、前マイナーリリースの修正があるWALレコードも、無いレコードも両方読めるように修正されました。

  45. レプリケーション接続で SHOWコマンドを実行する時に起こりうるwal senderプロセスのクラッシュが修正されました。 (Michael Paquier) (11)(10)
  46. ポータルから少しずつ行を取得するときのバックエンドプロセスのメモリリークが回避されました。 (Tom Lane) (11)
  47. 特に JDBCで問い合わせ結果を1行ずつ取得する場合に顕在化します。

  48. パーティションのリレーションキャッシュ項目が再作成されるときのメモリリークが回避されました。 (Amit Langote, Tom Lane) (11)(10)
  49. このメモリリークはセッション内で継続します。

  50. fsync や sync_file_range を呼ぶときに、適切な箇所において、INVAL および ENOSYS のエラーに寛容になりました。 (Thomas Munro, James Sewell) (11)(10)(9.6)(9.5)(9.4)
  51. ファイル同期に失敗が生じたなら PANIC とする前回リリースでの変更は、失敗が想定できて本質的に操作がサポートされないことによる場合については、過度に偏執的でした。

    例えば Windows Subsystem for Linux において sync_file_range がサポートされないために PANIC が起きていました。

  52. autovacuum の pg_stat_activity 表示で、BRIN の要約操作中に正しいリレーション名を報告するようになりました。 (Álvaro Herrera) (11)(10)
  53. 以前は誤ってデータベース名が報告されていました。

  54. GEQO が有効なときにパーティションの関する結合プランを作成しようとしたときのバックエンドプロセスのクラッシュが回避されました。 (Tom Lane) (11)
  55. プランナで FULL外部結合からのラテラル参照があるときに「ERROR: failed to build any N-way joins」エラーが発生していたものが修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  56. (エラー発生例)
    db=# SELECT * FROM (VALUES (1),(2)) v1(r1)
           LEFT JOIN LATERAL (
             SELECT * FROM generate_series(1, v1.r1) AS gs1
               LEFT JOIN LATERAL (
                 SELECT * FROM generate_series(1, gs1) AS gs2
                   LEFT JOIN generate_series(1, gs2) AS gs3 ON TRUE
               ) AS ss1 ON TRUE
               FULL JOIN generate_series(1, v1.r1) AS gs4 ON FALSE
           ) AS ss0 ON TRUE;
    ERROR:  failed to build any 3-way joins
    
  57. 複数行を返す関数を空と推定されるリレーションに適用する問い合わせに対する誤ったプラン作成が修正されました。 (Tom Lane, Julien Rouhaud) (11)(10)
  58. この障害により、10.x バージョンでは僅かに非効率なプランが生成されるだけですが、11.x バージョンでは「ERROR: set-valued function called in context that cannot accept a set 」エラーをひき起こす可能性があります。

  59. 漏洩のある演算子で pg_statistic のデータを参照させる際のルールを強制するときに、適切なユーザ権限を検査するようになりました。 (Dean Rasheed) (11)(10)(9.6)(9.5)(9.4)
  60. 元となるテーブルにビューを通してアクセスするとき、漏洩のある演算子をテーブルの統計データに適用して良いかの判断に、問い合わせを実行するユーザの権限ではなく、ビュー所有者の権限を考慮するようになりました。これにより、プランナのどのデータが可視かのルールをエグゼキュータのルールと一致させて、劣ったプランを回避します。

  61. グルーピングをする問い合わせでプランナの並列安全性の検査が修正されました。 (Etsuro Fujita) (11)
  62. これまでは、並列化されている可能性のある対象リストを評価する動作が無いかもしれませんでした。この問題によりプランの劣化が発生していました。

  63. プランナのユニークインデックスのロジックにおいて、INCLUDEで含められたインデックス列の誤った処理が修正されました。 (Tom Lane) (11)
  64. 本障害により、含められた列を持つユニークインデックスが問い合わせ結果の唯一性を保証することをプランナが認識しなくなる可能性があり、プランの劣化がもたらされました。

  65. 配列の型キャスト式に対する誤った STRICT の検査が修正されました。 (Tom Lane) (11)
  66. 以下例のように STRICT を指定した SQL関数に NULL を渡しても、応答が NULL にならない動作が発生していました。

    db=# CREATE TABLE t34 (c1 int);
    db=# INSERT INTO t34 VALUES (1), (NULL);
    db=# CREATE FUNCTION f34 (int) RETURNS int[] LANGUAGE sql AS 
         $$ SELECT array[0, $1]::bigint[]::int[] $$ STRICT;
    db=# SELECT f34(c1) FROM t34;
    (修正前の応答)
       f34
    ----------
     {0,1}
     {0,NULL}
    (2 rows)
    
    (正しい応答、2番目は NULL が返る)
      f34
    -------
     {0,1}
    
    (2 rows)
    
  67. 多数のイコール条件と多数の潜在的に関連のある外部キー制約があるときのプラン作成が高速化されました。 (David Rowley) (11)(10)(9.6)
  68. 多数のテーブルを作成したトランザクションをロールバックするときに、テーブル数に対して O(N^2)オーダで処理を要する性能問題が回避されました。 (Tomas Vondra) (11)(10)(9.6)(9.5)(9.4)
  69. 動的共有メモリの割り当てで、稀な場合におきるバックエンドプロセスのクラッシュが修正されました。 (Thomas Munro, Robert Haas) (11)(10)
  70. 動的共有メモリの管理での競合状態を修正しました。 (Thomas Munro) (11)(10)(9.6)(9.5)(9.4)
  71. これにより「ERROR: dsa_area could not attach to segment」や「ERROR: cannot unpin a segment that is not pinned」のエラーが生じる可能性がありました。

  72. ホットスタンバイのPostgreSQLマスタプロセス(postmaster)が、スマートシャットダウン要求を受け取った後でシャットダウンに失敗する可能性がある競合状態が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  73. pg_identify_object_as_address()に不正な入力が与えられたとき、クラッシュを起こす可能性があり、修正されました。 (Álvaro Herrera) (11)(10)(9.6)(9.5)
  74. pg_identify_object_as_address() はシステム情報を取得するSQL関数の一つです。

  75. txid_status() でトランザクション失敗の状態にアクセスできない可能性があり、修正されました。 (Thomas Munro) (11)(10)
  76. 以前は未来のトランザクションの状態を取得し続けると、最終的に以下のようなエラーが発生していました。

    =# SELECT txid_status(txid_current() + 1);
    ERROR:  could not access status of transaction 32768
    DETAIL:  Could not read from file "pg_xact/0000" at offset 8192: No error: 0.
    
  77. OpenSSLライブラリのバージョンが混在した状態でSCRAM認証を使用しようとしたときの認証失敗が修正されました。 (Michael Paquier, Peter Eisentraut) (11)
  78. サーバが OpenSSL 1.0.2 以降を使用しているときに libpq がOpenSSL 1.0.1 以前を使用していると、どの SASL機構を使用するかのネゴシエーションが失敗し、「ERROR: channel binding not supported by this build」という分かりにくいエラーメッセージが発生していました。

  79. 暗号化された SCRAM-SHA-256 および MD5 パスワードの検証が強化されました。 (Jonathan Katz) (11)(10)(9.6)(9.5)(9.4)
  80. 一致する先頭文字をもつパスワード文字列が SCRAM-SHA-256 または MD5形式に正しくハッシュ化されたものと間違われる可能性がありました。

    SCRAM-SHA-256形式では先頭が SCRAM-SHA-256$ であるかのみをチェックし、フィールドはチェックしておらず、MD5 形式では先頭が md5 であるかと長さのみをチェックし、16進数の文字であるかはチェックしていませんでした。パスワードは受け入れられますが、あとで使用できなくなります。

  81. データベースのエンコーディングとは異なるエンコーディングが指定されたlc_time設定の処理が修正されました。 (Juan José Santamaría Flecha, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  82. ASCII 以外の文字を含むローカライズされた月または日の名前は、以前は予期せぬエラーまたはそのロケールで誤った出力を発生させていました。

  83. サーバのデータディレクトリ内のほかのファイルと同じ権限でcurrent_logfilesファイルが作成されるようになりました。 (Haribabu Kommi) (11)
  84. 以前は log_file_mode で指定された権限を使用していましたが、バックアップユーティリティに問題を発生させる可能性がありました。

  85. 単項マイナス演算子を含む場合について、operator_precedence_warning設定に基づくチェックの誤動作が修正されました。 (Rikard Falkeborn) (11)(10)(9.6)(9.5)
  86. 以前は以下のような警告が発生していました。

    db=# SET operator_precedence_warning TO on;
    db=# SELECT -random() IS NULL;
    WARNING:  operator precedence change: IS is now lower precedence than -
    row 1: SELECT -random() IS NULL;
                           ^
     ?column?
    ----------
     f
    (1 row)
    
  87. 浮動小数点のサーバパラメータ値として「NaN」が拒否されるようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  88. =# SET random_page_cost TO 'NaN';
    ERROR:  parameter "random_page_cost" requires a numeric value
    
  89. pg_class の各インデックスを再作成するときにアサート失敗を回避するために、REINDEX処理を並び替えて行うようになりました。 (Andres Freund, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  90. パラメータ化されたダミーパスに対するプランナのアサート失敗が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  91. アサートを無効にしたビルドでは本障害によるユーザに見える影響はありません。

  92. SnapBuildInitialSnapshot() の結果に正しいテスト関数が挿入されるようになりました。 (Antonin Houska) (11)(10)(9.6)(9.5)(9.4)
  93. コアコードでは考慮する必要はありませんが、いくつかの拡張ではその必要があります。SnapBuildInitialSnapshot() は主としてロジカルレプリケーションのために使われる内部実装関数です。

  94. Windows で断続的に「could not reattach to shared memory (共有メモリに再接続できなかった)」としてセッションの起動に失敗する不具合が修正されました。 (Noah Misch) (11)(10)(9.6)(9.5)(9.4)
  95. これまで認識されていなかった不具合の原因は、プロセスのデフォルトスレッドプール用のスレッドスタックの作成です。そのようなスタックが異なるメモリ領域に割り当てられるようになりました。

  96. Windows上のディレクトリスキャンにおけるエラー検出が修正されました。 (Konstantin Knizhnik) (11)(10)(9.6)(9.5)(9.4)
  97. ディレクトリの読み取り権限がない、といったエラーが検出されないか正しく報告されず、そのかわりにディレクトリが空であるかのように静かに振る舞っていました。

  98. ecpg の文法問題を修正しました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  99. ecpg プログラムでセミコロンが欠けているとき(「SET variable TO DEFAULT」でなく)「SET variable = DEFAULT」の誤変換をひき起こし、サーバに拒否されるであろう誤った構文を出力しました。さらに、複数の型名を列挙した DROP TYPE または DROP DOMAIN コマンドは、実際には最初の型名だけが処理されていました。

  100. CREATE TABLE AS に対する ecpg の構文がサーバのものに同期されました。 (Daisuke Higuchi) (11)(10)(9.6)(9.5)
  101. ecpg のインクルードファイル名の処理によるバッファオーバーランの可能性があり、修正されました。 (Liu Huailing, Fei Wu) (11)(10)(9.6)(9.5)(9.4)
  102. ターゲットデータディレクトリ内の一時ファイルが削除できなかったためにpg_rewind が失敗していた不具合が修正されました。 (Michael Paquier) (11)
  103. 指定されたデータディレクトリが正しい PostgreSQLバージョンであることをpg_verify_checksums が確認するようになりました。 (Michael Paquier) (11)
  104. リモート側でグループ化または集約を使用しているクエリに無相関の副SELECT、外部参照、またはパラメータシンボルである SELECT の選択リスト項目があってもcontrib/postgres_fdw がクラッシュしなくなりました。 (Tom Lane) (11)(10)
  105. 振り分けられた行を挿入するために選択されたリモートパーティションが、同一コマンドで後で更新される UPDATEサブプランの対象である場合にエラーを報告するように contrib/postgres_fdw が変更されました。 (Amit Langote, Etsuro Fujita) (11)
  106. 以前は、このような状況が原因でサーバーがクラッシュしたり、UPDATE結果が不正確になったりしていました。

  107. contrib/pg_prewarm でプレウォームが何らかの理由で失敗してもバックグラウンドワーカプロセスが無制限に respawnしなくなりました。 (Mithun Cy) (11)
  108. lo_unlink()呼び出しが失敗した場合に contrib/vacuumlo がクラッシュしなくなりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  109. タイムゾーンライブラリのコピーが IANA tzcode release 2019a と同期されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  110. これによって Africa/Casablancaゾーンで 2440年の標準時とサマータイムの誤った遷移が出力されるという zic の小さな不具合が修正されます。また、zic に新しい -r オプションが追加されます。

  111. タイムゾーンデータファイルが tzdata release 2019a に更新されました。パレスチナとメトラカトラの夏時間法の変更とイスラエルの歴史的な修正が含まれます。 (11)(10)(9.6)(9.5)(9.4)
  112. Etc/UCT は Etc/UTC への後方互換性のあるリンクになりました。現在は一般的にタイプミスとされる略語の UCT を生成する別のゾーンではありません。PostgreSQL は依然としてゾーンの省略形として UCT の入力を受け入れますが、それを出力しません。

PostgreSQL 11.2、10.7、9.6.12、9.5.16、9.4.21 (2019年2月14日リリース)の変更点


  1. データ破損を回避するため、デフォルトでは fsync() に失敗したときにリトライするのではなく PANIC を出すようになりました。 (Craig Ringer, Thomas Munro) (11)(10)(9.6)(9.5)(9.4)
  2. fsync()は OS にバッファをストレージに確実に書き出しさせる命令です。PostgreSQL は PANIC になるとサービス全体が停止します。

    いくつかの人気の OS はカーネルデータバッファを書き出しできないときに、そのバッファを廃棄し、fsync() に失敗したものとして報告します。ここで PostgreSQL が fsync()要求を再発行して成功したとしても、実際にはデータは既に失われているので、データベース破損の危険性が残ります。代わりに PANIC状態にすることで、次に WALからのリカバリができます。WAL にはおそらく、ここにしか残っていないデータのコピーが含まれているでしょう。この振る舞いは確かに見苦しく非効率的ですが、あまり代替策がなく、また、幸いにもこのようなことは大変稀にしか起きません。

    本動作の制御のため、新たな設定パラメータ data_sync_retry が追加されました。PostgreSQL を動作させるプラットフォームのカーネルがこのようなときにダーティデータバッファを廃棄しないと確信できるなら、これを on に設定して、従来通りの振る舞いにすることができます。

  3. ドキュメントに全メジャーバージョン系列ではなく当該メジャーバージョン系列のリリースノートのみを含めるようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  4. ※本ページでは引き続き、各バージョン系列を統合した形でリリース情報を掲載します。

  5. パーティションテーブル上で INCLUDE列を含むユニークインデックスの処理が修正されました。 (Álvaro Herrera) (11)
  6. このような場合にユニーク条件が適切に検査されませんでした。

  7. パーティションテーブルの NOT NULL制約が各パーティション内で確実に効くようになりました。 (Álvaro Herrera, Amit Langote) (11)(10)
  8. 以下のように実行したときにパーティション(子テーブル)に NOT NULL 制約が付与されない動作がありました。

    db=# CREATE TABLE t4 (a int DEFAULT 1, b int NOT NULL DEFAULT 0)
           PARTITION BY LIST (a);
    db=# CREATE TABLE t4c1 PARTITION OF t4 (a NOT NULL, b DEFAULT 1)
           FOR VALUES IN (1);
    db=# INSERT INTO t4 (b) VALUES (NULL);
    (修正前はここで violates not-null constraint のエラーが出ない)
    
  9. パーティションをデタッチするとき、パーティションテーブルの制約に対して、カタログ状態を適切に更新するようになりました。 (Amit Langote, Álvaro Herrera) (11)
  10. これまでは、パーティションテーブルの制約に対するpg_constraint.conislocalフィールドが、不適切に 'f'(false)のままになって、制約が除去(DROP)不能になることがありました。

    本マイナーバージョンでは既におかしくなっているフィールドの値自体は補正されません。ダンプ/リストアや pg_upgrade でこの問題を解消できます。また、必要であれば、このカタログのフィールドを手動で補正することができます。デタッチ済みのパーティションに対する制約の本フィールドの値は 't'(true)です。

    (フィールド値を確認する SQL の例)
    db=# SELECT conname, conislocal FROM pg_constraint;
               conname            | conislocal
    ------------------------------+------------
     cardinal_number_domain_check | t
     yes_or_no_check              | t
     t1_pkey                      | t
         (後略)
    
  11. 外部キー制約を持つパーティションテーブルで、パーティションをアタッチ・デタッチするときに、外部キー制約のためのトリガを正しく作成・削除するようになりました。 (Amit Langote, Álvaro Herrera) (11)
  12. パーティションをデタッチした後に外部キー制約が正しく動作しないケースや、外部キー制約の除去(DROP)が出来なくなるケースが報告されました。

  13. パーティションテーブルで不要な重複した外部キー制約の生成が回避されました。 (Álvaro Herrera) (11)
  14. これまで、各パーティションに対する外部キー制約とパーティションテーブル全体に対する外部キー制約が同じであった場合、そのようなパーティションには重複して制約が付加されていました。

    これからは、このような場合でも一つの外部キー制約だけ作られるようになります。

  15. パーティションテーブルに対して ONLY を使ってインデックスが作られ、かつ、未だ属するパーティションが無い場合に、直ちにインデックスが有効であると印付けされるようになりました。 (Álvaro Herrera) (11)
  16. このような場合に INVALID になっていましたが、その後で INVALID を解除する(有効にする)手段がありませんでした。

    (これまで以下のように実行したとき、t8_id_idx が INVALID になっていました)
    db=# CREATE TABLE t8 (id int, v text) PARTITION BY RANGE (id);
    db=# CREATE UNIQUE INDEX t8_id_idx ON ONLY t8 (id);
    
    (上記の t8_id_idx は後に以下のようにすれば、無意味な使用法ではありません)
    db=# CREATE TABLE t8_1 PARTITION OF t8 FOR VALUES FROM (0) TO (1000) ;
    db=# CREATE UNIQUE INDEX t8_1_id_idx ON ONLY t8_1 (id);
    db=# ALTER INDEX t8_id_idx ATTACH PARTITION t8_1_id_idx;
    
  17. パーティションのデタッチ時に安全なテーブルロックレベルを使うようになりました。 (Álvaro Herrera) (11)(10)
  18. これまでのロックレベルは弱すぎで、同時のテーブルに対する DDL実行が可能で、悪い結果をもたらすかもしれませんでした。

    具体的には、パーティションに対するロックで、ACCESS SHARE であったロックレベルが SHARE UPDATE EXCLUSIVE に変更されました。また、特に 11.x 以降バージョンにおいて、インデックスに対するロックの保持期間がトランザクション終了までに延ばされました。

  19. 一時テーブルであるパーティションテーブルおよび継承を持つ親テーブルに ON COMMIT DROP と ON COMMIT DELETE ROWS を適用する際の問題が修正されました。 (Michael Paquier) (11)(10)
  20. トランザクションのコミット時に以下のエラーが発生するケースが報告されました。

    ERROR: XX000: could not open relation with OID 16420
    
  21. パーティションテーブルに対する COPY FREEZE が禁止されました。 (David Rowley) (11)(10)
  22. このような COPY は意図せぬエラーが発生し、エラーが生じない場合も正しく動作していませんでした。これからは以下のエラーが出るようになります。

    ERROR:  cannot perform FREEZE on a partitioned table
    
  23. インデックス列が高速デフォルトである時のインデックス破損が修正されました。 (Andres Freund) (11)
  24. 高速デフォルトとは、既にデータが格納されているテーブルに対してNULL 以外のデフォルト値を指定した ALTER TABLE ... ADD COLUMN により追加した列であることを指します。バージョン11 からこのような場合にも ALTER TABLE が高速に実行されるようになりました。

  25. 高速デフォルト値を持つテーブルに対するALTER TABLE ... ALTER COLUMN ... TYPE ... でクラッシュすることがあり、修正されました。 (Andrew Dunstan) (11)
  26. 「高速デフォルト」については前項を参照してください。

  27. 複数のバッファロックを取得するときにデッドロックの可能性があり、回避されました。 (Nishant Fnu) (11)(10)(9.6)(9.5)(9.4)
  28. GIN の VACUUM処理と同時のインデックス挿入との間でのデッドロックが回避されました。 (Alexander Korotkov, Andrey Borodin, Peter Geoghegan) (11)(10)
  29. この修正はバージョン10 で導入された性能改善を部分的に元に戻します。それは GIN のポスティングツリーのページを削除するときに、ロックされるインデックスページ数を減らそうとするものでした。

    なお、ここでのデッドロックは、デッドロック自動検出で ERROR を生じさせるものではなく、ハングアップを生じさせるものです。

  30. ホットスタンバイ問い合わせと GINインデックスのページ削除のリプレイとの間のデッドロックが回避されました。 (Alexander Korotkov) (11)(10)(9.6)(9.5)(9.4)
  31. ロジカルレプリケーションで対象テーブルに式インデックスや部分インデックスが使われている場合に、クラッシュする可能性があり、修正されました。 (Peter Eisentraut) (11)(10)(9.6)(9.5)(9.4)
  32. 修正前バージョン同士のレプリケーションでクラッシュが起きるのは、通常はパブリッシャ側です。

  33. VACUUM FULL や CLUSTER などによるテーブル書き換え中において、高負荷で無用な TOASTデータのロジカルデコーディングを回避するようになりました。 (Tomas Vondra) (11)(10)(9.6)(9.5)(9.4)
  34. 同期レプリケーションが有効なときに、一部の WAL sender プロセスを止めるロジックが修正されました。 (Paul Guo, Michael Paquier) (11)(10)(9.6)(9.5)(9.4)
  35. 潜在的に同期レプリケーションによる保証を毀損するおそれがありました。また、9.4.xバージョンではアサート失敗を起こす可能性もありました。

  36. タプルを削除する WALレコードで誤ったレプリカアイデンティ属性を書き込む可能性があり、回避されました。 (Stas Kelvich) (11)(10)(9.6)(9.5)(9.4)
  37. ビューや外部テーブルへの COPY のときに、WAL出力省略による最適化を誤って用いないように修正されました。 (Amit Langote, Michael Paquier) (11)(10)
  38. ここでのWAL出力省略による最適化とは以下のようなケースです。このときトランザクション内で作成するのがビューや外部テーブルであるなら、本来 WAL出力の省略はできません。

    BEGIN;
    CREATE TABLE t21 (id int, v text);
    COPY t21 FROM STDIN CSV;
    1,aaaaa
    2,bbbbb
    .
    COMMIT;
    
  39. アーカイバが次にアーカイブするファイルを選ぶときにWALデータファイルよりも WALヒストリファイルを優先するようになりました。 (David Steele) (11)(10)(9.6)(9.5)
  40. これによりタイムライン変更の追随をより早期に行えるようになります。

  41. SET句に副問い合わせを使った UPDATE文でクラッシュする可能性があり、修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)
  42. なお、明らかにクラッシュが生じるのはバージョン 9.6.x と 10.x のみです。以下のような SQL でクラッシュする例が報告されました。

    db=# CREATE TABLE t23_1 (a VARCHAR(1));
    db=# CREATE TABLE t23_2 (b VARCHAR(1));
    db=# INSERT INTO t23_1 VALUES ('A');
    db=# INSERT INTO t23_2 VALUES ('A');
    db=# UPDATE t23_1 SET (a) = (SELECT b FROM t23_2 WHERE t23_2.b = t23_1.a)
           WHERE 'X' NOT IN ('Y', 'Z');
    
  43. json_populate_recordset()、json_to_recordset()関数、および、これらの jsonb型版の関数に0行を与えたときのクラッシュが修正されました。 (Tom Lane) (11)
  44. (クラッシュをひき起こす実行例)
    db=# CREATE TYPE typ24 AS (id int);
    db=# SELECT * FROM json_populate_recordset(NULL::typ24,'[]');
    
  45. libxml2 ライブラリが null のエラーメッセージを返してきたときにバックエンドプロセスがクラッシュするのが回避されました。 (Sergio Conde Gómez) (11)(10)(9.6)(9.5)(9.4)
  46. 多数の列(およそ 800 以上)を持つテーブルに対する誤った JIT のタプルデフォーミングが修正されました。 (Andres Freund) (11)
  47. SQL実行時のバックエンドプロセスのクラッシュが報告されました。

  48. ハッシュによるグルーピングで性能と余分なメモリ使用の問題がいくつか修正されました。 (Andres Freund) (11)
  49. 照合順序の割り当ての誤動作により、不要なグルーピング関係のパーサエラーが生じていたものが修正されました。 (Andrew Gierth) (11)(10)(9.6)(9.5)(9.4)
  50. 一部のケースでは、照合順序が適用されるデータ型での処理があるときに、マッチすべき式がマッチしませんでした。すなわち、誤った問い合わせ結果が返る可能性があります。

    CASE式とグループ化(GROUP BY)を使った問い合わせで障害が報告されました。

  51. CALL文の引数で照合順序の影響をうける式のパースが修正されました。 (Peter Eisentraut) (11)
  52. 例えば以下のような CALL文は 'a' と 'b' が当該ロケールでどちらが先になるかということの影響を受けます。修正前はこのような場合にロケールに基づく照合順序が反映されませんでした。

    db=# CALL proc29(least('a', 'b'), 'c');
    
  53. CALL文の引数リストでエラーを発見した後に適切なクリーンアップ処理が確実に行われるようになりました。 (Tom Lane) (11)
  54. 引数に関するエラーが出る CALL文を繰り返し実行したときに、2回目以降に不適切なエラーメッセージが出る動作が報告されました。

  55. LEAST() または GREATEST() の元となっている Btree の比較関数が LEAKPROOF であるかを検査するようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  56. これまで検査していませんでした。実際の Btree 比較関数からの情報漏れを起こすのは一般に困難ですが、原理的には起こりえます。

  57. Gatherプランノードの上と下の両方に入れ子ループを伴う問い合わせについて、誤ったプラン作成が修正されました。 (Tom Lane) (11)(10)(9.6)
  58. 誤った問い合わせ結果が返る動作が報告されました。

    両階層の入れ子ループが同じ変数を各々のプランナツリー構造上の右手側に渡す必要がある場合、誤ったプランが生成されると考えられます。

  59. 外部テーブルのスキャン時にラテラル参照が評価されなければならないという問い合わせの、誤ったプラン作成が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  60. LATERAL句による副問い合わせを伴う外部テーブルに対する SELECT文で以下のようなエラーが出るケースが報告されました。

    ERROR:  attribute number 2 exceeds number of columns 1
    
  61. 行比較の最初の列がインデックス列と一致して、しかし続く列は一致せず、また、インデックスが INCLUDE列を持っているときに、プランナがエラーになるのを修正しました。 (Tom Lane) (11)
  62. 以下のようなエラーが発生します。

    db=# CREATE TABLE t34 (c1 int, c2 int, c3 int, c4 int,
           CONSTRAINT covering PRIMARY KEY (c1, c2) INCLUDE (c3, c4));
    db=# SELECT * FROM t34 WHERE (c1, c2, c3) < (1, 2, 3);
    ERROR:  operator 97 is not a member of opfamily 8
    
  63. 稀な場合のマージ結合コストの過小見積を修正しました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  64. 外側のキー範囲が内側のキー範囲よりもとても小さいときに、たとえ内側に重複キーが大量にあって不適切な選択であるとしても、プランナがマージ結合を好んでいた可能性があります。

  65. 問い合わせが何千ものインデックス利用可能な項を含むときの O(N^2) でのプラン作成時間の増大が回避されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  66. 属するテーブルが多い大規模な継承あるいはパーティショニングテーブルに対して、プラン作成速度が改善されました。 (Amit Langote, Etsuro Fujita) (11)
  67. 1000パーティションのパーティションテーブルで 11.1バージョンのプラン作成時間が10.x や 11.0 と比べて 1000倍以上になる動作が報告されました。

  68. ANALYZE の同時更新された行の処理が改善されました。 (Jeff Janes, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  69. これまで、実行中のトランザクションで削除された行を ANALYZE の統計情報採取では無視していましたが、これを含めるのと比べてより大きな不整合をもたらすことがわかりました。これからは事実上、ANALYZE開始時の MVCCスナップショットに一致するようになりました。

  70. TRUNCATE が他セッションの一時テーブルである継承子テーブルを無視するようになりました。 (Amit Langote, Michael Paquier) (11)(10)(9.6)(9.5)(9.4)
  71. これは TRUNCATE を他のコマンドの振る舞いに合わせます。これまでは、このような場合にたいていエラーになっていました。

    以下の動作が発生します。

    db=# CREATE TABLE t39 (id int);
    
        (別セッションで)
        db=# CREATE TEMP TABLE t39c (LIKE t39) INHERITS (t39);
    
    db=# TRUNCATE t39;
    ERROR:  cannot truncate temporary tables of other sessions
    
  72. 正しいテーブルに対する実行時統計情報のカウンタを更新するように TRUNCATE が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)
  73. TRUNCATEするテーブルが TOASTテーブルを持っている場合、TOASTテーブルのカウンタが代わりにリセットされていました。

  74. ALTER TABLE .. ONLY ADD COLUMN .. IF NOT EXISTS が正しく動作するように修正されました。 (Greg Stark) (11)(10)(9.6)
  75. 「ONLY」を付けると「IF NOT EXISTS」指定が効きませんでした。

    db=# CREATE TABLE t41 (c1 int);
    db=# ALTER TABLE ONLY t41 ADD COLUMN IF NOT EXISTS c1 int;
    ERROR:  column "c1" of relation "t41" already exists
    (IF NOT EXISTS 指定が効かない)
    
    db=# ALTER TABLE t41 ADD COLUMN IF NOT EXISTS c1 int;
    NOTICE:  column "c1" of relation "t41" already exists, skipping
    ALTER TABLE
    (ONLY が無ければ機能する)
    
  76. ホットスタンバイで UNLISTEN が可能になりました。 (Shay Rojansky) (11)(10)(9.6)(9.5)(9.4)
  77. ホットスタンバイで LISTEN はできないので、これは必然的に何もしません。しかしながらダミー操作を可能にすることで、クライアントでのセッション状態のリセットを簡単にします。

  78. 一部のスキーマとデータ型のアクセス制御リストでのロールの依存性の欠落が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  79. 一部の場合に許可を与えられたロールを落としてしまうことがあり得ました。これが直ちに問題をひき起こすことはありませんが、後のダンプ/リストアや pg_upgrade実行で失敗します。症状としては、全てが数字のロール名に権限を付与しようとします。

    以下は pg_upgrade の中で pg_restore を実行したときのエラー発生例です。

    pg_restore: [archiver (db)] could not execute query: ERROR: role "33757" does not exist
    Command was: GRANT ALL ON SCHEMA "regress_rls_schema" TO "33757";
    
  80. 二相トランザクション内でセッションの一時スキーマの使用が防止されました。 (Michael Paquier) (11)(10)
  81. 二相トランザクション内で一時テーブルにアクセスすることは、長らく禁止されていましたが、一時オブジェクトに対する他の操作で問題が起きる可能性がまだありました。

  82. 外部キー制約を追加または削除した後、確実にリレーションキャッシュが適切に更新されるようになりました。 (Álvaro Herrera) (11)(10)(9.6)
  83. この見落としにより、既存セッションにおいて新たに作られた制約が効かなかったり、削除された制約が継続して効いていたりする可能性がありました。

  84. 制約の名前変更の後、適切にリレーションキャッシュが適切に更新されるようになりました。 (Amit Langote) (11)(10)(9.6)(9.5)(9.4)
  85. ALTER TABLE ... RENAME CONSTRAINT ... TO ... を実行した後に、続いてそのテーブルに関連する DDL を実行したときに、変更する前の名前の制約が存在しないという以下のようなエラーが出る動作が報告されました。

    ERROR:  constraint "const_aaa" for table "t46" does not exist
    
  86. 同時実行のホットスタンバイ問い合わせに不整合状態を参照されないように、GiSTインデックスのマイクロVACUUM操作のリプレイが修正されました。 (Alexander Korotkov) (11)(10)(9.6)
  87. 空の GINインデックスページの早過ぎる回収を防止しました。これは同時実行の検索で失敗をひき起こしていました。 (Andrey Borodin, Alexander Korotkov) (11)(10)(9.6)(9.5)(9.4)
  88. 本障害によりハングアップが生じるケースが報告されました。

  89. 浮動小数点から整数への型変換での限界値の障害が修正されました。 (Andrew Gierth, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  90. 最大の有効な整数値を僅かに上回る値は拒絶されないおそれがありました。それで、オーバーフローして、替わりに最小の有効な整数が生じました。また、最小あるいは最大の整数値に丸めるべき値が誤って拒絶されるかもしれませんでした。

    (障害動作例)
    db=# SELECT '32767.4'::float8::int2;
    ERROR:  smallint out of range
     → 32767 となるべき
    
    db=# SELECT '9223372036854775807'::float8::int8;
             int8
    ----------------------
     -9223372036854775808
    (1 row)
     → 「ERROR:  bigint out of range」を出すべき
    
  91. pg_hba.conf の LDAP認証の ldapserverパラメータにおける、ホスト名のスペース区切りリストのパースが修正されました。 (Thomas Munro) (11)
  92. 以下のエラーになって、複数ホストの指定が動作しないことが報告されました。

    LOG:  could not initialize LDAP: Bad parameter to an ldap routine
    
  93. PAM認証要求を構成するときに、接続が Unixソケット経由の場合には、PAM_RHOST変数を設定しないようになりました。 (Thomas Munro) (11)(10)(9.6)
  94. これまでは、この変数に「[local]」を設定していましたが、これはホスト名であるはずなので全く役に立ちませんでした。「[local]」の文字列で DNS検索が発生して認証によけいな遅延が生じました。

  95. client_min_messages に ERROR より高レベルを設定することが禁止されました。 (Jonah Harris, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  96. これまでは FATAL や PANIC を設定して、通常のエラーメッセージをクライアントに送らないようにすることができました。しかしながら、これは PostgreSQLプロトコル仕様で提示される保証事項に反し、一部のクライアントを大変に混乱させます。

    リリース済みのバージョン系列においては、FATAL、PANIC の設定は ERROR と解釈されます。バージョン 12.x 以降においては、これら設定は拒絶されます。

  97. ecpglib が setlocale() よりも優先して uselocale() や _configthreadlocale()を使うように修正しました。 (Michael Meskes, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  98. setlocale() がスレッドローカルでなく、おそらくスレッドセーフでもないため、以前のコードはマルチスレッド化された ecpgアプリケーションで問題を起こしました。

  99. ecpg の SQLDA(SQL Descriptor Area)を通して渡された数値データに対する誤った結果を修正しました。 (Daisuke Higuchi) (11)(10)(9.6)(9.5)(9.4)
  100. ゼロから始まる値が正しくコピーされませんでした。

  101. psql の、書き出し先を指定した g メタコマンドが COPY TO STDOUT で動作するように修正されました。 (Daniel Vérité) (11)(10)(9.6)(9.5)
  102. これまでは g は COPYコマンドを実行できましたが、g の書き出し先オプションは何であれ無視されていて、データはいつでも通常の問い合わせの出力先に出されていました。

  103. psql の LaTeX出力形式が特殊文字を適切に処理できるようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  104. バックスラッシュやその他の ASCII記号文字が正しく処理されず、ドキュメントの構文エラーや誤った文字の出力をもたらしていました。

  105. pgbench の乱数生成が --random-seed=N が指定された場合には完全に決定的でプラットフォーム独立になりました。 (Fabien Coelho, Tom Lane) (11)
  106. プラットフォームによっては標準ライブラリの srandom()/random() が非決定的な乱数を返すことがあるため、PostgreSQL自身で実装した乱数生成関数を用いるようになりました。

  107. 一時ファイルを適切に無視するように pg_basebackup と pg_verify_checksums が修正されました。 (Michael Banck, Michael Paquier) (11)
  108. pg_dump の間接的に主キーに依存するマテリアライズドビューの処理が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  109. 本障害はこのようなビューに対して紛らわしいダンプアーカイブエントリをもたらし、アーカイブ項目が正しいセクション順序に無いという無害な警告をひき起こしました。「--section」など、このラベルに依存している選択的なリストアのオプションでは、無害でもなくて、誤動作するかもしれません。

    以下の WARNING が発生します。

    pg_dump: [archiver] WARNING: archive items not in correct section order
    
  110. pg_dump が ALTER INDEX .. SET STATISTICS .. コマンドを含むようになりました。 (Michael Paquier) (11)
  111. インデックス式に統計情報ターゲット数を付与できるようになったときに、pg_dump についても対応すべきところ、取りこぼされていて、ダンプ/リストアで設定が失われていました。

  112. pg_dump の OID を持ったテーブルのダンプが修正されました。 (Peter Eisentraut) (11)
  113. 最初のテーブルに対して、必要な場合でも WITH OIDS句が取りこぼされていました。

  114. pg_dump や pg_restore がエラー報告しようとするときの、一部プラットフォームでの NULLポインタ参照によるクラッシュが回避されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  115. contrib/amcheck からのインライン圧縮データによる偽性のインデックス破損報告が防止されました。 (Peter Geoghegan) (11)
  116. COPY FROM PROGRAM がプログラム出力の読み込みを早期に止めるときに、SIGPIPEエラーを適切に無視するようになりました。 (Tom Lane) (11)(10)
  117. このケースは実際のところ直接の COPY では到達可能でありませんが、contrib/file_fdw を使うときには発生する可能性があります。

  118. バージョン8.4 以前で作られた空の hstore値に対するハッシュ値を正しく計算するように contrib/hstore が修正されました。 (Andrew Gierth) (11)(10)(9.6)(9.5)(9.4)
  119. これまでの実装では新たなバージョンで作られた空の hstore値に対して同じ結果を返しませんでした。そのため、ハッシュ結合やハッシュ集約で誤った結果がもたらされる可能性がありました。テーブルに8.4以前に当初格納されたデータが含まれていて、これまでダンプ/リストアをしていない場合、hstore型の列に対するハッシュインデックスを全て再作成することが推奨されます。

  120. contrib/intarray の gist__int_opsインデックスクラスに大きな入力を与えた場合の、クラッシュと過大な実行時間が回避されました。 (Andrew Gierth) (11)(10)(9.6)(9.5)(9.4)
  121. intarray拡張を使って整数配列にインデックスを作って、データを投入するとき、クラッシュする動作が報告されました。また、巨大なメモリ確保を試みて「ERROR: invalid memory alloc request size ...」になるケースもあります。

  122. configure で python が見つからないとき、python3 と python2 を探すようになりました。 (Peter Eisentraut) (11)(10)
  123. バージョン番号付きの python実行ファイルが無いプラットフォームで、明示的に PYTHON 変数を指定することなく PL/Python が設定できるようになります。

  124. インストールされるヘッダファイルに JITに関するヘッダが含まれるようになりました。 (Donald Dong) (11)
  125. pgxs によるビルドにて新たな Makefile変数 PG_CFLAGS、PG_CXXFLAGS、PG_LDFLAGS がサポートされました。 (Christoph Berg) (11)(10)(9.6)(9.5)(9.4)
  126. Perlコードのビルドスクリプトで、最近の perl は '.' を検索パスに含まないことを想定するようになりました。 (Andrew Dunstan) (11)(10)(9.6)(9.5)(9.4)
  127. OpenBSD のサーバコマンドラインオプション解析問題が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
  128. set_rel_pathlist_hook を呼び出す箇所が変更され、拡張機能がそのフックを使ってパラレルクエリの部分パスを提供できるようになりました。 (KaiGai Kohei) (11)(10)(9.6)
  129. 既存のユースケースには影響を与えないと考えられます。

  130. タイムゾーンデータファイルが tzdata release 2018i に更新されました。 (11)(10)(9.6)(9.5)(9.4)
  131. カザフスタン、メトラカットラ、サントメ・プリンシペの夏時間法の変更、香港と多数の太平洋諸島での歴史的修正が含まれます。

    また、カザフスタンの Qyzylordaゾーンは 2つに分かれ、新ゾーン Asia/Qostanay が作られました。一部の地域は UTCオフセットを変更しません。

  132. autovacuum が、残った一時テーブルをより積極的に削除するように、また、DISCARD TEMP の際にも残った一時テーブルを削除するようになりました。 (Álvaro Herrera) (10)(9.6)(9.5)(9.4)
  133. これにより、クラッシュしたセッションの残骸がより速やかに片付けられます。

  134. 赤黒木(red black tree)のサポート関数が rb プレフィックスを使わず、rbt プレフィックスを使うように改名されました。 (Tom Lane) (10)
  135. これにより PL/Ruby を壊す Ruby 関数との名前衝突を避けます。影響を受ける他の拡張は無いと思われます。PostgreSQL 11.1 で修正されていましたが、10.x 系列にも適用されました。

  136. configureで選択されるスレッド関連のコンパイラフラグとライブラリが、以降のPostgreSQLリリースに一致するように調整されました。 (Tom Lane) (9.5)(9.4)
  137. 9.4および9.5バージョン系列で以前に使われたコードは、一部の新しいプラットフォームでは完全に失敗するため、9.6以降で使われるものに一致されました。

11.1、10.6、9.6.11、9.5.15、9.4.20、9.3.25 (2018年11月8日リリース)の変更点


  1. pg_dump が CREATE TRIGGER ... REFERENCING コマンドを出力するときに遷移テーブル名を確実にクォートするようになりました。 (Tom Lane) (11)(10)
  2. この見逃しは、ダンプのリストアや pg_upgrade実行で権限の無いユーザがスーパーユーザ権限を得るようにする攻撃を可能にしていました。(CVE-2018-16850)

  3. 各パーティションの子インデックスを作るときに、パーティションインデックスに対して指定されたテーブルスペースを適用するようになりました。 (Álvaro Herrera) (11)
  4. これまでは、子インデックスは常にデフォルトテーブルスペースに作られていました。

  5. 複数バッチ動作のパラレルハッシュ左外部結合で NULL の扱いが修正されました。 (Andrew Gierth, Thomas Munro) (11)
  6. ハッシュキーに NULL値を伴う外側リレーションの行が、結合結果から抜け落ちていました。本障害のため enable_parallel_hash = on のときに、誤った問い合わせ結果が返る可能性がありました。

  7. 定数テスト式を持った CASE句の中にある配列型のキャスト式の不正な処理が修正されました。 (Tom Lane) (11)
  8. 以下のような奇妙な動作が発生していました。

    (enum_range関数は配列 '{e,f,g}' を返すので '{a,b,c,d,e,f,g}' が正しい結果)
    db=# CREATE TYPE typ_efg AS ENUM ('e', 'f', 'g');
    db=# SELECT
           CASE 'foo'::text WHEN 'foo'
             THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::typ_efg)::text[]
             ELSE ARRAY['x', 'y']
           END;
             array
    -----------------------
     {a,b,c,d,foo,foo,foo}
    (1 row)
    
  9. 最近に追加した列が欠けた不正なタプル展開が修正されました。 (Andrew Dunstan, Amit Langote) (11)
  10. 本障害により、最近に追加された列をもつテーブルの制約トリガ動作でクラッシュをひき起こすことが知られています。また、その他の症状を示す可能性もあります。

    (知られている障害発生パターン)
    db=# CREATE TABLE leader (a int PRIMARY KEY, b int);
    db=# CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int);
    db=# INSERT INTO leader VALUES (1, 1), (2, 2);
    db=# ALTER TABLE leader ADD c int;
    db=# ALTER TABLE leader DROP c;
    db=# DELETE FROM leader;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  11. CALLの引数リストで、名前付けされた引数やデフォルト値が付与された引数での誤りが修正されました。 (Tom Lane, Pavel Stehule) (11)
  12. CALLでそのような引数をもつプロシージャを実行するときに、エラーが発生する動作が報告されていました。

  13. 「ORDER BY 列」を伴う STRICTな集約で、STRICT検査が修正されました。 (Andrew Gierth, Andres Freund) (11)
  14. STRICTな集約とは NULLを処理対象から除外する動作をするものです。ORDER BY を付与したときこの動作が働きませんでした。

    (1 が返るのが正しいが、NULLが返っていた)
     db=# SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y);
      min
     -----
     
     (1 row)
    
  15. recheck_on_update の最適化が無効にされました。 (Tom Lane) (11)
  16. これはバージョン11から登場した最適化機能ですが、クラッシュをひき起こすとがあり、ひとまず無効化されました。

  17. 親テーブル(=パーティションテーブル)のトリガによるパーティション作成が防止されました。 (Amit Langote) (11)(10)
  18. クラッシュをひき起こすことがありました。理想的にはこのような使い方も可能とすべきですが当面は禁止とされました。トリガ駆動時に以下のようなエラーが出るようになります。

    ERROR:  cannot ALTER TABLE "..." because it is being used by active queries in this session
    
    ERROR:  cannot CREATE TABLE .. PARTITION OF "..." because it is being used by active queries in this session
    
  19. ON COMMIT DELETE ROWS を一時パーティションテーブルに適用する場合の問題が修正されました。 (Amit Langote) (11)(10)
  20. このような一次パーティションテーブルを作るときに以下のようなエラーが発生していました。

    db1=# CREATE TEMP TABLE t10 (id int, v text)
            PARTITION BY RANGE (id) ON COMMIT DELETE ROWS;
    ERROR:  could not open file "base/16543/t3_45678": No such file or directory
    
  21. Windows において、U+FFFF より上の Unicode文字に対してエラーを起こさないように、文字クラス検査が修正されました。 (Tom Lane, Kenji Uno) (11)(10)(9.6)(9.5)(9.4)(9.3)
  22. この障害はテキスト検索、contrib/ltree、contrib/pg_trgm に影響があります。絵文字に対して pg_trgm の関数を実行して以下エラーが出る例が報告されました。

    ERROR: invalid multibyte character for locale
    
  23. 既に受け取っている NOTIFY や SIGTERM割り込みの処理を、クライアント入力を待つより前に実行するようになりました。 (Jeff Janes, Tom Lane) (11)(10)(9.6)(9.5)
  24. 以前はより早くに処理されていたのが、9.6.3、9.5.7 のリリースから本修正前まででは、後回しに処理されるようになっていました。

  25. 繰り返して SP-GiSTインデックスをスキャンする場合のメモリリークが修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)(9.3)
  26. SP-GiST を使った排他制約が一つのコマンドで多数の新たなインデックスエントリを受け付ける場合に、大きなリーク量が生じることが知られています。

  27. 既存のレプリケーションスロットに対応するには低すぎる wal_level が設定されているときには、サーバ起動しないようになりました。 (Andres Freund) (11)(10)(9.6)(9.5)(9.4)
  28. 各 PQnotifies() を呼ぶ前に PQconsumeInput() を呼ぶように psql が修正され、libpq のドキュメントのサンプルも修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)
  29. これは psql が NOTIFYメッセージ受信を次コマンドまで報告しないケースを修正します。

  30. pg_verify_checksums で、どのファイルをチェックサム検査すべきかの判断が修正されました。 (Michael Paquier) (11)
  31. 一部ケースでチェックサムを持つと想定されないファイルについて、問題報告されることがありました。

  32. contrib/pg_stat_statements でpg_read_all_statsロールが pg_stat_statements_reset() を実行することが禁止されました。 (Haribabu Kommi) (10) (11)
  33. pg_read_all_stats は全ての統計情報が参照できるという意味であるため、データを変更できることは不適切でした。変更の反映には導入先の各データベースで以下コマンド実行が必要です。

    ALTER EXTENSION pg_stat_statements UPDATE;
    
  34. 赤黒木のサポート関数のプレフィックスが rb ではなく rbt に変更されました。 (Tom Lane) (11)
  35. Ruby の関数との名前衝突を回避します。PL/Ruby を導入する場合に問題がありました。

  36. macOS 10.14 でのビルドの問題が修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)(9.3)
  37. PL/Perl と PL/Tcl のビルドに失敗していました。対応として、configureスクリプトが CPPFLAGS に -isysroot を加えるようになりました。そのほか、macOS むけにビルドスクリプトがいくつか修正されました。

  38. MSVC でのビルドとリグレッションテストのスクリプトが最近の Perlバージョンで動作するように修正されました。 (Andrew Dunstan) (11)(10)(9.6)(9.5)(9.4)(9.3)
  39. Perlは最早カレントディレクトリをデフォルトではサーチパスに含めず、本修正はこれに対応したものです。

  40. Windows で Administratorアカウントによるリグレッションテストが可能になりました。 (Andrew Dunstan) (11)(10)(9.6)(9.5)
  41. Administratorアカウントから駆動したとしても安全であるように、実行プロセスは制約された権限で動作するようになっています。

  42. タイムゾーンデータファイルが tzdata release 2018g に更新されました。 (11)(10)(9.6)(9.5)(9.4)(9.3)
  43. チリ、フィジー、モロッコ、ロシア(ヴォルゴグラード)の夏時間法の変更と、中国、ハワイ、日本、マカオ、北朝鮮の歴史的修正が含まれています。

  44. has_*_privilege() 関数群が、稀なケースでエラーになる障害が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  45. これら関数はオブジェクトの不正な OID与えられたときエラーではなく NULLを返すことが期待されていますが、一部においてそうなっていませんでした。さらに、has_column_privilege() 関数は一部プラットフォームでクラッシュする可能性がありました。

  46. pg_get_partition_constraintdef() が、不正なリレーション OID を渡されたときに、エラーを出すのではなく NULL を返すように修正されました。 (Tom Lane) (10)
  47. 長い文字列に対して正規表現でマッチングする関数や分割する関数を使うとき、O(N^2) オーダーで遅延するのを回避するように修正されました。 (Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
  48. 標準の複数文字演算子のパース処理が修正されました。 (Andrew Gierth) (10)(9.6)(9.5)
  49. この障害によりパースエラーや不正な優先順位が生じる可能性がありました。演算子の後に数値の + や -、あるいはコメント開始記号の -- や /* が続いている場合に誤認されるケースがありました。

    (報告された障害動作例)
    db=# CREATE FUNCTION f26(a int) RETURNS int LANGUAGE sql
            AS $$ SELECT a; $$;
    db=# SELECT f26(a => -1);
     f
    ----
     -1
    (1 row)
    
    db1=# select f(a =>-1);
    ERROR:  column "a" does not exist
    
  50. + や - 文字による長い文字列の字句解析で O(N^3) オーダーでの遅延を回避するように修正されました。 (Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
  51. 外側の問い合わせが逆向きにスキャンされているときの SubPlans の誤った実行が修正されました。 (Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
  52. カーソルを使って FETCH BACKWARD で結果を取得する場合に誤った SELECT結果が返る動作が報告されていました。実行プランとして逆向きスキャンが選ばれる場合にも問題が起きる可能性があります。

  53. カーソルを巻き戻した後に「UPDATE/DELETE ... WHERE CURRENT OF ...」コマンドがエラーになる動作が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  54. 複数のリレーション(特に親テーブルを継承した複数のテーブルなど)をスキャンするカーソルは、手前のリレーションに巻き戻された場合に誤動作を起こす可能性がありました。

  55. EvalPlanQual が条件実行される InitPlans を適切に扱えるように修正されました。 (Andrew Gierth, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  56. 同時更新をしたときに、なかなか再現しないクラッシュや誤った問い合わせ結果が生じていました。CASE や COALESCE の中にある無関係な副SELECT を含む更新SQL(例えば以下のような形状)で該当します。

    WITH d(val) AS (SELECT 'Val'::text FROM generate_series(1,1))
      UPDATE t30 SET v = COALESCE(v, (SELECT val FROM d)) WHERE id = 1;
    
  57. ウィンドウ関数、LIMIT、OFFSET を含む副SELECT のパラレルワーカへのプッシュができなくなりました。 (Amit Kapila) (10)(9.6)
  58. このような場合、行順序の変化により不確定な結果となって、ワーカごとに異なる応答を得ることから、整合性に欠けた振る舞いが生じることがありました。

  59. 外部テーブルに所有されているシーケンスが、そのテーブルに対する ALTER OWNER で確実に処理されるようになりました。 (Peter Eisentraut) (10)(9.6)(9.5)(9.4)(9.3)
  60. 所有者変更はこのようなシーケンスにも伝播すべきでしたが、外部テーブルについて見逃されていました。

  61. 配列データ型の出力関数 array_out() が結果文字列用に過大なメモリを確保していたものが、修正されました。 (Keiichi Hirobe) (10)(9.6)(9.5)(9.4)(9.3)
  62. 特に多次元配列のときに確保サイズが大きくなっていました。

  63. xmltable関数で問い合わせの間のメモリリークがあり、修正されました。 (Andrew Gierth) (10)
  64. 内部実装関数 ApplyLogicalMappingFile() がマッピングファイルを伴って実行されたとき、ファイルを確実に閉じるように修正されました。 (Tomas Vondra) (10)(9.6)(9.5)(9.4)
  65. これまでファイル記述子のリークがあり、結果としてロジカルデコーディングでのエラーをひき起こしていました。

    (エラー例)
    ERROR:  53000: exceeded maxAllocatedDescs (492) while trying to open file "pg_logical/mappings/map-4000-4eb-1_60DE1E08-5376b5-537c6b"
    LOCATION:  OpenTransientFile, fd.c:2161
    
  66. ロジカルデコーディングで割り当てられたカタログテーブルが繰り返し書き直される場合に処理できるように修正されました。 (Andres Freund) (10)(9.6)(9.5)(9.4)
  67. VACUUM FULL や CLUSTER コマンドで以下のようなエラーが生じる可能性がありました。

    ERROR, "could not map filenode "base/16543/19876" to relation OID"
    
  68. SQL実行にて EXECUTEコマンドなどのユーティリティコマンドが無限再帰を起こした場合にバックエンドがクラッシュする動作が回避されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  69. ホットスタンバイを初期化する時に、プライマリでの二相トランザクションで生じる重複した XID に対応できるようになりました。 (Michael Paquier, Konstantin Knizhnik) (10)(9.6)(9.5)(9.4)(9.3)
  70. これまでスタンバイで以下のエラーが出ることがありました。

    FATAL:  out-of-order XID insertion in KnownAssignedXids
    
  71. 入れ子の ALTER TABLE を扱えるようにイベントトリガが修正されました。 (Michael Paquier, Álvaro Herrera) (10)(9.6)(9.5)
  72. 本障害について、イベントトリガが働く状態で入れ子のパーティションテーブルを作成するときのクラッシュが報告されました。

  73. 親プロセスのトランザクションと文の開始タイムスタンプがパラレルワーカに伝播するようになりました。 (Konstantin Knizhnik) (10)(9.6)(9.5)
  74. これにより、transaction_timestamp() などの関数がワーカ上で実行されたときの誤動作が防止されます。

  75. 拡張された値のパラレルワーカへの転送が修正されました。 (Tom Lane, Amit Kapila) (10)(9.6)
  76. 配列型の値などが該当します。SQL実行時に Bus error によるクラッシュが発生していました。

  77. WALファイル再利用のロジックがスタンバイサーバで正しく動作するように修正されました。 (Michael Paquier) (10)(9.6)(9.5)
  78. archive_mode の設定によってはスタンバイで一部の本来削除可能なWALファイルの削除に失敗することがありました。

  79. リカバリ中のコミットタイムスタンプ追跡の処理が修正されました。 (Masahiko Sawasa, Michael Paquier) (10)(9.6)(9.5)
  80. コミットタイムスタンプ追跡が有効または無効に変更されると、それを記録していないトランザクションに対してコミットタイムスタンプを取得しようとしてリカバリに失敗することがありました。

    (本障害でリカバリ起動に失敗した報告例)
    FATAL: could not access status of transaction 3003911820
    DETAIL: Could not read from file "pg_commit_ts/6FEE" at offset 557056: Success.
    
  81. ブートストラップとスタンドアローンバックエンドのプロセスで、また、initdb で、random() 関数のシードを時刻やプロセスID でランダムに設定するようになりました。 (Noah Misch) (10)(9.6)(9.5)(9.4)(9.3)
  82. この変更により、常に同じランダムシードを使うことで生じる名前衝突によって、initdb が POSIX共有メモリが無効であると誤って判断するのを回避できます。

  83. DSA(動的共有メモリ領域)の処理で共有メモリ破壊の可能性があり、修正されました。 (Thomas Munro) (10)
  84. 主として問い合わせの並列処理で問題が不具合が発生します。

  85. DSM(動的共有メモリ)の割り当てが割り込み可能になりました。 (Chris Travers) (10)(9.6)(9.5)(9.4)
  86. SQLのパラレル処理とキャンセルで無限ループが生じる可能性がありました。

  87. 初期化関数でシステムキャッシュにアクセスを試みる拡張モジュールを読み込むときに発生する、パラレルワーカでのエラーが回避されました。 (Thomas Munro) (10)(9.6)
  88. 本障害により以下のエラーが発生するケースが報告されました。

    ERROR:  invalid cache ID: 11
    LOG: worker process: parallel worker for PID 12345 (PID 12354) exited with exit code 1
    
  89. full_page_writes を動的に on に変える処理を適切に行うようになりました。 (Kyotaro Horiguchi) (10)(9.6)(9.5)
  90. off から on に変えた後もフルページ書き出しが行われない動作が報告されました。

  91. SP-GiST の再スキャンでメモリ二重解放によるクラッシュの可能性があり、修正されました。 (Andrew Gierth) (10)(9.6)
  92. ELFベースのBSDプラットフォームや HP-UX、Solaris で、src/port と src/common の関数の誤ったリンクが防止されました。 (Andrew Gierth, Tom Lane) (10)
  93. バックエンドのアドレス空間にロードされた共有ライブラリは、関数のリンク先に意図しているそれらが持つコピーではなく、バックエンドにあるバージョンを使う可能性がありました。両関数実装が一致していない場合、この振る舞いのために障害がひき起こされます。

    クラッシュが発生する例が報告されています。

  94. GINページの再圧縮処理を WALから再生するときにバッファオーバーランの可能性があり、修正されました。 (Alexander Korotkov, Sivasubramanian Ramasubramanian) (10)(9.6)(9.5)(9.4)
  95. 本障害によりデータ破壊の可能性があります。

  96. ブロックサイズをデフォルトよりも小さくしていた場合の、ハッシュインデックスのメタページのバッファオーバーランが回避されました。 (Dilip Kumar) (10)
  97. 該当する場合、本障害によりデータ破壊をひき起こす可能性があります。

  98. ハッシュインデックスでページチェックサムの更新が行われないことがあり、修正されました。 (Amit Kapila) (10)
  99. レプリケーションスロットのディレクトリに対する fsync が行われておらず、修正されました。 (Konstantin Knizhnik, Michael Paquier) (10)(9.6)(9.5)(9.4)
  100. wal_sender_timeout を遅いサーバで使った場合の予期せぬタイムアウトが修正されました。 (Noah Misch) (10)(9.6)(9.5)(9.4)
  101. サーバ側(WAL送出側)の遅延をタイムアウト判定に含めないように調整されました。

  102. ホットスタンバイのプロセスが確実に正しいWAL整合状態到達点を用いるようになりました。 (Alexander Kukushkin, Michael Paquier) (10)(9.6)(9.5)(9.4)(9.3)
  103. この修正は、スタンバイサーバが WALリプレイでデータベース整合状態に達した直後の誤動作を防止します。

    スタンバイサーバのクラッシュ後の起動で、以下メッセージが出て失敗する動作が報告されました。

    PANIC:  WAL contains references to invalid pages
    DETAIL:  xlog redo at AB3/50323E78 for Btree/DELETE: 182 items
    
  104. サーバ起動中にマスタプロセス(postmaster)が fastシャットダウン要求を受け取ったとき、バックグラウンドワーカが適切に停止されるようになりました。 (Alexander Kukushkin) (10)(9.6)(9.5)
  105. ページの可視性フラグ、凍結済フラグを変更する WAL を再生するときに、空き領域マップを更新するようになりました。 (Álvaro Herrera) (10)(9.6)
  106. これまで FSM(空き領域マップ)は重要なデータではないと考えられていましたが、FSM が古くなりすぎるとサーバがスタンバイからプライマリに昇格した後、パフォーマンスが大幅に低下する可能性がありました。

  107. 問い合わせ終了時、または、タプルカウント上限に到達した時の、パラレル問い合わせ用リソースの早すぎる解放を回避するようになりました。 (Amit Kapila) (10)(9.6)
  108. 呼び出し側が後で逆向きスキャンを求める場合を考慮する必要がありました。

  109. SIGQUIT を処理するときに atexit() によるコールバックを実行しないようになりました。 (Heikki Linnakangas) (10)(9.6)(9.5)(9.4)(9.3)
  110. シグナルを受けてハングアップする可能性がありました。

  111. 外部サーバのユーザマッピングを拡張の要素として記録しないようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  112. 拡張のスクリプトで CREATE USER MAPPING を実行すると、ユーザのマッピングに対して予期せぬ拡張依存関係が作成されました。ロールは拡張の要素にすることはできないため、ユーザマッピングも含めるべきではありませんでした。

  113. loggerプロセス(組み込みのロガー)が CSV ログファイルを開く際に、失敗しにくくなりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  114. これまではファイルを開けなかった場合にそれを報告しようとして無限再帰ループに陥る可能性がありました。

  115. libpq に複数のターゲットホスト名が指定されている場合、1度に1つずつ名前解決をするようになりました。 (Tom Lane) (10)
  116. これにより、リスト内の手前にあるサーバに正常に接続できる場合の不要な障害や接続遅延を防止します。

  117. libpq の接続タイムアウト処理がホスト名またはIPアドレスごとに正しく適用されるように修正されました。 (Tom Lane) (10)
  118. 以前は、次の対象ホストに切り替える際にタイマーがリセットされないことがあり、設定よりも早くタイムアウトとなる可能性がありました。

  119. pg_dump の --no-publications オプションがパブリケーションテーブルを無視するように修正されました。 (Gilles Darold) (10)
  120. pg_dump で本オプションが機能していませんでした。

  121. pg_dump で親テーブルがダンプから除外されているときには、その子テーブルの IDENTITY のシーケンスも除外するようになりました。 (David Rowley) (10)
  122. pg_dump が異なるオブジェクト名をソートする際に起こり得る一貫性の欠如が修正されました。 (Jacob Champion) (10)(9.6)(9.5)(9.4)(9.3)
  123. pg_restore が DISABLE/ENABLE TRIGGER コマンドを出力する際にテーブル名をスキーマ修飾するようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  124. これにより制限された検索パスでリストアを実行する場合の障害を回避します。

  125. pg_upgrade が拡張に属するイベントトリガを正しく処理するように修正されました。 (Haribabu Kommi) (10)(9.6)(9.5)(9.4)(9.3)
  126. 以前の pg_upgrade はイベントトリガが拡張に属することを維持できせんでした。

  127. pg_upgrade のクラスタ状態チェックがスタンバイサーバで正しく動作するように修正されました。 (Bruce Momjian) (10)(9.6)(9.5)(9.4)(9.3)
  128. すべての contrib/cube 関数に cube型の次元数の制限が適用されるようになりました。 (Andrey Borodin) (10)(9.6)(9.5)(9.4)(9.3)
  129. 以前は、一部の cube 関連関数が cube_in(cube型の入力関数)で拒否される値を生成する可能性があり、ダンプ/リストアの失敗をひき起こしました。

  130. contrib/postgres_fdw では、変数を持たない ORDER BY句をリモートサーバへ送信しないようになりました。 (Andrew Gierth) (10)(9.6)
  131. use_remote_estimate = on の場合に「ORDER BY 0」がリモートで実行されて、「ERROR: ORDER BY position 0 is not in select list」が生じるケースがありました。

  132. contrib/unaccent の unaccent() 関数が、関数と同じスキーマにある非アクセントテキスト検索辞書を使用するように修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  133. これまでは search_path を使用して辞書を探していましたが、search_path が制限的な設定であるとき失敗する可能性がありました。

  134. btree比較関数が INT_MIN を返せるようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  135. これまでは、データ型固有の比較関数が INT_MIN を返すことを禁止していました。これにより関数の呼び出し元は、比較結果を否定するだけでソート順を逆転させることができました。しかし、POSIX はそのような制限を設けていないので、memcmp() や strcmp() などの結果を直接返す比較関数では、これは安全ではありませんでした。少なくとも最新のバージョンの memcmp() は INT_MIN を返すことがあり、誤った並べ替え順序が発生します。

    この制限は削除されました。ソート順を逆にする場合は、INVERT_COMPARE_RESULT() マクロを使用する必要があります。

  136. 共有無効化のメッセージ処理における再帰障害が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  137. この障害で VACUUM FULL によって処理されたばかりのシステムカタログやインデックスへのアクセスに失敗することがあります。以下のエラーが報告されました。FATALが生じることもあります。

    ERROR:  could not read block 3 in file "base/16384/2662": read only 0 of 8192 bytes
    

    本修正で、待機イベントである LockAcquire に対する新しい結果コードが追加されました。このイベントの外部呼出し元に影響を与える可能性があります。しかし、これは非常に珍しい使われ方でのみ発生する問題です。

  138. SPI_connect() 及び SPI_finish() の中に SPI のグローバル変数を保存および復元するようになりました。 (Chapman Flack, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  139. これにより、1つの SPI を使用する関数が、別の関数を呼び出すときに起こり得る干渉を防ぎます。

  140. 潜在的にアラインメント調整されたページバッファの使用を避けるようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  141. 新しく UNION型の PGAlignedBlock、PGAlignedXLogBlock を設けて、これらを 単なる char配列の代わりに使用して、コンパイラがアラインメントを外れた開始アドレスにバッファを置くことがないようになりました。これにより一部プラットフォームでのクラッシュを回避します。問題がなかったプラットフォームでもパフォーマンス向上が期待できます。

  142. Make src/port/snprintf.c の結果が、C99 標準の snprintf() の結果の定義に沿うようになりました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  143. これまでは C99 以前の振る舞いをしていました。主にWindowsなど、このコードが使われているプラットフォームでは、呼び出しコードが C99 のセマンティクスを前提としていた場合にバッファオーバーランを検出できない可能性がありました。

  144. i386 アーキテクチャにおいて clang コンパイラを使ってビルドする際は、-msse2 オプションが必須になりました。 (Andres Freund) (10)(9.6)(9.5)(9.4)(9.3)
  145. configure スクリプトの修正です。これにより浮動小数点のオーバーフローチェックが失敗することを回避できます。

  146. configrue における strerror_r() 結果型の検知が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  147. 以前のリリースでは、Linux 上で icc を使ってビルドする際、間違った結果となりました(恐らく他の組み合わせでも)。これにより、システムから報告されたエラーに対して libpq が有用なエラーメッセージを返さない動作が生じました。

  148. Visual Studio 2015 と Visual Studio 2017 でのビルドがサポートされるようになりました。 (Michael Paquier, Haribabu Kommi) (9.5)(9.4)(9.3)
  149. ALLOCSET_DEFAULT_SIZES および関連のマクロが旧バージョン系列にも提供されました。 (Tom Lane) (9.5)(9.4)(9.3)
  150. これらのマクロは 9.6 以降は存在していましたが、古いバージョンにも追加して、固有のコーディングなしで拡張機能を利用したいという要望がありました。

PostgreSQL 10.5、9.6.10、9.5.14、9.4.19、9.3.24 の変更点


  1. libpq にて接続を試行するごとに状態を完全にはリセットできておらず、修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  2. ある種の攻撃方法で dblink や postgres_fdw の権限の無いユーザが、サーバを実行する OSユーザが所有する ~/.pgpass などのサーバ側の認証情報ファイルの使用を防止する検査を迂回できました。ローカル接続に peer認証を許可しているサーバは特に影響を受けます。postgres_fdw セッションへの SQLインジェクションなどの他の攻撃も可能です。

    この方法で postgres_fdw を攻撃するには指定の接続パラメータで外部サーバオブジェクトが作成できる必要があります。一方、dblink に対しては、dblink にアクセスできる任意のユーザで攻撃可能です。一般に libpq を使ったアプリケーションに対して接続パラメータを選べると攻撃可能になると考えられます。(CVE-2018-10915)

  3. 単純な「SELECT * FROM ...」ではないビューを通した「INSERT ... ON CONFLICT UPDATE」が修正されました。 (Dean Rasheed, Amit Langote) (10)(9.6)(9.5)
  4. ビューの SELECTリストが元のテーブルの列と1対1で対応していない場合に、更新可能ビューの誤った展開がクラッシュや「ERROR: attribute ... has the wrong type」エラーをもたらす可能性がありました。

    さらにセキュリティ上の問題もありました。攻撃者が同テーブルの他の列にINSERTとUPDATE権限を持っている場合に、この障害を利用してUPDATE権限の無い列を更新できました。また、あらゆるユーザがこの障害を使ってサーバメモリの読み取りが可能でした。(CVE-2018-10925)

    障害動作例:
    (以下のようなテーブル、ビューで)
    db1=# CREATE TABLE t2 (id int primary key, c1 int, c2 int);
    db1=# CREATE VIEW v2 AS SELECT id, c2 FROM t2;
    db1=# GRANT UPDATE (id, c2) ON t2 TO foo;
    db1=# GRANT INSERT (id, c2) ON t2 TO foo;
    db1=# GRANT ALL ON v2 TO foo;
    db1=# INSERT INTO t2 VALUES (1,1,1), (2,2,2);
    
    (一般ユーザ foo で INSERT ... ON CONFLICT ... を実行)
    db1=> INSERT INTO v2 (id, c2) VALUES (1,100)
            ON CONFLICT (id) DO UPDATE SET c2 = EXCLUDED.c2;
    INSERT 0 1
    
    (奇妙な結果: c2 が更新されず、権限が無い c1 が NULL に更新)
    db1=# SELECT * FROM t2;
     id | c1 | c2
    ----+----+----
      2 |  2 |  2
      1 |    |  1
    (3 rows)
    
  5. 固定されたシステムカタログに対する relfrozenxid値と relminxid値の更新が、遅れることなく処理されるようになりました。 (Andres Freund) (10)(9.6)(9.5)(9.4)(9.3)
  6. 過剰に楽観的なキャッシュ処理方式は、これらの更新が他のセッションから見えなくなるおそれがあり、偽性エラー、あるいは/および、データ破損をもたらす可能性がありました。古いキャッシュデータが既存セッションのみならず新たなセッションにまで残り続ける可能性があるため、この問題は pg_authid などの共有カタログにおいて特に悪質です。

    以下のエラーが報告されて問題が発見されました。

    ERROR:  found xmin 2906288382 from before relfrozenxid 740087784
    

    これは、テーブルに凍結したXID値(relfrozenxid)よりも手前のxmin値を持つレコードが見つかったという意味です。キャッシュ処理の誤りで実際の relfrozenxid値よりもずっと古い値が参照されていました。
    同様に「ERROR: found multixact ... from before relminmxid ...」も起こる可能性があります。

  7. 昇格したばかりのスタンバイが昇格後の最初のチェックポイント処理を終える前にクラッシュした場合について、修正されました。 (Michael Paquier, Kyotaro Horiguchi, Pavan Deolasee, Álvaro Herrera) (10)(9.6)(9.5)(9.4)(9.3)
  8. 本障害により、そのクラッシュ後のリカバリ起動でWALを適用する際に一貫性をもったデータベース状態に到達していないと判断され、起動に失敗しました。

    クラッシュ後の起動失敗のときに「PANIC: WAL contains references to invalid pages」が出る動作が報告されています。

  9. 内容が全てゼロのBtreeインデックスのページを再利用する際に不適切なWALレコードを出力しないように修正されました。 (Amit Kapila) (10)(9.6)(9.5)(9.4)(9.3)
  10. この誤りはアサート失敗として現れます。また、潜在的にホットスタンバイサーバで不必要な問い合わせキャンセルを起こすおそれがありました。

  11. WALリプレイにて、1GBを超える破損したレコード長から保護されるようになりました。 (Michael Paquier) (10)(9.6)(9.5)
  12. このような場合には破損したデータとして扱えるようになりました。これまでは、WALレコード内に書かれたレコード長の通りに大きいメモリ領域を確保しようと試みていました。その結果、以下のような強いエラーが生じてリカバリ不能になっていました。

    FATAL:  invalid memory alloc request size ...
    

    本修正でWALの再読み込みを促す弱いエラーを出すように変更されました。

  13. リカバリの終わりに、タイムラインヒストリファイルへの書き込みをできるだけ遅らせるようになりました。 (Heikki Linnakangas) (10)(9.6)(9.5)
  14. これにより、リカバリクリーンアップ中のエラー(二相コミットの状態ファイルの問題など)でディスク上に一貫性の無いタイムライン状態が生じるのを回避します。

    以下のようにリカバリ完了時にrecovery.confが無いというエラーが出て、失敗する動作が報告されていました。

    LOG: selected new timeline ID: 2
    FATAL: could not open file "recovery.conf": No such file or directory
    LOG: startup process (PID 23456) exited with exit code 1
    
  15. 多数のリレーションを削除するトランザクションに対して、WALリプレイの性能が改善されました。 (Fujii Masao) (10)(9.6)(9.5)(9.4)(9.3)
  16. この変更はファイル削除を一括して行うことで、共有バッファがスキャンされる回数を減らして、特に shared_buffers 設定が大きい場合に処理を効率化します。

  17. スタンバイサーバのWALリプレイにてロック解放の性能が改善されました。 (Thomas Munro) (10)(9.6)(9.5)(9.4)(9.3)
  18. wal sender がロジカルデータのストリーミング状態を正しく報告するようになりました。 (Simon Riggs, Sawada Masahiko) (10)(9.6)(9.5)(9.4)
  19. これまでは上流サーバに追いついているかどうかを誤判定していました。上流側(sender側)の起動時に、既に追いついているのに "streaming" でなく"catchup" 状態と報告することがありました。

  20. ロジカルレプリケーションのサブスクライバにおいて、データ型の入力関数を実行するときにスナップショットが確実に提供されるようになりました。 (Minh-Quan Tran, Álvaro Herrera) (10)
  21. この遺漏により、SQL言語の関数を使った制約を持つドメイン型などの一部の場合でクラッシュを起こしていました。

  22. ロジカルデコーディングのときのスナップショット処理について誤りが修正されました。 (Arseny Sher, Álvaro Herrera) (10)(9.6)(9.5)(9.4)
  23. 稀な場合において誤ったデコーディング結果を許容していました。ロジカルレプリケーション対象テーブルへのDDL操作や、サブトランザクション(SAVEPOINT)操作があるときに誤動作を起こすおそれがありました。

  24. ロジカルレプリケーションのテーブル同期ワーカにサブトランザクションを考慮した処理が加わりました。 (Amit Khandekar, Robert Haas) (10)
  25. これまで、いくつかのサブトランザクションが同期テーブルを更新した後に中止(ABORT)された場合に、テーブル同期が誤った振る舞いをする可能性がありました。

  26. インデックス作成が途中で失敗した後、テーブルのキャッシュされたインデックスリストが正しく再構築されるように修正されました。 (Peter Geoghegan) (10)(9.6)(9.5)(9.4)(9.3)
  27. これまでは、作成に失敗したインデックスの OID がリストに残り、同セッション内でその後に問題をひき起こしました。

    インデックス作成失敗後に当該テーブルに対するSQL実行で「ERROR: could not open relation with OID 16567」エラーが出るケースが報告されました。

  28. GINインデックスの圧縮されていない空のポスティングリストページの誤った処理が修正されました。 (Sivasubramanian Ramasubramanian, Alexander Korotkov) (10)(9.6)(9.5)(9.4)
  29. これは 9.4 より前の GINインデックスを pg_upgrade した後にアサート失敗をもたらします。9.4 以降のバージョンで GINインデックスを作った場合には問題ありません。

  30. キャッシュライン共用を減らすために、無名POSIXセマフォの配列を埋めこむようになりました。 (Thomas Munro) (10)
  31. これは多CPUシステムでの競合を減らし、Linux と FreeBSD での旧リリースと比較しての性能退行を修正します。

  32. パラレルインデックススキャンをしているプロセスが確実にシグナルに応対するようになりました。 (Amit Kapila) (10)
  33. これまで、パラレルワーカはインデックスページのロックを待機して止まったままとなる可能性がありました。

  34. VACUUM が Btreeインデックスのページ削除のループ内にあるとき、確実にシグナルに応対するように修正されました。 (Andres Freund) (10)(9.6)(9.5)(9.4)
  35. 破損したBtreeインデックスがここでの無限ループをもたらす可能性があり、その場合、これまでは強制クラッシュさせる以外には割り込み不能となっていました。

  36. inner_unique最適化を加えた際に入り込んだ、ハッシュ結合のコスト計算の誤りが修正されました。 (David Rowley) (10)
  37. 本障害により、この最適化が適用できる場合に悪いプランが選択される可能性がありました。

    inner_unique最適化とは、PostgreSQL 10 で導入されたユニーク保証を使った最適化の一つで、内部結合に適用されます。

  38. 複合型の列に関する同値クラスの誤った最適化が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  39. 本障害のために、複合列のインデックスがマージ結合に対してそれら列のソート順序を提供するかもしれないことが、見落とされていました。

    以下のように複合列のインデックスが使われない動作が報告されました。

    (このようなテーブルに対して)
    db1=# CREATE TYPE typ20c AS (c1 int, c2 int);
    db1=# CREATE TABLE tbl20a (c3 typ20c PRIMARY KEY);
    db1=# CREATE TABLE tbl20b (c3 typ20c PRIMARY KEY);
    db1=# INSERT INTO tbl20a SELECT ROW(g, g)::typ20c
            FROM generate_series(1, 100000) as g;
    db1=# INSERT INTO tbl20b SELECT ROW(g, g)::typ20c
            FROM generate_series(1, 100000) as g;
    db1=# ANALYZE;
    
    (以下の問い合わせで Merge Join の場合にインデックスが使われない)
    db1=# explain SELECT * FROM tbl20a a, tbl20b b WHERE a.c3 = b.c3;
    
  40. 複数行を返す関数を使った一部のクエリでの「ERROR: ORDER/GROUP BY expression not found in targetlist」エラーを回避するようにプランナが修正されました。 (Tom Lane) (10)(9.6)
  41. キーのデータ型が配列型のような多態のBtree演算子クラスを使っているものである場合の、パーティションキーの処理が修正されました。 (Amit Langote, Álvaro Herrera) (10)
  42. 配列型のパーティションキーを使った場合に、検索におけるパーティション除外(pruning)が働かない動作が報告されていました。

  43. SQL標準の FETCH FIRST 構文が標準で期待される通り、パラメータを受け付けるように修正されました。 (Andrew Gierth) (10)(9.6)(9.5)(9.4)(9.3)
  44. これまではプリペアドステートメントでパラメータとすることができませんでした。

    (修正前の動作例、LIMIT/OFFSETでは可能だが FETCH FIRSTはエラーになる)
    db1=# PREPARE p1 (int, int) AS
            SELECT * FROM t23 LIMIT $2 OFFSET $1;
    PREPARE
    db1=# PREPARE p2 (int, int) AS
            SELECT * FROM t23 OFFSET $1 ROWS FETCH FIRST $2 ROWS ONLY;
    ERROR:  syntax error at or near "$2"
    
  45. パーティションキー列の重複に対するドキュメント化されていない制限が除去されました。 (Yugo Nagata) (10)
  46. これまで「PARTITION BY RANGE (x, x)」のように同じ列を複数指定すると「ERROR: column "x" appears more than once in partition key」エラーが生じていました。

  47. 一時テーブルを非一時テーブルのパーティションにすることが禁止されました。 (Amit Langote, Michael Paquier) (10)
  48. これまでは許されていましたが、そのような場合は信頼できる動作をしません。

  49. 特にバッファアクセスについて、パラレルワーカーにおける EXPLAIN のリソース使用集計が修正されました。 (Amit Kapila, Robert Haas) (10)(9.6)
  50. クエリがパラレル動作をするときに EXPLAIN (ANALYZE,BUFFERS) で出力される「Buffers: ...」値が不正確になる動作が報告されました。

  51. SHOW ALL が pg_read_all_settings のメンバーであるロールに対して全ての設定を出力するように修正されました。また、そのようなロールは設定ファイル名と行番号を pg_settings ビューで参照できるようになりました。 (Laurenz Albe, Álvaro Herrera) (10)
  52. 内部実装関数 getObjectDescription の出力で、一部オブジェクト名のスキーマ修飾に失敗していたものが修正されました。 (Kyotaro Horiguchi, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  53. 照合順序、符号化方式変換、テキスト検索のオブジェクト名が、スキーマ修飾されるべきケースで修飾されませんでした。

    PostgreSQL 10.x 系列においては、パブリケーション、拡張統計のオブジェクトも該当します。また、内部実装関数 getObjectIdentity も修正されています。

  54. 並列化支援関数として VARIADIC を使った集約を与えることができるようにCREATE AGGREGATE の型チェックが修正されました。 (Alexey Bashtanov) (10)(9.6)
  55. COPY FROM の現在行番号カウンタを 32bit から 64bitに拡張しました。 (David Rowley) (10)(9.6)(9.5)(9.4)(9.3)
  56. これにより、COPYの入力が4G(約42.9億、2の32乗)行を超える場合の二つの問題を回避します。一つは COPY FROM WITH HEADER で先頭行のみならず4G行毎に行が捨てられてしまうことで、一つはエラー報告が誤った行番号を報告する可能性があることです。

  57. シングルユーザモードでレプリケーションスロットを削除できるようになりました。 (Álvaro Herrera) (10)
  58. シングルユーザモードで「SELECT pg_drop_replication_slot('p');」を実行したときに「ERROR: epoll_ctl() failed: Bad file descriptor」となる動作が報告されました。10.0 で埋め込まれてしまった障害です。

  59. パラレル集約が動作するときの variance(int4)関数および関連する集約関数からの誤った結果が修正されました。 (David Rowley) (10)
  60. varianceは入力値に対する標本分散を返す集約関数です。

  61. xmltable()の列式でTEXTノード、CDATAノードを適切に処理するようになりました。 (Markus Winand) (10)
  62. 起こりうる OpenSSL の RAND_bytes()関数の失敗を適切に処理するようになりました。 (Dean Rasheed, Michael Paquier) (10)
  63. 稀な状況で本障害により「LOG: could not generate random cancel key」が繰り返し発生して、新たな接続が受け付けられない状態になり、PostgreSQLをサービス再起動する以外では解消できませんでした。

  64. hostaddr が指定されたときの一部の場合について libpq が修正されました。 (Hari Babu, Tom Lane, Robert Haas) (10)
  65. PQhost() が一部の場合に誤解を招く結果または誤った結果を返していました。これからは一定の様式で応答します。ホスト名が指定されていたならホスト名を、ホストアドレスだけ指定されていた場合に限ってホストアドレスを、いずれも指定されていない場合にはデフォルトホスト名(典型的には /tmp かlocalhost)を返すようになりました。

    また、SSL証明書を検証するときに誤った値が証明書のサーバ名と比較されるかもしれませんでした。同様に、誤った値が ~/.pgpass のホスト名欄と比較されるかもしれませんでした。これからは、ホスト名が指定されていたならホスト名、ホストアドレスだけ指定されていたならホストアドレス、いずれも指定されていないなら「localhost」が比較対象の値となります。

    また、hostaddr値がパース不能であるとき以下のような不適切な("(null)"部分)エラーメッセージが報告されていたものが修正されました。

    $ psql "hostaddr=999.999.999.999"
    psql: could not parse network address "(null)": Name or service not known
    

    また、host、hostaddr、portパラメータにカンマ区切りのリストが含まれる場合、libpq はデフォルト動作指定を意味するリスト内の空要素を注意深く扱うようになりました。

  66. ecpg の pgtypesライブラリに文字列解放関数が追加されました。これによりWindowsでのモジュールをまたがるメモリ管理問題を回避できます。 (Takayuki Tsunakawa) (10)(9.6)(9.5)(9.4)(9.3)
  67. Windows で同じ DLLにて malloc して確保したのではないメモリを free すると、クラッシュが発生することがあります。pgtypesライブラリはときどき呼び出し側が解放する想定の文字列を返しますが、そのように使用することは不可能となっていました。PGTYPESchar_free() 関数が追加され、アプリケーションによる呼び出し側でのメモリ解放が可能となりました。

  68. Windows での ecpg の long long 変数サポートが修正されました。必要な strtoll/strtoull ライブラリ関数を非標準的に宣言していたり、全く宣言していない他のプラットフォームも同様に修正されました。 (Dang Minh Huong, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  69. Windows上の ecpg を使用した DBクライアント実行でクライアント側エラー「unsupported type "long long" on line ...」が出るケースが報告されました。

  70. RULE変更を行った場合の PL/pgSQL でSQLステートメントタイプの誤識別が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  71. この障害はアサート失敗をひき起こします。また、稀な場合に INTO STRICTオプションが期待通りに動作しなくなります。

  72. Windows で標準入力がターミナルでないとき、エコー出力が適切に無効化されるようにクライアントプログラムのパスワードプロンプトが修正されました。 (Matthew Stickney) (10)(9.6)(9.5)(9.4)(9.3)
  73. ダンプ出力でリスト値になっているGUI変数値のクォーティングがさらに修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  74. 以前の pg_dump出力での search_path や他のリスト値変数のクォーティングに対する修正は、空文字列リスト要素に対して誤動作をしていて、長いファイルパスが切り捨てられる危険性がありました。

  75. pg_dump で制約インデックスに対する REPLICA IDENTITY 属性のダンプに失敗していたものが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)
  76. 手動で作成したユニークインデックスは適切に属性が付与されますが、UNIQUE や PRIMARY KEY 制約を宣言して作られる場合にはそうなりませんでした。

  77. pg_upgrade で古いサーバが正常にシャットダウンしたか検査するようになりました。 (Bruce Momjian) (10)(9.6)(9.5)(9.4)(9.3)
  78. これまでは immediateモードのシャットダウンを誤って正常シャットダウンと判断していました。

  79. contrib/hstore_plperl が Perlスカラ参照を調べて、あるはずのハッシュ参照が見つからないときにクラッシュしないように修正されました。 (Tom Lane) (10)(9.6)(9.5)
  80. 以下のように hstore型にならない値を渡すときにクラッシュしていました。

    db1=# CREATE EXTENSION hstore;
    db1=# CREATE EXTENSION plperl;
    db1=# CREATE EXTENSION hstore_plperl;
    db1=# CREATE FUNCTION test43() RETURNS hstore LANGUAGE plperl
            TRANSFORM FOR TYPE hstore AS $$ return 43; $$;
    db1=# SELECT test43();
    server closed the connection unexpectedly
    
  81. contrib/ltree の lca() 関数で入力配列が空であるときのクラッシュが修正されました。 (Pierre Ducroquet) (10)(9.6)(9.5)(9.4)(9.3)
  82. 誤ったエラーコードが報告されるかもしれない、様々なエラー処理のコードパスが修正されました。 (Michael Paquier, Tom Lane, Magnus Hagander) (10)(9.6)(9.5)(9.4)(9.3)
  83. ライブラリ関数で使われる errno変数の退避やリセットが不十分な箇所が修正されました。ユーザに対しては、エラーメッセージ中のエラー理由を示す部分に誤ったメッセージが出力されるという形で問題があらわれます。

  84. プログラムが既存のシステムライブラリディレクトリにあるものではなく、ビルドされたばかりのライブラリ(libpq.so など)に確実にリンクするように、Makefile が整理されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  85. これにより、古いPostgreSQLライブラリのあるプラットフォームでビルドするときの問題を回避します。

  86. タイムゾーンデータファイルが tzdata release 2018e に更新されました。北朝鮮の夏時間法の変更とチェコスロバキアの歴史的修正が含まれます。 (10)(9.6)(9.5)(9.4)(9.3)
  87. この更新には、過去のナミビアとチェコスロバキアと同様の、アイルランド夏時間の再定義が含まれます。これらの管区では、法律上標準時間が夏で、冬に変更された時間帯が適用されるため、それにあわせた変更が適用されました。実際のUTCオフセットや使われているタイムゾーン略記法に変更はありませんが、pg_timezone_namesビューのis_dst列の値が変わり、冬にtrue、夏にfalseとなります。

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. 以前のリリースでも修正が行われていましたが、修正もれがありました。

PostgreSQL 10.3、9.6.8、9.5.12、9.4.17、9.3.22 の変更点


  1. 他ユーザからの search_path を使った「トロイの木馬」攻撃を防御する PostgreSQL とアプリケーションの設定方法がドキュメントに記載されました。 (Noah Misch) (10)(9.6)(9.5)(9.4)(9.3)
  2. 害意あるユーザから書き込み可能なスキーマを含む search_path 設定を使うことは、そのユーザが問い合わせの制御を取ること、そして、攻撃されたユーザの権限で任意の SQL コードを実行することをきわめて容易に可能にします。

    そのため、search_path に信用できないスキーマを含めないようにすることが推奨されます。ドキュメントのスキーマ、libpq、拡張および CREATE FUNCTION の各ページについて記載を改定しました。

    特に public スキーマはデフォルトで存在し、デフォルトで search_path に含まれており、全てのユーザでスキーマ上でオブジェクト作成が可能となっています。同じデータベースにアクセスする信用できない(本来制限されている)ユーザがいて、それでいて public スキーマと search_path 設定がデフォルト状態のままである場合には明らかに本脆弱性に該当します。(CVE-2018-1058)

  3. pg_dump や他のクライアントプログラムで安全でない search_path 設定の使用が回避されました。 (Noah Misch, Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  4. pg_dump、pg_upgrade、vacuumdb、およびその他各種の PostgreSQLで提供されるクライアントプログラム自体に前項で記載した類のハイジャックに対する脆弱性がありました。これらプログラムはたいてい管理者ユーザで実行されるので狙われやすいターゲットです。これらを安全にするため、動作時の search_path 設定に pg_catalog スキーマだけ含まれるようになりました。また、autovacuum worker も同様に動作するようになりました。なお、pgbench と psql は本修正の対象外です。

    これは非互換箇所のある修正です。これらのプログラムから間接的に実行されるユーザ定義関数(例えばインデックス式の関数)が search_path 設定に依存して記述されている(例えば public スキーマ下の関数をスキーマ修飾無しに参照している)場合、エラーが生じるようになります。(CVE-2018-1058)

  5. ロジカルレプリケーションで伝播不可能なリレーションに対して伝播しようとするのを防ぐようになりました。 (Peter Eisentraut) (10)
  6. FOR ALL TABLES と指定されたパブリケーションが誤ってマテリアライズドビューや information_schema テーブルの変更を伝播していました。これらは変更ストリームから無視されるべきものです。

  7. サブプラン内の CTE 参照で同時更新再チェック動作の間違いが修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  8. CTE(WITH 句参照)が InitPlan や SubPlan で使われていて、問い合わせが同時更新された行に更新やロックをするために再チェックを必要とする場合に、誤った結果が返ることがありました。

  9. 外部結合でマージ結合句が重複した場合にプランナが失敗する問題が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  10. コードの誤りにより稀なケースで「ERROR: left and right pathkeys do not match in mergejoin」や「ERROR: outer pathkeys do not match mergeclauses planner」といったエラーが生じていました。

    (10.2 でのエラーが発生する SQL を実行)
    test=# EXPLAIN (COSTS off)
    SELECT * FROM j1 FULL OUTER JOIN
    (SELECT * FROM j2 ORDER BY j2.id DESC, j2.num asc) j2
    ON j1.id = j2.id AND j1.id = j2.num;
    ERROR: left and right pathkeys do not match in mergejoin
    
    (10.3 での応答)
    QUERY PLAN
    ------------------------------------------------------
    Merge Full Join
    Merge Cond: ((j2.id = j1.id) AND (j2.num = j1.id))
    -> Sort
    Sort Key: j2.id DESC, j2.num
    -> Seq Scan on j2
    -> Sort
    Sort Key: j1.id DESC
    -> Seq Scan on j1
    (8 rows)
    
  11. pg_upgrade でマテリアライズドビューのための relfrozenxid の保存に失敗する問題が修正されました。 (Tom Lane, Andres Freund) (10)(9.6)(9.5)(9.4)(9.3)
  12. アップグレード後にマテリアライズドビューのデータが破損する可能性がありました。「ERROR: could not access status of transaction ...」や「ERROR: found xmin ... from before relfrozenxid ...」というエラーが現れます。

    この問題は、めったに更新されない、もしくは REFRESH MATERIALIZED VIEW CONCURRENTLY のみで更新をしていたマテリアライズドビューで発生しやすいものと見られます。

  13. pg_dump の出力の誤りが修正されました。 (Alexey Bashtanov) (10)
  14. シーケンスの MAXVALUE や MINVALUE がデフォルト値であるなら、ダンプ出力で省略しますが、その判断が間違っていました。

    大きな値を指定した場合に以下のような誤動作が報告されました。

    (誤動作例)
    db=# CREATE SEQUENCE foo INCREMENT BY -1
    MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807;
    db=# q
    $ pg_dump db
    : 中略
    CREATE SEQUENCE foo
    START WITH 9223372036854775807
    INCREMENT BY -1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
    : 後略
    
  15. pg_dump の STATISTICS オブジェクトに対する扱いが修正されました。 (Tom Lane) (10)
  16. 拡張統計のオブジェクトが正しいスキーマにリストアされなかったり所有者が正しくない状態になる可能性がありました。

  17. エラーコンテキストスタックで間違った PL/Python の関数名が報告されていた問題が修正されました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  18. 以下のように入れ子で PL/Python を呼び出している場合において該当します。

    (障害がおきる例)
    db=# CREATE FUNCTION notice_innerfunc() RETURNS int AS $$
    plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$")
    return 1
    $$ LANGUAGE plpythonu;
    
    db=# CREATE FUNCTION notice_outerfunc() RETURNS int AS $$
    plpy.execute("SELECT notice_innerfunc()")
    return 1
    $$ LANGUAGE plpythonu;
    

    また、入れ子になった PL/Python の DO ブロックは一部のプラットフォームで NULL ポインタ参照によるクラッシュをひき起こす可能性がありました。

  19. contrib/auto_explain の log_min_duration の最大値が約 35 分から、およそ 24 日間までに引き伸ばされました。 (Tom Lane) (10)(9.6)(9.5)(9.4)(9.3)
  20. 拡張モジュールを Windows に容易に移植できるようにするために、関連する GUC 変数が PGDLLIMPORT としてマークされました。 (Metin Doslu) (10)(9.6)

PostgreSQL 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 の別名にすぎません)。

PostgreSQL 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 ファイルが存在しない場合、数十年前のではなく、現在の米国の法律と一致していることです。

PostgreSQL 9.6.5、9.5.9、9.4.14、9.3.19、9.2.23 の変更点


  1. information_schema.table_privileges ビューに外部テーブルも含めるようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
  2. 他の関連する information_schemaビューでは外部テーブルを含めていますが、このビューだけ外部テーブルを無視していました。

    このビュー定義はinitdbで導入されるため、単にアップグレードするだけでは修正されません。既存のデータベースクラスタを修正するには、以下をスーパーユーザとして psqlで各データベースに対して実行してください。

    BEGIN;
    DROP SCHEMA information_schema CASCADE;
    i SHAREDIR/information_schema.sql
    COMMIT;
    

    SHAREDIR の部分は pg_config --sharedir コマンドで出力されるディレクトリで置換してください。

  3. 失敗したトランザクションの ROLLBACK を実行しようとしている間に発生するFATAL終了(たとえば SIGTERM による終了)のクリーンアップ処理を行うようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  4. この状況はアサート失敗に陥るかもしれませんでした。アサート無しのビルドでも、このような終了は起きますが、その場合「ERROR: cannot drop active portal ...」といった予期せぬメッセージがログ出力
    されていました。

  5. FATAL終了中に生じるかもしれないアサートが削除されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  6. 検索対象の、複合型またはドメイン型に対する、範囲型またはドメイン型の列を正しく認識するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  7. 複合型またはドメイン型の定義を変えるいくつかのALTERコマンドは、それらデータ型の値が何らかデータベースに格納されている場合に、これらの値を更新または検査するのに必要な基盤が欠けているため、失敗すると考えられます。

    これまでは、これらの検査は関連する内側の範囲型またはドメイン型でラップされた値を見逃すおそれがあり、データ不整合を許す可能性がありました。

    ドメイン型のドメイン型、複合型のドメイン型、ドメイン型の範囲型、といった組み合わせが本障害に該当するデータ型となります。

  8. 固定長リファレンス渡しのデータ型をパラレルワーカープロセスに渡すときのクラッシュが防止されました。 (Tom Lane) (9.6)
  9. パラレルモード(-j、--jobs オプション)で、リストアする要素の選択にリストファイルを使っている場合(-L、--use-list オプション)のpg_restore のクラッシュが修正されました。 (Fabrízio de Royes Mello) (9.6)(9.5)(9.4)(9.3)
  10. 付随する C変数無しの RETURNING句が扱えるように ecpg のパーサが変更されました。 (Michael Meskes) (9.6)(9.5)(9.4)(9.3)(9.2)
  11. これにより ecpgプログラムは、RETURNING句をクライアントに返される値を定義するためでなく、内部(例えば CTE内など)に使う SQL構文を含むことができます。

  12. Cプリプロセッサ制御行のバックスラッシュ継続を認識するようにecpg のパーサが変更されました。 (Michael Meskes) (9.6)
  13. Windows における PL/Perl むけコンパイラフラグの選択が改善されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  14. この修正により、time_t値の幅についての矛盾する仮定に基づく PL/Perl のクラッシュが回避されます。

    拡張モジュール開発者には気になるかもしれない副作用は、PostgreSQLのWindowsビルドにおいて、これからは _USE_32BIT_TIME_T がグローバルに定義されなくなることです。time_t型は PostgreSQL API定義では用いられていないため、このことが問題を起こすとは考えられません。

  15. GNU make 以外の make から実行されても正しく動作するようにmake check が修正されました。 (Thomas Munro) (9.6)(9.5)
  16. walsenderプロセスのシャットダウンシグナルに対する応答での障害が修正されました。 (Marco Nenciarini) (9.4)
  17. フラグ更新を取りこぼしていたため、シャットダウンシグナルを受けても接続しているスタンバイサーバがいる限り walsenderが稼動を続けていて、immediateモード以外のプライマリサーバのシャットダウンを妨げました。

PostgreSQL 9.6.4、9.5.8、9.4.13、9.3.18、9.2.22 の変更点


  1. ユーザマッピングオプションとして格納されたパスワードを保護するため、システムテーブル pg_user_mappings の umoptions列の可視性が厳格化されました。
  2. これまで、ユーザは関連する外部サーバに USAGE権限を持たなくとも、自身のユーザマッピングのオプションを参照できました。このようなオプションにはユーザ自身ではなく管理者によって設定されたパスワードが含まれているかもしれません。

    本バージョンアップは新たに initdb でデータベースクラスタを作るときの振る舞いを修正するだけです。既存のデータベースクラスタを修正するには、以下の手順を実行する必要があります。

    postgresql.conf で以下設定を与えて PostgreSQLサービスを再起動します。ALTER SYSTEM コマンドが利用可能なら、それを使っても良いです。

    allow_system_table_mods = true

    データベースクラスタ内の各データベースでスーパーユーザにて以下を実行します。

    SET search_path = pg_catalog;
    CREATE OR REPLACE VIEW pg_user_mappings AS
        SELECT
            U.oid       AS umid,
            S.oid       AS srvid,
            S.srvname   AS srvname,
            U.umuser    AS umuser,
            CASE WHEN U.umuser = 0 THEN
                'public'
            ELSE
                A.rolname
            END AS usename,
            CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
                         AND (pg_has_role(S.srvowner, 'USAGE')
                              OR has_server_privilege(S.oid, 'USAGE')))
                        OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
                        OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                        THEN U.umoptions
                     ELSE NULL END AS umoptions
        FROM pg_user_mapping U
             LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
            pg_foreign_server S ON (U.umserver = S.oid);
    

    このとき、template0 と template1 についても実行してください。さもなくば、新たにデータベースを作る度にその新たなデータベースに上記手順を実行してください。

    template0データベースに書き込みするには、接続可能ないずれかのデータベース上で以下のSQLを実行します。

    (9.5以降の場合)
    書き込み可能にする:
     ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
    書き込み不能に戻す:
     ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
    
    (9.4以前の場合)
    書き込み可能にする:
     UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
    書き込み不能に戻す:
     UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
    
    最後に allow_system_table_mods 設定を削除して、PostgreSQLサービスを再起動します。
    
  3. 全てのパスワードによる認証方式で空パスワードがサーバ側で禁止されました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
  4. libpq は md5 などのパスワードを使う認証方式について、空パスワード指定の場合には、これをサーバに送りません。そのため、ユーザのパスワードが空に設定されていた場合、psql や、その他の libpqベースのクライアントからパスワード認証で接続できません。これにより、管理者はユーザのパスワードを空にすることはパスワードを使った認証での接続を禁止するのに等しいと認識しているかもしれません。しかしながら、改造されているクライアントや libpqベースでないクライアントでは空パスワードでのログインは可能でした。

    本修正では、全ての場合で空パスワードをサーバが拒絶するように変更されました。(CVE-2017-7546)

  5. lo_put() 関数が対象ラージオブジェクトの UPDATE権限を検査するように修正されました。 (Tom Lane, Michael Paquier) (9.6)(9.5)(9.4)
  6. ラージオブジェクトに書き込みを行う SQL関数 lo_put() は、クライアントインタフェース向け関数 lowrite() と同様の権限が必要でしたが、検査が欠落していて、任意のユーザでラージオブジェクトのデータ変更が可能となっていました。(CVE-2017-7548)

  7. pg_upgrade でスタンバイサーバをアップグレードする手順についてドキュメントが修正されました。 (Bruce Momjian) (9.6)(9.5)
  8. これまでは、pg_upgrade を実行した後、スタンバイサーバをデータ同期する前に、wal_level設定を変更するためにプライマリサーバを起動停止するように記述していました。この手順は安全ではありません。

  9. タプル更新チェーンの同時ロックが修正されました (Álvaro Herrera) (9.6)(9.5)(9.4)(9.3)
  10. いくつかのセッションが同時にタプル更新チェーンを競合しないモードで古いスナップショットを使ってロックして成功した場合、結果として有効行が無い状態となるので、稀な状況においてエラーを起こすことがありました。

    その結果、参照先テーブルの該当行が同時更新されている場合に、該当行は在るにもかかわらず、それを参照する外部キー制約違反のエラーが発生しました。

  11. XMAXフィールドが未だ有効なメンバーを1つだけ持つ multixact として使われているタプルをフリーズするときにデータ破損の可能性があり、修正されました。 (Teodor Sigaev) (9.6)(9.5)(9.4)(9.3)
  12. メモリ内で 10億個以上のタプルをソートする際に、整数のオーバーフローやその後のクラッシュがあり、修正されました。 (Sergey Koposov) (9.6)(9.5)(9.4)
  13. Windows では、新しいプロセスで共有メモリのアドレス範囲を確保できない場合、プロセスの作成を再試行するようになりました。 (Tom Lane, Amit Kapila) (9.6)(9.5)(9.4)(9.3)(9.2)
  14. おそらくアンチウイルス製品により稀におきていた子プロセスの起動失敗が、これにより修正されると考えられます。

  15. Windowsビルドにおける、低い発生確率で生じる共有述語ロックハッシュテーブルの破損が修正されました。 (Thomas Munro, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  16. SSL接続を正常にクローズしたときに 非SSL接続と同様に特にログ出力しないように修正されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  17. SSLセッションチケットをクライアントに送信しないように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  18. この修正により、チケットを認識するクライアント側の SSLコードによる再接続の失敗を防止します。

  19. Solaris上の tcp_keepalives_idle設定に向けてコード修正が行われ、本設定が利用可能になりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  20. サービス(postmaster)のシャットダウンと即時再起動の直後に発行された問い合わせメッセージを無視しないように統計コレクタが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  21. シャットダウン後 0.5秒以内に発行された統計情報の問い合わせは、事実上無視されていました。

  22. 統計コレクタの受信バッファサイズが 100KB 以上になりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  23. これによりデフォルトの受信バッファサイズがこれよりも小さい古いプラットフォームで、統計情報データを取りこぼすリスクを軽減できます。

  24. 「XLOG_SWITCH」WALレコードを処理した直後にスタンバイが昇格したときに、無効な WALセグメントを作成しないように修正されました。 (Andres Freund) (9.6)(9.5)(9.4)(9.3)(9.2)
  25. クライアントがシャットダウンをリクエストしたときにすぐに終了するように、walsender が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  26. walsenderプロセスの SIGHUP と SIGUSR1 の処理が修正されました。 (Petr Jelinek, Andres Freund) (9.6)(9.5)(9.4)(9.3)(9.2)
  27. シャットダウンに伴うチェックポイント処理の間にwalsenderがパニックをひき起こすのが防止されました。 (Andres Freund, Michael Paquier) (9.6)(9.5)(9.4)
  28. マスタプロセス(postmaster)での競合状態による walreceiver の不必要に遅い再起動が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  29. ロジカルデコーディングの際にディスクにあふれ出す小さなサブトランザクションのリークが修正されました。 (Andres Freund) (9.6)(9.5)(9.4)
  30. 結果として一時ファイルでディスク領域が過度に消費されていました。

  31. ロジカルデコーディングスロットの作成中にスナップショットを作成するために必要な作業が削減されました。 (Andres Freund, Petr Jelinek) (9.6)(9.5)(9.4)
  32. 以前のアルゴリズムはオープンしているトランザクションが多いサーバ上では実行不能なほど高コストでした。

  33. ロジカルデコーディングスロット作成を遅延させる可能性のある競合状態が修正されました。 (Andres Freund, Petr Jelinek) (9.6)(9.5)(9.4)
  34. syscache無効化イベントの処理におけるオーバーヘッドが軽減されました。 (Tom Lane) (9.6)(9.5)(9.4)
  35. これは特に、頻繁にキャッシュ無効化を起こすロジカルデコーディングに有益です。

  36. 一部の場合に使われた外部キー制約の存在に基づいて結合の選択率を推定する誤ったヒューリスティックが削除されました。 (David Rowley) (9.6)
  37. 複数列の外部キー制約が存在していて、しかし、クエリの結合構造と完全に一致しない場合、プランナは全く役に立たないヒューリスティック推定を使用していました。このような場合に、9.6 より前の推定方法に戻されました。

  38. INSERT または UPDATE が、ドメイン型配列の複数の要素に値を割り当てる場合の問題が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  39. エラー発生例:
    db1=# CREATE DOMAIN d25 int[];
    db1=# CREATE TABLE t25 (c1 d25);
    db1=# INSERT INTO t25 (c1[1], c1[2]) VALUES (100, 200);
    ERROR:  multiple assignments to same column "c1"
    
    単なる配列型であれば実行できる:
    db1=# CREATE TABLE t25_2 (c1 int[]);
    db1=# INSERT INTO t25_2 (c1[1], c1[2]) VALUES (100, 200);
    db1=# SELECT * FROM t25_2;
        c1
    -----------
     {100,200}
    (1 row)
    
  40. 集約関数の引数内にある sub-SELECT でウィンドウ関数を使用できるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  41. 以下のような形の SQL がエラーになっていましたが本来制限されるものではありませんでした。

    db1=# SELECT sum((SELECT row_number() OVER () FROM t1 )) FROM t1;
    ERROR:  aggregate function calls cannot contain window function calls
    
    
  42. 元テーブルが外部テーブルの場合にビューの CHECK OPTIONS句が適切に実行されるようになりました。 (Etsuro Fujita) (9.6)
  43. 以前は、ビュー条件を確認する必要がある場合でも、確認せずに、更新を完全に外部サーバにプッシュしてしまう可能性がありました。

  44. ALTER ... RENAME実行時に、自動生成された配列型の列名を退避するようになりました。 (Vik Fearing) (9.6)(9.5)(9.4)(9.3)(9.2)
  45. 以前の修正では、CREATE実行時に競合する自動生成された配列型の名前を変更していました。本修正は以前の修正を名前変更操作に拡張したものです。

  46. テーブルの制約にコメントがある場合について、ALTER TABLEのダングリングポインタ障害が修正されました。 (David Rowley) (9.6)(9.5)
  47. 再作成した制約にコメントを再適用すると、奇妙なエラーメッセージ(現れ方は様々です)が表示されたり、クラッシュすることがありました。

  48. ALTER ROLE ... SET で実行できるすべての構文が ALTER USER ... SET でも実行できるようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
  49. 外部テーブルの CHECK制約を NOT VALID で初期化できるようになりました。 (Amit Langote) (9.6)
  50. CREATE TABLE は暗黙に CHECK制約に対する NOT VALID 指定を外します。作った時点ではテーブルは空なので制約は即座に検証済にできるからです。しかし、これは外部テーブルにはあてはまりません。

  51. データ型 I/O 関数の引数または戻り値の型を opaque から正しい型に変更するときに、依存関係情報が適切に更新されるようになりました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
  52. CREATE TYPE は以前から使われていないこのスタイルで宣言された I/O 関数を更新しますが、型に依存関係を記録することを忘れ、後続の DROP TYPE が関数定義を壊れたままにしていました。

  53. COPY がクエリの結果をコピーするときに、クエリプランが並列処理を許可するようになりました。 (Andres Freund) (9.6)
  54. ANALYZE が tsvector列を処理するときのメモリ使用量が削減されました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
  55. money型の値を整数または浮動小数点型の数で乗じたり除算したりするときに不必要な精度損失やいいかげんな丸めがあり、修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  56. 本修正を適用した結果、money型の値の演算結果(多くは末尾桁部分)が変わる可能性があります。

  57. regprocedurein() などの識別子を解析する関数の空白のチェックが厳格化されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  58. 広く使われているものを含め、ロケールによっては、これらの関数がマルチバイト文字の断片を空白として誤って解釈する可能性がありました。マルチバイトの識別子(テーブル名等)を使っている場合の問題となります。

  59. PL/Perlをコンパイルする際に、Perl由来の適切な #define シンボルを使用するようになりました。 (Ashutosh Sharma, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  60. これによって移植性の問題が回避されます。典型的には、最近の Perlバージョンで作業する場合、ライブラリの読み込み中にハンドシェイク不一致が表示されていました。

  61. libpq で接続に失敗した後に GSS/SASL と SSPI の認証状態が正しくリセットされるようになりました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)
  62. これを行わないと、SSL から non-SSL 接続へのフォールバック時に、SSL試行における GSS/SASLの失敗により常に非SSLの試行の失敗をひき起こしました。SSPIは失敗しませんでしたが、メモリがリークしました。

  63. キーボードの EOF 信号で COPY FROM STDIN が終了した後に、別の COPY FROM STDIN が試行されたときに発生する psql のエラーが修正されました。 (Thomas Munro) (9.6)(9.5)(9.4)(9.3)(9.2)
  64. この誤動作は、BSD プラットフォーム (macOS を含む) で観測されましたが、他のほとんどのプラットフォームでは検出されませんでした。

  65. pg_dump と pg_restore が REFRESH MATERIALIZED コマンドを最後に出力するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  66. 権限を与える命令よりも後ろにすることで、マテリアライズドビューが他ユーザが所有するテーブルを参照しているときの、ダンプ/リストアでのエラーを防ぎます。

  67. pg_dump/pg_restore の zlib に由来するエラー状況の報告が改善されました。 (Vladimir Kunschikov, Álvaro Herrera) (9.6)(9.5)(9.4)
  68. pg_dump の --clean オプションが期待されるイベントトリガを削除するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  69. また、イベントトリガの所有者を適切に割り当てるようになりました。これまではリストアスクリプトを実行したスーパーユーザが所有者になっていました。

  70. pg_dump の --clean オプションが修正されました。 (Stephen Frost) (9.6)
  71. publicスキーマが無い場合に失敗しないようになりました。

  72. pg_dump が空のオペレータクラスに対して無効な SQLを出力しないように修正されました。 (Daniel Gustafsson) (9.6)(9.5)(9.4)(9.3)(9.2)
  73. Windows での pg_dump の標準出力への出力が修正されました。 (Kuntal Ghosh) (9.6)(9.5)(9.4)(9.3)(9.2)
  74. ファイルディスクリプタをバイナリモードにしそこなっていたため、標準出力に書き出されたダンプに壊れたデータが含まれていました。圧縮されたプレーンテキスト(-Z -Fp オプション)を標準出力に書き出す(すなわち -f オプションではない)場合に該当します。

  75. SQL関数 pg_get_ruledef() が、後から名前変更された列を含むビューのON SELECT ルールを正しく出力するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  76. 一部の限られたケースで pg_dump がビューをダンプするのにpg_get_ruledef() 関数に依存することがありました。その場合、誤ったダンプ出力が生じて、リストア時に失敗してしまいます。

  77. 結合条件の記述を持たない外部結合のダンプが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  78. 共通列を持たない NATURAL LEFT JOIN で ON句を持たない定義になっていました。これは文法違反でエラーになります。

    誤動作例:
    db1=# CREATE TABLE t47_1 (id1 int, c1 int);
    db1=# CREATE TABLE t47_2 (id2 int, c2 int);
    db1=# CREATE VIEW v47 AS SELECT * FROM t47_1 NATURAL LEFT JOIN t47_2;
    db1=# q
    
    $ pg_dump -d db1 -t v47
      (出力中略)
    CREATE VIEW v47 AS
     SELECT t47_1.id1,
        t47_1.c1,
        t47_2.id2,
        t47_2.c2
       FROM (t47_1
         LEFT JOIN t47_2);
    
  79. FROM句の関数式のダンプが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  80. 関数呼び出しと似た形の式が正しく復元できませんでした。

    (例: FROM句の4つの式はいずれも正しくダンプできませんでした)
    CREATE VIEW v48 as
      SELECT * FROM
        COALESCE(1,2) AS c,
        COLLATION FOR ( 'x'::text ) col,
        CURRENT_DATE AS d,
        CAST( 1 + 2 as int ) AS i4;
    
  81. Windows で pg_basebackup の 標準出力への出力が修正されました。 (Haribabu Kommi) (9.6)(9.5)(9.4)(9.3)(9.2)
  82. ファイルディスクリプタをバイナリモードにしそこなっていたため、標準出力に書き出されたバックアップに壊れたデータが含まれていました。

  83. 2GB 以上のファイルを正しく扱えるように pg_rewind が修正されました。 (Kuntal Ghosh, Michael Paquier) (9.6)(9.5)
  84. 通常は PostgreSQLのデータディレクトリにこのようなファイルは現れませんが、一部の場合に存在する可能性があります。

  85. 末尾のWALレコードが wal_level = minimum にならないことを保証するように、pg_upgrade が修正されました。 (Bruce Momjian) (9.6)(9.5)(9.4)(9.3)(9.2)
  86. これはアップグレードされたスタンバイサーバが再接続するのを防ぎます。

  87. pg_xlogdump のWALレコード長の計算が修正されました。 (Andres Freund) (9.6)(9.5)
  88. 報告されるレコード長が誤っていました。

  89. postgres_fdw で ALTER SERVER および ALTER USER MAPPING コマンドの後にリモートサーバへの接続を再確立するようになりました。 (Kyotaro Horiguchi) (9.6)(9.5)(9.4)(9.3)
  90. これにより接続パラメータに影響するオプション変更が即座に反映されることを保証します。

  91. postgres_fdw で、リモートのトランザクション制御コマンドのキャンセルが可能になりました。 (Robert Haas, Rafia Sabih) (9.6)(9.5)(9.4)(9.3)
  92. 従来よりもより多くのケースで、応答しないリモートサーバの待機から迅速に抜け出すことができるようになります。

  93. 拡張モジュール向けにより多くの空間を提供するため、実装内の定数 MAX_SYSCACHE_CALLBACKS が 32 から 64 に変更されました。 (Tom Lane) (9.6)(9.5)(9.4)

  94. gcc で共有ライブラリをビルドするときに、常に -fpic ではなく -fPIC を使用するようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  95. 本変更は大きい拡張ライブラリのビルドを助けます。一部のプラットフォームで -fpic では大きい共有ライブラリにおいて失敗していました。

  96. MSVCビルドで opensslライブラリが VCサブディレクトリ内に無い場合を扱えるようになりました。 (Andrew Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)
  97. MSVCビルドで libxml2 ヘッダファイル向けの適切なインクルードパスが追加されました。 (Andrew Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)
  98. 本修正により、MSVCビルドで標準の libxml2 インストールの状態からファイルを移動する必要がなくなります。

  99. MSVCビルドで tcl86.lib という名前の Tclライブラリを認識するようになりました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
  100. MSVCビルドで vcregress.pl のコマンドラインでPROVE_FLAGS設定を尊重するようになりました。 (Andrew Dunstan) (9.6)(9.5)(9.4)
  101. Microsoft MSVC 向けのビルドスクリプトでエスケープされていないブレース({、})を出しているのが修正されました。 (Andrew Dunstan) (9.5)(9.4)(9.3)(9.2)
  102. これにより最近の Perlバージョンで警告やエラーが発生するのを回避します。

  103. 非常に幅が広いタプルでのロジカルデコーディングの障害が修正されました。 (Andres Freund) (9.4)
  104. 圧縮後、インラインデータで 64KB 以上のタプルにおいて、ロジカルデコーディングがクラッシュしていました。これは REPLICA IDENTITY FULL が有効なテーブルでのみ発生します。

PostgreSQL 9.6.3、9.5.7、9.4.12、9.3.17、9.2.21 の変更点


  1. ユーザマッピングオプションとして格納されたパスワードを保護するため、pg_user_mappings.umoptions の可視性が厳格化されました。 (Michael Paquier, Feike Steenbergen) (9.6)(9.5)(9.4)(9.3)(9.2)
  2. これまでの実装では、外部サーバオブジェクト所有者やサーバの USAGE 権限を付与されたユーザが、そのサーバに関連する全ユーザマッピングのオプションを見ることができました。これには他ユーザのパスワードもしっかり含まれているかもしれません。

    そこで、information_schema.user_mapping_options と振る舞いが一致するように pg_user_mappings ビューの定義が修正されました。すなわち、マップされているユーザであるか、PUBLIC へのマッピングで現在ユーザがサーバの所有者である、あるいは、現在ユーザがスーパーユーザのときに、ユーザマッピングオプションが見えるようになります。(CVE-2017-7486)

    本パッチでは、新たに initdb で作成されたデータベースクラスタについてのみ振る舞いを変更します。既存データベースクラスタに対して変更を適用するには、以下の手順を実施する必要があります。

    (1)

    postgresql.conf に「allow_system_table_mods = true」を加えた後、PostgreSQL サービス (postmaster) を再起動します (ALTER SYSTEM をサポートするバージョンであれば、それを使うこともできますが、いずれにせよ再起動は必要です)。

    データベースクラスタ内の各データベースで以下のコマンドをスーパーユーザで実行します。

    SET search_path = pg_catalog;
    CREATE OR REPLACE VIEW pg_user_mappings AS
        SELECT
            U.oid       AS umid,
            S.oid       AS srvid,
            S.srvname   AS srvname,
            U.umuser    AS umuser,
            CASE WHEN U.umuser = 0 THEN
                'public'
            ELSE
                A.rolname
            END AS usename,
            CASE WHEN (U.umuser <> 0 AND A.rolname = current_user)
                        OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
                        OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                        THEN U.umoptions
                     ELSE NULL END AS umoptions
        FROM pg_user_mapping U
             LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
            pg_foreign_server S ON (U.umserver = S.oid);
    

    (2)

    template0 と template1 に対しても対処が必要です。さもなくば後に新たに作ったデータベースには脆弱性が依然として存在することになります。template0 を修正するには、一時的に template0 を接続可能にする必要があります。

    PostgreSQL 9.5 以降では以下のコマンドが利用できます。

    template0 を接続可能にする:
    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
    
    template0 を接続不能に戻す:
    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
    

    より古いバージョンでは代替に以下コマンドを使います。

    template0 を接続可能にする:
    UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
    
    template0 を接続不能に戻す:
    UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
    

    (3)

    最後に allow_system_table_mods 設定を除去して、PostgreSQL サービス (postmaster) をもう一度再起動します。

  3. 情報を漏らす演算子を介した統計情報の露出を防止するようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
  4. いくつかのプランナの選択率見積り関数は、最頻値やヒストグラムの登録値など、pg_statistic から得られる値に対してユーザ定義演算子を適用します。この動作はテーブル権限が検査される前に生じるので、悪意のユーザが本来参照が許されていないテーブル列の値を取得するために、この振る舞いを悪用するおそれがありました。この対策として、演算子の実装関数が情報を漏らさないことが確実(LEAKPROOF属性が真)でなく、呼び出しているユーザが統計情報を必要とするテーブル列の読み取り権限を持っていない場合には、デフォルトの見積で代用するようになりました。実用上たいていのケースで、これら基準のうち少なくとも一つを満たします。(CVE-2017-7484)

  5. libpq で PGREQUIRESSL 環境変数を認識するように復旧されました。 (Daniel Gustafsson) (9.6)(9.5)(9.4)(9.3)
  6. この環境変数の処理が PostgreSQL 9.3 で意図せず欠落していましたが、ドキュメントには残っていました。ユーザが SSL 暗号化接続を強制させるために、機能しなくなっていた本環境変数を頼っているかもしれないため、セキュリティ上の危険が生じます。

    PGREQUIRESSL 環境変数の処理が復旧されました。しかし、9.3 以降で正しく動作していた設定を壊さないようにするため、PGSSLMODE よりも低い優先順位で扱われます。(CVE-2017-7485)

  7. ロジカルデコーディング中の無効であるかもしれない初期スナップショットについて修正されました。 (Petr Jelinek, Andres Freund) (9.6)(9.5)(9.4)
  8. ロジカルデコーディングのレプリケーションスロットむけに作られた初期スナップショットは不正なものである可能性がありました。これは、ロジカルデコーディングを使うサードパーティツールが不完全あるいは一貫性に欠ける初期データをコピーする原因となります。スロットを作るときにソースサーバが忙しい場合や、他のロジカルスロットが既に在った場合に発生しやすい動作です。

    ロジカルデコーディングに依存したレプリケーションツールを使っていて、それがレプリケーション開始時に空でないデータセットをコピーするのであれば、本アップデート導入後にレプリカを再作成するか、ソースサーバと比較してデータ検証することを推奨します。

  9. UNLOGGED インデックスの初期フォークが破損する可能性があり、修正されました。 (Robert Haas, Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  10. クラッシュと再起動の後に、無効な状態にセットされている UNLOGGED インデックスがもたらされる恐れがありました。この問題はインデックスを削除して再作成するまで持続します。

  11. スタンバイサーバが準備されたがコミットされていない 2 相トランザクションをリプレイしたときの pg_subtrans 項目の不正な再構築が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  12. たいていの場合、これは目に見える悪影響を及ぼしませんが、稀な場合に pg_subtrans の循環参照をもたらし、2 相トランザクションにより変更された行を検査する問い合わせで無限ループをひき起こす可能性があります。

  13. 文字列バッファの初期化失敗により、wal sender にてクラッシュする可能性が回避されました。 (Stas Kelvich, Fujii Masao) (9.6)(9.5)(9.4)
  14. GiST インデックスで index-only の最近傍検索を再スキャンする時にクラッシュする可能性があり、修正されました。 (Tom Lane) (9.6)(9.5)
  15. マスタプロセス (postmaster) による複数パラレルワーカプロセスの起動の遅延を防止するようになりました。 (Tom Lane) (9.6)
  16. 2 つ以上のワーカープロセスに向けた問い合わせの要求を満たす前に、あるいは複数問い合わせが同時にワーカーへ要求されたときに、著しい遅延(数十秒)が生じる可能性がありました。本現象は多くのプラットフォームでは不運なタイミングでのみ発生しますが、一部プラットフォームではよくあるケースです。

  17. マスタプロセス (postmaster) におけるバックグラウンドワーカプロセスに対する fork() 失敗時の処理が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  18. これまでは、プロセスが正常に起動されたかのようにワーカ状態の一部を更新していて、その後に混乱をひき起こしていました。

  19. 入れ子の集合演算のプラン作成で「ERROR: no relation entry for relid 0」が生じる可能性があり、修正されました。 (Tom Lane) (9.6)
  20. (障害が発生する SQL の例)
    db1=# (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6;
    ERROR:  no relation entry for relid 0
    
  21. パラレル問い合わせのプラン作成の各種の小さな問題が修正されました。 (Robert Haas) (9.6)
  22. プラン選択が不適切になる場合がありえました。

  23. カスタムスキャンに対して物理ターゲットリスト最適化の適用を回避するようになりました。 (Dmitry Ivanov, Tom Lane) (9.6)(9.5)
  24. この最適化はタプルの全ての列を取得するのが低コストでできることを想定しています。通常タプルにおいてはこれは真ですが、カスタムスキャンプロバイダーに対してはそうでないかもしれません。

  25. CREATE POLICY で「FOR ALL ...」を適用するとき、正しい副式を使うようになりました。 (Stephen Frost) (9.6)(9.5)
  26. 一部ケースで USING 制約がより適切であるときに WITH CHECK 制約が適用されました。

    修正前ではポリシーに反する値への更新、および更新後の値の返却が可能でした。以下例は修正後はエラーとなります。

    (誤動作例)
    db1=# CREATE POLICY alice_policy ON t TO alice
            USING (value > 0) WITH CHECK (true);
    db1=# SET session authorization alice;
    db1=# SELECT * FROM t;
     value
    -------
        1
    (1 rows)
    
    db1=# UPDATE t SET value = value * -1 WHERE value = 1 RETURNING *;
     value
    -------
       -1
    (1 row)
    
    UPDATE 1
    
  27. 拡張モジュールのスクリプトでの問い合わせパース処理において、直前の DDL 命令の結果を確実に把握するように修正されました。 (Julien Rouhaud, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  28. 拡張モジュールのスクリプトファイルのコマンド間では、キャッシュを更新する手順が欠けているので、ALTER TABLE ... RENAME ... などの DDLコマンドに続くDMLコマンドは直前の定義変更に気づかないかもしれませんでした。

    (例:以下のスクリプトで最後の UPDATE が失敗する可能性がありました)
    
    CREATE TABLE xxx_ext_table (col_old INT);
    ALTER TABLE xxx_ext_table RENAME col_old TO col_new;
    UPDATE xxx_ext_table SET col_new = 0;
    
  29. ALTER TABLE ... ALTER COLUMN TYPE で既存インデックスを再構築する場合に、テーブルスペース権限チェックを省略するようになりました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
  30. 本コマンドは、実行ユーザがその時点でインデックスが置かれているテーブルスペースに CREATE 権限を持っていないと失敗していました。この振る舞いは役に立たないと考えられ、検査を省略し、この場合にはインデックスを再構築できるようにしました。

  31. 制約が NO INHERIT であるときには、ALTER TABLE ... VALIDATE CONSTRAINT が子テーブルにまで再帰処理しないように修正されました。 (Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)
  32. この修正は、子テーブルに一致する制約が存在しないときに望まれない「ERROR: constraint does not exist」が生じるのを防ぎます。

  33. ソーステーブルの行単位セキュリティが有効のときに「COPY ... TO ...」でダングリングポインタを回避するように修正されました。 (Tom Lane) (9.6)(9.5)
  34. 通常は無害ですが、ときどき予期せぬエラーやクラッシュをひき起こしていました。

  35. CLUSTER および VACUUM FULL で、既に閉じたシステムキャッシュ (relcache) 項目へのアクセスを回避するように修正されました。 (Tom Lane) (9.6)(9.5)
  36. 運が悪いとき、本障害は対象テーブルのインデックスの誤った永続性設定 (UNLOGGEDか、TEMPORARYか、等) での再構築をひき起こす可能性がありました。

  37. ページピン (PIN) の競合によりスキャンできないページについて適切に計算するように VACUUM が修正されました。 (Andrew Gierth) (9.6)(9.5)(9.4)(9.3)(9.2)
  38. この障害により、テーブルタプル数の過小見積が生じがちでした。競合の多い小さいテーブルという最悪ケースでは、VACUUM がテーブルは0行であると誤って報告する可能性があり、非常に悪いプラン選択をもたらしました。

  39. ハッシュ結合の中での大量タプル転送のループ処理が問い合わせキャンセル要求で割り込み可能であることが保証されました。 (Tom Lane, Thomas Munro) (9.6)(9.5)(9.4)(9.3)(9.2)
  40. ハッシュ結合でキャンセルがすぐには効かない挙動が報告されていました。

  41. SP-GiST インデックスで、ある種の box 型への演算子における誤った対応が修正されました。 (Nikita Glukhov) (9.6)
  42. &<、&>、&<|、および、|&> 演算子を使う SP-GiST インデックススキャンは、誤った応答をもたらしていました。要素が接している場合の判定に影響があります。

  43. interval 型の比較における整数オーバーフロー問題が修正されました。 (Kyotaro Horiguchi, Tom Lane) (9.6)(9.5)(9.4)
  44. およそ 296000 年以上の時間間隔の場合に interval 型の比較演算子が誤った応答を返すおそれがありました。このような大きい値が含むカラムのインデックスは、インデックス内容が不正であるかもしれないので、バージョンアップ後にインデックス再作成すべきです。

    64bit 整数の日付時刻を使う方式(デフォルト)でビルドした場合に該当します。

  45. tableforest 引数が false のときに妥当な出力をするように cursor_to_xml() 関数が修正されました。 (Thomas Munro, Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
  46. これまでは、<table> 要素で括られず、<row> 要素の並びだけが出力されていました。

    (誤った出力例)
    db1=# DECLARE c CURSOR WITH HOLD FOR SELECT * FROM t1;
    db1=# SELECT cursor_to_xml('c'::refcursor, 2, true, true, '');
                            cursor_to_xml
    -------------------------------------------------------------
     <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+
       <id>1</id>                                               +
       <v>c4ca4238a0b923820dcc509a6f75849b</v>                  +
     </row>                                                     +
                                                                +
     <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+
       <id>2</id>                                               +
       <v>c81e728d9d4c2f636f067f89cc14862c</v>                  +
     </row>                                                     +
                                                                +
    
  47. float8_timestamptz() および make_interval() 関数における端数丸めの問題が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  48. これら関数は、浮動小数点の値から整数のマイクロ秒に変換するときに、丸めでなく、切り捨てを行っていました。これにより予期せぬ境界条件エラーをひき起こすおそれがありました。

    切捨てでなく C 言語関数 rint (最も近い整数値への丸め) を使うように実装が修正されました。

  49. pg_get_object_address() 関数が正しく演算子族のメンバーを処理するように修正されました。 (Álvaro Herrera) (9.6)(9.5)
  50. 非排他バックアップを停止しようとしたときの pg_stop_backup() 関数のキャンセルについて修正されました。 (Michael Paquier, David Steele) (9.6)
  51. 非排他バックアップが終了するのを待つ間に pg_stop_backup() 関数がキャンセルされた場合、関連する状態が不整合状態になり、新たな非排他バックアップを開始できない可能性がありました。また、その他の細かな問題もありました。

  52. pg_timezone_names ビューの性能が改善されました。 (Tom Lane, David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)
  53. メモリコンテキストに多数の大きいブロックが含まれる場合に、メモリ管理のオーバーヘッドが軽減されました。 (Tom Lane) (9.6)(9.5)(9.4)
  54. lseek() と close() の稀な場合に生じるエラーに対する処理がより厳格に修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  55. どちらも通常ではあまり失敗しないシステムコールですが、失敗した場合にはかなり混乱するおそれがありました。

  56. マスタプロセス (postmaster) が Windows サービスとして実行されているかの検査が誤っており、修正されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  57. 本障害はアクセス不能であるときにイベントログに書き出しを試みて、全くログが書かれない結果をひき起こしました。

  58. ecpg が COMMIT PREPARED と ROLLBACK PREPARED に対応するように修正されました。 (Masahiko Sawada) (9.6)(9.5)(9.4)(9.3)(9.2)
  59. ecpg で $ でクォートされた文字列リテラルを処理する際の二重解放エラーが修正されました。 (Michael Meskes) (9.6)(9.5)(9.4)(9.3)(9.2)
  60. 起こりうるのは ecpg コマンドのクラッシュです。

  61. pgbench が --connect オプションと --rate オプションの組み合わせを正しく処理するように修正されました。 (Fabien Coelho) (9.6)
  62. pgbench がドキュメント記載されている --builtin という長い形式のオプションを無視しないように修正されました。 (Tom Lane) (9.6)
  63. pg_dump/pg_restore が --clean オプションを使ったときに public スキーマの権限を正しく処理するように修正されました。 (Stephen Frost) (9.6)
  64. 他のスキーマは権限が与えられない状態から始まりますが、public スキーマはそうではありません。--clean オプションのために削除とリストアを行うときには特別な対応が必要でした。

  65. pg_dump でコメントとセキュリティラベルに対する誤ったラベル付けが修正されました。 (Giuseppe Broccolo, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  66. 単純な使い方の場合には悪影響はありませんが、スキーマを指定したリストアで含まれるべきコメントが無視される可能性がありました。これはダンプ時にそれらが関連するオブジェクトのスキーマに属するという印付けがされなかったためです。

  67. pg_dump の手続き言語の初期権限のための問い合わせのタイプミスが修正されました。 (Peter Eisentraut) (9.6)
  68. 本障害により pg_dump は常に手続き言語は初期権限を持たないとみなしていました。ほとんどの手続き言語は実際のところそうであるため、本障害による悪影響はおそらく稀です。

  69. pg_restore -l で SQL オブジェクト名に改行が含まれるときに、無効なリストファイルが出力されるのを回避するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  70. pg_upgrade がラージオブジェクトに付けられたコメントとセキュリティラベルを移行するように修正されました。 (Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)
  71. これまでもラージオブジェクトは新データベースに正しく移行されていましたが、付加されたコメントとセキュリティラベルが失われていました。

  72. contrib/adminpack の pg_file_write() 関数のエラー処理が改善されました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
  73. 特に fclose() で報告されたエラーを検知できていませんでした。

  74. contrib/dblink で、新たな無名接続を確立するときの前の無名接続のリークが回避されました。 (Joe Conway) (9.6)(9.5)(9.4)(9.3)(9.2)
  75. contrib/pg_trgm の正規表現からのトリグラム展開が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  76. 一部のケースで何にもマッチできない壊れたデータ構造が生み出され、トリグラムインデックスを使う GIN または GiST のインデックススキャンが正規表現へのマッチを何も見つけられない結果(誤った応答)になります。

    (誤動作例:pg_trgm インデックスを使うと結果が 0 件になってしまう)
    db1=# CREATE TABLE ttrig (id int primary key, txt text);
    db1=# INSERT INTO ttrig SELECT g, md5(g::text) FROM generate_series(1, 10000) g;
    db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}';
     count
    -------
        55
    (1 row)
    
    db1=# CREATE INDEX trgm_idx ON ttrig USING gist (txt gist_trgm_ops);
    db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}';
     count
    -------
         0
    (1 row)
    
  77. contrib/postgres_fdw で送出可能な拡張モジュールで提供される関数を含む結合条件をリモートサーバ側で実行させる (プッシュする) ことが可能になりました。 (David Rowley, Ashutosh Bapat) (9.6)
  78. (Windows の) MSVC ビルドで Tcl 8.6 がサポートされました。 (Álvaro Herrera) (9.6)(9.5)(9.4)(9.3)(9.2)
  79. タイムゾーンライブラリが IANA release tzcode2017b に更新されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  80. 2038 年 1 月の夏時間の遷移に影響を及ぼすバグが修正されています。

  81. タイムゾーンデータファイルが tzdata release 2017b に更新されました。 (9.6)(9.5)(9.4)(9.3)(9.2)
  82. チリ、ハイチ、モンゴルの夏時間法の変更、エクアドル、カザフスタン、リベリア、スペインの歴史的修正が含まれます。南米、太平洋、インド洋、および、一部アジア・中東の国々における多数のタイムゾーンが、数字による省略形に切り替えられました。

    IANA タイムゾーンデータベースはこれまで文字による省略形を全てのタイムゾーンに提供していて、ときに地元住民の間でほとんどあるいは全く使われない省略形を作成していました。IANA は英語の省略形が現実に使われている形跡がないゾーンにおいては UTC オフセット数値を使うことを選ぶという方針に転換しようとしてるところです。少なくともしばらくの間、PostgreSQL はタイムスタンプの入力に、このような削除された省略形を引き続き受け入れます。しかし、それらは pg_timezone_names ビューには現れず、出力にも使用されなくなります。

  83. (Windows の) MSVC ビルドにおいて、POSIX 形式のタイムゾーン名に対して正しい夏時間規則を使うようになりました。 (David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)
  84. Microsoft の MSVC ビルドスクリプトは posixrules ファイルをタイムゾーンディレクトリツリーにインストールするのを怠っていました。この結果、POSIX 形式のタイムゾーン名に対し想定される夏時間の振る舞いについて、タイムゾーンコードがビルトインの規則に戻ってしまっていました。

    歴史的な理由により、その組み込み規則は、米国が2007年より前に使っていた夏時間規則(すなわち、4月最初の日曜日と 10月最終の日曜日の変更)に引き続き対応しています。この修正にともない、POSIX 形式のゾーン名は US/Eastern ゾーンの現在および歴史的夏時間遷移日を使います。そのようにしたくない場合には、posixrules ファイルを削除するか、他のゾーンファイルのコピーで置き換えてください。変更を反映させるにはサーバ (サービス) の再起動が必要です。

  85. GROUPING SET 列のデータ型がハッシュ可能だけれどソート不能であるときのクラッシュまたは誤った応答が修正されました。 (Pavan Deolasee) (9.5)
  86. たとえば xid 型がハッシュ可能でソート不能です。

  87. contrib/postgres_fdw で、リモートサーバに問い合わせキャンセル要求を送出するようになりました。 (Michael Paquier, Etsuro Fujita) (9.5)(9.4)(9.3)
  88. これまではローカルでの問い合わせキャンセル要求が、既に送ったリモート問い合わせを早く終わらせることはありませんでした。これは 9.6 で修正された内容のバックポートです。

  89. OpenSSL 1.1.0 に対応しました。 (Heikki Linnakangas, Andreas Karlsson, Tom Lane) (9.4)(9.3)(9.2)
  90. 9.5 以降のバージョン系列で既に対応している内容のバックポートです。多数のプラットフォームが新たな OpenSSL バージョンを取り込みつつあるので、必要となりました。

PostgreSQL 9.6.2、9.5.6、9.4.11、9.3.16、9.2.20 の変更点


  1. CREATE INDEX CONCURRENTLY によるインデックス作成で破損したインデックスをもたらす可能性のある競合状態が修正されました。 (Pavan Deolasee, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  2. 以前にはインデックスされていなかった列にかかっているインデックスを作るのに CREATE INDEX CONCURRENTLY が使われていたなら、同時実行のトランザクションに更新された行は、誤ったインデックスエントリを受け取るおそれがありました。

    CREATE INDEX CONCURRENTLY を使って作成されたインデックスを、バージョンアップ後に再作成することを推奨します。

  3. システムテーブルのスキャンに使われる特別なスナップショットが、早すぎるデータ除去処理により無効になることが無いように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  4. バックエンドが自身の最も古いxminを知らせるときにこのスナップショットを考慮しておらず、潜在的に未だ必要なデータを削除する並列のバキューム操作を許していました。

    この障害は接続時に「FATAL: cache lookup failed for relation 1255」を発生させました。

  5. BRIN インデックスの誤った WAL 出力が修正されました。 (Kuntal Ghosh) (9.6)(9.5)
  6. インデックスタプルを異なるページに移動するとき、BRIN の範囲マップページ (revmap page) むけに出力された WALレコードが不正でした。その WAL をリプレイすると、インデックスの関連する部分は使い物にならず、再計算を強いられます。

  7. 無条件に UNLOGGED テーブルの初期フォーク生成の WAL 出力をするようになりました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  8. これまでは wal_level = minimal のときには省略されていましたが、実際にはこの場合でもクラッシュ後リカバリにて確実に正しく UNLOGGED テーブルを空に初期化するために必要でした。

  9. 統計情報収集器 (stats collector process) が、ホットスタンバイ動作中に落ちたときにも再起動されるようになりました。 (Takayuki Tsunakawa) (9.6)(9.5)(9.4)(9.3)(9.2)
  10. これまでは子プロセス自動再起動の仕組みから抜け落ちていて、ホットスタンバイサーバでプロセスが非正常に終了すると終了したままになっていました。

  11. スタンバイサーバ開始時に有効であったときに hot_standby_feedback 設定による動作が確実に正しく動作するようになりました。 (Ants Aasma, Craig Ringer) (9.6)(9.5)(9.4)(9.3)
  12. スタンバイサーバで設定を on に変更して reload でなくサーバ再起動した場合に必要な初期化が行われませんでした。

  13. ホットスタンバイが衝突している問い合わせを待機している間、割り込みのチェックをするようになりました。 (Simon Riggs) (9.6)(9.5)(9.4)(9.3)(9.2)
  14. 稀なケースで恒常的に autovacuum launcher プロセスが再生成される動作を回避するようになりました。 (Amit Khandekar) (9.6)(9.5)(9.4)(9.3)(9.2)
  15. autovacuum = off が設定されていて、XID 凍結が必要なテーブルがいくつかあって、それらのテーブルは既に autovacuum worker で処理中であるときに、問題の動作が生じます。

  16. synchronous_standby_name で同期スタンバイの数に 0 を許さないようになりました。 (Fujii Masao) (9.6)
  17. 同期スタンバイを 0 個にしたい場合には設定値全体に空文字列を与えてください。

  18. ユーザ毎の接続数上限にバックグラウンドワーカプロセスを数えないようになりました。 (David Rowley) (9.6)
  19. 振る舞いが変更されたのは max_connections 設定による上限ではなく、ALTER ROLE ... CONNECTION LIMIT ... コマンドによる接続数上限です。

  20. 拡張モジュールの要素オブジェクトが削除できる場合のチェックが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  21. 拡張モジュールのアップグレードスクリプトは要素オブジェクトを削除できなければいけませんが、serial 型に付随するシーケンスについてそれができませんでした。

  22. ALTER EXTENSION ... ADD/DROP コマンドにて正しく動作するように、拡張モジュールの要素オブジェクトの初期権限の探知が修正されました。 (Stephen Frost) (9.6)
  23. 修正により、オブジェクトが拡張モジュールに追加された時点の権限は、そのデフォルト権限と見做され、後の権限変更だけが以降の pg_dump 実行でダンプされるようになります。拡張モジュールに属するオブジェクトへの権限付与が正しくダンプされない問題が報告されていました。

  24. インデックス再作成を伴う ALTER TABLE コマンドで、インデックスのテーブルスペース割り当てを確実に維持するように修正されました。 (Tom Lane, Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  25. これまで、ALTER TABLE ... ALTER TYPE を実行して、インデックス再作成が生じた場合、元のテーブルスペースではなく、その時点の default_tablespace 設定やデータベースのデフォルトに基づいたテーブルスペース上で再作成が行われました。さらに使用するテーブルスペースがシステムテーブルの情報と一致しないため、当該インデックスがアクセス不能になり、SQL 問い合わせに以下エラーが生じることがありました。

    ERROR:  could not open file "pg_tblspc/16567/PG_9.6_201701011/16456/16789":
    No such file or directory
    
  26. ALTER TABLE ... ALTER CONSTRAINT で外部キー制約が遅延可能かを変更するときのトリガ関数プロパティの誤った更新が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  27. その後のトリガ駆動時に奇妙な失敗をひき起こすおそれがあります。トリガが働く SQL 実行時に、以下のエラーが出る障害動作が報告されました。

    ERROR:  AfterTriggerSaveEvent() called outside of query
    
  28. 被参照テーブルに対する保留トリガイベントがあるときに外部キー制約を削除しないように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  29. 保留トリガイベントとはトランザクション末尾で処理をすることになっている延期されたトリガ処理を指します。以下の操作でエラーが出るようになりました。

    db1=# BEGIN;
    db1=# SET CONSTRAINTS ALL DEFERRED ;
    db1=# INSERT INTO t15 VALUES (1); -- DEFERRABLEなトリガを駆動する操作
    
    db1=# ALTER TABLE t15 DROP CONSTRAINT fk_t15_c1_fkey;
    ERROR:  cannot ALTER TABLE t15 because it has pending trigger events
    

    以前は制約の削除は成功し、COMMIT 時になって以下エラーが出ていました。

    ERROR:  could not find trigger NNN
    または
    ERROR:  relation NNN has no triggers
    
  30. 子テーブルが親テーブルと異なる列順である場合の ALTER TABLE ... SET DATA TYPE ... USING ... コマンドの動作が修正されました。 (Álvaro Herrera) (9.6)(9.5)
  31. エラーが発生することがありました。典型的には以下エラーが生じます。

    ERROR:  attribute N has wrong type
    
  32. WITH OIDS 指定のテーブルが、同じくWITH OIDS 指定の親テーブルと ALTER TABLE ... INHERIT コマンドで関連づけられた場合の、OID 列の処理が修正されました。 (Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)
  33. この場合 OID 列は通常のユーザ定義列と同様に扱われるべきでしたが、そうなっておらず、後の継承の変更で奇妙な振る舞いをひき起こしました。

    (修正前の動作例: 親テーブルから列の除去は可能だが、OID 除去はエラーになっている)
    db1=# CREATE TABLE t17c (a int, b int) WITH """""""""""""""""""""""""""""""""""""""""""OIDS;
    db1""""""""""""""""""""""""""""""""""""""""""" =# CREATE TABLE t17p (a int, b int) WITH """""""""""""""""""""""""""""""""""""""""""OIDS;
    db1""""""""""""""""""""""""""""""""""""""""""" =# ALTER TABLE t17c INHERIT t17p;
    db1=# ALTER TABLE t17p DROP a;
    db1=# ALTER TABLE t17p SET WITHOUT OIDS;
    ERROR:  relation 16678 has non-inherited attribute "oid"
    
  34. CREATE TABLE ... LIKE ... WITH OIDS コマンドが、LIKE で参照されるテーブルに OID がある無しにかかわらず、確実にテーブルを WITH OIDS で作成するように修正されました。 (Tom Lane) (9.6)
  35. LIKE を伴ったときに作られるテーブルが WITH OIDS にならない場合がありました。

  36. 先にビュー問い合わせを置き換えてから、新しいビューオプションを適用するように、CREATE OR REPLACE VIEW コマンドを修正しました。 (Dean Rasheed) (9.6)(9.5)(9.4)
  37. これまでは以下のように元のビュー問い合わせには適合しないオプションを与えたときにエラーが生じていました。

    db1=# CREATE TABLE t19 (a int, b text);
    db1=# CREATE VIEW v19 AS SELECT null::int AS a;
    db1=# CREATE OR REPLACE VIEW v19
            AS SELECT * FROM t19 WHERE a > 0 WITH CHECK OPTION;
    ERROR:  WITH CHECK OPTION is supported only on automatically updatable views
    HINT:  Views that do not select from a single table or view are not
    automatically updatable.
    
  38. ALTER TEXT SEARCH CONFIGURATION のとき、正しい OID を報告するようになりました。 (Artur Zakirov) (9.6)(9.5)(9.4)(9.3)
  39. これまでイベントトリガに誤ったカタログ OID が報告されてました。

  40. コミットタイムスタンプの仕組みが、特別 XID の FrozenTransactionId (=2) と BootstrapTransactionId (=1) について問われた時に失敗しないように修正されました。 (Craig Ringer) (9.6)(9.5)
  41. 以下の関数呼び出しがエラーを出さず、NULL を返すようになります。

    (修正前の動作例)
    db1=#  SELECT pg_xact_commit_timestamp('1'::xid);
    ERROR:  cannot retrieve commit timestamp for transaction 1
    db1=#  SELECT pg_xact_commit_timestamp('2'::xid);
    ERROR:  cannot retrieve commit timestamp for transaction 2
    
  42. ビューの reloptions を通常テーブルの reloptions のように誤用していたのが修正されました。 (Tom Lane) (9.6)(9.5)
  43. 症状としては、以下例のような問い合わせで、実際には問題ないにも拘らず「ERROR: ON CONFLICT is not supported ...」エラーが出ることです。

    (修正前のエラー例)
    db1=# CREATE TABLE t22 (f1 int PRIMARY KEY, f2 text);
    db1=# CREATE VIEW v22  AS SELECT * FROM t22 WITH CASCADED CHECK OPTION;
    
    db1=# INSERT INTO v22 VALUES (1,'foo')
            ON CONFLICT (f1) DO UPDATE SET f2 = excluded.f2;
    
    ERROR:  ON CONFLICT is not supported on table "v22" used as a catalog table
    LINE 1: insert into v22 values (1,'foo') on conflict (f1) do update ...
    
  44. ON CONFLICT 構文を列数が多いテーブルに使った際に発生する障害が修正されました。 (Tom Lane) (9.6)(9.5)
  45. 実際には列数上限の半分程度であるのにエラーが生じました。

    (修正前の障害動作例)
    db1=# INSERT INTO t23 VALUES (<<...831個の値...>>)
            ON CONFLICT (id) DO UPDATE SET <<...830個の代入式...>>;
    ERROR:  target lists can have at most 1664 entries
    
  46. 削除した列を伴うテーブルに対する INSERT または UPDATE で、削除された列への値が供給されたという偽性のエラーが生じることがあり、修正されました。 (Tom Lane) (9.6)
  47. (障害動作例)
    db1=# CREATE TABLE t24 (c1 int, c2 int);
    db1=# ALTER TABLE t24 DROP c2;
    db1=# CREATE FUNCTION f24(do_update boolean)
            RETURNS void LANGUAGE sql VOLATILE AS $$
              UPDATE t24 SET c1 = NULL WHERE do_update; $$;
    db1=# SELECT f24(false);
    ERROR:  table row type and query-specified row type do not match
    DETAIL:  Query provides a value for a dropped column at ordinal position 2.
    CONTEXT:  SQL function "f24" statement 1
    
  48. UPDATE の SET 句の代入元の式で foo.* の複数カラム展開が防止されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
  49. 以下のような奇妙なエラーメッセージが生じていました。修正によりレコード型であることを認識するようになりました。

    (障害動作例)
    db1=# CREATE TABLE t25 (id int primary key, c1 int, c2 int);
    db1=# INSERT INTO t25 VALUES (1, 100, 100);
    db1=# UPDATE t25 SET c1= t25.*;
    ERROR:  UPDATE target count mismatch --- internal error
    
    (正しいエラー)
    ERROR:  column "c1" is of type integer but expression is of type record
    
  50. 複数行 VALUES 値に対して精密に列データ型修飾が決定されるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  51. これまでは、最初のデータでデータ型修飾を決めていて、以下例のような奇妙なデータが作れてしまいました。

    db1=# CREATE TABLE t26 AS SELECT * FROM (
            VALUES ('ABCDE'::varchar(5)), ('01234567890')
            ) v (string);
    db1=# d t26
                Table "public.t26"
     Column |         Type         | Modifiers
    --------+----------------------+-----------
     string | character varying(5) |
    
    db1=# SELECT * FROM t26;
                  string
    ----------------------------------
     ABCDE
     01234567890
    (2 rows)
    
  52. 文字列末尾で完結していないユニコードのサロゲートペアについてエラーを投げるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  53. 本来はユニコードのサロゲートペアの先頭文字には末尾文字が続かなければいけませんが、先頭文字がユニコードリテラル(U&'....' や U&"....")で文字列末尾にあらわれた場合にチェック漏れがあり、データ投入等ができてしまいました。

    (修正後に正しくエラーが出る例)
    db1=# INSERT INTO t27 VALUES (U&'d80d');
    ERROR:  invalid Unicode surrogate pair at or near "'"
    LINE 1: INSERT INTO t27 VALUES (U&'d80d');
    
  54. 同じ列を対象にした複数の順序集約があって遷移状態が共有できる場合の、DISTINCT と順序集約の実行が修正されました。 (Heikki Linnakangas) (9.6)
  55. そのような SQL 処理でクラッシュをひき起こすことがありました。

  56. tsquery のフレーズ検索演算子の実装が修正されました。 (Tom Lane) (9.6)
  57. フレーズ演算子と組み合わせて &、|、! 演算子が使われている場合に、これまで奇妙な検索結果を返したり、クラッシュをひき起こすことがありました。

    誤動作例を示します。一つ目は q の後に x z または y z が続くという意味なので、True にならなければいけません。二つ目は x 以外の後に y が続くパターンが含まれるかどうかですから True にならなければいけません。

    (修正前の誤った動作例)
    db1=# SELECT to_tsvector('simple', 'q y z') @@ 'q <-> (x | y <-> z)';
     ?column?
    ----------
     f
    (1 row)
    
    db1=# SELECT to_tsvector('simple', 'x y q y') @@ '!x <-> y';
     ?column?
    ----------
     f
    (1 row)
    
  58. 空文字列に対して否定テキスト検索がマッチするようになりました。 (Tom Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)
  59. これまで GIN インデックス検索ではマッチしましたが、シーケンシャルスキャンや GiST インデックス検索の際にはマッチしませんでした。

    (修正前の例: 以下は t が返るようになります)
    db1=# SELECT to_tsvector('simple', '') @@ '!foo';
     ?column?
    ----------
     f
    (1 row)
    
  60. ts_rewrite() が非トップレベルのサブツリーを空クエリで置き換えた際のクラッシュが防止されました。 (Artur Zakirov) (9.6)(9.5)(9.4)(9.3)(9.2)
  61. (クラッシュが起きる例)
    db1=# SELECT ts_rewrite(to_tsquery('5 & (6 | 5)'),
                            to_tsquery('5'), to_tsquery(''));
    NOTICE:  text-search query doesn't contain lexemes: ""
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
  62. ts_rewrite() の性能問題を修正しました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  63. 引数に与える内容の規模が大きいと非常に遅くなるのが改善されました。また、処理中に中断できる箇所を増やしました。

  64. ts_rewrite() の入れ子になった NOT 演算子の扱いが修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  65. 間違った結果を返すことがありました。

    (修正前の誤った結果)
    db1=# SELECT ts_rewrite(
            ts_rewrite('new & !york ', 'york', '!jersey'), 'jersey', 'mexico');
        ts_rewrite
    -------------------
     'new' & !'mexico'
    (1 row)
    
    (正しい結果)
         ts_rewrite
    --------------------
     'new' & !!'mexico'
    (1 row)
    
  66. 遷移関数に array_append() を使うユーザ定義集約の速度が改善されました。 (Tom Lane) (9.6)(9.5)
  67. array_fill() が空配列を適切に扱えるように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  68. 以下のように array_fill() で長さゼロの空配列を作った結果、0 次元になっておらず '{}' と一致しない動作がありました。

    (修正前の誤った動作例)
    db1=# SELECT a, a = '{}' AS is_eq, array_dims(a)
            FROM (SELECT array_fill(NULL::int, array[0]) as a) ss;
     a  | is_eq | array_dims
    ----+-------+------------
     {} | f     | [1:0]
    (1 row)
    
  69. レコードの配列を処理するときに、array_position() および array_positions() でクラッシュの可能性があり、修正されました。 (Junseok Yang) (9.6)(9.5)
  70. (クラッシュをひき起こす例)
    db1=# SELECT array_position(ids, (1, 1)),
                 array_positions(ids, (1, 1))
            FROM (VALUES (ARRAY[(0, 0), (1, 1)]),
                         (ARRAY[(1, 1)])        ) AS f (ids);
    
  71. 内部実装関数 quote_literal_cstr() における 1 バイトのバッファオーバーランが修正されました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)
  72. quote_literal_cstr() は format() 関数などで使われています。入力がシングルクオートとバックスラッシュだけから構成されている場合にのみ発生します。

    以下のような不明な警告が出ることがありました。

    db1=# SELECT format('%L', E'¥¥');
    WARNING:  detected write past chunk end in ExprContext 0x55c65ff98fa8
     format
    --------
     E'¥¥'
    (1 row)
    
  73. pg_start_backup() と pg_stop_backup() が複数並行で実行されるのが防止されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
  74. 本修正は、これらの関数の並列実行が試みられた際に、アサートエラーや不正な動作が生じるのを回避します。

  75. 何もしない AT TIME ZONE による変換を取り除こうとする書換えを使用しないようになりました。 (Tom Lane) (9.6)(9.5)
  76. 何もしない AT TIME ZONE による変換とは、元々 UTC での値が格納された timestamp with time zone 型のデータに AT TIME ZONE 'utc' として、timestamp without time zone 型のデータに変換する、などを指します。問い合わせで不適切なインデックス利用が生じて誤った結果が返る可能性がありました。

  77. 実際に何もしないわけではない interval 型から interval 型へのキャストを無効にしないようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  78. 一部ケースで、低位フィールドをゼロにすべきキャストについて誤って何もしなくてよいと見なされました。

    (9.4.10 で報告された誤動作例 - 秒以下が切り捨てられるのが正しい)
    db1=# SELECT x.y :: interval day to minute,
                 (interval '02:47:15.375721') :: interval day to minute
                 FROM (VALUES (interval '02:47:15.375721')) x (y);
            y        | interval
    -----------------+----------
     02:47:15.375721 | 02:47:00
    
  79. パラレルクエリに利用できるワーカ数が再スキャン中に減った場合のクラッシュが修正されました。 (Andreas Seltenreich) (9.6)
  80. パラレルワーカに GUC パラメータを送るときの障害が修正されました。 (Michael Paquier, Tom Lane) (9.6)(9.5)
  81. set_config() 関数をパラレル実行させた際にクラッシュする事例が報告されました。

  82. PREPARE コマンドで作られたプリペアドステートメントでもパラレルプランを得られるようになりました。 (Amit Kapila, Tobias Bussmann) (9.6)
  83. これまでは PostgreSQL プロトコルの Parse メッセージで作られたプリペアドステートメントだけ対応していました。

  84. semi-join むけの誤ったパラレルプラン生成が修正されました。 (Tom Lane) (9.6)
  85. ... WHERE EXISTS (...) 等を使った semi-join をともなう SQL において、パラレルプランで実行した場合に誤った結果が返ることがありました。

  86. プランナのパラレル結合むけの値の種類数の見積が修正されました。 (Robert Haas) (9.6)
  87. これらの見積が確実に(全体の値ではなく)各ワーカごとの予測行数を反映するようにされました。

  88. プランナが初期プランやサブプランを含むプランノードをパラレル化しようとしないように修正されました。 (Tom Lane, Amit Kapila) (9.6)
  89. 比較的複雑なサブクエリを伴う SQL で、パラレル実行させた場合にアサートエラーが生じる例が報告されていました。

  90. 外部テーブルオプションの変更により、キャッシュされたプランが確実に無効化されるようになりました。 (Amit Langote, Etsuro Fujita, Ashutosh Bapat) (9.6)(9.5)(9.4)(9.3)
  91. 「ALTER FOREIGN TABLE ... OPTIONS (...)」で外部テーブルが参照するリモートのスキーマ、テーブルを変えた場合にもプランが更新されませんでした。

    (障害動作例)
    db1=# CREATE FOREIGN TABLE ft (c1 integer, c2 varchar) SERVER link_server
            OPTIONS (schema_name 's1', table_name 't1');
    db1=# PREPARE stmt_ft AS SELECT c1,c2 FROM ft;
    db1=# EXECUTE stmt_ft;
     c1 |  c2
    ----+-------
      1 | s1.lt
    (1 row)
    
    db1=# ALTER FOREIGN TABLE ft OPTIONS
            (SET schema_name 's2', SET table_name 'lt');
    db1=# ANALYZE;
    db1=# EXPLAIN (COSTS OFF, VERBOSE) EXECUTE stmt_ft;
                   QUERY PLAN
    ----------------------------------------
     Foreign Scan on public.ft
       Output: c1, c2
       Remote SQL: SELECT c1, c2 FROM s1.lt
    (3 rows)
    
  92. 定数の GROUP BY句 を伴うソートされた部分集約むけに生成されたプランが修正されました。 (Tom Lane) (9.6)
  93. そのような SQL 実行に対して奇妙なプランナエラー「ERROR: invalid attnum: 0」が出る例が報告されました。

  94. CTE 参照を含む UNION ALL を処理する際に「ERROR: could not find plan for CTE "..."」エラーが出るのが修正されました。 (Tom Lane) (9.6)
  95. (障害動作例: 1 と 2 の最大値なので 2 が返るのが正しい)
    db1=# WITH i(x) AS (VALUES (1::int)), j(y) AS (VALUES (2::int))
           SELECT max(x) FROM (SELECT x FROM i UNION ALL SELECT y FROM j) b;
    ERROR:  could not find plan for CTE "i"
    
  96. Material ノードを強制的にサブプランに加えるときの initplan の誤操作が修正されました。 (Tom Lane) (9.6)
  97. 以下の形状の SQL で障害が報告されました。

    SELECT 1 IN (SELECT (SELECT 1));
    SELECT 1 = ANY (SELECT (SELECT 1));
    SELECT 1 = ALL (SELECT (SELECT 1));
    

    本障害により典型的にはエラー「ERROR: plan should not reference subplan's variable」が生じます。

  98. semi-join、anti-join に対する外部キーに基づく結合の選択率見積が修正されました。同様に継承の場合も修正されました。 (Tom Lane) (9.6)
  99. 外部キーを考慮にいれた新たなコードは、これらの場合には見積の劣化を引き起こしていました。

  100. 拡張モジュールの設定テーブルであると印付けされたシーケンスのデータを出力するように pg_dump が修正されました。 (Michael Paquier) (9.6)
  101. シーケンスについて、pg_extension_config_dump() 関数で印をつけてもダンプで出力されない動作になっていました。

  102. pg_dump における ALTER DEFAULT PRIVILEGES ... REVOKE の誤操作が修正されました。 (Stephen Frost) (9.6)
  103. ALTER DEFAULT PRIVILEGES が通常の状態よりも権限を減らすのに使われている場合に pg_dump が必要な REVOKE コマンドを出力しませんでした。

    (通常より権限を減らす使い方の例 - これらが正しくダンプされません)
    ALTER DEFAULT PRIVILEGES
      FOR ROLE myrole
      REVOKE SELECT ON TABLES FROM myrole;
    
    ALTER DEFAULT PRIVILEGES
      FOR ROLE myrole
      REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
    
  104. pg_dump が組み込み関数を使ったユーザ定義キャストとユーザ定義変換 (TRANSFORM) をダンプするように修正されました。 (Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)
  105. 「--create --if-exists」オプションを伴う pg_restoreが、アーカイブに認識できない DROP コマンドが含まれている場合に、よりよく動作するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
  106. これは現時点の具体的な障害を修正するわけではありませんが、将来より後のバージョンの pg_dump で生成されたアーカイブを扱う際の振る舞いを改善すると考えられます。

  107. 遅いストレージ I/O であるときの pg_basebackup の転送レート制限が修正されました。 (Antonin Houska) (9.6)(9.5)(9.4)
  108. ストレージ I/O が一時的に指定の転送レート制限よりも著しく遅かった場合、計算がオーバーフローして、残りの実行において転送レート制限が事実上使えませんでした。

  109. pg_basebackup でのシンボリックリンクされた pg_stat_tmp と pg_replslot サブディレクトリの扱いが修正されました。 (Magnus Hagander, Michael Paquier) (9.6)(9.5)(9.4)
  110. これらがシンボリックリンクであるとき誤った tar ヘッダが作られていました。

  111. スタンバイサーバでの WAL ファイルを含めた pg_basebackup で失敗の可能性があり、修正されました。 (Amit Kapila, Robert Haas) (9.6)(9.5)(9.4)(9.3)(9.2)
  112. 本来必要な分よりも手前の WALを要求し、それが得られないため失敗する可能性がありました。

  113. initdb が *_flush_after 設定について、正しいプラットフォーム固有のデフォルト値を postgresql.conf に書き入れるように改善されました。 (Fabien Coelho, Tom Lane) (9.6)
  114. #bgwriter_flush_after = 0       # 0 disables,
                                    # default is 512kB on linux, 0 otherwise
    
    #checkpoint_flush_after = 0     # 0 disables,
                                    # default is 256kB on linux, 0 otherwise
    
  115. 拡張された配列がドメインのチェック制約や CASE 実行で誤動作する可能性があり、修正されました。 (Tom Lane) (9.6)(9.5)
  116. PL/pgSQL 関数がこのような文脈で続く操作で保持される必要のある配列値を変更あるいは削除して誤動作する可能性がありました。

    (報告された障害発生例: 奇妙なエラーが生じています)
    db1=# CREATE FUNCTION x_domain_test_check(integer[]) RETURNS boolean AS
          $$ BEGIN RETURN true; END; $$ LANGUAGE plpgsql IMMUTABLE;
    db1=# CREATE DOMAIN x_domain_test AS integer[]
            CHECK(x_domain_test_check(VALUE));
    db1=# DO $$
            declare v_test x_domain_test;
            begin v_test := '{}'::x_domain_test; v_test := v_test || 1; end;
          $$ LANGUAGE plpgsql;
    ERROR:  SPI_connect failed: SPI_ERROR_CONNECT
    CONTEXT:  PL/pgSQL function inline_code_block line 5 at assignment
    
    (CASEの誤動作例:
      以下を繰り返し実行すると CASE で 'right' 以外が返ることがありました)
    BEGIN;
    CREATE DOMAIN arrdomain AS int[];
    CREATE FUNCTION make_ad(int,int) RETURNS arrdomain AS
      $$ declare x arrdomain;
         begin x := array[$1,$2]; return x; end $$ LANGUAGE PLPGSQL VOLATILE;
    CREATE FUNCTION ad_eq(arrdomain, arrdomain) RETURNS boolean AS
      $$ begin return array_eq($1, $2); end $$ LANGUAGE plpgsql;
    CREATE OPERATOR = (procedure = ad_eq,
                       leftarg = arrdomain, rightarg = arrdomain);
    SELECT CASE make_ad(1,2)
      WHEN array[2,4]::arrdomain THEN 'wrong'
      WHEN array[2,5]::arrdomain THEN 'still wrong'
      WHEN array[1,2]::arrdomain THEN 'right'
      END;
    ROLLBACK;
    
  117. 変数割り当て中にドメインのチェック制約が評価されるコンテクストで入れ子に使われる PL/pgSQL 関数について修正されました。 (Tom Lane) (9.6)(9.5)
  118. PL/pgSQL の実行で「ERROR: SPI_connect failed: SPI_ERROR_CONNECT」が生じることがありました。

  119. PL/Python むけに作成した Python の例外オブジェクトが、適切に参照カウントされるようになりました。 (Rafa de la Torre, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  120. これにより Python のガベージコレクションの後にオブジェクトが使われてクラッシュが生じるのを防ぎます。

  121. PL/Tcl がカラム名に「.tupno」を含むテーブル上のトリガーをサポートするように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  122. 「.tupno」カラムは PL/Tcl で問い合わせ結果の現在行番号が格納される列として使われていて、その動作と調和させました。テーブルのカラム名に無い場合には「.tupno」は引き続き結果行番号格納用に使われます。

  123. ~/.pgpass ファイルで Unix 上であっても DOS 形式の改行文字 (CR-LF) が使えるようになりました (Vik Fearing) (9.6)(9.5)(9.4)(9.3)(9.2)
  124. この変更は同じパスワードファイルを Unix と Windows で使うのを容易にします。

  125. ecpg で「.」で終わるファイル名が与えられた場合の 1 バイトのバッファオーバーランが修正されました。 (Takayuki Tsunakawa) (9.6)(9.5)(9.4)(9.3)(9.2)
  126. psql の crosstabview で重複するデータに対する不正確なエラー報告が修正されました。 (Tom Lane) (9.6)
  127. 「crosstabview: query result contains multiple data values for row "1", column "9"」といったエラーが出る際に、実際に重複しているのとは異なる行・列が示されることがありました。

  128. ALTER DEFAULT PRIVILEGES に対する psql の TAB 補完が修正されました。 (Gilles Darold, Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)
  129. ALTER TABLE ... ALTER .. DROP ... に対する psql の TAB 補完が修正されました。 (Kyotaro Horiguchi) (9.6)
  130. psql が空か全て空白文字の PAGER 環境変数設定をページャ無しとして扱うようになりました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  131. これまではこのような環境変数設定を与えてページャが起動されるケースになると何も出力されませんでした。

  132. contrib/dblink の低レベル libpq エラーの報告が改善されました。 (Joe Conway) (9.6)(9.5)(9.4)(9.3)(9.2)
  133. これまでは、例えば out-of-memoryエラーが "unknown error" となっていました。

  134. contrib/dblink が contrib/postgres_fdw の外部サーバを接続オプションのソースとして使っているとき、無関係なサーバオプションを無視するようになりました。 (Corey Huinker) (9.6)(9.5)(9.4)(9.3)
  135. これまでは外部サーバオブジェクトがオプションを持っていて、それが「updatable 'true'」など libpq 接続オプション以外であるとき、以下のようなエラーが生じていました。

    db1=# SELECT * FROM dblink('fdw_server', 'SELECT 1') as t(x integer);
    ERROR:  could not establish connection
    DETAIL:  invalid connection option "updatable"
    
  136. contrib/pageinspect の GIN インデックスむけ関数の移植性の問題が修正されました。 (Peter Eisentraut, Tom Lane) (9.6)(9.5)
  137. ia64 や sparc64 などでクラッシュが生じる可能性がありました。

  138. Windows で待機中にソケット読み取りイベントを見逃す可能性があり、修正されました。 (Amit Kapila) (9.6)
  139. ほとんどの場合にこれは無害ですが、pldebugger 拡張モジュールを使った際にハングアップをひき起こすことが知られています。

  140. Windows で環境変数の変更がデバッグオプションを有効にしてビルドされたシステム DLL に確実に伝搬するようになりました。 (Christian Ullrich) (9.6)(9.5)(9.4)(9.3)(9.2)
  141. タイムゾーンライブラリが IANA release tzcode2016j に同期されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
  142. 多数の問題が修正されています。最も重要なものとしては、対象ディレクトリがハードリンクをサポートしない場合はタイムゾーンデータ導入に失敗する問題がありました。

  143. タイムゾーンデータを tzdata release 2016j に更新しました。 (9.6)(9.5)(9.4)(9.3)(9.2)
  144. 北キプロス(新タイムゾーン Asia/Famagusta 追加)、ロシア(新タイムゾーン Europe/Saratov 追加)、トンガ、Antarctica/Casey における夏時間法の変更と、イタリア、カザフスタン、マルタ、パレスチナにおける歴史的修正、トンガにおける数値によるゾーン略記法を優先する変更が含まれます。

  145. Btree インデックスの VACUUM 処理中におけるスタンバイサーバ上の相互ロックが減りました。 (Simon Riggs) (9.5)(9.4)
  146. 本変更は、このような操作のリプレイ時にしばしば発生する顕著なレプリケーション遅延を回避します。

  147. 制約違反エラーを報告する前に直列化可能性の競合を検査するようになりました。 (Thomas Munro) (9.5)(9.4)(9.3)(9.2)
  148. シリアライザブルトランザクション隔離を使うとき、同時実行トランザクションによる全てのエラーは直列化失敗と表明されることが望まれます。これによりアプリケーションにリトライして成功するかもしれないと示すことができます。

    しかしながら、並列の行挿入によるキー重複違反のエラーが出てしまうケースがあるため、上記は確実には実現できていませんでした。

    本変更は、アプリケーションがトランザクション内より手前で明示的に衝突するキーの存在(およびそれが見つからないことを)検査しているのであれば、そのようなエラーを確実に直列化失敗のエラーとして報告されるようにします。

    以下のように実行したときに「ERROR: duplicate key value violates ...」ではなく、確実に「ERROR: could not serialize access ...」がでるようにしたということです。

    [[トランザクション1]]        [[トランザクション2]]
    
    db1=# START TRANSACTION ISOLATION
          LEVEL SERIALIZABLE;
                                 db1=# START TRANSACTION ISOLATION
                                       LEVEL SERIALIZABLE;
    
    db1=# SELECT * FROM t1 WHERE id = 1;
     id | v
    ----+---
    (0 rows)
                                 db1=# SELECT * FROM t1 WHERE id = 1;
                                  id | v
                                 ----+---
                                 (0 rows)
    
    db1=# INSERT INTO t1 (id) VALUES (1);
    
                                 db1=# INSERT INTO t1 (id) VALUES (1);
                                 (ブロックされる)
    db1=# COMMIT;
                                 ERROR:  could not serialize access due to
                                         read/write dependencies among transactions
                                 (一意制約違反でなく、直列化失敗エラーになる)
    
  149. WAL セグメントを再読み込みする際の WAL ページヘッダ検証が修正されました。 (Takayuki Tsunakawa, Amit Kapila) (9.2)
  150. 稀な場合に、偽の(すなわち実際にはデータは壊れていない状況で)「out-of-sequence TLI」エラーがリカバリ中に報告される可能性がありました。

PostgreSQL 9.6.1、9.5.5、9.4.10、9.3.15、9.2.19、9.1.24 の変更点


  1. フリースペースマップおよび可視性マップの切り詰めについてのWAL記録について修正されました。 (Pavan Deolasee, Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)
  2. クラッシュリカバリに際してこれらファイルが正しく復旧しなかったり、スタンバイサーバに誤った書き込みがされる可能性がありました。

    フリースペースマップの不正な項目は、リレーションの既に切り詰めされたページへのアクセスをひき起こし、典型的には以下のようなエラーが出ます。

    ERROR:  could not read block 28991 in file "base/16390/572026": read only 0 of 8192 bytes
    

    フリースペースマップを再生成させるには、サービスを正常停止(smartモードかfastモードで停止)して、データベースクラスタディレクトリ内の.fsmファイルを手動で削除して、サービスを再起動してください。フリースペースマップが既に壊れているかを個別に検査する手順は、以下ページを参照ください。

    https://wiki.postgresql.org/wiki/Free_Space_Map_Problems

    可視性マップの障害は、ページチェックサムを有効にしていると、チェックサム検査エラーをひき起こすこともあります。

    可視性マップを再生成させるには、contrib/pg_visibility 拡張モジュールのpg_truncate_visibility_map() 関数を使用できます。サービス停止して、.vmファイルを手動で削除して、サービス再起動する方法でも良いです。

  3. pg_upgrade が可視性マップを9.6フォーマットに書き換えしたときデータ破損の可能性があり、修正されました。 (Tom Lane) (9.6)
  4. ビッグエンディアンのマシンで新たな可視性マップのバイト列が誤った順で書かれて、完全に誤ったマップをもたらしました。また、Windows では旧マップがテキストモードで読み取られて、マップのバイト列に改行コード CR(0x0D) LF(0x0A) の並びが含まれているとき、誤った結果をもたらしました。

    pg_upgrade を使用していて上記のいずれかに該当しているなら可視性マップが壊れていると考えられます。

    contrib/pg_visibility 拡張モジュールの pg_truncate_visibility_map() 関数を使って可視性マップを再生成することができます。サービス停止して、.vmファイルを手動で削除して、サービス再起動する方法でも良いです。

    以下のページも参照ください。

    https://wiki.postgresql.org/wiki/Visibility_Map_Problems

  5. INSERT ... ON CONFLICT による自己衝突の場合にトランザクション直列化失敗のエラーを投げないようになりました。 (Thomas Munro, Peter Geoghegan) (9.6)(9.5)
  6. ここでの自己衝突とは以下例のようなケースです。SERIALIZABLE またはREPEATABLE READ トランザクション隔離レベルで発生します。修正後、本ケースではエラー無しに 1件だけレコードが挿入されます。

    db1=# CREATE TABLE t3 (id int primary key);
    
    db1=# START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    db1=# INSERT INTO t3(id) VALUES (1),(1) ON CONFLICT DO NOTHING;
    ERROR:  could not serialize access due to concurrent update
    
  7. DISTINCT を使う集約関数の実行において、解放後のメモリを使用する障害が修正されました。 (Peter Geoghegan) (9.6)
  8. 以下のような SQL が該当します。

    SELECT string_agg(DISTINCT col1, ',' ORDER BY col1) FROM t4;
    

    バックエンドプロセスのクラッシュや誤った問い合わせ結果を引き起こすおそれがあります。特に Windows むけビルドで発生が報告され、再現が確認されました。

  9. ウィンドウ関数として使われる多様集約の誤った扱いが修正されました。 (Tom Lane) (9.6)
  10. 集約の遷移関数に、その第一引数と結果が状態のデータ型でなく集約の出力のデータ型だと示されていました。このことは多様の遷移関数でエラーやクラッシュをもたらしました。

    CREATE AGGREGATE で集約関数を作るときに、状態遷移関数や最終計算関数の引数型や返し値型に anyelement や anyarray 等を使う多様関数を指定した場合で、集約の出力と状態でデータ型が異なる場合に該当します。エラーやクラッシュが生じるのは、作成した集約関数を実行したときです。

    (エラー発生例:)
    db1=# CREATE FUNCTION first_el(anyarray) RETURNS anyelement
            AS 'select $1[1]' LANGUAGE sql STRICT IMMUTABLE;
    
    db1=# CREATE AGGREGATE first_el_agg_f8(float8)
            (SFUNC = array_append, STYPE = float8[], FINALFUNC = first_el);
    
    db1=# SELECT first_el_agg_f8(x::float8) OVER (order by x)
            FROM generate_series(1,5) x;
    ERROR:  input data type is not an array
    
    (本来の期待される出力は以下:)
     first_el_agg_f8 
    -----------------
                   1
                   1
                   1
                   1
                   1
    (5 rows)
    
  11. 行単位セキュリティが有効なテーブルの列名リストを伴う COPY が修正されました。 (Adam Brightwell) (9.6)(9.5)
  12. (エラー発生例:)
    db1=# CREATE ROLE user6;
    db1=# CREATE TABLE t6 (a int, b int, c int);
    db1=# INSERT INTO t6 VALUES (1,4,1),(2,3,2),(3,2,3),(4,1,4);
    db1=# CREATE POLICY p6 ON t6 FOR SELECT USING (a % 2 = 0);
    db1=# ALTER TABLE rls_t6 ENABLE ROW LEVEL SECURITY;
    db1=# ALTER TABLE rls_t6 FORCE ROW LEVEL SECURITY;
    db1=# GRANT SELECT ON TABLE t6 TO user6;
    
    db1=# SET SESSION AUTHORIZATION user6;
    db1=> COPY t6 TO stdout;
    2       3       2
    4       1       4
    db1=> COPY t6 (a, b) TO stdout;
    ERROR:  missing FROM-clause entry for table "a"
    
    (本来の期待される出力は以下:)
    2       3
    4       1
    
  13. track_io_timing = on であるとき、EXPLAIN が有効な XML を出力するように修正されました。 (Markus Winand) (9.6)(9.5)(9.4)(9.3)(9.2)
  14. これまでは XML形式のとき、「<I/O-Read-Time>」など、文法的に不正なタグが出力されました。タグ名(XML要素名)に使われるアルファベット、数字、「-」「_」「.」以外の文字は「-」で置き換えられるようになりました。つまり、前述の文字列は「<I-O-Read-Time>」と出力されます。

  15. 準備されたトランザクション(二相コミットのトランザクション)でTRUNCATE の統計情報更新が修正されました。 (Stas Kelvich) (9.6)(9.5)
  16. pg_stat_*_tables の n_live_tup、n_dead_tup に相当する統計値が、TRUNCATE で 0 にならない動作がありました。

  17. CREATE/ALTER TABLE にて継承された CHECK制約のマージにおける、いくつかの障害が修正されました。 (Tom Lane, Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)
  18. どちらから先でも親テーブル、子テーブルに対して同一の CHECK制約を追加することが可能になりました。これまで ALTER TABLE で後から加えるとエラーになっていたものが適切にマージされます。以下に例を示します。

    db1=# CREATE TABLE t9p(a int);
    db1=# CREATE TABLE t9c() INHERITS ( t9p );
    db1=# ALTER TABLE t9p ADD CONSTRAINT check_a CHECK (a > 0);
    
    (これまでのバージョンの動作)
    db1=# ALTER TABLE t9c ADD CONSTRAINT check_a CHECK (a > 0);
    ERROR:  constraint "check_a" for relation "t9c" already exists
    
    (修正後の動作)
    db1=# ALTER TABLE t9c ADD CONSTRAINT check_a CHECK (a > 0);
    NOTICE:  merging constraint "check_a" with inherited definition
    

    親テーブルからの有効な制約と子テーブル上の NOT VALID な制約の併合を防止します。同様に NO INHERIT な子テーブルの制約と継承された制約の併合も防止します。これまでは誤ってマージされてしまっていました。以下に例を示します。

    (これまでのバージョンの動作)
    db1=# CREATE TABLE t9p (a int, CONSTRAINT CHECK_a CHECK (a > 0));
    db1=# CREATE TABLE t9c (CONSTRAINT CHECK_a CHECK (a > 0) NO INHERIT) INHERITS (t9p);
    NOTICE:  merging constraint "check_a" with inherited definition
    
    (修正後の動作)
    db1=# CREATE TABLE t9p (a int, CONSTRAINT CHECK_a CHECK (a > 0));
    db1=# CREATE TABLE t9c (CONSTRAINT CHECK_a CHECK (a > 0) NO INHERIT) INHERITS (t
    9p);
    ERROR:  constraint "check_a" conflicts with inherited constraint on relation "t9c"
    
  19. min_wal_size と max_wal_size に対する pg_settings.unit で実用的な値を表示するようになりました。 (Tom Lane) (9.6)(9.5)
  20. 従来 NULL でしたが、以下のようになります。

    db1=# SELECT name, unit FROM pg_settings WHERE name IN ('min_wal_size', 'max_wal_size');
         name     | unit
    --------------+------
     max_wal_size | 16MB
     min_wal_size | 16MB
    (2 rows)
    
  21. jsonb_set() で配列要素の置換が修正されました。 (Tom Lane) (9.6)
  22. 対象が存在するJSON配列要素である場合、新たな値で置き換えられるのでなく、削除されていました。

    (障害動作例: 最も外側の JSON配列のゼロ番目を '100' で置き換える指定)
    db1=# SELECT jsonb_set('[0,1,null,3]', '{0}', '100', false);
      jsonb_set
    --------------
     [1, null, 3]
    (1 row)
    
    (正しい応答:)
            jsonb_set
    -------------------------
     [100, 1, null, 3]
    (1 row)
    
  23. バッファのロックを保持せずにタプル可視性をテストすることに起因する滅多に起こらないデータ破損について、回避されました。 (Thomas Munro, Peter Geoghegan, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
  24. 特に外部キーチェックの処理で一貫性に欠けたデータが生じる可能性がありました。

  25. サーバ再起動時にコミットタイムスタンプを保護するようになりました。 (Julien Rouhaud, Craig Ringer) (9.6)(9.5)
  26. track_commit_timestamp = on のとき、クリーンなサーバ再起動の後に、古いコミットタイムスタンプがアクセス不能になってました。

    以下のように再起動前に取得できたタイムスタンプが、取得できなくなる動作が生じます。

    (エラー動作例: NULL は *NULL* と表示)
    db1=# SELECT txid_current();
     txid_current
    --------------
            12345
    (1 row)
    db1=# SELECT pg_xact_commit_timestamp('12340'); -- 最近のトランザクション
       pg_xact_commit_timestamp
    -------------------------------
     2016-10-31 16:40:58.681952+09
    (1 row)
    
    db1=# q
    
    $ pg_ctl restart
    $ psql db1
    
    db1=# SELECT pg_xact_commit_timestamp('12340');
     pg_xact_commit_timestamp
    --------------------------
     *NULL*
    (1 row)
    
  27. ロジカルWALデコーディングが、サブトランザクションの WAL出力がディスクに溢れるほど大きいときに適切に動作するように修正されました。 (Andres Freund) (9.6)(9.5)(9.4)
  28. SAVEPOINTを使った更新の一部がロジカルデコーディング出力から抜け落ちることがありました。

  29. ロジカルWALデコーディングにおける不正ポインタの問題が修正されました。 (Stas Kelvich) (9.6)
  30. 共有メモリ割り当て要求を実際の huge pageサイズの倍数に丸めるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)
  31. 本修正は、典型的でないデフォルト huge page サイズをもつシステムで munmap() の起こりうる失敗を回避します。クラッシュリカバリの場合を除き、これまでも悪影響はログメッセージ以外ありませんでした。

    プラットフォームが Linux の場合に対応した修正となります。

  32. libpq で SSLコンテキストを複数の接続に亘って共有しようと試みなくなりました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
  33. 特に異なる接続に異なる SSLパラメータを使うときに、稀な場合で起きる様々な障害をもたらしていました。

    予期せぬ SSL error (サーバ側ログとしては ERROR: could not accept SSL connectionなど) が発生することが報告されました。

  34. libpq の稀な場合のメモリリークが回避されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
  35. PQreset() でエラー報告内容がメモリリークするケースが報告されました。関連するケースがいくつかあると見られます。

  36. pg_upgrade はライブラリがロード可能かを名前の長さ順にチェックするようになりました。 (Tom Lane) (9.6)(9.5)
  37. 拡張モジュール間の依存問題を回避する簡易的な対策です。手続き言語、データ型、TRANSFORM (手続き言語とSQLデータ型の対応付け) を提供する拡張モジュールがあって、plpython、hstore、hstore_plplythonというモジュール名であるなら前者二つが先にロードされることが期待できます。

  38. インデックスアクセスメソッドを含む拡張モジュールに対してpg_upgrade が正しく動作するようになりました。 (Tom Lane) (9.6)
  39. サーバが ALTER EXTENSION ADD / DROP ACCESS METHOD に対応するように拡張されました。この機能はアクセスメソッドの動的作成に対応した当初のパッチに含まれているべきでしたが、見落とされていました。

  40. pg_upgrade のファイルのコピー、リンク、書換えの各段階でのエラー報告が改善されました。 (Tom Lane, Álvaro Herrera) (9.6)
  41. Windows 以外のプラットフォームでシステムからのメッセージがより適切にエラーメッセージに含まれるようになります。

  42. pg_dump が 7.4 よりも前バージョンのサーバで動作するように修正されました。 (Amit Langote, Tom Lane) (9.6)
  43. ラージオブジェクトの処理をする部分に修正が適用されています。

  44. pg_rewind に --source-server と --source-target を両指定することが禁止されました。 (Michael Banck) (9.6)(9.5)
  45. 二つとも設定するのは無意味ですがエラーを出すようになっていませんでした。

  46. pg_rewind が元サーバのセッションで synchronous_commit を off にするようになりました。 (Michael Banck, Michael Paquier) (9.6)(9.5)
  47. これまでは、同期レプリケーションを使っているサーバをソースサーバに指定して、その同期レプリケーションが何らか理由で動作しない場合に、pg_rewind が一時テーブルを作るところで固まってしまっていました。

  48. pg_xlogdump で --follow オプションを使った場合、新たな WALセグメントファイルのオープンを再試行するようになりました。 (Magnus Hagander) (9.6)(9.5)(9.4)(9.3)
  49. これによりサーバの次セグメント作成の遅れに対応します。

  50. ロールバックされた更新の対象となっている壊れたタプルに対して、正しい TID を報告するように contrib/pg_visibility が修正されました。 (Tom Lane) (9.6)
  51. PL/Python の並行ビルドが確実に成功するように、Makefile の依存関係が修正されました。 (Pavel Raiskup) (9.6)
  52. タイムゾーンデータファイルが tzdata release 2016h に更新されました。 (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
  53. パレスチナとトルコの夏時間法の変更、トルコとロシアのいくつかの地域の歴史的修正が適用されます。南極大陸、旧ソ連、スリランカのいくつかのタイムゾーンが数値による省略形に切り替えられました。

    IANAタイムゾーンデータベースはこれまで(ほとんど使われない物も含めて)全てのタイムゾーンに文字による省略形を提供していました。現在、現実世界で英語の省略形として使われている形跡がないタイムゾーンについては数値による UTCオフセットの使用を優先する方針に転換する過程にあります。

    少なくとも暫くの間、PostgreSQL はタイムスタンプの入力にそのような削除された省略形を受け入れる予定です。しかしながら、削除された省略形は、pg_timezone_namesビューにはあらわれなくなり、出力には使われなくなります。

    本アップデートでは、AMT がアルメニア時間(UTC+4)という意味では使われなくなり、アマゾン時間(UTC-4)と解釈されるようになります。

  54. ビッグエンディアンのマシンにおける GINインデックス WALレコードの誤った作成が修正されました。 (Tom Lane) (9.5)(9.4)
  55. 典型的な症状は WALリプレイに際して「unexpected GIN leaf action」が出ることです。

  56. SELECT FOR UPDATE/SHARE がその後に中止(ロールバック)したトランザクションに更新されたタプルを適切にロックするように修正されました。 (Álvaro Herrera) (9.5)(9.4)(9.3)
  57. 9.5 以降では、SELECT はこのようなタプルを返すのに時々失敗していました。より古いバージョンでこの障害が起きることは証明されていませんが、同時更新を伴う場合で可能性があると考えられます。

  58. CTEスキャンを伴う EvalPlanQual の再チェックが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  59. 再チェックでは常に CTE を行が返さないものとみていて、典型的には最近に更新された行の更新失敗をひき起こしました。

    CTE (WITH句) を使って SELECT ... FOR UPDATE を実行する問い合わせで、並行する UPDATE 処理とのタイミングによっては、返るべき行が返らない障害が報告されています。

  60. INSERT ... ON CONFLICT による取り消しの際の、推測で挿入された TOASTタプルの削除が修正されました。 (Oskari Saarenmaa) (9.5)
  61. 2つのトランザクションがほぼ同時に衝突するタプルを挿入しようとする競合状態で、挿入内容に TOASTフィールドが含まれている場合に、挿入できなかった方が以下のエラーを出していました。

    ERROR:  attempted to delete invisible tuple
    

  62. サブクエリでハッシュ集約からの前結果の不適切な重複が修正されました。 (Andrew Gierth) (9.5)(9.4)(9.3)(9.2)(9.1)
  63. 性能を改善するプランナの修正となります。これまで無駄な計算が生じていました。

  64. 主キーやレプリカ識別(REPLICA IDENTITY)インデックスを伴うテーブルの大規模な UPDATE における、問い合わせ内のメモリリークが修正されました。 (Tom Lane) (9.5)(9.4)
  65. EXPLAIN で測定されない時間をゼロと出力しないようになりました。 (Maksim Milyutin) (9.5)(9.4)(9.3)(9.2)
  66. いくつかのケースで計測対象外の項目についても欄があらわれ、その値がゼロになっていました。

    「TIMING off」を指定しているのにトリガ関数実行時間が 0 で出力されたり、FORMAT が text 以外の時に track_io_timing = off で計測されないにもかかわらず「I/O Read Time: 0.000」「I/O Write Time: 0.000」が出力されたりしていました。

  67. VACUUM がテーブル切り捨てをするためにテーブル排他ロックを待っているときのタイムアウトの長さが修正されました。 (Simon Riggs) (9.5)(9.4)(9.3)(9.2)(9.1)
  68. このタイムアウトは 50 ミリ秒のつもりが、実際には誤って 50 マイクロ秒になっていました。このため VACUUM がすぐにテーブル切り捨て(通常VACUUM でのファイルサイズ縮小)をあきらめてしまっていました。

  69. numeric型で受け入れられる値の人為的な制約が除去されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  70. テキスト入力の numeric_in()、バイナリ入力の numeric_recv() の両方で修正されています。

    これまで 指数記号を使ったとき、指数部を 1000 を上限としていたのは全く無意味であるため、格納形式上の制限(1e100000 を越える)までの数値が許可されるようになりました。

    また、バイナリ入力の場合には数値の桁数が 1000 桁を越えた場合にも拒絶していましたが、これも修正されました。

    (修正前の動作例)
    db1=# SELECT 1.0e+1000::numeric; -- これはエラーにならない
    
    db1=# SELECT repeat('1', 100000)::numeric; -- 指数形式でなければ問題ない
    
    db1=# SELECT 1.0e+1001::numeric; -- 指数形式で指数部が 1000 を超えるとエラーになる
    ERROR:  invalid input syntax for type numeric: "1.0e+1001"
    LINE 1: SELECT 1.0e+1001::numeric;
                 ^
    

  71. 短縮キーの利用を止めたときに起きうるソートの誤りが修正されました。 (Peter Geoghegan) (9.5)
  72. 誤ったソート順序がもたらされる可能性があり、最悪の場合、壊れたBtreeインデックスが生じます。この場合 REINDEX が必要です。ただし、発生は非常に稀と考えられます。

  73. 1GB を超える一時リレーションを切り捨てするときに起きるファイルデスクリプタのクローズ漏れが修正されました。 (Andres Freund) (9.5)(9.4)(9.3)(9.2)(9.1)
  74. 一時テーブルに対する VACUUM および ON COMMIT TRUNCATE 指定に基づく動作の時のみ影響があります。

  75. standby_mode を on にしてスタンドアローンバックエンドを起動することが禁止されました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
  76. WALデータを取り込む WALレシーバプロセスが無いので、そのように指定しても役に立ちません。また、スタンバイ動作が考慮されていないため誤動作をもたらしました。

  77. 以前に使用したスロットを再利用するときに、レプリケーションスロット状態を適切に初期化するようになりました。 (Michael Paquier) (9.5)(9.4)
  78. 本障害で VACUUM がデッドタプルを除去するのを妨げるおそれがありました。

  79. 動的共有メモリの制御セグメントID に、よりランダムな値を使うようになりました。 (Robert Haas, Tom Lane) (9.5)(9.4)
  80. これまで srandom() を呼ばずに random() から供給を受けていたため、同じ値が毎回選択されていました。比較的無害ですが、これは想定の動作ではありません。

  81. Windows において、動的共有メモリの制御セグメントの作成をaccess denied エラーの後、再試行するようになりました。 (Kyotaro Horiguchi, Amit Kapila) (9.5)(9.4)
  82. Windows は既存セグメントがあるとき、ときどき ERROR_ALREADY_EXISTS でなくERROR_ACCESS_DENIED を返します。これを回復不能エラーと判断していたため、PostgreSQL 起動に失敗していました。

  83. PL/pgSQL が int2vector型や oidvector型のパラメータとローカル変数で誤動作しないように修正されました。 (Tom Lane) (9.5)
  84. 誤った応答やバックエンドクラッシュをひき起こす可能性があります。

    (正常動作例: 修正前バージョンでは誤応答やクラッシュが起きる)
    db1=# CREATE FUNCTION f44(int2vector) RETURNS text LANGUAGE plpgsql
            AS $$ BEGIN RETURN $1::text; END;$$;
    db1=# SELECT f44('1'::int2vector);
     f44
    -----
     1
    (1 row)
    
  85. ecpg の --help と --version オプション が他のコマンドと一貫性をもった動作をするようになりました。 (Haribabu Kommi) (9.5)(9.4)(9.3)(9.2)(9.1)
  86. pgbench の平均遅延の計算が修正されました。 (Fabien Coelho) (9.5)(9.4)
  87. スクリプト中で sleep コマンドがあるとき、あるいは、テスト実行期間を時間ではなくトランザクション数で指定しているとき、計算が誤っていました。

  88. pg_dump が範囲型を作る関数をダンプしないように修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
  89. 範囲型を作る関数とは CREATE TYPE name AS RANGE で指定する関数のことです。--binary-upgrade のとき、拡張モジュールに属するこれら関数が誤ってダンプされていました。pg_upgrade での問題が報告されました。

  90. pg_dump で -C と --no-tablespaces を指定しているとき、CREATE DATABASE に TABLESPACE 句を付けないように修正されました。 (Tom Lane) (9.5)
  91. pg_receivexlog がスロットなしで --synchronous を指定しているとき、正しく動作するように修正されました。 (Gabriele Bartolini) (9.5)
  92. スロットが無いとフラッシュ位置が報告されませんでした。

  93. pg_xlogdump が複数ページにわたる継続レコードで始まる WALファイルに対応するように修正されました。 (Pavan Deolasee) (9.5)(9.4)(9.3)
  94. contrib/pg_buffercache が 256GB を超える shared_buffers のときに動作するように修正されました。 (KaiGai Kohei) (9.5)(9.4)
  95. contrib/intarray の bench.pl で -e が指定された際に EXPLAIN 結果を捨てずに出力するように修正されました。 (Daniel Gustafsson) (9.5)(9.4)(9.3)(9.2)(9.1)
  96. OpenSSL 1.1.0 がサポートされました。 (Heikki Linnakangas) (9.5)
  97. 拡張のテストで使えるように TAPテスト基盤が導入されました。 (Craig Ringer) (9.5)(9.4)
  98. ビルド時に --enable-tap-tests を指定すると、make install でPGXS が見つけられたものについて TAPテストのためのサポートPerlファイルがインストールされます。

  99. MSVC でのビルドで、クライアントのみのインストールに pg_recvlogical が含まれるようになりました。 (MauMau) (9.5)(9.4)
  100. 最近の Windows バージョンで追加されたタイムゾーン名を認識するように、Windows のタイムゾーン割り当てが更新されました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)
  101. 廃止された動的なタイムゾーン省略形についてエラーが出るのを防ぐようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  102. 動的タイムゾーン省略形が参照されているタイムゾーンでどれにも一致しない場合、これをタイムゾーン名と等しいものとして扱います。これにより、IANA が彼らのタイムゾーンデータベースから省略形を削除したときの予期せぬエラーを回避します。

  103. ロジカルWALデコーディングでのバッファオーバランが修正されました。 (Tom Lane) (9.4)
  104. タプル更新レコードのロジカルデコーディングは 23バイト余計に読み取りました。これは通常無害ですが、非常に運が悪ければクラッシュをひき起こします。

PostgreSQL 9.5.4、9.4.9、9.3.14、9.2.18、9.1.23 の変更点


  1. 入れ子になった CASE-WHEN式の誤評価のおそれがあり、修正されました。 (Heikki Linnakangas, Michael Paquier, Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  2. 他の CASE のテスト値の副式としてあらわれる CASE式では、自身のテスト値が null かどうかを誤ることがありました。

    CASE式で使用される等価演算子を実装する SQL関数のインライン化により、そのSQL関数内で CASE式で呼ばれた関数に誤ったテスト値を渡すおそれがありました。テスト値が異なるデータ型である場合、クラッシュするかもしれず、更には、一部サーバメモリを露出させるために悪用されるかもしれません。これは CVE-2016-5423 として登録されています。

    以下例は、副CASE式で 'it was bar!' になり、返し値は 'bar recognized'になるのが正しい動作です。

    (入れ子CASEの障害動作例)
    
    db=# CREATE FUNCTION vol(text) RETURNS text AS
           'begin return $1; end' LANGUAGE PLPGSQL VOLATILE;
    
    db=# SELECT CASE
         (CASE vol('bar') WHEN 'foo' THEN 'it was foo!'
                          WHEN vol(null) THEN 'null input'
                          WHEN 'bar' THEN 'it was bar!' END)
         WHEN 'it was foo!' THEN 'foo recognized'
         WHEN 'it was bar!' THEN 'bar recognized'
         ELSE 'unrecognized' END;
    
         case
    --------------
     unrecognized
    (1 row)
    

    以下例は 'is not foo' が返るのが正しい動作です。定義した =演算子と inline_eq関数は、最後の SELECT文の CASE式を通して実行されます。

    (インライン関数の = 演算子の障害動作例)
    
    db=# CREATE DOMAIN foodomain AS text;
    db=# CREATE FUNCTION volfoo(text) RETURNS foodomain AS
           'begin return $1::foodomain; end' LANGUAGE plpgsql VOLATILE;
    db=# CREATE FUNCTION inline_eq(foodomain, foodomain) RETURNS boolean AS
           'SELECT CASE $2::text WHEN $1::text THEN true ELSE false END'
           LANGUAGE sql;
    db=# CREATE OPERATOR = (procedure = inline_eq,
           leftarg = foodomain, rightarg = foodomain);
    
    db=# SELECT CASE volfoo('bar')
                WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END;
      case
    --------
     is foo
    (1 row)
    
  3. クライアントプログラムにおけるデータベース名とロール名に含まれる特殊文字の扱いが修正されました。 (Noah Misch, Nathan Bossart, Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
  4. 多くのクライアントプログラムが、データベース名やロール名が "(ダブルクオート)や (バックスラッシュ)を含むことで、混乱をきたすことがありえました。

    psql の connect と password において、2つ組のダブルクオートの扱いがドキュメント通りになるように修正されました。

    さらに、psql の connect コマンドに -reuse-previous オプションが導入され、以前の接続のパラメータを再利用するかの明示的な制御ができるようになりました。従来はデータベース名が接続文字列のように見えるかで選択されていました。これは pg_dumpall で特殊文字を含むデータベース名の安全な処理を可能にします。

    pg_dumpall は、改行文字(CR、LF)を含むデータベース名・ロール名の処理を拒絶するようになりました。将来はサーバ側でもこのような名前を拒絶するかもしれません。

    作りこんだ特殊文字を含むオブジェクト名が、次に pg_dumpall や他のメンテナンス操作をするときにスーパーユーザ権限でコマンドを実行させるのに用いられるかもしれないため、これらはセキュリティ修正とみなされます。本件は CVE-2016-5424 として登録されています。

  5. 入れ子の複合値に適用される IS NULL、IS NOT NULL の誤動作が修正されました。 (Andrew Gierth, Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  6. SQL標準では IS NULL は全ての要素が NULL である行値には TRUE を返すべきとしていますが、これは再帰的に適用することを意味しません。

    (IS NULL のSQL標準仕様)
     ROW(NULL,NULL) IS NULL             → TRUE
     ROW(NULL, ROW(NULL, NULL)) IS NULL → FALSE
    

    PostgreSQL のエグゼキュータは上記の通りに作られていますが、プランナ最適化が働いて、以下のような誤った結果が生じていました。

    (誤動作の例 - プラン時点で ROW(NULL,NULL) に置換済み)
    
    =# EXPLAIN (VERBOSE) SELECT ROW(NULL, ROW(NULL, NULL)) IS NULL;
                          QUERY PLAN
    -------------------------------------------------------
     Result  (cost=0.00..0.01 rows=1 width=0)
       Output: (ROW(NULL::unknown, NULL::unknown) IS NULL)
    (2 rows)
    
    =# SELECT ROW(NULL, ROW(NULL, NULL)) IS NULL;
     ?column?
    ----------
     t
    

    postgres_fdw によるリモート問い合わせでも同様の問題があり、修正されました。

  7. 再帰 CTE (WITH RECURSIVE) 内で INSERT ... ON CONFLICT 構文を使うと、unrecognized node type エラーが出るのが修正されました。 (Peter Geoghegan) (9.5)
  8. 以下のようにエラーが発生していました。

    db=# CREATE TABLE foobar (id text PRIMARY KEY);
    
    db=# WITH RECURSIVE upserted AS (
           INSERT INTO foobar (id) VALUES ('a')
           ON CONFLICT (id) DO NOTHING
           RETURNING id
           ) SELECT id FROM upserted;
    ERROR:  XX000: unrecognized node type: 920
    
  9. INSERT ... ON CONFLICT が、プランナの式の前処理フェーズで単純化されたインデックス式やインデックス述語を正常に照合するように修正されました。 (Tom Lane) (9.5)
  10. 以下のような場合に、ON CONFLICT の conflict_target に対応したユニークインデックスや排他制約が無いと見なされて、エラーが発生していました。障害発生はデータ型や書き方に依存します。下記例では、bigint型のところがint型であれば、あるいは、0 を '0'::bigint と記述していれば発生しません。

    db=# CREATE TABLE t5 (a bigint, b bigint);
    
    db=# CREATE UNIQUE INDEX ON t5 (coalesce(a, 0), coalesce(b, 0));
    
    db=# INSERT INTO t5 VALUES (1, 2)
           ON CONFLICT ((coalesce(a, 0)), (coalesce(b, 0))) DO NOTHING;
    ERROR:  there is no unique or exclusion constraint matching the ON CONFLICT specification
    
  11. INSERT ... ON CONFLICT命令で、ON CONSTRAINT で指定されていない方の排他制約に違反した場合の処理が修正されました。 (Tom Lane) (9.5)
  12. 以下例のような場合が該当します。通常の制約違反になるのが正しい動作ですが、無限ループに入ってしまいます。

    (エラー例)
    db=# CREATE TABLE t6 (f1 int UNIQUE, f2 box, EXCLUDE USING gist(f2 WITH &&));
    db=# INSERT INTO t6 VALUES (1, '((0,0),(1,1))');
    INSERT 0 1
    
    db=# INSERT INTO t6 VALUES (2, '((0,0),(1,2))')
           ON CONFLICT ON CONSTRAINT t6_f1_key DO NOTHING;
      → f2 の方の制約違反なのでエラーになるのが正しいが、無限ループで応答しない
    
  13. INSERT ... ON CONFLICT が、対象テーブルが OID カラムにユニークインデックスを持っていた場合に失敗しないようになりました。 (Tom Lane) (9.5)
  14. これまでは該当の場合には、OIDカラムの制約に関係があっても無くても、INSERT ... ON CONFLICT が使用できませんでした。以下のようにエラーが発生します。

    db=# CREATE TABLE t7 (id int UNIQUE) WITH """"OIDS;
    db"""" =# CREATE UNIQUE INDEX ON t7 (oid);
    
    db=# INSERT INTO t7 VALUES (1) ON CONFLICT (id) DO NOTHING;
    ERROR:  system column in index
    
    db=# INSERT INTO t7 VALUES (1) ON CONFLICT (oid) DO NOTHING;
    ERROR:  system columns cannot be used in an ON CONFLICT clause
    
  15. inet型、cidr型がコロン区切りフィールドが多すぎる IPv6アドレスを正しく拒絶するようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  16. IPv6アドレスの表記は 128ビットを 16ビットごとにコロン(:)で区切るので最大でもコロンは 7つです。また、「::」が使えるのは一か所だけです。これら規則に違反してもエラーにならず「::/0」と解釈される場合がありました。

    (誤動作の例)
    
    db=# SELECT '99:99:99:99::99:99:99:99:99:99'::inet;
     inet
    ------
     ::/0
    (1 row)
    
    db=# SELECT '99:99:99:99::99:99:99:1::/118'::cidr;
     cidr
    ------
     ::/0
    (1 row)
    
  17. point ## lseg 演算子の実装である close_ps() 関数が NaN値を含む入力座標でクラッシュしてしまうのが防止されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  18. 上記演算子は右辺要素内の左辺要素への近接点を返すものです。これまでクラッシュしていたケースでは NULL が返るようになります。

    (演算子の通常動作とクラッシュ例)
    
    =# SELECT '(1.5,1.5)'::point ## '(0,0),(0,3)'::lseg;
     ?column?
    ----------
     (0,1.5)
    (1 row)
    
    =# SELECT 'NaN,NaN'::point ## '(Nan,0),(0,NaN)'::lseg;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    
  19. 一貫性に欠けた値が渡された場合に pg_get_expr() 関数がクラッシュする可能性が回避されました。 (Michael Paquier, Thomas Munro) (9.5)(9.4)(9.3)
  20. 以下の障害例が報告されました。

    db=# CREATE TABLE t10 (id int primary key, c1 int NOT NULL, c2 int);
    db=# CREATE INDEX idx10 ON t10 (c1) WHERE (c2 = 100);
    
    db=# SELECT pg_get_expr(i.indpred, i.indexrelid) FROM pg_index i;
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    

    pg_get_expr() は pg_dump やシステムビュー定義内で使われる関数であって、アプリケーションやデータベース管理者が直接使うことはほとんどありません。

  21. to_number() で幾つかの 1バイトのバッファ超過読み込みが修正されました。 (Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)(9.1)
  22. 幾つかの場合に to_number() 関数が入力文字列から1文字多く読み取りしていました。入力データがメモリ末尾に隣接している場合には、僅かながらクラッシュの可能性があります。

  23. WITH NO DATA が指定されたときには、CREATE MATERIALIZED VIEW またはCREATE TABLE AS に含まれている問い合わせに対して プランナを実行しないようになりました。 (Michael Paquier, Tom Lane) (9.5)(9.4)(9.3)
  24. これは不要なエラー状況を回避します。例えば、STABLE な関数が参照するテーブルがマテリアライズドビューを作成した時点では未だ無い、といった場合です。

  25. heap_update() を通る高コストパスにおいて、安全でない中間状態を回避するようになりました。 (Masahiko Sawada, Andres Freund) (9.5)(9.4)(9.3)(9.2)(9.1)
  26. これまで該当ケースにおいては、XMAX をセットして対象タプルをロックするけれど、その操作を WAL書き出しをしませんでした。そのため、ページ変更がバッファ溢れでディスクに書かれて、続いてタプル更新が完了する前にクラッシュが生じると、データ不整合の危険がありました。

  27. 行ロック操作の WALリプレイでのヒントビット更新が修正されました。 (Andres Freund) (9.5)(9.4)(9.3)
  28. 本障害の影響として、コミット前の準備されたトランザクションにより保持された行ロックがクラッシュ後の再起動で適用に失敗するおそれがあることが知られています。

  29. SERIALIZABLE または REPEATABLE READモードで SELECT ... FOR KEY SHARE による行ロックを取得するときに、不要な直列化失敗エラーの発生を回避するようになりました。 (Álvaro Herrera) (9.5)(9.4)(9.3)
  30. FOR KEY SHARE 行ロックは外部キー制約を持つテーブルの更新で暗黙に取得されます。以下の場合にエラーが発生していましたが、修正後は発生しなくなります。

    (テスト用のテーブルを作成)
    db=# CREATE TABLE t15a (id int PRIMARY KEY, uid int, name text);
    db=# CREATE TABLE t15b (id int PRIMARY KEY, d date);
    db=# ALTER TABLE t15a ADD FOREIGN KEY (uid) REFERENCES t15b (id);
    db=# INSERT INTO t15b VALUES (1, now());
    db=# INSERT INTO t15a VALUES (1, 1, 'one');
    
    (セッションその1)
    db=# START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    db=# UPDATE t15a SET name = 'update1', uid = 1 WHERE id = 1;
    
                          (セッションその2)
                          db=# START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
                          db=# UPDATE t15b SET d = now() WHERE id = 1;
                          db=# COMMIT;
    
    db=# UPDATE t15a SET name = 'update2', uid = 1 WHERE id = 1;
    ERROR:  could not serialize access due to concurrent update
    CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."t15b" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"
    
  31. エグゼキュータにおいて、拡張されたデータムがプランノードから返るとき、それが確実にリードオンリーであるように修正されました。 (Tom Lane) (9.5)
  32. データム(Datum)とは SQLデータ型の値の受け渡しに使われる実装内部データ型です。本修正で、下位プランノードの結果が上位ノードの複数個所で参照される場合に、失敗するのを回避します。PostgreSQL本体に関する限り PL/pgSQL関数から返される配列値のみ、危険があります。ただし、拡張モジュールでは拡張されたデータムを他に使っているかもしれません。

    本障害で「ERROR: cache lookup failed for type 0」(数値 0 の部分は様々)、または、クラッシュが生じる可能性があります。

  33. postgres -C で指定した設定変数が NULL文字列値を持つときのクラッシュが回避されました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)
  34. OS X でクラッシュが報告されていました。

  35. wal senderプロセスにおいて、意図せず WAL receiver 応答を待機する動作が防止されました。 (Kyotaro Horiguchi) (9.5)
  36. ロジカルデコーディングで巨大なサブトランザクションが一部あるいは全部欠ける可能性があり、修正されました。 (Petru-Florin Mihancea) (9.5)(9.4)
  37. ロジカルデコーディングで、サブトランザクションに実質的な変更を含まず、外側のトランザクションが変更を含んでいる場合に、デコードに失敗するのが修正されました。 (Marko Tiikkaja, Andrew Gierth) (9.5)(9.4)
  38. 以下のようなトランザクションで、外側トランザクションでの INSERT がデコードされませんでした。

    db=# BEGIN;
    db=# INSERT INTO xact_test VALUES ('main-txn');
    db=# SAVEPOINT foo;
    db=# SELECT 1 FROM xact_test FOR UPDATE ;
    db=# COMMIT;
    
  39. バックエンドが共有カタログの最新の統計を確実に見るようになりました。 (Tom Lane) (9.5)(9.4)(9.3)
  40. 統計情報コレクタは、通常バックエンドからの要求後、共有カタログについて統計ファイルの更新に失敗していました。この問題は、自動VACUUMランチャーが定期的に更新を生じさせる要求を出すため、部分的に隠されていました。しかし、自動VACUUM を無効にして露見しました。

    共有カタログにはデータベース単位でなく、インスタンス単位の情報が記録されます。

  41. 複数バックエンドが近接して共に更新を要求したとき、統計ファイルの冗長な書き込みを回避するようになりました。 (Tom Lane, Tomas Vondra) (9.5)(9.4)(9.3)
  42. VACUUM でトランザクションID の消費を回避するようになりました。 (Alexander Korotkov) (9.5)(9.4)(9.3)(9.2)(9.1)
  43. 一部ケースで VACUUM は不要に XID を現在トランザクションに割り当てました。通常これはごく僅かですが、XID周回の上限に直面したとき、XID周回対策の VACUUM でさらに多くの XID を消費するのは甚だ良くない動作です。

  44. 9.3 より前のバージョンから pg_upgrade でアップグレードしたインスタンスで、マルチトランザクションID の VACUUM処理にて失敗する可能性があり、修正されました。 (Andrew Gierth, Álvaro Herrera) (9.5)(9.4)(9.3)
  45. 本障害のよくある症状は以下のようなエラーです。

    ERROR:  MultiXactId NNN has not been created yet -- apparent wraparound.
    
  46. カラムリストを指定した手動 ANALYZE ではテーブルの changes_since_analyze カウンタをリセットしなくなりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  47. ANALYZEコマンドは以下のように特定テーブルの特定カラムを指定して実行することができます。

    =# ANALYZE t25 (col1, col2);
    

    このような一部のカラムのみの ANALYZE を行なっている場合に、他のカラムのための自動ANALYZE が阻害されるべきではありません。

  48. ANALYZE で多数のヌルエントリがある、ユニークかほぼユニークなカラムに対する n_distinct の過大評価が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  49. 各 null が、それぞれ別の値である(distinct)とカウントされており、いくつかのクエリ形式では、深刻なプランナの予測間違いに繋がります。

  50. autovacuum で、同じ共有カタログに対して複数のワーカが処理開始するのを避けるようになりました。 (Álvaro Herrera) (9.5)(9.4)(9.3)(9.2)(9.1)
  51. 通常、vacuum は長くかからないので、これは大きな問題になりません。しかし稀に深刻に肥大化したカタログのケースでは、ひとつを除きすべてのワーカが、他のテーブルで有益な作業をせずに、無駄に待機する結果になります。

  52. B-Tree のマーク/リストア処理のバグが修正されました。 (Kevin Grittner) (9.5)
  53. この間違いは、マージジョインの内側ノードが B-Treeインデックススキャンの時に、誤った結合結果やアサーション失敗をひき起こす原因となっていました。

  54. B-Tree インデックスページの削除が中断された時、二重にバッファロック解放が行われるのを回避するようになりました。 (Tom Lane) (9.5)(9.4)
  55. この間違いは、壊れたB-Treeインデックスを伴ういくつかのケースで VACUUM完了を妨げます。VACUUM で以下のエラーが出るケースが報告されています。

    ERROR:  lock main NNNNN is not held
    
  56. 巨大な(shared_buffers を越える)ハッシュインデックスの作成が修正されました。 (Tom Lane) (9.5)
  57. 巨大なインデックスの際に使われるコードパスに不具合があり、誤ったハッシュ値がインデックスに挿入されます。そのため、初期構築後にインデックスに挿入されたタプルを除き、その後のインデックスサーチは常に失敗しました。

    エラーが出るのではなく、本来見つかるべき行が見つからない結果になります。

  58. GiSTインデックス作成で幾何データ型カラムの成分に NaN値を含む場合に無限ループになる可能性が防止されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
  59. box型に対する CREATE INDEX ... USING gist ... コマンドが応答しない動作が、報告されています。

  60. contrib/btree_gistインデックスの intervalカラムを使った、近傍検索(ORDER BY distance) インデックススキャンで、クラッシュする可能性があり、修正されました。 (Peter Geoghegan) (9.5)
  61. BRINインデックスエントリを更新する時、BRINタプルの追加に失敗するケースの PANIC が修正されました。 (Álvaro Herrera) (9.5)
  62. 以下のように PANIC が生じて、マスタプロセスの停止または再起動が生じていました。

    WARNING:  specified item offset is too large
    PANIC:  failed to add BRIN tuple
    
  63. バックグラウンドワーカの停止時に、バックグラウンドワーカを制御するバックエンドプロセスがクラッシュする可能性あり、修正されました。 (Dmitry Ivanov) (9.5)
  64. PL/pgSQL で IMPORT FOREIGN SCHEMA コマンド内の INTO 句の扱いが修正されました。 (Tom Lane) (9.5)
  65. これまで PL/pgSQL内では、INTO 付きの IMPORT FOREIGN SCHEMA が動作しませんでした。

  66. contrib/btree_gin が bigint型の最小値を正しく扱えるように修正されました。 (Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)(9.1)
  67. libpq が将来のサーババージョンを正しく解釈できるようになりました。 (Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)(9.1)
  68. 9.6 以降のリリースでは、サーババージョンが現在の 3 パートから、2パートに変更される計画です。PQserverVersion() がその様な時にも正しい値を返すようになりました。

  69. "unsigned long long" 型の配列要素に関する ecpg コードが修正されました。 (Michael Meskes) (9.5)(9.4)(9.3)(9.2)(9.1)
  70. pg_dump の -c と -C オプションで、不要な CREATE SCHEMA public コマンドが出力されないようになりました。 (David Johnston, Tom Lane) (9.5)(9.4)(9.3)(9.2)
  71. パラレル pg_dump と pg_restore で SIGTERM や Ctrl-C の扱いが改善されました。 (Tom Lane) (9.5)(9.4)(9.3)
  72. ワーカプロセスが速やかに終了するようになり、また、CREATE INDEX の様な長時間実行されるケースに対応するため、クエリキャンセル要求が接続されたバックエンドに送られるようになりました。

  73. パラレル pg_dump と pg_restore のエラー報告が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)
  74. これまでは、pg_dump や pg_restore のワーカプロセスからのエラーメッセージがユーザのコンソールに出力されないことがありました。

    メッセージはマスタプロセスを通して伝達されますが、いくつかデッドロックするシナリオがあり、マスタプロセスのメッセージ伝搬を妨げていました。代わりとして単純に stderr にすべてを出力します。いくつかのケースでは、重複するメッセージが出力されることになります。例えばすべてのワーカがサーバシャットダウンを報告します。

  75. Windows でのパラレル pg_dump や pg_restore で、エラー後は適切に停止するようになりました。 (Kyotaro Horiguchi) (9.5)(9.4)(9.3)
  76. 以前までは、エラーは報告するけれど、ユーザが手動で停止するまで居座っていました。

  77. スタンバイサーバに対するパラレル pg_dump が適切に失敗するようになりました。 (Magnus Hagander) (9.5)
  78. --no-synchronized-snapshots が指定されていない場合、この使い方はサポートされませんが、エラーが適切に処理されていませんでした。

  79. zlib サポートなしでビルドされた pg_dump の振る舞いが改善されました。 (Kyotaro Horiguchi) (9.5)(9.4)(9.3)
  80. パラレルダンプが正しく動作しなかったり、無意味な警告が発せられるケースがありました。圧縮を必要としないオプションであるにも拘らず、以下メッセージが出る場合が報告されています。

    pg_dump: [archiver] WARNING: requested compression not available in this installation -- archive will be uncompressed
    pg_dump: [parallel archiver] not built with zlib support
    
  81. pg_basebackup は -Z 0 で圧縮なし指定と受け取るようになりました。 (Fujii Masao) (9.5)(9.4)(9.3)(9.2)(9.1)
  82. これまでは無効な圧縮レベルであるとして、「pg_basebackup: invalid compression level ...」というエラーになっていました。

  83. パラレルメイクで AIX の共有ライブラリを安全にビルドできるようにmakefile のルールを修正しました。 (Noah Misch) (9.5)(9.4)(9.3)(9.2)(9.1)
  84. TAP テストと MSVC スクリプトが、ビルドディレクトリパス名に空白が含まれていても、動くようになりました。 (Michael Paquier, Kyotaro Horiguchi) (9.5)(9.4)(9.3)(9.2)(9.1)
  85. statement_timeout と lock_timeout の報告が、より予測可能になりました。 (Tom Lane) (9.5)(9.4)(9.3)
  86. 負荷の高いマシンでは、ステートメントタイムアウトが先に発生したのに、ロックタイムアウトが報告されるため、リグレッションテストが時々失敗していました。

  87. デンマーク語とウェールズ語ロケールでのレグレッションテストが安全になりました。 (Jeff Janes, Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  88. これらのロケールで通常と異なるソートルールの引金になるテストデータが修正されました。

  89. タイムゾーンコードのコピーが IANA の tzcode release 2016c に合わせて更新されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  90. これはタイムゾーンデータファイルの将来の変更を見越した対応で必要になります。また通常と異なるタイムゾーンの対処で、稀にあるバグを修正しています。

  91. タイムゾーンデータが tzdata release 2016f に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
  92. ケメロヴォとノヴォシビルスクの夏時間の変更と、アゼルバイジャン、ベラルーシ、およびモロッコの歴史的な修正が含まれます。

  93. hot standby クエリが VACUUM FREEZE でキャンセルされないようになりました。 (Simon Riggs, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
  94. アイドルではないマスタサーバ上の VACUUM FREEZE は、スタンバイサーバのクエリを不必要にキャンセルすることがありました。

  95. pg_ctl start -w のタイムアウトが古いヒューリスティックな方法に戻りました。 (Tom Lane) (9.1)
  96. 9.1.20 から採用された新しい方法は silent_mode が有効な時にうまく動きません。そのため古い方法に戻されました。

PostgreSQL 9.5.3、9.4.8、9.3.13、9.2.17、9.1.22 の変更点


  1. OpenSSLのエラーキューを既にクリアされているとみなすのでなく、OpenSSL呼び出し前にクリアするようになりました。また、確実に呼出し後にクリアしておくようにしました。 (Peter Geoghegan, Dave Vitek, Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)(9.1)
  2. この変更は単一プロセス内に OpenSSLを使った複数の接続があって、エラーキューをクリアするときの規則が一貫していない場合の問題を防止します。

    具体的には、クライアントアプリケーションが、OpenSSL の PHP、Python、または Ruby によるラッパーを使った SSL接続と並行して、libpq で SSL接続を使用した場合に、障害が報告されました。OpenSSL を使用する命令で予想外のエラーが発生します。

    サーバ内でも、拡張モジュールが SSL接続をしにいく場合には同様の問題が起きる可能性があります。

  3. LEFT JOIN の右手側の中の FULL JOIN で、プランナエラー「ERROR: failed to build any N-way joins」が出るのが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  4. メッセージ中の 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));
    
  5. 多段の入れ子ループ内における等価クラステストの誤った扱いが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
  6. X.X = Y.Y = Z.Z のような 3つ以上からなる値の等価クラスが与えられたとき、同値であるようにするために必要な検査の一部を、プランナが無視する可能性があり、出力される結合結果が WHERE句を満たさないことがありえました。

    様々な理由により実際には誤ったプランは滅多に選択されません。そのため、本障害は長い間みつかりませんでした。

    以下のようなプラン形状のときに該当します。

    Nested Loop
      ->  Scan X
      ->  Nested Loop
        ->  Scan Y
        ->  Scan Z
              Filter: Z.Z = X.X
    
  7. operator_precedence_warning = on のときの稀なパーサエラーが修正されました。 (Tom Lane) (9.5)
  8. 以下に発生例を示します。

    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)
    
  9. GINインデックススキャンでの問い合わせ処理内のメモリリークが修正されました。 (Julien Rouhaud) (9.5)(9.4)
  10. GINインデックス挿入において、問い合わせ処理内のメモリリークと、インデックス破損の可能性が修正されました。 (Tom Lane) (9.5) (9.4)
  11. このメモリリークは単純な問い合わせにおいては通常は大きな量になりません。しかし、大きな maintenance_work_mem 値で巨大な GINインデックスを作成するときには、かなりの量になることがありえます。

  12. to_timestamp() における整形コード TH、th、Y,YYY に誤動作の可能性があり、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  13. これらが入力文字列の終端を超えた参照をして、以降の整形コードでゴミが読み取られるおそれがありました。

    また、本障害をデータ露出させる攻撃に使うことは極めて困難と判断されました。

  14. 「値 演算子 ANY ( 配列 )」という構造の「配列」が副問い合わせである場合について、ルールとビューのダンプが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  15. 実行するとエラーになる誤った定義がダンプ出力されていました。以下に障害動作例を示します。

    (正常に実行できる 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[]
    
  16. ALTER SYSTEM パラメータ値で改行が禁止されました (Tom Lane) (9.5)(9.4)
  17. 設定ファイルのパーサは文字列リテラル中に改行が含まれることに対応していません。したがって、ALTER SYSTEM でも禁止すべきでした。

  18. ALTER TABLE ... REPLICA IDENTITY USING INDEX で、OID のインデックスが指定された場合でも適切に動作するように修正されました。 (David Rowley) (9.5)(9.4)
  19. WITH OIDS を指定したテーブルの OID列のインデックスを指定した場合に、クラッシュや奇妙なメッセージが生じることがありました。

  20. テーブルスペースのシンボリックリンクを削除するのに失敗した後に起きる可能性があった誤動作を回避するようになりました。 (Tom Lane) (9.5)
  21. アラインメントにうるさいプラットフォーム上でのロジカルデコーディングのクラッシュが修正されました。 (Tom Lane, Andres Freund) (9.5)(9.4)
  22. トランザクションが溢れてディスクに書き出されるだけの大きさであり、かつ、トランザクション中で主キーが変更される場合に限って、障害が発生します。

  23. walsenderプロセスが停止しようとしている間、receiverからのフィードバックのためのリクエストが繰り返されるのを回避するようになりました。 (Nick Cleaton) (9.5)(9.4)
  24. pg_regress が PGCTLTIMEOUT環境変数で指定された起動タイムアウトを使うようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  25. 一つ前のマイナーリリースで pg_ctl が PGCTLTIMEOUT を参照するようになっていて、これと一貫性を持たせるための変更です。遅いマシンでのテストを容易にします。

  26. pg_upgrade が、拡張モジュールの一つだけの演算子クラスを含む演算子族の所属を正しくリストアできるように、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  27. このような場合、演算子族は新しいデータベースにリストアされますが、拡張モジュールの一部であるとマークされませんでした。即座には悪影響は生じませんが、後に pg_dump を実行して、それをリストアする時に(無害ですが)エラーが生じます。

  28. pg_upgrade が、新クラスタの TOAST規則が旧クラスタと異なるときに失敗しないように、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)
  29. pg_upgrade には、あるテーブルに旧バージョンでは TOASTテーブルが無く、新PostgreSQLバージョンではそのテーブルは TOASTテーブルを持つべきという場合を扱う処理実装が含まれていました。

    この実装が壊れていたため、このような場合には何もしないように修正されました。実際のところ、アップグレード後のクラスタで旧バージョンの規則にしたがってテーブルに付随する TOASTテーブルが無かったとしても、特に問題ないと考えられます。

  30. IBM の XLCコンパイラを使ったときの PPCアーキテクチャむけアトミック操作が修正されました。 (Noah Misch) (9.5)
  31. --disable-spinlocks を指定したビルドから使われる SysVセマフォの数を減らしました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
  32. NetBSD のライブラリ関数との衝突を避けるため、内部関数 strtoi() が strtoint() に名前変更されました。 (Thomas Munro) (9.5)(9.4)(9.3)(9.2)(9.1)
  33. Windows における bind()、listen() からのエラー報告が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  34. ソケットエラーについて Windows と Unix のエラー番号変換が拡充されました。これまで「could not bind IPv4 socket: No error」といったエラーが出ていたケースで有益なエラーメッセージが得られるようになります。

  35. Visual Studio むけビルドスクリプトで、コンパイラ出力の verbosity設定(冗長さ)を detailed から normal に減らしました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
  36. Visual Studio 2015 でのビルドをサポートしました。 (Michael Paquier, Petr Jelínek) (9.5)
  37. VS2015 でビルドされたプログラムは、Windows Vista より以前の Windows では動作しません。(locale 判定の方法が変更されたため)

  38. Visual Studio 2013 で正しく動作するように putenv() を修正しました。 (Michael Paquier) (9.5)(9.4)(9.3)
  39. Windows の FormatMessage() 関数の安全でない可能性がある利用を避けるようにしました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
  40. FORMAT_MESSAGE_IGNORE_INSERTS フラグを適切な箇所で使います。既知のバグはありませんが、注意するのは良いことです。

  41. タイムゾーンデータが tzdata release 2016d に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
  42. ロシアとベネズエラの夏時間の変更。新しいゾーン名 Europe/Kirov と Asia/Tomsk があり、これらの地域は、隣接する地域とは異なるタイムゾーンの歴史を持っています。

  43. 9.4系でのメモリバリアコードの変更を 9.2 と 9.3 にバックポートしました。 (Tom Lane) (9.3)(9.2)
  44. これらの変更は 9.4以前のブランチでは元々は不要でした。しかし最近、バリアコードを正しく動作させる修正がバックパッチされました。IA64(iccを使った時), HPPA, Alpha のプラットフォームが影響を受けます。

PostgreSQL 9.5.2、9.4.7、9.3.12、9.2.16、9.1.21 への変更点


  1. Cロケール以外での文字列ソートに短縮キーが使えなくなりました。 (Robert Haas) (9.5)
  2. PostgreSQL 9.5 から、strcoll() に代えて strxfrm() を使うことで文字列比較を高速化する仕組みが導入されました。現在ほとんどのバージョンの glibc で、一部ロケールにおいて strxfrm()の実装が誤っていて、比較結果が strcoll() と一致しないことが明らかになりました。この問題がよく把握されるまで、この最適化はCロケール以外では無効となりました(Cロケールの場合、strcoll() も strxfrm() 使わないので安全です)。

    この変更は、文字列データ型に対するソートのみならず B-treeインデックス上の並び順にも影響します。バージョンアップ後に REINDEX が必要です。

    ここで影響のあるロケールの網羅的なリストを示すことはできません。Cロケールは安全です。en_US のような英語ベースのロケールは問題ないと見られます。de_DE など、その他の一般的なロケールは、ほとんどのglibc バージョンで影響があります。

  3. キャッシュされたプランで行セキュリティ状態を適切に保つようになりました。 (Stephen Frost) (9.5)
  4. 2つ以上のロールで問い合わせが実行されるセッションでは、プランキャッシュが他のロールで生成されたプランを誤って再利用する可能性があり、これにより、行単位セキュリティが使われているとき、間違ったポリシーセットが適用されるおそれがありました。(CVE-2016-2193)

  5. contrib/pageinspect拡張モジュールの新たな関数に管理者ユーザであるかのチェックが追加されました。 (Andreas Seltenreich) (9.5)
  6. bytea型データを解析する pageinspect拡張モジュールの大部分の関数は、一般ユーザからの呼び出しを許可していませんが、brin_page_type() とbrin_metapage_info() ではチェックが漏れていました。

    作りこまれた byteaデータをこれらの関数に渡すことで、サーバをクラッシュさせたり、わずかなサーバメモリを露出させることができるかもしれません。(CVE-2016-3065)

  7. インデックス付けされた ROW() の比較について修正されました。 (Simon Riggs) (9.5)
  8. ここで ROW() とは複数カラムの1行データを指します。ROW(1, 100, 'A') のように記述しますが、単に (1, 100, 'A') のようにも書きます。

    複数カラムに条件を付けて検索した場合に、インデックス順序が一部だけ適合するような複合インデックスが使われると誤った結果が返ることがありました。以下に例を示します。

    db=# CREATE TABLE t1 AS
           SELECT (10 + random() * 10)::int AS c1,
                round((10 + random() * 10)::numeric, 5) AS c2
             FROM generate_series(1, 10000) g;
    
    db=# SELECT count(*) FROM (
           SELECT * FROM t1 WHERE (c1, c2) < (20, 11)
             ORDER BY c1 DESC, c2) v;
    
    db=# CREATE INDEX idx_t1 ON t1 USING btree (c1 DESC, c2 ASC);
    
     → インデックス作成後、再度、上記の SELECT を行うと結果が異なることがある
    

    9.5.0 で導入された最適化が原因です。より良い修正方法が得られるまで、ひとまず当該の最適化を除去するものとなりました。

  9. インデックス付けされた ROW() の比較において、NULLインデックス項目の誤った扱いが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  10. 「 ROW(a, b) > ROW('x', 'y') 」のような行比較をするインデックス検索が、bカラムで NULLに当たるとそこで止まってしまいました。そのため誤った結果が返る可能性があります。

    以下に問題発生例を示します。本例末尾の SELECT文は、"Seq Scan" 以外の全てのインデックスを使うプランタイプにおいて誤った出力になります。

    (間に b=NULL の行が1000行挟まっているデータを作成)
    db=# CREATE TABLE t2 (id int primary key, a text, b text);
    db=# INSERT INTO t2 VALUES (0, 'a', 'b');
    db=# INSERT INTO t2 SELECT g, 'a', NULL FROM generate_series(1, 1000) AS g;
    db=# INSERT INTO t2 VALUES (1001, 'z', 'y');
    
    (正しい出力)
    db=# SELECT a, b FROM t2 WHERE (a, b) > ('a', 'a') ORDER BY a, b;
     a | b
    ---+---
     a | b
     z | y
    (2 rows)
    
    (インデックスが使われて、誤った出力)
    db=# CREATE INDEX idx_ab_t2 ON t2 (a, b);
    db=# SELECT a, b FROM t2 WHERE (a, b) > ('a', 'a') ORDER BY a, b;
     a | b
    ---+---
     a | b
    (1 row)
    
  11. 前後に適切な fsync() 実行の無いファイル名変更によるデータ損失シナリオを回避するように修正されました。 (Michael Paquier, Tomas Vondra, Andres Freund) (9.5)(9.4)(9.3)(9.2)(9.1)
  12. 電源断など OS/ハードウェアが異常停止した際にデータが壊れるおそれがありました。ただし、発生の可能性は低いといえます。

  13. SELECT ... FOR UPDATE/SHARE を行い、かつ、ロックを必要としないリレーションも含むクエリにおいて、同時に変更された行の再チェックを行うときの振る舞いが修正されました。 (Tom Lane) (9.5)
  14. ロックされないリレーションに由来する行が、再チェックの間、全て NULL であるかのように誤って扱われていました。このことで、更新された行が WHERE条件を満たさなくなったと誤って判断されたり、誤って NULL が出力される可能性がありました。

    以下の再現例が報告されています。

    db=# CREATE TABLE t3 (id int primary key, v text);
    db=# CREATE TABLE t4 (id int primary key, v text,
           CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES t3 (id));
    db=# INSERT INTO t3 VALUES (1, 'A');
    db=# INSERT INTO t4 VALUES (1, 'B');
    
    (接続その1)             (接続その2)
    db=# BEGIN;
    db=# UPDATE t3 SET v = 'A' WHERE id = 1;
    db=#
                            db=# pset null *null*
                            db=# SELECT t3.v AS t3v, 
                                   (SELECT t4.v FROM t4 WHERE t3.id = t4.id) AS t4v
                                   FROM t3 WHERE t3.id = 1 FOR UPDATE OF t3;
                            ...ロック待ち...
    db=# COMMIT;
                            ...ロック待ち解除後に応答に NULL が混入...
                              t3v |  t4v
                             -----+--------
                              A   | *null*
                             (1 row)
    
  15. json_to_record() 関数の障害が修正されました。 (Tom Lane) (9.5)(9.4)
  16. 入力オブジェクトがサブオブジェクトを含み、そのフィールド名が要求された出力カラム名のどれかに一致していた場合に、エラーになったり、出力が不正になったりしていました。

    以下に例を示します。

    db=# SELECT * FROM json_to_record('{"a":0,"b":{"c":1,"a":2}}'::json)
                       AS t(a int , b text);
    ERROR:  invalid input syntax for integer: "{"c":1,"a":2"
    
    正しい出力は以下です。
     a |       b
    ---+---------------
     0 | {"c":1,"a":2}
    (1 row)
    
    db=# pset null *null*
    db=# SELECT t.c FROM json_to_record('{"a":1,"b":{"c":16,"d":2},"x":8}'::json)
                         AS t(a int, b json, c text, x int);
        c
    ---------
     {"c":16
    (1 row)
    
    正しい出力は以下です。サブオブジェクトは取得できないのが正常です。
       c
    --------
     *null*
    (1 row)
    
  17. jsonb_object() 関数を 2引数で空配列にて呼び出した場合について修正されました。 (Michael Paquier, Andrew Dunstan) (9.5)
  18. 以下のようなエラーが発生していました。

    db=# SELECT jsonb_object('{}'::text[], '{}'::text[]);
    ERROR:  unknown type of jsonb container
    
    正しい出力は以下。空のJSONBオブジェクトが返る。
     jsonb_object
    --------------
     {}
    (1 row)
    
  19. jsonb_set() 関数にて、パス配列の要素が配列添え字として使う整数に変換されるときの誤動作が修正されました。 (Michael Paquier) (9.5)
  20. 与える添え字用の値によっては不適切なエラーが出ることがあります。また、最悪の場合にはクラッシュをひき起こす可能性があります。

    (正常動作の場合)
    db=# SELECT jsonb_set('{"a":[1],"b":[]}'::jsonb, '{"a",1}'::text[], '100');
           jsonb_set
    -----------------------
     {"a": [1, 100], "b": []}
    (1 row)
    
    db=# SELECT jsonb_set('{"a":[1],"b":[]}'::jsonb, '{"a",9999}'::text[], '100');
    ERROR:  path element at the position 2 is not an integer
    
  21. to_char() のテンプレートパターン「OF」による負のタイムゾーンオフセットの誤った整形が修正されました。 (Thomas Munro, Tom Lane) (9.5)(9.4)
  22. (9.5.2 実行例)
    db=# SET timezone = '00:30';
    SET
    db=# SELECT to_char(now(), 'OF');
     to_char
    ---------
     -00:30
    (1 row)
    
    (9.5.1 実行例)
    db=# SET timezone = '00:30';
    SET
    db=# SELECT to_char(now(), 'OF');
     to_char
    ---------
     +00:30
    (1 row)
    
    (9.4.6 実行例)
    db=# SET timezone = '00:30';
    SET
    db=# SELECT to_char(now(), 'OF');
     to_char
    ---------
     +00:-30
    (1 row)
    
  23. INSERT ... ON CONFLICT による待機について誤ったログ出力の可能性があり、修正されました。 (Peter Geoghegan) (9.5)
  24. 原因となる制約が無いにも拘らず、排他制約のために待ちが生じたとログ出力されていました。

    log_lock_waits = on を設定した時のログで CONTEXT: に以下のように出力されます。

    LOG:  process 12345 acquired ShareLock on transaction 1234 after 12345.678 ms
    CONTEXT: while checking exclusion constraint on tuple (1,2) in relation "t3"
    
  25. リカバリが一貫性のある状態に達するまで、recovery_min_apply_delay パラメータを無視するようになりました。 (Michael Paquier) (9.5)(9.4)
  26. これまでスタンバイサーバは、データベースを有効な状態にするために必要とされるWALの初期部分を再生するときであっても、recovery_min_apply_delay 設定に対応して WALレコード適用を遅延していました。

    スタンバイサーバは一貫性のある状態に到達するまで使えないため、この動作は役に立たないと判断されました。

  27. サーバのスタートアップ中、pg_subtrans が XID周回に近い場合について正しく処理するように修正されました。 (Jeff Janes) (9.5)(9.4)(9.3)(9.2)(9.1)
  28. 上記の「スタートアップ中」は、リカバリ中やスタンバイサーバ稼動中の状態が含まれます。

    pg_subtrans/ 以下にファイルが大量に作られる現象が報告されています。

  29. ロジカルデコーディングにおけるいくつかの障害が修正されました。 (Andres Freund) (9.5)(9.4)
  30. 問題ケースには以下が含まれます。

    テーブルに指定された REPLICA IDENTITY が FULL であって変更タプル群が 1ページよりも大きい場合にアサート失敗を、またアサート無しのビルドで何らかの不正動作を、引き起こします。

    ディスクへのスプールを要するほどに大きいトランザクション内でのプライマリキーを変更する UPDATE で新旧データが入れ替わってしまいました。

    不正なエラー「ERROR: subxact logged without previous toplevel record」が発生することがありました。

    9.5.x で誤ったトランザクションのコミット時刻が報告されました。

  31. 入れ子になったセキュリティバリアビューについて、外側のビューが相関サブクエリを含むWHERE句を持つときのプランナの誤りが修正されました。 (Dean Rasheed) (9.5)(9.4)
  32. 以下の v2 のような形のビュー定義が該当します。

    CREATE VIEW v1 WITH (security_barrier = true) AS
      SELECT * FROM t1 WHERE (c1 > 0)
      WITH CHECK OPTION;
    
    CREATE VIEW v2 WITH (security_barrier = true) AS
      SELECT * FROM v1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.c1 = v1.c1)
      WITH CHECK OPTION;
    

    ビューの参照時に予期せぬエラー「ERROR: XX000: plan should not reference subplan's variable」がでるケースが報告されました。

  33. GINインデックス検索でメモリリークが修正されました。 (Tom Lane) (9.5)
  34. ロケール機能の実装コードが稀な状況でメモリ二重解放によりクラッシュすることがあり、修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  35. 全文検索の ispell辞書むけ接辞ファイル(AffFile)の読み取りが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  36. 大文字小文字変換でバイト長が変わる文字が含まれている接辞ファイルに対して動作が狂うかもしれませんでした。例えばトルコ語で UTF8 のロケールにおける「I」が該当します。

  37. ispell辞書ファイルの読み取りで sscanf() を使わないようになりました。 (Artur Zakirov) (9.5)(9.4)(9.3)(9.2)(9.1)
  38. これにより Mac OS X を含む FreeBSD派生のプラットフォームにおける移植性の問題を回避します。

  39. IBM xlcコンパイラでの PPC 上のアトミック操作コードが修正されました。 (Noah Misch) (9.5)
  40. この誤りは該当プラットフォーム上で稀に同時操作の失敗をもたらします。

  41. Visual Studio 2013 でビルドした PostgreSQL が、AVX2-capable CPU を使ったサーバ上の古いバージョンの Windows (7 sp1 / 2008R2 sp1より古い) でクラッシュするのを回避するように修正されました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
  42. 修正は Microsoft が修正しないと表明している Visual Studio 2013 のランタイムライブラリのバグを回避するものです。

  43. psql のタブ補完がマルチバイト文字を適切に扱えるように修正されました。 (Kyotaro Horiguchi, Robert Haas) (9.5)(9.4)(9.3)(9.2)(9.1)
  44. SECURITY LABEL に対する psql のタブ補完が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  45. SECURITY LABEL の後 TAB を押すとクラッシュしたり、あるいは、不適切なキーワードが提示される可能性がありました。

  46. pg_ctl がコマンドラインに指定がなくとも PGCTLTIMEOUT環境変数による待機タイムアウトを受け入れるようになりました。 (Noah Misch) (9.5)(9.4)(9.3)(9.2)(9.1)
  47. 本環境変数の参照は本マイナーバージョンで追加された動作となります。

  48. pg_ctl にて Windowsサービス状態の検査が修正されました。 (Manuel Mathar) (9.5)(9.4)(9.3)(9.2)(9.1)
  49. 前のマイナーリリースで、ログメッセージを Windowsイベントログに出すかどうか適切に判断する修正が試みられましたが、逆さまに検査していました。

  50. pgbench が -C と -M prepared オプションの組み合わせを正しく扱えるように修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  51. これまでは当該オプション組み合わせでは動作しませんでした。

  52. pg_upgrade で、新データディレクトリが旧データディレクトリ内にあるとき削除スクリプトの作成を省略するようになりました。 (Bruce Momjian) (9.5)(9.4)(9.3)
  53. 上記ケースで盲目的にこのスクリプトを適用すると結果として新データディレクトリが失われてしまいます。

  54. PL/Perl で空の PostgreSQL配列を空の Perl配列に適切に変換できるように修正されました。 (Alex Hunsaker) (9.5)(9.4)(9.3)(9.2)(9.1)
  55. PL/Python で有効な Python識別子でない関数名をうまく処理できるようになりました。 (Jim Nasby) (9.5)(9.4)(9.3)(9.2)(9.1)
  56. contrib/pgstattuple の pgstatindex()関数が返す統計について、いくつかの誤りが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  57. デッドページが有効なページと報告されていました。インデックスメタページがインデックスサイズに含まれていませんでした。ルートページが internal_pages に含まれていませんでした。ドキュメントもいくつか修正されました。

    本修正前後のマイナーバージョンでの結果と数値比較をする場合には注意が必要となります。

  58. psed が Perl本体で提供されなくなったため、MSVCビルドで psed への依存が除かれました。 (Michael Paquier, Andrew Dunstan) (9.5)(9.4)(9.3)(9.2)(9.1)
  59. タイムゾーンデータファイルが tzdata release 2016c に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
  60. アゼルバイジャン、チリ、ハイチ、パレスチナ、ロシア(アルタイ、アストラハン、キーロフ、サハリン、ウリヤノフスク地域)の夏時間法の変更、加えて、リトアニア、モルドバ、ロシア(カリーニングラード、サマラ、ヴォルゴグラード)の歴史的修正が含まれます。

PostgreSQL 9.5.1、9.4.6、9.3.11、9.2.15、9.1.20 への変更点


  1. 正規表現での無限ループやバッファオーバーランの問題が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  2. 非常に大きな文字範囲のブラケット式で、無限ループになったり、メモリのオーバーライトが起こっていました。本問題は CVE-2016-0773 として登録されています。

    (障害発生する例)
    SELECT regexp_matches('a', '[x0-x7fffffff]', 'i');
    
  3. ハッシュ結合で内側リレーションの一部タプルがまれに結合で欠ける場合があり、修正されました。 (Tomas Vondra, Tom Lane) (9.5)
  4. グループ化セットが使われる時は HAVING 句のプッシュダウンはされないようになりました。 (Andrew Gierth) (9.5)
  5. ON CONFLICT構文の WHERE句の SQL文再構成について、修正されました。 (Peter Geoghegan) (9.5)
  6. 一部のケースで ON ONFLICT .. WHERE を含むルール定義の出力が正しくなく、ダンプ/リストアに失敗する可能性があります。

  7. log_line_prefix 設定におけるエスケープ %h、%r を log_connections 設定によるメッセージにも機能するようにしました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  8. これまで %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;
    
  9. SSPI認証でトークンハンドルのリーク(クローズ漏れ)が修正されました。 (Christian Ullrich) (9.5)(9.4)(9.3)(9.2)(9.1)
  10. psql det コマンドでのパターン引数の解釈が修正されました。 (Reece Hart) (9.5)(9.4)(9.3)(9.2)(9.1)
  11. スキーマ修飾付きかもしれないパターンに対して他の 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)
    
  12. Windows における pg_ctl でサービス状態を確認して、ログメッセージの出力先を決めるようになりました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
  13. これまで pg_ctl から出力されるメッセージをリダイレクションで取得できない問題がありました。

  14. pg_dump が拡張モジュールに属するデータベースオブジェクトを処理するときの例外的なケースの障害がいくつか修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  15. pg_dump におけるドメイン名の不適切なクオート付けが修正されました。 (Elvis Pranskevichus) (9.5)
  16. クオートを重複して付ける動作がありました。

  17. pg_dump がビューのトリガにそのルールの後に処理される必要があると印づけするようになり、パラレルpg_restore での失敗の可能性が予防されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
  18. pgbench でスクリプトに指定された除算や剰余演算子の評価における例外的なオーバーフロー条件での浮動小数点例外が防止されました。 (Fabien Coelho, Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
  19. 9.3.x 以前のサーバに接続するときに pg_receivexlog が出力する無意味で混乱を招く警告メッセージが抑止されました。 (Marco Nenciarini) (9.5)
  20. 9.3.x 以前のサーバは IDENTIFY_SYSTEM コマンドに対応していないために、「could not identify system: ...」というメッセージが出ていました。

  21. plpython2 と plpython3 を両方使うときのダンプ読み込みの問題を回避するようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
  22. (複数バージョンの libpython は安全に並行使用できませんが)同一セッションでなければ、原則として両バージョンの PL/Python を同一データベースで使用可能です。しかしながら、pg_restore と pg_upgrade はこの同一セッションの制約に抵触することがあります。これを PL/Python が読み込むコードをチェックするタイミングを変えることで回避しています。

  23. PL/Python の回帰テストが Python 3.5 で通るようになりました。 (Peter Eisentraut) (9.5)(9.4)(9.3)(9.2)
  24. ある種の PL/Javaパラメータがスーパーユーザ以外から設定できてしまうのが防止されました。 (Noah Misch) (9.5)(9.4)(9.3)(9.2)(9.1)
  25. この変更は PL/Java のセキュリティ障害(CVE-2016-0766)を軽減します。PL/Java は PostgreSQL本体には含まれませんが、本修正によりカスタム設定パラメータ pljava.classpath は、superuserコンテキストに設定されます。

  26. ecpgで提供されるヘッダファイルが、プリプロセッサ命令行にコメントを含まないように修正されました。 (Michael Meskes) (9.5)(9.4)(9.3)(9.2)(9.1)
  27. hstore拡張モジュールの hstore_to_json_loose() 関数で、値を JSON数値に変換可能であるかの判定が修正されました。 (Tom Lane) (9.5)(9.4)(9.3)
  28. これまで本関数では構文的に不正な 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)
    
  29. postgres_fdw 拡張モジュールで、更新命令の AFTER ROW トリガーまたはRETURNING 式で tableoid を使う場合の障害が修正されました。 (Etsuro Fujita, Robert Haas) (9.5)(9.4)
  30. 上記の場合にこれまで外部テーブルの tableoid カラム値として正しくない値が返っていました。

  31. 実装上の定数 NAMEDATALEN (識別子の最大長) とMAX_LEVENSHTEIN_STRLEN (レーベンシュタイン距離計算における最大長)との間で NAMEDATALEN <= MAX_LEVENSHTEIN_STRLEN という限定が除かれました。 (Robert Haas, Tom Lane) (9.5)
  32. ワイルドカードでリンカに与えられるファイル名を固定順にすることで、ビルド出力の再現性が改善されました。 (Christoph Berg) (9.5)(9.4)(9.3)
  33. 同じ条件で生成された実行ファイルにビットレベルでの差異が生じるのを防ぎます。

  34. MSVCビルドで dynloader.h がインストールされるヘッダファイルに含まれるようになりました。 (Bruce Momjian, Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
  35. タイムゾーンデータファイルが tzdata release 2016a に更新されました。 (9.5)(9.4)(9.3)(9.2)(9.1)
  36. ケイマン諸島、メトラカトラ、ザバイカリエ地方(Zabaykalsky Krai) の夏時間法が変更され、パキスタンの歴史的な訂正が加わりました。

  37. json_path_ops 演算子クラスの GIN インデックスにおける一貫性に欠けたハッシュ計算が修正されました。 (Tom Lane) (9.4)
  38. 同じ入れ子レベルにスカラとサブオブジェクトの両方を含む jsonb 値を処理するとき、見つかるべき項目が見つからないことがありえました。本修正を適用するには、アップグレード後に該当のインデックスを REINDEX する必要があります。

    json_path_ops 演算子クラスは jsonb型に対する "@>" 演算子に GINインデックスを適用するのに使われます。

  39. postmaster.pid ファイルが削除されたなら imediateシャットダウンを行うようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  40. PostgreSQL のマスタープロセスは postmaster.pid ファイルが在り、自身の PID が書かれているかを毎分確認し、無かったり PID が違った場合には immediate シャットダウンをするようになりました。

    リリース情報に明記されていませんが、PostgreSQL 9.5.0 では既にそのようになっています。

  41. SERIALIZABLEトランザクション隔離モードで、INSERT時の競合状態のために直列化例外が見逃されることがあり、修正されました。 (Kevin Grittner, Thomas Munro) (9.4)(9.3)(9.2)(9.1)
  42. ごく限定されたタイミングでの同時実行で発生し、エラーを出すべきところで直列化されていない結果が返される動作となります。

  43. UNLOGGEDテーブルに対して ALTER TABLE ... SET TABLESPACE を実行したとき、適切なWALレコードが出力されない障害が修正されました。 (Michael Paquier, Andres Freund) (9.4)(9.3)(9.2)(9.1)
  44. テーブルのデータについては WAL出力対象外であるとしても、テーブルスペース移動は WAL出力すべきでした。そうでないと、スタンバイサーバが昇格したときにアクセス不能になります。

  45. クラッシュリカバリの最後に UNLOGGED なテーブル・インデックスが初期化されない可能性があり、修正されました。 (Andres Freund, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  46. よくある症状として、スタンバイを昇格させた後に以下のエラーが出ます。

    ERROR:  index "..." contains unexpected zero page at block 0
    
  47. wal sender のスロットが再使用時に完全に再初期化されるようになりました。 (Magnus Hagander) (9.4)(9.3)
  48. ここでのスロットは wal sender プロセスのための共有メモリ上のデータ構造であって、pg_create_physical_replication_slot 関数で作る物理レプリケーションスロットとは別物です。

  49. ALTER TABLE ... ALTER COLUMN TYPE が CHECK制約を適切に継承するように改修されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  50. 親テーブルでカラムデータ型を変更すると当該カラムに対する CHECK制約の継承関係が壊れてしまいます。また、以下の奇妙なエラーが生じていました。

    db1=# ALTER TABLE parenttable DROP CONSTRAINT parentconstraint_1;
    ERROR:  relation 23456 has non-inherited constraint "parentconstraint_1"
    
  51. REASSIGN OWNED コマンドが複合型の所有者も変更するように修正されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
  52. REASSIGN OWNED コマンドおよび ALTER ... OWNER コマンドが、データ型、外部データラッパ、外部サーバの所有者変更にあたって、適切にアクセス制御リストを更新するように修正されました。 (Bruce Momjian, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
  53. 所有者だけ変えて、アクセス制御リストは更新しない動作がありました。

  54. REASSIGN OWNED コマンドが外部ユーザマッピング(ユーザマップ)を無視するように変更されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)
  55. 以下のような奇妙なエラーが出るケースが報告されていて、これを回避します。

    ERROR: unexpected classid 1418 SQL state: XX000"
    
  56. 更新可能ビューむけの問い合わせ書換えの後にクラッシュする可能性があり、修正されました。 (Stephen Frost) (9.4)(9.3)
  57. キャッシュを参照する部分が更新処理を含む場合には安全ではありませんでした。

  58. LATERAL参照の扱いについてプランナが修正されました。 (Tom Lane) (9.4)(9.3)
  59. 例外的な場合に以下のエラーが生じることがありました。

     ERROR: failed to build any N-way joins
     (N-way の N には 2-way など数字が入る)
    
     ERROR: could not devise a query plan
    
  60. インデックス内部の統計情報が古い場合に、GINインデックススキャンの粗悪なプランナコスト見積もりが生じるのを防ぐように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  61. GINインデックスのプランナコスト見積りが、インデックスアドバイザプラグインによる仮定のインデックスに対して改善されました。 (Julien Rouhaud) (9.4)(9.3)(9.2)(9.1)
  62. 実在しないGINインデックスには内部統計情報が無いため、ダミーの代替データを用意する必要があり、これまでは不十分な実装でした。

  63. EXPLAIN とルールのダンプで重複しないテーブル別名の生成が高速化されました。また、生成される別名が確実に最大識別子長を超えないように修正ました。 (Tom Lane) (9.4)(9.3)
  64. ROW() や VALUES() 内の行変数のダンプが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  65. 以下のようなビュー定義に対して、ダンプ出力が実際には適用できない内容になっていました。

    (修正前の動作)
    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)
    
  66. dete型、timestamp型の -infinity値を、json型、jsonb型に変換するとき、+infinity になってしまう障害が修正されました。 (Tom Lane) (9.4)
  67. (修正前の誤った振る舞い例)
    db1=# SELECT to_json('-Infinity'::date);
      to_json
    ------------
     "infinity"
    (1 row)
    
  68. numeric型データの除算で内部オーバーフローが生じる可能性があり、修正されました。 (Dean Rasheed) (9.4)(9.3)(9.2)(9.1)
  69. 正規表現で先行検索制約の制限が無視される誤りがあり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  70. マニュアル記載では、先行検索制約には、後方参照(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)
    
  71. 先行参照制約が含まれるとき、正規表現のインデックススキャン範囲への変換で不正確な範囲が生じる可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  72. インデックスが利用される場合に不正な検索結果が返る可能性がありました。

    (修正前の動作/正しくは「(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)
    
  73. 正規表現のコンパイラが ^、$、先行参照制約のループを扱えるように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  74. これらを扱えるようにセキュリティ障害 CVE-2007-4772 の修正が以前(7.4.19 など) に適用されていましたが、それは不十分なものでした。

    (以下の正規表現は無限ループやキャンセル時のクラッシュを引き起こしていました)
    db1=# SELECT 'a' ~ '(^$)*';
     ?column?
    ----------
     t
    (1 row)
    
    db1=# SELECT 'dd x' ~ '(^(?!aa)(?!bb)(?!cc))+';
     ?column?
    ----------
     t
    (1 row)
    
  75. 正規表現のコンパイラにおいてメモリ利用の計算が改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  76. これまで途方もない時間とメモリを要していたいくつかの場合について、「ERROR: invalid regular expression: regular expression is too complex」を出すようになりました。

    これまでも似た意味で「ERROR: invalid regular expression: nfa has too many states」を出すことはありました。メッセージは前述のものに統合されています。

  77. 正規表現のコンパイラの性能が改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  78. Windowsにおいて、共有メモリを必要としない子プロセスで共有メモリマッピングハンドルを確実にクローズするようになりました。 (Tom Lane, Amit Kapila) (9.4)(9.3)(9.2)(9.1)
  79. この誤りは、logging_collector = on のとき、バックエンドクラッシュ後の自動再起動におけるリカバリの失敗を引き起こしていました。

  80. Windows のノンブロッキングモードでソケットの EOF を検知するのに失敗する可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  81. 修正対象の 9.4.x 以前の各バージョンで問題が起きるか明らかではありませんが、起きていたとすれば、その症状は walsender プロセスが接続は失われているのに際限なく待つというものであるはずです。

    9.5.x では既に修正済みです。

  82. psql で端末ウィンドウのサイズが変更されたとき、確実に libreadline のスクリーンサイズの認識が更新されるようになりました。 (Merlin Moncure) (9.4)(9.3)(9.2)(9.1)
  83. これまでは libreadline は問い合わせ出力中にウィンドウがリサイズされても気づかず、その後での複数行にわたる問い合わせの入力で奇妙な振る舞いをひき起こしていました。

  84. psql にて、これまでの接続が Unixドメインソケット経由であってc コマンドに新ホスト名と同ユーザ名を指定した場合に、クラッシュする可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  85. pg_ctl start -w で子プロセス状態の検査をヒューリスティックに頼らず直接行うようになりました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  86. これまで pg_ctl は新たなマスタープロセスは常に 5秒以内に postmaster.pidを作るであろうという仮説に依存していました。これは高負荷システムでは失敗する可能性があり、「could not start server」という誤った報告をひき起こします。

    Windows 以外では、本修正で、pg_ctl start -w を他の PostgreSQL起動コマンドの直後に実行したときに確実に失敗するようにもなります。これまでは最初のコマンドから 2秒以内に実行したときは (既存のプロセスが自身で起動したプロセスと見做されて) 成功と報告されました。

  87. pg_ctl start -w で接続試験にワイルドカードのリッスンアドレスを使おうとしないように修正されました。 (Kondo Yuta) (9.4)(9.3)(9.2)(9.1)
  88. pg_ctl は PostgreSQLサーバプロセスの起動確認にて、listen_addresses に 0.0.0.0 や :: が指定されていると、これらの値をそのままアドレスとして使用しますが、Windows では失敗します。それぞれ代わりに 127.0.0.1、::1 を使うべきでした。

    Windows 以外では pg_ctl は Unixドメイン接続を使うので問題となりませんでした。

  89. pg_dump と pg_basebackup で、8GB を超える tarアーカイブ要素を扱うため、GNU 慣例が採用されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  90. tarフォーマットの POSIX標準では 8GB を超える tarアーカイブの要素を許可していませんが、ほとんどの近代的な tar の実装ではこれを可能とする拡張をサポートしています。

    本修正で、pg_dump -Ft において 8GB 以上のテーブルが、また、pg_baesbackup -Ft において 8GB 以上のファイルが扱えるようになりました。これまでは 4GB から 8GB の間のサイズの要素についても、一部プラットフォームでは失敗し、リカバリできない問題がありました。

  91. pg_dump でリレーションのオプション値が確実に適切にクオートされるようになりました。 (Kouhei Sutou, Tom Lane) (9.4)(9.3)(9.2)(9.1)
  92. ここでのリレーションのオプション値とは、テーブル、インデックス、ビューの定義に WITH (options) で与えられるものを指します。システムカタログの pg_class.reloptions に定義が格納されます。

    これまで、オプション値がシンプルな識別子や数値でない場合にダンプ/リロードにて pg_dump による CREATE文の構文エラーで失敗していました。

    PostgreSQL本体でサポートされているオプション値では問題ありませんが、拡張モジュールによるオプション値で問題が発生しました。

  93. パラレル pg_dump でパスワードプロンプトが繰り返し出るのが防止されました。 (Zeus Kronion) (9.4)(9.3)
  94. Windows における pg_upgrade のファイルコピーでエラーを適切に扱うようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)
  95. pg_receivexlog と pg_recvlogical でローカライズメッセージ出力の失敗が修正されました。 (Ioseph Kim) (9.4)(9.3)(9.2)
  96. ソケットの EOF を検知したときの libpq 入力バッファの早すぎる消去が修正されました。 (Tom Lane) (9.4)(9.3)
  97. この誤りにより libpq が、サーバからの予期せぬ切断を報告する手前の、バックエンドの最後のエラーメッセージを報告しないことが起こりまし

  98. libpq のメモリ不足状況での振る舞いが改善されました。 (Michael Paquier, Amit Kapila, Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)
  99. これまで libpq が応答データを構成しているときにメモリ不足になると、サーバからのデータを待つ状態でハングアップしてしまいました。これが適切にエラーを出してクライアントに処理を戻すようになりました。

  100. ecpg が出力する typedef 文の引数順序が修正されました。 (Michael Meskes) (9.4)(9.3)(9.2)(9.1)
  101. ecpg 実装の PGTYPESnumeric_from_double() で sprintf による変換で %f でなく %g を使うように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  102. バッファオーバランの対策も加えられました。

  103. contrib/pgcrypto の crypt() 関数で確実に問い合わせキャンセルが可能となりました。 (Andreas Karlsson) (9.4)(9.3)(9.2)(9.1)
  104. flex バージョン 2.5.x 以降に対応しました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  105. 現在 flex 2.6.0 がリリースされていて、ビルドスクリプトにおけるバージョンチェックを調整する必要がありました。

  106. config/missing スクリプトをインストールするようになりました。 (Jim Nasby) (9.4)(9.3)(9.2)(9.1)
  107. bison などのビルドツールが無いマシン上で PGXSビルドを正常に行えるようになります。

  108. 現在の libxml2 の振る舞いに適合する、別種のリグレッションテスト想定出力ファイルが追加されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  109. libxml2 ライブラリは、セキュリティ障害 CVE-2015-7499 に対する修正で、ある種の場合にエラーコンテキストレポートが出力されなくなりました。これに対応した追加となります。

PostgreSQL 9.4.5、9.3.10、9.2.14、9.1.19、9.0.23 への変更点


  1. jsonのパースでスタックオーバーフローが防止されました。 (Oskari Saarenmaa) (9.4)(9.3)
  2. アプリケーションが PostgreSQL の json や jsonb の値を任意のユーザ入力から構成する場合、アプリケーションユーザは確実にサーバをクラッシュさせることができて、一時的なサービス不能をひき起こせます。

  3. pgcrypto拡張モジュールが crypt()関数の短すぎるソルトを検出して報告するように修正されました。 (Josh Kupershmidt) (9.4)(9.3)(9.2)(9.1)(9.0)
  4. ある種の無効なソルト引数はサーバーをクラッシュさせるか、数バイトのサーバメモリを露出させました。露出した数バイトに秘密情報が在るように仕込む攻撃の可能性は排除しませんが、実現性は低いと見られます。(CVE-2015-5288)

  5. 外側サブトランザクションに属するポータル(カーソル)が失敗した後のサブトランザクションのクリーンアップが修正されました。 (Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  6. 外側サブトランザクションのカーソルで実行された関数が、内側サブトランザクションで作られたリレーション(一時テーブル等)を参照することで、アサート失敗かクラッシュを引き起こすことがありました。

  7. commit_delay が有効であるとき WAL挿入の際にデッドロックする可能性があり、修正されました。 (Heikki Linnakangas) (9.4)
  8. UPDATE実行時に更新可能ビューから参照されている全てのリレーションが適切にロックされるようになりました。 (Dean Rasheed) (9.4)(9.3)
  9. リレーションのリレーションキャッシュinitファイルへの格納について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  10. 直近のマイナーリリースでの不注意により、システムインデックスpg_trigger_tgrelid_tgname_index が initファイルで除外されていました。その後のセッションでこのことが検出され、initファイルが壊れていると見なされ、initファイルが無視されます。この結果、新規接続での所要時間が顕著に劣化しました。

    本バグ修正では加えて、将来の類似の誤りが見つかるようにする防止策がいくつか導入されました。

  11. SPIクエリ結果に多数の行を投入するとき、O(N^2) の所要時間を要する振る舞いを回避するようになりました。 (Neil Conway) (9.4)(9.3)(9.2)(9.1)(9.0)
  12. SPIクエリで結果行数が多いSQLを実行した場合に該当します。これまで必要メモリを追加するのに固定増分での追加確保をしていたため、処理回数が不要に多くなっていました。

  13. 読まれない通知が多数ある場合の LISTEN 開始の所要時間が改善されました。 (Matt Newell) (9.4)(9.3)(9.2)(9.1)(9.0)
  14. LISTEN/NOTIFY利用時において、一部の遅れたリスナーのために通知が大量に溜まっている状態で新たなリスナーを加えると、それらの溜まった通知を読み飛ばしていくのに処理コストを要していました。

  15. 多数の外部キー制約を変更したセッションでの性能問題が修正されました。 (Jan Wieck, Tom Lane) (9.4)(9.3)
  16. これは主に数千テーブルを持つデータベースのダンプをリストアするときに見られます。

  17. SSL再ネゴシエーションがデフォルトでは無効となりました。 (Michael Paquier, Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  18. 理論的には SSL再ネゴシエーションを使うことは良い考えですが、実際のところ OpenSSLライブラリに起因するもの、PostgreSQLにおけるライブラリの使い方に起因するもの、の双方で多数の障害が見られました。

    再ネゴシエーションは PostgreSQL 9.5 以降では削除されます。9.4 以前のバージョン系列では、postgresql.conf の ssl_renegotiation_limit のデフォルト値が無効を意味する 0 に変更されます。

  19. *_freeze_max_age パラメータの下限値が引き下げられました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  20. 主としてこれらパラメータに関するテストで時間がかからないようにするためですが、少ないディスクスペースにインストールする際にも価値があるかもしれません。

    autovacuum_freeze_max_age               100000  →      10000
    autovacuum_multixact_freeze_max_age  100000000  →  100000000 (9.3以降)
    

    上記のように変更されました。

  21. サーバクラッシュを避けるため wal_buffers の上限を 2GB までに限定しました。 (Josh Berkus) (9.4)(9.3)(9.2)(9.1)(9.0)
  22. 巨大な値を指定したとき整数オーバーフローによるクラッシュをひき起こしていました。なお、上限値 2GB は、実際には INT_MAX / XLOG_BLCKSZ の計算結果です。XLOG_BLCKSZ はビルド時の --with-wal-blocksize 指定値 × 1024 となります。

  23. postgresql.conf の読み込みについて修正されました。 (Tom Lane) (9.4)(9.3)
  24. サーバ開始時にしか指定できないパラメータが postgresql.conf の中に複数回あらわれた場合に苦情がログ出力されないようになりました。pg_ctl reload を行ったときに以下のようなメッセージが出ていました。

    LOG:  parameter "..." cannot be changed without restarting the server
    

    また、postgresql.conf のエラーを報告する際に include_dir 指定の後では行番号が誤って出力されており、修正されました。

  25. NUMERIC 値の掛け算における稀な内部オーバーフローが修正されました。 (Dean Rasheed) (9.4)(9.3)(9.2)(9.1)(9.0)
  26. NUMERIC型の掛け算の結果に誤った値が返る可能性がありました。

  27. レコード型、範囲型、json型、jsonb型、tsquery型、ltxtquery型、および、query_int型に関連する稀なスタックオーバーフローを防ぐようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  28. 欠けていた max_stack_depth 設定値を超えていないかのチェック処理が、これらデータ型の各処理箇所に加えられました。

  29. 日付時刻の入力において DOW と DOY の扱いが修正されました。 (Greg Stark) (9.4)(9.3)(9.2)(9.1)(9.0)
  30. これらのトークンは日付時刻値では使えないはずですが、これまでは「invalid input syntax」でなく、意味の分からない内部エラーが出ていました。

    (以前の誤ったエラーメッセージ)
    db1=# SELECT 'doy'::timestamptz;
    ERROR:  unexpected dtype 33 while parsing timestamptz "doy"
    
    (修正後の本来のエラーメッセージ)
    db1=# SELECT 'doy'::timestamptz;
    ERROR:  invalid input syntax for type timestamp with time zone: "doy"
    
  31. 正規表現照合中にクエリキャンセルのチェックをさらに追加しました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  32. 正規表現処理がより迅速に中断要求に応じるようになります。

  33. 正規表現、SIMILAR TO、LIKE の照合に再帰深度の保護が加えられました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  34. ある種の検索パターンと低いスタック深度制限により、スタックオーバーランによるクラッシュに至るおそれがありました。

  35. 正規表現の実行で無限ループをひき起こす可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  36. 一見ゼロ長文字列にマッチするけれども実際は後方参照によりマッチしないという検索パターンで無限ループに至る可能性がありました。

    SELECT 'a' ~ '$()|^1';  -- f
    SELECT 'a' ~ '.. ()|1'; -- f
    SELECT 'a' ~ '()*1';    -- t
    SELECT 'a' ~ '()+1';    -- t
    

    修正前バージョンでは上記のパターンマッチで無限ループに陥ります。

  37. 正規表現の実行で、たとえマッチがゼロ長であったとしても、数量指定を含む括弧で捕捉されたマッチデータを正しく記録するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
  38. 正規表現のコンパイルでメモリ不足によるクラッシュの可能性があり、修正されました。 (Andreas Seltenreich) (9.4)(9.3)(9.2)(9.1)(9.0)
  39. メモリ取得に失敗した場合の処理に不備があり、メモリ不足状態のサーバにおいて、NULLポインタ参照によるクラッシュを招く可能性がありました。

  40. 低確率で生じる正規表現の実行時のメモリリークが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  41. トランザクションがアボートした際のロック解放処理における、稀なメモリ不足時の障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  42. メモリ不足時にアサート失敗またはクラッシュをひき起こす可能性がありました。

  43. 小さい work_mem設定でタプルストアを使用する場合に「unexpected out-of-memory situation during sort」エラーが生じる問題が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  44. タプルストアとは SQL処理過程で一時的にデータを保持する内部的な仕組みです。

  45. qsort におけるごく稀なスタックオーバーランが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  46. ここでの qsort は、ソート処理の内部実装の一つで、いわゆるクイックソートを実装しています。本障害によりクラッシュの可能性がありました。

  47. 大きな work_mem 設定でのハッシュ結合にて、無効なメモリ割り当て要求サイズでエラーになることがあり、修正されました。 (Tomas Vondra, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  48. 「ERROR: invalid memory alloc request size」をひき起こすことがありました。

  49. プランナ関連の各種障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  50. これら誤りは、間違った応答を返したり、アサート失敗したり、奇妙なプランナエラーを出したりするであろう不適切なクエリ実行プランを導きます。

    (本障害のプランナエラー例)
     ERROR: could not devise a query plan for the given query
     ERROR: could not find pathkey item to sort
     ERROR: plan should not reference subplan's variable
     ERROR: failed to assign all NestLoopParams to plan nodes
    
  51. 大きな継承セットにおける UPDATE/DELETE のプランナ性能が改善しました。 (Tom Lane, Dean Rasheed) (9.4)(9.3)(9.2)
  52. これまで、継承テーブル数に対して O(N^2) 処理を要する箇所がありました。

  53. スタンバイ昇格トリガファイルがマスタプロセス(postmaster)起動時に確実に削除されるようになりました。 (Michael Paquier, Fujii Masao) (9.4)(9.3)(9.2)(9.1)
  54. 新たなスタンバイサーバを作るためのデータベースバックアップにトリガファイルが含まれていた場合に、望まない昇格が起きるのを防ぎます。

  55. マスタプロセス(postmaster) がシャットダウンするとき、pidファイルが削除される前に、確実にソケット毎のロックファイルが削除され、リッスンソケットが閉じられるようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  56. 外部スクリプトが pg_ctl stop のすぐ後に PostgreSQL を起動した場合に、競合して起動に失敗するのを防ぎます。

  57. たとえ immediate シャットダウンであっても、全ての子プロセスがいなくなるまではマスタプロセス(postmaster) は終了しないようになりました。 (Tom Lane) (9.4)
  58. クラッシュリカバリ中にクラッシュしたスタートアッププロセスの扱いが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  59. クラッシュリカバリ処理はスタートアッププロセスの中で行われます。これまで、データベース一貫性が無い状態でスタートアッププロセスがクラッシュした場合、新たにスタートアッププロセス起動を試みていましたが、これは通常は再度クラッシュすることになり、無限ループに至ります。

    スタートアップ中のクラッシュの後は自動再起動せず、終了するようになります。

  60. マルチトランザクション周回に対する緊急自動VACUUM がより頑健になりました。 (Andres Freund) (9.4)(9.3)
  61. これまでは必要でも必ずしも自動VACUUM が駆動されないというケースがありました。

  62. シグナルを送ろうとしたら autovacuum worker プロセスが既にいなくなっていた場合に警告を出さないようになりました。また、自動VACUUM 関連シグナルのログ出力が減りました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  63. 相手プロセスが居ない場合に「WARNING: could not send signal to process ...」が出ていました。 また、ロック競合した自動VACUUM をキャンセルする際に発生する「LOG: sending cancel to blocking autovacuum PID ...」メッセージが、DEBUG1 レベルに変更されました。

  64. サーバ時計が大きく戻ったときに、autovacuum launcherプロセスが過度に長く休止するのが防止されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  65. GIN インデックスの挿入保留リストのクリーンアップがキャンセル要求により確実に割り込み可能になりました。 (Jeff Janes) (9.4)(9.3)(9.2)(9.1)(9.0)
  66. このクリーンアップ処理は通常 GIN インデックスを持つカラムの INSERT、UPDATEで発生します。

  67. GIN インデックスで全てゼロのページが再利用可能になりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  68. このようなページはクラッシュ後にできることがあります。これまで全てゼロのページは再利用されず、無駄に領域を占めていました。

  69. SP-GiST インデックスにおける全てゼロのページの扱いが修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)
  70. VACUUM でこのようなページを再利用しようとしますが、WAL出力を伴うクラッシュセーフな方法で処理していませんした。

  71. サブトランザクション、マルチトランザクションの切捨て処理が修正されました。 (Thomas Munro) (9.4)(9.3)(9.2)(9.1)(9.0)
  72. 「LOG: could not truncate directory "...": apparent wraparound」メッセージが不必要に出力されることがありました。なお、修正前においてもログメッセージを出す以外は無害です。

  73. PL/pgSQL エラーのコンテキストメッセージで CONTINUE と MOVE のステートメントタイプを誤って報告していたのが修正されました。 (Pavel Stehule, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  74. CONTINUE であるべきところが EXIT と、MOVE であるべきところが FETCH と報告されていました。

    ERROR:  ...(何らかメッセージ)...
    CONTEXT:  PL/pgSQL function myfunc() line 123 at FETCH (← この部分)
    
  75. PL/Perl が非ASCII のエラーメッセージ文面を正しく扱うように修正されました。 (Alex Hunsaker) (9.4)(9.3)(9.2)(9.1)
  76. PL/Python でレコード結果の文字列表現を返すときにクラッシュする障害が修正されました (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  77. PL/Tcl で malloc() 呼び出し失敗のチェックを怠っているいくつかの箇所が修正されました。 (Michael Paquier, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  78. contrib/isn で 979 から始まる ISBN-13 番号の出力が修正されました。 (Fabien Coelho) (9.4)(9.3)(9.2)(9.1)
  79. (9790 ではなく) 979 から始まる EAN は ISBN と見做せますが、10桁形式ではなく、新しい13桁の形式で出力される必要がありました。

    (修正前)
    db1=# SELECT ('9791234567896'::EAN13)::ISBN;
        isbn
    -------------
     123456789-X
    (1 row)
    
    (修正後)
    db1=# SELECT ('9791234567896'::EAN13)::ISBN;
          isbn
    -----------------
     979-123456789-6
    (1 row)
    
  80. contrib/pg_stat_statements の問い合わせ文字列のガベージコレクションが改良されました。 (Peter Geoghegan) (9.4)
  81. 問い合わせ文字列が格納される外部ファイルは巨大なサイズに膨らむことがありえました。これまではファイルサイズが一度 1GB を超えると読み込みできませんでした。このサイズ上限が引き上げられ、また、読み込み失敗したときにファイルをリセットするようになりました。

  82. contrib/postgres_fdw で照合関連の判定処理が改善されました。 (Tom Lane) (9.4)(9.3)
  83. 目に見える変化としては、varcharカラムを含む比較が以前より多くのケースでリモートサーバに送られて実行されるようになります。

  84. libpq でメモリ不足状態のときの処理が改善されました。 (Michael Paquier, Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  85. これまでそのように報告していなかった箇所でメモリ割り当てに失敗したときに「out of memory」とエラーメッセージを出すようになりました。

  86. ecpg でメモリリークと、メモリ不足ケースのチェックが欠けている箇所があり、修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  87. psql でロケールを意識した数の出力形式について修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  88. 「pset numericlocale on」を指定した場合に一部のケースで誤動作をしていました。

    (修正前の障害動作例)
    =# pset numericlocale on
    Locale-adjusted numeric output is on.
    
    =# SELECT 1000000::real;
     float4
    --------
     1e,+06
    (1 row)
    
    =# SELECT 10000::money;
        money
    --------------
     $,10,,000.00
    (1 row)
    
  89. psql で現在の接続が無いときに c コマンドでクラッシュするのが防止されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  90. (クラッシュ例 - サーバ側からの強制切断後に c 実行)
    
    server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    
    !> c db1 dbuser1 localhost 5432
    セグメンテーション違反です (コアダンプ)
    
  91. pg_dump が継承されたテーブルの NOT VALID の CHECK制約を正しく扱うようになりました。 (Tom Lane) (9.4)(9.3)(9.2)
  92. リストアするとエラーが生じる誤ったダンプを出力することがありました。

  93. pg_dump のディレクトリ出力フォーマットでデフォルトの zlib 圧縮レベル指定について修正されました。 (Andrew Dunstan) (9.4)(9.3)(9.2)(9.1)
  94. これまでマニュアルに記載された「中間レベル」ではなく、速さ優先の圧縮レベルがデフォルト動作になっていました。

  95. tarフォーマット出力の pg_dump で作られる一時ファイルのファイルモードが誰でも読み取り可能とならないようになりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  96. pg_dump と pg_upgrade が postgres や template1 データベースがデフォルトテーブルスペース以外にある場合に対応するように修正されました。 (Marti Raudsepp, Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  97. pg_dump が旧バージョン PostgreSQL からのダンプでオブジェクト権限を正常に扱うように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  98. PostgreSQL 9.2 より前のサーバからデータ型をダンプするとき(※1)、あるいは、7.3 より前のサーバから関数や手続き言語をダンプするとき、pg_dump は、所有者の権限を剥奪して代わりに PUBLIC に全ての権限を与えるようなGRANT/REVOKE コマンドを出力していました。

    該当するのは USAGE と EXECUTE 権限だけですのでセキュリティ問題ではありません。この場合はデフォルト権限状態のままにするように修正しました。

    ※1 これは 9.2.x、9.3.x、9.4.x の場合のみ
    
  99. pg_dump がシェル型をダンプするように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  100. シェル型は未だ定義が無いプレースホルダとして名前だけ与えられたデータ型です。

  101. pg_dump ほかいくつかのクライアントプログラムで影響度の低いメモリリーク等が修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  102. クエリや pgbench自身が固まった場合の pgbench の進捗報告の振る舞いが修正されました。 (Fabien Coelho) (9.4)
  103. Alpha アーキテクチャむけのスピンロックのアセンブリコードが修正されました。 (Tom Lane) (9.4)
  104. PPC アーキテクチャむけのスピンロックのアセンブリコードが AIX のネイティブアセンブラに対応するように修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  105. AIX でこれまで単に使えるものと想定していた -qlonglong コンパイラオプションをテストするようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  106. AIX で実行時にシンボル解決できるようにする -Wl,-brtllib リンクオプションを使うようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  107. コンパイラバグのため 32bit xlc でインライン関数展開を使わないようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  108. 必要に応じて sched_yield() むけに librt を使うようになりました。いくつかの Solaris バージョンで該当します。 (Oskari Saarenmaa) (9.4)(9.3)(9.2)(9.1)(9.0)
  109. UHC エンコーディングを Windows コードページ 949 として変換するようになりました。 (Noah Misch) (9.4)
  110. これにより、データベースに紐づかないプロセス(postmaster等)から非ASCII のログメッセージが出るのを修正しました。

  111. Windows でトランザクション外での UTF16 への文字エンコーディング変換(ログメッセージ用など) で失敗するのが防止されました。 (Noah Misch) (9.4)
  112. setlocale() の返し値をコピーしないことによる、マスタープロセス(postmaster) の起動失敗が修正されました。 (Noah Misch) (9.4)
  113. 本現象は ANSI コードページを CP936 (中国語 簡体字/PRC) に設定した Windows で報告され、他のマルチバイトコードページでも発生するとみられます。

  114. Windows の install.bat スクリプトについて、空白文字を含む対象ディレクトリ名の処理が修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  115. PostgreSQLバージョン番号の数値表現(90405 など) が、拡張モジュールのMakefile で VERSION_NUM 変数として利用可能になりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  116. タイムゾーンデータファイルが tzdata release 2015g に更新されました。 (9.4)(9.3)(9.2)(9.1)(9.0)
  117. ケイマン島、フィジー、モルドバ、モロッコ、ノーフォーク島、北朝鮮、トルコ、ウルグアイの夏時間方式が変更されました。新しいタイムゾーン名としてカナダ・ノーザンロッキーの America/Fort_Nelson が加わりました。

  118. 9.3 以降で加わったリソース所有者ごとのロックキャッシュが後方適用されました。 (Jeff Janes) (9.2)(9.1)
  119. pg_dump で多数のテーブルをダンプするときの性能を改善します。

  120. contrib/sepgsql の SELECT INTO 命令の扱いが修正されました。 (Kohei KaiGai) (9.2)
  121. プランナにおけるあいまいパスコストの同点決勝ルールが後方適用されました。 (Tom Lane) (9.1)(9.0)
  122. 本変更により、同コストプランの選択においてプラットフォーム固有の振る舞いを避けることができます。

PostgreSQL 9.4.4、9.3.9、9.2.13、9.1.18、9.0.22 への変更点


  1. 一貫性のないデータベース状態からのリカバリに失敗する可能性があり、修正されました (Robert Haas) (9.4) (9.3)
  2. 最近のPostgreSQLリリースでマルチトランザクション周回を防ぐ仕組みが導入されましたが、実装の一部において発生する可能性をつぶせていませんでした。一貫性の無い状態データベースをクラッシュリカバリする際に漏れることがあります。この結果、クラッシュ後の再起動やスタンバイサーバの最初の起動に失敗する可能性がありました。バージョン 9.3.0 から 9.3.4 の pg_upgrade を使ったインストールでも、同様の障害をひき起こします。

    pg_upgrade の誤りは、pg_control の oldestMultiXid をもっと大きい値にすべき場合でも 1 に設定していたことです。本リリースの修正後は、このような状況では緊急自動VACUUM となり、oldestMultiXid の正しい値が定まるまで実行されます。アップグレードを開始する前にあらかじめ VACUUM を実行しておくことで、このような動作を避けることができます。

  3. 稀におきるリレーションキャッシュ初期化ファイル(pg_internal.init)の無効化失敗が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  4. 同時実行のタイミングによっては、システムカタログの VACUUM FULL が、新たなセッションでキャッシュローディングを避けるのに使われる初期化ファイルの更新に、失敗することがありえました。結果として、後のセッションがそのシステムカタログにまったくアクセスできなくなってしまいます。

    障害発生時には「cache lookup failed」や「could not open file」といったエラーが発生すると考えられ、解消には pg_internal.init ファイルを手動で削除するほかありません。

  5. 新たなセッション開始と CREATE/DROP DATABASE のデッドロックを回避するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  6. DROP DATABASE で削除するデータベースや、CREATE DATABASE でテンプレートに使うデータベースに新たなセッションを開始すると、これらコマンドは 5秒待って(競合するセッションがその前に終了していたとしても)エラーになっていました。

  7. 内側のインデックススキャンを伴う semi-join、anti-join についてプランナのコスト見積もりが改善されました。 (Tom Lane, Tomas Vondra) (9.4)(9.3)
  8. 全ての結合節がインデックススキャン条件として使われている場合、たとえ内側スキャンが見かけ上多数の行を読み出すとしても、エグゼキュータは一行を取得した後に止まるので、低コストなプランとなります。

    プランナはこの効果について部分的にしか考慮しておらず、結果としてコストを過大評価して、劣った別のプランが選択される原因となっていました。

PostgreSQL 9.4.3、9.3.8、9.2.12、9.1.17、9.0.21 への変更点


  1. クラッシュ後の再起動でデータディレクトリに fsync をかけるときの失敗を回避するようになりました。 (Abhijit Menon-Sen, Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  2. 一つ前のマイナーリリースで、クラッシュ後にデータディレクトリ内の全てに fsync をかける修正が加わりましたが、これは全ての状況に対応できていませんでした。これにより、無害な問題であってもサーバの起動が妨げられてしまいます。

    具体的には、書き込み不能なファイルが含まれていた場合に一部プラットフォームでは再起動できなくなってしまいます。とはいえ、サーバで SSL証明書ファイルを書き込み不能にするのは一般的です。

    本修正は改定され、全体的にパーミッションによる失敗は無視されるようになりました。また、他の失敗もログ出力されますが、処理の継続は止めないようになりました。

    PostgreSQL 9.4系については、重要度は低いですが同様に振る舞うべきであるため、initdb の --sync-only オプションも同じ規則で動作するようになりました。

  3. pg_get_functiondef() 関数が、設定されているならLEAKPROOF属性を出力するように修正されました。 (Jeevan Chalke) (9.4)(9.3)(9.2)
  4. pg_get_functiondef() 関数は psql の ef コマンドで使われます。

  5. 内部実装用の pushJsonbValue()関数が jbvBinaryオプジェクトを展開するように修正されました。 (Andrew Dunstan) (9.4)
  6. jbvBinary とは JSONBデータ型の内部格納データ区分の一つです。本変更による PostgreSQL本体の振る舞い変更はありませんが、拡張モジュールからの呼び出しにおける例外的な問題ケースを回避します。

  7. configure の OpenBSD におけるスレッド対応したlibpythonへのリンクを禁止する検査が除去されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  8. 最近のテストでは問題なく動作しており、禁止する必要がないと判断されました。

  9. libpq で TLSプロトコルバージョン v1 以上が利用可能になりました。 (Noah Misch) (9.3)(9.2)(9.1)(9.0)
  10. これまで libpq は SSLプロトコルとして TLS v1 のみが使えました。現在ではより新しいバージョンが一般的です。PostgreSQLサーバでは既に対応しており、サーバ側の変更はありません。

PostgreSQL 9.4.2、9.3.7、9.2.11、9.1.16、9.0.20 への変更点


  1. 認証タイムアウトになる直前にクライアントが切断した時に、クラッシュする可能性が回避されました。 (Benkocs Norbert Attila) (9.4)(9.3)(9.2)(9.1)(9.0)
  2. タイムアウトの割り込みが、セッション切断処理中に発生すると、SSL 関連情報が二重解放されクラッシュし、その結果、他のセッションへの DoS となります。実験では認証されていないリモート攻撃者が、一貫してバグを引き起こすことが可能なため、セキュリティ上の問題として扱っています。(CVE-2015-3165)

  3. システムコール失敗の判定が改善されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  4. snprintf() などの代替実装では、下位のシステムライブラリ呼び出しでのエラーチェックに間違いがありました。主な問題は、メモリ不足の状況での対応不足にあります。最悪の場合、実装コードでは、バッファが上書きされていないのに、上書きされたとみなすことにより、情報が漏洩する可能性があります。

    他の *printf() ファミリ関数呼び出しにも、悪い時にメモリ不足を起こすと、情報漏洩する脆弱性が残っている可能性があります。開発コミュニティは、大きなリスクではないと判断していますが引続き解析を続けるとのことです。(CVE-2015-3166)

  5. contrib/pgcrypto の復号失敗時のメッセージを、間違ったキーか不正なデータかによらず統一しました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  6. 以前は、間違ったキーによる復号では、異なったエラーメッセージが報告されていました。その様なエラーメッセージの違いは、他のシステムを使ってキーを見つけようとする攻撃者への助けになることが知られています。pgcrypto のこの振る舞いが攻撃に利用できるかは不明ですが、単一のメッセージを使う方が、リスクを避けるのに良いと考えられます。(CVE-2015-3167)

  7. マルチトランザクションID 処理の周回対策が行われました。 (Álvaro Herrera, Robert Haas, Thomas Munro) (9.4)(9.3)
  8. 特定の利用パターンだと、既存の対策が不十分なため pg_multixact/members ファイルが早くに削除されてしまい、結果としてデータを損失します。
    サーバ側修正として、古いマルチトランザクションメンバ ID を上書きしそうな場合、トランザクションを「multixact "members" limit exceeded」エラーで失敗させるようになります。
    autovacuum の改良として、トランザクション ID の周回と同様、マルチトランザクション ID の周回防止の活動を行なうようになります。

  9. contrib/citext モジュールの regexp_matches() 関数の間違っていた宣言が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)
  10. この関数は text 型に対する定義と同様に citext型に対しても setof text[] を返すべきですが、text[] を返すように宣言されていました。このため、マッチしない場合に 0 行が返るのでなく NULL が返る、'g' フラグを指定しても実質的には無視される、という振る舞いになっていました。

    db1=# SELECT id, v AS v_is_citext FROM t5;
     id |  v_is_citext
    ----+----------------
      1 | pgsql is PGSQL
      2 | pgSQL
    (2 rows)
    
    db1=# SELECT id, regexp_matches(v, 'xxxxx'::citext) FROM t5;
    【本来期待された振る舞い】
     id | regexp_matches
    ----+----------------
    (0 rows)
    
    【これまでの振る舞い】
     id | regexp_matches
    ----+----------------
      1 |
      2 |
    (2 rows)
    
    db1=# SELECT id, regexp_matches(v, 'pgsql'::citext, 'g') FROM t5;
    【本来期待された振る舞い】
     id | regexp_matches
    ----+----------------
      1 | {pgsql}
      1 | {PGSQL}
      2 | {pgSQL}
    (3 rows)
    
    db1=# SELECT id, regexp_matches(v, 'pgsql'::citext, 'g') FROM t5;
    【これまでの振る舞い】
     id | regexp_matches
    ----+----------------
      1 | {pgsql}
      2 | {pgSQL}
    (2 rows)
    

    これまでの振る舞いに依存するアプリケーションが存在する可能性があるため、デフォルトの宣言は PostgreSQL 9.4 以前では変更されません。9.4 以前では、従来の宣言は拡張モジュールのバージョン 1.0 として提供され、正しい宣言は拡張モジュールのバージョン 1.1 として提供されます。以下のようにしてバージョン 1.1 に上げることができます。

    db1=# ALTER EXTENSION citext UPDATE TO '1.1';
    db1=# dx
                               List of installed extensions
      Name   | Version |   Schema   |                   Description
    ---------+---------+------------+--------------------------------------------------
     citext  | 1.1     | public     | data type for case-insensitive character strings
     plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
    (2 rows)
    
  11. json 型への変換で、無限大の日付や時刻はエラーにせず 'infinity' にするようになりました。 (Andrew Dunstan) (9.4)
  12. json/jsonb の populate_record() と to_record() 関数が、空の入力を正しく扱うようになりました。 (Andrew Dunstan) (9.4)
  13. HOT 更新後の遅延された排他制約の誤った検査が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  14. 本来は無視されるべき排他制約違反が報告されることがありました。

    遅延された排他制約に違反する可能性のある新しい行が同トランザクションで後に HOT更新された場合、後に削除される行が新たな行と当初に衝突していた場合でも、排他制約違反が最後のチェックで報告されることがありえました。

  15. ALTER TABLE ... ALTER CONSTRAINT で外部キー制約の遅延可能状態を変更するときの振る舞いが修正されました。 (Tom Lane) (9.4)
  16. これまで、後に続く同セッションでの操作、または同時実行の別セッションにて、変更を即座に尊重しないことがありました。

  17. スタースキーマ式クエリのプラン作成が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)
  18. 大きなテーブルの効果的なスキャンでは、インデックスパラメータが複数の結合テーブルから提供されることがしばしば必要となります。プランナはこのような計画を発見できないといけませんが、これまで、あまりに制限的なヒューリスティック検索がこれを妨げていました。

    t10_fact が行数の非常に多いテーブル、t10_dim_a と t10_dim_b が行数の少ないテーブルであるとしたときの、以下のようなクエリであって、a.c1 = 1 と b.c1 = 2 の二つの条件で選択行を大幅に限定できるという場合が該当します。

    SELECT * FROM t10_fact f, t10_dim_a a, t10_dim_b b
      WHERE f.aid = a.id AND f.bid = b.id AND a.c1 = 1 AND b.c1 = 2;
    
  19. 他の外部結合に対する anti-join (NOT EXISTS 結合) の不適切な配置換えを防止するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  20. プランナにおける本障害により「could not find RelOptInfo for given relids」エラーがあらわれます。しかし時には、誤ったクエリプランが一貫性チェックをパスして、エラーを出すことなく誤ったクエリ実行結果を返す可能性もあります。

  21. 外部結合プランノードでの部分式の誤ったマッチングが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  22. これまでは、外形上同一の STRICT でない(すなわち NULL入力が認められる) 部分式が外部結合の上位と下位とで使われているとき、プランナが結合の下位で計算した値を再利用しようとすることがありました。
    エグゼキュータは外部行にマッチしない場合は値を NULL にするため、これは誤った動作でした。

    以下に障害動作例を示します。

    db1=# CREATE TABLE t12 (c1 int, c2 int);
    db1=# INSERT INTO t12 VALUES (1,NULL),(NULL,2);
    db1=# SELECT a.c1 AS a_c1, b.c2 AS b_c2 FROM t12 a
            LEFT JOIN t12 b ON a.c2 = coalesce(b.c1, 1)
            WHERE coalesce(b.c1, 1) > 0;
    【9.4.2 での結果】
     a_c1 | b_c2
    ------+------
          |
        1 |
    (2 rows)
    
    【9.4.1 での誤った結果】
     a_c1 | b_c2
    ------+------
    (0 rows)
    
  23. 結合順序のヒューリスティック手法が失敗した場合に対応できるように GEQO プランナが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  24. 本障害により、LATERALを含むクエリでエラー「failed to join all relations together」が出ます。また、その他の場合でも発生する可能性があります。

  25. UPDATE、DELETE 対象がセキュリティバリアビューであるとき、適切に行ロックが確実に生じるように修正されました。 (Stephen Frost) (9.4)
  26. これまで行ロック処理が欠落してしまうことがありました。

  27. PostgreSQL 起動時にレプリケーションスロットのデータを同期するとき、ファイルを read/write で開くようになりました。 (Andres Freund) (9.4)
  28. 一部のプラットフォームでは、これまでのコードでは「could not fsync file "pg_replslot/...": Bad file descriptor.」というエラーをひき起こしていました。

  29. max_prepared_transactions が小さすぎる場合に PostgreSQL 起動時のデッドロックの可能性があり、修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  30. 未コミットのプリペアドトランザクションよりも小さい max_prepared_transactions を指定して、再起動すると、PostgreSQL のマスタプロセスが残ったまま起動に失敗する例が報告されました。

  31. タイムラインが切り替わった後に使えない事前割り当てされた WAL ファイルをアーカイブしないようになりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  32. クラッシュ後に再帰的にデータディレクトリの fsync() を行うようになりました。 (Abhijit Menon-Sen, Robert Haas) (9.4)(9.3)(9.2)(9.1)(9.0)
  33. これにより、別のシステムレベルのクラッシュがすぐ後に起きた場合でも、一貫性を確実にします。

  34. autovacuum ランチャープロセスが、SIGTERM シグナルを受け取った後にエラーが起きた場合に、シャットダウンに失敗していたものが修正されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  35. セッション開始初期のシステムカタログに対する無効化メッセージの扱いが修正されました。 (Tom Lane) (9.4)
  36. 本障害は システムカタログに対する VACUUM FULL を同時に開始するセッションで失敗をひき起こしていました。

  37. BackendIdGetTransactionIds() で、ちょうど終了したバックエンドプロセスの状態取得を試みたときのクラッシュが修正されました。 (Tom Lane) (9.4)
  38. LockBufferForCleanup() での予期せぬシグナルに対処するようになりました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  39. この誤りは「multiple backends attempting to wait for pincount 1」という偽性の(本来はエラーではない)エラーをひき起こしていました。

    なお、ピンとはバッファページに対するアクセスを排他制御する内部的なロック機構の一つです。

  40. 行全体を参照するチェック制約の付いたテーブルに対する COPY IN 実行時のクラッシュが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)
  41. クラッシュすることが知られているのは 9.4 以上だけですが、同様のコードが 9.3、9.2 にあるため、合わせて修正されています。

    (障害再現例)
    db1=# CREATE TABLE t23 (id int primary key , c1 int, c2 int);
    db1=# CREATE FUNCTION check_con_func(t23) RETURNS boolean
      LANGUAGE plpgsql IMMUTABLE AS $$ BEGIN RETURN ($1.c1 > 0); END $$;
    db1=# ALTER TABLE t23 ADD CHECK (check_con_func(t23.*));
    db1=# COPY check_con_tbl FROM STDIN;
    >> 0      0       0
    >> 1      1       1
    >> .
    server closed the connection unexpectedly
    
  42. read-only であるトランザクションのコミットでは、そのユーザに限り、WAL フラッシュや同期レプリケーションを待たないようになりました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)(9.0)
  43. これまでは(参照処理でも)HOT ページ掃除のために WALを書くトランザクションにおいて遅延がありえ、全スタンバイがダウンしている場合には、固まってしまいました。また、同期レプリケーションのときのキャッチアップ割り込み処理でも固まることがありました。本修正はこれらの問題を解消します。

  44. recovery_min_apply_delay に短い時間が設定されているときのビジーウェイトを回避するようになりました。 (Andres Freund) (9.4)
  45. ミリ秒以下の遅延設定は無視されるようになります。

  46. 一時テーブル上のハッシュインデックスを操作するときに生じるクラッシュが修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  47. 他プロセスが同時にインデックスを変更している場合、ハッシュインデックスのバケツ分割に失敗する可能性があり、修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  48. GIN インデックスの VACUUM におけるメモリリークが修正されました。 (Heikki Linnakangas) (9.4)
  49. インデックス式の ANALYZE 中に割り込みをチェックするようになりました。 (Jeff Janes) (9.4)(9.3)(9.2)(9.1)(9.0)
  50. ANALYZE ではインデックスの式を多数実行します。この式の中に遅い関数があった場合、ANALYZE を処理ループが終わる前にキャンセルできることが望まれます。

  51. 行ロック後に READ COMMITTED 再チェックが生じたときに、外部テーブルのテーブルOID が確実に正しく報告されるようになりました。 (Etsuro Fujita) (9.4)(9.3)(9.2)(9.1)
  52. これまで外部テーブルのテーブルOID には無効な値が設定されていましたが、上記ケースでは意味のある値が必要とされ、適切に動作しませんでした。

  53. 外部サーバユーザマッピングのオブジェクト説明文字列にターゲットサーバ名が追加されました。 (Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  54. 出力メッセージにあらわれる「user mapping for {ユーザ名}」が、「user mapping for {ユーザ名} on server {サーバ名}」となります。

  55. 符号化方式変換オブジェクトのオブジェクト識別文字列にスキーマ名が含まれるようになりました。 (Álvaro Herrera) (9.4)(9.3)
  56. Kerberos/GSSAPI/SSPI 認証でオプション設定に include_realm=1 を推奨するようになりました。 (Stephen Frost) (9.4)(9.3)(9.2)(9.1)(9.0)
  57. ドキュメントのみ修正されています。PostgreSQL 9.5 からデフォルトで include_realm=1 となる予定です。

  58. IPv4 の pg_hba.conf 項目を IPv4-in-IPv6 アドレスと照合する機能が除去されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  59. 本機能は 2003年に追加されましたが、9.0 で適切に動作していませんでした。この壊れたコードが一部のシステムでクラッシュをひき起こすことが報告されました。

  60. 実際には起動しなかったバックグラウンドワーカが終了したときの状態報告が修正されました。 (Robert Haas) (9.4)
  61. 拡張モジュール作成用の API の動作変更となります。GetBackgroundWorkerPid() の応答が変更されました。

  62. データベースクラッシュ後、BGW_NEVER_RESTART 属性が指定されているバックグラウンドワーカは再起動しないようになりました。 (Amit Khandekar) (9.4)
  63. PostgreSQLソースコードに含まれる機能や拡張モジュールの中で、contrib/worker_spi と contrib/test_shm_mq 以外で本変更の影響を受けるものはありません。

  64. レプリケーションコマンド IDENTIFY_SYSTEM の応答で WAL 挿入でなく、WALフラッシュの位置を報告するようになりました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)
  65. これにより pg_receivexlog が、取得しようとしたデータがまだ WALファイルに書き込まれていないことで、起動失敗する可能性を回避します。

  66. Windows でサービス停止するときに、サービスが早くに強制終了されてしまうのを防ぐために、サービスコントロールマネージャに周期的に状態を送るようになりました。 (Krystian Bigaj) (9.4)(9.3)(9.2)(9.1)(9.0)
  67. また、pg_ctl が確実にシャットダウンを待つようになりました。

  68. libpq でノンブロッキングモードを使うときのネットワークデッドロックの危険性が軽減されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  69. 大きいデータを送るとき、サーバが出力をブロックするほどの応答データを送ってくることに備えて、入力バッファが時々に捌けることが重要となります。典型的なシナリオは、サーバが COPY FROM STDIN の実行中に連続して NOTICE メッセージを送ってくる場合です。このとき、通常のブロッキングモードなら問題ありませんが、ノンブロッキングモードの場合、デッドロックの危険性があります。

    libpq は日和見的に可能であれば入力を排出するように修正されました。完全にネットワークデッドロックを防ぐためには、アプリケーションの協力が必要です。アプリケーションは write-ready 状態だけでなく、read-ready に気を付けなければならず、read-ready 状態で確実に PQconsumeInput() を呼ばなければいけません。

  70. libpq でURI接続文字列の空値の解析の誤りが修正されました。 (Thomas Fanghaenel) (9.4)(9.3)(9.2)
  71. 1文字分の配列オーバーラン参照が生じていました。クライアント側のメモリ読み取りであり、セキュリティ上の危険性はありません。

  72. ecpg で配列の扱いが修正されました。 (Michael Meskes) (9.4)(9.3)(9.2)(9.1)(9.0)
  73. 一次元配列について C 言語の配列へのマッピングがサポートされました。

  74. psql が connect の最初の引数として URI と接続文字列を正常に扱えるように修正されました。 (David Fetter, Andrew Dunstan, Álvaro Herrera) (9.4)(9.3)(9.2)(9.1)(9.0)
  75. 本構文はドキュメント化されていませんが、永らく受け入れられてきました。本修正でドキュメント記載されました。

    本構文を使った場合に、一部のパラメータで与えられた値でなく旧の接続の値が使われる誤りがあり、修正されました。

    (本構文の実行例)
    postgres=# connect "dbname=db1 user=postgres"
    You are now connected to database "db1" as user "postgres".
    db1=# c postgresql://localhost:5432/db2
    You are now connected to database "db2" as user "postgres" on host "localhost"
    at port "5432".
    db2=#
    
  76. 一部プラットフォームにおいて、終了時に ~/.psql_history を書くのに失敗した、という psql の誤ったメッセージを抑止するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  77. この誤動作は 2006 年以前の古いバージョンの libedit の障害を回避するために生じていました。回避策のコードを除去することで修正しました。そのため、古い libedit では再び問題が生じます。libedit をバージョンアップをするか、libreadline を使うことを推奨します。

  78. pg_dump にて、システム提供されたダンプ不要のキャストを判断する規則が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  79. キャスト名が「pg_」で始まっているかではなく、キャストの OID で判断するようになりました。

  80. pg_dump で -Fd が指定されたとき -Z で指定した圧縮レベルを尊重するように修正されました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)
  81. 修正前には常にデフォルト圧縮レベルになっていました。

  82. pg_dump がダンプ順序の選択において、拡張モジュールの設定テーブル間の外部キー関係を考慮するようになりました。 (Gilles Darold, Michael Paquier, Stephen Frost) (9.4)(9.3)(9.2)(9.1)
  83. 本修正前では、一過性の外部キー制約違反によりダンプ読み込み失敗をひき起こすことがありました。

  84. 同時実行で一時関数の作成削除をしている場合に pg_dump が失敗する可能性があり、これを防ぐようになりました。 (Tom Lane) (9.4)(9.3)
  85. 定義が VALUES (...) だけでカラム別名を持つビューのダンプが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  86. これまで、ダンプ内容からカラム名が欠落してしまっていました。

  87. ダンプ/リストアでビューのレプリケーション識別(pg_class.relreplident) が確実に正しく 'n' (REPLICA_IDENTITY_NOTHING) になるように修正されました。 (Marko Tiikkaja) (9.4)
  88. これまで、ビューが循環依存している場合、レプリケーション識別属性がおかしくなることがありました。

  89. pg_upgrade で新データベースクラスタのタイムラインを強制的に 1 にするようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  90. この変更は、WALヒストリファイルが無いという誤ったエラーによるアップグレード失敗を防ぎます。

  91. pg_upgrade で不適切な接続不能データベースが無いか検査するようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  92. pg_upgrade で生成される delete_old_cluster スクリプトの中でディレクトリパスを適切にクオートするようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  93. pg_upgrade でデータベースレベルの凍結情報を適切に保持するようになりました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  94. postgres データベースと template1 データベースにて pg_database.datfrozenxid と pg_database.datminmxid が維持されていませんでした。アップグレード後、これらデータベース上のテーブルやインデックスにアクセスすると、pg_clog 下のファイルが無いというエラーをひき起こしていました。

  95. Windows 上で pg_upgrade と pg_resetxlog を制限された権限で実行するようになりました。 (Muhammad Asif Naeem) (9.4)(9.3)(9.2)(9.1)(9.0)
  96. これにより、Administratorユーザから実行されても失敗しなくなります。これまで「Permission denied」が出て失敗するケースが報告されていました。

  97. initdb と pg_basebackup でディレクトリを読み取るときに readdir() が失敗した場合の扱いが改善されました。 (Marco Nenciarini) (9.4)(9.3)(9.2)(9.1)
  98. readdir()システムコールが設定する errno 変数値が失われないように修正されました。エラーメッセージに失敗理由が正しく表示されるようになります。

  99. contrib/intarray モジュールの遅いソートアルゴリズムが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  100. これまでは挿入ソートで実装されていて、最大で O(N^2) の処理時間を必要としていました。クイックソートで置き換えられました。

  101. SPARC V8 機でのコンパイル失敗が修正されました。 (Rob Rowan) (9.4)(9.3)(9.2)(9.1)(9.0)
  102. OS X でビルドする際のいくつかの警告が出なくなりました。 (Tom Lane) (9.4)(9.3)
  103. タイムゾーンデータファイルが tzdata release 2015d に更新されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  104. エジプト、モンゴル、パレスチナにおける夏時間規則の変更、カナダ、チリの歴史的変更、America/Adak の時間帯省略形の改定(HAST/HADT でなく HST/HDT となる)が、適用されています。

  105. pg_receivexlog の障害が修正されました。 (Andres Freund) (9.2)
  106. 9.2.10 で障害が入りこみ、エラー「could not create archive status file」をひき起こしていました。

PostgreSQL 9.4.1、9.3.6、9.2.10、9.1.15、9.0.19 への変更点


  1. to_char() 関数のバッファオーバーランが修正されました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
  2. 桁数の大きい数値を書式整形するとき、バッファ終端を超えた場所を読み取ってしまうことがありえました。また、作りこまれたタイムスタンプ出力書式において、バッファ終端を超えた位置に書き込むことがあえりました。どちらの場合もバックエンドプロセスのクラッシュを引き起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。

    本セキュリティ障害は CVE-2015-0241 として登録されています。

  3. 内部的に使われる *printf() 置き換え関数群でバッファオーバーランが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  4. PostgreSQL 実装には printf などの置き換え関数が含まれています。その中で浮動小数点値の整形(指定子 'e'、'E'、'f'、'F'、'g'、'G')をおよそ 500 以上の精度を指定して行うとき、スタックのバ
    ッファオーバーランが生じ、バックエンドプロセスのクラッシュをひき起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。PostgreSQLコア機能の他、printf族を利用している拡張モジュールにも影響があります。

    本障害は主として Windows 上で影響があります。Windows においてこれらの置き換え関数が使用されます。 PostgreSQL は適切なシステム実装がある場合には、置き換え関数群でなく、システム実装の関数を使用します。

    本セキュリティ障害は CVE-2015-0242 として登録されています。

  5. 拡張モジュール contrib/pgcrypto のバッファオーバーランが修正されました。 (Marko Tiikkaja, Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  6. pgcrypto モジュールにてメモリサイズ追跡の誤りにより、スタックのバッファオーバーランと未初期化メモリ内容への依存が生じる余地がありました。本バッファオーバーランはバックエンドプロセスのクラッシュをひき起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。

    本セキュリティ障害は CVE-2015-0243 として登録されています。

  7. エラー後に PostgreSQLプロトコルの同期が失われる可能性があり、修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
  8. バックエンドプロセスがクライアントからのメッセージを読んでいる途中に何らかエラーが起きた場合、同期が失われ、メッセージの一部分を新たなメッセージとして解釈しようと誤って試みられます。この障害により、攻撃者がコマンドパラメータ中に作りこまれたバイナリデータを送り出すことで、SQL インジェクションを実現できる可能性がありました。

    本障害ケースをひき起こす「プロトコル処理途中でのエラー」は、代表的には、ステートメントタイムアウトや問い合わせのキャンセルです。タイムアウトを使用していて、かつ、任意のユーザ作成バイナリデータをクエリパラメータで渡せるアプリケーションにおいて、特に脆弱性が生じます。ステートメントタイムアウトを使わないことで完全ではありませんがリスクを軽減できます。

    本セキュリティ障害は CVE-2015-0244 として登録されています。

  9. 制約違反エラーメッセージを通した情報漏洩が修正されました。 (Stephen Frost) (9.4)(9.3)(9.2)(9.1)(9.0)
  10. ユニーク制約違反など、いくつかのサーバエラーメッセージで制約違反した値を出力しています。ユーザが SELECT 権限を持たないとすれば、見ることができないはずの値が見えてしまうことになります。

    本セキュリティ障害は CVE-2014-8161 として登録されています。

    (権限のあるユーザでエラーを出すと、従来通り値も表示される)
    db1=# INSERT INTO t1 VALUES (0, 'XX'), (1, 'XX'), (2, 'XX');
    ERROR:  duplicate key value violates unique constraint "t1_pkey"
    DETAIL:  Key (id)=(1) already exists.
    
    (INSERT 権限はあっても SELECT 権限のないユーザでは、値が表示されないようになる)
    db1=> SELECT * FROM t1;
    ERROR:  permission denied for relation t1
    
    db1=> INSERT INTO t1 VALUES (0, 'XX'), (1, 'XX'), (2, 'XX');
    ERROR:  duplicate key value violates unique constraint "t1_pkey"
    
  11. Windows 上で回帰テスト用の一時的なインスタンスへのアクセスが制限されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  12. SSPI 認証を使うことでテストを起動した OS ユーザのみが接続できるようになりました。これまで他のユーザがテスト中の PostgreSQL に接続することができました。

    本セキュリティ障害は CVE-2014-0067 として登録されています。

  13. Windows ロケール名「Norwegian (Bokmål)」に対応しました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)
  14. 非アスキー文字のロケール名はエンコーディングが定まらないと判別できない問題があります。「Norwegian (Bokmål)」は、ASCII 文字だけで表現される別名「Norwegian_Norway」にマップされます。9.4.0 では「norwegian-bokmal」にマップしていましたが、これは全ての Windows で利用可能な名称ではありませんでした。

  15. EvalPlanQual処理で解放済みメモリを参照してしまう障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  16. EvalPlanQual処理は、READ COMMITTED トランザクション隔離モードでの行の削除・更新・ロックで使われる内部的な仕組みです。

    READ COMMITTED トランザクション隔離モードで、行ロックまたは UPDATE を最近更新した行に対して行うとき、バックエンドプロセスがクラッシュする可能性がありました。

  17. 行ロック取得を試みるときの EvalPlanQual処理においてデッドロックになる可能性があり、修正されました。 (Álvaro Herrera, Mark Kirkwood) (9.4)(9.3)
  18. 複数の他トランザクションが同時に FOR SHARE 行ロックを保持している中で、トランザクションが FOR NO KEY UPDATE 行ロックの取得を試みて待つのに失敗してしまう障害が修正されました。 (Álvaro Herrera) (9.4)(9.3)
  19. 後からの FOR NO KEY UPDATE 行ロックの取得で、本来ブロックされるべきところ、取得できてしまう動作ケースがありました。

  20. テーブルやカラムが多数あるクエリに対する EXPLAIN の性能が改善されました。 (Tom Lane) (9.4)(9.3)
  21. jsonb データ型における Unicode エスケープについて修正され、結論として u0000 は使用できなくなりました。 (Tom Lane) (9.4)
  22. 9.4.0 バージョンでは JSON の Unicode エスケープ「u0000」は受け付けられ6文字のデータとして格納されていました。このことは「\u0000」が入力された場合と区別がつかず、さらに、->> 演算子などで文字列型に変換して出力するときに「u0000」とエスケープを残した形で出力され、一貫性に欠けた振る舞いになります。一方で PostgreSQL は文字列に x00 を含めることができません。

    jsonb型への入力で「u0000」は受け付けないものとなりました。既に格納されているデータは「\u0000」が格納されているものとして扱われます。

    json型では引き続き「u0000」の格納を受け付けます。これは、たとえデータベース文字エンコーディングが UTF8 でなくとも 非ASCII の Unicode エスケープを受け付けるのと同じことです。ただし、テキスト出力時の例外処理は無くなります。

    db1=# SELECT '["u0041"]'::json ->> 0;
     ?column?
    ----------
     A
    (1 row)
    
    (9.4.0 の場合)
    
    db1=# SELECT '["u0000"]'::jsonb ->> 0; -- 例外的な出力になる
     ?column?
    ----------
     u0000
    (1 row)
    
    (9.4.1 の場合)
    
    db1=# SELECT '["u0000"]'::jsonb;            -- jsonb型には格納も不可
    ERROR:  unsupported Unicode escape sequence
    
    db1=# SELECT '["u0000"]'::json;             -- json型なら格納はできる
        json
    ------------
     ["u0000"]
    (1 row)
    
    db1=# SELECT '["u0000"]'::json ->> 0;  -- テキスト出力ではエラーになる
    ERROR:  unsupported Unicode escape sequence
    DETAIL:  u0000 cannot be converted to text.
    
  23. xpath() 関数の名前空間の扱いが修正されました。 (Ali Akbar) (9.4)(9.3)(9.2)(9.1)(9.0)
  24. これまで、xpath() 呼び出しから返される XML値は、入力 XML値の祖先要素に名前空間宣言が付加されていたとしても、名前空間宣言を持ちませんでした。修正で祖先要素の宣言が反映されるようになりました。

    db1=# SELECT xpath('//loc:piece',
     $$
     <local:data xmlns:local="http://127.0.0.1">
      <local:piece id="1">number one</local:piece>
      <local:piece id="2" />
     </local:data>
     $$,
     ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
    
    (修正前の応答)
                                        xpath
    ------------------------------------------------------------------------------
     {"<local:piece id="1">number one</local:piece>","<local:piece id="2"/>"}
    (1 row)
    
    (修正後の応答)
                                                                        xpath
    ------------------------------------------------------------------------------------------------------------------------------------------------
     {"<local:piece xmlns:local="http://127.0.0.1" id="1">number one</local:piece>","<local:piece xmlns:local="http://127.0.0.1" id="2"/>"}
    (1 row)
    
  25. 範囲演算子の選択率見積で、いくつか軽微な誤りが修正されました (Emre Hasegeli) (9.4)(9.3)
  26. プランナエラー「ERROR: unexpected operator NNNN」の発生が修正されます。また、そのほかのいくつかのケースで選択率の見積が改善されます。

    (修正前のエラーを起こす例)
    db1=# CREATE TABLE t_nr (nr numrange);
    db1=# SELECT * FROM t_nr WHERE nr < 'empty';
    ERROR:  unexpected operator 3884
    
  27. 意図しない GIN インデックスの要素最大サイズの引き下げが元に戻されました。 (Heikki Linnakangas) (9.4)
  28. 9.4.0 では、以前のバージョンでは受け入れられていたデータに対して、「ERROR: index row size 〜 exceeds maximum 〜」エラーが出ることがありました。

    (以下は 9.4.0 でエラーになりますが 9.4.1 では INSERT 可能です)
    
    db1=# CREATE TABLE t_gin (tags text[]);
    db1=# CREATE INDEX ON t_gin USING gin (tags);
    db1=# INSERT INTO t_gin VALUES (ARRAY[repeat('a', 120000)]);
    ERROR:  index row size 1400 exceeds maximum 1352 for index "t_gin_tag_idx"
    
  29. GIN インデックスのスキャン繰り返しで、一つのクエリ実行の間のメモリリークがあり、修正されました。 (Heikki Linnakangas) (9.4)
  30. gin_fuzzy_search_limit 設定パラメータにゼロ以外を設定したとき、バックエンドプロセスのクラッシュをひき起こすことがあり、修正されました。 (Heikki Linnakangas) (9.4)
  31. ロジカルデコーディング機能についていくつか修正されました。 (Andres Freund) (9.4)
  32. パラメータ変更をする WALレコードのリプレイが修正されました。 (Petr Jalinek) (9.4)
  33. wal_log_hints の設定変更が正しくリプレイされませんでした。

  34. 実行時統計情報収集のタイムアウトのログレベルが WARNING から LOG に変更されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  35. メッセージも「WARNING: pgstat wait timeout」から、より丁寧な「LOG: using stale statistics instead of current ones because stats collector is not responding」というものになります。

  36. OS X (Darwin) の setlocale() ライブラリ関数が PostgreSQL マスタプロセス内で新たにスレッドを起動する場合に警告とヒントを出すようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
  37. マルチスレッド化すると内部的なシグナル処理で不具合が生じる可能性があります。LC_ALL 環境変数に有効なロケールを設定しておくことが回避策となります。

    「LOG: postmaster became multithreaded during startup」「HINT: Set the LC_ALL environment variable to a valid locale.」というメッセージが出力されるようになります。

  38. /etc/passwd が読めないときの libpq の振る舞いが修正されました (Tom Lane) (9.4)
  39. PQsetdbLogin() 関数を実行するとき、libpq は OS 上のユーザ名を確認しようとします。ほとんどの UNIX プラットフォームでは /etc/passwd が参照されます。

    9.4.0 では /etc/passwd が読めない場合には常にエラーとして扱っていましたが、従来の、データベースロール名が明示されない場合のみエラーにするという振る舞いに戻されました。これにより chroot されて /etc/passwd がない環境に対応します。

  40. psql 特別変数の値の解析が一貫性を持つように改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  41. ECHO_HIDDEN と ON_ERROR_ROLLBACK で on 、off を様々な書き方で与えることができるようになりました(1、0、true、false など)。

    COMP_KEYWORD_CASE 、ECHO 、ECHO_HIDDEN 、HISTCONTROL 、ON_ERROR_ROLLBACK 、および VERBOSITY で、解釈できない値について警告がでるようになりました。

    全ての特別変数の値について大文字小文字の区別なく受け付けるようになりました。これまでは区別があるもの、ないものが混在していました。

  42. pg_dump でイベントトリガーに対するコメントのダンプに失敗していたのが修正されました。 (Tom Lane) (9.4)(9.3)
  43. (失敗例)
    db1=# COMMENT ON EVENT TRIGGER my_event_trg IS 'comment of event trigger';
    db1=# q
    $ pg_dump db1 > db1.dump
    cannot duplicate null pointer (internal error)
    
  44. pg_dump で並列実行する --jobs (-j) オプションとともに--serializable-deferrable オプションが利用可能になりました。 (Kevin Grittner) (9.4)(9.3)
  45. これまではエラーとなっていました。

  46. pg_basebackup の -x / -X オプションで作られた WALファイルが、昇格した際に再度アーカイブされないように修正されました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)
  47. これまで -x / -X オプションで取得した WAL ファイルは未アーカイブの扱いになっていました。wal_keep_segment 設定等でオンライン WAL ファイル数が多いとき、昇格後これらをアーカイブするのに時間を要していました。

  48. contrib/tablefunc の connectby() 関数で、予想外のクエリ結果、特に NULLを安全に扱えるようになりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  49. これまで keyid カラムに NULL があるときクラッシュしていました。

  50. Coverity の静的コード解析の警告に基づき多数の修正が行われました。 (Andres Freund, Tatsuo Ishii, Marko Kreen, Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
  51. ほとんどは表面的な変更ですが、一部においてまれな障害ケースも修正されています。メモリ不足で失敗した際に適切なエラーを出さず、クラッシュしてしまう個所がありました。セキュリティ問題はないものと考えられます。

  52. configure 実行時の環境変数 CFLAGS で自動設定される値を上書きできるようになりました。 (Tom Lane) (9.4)
  53. これまでは configure スクリプトにより CFLAGS の末尾にオプションが追記され、コンパイラが先頭から解釈するために、ユーザ定義した内容を上書きしていました。あらかじめ CFLAGS に設定してあった文字列を末尾に置くようになりました。

    (従来)
    CFLAGS="{あらかじめCFLAGSに設定してあった内容}  {configureで付加される内容} "
    (修正後)
    CFLAGS="{configureで付加される内容}  {あらかじめCFLAGSに設定してあった内容} "
    
  54. pg_regress が成功終了時には作成する一時インスタンスのファイルを全て削除するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  55. タイムゾーン省略名 CST (China Standard Time) が追加されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
  56. 9.3 以前のバージョン系列では、ADT (Arabia Daylight Time) の削除、CKT (Cook Islands)、FJT、FJST (Fiji) のオフセットの修正も行われています。これらは 9.4.0 時点で適用済みでした。

  57. タイムゾーンデータが tzdata release 2015a に更新されました。 (9.4)(9.3)(9.2)(9.1)(9.0)
  58. チリ、メキシコの夏時間法が変更され、アイスランドの歴史的変更が適用されています。

    9.3 以前のバージョン系列では、オーストラリアのタイムゾーンに略記法 AxST/AxDT を採用、そのほか略記法に SERT (Asia/Srednekolymsk) 、XJT (Asia/Urumqi)、WSST/WSDT (西サモア) を追加、Pacific/Bougainville タイムゾーン追加、という変更が適用さ
    れています。これらは tzdata release 2014j での更新内容で、9.4.0バージョンで既に適用されていました。

  59. ALTER DATABASE .. SET TABLESPACE でデータベースのテーブルスペースを移動して、そのあとすぐに元のテーブルスペースに戻すときにデータ破損の可能性があり、修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  60. トランザクション内で DDL と共に ANALYZE を実行してロールバックするときのテーブル破損を回避するように修正されました。 (Andres Freund, Tom Lane, Michael Paquier) (9.3)(9.2)(9.1)(9.0)
  61. トランザクション内で ANALYZE に先だってインデックス削除、ルール削除、(制約を含む)トリガー削除を行う場合に該当します。

  62. UNLOGGEDテーブルが CREATE DATABASE や ALTER DATABASE .. SET TABLESPACE で確実に正しくコピーされるように修正されました。 (Pavan Deolasee, Andres Freund) (9.3)(9.2)(9.1)
  63. これらコマンドで UNLOGGEDテーブルについてもストレージ同期処理が行われるようになりました。

    本障害により、テーブルスペース移動後のチェックポイント処理にて、以下メッセージ出て失敗するケースが報告されていました。

    ERROR:  checkpoint request failed
    ERROR:  could not open file "pg_tblspc/16543/PG_9.3_201411111/16555/16666": No such file or directory
    
  64. CREATE EVENT TRIGGER コマンドの実装誤りが修正されました。 (Petr Jelinek) (9.3)
  65. 本コマンドをプリペアドクエリまたは拡張プロトコルで実行するときに、正しく動作しませんでした。

  66. テーブルのカラムが再帰的に参照される場合の DROP コマンドの依存性確認動作が修正されました。 (Petr Jelinek, Tom Lane) (9.3)(9.2)(9.1)
  67. 拡張モジュールがデータ型とそのデータ型を使ったテーブルの両方を定義する場合に該当します。これまで CASCADE を付けない DROP EXTENSION が不必要に失敗することがありました。

  68. 部分インデックスが子テーブルにあるときの SELECT .. FOR UPDATE に対する実行プランが修正されました。 (Kyotaro Horiguchi) (9.3)(9.2)(9.1)(9.0)
  69. READ COMMITED トランザクションモードでの SELECT .. FOR UPDATE を継承を伴う親テーブルに対して行い、その子テーブルの部分インデックスが使われる場合に、本障害で誤った結果行が返る可能性がありました。

  70. 継承テーブルに対して SELECT .. FOR UPDATE が同じ行を2回返すことがあり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  71. READ COMMITTED トランザクションモードで継承テーブル(親テーブル)に対して SELECT .. FOR UPDATE を行うとき、次の子テーブルの行を返すべきところで誤って手前の子テーブルの行を返してしまうことがありえました。

  72. 外部キー制約定義で重複したカラム名を受け入れないようになりました。 (David Rowley) (9.3)(9.2)(9.1)(9.0)
  73. この制限は SQL標準にしたがったものです。これまでは明確に排除していませんでしたが、後で奇妙なエラーが生じていました。

    (修正後バージョンで以下のエラーが出るようになります)
    db1=# CREATE TABLE t_mas (id int primary key);
    db1=# CREATE TABLE t_ref (id int PRIMARY KEY REFERENCES t_mas (id, id));
    ERROR:  foreign key referenced-columns list must not contain duplicates
    
  74. 「SELECT .. OFFSET -1」がエラーになるように修正されました。 (Tom Lane) (9.3)
  75. PostgreSQL 8.4 以降からは OFFSET に負値を与えるとエラーになるのが本来の動作でしたが、9.3 バージョン系列では OFFSET 指定が無いものとして、SELECT が動作してしまっていました。

  76. ドメインを JSON に変換するときの振る舞いが元に戻されました。 (Tom Lane) (9.3)(9.2)
  77. numeric型および boolean型に対するドメインのデータを変換するときに、ベース型と同じ扱いで変換するようになります。

    9.3.5 以前、9.2.9 以前のバージョンではそのように動作していましたが、関連する別の問題を修正する際に振る舞いが変ってしまっていました。

    (動作例)
    db1=# CREATE DOMAIN d_numeric AS numeric ;
    db1=# CREATE DOMAIN d_boolean AS boolean ;
    db1=# CREATE TABLE tc (b1 boolean, n1 numeric);
    db1=# CREATE TABLE td (b1 d_boolean, n1 d_numeric);
    db1=# INSERT INTO tc VALUES (true, 100);
    db1=# INSERT INTO td VALUES (true, 100);
    db1=# SELECT row_to_json(tc.*) FROM tc;
         row_to_json
    ----------------------
     {"b1":true,"n1":100}
    (1 row)
    
    (9.3.5 / 9.2.9 の場合)
    db1=# SELECT row_to_json(td.*) FROM td;
          row_to_json
    -----------------------
     {"b1":"t","n1":"100"}
    (1 row)
    
    (9.3.6 / 9.2.10 の場合)
    db1=# SELECT row_to_json(td.*) FROM td;
         row_to_json
    ----------------------
     {"b1":true,"n1":100}
    (1 row)
    
  78. json_agg() 関数が末尾に余計な右ブラケット(])付けてを返さないように修正されました。 (Tom Lane) (9.3)
  79. 整数べき乗計算の誤りが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  80. 大きいべき乗数を与えた場合に、誤った答えが返ったり、オーバーフローと判別するまでに大量にメモリを消費して長時間を要することがありました。

    (障害動作例:以下2つはゼロかゼロに非常に近い値が返るはず)
    
    db1=# SELECT 10.0 ^ -2147483648;
       rounds_to_zero
    --------------------
     1.0000000000000000
    (1 row)
    
    db1=# SELECT 10.0 ^ -2147483647;
    ERROR:  division by zero
    
    (以下は「ERROR:  value overflows numeric format」とならなければいけない)
    db1=# SELECT 10.0 ^ 2147483647 ;
         overflows
    --------------------
     0.0000000000000000
    
    db1=# SELECT 117743296169.0 ^ 1000000000 ;
     ... 長時間応答なし
    
    
  81. NUMERICデータ型のバイナリ入力関数 numeric_recv() で表示桁数属性にしたがえば見えない微小桁を切り捨てるようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  82. クライアントからバイナリデータで投入された numeric 値で、表示される桁より小さな桁の値が保持されていて、値の演算を経て顕在化する奇妙な動作がありました。

  83. 正規表現の最短一致の誤りが修正されました。 (Tom Lane) (9.3)(9.2)
  84. 最短一致指定を付けた場合にマッチに失敗することがありました。

    (修正前の障害動作例:最短一致指定で + の後の ? を付けるとマッチしない)
    db1=# SELECT regexp_matches('foo/bar/baz',
                   '^([^/]+)(?:/([^/]+))(?:/([^/]+))?$', '');
     regexp_matches
    ----------------
     {foo,bar,baz}
    (1 row)
    
    db1=# SELECT regexp_matches('foo/bar/baz',
                    '^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', '');
     regexp_matches
    ----------------
    (0 rows)
    
  85. 数値による timezone 設定値の指定で範囲外の値を拒絶するようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  86. timezone に +/- 168時間を超える値を指定可能でしたが、タイムゾーン処理時にクラッシュをひき起こしていました。+/- 167 までに制限されるようになります。

    (修正前の障害動作例)
    db1=# SET timezone TO '+300';
    SET
    db1=# SELECT '2015-02-11'::timestamptz;
    server closed the connection unexpectedly
    (ここでバックエンドクラッシュ)
    
  87. 演算子「tsquery @> tsquery」の障害が修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  88. 語の一致を CRC 計算値のみで判断していたため、偶然 CRC が一致した異なる語があるとき誤った結果が返っていました。

    また、右辺の要素の方が多い場合にはマッチしないものとする動作でしたが、語の重複を考慮すると適切な振る舞いではありませんでした。

    (以下は修正前バージョンでは f 、修正後バージョンで t となります)
    db1=# SELECT to_tsquery('aaa,bbb') @> to_tsquery('aaa,bbb,aaa');
    
  89. 全文検索で Ispell辞書を作る際に接辞ファイル(AffFile) に指定したファイルが不適切である場合にクラッシュしないように修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  90. 全文検索の類語辞書にて、一つのエントリに 65536 以上の語句を指定できるようになりました。 (David Boutin) (9.3)(9.2)(9.1)(9.0)
  91. 行全体の変数値と複合引数の処理が修正されました。 (Tom Lane) (9.3)(9.2)
  92. 行全体の値が空のカラム名を関数に出さないように修正されました。

    「SELECT row_to_json(tab.*) ...」などを実行した際に予期せぬエラー「ERROR: record type has not been registered」が生じることがありました。

  93. postgres_fdw のクエリでシステムカラムの扱いについて修正されました。 (Etsuro Fujita) (9.3)(9.2)
  94. tableoid などの ctid 以外のシステムカラムについて、リモート側でなく呼び出し側で処理するようになりました。

  95. インデックスの付いたカラムに対して「col = ANY ( array ) 」を実行する際に劣ったプランになるのを避けるようになりました。 (Andrew Gierth) (9.3)(9.2)
  96. これまで「Filter: (col = ANY (...))」が有利な場合でも、「Index Cond: (col = ANY (...))」が使われることがあり、修正されました。

    なお「col IN (101, 102, 103) 」のような式も「col = ANY ('{101,102,103}'::integer[])」などと変換されて実行されますので該当します。

  97. 「ERROR: variable not found in subplan target lists」メッセージが出る障害が修正されました。 (Tom Lane) (9.3)
  98. 複合引数を取りインライン展開される SQL関数が、LATERAL 副問い合わせで使われる場合や、その複合引数が LATERAL参照である場合に発生します。

  99. UNION ALL のサブクエリ内における継承テーブルのように、入れ子で Append 処理が行われる場合のプランナの問題が修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  100. バックエンドクラッシュをひき起こすことがありました。

  101. GiST インデックス要素がページに適合していない場合に正常にエラーを出すように修正されました。 (Andrew Gierth) (9.3)(9.2)(9.1)(9.0)
  102. サイズの大きい要素の投入に対して、無限再帰処理からのバックエンドクラッシュが生じていました。

  103. 自動VACUUM でテーブル毎の cost_limit、cost_delay 指定がある場合、グローバルなこれらコストバランス規則からは除外するようになりました。 (Álvaro Herrera) (9.3)(9.2)(9.1)(9.0)
  104. これまでは、結果としてテーブル毎のこれら設定が無視されていました。本修正により、テーブル毎コスト設定がある場合には、他の autovacuum workerプロセスとは独立に休止の処理が行われるようになり、指定値が反映されます。

    本変更により、同じ設定であればより休止が少なくなり、I/O 負荷が以前より高まることになります。

  105. autovacuum = off であるとき、大規模な自動VACUUM 処理を回避するようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  106. autovacuum = off であっても、XID 周回対策処理が必要であるときには、自動VACUUM が実行される仕様です。このときの対象データベースの全テーブルに通常の自動VACUUM 処理が行われていました。これは、XID 周回の脅威への対応を遅らせることにもなっていました。

    本修正により、autovacuum = off であるときには、XID 周回対策処理だけを自動で行うようになりました。

  107. クラッシュリカバリ中、リカバリが完了する前に、UNLOGGED テーブルを空にしてディスク同期するようになりました。 (Abhijit Menon-Sen, Andres Freund) (9.3)(9.2)(9.1)
  108. これにより、クラッシュリカバリ後に UNLOGGED テーブルにゴミデータが含まれることを防ぎます。

  109. ホットスタンバイのクエリと、フルページイメージのリプレイの競合状態が修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  110. この不具合はホットスタンバイでのクエリ実行で一時的なエラー、あるいは、誤った実行結果(行の欠損)をもたらすことがありました。

  111. COMMIT/ABORT PREPARED の WALレコードを不適切に無視するリカバリロジックがいくつか修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  112. pg_last_xact_replay_timestamp() 関数、recovery_target_xid 設定において 2相コミットの PREPARED 処理の WAL レコードが無視されていました。なお、9.4 系列においては recovery_min_apply_delay 設定でも無視されていましたが、9.4.0 にて既に修正が
    適用済みです。

  113. クラッシュリカバリ完了時に、最新のWALファイルが再度アーカイブされないように修正されました。 (Fujii Masao) (9.3)(9.2)
  114. タイムラインヒストリファイルに必要のない .ready マーカーファイルが作成されないように修正されました。 (Fujii Masao) (9.3)(9.2)(9.1)(9.0)
  115. これまでは旧タイムラインのアーカイブからリストアした WALファイルであってもリカバリ時に常に .ready ファイルが作られていました。

  116. log_statement が mod もしくは ddl で、空のプリペアドステートメントが使用されたときにヌルポインタ参照が起こらないように修正されました。 (Fujii Masao) (9.3)(9.2)(9.1)(9.0)
  117. マスタプロセスの動的バックグラウンドワーカーのリストが破損する可能性があり、修正されました。 (Andres Freund) (9.3)
  118. 9.4.0 リリース前時点の9.4系列で問題が発見され、9.3.6 でも同様の修正が適用されました。

  119. いくつかのnon-Solaris カーネルがそうするように SPARC のスピンロックをCPU が non-TSO コヒーレンシーモードでの正確な動作を保証するように修正されました。 (Andres Freund) (9.3)(9.2)(9.1)(9.0)
  120. PQconnectdbParams() 関数で dbname パラメータが繰り返されたときの処理が修正されました。 (Alex Shulgin) (9.3)(9.2)(9.1)(9.0)
  121. dbname が接続文字列かURIに含まれていた時、予期しない振る舞いをすることがありました。

  122. libpq が報告する予期しないソケットのEOFに関するメッセージを適切なものにしました。 (Marko Tiikkaja, Tom Lane) (9.3)(9.2)(9.1)(9.0)
  123. カーネルの振る舞いに従うと、libpq はサーバが予期せずソケットが閉じたときに有用なエラーを返さずに、空のエラー文字列を返してしまうことがありました。

  124. PQreset() 関数実行中の古いエラーメッセージが消去されるようになりました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  125. PQreset() 関数が何度も呼ばれて接続が再確立できなかったとき、失敗した接続によるエラーメッセージは PGconn のエラー文字列に蓄積し続けていました。

  126. libpq 接続オプションの構文解析におけるメモリ不足状態を適切に扱えるようになりました。 (Alex Shulgin, Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  127. これまで接続クライアント側でクラッシュが生じることがありました。

  128. ParseDateTime() 関数の ecpg バージョンにおける配列オーバーランが修正されました。 (Michael Paquier) (9.3)(9.2)(9.1)(9.0)
  129. 本障害箇所が攻撃に使われる恐れは無いものと考えられます。

  130. initdb 実行時、パスワードファイルが指定されているにも関わらずその内容が空の場合、エラーメッセージを明示的に出力するようになりました。 (Mats Erik Andersson) (9.3)(9.2)(9.1)(9.0)
  131. 以前も空のパスワードファイルである場合には initdb は失敗していましたが、エラーメッセージが明快ではありませんでした。

    (以前のメッセージ例)
    $ initdb -D ./pgdata --pwfile empty.pass
    The files belonging to this database system will be owned by user "postgres".
     (中略)
    initdb: could not read password from file "empty.pass": Success
    initdb: removing data directory "./pgdata"
    
  132. 最近の libedit を利用している psql の s コマンドがうまく働くようになり、ページャのサポートが付加されました。 (Stepan Rutz, Tom Lane) (9.3)(9.2)(9.1)(9.0)
  133. readline ではなく libedit でビルドされた psql では、s コマンドによるヒストリ表示がおよそ読めないものでした。

    そこで、このライブラリを用いるのではなく、自身でヒストリを表示する方式に修正されました。さらに良い副作用としてページャが使えるようになりました。

    本修正で、libedit でコマンドヒストリを保存するとき、改行コードに一貫性がない場合における障害も修正されています。

  134. psql の watch コマンドで pset null で指定した null 表示を適用するようになりました。 (Fujii Masao) (9.3)
  135. これまでは設定が無視されていました。

  136. psql 拡張形式表示で border が 3 で、linestyle が ascii または unicode であるときに、一貫した表示になるように修正されました。 (Stephen Frost) (9.3)(9.2)(9.1)(9.0)
  137. (修正前は以下のように末尾の罫線が不適切でした)
    $ psql db1 <<'EOS'
    > pset border 3
    > pset linestyle ascii
    > x
    > SELECT * FROM t1 ;
    > EOS
    [ RECORD 1 ]
    | id | 1   |
    | v  | AAA |
    --+----
    
  138. pg_dump でオブジェクトの依存関係を調べる処理が改善され、性能が向上しました。 (Tom Lane) (9.3)(9.2)(9.1)
  139. データベース内に、同一オブジェクト間に多重の依存性経路をもつケースが多くある場合に本修正の効果があらわれます。

  140. pg_dumpall が 8.1 以前のサーバをダンプできるように修正されました。 (Gilles Darold) (9.3)(9.2)
  141. (pg_dump -s オプションによる) 定義のみのダンプを並行リストアするときに発生しうるデッドロックが修正されました。 (Robert Haas, Tom Lane) (9.3)(9.2)(9.1)(9.0)
  142. カラムを一つも持たない複合型があるとき pg_dump --binary-upgrade がクラッシュしていたものが修正されました (Rushabh Lathia) (9.3)(9.2)(9.1)(9.0)
  143. --binary-upgrade オプションは pg_upgrade コマンドから使用されます。

  144. pg_upgrade でデフォルトでないテーブルスペースのテーブルに対する fsyncに失敗していて、修正されました。 (Abhijit Menon-Sen, Andres Freund) (9.3)
  145. pg_upgrade 実行中に OS クラッシュ等が生じた場合にデータ欠損が生じる可能性がありました。

  146. pg_upgrade で新しいクラスタが TOAST を持たないテーブルに対して事前にTOAST テーブルを作成するときに適切に動作するように修正されました。 (Bruce Momjian) (9.3)
  147. これまでは OID 衝突によって失敗することがありました。

  148. pg_upgrade で autovacuum_multixact_freeze_max_age を古いクラスタに対して設定しないようになりました。 (Bruce Momjian) (9.3)
  149. 本パラメータは 9.3.3 で追加されたため、9.3.2 までのサーバに対しては、失敗してしまいます。実際のところ設定する必要がないパラメータでした。

  150. pg_upgrade で、トランザクションID のエポック時間が保たれるように修正されました。 (Bruce Momjian) (9.3)
  151. この不具合は通常のPostgreSQLに影響するものではありませんが、Slony-I やlondiste などのレプリケーションツールに影響を与える可能性がありました。

  152. pg_receivexlog コマンドのメモリリークが修正されました。 (Fujii Masao) (9.3)
  153. pg_receivexlog コマンドの verbose メッセージが意図せず抑制されており、修正されました。 (Fujii Masao) (9.3)
  154. contrib/auto_explain が EXPLAIN ANALYZE 実行時に計画ノードごとの所用時間情報の出力に失敗することがあり、修正されました。 (Tom Lane) (9.3)(9.2)
  155. contrib/citext のアップグレードスクリプトが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)
  156. contrib/hstore の hstore_to_json() 関数による整数オーバーフローと (Heikki Linnakangas) (9.3)
  157. バッファオーバーランを防ぐように修正されました。

  158. hstore_to_json_loose() 関数による数値の認識処理が修正されました。 (Andrew Dunstan) (9.3)
  159. これにより JSON の数値や文字列が正しく区別できるようになります。

  160. contrib/pageinspect の get_raw_page() 関数によるブロック数のチェックが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  161. 間違ったロジックにより、リレーションの主フォークでないページへのアクセスが妨げられることがありました。

  162. contrib/pgcrypto の pgp_sym_decrypt() 関数で、メッセージ長がちょうど 2 の乗数から 6 を引いた長さである場合に失敗しており、修正されました。 (Marko Tiikkaja) (9.3)(9.2)(9.1)(9.0)
  163. メッセージ長が 65530 バイト (2^16 - 6) や、16378 バイト(2^14 - 6) などの場合に該当します。「Error: Wrong key or corrupt data」が生じていました。なお、メッセージ長が (2^14 x N - 6) N=正整数 の場合に該当するケースも報告されています。

  164. contrib/pg_test_fsync によるファイルディスクリプタリークが修正されました。 (Jeff Janes) (9.3)(9.2)(9.1)
  165. これにより Windows の一時ファイルの削除に失敗することがありました。

  166. contrib/xml2 の xslt_process() 関数がクラッシュを回避するように修正されました。 (Mark Simonetti) (9.3)(9.2)(9.1)(9.0)
  167. これまでの保守的すぎる揮発性指定は、通常利用においては問題ありませんが、最適化と式インデックス利用の妨げとなっていました。本修正では拡張モジュールのバージョン番号は変更されません。

  168. contrib モジュールのデータ型追加のための入出力関数のいくつかに、適切な揮発性の指定が付加されました。 (Tom Lane) (9.3)(9.2)(9.1)
  169. これまでの保守的すぎる揮発性指定は、通常利用においては問題ありませんが、最適化と式インデックス利用の妨げとなっていました。本修正では拡張モジュールのバージョン番号は変更されません。

  170. バックグラウンドワーカープロセスの初期化について修正されました。 (Robert Haas) (9.3)
  171. Windowsプラットフォームで不具合の可能性がありました。

  172. ビルド時に互換性のない OpenLDAPバージョンを検知するようになりました。 (Noah Misch) (9.3)(9.2)(9.1)(9.0)
  173. OpenLDAP 2.4.24 から 2.4.31 は、PostgreSQL のバックエンドプロセスをクラッシュさせます。configure で警告を出すとともに、contrib/dblink の回帰テストにクラッシュを引き起こすシナリオを含めるようになりました。

  174. Visual C 以外での Windows むけビルドで、libpq.dll が確実に実行権限を付加してインストールされるように修正されました。 (Noah Misch) (9.3)(9.2)(9.1)(9.0)
  175. UTCオフセットが変化するタイムゾーン略記法に対応しました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  176. 与えられた日付に応じて、タイムゾーン略記法をその日付時点での正しい UTC オフセットに関連付ける動作をするようになります。

PostgreSQL 9.3.5、9.2.9、9.1.14、9.0.18、8.4.22 への変更点


  1. pg_upgrade で正しくアップグレードできない問題が修正されました (Bruce Momjian) (9.3)
  2. initdb により取り残された pg_multixact ディレクトリのファイルを削除するようになりました。

    9.3.5 以前の 9.3系列バージョンに付属する pg_upgrade を使用して、9.2.x 以前のデータベースクラスタを 9.3系列にアップグレードした場合に $PGDATA/pg_multixact/offsets/0000 ファイルが残ってしまいます。これは VACUUM 処理にて後に問題を引き起こします。とはいえ一般的なケースでは本ファイルを削除する必要はありません。

    アップグレードしたデータベースクラスタに問題があるかは、以下の SQLを管理者ユーザで実行することで確認できます。

    WITH list(file) AS (SELECT * FROM pg_ls_dir('pg_multixact/offsets'))
    SELECT EXISTS (SELECT * FROM list WHERE file = '0000') AND
           NOT EXISTS (SELECT * FROM list WHERE file = '0001') AND
           NOT EXISTS (SELECT * FROM list WHERE file = 'FFFF') AND
           EXISTS (SELECT * FROM list WHERE file != '0000')
           AS file_0000_removal_required;
    

    「t」が返った場合には、手動で「$PGDATA/pg_multixact/offsets/0000」ファイルを削除してください。

  3. contrib/btree_gist 拡張モジュールの bit型カラムに対するインデックスの初期パディングバイトが修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  4. 本障害は、カラム値のイコール比較で誤ることで、誤った問い合わせ結果をひき起こします。GiSTインデックスを bit型または bit varying型のカラムに適用している場合には、 バージョンアップ後に REINDEX が必要となります。

  5. GINインデックスでページ破損を防ぐように修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  6. これまでインデックスのページ更新をディスク書き込みしているときにシステムクラッシュがおきると、インデックスが壊れる可能性がありました。

  7. リカバリ中における GiSTインデックスの処理が修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  8. WALリプレイに基づき GiSTインデックスのページを更新する際に、右リンク(次ページ番号)をクリアしないように修正されました。

    本障害にて、ホットスタンバイサーバにおける GiSTインデックスを使った検索で誤った問い合わせ結果をひき起こす可能性があります。

  9. text_ops 演算子クラスを適用した SP-GiSTインデックスにおいて、稀に無限ループが生じる可能性があり、修正されました。 (Tom Lane) (9.3)(9.2)
  10. SP-GiSTインデックスによる隣接演算子(-|-)を使った検索結果が誤っている場合があり、修正されました。 (Heikki Linnakangas) (9.3)
  11. pg_multixact/members ディレクトリのファイルに対するトランザクションID周回処理が修正されました。 (Álvaro Herrera) (9.3)
  12. 本修正は、以下エラーメッセージが出る問題に対し行われた 9.3.3 での修正の不備を補うものです。

    ERROR:  could not access status of transaction NNNNNNNN
    DETAIL:  Could not open file "pg_multixact/members/XXXX": No such file or directory.
    

  13. pg_multixact の切り詰めを VACUUM 時でなく、チェックポイント時に行うようになりました (Álvaro Herrera) (9.3)
  14. この変更により、クラッシュ後の WALリプレイで未だ必要な pg_multixactセグメントが削除されないことを確実にします。

  15. WALリカバリの後、all-visibleフラグについて不整合が生じる可能性があり、VACUUM 処理が修正されました (Heikki Linnakangas) (9.3)
  16. all-visibleフラグとは、ページの中にデッドタプル(不要行バージョン)が無いことを示すものです。

  17. 内部関数 ReceiveSharedInvalidMessages が入れ子で呼ばれた場合にキャッシュ無効化の不整合が出る可能性があり、修正されました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  18. 他のプロセスのロックされた行の同時更新にて競合があり、修正されました (Andres Freund, Álvaro Herrera) (9.3)
  19. 継承機能における子テーブルを読むサブクエリに対する UNION ALL でプランナが失敗する障害があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)
  20. 「ERROR: could not find pathkey item to sort」というエラーが発生します。以下に障害発生例を示します。

    db=# CREATE TABLE events (event_id int PRIMARY KEY);
    db=# CREATE TABLE other_events (event_id int primary key);
    db=# CREATE TABLE events_child () INHERITS (events);
    db=# EXPLAIN SELECT event_id FROM (SELECT event_id FROM events
         UNION ALL SELECT event_id FROM other_events) ss ORDER BY event_id;
    ERROR:  could not find pathkey item to sort
    
  21. 複数行を返す関数がターゲットリストに含まれている時、サブクエリの出力がユニークである前提としないように、修正されました (David Rowley) (9.3)(9.2)(9.1)(9.0)(8.4)
  22. 本障害は「WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y)」といった問い合わせ記述に対して、誤った最適化をひき起こしました。

  23. プランナが改善され、可能なら AND/OR 条件の入力から null定数を除去するようになりました (Tom Lane) (9.3)(9.2)
  24. 以下のような問い合わせで t1.a、t1.b にインデックスがあっても、IN 条件に null が混じっているためにシーケンシャルスキャンになってしまう問題がありました。

    db=# EXPLAIN (COSTS OFF)
         SELECT * FROM t1 WHERE (a, b) IN ((1, 1000), (null, null));
                          QUERY PLAN
    -------------------------------------------------------
     Seq Scan on t1
       Filter: (((a = 1) AND (b = 1000)) OR NULL::boolean)
    (2 rows)
    
  25. プランナが VARIADIC キーワードを使った関数呼び出しと、そうでない関数呼び出しを同一にみなすように修正されました (Tom Lane) (9.3)
  26. 可変引数を持つ関数に対して、関数インデックスを定義した場合、関数インデックス定義時の書き方通りに呼び出さないと、インデックスが使われませんでした。

    (test_func が可変引数関数であるとして、このようにインデックスを作ると)
    CREATE INDEX test_idx ON test
      USING btree ((test_func(val, 'a', 'b')));
    
    (こちらではインデックスが使われるが)
    SELECT * FROM test WHERE test_func(val, 'a', 'b') > 60;
    
    (こちらでは文の意味は同じだがインデックスが使われない)
    SELECT * FROM test
      WHERE test_func(val, VARIADIC ARRAY['a'::text, 'b'::text]) > 60;
    
  27. json_populate_recordset() 関数における入れ子のJSONオブジェクトの扱いが修正されました (Michael Paquier, Tom Lane) (9.3)
  28. 以下のような JSON データを行データに展開するとして、その中にもJSONデータ型が含まれている場合が該当します。

    (以下のように誤った結果となります)
    db=# CREATE TYPE jpop2 AS (a int, b json, c int, d int);
    db=# SELECT * FROM json_populate_recordset(null::jpop2,
           '[{"a":2,"c":3,"b":{"z":4},"d":6}]', true) q;
     a |    b    | c | d
    ---+---------+---+---
       | {"z":4} |   | 6
    
    (本修正を適用したバージョンでは以下のように正しく出力されます)
     a |    b    | c | d
    ---+---------+---+---
     2 | {"z":4} | 3 | 6
    
  29. to_json() 関数などで引数型を型カテゴリで識別していたものが修正されました (Tom Lane) (9.3)(9.2)
  30. to_json() 関数は anyelement疑似型を受け取って JSON に変換する関数です。これまで PostgreSQL上のデータ型の型カテゴリを使って、どの JSON型にあてはめるかを判定していましたが、誤認する可能性があるた
    め、個別のデータ型ごとに場合分けするようになりました。

  31. TOAST格納された複合型の配列などに対するアクセスでエラーがでる問題があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  32. 「ERROR: missing chunk number 0 for toast value ...」というエラーが出ることが報告されています。TOAST 処理について修正が必要でした。

  33. Append を伴う実行プランの出力の行全体を参照するときに「ERROR: record type has not been registered」が出る問題が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  34. 以下の SELECT で本エラーが発生します。

    db=# CREATE TABLE t (f1 int);
    db=# INSERT INTO t (f1) VALUES (-1), (+1);
    db=# SELECT (SELECT q FROM
           (SELECT 1,2,3 WHERE f1 > 0
            UNION ALL
            SELECT 4,5,6.0 WHERE f1 <= 0 ) q ) from t;
    

  35. カーソルを巻き戻したときユーザ定義関数を呼び出す場合にバックエンドプロセスがクラッシュする可能性があり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  36. 以下のようにカーソルに対応した SQL の LIMIT句に関数呼び出しがある場合などが該当します。

    CREATE FUNCTION NOCHANGE(int) RETURNS int
      AS 'SELECT $1 ' LANGUAGE SQL STABLE;
    BEGIN;
    DECLARE c CURSOR FOR SELECT * FROM t LIMIT nochange(3);
    FETCH ALL FROM c;
    MOVE BACKWARD ALL IN c;
    FETCH ALL FROM c;
    COMMIT;
    

  37. FROM 句にある関数の引数を処理する際のメモリリークが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  38. 一つの SQL文実行の中でのメモリリークであり、本修正以前でも SQL完了後は当該メモリは解放されます。

  39. 正規表現処理でメモリリークが修正されました (Tom Lane, Arthur O'Dwyer, Greg Stark) (9.3)(9.2)(9.1)(9.0)(8.4)
  40. ある接続内でのメモリリークで、切断するまでメモリリークが残ります。現象ではなくコードロジックから発見された障害で、発生の可能性は低いものといえます。

  41. テキスト全文検索におけるハンガリー語のストップワードの誤りが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  42. 外部テーブルを OID 列を含めて作ることができないようになりました (Etsuro Fujita) (9.3)(9.2)(9.1)
  43. これまでも WITH OIDS を指定することはできませんでしたが、default_with_oids = true の設定を通して OID列を作ることが可能でした。ただし、OID列を含めたとしても適切に処理できていませんでした。

  44. 行の有効性チェックについて修正されました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  45. 実行中トランザクションにより挿入され、ロールバックされたサブトランザクションの中で削除された行に対して、その後に同トランザクション内でCREATE INDEX や CLUSTER を実施すると、少なくとも不審な WARNING が生じ、最悪の場合には無限ループに陥ります。

    以下に再現例を示します。

    db=# BEGIN;
    db=# INSERT INTO t1 VALUES (1, '111');
    db=# SAVEPOINT x;
    db=# DELETE FROM t1;
    db=# ROLLBACK TO x;
    db=# CREATE INDEX idx_t1a ON t1 (a);
    WARNING:  concurrent delete in progress within table "t1"
    

  46. pg_stat_activity ビューの xact_start 列の値が PREPARE TRANSACTION のとき表示しないようになりました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  47. 二相コミット用に準備されたトランザクションは、PREPARE TRANSACTION を実行した時点で接続(セッション)はトランザクション実行中状態ではなくなっているので、本修正のようにするのが適切でした。

  48. REASSIGN OWNED 命令がテキスト全文検索用オブジェクトに対してエラーをひき起こしていたものが修正されました (Álvaro Herrera) (9.3)(9.2)(9.1)(9.0)(8.4)
  49. 以下に発生例を示します。

    =# ! touch /usr/local/pgsql/share/tsearch_data/mystop.stop
    =# CREATE TEXT SEARCH DICTIONARY my_dic
         (template = snowball, language = russian, stopwords = mystop);
    =# CREATE ROLE foo;
    =# CREATE ROLE bar;
    =# ALTER TEXT SEARCH DICTIONARY my_dic OWNER TO foo;
    =# REASSIGN OWNED BY foo TO bar;
    ERROR:  unexpected classid 3600
    

  50. pg_class テーブルの relminmxid 列の値が VACUUM FULL で後戻りしてしまうことを防ぐように修正されました (Álvaro Herrera) (9.3)
  51. ルールとビューの定義出力でインデントが削減されました (Greg Stark, Tom Lane) (9.3)
  52. 読みやすさの改善と過剰な空白文字出力を避けるためです。

    多重の入れ子構造の SQL であるとき、性能劣化やメモリ不足の恐れがありました。例えば、これまで 5 つの SELECT を UNION ALL でつないだビューは、以下のように出力されていました。

    View definition:
            (        (        (         SELECT t1.a,
                                        t1.b
                                       FROM t1
                            UNION ALL
                                     SELECT t1.a,
                                        t1.b
                                       FROM t1)
                    UNION ALL
                             SELECT t1.a,
                                t1.b
                               FROM t1)
            UNION ALL
                     SELECT t1.a,
                        t1.b
                       FROM t1)
    UNION ALL
             SELECT t1.a,
                t1.b
               FROM t1;
    

  53. ルールとビューの定義出力で、USING 節で指定した列名に当てはまる列を後からビューの元テーブルに追加した場合について、修正されました (Tom Lane) (9.3)
  54. 以下のように別名が自動的に付与されるようになりました。

    db=# SELECT pg_get_viewdef('vv6', true);
          pg_get_viewdef
    ---------------------------
      SELECT tt11.x,          +
         tt11.y,              +
         tt12.z,              +
         tt13.q               +
        FROM tt11             +
          JOIN tt12 USING (x) +
          JOIN tt13 USING (z);
    (1 row)
    
    db=# ALTER TABLE tt11 ADD COLUMN z int;
    db=# SELECT pg_get_viewdef('vv6', true);
            pg_get_viewdef
    ------------------------------
      SELECT tt11.x,             +
         tt11.y,                 +
         tt12.z,                 +
         tt13.q                  +
        FROM tt11 tt11(x, y, z_1)+
          JOIN tt12 USING (x)    +
          JOIN tt13 USING (z);
    (1 row)
    
  55. 除去された列を含む複合型を返す関数を FROM句に持つビューの定義出力が修正されました (Tom Lane) (9.3)
  56. 以下のように不適切な出力になっていました。

    db=# CREATE TABLE tt14t (f1 text, f2 text, f3 text, f4 text);
    db=# INSERT INTO tt14t VALUES ('foo', 'bar', 'baz', 'quux');
    db=# ALTER TABLE tt14t DROP COLUMN f2;
    db=# CREATE FUNCTION tt14f() RETURNS SETOF tt14t AS $$
          declare rec1 record;
          begin
            for rec1 in select * from tt14t
              loop return next rec1; end loop;
          end; $$ language plpgsql;
    db=# CREATE VIEW tt14v AS SELECT t.* FROM tt14f() t;
    db=# SELECT pg_get_viewdef('tt14v', true);
                pg_get_viewdef
    --------------------------------------
      SELECT t.f1,                       +
         t.f3,                           +
         t.f4                            +
        FROM tt14f() t(f1, "<>", f3, f4);
    (1 row)
    

  57. マスタープロセス(postmaster) が起動するときにシグナルをブロックするようになりました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  58. 本修正により、起動途中に INTシグナルを受けて終了する場合などで適切に各種リソースの後片付けができるようになります。

  59. pg_hba.conf のIPアドレスの替わりにホスト名が書かれた項目の処理について修正されました (Tom Lane) (9.3)(9.2)(9.1)
  60. DNS逆引き失敗について単に失敗とせず、確実に報告するようになりました。また、DNS逆引きにあたり pg_hba.conf の各ホスト名ではなく、接続対象のホストだけについて試みるようになりました。

    「ERROR: no pg_hba.conf entry for ...」メッセージが出て接続できないけれども原因が分かりにくいケースが報告されていました。

  61. rootユーザでも postgres コマンドの -C および --describe-config オプションが使用可能となりました (MauMau) (9.3)(9.2)
  62. これらは起動中の PostgreSQLサーバの設定値を確認するオプションです。root で実行を禁止する理由が無いものと判断され、規制が緩められました。-C オプションは pg_ctl の中でも使われる場合があり、root で操作できないことで不都合がありました。

  63. リグレッションテスト実行中の一時的な PostgreSQLサーバプロセスの UNIXドメインソケットがより安全になるように修正されました (Noah Misch) (9.3)(9.2)(9.1)(9.0)(8.4)
  64. これまで make check コマンドによるリグレッションテストを実行している間、同ホスト内の OSユーザは PostgreSQLスーパーユーザとして接続可能であり、結果として任意のコードをテストを実行しているユーザとして実行可能でした。このことは CVE-2014-0067 として脆弱性として報告されていました。

    本修正でソケットファイルを 0700 モードのサブディレクトリ下に作るようになり、他のユーザの接続を防ぎます。なお、Windows では ローカル TCP 接続を使用するため、本セキュリティリスクが残ります。

  65. テーブルスペース作成の WALリプレイが Windows で動作するように修正されました (MauMau) (9.3)(9.2)(9.1)(9.0)
  66. 既存のシンボリックリンクを削除する処理が、Windows の場合に対応していませんでした。削除に失敗して「ERROR: could not remove symbolic link ...」が出ます。

  67. Windows でソケット作成失敗を正しく判断できるように修正されました (Bruce Momjian) (9.3)(9.2)(9.1)(9.0)
  68. Windows の場合、障害がより後段の処理まで隠されてしまう可能性がありました。

  69. Windows で backend コンテキストの設定パラメータを設定ファイルから変更したときに新しい接続で適用できるようになりました (Amit Kapila) (9.3)(9.2)(9.1)(9.0)(8.4)
  70. これまでは、Windows では PostgreSQL再起動なしには変更を反映させることができませんでした。本来は、reload 後の次の新たな接続からは変更が反映されなければいけません。backend コンテキストの設定パラメータには log_connectionsや local_preload_libraries があります。

  71. Windows の実行パス名が適切にクオートされるようになりました (Nikhil Deshpande) (9.3)(9.2)(9.1)(9.0)(8.4)
  72. 本誤りにより Windows でインストールパスにスペースと「@」記号が含まれているとき、initdb と pg_upgrade が失敗することがありました。

  73. OS X で libpython のリンクについて修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  74. これまで使っていた方式は Xcode 5.0 以降で供給される Python ライブラリでは使用できませんでした。

  75. クライアントが取り込むよりも速くサーバがデータを送り続けた場合に、libpq のメモリ大量使用を回避するように修正されました (Shin-ichi Morita, Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  76. これまで libpq は入力バッファ拡大を繰り返して、メモリ不足になり、「lost synchronization with server」エラーをひき起こしていました。

  77. libpq の接続時 LDAP 照会におけるタイムアウトについて修正されました (Laurenz Albe) (9.3)(9.2)(9.1)(9.0)(8.4)
  78. これまでタイムアウトが設定されておらず、LDAPサーバの応答が無い場合に長くハングアップすることがありえました。

  79. ecpg における char 型のポインタの配列の扱いについて修正されました (Ashutosh Bapat) (9.3)(9.2)(9.1)(9.0)
  80. これまで、char型ポインタの配列を複数行を返す FETCH コマンドのターゲットとしたとき、全結果を最初の要素に格納するように動作していました。

  81. pg_dump が GROUP BY で元テーブルの主キーに依存したマテリアライズドビューを正しく処理できるように修正されました (Tom Lane) (9.3)
  82. 以下のように定義したマテリアライズドビューをダンプすると、「CREATE TABLE mat1 ...」という出力がされてしまいました。その結果、リストア時に「REFRESH MATERIALIZED VIEW mat1」に対して「ERROR: "mat1" is not a table or materialized view」というエラーが発生していました。

    db1=# CREATE TABLE t1 (id int PRIMARY KEY, v text);
    db1=# CREATE MATERIALIZED VIEW mat1 AS (
            SELECT id, v FROM t1 GROUP BY id);
    

  83. pg_dumpall の -i オプションのパースが修正されました (Tom Lane) (9.3)
  84. pg_dumpall の -i はバージョンを無視するというオプションで、引数は取りませんが、以下のようなエラーが出ていました。なお、--ignore-version と指定した場合は正しく機能していました。

    $ pg_dumpall -i > all.dump
    pg_dumpall: オプションには引数が必要です -- i
    

  85. pg_restore で古いスタイルのラージオブジェクトのコメントの処理にについて修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  86. 8.4 以前バージョンの pg_dump で取得されたダンプで、多数のラージオブジェクトにコメントが付いていた場合に、リストアに失敗していました。

  87. pg_upgrade で旧バージョンでは TOASTテーブルを作らず、新バージョンで作るという場合について修正されました。 (Bruce Momjian) (9.3)(9.2)
  88. 本障害は OID不一致によるエラーを引き起こします。

    本障害に該当するのは比較的稀なケースです。9.0系から 9.1系の間で NUMERIC型のデータ長さの計算方法が変わっているので、それに連動してTOASTテーブルを作る、作らないが変わるということがありえました。

  89. pg_upgrade で pg_database.datminmxid と pg_class.relminmxid の旧バージョンにおける値を維持するか、妥当な値を入れるようになりました (Bruce Momjian, Álvaro Herrera, Tom Lane) (9.3)
  90. 本修正は、バージョンアップ後にサーバ起動してすぐに autovacuum がデータベースクラスタ全体のスキャンを要求したり、凍結されていないマルチトランザクションID(MXID)値の追跡ができなくなったりするのを防ぎます。

  91. contrib/auto_explain 拡張モジュールが通常の EXPLAIN コマンドの出力内容を変えてしまうのが修正されました (Tom Lane) (9.3)(9.2)
  92. auto_explain が有効であるとき、EXPLAIN (ANALYZE, TIMING OFF) と指定して実行しても、タイミング情報が出力されていました。

  93. contrib/dblink 拡張モジュールでメモリリークが修正されました (MauMau, Joe Conway) (9.3)(9.2)
  94. 一つの SQL文実行の中でのメモリリークであり、本修正以前でも SQL完了後はメモリは解放されます。

  95. contrib/pgcrypto 拡張モジュールの関数が、処理が返る前に機微情報を確実にスタック変数から削除するように修正されました (Marko Kreen) (9.3)(9.2)(9.1)(9.0)(8.4)
  96. contrib/pgstattuple 拡張モジュールの pgstat_heap() 関数で解放済みメモリが使われるのを防ぐ修正がされました (Noah Misch) (9.3)(9.2)
  97. バックエンドプロセスのクラッシュを引き起こす可能性がありました。

  98. contrib/uuid-ossp 拡張モジュールで、OSSP UUID ライブラリの状態をキャッシュするようになりました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  99. この改良により、UUID 生成が効率的になり、/dev/urandom からのエントロピーの汲み上げ量を減らすことができます。

  100. タイムゾーンデータが tzdata release 2014e に更新されました (9.3)(9.2)(9.1)(9.0)(8.4)
  101. クリミア、エジプト、モロッコの夏時間法の変更が含まれます。

  102. hot_standby_feedback 設定が稼動中に off に変更された場合の振る舞いが修正されました (Simon Riggs) (9.2)(9.1)
  103. スタンバイサーバが明示的にプライマリサーバに以降はフィードバックを送らないと示すようになりました。

  104. プランナの入れ子になったプレースホルダ値の誤った扱いが修正されました (Tom Lane) (9.2)
  105. Nested Loop が入れ子になっている実行プランのとき、以下のエラーが出るケースがありました。

    ERROR: variable not found in subplan target list
    

PostgreSQL 9.3.4、9.2.8、9.1.13、9.0.17、8.4.21 への変更点


  1. 更新済みタプルをロックする WALリプレイについて修正されました。(Andres Freund, Álvaro Herrera) (9.3)
  2. 本障害により、更新された行がインデックススキャンで見つからず、インデックススキャンが使われるかどうかで一貫性のない問い合わせ結果が生じていました。本障害は、不適切な WALリプレイによって生じます。したがって、リカバリ中であるかスタンバイサーバである場合に発生します。

    典型的には、外部キー制約で被参照行の更新と参照行の挿入が並行して行われるときに発生します。本障害により制約違反の行が挿入される可能性があります。


    データ破損が生じるため、不具合の解消には、バージョンアップ後にスタンバイサーバの作り直しが必要となります。



    本障害については PostgreSQL wiki に詳しい説明があります。

  3. GIN の WALリプレイでページ破損リスクを完全に回避するようになりました。(Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  4. 本障害により、理論的には GIN インデックスのメタページが壊れる可能性がありました。ただし、メタページは一般的な 512バイトのディスクセクタより小さいため、実際には問題は起きないと考えられます。

  5. NOTIFY を受け取る際のトランザクションコミット競合を防止するようになりました (Marko Tiikkaja) (9.3)(9.2)(9.1)(9.0)
  6. NOTIFY 送信者によって作られる最新データが見えるようになる前に、受信側の高速なクライアントが通知に反応するかもしれないシナリオを防ぎます。

  7. マテリアライズドビューが UPDATE、DELETE から参照できるようになりました。 (Michael Paquier) (9.3)
  8. 以下のように DELETE、UPDATE 内で参照された場合にエラーが発生していました。

    db=# CREATE TABLE base ( id int primary key );
    db=# CREATE MATERIALIZED VIEW mv AS SELECT * FROM base;
    db=# CREATE TABLE d ( id int primary key );
    db=# DELETE FROM d WHERE EXISTS ( SELECT * FROM mv WHERE mv.id = d.id );
    ERROR: cannot lock rows in materialized view "mv"
    
  9. 正規表現操作の素早いキャンセルができるようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  10. 本修正により、複雑な正規表現がバックエンドプロセスが割り込みできない状態で長時間固まってしまうケースを防止します。

  11. 単一要素の行に対し OVERLAPS を実行しようとする誤ったコードが除去されました。 (Joshua Yanovski) (9.3)(9.2)(9.1)(9.0)(8.4)
  12. OVERLAPS は、2組の日付時刻に対してのみ使用可能な演算子です。単一要素行の組に対する使用は SQL標準ではなく、ドキュメントにも記載されていません。以下に、正しい実行例、正しいエラー例、本障害のエラー例を示します。

    (正しい実行例)
    =# SELECT ROW (DATE '2013-01-12', DATE '2014-02-01') OVERLAPS
              ROW (DATE '2011-10-01', DATE '2013-02-10');
     overlaps
    ----------
     t
    (1 row)
     ※「ROW」は省略可能
    
    (正しいエラー例)
    =# SELECT ROW (DATE '2013-01-12', DATE '2014-02-01', DATE '2016-01-01')
     OVERLAPS ROW (DATE '2011-10-01', DATE '2013-02-10', DATE '2015-01-01');
    ERROR:  wrong number of parameters on left side of OVERLAPS expression
    
    (本障害の不適切なエラー例)
    =# SELECT ROW (DATE '2014-02-01') OVERLAPS ROW (DATE '2011-10-01');
    ERROR:  unrecognized node type: 656
    
  13. クエリのデパーズ時に AccessShareLock 以上のロックを取らないように修正されました (Dean Rasheed) (9.3)(9.2)(9.1)(9.0)(8.4)
  14. クエリのデパーズとは解析(パーズ)済みのデータから SQL を再構成する処理です。ビューやルールの定義を出力するときに使われます。典型的にはpg_dump や psql の d で行われる処理です。

    pg_dump が「INSERT INTO t ... 」を含むルールのデパーズをするとき、 t テーブルに RowExclusiveLock が発生していました。これはUPDATE、DELETE、INSERT 実行時と同レベルのロックであり、pg_dump は参照のみ行うという一般的な理解に反する動作でした。

  15. 実行プラン作成時にインデックスの端点を確認する処理の性能が改善されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)
  16. インデックス末尾に未コミット行が多数あるとき、本修正で大幅に性能改善されます。連番やタイムスタンプをキーとして行を追加しているときには、よくある状況です。

  17. プランナが「値 IN ( リスト )」や「値 比較演算子 ANY ( 配列 )」という式で、右側が固定式なら、デフォルトの選択率見積処理を使わないようになりました (Tom Lane) (9.3)
  18. DROP DATABASE コマンドでデータベース毎の実行時統計情報ファイルを正しく削除するようになりました (Tomas Vondra) (9.3)
  19. 実行時統計情報は、稼動中は一時ファイル (stats_temp_directory で指定されたディレクトリ下のファイル) に、停止時には永続ファイル($PGDATA/pg_stat 以下のファイル) に書きこまれます。

    本修正により永続ファイルの削除漏れを防ぎます。これまで誤って一時ファイルの方を削除しており、永続ファイルが残ってしまいました。

    残っている不要な実行時統計情報ファイルを特定するには以下の SQL でデータベースの OID 番号を調べ、ファイル名の番号との対応づけを調べます(ただし、db_0.stat ファイルは特別であり、削除してはいけません)。

    SELECT oid, datname FROM pg_database ORDER BY oid;
    
  20. walsenderプロセスが自身の負荷が高いときに不適切に切断してしまう障害が修正されました (Andres Freund, Heikki Linnakangas) (9.3)
  21. walsender は wal_sender_timeout 設定に基づき、クライアント(スタンバイサーバなど)に pingメッセージを送り、そのレスポンスを確認して、接続が有効かを判断します。



    walsender は WALデータ送信で絶えず忙しい場合、クライアントへのpingメッセージ送信に失敗していました。にもかかわらず、レスポンスを期待しており、時間経過して応答が無いことで切断をしていました。

  22. クライアントが pg_receivexlog であるとき、walsenderプロセスが正常停止に失敗するのが修正されました (Fujii Masao) (9.3)(9.2)(9.1)
  23. pg_receivexlog が接続している状態で、サーバプロセスを fastモードで停止させようとしても、wal sender process だけ残り、タイムアウトまで待たされて失敗していました。

    $ pg_ctl stop -m fast
    waiting for server to shut
    down............................................................... failed
    pg_ctl: server does not shut down
    
    $ ps x
      PID TTY      STAT   TIME COMMAND
     8489 pts/2    S      0:00 /home/postgres/pgsql/9.3.3/bin/postgres
     8490 ?        Ss     0:00 postgres: logger process
     8498 pts/2    S      0:00 pg_receivexlog -h localhost -D .
     8499 ?        Ss     0:00 postgres: wal sender process postgres ::1(46481) stre
       :
    
  24. クラッシュリカバリ時に wal_level と hot_standby パラメータのチェックが正しく行われるように修正されました (Heikki Linnakangas) (9.3)(9.2)
  25. 最初はクラッシュリカバリ処理をする場合でも、その後にアーカイブリカバリをしたり、hot_standby アクセスを受け付けたりするのであれば、それに見合ったwal_level 設定が必要で、これらをチェックするように修正されています。

  26. クラッシュリカバリにてホットスタンバイ接続が可能かの判定が修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)

  27. その後にアーカイブリカバリが続くクラッシュリカバリの場合で、既に可能な段階であるにもかかわらず、ホットスタンバイ接続が許されませんでした。

  28. 読み取り専用の設定パラメータ data_checksums が追加されました (Heikki Linnakangas) (9.3)
  29. initdb 時にページチェックサムを有効にしたかどうかを true、false で示します。

  30. ERROR でないログメッセージ出力中の割り込みが防止されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  31. syslog への出力途中で割り込みが発生し、割り込み処理中に syslog 出力が発生することで、デッドロック状態になってしまう可能性がありました。接続時にハングアップする障害が報告されていました。

  32. PL/Perl で複合型データを返すときのメモリリークが修正されました (Alex Hunsaker) (9.3)(9.2)(9.1)
  33. 複数の OUT パラメータを使う場合も該当します。

  34. psql でスクリプトから copy を実行する際のエラー行番号の誤りが修正されました (Kumar Rajeev Rastogi, Amit Khandekar) (9.3)(9.2)
  35. copy で外部ファイルを指定したときにその行数が含まれてしまっていました。

    (例 t.tsv は 100行のデータ)
    
    $ cat scr.sql
    DELETE FROM t;
    copy t FROM 't.tsv'
    SELECT error_sql;
    
    $ psql -f scr.sql
    DELETE 100
    psql:scr.sql:104: ERROR:  column "error_sql" does not exist
    LINE 1: SELECT error_sql;
    
  36. postgres_fdw 拡張モジュールが複数の結合条件を適切に扱えるように修正されました (Tom Lane) (9.3)
  37. 以下のように外部テーブルの結合にて複数の結合条件がある場合が該当します。

    SELECT * FROM ft2 a, ft2 b
      WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
    SELECT * FROM ft2 a, ft2 b
      WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
    


    アサート有効でビルドしている場合にアサート失敗をひき起こしていました。また、アサート無効である場合には、安全でない WHERE句がリモートサーバに送られてしまい、エラーや誤った応答をひき起こす可能性があります。

  38. Windows で時々生じる「could not reserve shared memory region」エラーを防ぐようになりました (MauMau) (9.3)(9.2)(9.1)(9.0)
  39. Windows 8 / 2012 Server で以下のようなメッセージがでて接続に失敗する例が報告されていました。アドレス空間配置のランダム化を無効にするビルドオプションを加えて対応しています。

    LOG:  could not reserve shared memory region (addr=...) for child ...
    LOG:  could not fork new process for connection: A blocking operation was
          interrupted by a call to WSACancelBlockingCall.
    
  40. タイムゾーンデータが tzdata release 2014a に更新されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  41. フィジー、トルコの夏時間法の変更、イスラエル、ウクライナの歴史的変更が適用されています。

PostgreSQL 9.3.3、9.2.7、9.1.12、9.0.16、8.4.20 への変更点


  1. ロールに対する GRANT ... WITH ADMIN OPTION の制限が強化されました (Noah Misch) (9.3)(9.2)(9.1)(9.0)(8.4)
  2. ADMIN OPTION 無しでロールに権限を与えることで、そのロールにはメンバー追加削除できないことが期待されます。しかし、SET ROLE コマンドを先に行うという抜け道がありました。

    本障害は CVE-2014-0060 として登録されています。

    (例)
    $ psql -U u1 db1
    db1=> ?du
                                 List of roles
     Role name |                   Attributes                   | Member of
    -----------+------------------------------------------------+-----------
     g1        | Cannot login                                   | {}
     postgres  | Superuser, Create role, Create DB, Replication | {}
     u1        |                                                | {g1}
     u2        |                                                | {}
    db1=> GRANT g1 TO u2;
    ERROR:  must have admin option on role "g1"
    db1=> SET ROLE g1;
    SET
    db1=> GRANT g1 TO u2;
    GRANT ROLE
    db1=> REVOKE g1 FROM u2;
    REVOKE ROLE
    
  3. 手続き言語の有効性検証関数の手動呼び出しによる特権昇格を防止するようになりました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  4. 手続き言語の有効性検証関数(PL validator)は、暗黙的に CREATE FUNCTION実行時に呼ばれますが、明示的に関数呼び出しすることもできます。これを利用した特権昇格(privilege escalation) が可能
    でした。

    本修正では、付属する手続き言語について、有効性検証関数に権限チェック処理を加えました。外部配布の手続き言語についても、同様の問題があるかもしれません。

    本障害は CVE-2014-0061 として登録されています。

  5. 並行した DDL によるテーブルやインデックスの照合を避けるようになりました (Robert Haas, Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  6. DDLコマンドを並行して複数実行しているときの DDLコマンド実行過程で、テーブル・インデックスを名前から実体を特定したとき、実行部分によって異なるものが選ばれてしまうことがありました。これを使い、少なくとも CREATE INDEX で、インデックス作成対象と異なるテーブルに権限チェックが行われ、特権昇格が可能でした。

    本障害は CVE-2014-0062 として登録されています。

  7. 長い日付時刻文字列に対するバッファーオーバーランを防ぐようになりました (Noah Misch) (9.3)(9.2)(9.1)(9.0)(8.4)
  8. interval型の出力と timestamp型の入力において、処理用の固定バッファサイズが可能な最大サイズと比べて小さく、バッファオーバーランをひき起こす可能性がありました。また、ecpgライブラリにも同様の問題がありました。

    本障害は CVE-2014-0063 として登録されています。

  9. 整数オーバーフローによるバッファーオーバランを防ぐようになりました (Noah Misch, Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  10. いくつかの組み込み関数(大部分はデータ型入力関数)でメモリサイズ計算値がオーバーフローのチェックなしに使われていました。整数オーバーフローが生じると過小なメモリ確保サイズとなり、バッファオーバーランをひき起こします。

    hstore、intarray、ltree の各追加モジュールと、path型、ビット列データ型、全文検索(tsquery)、txid_current_snapshot()、txid_snapshot_recv() 関数、にて修正されています。

    本障害は CVE-2014-0064 として登録されています。

  11. 潜在的なバッファオーバーラン危険性が修正されました (Peter Eisentraut, Jozef Mlich) (9.3)(9.2)(9.1)(9.0)(8.4)
  12. 実装において strcpy() や strncpy() が strlcpy() に置き換えられました。実際に問題が発現するかは不明で、Coverityツールによるチェック結果に対応した修正となります。

    本障害は CVE-2014-0065 として登録されています。

  13. chkpass追加モジュールが crypt() から NULL が返ることでクラッシュするのを防ぐようになりました (Honza Horak, Bruce Momjian) (9.3)(9.2)(9.1)(9.0)(8.4)
  14. 起こりうるケースとしては、libc が許可されていないハッシュアルゴリズムを拒否するように構成されている場合 (FIPS モードなど) があります。

    本障害は CVE-2014-0066 として登録されています。

  15. ドキュメントに再帰テスト(regression test) 実行時の注意事項が追記されました (Noah Misch, Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  16. make check により一時的な PostgreSQL サーバプロセスを起動する間、そこには同マシンからパスワード認証なしでアクセス可能となり、テストを実行した OS上のユーザの権限を不正利用される潜在的な危険性がありました。

    ドキュメントに同マシンに信頼できないユーザがいる際にリスクがあるという警告が記載されました。

    本問題は CVE-2014-0067 として登録されています。

  17. タプル凍結のロジックが修正されました (Álvaro Herrera, Andres Freund) (9.3)
  18. これまで共有行ロックの制御に使われる MultiXactId の凍結を伴う場合に正しく処理できていませんでした。古い共有行レベルロックが忘れられてしまう可能性があります。

    修正にあたって WALレコードの書式が変更されました。レプリケーションをしている場合、スタンバイサーバを先にバージョンアップする必要があります。プライマリを先にバージョンアップして、プライマリから凍結処理をする WALレコードを受け取ったスタンバイ側サーバは、PANIC メッセージを出して止まってしまいます。

  19. MultiXactId 凍結に関する設定パラメータが追加されました (Álvaro Herrera) (9.3)
  20. マルチトランザクションID (MultiXactId、mutixact) は、共有行ロックを実現するものです。各タプル(行バージョン) の 削除時トランザクションID(XID) と同じ場所に格納され、infomaskフラグにより
    MultiXactId であることが識別されます。

    通常のタプルの XID と同様に 古くなりすぎる前にタプルの MultiXactId を凍結しなければいけません。これまでは autovacuum_freeze_max_age やvacuum_freeze_min_age、vacuum_freeze_table_age な
    どの XID 凍結用のパラメータを MultiXactId にも適用していました。

    しかし、XID と MultiXactId で進行スピードが大きく異なるとき、うまく動作しません。そのため、専用のパラメータが新設されました。

    (追加された設定パラメータ)
    vacuum_multixact_freeze_min_age
    vacuum_multixact_freeze_table_age
    autovacuum_multixact_freeze_max_age
    
  21. UPDATE により共有行ロックの伝搬が無視されてしまう障害が修正されました (Álvaro Herrera) (9.3)
  22. 行がトランザクションAにロックされていて、その行がトランザクションBによって UPDATE されたなら、その時点でトランザクションBからしか見えない行データであるとしても、更新後の行は引き続きトランザクションAによってロックされているべきです。

    本障害で、トランザクションBにおけるその後の DELETE や UPDATE にて、ロックのチェックが抜けていました。これにより読み取り整合性が崩れてしまいます。

    以下に再現シナリオを示します。

    トランザクションA             トランザクションB
    BEGIN;                         BEGIN;
    SELECT * FROM t1
     WHERE id = 1 FOR KEY SHARE;
                                   DELETE FROM t1 WHERE id = 1;
                                   (⇒ ブロックする/正しい動作)
    ROLLBACK;
                                   ROLLBACK;
    
    BEGIN;                         BEGIN
    
    SELECT * FROM t1
     WHERE id = 1 FOR KEY SHARE;
                                   UPDATE t1 SET v = 10001 WHERE id = 1;
                                   (⇒ キー以外の更新はブロックしない/正しい動作)
    
                                   DELETE FROM t1 WHERE id = 1;
                                   (⇒ ブロックしない/誤った動作)
    
                                   COMMIT;
    SELECT * FROM t1 WHERE id = 1;
    (⇒ (0 rows) となる/想定外の結果)
    
    COMMIT;
    
  23. 同時実行トランザクションで行ロックが無視されてしまう可能性があり、修正されました。 (Álvaro Herrera) (9.3)
  24. 上記項目とは別の原因で共有行ロックが無視されてしまいます。外部キー制約によりブロックされているべき状況で UPDATE できてしまう可能性がありました。

  25. 更新連鎖ロックの誤ったロジックが修正されました。 (Álvaro Herrera) (9.3)
  26. REPEATABLE READ または SERIALIZABLE 隔離レベルのトランザクションにて、本来出るべきでない直列化失敗エラー「ERROR: could not serialize access due to concurrent update」をひき起こします。

  27. pg_multixact/members が正しく周回処理されるように修正されました。 (Andres Freund, Álvaro Herrera) (9.3)
  28. pg_multixact/members ディレクトリ内のファイル群は、共有行ロック(select ... for share) を制御するものです。2^32 (約42億) の要素を扱うことができ、これを超えたときの周回処理に不具合がありました。

    以下のようなエラーが出ることが報告されています。

    error:  could not access status of transaction 24568845
    detail:  could not open file "pg_multixact/members/f615": no such file or directory.
    
  29. pg_multixact/members の 5桁ファイル名の扱いが修正されました (Álvaro Herrera) (9.3)
  30. PostgreSQL 9.3 から pg_multixact/members 以下に 5桁以上のファイル名がありえましたが、ディレクトリ内をクリーンアップする処理でそれらを無視するようになっていました。

  31. マルチトランザクションID のキャッシュ処理の性能が改善されました (Álvaro Herrera) (9.3)
  32. 同一トランザクション内でロックされている行の更新が最適化されました (Andres Freund, Álvaro Herrera) (9.3)
  33. SELECT FOR UPDATE に続く、UPDATE と DELETE が性能改善されます。DBT2試験で PostgreSQL 9.2.x と比べて 15%程度の性能ダウンが報告されていました。

  34. リカバリ時の pg_xlog と WALアーカイブのファイル選択順序が変更されました (Kyotaro Horiguchi) (9.3)
  35. アーカイブリカバリにおいて、pg_xlog と WALアーカイブに同ID でタイムラインが異なる WALセグメントファイルがあった場合、これまで WALアーカイブにある方が優先されていましたが、タイムライン
    が新しい方を選択するようになりました。

    これまでの振る舞いでは、未だアーカイブされていない WALセグメントファイルをリカバリに適用できないことがありました。

  36. リカバリで誤った更新の適用が生じる可能性があり、修正されました (Greg Stark, Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  37. WAL更新が誤って本来の位置よりも先にあるページに適用されることがありえました。

    リカバリ中のサーバ(スタンバイサーバ)において、ファイルの肥大化やデータ破壊を引き起こします。肥大化はファイル末尾よりも先の位置のページに書き込みが生じるために起こります。

  38. リカバリが一貫性のあるところまで到達したかの判定が修正されました (Tomonari Katsumata, Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  39. 本障害により、hot_standby モードのリカバリ中サーバ(スタンバイサーバ)が参照アクセスの接続を受け付けるのが早すぎて、「PANIC: WAL contains references to invalid pages」によるサービスダ
    ウンが生じる可能性がありました。

  40. VACUUM処理における可視性マップのビットセットの WAL出力が修正されました (Heikki Linnakangas) (9.3)
  41. 該当する VACUUM処理について出力した WAL でリカバリしたときに、あるページに削除済み行が残っているのに可視性マップ(ビジビリティマップ)では、全て可視であるとされるケースが生じていました。

  42. ホットスタンバイの VACUUM 操作の WAL リプレイで、Btreeインデックスの不適切なロック処理が修正されました (Andres Freund, Heikki Linnakangas, Tom Lane) (9.3)(9.2)(9.1)(9.0)
  43. WALリプレイ過程で、全てゼロの使われないインデックスページのスキャンで「PANIC: WAL contains references to invalid pages」が生じて止まってしまう可能性がありました。

    インデックス への VACUUM のリプレイで追加ロックを取る条件が正しくなく、誤ったページが読み取りされるおそれがありました。

    インデックスの最後のページが全てゼロである場合に正しく処理されませんでした。

  44. 非リーフの GIN インデックスページ挿入において、適宜にページ全体の WAL 記録をするようになりました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  45. システムクラッシュ時にインデックスが破損する危険がありました。

  46. recovery.conf での pause_at_recovery_target と recovery_target_inclusiveを on に指定したとき、目標点の後で停止するようになりました (Heikki Linnakangas) (9.3)(9.2)(9.1)
  47. これまで pause_at_recovery_target = true の場合、たとえrecovery_target_inclusive = true であってもリカバリは目標点の手前で停止していました。その後、pg_xlog_replay_resume() を実行すると、目標点の WALレコードをリカバリしてからリカバリを終了しますので、リカバリ停止して確認した時点より、1歩進んだ状態となってしまいます。

  48. ホットスタンバイのフィードバック送信が確実に行われるようになりました (Andres Freund, Amit Kapila) (9.3)
  49. これまで walsenderプロセスが忙しいとき、ホットスタンバイからのフィードバックが送られない動作となっていました。

  50. タイムアウト制御について修正されました (Andres Freund, Tom Lane) (9.3)
  51. PostgreSQL 9.3.2 の修正で導入されてしまった障害です。statement_timeout を使っているアプリケーションでは、タイムアウト発生時に奇妙なエラーが生じる可能性があります。

    本障害により「PANIC: stuck spinlock」等の PANIC が生じてサーバ全体がダウンしたり、停止できないバックエンドプロセスが生じるケース等が報告されています。

  52. プロセス終了時における処理の競合が修正されました (Robert Haas) (9.3)(9.2)(9.1)(9.0)(8.4)
  53. プロセス終了時の特定タイミングで SIGUSR1 等のシグナルを受け取った際にバックエンドプロセスのクラッシュをひき起こす可能性がありました。

  54. walsender、walreceiver のプロセス終了時に SIGHUP シグナルを受けた際の処理の競合が修正されました (Tom Lane) (9.3)(9.2)(9.1)
  55. エラーメッセージ出力部分で安全でないエラー番号の参照が修正されました (Christian Kruse) (9.3)(9.2)(9.1)(9.0)(8.4)
  56. Clangベースのコンパイラでビルドした場合で HINT メッセージに適切な内容が出力されないという障害が報告されていました。

  57. PostgreSQL実装内におけるエラーレポート関数の利用について修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  58. メモリコンテキストの初期化が済んでいない段階でエラーレポート関数が使われて、エラーメッセージが出るべきところでクラッシュするケースがありました。

  59. SSL接続を受けたバックエンドプロセスが、クライアント側の突然の切断後にハングアップする問題が修正されました。 (Alexander Kukushkin) (9.3)(9.2)(9.1)(9.0)(8.4)
  60. Unicodeエスケープ形式で書かれた識別子の長さチェックメッセージがエスケープ解釈前の文字列長で行われており、修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  61. あくまで奇妙なメッセージが出るだけの問題です。

    (例:識別子最長は 63バイト)
    db=# SELECT octet_length(U&'?0441?043B?043E?043D?0441?043B?043E?043D?0441?043B?043E?043D?0441?043B?043E?043D');
     octet_length
    --------------
               32
    
    db=# CREATE TABLE t1 (U&"?0441?043B?043E?043D?0441?043B?043E?043D?0441?043B?043E?043D?0441?043B?043E?043D" text);
    NOTICE:  identifier "слонслонслонслон" will be truncated to "слонслонслонслон"
    CREATE TABLE
    
    db=# CREATE TABLE t2 ("слонслонслонслон" text);
    CREATE TABLE
    
  62. コマンド末尾または関数本体末尾における Unicodeリテラルと Unicode識別子の構文解析が修正されました (Tom Lane) (9.3)
  63. 型名キーワードがロール名リストで使えるようになりました。 (Stephen Frost) (9.3)(9.2)(9.1)(9.0)
  64. 型名キーワード(type_func_name_keyword) とは、型名または関数名でクオート無しに利用可能なキーワードです。BINARY、COLLATION、LIKE、IS などが含まれます。9.3.1 (その他 2013/10/10 リリースマイナーバージョン) でキーワードの利用制限が緩められましたが、ロール名リストで利用できませんでした。

    (従来の使えない場合の例)
    db=# CREATE ROLE like;
    CREATE ROLE
    db=# CREATE ROLE is;
    CREATE ROLE
    db=# DROP ROLE like, is;
    ERROR:  syntax error at or near "like"
    LINE 1: DROP ROLE like, is;
    
  65. カラムの無いテーブルに対する EXISTS サブクエリを含む SQL の構文解析でクラッシュする障害が修正されました (Tom Lane) (9.3)(9.2)(9.1)
  66. (例)
    db=# CREATE TABLE zero_column_table ();
    db=# SELECT 1 WHERE EXISTS (SELECT * FROM zero_column_table);
    The connection to the server was lost. Attempting reset: Failed.
    
    LOG:  server process (PID 1234) was terminated by signal 11: Segmentation fault
    DETAIL:  Failed process was running: SELECT 1 WHERE EXISTS (SELECT * FROM zero_column_table);
    
  67. 「WHERE (... x IN (SELECT ...) ...) IN (SELECT ...)」という形の条件式を持つ SQL に誤ったプランが作られ、クラッシュする障害が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  68. (クラッシュする SQL例)
    db=# CREATE TABLE ta AS SELECT 1 AS a1, 1 AS a2;
    db=# CREATE TABLE tb AS SELECT 1 AS b1, 1 AS b2;
    db=# SELECT * FROM ta
      WHERE (CASE WHEN a1 IN (SELECT b1 FROM tb) THEN a1 ELSE NULL END)
        IN (SELECT b2 FROM tb);
    The connection to the server was lost. Attempting reset: Failed.
    
    LOG:  server process (PID 1234) was terminated by signal 11: Segmentation fault
    
  69. LATERAL 構文を使った外部結合についてプランナが修正されました。 (Tom Lane) (9.3)
  70. 以下の SQL で「ERROR: JOIN qualification cannot refer to other relations」が出る障害が報告されました。

    SELECT * FROM (SELECT 1 AS x) x
      CROSS JOIN (SELECT 1 AS y) y
      LEFT JOIN LATERAL
       ( SELECT * FROM (SELECT 1 AS z) z WHERE z.z = x.x) z ON z.z = y.y;
    
  71. UPDATE/DELETE における対象テーブルへの LATERAL参照が修正されました。 (Tom Lane) (9.3)
  72. PostgreSQL 9.3 から LATERAL構文に対応して、同じサブクエリ階層にある別テーブルを参照できるようになりました。このとき UPDATE、DELETE については以下のように「LATERAL」と書かなくとも、同階層のテーブルを参照できてしまっていました。

    UPDATE ta SET a2 = ss.b2 FROM (SELECT * FROM tb where b1 = ta.a1) ss;
    DELETE FROM ta USING (SELECT * FROM tb where b1 = ta.a1) ss;
    

    本修正で上記はエラーとなります。本来は以下のように「LATERAL」を記述しなければいけません。

    UPDATE ta SET a2 = ss.b2 FROM LATERAL (SELECT * FROM tb where b1 = ta.a1) ss;
    DELETE FROM ta USING LATERAL (SELECT * FROM tb where b1 = ta.a1) ss;
    
  73. サブクエリに UNION ALL を含む、継承テーブルへの UPDATE、DELETE について修正されました。 (Tom Lane) (9.3)(9.2)
  74. 該当する形状の SQL で誤った動作が発生していました。典型的には子テーブルに対して、UPDATE、DELETE が適用されないという挙動になります。

    (再現例)
    CREATE TABLE t_inh_p (k int, c int);
    CREATE TABLE t_inh_sub () INHERITS (t_inh_p);
    CREATE TABLE t_other (k int);
    INSERT INTO t_inh_p VALUES (1,1),(2,2);
    INSERT INTO t_inh_sub VALUES (1,1),(2,2);
    INSERT INTO t_other VALUES (1),(2);
    
    UPDATE t_inh_p SET c = c + 100
      FROM ( SELECT k FROM t_other UNION ALL SELECT k + 1 FROM t_other ) ss
        WHERE t_inh_p.k = ss.k;
    
    SELECT tableoid::regclass::text, * FROM t_inh_p;
    
    (以下のように子テーブルの c が +100 されません)
     tableoid  | k |  c
    -----------+---+-----
     t_inh_p   | 1 | 101
     t_inh_p   | 2 | 102
     t_inh_sub | 1 |   1
     t_inh_sub | 2 |   2
    
  75. 範囲データ型のドメインのカラムに対する ANALYZE が失敗する障害が修正されました (Tom Lane) (9.3)
  76. 以下にエラー発生例を示します。

    db=# CREATE DOMAIN d_rts AS tstzrange;
    db=# CREATE TABLE t_dm (c d_rts);
    db=# ANALYZE t_dm;
    ERROR:  type 26739 is not a range type
    
  77. ANALYZE で全ての値が大きいサイズのカラムに対応しました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  78. ANALYZE でカラム統計情報を収集する際に、メモリ使用量を抑えるため定数値 WIDTH_THRESHOLD (1024 バイト) を超える値をスキップするようにはなっていましたが、全ての値が閾値を超えていると当該
    カラムついて正しく統計情報を取得できない結果となっていました。

  79. デフォルトテーブルスペースに対して CREATE TABLE を実行する際に、テーブルスペースにおける CREATE権限のチェックは行わなくなりました (Stephen Frost) (9.3)(9.2)(9.1)(9.0)(8.4)
  80. これまで CREATE TABLE では権限チェックがされていない一方で、ALTER TABLE ... SET TABLESPACE で権限チェックが行われていました。

  81. イベントトリガーの拡張モジュール対応誤りが修正されました (Tom Lane) (9.3)
  82. CREATE EXTENSION コマンド経由で CREATE EVENT TRIGGER コマンドを実行しても拡張モジュールへの所属が登録されませんでした。また、拡張モジュール所属のイベントトリガが pg_dump でダンプ対象から除外されませんでした。

  83. CASE が複数行を返す関数を戻り式としているときエラーがでる問題が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  84. エラー「ERROR: set-valued function called in context that cannot accept a set」が生じます。

    以下はエラーをひき起こす SQL 例です。regexp_matches は、本SQL で与えられる引数では 1行しか返しませんが、定義としては複数行を返す関数です。

     SELECT *, lower(CASE
       WHEN id = 2 THEN (regexp_matches(str, '^0*([1-9]?d+)$'))[1]
       ELSE str END)
      FROM (VALUES (1,''), (2,'0000000049404'), (3,'FROM 10000000876'))
           v(id, str);
    

    本障害は 8.0 から存在していましたが、8.4 以降バージョンのみ修正されます。

  85. JSON関数で処理後に一時的に確保したメモリを解放するようになりました (Craig Ringer) (9.3)
  86. JSON型データ生成で不正な数値を適切に判別できるように修正されました (Andrew Dunstan) (9.3)(9.2)
  87. 以下のように money型にキャストして $ 付きのまま JSONデータ内に格納できてしまうけれども、要素の取り出し時点でエラーとなるケースが報告されました。

    db=# SELECT to_json(a) FROM (VALUES(1000::money)) a(salary);
            to_json
    -----------------------
     {"salary":$1,000.00}
    (1 row)
    
    db=# SELECT to_json(a)->'salary' FROM (VALUES(1000::money)) a(salary);
    ERROR:  invalid input syntax for type json
    
  88. pg_stat_activity ビューで使われる関数でクライアントアドレスがゼロかチェックする箇所が修正されました。 (Kevin Grittner) (9.3)(9.2)(9.1)(9.0)(8.4)
  89. クライアントアドレスの表示で誤った動作をする可能性がありますが、ほとんどの場合に発生しません。本障害は障害報告ではなくコード解析によって発見されました。

  90. テキスト全文検索(tsearch)にて、一部のマルチバイト文字について障害が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  91. 検索されるべきでない要素が結果に含まれてしまう可能性がありました。

  92. テキスト全文検索の実装にて memcopy() の替わりに memmove() を使うように修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  93. 具体的な障害報告は出ていませんが、誤った結果が返ったり、クラッシュをひき起こしたりする可能性がありました。

  94. pg_basebackup コマンドに対応したサーバ側実装において、権限チェックを行う位置が変更されました。 (Andres Freund, Magnus Hagander) (9.3)(9.2)(9.1)
  95. これまでシステムテーブルへの不要なアクセスが生じていました。

  96. ロケールチェック用で文字エンコーディング名 SHIFT_JIS に対応しました (Tatsuo Ishii) (9.3)(9.2)(9.1)(9.0)(8.4)
  97. RHEL 6.x などで以下のように ja_JP.SJIS ロケールを設定した場合に該当します。クライアントコマンド実行時に警告が出力されていました。

    # localdef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.SJIS
    # export LANG=ja_JP.SJIS
    # createdb -U postgres testdb
    could not determine encoding for locale "ja_JP.SJIS": codeset is "SHIFT_JIS"
    
  98. SQL関数の複合型引数に対する「*」を使った指定における障害が修正されました (Tom Lane) (9.3)(9.2)
  99. $1.* は動作しますが、x.* は動作しませんでした。関数定義時にバックエンドプロセスのクラッシュが生じる障害が報告されました。

    (例)
    db=# CREATE TABLE foo ( x int ) ;
    db=# CREATE FUNCTION zzz(v foo) RETURNS VOID AS $$
           INSERT INTO foo(x) VALUES (v.*) $$ language SQL;
    The connection to the server was lost. Attempting reset: Failed.
    
    LOG: server process (PID 1234) was terminated by signal 11: Segmentation fault
    
  100. libpq が Windows で host も hostaddr も指定しない場合、localhost が接続先となるように修正されました (Fujii Masao) (9.3)(9.2)(9.1)(9.0)(8.4)
  101. localhost になることはドキュメントに記載されていましたが、実装がそのようになっていませんでした。

  102. psql で COPY TO STDOUT、COPY FROM STDIN におけるエラー時の処理がいくつか修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  103. 9.2 以上のサーバで COPY FROM STDIN 実行中に切断した場合に無限ループに陥る可能性がありました。また、プロトコルバージョン 2 のサーバに対して無限ループに陥る可能性がありました。

  104. psql の ?df+、?dc+、?dC+ における翻訳可能カラム指定が修正されました (Peter Eisentraut, Tom Lane) (9.3)(9.2)
  105. NLS を有効にしている場合に誤った翻訳出力がされる可能性がありました。9.3系では ?dy についても修正されました。

  106. pg_basebackup のフォアグラウンドプロセスがエラー終了する時にバックグラウンドプロセスを停止するように修正されました (Magnus Hagander) (9.3)(9.2)
  107. ここでのバックグラウンドプロセスとは、サーバ側の postgresプロセスではなくpg_basebackup の子プロセスです。

  108. pg_basebackup で -v (--verbose) を指定し、tarフォーマットを標準出力に書き出す場合に、未初期化データが出力される障害が修正されました (Magnus Hagander) (9.3)(9.2)(9.1)
  109. データベースクラスタディレクトリ($PGDATA)内にテーブルスペースがある場合に、ベースバックアップ内に2重に含まないように修正されました (Dimitri Fontaine, Magnus Hagander) (9.3)(9.2)(9.1)
  110. ecpg で記述子の出力について修正されました (MauMau) (9.3)(9.2)(9.1)(9.0)(8.4)
  111. SPARC Solaris プラットフォームで SIGBUS (バスエラー) によるクラッシュが報告されていました。

  112. ecpg で接続時にホスト名が与えられていないとき、空のホスト名で接続を試みないように修正されました (Michael Meskes) (9.3)(9.2)(9.1)(9.0)(8.4)
  113. dblink の接続処理オーバーヘッドが軽減されました (Joe Conway) (9.3)(9.2)(9.1)(9.0)(8.4)
  114. クライアントエンコーディングが一致している場合には、クライアントエンコーディングを設定する処理を行わなくなります。

  115. 追加モジュール isn で ISMNチェックディジットの計算が修正されました (Fabien Coelho) (9.3)(9.2)(9.1)(9.0)(8.4)
  116. これまで常に誤った値となっていました。

  117. pgbench で 巨大なスケールファクターを指定したときの整数オーバーフローが修正されました (Tatsuo Ishii) (9.3)
  118. 本障害で初期化時の表示で以下のようなマイナス値が出力されることがありました。

     239300000 of 3800000000 tuples (-48%) done (elapsed 226.86 s, remaining -696.10 s).
    
  119. pg_stat_statement 追加モジュールで、CURRENT_DATE、CURRENT_TIME 等のパース処理部分の実装が微調整されました (Kyotaro Horiguchi) (9.3)(9.2)
  120. 動作内容の変更はありません。

  121. postgres_fdw 追加モジュールで、接続が切れた場合のエラー処理が改善されました (Tom Lane) (9.3)
  122. クライアントのみインストールする場合について Makefile が修正されました (Peter Eisentraut) (9.3)(9.2)(9.1)(9.0)(8.4)
  123. ソースコードからクライアントのみインストールするドキュメント記載の手順ではpsqlrc.sample を配置するところでエラーになっていました。

  124. Mingw と Cygwin プラットフォームにおいてインストール(make install)時にlibpq.dll を bin ディレクトリに配置するようになりました (Andrew Dunstan) (9.3)(9.2)(9.1)(9.0)(8.4)
  125. 使用が推奨されない dllwrap を Cygwin にて使用しないようになりました (Marco Atzeri) (9.3)(9.2)(9.1)(9.0)
  126. Visual Studio 2013 でビルドできるようになりました (Brar Piening) (9.3)
  127. これまでプレーンテキストでリリース情報が記載されていた HISTORY ファイルが廃止されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  128. タイムゾーンデータが tzdata release 2013i に更新されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  129. ヨルダンの夏時間法の変更、キューバの歴史的変更が含まれます。また、IANA でメンテナンスされず、実際にも使われていない地域名 Asia/Riyadh87、Asia/Riyadh88、Asia/Riyadh89 が削除されました。

PostgreSQL 9.3.2、9.2.8、9.1.11、9.0.15、8.4.19 への変更点


  1. VACUUM 処理における relfrozenxid の更新をするかどうかの判定が修正されました。 (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  2. relfrozenxid はテーブルごとに凍結済みトランザクションID 位置を保持するpg_class システムテーブルのカラムです。
    詳しくはマニュアル「23.1.5.トランザクションIDの周回エラーの防止」を参照ください。

    一部のケースで、VACUUM (自動VACUUM) が不適切にテーブルの relfrozenxid 値を前進させることがあり、
    一部の行が凍結されないままとなる可能性がありました。
    これらの行は 2^31 (約21億) トランザクションが経過すると、消えて(見えなく)なってしまうことになります。

    実際の消失が起こる前に複数の誤った relfrozenxid 値の前進が起こる必要があるので、データ損失の可能性はかなり低いです。

    9.2.0 以降ではデータ損失の可能性がより高く、また、本障害により「ERROR: could not access status of transaction ...」エラーが出る可能性もあります。
    9.0.4 以前、8.4.8 以前のバージョンでは本障害は該当しません。

    アップグレード後、全テーブルに VACUUM FREEZE を行ってください。
    VACUUM FREEZE コマンドを実行するか、SET vacuum_freeze_table_age TO 0 と設定したうえで VACUUM を行います。
    これにより、既に不正な状態となっているテーブルを修復します。

    データベースクラスタがこれまで 2^31 に満たない更新トランザクションしか実行してないのであれば、
    VACUUM FREEZE を行うだけで当面は安全になります。

  3. 行ロック制御に使われる MultiXactId の凍結に関する障害が修正されました。 (Andres Freund, Álvaro Herrera) (9.3)
  4. 本障害は、「ERROR: counld not access status of transaction ...」エラー、あるいは、行の重複や消失をひき起こす可能性があります。

    アップグレード後に全テーブルに VACUUM FREEZE を行って、既に生じてしまった不正なデータ状態を修復してください。

    別の問題として、本障害はスタンバイサーバにも生じ、データ不一致をひき起こします。
    したがって、9.3.0、9.3.1 のスタンバイサーバはバージョンアップ後、ベースバックアップを取り直すようにしてください。

  5. ホットスタンバイの起動における pg_clog と pg_subtrans の初期化について修正されました。 (Andres Freund, Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
  6. pg_clog、pg_subtrans はトランザクション状態を管理する内部データです。

    本障害は、ホットスタンバイサーバが起動して、クエリを受け付けるとき、
    コミット済トランザクションを未コミットとマークしてしまうことで、スタンバイ側にデータ破損を発生させます。
    行が消失してしまう、削除済み行が現れてしまう、更新前の行データが更新後の行データとともに残ってしまうといったことが起こり得ます。

    このデータ破損が生じる可能性は、スタンバイの起動時に、
    プライマリでチェックポイント以降に多数の更新トランザクションを実行している場合でないかぎり、低いといえます。

    本障害は、9.3.0、9.2.5、9.1.10、9.0.14 の各バージョンで導入されてしまいました。
    これらより手前バージョンは該当しません。

    アップグレード後、ベースバックアップの取り直しをしてスタンバイサーバの再構成することが推奨されます。

  7. 更新連鎖の横断処理に関するいくつかの障害が修正されました (Andres Freund, Álvaro Herrera) (9.3)
  8. 行ロックなどある行の複数行バージョンに対する横断的処理について修正されました。

    本障害では、同時更新処理において、誤った行のロックや更新が生じる可能性がありました。
    また「ERROR: unable to fetch updated version of tuple」エラーが誤って出ることもありえます。

  9. Fast Path Locking における不正なポインタの問題が修正されました (Tom Lane) (9.3)(9.2)
  10. Fast Path Locking とは、比較的弱いテーブルロック等の実装に使われている仕組みです。

    本障害は、共有メモリ上のロックデータ構造の破損をひきおこし、誤った振る舞いを生じさせる原因となります。

  11. タイムアウト制御における競合状態が修正されました (Tom Lane) (9.3)
  12. 本障害により、SIGALRM または SIGINT シグナルがブロックされることで、サーバプロセスの無応答が生じる可能性がありました。

  13. WALリプレイの中で pg_multixact/ のデータを切り詰めるようになりました (Andres Freund) (9.3)(9.2)(9.1)(9.0)
  14. pg_multixact はデータベースクラスタディレクトリ内のディレクトリで、行ロック制御のためのファイルが格納されます。

    8.2.x 時代に切り詰めを行わないようにされましたが、
    ホットスタンバイのように長期にリカバリ(WALリプレイ)を続けるケースでは、ファイルが増え続けることの方が問題となります。

  15. XID 周回対策の VACUUM 処理で、凍結が必要な行が無いと確認するだけだった場合に、
    走査したページを確実にカウントするように修正されました (Sergey Burladyan, Jeff Janes) (9.3)(9.2)
  16. 本障害により relfrozenxid 値の前進に失敗することがあり、XID 周回防止 VACUUM がまだ必要であると見なされてしまいます。
    最悪のケースではデータベースサーバプロセスが XID周回防止のために動作を停止してしまいます。

  17. MultiXactId によりテーブル全体VACUUM を要求する仕組みが修正されました (Andres Freund) (9.3)
  18. 本障害により自動VACUUM の無用な活動が多数生じる可能性がありました。

  19. GIN インデックスの木ページの削除における競合が修正されました (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)
  20. 本障害は一時的な誤った応答や SQL実行失敗をひきおこす可能性があります。

  21. SP-GiST インデックス作成で「ERROR: unexpected spgdoinsert() failure」が生じるケースが修正されました (Teodor Sigaev) (9.3)(9.2)
  22. 当該ケースにおいては内部的にリトライするようになります。

  23. マテリアライズドビューについて雑多な修正が行われました (Kevin Grittner, Andres Freund) (9.3)
  24. 以下のような記法でのカラム指定が動作するようになりました。

    =# CREATE TABLE t ( i int );
    =# CREATE MATERIALIZED VIEW mv_t(ii) AS SELECT * FROM t;
    

    マテリアライズドビューのリフレッシュ処理で内部的なクローズ処理位置の誤りが修正されました。

  25. 結合時には別エイリアスを使っている重複したテーブルのエイリアスを再び認めるようになりました (Tom Lane) (9.3)
  26. PostgreSQL では歴史的に以下のような SQL を受け入れていましたが、SQL標準を厳密に読むとエイリアス x を重複して使うのは禁止されています。

    SELECT ... FROM tab1 x CROSS JOIN (tab2 x CROSS JOIN tab3 y) z
    

    9.3.0 でこれを拒否するようにしましたが、元の振る舞いに戻されました。

  27. 外部結合内で入れ子になった単純な値ではないサブクエリについてプランナ処理が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  28. 本障害により、JOIN 構文内に複数レベルのサブクエリをもつ SQL に対して、誤ったプランを作るおそれがありました。

  29. 複数の WHERE と OUTER JOIN の結合条件とに STRICT でない同一の式が現れたときの誤ったプラン作成が修正されました (Tom Lane) (9.3)(9.2)
  30. サブクエリの行全体を参照するときプランナが処理に失敗するのが修正されました (Tom Lane) (9.3)(9.2)
  31. 以下 SQL でエラーとなる例が報告されています。

    =# SELECT q1.* FROM (select 'a'::text) q1(c) WHERE NOT EXISTS
       (SELECT * FROM (SELECT 'A'::text) q2(c) WHERE q2 = q1);
    ERROR: subquery q2 does not have attribute 0
    
  32. 継承ツリーへの min()、max() 関数に対する最適化プラン生成の誤りが修正されました (Tom Lane) (9.3)(9.2)(9.1)
  33. min()、max() に対してシンプルなカラム指定でなく、式を与えると、プラン内が失敗することがありました。

    修正前バージョンでは、プラン表示にて以下のようにエラーが出てしまいます。SQL実行自体は可能ですが Limit 計画タイプを使った min()、max() に特化した最適化がされない動作となっていました。

    =# CREATE TABLE matest0 (id serial PRIMARY KEY, name text);
    =# CREATE TABLE matest1 (id int PRIMARY KEY) INHERITS (matest0);
    =# CREATE TABLE matest2 (id int PRIMARY KEY) INHERITS (matest0);
    =# CREATE TABLE matest3 (id int PRIMARY KEY) INHERITS (matest0);
    =# CREATE INDEX matest0i ON matest0 ((1-id));
    =# CREATE INDEX matest1i ON matest1 ((1-id));
    =# CREATE INDEX matest3i ON matest3 ((1-id));
    
    =# EXPLAIN SELECT min(1-id) FROM matest0;
    ERROR:  no tlist entry for key 2
    

  34. 一時ファイルの早すぎる削除が修正されました (Andres Freund) (9.3)(9.2)(9.1)(9.0)(8.4)
  35. サブトランザクション(SAVEPOINT や 手続き言語の例外ブロック)の終了時などにエラーやクラッシュを招く可能性がありました。

  36. 範囲型値の出力に伴うトランザクション内でのメモリリークが修正されました (Tom Lane) (9.3)(9.2)
  37. 本修正では実際にはあらゆるデータ型の出力関数を直しますが、特に範囲データ型において1回につき数キロバイト単位という著しいリークが出ていました。

  38. 設定ファイルをリロードする際のメモリリークが修正されました (Heikki Linnakangas, Hari Babu) (9.3)
  39. NOT NULL や CHECK による制約違反メッセージで誤って削除済みのカラムが表示される問題が修正されました (Michael Paquier and Tom Lane) (9.3)(9.2)
  40. 以下のエラー例が報告されていました。2カラムのテーブルにもかかわらず、エラーメッセージでは3カラムになっています。

    => CREATE TABLE t22 (id serial primary key, v int check(v < 10));
    => ALTER TABLE t22 DROP COLUMN v;
    => ALTER TABLE t22 ADD COLUMN "v" int CHECK (v < 10);
    => INSERT INTO t22 (v) VALUES (100);
    ERROR:  new row for relation "t22" violates check constraint
    "t22_v_check"
    DETAIL:  Failing row contains (1, null, 100).
    

  41. ウィンドウ関数の記法でデフォルト引数値と名前付き引数指定に対応しました (Tom Lane) (9.3)(9.2)
  42. 以下のような関数の呼び出し方法が動作するようになります。

    CREATE FUNCTION nth_value_def(val anyelement, n int = 1)
     RETURNS anyelement LANGUAGE internal WINDOW IMMUTABLE STRICT
     AS 'window_nth_value';
    
    SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY cf), ct, cf
     FROM (SELECT * FROM t1 WHERE cu < 10 ORDER BY cf, ct) s;
    
    SELECT nth_value_def(ct) OVER (PARTITION BY cf), ct, cf
     FROM (SELECT * FROM t1 WHERE cu < 10 ORDER BY cf, ct) s;
    

    これまで名前付き引数を使った場合には「ERROR: window functions cannot use named arguments」が出ていました。
    また、デフォルト引数を使った場合、クラッシュをひき起こしていました。

  43. ルールとビューの整形表示にて行末の空白を削除するようになりました (Tom Lane) (9.3)
  44. 9.3.0 は過去バージョンと比べて空白を出力するケースが多くありました。想定外の振る舞い変化を減らすため、不要な空白だけを削除しています。

  45. int2vector型、oidvector型について、配列切り出し処理が修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  46. これらはシステムテーブルで使われるデータ型です。以下の SQL でバックエンドプロセスのクラッシュが生じていました。

    SELECT a.indkey[1:3], a.indkey[1:2] FROM pg_index AS a;
    

    int2[] 型(smallint[]型)や oid[] 型であれば本障害に該当しません。

  47. 空の htsore型データを変換した場合にも有効な JSONデータが返るように修正されました (Oskari Saarenmaa) (9.3)
  48. 以前は以下を実行すると「{}」ではなく、空文字列データが返っていました。空文字列は JSON 型のデータとして投入不能であるため、望ましくない振る舞いでした。

    =# SELECT (''::hstore)::json;
     json
    ------
     {}
    (1 row)
    

  49. SQL標準の GMTオフセットのタイムゾーン表記を使ったときの誤った振る舞いが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  50. 「-5.0」などの GMTオフセット表記の場合に問題が生じていました。以下例では「2012-12-11 22:00:00-05」が返らなければいけません。

    (障害動作例)
    =# SET TIME ZONE '-5.0';
    =# SELECT '2012-12-12 12:00 Japan'::timestamptz;
          timestamptz
    ------------------------
     2012-12-12 12:00:00-05
    

  51. Windows エラーコードを変換してログ出力する際の誤りが修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  52. DEBUGレベルログに誤った内容が出力されていました。

  53. Windows のサービスからコマンド起動する際に適切にダブルクオートを付加するようになりました (Naoya Anzai and Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)
  54. このほか、Windows むけにいくつか修正が行われています。

    サービス定義を読み取るサードパーティツールでの問題に対応して、スラッシュでパス区切りしている場合にバックスラッシュで置き換えます。また、非常に長いパス名に対してバッファオーバーランが起きないように修正されました。

  55. pg_dumpall が対象データベースに default_transaction_read_only = onと ALTER DATABASE 命令で設定されていた場合にも動作するように修正されました。 (Kevin Grittner) (9.3)(9.2)(9.1)(9.0)(8.4)
  56. これまではリストア時に以下のようなエラーが生じていました。

    psql:all.dump:56: ERROR:  cannot execute COMMENT in a read-only transaction
    psql:all.dump:72: ERROR:  cannot execute CREATE TABLE in a read-only transaction
    psql:all.dump:75: ERROR:  cannot execute ALTER TABLE in a read-only transaction
    

  57. pg_isready の -d オプションについて修正されました (Fabrízio de Royes Mello and Fujii Masao) (9.3)
  58. これまで以下のようなエラーが生じ、正しく動作していませんでした。

    $ pg_isready -h localhost -p 5432 -U postgres -d db1
    pg_isready: missing "=" after "db1" in connection info string
    

  59. pg_receivexlog で WALファイル名の読み取り処理が修正されました (Heikki Linnakangas) (9.3)
  60. 本誤りにより、4GB 以上(256ファイル以上)WAL が書かれた後で、以下エラーが出て、ストリーミングの停止後の再開ができませんでした。「pg_receivexlog: could not parse transaction log file name」

  61. pg_upgrade が適切にディスクスペース不足を報告するように修正されました (Peter Eisentraut) (9.3)
  62. contrib/pg_upgrade は、PostgreSQL バージョンアップに対応して、データベースクラスタディレクトリを書き換えるツールです。これまでディスク不足で失敗するときにエラーメッセージの原因を示す箇所が「Success」となってしまっていました。

  63. ecpg でクオートされたカーソル名で大文字小文字の区別をするように修正されました (Zoltán Böszörményi) (9.3)(9.2)(9.1)
  64. これまで " でクオートしていても大文字小文字を同一視していました。

  65. ecpg における varchar型で宣言された 変数リストの処理が修正されました
    (Zoltán Böszörményi) (9.3)(9.2)(9.1)(9.0)(8.4)
  66. 以下のコードが、

    EXEC SQL BEGIN DECLARE SECTION;
    varchar a[50], b[50];
    EXEC SQL END DECLARE SECTION;
    

    ecpgプリプロセッサにより、以下のように変換されてしまいました。

    struct varchar_1  { int len; char arr[ 50 ]; }  a , struct varchar_2  { int len; char arr[ 50 ]; }  b ;
    

    これは C言語の文法エラーを引き起こします。上記「,」は「;」でなければいけません。

  67. contrib/lo が誤ったトリガ定義から保護されるように修正されました (Marc Cousin) (9.3)(9.2)(9.1)(9.0)(8.4)
  68. contrib/lo はラージオブジェクトを自動削除するトリガ関数 lo_manage() とloドメイン型を提供する拡張モジュールです。これまで lo_manage() 関数を誤って文レベルトリガとして使用されるとクラッシュを引き起こしていましたが、修正によりエラー終了するようになりました。

  69. タイムゾーンデータが tzdata release 2013h に更新されました (9.3)(9.2)(9.1)(9.0)(8.4)
  70. アルゼンチン、ブラジル、ヨルダン、リビア、リヒテンシュタイン、モロッコ、パレスチナの夏時間法の変更が適用されています。また、新たなタイムゾーン略記法 WIB、WIT、WITA(いずれもインドネシ
    アのタイムゾーン)が追加されました。

PostgreSQL 9.3.1、9.2.7、9.1.10、9.0.14、8.4.18 への変更点


  1. hstore拡張モジュールの JSON 機能が更新されました (Andrew Dunstan) (9.3)

    hstore型を json型に変換する二つの JSON 関数と一つのキャストが追加されました。
    既に hstore をインストールしている場合には以下コマンドで適用します。

    =# ALTER EXTENSION hstore UPDATE;
    
  2. 範囲インデックス作成時のメモリリークが修正されました (Heikki Linnakangas) (9.3)(9.2)
  3. SERIALIZABLE トランザクションについて修正されました (Kevin Grittner, Heikki Linnakangas) (9.3)(9.2)(9.1)

    直列化可能であるかの判断で競合を見落とす可能性がありました。

  4. libpq の SSL 接続におけるデッドロックが生じる障害が修正されました (Stephen Frost) (9.3)(9.2)(9.1)(9.0)(8.4)
  5. pg_receivexlogコマンドにおけるタイムラインの扱いに関する障害が修正されました (Heikki Linnakangas, Andrew Gierth) (9.3)
  6. CREATE FUNCTION において、設定 check_function_bodies が有効でない限り、SET する値のチェックを行わないようになります。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)(8.4)

    以下の関数定義は SET 句部分で与えている値が誤っていますが、check_function_bodies = off としておけばエラーが出なくなります。
    以前は常にチェックされエラーとなっていました。

    CREATE FUNCTION func_with_bad_set() RETURNS int AS
    $$ select 1 $$
    LANGUAGE SQL SET default_text_search_config = no_such_config;
    

  7. 稀に発生するインデックスの無いテーブルに対する VACUUM における誤った警告が取り除かれました。
    (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)(8.4)

    「WARNING: page containing dead tuples is marked as all-visible ...」が誤って出る可能性がありました。

  8. マルチバイト文字エンコーディングにおいて、
    非ASCII で "(ダブルクオート)で囲われていない識別子が小文字にならないように修正されました。 (Andrew Dunstan) (9.2)(9.1)(9.0)(8.4)

    これまでは非ASCII 文字でも tolower() 関数によって小文字に変換する実装となっていました。

  9. wal_level = hot_standby であるときの backgroupd writer プロセスにおけるチェックポイント処理のメモリリークが修正されました。
    (Naoya Anzai) (9.2)(9.1)(9.0)
  10. lo_open() によるメモリリークが修正されました (Heikki Linnakangas) (9.2)(9.1)(9.0)(8.4)
  11. work_mem でメモリを 24GB 以上の使う際にメモリ超過割り当てが生じる可能性があり、修正されました。 (Stephen Frost) (9.2)(9.1)(9.0)(8.4)
  12. libpq にてマルチスレッドで SSL を使う場合にネットワークスタックが壊れる可能性あり、修正されました (Nick Phillips, Stephen Frost) (9.2)(9.1)(9.0)
  13. 与えられたパラメータに対応したカスタムプランを使うかどうか選ぶ際のプランナコスト見積もりが改善されました (Tom Lane) (9.2)

    本変更でプラン作成コストが高いときには汎用プランを好むようになります。

  14. boolean型カラムに NULL が多数含まれるとき、プランナが選択行の見積を適切に行うようになりました (Andrew Gierth) (9.2)(9.1)(9.0)(8.4)

    これまで「col IS NOT TRUE」や「col IS NOT FALSE」といった条件のとき、NULL値の割合が因子として適切に使われていませんでした。

  15. UNION ALL と継承テーブルへの問い合わせでパラメタライズドパスを適切に再チェックするように修正されました (Tom Lane) (9.2)

    これまで最善でないプランが選ばれる可能性がありました。

  16. UNION や INTERSECT のサブクエリに対する安全でない WHERE句のプッシュダウンを防ぐようになりました (Tom Lane) (9.2)(9.1)(9.0)(8.4)

    これまでは該当のケースでエラーが生じていました。サブクエリ部分に複数行を返す関数、
    VOLATILE な関数、DISTINCT ON がある場合に該当する可能性があります。以下に報告されたエラーケースを示します。

    =# SELECT * FROM (
         SELECT 1 AS t , generate_series(1,10) AS x
         UNION
         SELECT 2 AS t , 4 AS x
       ) ss WHERE x < 4 ORDER BY x;
    ERROR:  set-valued function called in context that cannot accept a set
    
  17. 不適切なデータ型の処理により GROUP BY の問い合わせで稀にエラーがおきる障害が修正されました (Tom Lane) (9.2)(9.1)(9.0)(8.4)

    以下の SQL で障害が報告されました。

    =# CREATE FUNCTION test_group_by() RETURNS TABLE (my_col varchar(5))
       AS $$ SELECT 'hello'::varchar(5); $$ LANGUAGE sql STABLE;
    
    =# SELECT my_col FROM test_group_by() GROUP BY 1;
    ERROR:  failed to locate grouping columns
    
  18. pg_dump のバイナリアップグレードモード(--binary-upgrade)における動作が修正されました (Andrew Dunstan) (9.2)(9.1)

    カラムを落とした外部テーブルについて正しく動作するようになりました。これまで pg_upgrade にてエラーが出ていました。

  19. pg_dump で拡張モジュール関連のルール、イベントトリガーの処理順序が修正されました (Joe Conway) (9.2)(9.1)
  20. 拡張モジュールのテーブルでも pg_dump で -t や -n の指定をしたとき、ダンプできるようになりました。 (Joe Conway) (9.2)(9.1)
  21. ビューのダンプで元テーブルから落とされたカラムについて、よりよい扱いができるようになりました。 (Tom Lane) (9.2)(9.1)(9.0)(8.4)
  22. pg_restore -l (--list) でディレクトリ形式が正しいフォーマット名称で表示されるように修正されました (Fujii Masao) (9.2)(9.1)

    これまで Format: UNKNOWN と表示されていました。

  23. UNIQUE 構文、PRIMARY KEY 構文を使った際に、インデックスコメントを適切に記録するようになりました (Andres Freund) (9.2)(9.1)(9.0)

    pg_restore でパラレルにリストアを行う際に、まだ作られていないインデックスにコメントを付ける処理が実行され、エラーとなっていました。

  24. pg_basebackup -x (--xlog) 実行時、レプリケーション元の pg_xlog が空であるときクラッシュしていたものが修正されました (Magnus Hagander, Haruka Takatsuka) (9.2)

    「ERROR: could not find any WAL files」が出るようになります。

  25. スイッチオーバーが完了する前の WALファイル伝搬が正しく保証されるようになりました (Fujii Masao) (9.2)(9.1)

    これまで、全ての WALファイルがスタンバイでリプレイされる前にストリーミングレプリケーション接続が閉じてしまう可能性がありました。

  26. リカバリ中における WALセグメントのタイムラインの扱いが改善されました (Heikki Linnakangas) (9.2)(9.1)

    WALセグメントファイルを再利用するときにターゲットタイムラインでなく現在のタイムラインに基づいたファイル名にします。

  27. REINDEX TABLE と REINDEX DATABASE が適切に制約を再検証し、無効とされたインデックスに有効と印をつけるようになりました。
    (Noah Misch) (9.2)(9.1)(9.0)
  28. SP-GiST インデックスに挿入するときのデッドロックを回避するように修正されました (Teodor Sigaev) (9.2)
  29. CREATE INDEX CONCURRENTLY を並列実行するときデッドロックの可能性があり、修正されました (Tom Lane) (9.2)(9.1)(9.0)(8.4)
  30. GiST インデックスを牽くときのクラッシュが修正されました (Tom Lane) (9.2)
  31. regexp_matches() 関数におけるゼロ長マッチの扱いについて修正されました (Jeevan Chalke) (9.2)(9.1)(9.0)(8.4)

    これまで「^」のようなゼロ長文字列へのマッチでは、以下のように余分にマッチ文字列を返していました。

    =# SELECT regexp_matches('foo', '$', 'g');
     regexp_matches
    ----------------
     {""}
     {""}
    (2 rows)
    
  32. 非常に複雑な正規表現でクラッシュしていたものが修正されました (Heikki Linnakangas) (9.2)(9.1)(9.0)(8.4)
  33. 正規表現で、最短一致量指定子(non-greedy)での後方参照マッチに失敗していたものが修正されました (Jeevan Chalke) (9.2)(9.1)(9.0)(8.4)
  34. ALTER DEFAULT PRIVILEGES で CREATE権限がなくともスキーマの操作ができるようになりました (Tom Lane) (9.2)(9.1)(9.0)

    スキーマに対する CREATE 権限が必要という点はマニュアル記載があり、本件は仕様変更となります。本変更による実質的なセキュリティ水準低下は無いと考えられます。

    以前は、以下の振る舞いとなります。

    (管理者ユーザで操作)
    =# CREATE USER bob;
    =# CREATE SCHEMA we_like_bob;
    =# ALTER DEFAULT PRIVILEGES FOR ROLE bob IN SCHEMA we_like_bob
       GRANT SELECT ON TABLES TO bob;
    ERROR:  permission denied for schema we_like_bob
    (ここではエラー)
    =# GRANT CREATE ON SCHEMA we_like_bob TO bob;
    =# ALTER DEFAULT PRIVILEGES FOR ROLE bob IN SCHEMA we_like_bob
       GRANT SELECT ON TABLES TO bob;
    (ここで成功する)
    

  35. クエリ内にキーワードは使えないという制限が緩められました (Tom Lane) (9.2)(9.1)(9.0)

    ロール名、手続き言語名、COPY や EXPLAIN のオプション、SET 値にてキーワードが使用可能となります。

  36. COPY に失敗したときに適切な行番号が出力されるようになりました (Heikki Linnakangas) (9.2)

    これまでエラー時メッセージにてコピー元ファイルのエラー箇所と合わない行番号が表示されることがありました。

  37. pgcrypto 拡張モジュールにおいて、pgp_pub_decrypt() 関数がパスワード付き秘密鍵で動作するように修正されました
    (Marko Kreen) (9.2)(9.1)(9.0)(8.4)
  38. pg_upgrade が pg_dump --quote-all-identifiers を使って、リリース間でキーワードが変更された場合の問題を回避するようになりました
    (Tom Lane) (9.2)(9.1)
  39. ファイル切り詰め処理がキャンセルされた場合における ANALYZE の統計情報生成が改善されました (Kevin Grittner) (9.2)(9.1)(9.0)
  40. プリペアドクエリーとしてトランザクション管理コマンド(ROLLBACK など)を実行すると失敗する可能性があり、修正されました
    (Tom Lane) (9.2)(9.1)(9.0)(8.4)
  41. 無限大をあらわすのに多様な書き方が全プラットフォームで可能となりました (Tom Lane) (9.2)(9.1)(9.0)(8.4)

    浮動小数点の数値型(float4、float8)にて、inf、+inf、-inf、infinity、+infinity、-infinity という書き方が共通でサポートされます。これまで Windows では inf が使えないなど、コンパイラやプラットフォームによって差異がありました。

  42. track_activities = off であるとき、実行時統計情報収集における不要な報告処理をしなくなりました (Tom Lane) (9.2)
  43. 行とレコードや配列の比較について不要な制限が取り除かれました (Rafal Rzepecki, Tom Lane) (9.2)(9.1)(9.0)(8.4)

    以下のような SQL がエラーとなっていましたが、実行できるようになりました。

    =# CREATE TYPE the_row AS (c1 text, c2 text);
    =# CREATE TABLE the_table (c the_row);
    =# SELECT * FROM the_table WHERE c IN ( ROW('foo','bar')::the_row );
    ERROR:  arguments of row IN must all be row expressions
    
  44. 環境変数 PSQLRC にチルダが含まれているときにクラッシュする障害が修正されました (Bruce Momjian) (9.2)
  45. ARM64 むけの CPU固有スピンロックコードが追加されました (Mark Salter) (9.2)
  46. タイムゾーンデータが tzdata release 2013d に更新されました (Tom Lane) (9.2)(9.1)(9.0)(8.4)

    イスラエル、モロッコ、パレスチナ、パラグアイの夏時間法の変更、および、マッコーリー島の歴史的な修正が適用されています。

  47. WALリプレイで未初期化の空ページを参照してエラーになるのを防止するようになりました
    (Andres Freund) (9.2)