★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 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.52. リリース9.4

リリース日: 2014-12-18

E.52.1. 概要

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

  • JSONを格納するためのより高機能で効率的なjsonbデータ型が追加されました。

  • postgresql.conf設定ファイルの項目を変更する新たな SQLコマンドALTER SYSTEMを追加しました。

  • いくつかのALTER TABLEコマンドでロックを軽減しました。

  • マテリアライズドビューを同時実行の読み取りを 妨げずにリフレッシュできるようにしました。

  • データベース変更をカスタマイズ可能な形式でストリーミング出力する、 WALデータのロジカルデコーディングをサポートしました。

  • バックグラウンドワーカプロセスを動的に登録、開始、終了 できるようにしました。

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

E.52.2. バージョン9.4への移行

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

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

  • 多次元配列の入力検査を厳格にしました。 (Bruce Momjian)

    これまでは、単一要素の副配列から始まる入力配列文字列が、後に複数要素の副配列を 含むことができました。例えば '{{1}, {2,3}}'::int[] は受け付けられます。

  • JSON文字列値におけるユニコードエスケープで、バックスラッシュではエスケープされなくなりました。 (Andrew Dunstan)

    これまで、JSONに整形されるテキスト中のすべてのバックスラッシュはエスケープされていました。 エスケープしなくとも正しいJSON文字列値であり、エスケープすることでひねくれた結果がもたらされていたことから、これからは、uと16進数4桁に続くバックスラッシュはエスケープされません。

    訳注:9.4.1で本修正は取り消されています。 オリジナルの9.4.1マニュアルでは、9.4.0リリースノートから本項目自体が削除されていますが、9.4.0バージョンの情報を残すため、日本語訳では項目を残しました。

  • date型、timestamp型、timestamptz型の値を JSONに変換するとき、 ISO 8601に従った書式にします。 (Andrew Dunstan)

    これまでは現在のDateStyle設定に基づいて処理されていました。 しかし、多くのJSONプロセッサはタイムスタンプにISO 8601形式を要求します。 必要であれば、JSON変換関数に渡す前に日付時刻の値をtextに明示的 キャストすることで以前の振る舞いを実現できます。

  • パス展開演算子 json #> text[] は、配列が空であるとき、 これからはNULLではなく左辺値を返すようになります。

    これは、フィールド/要素を取り出す演算子 -> の適用を 全く行わないという意味で一貫性があります。 同様に json #>> text[] は、 単にその左辺値を強制的にテキストに変換します。

  • JSONのフィールド、要素、 パスを取り出す演算子は境界条件で、これからはエラーでなくNULLを返すようにしました。 (Tom Lane)

    例えば、JSON配列にフィールド取り出し演算子(->)を適用するとき、 これからは、エラーでなくNULLがでます。これはより一貫性のある振る舞いです (類似の指定フィールドが無い場合では既にNULLが返ります)。 また、正当な任意のJSONに対して決してエラーを投げないことから、これら演算子を 使った式インデックスの作成を安全にします。

  • to_timestamp()to_date()の書式文字列の連続した空白が、(空白文字以外を含め)入力文字列から対応した数だけ文字を消費するため、FXモードでなくても条件付きで隣接した空白を消費します。 (Jeevan Chalke)

    これまでは、FX書式以外での連続する空白文字は、単一の空白文字の ように振る舞い、入力文字列中の全ての隣接した空白を消費しました。例えば、 以前は3つの空白の書式文字列は' 12'の最初の空白のみ消費しました。 これからは、3文字すべてが消費されます。

  • ts_rank_cd()関数を除去された語彙素を無視するように修正しました。

    これまでは除去された語彙素がデフォルト位置を持つかのように扱われ、 有効であるか疑わしい順位が生じていました。

  • 引数にVARIADIC "any"を取る関数で、VARIADICと指定された引数は決定可能な配列型でなければならなくなりました。

    そのような引数に修飾されていない文字列リテラルやNULLを書くことが できなくなり、これからは適切な配列データ型でキャストが必要となります。 なお、本変更はVARIADICが指定されていない引数には影響しません。

  • 行全体の変数で期待される列名が、複合型引数を取り列名に注意を払う関数に 伝わることを、保証するようになりました。 (Tom Lane)

    row_to_json(tab.*)などのデータ構成で、これからは、常に呼び出し時点の テーブルtabの列別名に一致する列名を出力します。 以前のリリースでは、列名がクエリに割り当てられた別名に関係なく テーブルの実際の列名になっていました。

  • DISCARDがこれからはシーケンス関連の状態も廃棄します。 (Fabrízio de Royes Mello, Robert Haas)

  • EXPLAIN ANALYZEの出力で total runtimeから、execution timeに 項目名を変更しました。 (Tom Lane)

    これからはプラン時間も報告されるため、従来の項目名では紛らわしいです。

  • SHOW TIME ZONEは、これからは POSIX時間帯形式の簡素な数値のUTCオフセットを出力します。 (Tom Lane)

    これまでは、timezone設定をinterval の値として表示していました。 単純な文字列が渡されたとき、 旧出力では正しく再解析されるように特別な扱いが必要であるのに対して、 新出力ではSET TIME ZONEにより適切に解釈されます。

  • 外部テーブルの更新に対応した外部データラッパは、AFTER ROWトリガが 存在する可能性に考慮しなければいけません。 (Noah Misch)

    AFTER ROWトリガがある場合、トリガが読むかもしれないので、 更新動作でテーブルのすべての列を返されなければいけません。 これまでは、外部テーブルはトリガを持つことがなかったので、外部データラッパが RETURNING句で言及されていない列の取得を省略して最適化しているかもしれません。

  • CHECK制約が tableoid以外のシステム列を参照できないようにしました。 (Amit Kapila)

    これまではそのようなチェック制約が許されていましたが、リストア時にしばしばエラーを 引き起こしていました。

  • 複数のリカバリターゲット設定が 指定されていた場合、最後の指定を使用するようにしました。 (Heikki Linnakangas)

    これまではrecovery_target_xxx設定の優先順位が 文書化されていませんでした。

  • Windowsで、機械的にユーザが書いたコマンド文字列内のクオートを維持します。 (Heikki Linnakangas)

    クオートを維持するようにしているユーザコマンドではおそらく修正が必要です。 archive_commandrestore_commandCOPY TO/FROM PROGRAMの コマンドで問題がありそうです。

  • システムカタログの列 pg_class.reltoastidxid が取り除かれました。 (Michael Paquier)

  • システムカタログの列 pg_rewrite.ev_attr が取り除かれました。 (Kevin Grittner)

    列単位のルールはPostgreSQL 7.3以来サポートされていませんでした。

  • Kerberos認証のネイティブサポート(--with-krb5など)が除去されました。 (Magnus Hagander)

    Kerberos認証の使用はGSSAPIでサポートされます。 ネイティブコードはPostgreSQL 8.3から非推奨となっていました。

  • PL/Pythonで、配列のドメインを配列型を基底とするように扱います。 (Rodolfo Campero)

    これまでは文字列として扱われていました。

  • libpq の PQconnectdbParams()PQpingParams()関数が 空文字列をデフォルトとして処理します。 (Adrian Vondendriesch)

    これまでは、これらの関数では一部の場合だけ空文字列でデフォルトを選んでいました。

  • intarrayモジュールが空配列を返すときゼロ次元配列になるように変更しました。 (Bruce Momjian)

    これまでは、空配列を長さゼロの1次元配列として返していました。それらのテキスト表現はゼロ次元配列としたときと同じ({})ですが、配列操作での動作が異なります。 この部分でintarrayの振る舞いが組み込みの配列演算子と同じになります。

  • pg_upgradeは、これからは-Uまたは--username でユーザ名を指定するようになります。 (Bruce Momjian)

    これまでは本オプションは-uまたは--userでしたが、 他のツールとの一貫性に欠けていました。

