PostgreSQL 15 に関する技術情報

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

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

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

  • MERGE文のサポート
  • 正規表現関数の追加
  • 論理レプリケーションの機能追加
  • 呼び出し元権限で実行するビュー
  • 外部ソートアルゴリズム変更
  • ウィンドウ関数の性能改善
  • \copy FROM の性能改善
  • Zstandard圧縮サポート
  • JSON形式ログ
  • 実行時統計情報の共有メモリ化
  • モジュールによるWALアーカイブとベースバックアップ

バージョン15への移行/互換性のない変更点

  1. publicスキーマにおける PUBLIC むけ作成権限が取り除かれました。 (Noah Misch) (15)
  2. 新たなデフォルトは CVE-2018-1058 に対するセキュリティリリース以降で推奨されている安全なスキーマ使用パターン(*1) の1つです。初期状態で publicスキーマへの作成権限はデータベース所有者にのみ付与されます(次項参照)。

    この変更は、新データベースクラスタと、既存データベースクラスタの新データベースに適用されます。pg_upgrade でアップグレードしたデータベースクラスタや、ダンプからリストアしたデータベースでは、従来の権限設定が維持されます。

    複数ユーザから使用される既存データベースに対しては、新たなデフォルトに合わすため、publicスキーマへの CREATE権限を REVOKEすることを検討してください。内部の脅威から防御する必要の無い新データベースには、CREATE権限を GRANTすることで以前のリリースの振る舞いが得られます。

    *1: https://www.postgresql.org/docs/15/ddl-schemas.html#DDL-SCHEMAS-PATTERNS

  3. publicスキーマの所有者が pg_database_owner ロールに変更されました。 (Noah Misch) (15)
  4. これにより、各データベースの所有者が各データベース内の publicスキーマの所有者権限を持つようになります。これまでは、initdb時のスーパーユーザが所有者で、非スーパーユーザのデータベース所有者は何もできませんでした。

    この変更は、新データベースクラスタと、既存データベースクラスタの新データベースに適用されます。pg_upgrade でアップグレードしたデータベースクラスタや、ダンプからリストアしたデータベースでは、元の所有者指定が維持されます。

  5. 長らく非推奨となっていたベースバックアップの排他的バックアップ方式が廃止されました。 (David Steele, Nathan Bossart) (15)
  6. データベースサーバの突発停止が生じたとき、排他的バックアップの途中であると、次のサーバ起動に失敗するおそれがありました。非排他バックアップ方式は全ての点でより優れていると考えられます。関数 pg_start_backup()/pg_stop_backup() は pg_backup_start()/pg_backup_stop() に名称変更されました。また、関数 pg_backup_start_time() および pg_is_in_backup() は廃止されました。

  7. hash_mem_multiplier 設定のデフォルトが 1.0 から 2.0 に変更されました。 (Peter Geoghegan) (15)
  8. これにより、ハッシュ操作がソート等の他の操作よりも多くのワークメモリ(work_mem 設定で制御されるメモリ)を使えるようになります。

  9. サーバ側手続き言語 plpython2u と plpythonu が廃止されました。 (Andres Freund) (15)
  10. Python 2.x は既にサポート終了となっています。plpythonu の当初の意図は、plpython3u を指すようにできるというものでしたが、そのように変えると問題を引き起こしそうであるため、単に削除されました。

  11. array_to_tsvector() 関数に空文字列の配列要素を渡した場合に、エラーを出すようになりました。 (Jean-Christophe Arnu) (15)
  12. 空文字列の語彙素はあり得ないため、これは禁止されます。そのようなデータはダンプ/リストアに失敗したり、誤った結果をもたらすため、以前のバージョンの PostgreSQL の利用者はバージョンアップに際して、空の語彙素が格納されていないことを確認する必要があります。

  13. chr() 関数が負の値の引数について明示的なエラーを出すようになりました。 (Peter Eisentraut) (15)
  14. これまでは負の値が符号無し整数の大きな値として解釈されていました。

  15. CREATE OR REPLACE VIEW で出力列の照合順序の変更が禁止されました。 (Tom Lane) (15)
  16. これまではエラーも出ませんが、正しく動作もしませんでした。

  17. ecpg でゼロ長のユニコード識別子(例: U&"")が禁止されました。 (Peter Eisentraut) (15)
  18. ユニコード以外でのゼロ長識別子は以前から禁止されていました。

  19. 数値リテラルの後に続く非数値文字が禁止されました。 (Peter Eisentraut) (15)
  20. これまでは「123abc」のような文字列は「123」とそれに続く「abc」という2つのトークンとして解釈されていました。

    (以下は従来動作/バージョン15ではエラーになる)
    db=# SELECT 123abc;
     abc
    -----
     123
    (1 row)
    
  21. JSON の数値リテラルの処理が SQL/JSON標準に適合するように変更されました。 (Peter Eisentraut) (15)
  22. 「.1」や「1.」 のような数値書式を受け付けるようになります。また、「1.type()」のような数値リテラルにメソッドが続く書き方は禁止されます。

    (バージョン14 では以下は動作する)
    db=# SELECT jsonb_path_query('["dummy"]'::jsonb, '1.type()');
     jsonb_path_query
    ------------------
     "number"
    (1 row)
    
    (バージョン15 ではエラーになる)
    ERROR:  trailing junk after numeric literal at or near "1.t" of jsonpath input
    
  23. interval型の入力が月より大きい単位について小数値を持つとき、最も近い月にまるめるようになりました。 (Bruce Momjian) (15)
  24. 例えば、'1.99 years' は '2 years' になります。以前は切り捨てて '1 year 11 months' になりました。

  25. interval型の末尾のピリオドの解析について一貫性が改善されました。 (Tom Lane) (15)
  26. 末尾にピリオドがある数が一部プラットフォーム(AIXなど)で拒絶されていました。

  27. 設定 IntervalStyle に影響を受けるため、interval型の出力関数が IMMUABLE から STABLE に変更されました。 (Tom Lane) (15)
  28. これにより、例えば interval型の値のテキスト出力に依存したインデックスの作成は、以下のようにエラーになります。

    db=# CREATE INDEX ON t14 ((interval_col::text));
    ERROR:  functions in index expression must be marked IMMUTABLE
    
  29. interval型の調整関数で整数オーバーフローを検知してエラーを出すようになりました。 (Joe Koshakow) (15)
  30. 動作が変わる関数は、justify_interval()、justify_hours()、justify_days() です。これまでは(正負が反転するなど)誤った結果を出力していました。

  31. 非ASCII文字に対する "char" 型の出入力書式が変更されました。 (Tom Lane) (15)
  32. ハイビットを持つバイトはバックスラッシュと 3桁の 8進数で出入力されるようになります。これにより、文字エンコーディングの問題を回避します。従来はそのままのバイト列で出入力されていました。

  33. ログインロールが自身のロールメンバーシップに対して持つ、デフォルトの ADMIN OPTION権限が取り除かれました。 (Robert Haas) (15)
  34. これまでは、ログインロールは ADMIN OPTION権限が無くとも、自身のロールにメンバーを追加/削除することができました。

  35. ロジカルレプリケーションがサブスクリプションの所有者として実行されるようになりました。 (Mark Dilger) (15)
  36. 行単位セキュリティポリシーが検査されないため、スーパーユーザやbypassrls 属性を持つロール、テーブルの所有者のみが、行単位セキュリティポリシーを持つテーブルにレプリケーションできるようになります。

    これまでは、そのような権限を持たないロールが所有者であるサブスクリプションが、行単位セキュリティを迂回できていました。

  37. サブスクリプションの所有者が SELECT権限を持たない場合には、テーブルに対する UPDATE と DELETE のロジカルレプリケーション操作ができないようになりました。 (Jeff Davis) (15)
  38. UPDATE と DELETE はテーブルの読み込みも伴いますので、サブスクリプション所有者にはテーブルの SELECT権限も必要です。

  39. EXPLAIN がセッションの一時オブジェクトのスキーマを参照しているとき、pg_temp として参照するようになりました。 (Amul Sul) (15)
  40. これまでは実際のスキーマ名を報告しており、セッション間で一時スキーマ名が一致しない結果になりました。

  41. pg_statio_all_tables が 複数インデックスを伴う TOASTテーブルという稀な場合の値も集計するように、修正されました。 (Andrei Zubkov) (15)
  42. これまでは、そのような場合については各インデックス毎に 1行があらわれていました。

  43. プレフィックスがインストールされた拡張の名前と一致するけれども、その拡張によって宣言された変数ではないカスタム設定変数を設定することが禁止されました。 (Florin Irion, Tom Lane) (15)
  44. この変更により、そのような既存の設定変数は拡張をロードする際に削除されることになります。また、セッション中でそのような設定変数を追加するとエラーになります。これは設定変数が拡張に関連付けられているかどうかについて混乱を防ぐ狙いです。

  45. もはや使われない設定 stats_temp_directory が廃止されました。 (Andres Freund, Kyotaro Horiguchi) (15)
  46. random() の計算に使われるアルゴリズムが改善されました。 (Fabien Coelho) (15)
  47. これにより、同じシード値であっても random() 出力が以前のバージョンとは違うものになります。

  48. libpq の PQsendQuery() 関数がパイプラインモードではサポートされなくなりました。 (Alvaro Herrera) (15)
  49. この組み合わせを使うアプリケーションは、代わりに PQsendQueryParams() を使うように修正する必要があります。

  50. Windows以外のプラットフォームで、ホームディレクトリを調べるためにHOME環境変数を調べるようになりました。 (Anders Kaseorg) (15)
  51. HOME が空や未定義の場合には、従来の <pwd.h> のデータベースを検査する方法に戻ります。この変更は libpq と様々な付属クライアントアプリケーションプログラムで(例えば ~/,pgpass を見つけるときに)影響があります。

  52. pg_dump の --no-synchronized-snapshots オプションが廃止されました。 (Tom Lane) (15)
  53. サポート中のバージョンはいずれも同期スナップショットをサポートしているため、本オプションはもはや必要ありません。

  54. psql の --single-transaction モードでエラーが検出された後、ON_ERROR_STOP が設定されている場合に限って、最後の COMMIT コマンドを ROLLBACK に変更するようになりました。 (Michael Paquier) (15)
  55. 以前は、この場合には ON_ERROR_STOP 設定にかかわらず ROLLBACK されました。

  56. postgres_fdw から送られる問い合わせで、不要な定数のキャストを回避するようになりました。 (Dian Fay) (15)
  57. ローカルとリモートで列の型を意図的に違ったものにしているときに、このようなキャストはエラーを引き起こす可能性がありました。

    (14以前バージョンのエラー発生例)
    db2=# CREATE TABLE public.t29 (id int, v int);
    
    db1=# CREATE SERVER sv_db2 FOREIGN DATA WRAPPER postgres_fdw
            OPTIONS (host 'localhost', dbname 'db2');
    db1=# CREATE USER MAPPING FOR postgres SERVER sv_db2 OPTIONS (user 'postgres');
    db1=# CREATE FOREIGN TABLE ft29 (id int, v text) -- v列の型を変更
            SERVER sv_db2 OPTIONS (schema_name 'public', table_name 't29');
    db1=# explain (verbose, costs off) SELECT * FROM ft29 WHERE v = '1';
                                 QUERY PLAN
    --------------------------------------------------------------------
     Foreign Scan on public.ft29
       Output: id, v
       Remote SQL: SELECT id, v FROM public.t29 WHERE ((v = '1'::text))
    (3 rows)
    
    db1=# SELECT * FROM ft29 WHERE v = '1';
    ERROR:  operator does not exist: integer = text
    
  58. xml2 の xml_is_well_formed() 関数が廃止されました。 (Tom Lane) (15)
  59. この関数は PostgreSQL 9.1 以降では本体に含まれています。

  60. カスタムスキャンプロバイダがプロジェクション(射影)をサポートするかどうかを示すことができるようになりました。 (Sven Klemm) (15)
  61. デフォルトではプロジェクションをサポートとないものとされています。サポートしているプロバイダは、本リリースに合わせた更新が必要です。

