他のバージョンの文書9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

E.6. リリース9.6

Release date: 2016-09-29

E.6.1. 概要

PostgreSQL9.6の主な強化点には以下のものがあります。

  • シーケンシャルスキャン、結合、集約の並列実行

  • バキューム凍結処理で不要なページスキャンを回避しました

  • 同期レプリケーションで信頼性向上のための複数スタンバイサーバが可能になりました

  • 全文検索でフレーズ(隣接した複数単語)を検索できるようになりました

  • postgres_fdwがリモートでの結合、ソート、UPDATEDELETEに対応しました

  • 特にマルチCPUソケットサーバでのスケーラビリティの領域における、相当な性能改善をしました

上記の項目について以下でより詳細に説明します。

E.6.2. バージョン9.6への移行

以前のリリースからデータを移行したい時は、どのリリースについても、 pg_dumpallを利用したダンプとリストア、 あるいはpg_upgradeの利用が必要です。

バージョン9.6には、以前のバージョンとの互換性に影響する多数の変更点が含まれています。 以下の非互換性に注意してください。

  • pg_stat_activityビューの、プロセスが何を待機しているかの情報を改善しました。 (Amit Kapila, Ildus Kurbangaliev)

    歴史的には重量ロックを待機している場合だけプロセスは待機中と示されていました。 これからは軽量ロックとバッファピンの待機もpg_stat_activityで示されます。 また、待機しているロックのタイプも見えるようになります。 これらの変更はwaiting列をwait_event_typewait_eventで置き換えます。

  • to_char()で時間関連のフィールドにおいて(必要ならば)マイナス符号をフィールド幅の一部としてカウントしません。 (Bruce Momjian)

    例えばto_char('-4 years'::interval, 'YY')-4でなく-04を返すようになります。

  • 無限値の入力に対してextract()が、より合理的に動作するようにしました。 (Vitaly Burovoy)

    歴史的にはextract()関数は与えられたフィールド名が何であっても、無限大のタイムスタンプが与えられたなら単に0を返していました。 これを、要求フィールドが単調増加するもの(例:yearepoch)なら適切にinfinityまたは-infinityを返し、そうでないもの(例:dayhour)ならNULLを返すようにしました。 また、誤ったフィールド名には期待されるエラーを投げます。

  • PL/pgSQLのRAISEコマンドで出力されるメッセージにてCONTEXTの最も内側の行を抑制する機能を取り除きました。 (Pavel Stehule)

    この古くからの後方互換性のための作り込みは、もはや役に立たなくなっていると認められました。

  • デフォルトのテキスト検索パーサをemailおよびhostトークンが数字から始まるのを許すように修正しました。 (Artur Zakirov)

    ほとんどの場合、これはテキスト解析に僅かな違いしかもたらしません。 しかし、このようなアドレスが頻繁に生じるデータを持っているなら、テキスト検索でこの形のアドレスを適切に見つけられるようにするために、従属するtsvector列とインデックスを再構築するだけの価値があるでしょう。

  • contrib/unaccentの標準unaccent.rulesファイルをユニコードむけに知られている全ての発音区別符号を扱うように、また、合字を正しく展開するように拡張しました。 (Thomas Munro, Léonard Benedetti)

    従来バージョンでは一部の一般的でない発音区別符号を伴う文字を変換するのを怠っていました。 また、これからは合字は別々の文字に展開されます。 このルールファイルを使うインストレーションはtsvector列とその結果に依存するインデックスを再構築するのがよいでしょう。

  • CREATE ROLEおよび同種のコマンド群から、長く非推奨とされてきたCREATEUSER/NOCREATEUSERオプションを取り除きました。 (Tom Lane)

    古い後方互換性を理由として、CREATEUSERは実際のところSUPERUSERを意味しました。 このことは常にこれはCREATEROLEの意味だろうと(合理的に)予想するユーザの混乱の元となっていました。 現時点で10年にわたって非推奨でしたので、除去することでこの問題を解決します。

  • pg_で始まるロール名を予約済みとして扱うようにしました。 (Stephen Frost)

    これからはこのようなロール名のユーザ作成は禁止されます。 これによりinitdbで作られた組み込みロールとの競合を防ぎます。

  • information_schema.routinesビュー内の列名をresult_cast_character_set_nameからresult_cast_char_set_nameに変更しました。 (Clément Prévost)

    SQL:2011標準には長い方の名前が記載されていますが、隣の列名では他のinformation_schemaビューと同様に短い方の書き方を使っていることから、これは誤りと見られます。

  • psql-cオプションはもはや--no-psqlrcの意味を含まなくなりました。 (Pavel Stehule, Catalin Iacob)

    古い動作を得るには--no-psqlrc(または短縮形の-X)を明示的に書いてください。 このように修正されたスクリプトは古いバージョンのpsqlでも引き続き動作するでしょう。

  • pg_restore-tオプションを普通のテーブルだけでなく全てのタイプのリレーションに対応するように改善しました。 (Craig Ringer)

  • pg_controldataおよび関連する箇所でNextXIDの表示形式を変更しました。 (Joe Conway, Bruce Momjian)

    number:number形式でエポックとトランザクションIDの値を表示します。 これまでのnumber/number形式は、LSNに使われる形式と紛らわしく似ていました。

  • 拡張の関数を適切なものについてパラレルセーフと印付けされるように改定しました。 (Andreas Karlsson)

    多くの標準拡張はそれらの関数がパラレルクエリーのワーカプロセスで実行できるように改定されました。 これらの変更は、(クラスタの各データベースの)各拡張にALTER EXTENSION UPDATEを適用しない限り、前バージョンからpg_upgradeされたデータベースには効力がありません。

E.6.3. 変更点

以下にPostgreSQL 9.6と前のメジャーリリースとの詳細な変更点を記載します。

E.6.3.1. サーバ

E.6.3.1.1. 並列問い合わせ
  • 並列問い合わせ。 (Robert Haas, Amit Kapila, David Rowley, many others)

    9.6でPostgreSQLは大きな問い合わせに対する並列実行の最初のサポートを導入しました。 厳密に駆動テーブルをシーケンシャルスキャンで処理する参照問い合わせの場合だけ、並列化できます。 ハッシュ結合とネステッドループも、また(サポートされている集約について)集約処理も同様に並列実行できます。 やるべきことは沢山残っていますが、これはすでに役立つ機能セットです。

    並列問い合わせの実行は(未だ)デフォルトでは有効ではありません。 有効にするには、新たな設定パラメータmax_parallel_workers_per_gatherを0より大きい値に設定します。 その他の新たな設定パラメータforce_parallel_modeparallel_setup_costparallel_tuple_costmin_parallel_relation_sizeを通してさらなる並列処理の制御を行うことができます。

  • 関数のパラレル安全状態を印付けするための基盤を用意しました。 (Robert Haas, Amit Kapila)

E.6.3.1.2. インデックス
  • GINインデックス作成で、1GBより大きいmaintenance_work_mem設定の効果的な活用ができるようにしました。 (Robert Abraham, Teodor Sigaev)

  • GINインデックスのペンディングリストから削除されたページを空き領域マップに即座に追加するようにしました。 (Jeff Janes, Teodor Sigaev)

    これはテーブルのバキューム頻度が低いときの膨張を減らします。

  • GINインデックスのペンディングリストのクリーンアップを手動で実行できるようにgin_clean_pending_list()関数を追加しました。 (Jeff Janes)

    以前は、このクリーンアップは親テーブルのバキュームやアナライズの副次効果としてのみ生じました。

  • GiSTインデックスにおける dead(削除済み)インデックスタプルの扱いを改善しました。 (Anastasia Lubennikova)

    deadインデックスタプルは、あるインデックスキャンが対応するヒープタプルがdeadであると気づくとき、そのように印付けされるようになります。 タプルを挿入するとき、ページ上に空間を作るために必要ならdeadとマークされたタプルは削除されます。

  • box型むけのSP-GiST演算子クラスを追加しました。 (Alexander Lebedev)

