このリリースは 9.4.24 からの修正リリース(2019年11月14日リリース)です。
9.4.x からのアップデートではダンプ、リストアは不要です。
ただし、contrib/intarray で <@ 演算子に GiSTインデックスを使っている場合には、下記の 83番の項目を確認してください。
9.4.18 より前のバージョンからのアップデートの場合には 9.4.18 のリリース情報も確認してください。
PostgreSQL 9.4.24 から 9.4.25 への変更点
12.1、11.6、10.11、9.6.16、9.5.20、9.4.25 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- ALTER TABLE でテーブル書き換えを要する他の変更と共に、デフォルト値無しの列を追加したときのクラッシュが修正されました。 (Andres Freund) (12)
- REINDEX CONCURRENTLY のロック処理が修正されました。 (Michael Paquier) (12)
- CREATE INDEX CONCURRENTLY や REINDEX CONCURRENTLY が進行状況を報告するときの、競合状態によるクラッシュが回避されました。 (Álvaro Herrera) (12)
- REINDEX CONCURRENTLY で重複した依存関係エントリが作成されてしまうのが回避されました。 (Michael Paquier) (12)
- VACUUM が未だ実行中のトランザクションに関連する古いマルチトランザクションIDをフリーズしようとするのが防止されました。 (Nathan Bossart, Jeremy Schneider) (12)(11)(10)(9.6)(9.5)
- 式インデックスに対して CLUSTER を実行する時の、「wrong type of slot」エラーが修正されました。 (Andres Freund) (12)
- パーティションテーブルに対する SET CONSTRAINTS ... DEFERRED が失敗していたものが修正されました。 (Álvaro Herrera) (12)(11)
- 親のパーティションテーブルに削除された列が含まれている場合に生じる、パーティションのインデックスを作る際のエラーが修正されました。 (Michael Paquier) (12)(11)
- パーティションテーブルでインデックスのある列の削除について修正されました。 (Amit Langote, Michael Paquier) (12)
- パーティションインデックスが、インデックス同時再作成に失敗した後に削除できるようになりました。 (Michael Paquier) (12)
- パーティション単位での結合(partition-wise join)で、同値クラスメンバーの処理が修正されました。 (Amit Langote) (12)
- 問い合わせの式が操作されているときに、WINDOW句でオフセット式が確実に処理されるようになりました。 (Andrew Gierth) (12)(11)(10)(9.6)(9.5)(9.4)
- 子プロセス配列に空き枠が無いときにパラレル問い合わせがバックグラウンドワーカを要求した場合の、postmaster (サーバの親プロセス) のエラーが回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)
- BEFORE UPDATEトリガを伴うテーブルの EvalPlanQual再チェックでひき起こされるクラッシュが修正されました。 (Andres Freund) (12)
- 問い合わせが TOASTテーブルにアクセスしようとしたときの、「unexpected relkind」エラーが修正されました。 (John Hsu, Michael Paquier, Tom Lane) (12)(11)
- パラレルワーカ起動時に GUCパラメータを設定する際のエラー発生時に、関連するエラーコンテキスト行を出力するようになりました。 (Thomas Munro) (12)(11)(10)(9.6)(9.5)
- read/write でオープンされたファイルにだけ fsync() が適用されるようになりました。 (Andres Freund, Michael Paquier) (12)(11)(10)(9.6)(9.5)(9.4)
- 文字エンコーディング変換が以前より長い文字列を扱えるようになりました。 (Álvaro Herrera, Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- ウィンドウ関数で不要に巨大なタプルストアが作成されるのが回避されました。 (Andrew Gierth) (12)(11)(10)(9.6)
- repalloc() がサイズを大幅に縮小したときには、システムにメモリ空間を返却するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- アーカイブリカバリの最後に、一時的な WAL とヒストリファイルが確実に削除されるようになりました。 (Sawada Masahiko) (12)(11)(10)(9.6)(9.5)
- recovery_min_apply_delay設定が有効な場合のアーカイブリカバリでのエラーが回避されました。 (Fujii Masao) (12)(11)(10)(9.6)(9.5)(9.4)
- クラッシュリカバリ時には、restore_command、recovery_end_command、recovery_min_apply_delay の設定が無視されるようになりました。 (Fujii Masao) (12)
- パブリッシャとサブスクライバがテーブルの REPLICA IDENTITY列について異なる認識を持っている場合のロジカルレプリケーションのエラーが修正されました。 (Jehan-Guillaume de Rorthais, Peter Eisentraut) (12)(11)(10)
- ロジカルレプリケーションの walsenderプロセスの停止における不要な遅延が回避されました。 (Craig Ringer, Álvaro Herrera) (12)(11)(10)(9.6)(9.5)(9.4)
- ロジカルレプリケーションの walreceiverプロセスでタイムアウト処理が修正されました。 (Julien Rouhaud) (12)(11)(10)
- ロジカルデコーディングに対するレプリケーションメッセージに正しくタイムスタンプを付与するように修正されました。 (Jeff Janes) (12)(11)(10)(9.6)(9.5)(9.4)
- バックエンドプロセスがそれまで同期レプリケーションが発生するのを待機していたとき、バックエンド終了時の競合状態が修正されました。 (Dongming Liu) (12)(11)(10)(9.6)(9.5)(9.4)
- PAM認証が使われているとき、接続中断についてログメッセージを出さないようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- bitshiftright() の誤動作が修正されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- 文字列の position()関数(あるいは strpos()関数)の空の検索文字列に対する結果が修正されました。 (Tom Lane) (12)
- interval型の掛け算で境界値の整数オーバーフローの検出が修正されました。 (Yuya Watari) (12)(11)(10)(9.6)(9.5)(9.4)
- ispell のテキスト検索辞書が誤った接辞データを含む場合にクラッシュすることがあり、回避されました。 (Arthur Zakirov) (12)(11)(10)(9.6)
- GiSTインデックスを VACUUMするときのメモリリークが回避されました。 (Dilip Kumar) (12)
- Windowsで、「Norwegian (Bokmål) 」ロケール名の追加の書き方も認識するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- libpq が整数パラメータの文字列に末尾の空白を許容するように修正しました。 (Michael Paquier) (12)
- libpq で、構文的に無効な connect_timeoutパラメータ値によってひき起こされたエラーの後に CONNECTION_BAD接続状態を正しく報告するようになりました。 (Lars Kanis) (12)
- ENABLE_NLS が定義されていて、ECPGクライアントが ecpglib.h を含む場合のコンパイル失敗が回避されました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- パーティションテーブルの外部キー制約について、パラレルリストアのスケジューリングが修正されました。 (Álvaro Herrera) (12)
- pg_dump で、似た名前のトリガと行単位セキュリティポリシーオブジェクトについて、安定した出力順序が保証されました。 (Benjie Gillam) (12)(11)(10)(9.6)(9.5)(9.4)
- PostgreSQL 12 から sql_identifier型の元となる型がvarchar型から name型に変更されため、pg_upgrade で sql_identifier型の列を持つテーブルが拒否されるようになりました。 (Tomas Vondra) (12)
- line型など表現が変更されたデータ型に対して、pg_upgrade のチェックが改善されました。 (Tomas Vondra) (12)(11)(10)(9.6)(9.5)(9.4)
- --dry-runオプション付きの pg_rewind で pg_control の更新を避けるようになりました。 (Alexey Kondratov) (12)
- -sオプション付きの pg_waldump の不具合が修正されました。 (Andrey Lepikhov) (12)(11)(10)(9.6)(9.5)(9.4)
- --bkp-detailsオプション付きの pg_waldump でフルページライトを伴うWALレコードに対する余分な改行の出力を避けるようになりました。 (Andres Freund) (12)(11)(10)(9.6)(9.5)
- pg_waldump での小さなメモリリークが修正されました。 (Andres Freund) (12)(11)(10)(9.6)(9.5)
- pqsignal() がエクスポートされた libpq のシンボルとして復帰しました。 (Tom Lane) (12)
- libperl の存在有無に対する configure のテストが修正され、最近の RedHat のリリースでも動作するようになりました。 (Tom Lane) (12)(11)(10)(9.6)(9.5)(9.4)
- PowerPC上におけるスピンロックの正しいコード生成が保証されました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)(9.4)
- AIX上で -qsrcmsgコンパイラオプションを使用しなくなりました。 (Noah Misch) (12)(11)(10)(9.6)(9.5)(9.4)
- OpenSSL のファイルパス上に空白がある場合にも処理できるようにMSVC のビルド処理が修正されました。 (Andrew Dunstan) (12)(11)(10)(9.6)(9.5)(9.4)
- カスタムリレーションオプションを設定するALTER TABLE ... SET ... の不具合が修正されました。 (Michael Paquier) (11)(10)(9.6)
- すべての親テーブルが変更されていない限り、多重に継承された列の型の変更が許可されなくなりました。 (Tom Lane) (11)(10)(9.6)(9.5)
- トランザクション内の ANALYZEコマンドで同じテーブルが 2回指定された場合のエラーが回避されました。 (Tom Lane) (11)
- ICU照合を用いた ILIKE文で大文字小文字を区別できるようプランナーのテストが修正されました。 (Tom Lane) (11)(10)
- WITH CHECK OPTION式と行セキュリティポリシーの式における行全体の変数の扱いが修正されました。 (Andres Freund) (11)(10)(9.6)(9.5)(9.4)
- BEFORE UPDATEトリガが古いタプルをそのまま返し、それが最後のトリガではない場合のダブルフリーが防止されました。 (Thomas Munro) (11)(10)(9.6)(9.5)(9.4)
- x = ANY(配列)、もしくは同様の操作で、定数の NULL配列が含まれる場合のクラッシュが修正されました。 (Tom Lane) (11)
- SERIALIZABLEモードで、確実に正しい行バージョンで行レベルの述語ロックが取得されるように修正されました。 (Thomas Munro, Heikki Linnakangas) (11)(10)(9.6)(9.5)(9.4)
- HOTによるヒープページ除去中の不要なカタログ参照が回避されました。 (Thomas Munro) (11)(10)
- ハッシュテーブルをグループ化するための JITコンパイルの等値比較の失敗が修正されました。これは性能低下をもたらしていました。 (Andres Freund) (11)
- ロジカルデコーディングで、スナップショットの再構築時にサブトランザクションが正しく考慮されるようになりました。 (Masahiko Sawada) (11)(10)(9.6)(9.5)(9.4)
- ALTER SYSTEM で postgresql.auto.conf の重複エントリに対処するようになりました。 (Ian Barwick) (11)(10)(9.6)(9.5)(9.4)
- 設定ファイルで空のファイル名を持つ include ディレクティブを拒否し、再帰的なファイルのインクルードをより明確に報告するようになりました。 (Ian Barwick, Tom Lane) (11)(10)(9.6)(9.5)
- time with time zone 入力で不完全な日付指定が検出されないいくつかのケースが修正されました。 (Alexander Lakhin) (11)(10)(9.6)(9.5)(9.4)
- json[b]_populate_record() および json[b]_populate_recordset() のAS句から型情報を取得する機能が復元されました。 (Tom Lane) (11)
- XMLTABLE で名前空間ノードを選択する際のクラッシュが修正されました。 (Chapman Flack) (11)(10)
- ICU 照合を使用する場合の lower()、upper()、および initcap()関数のメモリリークが修正されました。 (Konstantin Knizhnik) (11)(10)
- GIN ポスティングリストの誤った圧縮ロジックが修正されました。 (Heikki Linnakangas) (11)(10)(9.6)(9.5)(9.4)
- KNN-GiST の Infinity、NaN、および NULL 値の処理が修正されました。 (Alexander Korotkov) (11)(10)(9.6)(9.5)(9.4)
- GiST および SP-GiST インデックスを使った KNN検索で、NULL の処理が修正されました。 (Nikita Glukhov) (11)(10)(9.6)(9.5)(9.4)
- psqlで、予期しない接続の切断と再接続の成功後に、サーバに関する内部状態を再同期するようになりました。 (Peter Billen, Tom Lane) (11)(10)(9.6)(9.5)(9.4)
- psql でプラットフォーム固有の NULL ポインタ参照が修正されました。 (Quentin Rameau) (11)(10)(9.6)(9.5)(9.4)
- pg_dump が 8.3 より前のサーバに対して再び動作するように修正されました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
- pg_restore で、「-f -」を標準出力への出力と解釈するようになりました。 (Álvaro Herrera) (11)(10)(9.6)(9.5)(9.4)
- pg_basebackup中のファイル読み取りエラーを検出するようになりました。 (Jeevan Chalke) (11)(10)(9.6)(9.5)(9.4)
- pg_basebackup で、バックアップが終了するまで出力ファイルをfsync しないようになりました。 (Michael Paquier) (11)(10)
- pg_rewind で起動中の同期元クラスタを使用した場合に、pg_dump と同様にタイムアウトを無効にするようになりました。 (Alexander Kukushkin) (11)(10)(9.6)(9.5)
- pg_waldump で、btree ページ分割レコードに newitemoff フィールドを含めるようになりました。 (Peter Geoghegan) (11)(10)(9.6)(9.5)
- vacuumdb で --jobs オプションに大きな値を使用した場合にファイル記述子の不足をより適切に処理するように修正されました。 (Michael Paquier) (11)(10)(9.6)(9.5)
- PL/pgSQL で複合型の置換をより適切に処理するように修正されました。 (Tom Lane) (11)
- contrib/amcheck でホットスタンバイ中にログ取得なし(UNLOGGED)インデックスをスキップするように修正されました。 (Andrey Borodin, Peter Geoghegan) (11)(10)
- contrib/intarray の GiST 演算子クラスが修正され、空配列が <@ で失敗しないようになりました。 (Tom Lane) (11)(10)(9.6)(9.5)(9.4)
- PowerPC で、xlc コンパイラの __fetch_and_add() 関数に依存しないようになりました。 (Noah Misch) (11)(10)(9.6)(9.5)
- タイムゾーンデータファイルが tzdata release 2019c に更新されました。 (11)(10)(9.6)(9.5)(9.4)
- pg_dump でビューの循環的な依存関係の処理が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
- python3 または python2 しか見つからない場合に configure --with-python が成功するようになりました。 (Peter Eisentraut, Tom Lane) (9.6)(9.5)(9.4)
以下のような発生例が報告されました。c1列の追加がテーブル書き換えを要する変更で、デフォルト値無しの列追加が c2 です。
db=# CREATE TABLE t1 (id int); db=# CREATE SEQUENCE seq1; db=# ALTER TABLE t1 ADD COLUMN c1 numeric(10,0) NOT NULL DEFAULT nextval('seq1'), ADD COLUMN c2 varchar(20); server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
REINDEX CONCURRENTLY は新たな版のインデックスに対してセッションレベルのロックを取得しておらず、潜在的に他セッションによる早すぎる操作を許していました。また、悪いタイミングでの問い合わせキャンセルや割り込みによるセッション終了により、REINDEX CONCURRENTLY が持つセッションレベルロックが解放されない恐れがありました。
この障害により pg_depend の肥大化が生じますが、それ以外の害はありません。既存の重複エントリは pg_depend システムテーブルを操作するか、インデックスを一度削除することで除去できます。
この障害により、古い実行中のトランザクションが終了するまでの間、VACUUM が失敗していました。
VACUUM 実行で以下のようなエラーが出るケースが報告されました。
ERROR: multixact ... from before cutoff ... found to be still running
CLUSTERコマンドで以下のような予期せぬメッセージが発生していました。
ERROR: trying to store a heap tuple into wrong type of slot
トリガが無い、という不適切なエラーが生じていました。以下に発生例を示します。
db=# CREATE TABLE t7p (a int PRIMARY KEY) PARTITION BY LIST (a); db=# CREATE TABLE t7p12 PARTITION OF t7p FOR VALUES IN (1, 2) PARTITION BY LIST (a); db=# CREATE TABLE t7p1 PARTITION OF t7p12 FOR VALUES IN (1); db=# CREATE TABLE t7p2 PARTITION OF t7p12 FOR VALUES IN (2); db=# CREATE TABLE t7p3 PARTITION OF t7p FOR VALUES IN (3); db=# CREATE TABLE t7fk (a int REFERENCES t7p DEFERRABLE INITIALLY IMMEDIATE); db=# BEGIN; db=# SET CONSTRAINTS t7fk_a_fkey DEFERRED; ERROR: no triggers found for constraint with OID 24861
条件に該当するCREATE INDEXコマンドに対して以下のような予期せぬエラーが出るケースが報告されました。
ERROR: unexpected varattno 4 in expression to be mapped
これまではインデックスの依存性に関するエラーを出して失敗していましたが、自動的にインデックスも削除されるべきでした。
このような場合に、インデックスの pg_class.relispartition フラグが誤った状態で残っていて、DROP INDEX の失敗をもたらしていました。DROP INDEX で、以下のようなエラーが出る動作が報告されました。
ERROR: could not find tuple for parent of relation ...
この誤りで、本来可能なパーティション単位での結合プランを使えなくなるか、「could not find pathkey item to sort」というプランナのエラーになる可能性があります。
この誤りは、オフセットが自明でない式のときに様々なエラーをひき起こす可能性がありました。一例として、関数内の問い合わせが WINDOW句のオフセット式で関数パラメータを参照していて、関数がインライン化されている場合に以下のようなエラーを出すことがありました。
ERROR: no value found for parameter 1
以下のエラーが発生するケースが報告されました。稀ですが本障害で postmaster のクラッシュをひき起こす可能性もあります。
FATAL: no free slots in PMChildFlags array
本障害で更新SQL処理のバックエンドプロセスのクラッシュが生じます。EvalPlanQual再チェックは、READ COMMITTEDトランザクション隔離レベルでのSQL実行における内部的な処理です。
本来、権限が無いというエラーが出るべきところで、不適切なエラーが出ていました。
(本障害によるエラー例) db=> REINDEX TABLE pg_toast.pg_toast_16388; ERROR: unexpected relkind: 116 (本来生じるべきエラーは以下) ERROR: must be owner of table pg_toast_16388
設定パラメータの誤りでパラレル問い合わせがエラーになったときに、エラーメッセージから誤っている個所が分かりにくいという問題がありました。
一部のコードパスではリードオンリーで開いたファイルにも fsync() を試みていました。これは一部プラットフォームではエラーをひき起こし、サービスダウンの原因となりました。
(Windowsプラットフォームで以下PANICの発生が報告されました) PANIC: could not fsync file "pg_replslot/xxx/state": Bad file descriptor
これまでは入力文字列で 0.25GB が上限でしたが、これからは変換後の出力が1GB を超えない限り処理できるようになります。
タプルストアとは、問い合わせの中間結果の表形式データを格納する領域です。一部の場合にタプルストアがソーステーブルの、問い合わせに必要な列だけではなく、全列を含むことがありました。
本修正は問い合わせで生じる不要に大きい一時ファイルを小さくします。
repalloc() は PostgreSQL のメモリマネージャモジュールが提供する標準ライブラリの realloc() に似た動作をする関数です。
これまで、アーカイブリカバリ後のオンラインWALディレクトリにRECOVERYHISTORYファイルが残る動作がありました。
recovery_min_apply_delay はアーカイブリカバリの際の設定では通常使われませんが、動作すべきでした。これまでは設定すると常にアーカイブリカバリに失敗し、アサート有効のビルドではアサート失敗が生じました。
これらは バージョン12 から postgresql.conf に記述するようになったため、クラッシュリカバリ時にも有効になっていることが有り得ますが、このときこれら設定に従うことは望ましくありません。クラッシュリカバリが完了するまで、これらの設定は無視されるようになります。
パブリッシャにその列が存在しないときに、サブスクライバで REPLICA IDENTITYの一部として列を宣言すると、下記のエラーをひき起こしました。
ERROR: negative bitmapset member not allowed
これまでは場合によっては wal_sender_timeout の時間だけ停止が滞留することがあり、PostgreSQLサービス停止を遅らせました。
誤ったロジックがロジカルレプリケーションにおけるwal_receiver_timeout の働きを妨げていました。パブリッシャ側の walsender が終了したのにサブスクライバ側のlogical worker が待ち続けるという動作が報告されました。
この誤りで、例えば pg_stat_subscription.last_msg_send_time がたいてい NULL になりました。
この障害によりバックエンドプロセス終了が遅くなりました。
libpqベースのクライアントは一般的に、最初の接続試行が失敗するまでユーザにパスワード入力を促さないため、パスワードが必要な場合には二回接続を試みます。それゆえ、サーバはクライアントがパスワードを要する接続を閉じたときに無駄なログメッセージを出さないように書かれています。しかしながら、PAM認証ではそのようになっておらず、余計な認証失敗メッセージを複数出力していました。
bitshiftright() はビット列データ型(bit、bit varying)の右シフト演算子の実装関数です。ビット列の長さが 8 の倍数ではないときに、結果の最終バイトにあるシフトされた桁のゼロ埋めに失敗していました。
ほとんどの場合、異常になるのは不可視部分のデータです。しかし、ビット列比較では余分なビットも無視されず、常に 0 であると想定されるところに非ゼロビットが存在することで予期せぬ比較動作が生じます。
ビット列の右シフト結果をテーブルに格納している場合、不整合データを以下のような SQL で補正できます。
UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
歴史的に、また、SQL標準により、このような場合に結果は 1 であるべきですが、12.0 では 0 を返していました。
(以下の応答は 1 が正しい) db=# SELECT strpos('ABCDE', ''); strpos -------- 0 (1 row)
(オーバーフローが検出されない例) db1=# SELECT extract(epoch from '256 microseconds'::interval * (2^55)::float8); date_part -------------------- -9223372036854.775 (1 row) (修正後は以下エラーがでるようになります) ERROR: interval out of range
括弧を記載しない書き方も受け入れるようになりました。
バージョン12で整数パラメータの検査が厳しくなっていましたが、末尾の空白まで許容しないのは望ましくないと判断されました。
これまでは接続状態に CONNECTION_BAD がセットされませんでした。
ecpg_gettext() の定義をクライアントコードから見えない適切な位置に移すことで修正されています。
pg_dump がパーティションテーブルの外部キーについて完全な依存情報の出力に失敗していました。このため、pg_restore で早すぎるタイミングで外部キー制約を再作成しようとして、パラレルリストアが時々失敗することがありました。
これまでは、同じ名前を持ち異なるテーブルに付く二つのトリガは OID でソートされましたが、これからはテーブル名でソートされます。RLS(行単位セキュリティポリシー)についても同様です。
以前は、データ型がドメインや複合型の格納列が元となっている場合に誤判定をして、本来不要な pg_upgrade 失敗をひき起こしたり、pg_upgrade 実行後のクラスタを壊してしまったりすることがありました。
これは、それに続く pg_rewind の実行の失敗につながる可能性がありました。
継続WALレコードがページの境界で丁度終わるような特別なケースの場合、-sオプションによりそのWALレコードを指定した際に正常にレコードを処理できずアサーションエラーが発生していました。
この関数は、どのクライアントも使用しないであろうという理由で以前に削除されましたが、とても古いバージョンの psql(および、おそらく他のアプリケーション)と組み合わせて使用した際に正常に動作しなくなってしまいました。
以前では、ユーザがCFLAGSに -O0 を設定した場合に失敗する可能性がありました。
以前のスピンロックのコードでは、それが許容されないアセンブリ命令に対してレジスタ0 を選択できたため、ビルドの失敗を引き起こしてました。
このバグに一致する報告は今までに 1回のみでしたが、修正された PostgreSQL のコードや変則的なコンパイラオプションによるビルドを実行した際に問題を起こす可能性がありました。
これにより xlc v16.1.0 での内部的なコンパイルエラーが避けられます。この変更は、コンパイラのエラーメッセージ形式が変わること以外ほとんど影響はありません。
bloom_index専用のオプションなど、特殊なオプションを ALTER TABLE で変更した場合に失敗することがありました。
(報告されたエラー例) ERROR: XX000: unrecognized lock mode: 2139062143
無関係な複数の親テーブルを継承した子テーブルがあって、継承した列が重複している場合、親テーブルでその列の型の変更するとエラーが返されるようになりました。以前は実行可能でしたが、そうすると、同期が取れなくなった親への問い合わせが失敗していました。
(該当する操作の例) db=# CREATE TABLE pt53_1 (f1 int, f2 int); db=# CREATE TABLE pt53_2 (f1 int, f3 bigint); db=# CREATE TABLE ct53 (f4 int) INHERITS (pt53_1, pt53_2); NOTICE: merging multiple inherited definitions of column "f1" db=# ALTER TABLE pt53_1 ALTER COLUMN f1 TYPE bigint; ERROR: cannot alter inherited column "f1" of relation "ct53"
いったん ALTER TABLE .. NO INHERIT .. で継承関係を外して、各テーブルでデータ型を変更して、ALTER TABLE .. INHERIT .. で再び継承関係を付与するという手順で同様の操作を行うことができます。
これまでは以下のようなエラーが生じていました。
db=# CREATE TABLE t54 (id int); db=# INSERT INTO t54 VALUES (1), (2); db=# BEGIN; db=# ANALYZE t54,t54; ERROR: duplicate key value violates unique constraint "pg_statistic_relid_att_inh_index" DETAIL: Key (starelid, staattnum, stainherit)=(16391, 1, f) already exists.
プランナは ICU照合が使われていた場合に、大文字小文字が区別できるかを適切に判定できていなかったため、多くのパターンで固定された接頭語として扱ってしまい、ILIKE句から派生したインデックススキャン時に見つけるべきエントリを見逃す可能性がありました。
(誤動作例) db=# CREATE TABLE t55 ( normal text UNIQUE, icu text COLLATE "de-x-icu" UNIQUE); db=# INSERT INTO t55 VALUES ('ABC', 'ABC'); db=# SELECT * FROM t55 WHERE normal ILIKE 'abc'; normal | icu --------+----- ABC | ABC (1 row) db1=# SELECT * FROM t55 WHERE icu ILIKE 'abc'; normal | icu --------+----- (0 rows)
以前は、行セキュリティポリシーが設定されていた場合に、行タイプの不一致に関する偽のエラーが生じる可能性がありました。
(エラー発生例) db=> CREATE TABLE t56 (a int, b int, c int); db=> CREATE POLICY p56 ON t56 USING (t56 >= ROW(1,1,1)); db=> ALTER TABLE t56 ENABLE ROW LEVEL SECURITY; db=> ALTER TABLE t56 FORCE ROW LEVEL SECURITY; db=> INSERT INTO t56 SELECT 10, 20, 30; db=> INSERT INTO t56 SELECT * FROM (SELECT b, c FROM t56 ORDER BY a) ss; ERROR: table row type and query-specified row type do not match DETAIL: Table row contains 2 attributes, but query expects 3. (3番目の値を NULL として INSERT に成功する動作が正しい)
該当の場合にバックエンドプロセスがクラッシュする可能性がありました。
以下の形の SQL でクラッシュが報告されました。
SELECT * FROM t58 WHERE x = ANY(NULL::bigint[]);
可視の行バージョンが HOT更新された場合、デッドタプルとなった以前のバージョンでロックが取得されるかもしれず、直列化の保証に微妙に失敗する可能性がありました。
このタイミングでログに記録されないインデックスの検査をする必要はありませんでした。この検査はいくつかのワークロードでかなりのパフォーマンスの問題を引き起こしていました。また、理論的にはデッドロックを引き起こす可能性もありました。
この誤りはアサート失敗をもたらします。アサートを無効にした本番ビルドに悪影響があるかどうかは不明です。
ALTER SYSTEM自体ではそのような状態は発生しませんが、postgresql.auto.conf を変更する外部ツールでは発生する可能性があります。対象パラメータの重複したエントリが削除され、新しい設定が (ある場合) 最後に追加されるようになります。
これまでは ALTER SYSTEMコマンドは重複エントリに対して、実際に適用されるのは末尾エントリであるにもかかわらず、先頭のエントリだけを書き換えしていました。
以下にメッセージの違いを示します。
(変更前: include = '') LOG: input in flex scanner failed at file "/var/lib/pgsql/11/data" line 1 FATAL: configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors (変更前: include = '/var/lib/pgsql/11/data/postgresql.conf') LOG: could not open configuration file "postgresql.conf": maximum nesting depth exceeded FATAL: configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors (変更後: include = '') LOG: empty configuration file name: "" FATAL: configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors (変更後: include = '/var/lib/pgsql/11/data/postgresql.conf') LOG: configuration file recursion in "/var/lib/pgsql/11/data/postgresql.conf" FATAL: configuration file "/var/lib/pgsql/11/data/postgresql.conf" contains errors
時期によって変化する UTCオフセットを持つ時間帯が指定されている場合、オフセットを解決できるように日付も必要です。使用される構文によっては、この検査が強制されず、誤った出力が生成される場合がありました。
(誤動作の例) =# SELECT '12:53:57 m11'::timetz; timetz ------------------- 12:53:57+09:18:59 (1 row) (エラーになるのが修正後の正しい動作です) ERROR: invalid input syntax for type time with time zone: "12:53:57 m11"
レコード引数が NULL であり、複合型が宣言されていない場合は、代わりに AS句を使用してみてください。これは推奨される使用法ではありませんが、バージョン11 より前は機能しており、今では再び使用できます。AS句を使用するなら、json[b]_to_record() 関数を使用すべきです。
(変更前) =# SELECT * FROM json_populate_record(null::record, '{"a":1,"b":2}') AS x(a int, b int); ERROR: record type has not been registered (変更後) =# SELECT * FROM json_populate_record(null::record, '{"a":1,"b":2}') AS x(a int, b int); a | b ---+--- 1 | 2 (1 row) (推奨される方法) =# SELECT * FROM json_to_record('{"a":1,"b":2}') AS x(a int, b int); a | b ---+--- 1 | 2 (1 row)
(クラッシュの再現例) =# SELECT * FROM xmltable('.' PASSING '<foo/>' COLUMNS a text PATH 'foo/namespace::node()'); server closed the connection unexpectedly
GIN ポスティングリストの項目は、隣接するインデックス付き TID間の距離が16TB を超える場合、7 バイトを必要とします。ロジックの 1 つのステップがそれと同期していなかったため、6バイトのバッファに値を書き込もうとする可能性がありました。原則としてこれはスタックオーバーランを引き起こす可能性がありますが、ほとんどのアーキテクチャでは、次のバイトが未使用のアライメントパディングである可能性が高く、バグは無害です。いずれにせよバグに遭遇することは稀です。
NULL 以外の列値に対して計算された距離の一部が Infinity または NaN である場合、問い合わせの出力順序が誤っている(通常の並び替えの結果とは異なる)可能性があります。
以下に順序が異常である例を示します。
(変更前) =# SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; f1 ------------------- (10,10) (NaN,NaN) (0,0) (1e-300,-1e-300) (-3,4) (-10,0) (-5,-12) (5.1,34.5) (1e+300,Infinity) (10 rows) (修正後) =# SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; f1 ------------------- (0,0) (1e-300,-1e-300) (-3,4) (-10,0) (10,10) (-5,-12) (5.1,34.5) (1e+300,Infinity) (NaN,NaN) (10 rows)
NULL をインデックスのサポート関数まで廻さないようにして、クラッシュの可能性を回避します。
通常は内部状態は変わらないため再同期は不要です。しかし、接続がいくつかのサーバの内の 1つにつながる場合など、稀なケースでは問題になる可能性がありました。
この変更により、psql は、たとえば SSL が使用されているかどうかなど、起動時に発行される対話型メッセージを再発行します。
(問題の再現例) $ psql psql (11.5) Type "help" for help. postgres=# (ここでPostgreSQL11サーバを停止して、PostgreSQL12サーバを起動する) postgres=# SELECT 1; FATAL: terminating connection due to administrator command 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: Succeeded. postgres=# df ERROR: column p.prokind does not exist LINE 5: CASE p.prokind ^ HINT: Perhaps you meant to reference the column "p.probin". (サーバが変わったことを認識していないためエラーが生じました)
「psql -f」など、引数のあるオプションを引数無しで渡したときに、musl の libc ライブラリでクラッシュしました。
以前の修正により、pg_dump は常に pg_opfamily を参照するようになりましたが、そのカタログはバージョン 8.3 より前には存在しませんでした。
これにより、pg_restore の動作が他のいくつかのアプリケーションと統一されます。特に、12 より前のバージョンは 12 の pg_restore と同様に動作し、複数の PostgreSQL バージョン間で動作するダンプ/リストアスクリプトの作成が簡単になります。この変更の前、pg_restore はそのようなオプションを - という名前のファイルへの出力を意味すると解釈していましたが、それを望む人はほとんどいませんでした。
これまではファイル読み取りエラーを、読み取り中のファイル内容削除と見做して、無視していました。今後はそれ以外のケースについてエラーを出すようになります。
fsync が遅い場合、以前のコーディングではタイムアウトエラーが発生する可能性がありました。
ジョブ数が多すぎるエラーを出すかどうかの判断を、より正確にファイル記述子の数を調べて行うように変更されました。
複合型が完全に削除され、PL/pgSQL 関数の実行の間に同じ名前の新しい型が作成される場合が対象となります。複合型の変数は、新しい定義に一致するように更新されます。
ログ取得なしインデックスには、この状況で有効なデータが含まれているとは限らないため、チェックしなくなりました。
array_column <@ constant_array のような句はインデックス可能と見なされますが、インデックス検索では空の配列値が見つからない場合があります。
このための唯一の実用的なバックパッチ可能な修正では、<@ のインデックス検索でインデックス全体をスキャンする必要があります。つまり、単純なシーケンシャルスキャンよりも問い合わせの性能が低下する可能性が高いことを意味します。
この変更によって性能に悪影響が及ぶアプリケーションには、いくつかの選択肢があります。このバグのない GIN インデックスに切り替えるか、array_column <@ constant_array をarray_column <@ constant_array AND array_column && constant_array に置き換えることができます。これにより、以前とほぼ同じ性能が得られ、指定された定数配列の空ではないすべてのサブセットが検索されます。
xlc 13 以降では、この関数を PostgreSQL での使用方法と互換性のない方法で解釈するため、使用できない PostgreSQL のビルドが発生しました。代わりにカスタムアセンブリコードを使用して修正されました。
フィジーおよびノーフォーク島の夏時間法の変更に加えて、アルバータ、オーストリア、ベルギー、ブリティッシュコロンビア、カンボジア、香港、インディアナ(ペリー郡)、カリーニングラード、ケンタッキー、ミシガン、ノーフォーク島、韓国およびトルコの歴史的な修正が含まれます。
場合によっては、ビューは、pg_dump がビューよりも後にダンプする必要があるオブジェクトに依存する場合があります。最も一般的な例は、主キー列で GROUP BY を使用する問い合わせが、主キーなしでは意味的に無効である可能性があることです。これは、ビューの列名と型を確定するだけのダミーの CREATE VIEW コマンドを発行し、その後、完全なビュー定義で CREATE OR REPLACE VIEW を発行することで処理されます。以前は、ダミー定義は実際には CREATE TABLE コマンドであり、これは後の CREATE RULE コマンドによって自動的にビューに変換されました。新しいアプローチは、PostgreSQL バージョン 10 以降で正常に使用されています。以前の方法ではビューのレプリカアイデンティティの状態に関して誤ったエラーメッセージが発生するという報告のため、古いリリースにパッチが適用されました。また、この変更により、このようなビューを含むリストア中に --clean オプションを使用しようとする際の問題も回避されます。
(変更前のダンプ出力) $ pg_dump CREATE TABLE public.v ( c1 integer, c2 text ); COPY public.t (c1, c2) FROM stdin; . ALTER TABLE ONLY public.t ADD CONSTRAINT t_pkey PRIMARY KEY (c1); CREATE RULE "_RETURN" AS ON SELECT TO public.v DO INSTEAD SELECT t.c1, t.c2 FROM public.t GROUP BY t.c1; (変更後のダンプ出力) $ pg_dump CREATE VIEW public.v AS SELECT NULL::integer AS c1, NULL::text AS c2; COPY public.t (c1, c2) FROM stdin; . ALTER TABLE ONLY public.t ADD CONSTRAINT t_pkey PRIMARY KEY (c1); CREATE OR REPLACE VIEW public.v AS SELECT t.c1, t.c2 FROM public.t GROUP BY t.c1;
python、python3、python2 の順番で検索し、configure が、単なる python という名前の実行ファイルが存在しないという、ごく一般的な状況で成功するようになりました。PYTHON 環境変数を設定することにより、この選択をオーバライドすることも可能です。