変更点

サーバ

  • 各データベースの照合順序バージョンを記録してチェックするようになりました。 (Peter Eisentraut) (15)
  • この機能はインデックスの破損を回避するために照合順序のバージョン変更を検出するように設計されています。 関数 pg_database_collation_actual_version() は、基礎となるオペレーティングシステムの照合順序バージョンを報告し、ALTER DATABASE ... REFRESH は記録されたデータベースの照合順序のバージョンをオペレーティングシステムの照合順序バージョンと一致するよう設定します。

  • ICU照合順序をクラスタとデータベースのデフォルトとして設定できるようになりました。 (Peter Eisentraut) (15)
  • 以前は、クラスタおよびデータベースレベルでは、libcベースの照合順序しか選択できませんでした。ICU照合順序は、明示的な「COLLATE」句を介してのみ使用することができました。

  • pg_ident.conf の情報報告用に、pg_ident_file_mappings システムビューが追加されました。 (Julien Rouhaud) (15)
パーティショニング
  • パーティションテーブルを参照するクエリの計画時間が改善されました。 (David Rowley) (15)
  • この変更は、多数のパーティションのうち、一部のパーティションだけが関連する場合に役立ちます。

  • より多くの場合に、ソートを回避するためのパーティションの順序付きスキャンが可能になりました。 (David Rowley) (15)
  • 以前は、複数の値を含む DEFAULTパーティションや LISTパーティションを持つパーティションテーブルでは、順序付きパーティションスキャンに使用できませんでした。これからは、計画中にそのようなパーティションがプルーニングされた場合には使用できるようになります。

  • パーティション間での行移動を伴うパーティションテーブル更新における外部キーの動作が改善されました。 (Amit Langote) (15)
  • 以前は、このような更新は移動元パーティション上で削除アクションが実行され、移動先パーティション上で挿入アクションが実行されていました。PostgreSQL はパーティションルート上で更新アクションを実行するようになり、よりクリーンなセマンティクスが提供できるようになりました。

  • パーティションテーブルで CLUSTER コマンドが実行できるようになりました。 (Justin Pryzby) (15)
  • パーティションテーブルの ALTER TRIGGER RENAME が、すべてのパーティションでトリガの名前を適切に変更するように修正されました。 (Arne Roland, lvaro Herrera) (15)
  • また、パーティションテーブルで異なる名前のトリガを持つことは無意味なため、複製されたトリガ名を変更することも禁止されました。