E.52.3. 変更点

これまでのメジャーリリースからのPostgreSQL 9.4 の変更点の詳細説明を以下に示します。

E.52.3.1. サーバ

  • バックグラウンドワーカプロセスを動的に 登録、開始、終了できるようにしました。 (Robert Haas)

    新たなworker_spiモジュールで本新機能の例を示します。

  • 共有メモリセグメントを動的に割り当てできるようにしました。 (Robert Haas, Amit Kapila)

    本機能はtest_shm_mqモジュールで例示されています。

  • クラッシュリカバリ、あるいは、immediateシャットダウンの際に、 即座に停止しない子プロセスにキャッチできないシグナル(SIGKILL) を送るようになりました。 (MauMau, Álvaro Herrera)

    これにより、postmasterシャットダウン後に子プロセスが 残ってしまう可能性を減らし、また、いくつかの子プロセスが刺った 場合でもクラッシュリカバリの進行を保証します。

  • データベースのシステム識別子のランダム性を改善しました。 (Tom Lane)

  • VACUUMが、削除済(dead)であるけれど未だ除去できない行に ついて統計情報コレクタに適切に報告するようにしました。 (Hari Babu)

    これまでは有効(live)行であるものと報告されていました。

E.52.3.1.1. インデックス
  • GINインデックスのサイズを減らしました。 (Alexander Korotkov, Heikki Linnakangas)

    pg_upgradeを使ってアップグレードした場合、動作しますが、 従来のサイズの大きいGIN形式のままです。REINDEX で新たな形式でインデックスを作り直す必要があります。

  • 複合キーでのGIN インデックス照会の速度を改善しました。 (Alexander Korotkov, Heikki Linnakangas)

  • GiSTインデックスがinet型、cidr型に対応しました。 (Emre Hasegeli)

    これらインデックス改善は、 サブネット・スーパーネット の照会や並べ替えのための比較を性能向上させます。

  • B-treeインデックスのページ削除における稀な競合状態を修正しました。 (Heikki Linnakangas)

  • 割り込みされたB-treeインデックスのページ分割の扱いをより頑健にしました。 (Heikki Linnakangas)

