システムカタログ・ビューの変更

# はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 23日目の記事です。

今回はCommitfest個々の項目ではなく、システムカタログ/システムビュー全体の変更状態を調べてみました。
なお、あくまでも開発途中のものなので、beta版リリースのときには、これよりも大きく変わっている可能性は高いです。

# 比較対象
今回の記事は、以下のバージョン間のシステムカタログ・ビューの変更状態を調査しました。

* PostgreSQL 15.1
* PostgreSQL-devel
  * 12/20朝時点の版
  * [commit eb60eb08a95eb531f3f2a459c1b623c5ac37ecd3](https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=eb60eb08a95eb531f3f2a459c1b623c5ac37ecd3)
  * CATALOG_VERSION_NO 202212191

# テーブル/ビュー単位での比較

diffとってみましたが、**現時点ではテーブル/ビュー単位での変更は現時点ではないようです。**

# 列への変更
次にテーブル・ビューの列単位での変更を見てみます。

## システムカタログ

列の変更があったシステムカタログは以下の3つです。

|テーブル名|内容|
|:--|:--|
|pg_auth_members|ロール間のメンバシップ関係を管理|
|pg_db_role_setting|ロールとデータベースの組み合わせ毎に、設定される実行時設定変数を管理|
|pg_subscription|論理レプリケーションのサブスクリプションの管理|

### pg_auth_members

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|inherit_option|追加|bool|メンバーが付与されたロールの権限を自動的に継承するかどうかのフラグ|
|oid|追加|oid|Row identifier|
|set_option|追加|bool|メンバーが付与されたロールにSET ROLEできるかどうかのフラグ|

今回、アドベントカレンダー期間内にきちんと調べきれなかったCommitfest項目（[allowing for control over SET ROLE](https://commitfest.postgresql.org/40/3868/)）に関係しているんだろうか・・・？

### pg_db_role_setting

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|setuser|追加|bool[]|setconfigの各設定に対応するUSER SETフラグ|

これは、PostgreSQL 16 全部ぬこ Advent Calendar 2022 18日目の記事（[PG16：Add USER SET parameter values for pg_db_role_setting](https://qiita.com/nuko_yokohama/items/bd9844c27e0b0cbf99fd)）に関連する列の追加ですね。

### pg_subscription

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|suborigin|追加|text|(DeepL翻訳)<br>originの値は、noneまたはanyのいずれかにする必要があります。デフォルトは any です。<br>none の場合、サブスクリプションはパブリッシャーに、オリジンを持たない変更のみを送信するように要求します。any の場合、パブリッシャーはオリジンに関係なく変更を送信します。|

うーむ、これはよくわかりません。
Commitfestの項目[Add common function ReplicationOriginName](https://commitfest.postgresql.org/40/3905/)に関係しているのかなあ・・・（これは全然調べてなかった）。

## システムビュー

列の変更があったシステムカタログは以下の9つです。
なお、pg_stat_*_tables, pg_stat_*_indexes は実質上同じ変更です。

|テーブル名|内容|
|:--|:--|
|pg_hba_file_rules|クライアント認証の設定ファイル``pg_hba.conf``の内容の要約|
|pg_ident_file_mappings|ident認証の設定ファイル``pg_ident.conf``の内容の要約|
|pg_prepared_statements|現在のセッションで利用可能な準備済み文の一覧|
|pg_stat_all_indexes|インデックスへのアクセスに関する統計情報|
|pg_stat_all_tables|テーブルへのアクセスに関する統計情報|
|pg_stat_sys_indexes|インデックスへのアクセスに関する統計情報<br>（システムテーブルのインデックス）|
|pg_stat_sys_tables|テーブルへのアクセスに関する統計情報<br>（システムテーブル）|
|pg_stat_user_indexes|インデックスへのアクセスに関する統計情報<br>（ユーザテーブルのインデックス）|
|pg_stat_user_tables|テーブルへのアクセスに関する統計情報<br>（ユーザテーブル）|

### pg_hba_file_rules

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|file_name|追加|text|そのルールを含むファイル名|
|rule_number|追加|int4|このルールの番号（有効な場合）、それ以外は NULL。<br>認証時にマッチするまで各ルールが適用される順序を示す。|

これは、PostgreSQL 16 全部ぬこ Advent Calendar 2022 3日目の記事（[PG16:Allow file inclusion in pg_hba and pg_ident file](https://qiita.com/nuko_yokohama/items/806443d6601abd38dd0f)）に対応するものかな。

### pg_ident_file_mappings

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|file_name|追加|text|そのマップを含むファイル名|
|map_number|追加|int4|このマップの番号（有効な場合は優先順位）、そうでない場合は NULL|

きちんと調査して書いてないけど、これも、PostgreSQL 16 全部ぬこ Advent Calendar 2022 3日目の記事（[PG16:Allow file inclusion in pg_hba and pg_ident file](https://qiita.com/nuko_yokohama/items/806443d6601abd38dd0f)）に対応するものかな。

### pg_prepared_statements

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|result_types|追加|regtype[]|(DeepL翻訳)<br>準備された文が返す列の型は、regtype の配列の形式となります。この配列の要素に対応する OID は、regtype 値を oid にキャストすることで取得できます。準備された文が結果を提供しない場合(例えば、DML文)、このフィールドはNULLになります。|

うーん、これは何の改造項目に対応したものなんだろう。
Topicが``Monitoring & Control``の項目には、それっぽいものがないような気がしているのだけど・・・。

:::note info
[篠田さんからの指摘](https://twitter.com/nori_shinoda/status/1606078779742228480)によると、以下のCommitfest項目とのことでした。うーむ、Commitfest　2022-07の項目だったのか・・・
[Add result_types column to pg_prepared_statements view](https://commitfest.postgresql.org/38/3644/)
:::

### pg_stat_*_indexes

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|last_idx_scan|追加|timestamptz|最後にIndexScanされたタイムスタンプ|

これと一つ下の節にある``pg_stat_*_tables``への列追加は、PostgreSQL 16 全部ぬこ Advent Calendar 2022 7日目の記事（[PG16:Tracking last scan time](https://qiita.com/nuko_yokohama/items/37dbf002612c2c9b252c)）に対応するものですね。

### pg_stat_*_tables

|列名|更新種別|データ型|内容|
|:--|:--|:--|:--|
|last_idx_scan|追加|timestamptz|最後にIndexScanされたタイムスタンプ|
|last_seq_scan|追加|timestamptz|最後にSeqScanされたタイムスタンプ|

# 行の変更（一部だけ）
## pg_roles
定義済みロールなど、予め登録されているシステムカタログの行の違いも、少し見てみようと思って、手始めに``pg_roles``の行差分を取ってみましたが、なんといつの間にか``pg_vacuum_all_tables``と``pg_analyze_all_tables``の定義済みロールが消えてました。
PostgreSQL 15との差分で出てきたのは、``pg_maintain``の行のみ。

よく考えてみれば、昨日公開した記事（[allow granting CLUSTER, REFRESH MATERIALIZED VIEW, and REINDEX](https://qiita.com/nuko_yokohama/items/72d296452545abc3c959)で、``pg_roles``の内容を表示しているのに気づかなかった・・・。
たぶん、VACUUMもANALYZEも``pg_maintain``ロールで対応するのだろうなあ。
（Commitfestのタイトルからだけではわからんよ・・・）

# おわりに
ということで、今回はシステムカタログ全般の変更を簡単に調べてみました。
まだ、開発途中なのでこのあたりは今後、いろいろ変わるとは思いますが・・・