インデックス
  • システムテーブルと TOASTテーブルの btreeインデックスが重複を効率的に格納できるようになりました。 (Peter Geoghegan) (15)
  • 以前は、これらのタイプのインデックスでは重複排除が無効になっていました。

  • ソートを使用して構築された GiSTインデックスの検索性能が向上しました。 (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) (15)
  • 一意性制約とインデックスが NULL値を区別できないもの(not district)として処理できるようになりました。 (Peter Eisentraut) (15)
  • 以前は、NULL項目は常に個別の値として扱われていましたが、「UNIQUE NULLS NOT DISTINCT」を使用して制約とインデックスを作成することで、これを変更できるようになりました。

  • C照合順序を使用する場合、接頭辞演算子 ^@ と starts_with() 関数でbtree インデックスを使用できるようになりました。 (Tom Lane) (15)
  • 以前これらで使用できたのは SP-GiST インデックスのみでした。

プランナ
  • 拡張統計で、親とそのすべての子の統計情報を記録できるようになりました。 (Tomas Vondra, Justin Pryzby) (15)
  • 通常の統計では、すでに親と、親プラスすべての子の統計を別々にトラッキングしていました。

  • 再帰クエリの作業テーブルの予想サイズをユーザーが指定できるように、recursive_worktable_factor設定パラメータが追加されました。 (Simon Riggs) (15)
性能一般
  • 多くの定数を含む「NOT IN」句のハッシュ検索が可能となりました。 (David Rowley, James Coleman) (15)
  • 以前のコードは常に値のリストを順番にスキャンしていました。

  • SELECT DISTINCT の並列化が可能となりました。 (David Rowley) (15)
  • 16バイトずつ処理することによって、UTF-8 テキストのエンコード検証が高速化されました。 (John Naylor, Heikki Linnakangas) (15)
  • これにより、COPY FROM のようなテキストを多用する操作が改善されます。

  • work_mem を超えるソートの性能が改善されました。 (Heikki Linnakangas) (15)
  • ソートデータが work_mem に収まらなくなった時は、以前よりも多くの出力ストリームを使用するバッチソートアルゴリズムに切り替わります。

  • メモリ内ソートの性能が向上し、メモリ消費量が削減されました。 (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) (15)
  • WALフルページ書き込みで LZ4 および Zstandard 圧縮が使用できるようになりました。 (Andrey Borodin, Justin Pryzby) (15)
  • これは wal_compression パラメータ設定によって制御されます。

  • macOS でダイレクトI/O を使用して WAL を書き込む動作に対応しました。 (Thomas Munro) (15)
  • これは「max_wal_senders = 0」および「wal_level = minimal」の場合にのみ機能します。

  • VACUUMにより、最古の凍結されたXID (relfrozenxid) と最古のマルチXID (relminmxid) をより積極的に設定できるようになりました。 (Peter Geoghegan) (15)
  • より多くの場合に複数の外部テーブルを参照するクエリが、並列に外部テーブルスキャンを実行できるようになりました。 (Andrey Lepikhov, Etsuro Fujita) (15)
  • row_number()、rank()、dense_rank()、count() を使用するウィンドウ関数の性能が改善されました。 (David Rowley) (15)
  • コア数の多い ARM64 システムでのスピンロックの性能が向上しました。 (Geoffrey Blake) (15)