E.6.3.1.3. ソート
  • 外部ソート方式を行うときに置換選択ソートでなくクイックソートを使うことでソートの性能を改善しました。 (Peter Geoghegan)

    この新しい方法では典型的なキャッシュサイズとデータ量に対してCPUキャッシュをより良く使用します。 必要に応じて、この動作は新たな設定パラメータreplacement_sort_tuplesを通して調整されます。

  • 同じ文字列が複数回現れる場合のテキストソートを高速化しました。 (Peter Geoghegan)

  • 短縮キーを使うことで、uuidbyteachar(n)のソートを高速化しました。 (Peter Geoghegan)

    短縮キーのサポートでは非デフォルト演算子クラスtext_pattern_opsvarchar_pattern_opsbpchar_pattern_opsも追加されました。 順序集合集約を処理して短縮キーをうまく利用できるようになりました。

  • ソートのときにTIDを64bit整数として扱うことでCREATE INDEX CONCURRENTLYを高速化しました。 (Peter Geoghegan)

E.6.3.1.4. ロック
  • ProcArrayLockの競合を減らしました。 (Amit Kapila, Robert Haas)

  • バッファ内容のロックをバッファデスクリプタに移すことで性能を改善しました。 (Andres Freund, Simon Riggs)

  • スケーラビリティ改善のため、共有バッファヘッダのスピンロックを原子的操作に置き換えました。

  • LWLockの待ちキューを保護するため、スピンロックでなく原子的操作を使います。 (Andres Freund)

  • マルチCPUソケットのサーバ上で競合を減らすため共有ハッシュテーブルのフリーリストを分割しました。 (Aleksander Alekseev)

  • Btreeインデックスのバキューム操作の再生中のスタンバイサーバ上のインターロックを減らしました。 (Simon Riggs)

    この変更はこのような操作の再生で時々発生するかなりのレプリケーション遅延を回避します。

E.6.3.1.5. オプティマイザ統計
  • ANALYZEの多数のNULLを持つ列の推定を改善しました。 (Tomas Vondra, Alex Shulgin)

    これまでANALYZEは多数NULLを持つ列では、非NULLの個別値数を過小評価する傾向があり、また、頻出値の計算でも不正確でした。

  • プランナの問い合わせ結果での個別値数の推定を改善しました。 (Tomas Vondra)

  • 結合述語における選択度の推測に外部キー関係を使用するようにしました。 (Tomas Vondra, David Rowley)

    もしテーブルtが、(a,b) REFERENCES r (x,y) という外部キー制約を持つなら、t.a = r.x AND t.b = r.yなどのWHERE条件はtの各行に対して1行より多いrの行を選択することはありえません。 プランナは以前はこれらAND条件を独立しているとみなし、結果として、しばしば選択度を大幅に誤って推定していました。 これからは、WHERE条件を当てはまる外部キー制約と比較し、より良い推定を出します。

E.6.3.1.6. VACUUM
  • 凍結済みタプルだけを含むページの再バキュームを回避しました。 (Masahiko Sawada, Robert Haas, Andres Freund)

    以前は、周回防止用のバキュームは、たとえ何もすることがないページであっても、テーブルのすべてのページを巡回しなければなりませんでした。 これからは、凍結済みタプルのみを含むページはテーブルの可視性マップで識別され、たとえトランザクション周回予防を行っているときでもスキップすることができます。 これは大部分のデータが変化しない大きいテーブルを保守するコストを大幅に削減するでしょう。

    必要であれば、新たなDISABLE_PAGE_SKIPPINGオプションを使ってバキュームで全ての凍結済みページを処理することを強制できます。 通常これは全く必要ありませんが、可視性マップの破損を復旧するのに役立つかもしれません。

  • VACUUM中の無駄なヒープ切り捨ての試行を回避しました。 (Jeff Janes, Tom Lane)

    本変更は有効な切り捨てが不可能である場合の排他テーブルロックの取得を回避します。 主な利点はスタンバイサーバ上での不要な問い合わせキャンセルを回避できることです。

E.6.3.1.7. 性能全般
  • 古いMVCCスナップショットを設定可能なタイムアウトの後に無効にできるようにしました。 (Kevin Grittner)

    通常、削除されたタプルは、それを見るかもしれない最後のトランザクションがいなくなるまでは、バキュームによる物理的な除去がされません。 長時間オープンしたままのトランザクションは、このため、空間が再利用できないので相当なテーブル膨張を引き起こす可能性があります。 この機能は、MVCCスナップショットをどれだけの間、有効と保証するかを指定する新たな設定パラメータold_snapshot_thresholdを通して、時間に基づく制限を設定可能にします。 上限時間後、デッドタプルは除去候補になります。 古いスナップショットを使うトランザクションは潜在的にこのようなデータが含まれているかもしれないページを読もうとしたならエラーを受け取るはずです。

  • GROUP BYの他の列に機能的に従属している列を無視するようにしました。 (David Rowley)

    GROUP BY句が、同テーブルの他の列と共に遅延されていない主キーのすべての列を含むなら、主キー以外の列は冗長でグルーピングから外すことができます。 これは多くのよくある場合に計算を節約します。

  • WHERE句がインデックスされていない列を参照している部分インデックスで、インデックスオンリースキャンを利用可能にしました。 (Tomas Vondra, Kyotaro Horiguchi)

    例えば、CREATE INDEX tidx_partial ON t(b) WHERE a > 0で定義されたインデックスを、WHERE a > 0と指定する問い合わせで、インデックスオンリースキャンに使うことができるようになりました。 これまでは、aがインデックス列にあらわれないために、これは許されませんでした。

  • チェックポイント書き込みをソートされた順で行うようにしました。 (Fabien Coelho, Andres Freund)

    これまでチェックポイントは、通常ランダムに近い、とにかく共有バッファにたまたま出てきた順にダーティページを書き出していました。 これは特に回転メディアで性能がよくありません。 本変更はチェックポイント駆動の書き込みがファイルとブロック番号の順で行われるように、また、テーブルスペース間で偏りが無いようにします。

  • 可能なところでは、カーネルディスクバッファにダーティデータが蓄積されるのを防ぐため、設定可能な書き込み数の後にカーネルライトバックを起動するようにしました。 (Fabien Coelho, Andres Freund)

    PostgreSQLはデータをカーネルのディスクキャッシュに書き、それはやがて物理ストレージにフラッシュされます。 多くのOSはこれを賢く管理せず、大量のダーティデータを一度にフラッシュすると判断するまで蓄積させておきます。これはフラッシュが終わるまでの間、新たなI/O要求に大きな遅延を引き起こします。 本変更は設定可能な間隔の後に明示的にデータフラッシュを要求することで、この問題を緩和しようとします。

    Linuxにおいては、この用途にsync_file_range()が使われ、この関数にほとんどマイナス面が無いため本機能はデフォルトで有効です。 このフラッシュする機能は、msync()またはposix_fadvise()があるなら他のプラットフォームでも使用可能ですが、これらのインタフェースには若干の望ましくない副作用がありるため、Linux以外のプラットフォームでは本機能はデフォルトでは無効です。

    新たな設定パラメータbackend_flush_after, bgwriter_flush_after, checkpoint_flush_after, and wal_writer_flush_afterが本動作を制御します。

  • 複数の集約が同じ引数と遷移関数を持っているなら、それらの間で計算を共有することで集約関数の性能を改善しました。 (David Rowley)

    例えば、SELECT AVG(x), VARIANCE(x) FROM tabは行ごとに二つの集約に対して対して単一の計算を用いることができます。

  • 元トランザクションがコミット済みかを判断するのにpg_clogではなく現在トランザクションのスナップショットを調べることにより、最近に作られたタプルに対する可視性の検査を高速化しました。 (Jeff Janes, Tom Lane)

  • タプルのヒントビットが以前より早くセットされるようにしました。 (Andres Freund)

  • 短命な準備されたトランザクションの性能を改善しました。 (Stas Kelvich, Simon Riggs, Pavan Deolasee)

    二相コミットの情報はPREPARE TRANSACTIONの際にWALのみに書かれ、COMMIT PREPAREDの際には、それがすぐ後に生じたなら、WALから読み戻されるようになりました。 分離状態ファイルは、保留しているトランザクションが次のチェックポイントの時までコミットにもアボートにもならなかった場合のみ作られます。

  • メモリコンテキストの廃棄の性能を改善しました。 (Jan Wieck)

  • 多数のオブジェクトを追跡するリソースオーナーの性能を改善しました。 (Aleksander Alekseev)

  • timestamptime、およびdateデータ型の出力関数の速度を改善しました。 (David Rowley, Andres Freund)

  • AccessExclusiveロックを取得する操作のリプレイ中の、ホットスタンバイ問い合わせの不要なキャンセルを回避しました。 (Jeff Janes)

  • リレーション拡張のロックに競合があるとき、リレーションを複数ブロック一度に拡張するようにしました。 (Dilip Kumar)

    これは競合を減らすことでスケーラビリティを改善します。

  • よりよいスケーラビリティのためにclogバッファの数を増やしました。 (Amit Kapila, Andres Freund)

  • 常に単純な変数むけのParamListInfoエントリを有効な状態に留めておくことで、PL/pgSQLで式の評価を高速化しました。 (Tom Lane)

  • 最近のWindowsバージョンで、SO_SNDBUF設定をそのデフォルトよりも減らすことを回避しました。 (Chen Huajun)

  • Windowsにおいてupdate_process_titleをデフォルトで無効にしました。 (Takayuki Tsunakawa)

    Windowsでは大部分の他プラットフォームよりもプロセスタイトルを更新するオーバーヘッドが大きく、また、大部分のWindowsユーザはプロセスタイトルを表示できるツールを持っていないことから、更新してもあまり役に立ちません。

