PostgreSQL 12がやってくる！(4) - システムカタログの差分を調べてみる

# はじめに
今回は、PostgreSQL 11とPostgreSQL 12のシステムカタログの差分を調べてみる。
これもまだβ版リリース前なので、今後変わっていく可能性が大きいけど、現時点の版で調査をしてみた。
普段、PostgreSQLを使っているときにはシステムカタログを意識することはそれほどないのだが、システムカタログの変更は、DDL系コマンドの変更にも密接に関連しているので、調べてみるといろいろなことが分かって面白い。

## 調査方法
PostgreSQL 11.2とPostgreSQL 12[^1]それぞれについて、``initdb``によるデータベースクラスタ生成直後に、``postgres``データベースに``psql``でログインして、psqlのメタコマンド

```
\d pg_catalog.*
```
を実行し、そのログをdiffで比較した。

# テーブル/ビュー単位での変更まとめ
今回の変更では全体に共通した変更が多く入っているので、それらは1つの列にしてまとめてみた。以下、注意点と凡例を示す。

* 後述するように、``\d``メタコマンドの仕様変更(隠し属性``oid``も表示する）による差分はこちらの表にはリストアップしない。
* 「Collaration変更列あり」というのは、システムカタログ内の列のうち、PostgreSQL 11ではCollaration列が空値になっていたものがCに変更された列があるかどうかを示す。システムカタログによっては複数の列が対象になっていることもある。
* 「インデックス定義変更あり」というのは、インデックス対象の列の中に、PostgreSQL 11ではオペレータを指定しているものがあったが、PostgreSQL 12ではその指定がなくなった。この変更があったインデックスを含むリレーションの場合は●をつけている。


|リレーション名|kind|変更種別|Collaration<BR>変更列あり|インデックス定義<BR>変更あり|その他修正|
|:--|:-:|:-:|:-:|:-:|:--|
|pg_aggregate|表|変更|●|ー||
|pg_attrdef|表|変更|●|ー|addsrc列の削除|
|pg_attribute|表|変更|●|ー|attgenerated列の追加|
|pg_authid|表|変更|●|ー||
|pg_class|表|変更|●|ー|relhasoids列の削除|
|pg_collation|表|変更|●|ー|collisdeterministic列の追加|
|pg_constraint|表|変更|●|ー|consrc列の削除|
|pg_db_role_setting|表|変更|●|ー||
|pg_default_ac|表|変更|●|ー||
|pg_depend|表|変更|●|ー||
|pg_event_trigger|表|変更|●||
|pg_extension|表|変更|●|ー||
|pg_foreign_data_wrapper|表|変更|●|ー||
|pg_foreign_server|表|変更|●|ー||
|pg_index|表|変更|●|ー||
|pg_partitioned_table|表|変更|●|ー||
|pg_pltemplate|表|変更|●|ー||
|pg_policies|表|変更|●|ー||
|pg_policy|表|変更|●|ー||
|pg_prepared_statements|ビュー|変更|●|ー||
|pg_proc|表|変更|●|ー||
|pg_replication_origin|表|変更|●|●||
|pg_rewrite|表|変更|●|ー||
|pg_roles|ビュー|変更|●|ー||
|pg_rules|ビュー|変更|●|ー||
|pg_seclabel|表|変更|－|●||
|pg_seclabels|ビュー|変更|●|ー||
|pg_shadow|ビュー|変更|●|ー|valuntil列の型変更(abstime→timestamp with time zone)|
|pg_shdescription|表|変更|●|●||
|pg_stat_database|ビュー|変更|－|－|checksum_failures列の追加|
|pg_stat_gssapi|ビュー|追加|－|－||
|pg_stat_progress_cluster|ビュー|追加|－|－||
|pg_stat_progress_create_index|ビュー|追加|－|－||
|pg_stat_replication|ビュー|変更|－|－|reply_time列の追加|
|pg_stat_ssl|ビュー|変更|－|－|列名の変更(clientdn→client_dn)<BR>client_serial列の追加<BR>issuer_dn列の追加|
|pg_statistic|表|変更|－|－|stacoll1～stacoll5列の追加|
|pg_statistic_ext|表|変更|－|－|stxmcv列の追加|
|pg_subscription|表|変更|●|－||
|pg_tablespace|表|変更|●|－||
|pg_trigger|表|変更|●|－||
|pg_ts_dict|表|変更|●|－||
|pg_type|表|変更|●|－||
|pg_user|ビュー|変更|●|－||
|pg_user_mapping|表|変更|●|－||
|pg_user_mappings|ビュー|変更|●|－||

# 列単位での変更内容
もう少し細かい違いを見てみる。
diffを取ってみると、oid列の差分が表示されるようになったが、これはカタログそのものの違いではなく、psqlの``\d``メタコマンドが(これまでは隠し属性扱いであった)oidを表示するようになったために出てきた差分であると思われる。

|リレーション名|kind|列名|変更種別|内容|
|:--|:-:|:--|:-:|:--|
|pg_aggregate|表|agginitval|変更|Collationの値が空値からCに変更|
|pg_aggregate|表|aggminitval|変更|Collationの値が空値からCに変更|
|pg_am|表|oid|追加||
|pg_amop|表|oid|追加||
|pg_amproc|表|oid|追加||
|pg_attrdef|表|oid|追加||
|pg_attrdef|表|addbin|変更|Collationの値が空値からCに変更, not null制約追加|
|pg_attrdef|表|addsrc|削除||
|pg_attribute|表|attgenerated|追加|生成列かどうかを示す情報が追加？|
|pg_attribute|表|attoptions|変更|Collationの値が空値からCに変更|
|pg_attribute|表|attfdwoptions|変更|Collationの値が空値からCに変更|
|pg_authid|表|oid|追加||
|pg_authid|表|rolpassword|変更|Collationの値が空値からCに変更|
|pg_global|表|installed_version|変更|Collationの値が空値からCに変更|
|pg_cast|表|oid|追加||
|pg_class|表|oid|追加||
|pg_class|表|relhasoids|削除||
|pg_class|表|reloptions|変更|Collationの値が空値からCに変更|
|pg_class|表|relpartbound|変更|Collationの値が空値からCに変更|
|pg_collation|表|oid|追加||
|pg_collation|表|collisdeterministic|追加|この変更は何の改造によるもの？|
|pg_collation|表|collversion|変更|ollationの値が空値からCに変更|
|pg_constraint|表|oid|追加||
|pg_constraint|表|conbin|変更|Collationの値が空値からCに変更|
|pg_constraint|表|consrc|削除||
|pg_conversion|表|oid|追加||
|pg_database|表|oid|追加||
|pg_db_role_setting|表|setconfig|変更|Collationの値が空値からCに変更|
|pg_default_ac|表|oid|追加||
|pg_default_ac|表|aclitem|変更|not null制約の追加|
|pg_depend|表|description|変更|Collationの値が空値からCに変更|
|pg_enum|表|oid|追加||
|pg_event_trigger|表|oid|追加||
|pg_event_trigger|表|evttags|変更|Collationの値が空値からCに変更|
|pg_extension|表|oid|追加||
|pg_extension|表|extversion|変更|Collationの値が空値からCに変更|
|pg_extension|表|extcondition|変更|Collationの値が空値からCに変更|
|pg_foreign_data_wrapper|表|oid|追加||
|pg_foreign_data_wrapper|表|fdwoptions|変更|Collationの値が空値からCに変更|
|pg_foreign_server|表|oid|追加||
|pg_foreign_server|表|srvtype|変更|Collationの値が空値からCに変更|
|pg_foreign_server|表|srvversion|変更|Collationの値が空値からCに変更|
|pg_foreign_server|表|srvoptions|変更|Collationの値が空値からCに変更|
|pg_foreign_table|表|ftoptions|変更|Collationの値が空値からCに変更|
|pg_index|表|indexprs|変更|Collationの値が空値からCに変更|
|pg_index|表|indpred|変更|Collationの値が空値からCに変更|
|pg_language|表|oid|追加||
|pg_largeobject_metadata|表|oid|追加||
|pg_namespace|表|oid|追加||
|pg_opclass|表|oid|追加||
|pg_operator|表|oid|追加||
|pg_opfamily|表|oid|追加||
|pg_partitioned_table|表|partexprs|変更|Collationの値が空値からCに変更|
|pg_pltemplate|表|tmplhandler|変更|Collationの値が空値からCに変更|
|pg_pltemplate|表|tmplinline|変更|Collationの値が空値からCに変更|
|pg_pltemplate|表|tmplvalidator|変更|Collationの値が空値からCに変更|
|pg_pltemplate|表|tmpllibrary|変更|Collationの値が空値からCに変更|
|pg_policies|表|qual|変更|Collationの値が空値からCに変更|
|pg_policies|表|with_check|変更|Collationの値が空値からCに変更|
|pg_policy|表|oid|追加||
|pg_policy|表|polroles|変更|Collationの値が空値からCに変更|
|pg_policy|表|polqual|変更|Collationの値が空値からCに変更|
|pg_policy|表|polwithcheck|変更|Collationの値が空値からCに変更|
|pg_prepared_statements|ビュー|protransform|削除||
|pg_prepared_statements|ビュー|prosupport|追加||
|pg_proc|表|oid|追加||
|pg_proc|表|proargnames|変更|Collationの値が空値からCに変更|
|pg_proc|表|proargdefaults|変更|Collationの値が空値からCに変更|
|pg_proc|表|prosrc|変更|Collationの値が空値からCに変更|
|pg_proc|表|probin|変更|Collationの値が空値からCに変更|
|pg_proc|表|proconfig|変更|Collationの値が空値からCに変更|
|pg_publication|表|oid|追加||
|pg_publication_rel|表|oid|追加||
|pg_replication_origin|表|roname|変更|Collationの値が空値からCに変更|
|pg_replication_origin|表|pg_replication_origin_roname_index|変更|インデックス定義時のtext_pattern_ops指定がなくなった|
|pg_rewrite|表|oid|追加||
|pg_rewrite|表|ev_qual|変更|Collationの値が空値からCに変更, not null制約追加|
|pg_rewrite|表|ev_action|変更|Collationの値が空値からCに変更, not null制約追加|
|pg_roles|ビュー|rolconfig|変更|Collationの値が空値からCに変更|
|pg_rules|ビュー|provider|変更|Collationの値が空値からCに変更|
|pg_rules|ビュー|label|変更|Collationの値が空値からCに変更|
|pg_seclabel|表|pg_seclabel_object_index|変更|インデックス定義時のtext_pattern_ops指定がなくなった|
|pg_seclabels|ビュー|objname|変更|Collationの値が空値からCに変更|
|pg_seclabels|ビュー|provider|変更|Collationの値が空値からCに変更|
|pg_seclabels|ビュー|label|変更|Collationの値が空値からCに変更|
|pg_shadow|ビュー|passwd|変更|Collationの値が空値からCに変更|
|pg_shadow|ビュー|valuntil|変更|型がabstimeからtimestamp with time zoneに変更|
|pg_shadow|ビュー|useconfig|変更|Collationの値が空値からCに変更|
|pg_shdescription|表|description|変更|Collationの値が空値からCに変更|
|pg_shdescription|表|provider|変更|Collationの値が空値からCに変更|
|pg_shdescription|表|label|変更|Collationの値が空値からCに変更|
|pg_shdescription|表|"pg_shseclabel_object_index"|変更|インデックス定義時のtext_pattern_ops指定がなくなった|
|pg_stat_database|ビュー|checksum_failures|追加||
|pg_stat_gssapi|ビュー|pid|追加||
|pg_stat_gssapi|ビュー|gss_authenticated|追加||
|pg_stat_gssapi|ビュー|principal|追加||
|pg_stat_gssapi|ビュー|encrypted|追加||
|pg_stat_progress_cluster|ビュー|pid|追加||
|pg_stat_progress_cluster|ビュー|datid|追加||
|pg_stat_progress_cluster|ビュー|datname|追加||
|pg_stat_progress_cluster|ビュー|relid|追加||
|pg_stat_progress_cluster|ビュー|command|追加||
|pg_stat_progress_cluster|ビュー|phase|追加||
|pg_stat_progress_cluster|ビュー|cluster_index_relid|追加||
|pg_stat_progress_cluster|ビュー|heap_tuples_scanned|追加||
|pg_stat_progress_cluster|ビュー|heap_tuples_written|追加||
|pg_stat_progress_cluster|ビュー|heap_blks_total|追加||
|pg_stat_progress_cluster|ビュー|heap_blks_scanned|追加||
|pg_stat_progress_cluster|ビュー|index_rebuild_count|追加||
|pg_stat_progress_create_index|ビュー|pid|追加||
|pg_stat_progress_create_index|ビュー|datid|追加||
|pg_stat_progress_create_index|ビュー|datname|追加||
|pg_stat_progress_create_index|ビュー|relid|追加||
|pg_stat_progress_create_index|ビュー|phase|追加||
|pg_stat_progress_create_index|ビュー|lockers_total|追加||
|pg_stat_progress_create_index|ビュー|lockers_done|追加||
|pg_stat_progress_create_index|ビュー|current_locker_pid|追加||
|pg_stat_progress_create_index|ビュー|blocks_total|追加||
|pg_stat_progress_create_index|ビュー|blocks_done|追加||
|pg_stat_progress_create_index|ビュー|tuples_total|追加||
|pg_stat_progress_create_index|ビュー|tuples_done|追加||
|pg_stat_progress_create_index|ビュー|partitions_total|追加||
|pg_stat_progress_create_index|ビュー|partitions_done|追加||
|pg_stat_replication|ビュー|reply_time|追加||
|pg_stat_ssl|ビュー|client_dn|変更|カラム名の変更(clientdn→client_dn)|
|pg_stat_ssl|ビュー|client_serial|追加||
|pg_stat_ssl|ビュー|issuer_dn|追加||
|pg_statistic|表|stacoll1|追加||
|pg_statistic|表|stacoll2|追加||
|pg_statistic|表|stacoll3|追加||
|pg_statistic|表|stacoll4|追加||
|pg_statistic|表|stacoll5|追加||
|pg_statistic_ext|表|oid|追加||
|pg_statistic_ext|表|stxndistinct|変更|Collationの値が空値からCに変更|
|pg_statistic_ext|表|stxdependencies|変更|Collationの値が空値からCに変更|
|pg_statistic_ext|表|stxmcv|追加||
|pg_subscription|表|oid|追加||
|pg_subscription|表|subconninfo|変更|Collationの値が空値からCに変更|
|pg_subscription|表|subsynccommit|変更|Collationの値が空値からCに変更|
|pg_subscription|表|subpublications|変更|Collationの値が空値からCに変更|
|pg_tablespace|表|oid|追加||
|pg_tablespace|表|spcoptions|変更|Collationの値が空値からCに変更|
|pg_transform|表|oid|追加||
|pg_trigger|表|oid|追加||
|pg_trigger|表|tgqual|変更|Collationの値が空値からCに変更|
|pg_ts_config|表|oid|追加||
|pg_ts_dict|表|oid|追加||
|pg_ts_dict|表|dictinitoption|変更|Collationの値が空値からCに変更|
|pg_ts_parser|表|oid|追加||
|pg_ts_template|表|oid|追加||
|pg_type|表|oid|追加||
|pg_type|表|typdefaultbin|変更|Collationの値が空値からCに変更|
|pg_type|表|typdefault|変更|Collationの値が空値からCに変更|
|pg_user|ビュー|valuntil|変更|Collationの値が空値からCに変更|
|pg_user|ビュー|useconfig|変更|Collationの値が空値からCに変更|
|pg_user_mapping|表|oid|追加||
|pg_user_mapping|表|umoptions|変更|Collationの値が空値からCに変更|
|pg_user_mappings|ビュー|umoptions|変更|Collationの値が空値からCに変更|

# おわりに
今回は、やたらとシステムカタログの差分が多くなってしまったが、実効的な差分の量は意外と少ない。
今後、新たな機能がcommitされれば差分もまた増えていくと思うので、これも今後開発フェーズが進んだら、また再調査しておきたい。

[^1]: 今回調査対象としたのは、4/7時点の版(commit ``9e360f0e8327bcf4b7c5ce957024fdff8f95f7de``)。