モニタリング
  • チェックポイントログと遅い自動バキューム操作ログがデフォルトで有効になりました。 (Bharath Rupireddy) (15)
  • その結果、log_checkpoints のデフォルトは on に、log_autovacuum_min_duration のデフォルトは 10分に変更されました。これにより、アイドル状態のサーバでもログ出力が生成され、ログファイルのローテーションを行わないリソースに制約のあるサーバで問題が発生する可能性があります。 このような場合は、これらのデフォルトを変更する必要があります。

  • サーバの起動が遅い時に、サーバログに進行状況のメッセージを生成するようになりました。 (Nitin Jadhav, Robert Haas) (15)
  • メッセージは遅延の原因を報告します。通知の時間間隔は、新しい log_startup_progress_interval パラメータによって制御されます。

  • 累積統計情報システムデータが共有メモリに格納されるようになりました。 (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) (15)
  • 以前は、このデータは UDPパケットを介して統計情報コレクタプロセスに送信され、ファイルシステム経由で転送された後にのみセッションが読み取ることができました。 独立した統計情報コレクタプロセスは廃止されました。

  • VACUUM VERBOSE と 自動VACUUM のログメッセージに追加情報が追加されました。 (Peter Geoghegan) (15)
  • 一時ファイルブロックI/O に対する EXPLAIN (BUFFERS) 出力が追加されました。 (Masahiko Sawada) (15)
  • JSON形式でのログ出力が利用可能となりました。 (Sehrope Sarkuni, Michael Paquier) (15)
  • 新しい設定は「log_destination = jsonlog」です。

  • pg_stat_reset_single_table_counters() ですべてのデータベースで共有されるリレーションのカウンタをリセットできるようになりました。 (Sadhuprasad Patro) (15)
  • ローカルシェルコマンドの待機イベントが追加されました。 (Fujii Masao) (15)
  • 新しい待機イベントは、archive_command、archive_cleanup_command、restore_command、および、recovery_end_command を呼び出す時に使用されます。

権限
  • ビューの呼び出し元の権限を使用したビューによるテーブルアクセスを、オプションで制御できるようになりました。 (Christoph Heiss) (15)
  • これまでは、ビューへのアクセスは常にビューの所有者によって行われたものとして扱われていました。今もデフォルトはこの振る舞いです。

  • 定義済みロール pg_write_server_files のメンバーがサーバサイド側のベースバックアップを実行できるようになりました。 (Dagfinn Ilmari Manns ker) (15)
  • 以前はスーパーユーザのみがこのようなバックアップを実行可能でした。

  • SET および ALTER SYSTEM を介した個々の設定パラメータの変更権限がGRANT で付与できるようになりました。 (Mark Dilger) (15)
  • 新しい関数 has_parameter_privilege() は、この特権について報告します。

  • メンバーが CHECKPOINT を実行できる定義済みロール pg_checkpoint が追加されました。 (Jeff Davis) (15)
  • 以前は、チェックポイントはスーパーユーザのみ実行可能でした。

  • 定義済みロール pg_read_all_stats のメンバーがpg_backend_memory_contexts ビューおよび pg_shmem_allocations ビューにアクセスできるようになりました。 (Bharath Rupireddy) (15)
  • 以前は、これらのビューにはスーパーユーザのみアクセス可能でした。

  • pg_log_backend_memory_contexts() に対する権限が GRANT で付与できるようなりしました。 (Jeff Davis) (15)
  • 以前は、この関数はスーパーユーザのみ実行可能でした。

サーバ設定
  • 割り当てられた共有メモリのサイズを報告する参照用設定パラメータ shared_memory_size が追加されました。 (Nathan Bossart) (15)
  • 要求されたヒュージメモリページ数をレポートするために参照用設定パラメータ shared_memory_size_in_huge_pages が追加されました。 (Nathan Bossart) (15)
  • これは Linux でのみサポートされます。

  • シングルユーザモードでも設定パラメータ shared_preload_libraries が使えるようになりました。 (Jeff Davis) (15)
  • この変更により、シングルユーザモードにおいても基本的なデータベースアクセスに必要となるカスタムアクセスメソッドや WALリソースマネージャをロードすることができるようになります。

  • Solaris で dynamic_shared_memory_type のデフォルト設定が sysv になりました。 (Thomas Munro) (15)
  • 以前のデフォルトでは posix になっていましたが、これは Solaris では重大な障害になる可能性がありました。

  • postgres -C で実行時に計算された値を適切に報告できるようになりました。 (Nathan Bossart) (15)
  • 以前は、実行時に計算された data_checksums、wal_segment_size、data_directory_mode については動作中サーバにおいて正確ではない値を返していました。これら設定パラメータは動作中サーバにおいては動作しないようになります。

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

  • サーバ側のベースバックアップで LZ4 と Zstandard による圧縮のサポートが追加されました。 (Jeevan Ladhe, Robert Haas) (15)
  • クラッシュリカバリ中に checkpointerプロセスと bgwriterプロセスが動作できるようになりました。 (Thomas Munro) (15)
  • これにより、クラッシュリカバリを高速化できるようになりました。

  • WAL処理で必要なファイルの中身をプリフェッチできるようになりました。 (Thomas Munro) (15)
  • これは設定パラメータ recovery_prefetch によって制御されます。

  • ロード可能なモジュールでアーカイブを行えるようになりました。 (Nathan Bossart) (15)
  • 以前は、アーカイブ処理はシェルコマンド実行を通してのみ行われました。新しい設定パラメータ archive_library でアーカイブのために呼ばれるライブラリを指定することができます。

  • START_REPLICATION の前に IDENTIFY_SYSTEM を実行する必要がなくなりました。 (Jeff Davis) (15)
