Commitfest 2020-09 - psql関連

はじめに

先週にPostgreSQL 13.0リリースされたってこともあるけど、久々にCommitfestを見てみようと思った。 commitfest.postgresql.org とりあえず、自分にとって興味のあるpsqlについて、まず見てみようかと。

psql関連の項目

とりあえず"psql"でCommitfestページ内を引っ掛けると、以下の8項目があった。

  • psql - add SHOW_ALL_RESULTS option
  • psql - possibility to specify where status row should be displayed
  • allow to set a pager for psql's watch command
  • Confusing list foreign table options in psql - Fixing slash usage text
  • list of extended statistics on psql
  • document that psql's FETCH_COUNT does not work with combined (\;) queries
  • psql: add \si, \sm, \st and \sr functions to show CREATE commands for indexes, matviews, triggers and tables
  • psql: Include access method in listTables output

とりあえず、議論の発端となったメールの概要くらいは見ておこう。

psql - add SHOW_ALL_RESULTS option

これはざっくりいうと、連結されたクエリの最後のクエリだけでなく、途中のクエリの結果も表示する、というものらしい。 現在は、連結したクエリをpsqlで実行すると、最後のクエリの結果のみが表示される。

psql - possibility to specify where status row should be displayed

\h 出力のようにコマンドタグを毎回stdoutにリダイレクトできないか、という提案なんだろうか。 で、この提案機能の使い途って何?という質疑が続く。

このパッチの作成者のPavel Stehuleさんが言うには(ML投稿の雑翻訳) 、

このパッチの主な動機は、クエリを記述および編集するためにpsqlを使用し、pspgまたは他の同様のツール(tail, ...)を使用して結果を2番目のターミナルで参照することです。 この設定の利点は、SQLとクエリの結果を一緒に表示できることです。

ということらしい。pspgってツールは知らなかったので、ちょっと調べてみた。 github.com

pspgというのは、どうやらページャのようだ。psql変数PAGERにpspgというのを指定すると使えるようだ。ヘッダ行を固定したままスクロールとかできるようなので、ちょっと便利そう。

allow to set a pager for psql's watch command

\watchメタコマンド専用のぺージャを設定する、psql環境変数PSQL_WATCH_PAGERの提案っぽい。 提案者は一つ上の項目と同じPavel Stehuleさん。

Confusing list foreign table options in psql - Fixing slash usage text

psqlの外部表に関するメタコマンド

  \dE[S+] [PATTERN]      list foreign tables
  \det[+] [PATTERN]      list foreign tables

の説明が同じで混乱するから改善したいという話かな?詳細は追ってない。

list of extended statistics on psql

拡張統計情報に関するリストを表示するメタコマンドdzの提案かな?

document that psql's FETCH_COUNT does not work with combined (\;) queries

連結されたクエリ(DECLARE ... <first select>; <second select>)の挙動(2番目がSELECTでない場合、1番目のSELECTの内容がカーソル定義として適用されるけど、それに関する文書の説明の改善提案なのかな。詳細は追ってない。

psql: add \si, \sm, \st and \sr functions to show CREATE commands for indexes, matviews, triggers and tables

psqlに新しいメタコマンドを追加して、インデックス、マテリアライズド・ビュー、トリガ、テーブルのCREATE文を表示させようという提案かな。 今でも、ビューについては、

pgbench=# \d+ accounts_v
                              View "public.accounts_v"
  Column  |     Type      | Collation | Nullable | Default | Storage  | Description
----------+---------------+-----------+----------+---------+----------+-------------
 aid      | integer       |           |          |         | plain    |
 bid      | integer       |           |          |         | plain    |
 abalance | integer       |           |          |         | plain    |
 filler   | character(84) |           |          |         | extended |
View definition:
 SELECT pgbench_accounts.aid,
    pgbench_accounts.bid,
    pgbench_accounts.abalance,
    pgbench_accounts.filler
   FROM pgbench_accounts;

みたいな定義を表示するので、それと同じようなことがやりたいのかな?

psql: Include access method in listTables output

これは、テーブル一覧を表示する\dメタコマンドの詳細モード(\d+)を引数なしで実行したときに、各テーブルのアクセスメソッドを表示するもの。これは既にcommitされているので、最新のソースを入手すると挙動が確認できる。

$ ~/pgsql/master/bin/psql -p 10014 pgbench
psql (14devel)
Type "help" for help.

pgbench=# \d
              List of relations
 Schema |       Name       | Type  |  Owner
--------+------------------+-------+----------
 public | pgbench_accounts | table | postgres
 public | pgbench_branches | table | postgres
 public | pgbench_history  | table | postgres
 public | pgbench_tellers  | table | postgres
(4 rows)

pgbench=# \d+
                                         List of relations
 Schema |       Name       | Type  |  Owner   | Persistence | Access Method |  Size   | Description
--------+------------------+-------+----------+-------------+---------------+---------+-------------
 public | pgbench_accounts | table | postgres | permanent   | heap          | 13 MB   |
 public | pgbench_branches | table | postgres | permanent   | heap          | 40 kB   |
 public | pgbench_history  | table | postgres | permanent   | heap          | 0 bytes |
 public | pgbench_tellers  | table | postgres | permanent   | heap          | 40 kB   |
(4 rows)

現状は、コア機能にはheapアクセスメソッドしかないけど、zheapやZedstoreのような別のアクセスメソッドが組み込めるようになったら、こういう機能があると便利なのは確か。