E.6.3.1.8. モニタリング
  • VACUUM操作の進捗報告を提供するpg_stat_progress_vacuumシステムビューを追加しました。 (Amit Langote, Robert Haas, Vinayak Pokale, Rahila Syed)

  • SQLpg_controlのフィールドを見せるpg_control_system()pg_control_checkpoint()pg_control_recovery()、および、pg_control_init()関数を追加しました。 (Joe Conway, Michael Paquier)

  • pg_configシステムビューを追加しました。 (Joe Conway)

    このビューはpg_configコマンドラインユーティリティから参照できるものと同様の情報、すなわち様々なPostgreSQLのコンパイル時の設定情報を見せます。

  • pg_replication_slotsシステムビューにconfirmed_flush_lsn列を追加しました。 (Marko Tiikkaja)

  • ホットスタンバイサーバのWALレシーバプロセスに関する情報を提供するpg_stat_wal_receiverシステムビューを追加しました。 (Michael Paquier)

  • どのセッションがどの他セッションをブロックしているかを確実に識別するpg_blocking_pids()関数を追加しました。 (Tom Lane)

    この関数は与えられたプロセスIDのセッションをブロックしている全てのセッションのプロセスIDの配列を返します。 歴史的にはユーザはpg_locksビューの自己結合を使ってこのような情報を取得するしていました。 しかしながら、いくらかの僅かな正確さに対してこのように実施するのことは不合理に面倒です。また、並列問い合わせの追加は、セッションの主プロセスでなくワーカ子プロセスによってロックが取得・待機されるかもしれないことから、この古い方法を完全に非実用的にしました。

  • 現在のトランザクションログのフラッシュ位置を見せる関数pg_current_xlog_flush_location()を追加しました。 (Tomas Vondra)

  • NOTIFYがどのくらいいっぱいであるかを報告する関数pg_notification_queue_usage()を追加しました。 (Brendan Jurd)

  • メモリコンテキスト統計のダンプの冗長さを制限しました。 (Tom Lane)

    メモリ不足エラーの際にポストマスタのログに出力されるメモリ使用のダンプは、多数のメモリコンテキストがあるとき、ことによると巨大なレポートを生成するのでなく、統計を要約するようになります。 grand total(総計)要約行も追加されます。

E.6.3.1.9. 認証
  • PostgreSQLクライアント認証にBSD認証サービスを使用できるBSD認証方式を追加しました。 (Marisa Emerson)

    BSD認証は今のところOpenBSDでのみ使用できます。

  • PAM認証を使うとき、クライアントIPアドレスやホスト名をPAM_RHOST要素を通してPAMモジュールに供給するようにしました。 (Grzegorz Sampolski)

  • ポストマスタのログでパスワード認証失敗のより多くの類型について詳細を出力するようにしました。 (Tom Lane)

    全ての普通に起きうるパスワード認証失敗の場合に、ログに詳細なDETAILフィールドが提供されます。

  • RADIUSパスワードを128文字の長さまでサポートしました。 (Marko Tiikkaja)

  • SSPI認証のときにNetBIOSKerberosのレルム名とユーザ名を制御するSSPI認証の新たなパラメータcompat_realmupn_usernameが追加されました。 (Christian Ullrich)

E.6.3.1.10. Server Configuration
  • 長すぎるアイドルイントランザクション状態のとき、セッションを自動的に終了できるようにしました。 (Vik Fearing)

    この動作は新たな設定パラメータidle_in_transaction_session_timeoutで制御されます。 これは忘れられたトランザクションが長期にロックを保持したり、バキュームクリーンアップを阻害したりするのを防止するのに役立ちます。

  • checkpoint_timeoutの許容される最大値を24時間に引き上げました。 (Simon Riggs)

  • 異なるテーブルスペースが各々異なるI/O特性を持つ場合に対応するため、effective_io_concurrencyをテーブルスペースごとに設定できるようにしました。 (Julien Rouhaud)

  • 現在時刻をミリ秒付きのUnixエポック形式で出力するlog_line_prefixのオプション%nを追加しました。 (Tomas Vondra, Jeff Davis)

  • syslogへログ出力するとき、メッセージ形式により多くの制御を提供するsyslog_sequence_numbersおよびsyslog_split_messages設定パラメータを追加しました。 (Peter Eisentraut)

  • wal_level設定パラメータの値であるarchivehot_standbyを一つの新たな値replicaに合併しました。 (Peter Eisentraut)

    これら設定値を区別することはもはや役に立たず、また、これらを合併することはレプリケーションのセットアップの計画された将来の平易化への一歩です。 古い名前はまだ受け付けられますが、内部的にreplicaに変換されます。

  • サーバの起動、停止でsd_notify()の呼び出しを可能にする設定オプション--with-systemdを追加しました。 (Peter Eisentraut)

    これは、systemd下のPostgreSQLの管理を大幅に簡単にするnotifyタイプのsystemdサービスユニットを利用できるようにします。

  • サーバのSSLキーファイルがrootに所有されている場合には、グループ読み込みアクセスを持てるようにしました。 (Christoph Berg)

    以前は、キーファイルはPostgreSQLサーバを実行するユーザに所有されるべきと主張していましたが、これは証明書を集中管理するように構成されている一部システム(Debianなど)で不便です。 それゆえ、キーファイルがrootに所有されていてグループ参照アクセスを持っている場合を許容しました。 そのグループに信頼できないユーザが決して含まれないようにするのは、OS管理者の責任です。