E.52.3.1.2. 性能全般
  • 複数バックエンドからWALバッファに 並行に挿入できるようになりました。 (Heikki Linnakangas)

    本変更は並列書き込み性能を改善します。

  • 条件によって、更新された行のうち変更部分だけを WALに書き込むようにしました。 (Amit Kapila)

  • WINDOW関数 として使われる集約関数の性能を改善しました。 (David Rowley, Florian Pflug, Tom Lane)

  • numeric型を 状態値に使う集約処理の速度を改善しました。

  • テーブルがCLUSTERまたはVACUUM FULLコマンドで書き直されたときにタプルの 凍結を試みます。 (Robert Haas, Andres Freund)

    これにより将来にタプル凍結が必要になることを避けられます。

  • デフォルトがシーケンスの nextval() である列に対するCOPYの速度を改善しました。 (Simon Riggs)

  • 一つの接続で多数のシーケンス にアクセスする場合の速度を改善しました。 (David Rowley)

  • メモリ上でソートやB-treeインデックス構築をする際のタプル数の固定上限を引き上げました。 (Noah Misch)

  • PL/pgSQL手続き言語のDOブロックによるメモリ割り当てを 小さくしました。 (Tom Lane)

  • プランナがAND/OR句が混在する中から、 より積極的に制約句を抽出するようにしました。 (Tom Lane)

  • 揮発性のWHERE句をDISTINCTサブクエリに プッシュダウンしないようにしました。 (Tom Lane)

    WHERE句のプッシュダウンは概してプラン改善に効果的ですが、 問い合わせ文によっては句の評価コストがより多くなると考えられます。 そのため、句がVOLATILE関数を含むときにはプッシュダウンを実施しません。

  • カタログキャッシュが自動でサイズ変更されるようにしました。 (Heikki Linnakangas)

    これは少数のテーブルにだけアクセスする接続に対してメモリ消費を減らし、 また、多数のテーブルにアクセスする接続に対しては性能を向上させます。

E.52.3.1.3. 監視
  • WALアーカイバの活動を報告する pg_stat_archiverシステムビューを追加しました。 (Gabriele Bartolini)

  • n_mod_since_analyze列を pg_stat_all_tablesと関連するシステムビューに追加しました。 (Mark Kirkwood)

    この列は最後にANALYZEが行われて以降のタプル変更回数の推計値を表示します。この推計値が自動ANALYZEの駆動を決めるために使われます。

  • backend_xid列、backend_xmin列を、 システムビューpg_stat_activityに追加し、 backend_xmin列がpg_stat_replication に追加しました。 (Christian Kruse)

E.52.3.1.4. SSL
  • SSLでECDH鍵交換をサポートしました。 (Marko Kreen)

    楕円曲線鍵でサーバ認証ができるようになります。 この鍵はRSA鍵よりも高速で安全です。 新たな設定パラメータssl_ecdh_curveでどの曲線を ECDHに使うかを制御します。

  • ssl_ciphers設定のデフォルト値を改善しました。 (Marko Kreen)

  • デフォルトでクライアント側でなくサーバ側の SSL暗号の優先順設定を使用するようにしました。 (Marko Kreen)

    これまでは、ssl_ciphersで指定した順番が、 クライアント側のデフォルトの好みによってたいてい無視されていました。 これはほとんどのPostgreSQLクライアントで設定不能です。 望むなら新たな設定パラメータssl_prefer_server_ciphersにより従来の振る舞いに戻すこともできます。

  • log_connectionsSSL暗号化情報を出力するようにしました。 (Andreas Kunert)

  • SSL再ネゴシエーション処理を改善しました。 (Álvaro Herrera)

E.52.3.1.5. サーバ設定
  • postgresql.conf設定ファイルの項目を変更できる新たなSQLコマンドALTER SYSTEMを追加しました。 (Amit Kapila)

    従来は設定変更するにはpostgresql.confを手で編集するほかありませんでした。

  • 自動VACUUMワーカーのメモリ使用量を調整するautovacuum_work_mem設定パラメータを追加しました。 (Peter Geoghegan)

  • Linuxのhuge pagesを利用できるhuge_pages設定パラメータを追加しました。 (Christian Kruse, Richard Poole, Abhijit Menon-Sen)

    これにより巨大メモリを持つシステムの性能を改善できます。

  • バックグラウンドワーカの数を制限する max_worker_processesパラメータを追加しました。 (Robert Haas)

    スタンバイサーバに必要な(プライマリと同じ)ワーカプロセス数を調整するときに役立ちます。

  • スーパーユーザのみ使用できるセッション開始時にライブラリをロードするsession_preload_librariesパラメータを追加しました。

    local_preload_librariesと違い、$libdir/pluginsディレクトリにあるものに限られず、本パラメータでは、どの共有ライブラリでもロードできます。

  • ヒントビットの変更もWAL出力するようにするwal_log_hintsパラメータを追加しました。 (Sawada Masahiko)

    チェックサムを有効にしているときを除き、通常ヒントビットはWAL記録されません。 本設定は、pg_rewindのような外部ツールにおいて有用です。

  • work_memmaintenance_work_mem のデフォルト設定値を4倍に増やしました。 (Bruce Momjian)

    それぞれ4MBと64MBが新たなデフォルト値となります。

  • effective_cache_sizeのデフォルト値を4GBに増やしました。 (Bruce Momjian, Tom Lane)

  • log_line_prefixprintf形式の空白パディングを指定できるようにしました。 (David Rowley)

  • 設定ファイルにテラバイト単位 (TB)を記述できるようにしました。 (Simon Riggs)

  • log_lock_waitsによるログメッセージで、 ロックを保持しているプロセス、待っているプロセスのPID、 および、改善されたリレーション情報が出力されるようにしました。 (Christian Kruse)

  • 共有ライブラリをロードした際のログレベルをDEBUG1に下げました。 (Peter Geoghegan)

    これまではLOGレベルでしたが、接続ごとにロードされるライブラリの場合には冗長すぎました。

  • WindowsにてSQL_ASCIIエンコーディングのデータベースとサーバプロセス(例えば postmaster)が、サーバのWindowsユーザロケールの文字エンコーディングでメッセージを出力するようになりました。 (Alexander Law, Noah Misch)

    これまでは、WindowsのANSIコードページでメッセージが出力されていました。

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

  • ストリーミングレプリケーション元ノードでスタンバイの活動を調整する レプリケーションスロット を追加しました。 (Andres Freund, Robert Haas)

    レプリケーションスロットにより、プライマリ上のWALファイル等リソースをスタンバイサーバが必要としなくなるまで保持することができます。

  • レプリケーションを遅延させるリカバリ設定パラメータrecovery_min_apply_delayを追加しました。 (Robert Haas, Fabrízio de Royes Mello, Simon Riggs)

    スタンバイサーバでの再生を遅らせることは、ユーザによる誤りから復旧するのに役立ちます。

  • リカバリ設定パラメータrecovery_targetにオプションimmediateを追加しました。WALリカバリを整合性のある状態に到達したらすぐに停止します。 (MauMau, Heikki Linnakangas)

  • リカバリターゲットの処理を改善しました。 (Heikki Linnakangas)

    停止を判定するpg_last_xact_replay_timestamp()が報告するタイムスタンプが、コミットされるであろうトランザクションでなく、コミット済みのレコードを反映するようにしました。 リストアポイントよりも早すぎる時点で再生が止まってしまうのを防ぎます。

  • pg_switch_xlog()が古いWALファイル上の使われない末尾領域をクリアするようにしました。 (Heikki Linnakangas)

    これはWALファイルの圧縮率を改善します。

  • リカバリ用外部コマンドからの リターンコードを報告するようにしました。 (Peter Eisentraut)

  • WAL再生中のスピンロック競合を減らしました。 (Heikki Linnakangas)

  • トランザクション実行のWALレコードの書き出しをより頻繁にしました。

    これによりスタンバイサーバで起動が速くなり、より積極的にリソースの片づけができるようになります。

