このページでは PostgreSQL 15(2022/10/13リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン15 の新機能については「PostgreSQL 15 検証報告」も参照してください。
バージョン15の主要な拡張
PostgreSQL 15 の主な拡張点としては以下があります。
- MERGE文のサポート
- 正規表現関数の追加
- 論理レプリケーションの機能追加
- 呼び出し元権限で実行するビュー
- 外部ソートアルゴリズム変更
- ウィンドウ関数の性能改善
- \copy FROM の性能改善
- Zstandard圧縮サポート
- JSON形式ログ
- 実行時統計情報の共有メモリ化
- モジュールによるWALアーカイブとベースバックアップ
バージョン15への移行/互換性のない変更点
- publicスキーマにおける PUBLIC むけ作成権限が取り除かれました。 (Noah Misch) (15)
- publicスキーマの所有者が pg_database_owner ロールに変更されました。 (Noah Misch) (15)
- 長らく非推奨となっていたベースバックアップの排他的バックアップ方式が廃止されました。 (David Steele, Nathan Bossart) (15)
- hash_mem_multiplier 設定のデフォルトが 1.0 から 2.0 に変更されました。 (Peter Geoghegan) (15)
- サーバ側手続き言語 plpython2u と plpythonu が廃止されました。 (Andres Freund) (15)
- array_to_tsvector() 関数に空文字列の配列要素を渡した場合に、エラーを出すようになりました。 (Jean-Christophe Arnu) (15)
- chr() 関数が負の値の引数について明示的なエラーを出すようになりました。 (Peter Eisentraut) (15)
- CREATE OR REPLACE VIEW で出力列の照合順序の変更が禁止されました。 (Tom Lane) (15)
- ecpg でゼロ長のユニコード識別子(例: U&"")が禁止されました。 (Peter Eisentraut) (15)
- 数値リテラルの後に続く非数値文字が禁止されました。 (Peter Eisentraut) (15)
- JSON の数値リテラルの処理が SQL/JSON標準に適合するように変更されました。 (Peter Eisentraut) (15)
- interval型の入力が月より大きい単位について小数値を持つとき、最も近い月にまるめるようになりました。 (Bruce Momjian) (15)
- interval型の末尾のピリオドの解析について一貫性が改善されました。 (Tom Lane) (15)
- 設定 IntervalStyle に影響を受けるため、interval型の出力関数が IMMUABLE から STABLE に変更されました。 (Tom Lane) (15)
- interval型の調整関数で整数オーバーフローを検知してエラーを出すようになりました。 (Joe Koshakow) (15)
- 非ASCII文字に対する "char" 型の出入力書式が変更されました。 (Tom Lane) (15)
- ログインロールが自身のロールメンバーシップに対して持つ、デフォルトの ADMIN OPTION権限が取り除かれました。 (Robert Haas) (15)
- ロジカルレプリケーションがサブスクリプションの所有者として実行されるようになりました。 (Mark Dilger) (15)
- サブスクリプションの所有者が SELECT権限を持たない場合には、テーブルに対する UPDATE と DELETE のロジカルレプリケーション操作ができないようになりました。 (Jeff Davis) (15)
- EXPLAIN がセッションの一時オブジェクトのスキーマを参照しているとき、pg_temp として参照するようになりました。 (Amul Sul) (15)
- pg_statio_all_tables が 複数インデックスを伴う TOASTテーブルという稀な場合の値も集計するように、修正されました。 (Andrei Zubkov) (15)
- プレフィックスがインストールされた拡張の名前と一致するけれども、その拡張によって宣言された変数ではないカスタム設定変数を設定することが禁止されました。 (Florin Irion, Tom Lane) (15)
- もはや使われない設定 stats_temp_directory が廃止されました。 (Andres Freund, Kyotaro Horiguchi) (15)
- random() の計算に使われるアルゴリズムが改善されました。 (Fabien Coelho) (15)
- libpq の PQsendQuery() 関数がパイプラインモードではサポートされなくなりました。 (Alvaro Herrera) (15)
- Windows以外のプラットフォームで、ホームディレクトリを調べるためにHOME環境変数を調べるようになりました。 (Anders Kaseorg) (15)
- pg_dump の --no-synchronized-snapshots オプションが廃止されました。 (Tom Lane) (15)
- psql の --single-transaction モードでエラーが検出された後、ON_ERROR_STOP が設定されている場合に限って、最後の COMMIT コマンドを ROLLBACK に変更するようになりました。 (Michael Paquier) (15)
- postgres_fdw から送られる問い合わせで、不要な定数のキャストを回避するようになりました。 (Dian Fay) (15)
- xml2 の xml_is_well_formed() 関数が廃止されました。 (Tom Lane) (15)
- カスタムスキャンプロバイダがプロジェクション(射影)をサポートするかどうかを示すことができるようになりました。 (Sven Klemm) (15)
新たなデフォルトは 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
これにより、各データベースの所有者が各データベース内の publicスキーマの所有者権限を持つようになります。これまでは、initdb時のスーパーユーザが所有者で、非スーパーユーザのデータベース所有者は何もできませんでした。
この変更は、新データベースクラスタと、既存データベースクラスタの新データベースに適用されます。pg_upgrade でアップグレードしたデータベースクラスタや、ダンプからリストアしたデータベースでは、元の所有者指定が維持されます。
データベースサーバの突発停止が生じたとき、排他的バックアップの途中であると、次のサーバ起動に失敗するおそれがありました。非排他バックアップ方式は全ての点でより優れていると考えられます。関数 pg_start_backup()/pg_stop_backup() は pg_backup_start()/pg_backup_stop() に名称変更されました。また、関数 pg_backup_start_time() および pg_is_in_backup() は廃止されました。
これにより、ハッシュ操作がソート等の他の操作よりも多くのワークメモリ(work_mem 設定で制御されるメモリ)を使えるようになります。
Python 2.x は既にサポート終了となっています。plpythonu の当初の意図は、plpython3u を指すようにできるというものでしたが、そのように変えると問題を引き起こしそうであるため、単に削除されました。
空文字列の語彙素はあり得ないため、これは禁止されます。そのようなデータはダンプ/リストアに失敗したり、誤った結果をもたらすため、以前のバージョンの PostgreSQL の利用者はバージョンアップに際して、空の語彙素が格納されていないことを確認する必要があります。
これまでは負の値が符号無し整数の大きな値として解釈されていました。
これまではエラーも出ませんが、正しく動作もしませんでした。
ユニコード以外でのゼロ長識別子は以前から禁止されていました。
これまでは「123abc」のような文字列は「123」とそれに続く「abc」という2つのトークンとして解釈されていました。
(以下は従来動作/バージョン15ではエラーになる) db=# SELECT 123abc; abc ----- 123 (1 row)
「.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
例えば、'1.99 years' は '2 years' になります。以前は切り捨てて '1 year 11 months' になりました。
末尾にピリオドがある数が一部プラットフォーム(AIXなど)で拒絶されていました。
これにより、例えば interval型の値のテキスト出力に依存したインデックスの作成は、以下のようにエラーになります。
db=# CREATE INDEX ON t14 ((interval_col::text)); ERROR: functions in index expression must be marked IMMUTABLE
動作が変わる関数は、justify_interval()、justify_hours()、justify_days() です。これまでは(正負が反転するなど)誤った結果を出力していました。
ハイビットを持つバイトはバックスラッシュと 3桁の 8進数で出入力されるようになります。これにより、文字エンコーディングの問題を回避します。従来はそのままのバイト列で出入力されていました。
これまでは、ログインロールは ADMIN OPTION権限が無くとも、自身のロールにメンバーを追加/削除することができました。
行単位セキュリティポリシーが検査されないため、スーパーユーザやbypassrls 属性を持つロール、テーブルの所有者のみが、行単位セキュリティポリシーを持つテーブルにレプリケーションできるようになります。
これまでは、そのような権限を持たないロールが所有者であるサブスクリプションが、行単位セキュリティを迂回できていました。
UPDATE と DELETE はテーブルの読み込みも伴いますので、サブスクリプション所有者にはテーブルの SELECT権限も必要です。
これまでは実際のスキーマ名を報告しており、セッション間で一時スキーマ名が一致しない結果になりました。
これまでは、そのような場合については各インデックス毎に 1行があらわれていました。
この変更により、そのような既存の設定変数は拡張をロードする際に削除されることになります。また、セッション中でそのような設定変数を追加するとエラーになります。これは設定変数が拡張に関連付けられているかどうかについて混乱を防ぐ狙いです。
これにより、同じシード値であっても random() 出力が以前のバージョンとは違うものになります。
この組み合わせを使うアプリケーションは、代わりに PQsendQueryParams() を使うように修正する必要があります。
HOME が空や未定義の場合には、従来の <pwd.h> のデータベースを検査する方法に戻ります。この変更は libpq と様々な付属クライアントアプリケーションプログラムで(例えば ~/,pgpass を見つけるときに)影響があります。
サポート中のバージョンはいずれも同期スナップショットをサポートしているため、本オプションはもはや必要ありません。
以前は、この場合には ON_ERROR_STOP 設定にかかわらず ROLLBACK されました。
ローカルとリモートで列の型を意図的に違ったものにしているときに、このようなキャストはエラーを引き起こす可能性がありました。
(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
この関数は PostgreSQL 9.1 以降では本体に含まれています。
デフォルトではプロジェクションをサポートとないものとされています。サポートしているプロバイダは、本リリースに合わせた更新が必要です。
変更点
サーバ
- 各データベースの照合順序バージョンを記録してチェックするようになりました。 (Peter Eisentraut) (15)
- ICU照合順序をクラスタとデータベースのデフォルトとして設定できるようになりました。 (Peter Eisentraut) (15)
- pg_ident.conf の情報報告用に、pg_ident_file_mappings システムビューが追加されました。 (Julien Rouhaud) (15)
この機能はインデックスの破損を回避するために照合順序のバージョン変更を検出するように設計されています。 関数 pg_database_collation_actual_version() は、基礎となるオペレーティングシステムの照合順序バージョンを報告し、ALTER DATABASE ... REFRESH は記録されたデータベースの照合順序のバージョンをオペレーティングシステムの照合順序バージョンと一致するよう設定します。
以前は、クラスタおよびデータベースレベルでは、libcベースの照合順序しか選択できませんでした。ICU照合順序は、明示的な「COLLATE」句を介してのみ使用することができました。
パーティショニング
- パーティションテーブルを参照するクエリの計画時間が改善されました。 (David Rowley) (15)
- より多くの場合に、ソートを回避するためのパーティションの順序付きスキャンが可能になりました。 (David Rowley) (15)
- パーティション間での行移動を伴うパーティションテーブル更新における外部キーの動作が改善されました。 (Amit Langote) (15)
- パーティションテーブルで CLUSTER コマンドが実行できるようになりました。 (Justin Pryzby) (15)
- パーティションテーブルの ALTER TRIGGER RENAME が、すべてのパーティションでトリガの名前を適切に変更するように修正されました。 (Arne Roland, lvaro Herrera) (15)
この変更は、多数のパーティションのうち、一部のパーティションだけが関連する場合に役立ちます。
以前は、複数の値を含む DEFAULTパーティションや LISTパーティションを持つパーティションテーブルでは、順序付きパーティションスキャンに使用できませんでした。これからは、計画中にそのようなパーティションがプルーニングされた場合には使用できるようになります。
以前は、このような更新は移動元パーティション上で削除アクションが実行され、移動先パーティション上で挿入アクションが実行されていました。PostgreSQL はパーティションルート上で更新アクションを実行するようになり、よりクリーンなセマンティクスが提供できるようになりました。
また、パーティションテーブルで異なる名前のトリガを持つことは無意味なため、複製されたトリガ名を変更することも禁止されました。
インデックス
- システムテーブルと TOASTテーブルの btreeインデックスが重複を効率的に格納できるようになりました。 (Peter Geoghegan) (15)
- ソートを使用して構築された GiSTインデックスの検索性能が向上しました。 (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) (15)
- 一意性制約とインデックスが NULL値を区別できないもの(not district)として処理できるようになりました。 (Peter Eisentraut) (15)
- C照合順序を使用する場合、接頭辞演算子 ^@ と starts_with() 関数でbtree インデックスを使用できるようになりました。 (Tom Lane) (15)
以前は、これらのタイプのインデックスでは重複排除が無効になっていました。
以前は、NULL項目は常に個別の値として扱われていましたが、「UNIQUE NULLS NOT DISTINCT」を使用して制約とインデックスを作成することで、これを変更できるようになりました。
以前これらで使用できたのは 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)
- work_mem を超えるソートの性能が改善されました。 (Heikki Linnakangas) (15)
- メモリ内ソートの性能が向上し、メモリ消費量が削減されました。 (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) (15)
- WALフルページ書き込みで LZ4 および Zstandard 圧縮が使用できるようになりました。 (Andrey Borodin, Justin Pryzby) (15)
- macOS でダイレクトI/O を使用して WAL を書き込む動作に対応しました。 (Thomas Munro) (15)
- 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)
以前のコードは常に値のリストを順番にスキャンしていました。
これにより、COPY FROM のようなテキストを多用する操作が改善されます。
ソートデータが work_mem に収まらなくなった時は、以前よりも多くの出力ストリームを使用するバッチソートアルゴリズムに切り替わります。
これは wal_compression パラメータ設定によって制御されます。
これは「max_wal_senders = 0」および「wal_level = minimal」の場合にのみ機能します。
モニタリング
- チェックポイントログと遅い自動バキューム操作ログがデフォルトで有効になりました。 (Bharath Rupireddy) (15)
- サーバの起動が遅い時に、サーバログに進行状況のメッセージを生成するようになりました。 (Nitin Jadhav, Robert Haas) (15)
- 累積統計情報システムデータが共有メモリに格納されるようになりました。 (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) (15)
- VACUUM VERBOSE と 自動VACUUM のログメッセージに追加情報が追加されました。 (Peter Geoghegan) (15)
- 一時ファイルブロックI/O に対する EXPLAIN (BUFFERS) 出力が追加されました。 (Masahiko Sawada) (15)
- JSON形式でのログ出力が利用可能となりました。 (Sehrope Sarkuni, Michael Paquier) (15)
- pg_stat_reset_single_table_counters() ですべてのデータベースで共有されるリレーションのカウンタをリセットできるようになりました。 (Sadhuprasad Patro) (15)
- ローカルシェルコマンドの待機イベントが追加されました。 (Fujii Masao) (15)
その結果、log_checkpoints のデフォルトは on に、log_autovacuum_min_duration のデフォルトは 10分に変更されました。これにより、アイドル状態のサーバでもログ出力が生成され、ログファイルのローテーションを行わないリソースに制約のあるサーバで問題が発生する可能性があります。 このような場合は、これらのデフォルトを変更する必要があります。
メッセージは遅延の原因を報告します。通知の時間間隔は、新しい log_startup_progress_interval パラメータによって制御されます。
以前は、このデータは UDPパケットを介して統計情報コレクタプロセスに送信され、ファイルシステム経由で転送された後にのみセッションが読み取ることができました。 独立した統計情報コレクタプロセスは廃止されました。
新しい設定は「log_destination = jsonlog」です。
新しい待機イベントは、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)
- メンバーが 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)
これまでは、ビューへのアクセスは常にビューの所有者によって行われたものとして扱われていました。今もデフォルトはこの振る舞いです。
以前はスーパーユーザのみがこのようなバックアップを実行可能でした。
新しい関数 has_parameter_privilege() は、この特権について報告します。
以前は、チェックポイントはスーパーユーザのみ実行可能でした。
以前は、これらのビューにはスーパーユーザのみアクセス可能でした。
以前は、この関数はスーパーユーザのみ実行可能でした。
サーバ設定
- 割り当てられた共有メモリのサイズを報告する参照用設定パラメータ shared_memory_size が追加されました。 (Nathan Bossart) (15)
- 要求されたヒュージメモリページ数をレポートするために参照用設定パラメータ shared_memory_size_in_huge_pages が追加されました。 (Nathan Bossart) (15)
- シングルユーザモードでも設定パラメータ shared_preload_libraries が使えるようになりました。 (Jeff Davis) (15)
- Solaris で dynamic_shared_memory_type のデフォルト設定が sysv になりました。 (Thomas Munro) (15)
- postgres -C で実行時に計算された値を適切に報告できるようになりました。 (Nathan Bossart) (15)
これは Linux でのみサポートされます。
この変更により、シングルユーザモードにおいても基本的なデータベースアクセスに必要となるカスタムアクセスメソッドや WALリソースマネージャをロードすることができるようになります。
以前のデフォルトでは posix になっていましたが、これは Solaris では重大な障害になる可能性がありました。
以前は、実行時に計算された data_checksums、wal_segment_size、data_directory_mode については動作中サーバにおいて正確ではない値を返していました。これら設定パラメータは動作中サーバにおいては動作しないようになります。
ストリーミングレプリケーションとリカバリ
- サーバ側のベースバックアップで LZ4 と Zstandard による圧縮のサポートが追加されました。 (Jeevan Ladhe, Robert Haas) (15)
- クラッシュリカバリ中に checkpointerプロセスと bgwriterプロセスが動作できるようになりました。 (Thomas Munro) (15)
- WAL処理で必要なファイルの中身をプリフェッチできるようになりました。 (Thomas Munro) (15)
- ロード可能なモジュールでアーカイブを行えるようになりました。 (Nathan Bossart) (15)
- START_REPLICATION の前に IDENTIFY_SYSTEM を実行する必要がなくなりました。 (Jeff Davis) (15)
これにより、クラッシュリカバリを高速化できるようになりました。
これは設定パラメータ recovery_prefetch によって制御されます。
以前は、アーカイブ処理はシェルコマンド実行を通してのみ行われました。新しい設定パラメータ archive_library でアーカイブのために呼ばれるライブラリを指定することができます。
ロジカルレプリケーション
- スキーマ内の全てのテーブルを公開できるようになりました。 (Vignesh C, Hou Zhijie, Amit Kapila) (15)
例えば以下のような記述が可能です
CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2
ALTER PUBLICATION でも同じような記述が可能になりました。リストされたスキーマに後で追加されたテーブルもレプリケーションされます。
WHERE句の条件に当てはまらない行はパブリケーションされません。
このための CREATE_REPLICATION_SLOT の新しいオプションは TWO_PHASE です。pg_recvlogical でスロットを作成する際、新オプション --two-phase がサポートされるようになりました。
以前は、サブスクリプション側のテーブルが変更されなかったら、パブリケーション側は空のトランザクションをサブスクリプション側に送っていました。
新しい関数は pg_ls_logicalsnapdir()、pg_ls_logicalmapdir()、pg_ls_replslotdir() です。これらの関数は定義済みロール pg_monitor のメンバーによって実行可能です。
これはサブスクリプション側のオプション disable_on_error で実現できます。これによりストリーミングレプリケーションの間で無限エラーループが起きる可能性を回避できます。
これまで一部のパブリケーションは一貫性のない動作をする可能性がありました。
新しい関数 pg_stat_reset_subscription_stats() を使用すると、これらの統計カウンターをリセットできます。
場合によっては、パーティションが複数回表示されることがありました。
ユーティリティコマンド
- 1つのテーブルを別のテーブルと一致するように調整する SQL文 MERGE が追加されました。 (Simon Riggs, Pavan Deolasee, lvaro Herrera, Amit Langote) (15)
- 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)
- 複合型を返す関数の結果で個々の列の依存関係を記録するようになりました。 (Tom Lane) (15)
これは INSERT ... ON CONFLICT に似ていますが、よりバッチ指向です。
この新しいオプションにより列名が出力されます。入力時にヘッダ行と列名が一致していることを確認させることもできます。
これはテンプレートデータベースをコピーするための新しいデフォルトの方法です。これにより、データベースの作成中にチェックポイントが不要になります。ただし、テンプレートデータベースが大きい場合は遅くなる可能性があるため、古い方法も引き続き使用できます。
以前は外部キーのすべての列が常に影響を受けていました。
ログを記録しない(UNLOGGED の)シーケンスの作成ができるようになりました。
以前は、複合型を返す関数の結果内の特定の列への参照が、ビューまたはルールに含まれていた場合、依存関係として認識されませんでした。 ビューまたはルールは全体として複合型にのみ依存すると見なされていました。
これは、個々の列を削除できることを意味し、後でビューまたはルールを使用する際に問題が発生していました。列レベルの依存関係も記録されるようになったため、ビューが変更や削除されない限り、そのような列の削除は拒否されるようになります。
データ型
- 数値の位取りを負にしたり、より精度を大きくすることができるようになりました。 (Dean Rasheed, Tom Lane) (15)
- 値を interval型に変換するときのオーバーフロー検出が改善されました。 (Joe Koshakow) (15)
- 非ASCII文字について char型の I/Oフォーマットが変更されました。 (Tom Lane) (15)
- 絵文字などの最新の Unicode文字の表示幅の情報が更新されました。 (Jacob Champion) (15)
これにより、小数点の左側の値を丸めることができます。たとえば「'1234'::numeric(4, -2)」は 1200 を返します。
また、Unicode 5.0 から 14.0.0 に更新されました。 Unicodeリリースで Postgres を最新の状態に保つための自動化された方法も用意されました。
関数
- 多重範囲型(マルチ範囲型)への集約関数 range_agg() が追加されました。 (Paul Jungwirth) (15)
- データ型 xid8 に対応した集約関数 MIN()、MAX() が追加されました。 (Ken Kato) (15)
- 他のリレーショナルシステムとの互換性のために、正規表現関数が追加されました。 (Gilles Darold, Tom Lane) (15)
- ポリゴン間の距離を計算する機能が追加されました。 (Tom Lane) (15)
- to_char()のフォーマットコードに of、tzh、tzm が追加されました。 (Nitin Jadhav) (15)
- 「AT TIME ZONE」をタイムゾーン値を含む時刻に適用する場合は、その時点の時刻ではなくトランザクションの開始時刻を使用して、DST(夏時間)が適用されるかどうかを判断するようになりました。 (Aleksander Alekseev, Tom Lane) (15)
- ts_delete() 関数、および、配列引数を持つ setweight() 関数で、NULL 配列要素を無視するようになりました。 (Jean-Christophe Arnu) (15)
- pg_size_pretty() および pg_size_bytes() にペタバイト単位のサポートが追加されました。 (David Christensen) (15)
- pg_event_trigger_ddl_commands() が他セッションの一時スキーマへの参照を出力する時、実際のスキーマ名を使用するように修正されました。 (Tom Lane) (15)
新しい関数は、regexp_count()、regexp_instr()、regexp_like()、regexp_substr() です。いくつかの新しいオプション引数も regexp_replace() に追加されました。
これらに相当する大文字はすでにサポートされています。
これにより、問い合わせのやりとりが VOLATILE ではなく STABLE と見なされるようになり、呼び出し毎のカーネル呼び出しが節約されます。
これらの関数は(有効な語彙素と決して一致しないため)実際のところ空文字列の配列要素を無視します。NULL要素についてもエラーにせず無視するようにすることは、一貫性があると言えます。
以前は、この関数はすべての一時スキーマを「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)
- libpq のイベントコールバックの失敗によって強制的にエラーが発生する問題を防止するようになりました。 (Tom Lane) (15)
これにより、設定された TCP接続タイムアウトをクエリキャンセルに適用できます。
以前はコールバック失敗で接続オブジェクトにエラー状態が設定されて、以降の処理も失敗していました。
クライアントアプリケーション
- pgbench が、直列化失敗およびデッドロックエラーの後にトランザクションをリトライできるようになりました。 (Yugo Nagata, Marina Polyakova) (15)
psql
- ラージチャンクでデータを送信することで、psql の \copy コマンドの性能が改善されました。 (Heikki Linnakangas) (15)
- 設定パラメータ値を表示する「\dconfig」コマンドが追加されました。 (Mark Dilger, Tom Lane) (15)
- 環境変数の値を psql 変数に割り当てる「\getenv」コマンドが追加されました。 (Tom Lane) (15)
- psql にラージオブジェクトの権限を表示する、\lo_list の「+」オプションと \dl コマンドが追加されました。 (Pavel Luzanov) (15)
- psql に \watch コマンドのページャオプションが追加されました。 (Pavel Stehule, Thomas Munro) (15)
- psql がクエリ内のダブルハイフン(--)のコメントをサーバに送信するようになりました。 (Tom Lane, Greg Nancarrow) (15)
- psql の readline の「meta-"#"」コマンドがダブルハイフンのコメントマーカを挿入するように改善されました。 (Tom Lane) (15)
- 複数のクエリが一度にサーバに渡されたときに、psql がすべての結果を出力するようになりました。 (Fabien Coelho) (15)
- --single-transaction モードでエラーが検出された後、ON_ERROR_STOP が設定されている場合にのみ、最後の COMMIT コマンドを ROLLBACK に変更するようになりました。 (Michael Paquier) (15)
- 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)
- psql のバックスラッシュコマンドのサポートが PostgreSQL 9.2 以降が動作するサーバに限定するようになりました。 (Tom Lane) (15)
特に、列数の少ないテーブルに対する \copy ... FROM ... で性能向上します。
サーバ側の SHOW コマンドに似ていますが、パターンを指定して一度に複数の変数値を表示させることができる利便性があります。
これは Unix でのみサポートされ、PSQL_WATCH_PAGER 環境変数によって制御されます。
以前は、このダブルハイフンによるコメントはサーバ送信前に除去されていました。引き続き、クエリテキストの前にある二重ハイフンコメントは送信されず、個別の psql 履歴エントリとして記録されません。
以前は、ユーザーが手間をかけてデフォルト以外のコメントマーカーを設定していない限り、シャープマーカが挿入されていました。
以前は、最後の問い合わせの結果のみを表示していました。なお、この機能は psql 変数「SHOW_ALL_RESULTS」を 「off」に設定することで、最後の問い合わせのみを表示することもできます。
以前は、-c コマンドまたは -f スクリプトファイルでエラーが検出されると、ON_ERROR_STOP の値に関係なく、最後に ROLLBACK が発行されていました。
DECLARE .. ASENSITIVE、EXPLAIN .. EXECUTE、ALTER TABLE ADD、CREATE/ALTER PUBLICATION、LOCK TABLE、COMMENT、DROP、CREATE FOREIGN TABLE、ALTER COLLATION、を含む様々な SQL構文について対応の追加や改善が行われました。
古いサーバでの実行時にのみ使用されていたコードは削除されました。PostgreSQL 9.2 と比較してバージョン固有の調整を必要としないコマンドは引き続き動作します。
pg_dump
- pg_dump が public スキーマの所有者変更とセキュリティラベルを出力するようになりました。 (Tom Lane) (15)
- 多くのオブジェクトを含むデータベースのダンプの性能が改善されました。 (Tom Lane) (15)
- 大きな TOASTテーブルを含むテーブルの並列 pg_dump の性能が改善されました。 (Tom Lane) (15)
- リストアでデフォルトのテーブルアクセスメソッドのみを使用するように強制する、ダンプ/リストアオプション --no-table-access-method が追加されました。 (Justin Pryzby) (15)
- pg_dump および pg_dumpall のサポートを PostgreSQL 9.2 以降のサーバに限定するようになりました。 (Tom Lane) (15)
これにより、pg_upgrade の性能も改善されました。
サーバアプリケーション
- 新しい pg_basebackup オプション --target が追加されました。 (Robert Haas) (15)
- pg_basebackup がベースバックアップファイルの、サーバ側における gzip、LZ4、および Zstandard による圧縮と、クライアント側における LZ4 および Zstandard による圧縮に対応しました。 (Dipesh Pandit, Jeevan Ladhe) (15)
- pg_basebackup が、サーバ側で圧縮して、保存前にクライアント側で解凍できるようになりました。 (Dipesh Pandit) (15)
- pg_basebackup の --compress オプションを使用することによって、圧縮の場所 (サーバまたはクライアント)、圧縮方法、および圧縮オプションを制御できるようになりました。 (Michael Paquier, Robert Haas) (15)
- pg_receivewal に LZ4 圧縮方式が追加されました。 (Georgios Kokolatos) (15)
- pg_receivewal の --compress オプションで圧縮方式も指定できるようになりました。 (Georgios Kokolatos) (15)
- pg_receivewal の適切な WAL位置で再開する機能が改善されました。 (Ronan Dunklau) (15)
- pg_rewind にオプション --config-file が追加されました。 (Gunnar Bluth) (15)
これによりベースバックアップの書き出し先を制御することができます。
新たな動作を行う --target 指定は、バックアップをサーバ側に書き込む「server」と、(テスト用に)バックアップを破棄する「blackhole」です。
クライアント側における gzip による圧縮は、以前から対応していました。
これはサーバ側での圧縮とプレーンな出力形式を指定することで実現されます。
これは --compress=lz4 オプションで有効になります。使用するには、PostgreSQL のビルド時に --with-lz4 を指定する必要があります。
これまで pg_receivewal は、ローカルのアーカイブディレクトリに保存されている WALファイルか、送信側サーバの現在の WALフラッシュ位置に基づいて、再開していました。
本変更で、送信サーバが PostgreSQL 15 以降である場合、ローカルアーカイブディレクトリが空でレプリケーションスロットが指定されているときには、レプリケーションスロットのリスタートポイントが判断基準に使われるようになります。
これにより、サーバの設定ファイルがデータディレクトリ外に保存されている場合に簡単に対応できるようになります。
pg_upgrade
- pg_upgrade のログと一時ファイルを pg_upgrade_output.d という名前の新しいクラスタのサブディレクトリに保存するようになりました。 (Justin Pryzby) (15)
- 出力がターミナルでない場合、pg_upgrade 操作中のデフォルトのステータスレポートを無効にするようになりました。 (Andres Freund) (15)
- 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_upgrade が正常に完了すると、これらは自動的に削除されます。
--verbose を使うことで、非tty での使用においてもステータスレポート出力を有効にできます。
以前は、接続が無効である最初のデータベースのみが報告されていました。
これは、テスト目的でのみ推奨されます。
pg_waldump
- pg_waldump の出力をリレーションのファイルノード、ブロック番号、フォーク番号、フルページイメージでフィルタリングできるようになりました。 (David Christensen, Thomas Munro) (15)
- pg_waldump が割り込みで終了する前に統計情報を報告するようになりました。 (Bharath Rupireddy) (15)
- pg_waldump によって報告される Transaction WALレコードの説明が一部について改善されました。 (Masahiko Sawada, Michael Paquier) (15)
- pg_waldump が複数のリソースマネージャに関する情報をダンプできるようになりました。 (Heikki Linnakangas) (15)
例えば、pg_waldump --stats --follow を実行している端末で Ctrl-C を発行すると、終了する前に現在の統計情報が報告されます。これは Windows では機能しません。
これにより、PREPARE TRANSACTION および ROLLBACK PREPARED のレコードにレプリケーション起点情報として、起点ID、LSN、タイムスタンプの記述が追加されます。
これは、--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)
- "char" などに対応した新しい pg_type.typcategory の値「Z」が追加されました。 (Tom Lane) (15)
- ベースバックアップに使用する新しい COPY方式を指定するため、新しいプロトコルメッセージ「TARGET」が追加されました。 (Robert Haas) (15)
- 圧縮方式とオプションを指定する新しいプロトコルメッセージ「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)
- 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)
ABIフィールドの不一致はロード時にエラーを発生させます。
これは内部使用専用の型であることを示します。
pg_basebackup はこの方式を使用するようになりました。
以前は、Windows の拡張では特定の変数のみにアクセス可能でした。
追加モジュール
- 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)
- sepgsql のログメッセージに permissive/enforcing 状態を表示するようになりました。 (Dave Page) (15)
これは排他制約に使用できます。
以前は、特定の場合に不適切な負の値が返されることがありました。
これにより、pg_waldump と同様の SQLレベルの出力が得られます。
postgres_fdw
- postgres_fdw が CASE式をプッシュダウンできるようになりました。 (Alexander Pyhalov) (15)
- postgres_fdw 接続のアプリケーション名を制御するため、設定パラメータ postgres_fdw.application_name が追加されました。 (Hayato Kuroda) (15)
- postgres_fdw サーバで並列コミットができるようになりました。 (Etsuro Fujita) (15)
以前は、リモートセッションの application_name は、リモートサーバ上または postgres_fdw 接続オプションを介してのみ設定できました。postgres_fdw.application_name はカスタマイズ用にエスケープシーケンスをサポートしているため、リモートサーバでそのような接続を簡単に区別できます。
これは CREATE SERVER のオプション parallel_commit で有効になります。
リリースノートにない変更点
- Windows で STATUS_DELETE_PENDING 状態のファイルへのアクセスする場合について対策が改善されました。
12.2 および同時リリースの各マイナーバージョンで一段の対策は施されましたが、引き続き pg_basebackup に失敗するケースが報告されていました。