E.6.3.1.11. 信頼性
  • ポストマスタがダウンしたならバックエンドを強制的に終了させるようにしました。 (Rajeev Rastogi, Robert Haas)

    通常の状況下ではポストマスタは常に子プロセスより長く生き残るはずです。 もし何らか理由でポストマスタがダウンしたなら、バックエンドセッションをエラーと共に強制的に終了させます。 以前は、現存するバックエンドはクライアントの切断まで実行し続けましたが、危険で非効率的です。 これはまた、前の古いバックエンドが終了するまでは新たなポストマスタが起動しないようにします。 バックエンドはクライアントI/Oを待つときにポストマスタのダウンを検知するでしょうから、終了は即時ではありませんが、クライアント問い合わせの終了よりも遅くなることはないはずです。

  • 直列化可能かを、制約違反エラーを報告する前に検査するようにしました。 (Thomas Munro)

    シリアライザブルトランザクション隔離を使っているとき、同時トランザクションを原因とするいかなるエラーも直列化の失敗として表明するのが望ましく、それによりアプリケーションにリトライが成功するかもしれないという手がかりを与えます。 残念ながら、キー重複の失敗が同時挿入で引き起こされた場合には、これは確実には生じません。 本変更は、アプリケーションがトランザクションのより早くに明示的に競合するキーの存在をチェックした(そして見つからなかった)なら、このようなエラーが直列化のエラーとして報告されることを保証します。

  • たとえXIDをもたないトランザクションから発行されたときでも、無効化メッセージがWAL記録されることを保証しました。 (Andres Freund)

    これはスタンバイサーバのトランザクションが新たなインデックスのような変化に気づくのに失敗するという一部の稀な場合について修正します。

  • 複数プロセスがGINインデックスのペンディングリストを同時にクリーンアップしようとするのを防ぎます。

    意図的に許容されていいましたが、これは結果としてバキュームが削除を要するインデックスエントリの見落しに帰着する可能性のある競合状態を引き起こします。

E.6.3.2. レプリケーションとリカバリ

  • 同期レプリケーションで1つだけでなく複数同時の同期スタンバイサーバに対応しました。 (Masahiko Sawada, Beena Emerson, Michael Paquier, Fujii Masao, Kyotaro Horiguchi)

    完了したとみなす前にコミットを確認しなければいけないスタンバイサーバの数は、synchronous_standby_namesパラメータの一部で設定します。

  • 設定パラメータsynchronous_commitに新たな設定remote_applyを加えました。 (Thomas Munro)

    このモードでは、マスタはスタンバイサーバでトランザクションがディスクに書かれるだけでなく適用済みになるまで待ちます。 このことは、それより前にマスタで認識されたすべてのコミットが、スタンバイサーバで開始したトランザクションから見えると期待できることを意味します。

  • レプリケーションスロットを作ったときにWALの確保を直ちに行うため、レプリケーションプロトコルに機能を追加し、対応するオプションをpg_create_physical_replication_slot()に追加しました。 (Gurjeet Singh, Michael Paquier)

    これはレプリケーションスロット作成でベースバックアップで必要とされる全てのWALを保証できるようにします。

  • pg_basebackup--slotオプションを追加しました。 (Peter Eisentraut)

    これはpg_basebackupWALストリーミング向けに定義されたレプリケーションスロットを使わせます。 ベースバックアップ完了後、同じスロットを通常のストリーミングレプリケーションに選ぶことでシームレスに新たなスタンバイサーバの起動が可能です。

  • 非排他のバックアップのためにpg_start_backup()pg_stop_backup()を拡張しました。 (Magnus Hagander)

E.6.3.3. 問い合わせ

  • タプルの集合を返す関数が単なるNULLを返せるようにしました。 (Andrew Gierth, Tom Lane)

    SELECT FROM function(...)の文脈において、以前は複合値の集合を返す関数は単なるNULL値を集合の一部として返すことを許していませんでした。 これからはこれが可能になり、要素が皆NULLの行として解釈されます。 これは例えば複合値の配列をunnestするなどのまれなケースでのエラーを回避します。

  • 複数のVALUES行を伴うINSERTのターゲット列リストにおける配列添え字とフィールド選択に完全に対応しました。 (Tom Lane)

    これまで、このような場合は同じターゲット列が2回以上でてくるとき、例えばINSERT INTO tab (x[1], x[2]) VALUES (...)などで、失敗していました。

  • 適切なとき、SELECT出力式の評価をORDER BYソート後まで後回しにするようにしました。 (Konstantin Knizhnik)

    この変更は出力リスト内の揮発性あるいは高コストの関数がORDER BYで示される順序で実行されること、また、LIMIT句があるとき必要とされる回数以上に評価されないことを保証します。 これまで、並び替えがインデックススキャンやマージ結合前のソートで実行されるときには、これらの特性を持っていましたが、トップレベルのソートで実行されるときにはそうなっていませんでした。

  • 処理したタプル数を記録するカウンタを64bitに拡張しました。 (Andreas Scherbaum)

    この変更はSELECTなどのコマンドタグで40億件以上のタプルカウントを正しく報告できるようにします。 これはPL/pgSQLのGET DIAGNOSTICS ... ROW_COUNTコマンドにも適用されます。

  • MULE_INTERNALエンコーディングを通した変換でエンコーディング変換をするのを回避しました。 (Tom Lane)

    これまではキリル文字と中央ヨーロッパのシングルバイトのエンコーディングに対する多くの変換は、関連するMULE_INTERNALコーディング方式に変換して、それから目的のエンコーディングに変換することで実行されていました。 非効率であることと別にこれは、変換できない文字に遭遇したときにエラーメッセージが、ユーザに見えるエンコーディングではなくMULE_INTERNALとの間で変換できないと混乱を招きやすい苦情を言うことを意味します。

  • テーブルが同じロールIDのもとでアクセスされる場合のみ、外部テーブルの結合をリモートで行うことを検討するようにしました。 (Shigeru Hanada, Ashutosh Bapat, Etsuro Fujita)

    これまで外部結合プッシュダウン基盤はセキュリティの課題を完全に各外部データラッパに任せていました、これはFDWに意図せぬ微妙なセキュリティホールをあまりに容易に作らせてしまいます。 そこで、どのロールIDが各テーブルにアクセスするか決定することを本体コードの役割としました。 また、関わるすべてのリレーションについてロールが同じでない限り、結合プッシュダウンを試みないようにしました。

