<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PostgreSQL 9.6.2 &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/tag/postgresql-9-6-2/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<description>OSS専門の技術ブログ。PostgreSQL、Zabbixを中心に10種類以上のOSSの解説、アップデート情報、運用ヒントを提供。</description>
	<lastBuildDate>Thu, 22 Oct 2026 07:34:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>PostgreSQL 9.6.2 &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PostgreSQL 9.6.3 に関する技術情報</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/9-6-3/</link>
		
		<dc:creator><![CDATA[PostgreSQL技術グループ]]></dc:creator>
		<pubDate>Fri, 26 May 2017 02:21:16 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 9.6]]></category>
		<category><![CDATA[PostgreSQL 9.6.2]]></category>
		<category><![CDATA[PostgreSQL 9.6.3]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=695</guid>

					<description><![CDATA[このリリースは 9.6.2 からの修正リリースです。 9.6.x からのアップデートではダンプ、リストアは不要です。 ただし、項目1番、4番、23番に該当する場合、追加の対処が必要です。 また、9.6.2 より前のバージ ...]]></description>
										<content:encoded><![CDATA[<p>このリリースは 9.6.2 からの修正リリースです。<br />
9.6.x からのアップデートではダンプ、リストアは不要です。<br />
ただし、項目1番、4番、23番に該当する場合、追加の対処が必要です。</p>
<p>また、9.6.2 より前のバージョンからアップデートを行う場合は <a href="/tech-blog/pgsql/9-6-2/">9.6.2 に関する技術情報</a>を参照してください。</p>
<p><span id="more-695"></span></p>
<h3>PostgreSQL 9.6.2 から 9.6.3 への変更点</h3>
<p>9.6.3、9.5.7、9.4.12、9.3.17、9.2.21 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。</p>
<hr />
<ol>
<li>ユーザマッピングオプションとして格納されたパスワードを保護するため、pg_user_mappings.umoptions の可視性が厳格化されました。  (Michael Paquier, Feike Steenbergen) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでの実装では、外部サーバオブジェクト所有者やサーバの USAGE 権限を付与されたユーザが、そのサーバに関連する全ユーザマッピングのオプションを見ることができました。これには他ユーザのパスワードもしっかり含まれているかもしれません。
</p>
<p>
そこで、information_schema.user_mapping_options と振る舞いが一致するように pg_user_mappings ビューの定義が修正されました。すなわち、マップされているユーザであるか、PUBLIC へのマッピングで現在ユーザがサーバの所有者である、あるいは、現在ユーザがスーパーユーザのときに、ユーザマッピングオプションが見えるようになります。(CVE-2017-7486)
</p>
<p>
本パッチでは、新たに initdb で作成されたデータベースクラスタについてのみ振る舞いを変更します。既存データベースクラスタに対して変更を適用するには、以下の手順を実施する必要があります。
</p>
<p>
(1)
</p>
<p>
postgresql.conf に「allow_system_table_mods = true」を加えた後、PostgreSQL サービス (postmaster) を再起動します (ALTER SYSTEM をサポートするバージョンであれば、それを使うこともできますが、いずれにせよ再起動は必要です)。
</p>
<p>
データベースクラスタ内の各データベースで以下のコマンドをスーパーユーザで実行します。
</p>
<pre>
SET search_path = pg_catalog;
CREATE OR REPLACE VIEW pg_user_mappings AS
    SELECT
        U.oid       AS umid,
        S.oid       AS srvid,
        S.srvname   AS srvname,
        U.umuser    AS umuser,
        CASE WHEN U.umuser = 0 THEN
            'public'
        ELSE
            A.rolname
        END AS usename,
        CASE WHEN (U.umuser &lt;&gt; 0 AND A.rolname = current_user)
                    OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
                    OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                    THEN U.umoptions
                 ELSE NULL END AS umoptions
    FROM pg_user_mapping U
         LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
        pg_foreign_server S ON (U.umserver = S.oid);
</pre>
<p>
(2)
</p>
<p>
template0 と template1 に対しても対処が必要です。さもなくば後に新たに作ったデータベースには脆弱性が依然として存在することになります。template0 を修正するには、一時的に template0 を接続可能にする必要があります。
</p>
<p>
PostgreSQL 9.5 以降では以下のコマンドが利用できます。
</p>
<pre>
template0 を接続可能にする：
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

template0 を接続不能に戻す：
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
</pre>
<p>
より古いバージョンでは代替に以下コマンドを使います。
</p>
<pre>
template0 を接続可能にする：
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';

template0 を接続不能に戻す：
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
</pre>
<p>
(3)
</p>
<p>
最後に allow_system_table_mods 設定を除去して、PostgreSQL サービス (postmaster) をもう一度再起動します。
</p>
<li>情報を漏らす演算子を介した統計情報の露出を防止するようになりました。  (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
いくつかのプランナの選択率見積り関数は、最頻値やヒストグラムの登録値など、pg_statistic から得られる値に対してユーザ定義演算子を適用します。この動作はテーブル権限が検査される前に生じるので、悪意のユーザが本来参照が許されていないテーブル列の値を取得するために、この振る舞いを悪用するおそれがありました。この対策として、演算子の実装関数が情報を漏らさないことが確実（LEAKPROOF属性が真）でなく、呼び出しているユーザが統計情報を必要とするテーブル列の読み取り権限を持っていない場合には、デフォルトの見積で代用するようになりました。実用上たいていのケースで、これら基準のうち少なくとも一つを満たします。(CVE-2017-7484)
</p>
<li>libpq で PGREQUIRESSL 環境変数を認識するように復旧されました。  (Daniel Gustafsson) (9.6)(9.5)(9.4)(9.3)</li>
<p>
この環境変数の処理が PostgreSQL 9.3 で意図せず欠落していましたが、ドキュメントには残っていました。ユーザが SSL 暗号化接続を強制させるために、機能しなくなっていた本環境変数を頼っているかもしれないため、セキュリティ上の危険が生じます。
</p>
<p>
PGREQUIRESSL 環境変数の処理が復旧されました。しかし、9.3 以降で正しく動作していた設定を壊さないようにするため、PGSSLMODE よりも低い優先順位で扱われます。(CVE-2017-7485)
</p>
<li>ロジカルデコーディング中の無効であるかもしれない初期スナップショットについて修正されました。  (Petr Jelinek, Andres Freund) (9.6)(9.5)(9.4)</li>
<p>
ロジカルデコーディングのレプリケーションスロットむけに作られた初期スナップショットは不正なものである可能性がありました。これは、ロジカルデコーディングを使うサードパーティツールが不完全あるいは一貫性に欠ける初期データをコピーする原因となります。スロットを作るときにソースサーバが忙しい場合や、他のロジカルスロットが既に在った場合に発生しやすい動作です。
</p>
<p>
ロジカルデコーディングに依存したレプリケーションツールを使っていて、それがレプリケーション開始時に空でないデータセットをコピーするのであれば、本アップデート導入後にレプリカを再作成するか、ソースサーバと比較してデータ検証することを推奨します。
</p>
<li>UNLOGGED インデックスの初期フォークが破損する可能性があり、修正されました。  (Robert Haas, Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
クラッシュと再起動の後に、無効な状態にセットされている UNLOGGED インデックスがもたらされる恐れがありました。この問題はインデックスを削除して再作成するまで持続します。
</p>
<li>スタンバイサーバが準備されたがコミットされていない 2 相トランザクションをリプレイしたときの pg_subtrans 項目の不正な再構築が修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
たいていの場合、これは目に見える悪影響を及ぼしませんが、稀な場合に pg_subtrans の循環参照をもたらし、2 相トランザクションにより変更された行を検査する問い合わせで無限ループをひき起こす可能性があります。
</p>
<li>文字列バッファの初期化失敗により、wal sender にてクラッシュする可能性が回避されました。  (Stas Kelvich, Fujii Masao) (9.6)(9.5)(9.4)</li>
<li>GiST インデックスで index-only の最近傍検索を再スキャンする時にクラッシュする可能性があり、修正されました。  (Tom Lane) (9.6)(9.5)</li>
<li>マスタプロセス (postmaster) による複数パラレルワーカプロセスの起動の遅延を防止するようになりました。  (Tom Lane) (9.6)</li>
<p>
2 つ以上のワーカープロセスに向けた問い合わせの要求を満たす前に、あるいは複数問い合わせが同時にワーカーへ要求されたときに、著しい遅延(数十秒)が生じる可能性がありました。本現象は多くのプラットフォームでは不運なタイミングでのみ発生しますが、一部プラットフォームではよくあるケースです。
</p>
<li>マスタプロセス (postmaster) におけるバックグラウンドワーカプロセスに対する fork() 失敗時の処理が修正されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
これまでは、プロセスが正常に起動されたかのようにワーカ状態の一部を更新していて、その後に混乱をひき起こしていました。
</p>
<li>入れ子の集合演算のプラン作成で「ERROR:  no relation entry for relid 0」が生じる可能性があり、修正されました。  (Tom Lane) (9.6)</li>
<pre>
(障害が発生する SQL の例)
db1=# (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6;
ERROR:  no relation entry for relid 0
</pre>
<li>パラレル問い合わせのプラン作成の各種の小さな問題が修正されました。  (Robert Haas) (9.6)</li>
<p>
プラン選択が不適切になる場合がありえました。
</p>
<li>カスタムスキャンに対して物理ターゲットリスト最適化の適用を回避するようになりました。  (Dmitry Ivanov, Tom Lane) (9.6)(9.5)</li>
<p>
この最適化はタプルの全ての列を取得するのが低コストでできることを想定しています。通常タプルにおいてはこれは真ですが、カスタムスキャンプロバイダーに対してはそうでないかもしれません。
</p>
<li>CREATE POLICY で「FOR ALL ...」を適用するとき、正しい副式を使うようになりました。  (Stephen Frost) (9.6)(9.5)</li>
<p>
一部ケースで USING 制約がより適切であるときに WITH CHECK 制約が適用されました。
</p>
<p>
修正前ではポリシーに反する値への更新、および更新後の値の返却が可能でした。以下例は修正後はエラーとなります。
</p>
<pre>
(誤動作例)
db1=# CREATE POLICY alice_policy ON t TO alice
        USING (value &gt; 0) WITH CHECK (true);
db1=# SET session authorization alice;
db1=# SELECT * FROM t;
 value
-------
    1
(1 rows)

db1=# UPDATE t SET value = value * -1 WHERE value = 1 RETURNING *;
 value
-------
   -1
(1 row)

UPDATE 1
</pre>
<li>拡張モジュールのスクリプトでの問い合わせパース処理において、直前の DDL 命令の結果を確実に把握するように修正されました。  (Julien Rouhaud, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
拡張モジュールのスクリプトファイルのコマンド間では、キャッシュを更新する手順が欠けているので、ALTER TABLE ... RENAME ... などの DDLコマンドに続くDMLコマンドは直前の定義変更に気づかないかもしれませんでした。
</p>
<pre>
(例：以下のスクリプトで最後の UPDATE が失敗する可能性がありました)

CREATE TABLE xxx_ext_table (col_old INT);
ALTER TABLE xxx_ext_table RENAME col_old TO col_new;
UPDATE xxx_ext_table SET col_new = 0;
</pre>
<li>ALTER TABLE ... ALTER COLUMN TYPE で既存インデックスを再構築する場合に、テーブルスペース権限チェックを省略するようになりました。  (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
本コマンドは、実行ユーザがその時点でインデックスが置かれているテーブルスペースに CREATE 権限を持っていないと失敗していました。この振る舞いは役に立たないと考えられ、検査を省略し、この場合にはインデックスを再構築できるようにしました。
</p>
<li>制約が NO INHERIT であるときには、ALTER TABLE ... VALIDATE CONSTRAINT が子テーブルにまで再帰処理しないように修正されました。  (Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
この修正は、子テーブルに一致する制約が存在しないときに望まれない「ERROR:  constraint does not exist」が生じるのを防ぎます。
</p>
<li>ソーステーブルの行単位セキュリティが有効のときに「COPY ... TO ...」でダングリングポインタを回避するように修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
通常は無害ですが、ときどき予期せぬエラーやクラッシュをひき起こしていました。
</p>
<li>CLUSTER および VACUUM FULL で、既に閉じたシステムキャッシュ (relcache) 項目へのアクセスを回避するように修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
運が悪いとき、本障害は対象テーブルのインデックスの誤った永続性設定 (UNLOGGEDか、TEMPORARYか、等) での再構築をひき起こす可能性がありました。
</p>
<li>ページピン (PIN) の競合によりスキャンできないページについて適切に計算するように VACUUM が修正されました。  (Andrew Gierth) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
この障害により、テーブルタプル数の過小見積が生じがちでした。競合の多い小さいテーブルという最悪ケースでは、VACUUM がテーブルは0行であると誤って報告する可能性があり、非常に悪いプラン選択をもたらしました。
</p>
<li>ハッシュ結合の中での大量タプル転送のループ処理が問い合わせキャンセル要求で割り込み可能であることが保証されました。  (Tom Lane, Thomas Munro) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
ハッシュ結合でキャンセルがすぐには効かない挙動が報告されていました。
</p>
<li>SP-GiST インデックスで、ある種の box 型への演算子における誤った対応が修正されました。  (Nikita Glukhov) (9.6)</li>
<p>
&amp;&lt;、&amp;&gt;、&amp;&lt;|、および、|&amp;&gt; 演算子を使う SP-GiST インデックススキャンは、誤った応答をもたらしていました。要素が接している場合の判定に影響があります。
</p>
<li>interval 型の比較における整数オーバーフロー問題が修正されました。  (Kyotaro Horiguchi, Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
およそ 296000 年以上の時間間隔の場合に interval 型の比較演算子が誤った応答を返すおそれがありました。このような大きい値が含むカラムのインデックスは、インデックス内容が不正であるかもしれないので、バージョンアップ後にインデックス再作成すべきです。
</p>
<p>
64bit 整数の日付時刻を使う方式(デフォルト)でビルドした場合に該当します。
</p>
<li>tableforest 引数が false のときに妥当な出力をするように cursor_to_xml() 関数が修正されました。  (Thomas Munro, Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでは、&lt;table&gt; 要素で括られず、&lt;row&gt; 要素の並びだけが出力されていました。
</p>
<pre>
(誤った出力例)
db1=# DECLARE c CURSOR WITH HOLD FOR SELECT * FROM t1;
db1=# SELECT cursor_to_xml('c'::refcursor, 2, true, true, '');
                        cursor_to_xml
-------------------------------------------------------------
 &lt;row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;+
   &lt;id&gt;1&lt;/id&gt;                                               +
   &lt;v&gt;c4ca4238a0b923820dcc509a6f75849b&lt;/v&gt;                  +
 &lt;/row&gt;                                                     +
                                                            +
 &lt;row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;+
   &lt;id&gt;2&lt;/id&gt;                                               +
   &lt;v&gt;c81e728d9d4c2f636f067f89cc14862c&lt;/v&gt;                  +
 &lt;/row&gt;                                                     +
                                                            +
</pre>
<li>float8_timestamptz() および make_interval() 関数における端数丸めの問題が修正されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
これら関数は、浮動小数点の値から整数のマイクロ秒に変換するときに、丸めでなく、切り捨てを行っていました。これにより予期せぬ境界条件エラーをひき起こすおそれがありました。
</p>
<p>
切捨てでなく C 言語関数 rint (最も近い整数値への丸め) を使うように実装が修正されました。
</p>
<li>pg_get_object_address() 関数が正しく演算子族のメンバーを処理するように修正されました。  (&Aacute;lvaro Herrera) (9.6)(9.5)</li>
<li>非排他バックアップを停止しようとしたときの pg_stop_backup() 関数のキャンセルについて修正されました。  (Michael Paquier, David Steele) (9.6)</li>
<p>
非排他バックアップが終了するのを待つ間に pg_stop_backup() 関数がキャンセルされた場合、関連する状態が不整合状態になり、新たな非排他バックアップを開始できない可能性がありました。また、その他の細かな問題もありました。
</p>
<li>pg_timezone_names ビューの性能が改善されました。  (Tom Lane, David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>メモリコンテキストに多数の大きいブロックが含まれる場合に、メモリ管理のオーバーヘッドが軽減されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<li>lseek() と close() の稀な場合に生じるエラーに対する処理がより厳格に修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
どちらも通常ではあまり失敗しないシステムコールですが、失敗した場合にはかなり混乱するおそれがありました。
</p>
<li>マスタプロセス (postmaster) が Windows サービスとして実行されているかの検査が誤っており、修正されました。  (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
本障害はアクセス不能であるときにイベントログに書き出しを試みて、全くログが書かれない結果をひき起こしました。
</p>
<li>ecpg が COMMIT PREPARED と ROLLBACK PREPARED に対応するように修正されました。  (Masahiko Sawada) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>ecpg で $ でクォートされた文字列リテラルを処理する際の二重解放エラーが修正されました。  (Michael Meskes) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
起こりうるのは ecpg コマンドのクラッシュです。
</p>
<li>pgbench が --connect オプションと --rate オプションの組み合わせを正しく処理するように修正されました。  (Fabien Coelho) (9.6)</li>
<li>pgbench がドキュメント記載されている --builtin という長い形式のオプションを無視しないように修正されました。  (Tom Lane) (9.6)</li>
<li>pg_dump/pg_restore が --clean オプションを使ったときに public スキーマの権限を正しく処理するように修正されました。  (Stephen Frost) (9.6)</li>
<p>
他のスキーマは権限が与えられない状態から始まりますが、public スキーマはそうではありません。--clean オプションのために削除とリストアを行うときには特別な対応が必要でした。
</p>
<li>pg_dump でコメントとセキュリティラベルに対する誤ったラベル付けが修正されました。  (Giuseppe Broccolo, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
単純な使い方の場合には悪影響はありませんが、スキーマを指定したリストアで含まれるべきコメントが無視される可能性がありました。これはダンプ時にそれらが関連するオブジェクトのスキーマに属するという印付けがされなかったためです。
</p>
<li>pg_dump の手続き言語の初期権限のための問い合わせのタイプミスが修正されました。  (Peter Eisentraut) (9.6)</li>
<p>
本障害により pg_dump は常に手続き言語は初期権限を持たないとみなしていました。ほとんどの手続き言語は実際のところそうであるため、本障害による悪影響はおそらく稀です。
</p>
<li>pg_restore -l で SQL オブジェクト名に改行が含まれるときに、無効なリストファイルが出力されるのを回避するように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>pg_upgrade がラージオブジェクトに付けられたコメントとセキュリティラベルを移行するように修正されました。  (Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでもラージオブジェクトは新データベースに正しく移行されていましたが、付加されたコメントとセキュリティラベルが失われていました。
</p>
<li>contrib/adminpack の pg_file_write() 関数のエラー処理が改善されました。  (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
特に fclose() で報告されたエラーを検知できていませんでした。
</p>
<li>contrib/dblink で、新たな無名接続を確立するときの前の無名接続のリークが回避されました。  (Joe Conway) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>contrib/pg_trgm の正規表現からのトリグラム展開が修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)</li>
<p>
一部のケースで何にもマッチできない壊れたデータ構造が生み出され、トリグラムインデックスを使う GIN または GiST のインデックススキャンが正規表現へのマッチを何も見つけられない結果（誤った応答）になります。
</p>
<pre>
(誤動作例：pg_trgm インデックスを使うと結果が 0 件になってしまう)
db1=# CREATE TABLE ttrig (id int primary key, txt text);
db1=# INSERT INTO ttrig SELECT g, md5(g::text) FROM generate_series(1, 10000) g;
db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}';
 count
-------
    55
(1 row)

db1=# CREATE INDEX trgm_idx ON ttrig USING gist (txt gist_trgm_ops);
db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}';
 count
-------
     0
(1 row)
</pre>
<li>contrib/postgres_fdw で送出可能な拡張モジュールで提供される関数を含む結合条件をリモートサーバ側で実行させる (プッシュする) ことが可能になりました。  (David Rowley, Ashutosh Bapat) (9.6)</li>
<li>(Windows の) MSVC ビルドで Tcl 8.6 がサポートされました。  (&Aacute;lvaro Herrera) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>タイムゾーンライブラリが IANA release tzcode2017b に更新されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
2038 年 1 月の夏時間の遷移に影響を及ぼすバグが修正されています。
</p>
<li>タイムゾーンデータファイルが tzdata release 2017b に更新されました。   (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
チリ、ハイチ、モンゴルの夏時間法の変更、エクアドル、カザフスタン、リベリア、スペインの歴史的修正が含まれます。南米、太平洋、インド洋、および、一部アジア・中東の国々における多数のタイムゾーンが、数字による省略形に切り替えられました。
</p>
<p>
IANA タイムゾーンデータベースはこれまで文字による省略形を全てのタイムゾーンに提供していて、ときに地元住民の間でほとんどあるいは全く使われない省略形を作成していました。IANA は英語の省略形が現実に使われている形跡がないゾーンにおいては UTC オフセット数値を使うことを選ぶという方針に転換しようとしてるところです。少なくともしばらくの間、PostgreSQL はタイムスタンプの入力に、このような削除された省略形を引き続き受け入れます。しかし、それらは pg_timezone_names ビューには現れず、出力にも使用されなくなります。
</p>
<li>(Windows の) MSVC ビルドにおいて、POSIX 形式のタイムゾーン名に対して正しい夏時間規則を使うようになりました。  (David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
Microsoft の MSVC ビルドスクリプトは posixrules ファイルをタイムゾーンディレクトリツリーにインストールするのを怠っていました。この結果、POSIX 形式のタイムゾーン名に対し想定される夏時間の振る舞いについて、タイムゾーンコードがビルトインの規則に戻ってしまっていました。
</p>
<p>
歴史的な理由により、その組み込み規則は、米国が2007年より前に使っていた夏時間規則（すなわち、4月最初の日曜日と 10月最終の日曜日の変更）に引き続き対応しています。この修正にともない、POSIX 形式のゾーン名は US/Eastern ゾーンの現在および歴史的夏時間遷移日を使います。そのようにしたくない場合には、posixrules ファイルを削除するか、他のゾーンファイルのコピーで置き換えてください。変更を反映させるにはサーバ (サービス) の再起動が必要です。
</p>
<li>GROUPING SET 列のデータ型がハッシュ可能だけれどソート不能であるときのクラッシュまたは誤った応答が修正されました。  (Pavan Deolasee) (9.5)</li>
<p>
たとえば xid 型がハッシュ可能でソート不能です。
</p>
<li>contrib/postgres_fdw で、リモートサーバに問い合わせキャンセル要求を送出するようになりました。  (Michael Paquier, Etsuro Fujita) (9.5)(9.4)(9.3)</li>
<p>
これまではローカルでの問い合わせキャンセル要求が、既に送ったリモート問い合わせを早く終わらせることはありませんでした。これは 9.6 で修正された内容のバックポートです。
</p>
<li>OpenSSL 1.1.0 に対応しました。  (Heikki Linnakangas, Andreas Karlsson, Tom Lane) (9.4)(9.3)(9.2)</li>
<p>
9.5 以降のバージョン系列で既に対応している内容のバックポートです。多数のプラットフォームが新たな OpenSSL バージョンを取り込みつつあるので、必要となりました。
</p>
</ol>

<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PostgreSQL 9.6.2 に関する技術情報</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/9-6-2/</link>
		
		<dc:creator><![CDATA[PostgreSQL技術グループ]]></dc:creator>
		<pubDate>Tue, 28 Feb 2017 08:08:40 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 9.6]]></category>
		<category><![CDATA[PostgreSQL 9.6.1]]></category>
		<category><![CDATA[PostgreSQL 9.6.2]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=751</guid>

					<description><![CDATA[このリリースは 9.6.1 からの修正リリースです。 9.6.x からのアップデートではダンプ、リストアは不要です。 ただし、下記の 1 番目を確認してください。追加でインデックス再作成が必要な場合があります。 また、9 ...]]></description>
										<content:encoded><![CDATA[<p>このリリースは 9.6.1 からの修正リリースです。<br />
9.6.x からのアップデートではダンプ、リストアは不要です。<br />
ただし、下記の 1 番目を確認してください。追加でインデックス再作成が必要な場合があります。</p>
<p>また、9.6.1 より前のバージョンからアップデートを行う場合は <a href="/tech-blog/pgsql/9-6-2/">9.6.1 に関する技術情報</a>を参照してください。</p>
<p><span id="more-751"></span></p>
<h3>PostgreSQL 9.6.1 から 9.6.2 への変更点</h3>
<p>9.6.2、9.5.6、9.4.11、9.3.16、9.2.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。</p>
<hr />
<ol class="technology">
<li>CREATE INDEX CONCURRENTLY によるインデックス作成で破損したインデックスをもたらす可能性のある競合状態が修正されました。  (Pavan Deolasee, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
以前にはインデックスされていなかった列にかかっているインデックスを作るのに CREATE INDEX CONCURRENTLY が使われていたなら、同時実行のトランザクションに更新された行は、誤ったインデックスエントリを受け取るおそれがありました。
</p>
<p>
CREATE INDEX CONCURRENTLY を使って作成されたインデックスを、バージョンアップ後に再作成することを推奨します。
</p>
<li>システムテーブルのスキャンに使われる特別なスナップショットが、早すぎるデータ除去処理により無効になることが無いように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
バックエンドが自身の最も古いxminを知らせるときにこのスナップショットを考慮しておらず、潜在的に未だ必要なデータを削除する並列のバキューム操作を許していました。
</p>
<p>
この障害は接続時に「FATAL:  cache lookup failed for relation 1255」を発生させました。
</p>
<li>BRIN インデックスの誤った WAL 出力が修正されました。  (Kuntal Ghosh) (9.6)(9.5)</li>
<p>
インデックスタプルを異なるページに移動するとき、BRIN の範囲マップページ (revmap page) むけに出力された WALレコードが不正でした。その WAL をリプレイすると、インデックスの関連する部分は使い物にならず、再計算を強いられます。
</p>
<li>無条件に UNLOGGED テーブルの初期フォーク生成の WAL 出力をするようになりました。  (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでは wal_level = minimal のときには省略されていましたが、実際にはこの場合でもクラッシュ後リカバリにて確実に正しく UNLOGGED テーブルを空に初期化するために必要でした。
</p>
<li>統計情報収集器 (stats collector process) が、ホットスタンバイ動作中に落ちたときにも再起動されるようになりました。 (Takayuki Tsunakawa) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでは子プロセス自動再起動の仕組みから抜け落ちていて、ホットスタンバイサーバでプロセスが非正常に終了すると終了したままになっていました。
</p>
<li>スタンバイサーバ開始時に有効であったときに hot_standby_feedback 設定による動作が確実に正しく動作するようになりました。  (Ants Aasma, Craig Ringer) (9.6)(9.5)(9.4)(9.3)</li>
<p>
スタンバイサーバで設定を on に変更して reload でなくサーバ再起動した場合に必要な初期化が行われませんでした。
</p>
<li>ホットスタンバイが衝突している問い合わせを待機している間、割り込みのチェックをするようになりました。  (Simon Riggs) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>稀なケースで恒常的に autovacuum launcher プロセスが再生成される動作を回避するようになりました。  (Amit Khandekar) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
autovacuum = off が設定されていて、XID 凍結が必要なテーブルがいくつかあって、それらのテーブルは既に autovacuum worker で処理中であるときに、問題の動作が生じます。
</p>
<li>synchronous_standby_name で同期スタンバイの数に 0 を許さないようになりました。  (Fujii Masao) (9.6)</li>
<p>
同期スタンバイを 0 個にしたい場合には設定値全体に空文字列を与えてください。
</p>
<li>ユーザ毎の接続数上限にバックグラウンドワーカプロセスを数えないようになりました。  (David Rowley) (9.6)</li>
<p>
振る舞いが変更されたのは max_connections 設定による上限ではなく、ALTER ROLE ... CONNECTION LIMIT ... コマンドによる接続数上限です。
</p>
<li>拡張モジュールの要素オブジェクトが削除できる場合のチェックが修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
拡張モジュールのアップグレードスクリプトは要素オブジェクトを削除できなければいけませんが、serial 型に付随するシーケンスについてそれができませんでした。
</p>
<li>ALTER EXTENSION ... ADD/DROP コマンドにて正しく動作するように、拡張モジュールの要素オブジェクトの初期権限の探知が修正されました。  (Stephen Frost) (9.6)</li>
<p>修正により、オブジェクトが拡張モジュールに追加された時点の権限は、そのデフォルト権限と見做され、後の権限変更だけが以降の pg_dump 実行でダンプされるようになります。拡張モジュールに属するオブジェクトへの権限付与が正しくダンプされない問題が報告されていました。
</p>
<li>インデックス再作成を伴う ALTER TABLE コマンドで、インデックスのテーブルスペース割り当てを確実に維持するように修正されました。  (Tom Lane, Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまで、ALTER TABLE ... ALTER TYPE を実行して、インデックス再作成が生じた場合、元のテーブルスペースではなく、その時点の default_tablespace 設定やデータベースのデフォルトに基づいたテーブルスペース上で再作成が行われました。さらに使用するテーブルスペースがシステムテーブルの情報と一致しないため、当該インデックスがアクセス不能になり、SQL 問い合わせに以下エラーが生じることがありました。
</p>
<pre>
ERROR:  could not open file "pg_tblspc/16567/PG_9.6_201701011/16456/16789":
No such file or directory
</pre>
<li>ALTER TABLE ... ALTER CONSTRAINT で外部キー制約が遅延可能かを変更するときのトリガ関数プロパティの誤った更新が修正されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
その後のトリガ駆動時に奇妙な失敗をひき起こすおそれがあります。トリガが働く SQL 実行時に、以下のエラーが出る障害動作が報告されました。
</p>
<pre>
ERROR:  AfterTriggerSaveEvent() called outside of query
</pre>
<li>被参照テーブルに対する保留トリガイベントがあるときに外部キー制約を削除しないように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
保留トリガイベントとはトランザクション末尾で処理をすることになっている延期されたトリガ処理を指します。以下の操作でエラーが出るようになりました。
</p>
<pre>
db1=# BEGIN;
db1=# SET CONSTRAINTS ALL DEFERRED ;
db1=# INSERT INTO t15 VALUES (1); -- DEFERRABLEなトリガを駆動する操作

db1=# ALTER TABLE t15 DROP CONSTRAINT fk_t15_c1_fkey;
ERROR:  cannot ALTER TABLE t15 because it has pending trigger events
</pre>
<p>
以前は制約の削除は成功し、COMMIT 時になって以下エラーが出ていました。
</p>
<pre>
ERROR:  could not find trigger NNN
または
ERROR:  relation NNN has no triggers
</pre>
<li>子テーブルが親テーブルと異なる列順である場合の ALTER TABLE ... SET DATA TYPE ... USING ... コマンドの動作が修正されました。  (&Aacute;lvaro Herrera) (9.6)(9.5)</li>
<p>
エラーが発生することがありました。典型的には以下エラーが生じます。
</p>
<pre>
ERROR:  attribute N has wrong type
</pre>
<li>WITH OIDS 指定のテーブルが、同じくWITH OIDS 指定の親テーブルと ALTER TABLE ... INHERIT コマンドで関連づけられた場合の、OID 列の処理が修正されました。  (Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
この場合 OID 列は通常のユーザ定義列と同様に扱われるべきでしたが、そうなっておらず、後の継承の変更で奇妙な振る舞いをひき起こしました。
</p>
<pre>
(修正前の動作例： 親テーブルから列の除去は可能だが、OID 除去はエラーになっている)
db1=# CREATE TABLE t17c (a int, b int) WITH """""""""""""""""""""""""""""""""""""""""""OIDS;
db1""""""""""""""""""""""""""""""""""""""""""" =# CREATE TABLE t17p (a int, b int) WITH """""""""""""""""""""""""""""""""""""""""""OIDS;
db1""""""""""""""""""""""""""""""""""""""""""" =# ALTER TABLE t17c INHERIT t17p;
db1=# ALTER TABLE t17p DROP a;
db1=# ALTER TABLE t17p SET WITHOUT OIDS;
ERROR:  relation 16678 has non-inherited attribute "oid"
</pre>
<li>CREATE TABLE ... LIKE ... WITH OIDS コマンドが、LIKE で参照されるテーブルに OID がある無しにかかわらず、確実にテーブルを WITH OIDS で作成するように修正されました。  (Tom Lane) (9.6)</li>
<p>
LIKE を伴ったときに作られるテーブルが WITH OIDS にならない場合がありました。
</p>
<li>先にビュー問い合わせを置き換えてから、新しいビューオプションを適用するように、CREATE OR REPLACE VIEW コマンドを修正しました。  (Dean Rasheed) (9.6)(9.5)(9.4)</li>
<p>
これまでは以下のように元のビュー問い合わせには適合しないオプションを与えたときにエラーが生じていました。
</p>
<pre>
db1=# CREATE TABLE t19 (a int, b text);
db1=# CREATE VIEW v19 AS SELECT null::int AS a;
db1=# CREATE OR REPLACE VIEW v19
        AS SELECT * FROM t19 WHERE a &gt; 0 WITH CHECK OPTION;
ERROR:  WITH CHECK OPTION is supported only on automatically updatable views
HINT:  Views that do not select from a single table or view are not
automatically updatable.
</pre>
<li>ALTER TEXT SEARCH CONFIGURATION のとき、正しい OID を報告するようになりました。  (Artur Zakirov) (9.6)(9.5)(9.4)(9.3)</li>
<p>
これまでイベントトリガに誤ったカタログ OID が報告されてました。
</p>
<li>コミットタイムスタンプの仕組みが、特別 XID の FrozenTransactionId (=2) と BootstrapTransactionId (=1) について問われた時に失敗しないように修正されました。 (Craig Ringer) (9.6)(9.5)</li>
<p>
以下の関数呼び出しがエラーを出さず、NULL を返すようになります。
</p>
<pre>
(修正前の動作例)
db1=#  SELECT pg_xact_commit_timestamp('1'::xid);
ERROR:  cannot retrieve commit timestamp for transaction 1
db1=#  SELECT pg_xact_commit_timestamp('2'::xid);
ERROR:  cannot retrieve commit timestamp for transaction 2
</pre>
<li>ビューの reloptions を通常テーブルの reloptions のように誤用していたのが修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
症状としては、以下例のような問い合わせで、実際には問題ないにも拘らず「ERROR:  ON CONFLICT is not supported ...」エラーが出ることです。
</p>
<pre>
(修正前のエラー例)
db1=# CREATE TABLE t22 (f1 int PRIMARY KEY, f2 text);
db1=# CREATE VIEW v22  AS SELECT * FROM t22 WITH CASCADED CHECK OPTION;

db1=# INSERT INTO v22 VALUES (1,'foo')
        ON CONFLICT (f1) DO UPDATE SET f2 = excluded.f2;

ERROR:  ON CONFLICT is not supported on table "v22" used as a catalog table
LINE 1: insert into v22 values (1,'foo') on conflict (f1) do update ...
</pre>
<li>ON CONFLICT 構文を列数が多いテーブルに使った際に発生する障害が修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
実際には列数上限の半分程度であるのにエラーが生じました。
</p>
<pre>
(修正前の障害動作例)
db1=# INSERT INTO t23 VALUES (&lt;&lt;...831個の値...&gt;&gt;)
        ON CONFLICT (id) DO UPDATE SET &lt;&lt;...830個の代入式...&gt;&gt;;
ERROR:  target lists can have at most 1664 entries
</pre>
<li>削除した列を伴うテーブルに対する INSERT または UPDATE で、削除された列への値が供給されたという偽性のエラーが生じることがあり、修正されました。  (Tom Lane) (9.6)</li>
<pre>
(障害動作例)
db1=# CREATE TABLE t24 (c1 int, c2 int);
db1=# ALTER TABLE t24 DROP c2;
db1=# CREATE FUNCTION f24(do_update boolean)
        RETURNS void LANGUAGE sql VOLATILE AS $$
          UPDATE t24 SET c1 = NULL WHERE do_update; $$;
db1=# SELECT f24(false);
ERROR:  table row type and query-specified row type do not match
DETAIL:  Query provides a value for a dropped column at ordinal position 2.
CONTEXT:  SQL function "f24" statement 1
</pre>
<li>UPDATE の SET 句の代入元の式で foo.* の複数カラム展開が防止されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)</li>
<p>
以下のような奇妙なエラーメッセージが生じていました。修正によりレコード型であることを認識するようになりました。
</p>
<pre>
(障害動作例)
db1=# CREATE TABLE t25 (id int primary key, c1 int, c2 int);
db1=# INSERT INTO t25 VALUES (1, 100, 100);
db1=# UPDATE t25 SET c1= t25.*;
ERROR:  UPDATE target count mismatch --- internal error

(正しいエラー)
ERROR:  column "c1" is of type integer but expression is of type record
</pre>
<li>複数行 VALUES 値に対して精密に列データ型修飾が決定されるようになりました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでは、最初のデータでデータ型修飾を決めていて、以下例のような奇妙なデータが作れてしまいました。
</p>
<pre>
db1=# CREATE TABLE t26 AS SELECT * FROM (
        VALUES ('ABCDE'::varchar(5)), ('01234567890')
        ) v (string);
db1=# d t26
            Table "public.t26"
 Column |         Type         | Modifiers
--------+----------------------+-----------
 string | character varying(5) |

db1=# SELECT * FROM t26;
              string
----------------------------------
 ABCDE
 01234567890
(2 rows)
</pre>
<li>文字列末尾で完結していないユニコードのサロゲートペアについてエラーを投げるようになりました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
本来はユニコードのサロゲートペアの先頭文字には末尾文字が続かなければいけませんが、先頭文字がユニコードリテラル（U&'....' や U&"...."）で文字列末尾にあらわれた場合にチェック漏れがあり、データ投入等ができてしまいました。
</p>
<pre>
(修正後に正しくエラーが出る例)
db1=# INSERT INTO t27 VALUES (U&amp;'d80d');
ERROR:  invalid Unicode surrogate pair at or near "'"
LINE 1: INSERT INTO t27 VALUES (U&amp;'d80d');
</pre>
<li>同じ列を対象にした複数の順序集約があって遷移状態が共有できる場合の、DISTINCT と順序集約の実行が修正されました。  (Heikki Linnakangas) (9.6)</li>
<p>
そのような SQL 処理でクラッシュをひき起こすことがありました。
</p>
<li>tsquery のフレーズ検索演算子の実装が修正されました。  (Tom Lane) (9.6)</li>
<p>
フレーズ演算子と組み合わせて &、|、! 演算子が使われている場合に、これまで奇妙な検索結果を返したり、クラッシュをひき起こすことがありました。
</p>
<p>
誤動作例を示します。一つ目は q の後に x z または y z が続くという意味なので、True にならなければいけません。二つ目は x 以外の後に y が続くパターンが含まれるかどうかですから True にならなければいけません。
</p>
<pre>
(修正前の誤った動作例)
db1=# SELECT to_tsvector('simple', 'q y z') @@ 'q &lt;-&gt; (x | y &lt;-&gt; z)';
 ?column?
----------
 f
(1 row)

db1=# SELECT to_tsvector('simple', 'x y q y') @@ '!x &lt;-&gt; y';
 ?column?
----------
 f
(1 row)
</pre>
<li>空文字列に対して否定テキスト検索がマッチするようになりました。  (Tom Dunstan) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまで GIN インデックス検索ではマッチしましたが、シーケンシャルスキャンや GiST インデックス検索の際にはマッチしませんでした。
</p>
<pre>
(修正前の例: 以下は t が返るようになります)
db1=# SELECT to_tsvector('simple', '') @@ '!foo';
 ?column?
----------
 f
(1 row)
</pre>
<li>ts_rewrite() が非トップレベルのサブツリーを空クエリで置き換えた際のクラッシュが防止されました。  (Artur Zakirov) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<pre>
(クラッシュが起きる例)
db1=# SELECT ts_rewrite(to_tsquery('5 &amp; (6 | 5)'),
                        to_tsquery('5'), to_tsquery(''));
NOTICE:  text-search query doesn't contain lexemes: ""
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
</pre>
<li>ts_rewrite() の性能問題を修正しました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
引数に与える内容の規模が大きいと非常に遅くなるのが改善されました。また、処理中に中断できる箇所を増やしました。
</p>
<li>ts_rewrite() の入れ子になった NOT 演算子の扱いが修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
間違った結果を返すことがありました。
</p>
<pre>
(修正前の誤った結果)
db1=# SELECT ts_rewrite(
        ts_rewrite('new &amp; !york ', 'york', '!jersey'), 'jersey', 'mexico');
    ts_rewrite
-------------------
 'new' &amp; !'mexico'
(1 row)

(正しい結果)
     ts_rewrite
--------------------
 'new' &amp; !!'mexico'
(1 row)
</pre>
<li>遷移関数に array_append() を使うユーザ定義集約の速度が改善されました。  (Tom Lane) (9.6)(9.5)</li>
<li>array_fill() が空配列を適切に扱えるように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
以下のように array_fill() で長さゼロの空配列を作った結果、0 次元になっておらず '{}' と一致しない動作がありました。
</p>
<pre>
(修正前の誤った動作例)
db1=# SELECT a, a = '{}' AS is_eq, array_dims(a)
        FROM (SELECT array_fill(NULL::int, array[0]) as a) ss;
 a  | is_eq | array_dims
----+-------+------------
 {} | f     | [1:0]
(1 row)
</pre>
<li>レコードの配列を処理するときに、array_position() および array_positions() でクラッシュの可能性があり、修正されました。  (Junseok Yang) (9.6)(9.5)</li>
<pre>
(クラッシュをひき起こす例)
db1=# SELECT array_position(ids, (1, 1)),
             array_positions(ids, (1, 1))
        FROM (VALUES (ARRAY[(0, 0), (1, 1)]),
                     (ARRAY[(1, 1)])        ) AS f (ids);
</pre>
<li>内部実装関数 quote_literal_cstr() における 1 バイトのバッファオーバーランが修正されました。  (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
quote_literal_cstr() は format() 関数などで使われています。入力がシングルクオートとバックスラッシュだけから構成されている場合にのみ発生します。
</p>
<p>
以下のような不明な警告が出ることがありました。
</p>
<pre>
db1=# SELECT format('%L', E'&yen;&yen;');
WARNING:  detected write past chunk end in ExprContext 0x55c65ff98fa8
 format
--------
 E'&yen;&yen;'
(1 row)
</pre>
<li>pg_start_backup() と pg_stop_backup() が複数並行で実行されるのが防止されました。  (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
本修正は、これらの関数の並列実行が試みられた際に、アサートエラーや不正な動作が生じるのを回避します。
</p>
<li>何もしない AT TIME ZONE による変換を取り除こうとする書換えを使用しないようになりました。  (Tom Lane) (9.6)(9.5)</li>
<p>
何もしない AT TIME ZONE による変換とは、元々 UTC での値が格納された timestamp with time zone 型のデータに AT TIME ZONE 'utc' として、timestamp without time zone 型のデータに変換する、などを指します。問い合わせで不適切なインデックス利用が生じて誤った結果が返る可能性がありました。
</p>
<li>実際に何もしないわけではない interval 型から interval 型へのキャストを無効にしないようになりました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
一部ケースで、低位フィールドをゼロにすべきキャストについて誤って何もしなくてよいと見なされました。
</p>
<pre>
(9.4.10 で報告された誤動作例 - 秒以下が切り捨てられるのが正しい)
db1=# SELECT x.y :: interval day to minute,
             (interval '02:47:15.375721') :: interval day to minute
             FROM (VALUES (interval '02:47:15.375721')) x (y);
        y        | interval
-----------------+----------
 02:47:15.375721 | 02:47:00
</pre>
<li>パラレルクエリに利用できるワーカ数が再スキャン中に減った場合のクラッシュが修正されました。  (Andreas Seltenreich) (9.6)</li>
<li>パラレルワーカに GUC パラメータを送るときの障害が修正されました。  (Michael Paquier, Tom Lane) (9.6)(9.5)</li>
<p>
set_config() 関数をパラレル実行させた際にクラッシュする事例が報告されました。
</p>
<li>PREPARE コマンドで作られたプリペアドステートメントでもパラレルプランを得られるようになりました。  (Amit Kapila, Tobias Bussmann) (9.6)</li>
<p>
これまでは PostgreSQL プロトコルの Parse メッセージで作られたプリペアドステートメントだけ対応していました。
</p>
<li>semi-join むけの誤ったパラレルプラン生成が修正されました。  (Tom Lane) (9.6)</li>
<p>
... WHERE EXISTS (...) 等を使った semi-join をともなう SQL において、パラレルプランで実行した場合に誤った結果が返ることがありました。
</p>
<li>プランナのパラレル結合むけの値の種類数の見積が修正されました。  (Robert Haas) (9.6)</li>
<p>
これらの見積が確実に（全体の値ではなく）各ワーカごとの予測行数を反映するようにされました。
</p>
<li>プランナが初期プランやサブプランを含むプランノードをパラレル化しようとしないように修正されました。  (Tom Lane, Amit Kapila) (9.6)</li>
<p>
比較的複雑なサブクエリを伴う SQL で、パラレル実行させた場合にアサートエラーが生じる例が報告されていました。
</p>
<li>外部テーブルオプションの変更により、キャッシュされたプランが確実に無効化されるようになりました。  (Amit Langote, Etsuro Fujita, Ashutosh Bapat) (9.6)(9.5)(9.4)(9.3)</li>
<p>
「ALTER FOREIGN TABLE ... OPTIONS (...)」で外部テーブルが参照するリモートのスキーマ、テーブルを変えた場合にもプランが更新されませんでした。
</p>
<pre>
(障害動作例)
db1=# CREATE FOREIGN TABLE ft (c1 integer, c2 varchar) SERVER link_server
        OPTIONS (schema_name 's1', table_name 't1');
db1=# PREPARE stmt_ft AS SELECT c1,c2 FROM ft;
db1=# EXECUTE stmt_ft;
 c1 |  c2
----+-------
  1 | s1.lt
(1 row)

db1=# ALTER FOREIGN TABLE ft OPTIONS
        (SET schema_name 's2', SET table_name 'lt');
db1=# ANALYZE;
db1=# EXPLAIN (COSTS OFF, VERBOSE) EXECUTE stmt_ft;
               QUERY PLAN
----------------------------------------
 Foreign Scan on public.ft
   Output: c1, c2
   Remote SQL: SELECT c1, c2 FROM s1.lt
(3 rows)
</pre>
<li>定数の GROUP BY句 を伴うソートされた部分集約むけに生成されたプランが修正されました。  (Tom Lane) (9.6)</li>
<p>
そのような SQL 実行に対して奇妙なプランナエラー「ERROR: invalid attnum: 0」が出る例が報告されました。
</p>
<li>CTE 参照を含む UNION ALL を処理する際に「ERROR:  could not find plan for CTE "..."」エラーが出るのが修正されました。  (Tom Lane) (9.6)</li>
<pre>
(障害動作例: 1 と 2 の最大値なので 2 が返るのが正しい)
db1=# WITH i(x) AS (VALUES (1::int)), j(y) AS (VALUES (2::int))
       SELECT max(x) FROM (SELECT x FROM i UNION ALL SELECT y FROM j) b;
ERROR:  could not find plan for CTE "i"
</pre>
<li>Material ノードを強制的にサブプランに加えるときの initplan の誤操作が修正されました。  (Tom Lane) (9.6)</li>
<p>
以下の形状の SQL で障害が報告されました。
</p>
<pre>
SELECT 1 IN (SELECT (SELECT 1));
SELECT 1 = ANY (SELECT (SELECT 1));
SELECT 1 = ALL (SELECT (SELECT 1));
</pre>
<p>
本障害により典型的にはエラー「ERROR:  plan should not reference subplan's variable」が生じます。
</p>
<li>semi-join、anti-join に対する外部キーに基づく結合の選択率見積が修正されました。同様に継承の場合も修正されました。  (Tom Lane) (9.6)</li>
<p>
外部キーを考慮にいれた新たなコードは、これらの場合には見積の劣化を引き起こしていました。
</p>
<li>拡張モジュールの設定テーブルであると印付けされたシーケンスのデータを出力するように pg_dump が修正されました。  (Michael Paquier) (9.6)</li>
<p>
シーケンスについて、pg_extension_config_dump() 関数で印をつけてもダンプで出力されない動作になっていました。
</p>
<li>pg_dump における ALTER DEFAULT PRIVILEGES ... REVOKE の誤操作が修正されました。  (Stephen Frost) (9.6)</li>
<p>
ALTER DEFAULT PRIVILEGES が通常の状態よりも権限を減らすのに使われている場合に pg_dump が必要な REVOKE コマンドを出力しませんでした。
</p>
<pre>
(通常より権限を減らす使い方の例 - これらが正しくダンプされません)
ALTER DEFAULT PRIVILEGES
  FOR ROLE myrole
  REVOKE SELECT ON TABLES FROM myrole;

ALTER DEFAULT PRIVILEGES
  FOR ROLE myrole
  REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
</pre>
<li>pg_dump が組み込み関数を使ったユーザ定義キャストとユーザ定義変換 (TRANSFORM) をダンプするように修正されました。  (Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>「--create --if-exists」オプションを伴う pg_restoreが、アーカイブに認識できない DROP コマンドが含まれている場合に、よりよく動作するように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)</li>
<p>
これは現時点の具体的な障害を修正するわけではありませんが、将来より後のバージョンの pg_dump で生成されたアーカイブを扱う際の振る舞いを改善すると考えられます。
</p>
<li>遅いストレージ I/O であるときの pg_basebackup の転送レート制限が修正されました。  (Antonin Houska) (9.6)(9.5)(9.4)</li>
<p>
ストレージ I/O が一時的に指定の転送レート制限よりも著しく遅かった場合、計算がオーバーフローして、残りの実行において転送レート制限が事実上使えませんでした。
</p>
<li>pg_basebackup でのシンボリックリンクされた pg_stat_tmp と pg_replslot サブディレクトリの扱いが修正されました。  (Magnus Hagander, Michael Paquier) (9.6)(9.5)(9.4)</li>
<p>
これらがシンボリックリンクであるとき誤った tar ヘッダが作られていました。
</p>
<li>スタンバイサーバでの WAL ファイルを含めた pg_basebackup で失敗の可能性があり、修正されました。  (Amit Kapila, Robert Haas) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
本来必要な分よりも手前の WALを要求し、それが得られないため失敗する可能性がありました。
</p>
<li>initdb が *_flush_after 設定について、正しいプラットフォーム固有のデフォルト値を postgresql.conf に書き入れるように改善されました。  (Fabien Coelho, Tom Lane) (9.6)</li>
<pre>
#bgwriter_flush_after = 0       # 0 disables,
                                # default is 512kB on linux, 0 otherwise

#checkpoint_flush_after = 0     # 0 disables,
                                # default is 256kB on linux, 0 otherwise
</pre>
<li>拡張された配列がドメインのチェック制約や CASE 実行で誤動作する可能性があり、修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
PL/pgSQL 関数がこのような文脈で続く操作で保持される必要のある配列値を変更あるいは削除して誤動作する可能性がありました。
</p>
<pre>
(報告された障害発生例: 奇妙なエラーが生じています)
db1=# CREATE FUNCTION x_domain_test_check(integer[]) RETURNS boolean AS
      $$ BEGIN RETURN true; END; $$ LANGUAGE plpgsql IMMUTABLE;
db1=# CREATE DOMAIN x_domain_test AS integer[]
        CHECK(x_domain_test_check(VALUE));
db1=# DO $$
        declare v_test x_domain_test;
        begin v_test := '{}'::x_domain_test; v_test := v_test || 1; end;
      $$ LANGUAGE plpgsql;
ERROR:  SPI_connect failed: SPI_ERROR_CONNECT
CONTEXT:  PL/pgSQL function inline_code_block line 5 at assignment
</pre>
<pre>
(CASEの誤動作例:
  以下を繰り返し実行すると CASE で 'right' 以外が返ることがありました)
BEGIN;
CREATE DOMAIN arrdomain AS int[];
CREATE FUNCTION make_ad(int,int) RETURNS arrdomain AS
  $$ declare x arrdomain;
     begin x := array[$1,$2]; return x; end $$ LANGUAGE PLPGSQL VOLATILE;
CREATE FUNCTION ad_eq(arrdomain, arrdomain) RETURNS boolean AS
  $$ begin return array_eq($1, $2); end $$ LANGUAGE plpgsql;
CREATE OPERATOR = (procedure = ad_eq,
                   leftarg = arrdomain, rightarg = arrdomain);
SELECT CASE make_ad(1,2)
  WHEN array[2,4]::arrdomain THEN 'wrong'
  WHEN array[2,5]::arrdomain THEN 'still wrong'
  WHEN array[1,2]::arrdomain THEN 'right'
  END;
ROLLBACK;
</pre>
<li>変数割り当て中にドメインのチェック制約が評価されるコンテクストで入れ子に使われる PL/pgSQL 関数について修正されました。  (Tom Lane) (9.6)(9.5)</li>
<p>
PL/pgSQL の実行で「ERROR:  SPI_connect failed: SPI_ERROR_CONNECT」が生じることがありました。
</p>
<li>PL/Python むけに作成した Python の例外オブジェクトが、適切に参照カウントされるようになりました。  (Rafa de la Torre, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これにより Python のガベージコレクションの後にオブジェクトが使われてクラッシュが生じるのを防ぎます。
</p>
<li>PL/Tcl がカラム名に「.tupno」を含むテーブル上のトリガーをサポートするように修正されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
「.tupno」カラムは PL/Tcl で問い合わせ結果の現在行番号が格納される列として使われていて、その動作と調和させました。テーブルのカラム名に無い場合には「.tupno」は引き続き結果行番号格納用に使われます。
</p>
<li>~/.pgpass ファイルで Unix 上であっても DOS 形式の改行文字 (CR-LF) が使えるようになりました  (Vik Fearing) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
この変更は同じパスワードファイルを Unix と Windows で使うのを容易にします。
</p>
<li>ecpg で「.」で終わるファイル名が与えられた場合の 1 バイトのバッファオーバーランが修正されました。  (Takayuki Tsunakawa) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>psql の crosstabview で重複するデータに対する不正確なエラー報告が修正されました。  (Tom Lane) (9.6)</li>
<p>
「crosstabview: query result contains multiple data values for row "1", column "9"」といったエラーが出る際に、実際に重複しているのとは異なる行・列が示されることがありました。
</p>
<li>ALTER DEFAULT PRIVILEGES に対する psql の TAB 補完が修正されました。  (Gilles Darold, Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>ALTER TABLE ... ALTER .. DROP ... に対する psql の TAB 補完が修正されました。  (Kyotaro Horiguchi) (9.6)</li>
<li>psql が空か全て空白文字の PAGER 環境変数設定をページャ無しとして扱うようになりました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまではこのような環境変数設定を与えてページャが起動されるケースになると何も出力されませんでした。
</p>
<li>contrib/dblink の低レベル libpq エラーの報告が改善されました。  (Joe Conway) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
これまでは、例えば out-of-memoryエラーが "unknown error" となっていました。
</p>
<li>contrib/dblink が contrib/postgres_fdw の外部サーバを接続オプションのソースとして使っているとき、無関係なサーバオプションを無視するようになりました。  (Corey Huinker) (9.6)(9.5)(9.4)(9.3)</li>
<p>
これまでは外部サーバオブジェクトがオプションを持っていて、それが「updatable 'true'」など libpq 接続オプション以外であるとき、以下のようなエラーが生じていました。
</p>
<pre>
db1=# SELECT * FROM dblink('fdw_server', 'SELECT 1') as t(x integer);
ERROR:  could not establish connection
DETAIL:  invalid connection option "updatable"
</pre>
<li>contrib/pageinspect の GIN インデックスむけ関数の移植性の問題が修正されました。  (Peter Eisentraut, Tom Lane) (9.6)(9.5)</li>
<p>
ia64 や sparc64 などでクラッシュが生じる可能性がありました。
</p>
<li>Windows で待機中にソケット読み取りイベントを見逃す可能性があり、修正されました。  (Amit Kapila) (9.6)</li>
<p>
ほとんどの場合にこれは無害ですが、pldebugger 拡張モジュールを使った際にハングアップをひき起こすことが知られています。
</p>
<li>Windows で環境変数の変更がデバッグオプションを有効にしてビルドされたシステム DLL に確実に伝搬するようになりました。  (Christian Ullrich) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<li>タイムゾーンライブラリが IANA release tzcode2016j に同期されました。  (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
多数の問題が修正されています。最も重要なものとしては、対象ディレクトリがハードリンクをサポートしない場合はタイムゾーンデータ導入に失敗する問題がありました。
</p>
<li>タイムゾーンデータを tzdata release 2016j に更新しました。   (9.6)(9.5)(9.4)(9.3)(9.2)</li>
<p>
北キプロス（新タイムゾーン Asia/Famagusta 追加）、ロシア（新タイムゾーン Europe/Saratov 追加）、トンガ、Antarctica/Casey における夏時間法の変更と、イタリア、カザフスタン、マルタ、パレスチナにおける歴史的修正、トンガにおける数値によるゾーン略記法を優先する変更が含まれます。
</p>
<li>Btree インデックスの VACUUM 処理中におけるスタンバイサーバ上の相互ロックが減りました。  (Simon Riggs) (9.5)(9.4)</li>
<p>
本変更は、このような操作のリプレイ時にしばしば発生する顕著なレプリケーション遅延を回避します。
</p>
<li>制約違反エラーを報告する前に直列化可能性の競合を検査するようになりました。  (Thomas Munro) (9.5)(9.4)(9.3)(9.2)</li>
<p>
シリアライザブルトランザクション隔離を使うとき、同時実行トランザクションによる全てのエラーは直列化失敗と表明されることが望まれます。これによりアプリケーションにリトライして成功するかもしれないと示すことができます。
</p>
<p>
しかしながら、並列の行挿入によるキー重複違反のエラーが出てしまうケースがあるため、上記は確実には実現できていませんでした。
</p>
<p>
本変更は、アプリケーションがトランザクション内より手前で明示的に衝突するキーの存在（およびそれが見つからないことを）検査しているのであれば、そのようなエラーを確実に直列化失敗のエラーとして報告されるようにします。
</p>
<p>
以下のように実行したときに「ERROR:  duplicate key value violates ...」ではなく、確実に「ERROR:  could not serialize access ...」がでるようにしたということです。
</p>
<pre>
[[トランザクション1]]        [[トランザクション2]]

db1=# START TRANSACTION ISOLATION
      LEVEL SERIALIZABLE;
                             db1=# START TRANSACTION ISOLATION
                                   LEVEL SERIALIZABLE;

db1=# SELECT * FROM t1 WHERE id = 1;
 id | v
----+---
(0 rows)
                             db1=# SELECT * FROM t1 WHERE id = 1;
                              id | v
                             ----+---
                             (0 rows)

db1=# INSERT INTO t1 (id) VALUES (1);

                             db1=# INSERT INTO t1 (id) VALUES (1);
                             (ブロックされる)
db1=# COMMIT;
                             ERROR:  could not serialize access due to
                                     read/write dependencies among transactions
                             (一意制約違反でなく、直列化失敗エラーになる)
</pre>
<li>WAL セグメントを再読み込みする際の WAL ページヘッダ検証が修正されました。  (Takayuki Tsunakawa, Amit Kapila) (9.2)</li>
<p>
稀な場合に、偽の（すなわち実際にはデータは壊れていない状況で）「out-of-sequence TLI」エラーがリカバリ中に報告される可能性がありました。
</p>
</ol>

<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PostgreSQL 9.6 に関する技術情報</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/9-6-0/</link>
		
		<dc:creator><![CDATA[PostgreSQL技術グループ]]></dc:creator>
		<pubDate>Thu, 29 Sep 2016 01:00:25 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 9.6]]></category>
		<category><![CDATA[PostgreSQL 9.6.1]]></category>
		<category><![CDATA[PostgreSQL 9.6.2]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=1828</guid>

					<description><![CDATA[このページでは PostgreSQL 9.6 （2016年9月29日リリース）に関する技術情報をお届けします。 本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。]]></description>
										<content:encoded><![CDATA[<p>このページでは PostgreSQL 9.6 （2016年9月29日リリース）に関する技術情報をお届けします。</p>
<p>本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。</p>
<p><span id="more-1828"></span><br />
<h3 class="background">バージョン9.6の主な拡張点</h3>
<p>
バージョン9.6での主な拡張箇所は以下の通りです。
</p>
<ul>
<li>シーケンシャルスキャン、結合、集約のパラレル実行に対応しました。 </li>
<li>自動VACUUMは古いデータを繰り返しスキャンしなくなります。 </li>
<li>同期レプリケーションで複数スタンバイサーバが可能になりました。 </li>
<li>全文検索でフレーズ（隣接した複数語）の検索に対応しました。 </li>
<li>postgres_fdw がリモートでの結合、ソート、UPDATE、DELETE に対応しました。 </li>
<li>特に複数CPUソケットサーバでのスケーラビリティにおいて性能改善しました。 </li>
</ul>
<h3 class="background">バージョン9.6への移行/互換性のない変更点</h3>
<ul>
<li>pg_stat_activityビューのプロセスロック待ちの列が拡張されました。  (Amit Kapila, Ildus Kurbangaliev) (9.6)</li>
<p>
重量ロック(SQLレベルでのロック)を待機しているかを示すboolean型の waiting列が無くなり、それに代わってロックの種類を示す wait_event_type列と wait_event列が追加されました。待機していなければ、新たな2つの列は共にNULLになります。
</p>
<p>
これからは重量ロック（wait_event_type が'Lock'になります）のみならず、軽量ロック（同じく'LWLockNamed'または'LWLockTranche'）やバッファピン（'BufferPin'）の待機も表示されるようになります。
</p>
<p>
pg_stat_activityビューの waiting列を参照していたプログラムは修正が必要です。
</p>
<li>to_char() 関数で日付時間のテンプレートパターンについて、マイナス記号をフィールド幅の一部として数えなくなりました。  (Bruce Momjian) (9.6)</li>
<p>
期待される出力結果が変わることになります。以下例は、従来は「-04」でなく「-4」が返りました。
</p>
<pre>
db1=# SELECT to_char('-4 years'::interval, 'YY');
 to_char
---------
 -04
(1 row)
</pre>
<li>無限値の入力に対して EXTRACT の振る舞いがより合理的になりました。  (Vitaly Burovoy) (9.6)</li>
<p>
単調増加する要素(YEAR、EPOCH)については infinity、-infinity が返り、それ以外の要素(DAY、HOUR、等)については NULL が返るようになりました。これまでは入力のタイムスタンプが 'infinity' または '-infinity' であるなら、フィールド指定が何であるかにかかわらず 0 が返っていました。
</p>
<pre>
(9.6 での動作例)

db1=# SELECT EXTRACT(MONTH FROM 'infinity'::timestamp);
 date_part
-----------
    *NULL*
(1 row)

db1=# SELECT EXTRACT(YEAR FROM '-infinity'::timestamp);
 date_part
-----------
 -Infinity
(1 row)
</pre>
<li>RAISEコマンドにより出力されたメッセージの内部行CONTEXT を隠す仕様がPL/pgSQL から廃止されました。  (Pavel Stehule) (9.6)</li>
<p>
以下のように実行したとき、これまでは「CONTEXT:」の行が出力されませんでした。
</p>
<pre>
db1=# CREATE OR REPLACE FUNCTION f_raisetest() RETURNS void LANGUAGE plpgsql
      AS $$ BEGIN RAISE EXCEPTION 'test' ; RETURN; END; $$;
CREATE FUNCTION

db1=# SELECT f_raisetest();
ERROR:  test
CONTEXT:  PL/pgSQL function f_raisetest() line 1 at RAISE
</pre>
<li>デフォルトの全文検索パーサで、Eメールやホスト名などにあらわれる数字から始まるトークンを許すようになりました。  (Artur Zakirov) (9.6)</li>
<p>
to_tsvector() や to_tsquery() の動作が変わり、僅かながら検索結果が変わります。メールアドレスを切り出すには新たな動作の方が適しています。
</p>
<pre>
(9.5以前の動作例)
db1=# SELECT to_tsvector('simple', 'foo@123_mail.sraoss.co.jp');
              to_tsvector
---------------------------------------
 '123':2 'foo':1 'mail.sraoss.co.jp':3
(1 row)

(9.6の動作例)
db1=# SELECT to_tsvector('simple', 'foo@123_mail.sraoss.co.jp');
          to_tsvector
-------------------------------
 'foo@123_mail.sraoss.co.jp':1
(1 row)
</pre>
<li>contrib/unaccent の標準で用意されている unaccent.rules ファイルが、Unicode の知られている全ての発音区別符号を扱えるように拡張されました。また、合字を正しく展開するようになりました。  (Thomas Munro, L&eacute;onard Benedetti) (9.6)</li>
<p>
従来のバージョンはいくつかの一般的でない発音区別符号付き文字に対応していませんでした。 また、これからは合字がばらばらの文字に展開されます。
</p>
<p>
このルールファイルを使う（アップグレードした）インストール先では、tsvector列とインデックスの再構築が必要です。
</p>
<li>CREATE ROLE とその同族コマンド群から、永らく非推奨とされてきた CREATEUSER/NOCREATEUSERオプションが廃止されました。  (Tom Lane) (9.6)</li>
<p>
CREATEUSER は古い後方互換性のためにあり、実際には SUPERUSER を意味しました。これは CREATEROLE と同じ意味かと間違えやすく、常に混乱のもととなってきました。
</p>
<li>pg_ で始まるロール名は予約済みとして扱われるようになりました。  (Stephen Frost) (9.6)</li>
<p>
今後は pg_ で始まるロール名は作成できません。
</p>
<pre>
(9.6 でエラーになる例)
$ initdb -U pg_admin /data/pgdata
initdb: superuser name "pg_admin" is disallowed; role names cannot begin with "pg_"

$ psql -q db1
db1=# CREATE ROLE pg_nobody;
ERROR:  role name "pg_nobody" is reserved
DETAIL:  Role names starting with "pg_" are reserved.
</pre>
<li>information_schema.routinesビューの列名result_cast_character_set_name がresult_cast_char_set_name に変更されました。  (Cl&eacute;ment Pr&eacute;vost) (9.6)</li>
<p>
SQL:2011 標準では長い方の名前(..._character_...)を指定していますが、まわりの列名は他のinformation_schemaビューと同様に短い形式(..._char_...)を使っているので、これは誤りのように見えます。
</p>
<li>psql の -c オプションは --no-psqlrc の意味を含まなくなりました。  (Pavel Stehule, Catalin Iacob) (9.6)</li>
<p>
旧来の振る舞いにするには明示的に --no-psqlrc (-X) を指定します。この方法で修正したスクリプトは旧バージョンの psql でも動作します。
</p>
<li>pg_restore の -t (--table) オプションが全てのタイプのリレーションに対応するように改良されました。  (Craig Ringer) (9.6)</li>
<p>
通常のテーブルだけでなく、ビュー、外部テーブル、マテリアライズドビュー、シーケンスを指定できるようになりました。
</p>
<li>pg_controldata や関連する箇所で NextXID の表示形式が変更されました。  (Joe Conway, Bruce Momjian) (9.6)</li>
<p>
XIDエポック(XIDの周回毎に1増える)とXID値のペアを : で区切る形式になりました。以前の形式は LSN の表示形式と似ていて紛らわしいものでした。
</p>
<pre>
(以前の表示形式) 
$ pg_controldata | grep NextXID
Latest checkpoint's NextXID:          0/31699

(9.6 の表示形式)
$ pg_controldata | grep NextXID
Latest checkpoint's NextXID:          0:31699
</pre>
<li>必要に応じて拡張モジュールの関数が parallel-safe マークが付与されるように改修されました。  (Andreas Karlsson) (9.6)</li>
<p>
標準拡張モジュールの多くが並列実行できるように更新されました。この変更は旧バージョンからの pg_upgrade では適用されません。バージョンアップ後に ALTER EXTENSION UPDATE を各拡張モジュールについてデータベース毎に実行する必要があります。
</p>
</ul>
<h3 class="background">バージョン 9.6 の変更点</h3>
<h4 class="marked">サーバの変更</h4>
<h5 class="marked">パラレルクエリ</h5>
<ul>
<li>パラレルクエリ  (Robert Haas, Amit Kapila, David Rowley, many others) (9.6)</li>
<p>
PostgreSQL 9.6 では、大きなクエリをパラレル実行するための初期サポートが導入されました。シーケンシャルスキャンを使ってテーブル参照する、厳密に読み込みだけのクエリは並列化することが可能になります。ハッシュ結合とネストループは並列に実行することができます。集約関数も可能です(サポートされた集約なら)。やるべき事は多数残っていますが、これはすでに便利な機能セットです。
</p>
<p>
パラレルクエリ実行は(まだ)デフォルトで有効にされていません。有効にするには新しい設定パラメータ(max_parallel_workers_per_gather)を0より大きな値にします。追加の並列処理の実行制御は、新しい設定パラメータforce_paralle_mode, parallel_setup_cost, parallel_tuple_cost,min_parallel_relation_size を通じて行なえます。
</p>
<li>関数がパラレル処理で安全かを示す機構が提供されます。  (Robert Haas, Amit Kapila) (9.6)</li>
<p>
プランナが、クエリをパラレル実行しても安全か判断するのに使われます。
</p>
</ul>
<h5 class="marked">インデックス</h5>
<ul>
<li>GIN インデックス作成が、1GB 以上の maintenance_work_mem 設定を有効に使えるようになりました。  (Robert Abraham, Teodor Sigaev) (9.6)</li>
<p>
これまでは内部処理の都合で 1GB で制限されていました。
</p>
<li>GIN インデックスの保留リストから削除されたページは、すぐにフリースペースマップに追加されるようになりました。  (Jeff Janes, Teodor Sigaev) (9.6)</li>
<p>テーブルが頻繁に VACUUM されない場合の膨張を軽減します。これまでは VACUUM が実行されるまで FSM に移動しませんでした。これは挿入のみで VACUUM されないテーブルで問題になることがありました。
</p>
<li>gin_clean_pending_list 関数が追加され、GIN インデックスの保留リストの掃除を手動で起動できるようになりました。  (Jeff Janes) (9.6)</li>
<p>
以前は、この様な掃除は親テーブルの vacuum や analyze の副作用でしか実行されていませんでした。
</p>
<li>GiSTインデックスでのデッドインデックスの扱いが改善されました。  (Anastasia Lubennikova) (9.6)</li>
<p>
インデックススキャンで、対応するヒープタプルが死んでいる事に気付くと、デッドインデックスタプルとしてマークされるようになります。タプルを挿入する際に、ページに空き領域を作る必要があれば、デッドとマークされたタプルは削除されるようになりました。
</p>
<p>
GiST インデックスページ内のマイクロ VACUUM 処理です。
</p>
<li>box型に対する SP-GiST 演算子クラスが追加されました。  (Alexander Lebedev) (9.6)</li>
</ul>
<h5 class="marked">ソート</h5>
<ul>
<li>外部ソートを実行する時は、置換選択ソート(replacement-selection)ではなく、クイックソートを使うことで性能を向上します。(Peter Geoghegan) (9.6)</li>
<p>
新しい方式では、典型的なキャッシュサイズやデータ量で、CPU キャッシュをより有効に使います。必要な時は、新しい設定パラメータ replacement_sort_tuples で振る舞いを調整することができます。
</p>
<li>テキストのソートで同じ文字列が何度も現れる場合が速くなりました。  (Peter Geoghegan) (9.6)</li>
<li>uuid, bytea, char(n) フィールドのソートは、短縮キーを使うことで速くなりました。  (Peter Geoghegan) (9.6)</li>
<p>
短縮キー(abbreviated keys)のサポートが、デフォルトではない演算子クラスtext_pattern_ops, varchar_pattern_ops, bpchar_pattern_ops にも追加されました。順序付き集約の処理でも、短縮キーの利用が可能になっています。
</p>
<li>TID を64ビット整数としてソートすることで CREATE INDEX CONCURRENTLY がスピードアップされました。  (Peter Geoghegan) (9.6)</li>
</ul>
<h5 class="marked">ロック</h5>
<ul>
<li>ProcArrayLock の競合を減らしました。  (Amit Kapila, Robert Haas) (9.6)</li>
<p>
XID をクリアする処理で、複数の書き込みトランザクションが同時に行なわれている時は、ロックを獲得しているプロセスが、他のプロセスの分も処理します。
</p>
<li>バッファコンテンツロックを、バッファディスクリプタに移動することで性能が向上されました。  (Andres Freund, Simon Riggs) (9.6)</li>
<p>
これによりロックと pin がひとつのキャッシュラインで処理されることになります。
</p>
<li>共有バッファヘッダの spinlock をアトミック操作に交換したことで、スケーラビリティを向上しました。  (Alexander Korotkov, Andres Freund) (9.6)</li>
<p>
pin/unpin バッファ操作が頻繁に行なわれるのはボトルネックになります。フラグ, usage_count, buf_hdr_lock, refcount をひとつの 32bit アトミック変数として扱うことで、同時に操作することができるようになります。
</p>
<li>LWLock の待ちキュー保護に、spinlock ではなく、アトミック操作を使うようになりました。  (Andres Freund) (9.6)</li>
<p>
spinlock してから状態フィールドを操作するのではなく、単純に、状態フラグをアトミック操作することにしました。
</p>
<li>マルチ CPU ソケットサーバでの競合を軽減するため、共有ハッシュテーブルのフリーリストが分割されました。  (Aleksander Alekseev) (9.6)</li>
<p>
フリーリストを分割しない場合、巨大なサーバでは深刻な問題になっていました。
</p>
<li>スタンバイサーバで B-Tree インデックスの vacuum 操作を再生する時の内部ロックを軽減しました。  (Simon Riggs) (9.6)</li>
<p>
この変更により、その様な再生処理中の、レプリケーション遅延の発生を回避します。
</p>
</ul>
<h5 class="marked">最適化統計</h5>
<ul>
<li>NULL をたくさん含むカラムでの ANALYZE の見積りを向上しました。  (Tomas Vondra, Alex Shulgin) (9.6)</li>
<p>
これまでの ANALYZE は、多くの NULL を含むカラムでは、NULL でない値の固有値を過小評価していました。また頻出値の計算も不正確になっていました。
</p>
<p>
アルゴリズムのバグで、NULLの個数を含めたカラム数と、含めないカラム数での計算が混在していて、不正確な結果になっていました。
</p>
<li>クエリ結果に含まれる固有値の数のプランナの推定が改善されました。  (Tomas Vondra) (9.6)</li>
<li>結合述部の選択率の推論に、外部キーの関係を利用します。  (Tomas Vondra, David Rowley) (9.6)</li>
<p>
テーブル t が外部キー制約を持ち (a,b) が r (x,y) を参照しているとすると、WHERE 条件で t.a = r.x AND t.b = r.y は、t の行に対し 1より多くの r 行が選択されることはありません。これまでプランナは AND 条件は独立していると考えて、結果の選択率を大幅に間違えていました。今は WHERE 条件と適用できる外部キー制約を比較し、より良い推定値を算出します。
</p>
</ul>
<h5 class="marked">VACUUM</h5>
<ul>
<li>凍結されたタプルだけを含むページを、再 VACUUM しなくなりました。  (Masahiko Sawada, Robert Haas, Andres Freund) (9.6)</li>
<p>
これまでは、XID 周回を避けるための VACUUM は何もすることがないページでも、全て参照していました。今は、既に凍結されているタプルしか含まないページは、ビジビリティマップで判別され、トランザクション周回対策の vacuum を実行する場合でもスキップされます。これは、ほとんど変更されることのないデータを含む巨大なテーブルをメンテナンスするコストを大幅に削減します。
</p>
<p>
必要ならば VACUUM の DISABLE_PAGE_SKIPPING オプションで、すべて凍結されているページも処理するように強制することができます。通常ならば、これを必要とすることはありませんが、ビジビリティマップの破損を回復させる助けになるかも知れません。
</p>
<li>VACUUM 中の無駄なヒープ切り詰めが抑止されました。  (Jeff Janes, Tom Lane) (9.6)</li>
<p>
この変更により、いくつかのケースで切り詰めができないときに、排他的テーブルロックを取らなくなります。主な利点は、スタンバイサーバでの不要なクエリキャンセルを避けることからきています。
</p>
</ul>
<h5 class="marked">パフォーマンス一般</h5>
<ul>
<li>古いMVCCスナップショットを指定のタイムアウト後に無効にできるようになりました。  (Kevin Grittner) (9.6)</li>
<p>
通常、削除されたタプルは、それを参照できる最後のトランザクションが居なくならないない限り、VACUUM処理で削除されません。そのため、長時間のトランザクションが領域再利用を妨げてテーブル膨張をひき起こす可能性がありました。
</p>
<p>
本変更では、MVCCスナップショットの有効性を保証する時間を指定する新たな設定パラメータ old_snapshot_threshold による時間に基づく限度を導入します。デッドタプル（削除済みタプル、不要領域）は、指定時間を超えれば VACUUM処理が可能になります。本機能を使用する場合、古いスナップショットを使うトランザクションはデータを参照する際に以下のエラーを受ける可能性があります。
</p>
<pre>
ERROR:  snapshot too old
</pre>
<li>機能的に他の列に従属している GROUP BY 列を無視するようになりました。  (David Rowley) (9.6)</li>
<p>
GROUP BY 句が遅延無しのプライマリキーの全ての列を含むなら、その他の列はいずれも冗長であり、グルーピングから除外することができます。これは多くのよくある場合に計算を節約します。
</p>
<pre>
(9.6 での結果: 主キーの id 以外が無視されている)
db1=# explain SELECT id FROM t24 GROUP BY k1, k2, k3, id, k4, k5;
                         QUERY PLAN
------------------------------------------------------------
 HashAggregate  (cost=4.50..6.50 rows=200 width=24)
   Group Key: id
   -&gt;  Seq Scan on t24  (cost=0.00..4.00 rows=200 width=24)
(3 rows)
</pre>
<li>部分インデックスで、インデックスの WHERE句がインデックスの無い列を参照しているときでも index-only スキャンが利用可能になりました。  (Tomas Vondra, Kyotaro Horiguchi) (9.6)</li>
<p>
以下に例を示します。SELECT 文の条件に WHERE a &gt; 0 が含まれていて、選択リストが b だけなので index-only スキャンが選択されています。
</p>
<pre>
db1=# CREATE INDEX tidx_partial ON t25 (b) WHERE a &gt; 0;

db1=# explain SELECT b FROM t25 WHERE a &gt; 0 AND b &gt; 200;
                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Only Scan using tidx_partial on t25  (cost=0.29..4.47 rows=10 width=4)
   Index Cond: (b &gt; 200)
(2 rows)
</pre>
<p>
以前はこのような場合にインデックス列に a が含まれないため、index-only スキャンは利用できないと判断されていました。
</p>
<li>チェックポイント書き込みをソートされた順序で行うようになりました。  (Fabien Coelho, Andres Freund) (9.6)</li>
<p>
これまではチェックポイントで共有バッファにあらわれた順にダーティページを書き出していました。通常はランダム同然の順番となります。これは特に回転体メディア（主としてハードディスク装置）では性能に劣ります。本変更でファイル・ブロック番号の順に書き出すようになり、また、各テーブルスペースにバランスよくアクセスするようになりました。
</p>
<li>可能であれば調整可能な回数の書き込みの後、ダーティデータをカーネルディスクバッファに溜めないように、カーネルによるライトバックを駆動させるようになりました。  (Fabien Coelho, Andres Freund) (9.6)</li>
<p>
PostgreSQLはデータを、やがて物理ストレージにフラッシュされることから、カーネルディスクバッファに書き出します。多くの OS は必ずしもこのバッファ管理が賢くなく、大量のダーティデータをこれらを一度に書き出すと判断するまでの間に溜めこんで、新たな I/O 要求が大きく遅れてしまいます。この変更は設定された時間の後に明示的にデータのフラッシュを要求することで、本問題を緩和します。
</p>
<p>
以下の新たな設定パラメータでこの動作を制御します。
</p>
<pre>
backend_flush_after = 0        # 0 disables, default is 0
bgwriter_flush_after = 0       # 0 disables,
                            # default is 512kB on linux, 0 otherwise
checkpoint_flush_after = 0     # 0 disables,
                            # default is 256kB on linux, 0 otherwise
wal_writer_flush_after = 1MB   # 0 disables
</pre>
<li>複数の同じ引数と遷移関数を持つ集約で計算を共有することで集約関数の性能が改善されました。  (David Rowley) (9.6)</li>
<p>
例えば「SELECT avg(x), variance(x) FROM tab」は二つの集約に対して 1行につき1回の計算で済みます。
</p>
<li>元トランザクションはコミット済みかを判断するのに pg_clog ではなく、現在トランザクションのスナップショットを検査することで、最近に作られたタプルの可視性の判定が高速化されました。  (Jeff Janes, Tom Lane) (9.6)</li>
<li>タプルのヒントビットが以前よりも早くセットできるようになりました。  (Andres Freund) (9.6)</li>
<li>短命な準備されたトランザクションの性能が改善されました。  (Stas Kelvich, Simon Riggs, Pavan Deolasee) (9.6)</li>
<p>
二相コミットの情報は、PREPARE TRANSACTION のときに WAL にのみ書かれ、直ぐ後に生じるなら COMMIT PREPARED のとき WAL からのみ読み返されます。分離状態ファイルは保留しているトランザクションが次のチェックポイントまでコミットもアボートもされない場合にのみ作られるようになります。
</p>
<li>メモリコンテキスト破棄の性能が改善されました。  (Jan Wieck) (9.6)</li>
<li>多数のオブジェクトを追跡する場合の Resource Owners の性能が改善されました。  (Aleksander Alekseev) (9.6)</li>
<p>
Resource Owners は問い合わせに係わるリソースを管理するための内部モジュールです。
</p>
<li>timestamp、time、date データ型の出力関数の速度が改善されました。  (David Rowley, Andres Freund) (9.6)</li>
<p>
ライブラリ関数を手書きコードに置き換えて高速化しています。
</p>
<li>AccessExclusive ロックを取得する動作のリプレイ中に生じる、ホットスタンバイ問い合わせの一部の不要なキャンセルを回避するようになりました。  (Jeff Janes) (9.6)</li>
<li>リレーション拡張でロック競合が生じているときには、一度に複数ブロックを拡張するようになりました。  (Dilip Kumar) (9.6)</li>
<p>
これは競合を減らすことでスケーラビリティを改善します。
</p>
<li>スケーラビリティ改善のため clogバッファの数が増やされました。  (Amit Kapila, Andres Freund) (9.6)</li>
<li>PL/pgSQL で、常に有効な単純な変数に対する ParamListInfo要素を保持しておくことで式の評価が高速化されました。  (Tom Lane) (9.6)</li>
<p>
上記の ParamListInfo は内部的なデータ構造です。
</p>
<li>最近の Windowsバージョンでソケット設定の SO_SNDBUF をデフォルト値より小さくは上書き設定しないようになりました。  (Chen Huajun) (9.6)</li>
<p>
Windows 2012 からデフォルト値が増やされたため、従来の値を増やす為のコードが逆に値を減らす結果になっていました。
</p>
<li>update_process_title 設定パラメータが Windows ではデフォルトoff になりました。  (Takayuki Tsunakawa) (9.6)</li>
<p>
他のプラットフォームと比べて Windows ではプロセスタイトルを更新するオーバーヘッドが非常に大きく、また、大部分の Windowsユーザはプロセスタイトルを参照するツールを持っておらず実用性も低いため、このように変更されました。
</p>
</ul>
<h5 class="marked">モニタリング</h5>
<ul>
<li>VACUUM処理の進行を報告するシステムビューpg_stat_progress_vacuum が追加されました。  (Amit Langote, Robert Haas, Vinayak Pokale, Rahila Syed) (9.6)</li>
<li>関数 pg_control_system()、pg_control_checkpoint()、pg_control_recovery()、pg_control_init() が追加されました。  (Joe Conway, Michael Paquier) (9.6)</li>
<p>
これにより（pg_control コマンドで参照できる）pg_controlファイルのフィールドをSQL から参照することができます。
</p>
<li>pg_configシステムビューが追加されました。  (Joe Conway) (9.6)</li>
<p>
pg_configコマンドと同様の PostgreSQLコンパイル時の設定情報を取得することができます。
</p>
<li>pg_replication_slotsシステムビューに confirmed_flush_lsn 列が追加されました。  (Marko Tiikkaja) (9.6)</li>
<li>ホットスタンバイサーバの WALレシーバプロセスの状態に関する情報を持つpg_stat_wal_receiverシステムビューが追加されました。  (Michael Paquier) (9.6)</li>
<li>どのセッションがどのセッションをブロックしているかを識別するpg_blocking_pids() 関数が追加されました。  (Tom Lane) (9.6)</li>
<p>
引数にセッション (のバックエンドプロセスの) PID を与えると、そのセッションを待たせているセッションの PID が配列で返ります。これまでは pg_locksビューの出力を加工して同様の情報を得る必要がありましたが、無駄に手間がかかり、また、パラレル問い合わせに対応するのは困難でした。
</p>
<pre>
(使用例)
db1=# SELECT pid, pg_blocking_pids(pid), state, wait_event_type, wait_event
        FROM pg_stat_activity ;
  pid  | pg_blocking_pids |        state        | wait_event_type | wait_event
-------+------------------+---------------------+-----------------+------------
 10926 | {}               | idle in transaction |                 |
 10934 | {10926}          | active              | Lock            | relation
 10937 | {}               | active              |                 |
 10952 | {10926,10934}    | active              | Lock            | relation
(4 rows)
</pre>
<li>現在トランザクションのログフラッシュ位置を返す、関数 pg_current_xlog_flush_location() が追加されました。  (Tomas Vondra) (9.6)</li>
<li>現在のNOTIFYキューの件数を返す関数pg_notification_queue_usage() が追加されました。  (Brendan Jurd) (9.6)</li>
<li>メモリコンテキスト統計ダンプの冗長さが限定されました。  (Tom Lane) (9.6)</li>
<p>
メモリ不足エラーになるとエラーメッセージとしてメモリコンテキスト統計ダンプも出力されます。これが多数のメモリコンテキスト（固定で 100個以上）がある場合には、要約した短い出力とするようになりました。また、どちらの場合でも合計サイズの報告が加わります。
</p>
</ul>
<h5 class="marked">認証</h5>
<ul>
<li>PostgreSQLクライアント認証にBSD認証サービスを利用するbsd認証方式が追加されました。  (Marisa Emerson) (9.6)</li>
<p>
bsd認証はいまのところ OpenBSDでのみ利用可能です。
</p>
<li>pam認証を使う際に PAM_RHOST項目を通してクライアントIPアドレスやホスト名をPAMモジュールに提供するようになりました。  (Grzegorz Sampolski) (9.6)</li>
<p>
このために設定オプション pam_use_hostname が追加されました。
</p>
<li>マスタプロセスのログにパスワード認証失敗の詳細が出力されるようになりました。  (Tom Lane) (9.6)</li>
<p>
「password authentication failure」になるすべての場合のログ出力にDETAIL欄が加わり、パスワード不一致であるほか、指定ロールが存在しない場合や、ロールにパスワードが設定されていない場合を区別できるようになります。
</p>
<li>RADIUSパスワードが128文字までサポートされました。これまでは16文字まででした。  (Marko Tiikkaja) (9.6)</li>
<li>新たなSSPI認証のパラメータ compat_realm、upn_username が追加されました。  (Christian Ullrich) (9.6)</li>
<p>
これらは SSPI認証で使われる NetBIOS か Kerberos のレルム名とユーザ名を制御します。
</p>
</ul>
<h5 class="marked">サーバ設定</h5>
<ul>
<li>idle in transaction 状態が長く続くセッションを自動的に停止できるようになりました。  (Vik Fearing) (9.6)</li>
<p>
この動作は 新たな設定パラメータ idle_in_transaction_session_timeout で制御されます。忘れられたトランザクションが長時間にわたりロックを保持していたり、VACUUMを妨げていたりするのを防ぐのに役立ちます。
</p>
<li>checkpoint_timeout の許される最大値が 24 hours に増やされました。  (Simon Riggs) (9.6)</li>
<p>
以前の最大値は 1 hour でした。
</p>
<li>effective_io_concurrency がテーブルスペース毎に設定できるようになりました。  (Julien Rouhaud) (9.6)</li>
<p>
それぞれ異なるI/O特性を持つテーブルスペースがあるときに役立ちます。
</p>
<pre>
(設定例)
db1=# ALTER TABLESPACE my_tblspc1 SET ( EFFECTIVE_IO_CONCURRENCY = 5 );
</pre>
<li>log_line_prefix に現在時刻を Unixエポック形式で出力するオプション %n が追加されました。  (Tomas Vondra, Jeff Davis) (9.6)</li>
<p>
ミリ秒を伴い「1474886432.585」のような出力となります。
</p>
<li>設定パラメータ syslog_sequence_numbers、syslog_split_messages が追加されました。  (Peter Eisentraut) (9.6)</li>
<p>
syslog にログ出力するときにメッセージに連番を付けるか、メッセージを分割するかを指定できます。デフォルト設定はいずれも on で従来通りの動作となります。
</p>
<li>wal_level 設定パラメータの archive と hot_standby が新たな一つの値 replica に統合されました。  (Peter Eisentraut) (9.6)</li>
<p>
これらの設定を区別することに価値が無いと判断されました。旧来の名称も引き続き受け付けられ、内部的に replica に置き換えられます。
</p>
<li>configureオプション --with-systemd が追加されました。サーバの起動停止時にライブラリ関数 sd_notify() を呼び出すようになります。  (Peter Eisentraut) (9.6)</li>
<p>
これにより、systemd 下での PostgreSQL の管理をとても簡単にできるnotifyタイプの systemdサービスユニットを使用できるようになります。
</p>
<li>サーバSSL鍵ファイルの所有者が root であるとき、グループ読み取りアクセスを持つことを許容するようになりました。  (Christoph Berg) (9.6)</li>
<p>
これまでは鍵ファイルは PostgreSQLサーバ実行ユーザが所有者でなければなりませんでした。Debian など証明書を集中管理する一部のシステムでは、これは不便でした。グループに信頼できないユーザが含まれないようにするのはOS管理者の責任となります。
</p>
</ul>
<h5 class="marked">信頼性</h5>
<ul>
<li>マスタプロセスが終了したならバックエンドプロセスも強制終了するようになりました。  (Rajeev Rastogi, Robert Haas) (9.6)</li>
<p>
通常の状況ではマスタプロセスは子プロセスよりも長く生き続けます。何らかの理由でマスタプロセスが死ぬと、バックエンドセッションがエラーを出して終了するようになりました。これまでは、残ったバックエンドプロセスはクライアントから切断されるまで実行を続けていましたが、これは危険で非効率的でした。この変更は、旧バックエンドプロセスが残っているのに新たな PostgreSQL を起動してしまうことも防ぎます。バックエンドプロセスはクライアントI/Oを待つ間にマスタプロセスダウンを検知した場合には、即座には終了しませんが、現在の問い合わせが終了した時点よりも遅くなることはありません。
</p>
<li>制約違反エラーを報告する前に直列化の衝突を検査するようになりました。  (Thomas Munro) (9.6)</li>
<p>
トランザクション隔離レベルにシリアライザブルを使っている場合、現在トランザクションが原因のあらゆるエラーは直列化失敗として表明すべきことが望まれます。これによってリトライで成功を見込めるアプリケーションに指示を出しています。残念ながら、これまでは同時挿入によりキー重複エラーが生じた場合、直列化失敗エラーは確実には発生しませんでした。
</p>
<p>
本変更でこのような場合には直列化失敗エラーとして報告されるようになります。
</p>
<li>たとえ XID 割り当ての無いトランザクションから出されたときでも、無効化メッセージ（新たな XLOGメッセージタイプ XLOG_INVALIDATIONS）が確実にWAL記録されるようになりました。  (Andres Freund) (9.6)</li>
<p>
この変更は、スタンバイサーバのトランザクションが、インデックス同時作成や可視性マップ等の更新に気づくのに失敗するという場合について修正します。
</p>
<li>複数プロセスが GINインデックスのペンディングリストを同時に掃除しようとするのを防ぐようになりました。  (Teodor Sigaev, Jeff Janes) (9.6)</li>
<p>
これまでは故意に許されていましたが、このことは結果として VACUUM が削除すべきインデックスエントリを見落とす競合状態をひき起こします。
</p>
</ul>
<h4 class="marked">レプリケーション／リカバリ</h4>
<ul>
<li>同期レプリケーションで同時に動作する複数の同期スタンバイサーバをサポートするようになりました。  (Masahiko Sawada, Beena Emerson, Michael Paquier, Fujii Masao, Kyotaro Horiguchi) (9.6)</li>
<p>
コミット応答の前に同期完了を確認しなければいけないスタンバイサーバの数を、synchronous_standby_names パラメータの中で指定できるようになります。
</p>
<p>
以下は、s1、s2、s3 の 3つスタンバイのうち 2つを同期スタンバイサーバとするという意味になります。
</p>
<pre>
synchronous_standby_names = '2 (s1,s2,s3)'
</pre>
<li>設定パラメータ synchronous_commit に新たな値 remote_apply が追加されました。  (Thomas Munro) (9.6)</li>
<p>
このモードでは、プライマリはトランザクションがスタンバイサーバ上で、ディスクに書かれるだけでなく、適用されるのを待ちます。このことは、マスタにてコミット済みとこれまで応答を受けた全ての内容をスタンバイ上で参照できると期待できることを意味します。
</p>
<li>レプリケーションプロトコルにレプリケーションスロットが作られたときに直ぐに WAL を確保できる機能が追加されました。また、pg_create_physical_replication_slot() に対応する immediately_reserveオプションが追加されました。  (Gurjeet Singh, Michael Paquier) (9.6)</li>
<p>
これによりレプリケーションスロット作成によってベースバックアップに必要な全ての WAL が入手可能であることを保証できるようになります。
</p>
<li>pg_basebackup に --slot オプションが追加されました。  (Peter Eisentraut) (9.6)</li>
<p>
これは pg_basebackup にWALストリーミングのレプリケーションスロットを使わせます。ベースバックアップ完了後、通常のストリーミングレプリケーション用に同スロットを選択することで、スムーズに新たなスタンバイサーバを開始できます。
</p>
<li>pg_start_backup() と pg_stop_backup() が非排他バックアップに対応しました。  (Magnus Hagander) (9.6)</li>
<p>
これにより同時に2系統のベースバックアップが実行可能になります。両関数に排他モードであるかを指定するオプションパラメータが追加されました。
</p>
</ul>
<h4 class="marked">問い合わせ</h4>
<ul>
<li>行の集合を返す関数が NULL の行を返せるようになりました。  (Andrew Gierth, Tom Lane) (9.6)</li>
<p>
SELECT ... FROM function(...) という文脈では、複合値の集合を返す関数は、これまで単なる NULL値を集合の一部として返すことができませんでした。これからは可能となり、行の各要素が NULL の行と解釈されます。
</p>
<p>
以下に例を示します。
</p>
<pre>
db1=# CREATE TABLE t71 (id int, v text, ts timestamp(0));
db1=# CREATE OR REPLACE FUNCTION f_srf() RETURNS SETOF t71 LANGUAGE sql
        AS $$ VALUES ( NULL::t71 ), ((1, 'a', '2015-01-01')::t71); $$;

(9.6 の実行結果)
db1=# pset null *null*
db1=# SELECT * FROM f_srf();
   id   |   v    |         ts
--------+--------+---------------------
 *null* | *null* | *null*
      1 | a      | 2015-01-01 00:00:00
(2 rows)

(9.5.x の実行結果)
db1=# SELECT * FROM f_srf();
ERROR:  function returning set of rows cannot return null value
</pre>
<li>複数の VALUES 行を持つ INSERT の対象カラムリストで、配列添字によるフィールド選択について完全に対応しました。  (Tom Lane) (9.6)</li>
<p>
これまでは以下のように同じ対象列が複数回現れる場合にエラーが出ていました。
</p>
<pre>
(9.5.x の結果)
db1=# INSERT INTO t72 (id, arr[1], arr[2], arr[3])
        VALUES (1, 101, 102, 103), (2, 201, 202, 203);
ERROR:  multiple assignments to same column "arr"
</pre>
<li>それが適切な場合には、SELECT 出力式の評価を ORDER BY ソートまで延期するようになりました。  (Konstantin Knizhnik) (9.6)</li>
<p>
この変更は出力リストにある揮発性の関数、高負荷な関数が、ORDER BY で指示される順序で実行されることを、また、LIMIT句があるときに必要な回数以上に評価されないことを保証します。
</p>
<p>
インデックススキャンやマージ結合前のソートでは従来からこのような動作をしていましたが、トップレベルソートでは実施されませんでした。
</p>
<pre>
(実行例／ここでの t73 テーブルの行はデタラメな順で物理格納されている)
db1=# SELECT id FROM t73;
 id
----
  5
  7
 49
 76
 25
 : (後略)

(9.5 の結果)
db1=# CREATE SEQUENCE sq73;
db1=# SELECT nextval('sq73'), id FROM t73 ORDER BY id ;
 nextval | id
---------+----
      31 |  1
      63 |  2
      44 |  3
      77 |  4
       1 |  5
(5 rows)

db1=# SELECT currval('sq73');
 currval
---------
     100
(1 row)

(9.6 の結果)
db1=# CREATE SEQUENCE sq73;
db1=# SELECT nextval('sq73'), id FROM t73 ORDER BY id ;
 nextval | id
---------+----
       1 |  1
       2 |  2
       3 |  3
       4 |  4
       5 |  5
(5 rows)
db1=# SELECT currval('sq73');
 currval
---------
       5
(1 row)
</pre>
<li>処理されるタプル数を記録するカウンタが 64bit に拡張されました。  (Andreas Scherbaum) (9.6)</li>
<p>
この変更により SELECT 等のコマンドタグが 40億件以上のタプル数を正しく報告できるようになります。これは PL/pgSQL の GET DIAGNOSTICS ... ROW_COUNTコマンドにも適用されます。
</p>
<li>MULE_INTERNAL文字エンコーディングへの変換を通したエンコーディング変換を回避するようになりました  (Tom Lane) (9.6)</li>
<p>
これまでキリル文字と中央ヨーロッパのシングルバイト文字エンコーディングに対する多くの変換では、MULE_INTERNAL を通して変換していました。これは非効率であり、また、変換不能である場合のエラーメッセージがMULE_INTERNAL との間で変換できないという混乱を招く内容になってしまっていました。
</p>
<li>テーブルが同じロールID でアクセスされるときのみ、リモート側での外部テーブルの結合を検討するようになりました。  (Shigeru Hanada, Ashutosh Bapat, Etsuro Fujita) (9.6)</li>
<p>
これまでは外部テーブル結合のプッシュダウン基盤は、各外部データラッパ次第のセキュリティ上の問題を残していました。このことは、外部データラッパ実装で不注意によりセキュリティホールを作ってしまい易くしていました。
</p>
<p>
そのため、本体コード側でどのロールID で各テーブルにアクセスするかを判定して、各結合するテーブルにアクセスするロールが同じでない限り結合のプッシュダウンを試みないようにしました。
</p>
</ul>
<h4 class="marked">ユーティリティコマンド</h4>
<ul>
<li>COPY が INSERT、UPDATE、DELETE に RETURNING を付けた場合の出力をコピーできるようになりました。  (Marko Tiikkaja) (9.6)</li>
<p>
これまでは CTE を経由してこれらを出力する SQL を記述する必要がありました。
</p>
<li>ALTER ... DEPENDS ON EXTENSION ... 構文が追加されました。  (Abhijit Menon-Sen) (9.6)</li>
<p>
ALTER FUNCTION、ALTER INDEX、MATERIALIZED VIEW、ALTER TRIGGER の各コマンドに新たな DEPENDS ON EXTENSION オプションが加わりました。
</p>
<p>
これらはオブジェクトに拡張モジュールに依存しているという印をつけます。そうすると、その拡張モジュールを削除すると（CASCADE指定無しでも）自動的にオブジェクトも削除されます。しかしながら、そのオブジェクトは拡張モジュールの一部というわけではないので、pg_dump では別個にダンプされます。
</p>
<pre>
(動作例)
db1=# CREATE EXTENSION hstore;
db1=# CREATE FUNCTION f(text) RETURNS text LANGUAGE sql
        AS $$ SELECT ($1::hstore)::text $$;
db1=# ALTER FUNCTION f(text) DEPENDS ON EXTENSION hstore;
db1=# SELECT f('a=&gt;b');
    f
----------
 "a"=&gt;"b"
(1 row)

db1=# DROP EXTENSION hstore;
db1=# SELECT f('a=&gt;b');
ERROR:  function f(unknown) does not exist
</pre>
<li>ALTER ... SET SCHEMA で対象が既に指定のスキーマ下にある場合には、エラーを出すのではなく、何もしないようになりました。  (Marti Raudsepp) (9.6)</li>
<p>
このケースは、これまでほとんどの種類のオブジェクトでエラーになっていました。
</p>
<li>ALTER OPERATOR にその演算子に関する選択性の関数を変更できるオプションが加わりました。  (Yury Zhuravlev) (9.6)</li>
<p>
CREATE OPERATOR では以前から指定可能でした。
</p>
<li>ALTER TABLE ... ADD COLUMN に IF NOT EXISTS オプションが加わりました。  (Fabr&iacute;zio de Royes Mello) (9.6)</li>
<li>テーブルの fillfactor と autovacuum関連のオプションを設定するときにALTER TABLE が必要とするロックレベルが、下げられました。  (Fabr&iacute;zio de Royes Mello, Simon Riggs) (9.6)</li>
<p>
これからは AccessExclusiveLock ではなく ShareUpdateExclusiveLock で済みます。
</p>
<li>CREATE ACCESS METHOD コマンドが導入されました。拡張モジュールで新たなインデックスアクセスメソッドを作ることができます。  (Alexander Korotkov, Petr Jel&iacute;nek) (9.6)</li>
<li>CREATE EXTENSION に CASCADE オプションが加わりました。依存する拡張モジュールも合わせて導入してくれます。  (Petr Jel&iacute;nek) (9.6)</li>
<li>CREATE TABLE ... LIKE で参照元テーブルが OID列を持つなら、作成テーブルにも OID列を含めるようになりました。  (Bruce Momjian) (9.6)</li>
<li>テーブル作成コマンドでは CHECK制約が NOT VALID と宣言されている場合でも、自動的に VALID とみなすようになりました。  (Amit Langote, Amul Sul) (9.6)</li>
<p>
作成時点ではテーブルには行がありませんので、これは安全です。FOREIGN KEY 制約を NOT VALID 指定で作った場合には、従来からこのような振る舞いとなっていました。
</p>
<li>DROP OPERATOR が pg_operator.oprcom と pg_operator.oprnegate の削除された演算子へのリンクを消すように修正されました。  (Roma Sokolov) (9.6)</li>
<p>
これまではこれらリンクはそのまま残されていて、あまりないことですが、削除された演算子の OID が他の演算子で再利用されることで問題をひき起こすおそれがありました。
</p>
<li>EXPLAIN で同じサブプランを2回表示しないようになりました。  (Tom Lane) (9.6)</li>
<p>
ある種の、典型的にはインデックス条件の SubPlanノードを伴う場合に、EXPLAIN は同じサブプランを 2回出力することがありました。
</p>
<li>OIDカラムを除くシステムカラムへのインデックス作成が禁止されました。  (David Rowley) (9.6)</li>
<p>
このようなインデックスはサポートされていると考えられておらず、タプルのシステムカラム列はインデックスを更新することなく変更されることがあるため、おそらく極めて不適切な動作をしていました。それでいて、これまでインデックス作成を防ぐエラーチェックがありませんでした。
</p>
</ul>
<h4 class="marked">アクセス権限の制御</h4>
<ul>
<li>機微な関数へのアクセス管理に権限システムを使うようになりました。  (Stephen Frost) (9.6)</li>
<p>
これまでは、多くのセキュリティ的に機微な関数には、非スーパーユーザから呼び出されたらエラーを投げるという固定的なチェックが組み込まれていました。このことは関連する通常のタスクにもスーパーユーザロールを使わざるをえなくしていました。
</p>
<p>
今後は、これらの固定的なチェックは無くして、むしろ initdb でこれら関数上のデフォルトの public EXECUTE 権限を無効にするようにします。これにより、これら関数の使用を(スーパーユーザでない)信頼されたロールに許可する使い方ができるようになります。
</p>
<p>
以下の関数でそのように変更されました。
</p>
<pre>
pg_start_backup(text, boolean, boolean)
pg_stop_backup()
pg_stop_backup(boolean)
pg_create_restore_point(text)
pg_switch_xlog()
pg_xlog_replay_pause()
pg_xlog_replay_resume()
pg_rotate_logfile()
pg_reload_conf()
pg_stat_reset()
pg_stat_reset_shared(text)
pg_stat_reset_single_table_counters(oid)
pg_stat_reset_single_function_counters(oid)
</pre>
<p>
pg_read_file() など、依然として固定的にスーパーユーザでないと実行できないように実装されている関数も残っています。
</p>
<li>従来スーパーユーザのみ実行可能であった関数へのアクセス権限を持っているビルトインロールが作られました。  (Stephen Frost) (9.6)</li>
<p>
いまのところ、サーバシグナル送信関数を実行できる pg_signal_backend ロールのみ用意されています。
</p>
</ul>
<h4 class="marked">データ型</h4>
<ul>
<li>フレーズ検索ができるように全文検索が改良されました。  (Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov) (9.6)</li>
<p>
フレーズとは指定の順序で隣接あるいは指定の距離を空けて現れる語彙素の並びです。
</p>
<p>
フレーズ検索問い合わせは tsquery 入力の中でで &lt;-&gt; 演算子、&lt;N&gt; 演算子にて指定できます。前者は、前後の語彙素が隣接してその順に現れなければいけないことを意味します。後者は、前後の語彙素がちょうど N 語彙素だけ離れていなければいけないことを意味します。
</p>
<p>
以下に使用例を示します。
</p>
<pre>
db1=# CREATE TABLE t_ps (id serial, txt text, tsv tsvector);
db1=# INSERT INTO t_ps (txt) VALUES (
        'PostgreSQL is the most advanced open source database in the world');
db1=# UPDATE t_ps SET tsv = to_tsvector('english', txt);

db1=# SELECT phraseto_tsquery('english', 'open source database');
         phraseto_tsquery
----------------------------------
 'open' &lt;-&gt; 'sourc' &lt;-&gt; 'databas'
(1 row)

db1=# SELECT phraseto_tsquery('english', 'open source database') @@ tsv FROM t_ps;
 ?column?
----------
 t
(1 row)

db1=# SELECT phraseto_tsquery('english', 'database in the world');
   phraseto_tsquery
-----------------------
 'databas' &lt;3&gt; 'world'
(1 row)

db1=# SELECT phraseto_tsquery('english', 'database in the world') @@ tsv FROM t_ps;
 ?column?
----------
 t
(1 row)
</pre>
<li>配列切り出し指定を片方あるいは両方省略できるようになりました。  (Yury Zhuravlev) (9.6)</li>
<p>
以下のように使用できます。
</p>
<pre>
db1=# SELECT '{aa,bb,cc,dd,ee,ff}'::text[];
        text
---------------------
 {aa,bb,cc,dd,ee,ff}
(1 row)

db1=# SELECT ('{aa,bb,cc,dd,ee,ff}'::text[])[:3];
    text
------------
 {aa,bb,cc}
(1 row)

db1=# SELECT ('{aa,bb,cc,dd,ee,ff}'::text[])[:];
        text
---------------------
 {aa,bb,cc,dd,ee,ff}
(1 row)
</pre>
<li>範囲外の日付、タイムスタンプについてより注意深くなりました。  (Vitaly Burovoy) (9.6)</li>
<p>
この変更は timestamp with time zone 型の最大値、最小値に極めて近い値に対して、想定外の out-of-range エラーが生じるのを防ぎます。これまでは、タイムゾーン設定によって同じ値が受け入れられたり、受け入れられなかったりしました。このことはダンプ後のリロードで、既に受け入れられた値について失敗するおそれがあることを意味します。これからは、値の上限下限は timezone設定と無関係にローカル時刻でなくUTC時刻に従って制限されます。
</p>
<p>
また、date + integer などの演算で生じた新たな date や timestamp 値のオーバーフロー判定をより注意深く行うようになりました。
</p>
<p>
これらの結果として、仕様上範囲外とされている値において 9.5.x よりも扱えない値の範囲が増えています。バージョンアップ時の注意事項となります。
</p>
<li>幾何データ型にて infinity および NaN 構成要素値が入出力で確実に一貫性をもって扱われるようになりました。  (Tom Lane) (9.6)</li>
<p>
今後これらの値は常に単純な float8 (double precision) 型の列と同様に出力されるようになります。また、入力においても同様に扱われます。これまでは振る舞いがプラットフォーム依存となっていました。
</p>
<li>現代的な Hunspellファイルを扱え、より多くの言語に対応するようにispell辞書タイプが改訂されました。  (Artur Zakirov) (9.6)</li>
<li>正規表現に後方検索制約(後ろ読み制約、lookbehind constraint) が実装されました。  (Tom Lane) (9.6)</li>
<p>
後方検索制約は、既存の先行検索制約(先読み制約、lookahead constraint) と同様に、テキストを消費しませんが、文字列の現在位置を末尾としてマッチするかチェックします。同様の仕様は既存の他の多くの正規表現エンジンに存在します。
</p>
<p>
以下のように使用できます。
</p>
<pre>
(例1: abc に続く 3文字)
db1=# SELECT regexp_matches('abcdefgh', '(?&lt;=abc)...');
 regexp_matches
----------------
 {def}
(1 row)

(例2: abc に続かない 3文字を複数切り出し)
db1=# SELECT regexp_matches('abcdefgh', '(?&lt;!abc)...', 'g');
 regexp_matches
----------------
 {abc}
 {efg}
(2 rows)
</pre>
<li>正規表現で、3桁8進エスケープ<br />
nn が 377 (10進数で 255、1バイト) を超えることがあり、これを 2桁の8進エスケープと見なすようになりました。  (Tom Lane) (9.6)</li>
<p>
以下例の 467 は 2桁8進数エスケープで解釈すれば '&' と文字 '7' で、3桁8進数で解釈すると1バイトを超える不正な値になります。
</p>
<pre>
(9.5.x での結果)
db1=# SELECT 'a&amp;7bbbbb'  ~ '^a467';
 ?column?
----------
 f
(1 row)

(9.6 での結果 - 正規表現パターンが '^a&amp;7' と解釈されています)
db1=# SELECT 'a&amp;7bbbbb'  ~ '^a467';
 ?column?
----------
 t
(1 row)
</pre>
<li>対応する等価演算子と一貫性をもたせるため、トランザクションID (XID) の演算子 xid &lt;&gt; xid および xid &lt;&gt; int4 が追加されました。  (Michael Paquier) (9.6)</li>
</ul>
<h4 class="marked">関数</h4>
<ul>
<li>jsonb配列に新たな要素を挿入したり、jsonbオブジェクトに新たなキーを挿入する jsonb_insert()関数が追加されました。  (Dmitry Dolgov) (9.6)</li>
<p>
以下のようにパスを指定して jsonbデータ構造の内部に要素を挿入できます。
</p>
<pre>
db1=# SELECT jsonb_insert('{"x":[10,20,30],"y":[4,5]}', ARRAY['x','2']::text[], '100');
             jsonb_insert
---------------------------------------
 {"x": [10, 20, 100, 30], "y": [4, 5]}
(1 row)
</pre>
<li>numeric型むけの ln()、log()、exp()、pow() 関数の精度が改善しました。  (Dean Rasheed) (9.6)</li>
<li>numeric型の値の尺度(小数点位置)を返す scale()関数が追加されました。  (Marko Tiikkaja) (9.6)</li>
<pre>
(例)
db1=# SELECT scale(12345.678::numeric);
 scale
-------
     3
(1 row)
</pre>
<li>ラジアンでなく度単位で動作する三角関数が追加されました。  (Dean Rasheed) (9.6)</li>
<p>
末尾に d が付いた度単位版の三角関数 acosd()、asind()、atan2d()、cosd()、cotd()、sind()、tand() が追加されました。
</p>
<pre>
(例)
db1=# SELECT sind(30);
 sind
------
  0.5
(1 row)
</pre>
<li>三角関数(sin/cos/tan) が infinity と Nan の入力を確実に POSIX標準通りに扱うようになりました。  (Dean Rasheed) (9.6)</li>
<p>
POSIX標準では、これら関数は NaN 入力には NaN を返すべきであり、infinity を含む範囲外入力にはエラーを出すべきとされています。これまでは、各プラットフォームでばらばらの振る舞いをしていました。
</p>
<li>to_timestamp(float8) が浮動小数点の infinity を timestamp の infinityに変換するようになりました。  (Vitaly Burovoy) (9.6)</li>
<p>
従来は「ERROR:  timestamp out of range」となっていました。
</p>
<li>tsvectorデータむけに新たな関数がいくつか追加されました。  (Stas Kelvich) (9.6)</li>
<p>
以下が追加されています。
</p>
<pre>
 ts_delete()             tsvector から要素を削除
 ts_filter()             tsvector から重み指定条件で要素を削除
 unnest()                tsvector を行集合に展開 
 tsvector_to_array()     tsvector を配列に変換
 array_to_tsvector()     配列を tsvector に変換
 setweight() の別引数版  指定の要素だけ重み付け設定
</pre>
<li>ts_stat()、tsvector_update_trigger() 関数が、想定される引数型のみならず、それらとバイナリ互換の型の値も処理できるようになりました。例えば text型引数に citext型の値も使えるようになります。  (Teodor Sigaev) (9.6)</li>
<li>引数の NULL あるいは 非NULL を数える可変引数関数 num_nulls()、num_nonnulls() が追加されました。  (Marko Tiikkaja) (9.6)</li>
<p>
CHECK制約に CHECK(num_nonnulls(a, b, c) = 1) と記述することで、3つの列のうち 1つだけが非NULL であるということを表明できます。これらの関数は、一つの配列に対して要素の NULL または非NULLを数える使い方も可能です。
</p>
<li>修飾され、またあるいはクォートされた SQL識別子を要素の配列に分割する、parse_ident() 関数が追加されました。  (Pavel Stehule) (9.6)</li>
<p>
"APP"スキーマの t_log テーブルの col1 カラムが「"APP".T_LOG.Col1」と表現されていたとして、これを以下例のように分解できます。クォートされていない大文字の小文字への正規化も行われます。
</p>
<pre>
db1=# SELECT parse_ident('"APP".T_LOG.Col1');
   parse_ident
------------------
 {APP,t_log,col1}
(1 row)
</pre>
<li>to_number() 関数で V フォーマットコードを、10 の V に続く数字の個数のべき乗で割るものと解釈するようになりました。  (Bruce Momjian) (9.6)</li>
<p>
これにより、to_char の逆関数として動作するようになります。
</p>
<pre>
(9.6 での動作例: V の後 9 が 2個並んでいるので 10^2 で割った値が返ります)
db1=# SELECT to_number('12400', '999V99');
      to_number
----------------------
 124.0000000000000000
(1 row)

(9.6 および 9.5.x の動作例: 10^2 を乗じた値が返ります)
db1=# SELECT to_char(124.000, '999V99');
 to_char
---------
  12400
(1 row)
</pre>
<li>to_reg*() 関数群が cstring型でなく、text型を受け付けるようになりました。  (Petr Korobeinikov) (9.6)</li>
<p>
引数が単純なリテラル定数でない箇所でも、ほとんどの場合に明示的なキャストを加える必要がなくなります。
</p>
<p>
これまでは以下のように明示的なキャストが必要なケースがありました。
</p>
<pre>
(9.5.x の動作例 - public.t1 の """"""OID番号を調べる問い合わせ)
db1"""""" =# SELECT to_regclass('public.t1')::oid;
 to_regclass
-------------
       17757
(1 row)

db1=# SELECT to_regclass('public.' || 't1')::oid;
ERROR:  function to_regclass(text) does not exist

db1=# SELECT to_regclass(('public.' || 't1')::cstring)::oid;
 to_regclass
-------------
       17757
(1 row)
</pre>
<li>人間に読みやすい形式で書かれたサイズをあらわす文字列を数値に変換するpg_size_bytes() 関数が追加されました。  (Pavel Stehule, Vitaly Burovoy, Dean Rasheed) (9.6)</li>
<p>
本関数は、pg_size_pretty()関数が出力するような文字列をバイト単位の数値に変換します。
</p>
<p>
例えば以下のように使用します。
</p>
<pre>
db1=# SELECT oid::regclass FROM pg_class
        WHERE pg_total_relation_size(oid) &gt; pg_size_bytes('10 GB');
</pre>
<li>pg_size_pretty() 関数でマイナスの値をプラスの値同様に整形するようになりました。  (Adrian Vondendriesch) (9.6)</li>
<p>
これまではマイナス値は必ずバイト単位で出力されていました。
</p>
<pre>
(9.5.x の動作)
db1=# SELECT pg_size_pretty(-100000000::int8);
  pg_size_pretty
------------------
 -100000000 bytes
(1 row)

db1=# SELECT pg_size_pretty(-100000000::int8);
 pg_size_pretty
----------------
 -95 MB
(1 row)
</pre>
<li>current_setting() 関数にオプション引数 missing_ok が追加されました。  (David Christensen) (9.6)</li>
<p>
これにより認識できないパラメータ名についてエラーを回避して、代わりにNULL が返るようにできます。
</p>
<li>いくつかのシステムカタログ情報関数が無効な入力に対して NULL を返すようになりました。  (Michael Paquier) (9.6)</li>
<p>
今後は、pg_get_viewdef() は無効なビューのOIDに対して NULL を返します。また、類似のいくつかの関数も無効な入力に NULL を返すようになります。
</p>
<p>
これまではエラーを示す文字列（例:「Not a view」）が返ったり、「ERROR:  cache lookup failed ...」というエラーが生じたりして、不規則な応答となっていました。
</p>
<li>レプリケーションSQL関数の pg_replication_origin_xact_reset() が引数を持たないように修正されました。  (Fujii Masao) (9.6)</li>
<p>
ドキュメントには引数を持たないと記されており、C コードも引数無しの想定となっていますが、SQL関数定義上は 2引数を取るようになっていました。
</p>
</ul>
<h4 class="marked">サーバサイド言語</h4>
<ul>
<li>PL/pgSQL で実行時でなく関数コンパイル時に CONTINUE文と EXIT文の不一致を検出するようになりました。  (Jim Nasby) (9.6)</li>
<li>PL/Python のエラー報告関数とメッセージ報告関数が、主エラーメッセージの他に追加メッセージ欄を指定できるように拡張されました。  (Pavel Stehule) (9.6)</li>
<li>PL/Python 関数が自分自身を SPI を通して再帰的に呼び出しできるようになりました。また、集合を返す PL/Python 関数が一つの問い合わせの中で複数呼び出されたときの振る舞いが修正されました。  (Alexey Grishchenko, Tom Lane) (9.6)</li>
<li>PL/Python におけるセッション単位でのメモリリークが修正されました。  (Heikki Linnakangas, Haribabu Kommi, Tom Lane) (9.6)</li>
<li>PL/Tcl を単純な文字列でなく Tcl のオブジェクトAPI を使うように現代化しました。  (Jim Nasby, Karl Lehenbauer) (9.6)</li>
<p>
これにより一部ケースでかなり性能が改善されます。なお、PL/Tcl は Tcl 8.4 以降が必要となります。
</p>
<li>PL/Tcl で、Tcl の errorCode グローバル変数にて、データベースエラーに追加情報が返るようになりました。  (Jim Nasby, Tom Lane) (9.6)</li>
<p>
この仕様は Tcl のエラーに関する補助データを返すときの慣習に従っています。
</p>
</ul>
<h4 class="marked">クライアントインターフェース</h4>
<ul>
<li>エラーおよび警告メッセージにおける深刻度フィールドの非ローカライズ版が加わりました。  (Tom Lane) (9.6)</li>
<p>
「ERROR」「WARNING」「NOTICE」などの深刻度を示す語が NLS を有効にしている場合、ローカライズされている可能性がありました。本修正で、クライアントプログラムがこのような懸念なく深刻度を判定できるようになります。
</p>
<p>
PQresultErrorField() 関数で fieldcode に PG_DIAG_SEVERITY の他PG_DIAG_SEVERITY_NONLOCALIZED を指定できるようになります。
</p>
<p>
また、PostgreSQLプロトコルにおける ErrorResponse および NoticeResponseメッセージ内で現れるフィールドの種類をあらわすコードに 'S' の非ローカライズ版である 'V' が加わっています。
</p>
<li>libpq でメッセージの CONTEXT 出力の抑制を調整できるようになりました。常に抑制するか、非エラーのメッセージのみ抑制するかを指定できます。  (Pavel Stehule) (9.6)</li>
<p>
PQerrorMessage() デフォルトの現在のデフォルト動作は後者の動作で、エラー時のみ CONTEXT を出力します。この調整のために新たな関数 PQsetErrorContextVisibility() を使用できます。
</p>
<li>libpq で別の冗長レベルでのエラーメッセージ再生成に対応しました。  (Alex Shulgin) (9.6)</li>
<p>
これは新たな関数 PQresultVerboseErrorMessage() で実行されます。psql の 新機能 errverbose の実現に使われています。
</p>
<li>libpq の PQhost()関数がデフォルトの Unixソケット接続について有用なデータを返すように改良されました。  (Tom Lane) (9.6)</li>
<p>
これまでは明示的にホスト指定が無い場合には NULL が返っていました。これからはデフォルトのソケットディレクトリパスを返します。
</p>
<li>ecpg の字句解析器がプリプロセッサ命令の行においてコメント文字列内の改行を受け付けるように修正されました。  (Michael Meskes) (9.6)</li>
</ul>
<h4 class="marked">クライアントアプリケーション</h4>
<h5 class="marked">pg_dump</h5>
<ul>
<li>pg_dump、pg_restore に --strict-names オプションが追加されました。  (Pavel Stehule) (9.6)</li>
<p>
本オプションは -t、-n オプションに対して指定したオブジェクトが存在していないときにエラーを出して失敗させます。--strict-names 指定が無い場合（すなわち従来の動作）は、該当するオブジェクトが無い -t や -n の指定が含まれていても警告なしに実行されます。
</p>
<pre>
(t1テーブルは存在し、t2テーブルは存在しない場合)
$ pg_dump --strict-names -d db1 -t t1 -t t2 &gt; t12.dump
pg_dump: no matching tables were found for pattern "t2"
</pre>
<li>pg_dump でシステムオブジェクトに対する権限割り当ての初期状態からの変更をダンプするようになりました。  (Stephen Frost) (9.6)</li>
<p>
スーパーユーザはビルトインオブジェクトや拡張モジュールによるオブジェクトの権限割り当てを常に変更できる一方、これまでこれらの変更はダンプ・リロードで失われていました。これからは pg_dump がこれらの変更を認識し、ダンプするようになります。
</p>
<p>
なお、これはバージョン 9.6 以降のサーバに対してのみ機能します。
</p>
<li>pg_dump が拡張モジュールに所属するスキーマ内にある拡張モジュールに所属しないオブジェクトだけダンプできるようになりました。  (Mart&iacute;n Marqu&eacute;s) (9.6)</li>
<p>
これまではこのようなオブジェクトは拡張モジュールに属すると判断されて無視されていました。
</p>
<li>pg_dump で対応するテーブルが一意に決まるオブジェクトタイプについて、オブジェクトタグにテーブル名を含めるようになりました。  (Peter Eisentraut) (9.6)</li>
<p>
以下のように Name: が「テーブル名 オブジェクト名」になっています。
</p>
<pre>
(ダンプ出力の一部)
--
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);
</pre>
</ul>
<h5 class="marked">psql</h5>
<ul>
<li>psql が複数の -c、-f オプションに対応しました。  (Pavel Stehule, Catalin Iacob) (9.6)</li>
<p>
複数のコマンドやスクリプトファイルを指定すると、一つの接続の中でオプションが与えられた順（左から順）に実行されます。
</p>
<pre>
(実行例)
$ echo 'SELECT $$script$$' &gt; script.sql
$ psql -c 'BEGIN' -f script.sql -c 'COMMIT' db1
BEGIN
 ?column?
----------
 script
(1 row)

COMMIT
$
</pre>
<li>psql にクロス表形式で問い合わせ結果を表示する crosstabview コマンドが追加されました。  (Daniel V&eacute;rit&eacute;) (9.6)</li>
<p>
以下のように使用することができます。
</p>
<pre>
db1=# SELECT cat1, cat2, to_char(sum(sales),'9,999,999')
      FROM tsales GROUP BY cat1, cat2;
 cat1 |    cat2    |  to_char
------+------------+------------
 支店 | 通常期間   |  2,168,062
 本店 | セール期間 |    563,499
 本店 | 通常期間   |    906,981
 支店 | セール期間 |  1,344,994
(4 rows)

db1=# crosstabview
 cat1 |  通常期間  | セール期間
------+------------+------------
 支店 |  2,168,062 |  1,344,994
 本店 |    906,981 |    563,499
(2 rows)
</pre>
<li>psql に最後のサーバエラーを冗長に表示する errverbose コマンドが追加されました。  (Alex Shulgin) (9.6)</li>
<p>
本コマンドで予期せぬエラーを受けた後から VERBOSITY変数を verbose 設定したのと同様のエラーメッセージを取得できます。以下のように動作します。
</p>
<pre>
db1=# SELECT * FROM t1;
ERROR:  relation "t1" does not exist
LINE 1: SELECT * FROM t1;
                      ^
db1=# errverbose
ERROR:  42P01: relation "t1" does not exist
LINE 1: SELECT * FROM t1;
                      ^
LOCATION:  parserOpenTable, parse_relation.c:1159
</pre>
<li>psql にビュー定義を編集、参照する evコマンド、svコマンド が追加されました。  (Petr Korobeinikov) (9.6)</li>
<p>
関数における ef コマンド、sf コマンドとの相似になっています。
</p>
<li>psql に gexec コマンドが追加されました。  (Corey Huinker) (9.6)</li>
<p>
前回の問い合わせ結果を新たな問い合わせとして実行します。以下のように使用することができます。
</p>
<pre>
db1=# SELECT format('DROP TABLE %I', table_name)
      FROM information_schema.tables WHERE table_schema = 'public';
           format
-----------------------------
 DROP TABLE pgbench_history
 DROP TABLE pgbench_tellers
 DROP TABLE pgbench_branches
 DROP TABLE pgbench_accounts
(4 rows)

db1=# gexec
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
</pre>
<li>psql で C コマンドと一貫性を持たせるため、「pset C 文字列」にて「pset title 文字列」と同様にテーブルタイトルを設定できるようになりました。  (Bruce Momjian) (9.6)</li>
<li>psql の pset expanded auto モードで、1列だけの問い合わせ結果には、たとえ出力が画面幅より広くとも、拡張形式を使わないようになりました。  (Andreas Karlsson, Robert Haas) (9.6)</li>
<li>psql の watch コマンドによるヘッダ出力が改善されました。  (Michael Paquier, Tom Lane) (9.6)</li>
<p>
設定されていたなら pset title の文字列を含むようになります。タイムスタンプになるヘッダの前段部分が短くなりました。また、タイムスペースフォーマットが psql のロケール環境に従うようになりました。
</p>
<pre>
(出力例)
$ LANG=ja_JP.UTF-8 psql -q db1
db1=# pset title my_watch_title
Title is "my_watch_title".
db1=# SELECT random();
  my_watch_title
      random
-------------------
 0.643378943670541
(1 row)

db1=# watch 5
my_watch_title  2016年09月13日 13時53分34秒 (every 5s)

      random
-------------------
 0.167425051797181
(1 row)
</pre>
<li>現在行だけでなく入力された問い合わせ全体を考慮するように Tab補完ロジックが改善されました。  (Tom Lane) (9.6)</li>
<p>
これまでは複数行に分かれたコマンドでは、前の行を見なければいけないTab補完規則が無効になっていました。
</p>
<pre>
(9.6 では以下のように複数行でも Tab補完が効きます)
db1=# SELECT * FROM pg_user
db1-# WHERE u
usebypassrls  usecreatedb   userepl       usesysid
useconfig     usename       usesuper
</pre>
<li>psql の Tab補完に様々な細かな改善が適用されました。  (Peter Eisentraut, Vik Fearing, Kevin Grittner, Kyotaro Horiguchi, Jeff Janes, Andreas Karlsson, Fujii Masao, Thomas Munro, Masahiko Sawada, Pavel Stehule) (9.6)</li>
<p>
CREATE SEQUENCE、 CREATE LABEL、 CREATE/DROP INDEX CONCURRENTLY、CREATE EXTENSION、 GRANT / REVOKE、 COPY、 REFRESH MATERIALIZED VIEW、ALTER .. SET/RESET、 CREATE/ALTER FOREIGN DATA WRAPPER、CREATE/ALTER SERVER、 CREATE/ALTER USER MAPPING の Tab補完が修正されています。
</p>
<li>psql の特別変数 PROMPT に接続先バックエンドのプロセスID が挿入されるオプション %p が追加されました。  (Julien Rouhaud) (9.6)</li>
<li>常に、あるいは、非エラーメッセージに限って、メッセージの CONTEXT欄を表示しないようにできるようになりました。  (Pavel Stehule) (9.6)</li>
<p>
エラー時にのみ CONTEXT欄を表示するのが現在のデフォルトの振る舞いです。特別変数 SHOW_CONTEXT を設定することで、これを変更できるようになりました。
</p>
<li>psql の df+ が関数アクセス権限とパラレル安全性属性を表示するようになりました。  (Michael Paquier) (9.6)</li>
</ul>
<h5 class="marked">pgbench</h5>
<ul>
<li>pgbenchスクリプト内のSQLコマンドは改行ではなく、セミコロン(;)で終える仕様になりました。  (Kyotaro Horiguchi, Tom Lane) (9.6)</li>
<p>
本変更によりスクリプトに複数行からなる SQLコマンドを記述できます。既存の pgbenchスクリプトは行末にセミコロンが無ければ加える修正が必要です。なお、各行の SQLコマンドがセミコロンで終了していても旧来バージョンで動作します。
</p>
<li>pgbench のバックスラッシュコマンドの式でいくつかのビルトイン関数、および、浮動小数点演算に対応しました。  (Fabien Coelho) (9.6)</li>
<p>
ビルトイン関数は pgbenchスクリプトのバックスラッシュコマンド専用のもので、同名のSQL関数とは別物です（例えば random() は 2引数を取り整数を返します）。様々な乱数生成に役立つ関数、任意メッセージ出力をする関数が含まれます。
</p>
<li>pgbenchスクリプトで setrandom が廃止されました。ビルトイン関数で置き換えられます。  (Fabien Coelho) (9.6)</li>
<p>
新たなビルトイン関数に random()、random_exponential()、random_gaussian() が含まれ、setrandom と同様のことができます。複雑な式に埋め込むことができることから、より使いやすくなっています。
</p>
<pre>
(9.5.x までの書き方例)
setrandom rid 1 10000
setrandom slp 1 10 exponential 3.0
sleep :slp ms
UPDATE t1 SET ts = now() WHERE id = :rid ;

(9.6.x からの書き方例)
set rid random(1, 10000)
set slp random_exponential(1, 10, 3.0)
sleep :slp ms
UPDATE t1 SET ts = now() WHERE id = :rid ;
</pre>
<li>pgbench でカスタムスクリプトだけでなく、ビルトインスクリプトの複数コピーを実行できるようになりました。  (Fabien Coelho) (9.6)</li>
<p>
新たな -b オプションで以下のようにビルトインスクリプトをカスタムスクリプトのように複数指定することができます。-b では tpcb-like、select-only、simple-update の三種類が指定できます。
</p>
<pre>
$ pgbench -n -c 10 -t 500 -b tpcb-like -b select-only -b simple-update 
          -f custom_script1.sql -f custom_script2.sql db1
</pre>
<li>pgbench でスクリプトの選択率(重みづけ)を調整できるようになりました。  (Fabien Coelho) (9.6)</li>
<p>
複数のスクリプトが指定されているとき、各pgbench トランザクションは実行するものをランダムに一つを選択します。これまでは常に均一な確率でしたが、これからは各々に異なる選択率を指定できます。
</p>
<p>
以下のように -f、-b オプションの後に @数値 で重みづけを指定します。
</p>
<pre>
(二つのビルトインスクリプトは 1対9 の割合で実行されます)
$ pgbench -n -c 10 -t 50 -b tpcb-like@1 -b select-only@9 db1

(二つのカスタムスクリプトは 15対85 の割合で実行されます)
$ pgbench -n -c 10 -t 50 -f script1.sql@15 -f script2.sql@85 db1
</pre>
<li>pgbench で複数のスクリプトを走らせているとき、各スクリプトの統計を集めるようになりました。  (Fabien Coelho) (9.6)</li>
<p>
以下のようにスクリプト毎の報告を得ることができます。
</p>
<pre>
$ pgbench -c 5 -t 10 -n -f script1.sql -f script2.sql db1
transaction type: multiple scripts
scaling factor: 1
query mode: simple
number of clients: 5
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 50/50
latency average: 0.000 ms
tps = 221.703928 (including connections establishing)
tps = 227.219227 (excluding connections establishing)
SQL script 1: script1.sql
 - weight = 1 (targets 50.0% of total)
 - 25 transactions (50.0% of total, tps = 110.851964)
 - latency average = 16.467 ms
 - latency stddev = 4.817 ms
SQL script 2: script2.sql
 - weight = 1 (targets 50.0% of total)
 - 25 transactions (50.0% of total, tps = 110.851964)
 - latency average = 17.521 ms
 - latency stddev = 3.022 ms
</pre>
<li>pgbench に 開始時からの時間ではなく Unixエポックタイムスタンプで進捗を報告する --progress-timestamp オプションが追加されました。  (Fabien Coelho) (9.6)</li>
<li>pgbench でクラアント接続数 (-c) がスレッド数 (-j) の正確な倍数でなくてもよくなりました。  (Fabien Coelho) (9.6)</li>
<p>
クライアント接続数はできる限り各スレッドに等分されるという振る舞いになります。
</p>
<li>pgbench で -T オプションが使われたとき、指定時点で強制停止するようになりました。  (Fabien Coelho) (9.6)</li>
<p>
これまでは、低いトランザクションレートが指定されていると、指定時点よりも大幅に長く待つことがありました。
</p>
</ul>
<h4 class="marked">サーバアプリケーション</h4>
<ul>
<li>initdb の post-bootstrap 処理段階におけるエラー報告が改善されました。  (Tom Lane) (9.6)</li>
<p>
これまでは、エラーが起きたところで、入力ファイル全体が失敗したクエリとして報告されました。これからは、当該のクエリだけが報告されます。この望ましい振る舞いを得るため、initdb の入力ファイルのクエリが空行で区切られました。
</p>
<li>一つのスタンドアローンバックエンドセッションを全ての post-bootstrap処理段階のために使うことで、initdb が高速化しました。  (Tom Lane) (9.6)</li>
<p>
これまでは initdb の各サブルーチンがそれぞれスタンドアローンのバックエンドセッションを起動しており、この無駄を削減します。
</p>
<li>ターゲットタイムラインが変わったときでも動作するようにpg_rewind が改良されました。  (Alexander Korotkov) (9.6)</li>
<p>
これにより、例えば、昇格したスタンバイを旧マスタのタイムラインの状態に巻き戻すことができます。
</p>
</ul>
<h4 class="marked">ソースコード</h4>
<ul>
<li>旧式の heap_formtuple/heap_modifytuple/heap_deformtuple 関数(内部関数) が削除されました。  (Peter Geoghegan) (9.6)</li>
<li>AllocSetContextCreate() をシンプルかつ安全に実行するマクロが追加されました。  (Tom Lane) (9.6)</li>
<p>
新たなマクロ ALLOCSET_DEFAULT_SIZES、ALLOCSET_SMALL_SIZES、ALLOCSET_START_SMALL_SIZES を使う方が推奨され、あるメモリコンテキストに対して個々にサイズ引数を記述することは、今後は非推奨となります。
</p>
<p>
しかしながら、既存コードは未だ全て置き換えられていません。
</p>
<li>ヘッダファイル内では無条件で static inline 関数を使うようになりました。  (Andres Freund) (9.6)</li>
<p>
この書き方の変更により開発者がインライン関数をより容易に使うことができます。非常に古いコンパイラでは警告、および/または、無駄なコードスペースが生じるかもしれません。
</p>
<li>TAPテスト基盤が改良されました。  (Michael Paquier, Craig Ringer, &Aacute;lvaro Herrera, Stephen Frost) (9.6)</li>
<p>
TAPテストの枠組みでリカバリシナリオをテストできるようになったほか、様々な改修が適用されています。
</p>
<li>trace_lwlocks = on のとき、各ロックを名前で識別するようになりました。  (Robert Haas) (9.6)</li>
<p>
なお、trace_lwlocks は、コンパイル時にLOCK_DEBUGマクロが定義された場合に使用できる、以前から存在する開発者むけ設定パラメータです。
</p>
<li>psql のTab補完コードの基盤が改良されました。  (Thomas Munro, Michael Paquier) (9.6)</li>
<p>
Tab補完規則がかなり書きやすくなり、また、コンパクトになりました。
</p>
<li>pg_shseclabel が接続認証のアクセスで利用可能になるように、システムカタログ pg_shseclabel を RelationCache に持つようになりました。  (Adam Brightwell) (9.6)</li>
<p>
本体コードは pg_shseclabel を認証に使いませんが、authentication_hook を使う拡張モジュールで参照したいかもしれません。
</p>
<li>インデックスアクセスメソッド(AM) API が C言語レベルの大部分を隠すように再構成されました。  (Alexander Korotkov, Andrew Gierth) (9.6)</li>
<p>
インデックスAM API が、外部データラッパーやテーブルサンプルハンドラに採用している、必要な関数が列挙された構造体を使うデザインになりました。これにより、Cコードがシンプルになり、拡張モジュールとしてインデックスAMを定義することがより現実的となります。
</p>
<p>
結果として、システムカタログpg_am の多くのカラムが廃止されました。これまで pg_am に在ったインデックスAMの属性をSQL問い合わせで調べることができる新たなシステムカタログ情報関数がいくつか追加されました。
</p>
<li>システムカタログ pg_init_privs が追加されました。initdb や 拡張モジュール導入で作られるオブジェクトの当初の権限を保持します。  (Stephen Frost) (9.6)</li>
<p>
これにより pg_dump がシステムオブジェクトの権限を変えている場合について、変更差分をダンプすることができます。これまで、このような変更はダンプとリロードで失われていましたが、今後は維持されます。
</p>
<li>拡張モジュールがカスタムLWLock を割り当てる方法が変更されました。  (Amit Kapila, Robert Haas) (9.6)</li>
<p>
RequestAddinLWLocks() 関数は削除され、RequestNamedLWLockTranche() 関数で置き換えられます。これにより、カスタムLWLock の識別が改善され、間違いが起こりにくくなります。
</p>
<li>複数セッションが同時待機できるように分離テスターが改良され、デッドロックシナリオのテストができるようになりました。  (Robert Haas) (9.6)</li>
<li>拡張可能なノードタイプが導入されました。  (KaiGai Kohei) (9.6)</li>
<p>
これにより、FDW（外部データラッパ）やカスタムスキャン作成者は、これまでよりも便利な形式でプランツリーにデータを格納できます。
</p>
<li>プランナが post-scan/join クエリ段階で、多数のアドホックなロジックに代えて、Path の生成・比較によって処理するようになりました。  (Tom Lane) (9.6)</li>
<p>現時点では本変更で得られるユーザから見える改善は僅かです。しかし、古いコード構造上の取り組みでは現実的でなかった、将来の多数の上位プランナ改良を有効にします。
</p>
<li>部分的な集約に対応しました。  (David Rowley, Simon Riggs) (9.6)</li>
<p>
本変更で集約関数を分割して計算できるようになります。例えば、複数のパラレルワーカープロセスが協調して一つの集約を計算できます。
</p>
<li>汎用コマンド進捗報告の基盤が追加されました。  (Vinayak Pokale, Rahila Syed, Amit Langote, Robert Haas) (9.6)</li>
<p>
VACUUMコマンドの進捗表示に本枠組みが使われています。
</p>
<li>psql の flex 字句解析器が他のクライアントプログラムから使えるように切り出しされました。  (Tom Lane, Kyotaro Horiguchi) (9.6)</li>
<p>
これにより、コマンド境界を識別できるだけの SQLコマンド解析を要するプログラムからコード重複を削減します。
</p>
<p>
新たなソースコードサブディレクトリ src/fe_utils が作られ、クライアントプログラムで共用されるコードが含まれます。これまでは、シンボリックリンクやビルド時のソースファイルコピーでコード共有を実現していました。
</p>
<li>通常は一つの待機から次に変化しないイベントセットを効率的に待機できるwaitEventSet API が 導入されました。  (Andres Freund, Amit Kapila) (9.6)</li>
<li>WALレコードを書き込む汎用インタフェースが追加されました。  (Alexander Korotkov, Petr Jel&iacute;nek, Markus Nullmeier) (9.6)</li>
<p>
これにより、拡張モジュールがページ変更内容を標準形式にて WALレコードに書くことができます。拡張モジュールにアクセスすることなしにWAL再生しなければいけない問題には、汎用再生コードで対応します。
</p>
<p>
これにより、拡張モジュールで WAL書き込み対応した新たなインデックスアクセスメソッドを実装することができます。
</p>
<li>ロジカルデコーディングむけに汎用WALメッセージがサポートされました。  (Petr Jel&iacute;nek, Andres Freund) (9.6)</li>
<p>
この機能により、拡張モジュールが WAL に任意データを書き込み、ロジカルデコーディングプラグインから読ませることができます。これを実現する pg_logical_emit_message() 関数が追加されました。
</p>
<p>
なお、この汎用WALメッセージは物理データのリカバリには関係しません。
</p>
<li>SP-GiST演算子クラスがインデックスを下るときに任意の横断値(traversalValue)を格納できるようになりました。  (Alexander Lebedev, Teodor Sigaev) (9.6)</li>
<p>
従来からある再構築された値(reconstructedValue)と似ていますが、traversalValue は任意の量のデータを置けてインデックス列とデータ型が同じである必要もありません。
</p>
<li>ereport() に LOG_SERVER_ONLY メッセージレベルが追加されました。  (David Steele) (9.6)</li>
<p>
本レベルはメッセージが決してクライアントに送られない点を除き、LOG のように動作します。監査等の用途で使うためのものです。
</p>
<li>全ての生成されるヘッダファイルをビルドする Makefileターゲットsubmake-generated-headers が用意されました。  (Michael Paquier, Tom Lane) (9.6)</li>
<p>
これは単独でビルドされるかもしれないサブディレクトリで便利です。
</p>
<li>OpenSSL 1.1.0 がサポートされました。  (Andreas Karlsson, Heikki Linnakangas) (9.6)</li>
</ul>
<h4 class="marked">追加モジュール</h4>
<ul>
<li>contrib/auto_explain に設定パラメータ auto_explain.sample_rate が追加されました。  (Craig Ringer, Julien Rouhaud) (9.6)</li>
<p>
問い合わせのうち設定した割合だけを捕捉するようにできます。これにより、平均的には有用な情報が採取できる一方、問い合わせ量が多いときのオーバーヘッドを軽減できます。
</p>
<li>ブルームフィルタに基づくインデックスアクセスメソッドを実装するcontrib/bloom 拡張モジュールが追加されました。  (Teodor Sigaev, Alexander Korotkov) (9.6)</li>
<p>
これは主として、標準で含まれないインデックスアクセスメソッドを追加することの概念実証のためのものです。しかしながら、多数の列を検索する問い合わせには、本インデックスの機能自体が役立つかもしれません。
</p>
<li>contrib/cube でcube型のための距離演算子が追加されました。  (Stas Kelvich) (9.6)</li>
<p>
cube型列へのGiSTインデックスでの k最近傍(kNN)検索もサポートされました。
</p>
<li>contrib/hstore の hstore_to_jsonb_loose()関数と hstore_to_json_loose()関数が、何が数値かについて一致するようになりました。  (Tom Lane) (9.6)</li>
<p>
これまでは、hstore_to_jsonb_loose() は数値に見える文字列を、たとえ JSON の数値の文法仕様に正確には一致していなくとも JSON の数値に変換していました。
</p>
<p>
hstore_to_jsonb_loose() の振る舞いが修正され、hstore_to_json_loose() と一致するようになりました。互換性のない変更点と言えます。
</p>
<pre>
(9.5.x での動作)
db1=# SELECT hstore_to_jsonb_loose('a=&gt;-01'::hstore);
 hstore_to_jsonb_loose
-----------------------
 {"a": -1}
(1 row)

db1=# SELECT hstore_to_json_loose('a=&gt;-01'::hstore);
 hstore_to_json_loose
----------------------
 {"a": "-01"}
(1 row)

(9.6 での動作)
db1=# SELECT hstore_to_jsonb_loose('a=&gt;-01'::hstore);
 hstore_to_jsonb_loose
-----------------------
 {"a": "-01"}
(1 row)
</pre>
<li>contrib/intarray にて、配列要素の重なりを判定する演算子を使う問い合わせのプランを改善するため、選択度を見積もる関数が追加されました。  (Yury Zhuravlev, Alexander Korotkov) (9.6)</li>
<li>contrib/pageinspect の heap_page_items() 関数が各タプルの生データを表示するようになりました。  (Nikolay Shaplov) (9.6)</li>
<p>
heap_page_items() 関数の出力に t_dataカラムが追加されています。また、個別のタプルフィールドを調べるための新たな関数 tuple_data_split()、heap_page_item_attrs() が追加されました。
</p>
<pre>
(3カラムを持つ t1 テーブルのタプル生データをフィールド区切り付きで出力する例)

db1=# SELECT * FROM heap_page_item_attrs(get_raw_page('t1',0), 't1');
 lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid |                                 t_attrs
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------+-------------------------------------------------------------------------
  1 |   8144 |        1 |     48 |  31720 |      0 |        0 | (0,1)  |           3 |       2050 |     24 |        |       | {"\x01000000","\x0d48454c4c4f","\xc08a627ffcde0100"}
  2 |   8088 |        1 |     56 |  31721 |      0 |        0 | (0,2)  |           3 |       2050 |     24 |        |       | {"\x02000000","\x1d5468697320697320546573742e","\xc09cdc7ffcde0100"}
(2 rows)
</pre>
<li>contrib/pgcrypto の pgp_sym_encrypt() 関数に S2Kイテレーションカウントのオプションパラメータが追加されました。  (Jeff Janes) (9.6)</li>
<li>contrib/pg_trgm が単語類似度に対応し、新たな関数と演算子が追加されました。  (Alexander Korotkov, Artur Zakirov) (9.6)</li>
<p>
ある文字列と、複数語を含む文字列の中の最も類似した単語との類似度を返します。
</p>
<li>contrib/pg_trgm の類似度閾値を指定する設定パラメータpg_trgm.similarity_threshold が追加されました。  (Artur Zakirov) (9.6)</li>
<p>
この閾値はこれまでも調整可能でしたが、専用の関数 set_limit()、show_limit()を使って指定するものとなっていました。これらの関数は今後は非推奨となります。
</p>
<li>contrib/pg_trgm の GIN 演算子クラスが、よくあるキーと稀なキーが両方あらわれる場合にインデックス検索が性能向上するように改善されました。  (Jeff Janes) (9.6)</li>
<li>contrib/pg_trgm の GIN インデックスで類似度検索の性能が改善されました。  (Christophe Fornaroli) (9.6)</li>
<li>テーブルのビジビリティマップを調査する contrib/pg_visibility 拡張モジュールが追加されました。  (Robert Haas) (9.6)</li>
<p>
既存のビジビリティマップを破棄する関数も含まれています。
</p>
<li>contrib/sslinfo に ssl_extension_info() 関数が追加されました。  (Dmitry Voronin) (9.6)</li>
<p>
現在の接続にある X509クライアント証明書の拡張情報（拡張名、値、クリティカルであるか）を出力します。
</p>
</ul>
<h5 class="marked">postgres_fdw</h5>
<ul>
<li>外部サーバのオプションにホワイトリストとして拡張モジュールを指定することで、拡張モジュールで提供される関数や演算子もリモート実行できるようになりました。  (Paul Ramsey) (9.6)</li>
<p>
以下に pgcrypto の関数をリモートで実行させる例を示します。
</p>
<pre>
(両サーバに pgcrypto を導入)
remote=# CREATE EXTENSION pgcrypto;
local=# CREATE EXTENSION pgcrypto;

(デフォルトではローカルで関数を実行するプランになる)
local=# explain SELECT id FROM remote.t1 WHERE digest(c1, 'sha1') = 'xbd564db5d5cc358eb0e3523d3e03041739f230d5';
                                         QUERY PLAN                             
--------------------------------------------------------------------------------------------
 Foreign Scan on t1  (cost=100.00..212.38 rows=15 width=4)
   Filter: (digest(c1, 'sha1'::text) = 'xbd564db5d5cc358eb0e3523d3e03041739f230d5'::bytea)
(2 rows)

(サーバオプションに指定を追加)
local=# ALTER SERVER server1 OPTIONS (ADD extensions 'pgcrypto');

(リモートで関数を実行するプランになる)
local=# explain SELECT id FROM remote.t1 WHERE digest(c1, 'sha1') = 'xbd564db5d5cc358eb0e3523d3e03041739f230d5';
                        QUERY PLAN
-----------------------------------------------------------
 Foreign Scan on t1  (cost=100.00..154.18 rows=15 width=4)
(1 row)
</pre>
<li>リモートサーバでのソートを考慮するようになりました。  (Ashutosh Bapat) (9.6)</li>
<p>
これまではリモートサーバ側のみでソートできる場合でも、ローカルでソートが行われていました。
</p>
<li>リモートサーバでの結合を考慮するようになりました。  (Shigeru Hanada, Ashutosh Bapat) (9.6)</li>
<p>
これまでは同一リモートサーバ上のリモートテーブル同士の結合であっても、テーブル毎に SELECT を実行して、ローカルで結合処理を行っていました。9.6 では可能であればテーブル結合をリモートサーバ上で行います。
</p>
<li>可能なときには UPDATE や DELETE を完全にリモートサーバ側だけで実行するようになりました。  (Etsuro Fujita) (9.6)</li>
<p>
これまでは、リモート更新は SELECT ... FOR UPDATE コマンドの送信をして、選択された行を一つずつ更新したり削除する必要がありました。何らかローカル処理が必要な場合には依然として上記の手順が必要ですが、そうでなければリモートだけで実行します。
</p>
<pre>
(これはリモート側で単に下記の通りの SQL が実行されます)
DELETE FROM remote_table WHERE id IN (101, 102, 103);

(これはローカルデータを参照するので SELECT ... FOR UPDATE と 1行ずつの DELETE が必要です)
DELETE FROM remote_table WHERE id IN (SELECT id FROM local_table);
</pre>
<li>サーバオプションやテーブルオプションでフェッチサイズ(1回のデータ取得サイズ)を指定できるようになりました。  (Corey Huinker) (9.6)</li>
<p>
これまではリモート問い合わせで常に1回に100行ずつ取得していましたが、調整可能になります。
</p>
<li>複数ローカルユーザが単一のリモートユーザにマップされているときに、単一の外部サーバ接続を再利用するようになりました。  (Ashutosh Bapat) (9.6)</li>
<p>
なお、当然のことながら、一つのローカルセッション内での再利用となります。
</p>
<li>リモートサーバに問い合わせキャンセルを伝播させるようになりました。  (Michael Paquier) (9.6)</li>
<p>
これまではローカルで問い合わせキャンセルの指令を受けても、既に送信したリモート問い合わせに対しては何もしませんでした。
</p>
</ul>
</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
