このリリースは 9.4.25 からの修正リリース(2020年2月13日リリース)です。本リリースが 9.4.x 系列の最終リリースとなります。
9.4.x からのアップデートではダンプ、リストアは不要です。
9.4.25 より前のバージョンからのアップデートの場合には、9.4.25 のリリース情報も参照してください。
PostgreSQL 9.4.25 から 9.4.26 への変更点
12.2、11.7、10.12、9.6.17、9.5.21、9.4.26 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- 欠けていた ALTER ... DEPENDS ON EXTENSION 文の権限検査が追加されました。(CVE-2020-1720) (Álvaro Herrera) (12)(11)(10)(9.6)
- TRUNCATE ... CASCADE が関連する全てのパーティションを確実に空にするように修正されました。 (Jehan-Guillaume de Rorthais) (12)
- 外部キー制約が追加した副パーティションに付加されない障害が修正されました。 (Jehan-Guillaume de Rorthais) (12)
- パーティションテーブルまたは継承ツリーで同時更新中にクラッシュが生じる可能性があり、修正されました。 (Tom Lane) (12)
- パーティションテーブルの行トリガが適時に正しく副パーティションに複製されるように修正されました。 (Álvaro Herrera) (12)(11)
- ロジカルレプリケーションのサブスクライバ側のコードが、適時に列ごとの UPDATEトリガを実行するように修正されました。 (Peter Eisentraut) (12)(11)(10)
- 大きいトランザクションを多数の分割された一時ファイルに書き出ししなければならないときの、ロジカルデコーディングでのエラーが回避されました。 (Amit Khandekar) (12)(11)(10)(9.6)(9.5)(9.4)
- ロジカルレプリケーションのサブスクライバが行更新を処理するときに、クラッシュやデータ破損の可能性があり、修正されました。 (Tom Lane, Tomas Vondra) (12)(11)(10)
- ロジカルレプリケーションのサブスクライバのクラッシュが修正されました。サブスクライブしているテーブルで DDL変更(ALTER TABLE)をした後にクラッシュが発生しました。 (Jehan-Guillaume de Rorthais, Vignesh C) (12)(11)(10)
- ロジカルレプリケーションのパブリッシャにおける、データベースがクラッシュ終了して再起動した後に起きるアサートエラーが修正されました。 (Vignesh C) (12)(11)(10)(9.6)(9.5)(9.4)
- 物理レプリケーションスロットにおいて pg_replication_slot_advance() の効果が再起動後も維持されるようになりました。 (Alexey Kondratov, Michael Paquier) (12)(11)
- REPLICA IDENTITY FULL を用いたロジカルレプリケーションの効率が改善されました。 (Konstantin Knizhnik) (12)(11)(10)
- ベースバックアップが INT32_MAX より大きいデータベースの OID を扱えるように修正されました。 (Peter Eisentraut) (12)
- 常に適切なタイミングでパラレルプランノードが終了(shutdown)されるようになりました。 (Kyotaro Horiguchi) (12)(11)
- Limitノードの下の Gather または GatherMerge プランノードの早すぎる終了(shutdown) が防止されました。 (Amit Kapila) (12)(11)(10)(9.6)
- 多コアCPU でのパラレルハッシュ結合の効率が改善されました。 (Gang Deng, Thomas Munro) (12)(11)
- パラレル CREATE INDEX での動的共有メモリスロットの空きが無いときのクラッシュが回避されました。 (Thomas Munro) (12)(11)
- 動的共有メモリスロットが無いときのメモリリークが修正されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)(9.4)
- 一時テーブルに対するインデックス作成、削除、再構築時にCONCURRENTLYオプションを無視するようになりました。 (Michael Paquier, Heikki Linnakangas, Andres Freund) (12)(11)(10)(9.6)(9.5)(9.4)
- ON COMMIT DELETE ROWS を伴う一時テーブルに対する式インデックスをコミット時にリセットするときに起こりうる誤動作が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- box型、範囲型、inet型に対する BRINインデックスの操作でクラッシュの可能性があり、修正されました。 (Heikki Linnakangas) (12)(11)(10)(9.6)(9.5)
- GiSTインデックス作成での再帰的なページ分割中に起きるクラッシュが修正されました。 (Heikki Linnakangas) (12)
- GINインデックスで削除済みページの処理が修正されました。 (Alexander Korotkov) (12)(11)(10)(9.6)(9.5)(9.4)
- 複数行の VALUESリスト内の SubPlan(副SELECT)でクラッシュの可能性があり、修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- ALTER TABLE で、GENERATED句の式で参照されている列が、同じ ALTER文中の手前で追加されたり型変更されている場合のエラーが修正されました。 (Tom Lane) (12)
- タプル変換時に、失った属性に対するデフォルト値の挿入に失敗していたものが修正されました。 (Vik Fearing, Andrew Gierth) (12)(11)
- チェックポイント処理にて、削除されているかもしれないリレーションのセグメントを開くことで、稀に PANIC になる可能性があり、修正されました。 (Thomas Munro) (12)
- FileClose() 失敗後におきるクラッシュが修正されました。 (Noah Misch) (12)(11)(10)
- 外部テーブルに対する複数の AFTER ROW トリガの処理が修正されました。 (Etsuro Fujita) (12)
- リファレンス渡しのデータ型の集約関数の遷移状態でクラッシュの可能性があり、修正されました。 (Andres Freund, Teodor Sigaev) (12)(11)(10)(9.6)(9.5)(9.4)
- to_date() と to_timestamp() のエラー報告が改善されました。 (Tom Lane, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
- 紀元前の日付に対する EXTRACT(ISOYEAR FROM timestamp) に一年ずれた結果を返す誤動作があり、修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- char型に対する <> 演算子があいまいな照合順序のエラーを適切に報告するようになりました。 (Tom Lane) (12)
- TIDスキャンがシーケンシャルスキャンとして処理されないように修正されました。 (Tatsuhito Kasahara) (12)
- システムカタログに自己参照ビューがあるときの information_schemaビューでのスタックオーバフローが回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- walsenderプロセスが pg_stat_activity のトランザクション開始時刻に常に NULL を見せるようになりました。 (Álvaro Herrera) (12)(11)(10)
- ハッシュ結合で、内側リレーションが巨大な場合の性能が改善されました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)(9.4)
- 多数の稼働中 walsenderプロセスがあるときの、スピンロック競合が軽減されました。 (Pierre Ducroquet) (12)
- EXPLAIN の出力で "Subplans Removed" フィールドの配置が修正されました。 (Daniel Gustafsson, Tom Lane) (12)(11)
- EXPLAIN の SETTINGS オプションが非テキストの出力フォーマットで空で出力されるように修正されました。 (Tom Lane) (12)
- ユーザが問い合わせに明示的に現れるテーブルの対応する列を読める場合には、プランナが潜在的に漏洩のあるテストを子テーブル(パーティション)の統計情報に適用できるようにしました。 (Dilip Kumar, Amit Langote) (12)(11)
- 単一行副問い合わせの結合に対する積極的すぎる組み換えによって引き起こされるプランナのエラーが修正されました。 (Tom Lane) (12)
- 「no = operator for opfamily NNNN」というプランナのエラーが修正されました。 (Tom Lane) (12)
- 範囲型に対する <@ および @> 演算子に対する選択度の計算で、境界ケースでのクラッシュ、または、誤った見積もりが、修正されました。 (Michael Paquier, Andrey Borodin, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- MVC(最頻値)の拡張統計情報を使っているときの、OR句に対するプランナの不正確な見積もりが修正されました。 (Tomas Vondra) (12)
- MCV(最頻値)拡張統計情報を適用するときに、システム列を無視するようになりました。 (Tomas Vondra) (12)(11)(10)
- BRINインデックスのロジックが、仮定の BRINインデックスに対応するように修正されました。 (Julien Rouhaud, Heikki Linnakangas) (12)(11)(10)
- 条件付き INSTEADルールを伴うビューの自動更新を使おうとするときのエラー報告が改善されました。 (Dean Rasheed) (12)(11)(10)(9.6)(9.5)(9.4)
- 複合型が範囲型を通して間接的に自身に含まれることを防止しました。 (Tom Lane, Julien Rouhaud) (12)(11)(10)(9.6)(9.5)(9.4)
- record のような疑似データ型を返すパーティションキーの式が禁止されました。 (Tom Lane) (12)(11)(10)
- インデックスを作成できないデータ型を返す式に対するインデックスの作成時のエラーメッセージが修正されました。 (Amit Langote) (12)(11)(10)(9.6)(9.5)(9.4)
- VALUESリストのみからなるマテリアライズドビューのダンプ時に、指定した列名を出力するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- ビューまたはルールの依存関係の計算時に xmltable関数で参照されているデータ型と照合順序を考慮するように修正されました。 (Tom Lane) (12)(11)(10)
- RADIUS認証のオプションのパラメータ値に対して、小文字への変換と63バイトへの切り詰めを行わないように修正されました。 (Marcos David) (12)(11)(10)
- 受信した NOTIFYメッセージを ReadyForQuery 送信後でなく送信前にクライアントに送信するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)
- GSSAPI暗号化使用時のノンブロッキングI/O処理のバグが修正されました。 (Tom Lane) (12)
- ビルド時に GSSAPI が無効の場合にも libpq が GSS 関連の接続パラメータを解析するように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- ECPG の PGTYPEStimestamp_fmt_asc() 関数で、%b、%B 書式指定時の誤った処理が修正されました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
- ecpglib でメモリ不足によるエラー発生後にクラッシュが発生しないように修正されました。 (Tom Lane) (12)
- 並列の pg_dump や pg_restore でワーカプロセスの作成に失敗した場合にクラッシュや無限ループが発生しないように修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- pg_dump や pg_restore の並列実行をシグナルを介して終了しようとしたときに、クラッシュまたはハングアップが発生する可能性があり、防止されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- pg_upgrade で、テーブル内のアップグレードできないデータ型を調べるときに、配列と範囲のベースとなるデータ型を調べるようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- createuser の --connection-limit オプションの引数に、より厳格な構文チェックを適用するようになりました。 (Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
- より多くの場合で、PL/pgSQL の複合型変数によって参照される指定型の変更に対応できるになりました。 (Ashutosh Sharma, Tom Lane) (12)(11)
- postgres_fdw で「UPDATE remote_tab SET (x, y) = (SELECT ...) 」などのコマンドをリモートサーバに送信しようとするときに、クラッシュしないようになりました。 (Tom Lane) (12)(11)(10)(9.6)
- contrib/dict_int で、1 未満の maxlen 設定を拒否するようになりました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
- contrib/tablefunc の crosstab() 関数で NULL のカテゴリ値を許可しないようになりました。 (Joe Conway) (12)(11)(10)(9.6)(9.5)(9.4)
- OpenSSL の SSL_clear_options() 関数に対する configure の調査を修正して、1.1.0 より前の OpenSSLバージョンで動作するようになりました。 (Michael Paquier, Daniel Gustafsson) (12)(11)
- いくつかのタイムアウトおよび統計情報収集の設定パラメータの変数をPGDLLIMPORT としてマークし、拡張機能が Windows でそれらにアクセスできるようになりました。 (Pascal Legrand) (12)(11)(10)(9.6)(9.5)(9.4)
- slabメモリコンテキストの健全性チェックでメモリリークを回避するようになりました。 (Tomas Vondra) (12)(11)(10)
- LWLock 統計情報メカニズムによって報告された複数の統計情報エントリが修正されました。 (Fujii Masao) (12)(11)(10)
- Windows でプロセス間シグナルの配信が遅延する原因となった競合状態が修正されました。 (Amit Kapila) (12)(11)(10)(9.6)(9.5)(9.4)
- Windows の ReadFile() 関数からのまれなエラー結果の処理が修正されました。 (Thomas Munro, Juan José Santamaría Flecha) (12)
- Windows で、ERROR_ACCESS_DENIED でファイルアクセスの失敗後に数回再試行するようになりました。 (Alexander Lakhin, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- Windows で、例えば pg_ctl restart によって停止された直後にpostmaster を起動する場合に、postmaster のログファイルの共有違反を回避するようになりました。 (Alexander Lakhin) (12)
関数、プロシージャ、トリガ、マテリアライズドビュー、インデックスに対する本SQL文について修正が行われました。本SQL文はデータベースオブジェクトが拡張に依存していると印付けするものです。依存関係があると、拡張を DROPする際にそのデータベースオブジェクトも削除されます。
本SQLの実行際して何ら権限チェックが行われていませんでした。そのため、拡張を削除できるユーザは権限の無いオブジェクトを削除可能でした。また、管理者が拡張を削除する際に権限の無いオブジェクトを削除させるように仕組むことができました。
本SQLの実行には対象オブジェクトの所有者であることが要求されるように修正されました。
パーティションテーブルのパーティションが CASCADEオプション付きでTRUNCATEされた場合で、かつ、パーティションテーブルが他テーブルからの外部キー参照を持っていた場合、参照しているテーブルも空にされるべきです(通常のテーブルもそのように動作します)。参照しているテーブルがパーティションテーブルである場合に検査に取りこぼしがあり、外部キー制約違反の行が残る可能性がありました。
このため、データベースにパーティションテーブル間の外部キー制約があり、これまでに被参照テーブルにパーティション単位で TRUNCATE を行っていたなら、外部キー違反が無いかを確認することを推奨します。
最も簡単な確認方法は新たに同定義の外部キー制約を加えることです(確認用なので追加に成功したら、削除します)。ロック取得の観点から、これが実施しにくい場合には、SELECT文で制約違反の行を探してください。
複数階層パーティションテーブルの第二階層以下にパーティションをアタッチするとき、そのパーティションテーブルを参照する外部キー制約が新たなパーティションに複製されず、その結果、後で制約違反を引き起こす可能性がありました。
簡単な修復方法は、そのパーティションをデタッチしてアタッチすることです。修復すべきパーティションが大量にある場合には、新たに同定義の外部キー制約を追加する方法が良いでしょう。
(外部キー制約やユニーク制約のトリガではなく)ユーザ定義トリガについて、パーティションの作成やアタッチをするときに取りこぼしが生じるおそれがありました。
このようなトリガが実行されないことがありました。
ファイル識別子を使いすぎて、以下のようなエラーが出るケースが報告されていました。
ERROR: exceeded maxAllocatedDescs (492) while trying to open file "pg_replslot/logical/xid-2362-lsn-0-24000000.spill"
本障害は、サブスクライバのテーブルがパブリッシャからコピーされていないリファレンス渡しのデータ型の列を含む場合に限って、顕在化した問題を発生させます。
text や numeric など格納サイズが大きいデータ型はリファレンス渡しです。ビルドオプションによっては int8 や float8 もリファレンス渡しになります。
更新や削除の操作に際して、既存タプルを探すときに最初に一致したタプルを返すようになりました。これまでは全てを調べる動作になっていました。
大きい OID値を持つデータベースがあるときに、以下のようなエラーが報告されていました。
pg_basebackup: error: could not get write-ahead log end position from server: ERROR: value "3000000000" is out of range for type integer
この障害は、複数バッチの(即ち、件数が多くてメモリに載らない場合の)パラレルハッシュ結合の際に、以下のような予期せぬ警告を発生させました。
WARNING: temporary file leak: File 15 still referenced
これにより、入れ子ループの内側にある等、このようなプランノードを複数回スキャンする必要がある場合の障害を回避します。本障害でクラッシュする動作が報告されました。
無駄な処理を削って、それによる CPUキャッシュ間の同期処理の発生を回避します。
そのような場合には非パラレルのインデックス作成が行われるようになります。
以下のエラーが発生する場合にリークが発生しました。
ERROR: too many dynamic shared memory segments
これにより一時テーブルが ON COMMITアクションを持っていた場合の奇妙なエラーを回避します。以下のような発生ケースが報告されました。
=# CREATE TEMP TABLE t0(c1 INT PRIMARY KEY) ON COMMIT DELETE ROWS; =# REINDEX TABLE CONCURRENTLY t0; ERROR: index "t0_pkey_ccnew" already contains data
他のセッションは一時テーブルにアクセスできないため、一時テーブルに対するインデックス作成で CONCURRENTLY を使う利点はありません。
本障害ではデッドロックや、削除済みページの誤った状態更新、最近に削除されたページを辿る動作の失敗、を起こす可能性があり、これらが回避されました。
一例として、以下のような形状の問い合わせが該当します。
SELECT * FROM ( SELECT * FROM ( VALUES ('A'::text NOT IN ( SELECT 'E'::text AS col_1 FROM ( VALUES (NULL), (NULL), (NULL), (NULL)) AS tab_1 (col_2) WHERE false), NULL, 'B'::text, 3::int), (false, 4::int, 'B'::text, 0::int)) AS tab_3 (col_4, col_5, col_6, col_7) WHERE tab_3.col_4) AS tab_8 ORDER BY 1, 2, 3, 4;
例えば以下のような操作でエラーが発生していました。
db=# CREATE TABLE t25 (a int, b int, c int, x int); db=# INSERT INTO t25 VALUES (1, 1, 1, 1), (2, 2, 2, 2); db=# ALTER TABLE t25 DROP COLUMN x, ALTER COLUMN a TYPE bigint, ALTER COLUMN b TYPE bigint, ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED; ERROR: attribute 1 of type t25 has wrong type DETAIL: Table has type integer, but query expects bigint.
この障害で、定数デフォルトを伴う ALTER TABLE .. ADD COLUMN で追加された列の値が誤って NULL と読み取られる可能性がありました。
タプル変換とは行データをレコード型に代入するときなどに必要となる内部処理です。
この問題は data_sync_retry = on の場合のみ該当します。off の場合には FileClose() 失敗は(仕様通りに)PANIC になるはずです。
トリガを駆動されたときにアサートエラーが生じる動作が報告されました。
PL/pgSQL関数を使ってユーザ定義した集約関数を実行したときにアサートエラーが生じるケースが報告されました。
入力文字列中の誤った月や曜日に関するエラー報告が、誤った部分を示すときマルチバイト文字の途中で切り出すことがあり、続くエラーの元になる不適切なエンコードのエラーメッセージをもたらしました。
これを回避するため、次の空白文字までを切り出し範囲とするようになりました。
(障害動作例: B.C. 7年について -7 を返すのが正しい動作) db=# SELECT EXTRACT(ISOYEAR FROM 'Feb 03 04:05:06 0007 PST BC'::timestamp); date_part ----------- -6 (1 row)
以下のように、どの照合順序を使って処理すべきか判別できない場合に、予期せぬエラーメッセージや、アサートエラーが出ていました。
db=# CREATE TABLE t33 (c0 char(2) COLLATE "C", c1 char(2) COLLATE "POSIX"); db=# INSERT INTO t33 VALUES ('', ''); db=# SELECT * FROM t33 WHERE c1 <> c0; ERROR: cache lookup failed for collation 0 (予期せぬエラー出力) db=# SELECT * FROM t33 WHERE c1 = c0; ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly. (こちらは望ましいエラー出力)
リファクタリングの誤りで、TIDスキャン(ctid列による選択)が実行時統計情報ビューでシーケンシャルスキャンとして数えられており、さらに、シーケンシャルスキャンのようにテーブル全体の術部ロックを取りました。後者の動作は SERIALIZABLE トランザクションモードで不要な直列化失敗エラーを引き起こす可能性がありました。
リレーションが更新可能かを調べる内部実装関数が、自己参照ビューに対して無限再帰を起こすため、そのような場合に処理を打ち切るように修正されました。
これまでは xact_start 列にプロセス開始時刻があらわれることがありました。
テキスト以外の出力形式では、このフィールドは Plans 副グループの内側に出力されて、構文的に不正な出力になっていました。
JSON形式であれば以下のような形の不正な出力があり得ました。
"Plans": [ { ..サブプラン.. }, "Subplans Removed": 5, { ..サブプラン.. } ]
"Subplans Removed" は親の Append や MergeAppend プランノードに付けるように修正されました。
この変更はテキスト形式にも反映されます。これまで InitPlan の下にあった Subplans Removed は、InitPlan よりも手前に現れるようになります。
非テキストの出力フォーマットでは、たとえ値が空やゼロであっても、各フィールドが存在することが期待されます。
この変更は、CVE-2017-7484 セキュリティ障害の修正で生じた、パーティションテーブルの性能問題を修正します。先のセキュリティ修正では、現在ユーザが直接には読むことのが許可されない列の統計情報に、漏洩のある演算子を適用できないようにしました。
一方で、親のパーティションテーブルのみに参照権限があって、個々のパーティションには権限が無いというのは、ごく一般的な状態です。ユーザは親のパーティションテーブルを通して、子パーティションの列を参照できます。このような場合に、先のセキュリティ修正のためにプランナの見積もりが必要以上に劣化していました。
この誤りは、以下のような予期せぬエラーをもたらしました。また、アサートエラーになる可能性もありました。
(本エラーを発生させる問い合わせ例) db=# SELECT FROM ( SELECT FROM pg_stat_bgwriter AS r0 LEFT JOIN pg_stat_bgwriter AS r1 ON (true), LATERAL ( SELECT FROM pg_publication AS r2, LATERAL ( SELECT FROM pg_class WHERE r1.buffers_alloc IS NOT NULL ) AS sq0 LIMIT 1) AS sq1) AS sq2; ERROR: failed to construct the join relation
LIKE や正規表現のパターンマッチ演算子をバイナリ互換のインデックス演算子クラスでマッチさせようとするときに発生しました。
(発生例: text型とバイナリ互換の char型に対応した bpchar_ops を使用しています) db=# CREATE TABLE t43 (c text); db=# CREATE INDEX i43 ON t43 (c bpchar_ops); db=# SELECT * FROM t43 WHERE t43.c LIKE ''; ERROR: no = operator for opfamily 426
列のプランナ統計情報と比較条件の値とが特定条件に合致する場合に問題が発生します。
拡張統計情報が a と b の間に作られているところで、以下のような問い合わせを実行するとき、アサートエラーが出る動作が報告されました。アサート無効のときにはプランナの見積もりが不正確になります。
SELECT * FROM t45 WHERE (a = 1) OR (b = 1) OR (c = 1)
これにより以下のように、システム列を参照する問い合わせで予期せぬエラーが発生するのを防止します。
db=# CREATE TABLE t46 (id int, c1 int, c2 int); db=# INSERT INTO t46 SELECT g, g, g FROM generate_series(1, 1000) as g; db=# CREATE STATISTICS s46 ON id, c1 FROM t46 ; db=# ANALYZE t46; db=# SELECT (ctid::text::point)[0] blkno, count(*) cn FROM t46 GROUP BY blkno ORDER BY cn DESC LIMIT 10; ERROR: negative bitmapset member not allowed
これまでは、何らかインデックスアドバイザ拡張が仮定の BRINインデックスを伴うプランを生成させようとすると、BRINコスト見積もりコードが常にインデックスのメタページに物理的にアクセスしようするため、失敗しました。
これはサポートされていないものですが、これまでは、そのことを示すエラーがエグゼキュータによる実行時にしか出ませんでした。そのため、不明瞭なプランナのエラーで原因が隠されてしまうおそれがありました。
リライタの段階で以下のようなエラーメッセージが出るようになりました。
db=# CREATE TABLE t48 (a int PRIMARY KEY, b text); db=# INSERT INTO t48 VALUES (2, '2'); db=# CREATE VIEW v48 AS SELECT a, b, a AS aa FROM t48; db=# CREATE RULE v48_upd_rule AS ON UPDATE TO v48 WHERE OLD.a > 0 DO INSTEAD UPDATE t48 SET b=NEW.b WHERE a=OLD.a; db=# UPDATE v48 SET b = 'ROW 2' WHERE a = 2; ERROR: cannot update view "v48" DETAIL: Views with conditional DO INSTEAD rules are not automatically updatable. HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. (以下は修正前バージョン 12.1 でのエラーメッセージ) ERROR: no relation entry for relid 2
元々自分自身を含む複合型は作成できない仕様でした。本修正で以下の操作がエラーになります。
db=# CREATE TYPE two_ints AS (a int, b int); db=# CREATE TYPE two_ints_range AS RANGE (subtype = two_ints); db=# ALTER TYPE two_ints ADD ATTRIBUTE c two_ints_range; ERROR: composite type two_ints cannot be made a member of itself drop type two_ints cascade; NOTICE: drop cascades to type two_ints_range (上記は修正後の動作、修正前はエラーにならない)
そのようなパーティションテーブルに対する問い合わせで、何らかエラーやスタックオーバーフロー(ERROR: stack depth limit exceeded)が起きる動作が報告されました。定義時点でエラーが出るようになります。
空の列名でなく自動生成した列名が出力されるようになります。
(修正前) =# CREATE INDEX ON t ((ROW(c))); ERROR: column "" has pseudo-type record (修正後) =# CREATE INDEX ON t ((ROW(c))); ERROR: column "row" has pseudo-type record
=# CREATE MATERIALIZED VIEW mv (c) AS VALUES (1); CREATE MATERIALIZED VIEW (修正前のpg_dump出力) CREATE MATERIALIZED VIEW public.mv AS VALUES (1) WITH NO DATA; (修正後のpg_dump出力) CREATE MATERIALIZED VIEW public.mv AS SELECT "*VALUES*".column1 AS c FROM (VALUES (1)) "*VALUES*" WITH NO DATA;
修正前は、xmltable関数で参照されているデータ型や照合順序を削除することで、ビューやルールを壊すことができました。この修正は新たに作成したビューとルールに適用され、既存のものには適用されません。
=# CREATE EXTENSION seg; =# CREATE TABLE t53 AS SELECT '<s>1 .. 2</s>'::xml AS c; =# CREATE VIEW v53 AS SELECT s::text FROM t53, xmltable('//s' PASSING c COLUMNS s seg); (修正前) =# DROP EXTENSION seg; DROP EXTENSION =# SELECT * FROM v53; ERROR: cache lookup failed for type 16499 (修正後) =# DROP EXTENSION seg; ERROR: cannot drop extension seg because other objects depend on it DETAIL: view xmlview depends on type seg HINT: Use DROP ... CASCADE to drop the dependent objects too.
修正前はパラメータ値を誤って SQL識別子として処理していました。
この修正により、libpq のようなクライアントライブラリでは、トランザクション内で受信した通知をクライアントがトランザクション完了と判断するまで受信可能になります。実際には通知を非同期で受信する必要があるため、動作の違いはおそらくありません。ただ、セッションをまたがる通知のテストケースを作成するのに便利です。
この誤りにより、データが損失したり、それに伴って接続が切断したり、データを残して送信が完了したと判断してスリープ状態となったりする可能性があります。さらに、libpq では接続ごとに暗号化状態を管理できなかったため、複数の暗号化接続を使用する場合にエラーが発生する可能性があります。
この修正により、SSL と同様に機能が無効の場合でも、関連するすべてのパラメータを常に受けつけるようになります。
%b、%B は月の略称、名称に置換されますが、修正前は、1 始まりの月数を 0始まりの月名の配列の添字に使用しており、11月までは翌月の月名に置換され、12月はクラッシュする可能性がありました。
複合型やドメインには対応していましたが、これらについて見逃されていました。
PL/pgSQL の変数によって参照される複合型やテーブルを削除して再作成したとき、以下のようなエラーが生じることがありました。
ERROR: could not open relation with OID 34567
これにより、そのパラメータの無意味な設定によるクラッシュを防止します。
このケースは役に立たず、一部のプラットフォームではクラッシュしました。
この問題により、PostgreSQL が古いバージョンの OpenSSL で構築されている場合、SSL圧縮オプションを必要に応じて設定できなくなる可能性がありました。
これは、idle_in_transaction_session_timeout、lock_timeout、statement_timeout、track_activities、track_counts、およびtrack_functions に適用されます。
プロダクションビルドでは通常、メモリコンテキストチェックが有効にならないため、これは問題ではありません。ただし、デバッグビルド(--enable-cassert や-DUSE_VALGRIND)ではリークが非常に深刻になる可能性があります。
LWLock 統計情報のコード (デフォルトではビルドされません。-DLWLOCK_STATSを使用してコンパイルする必要があります) は、ハッシュテーブルキーの作成が失敗した結果、同じ LWLock およびバックエンドプロセスの複数のエントリを報告する可能性がありました。
これは、NOTIFY で目に見えるタイミングの異常を引き起こし、おそらく他の誤動作も引き起こしました。
知られている限り、この見落としは、実際のクエリの誤動作ではなく、不要な情報を含む以下のようなログメッセージをもたらしました。
LOG: unrecognized win32 error code: ...
これは、対象ファイルに削除のフラグが設定されているが、実際には削除されていないためにファイルを開くことができない場合の対処に役立ちます。例えば、pg_ctl は、postmaster がすでに停止しているかどうかを調べるときに、以下ようなエラーでしばしば失敗しました。
pg_ctl: could not open PID file "c:/pgsql/data/postmaster.pid": Permission denied