<?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 15.8 &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/tag/postgresql-15-8/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>Fri, 30 Oct 2026 08:33:59 +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 15.8 &#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 15.9 に関する技術情報</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/15-9/</link>
		
		<dc:creator><![CDATA[データベース技術グループ]]></dc:creator>
		<pubDate>Wed, 18 Dec 2024 05:13:31 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 15]]></category>
		<category><![CDATA[PostgreSQL 15.8]]></category>
		<category><![CDATA[PostgreSQL 15.9]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=15875</guid>

					<description><![CDATA[このリリースは 15.8 からの修正リリース（2024年 11月 14日リリース）です。 15.X からのアップデートではダンプ、リストアは不要です。 ただし、インデックス破損を引き起こす障害の修正が含まれるため、インデ ...]]></description>
										<content:encoded><![CDATA[<p>このリリースは 15.8 からの修正リリース（2024年 11月 14日リリース）です。<br />
15.X からのアップデートではダンプ、リストアは不要です。</p>
<p>ただし、インデックス破損を引き起こす障害の修正が含まれるため、インデックス再作成を行うことが望ましいです。<br />
また、15.7 よりも前のバージョンからアップデートする場合には、<a href="/tech-blog/pgsql/15-7/" rel="noopener">15.7 のリリース情報</a>も参照してください。</p>
<p><span id="more-15875"></span></p>
<h3>PostgreSQL 15.8 から 15.9 への変更点</h3>
<p>17.1、16.5、15.9、14.14、13.17、12.21 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。</p>
<ol>
<li>サブクエリなどトップレベル以外でのテーブル参照時に行単位セキュリティのポリシーが設定されている場合、クエリを実行したユーザの権限を無視して実行計画が不適切に使い回される可能性があり、修正されました。(Nathan Bossart) (17)(16)(15)(14)(13)(12)</li>
<p>
トップレベル以外のテーブルの参照（例えば、 CTE 、サブクエリ、 security_invoker属性が true の ビュー、SQL で作成した関数によるテーブルの参照などがこれに該当します）において、 セキュリティポリシーの設定されたテーブルを参照する場合、その実行計画がクエリを実行したロールに依存することを記録していませんでした。これにより、あるユーザの権限の元で作成したプランを、同一セッションで別の権限のユーザが実行すると、本来出力すべき行が出力されない、あるいは逆に出力すべきでない行が出力されてしまう可能性がありました。(CVE-2024-10976)
</p>
<li>SSL、GSS のネゴシエーション中に libpq が受け取ったエラーメッセージを破棄するように修正されました。(Jacob Champion) (17)(16)(15)(14)(13)(12)</li>
<p>
暗号化のネゴシエーションが完了する前に libpq が受け取ったエラーメッセージはそのまま出力していたため、中間者攻撃によって利用される恐れがありました。これにより、エラーメッセージをあたかもクエリの結果であるかのように見せかけるなどの攻撃が可能になっていました。(CVE-2024-10977)
</p>
<li>SET SESSION AUTHORIZATION と SET ROLE の間の意図しない相互作用が修正されました。(Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
SQL標準では、SET SESSION AUTHORIZATION が副作用として SET ROLE NONE を実行することを要求していますが、この実装に問題があり、意図しない相互作用が発生していました。特に SET SESSION AUTHORIZATION を実行したトランザクションをロールバックすると、元々のロールが NONE でない場合でも NONE に変更されてしまい、ユーザーID がトランザクション開始前と変わってしまう可能性がありました。また、関数内の SET句で一時的に session_authorization を設定すると、同様の影響がありました。関連するバグとして、パラレルワーカーに対して current_setting('role') を実行すると、正しいロールではなく none を返してしまう問題がありました。(CVE-2024-10978)
</p>
<li>「信頼されたPL/Perl (plperl)」のコードが環境変数を変更できないよう修正されました。(Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
PATH のようなプロセスの環境変数を操作可能であることは、攻撃者に任意のコードを実行される機会を与えることになります。このため、「信頼されたPL/Perl」はそのような能力を与えてはいけませんでした。環境変数の変更を warningメッセージとともに拒否する tied hash で %ENV を置き換える修正がされました。「信頼されないPL/perl (plperlu)」は、今までどおり環境変数を変更することも可能です。(CVE-2024-10979)
</p>
<li>ATTACH/DETACH PARTIION を実行する際に、外部キー制約に関するカタログの更新が正しく行われるよう修正されました。 (Jehan-Guillaume de Rorthais, Tender Wang, Alvaro Herrera) (17)(16)(15)(14)(13)</li>
<p>
参照先テーブルがパーティションテーブルの場合、参照元テーブルがスタンドアローンのテーブルかパーティションテーブルかで、参照元テーブルに必要なカタログエントリが異なります。ATTACH/DETACH PARTITION コマンドは、このための変換を正しく行えていませんでした。特に、DETATCH PARTITION されてスタンドアローンのテーブルとなったテーブルには、外部キー制約トリガーが作成されていませんでした。このため、外部キー制約に違反する行が挿入されてしまう可能性がありました。また、DETACH PARTITION 後に再び ATTACH PARTITION を行った場合にも予期しないエラーで失敗することがありました。
</p>
<p>
この問題が発生してしまった場合、修正するには通常のテーブルに変更されたテーブルの不正な制約に対して ALTER TABLE DROP CONSTRAINT を実行し制約を削除した後、再度制約を追加します。もし制約の再追加が失敗した場合は、誤ったデータが挿入されている可能性があります。その場合は参照元テーブルと参照先テーブル間で一貫性を手動で再度確立し、その後制約を再度追加する必要があります。
</p>
<p>
不正な制約と、正しい制約を追加するためのコマンドは、以下のクエリを実行して生成できます。
</p>
<pre>SELECT conrelid::pg_catalog.regclass AS "constrained table",
       conname AS constraint,
       confrelid::pg_catalog.regclass AS "references",
       pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
                         conrelid::pg_catalog.regclass, conname) AS "drop",
       pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
                         conrelid::pg_catalog.regclass, conname,
                         pg_catalog.pg_get_constraintdef(oid)) AS "add"
FROM pg_catalog.pg_constraint c
WHERE contype = 'f' AND conparentid = 0 AND
   (SELECT count(*) FROM pg_catalog.pg_constraint c2
    WHERE c2.conparentid = c.oid) &lt;&gt;
   (SELECT count(*) FROM pg_catalog.pg_inherits i
    WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
      EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
              WHERE partrelid = i.inhparent));
</pre>
<p>
ADD CONSTRAINT ステップは失敗する可能性があるため、上記のクエリの出力結果をファイルに保存し、各ステップごとに実行してください。
</p>
<li>LC_COLLATE が LC_CTYPE と異なる場合の C ロケールの判定が修正されました。 (Jeff Davis) (17)</li>
<p>
デフォルトの照合順序プロバイダとして libc を使用している場合、照合順序に C ロケールが使用されているかどうかを確認するテストでLC_COLLATE ではなく LC_CTYPE が誤ってチェックされていました。
</p>
<p>
これらの設定が同じである一般的なケースや、両方が C（またはそのエイリアスの POSIX）ではない場合には影響しません。しかし、LC_CTYPEが C で、LC_COLLATE が他のロケールである場合、誤った問い合わせ結果が発生し、文字列のインデックスが破損する可能性がありました。 このような設定を持つデータベースのユーザは、このアップデートをインストールした後、影響を受けるインデックスを再作成する必要があります。逆のケースで LC_COLLATE が C で、LC_CTYPE が他のロケールである場合、性能が低下しますが、実際のエラーは発生しませんでした。
</p>
<li>キー列の問い合わせの照合順序がパーティションキーの照合順序と一致しない場合は、パーティション同士の結合やグループ化を使用しないようになりました。 (Jian He, Webbo Han) (17)(16)(15)(14)(13)(12)</li>
<p>
問い合わせ内のキー列が登場する箇所に COLLATE句でパーティション定義と異なる照合順序を指定している場合に該当する可能性があります。このような実行計画では、誤った問い合わせ結果が生じる可能性がありました。
</p>
<li>NOT NULL 列の IS NULL 検査を FALSE 定数に変換した後のプランナの障害が回避されました。 (Richard Guo) (17)</li>
<p>
このバグは典型的には「ERROR: variable not found in subplan target lists」などのエラーを引き起こしました。
</p>
<li>引数に特定の配列関連の構造が含まれる SQL 関数をインライン化する際にプランナがクラッシュする可能性が回避されました。 (Tom Lane, Nathan Bossart) (17)</li>
<pre>（add は SQL言語の単純なユーザ定義関数）
db=# SELECT add(array_length(array_agg(i)::numeric[],1)::integer) FROM n;
</pre>
<p>バグ報告されたのは以下のようなユーザ定義SQL関数の呼び出しでした。</p>
<li>MERGE ... WHEN NOT MATCHED BY SOURCE アクションの誤った応答、または、「ERROR: wrong varnullingrels ...」が発生する可能性があり、修正されました。 (Dean Rasheed) (17)</li>
<p>
本障害で誤った問い合わせ結果が生じる可能性がありました。
</p>
<pre>（17.0 ではエラーになる使用法）
CREATE TABLE t (a int);
INSERT INTO t VALUES(1), (2);
CREATE VIEW v AS SELECT a FROM t WHERE EXISTS (SELECT 1 FROM t);

MERGE INTO v USING (SELECT * FROM generate_series(1,1)) AS s(a)
  ON s.a = v.a WHEN NOT MATCHED BY SOURCE THEN DELETE;

(発生していたエラー)
ERROR:  XX000: wrong varnullingrels (b) (expected (b 4)) for Var 5/1
LOCATION:  search_indexed_tlist_for_var, setrefs.c:2847
</pre>
<li>UNION ALL メンバーの問い合わせ出力をソートする必要があり、ソート列が式である場合に発生する可能性があった「ERROR: could not find pathkey item to sort」エラーが修正されました。 (Andrei Lepikhov, Tom Lane) (17)(16)(15)(14)(13)</li>
<li>B-tree の ScalarArrayOp を使うインデックススキャンでの稀な不具合が修正されました。 (Peter Geoghegan) (17)</li>
<p>
この種の実行プランを持つスクロール可能なカーソルが開始点まで巻き戻され、その後再び前方に実行された場合、誤った問い合わせ結果が生じる可能性がありました。
</p>
<p>
ScalarArrayOp は「indexed_col IN (1,2,3) や indexed_col = ANY ('{1,2,3}'::int[]) のような検索条件で使われます。
</p>
<li>問い合わせが「DO INSTEAD NOTIFY」の RULE によって書き換えられた場合に発生する「COPY (query) TO ...」でのアサート失敗や紛らわしいエラーメッセージ（「ERROR: COPY query must have a RETURNING clause」）が修正されました。 (Tender Wang, Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<li>COPY の FORCE_NOT_NULL および FORCE_NULL オプションの検証が修正されました。 (Joel Jacobson) (17)</li>
<p>
誤った指定は適切に拒否されるようになりました。これまでは、COPY TO に対する FORCE_NULL、CSV以外の形式に対する FORCE_QUOTE などの、意味をなさない指定でもエラーになりませんでした。
</p>
<li>json_objectagg() 呼び出しに VOLATILE 関数が含まれている場合に発生するバックエンドプロセスのクラッシュが修正されました。 (Amit Langote) (17)(16)</li>
<li>並列ハッシュ結合中の偏ったデータの検出が修正されました。 (Thomas Munro) (17)(16)(15)(14)(13)(12)</li>
<p>
1つのパーティションにタプルが蓄積されすぎたため、ハッシュ結合の内側を再パーティショニングした後、パーティションのすべてのタプルが同じ子パーティションに入っているかどうかを確認します。 これは、すべてのタプルが同じハッシュ値を持っていることを示し、さらに再パーティションしても状況は改善されません。このチェックは場合によっては機能せず、無駄な再パーティショニングが繰り返され、最終的には（メモリ不足、ディスク領域不足などの）リソース枯渇エラーに至っていました。
</p>
<li>ALTER DATABASE SET を使用して、default_text_search_config などのサーチパスに基づく検索を必要とする設定パラメータを指定した時に発生していたクラッシュが、回避されました。 (Jeff Davis) (17)</li>
<li>パーティションテーブルに新しいインデックスを作成するときに、opclasses と照合順序の繰り返し検索が回避されました。 (Tom Lane) (17)</li>
<p>
これは主として一部の検索が制限された search_path で実行されたことにより、CREATE INDEX コマンドが pg_catalog 外のオブジェクトを参照した場合に予期せぬエラーを引き起こす問題がありました。この修正により、親パーティションインデックスのコメントが子インデックスにコピーされることも防止されます。
</p>
<p>
本障害で以下のようなメッセージが発生するケースが報告されました。
</p>
<pre>ERROR:  operator class "..._ops" does not exist for access method "..."
</pre>
<li>パーティションテーブルから、CREATE TABLE ... USING で指定された非組み込みアクセスメソッドへの、欠落した依存関係が追加されました。 (Michael Paquier) (17)</li>
<p>
アクセスメソッドに依存するテーブルが存在する場合、アクセスメソッドの削除はブロックされるべきですが、ブロックされていなかったため、その後に異常な動作が発生する可能性がありました。この修正は、この修正適用以降に作成されたパーティションテーブルの問題のみを防止することに注意してください。
</p>
<li>非 ASCII 文字を含むロケール名を許可しないようになりました。 (Thomas Munro) (17)(16)</li>
<p>
このようなロケール名は他の場所では使用されないため、これは Windows でのみ問題となります。 このような名前がどのようなエンコーディングで表現されるかが非常に不明確であるため、問題となります（ロケール自体が使用するエンコーディングを定義しているため）。最近のPostgreSQLのリリースでは、その混乱により Windows ランタイムライブラリでアボートが発生する可能性がありました。新しいエラーメッセージに遭遇した場合は、Windows Locale Builder を使用して ASCII のみの名前で新しい複製ロケールを作成するか、tr-TR のような BCP 47準拠のロケール名の使用を検討してください。
</p>
<li>serializable 分離レベルのトランザクションをコミットする際の競合状態が修正されました。 (Heikki Linnakangas) (17)(16)(15)(14)(13)(12)</li>
<p>
最近コミットされたトランザクションを誤って処理してしまい、アサート失敗、または「ERROR: could not access status of transaction」というエラーが発生する可能性がありました。
</p>
<li>2相コミットの状態を記録したファイルが残存してしまう COMMIT PREPARED の競合状態が修正されました。 (wuchengwen) (17)(16)(15)(14)(13)(12)</li>
<p>
並行する PREPARE TRANSACTION により、COMMIT PREPARED が完了したトランザクションについて、ディスク上の2フェーズコミットの状態を保持しているファイルを削除しない可能性がありました。すぐに悪影響が及ぶ可能性はありませんが、その後クラッシュが発生し、リカバリをすると「ERROR: could not access status of transaction」というエラーで失敗する可能性がありました。この場合、サービスを復元するためには残存したファイルを手動で削除する必要があります。
</p>
<li>VACUUM FULL 中に無効なトーストインデックスをスキップした後の無効なメモリアクセスが回避されるようになりました。 (Tender Wang) (17)(16)(15)(14)(13)(12)</li>
<p>
このコードパスでは、まだ再構築されていないインデックスを追跡するリストが適切に更新されなかったため、のちにアサート失敗やクラッシュが発生するリスクがありました。
</p>
<li>データを直接書き換える形で行われたカタログの更新が失われないよう修正されました。 (Tender Wang) (17)(16)(15)(14)(13)(12)</li>
<p>
通常の行更新では、トランザクションがロールバック可能なように、行の新しいバージョンが書き込まれます。ただし、特定のシステムカタログの更新は意図的にこのような形での更新は行わず、データを直接書き換えます。今回データを直接書き換える形での更新の効果が失われる可能性のある競合状態を修正されました。例えば、 pg_class.relhasindex をtrue に設定する更新が失われると、新しいインデックスの更新が妨げられ、それによりインデックスが破損する可能性がありました。
</p>
<li>リカバリの終了時にカタログキャッシュがリセットされるようになりました。 (Noah Misch) (17)(16)(15)(14)(13)(12)</li>
<p>
カタログキャッシュの古いデータを使用することで、データを直接書き換える形でのカタログの更新内容が失われないようになりました。
</p>
<li>割り込みを保留している間はパラレルクエリの使用を避けるようになりました。 (Francesco Degrassi, Noah Misch, Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
この状況は通常は発生しませんが、SQL 言語関数を B-tree サポートとして使用するなどのテストシナリオでは発生する可能性があります (これは実稼働環境での使用には遅すぎます)。発生した場合、無限に待機する可能性がありました。
</p>
<li>pg_cursors ビューに、まだ設定が完了していないポータルは含めないようになりました。 (Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
新しいカーソルの設定中に、このビューを検査するユーザー定義コードが呼び出される可能性があり、その場合、NULL ポインタの間接参照が発生します。設定が完了していないカーソルを除外するように pg_cursors ビューの定義を修正されました。
</p>
<li>列のデフォルト値の挿入を含むトランザクションをデコードするときに、「ERROR: unexpected table_index_fetch_tuple call during logical decoding」というエラーが発生しないよう修正されました。 (Takeshi Ideriha, Hou Zhijie) (17)(16)(15)(14)</li>
<p>
進行中のトランザクションのロジカルデコーディング中に、属性のデフォルトのトースト値を取得しながらトーストテーブルをスキャンしますが、このスキャン中に、システムテーブルのスキャンが進行中であることを示すフラグを初期化していませんでした。
</p>
<li>ロジカルデコーティングのメモリ消費量が削減されました。 (Masahiko Sawada) (17)(16)(15)(14)(13)(12)</li>
<p>
ロジカルデコーディングでは、長時間実行されるトランザクションの処理中に深刻なメモリの浪費が発生し、 メモリ不足に伴う障害が発生することがありました。この問題への対応として、論理レプリケーション中に受信したタプルデータを格納するために、より小さいデフォルトのブロックサイズを使用するようになりました。
</p>
<li>CALL が PL/pgSQL の EXCEPTION ブロック内にある時に、CALLステートメントの引数リストから呼び出される変動性分類がstableの関数の動作が修正されました。 (Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
以前の四半期リリースでの同様の修正と同じように、このケースでは、そのような関数に間違ったスナップショットが渡され、外部トランザクションの開始以降に変更された行の古い値が表示されることがありました。
</p>
<li>libpq の「keepalives」接続オプションを他の整数値オプションと同じ方法で解析するようになりました。 (Yuto Sasaki) (17)(16)(15)(14)(13)(12)</li>
<p>
他のケースとは異なり、オプション値の末尾の空白が拒否されていました。例えば、これは ecpg の使用時に問題となることが判明しています。
</p>
<li>ecpglib で不正な datetime 入力を解析する際の範囲外の読み取りをしないよう修正されました。 (Bruce Momjian, Pavel Nekrasov) (17)(16)(15)(14)(13)(12)</li>
<p>
実際に問題になることは通常なさそうですが、定数配列の開始直前の位置を読み取ろうとする可能性がありました。
</p>
<li>psql の \dコマンド(description コマンド)が 9.4 より前のサーバで再び動作するように修正されました。 (Tom Lane) (17)</li>
<p>
ACL (権限) 列の表示を伴うコマンドは、9.4 より前のバージョンには存在しない関数を使用していたため、非常に古い PostgreSQL サーバーでは失敗していました。
</p>
<li>psql の \watch コマンドで1ミリ秒未満の間隔が指定されている場合に起こるハングアップが回避されるようになりました。 (Andrey Borodin, Michael Paquier) (17)(16)</li>
<p>
1ミリ秒未満の間隔が指定された場合は、間隔 0 (実行間の待機なし)と同じように扱われるようになります。
</p>
<li>~/.pgpass内にレプリケーションパスワードが見つからない問題が修正されました。 (Tom Lane) (17)</li>
<p>
-d または --dbname が指定されていない場合、pg_basebackup とpg_receivewal は、データベース名フィールドに「replication」が含まれる ~/.pgpass のエントリと一致しませんでした。
</p>
<li>pg_combinebackup では、完全バックアップが格納されているはずのディレクトリに増分バックアップファイルが存在する場合にエラーを出すように修正されました。 (Robert Haas) (17)</li>
<li>pg_combinebackup では、二重スラッシュを含むファイル名を作成しないようになりました。 (Robert Haas) (17)</li>
<p>
機能上の問題は発生しませんでしたが、重複したスラッシュがエラーメッセージに表示され、混乱が生じる可能性がありました。
</p>
<li>vacuumdb および--jobsを指定した並列モードの reindexdb で一時テーブルとインデックスのインデックス再構築 試行することを避けるように修正されました。 (VaibhaveS, Michael Paquier, Fujii Masao, Nathan Bossart) (17)(16)(15)(14)(13)(12)</li>
<p>
他のセッションの一時テーブルのインデックス再構築は機能しませんが、一部のコードパスでそれらをスキップするチェックが欠落していたため、不要な障害が発生されました。
</p>
<li>ARM64 プラットフォーム上の誤った LLVM 生成コードが修正されました。 (Thomas Munro, Anthonin Bonnefoy) (17)(16)(15)(14)(13)(12)</li>
<p>
ARM プラットフォーム上で JIT コンパイルを使用すると、生成されたコードは32ビットを超える再配置距離をサポートできず、生成されたコードの配置が不適切になると、大容量メモリシステムでサーバークラッシュが発生する可能性がありました。
</p>
<li>プロセス開始時間 (time_t) が long 値に収まると想定していた数箇所が修正されました。 (Max Johnson, Nathan Bossart) (17)(16)(15)(14)(13)(12)</li>
<p>
long が 32 ビットのプラットフォーム (特に Windows) では、このコーディングは2038年以降に失敗します。ほとんどの失敗は表面的なものにすぎませんが、特にpg_ctl start がハングする可能性がありました。
</p>
<li>タイムゾーンデータファイルが tzdata release 2024b に更新されました。 (Tom Lane) (17)(16)(15)(14)(13)(12)</li>
<p>
この tzdata リリースでは、古い System-V 互換ゾーン名を変更して、対応する地理的ゾーンを複製します。たとえば、「PST8PDT」は「America/Los_Angeles」の別名になります。主な目に見える結果は、標準化されたタイムゾーンの導入前のタイムスタンプの場合、ゾーンは指定された場所のローカル平均太陽時を表すと見なされることです。たとえば、「PST8PDT」では、「1801-01-01 00:00」などの timestamptz 入力は、以前は「1801-01-01 00:00:00-08」とレンダリングされていましたが、現在は「1801-01-01 00:00:00-07:52:58」とレンダリングされます。
</p>
<p>
また、メキシコ、モンゴル、ポルトガルの歴史的修正が行われています。特に、Asia/Choibalsan は、主にこれらのゾーン間の違いが信頼できないデータに基づいていることが判明したため、現在では別のゾーンではなく、「Asia/Ulaanbaatar」の別名となっています。
</p>
<li>DETACH CONCURRENTLY とパーティションの即時削除が同時に発生すると、パーティション化されたテーブルに対するクエリでクラッシュや「ERROR: could not open relation with OID」というエラーが発生する可能性を回避するようになりました。 (Alvaro Herrera, Kuntal Gosh) (16)(15)(14)</li>
<li>アタッチ先のテーブルに、パーティションを参照する外部キーがある場合は、ALTER TABLE ATTACH PARTITION を許可しないように修正されました。 (Alvaro Herrera) (16)(15)(14)(13)(12)</li>
<p>
この構成はサポートされておらず、これを作成する他の方法でもすでに失敗するようになっています。
</p>
<li>後でプレーン結合に縮小される外部結合の下のサブクエリのフラット化に関連するパフォーマンスの低下が修正されました。 (Tom Lane) (16)</li>
<p>
PostgreSQL 16 では、クエリプルアップロジックの過度に楽観的な単純化により、以前のバージョンほど一部のクエリを最適化できていませんでした。
</p>
<li>大規模なハッシュインデックスのインデックス構築の第2段階でのキャンセルが許可されるようになりました。 (Tom Lane) (16)</li>
<p>
事前ソートが必要なほど大きい（maintenance_work_mem または shared_buffers よりも大きい）ハッシュインデックス構築する場合、最初のソートフェーズは中断可能ですが、挿入フェーズではループになり中断できませんでした。
</p>
<li>JSON オブジェクトのコンストラクターで、キーの一意性のチェックが修正されました。 (Junwang Zhao, Tomas Vondra) (16)</li>
<p>
1キロバイトより大きなオブジェクトを構築する際に、重複したキーを含むオブジェクトや不完全なオブジェクトが生成されたり、重複したキーが存在すると誤って報告されたりする可能性がありました。
</p>
<li>Bind および Execute プロトコルメッセージ処理の開始時に、クエリ ID を報告するようになりました。 (Sami Imseih) (16)(15)(14)</li>
<p>
以前はこれらの状態ではクエリ ID がわかりませんでしたが、報告されるようになりました。
</p>
<li>ネストが深すぎる XML 入力による libxml2 のスタックオーバーフローが防止されました。 (Tom Lane, with hat tip to Nick Wellnhofer) (16)(15)(14)(13)(12)</li>
<p>
以前利用していた xmlXPathCompile() は、2.13.4より前のバージョンでは再帰によるスタックオーバーフローが発生する可能性があったため、代わりに xmlXPathCtxtCompile() を使用するようされました。
</p>
<li>「XMLSERIALIZE(... INDENT)」が入力データに空白がある場合インデントされない問題が修正されました。 (Jim Jones) (16)</li>
<p>
空白で区切られたノードのインデントが失敗する問題が修正され、末尾に改行が追加されないようになりました。
</p>
<li>同時に実行される、述語または式を含むインデックスへの REINDEX CONCURRENTLY を無視した最適化しないようになりました。 (Michail Nikolaev) (16)(15)(14)</li>
<p>
通常、REINDEX CONCURRENTLY は、他のテーブルに対する他の REINDEX CONCURRENTLY 操作を待たない最適化を行いますが、 他の REINDEX CONCURRENTLY が述語または式を含むインデックスを処理している場合は、その中に他のテーブルにアクセスするユーザー定義コードが含まれている可能性があるため、この最適化は適用できませんでした。
</p>
<p>
修正前は、他の REINDEX CONCURRENTLY を待機していなかったため、競合状態が発生し、一貫性のない動作が発生する可能性がありました。
</p>
<li>名前が競合する場合の「ORDER BY」リストの誤った解析処理が修正されました。 (Tom Lane) (16)</li>
<p>
「SELECT」の「ORDER BY」項目が単なる識別子である場合、SQL92 との互換性のため、パーサーはまずそれを「SELECT」の出力列名として検索します。しかし、 ビューの定義で利用されているルールの処理は、SQL99 の解釈に従っており、そのような名前を出力ではなく入力列名であると想定しています。したがって、このような操作は推奨されないものの、ある列が「SELECT」の出力リストに名前を変更され、「ORDER BY」で使用される入力列と一致するように変更された場合、ビューの表示結果が不正になる可能性がありました。
</p>
<li>EXPLAIN における「failed to find plan for subquery/CTE」エラーが発生しないよう修正されました。 (Richard Guo, Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
この問題は、サブクエリの WHERE 条件が常に偽である場合など、実行計画からサブクエリが最適化によって完全に取り除かれた場合に、 サブクエリのRECORD 型出力のフィールドを表示しようとした際に発生することがありました。プラン内には元のフィールド名を識別するための情報が残らないため、代わりに「fN」という形式で N 番目のレコード列を表示するようになりました。
</p>
<li>生成列の型を変更するときに「USING」句を指定できないように修正されました。 (Peter Eisentraut) (16)(15)(14)(13)(12)</li>
<p>
「USING」句の出力は変換後の列に書き込まれるため、列の内容を指定している生成式の結果を破壊してしまうため、 「USING」句を指定した場合エラーとするようになりました。
</p>
<li>32 ビットマシンでの pg_stat_io ビューの誤った出力が修正されました。 (Bertrand Drouvot) (16)</li>
<p>
このようなハードウェアでは、stats_reset タイムスタンプ列にゴミが含まれていました。
</p>
<li>「Error： trailing junk after numeric literal」エラーメッセージが出力される誤ったエンコーディング処理が修正されました。 (Karina Litskevich) (16)(15)</li>
<p>
数値リテラルの後に識別子が続くことは許可しておらず、その間には空白が必要なため、{ interger }{ ident_start }のようなトークンパターンを利用していました。しかしながら、{ ident_start }にマルチバイト文字が続く場合が想定されていなかったため、クライアントへのレポートおよびログファイルにおいて、不正なエンコーディングとしてエラー出力されていました。
</p>
<li>論理レプリケーション適用ワーカーは、エラーまたは適用ワーカーのシャットダウン中に、レプリケーション起点が進行しないように修正されました。　 (Hayato Kuroda, Shveta Malik) (16)</li>
<p>
これにより、レプリケーション起点が進むとソースサーバーはそのデータを再度送信しなくなるため、トランザクションが失われる可能性がありました。
</p>
<li>TLS セッションチケット無効化のリグレッションを修正されました。 (Daniel Gustafsson) (16)(15)(14)(13)(12)</li>
<p>
TLSv 1.3のステートフル セッションチケットの送信を防止するための変更により、誤って TLSv 1.2のステートレスチケットの送信が再度有効になっていました。クライアントに TLS セッション再開( session resumption )がサポートしていると誤解されないようにすることを意図していましたが、一部のクライアントは依然としてサポートしていると考えていました。
</p>
<li>多数の ACL エントリを持つデータベースを削除するとき、「ERROR: wrong tuple length」が発生することがありましたが、回避されるようになりました。 (Ayush Tiwari) (16)(15)(14)(13)(12)</li>
<li>パラレルワーカーで session_authorization と role の設定が正しく行えるようになりました。 (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
動作中に変更可能な設定は「SET」句で変更できますが、パラレルワーカー内では上記の 2 つの設定が変更できませんでした。
</p>
<li>PL/pgSQL の CALL で特殊なケースで稀に発生する「cache lookup failed for function」エラーが発生する問題が修正されました。 (Tom Lane) (16)(15)(14)</li>
<li>ビッグエンディアンのハードウェア上でかつ OpenSSL が利用できない場合の MD5 の実装がスレッドセーフに修正されました。 (Heikki Linnakangas) (16)(15)(14)</li>
<p>
クライアント側で利用されるため、スレッドセーフではないことは問題がありました。
</p>
<li>ecpglib で pnstrdup() の使用を避けるようになりました。 (Jacob Champion) (16)(15)(14)(13)</li>
<p>
この関数はメモリ不足時に exit() を呼び出しますが、呼び出し元のコードは既に割り当て失敗を適切に処理しているため、この動作はライブラリとしては適切ではありませんでした。
</p>
<li>psql のメタコマンド \bind を繰り返し使用する際に発生していた psql のメモリリークが修正されました。 (Michael Paquier) (16)</li>
<li>テーブルの UNLOGGED/LOGGEDの設定と異なる永続性を持つ IDENTITY 列を管理するシーケンスの pg_dump の処理が修正されました。 (Tom Lane) (16)(15)</li>
<p>
v15 以降、テーブルが UNLOGGED のときに IDENTITY 列を管理するシーケンスだけを LOGGED に設定したり、その逆を行ったりすることが可能になっています。ただし、バイナリアップグレードモードではその状況を再現する pg_dump が失敗し、そのようなシーケンスが存在すると pg_upgrade は失敗していました。シーケンスの永続性が作成時に正しく設定できるように、「ADD/ALTER COLUMN GENERATED AS IDENTITY」に新しいオプションを導入して修正されました。したがって、このようなシーケンスを含むデータベースからのダンプは、このマイナーバージョン以降のサーバーにのみロードできます。
</p>
<li>pg_rewind のデバッグ出力に、ソースタイムライン履歴を含めるように修正されました。 (Heikki Linnakangas) (16)(15)(14)(13)(12)</li>
<p>
これは当初の意図でしたが、ソース履歴が常に空として出力されていました。
</p>
<li>contrib/pageinspect および contrib/pgstattuple 関連の関数で、シーケンス関係の検査を許可するようになりました。 (Nathan Bossart, Ayush Vatsa) (16)(15)(14)(13)(12)</li>
<p>
これは以前は許可されていましたが、テーブルに対するデフォルト以外のアクセスメソッドの導入時に機能しなくなっていました。
</p>
<li>Windows 上での Strawberry Perl を使用したビルドが修正されました。 (Andrew Dunstan) (16)(15)(14)(13)(12)</li>
<li>Windows (特に pg_rewind )の ジャンクションポイントの誤動作が修正されました。 (Andrew Dunstan) (16)(15)(14)(13)(12)</li>
<li>MinGW でビルドするときに発生する、「missing declaration for inet_pton」というコンパイラの警告またはエラーを防止するようになりました。(Thomas Munro, Andrew Dunstan) (15)</li>
<li>PostgreSQL の RPM パッケージをビルドする際に発生する、「Error: nothing provide perl(PostgreSQL::Test::Utils)」が防止されるようになりました。 (Noah Misch) (14)(13)(12)</li>
</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 15.8 に関する技術情報</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/15-8/</link>
		
		<dc:creator><![CDATA[データベース技術グループ]]></dc:creator>
		<pubDate>Thu, 29 Aug 2024 00:13:25 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 15]]></category>
		<category><![CDATA[PostgreSQL 15.7]]></category>
		<category><![CDATA[PostgreSQL 15.8]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=15019</guid>

					<description><![CDATA[このリリースは 15.7 からの修正リリース（2024年 8月 8日リリース）です。 15.X からのアップデートではダンプ、リストアは不要です。 ただし、15.7 よりも前のバージョンからアップデートする場合には、15 ...]]></description>
										<content:encoded><![CDATA[<p>このリリースは 15.7 からの修正リリース（2024年 8月 8日リリース）です。<br />
15.X からのアップデートではダンプ、リストアは不要です。</p>
<p>ただし、15.7 よりも前のバージョンからアップデートする場合には、<a href="/tech-blog/pgsql/15-7/" rel="noopener">15.7 のリリース情報</a>も参照してください。</p>
<p><span id="more-15019"></span></p>
<h3>PostgreSQL 15.7 から 15.8 への変更点</h3>
<p>16.4、15.8、14.13、13.16、12.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。</p>
<ol>
<li>pg_dump 実行時の権限のないコードの実行が防止されました。  (Masahiko Sawada) (16)(15)(14)(13)(12)</li>
<p>
永続オブジェクトの作成、削除ができる攻撃者により、SQLコードのインジェクションが可能でした。そのコードは pg_dump を起動するロール（しばしばスーパーユーザです）の権限で、並列 pg_dump のセッションから実行されます。シーケンスのようなオブジェクトを悪意のコードを実行するビューや外部テーブルで置き換えることで、攻撃が行われます。これを防ぐため、ビルトインでないビューの展開および外部テーブルへのアクセスを無効にできる新たな設定パラメータ restrict_nonsystem_relation_kind が導入されました。デフォルトは ''（空文字列）で、カンマ区切りで view や foreign-table を指定します。この設定が pg_dumpコマンド内で SET で指定されるようになります。攻撃を防ぐにはサーバと pg_dumpコマンドの両方のアップデートが必要です。(CVE-2024-7348)
</p>
<li>Merge Anti Join を使う実行プランから誤った問い合わせ結果が生じることがあり、修正されました。  (Richard Guo) (16)</li>
<p>
内側のリレーションが制約でユニークな結合キーを持つと分かっている場合に、外側のリレーションに結合キーの重複した行があるとき、マージが誤動作を起こす可能性がありました。
</p>
<pre>
（誤動作例）
db1=# CREATE TABLE t2 (a int UNIQUE, b int);
db1=# INSERT INTO t2 SELECT g, g % 100 FROM generate_series(1,1000) g;
db1=# CREATE INDEX ON t2 (b);
db1=# ANALYZE t2;
db1=# SET enable_hashjoin TO off;
db1=# SET enable_nestloop TO off;
db1=# SELECT * FROM t2 t2out WHERE NOT EXISTS
        (SELECT 1 FROM t2 t2in WHERE t2in.b = t2out.a) AND t2out.b < 2;

→ Nested Loop Anti Join や Hash Right Anti Join の場合には正しく動作するが、
   Merge Right Anti Join を使った実行プランでは少ない件数が返る。
</pre>
<li>VACUUM での無限ループが防止されました。  (Melanie Plageman) (16)(15)(14)</li>
<p>
長時間実行中のトランザクションを伴う切断されたスタンバイサーバがプライマリサーバに再接続した後に、プライマリでの VACUUM 処理が、どのタプルが除去可能かについて混乱する可能性があり、その結果、無限ループに陥ることがありました。
</p>
<li>以前に継承ツリーの子テーブルを持っていたテーブルをパーティションとしてアタッチした場合に、後で生じる障害が修正されました。  (&Aacute;lvaro Herrera) (16)(15)(14)(13)(12)</li>
<p>
アサート失敗が報告されました。アサートを無効にした実稼働むけビルドでは、クラッシュや誤動作が生じる可能性があります。
</p>
<pre>
（障害発生例）
db1=# CREATE TABLE t_inh_p (a int);
db1=# CREATE TABLE t_inh_c () INHERITS (t_inh_p);
db1=# DROP TABLE t_inh_c;
db1=# CREATE TABLE pt (a int) PARTITION BY LIST (a);
db1=# ALTER TABLE pt ATTACH PARTITION t_inh_p FOR VALUES IN (1);
db1=# INSERT INTO t_inh_p VALUES (1);
db1=# UPDATE t_inh_p SET a = 2 WHERE a = 1;
→ ここでアサート失敗が生じる（正常動作はパーティション制約違反のエラー）
</pre>
<li>一貫性に欠けた、インデックスによる制約を伴うパーティションテーブルへのALTER TABLE .. DETACH PARTITION .. での障害が修正されました。  (&Aacute;lvaro Herrera, Tender Wang) (16)(15)(14)(13)(12)</li>
<p>
パーティションテーブル（親テーブル）に制約と関連付かないインデックスがあって、そのパーティション（子テーブル）に同等の制約のインデックスがある場合、パーティションをデタッチするときにアサート失敗が生じたり、システムテーブル pg_constraint の coninhcount列が誤った値になりました。
</p>
<pre>
db1=# CREATE TABLE pt5 (a int) PARTITION BY LIST (a);
db1=# CREATE TABLE p5 PARTITION OF pt5 FOR VALUES IN (1);
db1=# ALTER TABLE p5 ADD PRIMARY KEY (a);
db1=# CREATE UNIQUE INDEX ON pt5 (a);
db1=# ALTER TABLE pt5 DETACH PARTITION p5;
→ ここでアサート失敗か、以下が 0 ではなく -1 になる。
db1=# SELECT coninhcount FROM pg_constraint WHERE conname = 'p5_pkey';
</pre>
<li>ALTER TABLE .. DETACH PARTITION .. CONCURRENTLY と並行するパーティションプルーニングの調整について修正されました。  (&Aacute;lvaro Herrera) (16)(15)(14)</li>
<p>
エグゼキュータはプラン作成と実行の間でパーティションがデタッチされないと想定していましたが、CONCURRENTLY指定を使う場合にはその前提は成り立ちません。パーティションテーブルに対する問い合わせ実行で、そのようなタイミングのときに、アサート失敗や以下のようなエラーが発生しました。
</p>
<pre>
ERROR:  missing relpartbound for relation ..
ERROR:  could not match partition child tables to plan elements
</pre>
<li>パーティションテーブルから最後のパーティション（子テーブル）がDROP された後、pg_class.reltuples を正しく 0 に更新するようになりました。(Noah Misch) (16)(15)(14)</li>
<p>
パーティションが無くなったパーティションテーブルに対する最初の ANALYZE でrelhassubclass = f の変更をするときに reltuples = 0 の変更が失われていました。
</p>
<li>プロシージャの多様OUT引数の処理が修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
SQL の CALL文は多様OUT引数に対して正しいデータ型を解決できず、「ERROR:  cannot display a value of type anyelement」などのエラーや、クラッシュを引き起こしました。
</p>
<p>
なお、PL/pgSQL 内の CALL は問題ありません。
</p>
<pre>
（障害動作例）
db1=# CREATE PROCEDURE pro1 (i1 IN anynonarray, o1 OUT anynonarray)
        LANGUAGE sql AS $$ SELECT i1; $$;
db1=# CALL pro1('aa'::text, NULL);
ERROR:  cannot display a value of type anynonarray
</pre>
<li>PL/pgSQL で CALL 文の引数リストから呼び出された STABLE関数の振る舞いが修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
CALL が、トランザクションブロック内のアトミックなコンテキストで実行された場合に、誤って外側トランザクションの開始時点のスナップショットが STABLE関数に渡されて、古い値が参照されていました。
</p>
<pre>
（誤動作例）
db1=# CREATE TABLE t9 AS SELECT 0 AS x;
db1=# CREATE FUNCTION f_get_x() RETURNS int STABLE LANGUAGE plpgsql AS
      $$ DECLARE r int; BEGIN SELECT x INTO r FROM t9; RETURN r; END; $$;
db1=# CREATE PROCEDURE f_print_x(x int) LANGUAGE plpgsql AS 
      $$ BEGIN RAISE NOTICE 'f_print_x(%)', x; END; $$;
db1=# BEGIN;
db1=# DO $$ BEGIN
            UPDATE t9 SET x = x + 1;
            RAISE NOTICE 'f_get_x(%)', f_get_x();
            CALL f_print_x(f_get_x());
            UPDATE t9 SET x = x + 1;
            RAISE NOTICE 'f_get_x(%)', f_get_x();
            CALL f_print_x(f_get_x());
            END $$;
NOTICE:  f_get_x(1)
NOTICE:  f_print_x(0)   （← 正しくは 1）
NOTICE:  f_get_x(2)
NOTICE:  f_print_x(0)   （← 正しくは 2）
db1=# ROLLBACK;
</pre>
<li>time型、timetz型に対する ISO-8601拡張時刻書式の入力について修正されました。  (Tom Lane) (16)</li>
<p>
'T12:34:56' のような書き方を再び許容するようになりました。PostgreSQL 15.x 以前では受け入れられていましたが、16.0 以降で「ERROR:  invalid input syntax for type ...」のエラーになっていました。
</p>
<li>money型の計算で整数オーバーフローを検知するようになりました。  (Joseph Koshakow) (16)(15)(14)(13)(12)</li>
<p>
money型に対する算術関数はこれまでオーバーフロー検査をしていませんでした。そのため、オーバーフローする場合に誤った問い合わせ結果が生じていました。
</p>
<pre>
（誤動作例）
db1=# SELECT '92233720368547758.07'::money + '0.01'::money;
          ?column?
-----------------------------
 -$92,233,720,368,547,758.08
(1 row)
→ 修正後は「ERROR:  money out of range」エラーが出る。
</pre>
<li>round(numeric, int) および trunc(numeric, int) 関数で、スケール引数の過剰な制限が修正されました。  (Dean Rasheed) (16)(15)(14)(13)(12)</li>
<p>
これまでスケール引数は（文書に記載なく）正負 2000桁までに制限されていて、それを越える場合には、誤った問い合わせ結果が返っていました。numeric型の上限に合わせた桁数を上限とするように修正されました。
</p>
<pre>
（誤動作例 - 本来全て「1000」にならないといけない）
db1=# SELECT substr(round(1.234e1999, -1999)::text, 1, 4);
 substr
--------
 1000
(1 row)

db1=# SELECT substr(round(1.234e2000, -2000)::text, 1, 4);
 substr
--------
 1000
(1 row)

db1=# SELECT substr(round(1.234e2001, -2001)::text, 1, 4);
 substr
--------
 1200
(1 row)
</pre>
<li>最小 bigint値に対する pg_size_pretty() の出力が修正されました。  (Joseph Koshakow) (16)(15)</li>
<pre>
（誤動作ケース - 期待される正しい出力は「-8192PB」）
db1=# SELECT pg_size_pretty('-9223372036854775808'::bigint);
       pg_size_pretty
----------------------------
 -9223372036854775808 bytes
(1 row)
</pre>
<li>スタンバイサーバ上の UNLOGGED のシーケンスと、他セッションの一時シーケンスについて、pg_sequence_last_value() が ERROR を起こさないように修正されました。  (Nathan Bossart) (16)(15)(14)(13)(12)</li>
<p>
このような場合に、これからは NULL を返すようになります。本関数は pg_sequences ビューの中で使われるもので文書化されていません。
</p>
<pre>
（プライマリサーバで実行 - これで UNLOGGED のシーケンスが作られる）
db1=# CREATE UNLOGGED TABLE t14 (id serial);

（スタンバイサーバで実行 - 修正前バージョンではエラーになる）
db1=# SELECT * FROM pg_sequences ;
ERROR:  could not open file "base/18077/18108": No such file or directory
</pre>
<li>websearch_to_tsquery() で無視される演算子のパースが修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
マニュアルでは websearch_to_tsquery() の入力中の記号は、ダッシュ(-) と引用符(") の特別な場合を除き無視されることになっています。しかしながら、括弧といくつかの記号が or の直前に現れた場合、or が演算子ではなく or という単語として扱われる動作がありました。
</p>
<pre>
（or は引用符で囲わない限り演算子）
db1=# select websearch_to_tsquery('simple', 'cat or dog');
 websearch_to_tsquery
----------------------
 'cat' | 'dog'
(1 row)

（誤動作例 - 括弧があると or が演算子として扱われない）
db1=# select websearch_to_tsquery('simple', '(tom cat) or dog');
     websearch_to_tsquery
------------------------------
 'tom' & 'cat' & 'or' & 'dog'
(1 row)
</pre>
<li>新たな配列次元を計算するときの整数オーバーフローを検出できるようになりました。  (Joseph Koshakow) (16)(15)(14)(13)(12)</li>
<p>
以下の INSERT が正しくエラーになるようになりました。
</p>
<pre>
（修正前バージョンでは a = '{}' で行が挿入される）
db1=# CREATE TABLE t16 (a int[]);
db1=# INSERT INTO t16 (a[-2147483648:2147483647]) VALUES ('{}');
ERROR:  array size exceeds the maximum allowed (134217727)
</pre>
<p>
バージョン 16.1、15.5、14.10、13.13、12.17、11.22 で修正された、CVE-2023-5869 の件と似ていますが、本障害では配列は空で終わるので無害です。
</p>
<li>ライブラリ関数 strnxfrm() の移植性に欠ける使い方が修正されました。  (Jeff Davis) (16)</li>
<p>
一部のコードパスでは、非決定的な照合順序の使用において「ERROR:  pg_strnxfrm() returned unexpected result」のエラーが発生する可能性がありました。
</p>
<li>TOAST化されたフィールドを展開するときに、新たなカタログキャッシュエントリが古くなったことを検知するようになりました。  (Noah Misch) (16)(15)(14)(13)(12)</li>
<p>
TOASTテーブルを持つシステムカタログにインプレース更新を行う場合に問題が発生します。該当するのは pg_database だけです。pg_database の情報を使う SQL (例えば GRANT .. ON DATABASE .. など) で古い情報が使われてしまう可能性がありました。
</p>
<li>DEFAULT を伴う INSERT について、ビューの列が更新可能であるかを正しく検査するようになりました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
対象の列が更新不能である場合、その旨のエラーを出すべきですが、検査が漏れており、後のコードから「ERROR:  attribute number N not found in view targetlist」という意味が理解しにくいエラーメッセージが生じていました。
</p>
<pre>
（修正前の動作例）
db1=# CREATE TABLE t19 (id int);
db1=# CREATE VIEW v19 AS SELECT id, id * 2 AS c_2id FROM t19;
db1=# INSERT INTO v19 VALUES (1, 2);
ERROR:  cannot insert into column "c_2id" of view "v19"
DETAIL:  View columns that are not columns of their base relation are not updatable.
db1=# INSERT INTO v19 VALUES (1, DEFAULT);
ERROR:  attribute number 2 not found in view targetlist
</pre>
<li>不正な再帰問い合わせに対して、エラー報告内容が改善されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
これまで、WITH RECURSIVE の問い合わせで UNION の 2つ目の枝に自己参照が無いけれども ORDER BY のような別の場所に自己参照がある場合に、役に立たない内部的なエラーメッセージが出ていました。
</p>
<pre>
（修正前の動作例）
db1=# WITH RECURSIVE x(n) AS (WITH x1 AS (SELECT 1 FROM x)
        SELECT 0 UNION SELECT * FROM x1) SELECT * FROM x;
ERROR:  missing recursive reference
（→ 修正後のメッセージは以下）
ERROR:  recursive reference to query "x" must not appear within a subquery

db1=# WITH RECURSIVE x(n) AS (
        SELECT 0 UNION SELECT 1 ORDER BY (SELECT n FROM x)) SELECT * FROM x;
ERROR:  missing recursive reference
（→ 修正後のメッセージは以下）
ERROR:  ORDER BY in a recursive query is not implemented
</pre>
<li>ALTER TABLE .. SET LOGGED/UNLOGGED で、テーブルが所有するシーケンスにもロック取得するように修正されました。  (Noah Misch) (16)(15)</li>
<p>
このコマンドは（通常は serial型の列により）テーブルに紐づくシーケンスについても LOGGED と UNLOGGED の切り替えを行いますが、シーケンスについてロック取得されていませんでした。このため、同時に実行される nextval() の結果が失われる可能性がありました。
</p>
<li>キューに入っていた AFTER トリガが実行時には無くなっていた場合に、エラーを出さないようになりました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
トランザクションで遅延された AFTERトリガを発生させる操作を実行して、その後、トリガ実行に至る前にそのトリガが DROP された場合に該当します。これまでは「ERROR:  could not find trigger NNNN」エラーを出していましたが、動作が変更されました。この場合は何もしない方が良いと判断されました。
</p>
<li>テーブルが削除されたときに、列単位の権限についてシステムカタログ pg_init_privs のエントリの削除に失敗していたものが、修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
ある拡張が作成したテーブルの列単位権限を GRANT した場合に、関連する pg_init_privs のエントリが拡張を削除した後にも残っていました。これはテーブルの OID が再利用されない限りは無害です。pg_init_privs に残ったエントリは、OID が一致するテーブルの pg_dump 出力に影響を与える可能性があります。
</p>
<li>望ましいインデックスが式や述語を持つときに、ON CONFLICT に対する競合解決インデックスの選択が修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
問い合わせ（INSERT）が更新可能ビューを通してターゲットテーブルにON CONFLICT を用いたアクセスする場合、利用可能なインデックスがある場合でも、それが無いというエラーが生じていました。
</p>
<pre>
（エラー発生例）
db1=# CREATE TABLE t24 (js jsonb);
db1=# CREATE UNIQUE INDEX ON t24 ((js ->> 'key'));
db1=# CREATE VIEW v24 AS SELECT * FROM t24;
db1=# INSERT INTO v24 VALUES ('{"key": "value"}')
        ON CONFLICT ((js ->> 'key')) DO NOTHING;
ERROR:  there is no unique or exclusion constraint matching the ON CONFLICT specification
</pre>
<li>ALTER TABLE で他セッションの一時テーブルを書き換えることが禁止されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
権限チェックにより、通常は他セッションの一時テーブルの行を参照・更新することは防止されますが、ALTER TABLE で定義変更をすることは可能でした。永続テーブルを継承する一時テーブルを作ることで、スキーマ pg_temp_NNN を指定することなく、他セッション一時テーブルの ALTER TABLE を試みることができてしまいました。
</p>
<pre>
（現象再現例）
db1=> CREATE TABLE t25(i int);
db1=> CREATE TEMP TABLE t25tt () INHERITS (t25);

（別セッションで実行）
db1=> ALTER TABLE t25 ADD c text;
ERROR:  could not open file "base/18077/18239": No such file or directory
　→ アサート有のビルドならアサート失敗／列追加に成功してしまう場合もある

（修正後のエラー）
ERROR:  cannot alter temporary tables of other sessions
</pre>
<li>CREATE TABLE ... LIKE ... STATISTICS での式の拡張統計の処理が修正されました。  (Tom Lane) (16)(15)(14)</li>
<p>
このような CREATEコマンドは、統計情報の式の列参照で列番号を適切に調整できませんでした。その結果、無効な統計オブジェクトが作られて、後で問題が生じました。典型的には元テーブルが削除された列を持っていて、列番号の付け直しが必要になる場合です。
</p>
<pre>
（障害発生例）
db1=# CREATE TABLE t26s (a text, b text, c text);
db1=# CREATE STATISTICS es26 ON (a || c) FROM t26s;
db1=# ALTER TABLE t26s DROP COLUMN b;
db1=# CREATE TABLE t26t (LIKE t26s INCLUDING STATISTICS);
db1=# \d t26t
ERROR:  invalid attnum 3 for relation "t26t"
</pre>
<li>min() または max() 集約から生成された副問い合わせの再計算に失敗していたものが修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
一部の場合では、外側の問い合わせのある行で計算された集約結果が、後の行でそうすべきでないときに再利用されるおそれがありました。これは外側の問い合わせがハッシュ集約で実装された DISTINCT を用いているときだけ起きると見られていますが、他の場合もありえます。
</p>
<p>
本障害により誤った問い合わせ結果が生じます。
</p>
<pre>
（誤動作例 - min も 1、2、3 となるのが正しい結果）
db1(5432)=# CREATE TABLE t27 (f1 int4);
db1(5432)=# INSERT INTO t27 VALUES (1),(2),(3);
db1(5432)=# SET enable_sort TO off;
db1(5432)=# SELECT f1, (SELECT DISTINCT min(t27in.f1) FROM t27 t27in
              WHERE t27in.f1 = t27out.f1) FROM t27 t27out;
 f1 | min
----+-----
  1 |   1
  2 |   1
  3 |   1
(3 rows)
</pre>
<li>位置パラメータでアンダースコア(_) が再び禁止されました。  (Erik Wienhold) (16)</li>
<p>
バージョン 16.0 で整数リテラルがアンダースコアを含むことが可能になりました。この変更で「$1_234」などを単一トークンとして扱うようになりましたが、これは正しく機能しませんでした。位置パラメータのシンボルは $ とそれに続く数字のみに戻されました。
</p>
<li>JIT でインライン化されたバックエンド関数がエラーを出すときのクラッシュが回避されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
エラー状態は（エラー位置を示す文字列のために）JITコンパイルされたコードを持つ動的にロードされたモジュールへのポインタを含むことができます。一部のコードパスでモジュールはエラー報告が処理される前にモジュールがアンロードされる可能性があり、エラー位置を示す文字列にアクセスがあったとき、SIGSEGV がもたらされました。
</p>
<li>libxml2 ライブラリ バージョン 2.13.x での振る舞い変更に対応しました。  (Erik Wienhold, Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
報告されたエラーがそれだけでない限り、libxml2 からの「chunk is not well balanced」エラーを抑止するようになりました。これにより 2.13.x とそれ以前のバージョンとのエラー報告の一貫性を保ちます。以前のバージョンではこのメッセージは冗長であったり、完全に間違っていたりしたので、2.13.x では報告されるケースの数が大幅に減りました。
</p>
<li>ホットスタンバイサーバを起動するときに、準備されたトランザクションのサブトランザクションの処理が修正されました。  (Heikki Linnakangas) (16)(15)(14)(13)(12)</li>
<p>
シャットダウン時のチェックポイント の WALレコードでスタンバイのリプレイを開始すると、プライマリで準備されているがまだコミットされていないトランザクションは、進行中であると正しく認識されます。しかし、サブトランザクション（セーブポイントまたは PL/pgSQL の例外ブロックで生じる）については考慮されず、中止されたものとして扱われていました。
</p>
<p>
これにより、準備されたトランザクションが後でコミットされた場合に、コミットされた内容が REPEATABLE READ 分離レベルの別トランザクションにおいて途中から参照可能になる、といった不整合が発生していました。
</p>
<li>論理レプリケーションスロットの誤った初期化が防止されました。  (Masahiko Sawada) (16)(15)(14)(13)(12)</li>
<p>
場合によっては、WALストリーム内のレプリケーションスロットの開始ポイントがトランザクション内のポイントに設定され、アサート失敗が発生したり、デコード結果が不正確になったりすることがありました。
</p>
<li>レプリケーションスロットの作成と削除中に「ERROR:  can only drop stats once」エラーが生じることが回避されました。  (Floris Van Nee) (16)(15)</li>
<p>
同時にスロットの作成・削除を行うとタイミングによって現象が発生しました。アサートが有効なビルドではアサート失敗も発生します。
</p>
<li>論理レプリケーションで WAL sender のリソースリークが修正されました。  (Hou Zhijie) (16)(15)</li>
<p>
パーティションテーブル（親テーブル）が、列が追加されている等、物理的に異なる行タイプのパーティション（子テーブル）を持つとして、そのようなパーティションテーブルの変更をパブリッシュするときに、wal sender プロセスでメモリリークが生じました。
</p>
<li>NOTIFY または sinval割り込み（共有キャッシュ無効化）を処理した後のメモリリークを回避するようになりました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
これらのイベントの処理関数では現在メモリコンテキストを TopMemoryContext に切り替える可能性があり、その結果、切り替え前に割り当てられたデータについて、セッション存続期間でのリークが発生しました。少なくとも、受信した問い合わせと Bind メッセージに付加されたパラメータのエンコード変換でリークが観察されました。
</p>
<li>実行時統計情報に使用される共有メモリブロックの参照カウントの漏洩が防止されるようになりました。  (Anthonin Bonnefoy) (16)(15)</li>
<p>
統計情報の共有メモリにアタッチされた新しいバックエンドプロセスは参照カウントを増加させましたが、終了時にカウントを減少させていませんでした。2^32 セッションが作られた後、参照カウントが 0 にオーバーフローして、その後のバックエンドプロセス起動が「ERROR:  could not attach to ...」エラーで失敗する可能性がありました。
</p>
<li>マルチトランザクションの SLRU ログを切り捨てるときの、デッドロックとアサート失敗の発生が防止されました。  (Heikki Linnakangas) (16)(15)(14)</li>
<p>
SLRUセグメントを削除しようとするプロセスは、checkpointerプロセスとデッドロックする可能性がありました。
</p>
<li>Windowsソケットで入力終了イベントが失われる可能性を回避するようになりました。  (Thomas Munro) (16)(15)(14)(13)(12)</li>
<p>
Windowsは接続のリモート側が切断された後に FD_CLOSE イベントを1回だけ報告します。タイミングが悪いと、その報告を見逃し、さらに入力を期待して無期限に、または少なくともタイムアウトが経過するまで待機する可能性がありました。
</p>
<p>
結果としてクライアント側が切断したことの検知が遅れて、「FATAL:  sorry, too many clients already」などが生じる原因となりました。
</p>
<li>JSON 解析のエラー報告における、不完全なバイトシーケンスのバッファオーバーラン読み出しが修正されました。  (Jacob Champion) (16)(15)(14)(13)</li>
<p>
最後のバイトが不完全なマルチバイト文字で構成されている場合、入力バッファの末尾から数バイト離れる可能性がありました。通常は無害ですが、原理的にはクラッシュを引き起こす可能性がありました。
</p>
<li>OpenSSL でステートフルTLSセッションチケットの作成が無効になりました。  (Daniel Gustafsson) (16)(15)(14)(13)(12)</li>
<p>
セッションチケットの受信が TLSセッション再開がサポートされていることを意味すると考えるクライアントで発生するおそれのある障害を、これにより回避できます。
</p>
<p>
これまでも無効にしていましたが、OpenSSL 1.1.1 以降の TLSv1.3 に対応した無効化の指定が必要でした。
</p>
<li>PL/pgSQL の「単純な式」を再計画するときに、それがまだ単純であることを確認するようになりました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
参照された関数を削除して集約として再作成するなど、大がかりな変更を行った際に、「ERROR:  unexpected plan node type ..」などの予期せぬエラーが発生する可能性がありました。
</p>
<pre>
（障害動作例 - 単純なSQL関数を PL/pgSQL関数から呼び出す）
db1=# CREATE FUNCTION f41() RETURNS int LANGUAGE sql AS $$ SELECT 1 + 1 $$;
db1=# CREATE FUNCTION f41caller() RETURNS int LANGUAGE plpgsql AS $$
        DECLARE x int; BEGIN x := f41simple(); RETURN x; END $$;
db1=# SELECT f41caller();
 f41caller
-----------
         2
(1 row)

（単純な関数を作り直して同セッション内で再度実行するとエラーになる）
db1=# DROP FUNCTION f41;
db1=# CREATE FUNCTION f41() RETURNS SETOF int LANGUAGE sql AS
        $$ SELECT g FROM (VALUES (1),(2)) AS g (g) LIMIT 1; $$;
db1=# SELECT f41caller();
ERROR:  unexpected plan node type: 311
CONTEXT:  PL/pgSQL function f41caller() line 1 at assignment
</pre>
<li>PL/pgSQL で、アンダースコア（_）を含む整数範囲の処理が修正されました。  (Erik Wienhold) (16)</li>
<p>
PostgreSQL 16.x では整数リテラルにアンダースコアを含めることができますが、PL/pgSQL は「FOR i IN 1_001..1_003」ような文を正しく処理できていませんでした。
</p>
<pre>
（エラー発生例 - 「1_001」と「..」の間に空白がない場合にエラーとなる）
db1=# CREATE FUNCTION test(cnt int) RETURNS int LANGUAGE plpgsql AS $$
      DECLARE i integer;
      BEGIN
        FOR i IN 1_001..1_005 LOOP
          cnt := cnt + 1;
        END LOOP;
        RETURN cnt;
     END; $$;
ERROR:  syntax error at or near "1_001."
</pre>
<li>PL/Python で再帰的に RECORD を返す関数の処理が修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
AS句で異なる列定義リストを渡す関数内で、その関数の再帰的な呼び出しを行った場合、内部呼び出しによって外部呼び出しの返す行型を上書きしてしまうため、エラーが発生しました。
</p>
<pre>
（障害発生例 - 内部で int型列のレコードを返す再帰呼び出しがある）
db1=# CREATE FUNCTION f43(t text) RETURNS record LANGUAGE plpython3u AS $$
      if t == "text":
          plpy.execute("SELECT * FROM f43('int') AS (a int)");
          return { "a": "x" }
      elif t == "int":
          return { "a": 1 }
      $$;

db1=# SELECT * FROM f43('text') AS (a text);
ERROR:  invalid input syntax for type integer: "x"
CONTEXT:  while creating return value
PL/Python function "f43"
→ 修正後は列名a、値「x」を持つレコードが返る
</pre>
<li>PL/Python で再帰的なトリガーの呼び出し中に TD辞書を破損しないように処理が修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
PL/Python のトリガーによって別のトリガーが呼び出された場合、内側のトリガー用に作成された TD辞書によって外側のトリガーの TD辞書が上書きされてしまっていました。
</p>
<p>
TD辞書はトリガとして PL/Python 関数を使用した場合に、関連する値を格納するために使われます。
</p>
<li>PL/Tcl で、タプルを返す関数の結果で無効なリスト構文を報告する問題が修正されました。  (Erik Wienhold, Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
これにより、クラッシュが生じたり、以前の Tclエラーを指す誤ったコンテキスト情報が出力されたりする可能性がありました。
</p>
<li>libpq でライブラリ関数 strerror() の非スレッドセーフ利用を回避しました。  (Peter Eisentraut) (16)(15)(14)(13)(12)</li>
<p>
マルチスレッドアプリケーションにおいて、OpenSSL から返るエラーメッセージがおかしくなる可能性がありました。
</p>
<pre>
（以下のようにメッセージがエラーコード表示になってしまうケースが報告された）
FATAL:  could not load root certificate file "root_ca.crl": SSL error code 2147483650
</pre>
<li>pg_dump でバイナリアップグレード処理中のメモリリークが回避されました。  (Daniel Gustafsson) (16)(15)</li>
<p>
pg_dump で --binary-upgrade オプションを指定した場合に該当します。通常、このオプションを使用するのは pg_upgrade コマンドだけです。
</p>
<li>「pg_restore -l」が依存している TOCエントリを正しく報告するようになりました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<p>
pg_restore の「-l」が「-n」や「-N」などの選択的なリストアのオプションと共に指定された場合、コメントなど依存しているオブジェクトが、実際にはダンプに含まれていてリストアされるものであっても、TOC エントリ一覧から省かれていました。
</p>
<li>contrib/pg_stat_statements が SQL言語の関数内のユーティリティ命令を識別できるようになりました。  (Anthonin Bonnefoy) (16)</li>
<p>
SQL言語の関数のエグゼキュータは、ユーティリティ命令（SELECT/INSERT/UPDATE/DELETE/MERGE 以外）に対して計算したクエリID を伝えそこなっていました。
</p>
<li>contrib/postgres_fdw で「ERROR:  cursor can only scan forward」エラーが回避されました。  (Etsuro Fujita) (16)(15)</li>
<p>
リモートサーバが PostgreSQL 15 以降であって、リモートの単純ではないビューに対して作った外部テーブルを参照する場合に、本エラーが発生します。
</p>
<li>contrib/postgres_fdw が SELECT文の FETCH FIRST WITH TIES句をリモートサーバに送出しないようになりました。  (Japin Li) (16)(15)(14)(13)</li>
<p>
リモートサーバはこの構文を実装していないか、ローカルサーバとは異なる解釈をするかもしれないため、あえてリモートサーバでの実行を試みることはないと判断されました。
</p>
<p>
本構文がサポートされたのは PostgreSQL 13.x 以降です。
</p>
<li>OS が提供する <regex.h> ヘッダファイルによる衝突が回避されました。  (Thomas Munro) (16)(15)(14)(13)(12)</li>
<p>
maxOS バージョン 15 以降でのコンパイル失敗が修正されます。
</p>
<li>プラン要素 Memoize のコスト見積での無害なアサート失敗が修正されました。  (David Rowley) (16)(15)(14)</li>
<li>SP-GiST インデックスに対する REINDEX CONCURRENTLY 実行での無害なアサート失敗が修正されました。  (Tom Lane) (16)(15)(14)(13)(12)</li>
<li>PL/Perl と Perl 5.40 との非互換性が修正されました。  (Andrew Dunstan) (15)(14)(13)(12)</li>
<p>
この修正は 9.2.x から 11.x のリポジトリでも修正適用されています。
</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>
	</channel>
</rss>