E.6.3.4. ユーティリティコマンド

  • COPYINSERT/UPDATE/DELETE ... RETURNING問い合わせの出力をコピーできるようにしました。 (Marko Tiikkaja)

    これまでは、実現するのに中継するCTEを書く必要がありました。

  • ALTER object DEPENDS ON EXTENSIONを導入しました。 (Abhijit Menon-Sen)

    本コマンドはデータベースオブジェクトに拡張に依存していると印付けできるようにします。 これにより、拡張が削除されたならオブジェクトは(CASCADEは必要なしに)自動的に削除されます。 しかしながら、このオブジェクトは拡張の一部ではないので、pg_dumpでは別にダンプされます。

  • オブジェクトがすでに要求されたスキーマにあるときにはALTER object SET SCHEMAが、歴史的に大部分のオブジェクトタイプに対してそうであったようにエラーを投げるのではなく、何もしないようにしました。 (Marti Raudsepp)

  • ALTER OPERATORに既存の演算子に関連付けられた選択度の関数を変更できるオプションを追加しました。 (Yury Zhuravlev)

  • ALTER TABLE ADD COLUMNIF NOT EXISTSオプションを追加しました。 (Fabrízio de Royes Mello)

  • フィルファクタと自動バキューム関連のリレーションオプションを設定するとき、ALTER TABLEが必要とするロック強度を減らしました。 (Fabrízio de Royes Mello, Simon Riggs)

  • 拡張でインデックスアクセスメソッドを作ることを可能にする、CREATE ACCESS METHODを導入しました。 (Alexander Korotkov, Petr Jelínek)

  • CREATE EXTENSIONに、要求された拡張が依存するすべての拡張を自動的に作成するCASCADEオプションを追加しました。 (Petr Jelínek)

  • 元テーブルがOID列を持つとき、CREATE TABLE ... LIKEでそれを含めるようにしました。 (Bruce Momjian)

  • CHECK制約がテーブル作成コマンドでNOT VALIDと宣言されている場合、自動的に有効と印付けするようにしました。 (Amit Langote, Amul Sul)

    テーブルには行が存在しないので安全です。 これは以前からのFOREIGN KEY制約の動作と一致します。

  • DROP OPERATORを削除された演算子とリンクしているpg_operator.oprcompg_operator.oprnegateをクリアするように修正しました。 (Roma Sokolov)

    これまではこのようなリンクはそのまま残されて、削除した演算子のOIDが他の演算子に再利用されるという、あまりなさそうな事象で問題がでるかもしれません。

  • EXPLAIN出力で同じサブプランを二度見せないようにしました。 (Tom Lane)

    ある種の、典型的にはインデックス条件でSubPlanノードを伴う場合、EXPLAINは同じサブプランのデータを二回出力していました。

  • OID列を除くシステム列へのインデックス作成を禁止しました。 (David Rowley)

    このようなインデックスはサポートされているとみなされませんし、システムがタプルのシステム列フィールドをインデックス更新無しに変えるかもしれないため、高い可能性で誤動作するでしょう。 しかしながら、これまではこれが作られないように防ぐエラーチェックがありませんでした。

E.6.3.5. 権限管理

  • 注意を要する関数へのアクセス管理に権限システムを使うようにしました。 (Stephen Frost)

    これまでは、多くの安全に注意を要する関数は非スーパーユーザから呼び出されるとエラーを投げる固定実装のチェックを含んでいました。 これはやや退屈な仕事としてスーパーユーザロールを使うことを強制していました。 これからは固定実装のエラーチェックは無くなり、initdbにデフォルトのpublicのEXECUTE権限を取り上げさせるようにしました。 このことで、必ずしも全てのスーパーユーザ権限を必要としない信頼されたロールに、これらの関数の使用を認めることをインストレーションは選択できます。

  • 従来スーパーユーザ専用だった関数へのアクセスを与えるのに使える組み込みロールを作成しました。 (Stephen Frost)

    いまのところそのようなロールはpg_signal_backendだけですが、より多くが将来に追加される見通しです。

E.6.3.6. データ型

  • 全文検索をフレーズ、すなわち特定順序あるいは指定された間隔で互いに隣接して現れる複数の語彙素、の検索に対応するように改善しました。 (Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov)

    tsquery入力で新たな演算子<-><N>を使ってフレーズ検索問い合わせを指定できます。 前者は前後の語彙素が互いに隣接してその順に現れなければいけないことを意味します。後者は前後の語彙素がちょうどNNだけ離れていなければいけないことを意味します。

  • 配列スライス指定子で範囲の片方あるいは両方を(例えばarray_col[3:]と)省略できるようにしました。 (Yury Zhuravlev)

    省略された範囲は対応する配列の添え字の上限または下限と受け取られます。 これは多くの一般的なユースケースでよりシンプルな指定を可能にします。

  • 範囲外の日付やタイムスタンプについてより注意深くしました。 (Vitaly Burovoy)

    この変更はtimestamp with time zoneの実装の限界に極めて近い値に対する予期せぬ範囲外エラーを防ぎます。 これまでは、同じ値がtimezone設定によって、受け入れられたり、受け入れられなかったりしました。これは現在受け付けられている値のダンプ、リストアが失敗するかもしれないことを意味します。 これからは、値の限界はローカルタイムでなく、timezoneとは無関係にするため、同等のUTC時間に従って制限されます。

    また、PostgreSQLは、date + integerなどの新たな日付やタイムスタンプ値を計算する処理でも、より注意深くオーバーフローを検出するようになりました。

  • 幾何データ型について、infinityNaNの複合値が入出力の際に確実に一貫した扱いをされるようにしました。 (Tom Lane)

    これからはこのような値は常にシンプルなfloat8列と同様に出力し、入力で同様に受け入れられます。 これまではプラットフォームに依存した動作をしていました。

  • 現代的なHunspellファイルを扱うように、また、より多くの言語に対応するようにispell辞書タイプを更新しました。 (Artur Zakirov)

  • 正規表現で後方検索制約を実装しました。 (Tom Lane)

    後方検索制約はテキストを消費せず既存の先行検索制約と似ていますが、 文字列の現在位置から始まるのでなく、現在位置で終わるマッチが在ること(あるいは無いこと)をチェックします。 同様の機能は既存の他の多くの正規表現エンジンに存在します。

  • 正規表現で、見たところ3桁8進数のエスケープ\nnnが 377(10進数で255)を超えた場合、代わりに2桁8進数のエスケープとみなすようにしました。 (Tom Lane)

    これにより現在のTclリリースと振る舞いが一致します。

  • 対応する等価演算子との一貫性のため、トランザクションID演算子xid <> xidxid <> int4を追加しました。 (Michael Paquier)

E.6.3.7. 関数

  • jsonb配列に新たな要素を挿入したり、未だ無いキーをjsonbオブジェクト挿入したりするjsonb_insert()関数を追加しました。 (Dmitry Dolgov)

  • numeric型むけのln()log()exp()、および、pow()関数の精度を改善しました。 (Dean Rasheed)

  • numeric値の表示スケールを取り出すscale(numeric)関数を追加しました。 (Marko Tiikkaja)

  • 度で動作する三角関数が追加されました。 (Dean Rasheed)

    例えば、sin()は引数をラジアンで評価しますが、sind()では度で評価します。 これらの関数は、例えばsind(30) = 0.5のように、いくつか予測可能な値でちょうどの結果値をもたらすように動作します。

  • 三角関数がinfinityおよびNaNの入力をPOSIX標準によって扱うことを保証しました。 (Dean Rasheed)

    POSIX標準にはこれら関数はNaN入力にはNaNを返し、infinityを含む範囲外の入力にはエラーを投げるべきと書かれています。 これまでの振る舞いはプラットフォームによって様々でした。

  • to_timestamp(float8)が浮動小数点のinfinityをタイムスタンプのinfinityに変換するようにしました。 (Vitaly Burovoy)

    以前は無限大の入力では単に失敗していました。

  • tsvectorデータむけの関数を追加しました。 (Stas Kelvich)

    新たな関数ts_delete()ts_filter()unnest()tsvector_to_array()array_to_tsvector()、および、特定語彙素にだけ重みを付けるsetweight()の別形を追加しました。

  • ts_stat()tsvector_update_trigger()を期待される引数型そのものでなく、そのバイナリ互換の型の値でも動作するようにしました。 例えばtextが期待されているところにcitextを可能にします。 (Teodor Sigaev)

  • 引数の中のNULLまたは非NULLを数える可変引数関数num_nulls()num_nonnulls()を追加しました。 (Marko Tiikkaja)

    a、b、c の内ちょうど一つだけ非NULLであることを主張するCHECK(num_nonnulls(a,b,c) = 1)は、一つの使用例です。 これら関数は配列の中のNULLや非NULLを数えるのにも使用できます。

  • 修飾され、クオートされているかもしれないSQL識別子を部品に分解する関数parse_ident()を追加しました。 (Pavel Stehule)

  • to_number()で、Vフォーマットコードを10のVに続く数字の数のべき乗で割るものと解釈するようにしました。 (Bruce Momjian)

    このことでto_char()の逆関数として動作させます。

  • to_reg*()関数群が cstringでなくtext型を受け付けるようにしました。 (Petr Korobeinikov)

    これは引数がシンプルなリテラル定数でない箇所のほとんどの場合で明示的なキャストの必要をなくします。

  • サイズを示す人間に読みやすい文字列を数値に変換するpg_size_bytes()関数を追加しました。 (Pavel Stehule, Vitaly Burovoy, Dean Rasheed)

    本関数は文字列をpg_size_pretty()で生成されたような文字列をバイトに変換します。 SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB')が使用例です。

  • pg_size_pretty()で、負の値を正の値と同様に整形するようにしました。 (Adrian Vondendriesch)

    これまでは負の値は短縮されず、バイトで出力されていました。

  • current_setting()関数にオプションのmissing_ok引数を追加しました。 (David Christensen)

    これは認識できないパラメータ名に対してエラーを回避できるようにします。代わりにNULLが返ります。

  • 様々なシステムカタログ情報関数が不正な入力に対してNULLを返すように変更しました。 (Michael Paquier)

    これからはpg_get_viewdef()関数は無効なビューのOIDが与えられたならNULLを返します。また、いくつかの同種の関数も不正な入力に対して同様にNULLを返します。 以前は、このような場合にたいてい、ユーザ側の問題で起きたことを意味しないcache lookup failedエラーになっていました。

  • pg_replication_origin_xact_reset()を引数を一切持たないように修正しました。 (Fujii Masao)

    ドキュメントには引数を持たないと書かれていて、Cコードも引数を想定していませんが、pg_procのエントリでは誤って2つの引数が指定されていました。

