このリリースは 12.14 からの修正リリース(2023年 5月 11日リリース)です。
12.X からのアップデートではダンプ、リストアは不要です。
しかしながら、12.10 よりも前のバージョンからアップデートする場合には、12.10 のリリース情報も参照してください。
PostgreSQL 12.14 から 12.15 への変更点
15.3、14.8、13.11、12.15、11.20 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- CREATE SCHEMA が search_path の変更をオーバーライドしないようになりました。 (Alexander Lakhin) (15)(14)(13)(12)(11)
- 集合(複数行)を返す関数のインライン化の後にも、行単位セキュリティポリシーが正しく働くように修正されました。 (Stephen Frost, Tom Lane) (15)(14)(13)(12)(11)
- STRATEGY WAL_LOG オプションを伴う CREATE DATABASE の後に、元となるテンプレートデータベースが破損する可能性があり、修正されました。 (Nathan Bossart, Ryo Matsumura) (15)
- STRATEGY WAL_LOG オプションで CREATE DATABASE を実行したときのメモリリークと不要なディスク読み込みが修正されました。 (Andres Freund) (15)
- CREATE SCHEMA で新たなスキーマ名を省略した場合のクラッシュを回避するようになりました。 (Michael Paquier) (15)(14)(13)(12)(11)
- MERGEコマンドの様々なプランナの障害が修正されました。 (Tom Lane) (15)
- 一部の場合における MERGE で報告される行数が修正されました。 (Dean Rasheed) (15)
- 同時更新を伴う MERGE の問題が修正されました。 (Dean Rasheed, Álvaro Herrera) (15)
- 欠けていた MERGEコマンドの逆コンパイルに対応しました。 (Álvaro Herrera) (15)
- パーティションテーブルにおける外部キー制約のトリガの有効化/無効化について修正されました。 (Tom Lane) (15)
- インデックスで使われている複合型の変更が禁止されました。 (Tom Lane) (15)(14)(13)(12)(11)
- システム列を外部キーの要素とすることが禁止されました。 (Tom Lane) (15)(14)(13)(12)
- 行単位セキュリティ(RLS) が設定されている親テーブルからの COPY TO が子テーブルの行をコピーしないようになりました。 (Antonin Houska) (15)(14)(13)(12)(11)
- array_position() および array_positions() 関数に空配列を渡した場合のクラッシュが修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- to_char() 関数で範囲外データ取得の可能性があり、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- translate() 関数におけるバッファオーバーラン読み出しが回避されました。 (Daniil Anisimov) (15)(14)(13)(12)(11)
- テキスト検索における文字クラス処理のロジックが、有効なロケールが C であるかを正しく検出できるように修正されました。 (Jeff Davis) (15)
- interval型に対する空文字列の入力によるクラッシュが修正されました。 (Tom Lane) (15)
- ISO-8601形式の interval値の表現で、フィールドの指数表現が再び使用可能になりました。 (Tom Lane) (15)
- JSON文字列リテラルでのパースエラーに対するエラーカーソル設定が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- 現在の 64-bit XID よりも大きい vacuum_defer_cleanup_age設定によるデータ破損が修正されました。 (Andres Freund) (15)(14)(13)(12)
- パーサが誤った入れ子の集約を検出するのに失敗する場合があり、修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- GENERATED .. AS IDENTITY による serial型列の定義で SEQUENCE NAME オプションのパース時にパースツリーのデータ構造を破損しており、修正されました。 (David Rowley) (15)(14)(13)(12)(11)
- Initプランをあるノードから別ノードに移動するときに、プランノードの並列安全性マークを正しく更新するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
- 拡張統計のコードで PlaceHolderVars での障害が回避されました。 (Tom Lane) (15)(14)
- サブクエリに適用される検索条件句をサブクエリ内のウィンドウ集約の実行時条件(Run Condition)に変換できるかについての、誤ったテストが修正されました。 (David Rowley) (15)
- 集約関数の引数や FILTER句に副問い合わせが含まれるとき、ウィンドウ集約に対して逆変換による最適化が禁止されました。 (David Rowley) (15)(14)(13)(12)(11)
- 入れ子になった ARRAY[] コンストラクタの実行で、誤りが修正されました。 (Alexander Lakhin, Tom Lane) (15)(14)(13)(12)(11)
- 複合型ドメイン配列内フィールドを更新するときのクラッシュが防止されました。 (Dmitry Dolgov) (15)(14)(13)(12)
- boolean型の列に対するパーティション除去のロジックが修正されました。 (David Rowley) (15)(14)(13)(12)(11)
- パラレルハッシュ結合(Parallel Hash Join)でバッチ毎のクリーンアップでの競合状態を修正しました。 (Thomas Munro, Melanie Plageman) (15)(14)(13)(12)(11)
- EvalPlanQual の検査後、GENERATED列を再計算するようになりました。 (Tom Lane) (15)(14)(13)(12)
- Memoizeプランの実行におけるメモリリークが修正されました。 (David Rowley) (15)(14)
- パーティションテーブルに含まれる外部テーブルに対してバッチ挿入を使うときの、バッファの参照カウント漏れが修正されました。 (Alexander Pyhalov) (15)(14)
- ミリ秒以下の vacuum_cost_delay 設定が再び利用可能になりました。 (Thomas Munro) (15)(14)
- リレーション毎の vacuum_cost_delay設定が 0 のとき、遅延バランス処理をしないようになりました。 (Masahiko Sawada) (15)(14)(13)(12)(11)
- 列がビュー末尾に追加されたときの、稀な場合のクラッシュが修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- パーティションテーブルの更新における、MULTIEXPR_SUBLINKサブプラン実行での稀な障害が修正されました。 (Andres Freund, Tom Lane) (15)(14)(13)(12)(11)
- DO ALSO INSERT ... SELECT ルールを持つビューに対する複数行の INSERT ... VALUES 内での DEFAULTマーカの処理が修正されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
- ルールアクションでサブクエリ内の OLD と NEW を参照できるようになりました。 (Dean Rasheed, Tom Lane) (15)(14)(13)(12)(11)
- WITH句内に INSERT/UPDATE/DELETE を含む、ルールや SQL関数の逆コンパイル時に、ターゲットテーブルの別名を正しく出力するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
- SERIALIZABLE READ ONLY の最適化の欠陥が修正されました。 (Thomas Munro) (15)(14)(13)(12)(11)
- ロジカルデコーディングプラグインの pgoutput で、キャッシュのコールバックスロットのリークを回避するようになりました。 (Shi Yu) (15)(14)(13)(12)(11)
- インデックス演算子クラスのオプションに対するカスタムバリデータの不要な呼び出しを回避するようになりました。 (Alexander Korotkov) (15)(14)(13)
- 複数列の BRINインデックスを複数のキーで走査するときに、無用な動作が回避されました。 (Tomas Vondra) (15)(14)
- BRIN の inet_minmax_multi_ops 演算子クラスでネットマスク処理が修正されました。 (Tomas Vondra) (15)(14)
- GiSTインデックスのバッファ処理モード作成時に無効ポインタへのアクセスがあり、修正されました。 (Alexander Lakhin) (15)(14)(13)(12)(11)
- UPDATE や DELETE 動作のロジカルレプリケーションにおいて、除去した列と生成列を無視するようになりました。 (Onder Kalaci, Shi Yu) (15)(14)(13)(12)
- コミットタイムスタンプに対する SLRU バッファのストレージ I/O の待機イベント名が修正されました。 (Alexander Lakhin) (15)(14)(13)
- 待機イベント SLRUFlushSync の報告が再び有効化されました。 (Thomas Munro) (15)(14)
- 保持する WALセグメントの数を計算するときに、アンダーフローの可能性があり回避されました。 (Kyotaro Horiguchi) (15)(14)(13)
- スタンバイモードにおけるスタートアップ進捗報告のオーバーヘッドが取り除かれました。 (Bharath Rupireddy) (15)
- SCRAM-SHA-256 チャンネルバインディングで RSA-PSS 証明書がサポートされました。 (Jacob Champion, Heikki Linnakangas) (15)(14)(13)(12)(11)
- Windows におけるプロセスID 追跡での競合を回避しました。 (Thomas Munro) (15)(14)(13)(12)(11)
- 実装内部の汎用リスト処理関数 list_copy_head() が空リストを正しく扱えるように修正されました。 (David Rowley) (15)
- SPI_result_code_string() で "SPI_OK_MERGE" と "SPI_OK_TD_REGISTER" を返す場合について欠けていたため、対応されました。 (Dean Rasheed) (15)(14)(13)(12)(11)
- AllocSetRealloc() で誤った Valgrind むけの印付けが修正されました。 (Karina Litskevich) (15)(14)(13)(12)(11)
- 行単位セキュリティが有効なパーティションテーブルに対する MERGE でのアサート失敗が修正されました。 (Dean Rasheed) (15)
- トランザクションになっているロジカルレプリケーションのメッセージをデコードするときのアサート失敗が回避されました。 (Tomas Vondra) (15)(14)(13)(12)(11)
- 正規表現のエスケープ処理でロケールの影響を回避しました。 (Jeff Davis) (15)(14)(13)(12)(11)
- log_newpage_range() で、指定範囲の最後の数ページが空の場合は、空の WALレコードを書き込もうとしないようになりました。 (Matthias van de Meent) (15)(14)(13)(12)(11)
- キャスト式を使用する PL/pgSQL の DOブロック での、セッション存続期間のメモリリークが修正されました。 (Ajit Awekar, Tom Lane) (15)(14)(13)(12)
- Perl のリスト構造を多次元 SQL配列に変換する時の、配列の次元チェックが強化されました。 (Tom Lane) (15)(14)(13)(12)(11)
- Python のリスト構造を多次元 SQL配列に変換する時の、配列の次元チェックが強化されました。 (Tom Lane) (15)(14)(13)(12)(11)
- PL/Python の例外スタックの巻き戻しが修正されました。 (Xing Guo) (15)(14)(13)(12)(11)
- libpq の PQconnectPoll() における一貫性のない GSS暗号化のエラー処理が修正されました。 (Michael Paquier) (15)(14)(13)(12)
- -C ORACLE オプションでビルドされた ecpg プログラムで発生する可能性のあるデータ破損が修正されました。 (Kyotaro Horiguchi) (15)(14)(13)(12)(11)
- 列挙(enum)型の列でハッシュ分割されたパーティションテーブルを正常にリストアできるように pg_dump が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- Windows でシークできないファイルを正しく検出するようになりました。 (Juan Jose Santamaria Flecha, Michael Paquier, Daniel Watzinger) (15)(14)
- pgbench の preparedモードでは、パイプラインを開始する前にパイプライン内のすべてのコマンドを準備(prepare)するようになりました。 (Álvaro Herrera) (15)(14)
- contrib/amcheck のヒープを検査するコードで、xmin または xmax がゼロのタプルを正しく処理するようになりました。 (Robert Haas) (15)(14)
- contrib/amcheck では、エポックゼロより前にあると思われる xid を適切に扱うようになりました。 (Andres Freund) (15)(14)
- contrib/basebackup_to_shell で、パイプのオープン失敗を適切に検出するようになりました。 (Robert Haas) (15)
- contrib/hstore_plpython で、変換される Python 値がマッピングでない場合のクラッシュが回避されるようになりました。 (Dmitry Dolgov, Tom Lane) (15)(14)(13)(12)(11)
- ltree列の GiSTインデックスの siglen オプションを指定する場合は、4 の倍数であることが必要となりました。 (Alexander Korotkov) (15)(14)(13)
- contrib/pageinspect で、gist_page_items() 関数の不正な入力に対する防御が追加されました。 (Dmitry Koval) (15)(14)
- contrib/pg_trgm で満たす文字列が存在しない正規表現による誤動作が修正されました。 (Tom Lane) (15)(14)(13)(12)(11)
- contrib/postgres_fdw の application_name パラメータにおけるエスケープシーケンスの処理が修正されました。 (Kyotaro Horiguchi, Michael Paquier) (15)
- contrib/pg_walinspect で pg_get_wal_records_info() のメモリ使用量が制限されました。 (Bharath Rupireddy) (15)
- GNU互換の strip を使用して静的ライブラリを削除する場合は、--strip-unneeded オプションを使用するようになりました。 (Tom Lane) (15)(14)(13)(12)(11)
- ドキュメント構築における DTDファイルの自動ダウンロードを、ドキュメントで推奨しなくなりました。また、Makefile で無効化されました。 (Aleksander Alekseev, Peter Eisentraut, Tom Lane) (15)(14)(13)(12)(11)
- PGXSビルドで TAPテストを実行する場合、一時的な portlockディレクトリとしてより安全な場所を使用するように変更されました。 (Peter Eisentraut) (15)(14)(13)(12)(11)
- エジプト、グリーンランド、モロッコ、パレスチナの夏時間法改正に伴い、タイムゾーンデータファイルが tzdata release 2023c に更新されました。 (15)(14)(13)(12)(11)
- パーティションテーブルでのクローントリガの有効化/無効化が修正されました。 (Tom Lane) (14)(13)
- 更新または削除アクションのロジカルレプリケーション中に、ドロップされた列を無視するようになりました。 (Onder Kalaci, Shi Yu) (11)
CREATE SCHEMA は 1つの文の中でスキーマ内要素も作成することができます。CREATE SCHEMA の中では、安全な search_path に変更される場合でも、新たに作るスキーマと元々有効であったスキーマが有効な状態で動作していました。これを利用して、スキーマを作れる権限を持つユーザは SECURITY DEFINER の関数や拡張のスクリプトの権限を奪取することができました。(CVE-2023-2454)
集合を返す SQL言語関数が、行単位セキュリティ(RLS)ポリシーを持つテーブルを参照していて、呼び出し元の問い合わせにインライン化できる場合に、その RLSポリシーは異なるロールでキャッシュされたプランの再使用を伴う一部の場合に正しく働きませんでした。
これにより、ユーザが本来見ることのできない行を参照したり更新したりすることができてしまいました。(CVE-2023-2455)
不適切なバッファ処理が後のテンプレートの pg_classカタログの修正を喪失するリスクをもたらしていました。CREATE DATABASE 直後にテンプレートデータベース上で CREATE TABLE などのDDL を実行して、チェックポイントを行うと、DDL結果が失われたり、サービスのクラッシュ終了が発生することがありました。
SQL標準では「CREATE SCHEMA AUTHORIZATION role_name」と書くことができて、新たなスキーマ名は role_name になります。しかしながら、一部のコードパスはスキーマ名が指定されている想定になっていて、障害を引き起こしました。
(クラッシュ発生例) db=# CREATE ROLE role1; db=# CREATE SCHEMA scm1; db=# CREATE SCHEMA AUTHORIZATION role1 CREATE TABLE scm1.t1 (id int); server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
プラン作成時に「ERROR: variable not found in ...」や「ERROR: PlaceHolderVar found where not expected」などのエラーが出て、失敗することがありました。
MERGE ではコマンドタグで報告する行数として、NULL を返す BEFORE ROWトリガにより実際には変更されない行数も数えていました。これは通常の UPDATE や DELETE の動作と整合しませんので、修正されました。また、MERGE が行をパーティション間で移動するときに、行を重複して数えないように修正されました。
(誤動作例) db=# CREATE TABLE t7 (id int PRIMARY KEY, v text); db=# INSERT INTO t7 VALUES (1, 'A'); db=# CREATE FUNCTION f_trg7() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN RETURN NULL; END; $$; db=# CREATE TRIGGER trg7 BEFORE UPDATE ON t7 FOR EACH ROW EXECUTE FUNCTION f_trg7(); (いずれも実際には 0件更新だが UPDATEでは 0、MERGEでは 1 になっていた) db=# UPDATE t7 SET v = 'X' WHERE id = 1; UPDATE 0 db=# MERGE INTO t7 t USING (VALUES (1, 'Y')) s (id, v) ON t.id = s.id WHEN MATCHED THEN UPDATE SET v = s.v WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.v); MERGE 1
MERGE により更新または削除される行が同時実行トランザクションで更新されるとき、一部の場合に不適切な振る舞いをしていました。MERGE の実行で、クラッシュや誤ったマージ動作、あるいは、何も行われない、という振る舞いが生じる可能性がありました。
MERGEコマンドを追加したときに見落とされていました。新形式の SQL関数で MERGE を使うときに必要で、ダンプや psql の \sf+ がエラーになりました。
(エラー発生例) db=# CREATE TABLE t9_src (id int primary key, dat text); db=# CREATE TABLE t9_tgt (id int primary key, dat text); db=# CREATE FUNCTION f9() RETURNS void LANGUAGE SQL BEGIN ATOMIC MERGE INTO t9_tgt USING t9_src s on s.id = t9_tgt.id WHEN MATCHED THEN UPDATE SET dat = s.dat WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.dat); END; db=# \q $ pg_dump -s db pg_dump: error: query failed: ERROR: unrecognized query command type: 5 pg_dump: detail: Query was: EXECUTE dumpFunc('33892')
RE そのような場合にパーティション上の複製されたトリガを名前から探していたため、ALTER TABLE ... ENABLE/DISABLE TRIGGER がエラーになっていました。OID を使う実装に修正されました。
(エラー発生例) db=# CREATE TABLE t10fk (id int PRIMARY KEY); db=# CREATE TABLE t10 (id int PRIMARY KEY, fk_id int NOT NULL REFERENCES t10fk (id)) PARTITION BY RANGE (id); db=# CREATE TABLE t10p1 PARTITION OF t10 FOR VALUES FROM (1) TO (100); db=# ALTER TABLE t10 DISABLE TRIGGER ALL; ERROR: trigger "RI_ConstraintTrigger_c_33906" for table "t10p1" does not exist
ALTER TYPE はテーブル列で使われている複合型に対するバイナリ互換性の無い変更を、今のところ許していません。これまでインデックスで使われている場合について見落とされており、本修正で禁止されました。
システム列として行ごと OID が廃止されたことにより、システム列に対する外部キー制約の用途は無くなったと考えられます。また、現状いくつかのコードはもはや対応していません。
ドキュメントには COPY TO は継承子テーブルの行をコピーしないと書かれています。しかしながら、RLS が有効な場合に誤って子テーブルの行がコピーされていました。
場合によってはクラッシュを引き起こす可能性がありました。
translate('54321', '12345', 'abcd') など、文字を削除させる動作をさせた場合に、範囲外バイトの読み込みが生じて、可能性は低いですがクラッシュを引き起こすおそれがありました。
これまでデータベースのデフォルト照合順序に ICU を使っている場合に混乱がありました。
(クラッシュ発生例) db=# SET IntervalStyle TO sql_standard; db=# SELECT ''::interval; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
interval型に対する「P0.1e10D」のような入力は ISO-8601 で公式には認可されていませんが、PostgreSQLではバージョン 15.0 まで長らく許容していました。15.0 で一度禁止されましたが、本バージョンから許容するようになりました。
JSON値の中の文字列リテラルで構文エラーが検出されたほとんど場合に、エラーカーソルを適切に設定することに失敗していました。これは、少なくとも(違う箇所を示す)役に立たないエラーメッセージをもたらし、14.x、15.x では場合によってはクラッシュを引き起こすことがありました。
(15.x でクラッシュを引き起こす例) db=# SELECT E'\n"\\u00000"'::jsonb; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
そのような vacuum_defer_cleanup_age が設定されているとき、PostgreSQL 14.x、15.x では vacuum が誤って未だ有効な行バージョンを除去してしまう可能性がありました。PostgreSQL 13.x、12.x では GiST インデックスにのみ影響があり、インデックスページの早すぎる再利用が生じる可能性がありました。
結果として以下のような予期せぬエラーがあらわれることが報告されています。
ERROR: MultiXactId ... has not been created yet -- apparent wraparound ERROR: could not open file "base/12345/16789" (target block 999): ... ERROR: attempted to lock invisible tuple ERROR: could not access status of transaction 3456789
集約関数は入れ子にできないため、「ERROR: aggregate function calls cannot be nested」を出すのが正しい動作です。この見落としにより、パース時点で拒絶されるべき無効な問い合わせで、エグゼキュータでクラッシュやアサート失敗を引き起こす可能性がありました。
(クラッシュ動作例) db=# WITH cte22 (col1) AS (SELECT 1) SELECT avg(( SELECT avg(a1.col1 ORDER BY (SELECT avg(a2.col2) FROM cte22)) FROM cte22 a1)) FROM cte22 AS a2(col2); server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
イベントトリガが壊れたパースツリーを取得する場合に問題が起きる可能性がありました。なお、SEQUENCE NAME はドキュメントに記載がありませんが、以下のように使用できます。
CREATE TABLE t23 (id int GENERATED ALWAYS AS IDENTITY (SEQUENCE NAME seq23));
この誤りにより、実行時に「ERROR: subplan "..." was not initialized」というエラーが生じる可能性がありました。Initプランはプランツリーやサブプランツリーの開始点です。
統計の種別に dependencies を含む拡張統計を使用した問い合わせの実行時に予期せぬエラー「ERROR: PlaceHolderVar found where not expected」が発生することがありました。
このような形状の問い合わせでは、アサート失敗や、誤った問い合わせ結果、その他の異常が生じるが起きる可能性がありました。
(予期せぬエラーが出るSQL例) db=# SELECT * FROM ( SELECT empno, salary, count((SELECT 1)) OVER (ORDER BY empno DESC) c FROM t26) emp WHERE c = 1; ERROR: WindowFunc not found in subplan target lists
この最適化では集約の引数式が繰り返し可能な結果を持つ必要があり、副問い合わせでは実現できないと考えられます。アサート失敗が報告されました。
配列に対する必要サイズのオーバーフローを正しく検知できるように修正され、不正メモリアクセスによるクラッシュが回避されました。また、生成される配列の末尾のパディングをゼロ埋めするようになり、後の配列利用で奇妙な動作が生じる可能性が回避されました。
制約の無いドメインで発生します。
(障害発生例) db=# CREATE TYPE typ1 AS (c1 int, c2 int); db=# CREATE DOMAIN dom1 AS typ1; db=# CREATE TABLE t29 (a dom1[]); db=# INSERT INTO t29 VALUES ('{"(10,20)","(30,40)"}'); db=# UPDATE t29 SET a[1].c1 = -1; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
「boolcol IS NOT TURE」のような条件での除去が正しく働かず、boolcol が NULL である行を返さない、誤った問い合わせ結果が生じる可能性がありました。この他に「(NOT boolcol)」でのパーティション化も誤って処理されていました。
パーティション除去とは enable_partition_pruning = on で有効となる、プラン作成でのパーティションテーブルに対する最適化です。
parallel_leader_participation = off (デフォルトは on)の場合に、タイミングによってはクラッシュを起こす可能性がありました。
READ COMMITTED 隔離レベルでは、問い合わせが最初に見つけたものよりも新しい行バージョンに、行更新の影響を再適用する必要があるかもしれません。その場合、同時の更新で変化した列に依存する GENERATED列を再計算する必要がありました。
EvalPlanQual は READ COMMITTED 隔離レベルの問い合わせで実行される内部処理です。本障害により、被参照列だけ更新されて、それに連動して計算される GENERATED列は元の値まま、という状態で行が読み取られる動作が報告されました。
警告ログメッセージ「WARNING: buffer refcount leak: ...」が発生しました。
以前の修正の誤りのために 14.x、15.x ではミリ秒以下の値が捨てられて処理されていました。
autovacuum がリレーション毎 vacuum_cost_delay設定付のテーブルを処理するときにはいつでも、遅延バランスは無効と考えられていましたが、設定値が 0 の場合にも誤って有効と判断されていました。
更新可能ビューの元となるビューを CREATE OR REPLACE VIEW で列が増えるように作成しなおした場合に、その後の更新可能ビューへの読み書きで、予期せぬ警告(「WARNING: problem in alloc set MessageContext: req size > alloc size ...」)や、トリガの奇妙な動作、クラッシュが生じることがありました。
パーティションテーブルに対して、「INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...)」という構文を使用するとき、いずれかの子テーブルが親テーブルと同形でない場合(例えば列の物理順序が異なるなど)、クラッシュや誤ったデータ更新を引き起こす可能性がありました。一般的にはエグゼキュータの整合性チェックでエラーになるだけで済みます。
MULTIEXPR_SUBLINKサブプランは、実行プランツリーにおいて、複数の対象リスト要素を持つサブプランを意味します。
このような場合、一般的には「ERROR: unrecognized node type: ...」エラーか、アサート失敗が生じます。
(エラー発生例) db=# CREATE TABLE t39 (a int, b int DEFAULT -1); db=# CREATE VIEW v39 AS SELECT * FROM t39; db=# CREATE RULE r39 AS ON INSERT TO v39 DO ALSO INSERT INTO t39 SELECT 1; db=# INSERT INTO v39 VALUES (0, DEFAULT), (1, DEFAULT); ERROR: unrecognized node type: 148
このような参照は実際にはラテラル参照ですが、明示的に LATERAL と指定していない場合、クラッシュが生じる可能性がありました。
以下のような処理でアサート失敗が報告されました。
db=# CREATE TABLE t40 (a int, b int DEFAULT -1); db=# CREATE VIEW v40 AS SELECT * FROM t40; db=# CREATE RULE r40i AS ON INSERT TO v40 DO ALSO INSERT INTO t40 SELECT * FROM (SELECT a FROM t40 WHERE NEW.a = t40.a) tt; db=# INSERT INTO v40 VALUES (1), (2);
ダンプした結果、もとのコードと異なる内容が出力されてリストア不能になる動作が報告されました。
(障害を起こす関数例) db=# CREATE TABLE t41_1 (c1 int); db=# CREATE TABLE t41_2 (c1 int); db=# CREATE FUNCTION f41 (c1 int) RETURNS void LANGUAGE SQL BEGIN ATOMIC WITH delete_t41 AS ( DELETE FROM t41_1 WHERE c1 = $1 ) INSERT INTO t41_1 (c1) SELECT $1 FROM t41_2; END;
既に失敗したものと印付けされているトランザクションが、SERIALIZABLE で READ ONLY のトランザクションに対する安全なスナップショットの最適化について混乱させていました。一部の場合に最適化が不必要に省略されていました。また、別のある場合にはアサート失敗が起きていました(アサート無しのビルドでは何ら問題ありません)。
単一セッション内でプラグインの開始と停止を繰り返すと、「ERROR: out of relcache_callback_list slots」が生じました。
この変更は一部の予期せぬエラーが発生していた現象を修正します。
現行コードは範囲にマッチするか判断するときに最後のスキャンキーだけを考慮していました。そのため、たいていインデックスを必要とするより多くスキャンしていました。
(障害動作例) db=# CREATE TABLE t45 (a int, b int); db=# INSERT INTO t45 SELECT g, g FROM generate_series(1, 1000000) g; db=# CREATE INDEX ON t45 USING brin (a, b); db=# SELECT * FROM t45 WHERE a = 12345 AND b > 1; -- 遅く動作する db=# SELECT * FROM t45 WHERE a > 1 AND b = 12345; -- 適切に高速動作する
この誤りはアサート失敗を引き起こしますが、実運用むけビルドではほぼ無害です。
取得される値は重要では無いため、この誤りは実運用ビルドにおいて通常は無害と考えられます。原理的にはサーバクラッシュを引き起こす可能性があります。
REPLICA IDENTITY FULL オプションのロジカルレプリケーションは、テーブルにこのような列が含まれていると、正しく行の特定ができず、変更がサブスクリプション側に反映されない挙動が発生しました。
ドキュメントでは CommitTsBuffer という名前でしたが、CommitTSBuffer と実装されていました。関連の待機イベント名と一貫するように、ドキュメントの通りに修正されました。
この待機タイプは 14.0 むけのコードリファクタリングの際に誤って削除されてしまっていました。
結果として wal_keep_size設定に正確には従わない可能性ありました。
スタンバイモードでは実際のところリカバリ進捗をしませんが、その場合でも追跡処理が行われていました。
この機能には OpenSSL 1.1.1 以降でのビルドが必要です。この機能追加はサーバ・クライアントの両方に影響します。
PostgreSQLマスタプロセス(postmaster)が子プロセスが消えたことを観測する前に、OS がその子プロセスの PID を再利用する可能性がありました。これにより、同じ PID で複数の子プロセスが記録されることがあり、混乱を招きました。
本障害が原因と思われるアサート失敗が報告されました。
PostgreSQL のコードでは問題に該当する使い方はありませんでしたが、拡張モジュールで問題が生じるかもしれません。
大きい(8kBを越える)pallocチャンクのサイズが減るという一般的でない場合に、Valgrind検知を有効にしたビルドではチャックからのメモリ解放の定義された状態の印付けを誤っていて、Valgrindのテストで誤った結果が生じる可能性がありました。
非ASCII文字が後に続くバックスラッシュで、有効なロケールによってはアサート失敗が生じる可能性がありました。そのロケールの言語で数字を意味する非ASCII文字で問題が報告されました。
リリースされたバージョンでこのケースに到達可能かどうかは完全には明らかではありませんが、到達した場合はアサート失敗が発生する可能性があります。
PL/perl は、データが値の長方形配列を成しておらずサブリストのネストが揃っていないときに、誤動作することがありました。このような場合、クラッシュやゴミ出力(誤った問い合わせ結果)が発生する可能性がありました。これからはエラーを出すようになります。
PL/Python は、空のサブリストを処理するときや、データが値の長方形配列を成しておらずサブリストのネストが揃っていないとき、誤動作することがありました。前者は出力配列が空になり、後者はエラーが発生します。ただし、一部のケースではクラッシュしたり、予期せぬ出力(誤った問い合わせ結果)が発生していました。
稀な障害例としては、PG_TRY 例外スタックをクリーンアップせずに戻ることがあり、次のスタックレベルが巻き戻される前に別のエラーが発生した場合にクラッシュする危険性がありました。
gssencmode が require に設定されていると、GSS の初期化に失敗した後でも、接続は dead とマークされませんでした。 TLS暗号化の同等のケースで以前から行われてきたように、直ちにエラーを返すように変更されました。
varcharsize をゼロに設定して ecpg_get_data() を呼び出すと、直前のフィールドの最後のバイトに終端ゼロ文字が書き込まれ、そのフィールドのデータが切り捨てられることがありました。
列挙値のハッシュコードは列挙値に割り当てられた OID に依存するため、通常、ダンプとリストアの後は異なります。つまり、多くの場合、行は元のパーティションとは異なるパーティションに入る必要があります。ユーザは --load-via-partition-root オプションを指定することでこの問題を回避できますが、それが無ければ成功する可能性はほとんど無いため、pg_dump がこのようなテーブルで自動的にオプション適用するように変更されました。
また、--load-via-partition-root モードが使用されている場合、リストア前にターゲットテーブルを TRUNCATE を試行しないよう pg_restore が修正されました。これにより、デッドロックやデータの喪失の危険性が回避されます。
このバグにより、pg_dump がパイプに書き込む時、または pg_restore がパイプから読み込む時に誤動作が発生していました。ファイルに対して成功していた同じ処理がパイプ経由だと予期せぬエラーが出る動作が報告されました。
これにより、pgbench スクリプトがパイプライン内でSERIALIZABLEトランザクションを開始しようとした時の以下エラーの発生を回避できます。
ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query
これまでそのような異常を見逃していました。
破損した場合、最初の xidエポックより前にあるように見える周回した 32ビットxid が表示されることがありました。このような値を 64ビット形式に昇格させると、はるか未来の値が生成され、結果として誤った報告が作成されることになります。このような場合には FirstNormalFullTransactionId を返すことで、合理的に正常に動作するようになりました。
これはエラーを出すべきですが、Python 3 ではチェックが誤動作するようにいくつかの API が変更されたため、クラッシュを起こしていました。
それ以外の値を指定すると、インデックスコンテンツへのアクセスが不整合になります。インテル互換のハードウェアでは無害ですが、他のアーキテクチャではクラッシュを引き起こす可能性があります。
クラッシュする動作が報告されました。
$foo のような正規表現は定義として正当ですが、この表現を満たす文字列は存在しません。正規表現コンパイラはそれを認識し、空の「非決定性オートマトン(NFA)」グラフを生成します。このようなグラフを pg_trgm の GIN または GiST インデックス修飾に最適化しようとすると、作業配列の末尾からアクセスすることになり、クラッシュが発生する可能性がありました。
エスケープを展開するコードは、例えば外部テーブルの自動ANALYZE の中など、バックグラウンドプロセスで実行されるとクラッシュする可能性がありました。
これまで大容量メモリを使う動作をすることがありました。
以前は、 make install-strip で -x オプションが使用されていました。本変更により、llvm-strip の誤動作が回避され、出力もわずかに小さくなります。
SGMLドキュメントを構築するには、現在では DocBook の DTDファイルをローカルにインストールすることが必須となっています。以前は xsltproc が sourceforge.net からこれらのファイルを実行中にダウンロードできましたが、sourceforge.net は現在 HTTPS アクセスのみを許可しており、これをサポートする xsltproc の一般的なバージョンはありません。これに対応して、そのようなことが可能または有用であることを示唆するドキュメント箇所が削除され、代わりに xsltproc の --nonet オプションがMakefile に追加されました。
ビルドディレクトリの tmp_check の下に置くように変更されました。以前のコーディングでは、PGXSビルドは、必ずしも書き込み可能でないインストールディレクトリに配置しようとしていました。
モスクワ時間に従っている場合、Europe/Kirov および Europe/Volgograd は、モスクワ時間に従う他のタイムゾーンとの整合性を保つため、数字による略語ではなく MSK/MSD という略語を使用するようになりました。また、America/Yellowknife は America/Edmonton と区別されなくなり、この地域の 1948年以前のタイムスタンプの一部に影響します。
ALTER TABLE ... ENABLE/DISABLE TRIGGER USER はクローントリガをシステムトリガと誤解してスキップしていました。ENABLE/DISABLE TRIGGER の他の形式ではそれらを処理しますが、それらはスーパーユーザチェックを不適切に実施した後でのみ行っていました。
テーブルにそのような列が含まれている場合、REPLICA IDENTITY FULL オプションを使用したレプリケーションは失敗していました。