ロジカルデコーディングにより、データベース変更を可変な形式で流し出すことができるようになります。 データはWALから読みとり、望む形式に変換されます。本機能を実装するため、以下の改修が行われました。

  • データベース変更をカスタマイズ可能な形式で連続的に出力できる、WALデータのロジカルデコーディングをサポートしました。 (Andres Freund)

  • wal_level設定パラメータに、WALに論理変更セットのエンコードを有効にする新たなオプションlogicalを追加しました。 (Andres Freund)

  • 論理レプリケーションの制御用にテーブル単位のパラメータ REPLICA IDENTITY を追加しました。 (Andres Freund)

  • 論理変更セットのエンコードにおいてユーザ作成テーブルを識別するためのテーブル単位のパラメータ user_catalog_table を追加しました。 (Andres Freund)

  • ロジカルデコーディングデータを受け取るアプリケーションpg_recvlogicalを追加しました。 (Andres Freund)

  • SQLレベルでロジカルデコーディングを例示するtest_decodingモジュールを追加しました。 (Andres Freund)

E.52.3.3. 問い合わせ

  • FROM句の集合を返す関数から返される行に番号をつける WITH ORDINALITY構文を追加しました。 (Andrew Gierth, David Fetter)

    unnest()のような関数で特に役立ちます。

  • FROM句で集合を返す関数の水平結合ができる ROWS FROM()構文を追加しました。 (Andrew Gierth)

  • SELECTで空のターゲットリストを持てるようにしました。

    これにより、ゼロ個の列を選択するビューを正しくダンプ、リストアできるようになります。

  • SELECT ... FOR UPDATE NOWAITが例外的なケースでも既に同時更新されているタプルを待たないようにしました。 (Craig Ringer and Thomas Munro)

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

  • キャッシュされたシーケンス関連の状態を破棄するDISCARD SEQUENCESコマンドを追加しました。 (Fabrízio de Royes Mello, Robert Haas)

    これからはDISCARD ALLもシーケンス関連の状態情報を破棄します。

  • COPY FROMに、 CSVモードで指定のNULL文字列に一致するクオートされた文字列をNULLに変換する、 FORCE NULLオプションを追加しました。 (Ian Barwick, Michael Paquier)

    本オプションが無い場合、クオートされていなくてマッチした文字列だけNULLとして扱われます。

  • トランザクションブロックの外で意味をなさないコマンドを実行したとき、警告を出すようにしました。 (Bruce Momjian)

    新たにSET LOCALSET CONSTRAINTSSET TRANSACTION、および、ABORTについて、トランザクション外で使うと警告がでるようになります。

E.52.3.4.1. EXPLAIN
  • EXPLAIN ANALYZEがプラン時間を表示するようにしました。 (Andreas Karlsson)

  • EXPLAINがAgg、Groupプラン要素にて集約している列を出力するようにしました。 (Tom Lane)

  • EXPLAIN ANALYZEでビットマップヒープスキャンのexactブロックカウントとlossyブロックカウントを出力するようにしました。 (Etsuro Fujita)