E.6.3.8. サーバサイド言語

  • PL/pgSQLで実行時でなく関数をコンパイルするときに、CONTINUE文とEXIT文の不一致を検出するようにしました。 (Jim Nasby)

  • PL/Pythonのエラー報告とメッセージ報告の関数を、主エラーメッセージの他に追加メッセージフィールドも指定できるように拡張しました。 (Pavel Stehule)

  • PL/Python関数がSPIを通して自身を再帰的に呼び出しできるようにしました。 また、複数の集合を返すPL/Python関数が一つの問い合わせから呼び出されたときの動作を修正しました。 (Alexey Grishchenko, Tom Lane)

  • PL/Pythonでのセッション有効期間のメモリリークを修正しました。 (Heikki Linnakangas, Haribabu Kommi, Tom Lane)

  • PL/Tclをシンプル文字列ではなく、Tclのobject APIを使うように現代化しました。 (Jim Nasby, Karl Lehenbauer)

    これは一部のケースで性能をかなり改善できます。 今後はPL/TclはTcl 8.4以上を必要とすることに注意してください。

  • PL/Tclでデータベースの報告するエラーが、TclのerrorCodeグローバル変数で追加情報を返すようにしました。 (Jim Nasby, Tom Lane)

    この機能はエラーについての補助データを返すときのTclの習慣に従っています。

  • データベースエンコーディングとTclが期待するUTF-8との間でエンコーディング変換をするようにPL/Tclを修正しました。 (Tom Lane)

    これまでは、文字列が変換無しに素通しで渡されていて、データベースエンコーディングがUTF-8でないとき、非ASCII文字で誤動作の原因となりました。

E.6.3.9. クライアントインターフェイス

  • エラーおよび通知メッセージに深刻度フィールドの非ローカライズ版を加えました。 (Tom Lane)

    この変更はクライアントコードが深刻度をあらわす文字列のローカライズ変形を懸念することなくエラーまたは通知の深刻度を判断できるようにします。

  • 常に、あるいは非エラーメッセージ限定、のいずれかでメッセージのCONTEXTフィールドを抑止できる機能をlibpqに導入しました。 (Pavel Stehule)

    PQerrorMessage()の現在のデフォルト動作では、エラーについてのみCONTEXTを出力します。 新たな関数PQsetErrorContextVisibility()でこれを調節できます。

  • libpqで異なる冗長度でのエラーメッセージ再生成に対応しました。 (Alex Shulgin)

    これは新たな関数PQresultVerboseErrorMessage()で行われます。 これはpsqlの新たな\errverbose機能を下支えします。また、他のクライアントにとってもおそらく有益でしょう。

  • デフォルトのUnixソケット接続において有益なデータを返すように、libpqPQhost()関数を改善しました。 (Tom Lane)

    明示的なホスト指定が与えられていない場合、これまではNULLを返していましたが、これからはデフォルトのソケットディレクトリのパスを返します。

  • ecpgの字句解析が、プリプロセッサディレクティブの行のコメント文字列内の改行を扱えるように修正しました。 (Michael Meskes)

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

  • pg_dumppg_restore--strict-namesオプションを加えました。 (Pavel Stehule)

    このオプションはプログラムに-tまたは-nにマッチするものが無いなら、静かに何もしないのではなく苦情を言うようにさせます。

  • pg_dumpで、システムオブジェクトへの権限割り当てのローカルな変更をダンプするようにしました。 (Stephen Frost)

    組み込みの、あるいは、拡張で作られたオブジェクトの権限割り当てを変更することはスーパーユーザで常に可能でしたが、そのような変更は以前はダンプとリストアで失われました。 これからは、pg_dumpがそのような変更を認識してダンプします。 (しかしながら、これは9.6以降のサーバからダンプするときだけ動作します。)

  • pg_dumpで、拡張が所有するスキーマに含まれる、拡張が所有していないオブジェクトをダンプできるようにしました。 (Martín Marqués)

    これまでは誤ってスキーマを所有している拡張に属しているとみなされて、このようなオブジェクトは無視されました。

  • pg_dumpの出力で、テーブル毎においてだけ一意の名前がつくオブジェクトタイプ(例えばトリガー)のオブジェクトタグにテーブル名を含めるようにしました。 (Peter Eisentraut)

E.6.3.10.1. psql
  • 複数の-c-fコマンドラインオプションに対応しました。 (Pavel Stehule, Catalin Iacob)

    指定した操作は与えられたオプションの順に実行され、その後psqlが終了します。

  • 問い合わせ結果をクロス表表示で出力する\crosstabviewコマンドを追加しました。

    クロス表表示では、ひとつの問い合わせの結果列のデータ値が出力表に配置されます。出力表の行、列のヘッダは問い合わせの別の結果列からきています。

  • 最大の冗長度で最後のサーバエラーを表示する\errverboseコマンドを追加しました。 (Alex Shulgin)

    予期せぬエラーを受け取った後、これは便利です。 もはや、VERBOSITY変数を調整してデフォルトでは見られないエラーフィールドを見るために失敗を再現する必要はありません。

  • ビュー定義の編集と表示をする\evおよび\svコマンドを追加しました。 (Petr Korobeinikov)

    これらは関数に対する既存の\efおよび\sfコマンドに対応するものです。

  • 問い合わせを実行して、その結果を新たな問い合わせとして再実行する\gexecコマンドを追加しました。 (Corey Huinker)

  • \C stringとの一貫性のため、\pset C stringでテーブルタイトルを設定できるようにしました。 (Bruce Momjian)

  • \pset expanded autoモードで、一つだけの列からなる問い合わせ結果については拡張書式を使わないようにしました。 (Andreas Karlsson, Robert Haas)

  • \watchコマンドによるヘッダ出力を改善しました。 (Michael Paquier, Tom Lane)

    \pset titleの文字列がセットされていたならをそれをヘッダ出力に含めます。また、ヘッダの規格通りの部分をtimestamp (every Ns)と、短くしました。 また、タイムスタンプ書式はpsqlのロケール環境に従うようになります。

  • 現在行だけでなく入力の問い合わせ全体を考慮するようにタブ補完ロジックを改善しました。 (Tom Lane)

    これまではコマンドが複数行に分かれることで、手前の行の語を見る必要のある全てのタブ補完ルールが無効になっていました。

  • タブ補完動作の多数の細かな改善。 (Peter Eisentraut, Vik Fearing, Kevin Grittner, Kyotaro Horiguchi, Jeff Janes, Andreas Karlsson, Fujii Masao, Thomas Munro, Masahiko Sawada, Pavel Stehule)

  • 接続されたバックエンドのプロセスIDを挿入するPROMPTオプション%pを追加しました。 (Julien Rouhaud)

  • 常に、あるいは非エラーメッセージ限定、のいずれかでメッセージのCONTEXTフィールドを抑止できる機能を導入しました。 (Pavel Stehule)

    現在のデフォルト動作ではエラーの場合のみCONTEXTを出力します。 特別変数SHOW_CONTEXTを設定することでこれを変更できます。

  • \df+が関数のアクセス権限とパラレルセーフ属性を表示するようにしました。 (Michael Paquier)

