このリリースは 9.5.4 からの修正リリース(2016年10月27日リリース)です。
9.5.x からのアップデートではダンプ、リストアは不要です。
また、9.5.2 より前のバージョンからアップデートを行う場合は 9.5.2 に関する技術情報 を参照してください。
PostgreSQL 9.5.4 から 9.5.5 への変更点
9.6.1、9.5.5、9.4.10、9.3.15、9.2.19、9.1.24 の各バージョンが同時にリリースされており、 本ページでは共通の記載としています。 各修正項目が適用されるバージョン系列番号を 項目末尾に括弧書きで記載しています。
- フリースペースマップおよび可視性マップの切り詰めについてのWAL記録について修正されました。 (Pavan Deolasee, Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)
- pg_upgrade が可視性マップを9.6フォーマットに書き換えしたときデータ破損の可能性があり、修正されました。 (Tom Lane) (9.6)
- INSERT ... ON CONFLICT による自己衝突の場合にトランザクション直列化失敗のエラーを投げないようになりました。 (Thomas Munro, Peter Geoghegan) (9.6)(9.5)
- DISTINCT を使う集約関数の実行において、解放後のメモリを使用する障害が修正されました。 (Peter Geoghegan) (9.6)
- ウィンドウ関数として使われる多様集約の誤った扱いが修正されました。 (Tom Lane) (9.6)
- 行単位セキュリティが有効なテーブルの列名リストを伴う COPY が修正されました。 (Adam Brightwell) (9.6)(9.5)
- track_io_timing = on であるとき、EXPLAIN が有効な XML を出力するように修正されました。 (Markus Winand) (9.6)(9.5)(9.4)(9.3)(9.2)
- 準備されたトランザクション(二相コミットのトランザクション)でTRUNCATE の統計情報更新が修正されました。 (Stas Kelvich) (9.6)(9.5)
- CREATE/ALTER TABLE にて継承された CHECK制約のマージにおける、いくつかの障害が修正されました。 (Tom Lane, Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)
- min_wal_size と max_wal_size に対する pg_settings.unit で実用的な値を表示するようになりました。 (Tom Lane) (9.6)(9.5)
- jsonb_set() で配列要素の置換が修正されました。 (Tom Lane) (9.6)
- バッファのロックを保持せずにタプル可視性をテストすることに起因する滅多に起こらないデータ破損について、回避されました。 (Thomas Munro, Peter Geoghegan, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
- サーバ再起動時にコミットタイムスタンプを保護するようになりました。 (Julien Rouhaud, Craig Ringer) (9.6)(9.5)
- ロジカルWALデコーディングが、サブトランザクションの WAL出力がディスクに溢れるほど大きいときに適切に動作するように修正されました。 (Andres Freund) (9.6)(9.5)(9.4)
- ロジカルWALデコーディングにおける不正ポインタの問題が修正されました。 (Stas Kelvich) (9.6)
- 共有メモリ割り当て要求を実際の huge pageサイズの倍数に丸めるようになりました。 (Tom Lane) (9.6)(9.5)(9.4)
- libpq で SSLコンテキストを複数の接続に亘って共有しようと試みなくなりました。 (Heikki Linnakangas) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
- libpq の稀な場合のメモリリークが回避されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
- pg_upgrade はライブラリがロード可能かを名前の長さ順にチェックするようになりました。 (Tom Lane) (9.6)(9.5)
- インデックスアクセスメソッドを含む拡張モジュールに対してpg_upgrade が正しく動作するようになりました。 (Tom Lane) (9.6)
- pg_upgrade のファイルのコピー、リンク、書換えの各段階でのエラー報告が改善されました。 (Tom Lane, Álvaro Herrera) (9.6)
- pg_dump が 7.4 よりも前バージョンのサーバで動作するように修正されました。 (Amit Langote, Tom Lane) (9.6)
- pg_rewind に --source-server と --source-target を両指定することが禁止されました。 (Michael Banck) (9.6)(9.5)
- pg_rewind が元サーバのセッションで synchronous_commit を off にするようになりました。 (Michael Banck, Michael Paquier) (9.6)(9.5)
- pg_xlogdump で --follow オプションを使った場合、新たな WALセグメントファイルのオープンを再試行するようになりました。 (Magnus Hagander) (9.6)(9.5)(9.4)(9.3)
- ロールバックされた更新の対象となっている壊れたタプルに対して、正しい TID を報告するように contrib/pg_visibility が修正されました。 (Tom Lane) (9.6)
- PL/Python の並行ビルドが確実に成功するように、Makefile の依存関係が修正されました。 (Pavel Raiskup) (9.6)
- タイムゾーンデータファイルが tzdata release 2016h に更新されました。 (9.6)(9.5)(9.4)(9.3)(9.2)(9.1)
- ビッグエンディアンのマシンにおける GINインデックス WALレコードの誤った作成が修正されました。 (Tom Lane) (9.5)(9.4)
- SELECT FOR UPDATE/SHARE がその後に中止(ロールバック)したトランザクションに更新されたタプルを適切にロックするように修正されました。 (Álvaro Herrera) (9.5)(9.4)(9.3)
- CTEスキャンを伴う EvalPlanQual の再チェックが修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- INSERT ... ON CONFLICT による取り消しの際の、推測で挿入された TOASTタプルの削除が修正されました。 (Oskari Saarenmaa) (9.5)
- サブクエリでハッシュ集約からの前結果の不適切な重複が修正されました。 (Andrew Gierth) (9.5)(9.4)(9.3)(9.2)(9.1)
- 主キーやレプリカ識別(REPLICA IDENTITY)インデックスを伴うテーブルの大規模な UPDATE における、問い合わせ内のメモリリークが修正されました。 (Tom Lane) (9.5)(9.4)
- EXPLAIN で測定されない時間をゼロと出力しないようになりました。 (Maksim Milyutin) (9.5)(9.4)(9.3)(9.2)
- VACUUM がテーブル切り捨てをするためにテーブル排他ロックを待っているときのタイムアウトの長さが修正されました。 (Simon Riggs) (9.5)(9.4)(9.3)(9.2)(9.1)
- numeric型で受け入れられる値の人為的な制約が除去されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- 短縮キーの利用を止めたときに起きうるソートの誤りが修正されました。 (Peter Geoghegan) (9.5)
- 1GB を超える一時リレーションを切り捨てするときに起きるファイルデスクリプタのクローズ漏れが修正されました。 (Andres Freund) (9.5)(9.4)(9.3)(9.2)(9.1)
- standby_mode を on にしてスタンドアローンバックエンドを起動することが禁止されました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)(9.1)
- 以前に使用したスロットを再利用するときに、レプリケーションスロット状態を適切に初期化するようになりました。 (Michael Paquier) (9.5)(9.4)
- 動的共有メモリの制御セグメントID に、よりランダムな値を使うようになりました。 (Robert Haas, Tom Lane) (9.5)(9.4)
- Windows において、動的共有メモリの制御セグメントの作成をaccess denied エラーの後、再試行するようになりました。 (Kyotaro Horiguchi, Amit Kapila) (9.5)(9.4)
- PL/pgSQL が int2vector型や oidvector型のパラメータとローカル変数で誤動作しないように修正されました。 (Tom Lane) (9.5)
- ecpg の --help と --version オプション が他のコマンドと一貫性をもった動作をするようになりました。 (Haribabu Kommi) (9.5)(9.4)(9.3)(9.2)(9.1)
- pgbench の平均遅延の計算が修正されました。 (Fabien Coelho) (9.5)(9.4)
- pg_dump が範囲型を作る関数をダンプしないように修正されました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)
- pg_dump で -C と --no-tablespaces を指定しているとき、CREATE DATABASE に TABLESPACE 句を付けないように修正されました。 (Tom Lane) (9.5)
- pg_receivexlog がスロットなしで --synchronous を指定しているとき、正しく動作するように修正されました。 (Gabriele Bartolini) (9.5)
- pg_xlogdump が複数ページにわたる継続レコードで始まる WALファイルに対応するように修正されました。 (Pavan Deolasee) (9.5)(9.4)(9.3)
- contrib/pg_buffercache が 256GB を超える shared_buffers のときに動作するように修正されました。 (KaiGai Kohei) (9.5)(9.4)
- contrib/intarray の bench.pl で -e が指定された際に EXPLAIN 結果を捨てずに出力するように修正されました。 (Daniel Gustafsson) (9.5)(9.4)(9.3)(9.2)(9.1)
- OpenSSL 1.1.0 がサポートされました。 (Heikki Linnakangas) (9.5)
- 拡張のテストで使えるように TAPテスト基盤が導入されました。 (Craig Ringer) (9.5)(9.4)
- MSVC でのビルドで、クライアントのみのインストールに pg_recvlogical が含まれるようになりました。 (MauMau) (9.5)(9.4)
- 最近の Windows バージョンで追加されたタイムゾーン名を認識するように、Windows のタイムゾーン割り当てが更新されました。 (Michael Paquier) (9.5)(9.4)(9.3)(9.2)
- 廃止された動的なタイムゾーン省略形についてエラーが出るのを防ぐようになりました。 (Tom Lane) (9.5)(9.4)(9.3)(9.2)(9.1)
- ロジカルWALデコーディングでのバッファオーバランが修正されました。 (Tom Lane) (9.4)
クラッシュリカバリに際してこれらファイルが正しく復旧しなかったり、スタンバイサーバに誤った書き込みがされる可能性がありました。
フリースペースマップの不正な項目は、リレーションの既に切り詰めされたページへのアクセスをひき起こし、典型的には以下のようなエラーが出ます。
ERROR: could not read block 28991 in file "base/16390/572026": read only 0 of 8192 bytes
フリースペースマップを再生成させるには、サービスを正常停止(smartモードかfastモードで停止)して、データベースクラスタディレクトリ内の.fsmファイルを手動で削除して、サービスを再起動してください。フリースペースマップが既に壊れているかを個別に検査する手順は、以下ページを参照ください。
https://wiki.postgresql.org/wiki/Free_Space_Map_Problems
可視性マップの障害は、ページチェックサムを有効にしていると、チェックサム検査エラーをひき起こすこともあります。
可視性マップを再生成させるには、contrib/pg_visibility 拡張モジュールのpg_truncate_visibility_map() 関数を使用できます。サービス停止して、.vmファイルを手動で削除して、サービス再起動する方法でも良いです。
ビッグエンディアンのマシンで新たな可視性マップのバイト列が誤った順で書かれて、完全に誤ったマップをもたらしました。また、Windows では旧マップがテキストモードで読み取られて、マップのバイト列に改行コード CR(0x0D) LF(0x0A) の並びが含まれているとき、誤った結果をもたらしました。
pg_upgrade を使用していて上記のいずれかに該当しているなら可視性マップが壊れていると考えられます。
contrib/pg_visibility 拡張モジュールの pg_truncate_visibility_map() 関数を使って可視性マップを再生成することができます。サービス停止して、.vmファイルを手動で削除して、サービス再起動する方法でも良いです。
以下のページも参照ください。
https://wiki.postgresql.org/wiki/Visibility_Map_Problems
ここでの自己衝突とは以下例のようなケースです。SERIALIZABLE またはREPEATABLE READ トランザクション隔離レベルで発生します。修正後、本ケースではエラー無しに 1件だけレコードが挿入されます。
db1=# CREATE TABLE t3 (id int primary key); db1=# START TRANSACTION ISOLATION LEVEL SERIALIZABLE; db1=# INSERT INTO t3(id) VALUES (1),(1) ON CONFLICT DO NOTHING; ERROR: could not serialize access due to concurrent update
以下のような SQL が該当します。
SELECT string_agg(DISTINCT col1, ',' ORDER BY col1) FROM t4;
バックエンドプロセスのクラッシュや誤った問い合わせ結果を引き起こすおそれがあります。特に Windows むけビルドで発生が報告され、再現が確認されました。
集約の遷移関数に、その第一引数と結果が状態のデータ型でなく集約の出力のデータ型だと示されていました。このことは多様の遷移関数でエラーやクラッシュをもたらしました。
CREATE AGGREGATE で集約関数を作るときに、状態遷移関数や最終計算関数の引数型や返し値型に anyelement や anyarray 等を使う多様関数を指定した場合で、集約の出力と状態でデータ型が異なる場合に該当します。エラーやクラッシュが生じるのは、作成した集約関数を実行したときです。
(エラー発生例:) db1=# CREATE FUNCTION first_el(anyarray) RETURNS anyelement AS 'select $1[1]' LANGUAGE sql STRICT IMMUTABLE; db1=# CREATE AGGREGATE first_el_agg_f8(float8) (SFUNC = array_append, STYPE = float8[], FINALFUNC = first_el); db1=# SELECT first_el_agg_f8(x::float8) OVER (order by x) FROM generate_series(1,5) x; ERROR: input data type is not an array (本来の期待される出力は以下:) first_el_agg_f8 ----------------- 1 1 1 1 1 (5 rows)
(エラー発生例:) db1=# CREATE ROLE user6; db1=# CREATE TABLE t6 (a int, b int, c int); db1=# INSERT INTO t6 VALUES (1,4,1),(2,3,2),(3,2,3),(4,1,4); db1=# CREATE POLICY p6 ON t6 FOR SELECT USING (a % 2 = 0); db1=# ALTER TABLE rls_t6 ENABLE ROW LEVEL SECURITY; db1=# ALTER TABLE rls_t6 FORCE ROW LEVEL SECURITY; db1=# GRANT SELECT ON TABLE t6 TO user6; db1=# SET SESSION AUTHORIZATION user6; db1=> COPY t6 TO stdout; 2 3 2 4 1 4 db1=> COPY t6 (a, b) TO stdout; ERROR: missing FROM-clause entry for table "a" (本来の期待される出力は以下:) 2 3 4 1
これまでは XML形式のとき、「<I/O-Read-Time>」など、文法的に不正なタグが出力されました。タグ名(XML要素名)に使われるアルファベット、数字、「-」「_」「.」以外の文字は「-」で置き換えられるようになりました。つまり、前述の文字列は「<I-O-Read-Time>」と出力されます。
pg_stat_*_tables の n_live_tup、n_dead_tup に相当する統計値が、TRUNCATE で 0 にならない動作がありました。
どちらから先でも親テーブル、子テーブルに対して同一の CHECK制約を追加することが可能になりました。これまで ALTER TABLE で後から加えるとエラーになっていたものが適切にマージされます。以下に例を示します。
db1=# CREATE TABLE t9p(a int); db1=# CREATE TABLE t9c() INHERITS ( t9p ); db1=# ALTER TABLE t9p ADD CONSTRAINT check_a CHECK (a > 0); (これまでのバージョンの動作) db1=# ALTER TABLE t9c ADD CONSTRAINT check_a CHECK (a > 0); ERROR: constraint "check_a" for relation "t9c" already exists (修正後の動作) db1=# ALTER TABLE t9c ADD CONSTRAINT check_a CHECK (a > 0); NOTICE: merging constraint "check_a" with inherited definition
親テーブルからの有効な制約と子テーブル上の NOT VALID な制約の併合を防止します。同様に NO INHERIT な子テーブルの制約と継承された制約の併合も防止します。これまでは誤ってマージされてしまっていました。以下に例を示します。
(これまでのバージョンの動作) db1=# CREATE TABLE t9p (a int, CONSTRAINT CHECK_a CHECK (a > 0)); db1=# CREATE TABLE t9c (CONSTRAINT CHECK_a CHECK (a > 0) NO INHERIT) INHERITS (t9p); NOTICE: merging constraint "check_a" with inherited definition (修正後の動作) db1=# CREATE TABLE t9p (a int, CONSTRAINT CHECK_a CHECK (a > 0)); db1=# CREATE TABLE t9c (CONSTRAINT CHECK_a CHECK (a > 0) NO INHERIT) INHERITS (t 9p); ERROR: constraint "check_a" conflicts with inherited constraint on relation "t9c"
従来 NULL でしたが、以下のようになります。
db1=# SELECT name, unit FROM pg_settings WHERE name IN ('min_wal_size', 'max_wal_size'); name | unit --------------+------ max_wal_size | 16MB min_wal_size | 16MB (2 rows)
対象が存在するJSON配列要素である場合、新たな値で置き換えられるのでなく、削除されていました。
(障害動作例: 最も外側の JSON配列のゼロ番目を '100' で置き換える指定) db1=# SELECT jsonb_set('[0,1,null,3]', '{0}', '100', false); jsonb_set -------------- [1, null, 3] (1 row) (正しい応答:) jsonb_set ------------------------- [100, 1, null, 3] (1 row)
特に外部キーチェックの処理で一貫性に欠けたデータが生じる可能性がありました。
track_commit_timestamp = on のとき、クリーンなサーバ再起動の後に、古いコミットタイムスタンプがアクセス不能になってました。
以下のように再起動前に取得できたタイムスタンプが、取得できなくなる動作が生じます。
(エラー動作例: NULL は *NULL* と表示) db1=# SELECT txid_current(); txid_current -------------- 12345 (1 row) db1=# SELECT pg_xact_commit_timestamp('12340'); -- 最近のトランザクション pg_xact_commit_timestamp ------------------------------- 2016-10-31 16:40:58.681952+09 (1 row) db1=# q $ pg_ctl restart $ psql db1 db1=# SELECT pg_xact_commit_timestamp('12340'); pg_xact_commit_timestamp -------------------------- *NULL* (1 row)
SAVEPOINTを使った更新の一部がロジカルデコーディング出力から抜け落ちることがありました。
本修正は、典型的でないデフォルト huge page サイズをもつシステムで munmap() の起こりうる失敗を回避します。クラッシュリカバリの場合を除き、これまでも悪影響はログメッセージ以外ありませんでした。
プラットフォームが Linux の場合に対応した修正となります。
特に異なる接続に異なる SSLパラメータを使うときに、稀な場合で起きる様々な障害をもたらしていました。
予期せぬ SSL error (サーバ側ログとしては ERROR: could not accept SSL connectionなど) が発生することが報告されました。
PQreset() でエラー報告内容がメモリリークするケースが報告されました。関連するケースがいくつかあると見られます。
拡張モジュール間の依存問題を回避する簡易的な対策です。手続き言語、データ型、TRANSFORM (手続き言語とSQLデータ型の対応付け) を提供する拡張モジュールがあって、plpython、hstore、hstore_plplythonというモジュール名であるなら前者二つが先にロードされることが期待できます。
サーバが ALTER EXTENSION ADD / DROP ACCESS METHOD に対応するように拡張されました。この機能はアクセスメソッドの動的作成に対応した当初のパッチに含まれているべきでしたが、見落とされていました。
Windows 以外のプラットフォームでシステムからのメッセージがより適切にエラーメッセージに含まれるようになります。
ラージオブジェクトの処理をする部分に修正が適用されています。
二つとも設定するのは無意味ですがエラーを出すようになっていませんでした。
これまでは、同期レプリケーションを使っているサーバをソースサーバに指定して、その同期レプリケーションが何らか理由で動作しない場合に、pg_rewind が一時テーブルを作るところで固まってしまっていました。
これによりサーバの次セグメント作成の遅れに対応します。
パレスチナとトルコの夏時間法の変更、トルコとロシアのいくつかの地域の歴史的修正が適用されます。南極大陸、旧ソ連、スリランカのいくつかのタイムゾーンが数値による省略形に切り替えられました。
IANAタイムゾーンデータベースはこれまで(ほとんど使われない物も含めて)全てのタイムゾーンに文字による省略形を提供していました。現在、現実世界で英語の省略形として使われている形跡がないタイムゾーンについては数値による UTCオフセットの使用を優先する方針に転換する過程にあります。
少なくとも暫くの間、PostgreSQL はタイムスタンプの入力にそのような削除された省略形を受け入れる予定です。しかしながら、削除された省略形は、pg_timezone_namesビューにはあらわれなくなり、出力には使われなくなります。
本アップデートでは、AMT がアルメニア時間(UTC+4)という意味では使われなくなり、アマゾン時間(UTC-4)と解釈されるようになります。
典型的な症状は WALリプレイに際して「unexpected GIN leaf action」が出ることです。
9.5 以降では、SELECT はこのようなタプルを返すのに時々失敗していました。より古いバージョンでこの障害が起きることは証明されていませんが、同時更新を伴う場合で可能性があると考えられます。
再チェックでは常に CTE を行が返さないものとみていて、典型的には最近に更新された行の更新失敗をひき起こしました。
CTE (WITH句) を使って SELECT ... FOR UPDATE を実行する問い合わせで、並行する UPDATE 処理とのタイミングによっては、返るべき行が返らない障害が報告されています。
2つのトランザクションがほぼ同時に衝突するタプルを挿入しようとする競合状態で、挿入内容に TOASTフィールドが含まれている場合に、挿入できなかった方が以下のエラーを出していました。
ERROR: attempted to delete invisible tuple
性能を改善するプランナの修正となります。これまで無駄な計算が生じていました。
いくつかのケースで計測対象外の項目についても欄があらわれ、その値がゼロになっていました。
「TIMING off」を指定しているのにトリガ関数実行時間が 0 で出力されたり、FORMAT が text 以外の時に track_io_timing = off で計測されないにもかかわらず「I/O Read Time: 0.000」「I/O Write Time: 0.000」が出力されたりしていました。
このタイムアウトは 50 ミリ秒のつもりが、実際には誤って 50 マイクロ秒になっていました。このため VACUUM がすぐにテーブル切り捨て(通常VACUUM でのファイルサイズ縮小)をあきらめてしまっていました。
テキスト入力の numeric_in()、バイナリ入力の numeric_recv() の両方で修正されています。
これまで 指数記号を使ったとき、指数部を 1000 を上限としていたのは全く無意味であるため、格納形式上の制限(1e100000 を越える)までの数値が許可されるようになりました。
また、バイナリ入力の場合には数値の桁数が 1000 桁を越えた場合にも拒絶していましたが、これも修正されました。
(修正前の動作例) db1=# SELECT 1.0e+1000::numeric; -- これはエラーにならない db1=# SELECT repeat('1', 100000)::numeric; -- 指数形式でなければ問題ない db1=# SELECT 1.0e+1001::numeric; -- 指数形式で指数部が 1000 を超えるとエラーになる ERROR: invalid input syntax for type numeric: "1.0e+1001" LINE 1: SELECT 1.0e+1001::numeric; ^
誤ったソート順序がもたらされる可能性があり、最悪の場合、壊れたBtreeインデックスが生じます。この場合 REINDEX が必要です。ただし、発生は非常に稀と考えられます。
一時テーブルに対する VACUUM および ON COMMIT TRUNCATE 指定に基づく動作の時のみ影響があります。
WALデータを取り込む WALレシーバプロセスが無いので、そのように指定しても役に立ちません。また、スタンバイ動作が考慮されていないため誤動作をもたらしました。
本障害で VACUUM がデッドタプルを除去するのを妨げるおそれがありました。
これまで srandom() を呼ばずに random() から供給を受けていたため、同じ値が毎回選択されていました。比較的無害ですが、これは想定の動作ではありません。
Windows は既存セグメントがあるとき、ときどき ERROR_ALREADY_EXISTS でなくERROR_ACCESS_DENIED を返します。これを回復不能エラーと判断していたため、PostgreSQL 起動に失敗していました。
誤った応答やバックエンドクラッシュをひき起こす可能性があります。
(正常動作例: 修正前バージョンでは誤応答やクラッシュが起きる) db1=# CREATE FUNCTION f44(int2vector) RETURNS text LANGUAGE plpgsql AS $$ BEGIN RETURN $1::text; END;$$; db1=# SELECT f44('1'::int2vector); f44 ----- 1 (1 row)
スクリプト中で sleep コマンドがあるとき、あるいは、テスト実行期間を時間ではなくトランザクション数で指定しているとき、計算が誤っていました。
範囲型を作る関数とは CREATE TYPE name AS RANGE で指定する関数のことです。--binary-upgrade のとき、拡張モジュールに属するこれら関数が誤ってダンプされていました。pg_upgrade での問題が報告されました。
スロットが無いとフラッシュ位置が報告されませんでした。
ビルド時に --enable-tap-tests を指定すると、make install でPGXS が見つけられたものについて TAPテストのためのサポートPerlファイルがインストールされます。
動的タイムゾーン省略形が参照されているタイムゾーンでどれにも一致しない場合、これをタイムゾーン名と等しいものとして扱います。これにより、IANA が彼らのタイムゾーンデータベースから省略形を削除したときの予期せぬエラーを回避します。
タプル更新レコードのロジカルデコーディングは 23バイト余計に読み取りました。これは通常無害ですが、非常に運が悪ければクラッシュをひき起こします。