E.52.3.4.2. ビュー
  • マテリアライズドビューを他セッションの同時参照を妨げずにリフレッシュできるようにしました。 (Kevin Grittner)

    REFRESH MATERIALIZED VIEW CONCURRENTLYコマンドで行います。

  • たとえ更新できない列が含まれていても、ビューが自動更新可能になります。 (Dean Rasheed)

    これまでは、式や定数、関数呼び出しなどの更新不能な出力列があると、ビューは自動更新可能にはなりませんでした。 これからは、更新不能な列に新しい値を割り当てしようとしないならINSERTUPDATEDELETEがサポートされます。

  • INSERTUPDATEで、 自動更新可能ビューにそのビューにはあらわれない行を加えることができるかを制御できるようにしました。 (Dean Rasheed)

    新たに追加されたCREATE VIEWWITH CHECK OPTION句で制御します。

  • セキュリティバリアビューも自動更新可能になれるようにしました。 (Dean Rasheed)

E.52.3.5. オブジェクトの操作

  • 外部テーブルのトリガをサポートしました。 (Ronan Dunklau)

  • ALTER TABLEALTER INDEXALTER MATERIALIZED VIEWにて、 ALL IN TABLESPACE ... SET TABLESPACE指定を使って、 テーブルスペースのオブジェクト群をまとめて別テーブルスペースに移動できるようにしました。 (Stephen Frost)

  • ALTER TABLE ... ALTER CONSTRAINTで外部キー制約が遅延できるかを変更できるようにしました。 (Simon Riggs)

  • いくつかのALTER TABLEコマンドでロックの強さを下げました。 (Simon Riggs, Noah Misch, Robert Haas)

    特に、VALIDATE CONSTRAINTCLUSTER ONSET WITHOUT CLUSTERALTER COLUMN SET STATISTICSALTER COLUMN SET (attribute_option)ALTER COLUMN RESET (attribute_option)は、もはや ACCESS EXCLUSIVEロックを必要としません。

  • テーブルスペースのオプションを CREATE TABLESPACEで設定できるようにしました。 (Vik Fearing)

    以前はこれらのオプションはALTER TABLESPACEでしか設定できませんでした。

  • CREATE AGGREGATEで集約の遷移状態データの推定サイズを指定できるようにしました。 (Hadi Moshayedi)

    この機能を適切に使うことでプランナが集約での必要メモリ量をよりよく見積もれます。

  • DROP IF EXISTSが場合によってはオブジェクトが無いことでエラーになるのを修正しました。 (Pavel Stehule, Dean Rasheed)

  • システムリレーションの識別方法を改善しました。 (Andres Freund, Robert Haas)

    これまでは、一度pg_catalogスキーマに移動したリレーションは、変更も削除もできませんでした。

E.52.3.6. データ型

  • lineデータ型を完全に実装しました。 (Peter Eisentraut)

    線分データ型(lseg) は既にサポートされています。 従来のlineデータ型(コンパイルオプションでのみ有効にできます)は、バイナリでもダンプでも新しい実装と互換性がありません。

  • WALのログシーケンス番号(LSN)をあらわすpg_lsnデータ型を追加しました。 (Robert Haas, Michael Paquier)

  • 一点だけのpolygoncircleに変換できるようにしました。 (Bruce Momjian)

  • UTCオフセットが変化するタイムゾーン略称をサポートしました。 (Tom Lane)

    これまでPostgreSQLでは(ESTなどの)一つのタイムゾーン略称に関連づけられたUTCオフセットは、いかなるロケールでの使用でも変化しないと仮定していました。 しかしながら、実世界においてこの仮定は失敗しました。そこで、意味するUTCオフセットをときに変更できるタイムゾーン略称を導入しました。 1970年以来の略称のUTCオフセットが変更されたタイムゾーンロケールで本機能を使えるように(IANAタイムゾーンデータベースに基づいて)ゾーン略称定義ファイルを刷新しました。これからはPostgreSQLは、略称に日付に応じた適切なUTCオフセットを関連づけます。

  • timestampdateのISO形式以外の文字列で5桁以上の年を使用可能にしました。 (Bruce Momjian)

  • interval値のオーバーフロー、アンダーフローのチェックを加えました。 (Bruce Momjian)

E.52.3.6.1. JSON
  • より高機能で効率的なJSON文字列のデータ型jsonbを追加しました。 (Oleg Bartunov, Teodor Sigaev, Alexander Korotkov, Peter Geoghegan, Andrew Dunstan)

    この新しいデータ型は、JSON文書により高速にアクセスでき、また、JSON列により高速で有用なインデックス適用ができます。 従来のjson型がJSON文書全体をテキストとして格納するのに対し、 jsonb文書のスカラ値は適当なSQLデータ型として格納され、JSON文書の構造は事前解析されます。

  • 任意の複雑なJSONツリーを構築できる新たなJSON関数を追加しました。 (Andrew Dunstan, Laurence Rowe)

    新たな関数には、 json_array_elements_text()json_build_array()json_object()json_object_agg()json_to_record()json_to_recordset()が含まれます。

  • json値のデータ型を返す json_typeof()を追加しました。 (Andrew Tipton)