ロジカルレプリケーション
  • スキーマ内の全てのテーブルを公開できるようになりました。 (Vignesh C, Hou Zhijie, Amit Kapila) (15)
  • 例えば以下のような記述が可能です

    CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2
    

    ALTER PUBLICATION でも同じような記述が可能になりました。リストされたスキーマに後で追加されたテーブルもレプリケーションされます。

  • パブリケーションの内容を WHERE句でフィルタできるようになりました。 (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila) (15)
  • WHERE句の条件に当てはまらない行はパブリケーションされません。

  • 特定の列に限定してパブリケーションできるようになりました。 (Tomas Vondra, Alvaro Herrera, Rahila Syed) (15)
  • 論理レプリケーションで、ALTER SUBSCRIPTION ... SKIP を実行することで、トランザクションをスキップすることができるようになりました。 (Masahiko Sawada) (15)
  • 論理レプリケーションに準備されたトランザクション(二相コミット)のサポートが追加されました。 (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) (15)
  • このための CREATE_REPLICATION_SLOT の新しいオプションは TWO_PHASE です。pg_recvlogical でスロットを作成する際、新オプション --two-phase がサポートされるようになりました。

  • 空のトランザクションを論理レプリケーションしないようになりました。 (Ajin Cherian, Hou Zhijie, Euler Taveira) (15)
  • 以前は、サブスクリプション側のテーブルが変更されなかったら、パブリケーション側は空のトランザクションをサブスクリプション側に送っていました。

  • 論理レプリケーションスロットのディレクトリの中身を監視するためのSQL関数が追加されました。 (Bharath Rupireddy) (15)
  • 新しい関数は pg_ls_logicalsnapdir()、pg_ls_logicalmapdir()、pg_ls_replslotdir() です。これらの関数は定義済みロール pg_monitor のメンバーによって実行可能です。

  • サブスクリプション側でエラーが起きた時、論理レプリケーションの変更の適用を止めることができるようになりました。 (Osumi Takamichi, Mark Dilger) (15)
  • これはサブスクリプション側のオプション disable_on_error で実現できます。これによりストリーミングレプリケーションの間で無限エラーループが起きる可能性を回避できます。

  • サブスクリプション側の設定パラメータをパブリケーション側と一致するように調整することで、日付時刻と float8 の値が一貫して解釈されるようになりました。 (Japin Li) (15)
  • これまで一部のパブリケーションは一貫性のない動作をする可能性がありました。

  • サブスクリプション側のアクティビティを報告するシステムビュー pg_stat_subscription_stats が追加されました。 (Masahiko Sawada) (15)
  • 新しい関数 pg_stat_reset_subscription_stats() を使用すると、これらの統計カウンターをリセットできます。

  • pg_publication_tables システムビューで重複するエントリが抑制されました。 (Hou Zhijie) (15)
  • 場合によっては、パーティションが複数回表示されることがありました。

ユーティリティコマンド

  • 1つのテーブルを別のテーブルと一致するように調整する SQL文 MERGE が追加されました。 (Simon Riggs, Pavan Deolasee, lvaro Herrera, Amit Langote) (15)
  • これは INSERT ... ON CONFLICT に似ていますが、よりバッチ指向です。

  • COPY のテキスト形式で HEADER オプションのサポートが追加されました。 (R mi Lapeyre) (15)
  • この新しいオプションにより列名が出力されます。入力時にヘッダ行と列名が一致していることを確認させることもできます。

  • データベース作成用の新しい WALログ方式が追加されました。 (Dilip Kumar) (15)
  • これはテンプレートデータベースをコピーするための新しいデフォルトの方法です。これにより、データベースの作成中にチェックポイントが不要になります。ただし、テンプレートデータベースが大きい場合は遅くなる可能性があるため、古い方法も引き続き使用できます。

  • CREATE DATABASE コマンドでデータベース OID を設定できるようになりました。 (Shruthi Gowda, Antonin Houska) (15)
  • DROP DATABASE、DROP TABLESPACE、および ALTER DATABASE SET TABLESPACE がWindows での同時使用中に時々失敗していましたが、これを防ぐようになりました。 (Thomas Munro) (15)
  • 外部キーの ON DELETE SET アクションが指定された列のみに影響されるようになりました。 (Paul Martinez) (15)
  • 以前は外部キーのすべての列が常に影響を受けていました。

  • ALTER TABLE コマンドでテーブルの ACCESS METHOD を変更できるようになりました。 (Justin Pryzby, Jeff Davis) (15)
  • ALTER TABLE によってテーブルの書き換えが発生した場合に、オブジェクトアクセスフックを適切に呼び出すようになりました。 (Michael Paquier) (15)
  • ログを記録しない(UNLOGGED の)シーケンスの作成ができるようになりました。

  • 複合型を返す関数の結果で個々の列の依存関係を記録するようになりました。 (Tom Lane) (15)
  • 以前は、複合型を返す関数の結果内の特定の列への参照が、ビューまたはルールに含まれていた場合、依存関係として認識されませんでした。 ビューまたはルールは全体として複合型にのみ依存すると見なされていました。

    これは、個々の列を削除できることを意味し、後でビューまたはルールを使用する際に問題が発生していました。列レベルの依存関係も記録されるようになったため、ビューが変更や削除されない限り、そのような列の削除は拒否されるようになります。

