2017年 10月 の投稿一覧

PostgreSQL 10 に関する技術情報

このページでは PostgreSQL 10(2017/10/5リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

最終更新:2021/10/26

バージョン10の主な拡張点

バージョン10での主な拡張箇所は以下の通りです。

  • パブリッシュ/サブスクライブによる論理レプリケーション
  • 宣言的テーブルパーティショニング
  • 改善された並列問い合わせ
  • 著しい全般の性能改善
  • SCRAM-SHA-256に基づくより強いパスワード認証
  • 改善された監視と制御

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

  • pg_upgrade で PostgreSQL をメジャーバージョンアップした場合は Hash インデックスを
    再構築する必要があります。(Mithun Cy, Robert Haas, Amit Kapila) (10)
  • Hashインデックスの改良のために必要な措置です。
    pg_upgrade コマンドはこの作業を補助するスクリプトを自動生成します。

  • WAL格納ディレクトリが pg_xlog から pg_wal にリネームされました。
    また、トランザクション状態格納ディレクトリも pg_clog から pg_xact にリネームされました。(Michael Paquier) (10)
  • PostgreSQL利用者はしばしばこれらディレクトリ内のファイルを不要ファイルと考えて手動削除しようとする場合がありました。
    これは、復元不可能なデータ損失を招きます。
    このディレクトリ名称変更によって、そのような失敗の回避を試みます。

  • xlog に関連する SQL関数、ツール、オプションの名称が wal に変更されました。 (Robert Haas) (10)
  • たとえば、pg_switch_xlog() は pg_switch_wal() に、pg_receivexlog は pg_receivewal になり、--xlogdir オプションは --waldir オプションに変わります。
    これは、pg_xlog ディレクトリ名が変更されることを受けての変更です。xlog というワードはユーザが利用する場面では使われなくなりました。

  • WAL に関する関数とビュー名で使われていた location というワードが lsn に変更されました。 (David Rowley) (10)
  • これまで 2つの用語が混在していました。

  • 問い合わせの SELECTリスト内に現れる集合を返す関数の実装が変更されました。 (Andres Freund) (10)
  • 集合を返す関数は、LATERALのFROM句の項目に置かれたかのように、SELECTリスト内のスカラ式を評価する前に評価されるようになりました。
    これにより、複数の集合を返す関数が存在する場合に、より穏当なセマンティクスが可能になります。
    関数が行数の異なる結果を返す場合、行数が少ないほうの結果は、NULL を追加することによって最も行数の多い結果に一致するように拡張されます。
    これまでは、すべての関数が同時に終了するまで結果を繰り返し、関数の周期の最小公倍数に等しい行数を生成していました。
    さらに、CASE およびCOALESCE 内で集合を返す関数が使用できなくなりました。

    (9.6 以前の動作例)
    =# SELECT generate_series(1, 2), generate_series(1, 3);
     generate_series | generate_series
    -----------------+-----------------
                   1 |               1
                   2 |               2
                   1 |               3
                   2 |               1
                   1 |               2
                   2 |               3
    (6 rows)
    
    (10 の動作例)
    =# SELECT generate_series(1, 2), generate_series(1, 3);
     generate_series | generate_series
    -----------------+-----------------
                   1 |               1
                   2 |               2
                     |               3
    (3 rows)
    
  • ALTER TABLE ... ADD PRIMARY KEY で列に NOT NULL を指定したとき、その変更が継承の子テーブルにも伝搬されるようになりました。 (Michael Paquier) (10)
  • =# CREATE TABLE p (c int);
    CREATE TABLE
    =# CREATE TABLE t () INHERITS (p);
    CREATE TABLE
    =# ALTER TABLE p ADD PRIMARY KEY (c);
    ALTER TABLE
    
    (9.6 以前の動作例)
    =# \d t
           Table "public.t"
     Column |  Type   | Modifiers
    --------+---------+-----------
     c      | integer |
    Inherits: p
    
    (10 の動作例)
    =# \d t
                     Table "public.t"
     Column |  Type   | Collation | Nullable | Default
    --------+---------+-----------+----------+---------
     c      | integer |           | not null |
    Inherits: p
    
  • 文単位トリガが文ごとに複数回起動されないようになりました。 (Tom Lane) (10)
  • 外側の文、あるいは他の書き込み可能CTEにより更新された同テーブルを更新する書き込み可能CTEを伴う場合、BEFORE STATEMENT または AFTER STATEMENT トリガが 2 回以上起動されます。
    また、外部キー強制動作 (ON DELETE CASCADE など) の影響を受けるテーブルに文単位トリガがあった場合、トリガが外部 SQL 文ごとに起動される可能性があります。
    これは SQL 標準に反するため、変更されました。

  • シーケンスのメタデータフィールドが新しい pg_sequence システムカタログに移動されました。(Peter Eisentraut) (10)
  • シーケンスのリレーションでは、lastvalue、log_cnt、および is_calledという nextval() によって編集可能なフィールドのみが格納されるようになりました。
    開始値や増加量などのほかのシーケンスプロパティは、pg_sequence カタログの対応する行に保持されます。
    ALTER SEQUENCE の更新は完全にトランザクション処理され、コミットするまでシーケンスがロックされます。
    nextval() と setval() 関数はトランザクション扱いされないままです。

    この変更によってもたらされた主な非互換性は、シーケンスのリレーションから選択すると、上記の 3 つのフィールドのみが返されるようになったことです。
    シーケンスのほかのプロパティを取得するには、アプリケーションが pg_sequence を調べなければなりません。新しいシステムビューpg_sequences もこの目的のために使用でき、既存のコードとより互換性のある列名が提供されます。

    シーケンスの psql の \d コマンドの出力も再設計されています。

    (9.6 以前の動作例)
    =# CREATE SEQUENCE s;
    CREATE SEQUENCE
    =# SELECT * FROM s;
     sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
    ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
     s             |          1 |           1 |            1 | 9223372036854775807 |         1 |           1 |       0 | f         | f
    (1 row)
    
    (10 の動作例)
    =# CREATE SEQUENCE s;
    CREATE SEQUENCE
    =# SELECT * FROM s;
     last_value | log_cnt | is_called
    ------------+---------+-----------
              1 |       0 | f
    (1 row)
    
    =# SELECT * FROM pg_sequence WHERE seqrelid = 's'::regclass;
     seqrelid | seqtypid | seqstart | seqincrement |       seqmax        | seqmin | seqcache | seqcycle
    ----------+----------+----------+--------------+---------------------+--------+----------+----------
        16405 |       20 |        1 |            1 | 9223372036854775807 |      1 |        1 | f
    (1 row)
    
    =# SELECT * FROM pg_sequences WHERE sequencename = 's';
     schemaname | sequencename | sequenceowner | data_type | start_value | min_value |      max_value      | increment_by | cycle | cache_size | last_value
    ------------+--------------+---------------+-----------+-------------+-----------+---------------------+--------------+-------+------------+------------
     public     | s            | postgres      | bigint    |           1 |         1 | 9223372036854775807 |            1 | f     |          1 |
    (1 row)
    
  • pg_basebackup がデフォルトでバックアップをリストアするために必要な WAL をストリームするようになりました。(Magnus Hagander) (10)
  • これにより、pg_basebackup の -X/--xlog-method のデフォルトが stream に変更されました。以前の動作を再現するために、オプション値 none が追加されました。pg_basebackup のオプション -x が削除されました (代わりに、-X
    fetch を使用します)。

  • pg_hba.conf の論理レプリケーション設定行の書式が変わりました。 (Peter Eisentraut) (10)
  • これまで、論理レプリケーション接続は pg_hba.conf の database カラムに replicationキーワードを指定していました。
    今回のリリースで replication キーワードは物理レプリケーションのみで指定され、論理レプリケーションはデータベース名や all等のキーワードを指定できるようになりました。
    この変更はサードパーティー製の論理レプリケーションプラグインを使っているユーザにのみ影響します。

  • pg_ctl コマンドがデフォルトで起動または停止処理が完了するまで待つようになりました。(Peter Eisentraut) (10)
  • 以前はいくつかの pg_ctl の動作は完了を待たず、-w を使用する必要がありました。

  • サーバパラメータの log_directory のデフォルト値が pg_log から log に変更されました。 (Andreas Karlsson) (10)
  • カスタム OpenSSL DH パラメータのファイル名を指定する設定オプション ssl_dh_params_file が追加されました。(Heikki Linnakangas) (10)
  • これは、ハードコードされた、文書化されていないファイル名 dh1024.pem を置き換えます。dh1024.pem はデフォルトでは検査されません。
    カスタムDHパラメータを使用する場合は、このオプションを設定する必要があります。

  • OpenSSLの短期DH暗号(ephemeral DH ciphers) に使用されるデフォルトのDHパラメータのサイズが 2048ビットに増やされました。(Heikki Linnakangas) (10)
  • コンパイルされた DH パラメータのサイズが 1024 から 2048 ビットに増やされ、DH鍵共有がブルートフォース攻撃に対してより強くなりました。しかし、いくつかの古い SSL実装、とくに Java Runtime Environment バージョン 6 のいくつかのリビジョンでは、1024ビットより長い DHパラメータを受けつけないため、
    SSL経由で接続することができません。このような古いクライアントをサポートする必要がある場合は、コンパイルされたデフォルトの代わりにカスタムの 1024ビットDHパラメータを使用してください。

  • 暗号化されていないパスワードをサーバに格納する機能が削除されました。 (Heikki Linnakangas) (10)
  • password_encryption サーバパラメータは、off または plain をサポートしなくなりました。CREATE / ALTER USER ... PASSWORD では、UNENCRYPTED オプションがサポートされなくなりました。同様に、createuser から --unencrypted オプションが削除されました。
    以前のバージョンから移行された暗号化されていないパスワードは、このリリースでは暗号化されて格納されます。
    password_encryption のデフォルト設定はまだ md5 です。

  • パラレルクエリを制御するために、min_parallel_table_scan_size および min_parallel_index_scan_size サーバパラメータが追加されました。(Amit Kapila, Robert Haas) (10)
  • これらは min_parallel_relation_size を置き換えます。これは、あまりにも一般的であることが判明したためです。

  • shared_preload_libraries および関連するサーバパラメータ内の引用符で囲まれていないテキストを小文字に変換しないようになりました。(QL Zhuo) (10)
  • これらの設定は実際にはファイル名のリストですが、以前は異なる構文解析ルールをもつSQL識別子のリストとして扱われていました。

  • sql_inheritance サーバーパラメータが削除されました。 (Robert Haas) (10)
  • この設定をデフォルト値から変更すると、親テーブルを参照する問い合わせで子テーブルが含まれなくなりました。ただし、SQL 標準ではそれらを含む必要があります。これは PostgreSQL 7.1 以降のデフォルトです。

  • 多次元配列を PL/Python 関数に渡し、ネストされた Python リストとして返すことが可能になりました。 (Alexey Grishchenko, Dave Cramer, Heikki Linnakangas) (10)
  • この機能では、PL/Python で複合型の配列の処理に後方互換性のない変更が必要となります。以前は、[[col1, col2], [col1, col2]] などの書式で複合値の配列を返すことができました。
    これは 2 次元配列として解釈されます。
    あいまいさを解決するために、配列の複合型をリストではなく Python タプルとして記述する必要があります。
    つまり、代わりに [(col1, col2), (col1, col2)] と記述します。

  • PL/Tcl のモジュール自動ロード機能が削除されました。 (Tom Lane) (10)
  • この機能は、新しいサーバパラメータ pltcl_start_proc と pltclu_start_proc に置き換えられます。これは、使いやすく、ほかの PL で利用できる機能と同じにするためです。

  • pg_dump/pg_dumpall で 8.0 より前のサーバからのダンプがサポートされなくなりました。 (Tom Lane) (10)
  • 8.0 より前のサーバからダンプする必要があるユーザは、PostgreSQL 9.6 以前のダンププログラムを使用する必要があります。
    結果の出力は引き続き新しいサーバで正常に読み込めます。

  • 時刻データの浮動小数点数サポートが廃止されました。 (Tom Lane) (10)
  • これによってコンパイルオプションの --disable-integer-datetimes が取り除かれました。浮動小数点 timestamp は殆ど利点がなく、PostgreSQL 8.3 以来デフォルトで無効でした。

  • PostgreSQL 6.3 からクライアント側でサポートされていない
    フロントエンド/バックエンドプロトコルの version 1.0 が取り除かれました。 (Tom Lane) (10)
  • contrib/tsearch2 モジュールが取り除かれました。 (Peter Eisentraut) (10)
  • このモジュールは、PostgreSQL 8.3 以前のリリースで用意された全文検索との互換性を提供していました。

  • createlang および droplang コマンドが取り除かれました。 (Peter Eisentraut) (10)
  • これらは PostgreSQL 9.1 から非推奨となっていました。
    これらのコマンドの代わりに CREATE EXTENSION および DROP EXTENSION 文を使ってください。

  • Version-0 呼び出し規約のサポートを終了しました。(Andres Freund) (10)
  • C 言語関数を提供する拡張機能は Version-1 呼び出し規約に準拠しなければならなくなりました。Version-0 は 2001 年から非推奨となっています。

変更点

サーバ

並列問い合わせ
  • 並列のB-treeインデックススキャンに対応しました。(Rahila Syed, Amit Kapila, Robert Haas, Rafia Sabih) (10)
  • この変更でB-treeインデックスページを各パラレルワーカから検索できるようになりました。

  • 並列のビットマップヒープスキャンに対応しました。(Dilip Kumar) (10)
  • これにより一つのインデックススキャンを各パラレルワーカにヒープの異なる部分を担当するように割り当てできるようになりました。

  • マージ結合を並列に実行できるようになりました。(Dilip Kumar) (10)
  • 関連しないいくつかの副問い合わせを並列に実行できるようになりました。 (Amit Kapila) (10)
  • パラレルワーカがあらかじめソートされたデータを返せるようになりました。 (Rushabh Lathia) (10)
  • 手続き言語関数において並列問い合わせが使われる箇所が増えました。(Robert Haas, Rafia Sabih) (10)
  • 並列問い合わせに使うことができるワーカプロセス数を制限するmax_parallel_workersサーバパラメータが追加されました。 (Julien Rouhaud) (10)
  • 並列問い合わせ以外にワーカプロセスを確保するために、このパラメータをmax_worker_processesよりも小さく設定する使い方ができます。

インデックス
  • WALにハッシュインデックス対応が加わりました。(Amit Kapila) (10)
  • これはハッシュインデックスをクラッシュセーフかつレプリケーション可能にします。
    これまでのこれらの使用に関する(クラッシュセーフではなく、レプリケーションできない、という)警告は取り除かれました。

  • ハッシュインデックスの性能を改善しました。 (Amit Kapila, Mithun Cy, Ashutosh Sharma) (10)
  • INET、CIDRデータ型に対して SP-GiSTインデックス対応が追加されました。(Emre Hasegeli) (10)
  • BRINインデックスの要約をより積極的に行うオプションが追加されました。 ( lvaro Herrera(10)
  • 新たな CREATE INDEX のオプションは新たなページ範囲が作られたときに以前の BRINページ範囲の自動要約を可能にします。

  • インデックス範囲のBRIN要約を削除し、再び加える関数が追加されました。 ( lvaro Herrera(10)
  • 新たなSQL関数 brin_summarize_range()は指定された範囲の BRINインデックス要約を更新し、brin_desummarize_range()はそれを削除します。
    これは UPDATE と DELETE のために今やより小さくなった範囲の要約を更新するのに役立ちます。

  • BRINインデックススキャンが有益かどうかの判断の精度が改善されました。 (David Rowley, Emre Hasegeli) (10)
  • 従来はBRIN使用コストを過剰に楽観的に見積もっていました。

  • インデックス空間をより効率的に再利用することで、より速いGiSTの挿入と更新が可能になりました。(Andrey Borodin) (10)
  • GINインデックスのバキュームの間のページロック取得が減りました。 (Andrey Borodin) (10)
ロック
  • テーブルパラメータを変更するのに求められるロック取得が減りました。(Simon Riggs, Fabr zio Mell)(10)
  • 例えば、テーブルの effective_io_concurrency設定の変更がより軽量なロックで可能になりました。

  • 述語ロックの昇格閾値を調整できるようになりました。 (Dagfinn Ilmari Manns k)(10)
  • ロック昇格が二つの新たなサーバパラメータmax_pred_locks_per_relation、max_pred_locks_per_page を通して制御できるようになります。

オプティマイザ
  • 相関率と値の種類数を計算するための複数列オプティマイザ統計が追加されました。(Tomas Vondra, David Rowley, lvaro Herrera(10)
  • そのために新たなコマンド CREATE STATISTICS、ALTER STATISTICS、DROP STATISTICS が追加されました。この機能は問い合わせのメモリ使用を見積りするのと、別々の列の統計を結びつけるときに役立ちます。

  • 行単位セキュリティの影響を受ける問い合わせの性能が改善されました。(Tom Lane) (10)
  • オプティマイザはRLSフィルタ条件を置けるところでより多くの知識をもつようになり、RLS条件を強制しても安全で場合により良いプラン生成が可能になりました。

性能
  • numeric型の計算を使った合計を計算する集約関数が高速化されました。 (Heikki Linnakangas) (10)
  • SUM()、AVG()、およびSTDDEV()のいくつかの別形が含まれます。

  • 基数木を使うことにより文字エンコーディング変換の性能が改善されました。 (Kyotaro Horiguchi, Heikki Linnakangas) (10)
  • プランノード呼び出しオーバーヘッドと同様に、問い合わせ実行時の式評価のオーバーヘッドが削減されました。 (Andres Freund) (10)
  • これは特に多数の行を処理する問い合わせに役立ちます。

  • グループ化セットでハッシュ集約を使えるようにしました。 (Andrew Gierth) (10)
  • いくつかの結合タイプの最適化でユニーク保証を使うようにしました。 (David Rowley) (10)
  • macaddrデータ型のソート性能が改善されました。 (Brandur Leach) (10)
  • 何千ものリレーションを参照するセッションでの統計観測のオーバヘッドが軽減されました。 (Aleksander Alekseev) (10)
監視
  • プラン作成と実行の時間のEXPLAINにおける表示について明示的な制御が可能になりました。 (Ashutosh Bapat) (10)
  • デフォルトではプラン作成と実行の時間は EXPLAIN ANALYZE では表示され、他の場合には表示されません。新たな EXPLAIN オプションの SUMMARY はこれについて明示的な制御ができます。

    「SUMMARY off」指定で末尾に「Planning time:」と「Execution time:」を出さなくした例:

    db1=# EXPLAIN (ANALYZE, SUMMARY off) SELECT * FROM tbl;
                                                QUERY PLAN
    --------------------------------------------------------------------------------------------------
     Seq Scan on tbl  (cost=0.00..22.70 rows=1270 width=36) (actual time=0.017..0.020 rows=3 loops=1)
    (1 row)
    
  • デフォルト監視ロールを追加しました。 (Dave Page) (10)
  • 新たなロール pg_monitor、pg_read_all_settings、pg_read_all_stats、および、pg_stat_scan_tablesがあらかじめ用意されています。

    これらロールはpsqlで「\du」としても出力されず、「\duS」の一覧にあらわれます。

  • REFRESH MATERIALIZED VIEWの際に統計コレクタを適切に更新するようにしました。 (Jim Mlodgenski) (10)
  • これまではリフレッシュしたときに統計コレクタに報告されないケースがありました。バグ修正ですがバックポートしにくい箇所が含まれていました。

監視/ログ
  • log_line_prefix のデフォルト値がサーバログの各行に現在タイムスタンプ(ミリ秒を含む)とプロセスIDを含むように変更されました。 (Christoph Berg) (10)
  • 以前のデフォルトは空でした。

  • ログおよびWALのディレクトリ内容を返す関数が追加されました。 (Dave Page) (10)
  • 新たな関数 pg_ls_logdir() および pg_ls_waldir() は適切な権限があれば非スーパーユーザでも実行できます。

  • ログコレクタの現在の stderr と csvlog出力のファイル名を読み取る関数 pg_current_logfile()が追加されました。 (Gilles Darold) (10)
  • postmaster起動時のサーバログで各待ち受けソケットについてアドレスとポート番号を報告するようになりました。 (Tom Lane) (10)
  • また、待ち受けソケットのバインド失敗がログ出力されるとき、バインドを試みた特定アドレスがログに含まれるようになります。

    起動メッセージ例:
    2017-10-24 14:35:02.468 JST [6984] LOG:  listening on IPv4 address "127.0.0.1", port 5432
    2017-10-24 14:35:02.533 JST [6984] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
    2017-10-24 14:35:02.630 JST [6984] LOG:  redirecting log output to logging collector process
    2017-10-24 14:35:02.630 JST [6984] HINT:  Future log output will appear in directory "log".
    
    起動失敗メッセージ例:
    2017-10-24 14:39:47.346 JST [7147] LOG:  could not bind IPv4 address "10.10.10.72": Address already in use
    2017-10-24 14:39:47.346 JST [7147] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
    2017-10-24 14:39:47.346 JST [7147] WARNING:  could not create listen socket for "10.10.10.72"
    2017-10-24 14:39:47.346 JST [7147] FATAL:  could not create any TCP/IP sockets
    
  • ランチャーサブプロセスの開始と停止についてログのおしゃべりを削減しました。 (Tom Lane) (10)
  • 「autovacuum launcher started」や「logical replication launcher shutting down」はDEBUG1レベルのメッセージとなります。

  • log_min_messages で制御される小さい数のデバッグレベル(DEBUG3以下)でのメッセージの冗長度を減らしました。 (Robert Haas) (10)
  • また、client_min_messages のデバッグレベルにおいても冗長度を変更しました。

監視/pg_stat_activity
  • pg_stat_activity に低レベル待機状態の報告が加わりました。 (Michael Paquier, Robert Haas, Rushabh Lathia) (10)
  • この変更で多数の低レベル待機状態の報告が可能になりました。この中にはラッチ待機、ファイルの読み/書き/同期、クライアントの読み/書き、および、同期レプリケーションが含まれます。

    待機状態を表示させた例:

    =# SELECT pid, wait_event_type, wait_event, state FROM pg_stat_activity ;
     pid  | wait_event_type |     wait_event      |        state
    ------+-----------------+---------------------+---------------------
     7316 | Activity        | AutoVacuumMain      |
     7318 | Activity        | LogicalLauncherMain |
     7474 |                 |                     | idle in transaction
     7354 | Client          | ClientRead          | idle
     7357 |                 |                     | active
     7475 | Lock            | transactionid       | active
     7476 |                 |                     | idle in transaction
     7519 | LWLock          | lock_manager        | active
     7314 | Activity        | BgWriterHibernate   |
     7313 | Activity        | CheckpointerMain    |
     7315 | Activity        | WalWriterMain       |
    (10 rows)
    
  • pg_stat_activityで補助プロセス、バックグラウンドワーカ、およびwalsenderプロセスが表示されるようになりました。 (Kuntal Ghosh, Michael Paquier) (10)
  • これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。

    pg_stat_activity.backend_type の出力例:

    db1=# SELECT pid, backend_type FROM pg_stat_activity ;
     pid  |    backend_type
    ------+---------------------
     7316 | autovacuum launcher
     7318 | background worker
     7320 | client backend
     7354 | client backend
     7357 | client backend
     7314 | background writer
     7313 | checkpointer
     7315 | walwriter
    (8 rows)
    
  • pg_stat_activityで補助プロセス、バックグラウンドワーカ、およびwalsenderプロセスが表示されるようになりました。 (Kuntal Ghosh, Michael Paquier) (10)
  • これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。

    pg_stat_activity.backend_type の出力例:

    db1=# SELECT pid, backend_type FROM pg_stat_activity ;
     pid  |    backend_type
    ------+---------------------
     7316 | autovacuum launcher
     7318 | background worker
     7320 | client backend
     7354 | client backend
     7357 | client backend
     7314 | background writer
     7313 | checkpointer
     7315 | walwriter
    (8 rows)
    
  • pg_stat_activityでパラレルワーカで実行されているSQL問い合わせを見ることができるようになりました。 (Rafia Sabih) (10)
  • pg_stat_activity.wait_event_type の値の LWLockTranche と LWLockNamedが LWLock に改名されました。 (Robert Haas) (10)
  • これは出力をより一貫したものにします。

認証
  • パスワードのネゴシエーションと格納に SCRAM-SHA-256 のサポートが追加されました。 (Michael Paquier, Heikki Linnakangas) (10)
  • これは既存の md5 によるネゴシエーションと格納の方式よりも良いセキュリティを提供します。

  • password_encryptionサーバパラメータが boolean から enum に変更されました。 (Michael Paquier) (10)
  • これは追加的なパスワードハッシュオプションに対応するのに必要でした。これからは md5 か plain かを指定するようになります。

  • pg_hba.conf の内容を表示するビュー pg_hba_file_rules が追加されました。 (Haribabu Kommi) (10)
  • 現在有効な設定状態ではなくファイル内容を表示します。

  • 複数のRADIUSサーバに対応しました。 (Magnus Hagander) (10)
サーバ設定
  • SSL設定が設定リロードで更新できるようになりました。 (Andreas Karlsson, Tom Lane) (10)
  • しかしながら、SSL設定のリロードは、サーバのSSLキーがパスフレーズを必要とする場合、パスフレーズのプロンプトを再度出す手段が無いので、動作しません。この場合、PostgreSQLを再起動しない限り、元の設定が適用されます。

  • bgwriter_lru_maxpages の最大値が事実上無制限になりました。 (Jim Nasby) (10)
信頼性
  • ファイルを作成または削除(unlink)した後に、その親ディレクトリにfsyncを実行するようになりました。 (Michael Paquier) (10)
  • これは電源障害後のデータ損失のリスクを削減します。

信頼性/WAL
  • 不要なチェックポイントと WALアーカイブを、これら処理がなければアイドル状態のシステムにおいては、実行しないようになりました。 (Michael Paquier) (10)
  • WALに詳細情報を追加する wal_consistency_checkingサーバパラメータが追加されました。 (Kuntal Ghosh, Robert Haas) (10)
  • これはスタンバイサーバでWALの正常性チェックを可能にします。あらゆる正常性チェック失敗はスタンバイ上で致命的エラーをひき起こします。

  • 設定可能な最大WALセグメントサイズが 1GB に増えました。 (Beena Emerson) (10)
  • より大きいWALセグメントサイズで、より少ない archive_command の起動とより少ない WALファイル制御を実現できます。

レプリケーションとリカバリ

  • スタンバイサーバにテーブルを論理レプリケートする機能が追加されました。 (Petr Jelinek) (10)
  • 論理レプリケーションは、異なる PostgreSQLメジャーバージョン間でのレプリケーションや選択的レプリケーションを含め、物理レプリケーションよりも柔軟に構成できます。

  • synchronous_standby_names での出現順序にかかわりなくスタンバイサーバからのコミット承認を待てるようになりました。 (Masahiko Sawada) (10)
  • これまではサーバは常に synchronous_standby_names の先頭に現れるアクティブなスタンバイを待機しました。新たな synchronous_standby_namesキーワード「ANY」は、順序にかかわりなく任意の数のスタンバイを待つことを可能にします。
    これはクォーラムコミットとして知られています。

  • ストリーミングでのバックアップとレプリケーションに必要な設定変更が削減されました。 (Magnus Hagander, Dang Minh Huong) (10)
  • pg_hba.confのデフォルトでローカルホスト接続からのレプリケーションが使用可能になりました。 (Michael Paquier) (10)
  • これまではpg_hba.confのレプリケーション接続の行はデフォルトではコメントアウトされていました。

  • pg_stat_replicationにレプリケーション遅延時間を報告する列が追加されました。 (Thomas Munro) (10)
  • 新たな列はwrite_lag、flush_lag、および、replay_lagです。

  • recovery.confでリカバリ停止点をログシーケンス番号(LSN)で指定できるようにしました。 (Michael Paquier) (10)
  • これまでは停止点はタイムスタンプかXIDでしか指定できませんでした。

  • pg_stop_backup()で、全WALがアーカイブされるのを待機することをしない動作モードが設けられました。 (David Steele) (10)
  • pg_stop_backup()のオプションの第2引数でこの振る舞いを制御します。

  • 一時レプリケーションスロットを作成できるようになりました。 (Petr Jelinek) (10)
  • 一時スロットはセッション終了またはエラーで自動的に削除されます。

  • Access Exclusiveロックのより良い追跡で、ホットスタンバイのリプレイの性能が改善されました。 (Simon Riggs, David Rowley) (10)
  • 2相コミットのリカバリ性能が高速化されました。 (Stas Kelvich, Nikhil Sontakke, Michael Paquier) (10)

問い合わせ

  • XML整形されたデータを行の集合に変換する XMLTABLE関数を追加しました。 (Pavel Stehule, Alvaro Herrera) (10)
  • 標準の行生成構文を UPDATE ... SET (column_list) = row_constructor で使えるようにしました。 (Tom Lane) (10)
  • row_constructorはキーワードROWで始めることができるようになりました。これまでは省略する必要がありました。また、row_constructor内に table_name.* が生じた場合は、他での row_constructor の使用のように、複数列に展開されるようになります。

    (9.6.x以前のバージョンでは以下の書き方がエラーになりました)
    db1=# UPDATE t61 SET (c1, c2) = ROW (2, 2) WHERE id = 1;
    ERROR:  syntax error at or near "ROW"
    
    (10では以下のような書き方もできます)
    db1=# UPDATE t61 SET (id, c1, c2) = ROW (t61a.*)
            FROM t61a WHERE t61.id = t61a.id;
    UPDATE 1
    
  • 正規表現の大きい文字コード、特に U+7FF 以上のユニコード文字を扱う文字クラスが修正されました。 (Tom Lane) (10)
  • これまでは、このような文字は [[:alpha:]] などのロケール依存文字クラスに属するものとして認識されませんでした。

ユーティリティコマンド

  • 自動的にパーティション制約を作り、タプルの挿入と更新の振り分けを行う、テーブルパーティショニング構文が追加されました。 (Amit Langote) (10)
  • この構文は範囲パーティショニングとリストパーティショニングに対応します。

  • AFTERトリガに行の変更を記録する遷移テーブルが追加されました。 (Kevin Grittner, Thomas Munro) (10)
  • 遷移テーブルはサーバサイド言語で書かれたトリガからアクセスできます。

  • 制限的な行単位セキュリティポリシーが可能になりました。 (Stephen Frost) (10)
  • これまでは全てのセキュリティポリシーは許容的で、マッチする任意のポリシーはアクセスを許すことを意味しました。制限的ポリシーでは許可されたアクセスにマッチしなければなりません。これらのポリシータイプを組み合わせることもできます。

  • 外部キー制約を作るとき、REFERENCES権限のチェックを被参照テーブルにだけ行うようになりました。 (Tom Lane) (10)
  • これまでは参照するテーブルのREFERENCES権限も必要でした。これはSQL標準の誤読から生じました。外部キー(あるいは何らか他のタイプの)制約を作るには、制約されるテーブルに所有権が必要で、加えてREFERENCES権限が必要というのはあまり意味がありません。

  • スキーマのデフォルトのアクセス権限が設定可能になりました。 (Matheus Oliveira) (10)
  • これは ALTER DEFAULT PRIVILEGES コマンドを使って行われます。あるロールでスキーマを作ったときの、作られたスキーマのデフォルト権限を設定できます。

  • ある整数データ型に一致するシーケンスを作る CREATE SEQUENCE ASコマンドが追加されました。 (Peter Eisentraut) (10)
  • これは基となる列の値の範囲に一致するシーケンスの作成を簡単にします。

    (以下のように使用します)
    db1=# CREATE SEQUENCE seq68 AS smallint;
    CREATE SEQUENCE
    
    db1=# SELECT * FROM pg_sequence WHERE seqrelid = 'seq68'::regclass;
     seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle
    ----------+----------+----------+--------------+--------+--------+----------+----------
        16450 |       21 |        1 |            1 |  32767 |      1 |        1 | f
    (1 row)
    
  • INSTEAD INSERTトリガを持つビューに対する COPY 《ビュー》 FROM ... が可能になりました。 (Haribabu Kommi) (10)
  • このトリガには COPYで読み取られたデータ行が与えられます。

  • 唯一であるなら DDLコマンドで引数無しに関数名の指定が可能なりました。 (Peter Eisentraut) (10)
  • その名前をもつ関数が一つだけしかないなら、以下例のように引数なしで関数名だけの DROP FUNCTION 等が可能です。この振る舞いはSQL標準で必要とされているものです。

    (例)
    db1=# CREATE FUNCTION my_function_70(int, text, timestamptz) RETURNS boolean
            LANGUAGE sql AS $$ SELECT true; $$;
    CREATE FUNCTION
    db1=# ALTER FUNCTION my_function_70 IMMUTABLE;
    ALTER FUNCTION
    db1=# DROP FUNCTION my_function_70;
    DROP FUNCTION
    
  • 複数の関数、演算子、および集約が一つの DROPコマンドで削除できるようになりました。 (Peter Eisentraut) (10)
  • (以下の書き方ができるようになります)
    db1=# DROP FUNCTION my_function_71a, my_function_71b, my_function_71c;
    DROP FUNCTION
    
  • CREATE SERVER、CREATE USER MAPPING、および、CREATE COLLATION にて、「IF NOT EXISTS」構文に対応しました。 (Anastasia Lubennikova, Peter Eisentraut) (10)
  • VACUUM VERBOSE がスキップした凍結されたページの数と最も古いxminを報告するようになりました。 (Masahiko Sawada, Simon Riggs) (10)
  • この情報は log_autovacuum_min_duration 設定に基づくログ出力にも含まれるようになります。

  • VACUUMが末尾の空ヒープページを除去する速度を改善しました。 (Claudio Freire, Alvaro Herrera) (10)

データ型

  • テキスト検索がJSONとJSONBに対応しました。 (Dmitry Dolgov) (10)
  • 関数ts_headline()とto_tsvector()がこれらのデータ型に対して使用できるようになりました。

  • 新たなデータ型macaddr8 として EUI-64形式の MACアドレスに対応しました。 (Haribabu Kommi) (10)
  • これは既存の EUI-48形式の MACアドレスの対応(macaddr型)を補完します。

  • 挿入する列に数値を割り当てるための構文 GENERATED .. AS IDENTITY が追加されました。 (Peter Eisentraut) (10)
  • これはSERIAL列と似ていますが、こちらの方がSQL標準準拠です。

    (以下のように使用できます)
    db1=# CREATE TABLE t77 (id int GENERATED ALWAYS AS IDENTITY, v text);
    CREATE TABLE
    db1=# INSERT INTO t77 (v) VALUES ('AA'), ('BB'), ('CC');
    INSERT 0 3
    db1=# SELECT * FROM t77;
     id | v
    ----+----
      1 | AA
      2 | BB
      3 | CC
    (3 rows)
    
  • ENUM値が改名できるようになりました。 (Dagfinn Ilmari Mannsaker) (10)
  • ALTER TYPE ... RENAME VALUE ... で以下のように改名できます。

    db1=# CREATE TYPE enum78 AS ENUM ('X', 'Y', 'Z');
    db1=# CREATE TABLE t78 (c enum78);
    db1=# INSERT INTO t78 VALUES ('X'),('Y'),('Z');
    db1=# ALTER TYPE enum78 RENAME VALUE 'Z' TO 'ZZ';
    db1=# SELECT * FROM t78;
     c
    ----
     X
     Y
     ZZ
    (3 rows)
    
  • 配列の擬似型(anyarray)を to_json() と to_jsonb() で配列として適切に扱うようになりました。 (Andrew Dunstan) (10)
  • これまでは anyarray として宣言された列(特に pg_statsビューの内のもの)が配列でなく JSON文字列に変換されていました。

  • money型の値とint8型の値の積と除算の演算子が追加されました。 (Peter Eisentraut) (10)
  • これまではこのような場合、結果として int8型の値が float8型に変換されて、money型とfloat8型の演算子が使われていました。新たな振る舞いは起こりうる精度損失を回避します。しかし、money型の int8型での除算は、他の整数除算の場合のように商を切り捨てするようになったことに注意してください。一方、従来の振る舞いでは丸めていました。

  • money型の入力関数でオーバーフローの検査をするようになりました。 (Peter Eisentraut) (10)

関数

  • 簡易化したregexp_match()関数が追加されました。 (Emre Hasegeli) (10)
  • これは regexp_matches() と似ていますが、最初のマッチからの結果だけを返すので集合を返す必要がなく、単純な場合により簡単に使えます。

  • jsonb の削除演算子として、削除するキー配列を取る版が追加されました。 (Magnus Hagander) (10)
    • (以下のように使用できます) db1=# SELECT '{"a":10, "b":20, "c":30}'::jsonb - '{a,c}'::text[]; ?column? ----------- {"b": 20} (1 row)
  • json_populate_record()と関連する関数がJSONの配列とオブジェクトを再帰的に処理するようになりました。 (Nikita Glukhov) (10)
  • この変更で、あて先のSQL型の配列型フィールドが適切にJSON配列から変換され、複合型フィールドは適切にJSONオブジェクトから変換されます。これまでこのような場合は、JSON値のテキスト表現が array_in() または record_in() に与えられて、その構文が入力関数の期待と一致しないために、失敗していました。

    (10で以下のような処理が可能になりました)
    db1=# CREATE TYPE typ84 AS (k1 int, v1 int);
    db1=# CREATE TABLE t84 (id int, v typ84);
    db1=# SELECT * from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1": 10}}');
     id |   v
    ----+--------
      1 | (1,10)
    (1 row)
    db1=# SELECT (v).v1 from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1":10}}');
     v1
    ----
     10
    (1 row)
    
  • 現在のトランザクションIDか、トランザクションIDが割り当てされていないときには NULLを返す関数txid_current_if_assigned()が追加されました。 (Craig Ringer) (10)
  • txid_current()とは異なり、トランザクションIDが割り当てされていないときにトランザクションIDを新たに割り当てようとしないため、本関数はスタンバイサーバでも実行できます。

  • あるトランザクションがコミットされたかどうかチェックする関数 txid_status()が追加されました。 (Craig Ringer) (10)
  • これは突発切断後において、前トランザクションがコミット済で応答を受け取れなかっただけなのか、コミットもされていないのかを検査するのに有益です。

  • make_date()がマイナス年をBC年と解釈できるようになりました。 (Alvaro Herrera) (10)
  • to_timestamp()とto_date()が範囲外の入力フィールドを拒否するようになりました。 (Artur Zakirov) (10)
  • 例えば、これまでは to_date('2009-06-40','YYYY-MM-DD') は受け入れられて 2009-07-10 を返しました。これからはエラーが生じます。

サーバサイド言語

  • PL/Pythonの cursor()関数と execute()関数をそれらのプランオブジェクト引数のメソッドとして呼べるようになりました。 (Peter Eisentraut) (10)
  • よりオブジェクト指向プログラミング的なスタイルが可能になります。

  • PL/pgSQLの GET DIAGNOSTICS文が配列要素に値を取り込むめるようになりました。 (Tom Lane) (10)
  • これまでは、構文上の制限であて先の変数を配列要素にすることが妨げられていました。

PL/Tcl
  • PL/Tcl関数が複合型と集合を返せるようになりました。 (Karl Lehenbauer) (10)
  • PL/Tclにサブトランザクションコマンドが追加されました。 (Victor Wagner) (10)
  • これにより PL/Tclの問い合わせが関数全体の中断なしに失敗できるようになります。

  • サーバパラメータpltcl_start_proc、pltclu_start_proc が追加されました。 (Tom Lane) (10)
  • PL/Tcl開始に際して初期化関数が呼ばれるようにできます。

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

  • libpqの接続文字列とURIで複数のホスト名またはアドレスを指定できるようになりました。 (Robert Haas, Heikki Linnakangas) (10)
  • libpqはリスト中の最初の応答するサーバに接続します。

    (以下のように複数サーバを記述できます)
    $ psql 'host=dbhost1,dbhost2 port=5432,5432 dbname=db1 user=user1'
    
  • libpq接続文字列とURIが読み/書きホストを要求できるようになりました。 (Victor Wagner, Mithun Cy) (10)
  • libpqの接続パラメータ target_session_attrs で、'any' でなく 'read-write' を指定すると、読み書き可能な接続に限定されます。
    ホットスタンバイサーバでなくマスタサーバでなければならないという指定に応用できます。なお、ALTER ROLE ... SET default_transaction_read_only TO on; としてあるロールで接続を試みた場合も、接続に失敗するようになります。

    以下例では、5432ポートの PostgreSQLに接続すると readonlyになる場合には、2番目の 5433ポートの PostgreSQL に接続されます。

    $ psql 'host=127.0.0.1,127.0.0.1 port=5432,5433 dbname=db1 user=u1 target_session_attrs=read-write'
    
  • パスワードファイル名を libpq の接続パラメータとして指定できるようになりました。 (Julian Markwort) (10)
  • これまでは環境変数を通してのみ指定できました。

  • クライアント側でより多くの暗号化パスワードタイプを作ることができる、関数 PQencryptPasswordConn() が追加されました。 (Michael Paquier, Heikki Linnakangas) (10)
  • これまでは MD5で暗号化されたパスワードのみが PQencryptPassword() を使って作成できました。新たな関数は SCRAM-SHA-256 で暗号化されたパスワードも作成できます。

  • ecpgプリプロセッサバージョンが 4.12 から 10 に変更されました。 (Tom Lane) (10)
  • 今後は ecpgバージョンが PostgreSQL配布バージョン番号と一致します。

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

psql
  • psqlが条件分岐に対応しました。 (Corey Huinker) (10)
  • この機能は psql にメタコマンド \if、\elif、\else、\endif を加えます。主としてスクリプト作成に役立ちます。

  • psql に \gxメタコマンドを追加しました。 (Christoph Berg) (10)
  • これは拡張モード(\x)で問い合わせを実行(\g)します。

  • psqlの変数参照をバッククォート実行の文字列内でも利用可能になりました。 (Tom Lane) (10)
  • これは特に新たな psql の条件分岐コマンドにおいて役立ちます。

    (psqlスクリプトでの使用例)
    \set param 123
    \echo `judge is:`
    \echo `/opt/bin/judge.sh :param`
    \if `/opt/bin/judge.sh :param`
      \i special_proc.sql
    \endif
    
  • psql の特別変数が不正な値に設定されるのを防止しました。 (Daniel Verite, Tom Lane) (10)
  • これまでは、psqlの特別変数を不正な値に設定すると、特にエラーが出ないまま、結果としてデフォルトの振る舞いになりました。これからは特別変数に対する \set で指定値が無効であったときエラーになります。
  • 特例として真偽値を持つ特別変数に対する空または省略された新たな値での \set は、依然として値を on に設定した効果を持ちます。ただし、この場合でも特別変数に空文字が保持されることはなくなります。

    (以下は9.6.x以前バージョンではエラーが出ませんでした)
    db1=# \set FETCH_COUNT xxx
    invalid value "xxx" for "FETCH_COUNT": integer expected
    
    (以下は9.6.x以前のバージョンですと変数値が空文字列になっていました)
    db1=# \set AUTOCOMMIT
    db1=# \echo :AUTOCOMMIT
    on
    

    また、特別変数に対する \unset は、これからは明示的に値をそのデフォルト値に設定します。

  • サーババージョンとpsqlバージョンを表示する変数を追加しました。 (Fabien Coelho) (10)
  • 変数 VERSION_NUM、VERSION_NAME、SERVER_VERSION_NUM、SERVER_VERSION_NAME が利用できます。

  • psqlの \d(リレーションを表示)と \dD(ドメインを表示)コマンドが、照合順序、NULL可能か、および、個々の列のデフォルト属性を表示するように改良されました。 (Peter Eisentraut) (10)
  • これまではこれらは一つの Modifiers 列の中に示されていました。

  • \d コマンドがマッチするオブジェクトが無い場合により一貫性のある処理をするようになりました。 (Daniel Gustafsson) (10)
  • これからは全てのメッセージを stdout でなく stderr に出力するようになり、メッセージの文言もより一貫性をもったものになります。

  • psqlのタブ補完が改良されました。 (Jeff Janes, Ian Barwick, Andreas Karlsson, Sehrope Sarkuni, Thomas Munro, Kevin Grittner, Dagfinn Ilmari Mannsaker) (10)
pgbench
  • pgbench にログファイルのプレフィックスを制御するオプション --log-prefixが追加されました。 (Masahiko Sawada) (10)
  • pgbenchで複数行にわたるメタコマンドが書けるようになりました。 (Fabien Coelho) (10)
  • 行末にバックスラッシュを書いて次行に継続できるようになります。

  • pgbench で -Mオプションの、他のコマンドラインオプションと関連する位置の制限が取り除かれました。 (Tom Lane) (10)
  • 以前は -M はベンチマークスクリプトを規定するオプション(-f や -b) より先に現れる必要がありました。

サーバアプリケーション

  • pg_receivewal の圧縮を指定するオプション -Z / --compress を追加しました。 (Michael Paquier) (10)
  • pg_recvlogical に終了点を指定するオプション --endpos が追加されました。 (Craig Ringer) (10)
  • これまでは --startpos オプションだけが在りました。

  • initdb のオプション --noclean、--nosync が --no-clean、--no-sync と綴るように改名されました。 (Vik Fearing, Peter Eisentraut) (10)
  • 従来のオプション綴りにも未だ対応しています。

pg_dump/pg_restore
  • pg_restore がスキーマを除外できるようになりました。 (Michael Banck) (10)
  • 新たに -N / --exclude-schema オプションが追加されます。

  • pg_dump に --no-blobs オプションが追加されました。 (Guillaume Lelarge) (10)
  • これはラージオブジェクトをダンプから除外します。

  • pg_dumpall にロールのパスワードを無視するオプション --no-role-passwords が追加されました。 (Robins Tharakan, Simon Riggs) (10)
  • これにより非スーパーユーザからの pg_dumpall が可能になります。本オプションが無いとパスワードが読めないためにエラーになります。

  • スタンバイサーバからのダンプでの同期スナップショットの使用に対応しました。 (Petr Jelinek) (10)
  • これにより pg_dump の -j オプションをスタンバイサーバに対しても使用できるようになります。

  • pg_dump と pg_dumpall で生成された出力ファイルに対して fsync() を発行するようになりました。 (Michael Paquier) (10)
  • プログラム終了前に出力が安全にディスク上に格納されるという、より良い安全性を提供します。この動作は新たな --no-sync オプションで無効にできます。

pg_basebackup
  • pg_basebackup が tarモード(-Ft)で WALストリーミング(-Xs)ができるようになりました。(Magnus Hagander) (10)
  • このとき WAL はベースバックアップとは別の tar ファイルに格納されます。

  • pg_basebackup が一時レプリケーションスロットを使うようになりました。 (Magnus Hagander) (10)
  • pg_basebackup がデフォルトオプションでWALストリーミングを使うとき、一時レプリケーションスロットはデフォルトで使われます。

  • pg_basebackup と pg_receivewal において、必要とされる場所での fsync実行について、より注意深く行われるようになりました。 (Michael Paquier) (10)
  • 潜在的な OSダウン時のデータ損失の可能性を減らす意図の改修です。

  • pg_basebackup に fsync を無効にするオプション --no-sync が追加されました。 (Michael Paquier) (10)
  • pg_basebackup のどのディレクトリを読み飛ばすかの制御が改良されました。 (David Steele) (10)
pg_ctl
  • pg_ctl の昇格操作むけ待機オプションが追加されました。 (Peter Eisentraut) (10)
  • -w で昇格完了を待つことができるようになります。

  • pg_ctl に待機(--wait)、待機無し(--no-wait)のロングオプションが追加されました。 (Vik Fearing) (10)
  • pg_ctlのサーバオプション(-o)にロングオプション(--options)が追加されました。 (Peter Eisentraut) (10)
  • pg_ctl start --wait が接続を試みるのではなく、postmaster.pid を監視してサーバの準備完了を検出するようになりました。 (Tom Lane) (10)
  • postmaster はその接続受付状態を postmaster.pid に報告するように変更されました。そして、pg_ctl はそのファイルを調べて起動が完了したかを検出します。これは従来の方法よりも効率的で信頼でき、起動当初の pg_ctl による接続試行がログに記録されずに済みます。

  • postmasterの起動/停止を待機するときの pg_ctl の応答時間が短縮されました。 (Tom Lane) (10)
  • pg_ctl は postmaster の状態変更を待つときに、これからは1秒に1回ではなく、1秒に10回検査します。

  • 待たされている操作がタイムアウト内に完了しなかった場合、pg_ctl が非ゼロステータスで終了することを保証しました。 (Peter Eisentraut) (10)
  • start、promote 操作は、このような場合に終了ステータスに 0 でなく 1 を返すようになりました。stop操作は以前から常にそのようになっていました。

ソースコード

  • 二要素のリリースバージョン番号に変更されました。 (Peter Eisentraut, Tom Lane) (10)
  • リリース番号はこれからは三要素(例えば 9.6.3)でなく二要素になります(例えば、10.1)。メジャーバージョンは一番目の数だけが増え、マイナーリリースは二番目に数だけが増えます。リリースブランチは単一の数で参照されます(例えば 9.6 でなく 10)。これまでは最初の二つの数がメジャーリリース、最後の数がマイナーリリースでした。

  • pgindent の振る舞いが改良されました。 (Piotr Stefaniak, Tom Lane) (10)
  • FreeBSDプロジェクトによる最近の改良に基づく pg_bsd_indent の新バージョンに切り替えられました。これはおかしなCコード整形の判断をする多数の小さなバグを修正します。最も特記すべきは、たとえ結果としてコードが右端を超えて延びても、(複数行の関数呼び出しのような)括弧内の複数行が開き丸括弧でインデントが揃えられるようになったことです。

  • ICUライブラリが照合順序の対応にオプションで使用できるようになりました。 (Peter Eisentraut) (10)
  • ICUライブラリはバージョン間での照合順序の変更がわかるバージョン付けをしています。これはconfigureオプション --with-icu で有効にできます。デフォルトでは未だオペレーティングシステム固有の照合順序ライブラリを使います。
    yum.postgresql.org サイトでの配布物では --with-icu オプションが使われています。

  • Windows上で自動的に全ての PG_FUNCTION_INFO_V1関数を DLLEXPORTされたものと印付けするようになりました。 (Laurenz Albe) (10)
  • サードパーティコードで extern関数宣言を使っている場合、DLLEXPORTマーカーをそれらの宣言に加える必要があります。

  • SPI関数のSPI_push()、SPI_pop()、SPI_push_conditional()、SPI_pop_conditional()、SPI_restore_connection() は必要ないため除去されました。 (Tom Lane) (10)
  • これら関数の機能はこれからは自動的に行われます。外部モジュールが直ちにアップデートを必要としないように、これら関数はその名前の何もしないマクロとなりますが、最終的にはこれらも取り除かれるはずです。

    本変更の副作用は、SPI_palloc() と付随する関数がこれからはアクティブなSPI接続を必要とすることです。接続が無い場合、これからは単純な palloc() に縮退しません。従来の振る舞いは必ずしも便利ではなく予期せぬメモリリークの危険性が生じました。

  • 共有メモリを動的に割り当てできるようになりました。 (Thomas Munro, Robert Haas) (10)
  • 効果的な固定サイズ割り当てのためにスラブのようなメモリアロケータが追加されました。 (Tomas Vondra) (10)
  • Linux と FreeBSD において SysVセマフォではなく POSIXセマフォを使用するようになりました。 (Tom Lane) (10)
  • これにより、プラットフォームで SysVセマフォ使用量の上限に注意したり、調整したりする必要がなくなります。

  • 64-bitでの原子性の対応が改善されました。 (Andres Freund) (10)
  • ARM64 の 64bitの原子的操作が有効になりました。 (Roman Shaposhnik) (10)
  • 可能であれば遅延の計測にclock_gettime()を使うように切り替えました。 (Tom Lane) (10)
  • clock_gettime() が使えないときには gettimeofday が依然として使われます。

  • 暗号による保護の用途で使われるより頑健な乱数生成器が加わりました。 (Magnus Hagander, Michael Paquier, Heikki Linnakangas) (10)
  • 強い乱数生成器が見つからないと、configure は --disable-strong-random が指定されていない限り、失敗します。しかしながら、このオプション付きですと強いランダム生成器を必要とする pgcrypto関数は使用できません。

  • WaitLatchOrSocket()がWindowsでソケット接続を待つことができるようになりました。 (Andres Freund) (10)
  • tupconvert.c の関数はもはやタプルを単にそれらの中に異なる複合型のOIDを組み込むようには変換しなくなりました。 (Ashutosh Bapat, Tom Lane) (10)
  • 多数派の呼び出し元は複合型OIDについて考慮しませんが、結果タプルが複合Datumとして使われる場合、正しいIDがその中に挿入されるのを確かめる手順となります。

  • SCO と Unixware への移植対応が取り除かれました。 (Tom Lane) (10)
  • 文書のビルド手順が全面的に書き換えられました。 (Alexander Lakhin) (10)
  • PostgreSQL文書をビルドするのに XSLT を使用するようになりました。 (Peter Eisentraut) (10)
  • これまでは Jade、DSSSLおよびJadeTexが使われていました。

  • デフォルトで XSLT のスタイルシートを使って HTML文書をビルドするようになりました。 (Peter Eisentraut) (10)

追加モジュール

  • file_fdw がファイル同様にプログラム出力結果から読み取りできるようになりました。 (Corey Huinker, Adam Gomaa) (10)
  • postgres_fdwで、可能であれば集約関数をリモートサーバにプッシュするようになりました。 (Jeevan Chalke, Ashutosh Bapat) (10)
  • これはリモートサーバから渡されなければならないデータ量を減らし、集約計算の負担を要求元サーバから取り除きます。

  • postgres_fdwで、より多くの場合に結合をリモートサーバにプッシュするようになりました。 (David Rowley, Ashutosh Bapat, Etsuro Fujita) (10)
  • postgres_fdwテーブルのOID列を適切にサポートしました。 (Etsuro Fujita) (10)
  • これまではOID列は常にゼロを返しました。

  • btree_gist と btree_gin でenum型のインデックスが可能になりました。 (Andrew Dunstan) (10)
  • これにより enum が排他制約に使用できます。

  • UUIDデータ型に対する btree_gistインデックスに対応しました。 (Paul Jungwirth) (10)
  • B-treeインデックスの妥当性を検査できる amcheck が追加されました。 (Peter Geoghegan) (10)
  • pg_stat_statements で無視された内容が ? ではなく$N と表示されるようになりました。 (Lukas Fittl) (10)
  • cubeのゼロ次元キューブの扱いが改善されました。 (Tom Lane) (10)
  • pg_buffercacheがより少ないロックで実行可能になりました。 (Ivan Kartyshov) (10)
  • pgstattupleにハッシュインデックスの統計情報を参照する関数pgstathashindex()が追加されました。 (Ashutosh Sharma) (10)
  • pgstattupleの関数の使用を制御するのに GRANT で権限を与えるようにしました。 (Stephen Frost) (10)
  • データベース管理者がこれらの関数を非スーパーユーザで実行可能にできるようになります。

  • pgstattuple がハッシュインデックスを調べるときのロック取得が軽減されました。 (Amit Kapila) (10)
  • pageinspect にページのチェックサムを表示する関数page_checksum()が追加されました。 (Tomas Vondra) (10)
  • pageinspectにページイメージからページ要素を出力する関数bt_page_items()が追加されました。 (Tomas Vondra) (10)
  • pageinspectがハッシュインデックス対応しました。 (Jesper Pedersen, Ashutosh Sharma) (10)

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

  • 標準SQLで特別な構文が定義されている CURRENT_DATE のようなパラメータレス関数の実装が改善された変更の影響で、SELECT 文で表示される列名が変更されました。以前のバージョンでは、関数名と異なる実装依存の列名や他と同一の列名でしたが、本バージョンでは関数名通りの列名となりました。
  • SELECT文で表示される列名の変更があった関数は下記の通りです。

     関数名            | PostgreSQL 9.6.x での出力列名
    -------------------+-------------------------------
     current_date      | date
     current_time      | timetz
     current_timestamp | now
     localtime         | time
     localtimestamp    | timestamp
     current_role      | current_user
     user              | current_user
     current_catalog   | current_database