E.52.3.7. 関数

  • より柔軟に遅延を指定できるpg_sleep_for(interval)pg_sleep_until(timestamp)を追加しました。 (Vik Fearing, Julien Rouhaud)

    既存のpg_sleep()関数は秒指定の遅延のみをサポートしていました。

  • 配列を引数とするcardinality()関数を追加しました。 (Marko Tiikkaja)

    この関数は、配列要素の総数、要素が無い場合にはゼロを返します。

  • 任意のオフセットでラージオブジェクトを読み書きできるSQL関数を追加しました。 (Pavel Stehule)

  • unnest()を複数引数をとれるようにしました。引数は各々に展開され、水平に結合されます。 (Andrew Gierth)

  • 文字列ではなく個別の値から、timedatetimestamptimestamptzintervalの各データ型を構築する関数を追加しました。 (Pavel Stehule)

    これらの関数にはmake_という接頭辞が付きます(例えばmake_date())。

  • to_char()関数のTZ書式指示子が、数値であらわれたタイムゾーンオフセットに対して有効な値を返すようにしました。 (Tom Lane)

    これまでは、 timezoneに「-4」のような定数が設定されていると、 to_char(CURRENT_TIMESTAMP, 'TZ')が空文字列を返していました。

  • to_char()で タイムゾーンオフセットの書式指示子「OF」がサポートされました。 (Bruce Momjian)

  • random() のランダムシードを改善しました。 (Honza Horak)

  • chr(int)で ユニコードのコードポイントの正当性チェックをより厳しくしました。 (Tom Lane)

    本関数はRFC 3629に従ったUTF8文字のみを有効な値として受けるようになります。

E.52.3.7.1. システム情報関数
  • システムテーブルpg_classpg_procpg_typepg_operatorを検索して、オブジェクトが無くてもエラーを返さない関数をいくつか追加しました。 (Yugo Nagata, Nozomi Anzai, Robert Haas)

    例えば、to_regclass()pg_classregclass入力関数と同様に検索しますが、オブジェクトが無い場合には失敗するのでなくNULLを返します。

  • リレーション名をファイルノードからより効率的に検索できるpg_filenode_relation()関数を追加しました。 (Andres Freund)

  • information_schema.parametersビューにparameter_default列を追加しました。 (Peter Eisentraut)

  • information_schema.schemataが全てのアクセス可能なスキーマを表示するようにしました。 (Peter Eisentraut)

    これまでは現在ユーザが所有者のスキーマだけ表示していました。

E.52.3.7.2. 集約
  • どの行を集約関数に渡すかを制御するFILTER句が追加されました。 (David Fetter)

  • 順序付けされた集合(WITHIN GROUP)の集約をサポートしました。 (Atri Sharma, Andrew Gierth, Tom Lane)

  • SQL標準の順序集合の集約関数 percentile_cont()percentile_disc()mode()rank()dense_rank()percent_rank()cume_dist()が追加されました。 (Atri Sharma, Andrew Gierth)

  • 集約関数でVARIADIC をサポートしました。 (Tom Lane)

  • 引数に多態集約が多態でない状態データ型を持てるようにしました。 (Tom Lane)

    組み込みのarray_agg()のような集約関数をSQLで適切に宣言できるようになります。

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

  • PL/PerlPL/Tclにイベントトリガのサポートを加えました。 (Dimitri Fontaine)

  • numeric型の値を PL/Pythondecimal型に変換するようにしました。 (Szymon Guz, Ronan Dunklau)

    これまでは、値をPythonのfloat型の値に変換していました。

E.52.3.8.1. PL/pgSQLサーバサイド言語
  • GET DIAGNOSTICS を使ってPL/pgSQLの現在のコールスタックを取得できるようにしました。 (Pavel Stehule, Stephen Frost)

  • STRICT制約に違反したクエリを表示する print_strict_paramsオプションを追加しました。 (Marko Tiikkaja)

  • 追加的なPL/pgSQLの警告とエラーを有効にする plpgsql.extra_warnings変数、 plpgsql.extra_errors変数を追加しました。 (Marko Tiikkaja, Petr Jelinek)

    いまのところ隠し変数についての警告、エラーが有効になるだけです。

E.52.3.9. libpq

  • libpqのPQconndefaults()が 無効なサービスファイルを無視するようにしました。 (Steve Singer, Bruce Momjian)

    これまでは、不正なサービスファイルに遭遇するとNULLを返していました。

  • TLSv1以降バージョンのTLSプロトコルを受け付けます。 (Marko Kreen)

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

  • createuserに、所属するロールを指定する-gオプションを追加しました。 (Christopher Browne)

  • vacuumdb粒度を増やして複数段階で解析を行う--analyze-in-stagesオプションが追加されました。

    これにより最小限の統計情報を素早く生成できます。

  • pg_resetxlog-nオプションにて現在値ともしかすると変更された値を出力するようにしました。 (Rajeev Rastogi)

  • initdbが誤ったロケール設定に黙って代替にデフォルトを選択するのでなくエラーを出すようにしました。 (Tom Lane)

  • pg_ctlがデータディレクトリにアクセスできないとき終了コード4を返すようにしました。 (Amit Kapila, Bruce Momjian)

    この振る舞いはLinux Standard Base(LSB)のコア仕様により厳密に適合します。

  • Windowsで相対パスで指定された-Dオプションをpg_ctlのカレントディレクトリからの相対パスと解釈することを保証します。 (Kumar Rajeev Rastogi)

    これまでは、元となるWindowsサービスが開始されたディレクトリを起点にして解釈されていました。

  • ECPGでC言語の配列定義にsizeof()を使用可能にしました。 (Michael Meskes)

  • ECPGで入れ子になったC言語スタイルのコメントをC言語中でも SQL中でも適切に扱えるようにしました。 (Michael Meskes)