データ型

  • 数値の位取りを負にしたり、より精度を大きくすることができるようになりました。 (Dean Rasheed, Tom Lane) (15)
  • これにより、小数点の左側の値を丸めることができます。たとえば「'1234'::numeric(4, -2)」は 1200 を返します。

  • 値を interval型に変換するときのオーバーフロー検出が改善されました。 (Joe Koshakow) (15)
  • 非ASCII文字について char型の I/Oフォーマットが変更されました。 (Tom Lane) (15)
  • 絵文字などの最新の Unicode文字の表示幅の情報が更新されました。 (Jacob Champion) (15)
  • また、Unicode 5.0 から 14.0.0 に更新されました。 Unicodeリリースで Postgres を最新の状態に保つための自動化された方法も用意されました。

関数

  • 多重範囲型(マルチ範囲型)への集約関数 range_agg() が追加されました。 (Paul Jungwirth) (15)
  • データ型 xid8 に対応した集約関数 MIN()、MAX() が追加されました。 (Ken Kato) (15)
  • 他のリレーショナルシステムとの互換性のために、正規表現関数が追加されました。 (Gilles Darold, Tom Lane) (15)
  • 新しい関数は、regexp_count()、regexp_instr()、regexp_like()、regexp_substr() です。いくつかの新しいオプション引数も regexp_replace() に追加されました。

  • ポリゴン間の距離を計算する機能が追加されました。 (Tom Lane) (15)
  • to_char()のフォーマットコードに of、tzh、tzm が追加されました。 (Nitin Jadhav) (15)
  • これらに相当する大文字はすでにサポートされています。

  • 「AT TIME ZONE」をタイムゾーン値を含む時刻に適用する場合は、その時点の時刻ではなくトランザクションの開始時刻を使用して、DST(夏時間)が適用されるかどうかを判断するようになりました。 (Aleksander Alekseev, Tom Lane) (15)
  • これにより、問い合わせのやりとりが VOLATILE ではなく STABLE と見なされるようになり、呼び出し毎のカーネル呼び出しが節約されます。

  • ts_delete() 関数、および、配列引数を持つ setweight() 関数で、NULL 配列要素を無視するようになりました。 (Jean-Christophe Arnu) (15)
  • これらの関数は(有効な語彙素と決して一致しないため)実際のところ空文字列の配列要素を無視します。NULL要素についてもエラーにせず無視するようにすることは、一貫性があると言えます。

  • pg_size_pretty() および pg_size_bytes() にペタバイト単位のサポートが追加されました。 (David Christensen) (15)
  • pg_event_trigger_ddl_commands() が他セッションの一時スキーマへの参照を出力する時、実際のスキーマ名を使用するように修正されました。 (Tom Lane) (15)
  • 以前は、この関数はすべての一時スキーマを「pg_temp」として出力していましたが、現セッションの一時スキーマ以外で pg_temp を用いることは誤解を招くものでした。

PL/pgSQL

  • PL/pgSQL 変数の「CONSTANT」指定の強制性が修正されました。 (Tom Lane) (15)
  • 以前は、「CONSTANT」と指定されていたにもかかわらず、変数を CALL の出力パラメータやrefcursor型の OPEN する変数として使用できました。

libpq

  • サーバ証明書の Subject Alternative Name に対する IP アドレス照合ができるようになりました。 (Jacob Champion) (15)
  • PQsslAttribute() が libpq 接続を必要とせずに SSLのライブラリタイプを報告できるようになりました。 (Jacob Champion) (15)
  • クライアントからのクエリキャンセル送信が、通常のクライアント接続と同じ TCP 設定を使うように変更されました。 (Jelte Fennema) (15)
  • これにより、設定された TCP接続タイムアウトをクエリキャンセルに適用できます。

  • libpq のイベントコールバックの失敗によって強制的にエラーが発生する問題を防止するようになりました。 (Tom Lane) (15)
  • 以前はコールバック失敗で接続オブジェクトにエラー状態が設定されて、以降の処理も失敗していました。

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

  • pgbench が、直列化失敗およびデッドロックエラーの後にトランザクションをリトライできるようになりました。 (Yugo Nagata, Marina Polyakova) (15)
psql
  • ラージチャンクでデータを送信することで、psql の \copy コマンドの性能が改善されました。 (Heikki Linnakangas) (15)
  • 特に、列数の少ないテーブルに対する \copy ... FROM ... で性能向上します。

  • 設定パラメータ値を表示する「\dconfig」コマンドが追加されました。 (Mark Dilger, Tom Lane) (15)
  • サーバ側の SHOW コマンドに似ていますが、パターンを指定して一度に複数の変数値を表示させることができる利便性があります。

  • 環境変数の値を psql 変数に割り当てる「\getenv」コマンドが追加されました。 (Tom Lane) (15)
  • psql にラージオブジェクトの権限を表示する、\lo_list の「+」オプションと \dl コマンドが追加されました。 (Pavel Luzanov) (15)
  • psql に \watch コマンドのページャオプションが追加されました。 (Pavel Stehule, Thomas Munro) (15)
  • これは Unix でのみサポートされ、PSQL_WATCH_PAGER 環境変数によって制御されます。

  • psql がクエリ内のダブルハイフン(--)のコメントをサーバに送信するようになりました。 (Tom Lane, Greg Nancarrow) (15)
  • 以前は、このダブルハイフンによるコメントはサーバ送信前に除去されていました。引き続き、クエリテキストの前にある二重ハイフンコメントは送信されず、個別の psql 履歴エントリとして記録されません。

  • psql の readline の「meta-"#"」コマンドがダブルハイフンのコメントマーカを挿入するように改善されました。 (Tom Lane) (15)
  • 以前は、ユーザーが手間をかけてデフォルト以外のコメントマーカーを設定していない限り、シャープマーカが挿入されていました。

  • 複数のクエリが一度にサーバに渡されたときに、psql がすべての結果を出力するようになりました。 (Fabien Coelho) (15)
  • 以前は、最後の問い合わせの結果のみを表示していました。なお、この機能は psql 変数「SHOW_ALL_RESULTS」を 「off」に設定することで、最後の問い合わせのみを表示することもできます。

  • --single-transaction モードでエラーが検出された後、ON_ERROR_STOP が設定されている場合にのみ、最後の COMMIT コマンドを ROLLBACK に変更するようになりました。 (Michael Paquier) (15)
  • 以前は、-c コマンドまたは -f スクリプトファイルでエラーが検出されると、ON_ERROR_STOP の値に関係なく、最後に ROLLBACK が発行されていました。

  • psql のタブ補完機能が改善されました。 (Shinya Kato, Dagfinn Ilmari Mannsaker, Peter Smith, Koyu Tanigawa, Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Alvaro Herrera, Tom Lane, Masahiko Sawada) (15)
  • DECLARE .. ASENSITIVE、EXPLAIN .. EXECUTE、ALTER TABLE ADD、CREATE/ALTER PUBLICATION、LOCK TABLE、COMMENT、DROP、CREATE FOREIGN TABLE、ALTER COLLATION、を含む様々な SQL構文について対応の追加や改善が行われました。

  • psql のバックスラッシュコマンドのサポートが PostgreSQL 9.2 以降が動作するサーバに限定するようになりました。 (Tom Lane) (15)
  • 古いサーバでの実行時にのみ使用されていたコードは削除されました。PostgreSQL 9.2 と比較してバージョン固有の調整を必要としないコマンドは引き続き動作します。

