リリース日: 2020-02-13
このリリースは12.1に対し、様々な不具合を修正したものです。 12メジャーリリースにおける新機能については、E.5を参照してください。
12.Xからの移行ではダンプ/リストアは不要です。
しかしながら、パーティションテーブルを参照する外部キー制約があるなら、以下のこの機能のバグに関する2つの項目を確認してください。
欠けていたALTER ... DEPENDS ON EXTENSION
に対する権限検査を追加しました。
(Álvaro Herrera)
拡張に属するものとしてのオブジェクト作成に何ら権限チェックがありませんでした。 この見落としは、あらゆるユーザが手続き、トリガ、マテリアライズドビューまたはインデックスを拡張を削除できる者から削除可能と印付けすることを許していました。 実行するユーザが指定されたオブジェクトを所有している(そして、それゆえにそれを削除する権限を持っている)ことが必要となるようにしました。 (CVE-2020-1720)
確実に全ての関連するパーティションが切り捨てされるようにTRUNCATE ... CASCADE
を修正しました。
(Jehan-Guillaume de Rorthais)
パーティションテーブルのパーティションがCASCADE
オプションを伴って切り捨てされて、かつ、そのパーティションテーブルが他のテーブルからの外部キー参照を持っている場合、そのテーブルも切り捨てされるべきです。
参照しているテーブル自体がパーティション化されている場合に、この検査の必要性が見落とされていて、場合によっては外部キー制約に違反する行が残ることがありえました。
このため、パーティションテーブル間の外部キー制約があって、パーティション単位のTRUNCATE
を被参照テーブルに実行したことがあるなら、外部キー制約違反があるかどうかを確かめるべきです。
最も簡単な方法は新たに外部キー制約のインスタンスを追加することです(そして成功したなら、追加したものか元の制約を削除します)。
しかしながら、ロックの観点からこれは許されないかもしれません。この場合、手動で一致しない行を問い合わせるのが良いでしょう。
外部キー制約をサブパーティションに付加するのに失敗していたものを修正しました。 (Jehan-Guillaume de Rorthais)
パーティションを多階層パーティションテーブルの最初の階層より下の階層に追加しているとき、その最上位パーティションテーブルを参照している外部キー制約が新たなパーティションに複製されず、後の制約違反の可能性をもたらしていました。 新たなパーティションをデタッチして再アタッチすることは、これを修正するための最も簡単な方法です。 しかしながら、修正すべき多数のパーティションがある場合には、外部キー制約の新たなインスタンスを追加することがより好ましいでしょう。
一つのパーティションテーブルに対する同時更新の間に起こりうるクラッシュを修正しました。 (Tom Lane)
適切な場合にはパーティションテーブルの行トリガが副パーティションに確実に正しく複製されるようにしました。 (Álvaro Herrera)
ユーザ定義の(しかし、外部キーや遅延ユニーク制約のトリガでは無い)トリガが、パーティションを作成またはアタッチするときに取りこぼされていたようです。
ロジカルレプリケーションのサブスクライバーのコードを適切な場合には列ごとのUPDATE
トリガを実行するように修正しました。
(Peter Eisentraut)
ロジカルデコーディングで巨大なトランザクションを多数の分割された一時ファイルに書き出ししなければならない場合の失敗を回避しました。 (Amit Khandekar)
論理レプリケーションのサブスクライバーが行の更新を処理するときに起こりうるクラッシュまたはデータ破損を修正しました。 (Tom Lane, Tomas Vondra)
サブスクライバーのテーブルがパブリッシャーからコピーされていないリファレンス渡しのデータ型を持つ列を含んでいる場合に限って、このバグは明らかな問題を引き起こしました。
ロジカルレプリケーションのサブスクライバーでのサブスクライブされているリレーションのDDL変更後のクラッシュを修正しました。 (Jehan-Guillaume de Rorthais, Vignesh C)
データベースのクラッシュと再起動の後の、ロジカルレプリケーションのパブリッシャーでの失敗を修正しました。 (Vignesh C)
物理レプリケーションスロットに対するpg_replication_slot_advance()
の効果が再起動を経ても維持されることを保証しました。
(Alexey Kondratov, Michael Paquier)
REPLICA IDENTITY FULL
を伴うロジカルレプリケーションの効率を改善しました。
(Konstantin Knizhnik)
更新や削除の操作時に既存タプルを探すとき、最後の一つではなく、最初に一致したタプルを返すようにしました。
INT32_MAX
より大きいデータベースのOIDを扱えるようにベースバックアップを修正しました。
(Peter Eisentraut)
並列のプランが常に適時に終了することを保証しました。 (Kyotaro Horiguchi)
この見落としは、複数バッチの並列ハッシュ結合で「temporary file leak」(一時ファイルリーク)の警告になることが知られていました。
Limitノードの下にあるGatherまたはGatherMergeプランノードの早すぎる停止を防止しました。 (Amit Kapila)
これは、例えば入れ子ループの内側にあるなど、そのようなプランノードが2回以上のスキャンを必要としている場合の失敗を回避します。
多数のコアを持つCPUでの並列ハッシュ結合の効率を改善しました。 (Gang Deng, Thomas Munro)
並列のCREATE INDEX
で、動的共有メモリスロットの空きが無いときのクラッシュを回避しました。
(Thomas Munro)
そのようなときには非並列のインデックス作成に後退するようにしました。
空いている動的共有メモリスロットが無いときのメモリリークを回避しました。 (Thomas Munro)
一時テーブルに対するインデックス作成、削除、再作成のときにCONCURRENTLY
オプションを無視するようにしました。
(Michael Paquier, Heikki Linnakangas, Andres Freund)
これは一時テーブルがON COMMIT
動作を持つ場合の奇妙な失敗を回避します。
他のセッションは一時テーブルにアクセスできないため、追加の処理は無意味であって、いずれにせよ一時テーブルにCONCURRENTLY
を使って有益なことはありません。
ON COMMIT DELETE ROWS
と印付けされている一時テーブルの式インデックスをリセットするときに起こりうる失敗を修正しました。
(Tom Lane)
box
、range
、および、inet
データ型のBRINインデックスの操作で起こりうるクラッシュを修正しました。
(Heikki Linnakangas)
GiSTインデックスの作成で再帰的なページ分割のときのクラッシュを修正しました。 (Heikki Linnakangas)
GINインデックスで削除されたページの扱いを修正しました。 (Alexander Korotkov)
起こりうるデッドロック、削除されたページの状態の不正な更新、および、最近に削除されたページを辿る動作の失敗を回避しました。
複数行のVALUES
リストの中のSubPlan(副SELECT
)で起こりうるクラッシュを修正しました。
(Tom Lane)
ALTER TABLE
で、GENERATED
式で参照されている列が、同じALTER
コマンドの手前で追加または型変更されたときの失敗を修正しました。
(Tom Lane)
タプル変換で「失われた」属性に対するデフォルト値の挿入失敗を修正しました。 (Vik Fearing, Andrew Gierth)
この障害により、値がALTER TABLE ADD COLUMN
により追加された定数デフォルトを持つ列から生じたときに、誤ってNULLとして読み取られる可能性がありました。
checkpointerプロセスでの可能性の低いパニックを修正しました。既に削除されているかもしれないリレーションのセグメントを開くことで引き起こされました。 (Thomas Munro)
FileClose()に失敗した後のクラッシュを修正しました。 (Noah Misch)
この問題は、data_sync_retry
が有効な場合のみ観測される可能性があります。無効であれば、FileClose()の失敗はPANICとして報告されるであろうからです。
外部テーブルに対する複数のAFTER ROW
トリガの処理を修正しました。
(Etsuro Fujita)
リファレンス渡しの集約の遷移状態での可能性の低いクラッシュを修正しました。 (Andres Freund, Teodor Sigaev)
to_date()
とto_timestamp()
でエラー報告を改善しました。
(Tom Lane, Álvaro Herrera)
入力文字列の中の誤った月と日の名前に関する報告が、マルチバイト文字の中間で入力を切り捨てする可能性があり、継続する失敗を引き起こすかもしれない不適切にエンコードされたエラーメッセージがもたらされていました。 代わりに次の空白文字で切り捨てるようにしました。
BC(紀元前)の日付に対するEXTRACT(ISOYEAR FROM
の一つ違いの結果を修正しました。
(Tom Lane)
timestamp
)
char
型に対する<>
演算子があいまいな照合順序のエラーを、「cache lookup failed for collation 0」(照合順序0についてキャッシュ検索に失敗しました)のようではなく、その通りに報告することを保証しました。
(Tom Lane)
TIDスキャンをシーケンシャルスキャンとみなすことを回避しました。 (Tatsuhito Kasahara)
リファクタリングの見落としにより、統計情報ビューでTIDスキャン(CTIDによる選択)がシーケンシャルスキャンとして計上され、さらにシーケンシャルスキャンと同様にテーブル全体の述語ロックを取得しました。 後者の振る舞いはシリアライザブルトラザクションモードで不必要な直列化のエラーを引き起こす可能性があります。
information_schema
ビューで、システムカタログに自己参照するビューが存在するときのスタックオーバーフローを回避しました。
(Tom Lane)
自己参照するビューは動作不能で常に無限再帰する結果になります。 ビューを実行しようとするときに、私たちはこの状況を正しく処理しましたが、自動で更新可能かを問い合わせるときにはそうではありませんでした。
walsenderプロセスがpg_stat_activity
でトランザクション開始時について常にNULLを見せることを保証しました。
(Álvaro Herrera)
これまではxact_start
列がときどきプロセス開始時を見せていました。
巨大な内側のリレーションを伴うハッシュ結合の性能を改善しました。 (Thomas Munro)
多数の活動中のwalsenderプロセスがあるときのスピンロック競合を減らしました。 (Pierre Ducroquet)
EXPLAIN
の出力で「Subplans Removed」フィールドの位置を修正しました。
(Daniel Gustafsson, Tom Lane)
テキスト以外の出力形式で、このフィールドは「Plans」サブグループの内側に書き出されていて、構文的に不適切な出力になっていました。 代わりにこれを親のAppendまたはMergeAppendプランノードに付加するようにしました。 本修正はテキスト出力形式でもフィールドの位置を変えます。 同じプランノードに付加されたいくらかのInitPlanがある場合、「Subplans Removed」はこれらの手前に現れるようになります。
EXPLAIN
のSETTINGS
オプションをテキスト以外の出力形式で空の出力をするように修正しました。
(Tom Lane)
テキスト以外の出力形式ではフィールドは例え空やゼロの値であっても要求されたなら出現することが求められます。
ユーザが問い合わせで実際に指定されているテーブルの対応する列を読み取れる場合には、プランナが潜在的に漏洩するテストを子テーブルの統計情報に適用できるようにしました。 (Dilip Kumar, Amit Langote)
この変更はCVE-2017-7484向けの修正で生じたパーティションテーブルに対する性能問題を修正します。 このセキュリティ修正は、現在のユーザが直接には読み取りが許されない列の統計情報に漏洩する演算子を適用することを禁止しました。 しかしながら、親パーティションテーブルにだけ許可を与え、個々のパーティションにはわざわざ許可を与えないということはごく一般的です。 このような場合、ユーザは列を親を通して参照することができます。そのため、このセキュリティ制限は意味がなく、必要以上に劣ったプランナの見積もりがもたらされるだけです。
単一行の副問い合わせへの結合の積極的すぎる組み換えで持ち込まれたプランナのエラーを修正しました。 (Tom Lane)
この誤りは「failed to construct the join relation」(結合リレーションの構成に失敗しました)のようなエラーをもたらします。
LIKE
や正規表現のパターンマッチ演算子をバイナリ互換のインデックス演算子クラスに適合させようとしたときのプランナエラー「no = operator for opfamily NNNN
」(演算子族NNNNに対する=演算子がありません)を修正しました。
(Tom Lane)
範囲演算子<@
および@>
に対して、
境界ケースでのクラッシュと選択率計算における誤った見積もりを修正しました。
(Michael Paquier, Andrey Borodin, Tom Lane)
最頻値の拡張統計情報を使ったときのOR
句に対する誤った見積もりを修正しました。
(Tomas Vondra)
最頻値拡張統計情報を適用するときにシステム列を無視するようにしました。 (Tomas Vondra)
これは影響のある問い合わせについてプランナエラー「negative bitmapset member not allowed」(負のbitmapsetメンバーは許されません)を防止します。
仮定のBRINインデックスに対応するように、BRINインデックスのロジックを修正しました。 (Julien Rouhaud, Heikki Linnakangas)
これまでは、「インデックスアドバイザ」拡張がプランナに仮定のBRINインデックスに関するプランを生成させようとすると、BRINのコスト見積もりコードが常にインデックスのメタページに物理的にアクセスしようとしていたために、失敗していました。 これからはインデックスが仮定に過ぎないかを確認して、そうであればインデックスのパラメータについてデフォルトの想定を使うようになります。
条件INSTEAD
ルールを伴うビューの自動更新を使おうと試みたときのエラー報告を改善しました。
(Dean Rasheed)
これはサポートされませんが、これまではエラーが実行時にしか発行されませんでしたので、プランナエラーにより隠されてしまう可能性がありました。
範囲型を通して間接的に自分自身に含まれている複合型を防止しました。 (Tom Lane, Julien Rouhaud)
record
などの疑似型を返すパーティションキー式を禁止しました。
(Tom Lane)
禁止されている型のインデックス式に対するエラー報告を修正しました。 (Amit Langote)
ビュー出力でVALUES
リストのみを含むビューのダンプ取得をビュー出力列が名前変更されている場合を扱えるように修正しました。
(Tom Lane)
XMLTABLE
構築で使われるデータ型と照合順序がビューやルールの依存性を計算するときに確実に考慮されるようにしました。
(Tom Lane)
これまでは、型がそのビューで他には参照されていない場合に、型を削除することでXMLTABLE
を使ったビューを壊す可能性がありました。
この修正は、存在しているビューに対して既に記録されている依存性は直さず、新たに作ったものだけを直します。
RADIUS認証パラメータの望まれない小文字化と切り捨てを防止しました。 (Marcos David)
pg_hba.conf
のパーサはこれらのフィールドを誤ってSQL識別子と同様に扱っていました。これらは一般にSQL識別子ではありません。
ReadyForQuery
を送出する後でなく前に、到着したNOTIFY
メッセージをクライアントに伝えるようにしました。
(Tom Lane)
この変更は、libpqや同様に動作する他のクライアントライブラリで、トランザクション中に受け取ったあらゆる通知が、クライアントがトランザクションが完了したと考えるときまでに入手できることを保証します。 これはおそらく実際の(あらゆる場合の非同期通知に対応する必要があるであろう)アプリケーションでは違いを生みません。しかし、再現可能な振る舞いのテストケースを作ることを容易にします。
GSSAPI暗号化を使うときの非ブロッキングI/Oの処理でバグを修正しました。 (Tom Lane)
これらの誤りは、送出プロセスが全データを送出していないけれども休眠する場合に、データ損失(たいてい続くワイヤプロトコル違反のエラーを起こします)や「ライブロック」状態をもたらす可能性がありました。 さらに、libpqは分離された暗号化状態を維持するのに失敗していて、複数の暗号化されたデータベース接続を使うアプリケーションで失敗する可能性をもたらしました。
libpqがGSSAPIのコードがコンパイルされていないときでも全てのGSS関連の接続パラメータをパースできるようにしました。 (Tom Lane)
これはSSLの対応と振る舞いを似たものにします。SSLでは以前に、特定ビルドでは機能不足のため一部が無視されたり制限されたりするとしても、関連する全パラメータを常に受け付けるのが良いと考えられました。
ecpgのPGTYPEStimestamp_fmt_asc()
関数で%b
と%B
の整形コードの誤った処理を修正しました。
(Tomas Vondra)
一つ違いの誤りのため、これらのコードは誤った月名を出力するか、場合によってはクラッシュしました。
ecpglibで、メモリ不足エラー後のクラッシュを回避しました。 (Tom Lane)
並列pg_dump/pg_restoreを、ワーカープロセスの作成失敗をより丁寧に扱うように修正しました。 (Tom Lane)
並列のpg_dump/pg_restoreの実行をシグナルで終了しようとしたときに起こりうるクラッシュやロックアップを防止しました。 (Tom Lane)
pg_upgradeで、テーブルのアップグレード不能なデータ型を探す際に配列と範囲の内部を見るようにしました。 (Tom Lane)
createuserの--connection-limit
オプションにより徹底した構文の検査を適用するようにしました。
(Álvaro Herrera)
より多くの場合でPL/pgSQLの複合型変数で参照される特定の型の変更に対処できるようにしました。 (Ashutosh Sharma, Tom Lane)
PL/pgSQL変数で参照される複合型を削除して再作成すると、
「could not open relation with OID NNNN
」(OID NNNのリレーションを開けません)エラーが生じる可能性がありました。
postgres_fdw
でUPDATE remote_tab SET (x,y) = (SELECT ...)
のようなコマンドをリモートサーバに送ろうとしたときのクラッシュを回避しました。
(Tom Lane)
contrib/dict_int
で1より小さいmaxlen
設定を拒絶するようにしました。
(Tomas Vondra)
これは本パラメータのおかしな設定で起こりうるクラッシュを防止します。
contrib/tablefunc
のcrosstab()
関数でNULLのカテゴリ値を禁止しました。
(Joe Conway)
この場合に有意義に動作することは決してなく、また、一部のプラットフォームでクラッシュすることがありました。
1.1.0より前のOpenSSLバージョンで動作するように、configureのOpenSSLのSSL_clear_options()
関数に対する調査を修正しました。
(Michael Paquier, Daniel Gustafsson)
PostgreSQLが古いOpenSSLバージョンに対してビルドされているとき、この問題によりSSL圧縮オプションを希望通り設定することに失敗する可能性がありました。
一部のタイムアウトと統計記録のGUC変数をPGDLLIMPORT
と印付けして、Windowsで拡張がこれらにアクセスできるようにしました。
(Pascal Legrand)
これは、idle_in_transaction_session_timeout
、lock_timeout
、statement_timeout
、track_activities
、track_counts
、および、track_functions
に適用されます。
「slab」メモリコンテキストに対する健全性チェックでメモリリークを回避しました。 (Tomas Vondra)
通常はメモリコンテキスト検査を有効にしないため、これは実運用むけビルドでは問題となりませんが、デバッグビルドではこのリークは非常に深刻になる可能性がありました。
LWLock統計の仕組みから報告される複数の統計情報のエントリを修正しました。 (Fujii Masao)
LWLock統計のコード(これはデフォルトではビルドされず、-DLWLOCK_STATS
を伴ったコンパイルが必要)は、誤ったハッシュテーブルのキー生成の結果として、同じLWLockとバックエンドプロセスに対して複数エントリを報告する可能性がありました。
Windowsのプロセス間シグナルの配送遅延をもたらす競合状態を修正しました。 (Amit Kapila)
これはNOTIFY
で目に見えるタイミング異常を引き起こし、また、おそらく他の誤動作も引き起こしました。
WindowsのReadFile()
関数が稀にエラーの結果になる場合の処理を修正しました。
(Thomas Munro, Juan José Santamaría Flecha)
これまでは知られているように、この見落としは、うるさいログメッセージをもたらすだけで、実際の問い合わせの誤動作は何ら引き起こしません。
WindowsでERROR_ACCESS_DENIED
のファイルアクセス失敗後に、少しの回数、再試行を行うようにしました。
(Alexander Lakhin, Tom Lane)
これは、対象ファイルが削除と印付けされているけれども未だ実際には消えていないために、ファイルオープンの試みが失敗する場合の対処を助けます。 例えばpg_ctlはpostmasterがすでに停止しているかを調べるときにこのようなエラーでしばしば失敗していました。
Windowsで、例えばpg_ctl restart
により、pg_ctlが停止された直後にpostmasterを開始するのに使われているときのpostmasterのログファイルに対する共有違反を回避しました。
(Alexander Lakhin)