E.52.3.10.1. psql
  • psqlexpanded モードでfooterが無効であるときには、No rows出力を抑止します。 (Bruce Momjian)

  • コネクション開始時にハングアップしたとき、Control-C押下で終了できるようにしました。 (Peter Eisentraut)

  • psql\db+でテーブルスペースオプションが 表示されるようにしました。 (Magnus Hagander)

  • \do+で演算子を実装している関数が表示されるようにしました。 (Marko Tiikkaja)

  • \d+でテーブルにoid列がある場合だけ OID行を表示するようにしました。 (Bruce Momjian)

    これまではoid列の有無にかかわらず常に報告されていました。

  • \dで無効になっているシステムトリガを表示するようにしました。 (Bruce Momjian)

    これまでは、すべてのトリガを無効にした場合、ユーザトリガだけが無効であるものとして表示されていました。

  • \copyで「stdin」とセミコロンの間の空白を不要にしました。 (Etsuro Fujita)

  • COPYですでにそうなっているように、 \copyで最後に行数を出力します。 (Kumar Rajeev Rastogi)

  • \conninfohostaddrを使って接続した場合に サーバのIPアドレスを表示するように修正しました。 (Fujii Masao)

    これまでは\conninfoはこのようなケースでサーバの IPアドレスを表示できませんでした。

  • \conninfoSSLプロトコルバージョンを表示します。 (Marko Kreen)

  • \psetのためのタブ補完が追加しました。 (Pavel Stehule)

  • 引数無しの\psetで設定一覧を表示するようにしました。 (Gilles Darold)

  • \sで書き出すヒストリファイル名を絶対パスに変換せずに表示するようにしました。 (Tom Lane)

    これまでのコードでは表示するのに相対パスを絶対パスに変換しようと試みていましたが、しばしば誤っていました。

E.52.3.10.2. pg_dump
  • pg_restoreのオプション-I-P-T-nを複数指定できるようにしました。 (Heikki Linnakangas)

    これにより一度の操作で複数オブジェクトをリストアできます。

  • 古いオブジェクトをリストア時に削除する場合にオプションでIF EXISTS句をDROPコマンド出力に加えることができます。 (Pavel Stehule)

    本変更は古いオブジェクトを削除する際に不要なエラーがでるのを防ぎます。 新たな--if-existsオプションは、pg_dumppg_dumpallpg_restore--cleanオプションも指定している場合に使用できます。

E.52.3.10.3. pg_basebackup
  • pg_basebackuppg_xlogディレクトリを指定するオプション --xlogdirを追加しました。 (Haribabu Kommi)

  • pg_basebackupでバックアップコピー内のテーブルスペースを 新しい場所に移すことができます。 (Steeve Lennmark)

    これは特に、プライマリと同マシンでpg_basebackupを使用するときに便利です。

  • ネットワークストリーム経由のベースバックアップ取得を減速できるようにしました。 (Antonin Houska)

    pg_basebackup--max-rateパラメータで制御できます。

E.52.3.11. ソースコード

  • タプルを調査情報を保持して凍結する方法を改善しました。 (Robert Haas, Andres Freund)

    この変更は、タプルをできるだけ早く凍結させることの難点を除去します。 タプルのフラグビットを解析するコードは修正が必要となります。

  • 関数宣言にはPG_FUNCTION_INFO_V1 マクロでの印づけを不要にしました。 (Peter Eisentraut)

    本変更は定形的なプロトタイプ記述の必要を除去します。 なお、コンパイラ警告を避けるため、PG_FUNCTION_INFO_V1 マクロは対応する関数定義の手前では必要です。

  • SnapshotNowHeapTupleSatisfiesNow()を除去しました。 (Robert Haas)

    既存の使用箇所はより適切なスナップショットタイプに切り替えられます。 これからはカタログスキャンにMVCCスナップショットが使われます。

  • 1GB以上のメモリ割り当てが可能なAPIを追加しました。 (Noah Misch)

  • 文字列構成用のメモリ割り当てを簡単にするpsprintf()を追加しました。 (Peter Eisentraut, Tom Lane)

  • size_t値を表示する printf()のサイズ修飾子zをサポートしました。 (Andres Freund)

  • vsnprintf()をよりよく使用するように appendStringInfoVA()APIが変更されました。 (David Rowley, Tom Lane)

  • 新たな種類の外部TOASTデータを作成できるようにしました。 (Andres Freund)

  • 単一リーダ、単一ライタの軽量な共有メッセージキューを追加しました。 (Robert Haas)

  • x86_64 CPUのスピンロックスピードを改善しました。 (Heikki Linnakangas)

  • サポートされないプラットフォームSINIXSun3NS32Kのスピンロックサポートを除去しました。 (Robert Haas)

  • IRIX移植を無くしました。 (Robert Haas)

  • --disable-spinlocks指定でビルドしたことによる必要セマフォ数を減らしました。 (Robert Haas)

  • duplicate_oidsシェルスクリプトをPerlで書き直しました。 (Andrew Dunstan)

  • クライアントプログラムむけにTest Anything Protocol(TAP)のテストを追加しました。 (Peter Eisentraut)

    現在、これらのテストはmake check-world--enable-tap-testsconfigureに指定されたときのみ実行されます。 将来の機能リリースでデフォルトの振る舞いになるかもしれません。

  • makeターゲットに、選択した個々のテストを実行できるcheck-testsinstallcheck-testsを追加しました。(Andrew Dunstan)

  • makefileルールのmaintainer-checkを除去しました。 (Peter Eisentraut)

    これからはデフォルトのビルドルールに以前はオプションであったテストが全て含まれます。

  • PGXSモジュールのVPATHビルドのサポートを改善しました。 (Cédric Villemain, Andrew Dunstan, Peter Eisentraut)

  • Autoconf 2.69にアップグレードしました。 (Peter Eisentraut)

  • PG_VERSION文字列に任意のカスタム文字列を追加できるconfigureフラグを追加しました。 (Oskari Saarenmaa)

    パッケージ製作者がカスタムバイナリを作るのに有用です。

  • DocBookのXML検証が改善されました。 (Peter Eisentraut)

  • Coverityスキャナーで報告された、多様な細かなセキュリティと健全性の問題を修正しました。 (Stephen Frost)

  • PostgreSQLValgrindでテストしたときの 不正なメモリ利用の検出を改善しました。 (Noah Misch)

  • サンプルEmacs設定ファイルemacs.samplesを改善しました。 (Peter Eisentraut)

    また、.dir-locals.elをソースツリーのトップに加えました。

  • pgindentがtypedefsのコマンドラインリストを受け入れるようにしました。 (Bruce Momjian)

  • pgindentを条件プリプロセッサ周辺の空行についてより賢くしました。 (Bruce Momjian)

  • CygwinMingwでのビルドで dlltoolをほとんど使用しないようにしました。 (Marco Atzeri, Hiroshi Inoue)

  • MSVC(Windows)ビルドでクライアントのみインストールをサポートしました。 (MauMau)