pg_dump
  • pg_dump が public スキーマの所有者変更とセキュリティラベルを出力するようになりました。 (Tom Lane) (15)
  • 多くのオブジェクトを含むデータベースのダンプの性能が改善されました。 (Tom Lane) (15)
  • これにより、pg_upgrade の性能も改善されました。

  • 大きな TOASTテーブルを含むテーブルの並列 pg_dump の性能が改善されました。 (Tom Lane) (15)
  • リストアでデフォルトのテーブルアクセスメソッドのみを使用するように強制する、ダンプ/リストアオプション --no-table-access-method が追加されました。 (Justin Pryzby) (15)
  • pg_dump および pg_dumpall のサポートを PostgreSQL 9.2 以降のサーバに限定するようになりました。 (Tom Lane) (15)

サーバアプリケーション

  • 新しい pg_basebackup オプション --target が追加されました。 (Robert Haas) (15)
  • これによりベースバックアップの書き出し先を制御することができます。

    新たな動作を行う --target 指定は、バックアップをサーバ側に書き込む「server」と、(テスト用に)バックアップを破棄する「blackhole」です。

  • pg_basebackup がベースバックアップファイルの、サーバ側における gzip、LZ4、および Zstandard による圧縮と、クライアント側における LZ4 および Zstandard による圧縮に対応しました。 (Dipesh Pandit, Jeevan Ladhe) (15)
  • クライアント側における gzip による圧縮は、以前から対応していました。

  • pg_basebackup が、サーバ側で圧縮して、保存前にクライアント側で解凍できるようになりました。 (Dipesh Pandit) (15)
  • これはサーバ側での圧縮とプレーンな出力形式を指定することで実現されます。

  • pg_basebackup の --compress オプションを使用することによって、圧縮の場所 (サーバまたはクライアント)、圧縮方法、および圧縮オプションを制御できるようになりました。 (Michael Paquier, Robert Haas) (15)
  • pg_receivewal に LZ4 圧縮方式が追加されました。 (Georgios Kokolatos) (15)
  • これは --compress=lz4 オプションで有効になります。使用するには、PostgreSQL のビルド時に --with-lz4 を指定する必要があります。

  • pg_receivewal の --compress オプションで圧縮方式も指定できるようになりました。 (Georgios Kokolatos) (15)
  • pg_receivewal の適切な WAL位置で再開する機能が改善されました。 (Ronan Dunklau) (15)
  • これまで pg_receivewal は、ローカルのアーカイブディレクトリに保存されている WALファイルか、送信側サーバの現在の WALフラッシュ位置に基づいて、再開していました。

    本変更で、送信サーバが PostgreSQL 15 以降である場合、ローカルアーカイブディレクトリが空でレプリケーションスロットが指定されているときには、レプリケーションスロットのリスタートポイントが判断基準に使われるようになります。

  • pg_rewind にオプション --config-file が追加されました。 (Gunnar Bluth) (15)
  • これにより、サーバの設定ファイルがデータディレクトリ外に保存されている場合に簡単に対応できるようになります。

pg_upgrade
  • pg_upgrade のログと一時ファイルを pg_upgrade_output.d という名前の新しいクラスタのサブディレクトリに保存するようになりました。 (Justin Pryzby) (15)
  • 以前は、このようなファイルはカレントディレクトリに残されていたため、手動でクリーンアップする必要がありました。これからは pg_upgrade が正常に完了すると、これらは自動的に削除されます。

  • 出力がターミナルでない場合、pg_upgrade 操作中のデフォルトのステータスレポートを無効にするようになりました。 (Andres Freund) (15)
  • --verbose を使うことで、非tty での使用においてもステータスレポート出力を有効にできます。

  • pg_upgrade が接続できない設定(pg_database.datallowconn が false)のデータベースを全て報告するようになりました。 (Jeevan Ladhe) (15)
  • 以前は、接続が無効である最初のデータベースのみが報告されていました。

  • pg_upgrade がテーブルスペースとデータベースの OID、およびリレーションの relfilenode番号を維持するようになりました。 (Shruthi Gowda, Antonin Houska) (15)
  • pg_upgrade に「--no-sync」オプションが追加されました。 (Michael Paquier) (15)
  • これは、テスト目的でのみ推奨されます。

  • pg_upgrade のサポート対象が PostgreSQL 9.2 以降のサーバに限定されました。 (Tom Lane) (15)