E.6.3.10.2. pgbench
  • pgbenchスクリプト内のSQLコマンドは改行ではなく、セミコロンで終了するものとしました。 (Kyotaro Horiguchi, Tom Lane)

    この変更はスクリプト内の複数行にわたるSQLコマンドを可能にします。 現存のカスタムスクリプトは、各行末にセミコロンが未だ無ければ加える修正が必要でしょう。 (そのようにすることは、旧バージョンpgbenchむけのスクリプトを壊しません)

  • バックスラッシュコマンドの式で組み込み関数、および、浮動小数点演算に対応しました。 (Fabien Coelho)

  • \setrandomを組み込み関数で置き換えました。 (Fabien Coelho)

    新たに組み込み関数random()random_exponential()random_gaussian()を追加しました。 これらは\setrandomと同じ働きをしますが、大きい式に組み入れることができるのでより使いやすいです。 これら関数の追加で不要になったため、\setrandomを除去しました。

  • カスタムスクリプトだけでなく、組み込みのスクリプトの複数の複製を起動できるようにしました。 (Fabien Coelho)

    これは-fと似たように働く、カスタムスクリプトむけの新たな-bスイッチにより実行されます。

  • スクリプトの選択率(重み)を変更できるようにしました。 (Fabien Coelho)

    複数スクリプトが指定されたとき、各pgbenchトランザクションは実行するものをランダムに選びます。 これまでこれは常に均等な確率で行われていましたが、これからは異なるスクリプトに異なる選択率を指定することができます。

  • 複数スクリプトの実行において、各スクリプトむけに統計情報を収集するようにしました。 (Fabien Coelho)

    この機能は既にある全体統計とコマンド毎統計に対して、中間の詳細度を追加します。

  • 実行開始からの時間の代わりにUnixエポックタイムスタンプで進行を報告する--progress-timestampオプションを追加しました。 (Fabien Coelho)

  • クライアント接続数(-c)がスレッド数(-j)の倍数でなくてもよくしました。 (Fabien Coelho)

  • -Tオプションが使われているとき、指定時間の終わりで直ちに終了するようにしました。 (Fabien Coelho)

    これまでは、低いトランザクションレートが指定されているとpgbenchが指定よりもかなり長く待つ可能性がありました。

E.6.3.11. サーバアプリケーション

  • initdbのブートストラップ後フェーズにおけるエラー報告を改善しました。 (Tom Lane)

    これまでは、ここでのエラーは入力ファイル全体を失敗している問い合わせとして報告するものになっていました。 これからは、現在の問い合わせだけが報告されます。 この望まれる動作を得るため、initdbの入力ファイルの問い合わせは空行で区切られなければなりません。

  • ブートストラップ後の処理の全てに単一のスタンドアローンバックエンドセッションを使うことでinitdbを高速化しました。

  • ターゲットタイムラインが変化するときでも動作するようにpg_rewindを改善しました。 (Alexander Korotkov)

    例えば、昇格したスタンバイを旧マスタのタイムラインのどこかの状態に巻き戻すことができます。

E.6.3.12. ソースコード

  • 廃れたheap_formtuple/heap_modifytuple/heap_deformtuple関数を除去しました。 (Peter Geoghegan)

  • AllocSetContextCreate()呼び出しをシンプルで安全にするマクロを追加しました。 (Tom Lane)

    新たなマクロALLOCSET_DEFAULT_SIZESALLOCSET_SMALL_SIZESALLOCSET_START_SMALL_SIZESの一つを使うことが推奨され、メモリコンテキストむけに個別のサイズパラメータを書き出すことは非推奨となりました。 しかしながら、既存のコードは引き続き動作します。

  • ヘッダファイルに無条件でstatic inline関数を使うようにしました。 (Andres Freund)

    これはとても古いコンパイラでは警告および/または無駄なコードスペースをもたらすかもしれませんが、表記法の改善はそうするだけの価値があると思われます。

  • TAPテスト基盤を改善しました。 (Michael Paquier, Craig Ringer, Álvaro Herrera, Stephen Frost)

    特に、この基盤を使ってリカバリシナリオをテストできるようになりました。

  • trace_lwlocksが各ロックを名前で識別するようにしました。 (Robert Haas)

  • psqlのタブ補完のコード基盤を改善しました。 (Thomas Munro, Michael Paquier)

    タブ補完規則がかなり容易に書けるようになり、また、よりコンパクトになりました。

  • 接続認証の間のアクセスで利用可能になるように、pg_shseclabelシステムカタログをキャッシュに釘づけにしました。 (Adam Brightwell)

    コアコードはこのカタログを認証に使いませんが、拡張が参照したいかもしれません。

  • Cレベルの大部分を隠すようにインデックスアクセスメソッドAPI再構築しました。 (Alexander Korotkov, Andrew Gierth)

    本変更はインデックスAM APIを外部データラッパーやテーブルサンプルハンドラに適用したデザインと同様に現代化します。 これはCコードをシンプルにし、組み込み可能な拡張でインデックスアクセスメソッドを定義することをより実用的にします。 結果として、大部分のpg_amシステムカタログの列はなくなりました。 インデックスAMのこれまでpg_amにあった属性情報をSQL問い合わせで調べることができる新たな検査関数が追加されました。

  • initdbや拡張で作られたオブジェクトの元の権限を保持するpg_init_privsシステムカタログを追加しました。 (Stephen Frost)

    この基盤はpg_dumpがインストレーションでシステムオブジェクトに加えられた権限の変更をダンプできるようにします。 以前はこのような変更はダンプとリロードで失われていましたが、これからは保存されます。

  • 拡張がカスタムLWLocksを割り当てる方法を変更しました。 (Amit Kapila, Robert Haas)

    RequestAddinLWLocks()関数は削除され、RequestNamedLWLockTranche()に置き換えられました。 これによりカスタムLWLocksの識別を改善し、間違いやすさを軽減します。

  • 複数セッションが同時に待機できるように隔離テスタを改善して、デッドロックシナリオのテストが可能になります。 (Robert Haas)

  • 拡張可能なノードタイプを導入しました。 (KaiGai Kohei)

    本変更はFDWあるいはカスタムスキャンプロバイダがプランツリーに従来可能なものよりも便利な形式でデータを置けるようにします。

  • プランナがスキャン/結合後の問い合わせ処理段階でPathsを生成比較することで処理するようにし、多数のアドホックなロジックと置き換えました。 (Tom Lane)

    この変更は現時点ではユーザに見える改善は僅かしかもたらしませんが、古いコード構造を用いた取り組みでは現実的でなかった、将来の多数の上位プランナ改良を可能にします。

  • 部分的な集約に対応しました。 (David Rowley, Simon Riggs)

    本変更は、集約関数の計算を分割された部分に分けることを可能にし、それにより例えばパラレルワーカープロセスが一つの集約の計算を協力して実行できるようにします。 将来的には、ローカルとリモートのデータを横断した集約を部分的にリモート先で行うことが可能になるかもしれません。

  • 汎用のコマンド進捗報告基盤を追加しました。 (Vinayak Pokale, Rahila Syed, Amit Langote, Robert Haas)

  • 他のクライアントプログラムから使えるようにするため、psqlflex字句解析を分離しました。 (Tom Lane, Kyotaro Horiguchi)

    これはコマンド境界を識別するSQLコマンド解析を要するプログラムからコード重複を排除します。 完全な普遍性をもってこれを行うことは望まれているものと比べ困難で、実際いまのところはサポートされるクライアントプログラムの中でpsqlだけがうまく対応しました。

    これと他のクライアントプログラム間で共有されるコードを置くため新たなソースコードのサブディレクトリsrc/fe_utils/が作られました。 以前はこのような共有は、見苦しく重複したコンパイルを要する、シンボリックリンクやビルド時のソースファイルのコピーで実現されていました。

  • ある待機から次にたいてい変化しないイベントセットの効果的な待機を可能とするWaitEventSet APIを導入しました。 (Andres Freund, Amit Kapila)

  • WALレコード書き込みの一般インターフェイスを追加しました。 (Alexander Korotkov, Petr Jelínek, Markus Nullmeier)

    本変更は拡張が標準レイアウトでページ変更のWALレコードを書くことを可能にします。 拡張にアクセスすることなくWALのリプレイを要する問題は、一般リプレイコードを持つことで解決されました。 これは例えばインデックスアクセスメソッドとそのWAL対応など、拡張での実装を可能にします。

  • ロジカルデコーディングの一般WALメッセージに対応しました。 (Petr Jelínek, Andres Freund)

    この機能は拡張がロジカルデコーディングプラグインで読み取り可能なデータをWALストリームに挿入できるようにしますが、物理データ再構築には関係しません。

  • SP-GiST演算子クラスがインデックスをたどるときに任意の横断値を置けるようにしました。 (Alexander Lebedev, Teodor Sigaev)

    これは再構築された値に似たものですが、任意のデータチャンクにできて、インデックス列と同じデータ型の必要がありません。

  • ereport()LOG_SERVER_ONLYメッセージレベルを導入しました。 (David Steele)

    本レベルはメッセージが決してクライアントに送られない点を除き、LOGのように動作します。 これは監査等の用途で使う想定です。

  • 全ての生成されるヘッダファイルをビルドするMakefileターゲットを提供しました。 (Michael Paquier, Tom Lane)

    submake-generated-headersを実行して、バックエンドヘッダファイルを確実に最新状態にすることができます。 これはスタンドアローンでビルドされるサブディレクトリにおいて便利です。

  • OpenSSL 1.1.0に対応しました。 (Andreas Karlsson, Heikki Linnakangas)