E.52.3.12. 追加モジュール

  • サーバ起動時にリレーションデータを共有バッファに事前読み込みするpg_prewarm拡張を追加しました。 (Robert Haas)

    これにより素早く完全な運用性能に達することができます。

  • pgcryptoUUID乱数を生成をするgen_random_uuid()を追加しました。 (Oskari Saarenmaa)

    uuid-osspをインストールすることなく、 バージョン 4 UUIDが生成可能です。

  • uuid-osspOSSPUUIDライブラリだけでなく、 BSDe2fsprogsのUUIDライブラリで動作するようにしました。 (Matteo Beccati)

    この改善は、もはや廃れつつあるOSSPライブラリを必要としないので、 uuid-osspモジュールの移植性を改善します。 モジュール名は今や不適切ですが変更しないつもりです。

  • auto_explainに実行時間を含めるオプションを追加しました。 (Horiguchi Kyotaro)

  • コミットされていないトランザクションの行をdeadと報告しないように pgstattupleを修正しました。 (Robert Haas)

  • pgstattuple関数がregclass型の引数を使うようにしました。 (Satoshi Nagayasu)

    しばらくはtext型引数も未だサポートしますが、将来のメジャーリリースで除かれるでしょう。

  • スナップショット規則を一貫して尊重してpgrowlocks 出力の一貫性を改善しました。 (Robert Haas)

  • pg_trgmでインデックス付けされた正規表現検索のためのトライグラム選択を 改善しました。 (Alexander Korotkov)

    本変更は通常低い選択性である空白文字を含むトライグラムの使用を抑止します。

  • pg_xlogdump--followオプションで活動中のログストリームについて報告できるようにしました。 (Heikki Linnakangas)

  • cubeデータをより小さく格納します。 (Stas Kelvich)

    既存データはダンプ、リストアで新フォーマットにする必要があります。 旧フォーマットも未だ読み取り可能です。

  • カーソルを使うことでvacuumloのクライアント側メモリ使用量を減らしました。 (Andrew Dunstan)

  • pg_upgradeのメモリ使用量を大幅に削減しました。 (Bruce Momjian)

  • pg_upgradeでユーザ指定する-Uオプションを 生成される解析スクリプトに渡すようにしました。 (Bruce Momjian)

E.52.3.12.1. pgbench
  • pgbenchスクリプトの行の長さ制限をなくしました。 (Sawada Masahiko)

    以前はBUFSIZが行の長さの上限でした。

  • pgbenchに長いオプション名を追加しました。 (Fabien Coelho)

  • pgbenchにトランザクション速度を指定する--rateオプションを追加しました。 (Fabien Coelho)

  • pgbenchに定期的に進行報告を表示する--progressオプションを追加しました。 (Fabien Coelho)

E.52.3.12.2. pg_stat_statements
  • pg_stat_statementsがクエリ文字列の格納のために 共有メモリではなくファイルを使うようにしました。 (Peter Geoghegan)

    これにより、クエリ文字列の長さの制限をなくし、デフォルトでこれまでより たくさんの異なるステートメントを追跡できるようにしました。

  • pg_stat_statementsの内部クエリハッシュ識別子の報告を できるようにしました。 (Daniel Farina, Sameer Thakur, Peter Geoghegan)

  • クエリ文字列以外にのすべての情報についてpg_stat_statementsを 取り出す機能を追加しました。 (Peter Geoghegan)

    これにより、モニタリングツールが作成されたばかりのエントリをフェッチできるようになり、統計情報のために繰り返すクエリの性能を高めます。

  • pg_stat_statementsDEALLOCATEコマンドを 無視するようにしました。 (Fabien Coelho)

    すでにPREPAREを無視するようになっていますので、より一貫性を高めます。

  • サーバシャットダウン時に、統計ファイルを$PGDATA/globalではなく、$PGDATA/pg_statに保存します。 (Fujii Masao)