pg_waldump
  • pg_waldump の出力をリレーションのファイルノード、ブロック番号、フォーク番号、フルページイメージでフィルタリングできるようになりました。 (David Christensen, Thomas Munro) (15)
  • pg_waldump が割り込みで終了する前に統計情報を報告するようになりました。 (Bharath Rupireddy) (15)
  • 例えば、pg_waldump --stats --follow を実行している端末で Ctrl-C を発行すると、終了する前に現在の統計情報が報告されます。これは Windows では機能しません。

  • pg_waldump によって報告される Transaction WALレコードの説明が一部について改善されました。 (Masahiko Sawada, Michael Paquier) (15)
  • これにより、PREPARE TRANSACTION および ROLLBACK PREPARED のレコードにレプリケーション起点情報として、起点ID、LSN、タイムスタンプの記述が追加されます。

  • pg_waldump が複数のリソースマネージャに関する情報をダンプできるようになりました。 (Heikki Linnakangas) (15)
  • これは、--rmgrオプションを複数指定することで有効になります。

ドキュメント

  • pg_encoding_to_char() および pg_char_to_encoding() のドキュメントが追加されました。 (Ian Lawrence Barwick) (15)
  • 「^@」で始まる演算子がドキュメント化されました。 (Tom Lane) (15)

ソースコード

  • cirrus-ci を使用した継続的インテグレーションテストのサポートが追加されました。 (Andres Freund, Thomas Munro, Melanie Plageman) (15)
  • Zstandardビルドを有効にするための configureオプション --with-zstd が追加されました。 (Jeevan Ladhe, Robert Haas, Michael Paquier) (15)
  • ロード可能なライブラリのマジックブロックに ABI識別子フィールドを追加し、非コミュニティの PostgreSQLディストリビューションが他のビルドと互換性のないライブラリを識別できるようになりました。 (Peter Eisentraut) (15)
  • ABIフィールドの不一致はロード時にエラーを発生させます。

  • "char" などに対応した新しい pg_type.typcategory の値「Z」が追加されました。 (Tom Lane) (15)
  • これは内部使用専用の型であることを示します。

  • ベースバックアップに使用する新しい COPY方式を指定するため、新しいプロトコルメッセージ「TARGET」が追加されました。 (Robert Haas) (15)
  • pg_basebackup はこの方式を使用するようになりました。

  • 圧縮方式とオプションを指定する新しいプロトコルメッセージ「COMPRESSION」と「COMPRESSION_DETAIL」が追加されました。 (Robert Haas) (15)
  • 古い「BASE_BACKUP」コマンド構文とベースバックアッププロトコルのサーバサポートが削除されました。 (Robert Haas) (15)
  • カスタムバックアップターゲットを設定する拡張のサポートが追加されました。 (Robert Haas) (15)
  • 拡張がカスタムWALリソースマネージャを定義できるようになりました。 (Jeff Davis) (15)
  • 設定パラメータのフラグを取得する関数 pg_settings_get_flags()が追加されました。 (Justin Pryzby) (15)
  • Windowsで「PGDLLIMPORT」マーカを使用してサーバのすべてのグローバル変数をエクスポートするようになりました。 (Robert Haas) (15)
  • 以前は、Windows の拡張では特定の変数のみにアクセス可能でした。

  • PostgreSQL をビルドするには、GNU make バージョン 3.81 以降が必要になりました。 (Tom Lane) (15)
  • pgcrypto拡張をビルドするには、OpenSSL が必要になりました。 (Peter Eisentraut) (15)
  • Perl バージョン 5.8.3 以降が必要になりました。 (Dagfinn Ilmari Manns ker) (15)
  • Python バージョン 3.2 以降が必要になりました。 (Andres Freund) (15)

追加モジュール

  • amcheck がシーケンスをチェックできるようになりました。 (Mark Dilger) (15)
  • TOASTテーブルの amcheck による健全性チェックが改善されました。 (Mark Dilger) (15)
  • カスタムバックアップターゲットの例として、新しいモジュール basebackup_to_shell が追加されました。 (Robert Haas) (15)
  • ライブラリ経由でアーカイブを実行する例として、新しいモジュール basic_archive が追加されました。 (Nathan Bossart) (15)
  • boolean 型の列に対して btree_gistインデックスが定義できるようになりました。 (Emre Hasegeli) (15)
  • これは排他制約に使用できます。

  • pageinspect の page_header() が 32キロバイトのページサイズを処理できるように修正されました。 (Quan Zongliang) (15)
  • 以前は、特定の場合に不適切な負の値が返されることがありました。

  • pg_stat_statements に一時ファイルのブロック I/O のカウンタが追加されました。 (Masahiko Sawada) (15)
  • pg_stat_statements に JIT のカウンタが追加されました。 (Magnus Hagander) (15)
  • 新しいモジュール pg_walinspect が追加されました。 (Bharath Rupireddy) (15)
  • これにより、pg_waldump と同様の SQLレベルの出力が得られます。

  • sepgsql のログメッセージに permissive/enforcing 状態を表示するようになりました。 (Dave Page) (15)
postgres_fdw
  • postgres_fdw が CASE式をプッシュダウンできるようになりました。 (Alexander Pyhalov) (15)
  • postgres_fdw 接続のアプリケーション名を制御するため、設定パラメータ postgres_fdw.application_name が追加されました。 (Hayato Kuroda) (15)
  • 以前は、リモートセッションの application_name は、リモートサーバ上または postgres_fdw 接続オプションを介してのみ設定できました。postgres_fdw.application_name はカスタマイズ用にエスケープシーケンスをサポートしているため、リモートサーバでそのような接続を簡単に区別できます。

  • postgres_fdw サーバで並列コミットができるようになりました。 (Etsuro Fujita) (15)
  • これは CREATE SERVER のオプション parallel_commit で有効になります。