PostgreSQL 14 に関する技術情報

このページでは PostgreSQL 14(2021/9/30リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン14の新機能については「PostgreSQL 14 検証報告」も参照してください。

バージョン14の主要な拡張

PostgreSQL 14 の主な拡張点としては以下があります。

  • Btree Index 肥大化防止
  • 式の拡張統計のサポート
  • LZ4によるデータ圧縮のサポート
  • パラレルクエリ、ロジカルレプリケーション、FDWを含む各種の性能改善
  • マルチ範囲型の追加
  • SEARCH/CYCLE句サポート
  • セッション制御機能の追加
  • pg_read_all / pg_write_all ロール
  • amcheck の拡張と pg_amcheckコマンド追加
  • 各種の実行時統計ビューの拡張・追加

PostgreSQL 14 への移行/互換性のない変更点

  1. いくつかの引数を伴う組込の配列関数を参照するユーザ定義オブジェクトは、再作成が必要で、pg_upgrade だけでは移行できません。 (Tom Lane) (14)
  2. 具体的には、以下の関数の引数が anyarray型から anycompatiblearray型に変更されたため、これらの配列関数を参照する集約や演算子のようなユーザ定義オブジェクトは、アップグレード前に削除してアップグレード後に再作成しなければなりません。

    array_append()
    array_prepend()
    array_cat()
    array_position()
    array_positions()
    array_remove()
    array_replace()
    width_bucket()
    
  3. 組込の幾何データ型と contribモジュールの cube、hstore、intarray、seg に対する包含の演算子 @ および ~ が廃止されました。 (Justin Pryzby) (14)
  4. これらは既に長らく非推奨となっており、代わりに <@ と @> が推奨されていました。

  5. to_tsquery() と websearch_to_tsquery() が破棄トークンを含む問い合わせテキストを適切にパースするように修正されました。 (Alexander Korotkov) (14)
  6. 「_」「=」「#」など、いくつかの破棄トークンはこれら関数で不正確な psquery 出力を引き起こしました。例えば、「websearch_to_tsquery('"pg_class pg"')」と「to_tsquery('pg_class <-> pg')」は、いずれも「( 'pg' & 'class' ) <-> 'pg'」を出力していましたが、これからは「'pg' <-> 'class' <-> 'pg'」を出力します。

  7. クォート内の複数の隣接する破棄トークンを適切にパースするようにwebsearch_to_tsquery() が修正されました。 (Alexander Korotkov) (14)
  8. これまでは、複数の隣接する破棄トークンを含むクォート内のテキストは複数トークンとして扱われて、不正確な tsquery出力を引き起こしていました。例えば「websearch_to_tsquery('"aaa: bbb"')」は「'aaa' <2> 'bbb'」を、「websearch_to_tsquery('"aaa:: bbb"')」は「'aaa' <3> 'bbb'」を出力していましたが、これからはいずれも「'aaa' <-> 'bbb'」を出力します。

  9. EXTRACT が numeric型を返すようになりました。 (Peter Eisentraut) (14)
  10. これまでは double precision(別名 float8)でした。以前の振る舞いをさせるには date_part() 関数を利用できます。こちらは依然として double precision型を返します。

    また、EXTRACT(date) は date型に含まれない部分を要求したときに、以下のようにエラーを投げるようになりました。

    db=# SELECT EXTRACT (minute FROM '2021-10-05'::date);
    ERROR:  date units "minute" not supported
    (13.x バージョンでは 0 が返りエラーにならない)
    
  11. numeric型パラメータの集約関数 var_samp()、stddev_samp() が単一の NaN 値の入力に対して NULL を返すように変更されました。 (Tom Lane) (14)
  12. これまでは NaN が返っていました。本変更により、浮動小数点型(double precision、real)のパラメータを取る場合と同じ振る舞いになりました。

  13. has_column_privilege() が、アトリビュート番号(pg_attribute.attnum)で存在しないか削除された列を指定して実行したときに、NULL を返すようになりました。 (Joe Conway) (14)
  14. これまでは以下のようなエラーが生じることがありました。

    ERROR:  attribute 12 of relation with OID 34567 does not exist
    
  15. 無限を伴うウィンドウ関数の範囲を正しく扱えるように修正されました。 (Tom Lane) (14)
  16. これまでは「RANGE BETWEEN 'inf' PRECEDING AND 'inf' FOLLOWING」のようなウィンドウフレーム句は誤った結果を返していました。該当するケースは実用の SQL にはおそらく現れないと考えられます。

  17. 階乗の演算子 ! および !! が廃止されました。 (Mark Dilger) (14)
  18. 階乗の関数 numeric_fac() も廃止されました。factorial() 関数は引き続き提供されます。

  19. factorial() 関数に負の値を指定できなくなりました。 (Peter Eisentraut) (14)
  20. これまでは負の値には何でも 1 が返りましたが、階乗の本来の定義に則り、以下のエラーを出すようになりました。

    ERROR:  factorial of a negative number is undefined
    
  21. 後置演算子(右単項演算子)が廃止されました。 (Mark Dilger) (14)
  22. pg_dump と pg_upgrade は後置演算子がダンプされた場合、警告するようになります。

  23. 正規表現で改行を区別するモード(オプション n)の場合に、\D と \W が改行にマッチするようになりました。 (Tom Lane) (14)
  24. これまではこれらは改行にマッチしませんでしたが、これは他の一般的な正規表現エンジンの振る舞いと異なりました。\D、\W をそれぞれ [^[:digit:]] 、 [^[:word:]] で置き換えれば従来の振る舞いを再現できます。

    db=# SELECT regexp_match(E'abc\ndef', '(\D+)', 'n');
    (13.xの応答)
     regexp_match
    --------------
     {abc}
    (1 row)
    
    (14.0の応答)
     regexp_match
    --------------
     {"abc       +
     def"}
    (1 row)
    
  25. 正規表現の後方参照のマッチで、制約を無視するようになりました。 (Tom Lane) (14)
  26. 例えば、以下は先頭から始まる数字の並びが後方に再び現れるパターンにマッチしますが、このとき「\1」に対しては制約「^」が無視されるようになります。

    (14.0 の動作、これは 13.x ではマッチしない)
    db=# SELECT regexp_match('123xxx123', '(^\d+).*\1');
     regexp_match
    --------------
     {123}
    (1 row)
    
    (こう書けば 14.0 でも 13.x でもマッチする)
    db=# SELECT regexp_match('123xxx123', '^(\d+).*\1');
     regexp_match
    --------------
     {123}
    (1 row)
    
  27. 正規表現の文字クラスで、範囲の先頭または末尾の \w が禁止されました。 (Tom Lane) (14)
  28. これまでは許容されていましたが意図せぬ結果が生じていました。

    (13.x の動作例、「[[:alnum:]_-_]」と解釈されて動作していた)
    db=# SELECT '_' ~ '[\w-_]';
     ?column?
    ----------
     t
    (1 row)
    
    (14.0 では以下エラーになる)
    ERROR:  invalid regular expression: invalid character range
    
  29. カスタム設定名に使える文字が、クォート無しの SQL識別子として有効な文字だけに限定されました。 (Tom Lane) (14)
  30. これまでは各種の記号も利用可能でした。

    (14.0 での実行例、これは 13.x ではエラーにならない)
    db=# SET "x==x.a~z" TO 123;
    ERROR:  invalid configuration parameter name "x==x.a~z"
    DETAIL:  Custom parameter names must be two or more simple identifiers separated by dots.
    
  31. 設定 password_encryption のデフォルトが scram-sha-256 に変更されました。 (Peter Eisentraut) (14)
  32. これまでは md5 でした。既存のパスワード格納に md5 を用いている場合、アップグレード時に設定調整かパスワード設定のやり直しが必要となります。また、「on」や「true」、「1」を設定した場合、md5 と解釈されていましたが、この振る舞いは廃止されました。

  33. 設定 vacuum_cleanup_index_scale_factor が廃止されました。 (Peter Geoghegan) (14)
  34. これは PostgreSQL 13.3 から無視されるようになっていました。

    本変更は btreeインデックスの autovacuum性能を改善する意図によるもので、挿入タプル数の統計からインデックスをスキャンするかを決める仕組み自体が廃止されました。

  35. 設定 operator_precedence_warning が廃止されました。 (Tom Lane) (14)
  36. これは PostgreSQL 9.5 における仕様変更に該当する演算子を警告するものでした。

  37. pg_hba.conf の認証オプション clientcert の仕様が変更されました。 (Kyotaro Horiguchi) (14)
  38. clientcert の設定値に 1、0、no-verify は使えなくなり、verify-ca、 verify-full だけが使用可能になります。また、認証方式が cert であるエントリでは verify-full相当の検査が必要となるため、clientcert=verify-ca の指定はできなくなります(下記ログメッセージが出て設定が受け付けられません)。

    LOG:  clientcert only accepts "verify-full" when using "cert" authentication
    LOG:  pg_hba.conf was not reloaded
    
  39. SSL圧縮のサポートが廃止されました。 (Daniel Gustafsson, Michael Paquier) (14)
  40. これまでのバージョンでもデフォルトで無効となっていました。また、新しい OpenSSL および TLS のバージョンでは、これはサポートされません。接続パラメータ sslcompression は無視されるようになります。

  41. サーバと libpq で、バージョン 2 プロトコルがサポートされなくなりました。 (Heikki Linnakangas) (14)
  42. これは 2002年リリースの PostgreSQL 7.3 ではデフォルトでしたが、PostgreSQL 7.4 以降はバージョン 3 プロトコルがデフォルトになりました。

  43. CREATE/DROP LANGUAGEコマンドで、言語名を文字列リテラルで指定する構文が廃止されました。 (Peter Eisentraut) (14)
  44. 以前は「CREATE LANGUAGE plperl」を「CREATE LANGUAGE 'plperl'」と記述できました。

  45. シーケンスと TOASTテーブルに対応した複合型が作成されなくなりました。 (Tom Lane) (14)
  46. pg_typeシステムテーブルからシーケンスやTOASTテーブルの存在を調べることはできなくなります。

  47. ecpg の SQLコマンド文字列で二重のクォートを正しく処理するようになりました。 (Tom Lane) (14)
  48. これまでは 'abc''def' は 'abc'def' として、"abc""def" は "abc"def" として、サーバに渡され、その結果、構文エラーを引き起こしていました。

    以前の不適切な動作に対処するための記述をしていた場合、修正が必要です。

  49. intarray に対する包含の演算子(<@ と @>)に、GiSTインデックスが使用できなくなりました。 (Tom Lane) (14)
  50. GiSTインデックスを使った本演算子の処理には、フルGiSTインデックススキャンが必要であったため、それをせずにヒープをスキャンを行う方が高速でした。該当するインデックスは削除するべきです。

  51. contrib の pg_standbyコマンドが廃止されました。 (Justin Pryzby) (14)
  52. 本コマンドが無くとも、レプリケーションのスタンバイを作ることで同様の構成が実現可能です。

  53. contrib の tablefunc の関数 normal_rand() が numvals(行数)に負の値を受け付けなくなりました。 (Ashutosh Bapat) (14)
  54. これまで負の値を指定すると符号無し整数と解釈して大量行の生成が試みられました。

変更点

サーバ

  • pg_read_all_data および pg_write_all_data という定義済みのロールが追加されました。 (Stephen Frost) (14)
  • これらのログイン権限無しのロールを使用して、すべてのテーブル、ビュー、シーケンスの読み取り権限または書き込み権限を付与することができます。

  • 現在のデータベースの所有者のみを含む定義済みのロールpg_database_owner が追加されました。 (Noah Misch) (14)
  • これは特にテンプレートデータベースで役立ちます。

  • バックエンドプロセスがクラッシュした後に一時ファイルが削除されるようになりました。 (Euler Taveira) (14)
  • これまではデバッグ目的でこのようなファイルを残していました。 新しい remove_temp_files_after_crash 設定パラメータを必要に応じてoff に設定することで、従来通りファイルを残すこともできます。

  • クライアントが切断された場合に、長時間実行している問い合わせをキャンセルできるようになりました。 (Sergey Cherkashin, Thomas Munro) (14)
  • 設定 client_connection_check_interval で、問い合わせ内での接続切れを検査するかどうかを制御できます。これは、Linux と他のいくつかの OS でサポートされています。

  • pg_terminate_backend() 関数にオプションのタイムアウトパラメータが追加されました。 (Magnus Hagander) (14)
  • 2番目引数の timeoutパラメータ(デフォルト 0)に 0 より大きい値を指定すると、タイムアウト時間(秒単位)を上限としてプロセスが実際に終了したかを待つようになります。

    また、プロセス終了を待つ pg_wait_for_backend_termination() 関数も追加されました。

  • 幅の広いタプルを、ほぼ空のヒープページに常に追加できるようになりました。 (John Naylor, Floris van Nee) (14)
  • 以前は、ページのフィルファクタを超えてしまうタプルの INSERT では常に新しく拡張されたページに追加されていました。

  • SSL接続パケットにサーバ名表示 (SNI: Server Name Indication)が追加されました。 (Peter Eisentraut) (14)
  • これはクライアントの接続オプション sslsni をオフにすることで無効にできます。

VACUUM
  • 削除可能なインデックスエントリ数が些少である場合は、バキュームがインデックスのバキュームをスキップできるようになりました。 (Masahiko Sawada, Peter Geoghegan) (14)
  • VACUUM コマンドの INDEX_CLEANUP パラメータのデフォルト値は、この最適化が有効となる auto になりました。

  • バキュームが削除された btreeページをより熱心に空き領域マップに追加できるようになりました。 (Peter Geoghegan) (14)
  • これまでのバキュームでは、以前のバキュームで削除済みとマークされたページしか空き領域マップに追加できませんでした。

  • バキュームが未使用のヒープラインポインタ末尾で使用されるスペースを回収できるようになりました。 (Matthias van de Meent, Peter Geoghegan) (14)
  • 弱いロックのみ伴うインデックス操作中に、バキュームがより積極的にデッドタプルを除去できるようになりました。 (Alvaro Herrera) (14)
  • 具体的には、CREATE INDEX CONCURRENTLY と REINDEX CONCURRENTLY は、他リレーションのデッドタプル除去を制限しなくなります。

  • 多数のリレーションを持つデータベースのバキューム処理が高速化されました。 (Tatsuhito Kasahara) (14)
  • 現在のハードウェア性能をより適切に反映するためにvacuum_cost_page_miss 設定のデフォルト値が減りました。 (Peter Geoghegan) (14)
  • 10 から 2 に変更されました。

  • TOASTテーブルのバキュームを省略できるようになりました。 (Nathan Bossart) (14)
  • VACUUMコマンドには TOAST処理を無効にするために false に設定できるPROCESS_TOAST オプションが、vacuumdbコマンドには --no-process-toast オプションが追加されました。

  • COPY FREEZE がページの可視性ビットを適切に更新するようになりました。 (Anastasia Lubennikova, Pavan Deolasee, Jeff Janes) (14)
  • これまで COPY FREEZE は個々のタプルを凍結済としてマークするだけでページレベルのフラグを更新していなかったため、COPY FREEZE 後の最初の VACUUM でテーブル全体を書き換える必要がありました。

  • テーブルが xid や multixact の周回に近い場合はバキューム処理をより積極的に行うようになりました。 (Masahiko Sawada, Peter Geoghegan) (14)
  • これは vacuum_failsafe_age 設定パラメータと multixact_failsafe_age 設定パラメータによって制御されます。

  • トランザクションID とマルチトランザクションID が周回する前の警告時とシステム停止するハードリミットの閾値が増加されました。 (Noah Misch) (14)
  • トランザクションID は、警告が周回の 1100万トランザクション前から 4000万トランザクション前、ハードリミットが周回の 100万トランザクション前から 300万トランザクション前になりました。マルチトランザクションID は、警告が周回の 1000万トランザクション前から 4000万トランザクション前、ハードリミットが周回の 100トランザクション前から 300万トランザクション前になりました。

  • 自動バキュームのログ出力にインデックスごとの情報が追加されました。 (Masahiko Sawada) (14)
パーティショニング
  • 多数のパーティションを持つパーティションテーブルで、更新と削除のパフォーマンスが向上しました。 (Amit Langote, Tom Lane) (14)
  • この変更により、このような場合のプランナのオーバーヘッドが大幅に削減され、また、更新/削除を実行する際にパーティションプルーニングが利用可能になりました。

  • パーティションを強いロックを伴わずに切り離すことができるようになりました。 (Alvaro Herrera) (14)
  • そのために「ALTER TABLE ... DETACH PARTITION ... [CONCURRENTLY | FINELIZE]」という構文が追加されました。

  • パーティション境界値の COLLATE句を無視するようになりました。 (Tom Lane) (14)
  • これまで、このような COLLATE句はパーティションキーの照合順序と一致する必要がありました。しかし、指定を無視して自動的にパーティションキーの照合順序に合わせる新たな動作の方が一貫性があります。

インデックス
  • ページ分割を防ぐために、btreeインデックスの追加に際して、期限切れのインデックスエントリを削除できるようになりました。 (Peter Geoghegan) (14)
  • これは、インデックス付きの列が頻繁に更新されるテーブルのインデックスの肥大化を抑えるのに特に役立ちます。

  • BRINインデックスで範囲ごとに複数の min/max値が記録できるようになりました。 (Tomas Vondra) (14)
  • これは各ページの範囲に値のグループがある場合に有効です。

  • BRINインデックスでブルームフィルターを使用できるようになりました。 (Tomas Vondra) (14)
  • これにより、ヒープ内で十分に局所化されていないデータでBRINインデックスを効果的に使用できます。

    (ブルームフィルタ用の演算子クラスを指定して使用します)
    db=# CREATE TABLE t24 (a int);
    db=# CREATE INDEX ON t24
       USING brin (a int4_bloom_ops(false_positive_rate = 0.05,
                                    n_distinct_per_range = 100));
    
  • データの事前ソートにより GiSTインデックスを構築できるようになりました。 (Andrey Borodin) (14)
  • 事前ソートは自動的に行われ、インデックス作成の高速化とインデックスの小型化が実現されます。

  • SP-GiSTインデックスに INCLUDEされた列を含めることができるようになりました。 (Pavel Borisov) (14)
プランナ
  • 多くの定数を持つ IN句のハッシュ検索が可能になりました。 (James Coleman, David Rowley) (14)
  • これまでのコードは、常に値のリストを順番にスキャンしていました。

  • OR句の推定に拡張統計を使用できる箇所が増えました。 (Tomas Vondra, Dean Rasheed) (14)
  • 式の拡張統計を可能にします。 (Tomas Vondra) (14)
  • これにより、以前のような列だけではなく、式と列のグループに対するプランナ統計が利用可能になります。システムビュー pg_stats_ext_exprs はそのようなプランナ統計を報告するようになりました。

  • TID の範囲を効率的にヒープスキャンできるようになりました。 (Edmund Horner, David Rowley) (14)
  • これまでは等価条件以外の TID指定ではシーケンシャルスキャンが必要でした。このために新たに Tid Range Scanプラン要素が追加されました。

    (14.0での実行例)
    db=# explain SELECT * FROM t30 WHERE ctid < '(2,0)';
                             QUERY PLAN
    ------------------------------------------------------------
     Tid Range Scan on t30  (cost=0.00..11.36 rows=536 width=4)
       TID Cond: (ctid < '(2,0)'::tid)
    (2 rows)
    
  • EXPLAIN CREATE TABLE AS および EXPLAIN CREATE MATERIALIZED VIEW がIF NOT EXISTS句を尊重するように修正しました。 (Bharath Rupireddy) (14)
  • オブジェクトがすでに存在している場合に、以前は EXPLAIN は無効な結果を返していましたが、NOTICEメッセージと 0行を返すようになりました。

性能一般
  • CPU数が多くセッション数が多いシステムで MVCC可視化スナップショットの計算速度が向上しました。 (Andres Freund) (14)
  • アイドル状態のセッションが多い場合の性能も向上します。

  • ネストループ結合の内側からの結果をメモ化するエクゼキュータ方式が追加されました。 (David Rowley) (14)
  • これは、内側でチェックされる行の割合が非常に少ない場合に役立ちます。この機能は、enable_memoize設定で無効にすることができます。

  • ウィンドウ関数でインクリメンタルソートが実行できるようになりました。 (David Rowley) (14)
  • 並列シーケンシャルスキャンの I/O性能が向上しました。 (Thomas Munro, David Rowley) (14)
  • グループ内のブロックをパラレルワーカに割り当てることで実現されました。

  • 複数の外部テーブルを参照する問い合わせが、外部テーブルスキャンを並行して実行できるようになりました。 (Robert Haas, Kyotaro Horiguchi, Thomas Munro, Etsuro Fujita) (14)
  • postgres_fdw は非同期実行オプションの async_capable パラメータが設定されている場合に、このタイプのスキャンをサポートします。

  • analyze でページの先読みを行えるようになりました。 (Stephen Frost) (14)
  • これは maintenance_io_concurrency設定で制御できます。

  • 正規表現検索の性能が向上しました。 (Tom Lane) (14)
  • ユニコード正規化の性能が大幅に向上しました。 (John Naylor) (14)
  • normalize() と IS NORMALIZED が高速化されています。

  • TOASTデータを LZ4 で圧縮できるようになりました。 (Dilip Kumar) (14)
  • この機能は、列レベルで設定することも、default_toast_compression でデフォルトとして設定することもできます。この機能を使用するには、サーバが --with-lz4 オプションを付けてコンパイルされている必要があります。デフォルトは従来からの圧縮方式の pglz です。

モニタリング
  • compute_query_id 設定が有効な場合、pg_stat_activity、EXPLAIN VERBOSE、csvlog、および log_line_prefix 設定のオプションで、クエリID が出力されます。 (Julien Rouhaud) (14)
  • また拡張モジュールによって計算されたクエリID も表示されます。

  • 自動バキュームと自動アナライズのログが改善されました。 (Stephen Frost, Jakub Wartak) (14)
  • track_io_timing設定が有効になっている場合、自動バキュームおよび自動アナライズの I/Oタイミングが報告されます。また、自動アナライズについてバッファ読み取り率とダーティ率も報告されます。

  • log_connections設定の出力に、クライアントから提供された独自のユーザ名の情報を追加するようになりました。 (Jacob Champion) (14)
  • 認証方法により様々な種類の情報が記録されます。

システムビュー
  • COPY の進捗状況を報告するシステムビュー pg_stat_progress_copy が追加されました。 (Josef ?imanek, Matthias van de Meent) (14)
  • WAL のアクティビティを報告する pg_stat_wal システムビューが追加されました。 (Masahiro Ikeda) (14)
  • レプリケーションスロットのアクティビティを報告する pg_stat_replication_slots システムビューが追加されました。 (Masahiko Sawada, Amit Kapila, Vignesh C) (14)
  • スロットの統計情報は pg_stat_reset_replication_slot() 関数でリセットされます。

  • セッションメモリ使用量を報告する pg_backend_memory_contexts システムビューが追加されました。 (Atsushi Torikoshi, Fujii Masao) (14)
  • 任意のバックエンドのメモリコンテキストを出力するpg_log_backend_memory_contexts() 関数が追加されました。 (Atsushi Torikoshi) (14)
  • バックエンドの PID を引数に指定して関数を実行すると指定したバックエンドのメモリコンテキスト情報がPostgreSQL ログに出力されます。

  • pg_stat_database システムビューにセッション統計が追加されました。 (Laurenz Albe) (14)
  • セッション統計で追加された列は、session_time、active_time、idle_in_transaction_time、sessions、sessions_abandoned、sessions_fatal、sessions_killed です。

  • pg_prepared_statementsビューに汎用およびカスタムプランの数を報告する generic_plans 列と custom_plans 列が追加されました。 (Atsushi Torikoshi, Kyotaro Horiguchi) (14)
  • pg_locksビューにロック待機開始時間を表示する waitstart 列が追加されました。 (Atsushi Torikoshi) (14)
  • アーカイバプロセスが pg_stat_activityビューで表示されるようにしました。 (Kyotaro Horiguchi) (14)
  • WALレシーバーの終了待ち時間を報告するためのWalReceiverExit 待機イベントが追加されました。 (Fujii Masao) (14)
  • pg_stat_activityビューにおける IPC 待機イベント型に属します。

  • 関数およびプロシージャのデフォルト式で参照される列を追跡するために、情報スキーマビュー routine_column_usage が実装されました。 (Peter Eisentraut) (14)
認証
  • SSL証明書の識別名(DN)をクライアント証明書による認証で照合できるようになりました。 (Andrew Dunstan) (14)
  • これまではコモンネーム (CN) のみに対応していましたが、新しい pg_hba.conf のオプション clientname=DN を指定すると、CN だけでない証明書属性で比較して ident map と結びつけることができます。

  • pg_hba.conf および pg_ident.conf のレコードが複数の行にまたがることができるようになりました。 (Fabien Coelho) (14)
  • 行末でバックスラッシュを使用すると、レコードの内容を次の行に続けることができます。

  • 証明書失効リスト(CRL)ディレクトリの指定が可能になりました。 (Kyotaro Horiguchi) (14)
  • これは、ssl_crl_dir設定および libpq の接続オプションによって制御されます。以前は、ssl_crl_file設定で単一の CRLファイルのみ指定が可能でした。

  • 任意の長さのパスワードが使用可能になりました。 (Tom Lane, Nathan Bossart) (14)
  • これまで、様々なクライアントツールで 100文字までの制限があり、サーバ側に 1000文字程度で上限となる箇所がありました。

サーバ設定
  • アイドルセッションを閉じるための idle_session_timeout設定が追加されました。 (Li Japin) (14)
  • これは開いたトランザクション中のアイドルセッションを閉じるidle_in_transaction_session_timeout設定と似たものです。

  • checkpoint_completion_target設定パラメータのデフォルト値が 0.9 に変更されました。 (Stephen Frost) (14)
  • これまでのバージョンでのデフォルト値は 0.5 でした。

  • log_line_prefix設定の %P でパラレルワーカのパラレルグループリーダーのPID を報告できるようになりました。 (Justin Pryzby) (14)
  • unix_socket_directories設定でクォートされたパスの文字列をコンマ区切りで設定できるようになりました。 (Ian Lawrence Barwick) (14)
  • これまではすべてのパスが 1つのクォート文字列でなければなりませんでした。実行例を以下に示します。

    (13.x)
    db=# ALTER SYSTEM SET unix_socket_directories = '/path1', '/path2';
    ERROR:  SET unix_socket_directories takes only one argument
    
    (14.0)
    db=# ALTER SYSTEM SET unix_socket_directories = '/path1', '/path2';
    ALTER SYSTEM
    
  • 動的共有メモリを起動時に割り当てられるようになりました。 (Thomas Munro) (14)
  • 新たな設定 min_dynamic_shared_memory で制御します。これにより huge page をより多く使用できるようになります。

  • 新たな設定 huge_page_size で Linux の huge page のサイズを制御できるようになりました。 (Odin Ugedal) (14)

ストリーミングレプリケーションとリカバリ

  • pg_rewind のソースサーバとしてスタンバイサーバを指定できるようになりました。 (Heikki Linnakangas) (14)
  • サーバのリロードで restore_command設定を変更できるようになりました。 (Sergei Kornilov) (14)
  • これにより、restore_command に空文字を設定してリロードして、そこからは pg_walディレクトリからのリカバリだけをさせることも可能になりました。

  • 長時間のリカバリコンフリクトの待ち時間をログ報告するための新たな設定 log_recovery_conflict_waits が追加されました。 (Bertrand Drouvot, Masahiko Sawada) (14)
  • プライマリのパラメータ変更によってスタンバイがリカバリできなくなった場合に、ホットスタンバイサーバのリカバリを一時停止するようになりました。 (Peter Eisentraut) (14)
  • max_connections をスタンバイより多くする等の変更が該当します。
    以前は、このような場合にスタンバイは直ちにシャットダウンしていました。

  • リカバリ状態を報告する pg_get_wal_replay_pause_state() 関数が追加されました。 (Dilip Kumar) (14)
  • これは、既存の pg_is_wal_replay_paused() よりも詳細な情報が提供されます。

  • 読み取り専用の設定 in_hot_standby が追加されました。 (Haribabu Kommi, Greg Nancarrow, Tom Lane) (14)
  • クライアントはこれによりホットスタンバイサーバに接続しているかどうかを簡単に検出できます。

  • 巨大な共有バッファを持つサーバで、リカバリ中の小さいテーブルの切り詰めが高速化されました。 (Kirk Jamison) (14)
  • Linux でクラッシュリカバリ開始時にファイルシステム同期ができるようになりました。 (Thomas Munro) (14)
  • デフォルトでは、PostgreSQL はクラッシュリカバリ開始時にデータベースクラスタ内の各データファイルを開いて fsync します。新たな設定 recovery_init_sync_method に syncfs を指定すると、代わりに syncfs() でクラスタで使用される各ファイルシステムを同期します。これにより多くのデータベースファイルがあるシステムのリカバリが速くなります。

  • 指定されたトランザクションのコミットタイムスタンプとレプリケーションオリジンを返す pg_xact_commit_timestamp_origin() 関数が追加されました。 (Movead Li) (14)
  • pg_last_committed_xact() によって返されるレコードにレプリケーションオリジンが追加されました。 (Movead Li) (14)
  • レプリケーションオリジンの関数群が標準的な関数の権限制御を使用して制御されるようになりました。 (Martin Marques) (14)
  • これらの関数(pg_replication_origin_*() と pg_show_replication_origin_status())はスーパーユーザのみが実行可能ですが、以前はハードコードされていました。

ロジカルレプリケーション
  • ロジカルレプリケーションで、進行中の長いトランザクションをサブスクライバにストリーミングできるようになりました。 (Dilip Kumar, Amit Kapila, Ajin Cherian, Tomas Vondra, Nikhil Sontakke, Stas Kelvich) (14)
  • 以前は、logical_decoding_work_mem設定を超えるトランザクションは、トランザクションが完了するまでパブリッシャ側でディスクに書き込まれていました。

  • ロジカルレプリケーションの API が拡張され、大きな進行中のトランザクションをストリーミングできるようにしました。 (Tomas Vondra, Dilip Kumar, Amit Kapila) (14)
  • 出力関数は stream で始まります。test_decoding もこれらをサポートします。

  • ロジカルレプリケーションのテーブル同期中に複数のトランザクションを許容するようにしました。 (Peter Smith, Amit Kapila, Takamichi Osumi) (14)
  • サブトランザクションとトップレベルXID の関連付けを即座に WAL書き出しするようになりました。 (Tomas Vondra, Dilip Kumar, Amit Kapila) (14)
  • これはロジカルデコーディングで有用です。

  • 二相コミットを扱うために、ロジカルデコーディングの API が拡張されました。 (Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) (14)
  • これは pg_create_logical_replication_slot() 関数で制御されます。

  • ロジカルレプリケーションを使用している場合、DDLコマンド完了時に WAL にキャッシュ無効化メッセージを追加するようになりました。 (Dilip Kumar, Tomas Vondra, Amit Kapila) (14)
  • これにより、進行中のトランザクションのロジカルストリーミングが可能になります。ロジカルレプリケーションが無効であるときには、トランザクション完了時にのみ無効化メッセージが生成されます。

  • ロジカルデコーディングにおいてキャッシュ無効メッセージをより効率的に処理できるようになりました。 (Dilip Kumar) (14)
  • これにより、大量の DDL が存在する場合に、ロジカルデコーディングが効率的に動作するようになります。

  • ロジカルデコーディングのメッセージをレプリケーションストリームに送出するかどうか、制御できるようになりました。 (David Pirotte, Euler Taveira) (14)
  • そのためにプロトコルが拡張されました。

  • ロジカルレプリケーションのサブスクリプションがバイナリ転送モードを使用できるようになりました。 (Dave Cramer) (14)
  • これはテキストモードよりも高速ですが、堅牢性は若干劣ります。

  • ロジカルデコーディングを XID でフィルタできるようになりました。 (Markus Wanner) (14)

SELECT/INSERT

  • AS 無しでは列ラベルとして使用できないキーワード数が減りました。 (Mark Dilger) (14)
  • 制限されるキーワードが 90% 少なくなりました。

  • JOIN の USING句に別名を指定できるようになりました。 (Peter Eisentraut) (14)
  • 別名は USING句の後に AS と書くことで作成されます。これはマージされた USING列のテーブル修飾として使用でます。

    (使用例)
    db=# CREATE TABLE t87a (id int, idsub int, v text);
    db=# CREATE TABLE t87b (id int, idsub int, v text);
    db=# INSERT INTO t87a VALUES (1, 1, 'A');
    db=# INSERT INTO t87b VALUES (1, 1, 'B');
    db=# SELECT x.* FROM t87a JOIN t87b USING (id, idsub) AS x;
     id | idsub
    ----+-------
      1 |     1
    (1 row)
    
  • 重複する GROUPING SET の組み合わせを削除するために、GROUP BY に DISTINCT を付加できるようになりました。 (Vik Fearing) (14)
  • 例えば、GROUP BY CUBE (a,b), CUBE (b,c) は、DISTINCT がないと重複した GROUPING SET の組み合わせを生成します。

  • INSERT における複数行の VALUESリストの DEFAULTエントリを適切に取り扱うようになりました。 (Dean Rasheed) (14)
  • このような場合、以前はエラーが発生していました。

    (13.x での挿入に失敗する例)
    db=# CREATE TABLE t89 (id int generated always as identity);
    db=# INSERT INTO t89 VALUES (DEFAULT), (DEFAULT);
    ERROR:  cannot insert into column "id"
    DETAIL:  Column "id" is an identity column defined as GENERATED ALWAYS.
    HINT:  Use OVERRIDING SYSTEM VALUE to override.
    (OVERRIDING USER VALUE は DEFAULT 以外を指定する際に使うものなので HINT も不適切)
    
  • 共通テーブル式に対する SQL標準の SEARCH句 と CYCLE句が追加されました。 (Peter Eisentraut) (14)
  • 既存の構文を使用しても同じ結果が得られますが、非常に不便でした。

  • ON CONFLICT の WHERE句の列名をテーブル修飾できるようになりました。 (Tom Lane) (14)
  • ただし、参照できるのは対象のテーブルのみです。

ユーティリティーコマンド

  • REFRESH MATERIALIZED VIEW が並列処理できるようになりました。 (Bharath Rupireddy) (14)
  • REINDEX が新しいインデックスのテーブル空間を変更できるようになりました。 (Alexey Kondratov, Michael Paquier, Justin Pryzby) (14)
  • REINDEX に TABLESPACE句を指定して変更できます。reindexdbコマンドには --tablespace オプションが追加されました。

  • REINDEX がパーティショニングされたリレーションのすべての子テーブルやインデックスを処理できるようになりました。 (Justin Pryzby, Michael Paquier) (14)
  • これまではパーティションテーブル全体に対して REINDEX を使用できず、個々のパーティションやインデックスに対して実行する必要がありました。

  • CONCURRENTLY を使用するインデックスコマンドが、CONCURRENTLY を使用する他の操作の完了を待たずに処理できるようになりました。 (Alvaro Herrera) (14)
  • バイナリモードでの COPY FROM のパフォーマンスが改善されました。 (Bharath Rupireddy, Amit Langote) (14)
  • ビュー定義における SQL定義関数に対して SQL標準構文を保持するようになりました。 (Tom Lane) (14)
  • これまでは、EXTRACT(.. from ..) のような SQL標準関数の呼び出しは、単純な関数呼び出しの構文で表示されていました。 ビューやルールを表示する際に、元の構文が保持されるようになりました。

  • GRANT と REVOKE に SQL標準の GRANTEDBY句が追加されました。 (Peter Eisentraut) (14)
  • CREATE TRIGGER に OR REPLACE オプションを追加されました。 (Takamichi Osumi) (14)
  • これにより既存のトリガを条件付きで置き換えられます。

  • TRUNCATE で外部テーブルを操作できるようになりました。 (Kazutaka Onishi, Kohei KaiGai) (14)
  • postgres_fdw モジュールもこれをサポートするようになりました。

  • サブスクリプションに対するパブリケーション追加や削除がより容易にできるようになりました。 (Japin Li) (14)
  • 新しい構文は ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION です。これにより、エントリーを追加、削除するためにすべてのパブリケーションを指定する必要がなくなりました。

  • システムカタログに主キー、一意性制約、および外部キーが追加されました。 (Peter Eisentraut) (14)
  • これらの変更は、GUIツールがシステムカタログを分析するのに役立ちます。カタログの既存の一意性インデックスには、UNIQUE または PRIMARY KEY制約が関連付けられました。外部キーの関係は実際には制約として格納されたり実装されたりしませんが、pg_get_catalog_foreign_keys() 関数から表示用に取得できます。

  • CURRENT_USER が受け入れられるすべての場所で CURRENT_ROLE も受け入れられるようになりました。 (Peter Eisentraut) (14)

データ型

  • 拡張および組み込みのデータ型で添字を実装できるようになりました。 (Dmitry Dolgov) (14)
  • これまでは添字の処理はサーバーにハードコードされていたため、添字は配列型にしか適用できませんでした。この変更により、概念が意味を持つ任意の型の値の一部を抽出または割り当てるために、添字表記を使用できるようになりました。

  • JSONB に添字が利用できるようになりました。 (Dmitry Dolgov) (14)
  • JSONB の添字を使用して、JSONBドキュメントの一部を抽出したり割り当てたりできます。

  • マルチ範囲データ型のサポートが追加されました。 (Paul Jungwirth, Alexander Korotkov) (14)
  • これは範囲データ型と似ていますが、順序付けられた重ならない複数の範囲を指定できます。関連するマルチ範囲型はすべての範囲型に対して自動的に作成されます。

  • アルメニア語、バスク語、カタロニア語、ヒンディー語、セルビア語、イディッシュ語の語幹処理がサポートされました。 (Peter Eisentraut) (14)
  • tsearchデータファイルが無制限の行長を持てるようになりました。 (Tom Lane) (14)
  • 以前の制限は 4KB でした。 また、関数 t_readline() を削除しました。

  • numericデータ型で Infinity と -Infinity がサポートされました。 (Tom Lane) (14)
  • 浮動小数点データ型ではこれらを既にサポートしています。

  • point に対する演算子 <<| および |>> が追加され、厳密に上か下かを表せるようになりました。 (Emre Hasegeli) (14)
  • 以前は、これらは <^ と >^ と呼ばれていましたが、この命名は他の幾何学的データ型と一貫性がありませんでした。以前の名前も利用可能ですが、いつかは削除されるかもしれません。

  • LSN と数値 (byte) とを加算、減算する演算子が追加されました。 (Fujii Masao) (14)
  • (このような演算が可能になります)
    db=# SELECT '0/16AE7F7'::pg_lsn - 16::numeric;
     ?column?
    -----------
     0/16AE7E7
    (1 row)
    
  • 配列とレコードについて、データ型の OID の不一致に寛容なバイナリデータ転送ができるようになりました。 (Tom Lane) (14)
  • システムカタログ用の複合配列型が作成されるようになりました。 (Wenjing Zeng) (14)
  • ユーザ定義のリレーションについては、複合型とその配列型が関連付けられて作成されていました。本バージョンからシステムカタログも同様になりました。

    この変更により、シングルユーザーモードでユーザー定義テーブルを作成すると、複合配列型の作成に失敗するという不整合も修正されました。

関数

  • SQL 言語の関数およびプロシージャの関数本体で、SQL 標準を使用できるようになりました。 (Peter Eisentraut) (14)
  • これまでは、文字列リテラルの関数本体のみがサポートされていました。 SQL 標準の構文で関数やプロシージャを書く場合、本体は直ちに解析され、解析ツリーとして保存されます。これにより、関数の依存関係をより正確に追跡でき、セキュリティ上の利点もあります。

  • プロシージャが OUT パラメータを持てるようになりました。 (Peter Eisentraut) (14)
  • いくつかの配列関数が、互換性のあるデータ型の組み合わせで操作できるようにしました。 (Tom Lane) (14)
  • 関数 array_append()、array_prepend()、array_cat()、array_position()、array_positions()、array_remove()、array_replace()、width_bucket() は、anyarray 引数の代わりに anycompatiblearray を取るようになりました。 これにより、引数の型が完全に一致しているかどうかを気にする必要がなくなりました。

  • SQL標準の trim_array() 関数が追加されました。 (Vik Fearing) (14)
  • これはすでに配列スライスで行えましたが、あまり簡単ではありませんでした。

  • bytea型に対する ltrim() および rtrim() 関数が追加されました。 (Joel Jacobson) (14)
  • split_part() で負の添字がサポートされました。 (Nikhil Benesch) (14)
  • 負の値は最後のフィールドから始まり、逆に数えます。

  • 文字列をデリミタで分割する string_to_table() 関数が追加されました。 (Pavel Stehule) (14)
  • これは regexp_split_to_table() 関数と似たものです。

  • ユニコード文字を文字列のバックスラッシュ16進エスケープとして指定できるunistr() 関数が追加されました。 (Pavel Stehule) (14)
  • これはユニコードをリテラル文字列で指定する方法と似ています。

    (実行例を示します)
    db=# SELECT 'Japanese : ' || unistr( '\65E5\672C\8A9E' ) AS unicode_test_string;
     unicode_test_string
    ---------------------
     Japanese : 日本語
    
  • ビットごとの排他的論理和(XOR)を計算する bit_xor() 集約関数が追加されました。 (Alexey Bashtanov) (14)
  • すでに bit_and() と bit_or() は存在しています。順序付けられていない値のチェックサムとして役立ちます。

  • ビットまたはバイト文字列のビット数を返す bit_count() 関数が追加されました。 (David Fetter) (14)
  • date_bin() 関数が追加されました。 (John Naylor) (14)
  • この関数は入力されたタイムスタンプをビン化します。即ち、指定された起点からの同一長に揃えられた区間にグループ分けします。

    (実行例: '2020-02-11 15:34:17' が属するグループの先頭タイムスタンプが返る)
    =# SELECT date_bin('15 minutes', '2020-02-11 15:34:17', '2001-01-01');
          date_bin
    ------------------------
     2020-02-11 15:30:00+09
    (1 row)
    
  • make_timestamp() 関数および make_timestamptz() 関数で負の年を指定できるようになりました。 (Peter Eisentraut) (14)
  • 負の値は紀元前 (BC) として解釈されます。

  • より新しい正規表現構文が substring() に追加されました。 (Peter Eisentraut) (14)
  • 新しい SQL標準構文は SUBSTRING(text SIMILAR pattern ESCAPE escapechar) です。以前の標準構文は SUBSTRING(text FROM pattern FOR escapechar) でしたが、これは PostgreSQL で引き続き受け入れられます。

  • 正規表現のブラケットの中で補完文字クラスのエスケープである \D、\S、\W が使えるようになりました。 (Tom Lane) (14)
  • 正規表現の文字クラスとして [[:word:]] が追加されました。これは \w と等価です。 (Tom Lane) (14)
  • ウィンドウ関数 lead() および lag() のデフォルト値に、より柔軟なデータ型が使えるようになりました。従来は anyelement 疑似データ型でしたが、anycompatible 疑似データ型に変更されました。 (Vik Fearing) (14)
  • ゼロではない浮動小数点値を無限大で割り算するとゼロを返すようになりました。 (Kyotaro Horiguchi) (14)
  • 以前はこれを実行するとアンダーフローエラーが発生していました。

  • NaN をゼロで浮動小数点除算をすると NaN を返すようになりました。 (Tom Lane) (14)
  • 以前はエラーになっていました。

  • 負の無限大の指数に対する exp() と power() はゼロを返すようになりました。 (Tom Lane) (14)
  • 以前はしばしばアンダーフローエラーを返しました。

  • 無限大を引数にとる幾何計算の精度が向上しました。 (Tom Lane) (14)
  • 組み込みの型強制関数が可能な限り LEAKPROOF として印付けされました。 (Tom Lane) (14)
  • 対象の関数では pg_proc カタログの proleakproof列が 't' に設定されます。これにより、セキュリティが重要な状況で、型変換を必要とする関数をより多く使用できるようになります。

  • pg_describe_object()、pg_identify_object()、pg_identify_object_as_address() 関数がオブジェクトが存在しない場合に常に役に立つエラーメッセージを返すようになりました。 (Michael Paquier) (14)

PL/pgSQL

  • PL/pgSQL の「=」式および代入の解析が改善されました。 (Tom Lane) (14)
  • この変更により、配列のスライスと入れ子になったレコードフィールドへの代入が可能になりました。

    (以下のような実行が可能になります)
    db=# CREATE TYPE typ136 AS (x int, y int);
    db=# DO $$ DECLARE a typ136[];
               BEGIN
                 a := ARRAY[(1,2)::typ136,(3,4)::typ136];
                 a[2:3] := ARRAY[(5,6)::typ136,(7,8)::typ136];
                 a[1].x = 0;
                 RAISE NOTICE 'a = %', a;
               END $$;
    NOTICE:  a = {"(0,2)","(5,6)","(7,8)"}
    
  • plpgsql の RETURN QUERY が並列処理でクエリを実行できるようになりました。 (Tom Lane) (14)
  • カーソルを使用しないように変更することで実現されています。

  • PL/pgSQL のプロシージャ内で繰り返される CALL の性能が改善されました。 (Pavel Stehule, Tom Lane) (14)

クライアントインタフェース

  • libpq にパイプラインモードが追加されました。 (Craig Ringer, Matthieu Garrigues, Alvaro Herrera) (14)
  • 複数のクエリを送信し、特定の同期メッセージが送信された時にのみ完了を待機することができるようになりました。

  • libpq の target_session_attrs パラメータオプションが拡張されました。 (Haribabu Kommi, Greg Nancarrow, Vignesh C, Tom Lane) (14)
  • 新しいオプションは read-only、primary、standby、prefer-standby です。

  • libpq の PQtrace() の出力フォーマットが改善されました。 (Aya Iwata, Alvaro Herrera) (14)
  • 従来のバイトレベルの出力形式から、論理メッセージレベルの出力に変換されることでより使いやすくなりました。

  • ECPG の SQL識別子を特定の接続に結びつけできるようになりました。 (Hayato Kuroda) (14)
  • これは DECLARE … STATEMENT で行うことができます。

    クライアントアプリケーション

  • vacuumdb でインデックスのクリーンアップと切り詰めを省略できるようになりました。 (Nathan Bossart) (14)
  • オプションは --no-index-cleanup と --no-truncate です。

  • pg_dump で特定の拡張機能だけをダンプできるようになりました。 (Guillaume Lelarge) (14)
  • --extension オプションで指定します。

  • pgbench に値をランダムにシャッフルする permute() 関数が追加されました。 (Fabien Coelho, Hironobu Suzuki, Dean Rasheed) (14)
  • 以前は hash() 関数が推奨されていましたが、衝突により分布が変化する可能性がありました。

  • pgbench で -C を付けて再接続オーバヘッドを計測するときに切断時間を含むようになりました。 (Yugo Nagata) (14)
  • 詳細オプション(-v) を複数指定してログの詳細度を増やす指定ができるようになりました。 (Tom Lane) (14)
  • この機能は pg_dump、pg_dumpall、pg_restore で使用可能です。

psql
  • psql の \df と \do コマンドで関数と演算子の引数の型を指定できるようになりました。 (Greg Sabino Mullane, Tom Lane) (14)
  • これにより、オーバーロードされた名前に一致して出力される件数を減らすことができます。

  • psql の \d[i|m|t]+ の出力にアクセスメソッドの列が追加されました。 (Georgios Kokolatos) (14)
  • psql の \dt と \di で TOASTテーブルとそのインデックスを表示できるようになりました。 (Justin Pryzby) (14)
  • これまでは \d では表示できても、\dt、\di を使うと「Did not find any relation named ...」が返っていました。

  • 拡張統計オブジェクトを表示する psql コマンドの \dX が追加されました。 (Tatsuro Yamada) (14)
  • 配列の構文やバックエンド文法のエイリアスを理解できるように psql の \dT が修正されました。 (Greg Sabino Mullane, Tom Lane) (14)
  • たとえば int を integer と解釈するようになります。

  • psql で \e や \ef 、\ev を使用して過去のクエリやファイルを編集している時に、保存せずエディタを終了した場合、結果を無視するようになりました。 (Laurenz Albe) (14)
  • 以前はこのような操作を行うと、過去のクエリをクエリバッファに読み込み、通常すぐに実行していましたが、これはユーザが望む動作ではないと判断されました。

  • psql のタブ補完機能が改善されました。 (Vignesh C, Michael Paquier, Justin Pryzby, Georgios Kokolatos, Julien Rouhaud) (14)

サーバアプリケーション

  • 多数のリレーションに対する contrib/amcheck テストを簡単に実行できるコマンドラインユーティリティ pg_amcheck が追加されました。 (Mark Dilger) (14)
  • initdb に --no-instructions オプションが追加されました。 (Magnus Hagander) (14)
  • 通常出力されるサーバ起動の説明が抑制されます。

  • pg_upgrade が analyze_new_clusterスクリプトを作成しなくなりました。 (Magnus Hagander) (14)
  • その代わりに同等の vacuumdbコマンドを実行するようになりました。

  • postmaster の -o オプションが削除されました。 (Magnus Hagander) (14)
  • 既にすべてのオプションは直接指定が可能となっているため、この -o オプションは不要でした。

ドキュメント

  • 「デフォルトロール(Default Roles)」が「事前定義済ロール(Predefined Roles)」に変更されました。 (Bruce Momjian, Stephen Frost) (14)
  • factorial() 関数のドキュメントが追加されました。 (Peter Eisentraut) (14)
  • このリリースで ! 演算子は削除されたので、factorial() は階乗を計算する唯一の方法になりました。

ソースコード

  • configure オプションの --with-ssl={openssl} で、使用する SSLライブラリを選べるようになりました。 (Daniel Gustafsson, Michael Paquier) (14)
  • 互換性維持のため --with-openssl も使用可能です。

  • 抽象名前空間の Unixドメインソケットをサポートするようになりました。 (Peter Eisentraut) (14)
  • 現在は Linux と Windows で利用可能で、@ (アットマーク)で始まる名前を使用します。

  • Windows で 4GB を超えるファイルを適切に扱えるようになりました。 (Juan Jose Santamaria Flecha) (14)
  • 例えば、COPY で扱うファイルや WALファイル、リレーションセグメントファイルを4GB 以上にすることが可能になります。

  • テストを目的としてキャッシュフラッシュを制御する設定 debug_discard_caches が追加されました。 (Craig Ringer) (14)
  • 以前、この動作はコンパイル時にのみ設定可能でした。initdb 時に制御したい場合には新たな --discard-caches オプションを使用します。

  • valgrind のエラー検出機能で様々な改善が実施されました。 (Alvaro Herrera, Peter Geoghegan) (14)
  • valgrind はメモリデバッグなどの機能を有する動的解析ツールです。

  • 正規表現パッケージのテストモジュール test_regex が追加されました。 (Tom Lane) (14)
  • LLVM バージョン 12 がサポートされました。 (Andres Freund) (14)
  • OpenSSL の EVP API を使うために SHA1 と SHA2、MD5 のハッシュ計算が変更されました。 (Michael Paquier) (14)
  • これはより現代的で FIPSモードをサポートします。

  • ビルド時に SSLライブラリから独立して乱数発生器を選択する機能が削除されました。 (Daniel Gustafsson) (14)
  • 現在は常に SSLライブラリの選択によって決定されます。

  • EUC_TW と Big5 エンコーディング間の直接変換ルーチンが追加されました。 (Heikki Linnakangas) (14)
  • FreeBSD について照合順序のバージョンに対応しました。 (Thomas Munro) (14)
  • インデックスアクセスメソッドの API に amadjustmembers が追加されました。 (Tom Lane) (14)
  • これによりインデックスアクセスメソッドは、新しい演算子クラスまたは演算子族の作成中における有効性チェックが可能になりました。

  • 最近追加された libpq 機能について、libpq-fe.h に機能テスト用マクロが提供されました。 (Tom Lane, Alvaro Herrera) (14)
  • 歴史的にアプリケーションは通常 PG_VERSION_NUM のコンパイル時チェックを使用して、ある機能が利用可能かどうかを調べてきました。 しかしこれは通常はサーバのバージョンであり、libpq のバージョンにはよくない目安かもしれません。libpq-fe.h は、v14 で追加されたアプリケーションから見える機能を示すそのような機能のシンボルを追加し続けることです。

  • hstore型の値で添字が利用可能になりました。 (Tom Lane, Dmitry Dolgov) (14)
  • pg_trgm の GiST/GINインデックスで等価検索を行えるようになりました。 (Julien Rouhaud) (14)
  • これはワイルドカードを使用しない LIKE と似ています。

  • cubeデータ型をバイナリモードで転送できるようになりました。 (KaiGai Kohei) (14)
  • pgstattuple_approx() 関数で TOASTテーブルが表示可能となりました。 (Peter Eisentraut) (14)
  • 行の可視性を変更できる contribモジュール pg_surgery が追加されました。 (Ashutosh Sharma) (14)
  • これはデータベースの破損を修正するのに役立ちます。

  • old_snapshot_threshold 設定が有効であるときに XID と日時のマッピングを報告する、contribモジュール old_snapshot が追加されました。 (Robert Haas) (14)
  • amcheck がヒープページもチェックできるようになりました。 (Mark Dilger) (14)
  • pageinspect が GiSTインデックスを検査できるようになりました。 (Andrey Borodin, Heikki Linnakangas) (14)
  • pageinspect の各関数におけるブロック番号(blkno)引数が bigint型になりました。 (Peter Eisentraut) (14)
  • nbtree_gist の各関数がパラレルセーフと印付けされました。 (Steven Winfield) (14)
  • 関数の実装自体に変更はありません。

contrib拡張

pg_stat_statements
  • 問い合わせのハッシュ計算の実装コードが pg_stat_statements からPostgreSQL本体に移されました。 (Julien Rouhaud) (14)
  • 新たな設定 compute_query_id がデフォルトの「auto」である場合、pg_stat_statement がロードされると自動的にクエリID の計算が有効になります。

  • pg_stat_statements がトップの文と入れ子の文を分けて記録するようになりました。 (Julien Rohaud) (14)
  • これまでは、全ステートメントを記録するとき、同一のトップおよび入れ子の文が単一エントリとして記録されました。

    例えば、pg_stat_statements.track = all であるとき、「DO $$ BEGIN DELETE FROM t185; END; $$ LANGUAGE plpgpsql;」の実行に対して、ps_stat_statementsビューで query列に「DO $$ BEGIN DELETE FROM t185; END; $$ LANGUAGE plpgpsql;」を持つ行と、「DELETE FROM t185;」を持つ行の両方が現れるようになります。後者はトップレベルでの「DELETE FROM t185;」の記録とは区別されます。

  • pg_stat_statements でユーティリティコマンドの処理行数が記録されるようになりました。 (Fujii Masao, Katsuragi Yuta, Seino Yuki) (14)
  • COPY、FETCH、CREATE TABLE AS、CREATE/REFRESH MATERIALIZED VIEW などが該当します。

  • pg_stat_statements の動作状況を参照できる、システムビュー pg_stat_statements_info が追加されました。 (Katsuragi Yuta, Yuki Seino, Naoki Nakamichi) (14)
postgres_fdw
  • postgres_fdw が一括で行を INSERT できるようになりました。 (Takayuki Tsunakawa, Tomas Vondra, Amit Langote) (14)
  • これまで、リモート側では 1行ずつINSERT文を実行していました。

  • postgres_fdw が「IMPORT FOREIGN SCHEMA」の「LIMIT TO」句で明示した指定したテーブルのパーティションを取り込みできるようになりました。 (Matthias van de Meent) (14)
  • 指定が無い場合にはパーティションテーブルのルートテーブルだけが取り込まれます。

  • postgres_fdw にオープン中の外部サーバ接続を報告する関数 postgres_fdw_get_connections() が追加されました。 (Bharath Rupireddy) (14)
  • トランザクション改良後に外部サーバが接続をオープンしたまま維持するかを、制御できるようになりました。 (Bharath Rupireddy) (14)
  • keep_connections オプションで制御します。デフォルトは on です。

  • postgres_fdw が必要に応じて外部サーバ接続の再確立を行えるようになりました。 (Bharath Rupireddy) (14)
  • 保持していた接続が無効であるとき、接続し直す動作をするようになります。これまでは外部テーブルアクセスエラーを起こしていました。

  • postgres_fdw でキャッシュされた接続を廃棄する関数 postgres_fdw_disconnect()、postgres_fdw_disconnect_all() が追加されました。 (Bharath Rupireddy) (14)

リリースノートに記載の無い変更点

  • システムビュー pg_stat_all_tables および pg_stat_user_tables 等の派生ビューでパーティションテーブルのエントリも含まれるようになりました。
  • 自動ANALYZE でパーティションテーブル(宣言的パーティションニングにおける親テーブル)も処理するために追加されました。その後、パーティションテーブルへの自動ANALYZE 対応は 14.0 バージョンがリリースされる前に機能取り下げになりましたが、システムビューの変更はそのまま採用されました。