はじめに
にゃーん。趣味でポスグレをやっている者だ。
この記事はPostgreSQL 16 全部ぬこ Advent Calendar 2022 16日目の記事です。
今回はpsql
メタコマンドのbug-fixについて書きます。
概要
項目 | 内容 |
---|---|
タイトル | Fix overwrite of successive result sets with psql's \g fname |
Topic | Bug Fixes |
ステータス | commited |
Last Modified | 2022-10-03 |
概要 |
psql で複数SQL記述直後の\g メタコマンドの挙動改善 |
変更内容
全部ぬこアドベントカレンダー13日目の記事でも、psql
の\g
メタコマンド(直前のコマンドを繰り返し実行する)について書きましたが、PostgreSQL 15/16ではそれとは別に、バグフィックスっぽい改善も入っています。
どんなバグなのか
簡単に言うと、psql上で複数ステートメントを1ラインで実行した直後、\g file
を実行したときに、最後に実行されたコマンドの結果しか書き込まれない、という問題のようです。
なお、この問題は、PostgreSQL 15.0では既に改善されています。
PostgreSQL 15(たぶんbeta4まで)での挙動
=# select 1\; select 2;
?column?
----------
1
(1 row)
?column?
----------
2
(1 row)
=# select 1\; select 2 \g file
=# \q
$
psql
を終了して、file
の内容を確認します。
$ cat file
?column?
----------
2
(1 row)
$
最後に実行されたSELECT 2
の結果しか書き出されていませんね。
PostgreSQL 15.0/PostgreSQL 16での挙動
=# select 1\; select 2;
?column?
----------
1
(1 row)
?column?
----------
2
(1 row)
=# select 1\; select 2 \g file
=# \q
$
psql
を終了して、file
の内容を確認します。
$ cat file
?column?
----------
1
(1 row)
?column?
----------
2
(1 row)
$
全てのコマンドの結果がfile
に書き込まれています。これがあるべき動作ということですね。
おわりに
今回はPostgreSQL 15開発中にFixされた、PostgreSQL 15/16に反映された、psql
の新機能について書きました。
\g file
指定自体、この調べ物をしていて初めて知った・・・psqlなんもわからん。