E.6.3.13. 追加モジュール

  • contrib/auto_explainで全問い合わせのうち設定可能な少量だけを採取できるようにする設定パラメータauto_explain.sample_rateを追加しました。 (Craig Ringer, Julien Rouhaud)

    これにより重い問い合わせ流量のオーバーヘッドが軽減できる一方、概してなお有用な情報を取得できます。

  • ブルームフィルタリングに基づくインデックスアクセスメソッドを実装したcontrib/bloomモジュールを追加しました。 (Teodor Sigaev, Alexander Korotkov)

    これは主として本体以外のインデックスアクセスメソッドの概念実証ですが、多数の列を検索する問い合わせに対するこのモジュール本来の能力が有用であるかもしれません。

  • contrib/cubeで立体の距離演算子を導入し、また、立体列のGiSTインデックスでkNN方式の検索に対応しました。 (Stas Kelvich)

  • contrib/hstorehstore_to_jsonb_loose()およびhstore_to_json_loose()関数で何が数値であるかの認識を一致させました。 (Tom Lane)

    これまで、hstore_to_jsonb_loose()は、JSON構文の数値の仕様に厳密に一致していなくとも、数値に見える文字列を文字列でなくJSON数値に変換していました。 この動作はhstore_to_json_loose()と一致せず、それでJSON構文に合わせるように厳格化しました。

  • contrib/intarrayの演算子に、これら演算子を使ったプランを改善するため、選択度推定関数を追加しました。 (Yury Zhuravlev, Alexander Korotkov)

  • contrib/pageinspectheap_page_items()関数が各タプルの生データを表示するようにしました。 また、各タプルフィールドを調べる新たな関数tuple_data_split()およびheap_page_item_attrs()を追加しました。 (Nikolay Shaplov)

  • contrib/pgcryptopgp_sym_encrypt()関数にオプションとしてS2Kイテレーションカウントパラメータを追加しました。 (Jeff Janes)

  • contrib/pg_trgm単語類似度のサポートを加えました。 (Alexander Korotkov, Artur Zakirov)

    これらの関数と演算子はある文字列と別の文字列の中のもっとも類似した一つの単語との類似度を測ります。

  • contrib/pg_trgmの類似度の閾値を指定する設定パラメータpg_trgm.similarity_thresholdを追加しました。 (Artur Zakirov)

    この閾値は以前から設定可能でしたが、これまでは専用の関数set_limit()show_limit()で制御されていました。 これらは非推奨となります。

  • よくあるキーと稀なキーが両方現れる場合のインデックス検索の速度を上げるようにcontrib/pg_trgmのGIN演算子クラスを改善しました。 (Jeff Janes)

  • contrib/pg_trgmのGINインデックスで類似度検索の性能を改善しました。 (Christophe Fornaroli)

  • テーブルの可視性マップを検査できるcontrib/pg_visibilityモジュールを追加しました。 (Robert Haas)

  • contrib/sslinfossl_extension_info()関数を追加しました。 現在の接続に使われているX509証明書に含まれるSSL拡張情報を出力します。 (Dmitry Voronin)

E.6.3.13.1. postgres_fdw
  • 外部サーバのオプションでホワイトリストに含まれている拡張であれば、拡張で提供される演算子と関数をリモート実行に送れるようにしました。 (Paul Ramsey)

    互換性のあるバージョンの拡張がリモートサーバに在るとき、ユーザはこの機能を有効にできます。 これは拡張の演算子を伴う問い合わせのより効果的な実行を可能にします。

  • リモートサーバ上でのソートを検討するようにしました。 (Ashutosh Bapat)

  • リモートサーバ上での結合を検討するようにしました。 (Shigeru Hanada, Ashutosh Bapat)

  • 可能であればUPDATEDELETEを全面的にリモートサーバ上で実行するようにしました。 (Etsuro Fujita)

    これまではリモート更新はSELECT FOR UPDATEコマンドの送信とその後の選択された行の一行ずつの更新や削除を伴いました。 問い合わせのすべての要素がリモートサーバに送って差し支えないならリモートで実行できるようになりますが、一方で演算が何等かローカル処理を必要とするならこの動作はなお必要です。

  • 取り出しサイズをサーバやテーブルのオプションとして設定可能にしました。 (Corey Huinker)

    これまではpostgres_fdwは常にリモート問い合わせから一度に100行を取り出ししていました。この動作が調整可能になりました。

  • 全て同じリモートユーザにマップしている複数ローカルユーザIDが単一の外部サーバ接続を使うようにしました。 (Ashutosh Bapat)

  • リモートサーバに問い合わせキャンセル要求を伝播するようにしました。 (Michael Paquier, Etsuro Fujita)

    これまでは、ローカル問い合わせのキャンセル要求は送信済みのリモート問い合わせを早く終了させませんでした。