More Related Content
Similar to PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料) (20)
More from NTT DATA Technology & Innovation (20)
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
- 1. © 2021 NTT DATA Corporation
PostgreSQL初心者がパッチを提案してからコミットされるまで
2021年2月2日 第20回PostgreSQLアンカンファレンス@オンライン
株式会社NTTデータ 技術開発本部
加藤 慎也
- 2. © 2021 NTT DATA Corporation 2
自己紹介
⚫ 名前
‒ 加藤 慎也 @ShinyaKato_
⚫ 所属
‒ 株式会社NTTデータ 技術開発本部
⚫ 経歴
‒ 入社1年目社員
‒ PostgreSQL歴2ヶ月
‒ 大学時代は、DB系の研究をしてたがRDBに関してはほぼ初心者
(SQLもロクに書いたことがない…)
- 3. © 2021 NTT DATA Corporation 3
YouTubeチャンネル “NTT DATA Tech”
技術取り組み、活用情報を中心にお届けします
https://www.youtube.com/NTTDATATech
- 4. © 2021 NTT DATA Corporation 4
PostgreSQL初心者が
パッチを提案してからコミットされるまで
- 5. © 2021 NTT DATA Corporation 5
モチベーション
⚫ OSSコミッターが多数在籍する部署に配属
⚫ PostgreSQLのコア開発者になりたい!
⚫ まずは、簡単なパッチ開発に取り組もう!
⚫ カーソルに関するコマンドのタブ補完を改善するパッチの作成
‒ CLOSE、FETCH、MOVEのタブ補完が期待通り動作しない
‒ 期待通り動作するようにパッチを作成する
‒ タブ補完として、定義済カーソルの名前一覧+ALLを表示する
‒ ※CLOSEを中心に紹介します
- 6. © 2021 NTT DATA Corporation 6
タブ補完とは?
⚫ Tabキー押すことで入力内容を補完する機能
⚫ 例えば、ALTER SYSTEMのタブ補完を確認
=# ALTER SYSTEM
RESET SET
=# ALTER SYSTEM SET
Display all 315 possibilities? (y or n)
all log_parser_stats
allow_system_table_mods log_planner_stats
application_name log_replication_commands
archive_cleanup_command log_rotation_age
archive_command log_rotation_size
archive_mode log_statement
archive_timeout log_statement_sample_rate
…
タブキーを押すと、
入力内容が補完される
- 7. © 2021 NTT DATA Corporation 7
タブ補完がどのような仕組みで動いているかを確認
⚫ タブ補完のソースコードを探す
⚫ git grep “tab” -- “src/” でtabを含むコードを探してみる
‒ databaseやtableばかりが大量に引っかかって諦める
⚫ 大人しくディレクトリをたどってみる
‒ backendではないからbinにいってみよう
‒ おっ、psqlというディレクトリがある
‒ tab-complete.cがある!多分これだ!
- 8. © 2021 NTT DATA Corporation 8
タブ補完のソースコードを読み解く
前半部分にはマクロとして
様々なクエリが記述されている
後半部分にはタブ補完の条件
と補完内容が記述されている
- 9. © 2021 NTT DATA Corporation 9
CLOSEのタブ補完の挙動はどうなっているか?
⚫ CLOSEとは?
‒ CLOSEは、開いたカーソルに関連するリソースを解放します。カーソルが閉じられた後は、
そのカーソルに対する操作はできません。カーソルは必要がなくなった時点で閉じるべき
です。
‒ https://www.postgresql.jp/document/12/html/sql-close.html
⚫ 動かしてみる
=# BEGIN;
BEGIN
=*# DECLARE cur CURSOR FOR SELECT * FROM pg_class;
DECLARE CURSOR
=*# CL
CLOSE CLUSTER
=*# CLOSE タブを押しても
定義済みカーソルが表示されない
- 10. © 2021 NTT DATA Corporation 10
実装を始める前に…
⚫ 定義済カーソル一覧を表示する方法を知りたい
‒ CLOSEのドキュメントより、
‒ pg_cursorsシステムビューを問い合わせることにより利用可能なすべてのカーソルを確認すること
ができます。
=# BEGIN;
BEGIN
=*# DECLARE cur1 CURSOR FOR SELECT * FROM pg_class;
DECLARE CURSOR
=*# DECLARE cur2 CURSOR FOR SELECT * FROM pg_class;
DECLARE CURSOR
=*# SELECT name FROM pg_cursors;
name
------
cur1
cur2
(2 rows)
- 11. © 2021 NTT DATA Corporation 11
実装
1. CLOSEが入力されたときの挙動を記述
2. 定義済カーソル一覧を表示するクエリのマクロを記述
- 12. © 2021 NTT DATA Corporation 12
動作確認
⚫ PostgreSQLリビルドし、動作確認
=# BEGIN;
BEGIN
=*# DECLARE cur CURSOR FOR SELECT
* FROM pg_class;
DECLARE CURSOR
=*# CLOSE
修正前 修正後
=# BEGIN;
BEGIN
=*# DECLARE cur CURSOR FOR SELECT
* FROM pg_class;
DECLARE CURSOR
=*# CLOSE
ALL cur
ALLと
定義済カーソルが補完される
補完されない
- 13. © 2021 NTT DATA Corporation 13
パッチの作成
⚫ パッチ作成
$ git diff > fix_tab_complete_close_fetch_move.patch
- 14. © 2021 NTT DATA Corporation 14
メーリングリストに投稿
⚫ パッチを添付してpgsql-hackers@postgresql.org宛に送信
- 15. © 2021 NTT DATA Corporation 15
1月のCommitfestsへの登録
⚫ 1月のCommitfestsのページでパッチを登録
‒ https://commitfest.postgresql.org/31/
- 16. © 2021 NTT DATA Corporation 16
レビュー結果
1. パッチを適用しようとしたら、whitespace warningsが出る
2. カーソル一覧を表示するクエリの修正
3. コメントの修正
4. DECLARE文のタブ補完もこの機会にやっておくのはどうか?
- 17. © 2021 NTT DATA Corporation 17
1.パッチを適用しようとしたら、whitespace warnings が出る
⚫ whitespace warnings
‒ 行末のスペースや、タブ文字が直後に続くスペースがあると出る警告
⚫ PostgreSQLのコーディング規約
‒ タブを4カラムとするスペーシングを使用し、現在はタブを保存しています(つまりタブをス
ペースに展開しません)
‒ https://www.postgresql.jp/document/12/html/source-format.html
⚫ pgindentを使用してwhitespaceを削除
‒ コードを整形してくれるツール
When I applied the patch, I got the following whitespace warnings:
$ git apply ~/patches/fix_tab_complete_close_fetch_move.patch
…
warning: squelched 19 whitespace errors
warning: 24 lines add whitespace errors.
I recommend you checking whitespaces or running pgindent.
- 18. © 2021 NTT DATA Corporation 18
2.カーソル一覧を表示するクエリの修正(1/2)
⚫ quote_ident() :必要な場合、適切な引用符を付けて返す関数
⚫ substring() :部分文字列を取り出す関数
⚫ %d :これまでに入力された文字列の長さ
⚫ %s :これまでに入力された文字列
+#define Query_for_list_of_cursors ¥
+" SELECT name FROM pg_cursors"¥
This query should be the following?
" SELECT pg_catalog.quote_ident(name) "¥
" FROM pg_catalog.pg_cursors "¥
" WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s'"
- 19. © 2021 NTT DATA Corporation 19
2.カーソル一覧を表示するクエリの修正(2/2)
⚫ 引用符付きでカーソルを定義したときも適切にカーソル名が補完される
=*# DECLARE “CUR” CURSOR FOR
SELECT * FROM pg_class;
DECLARE CURSOR
=*# CLOSE
ALL CUR
=*# CLOSE CUR;
2021-01-29 14:35:44.803 JST [47872]
ERROR: cursor "cur" does not exist
2021-01-29 14:35:44.803 JST [47872]
STATEMENT: close CUR;
ERROR: cursor "cur" does not exist
修正前 修正後
=*# DECLARE “CUR” CURSOR FOR
SELECT * FROM pg_class;
DECLARE CURSOR
=*# CLOSE
“CUR” ALL
postgres=*# CLOSE "CUR";
CLOSE CURSOR
引用符付きで補完
引用符無しで補完
- 20. © 2021 NTT DATA Corporation 20
3.コメントの修正
⚫ 英語の文法の問題(A, B, and C)
⚫ 指摘通りに修正
/*
- * Complete FETCH with one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
- * NEXT, PRIOR, FIRST, LAST
+ * Complete FETCH with a list of cursors and one of ABSOLUTE,
BACKWARD, FORWARD, RELATIVE, ALL,
+ * NEXT, PRIOR, FIRST, LAST, FROM, IN
*/
Maybe I think the commend should say:
+ * Complete FETCH with one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
+ * NEXT, PRIOR, FIRST, LAST, FROM, IN, and a list of cursors
- 21. © 2021 NTT DATA Corporation 21
4.DECLARE文のタブ補完もこの機会にやっておくのはどうか?
⚫ DECLAREのドキュメントより
‒ DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
⚫ 複数のオプションを指定したときに、うまくタブ補完が動かない
‒ DECLARE name
‒ BINARY, INSENSITIVE, SCROLL, NO SCROLL, CURSORを補完
‒ DECLARE name BINARY
‒ 何も補完されない
⚫ これを修正したパッチをレビュワーの澤田さんに作って頂きました
- 25. © 2021 NTT DATA Corporation 25
まとめ
⚫ PostgreSQLのコア開発者になる第一歩として
CLOSE、FETCH、MOVEのタブ補完機能を向上させるパッチを作成した
⚫ 無事コミットされた
⚫ 所感
‒ PostgreSQLコミュニティの開発フローが最初はよくわからなかった
‒ 12月にパッチ投稿→誰もレビューしてくれない…
‒ 1月になってCommitfestsが始まると、すぐにレビューされた
‒ 軽微なパッチなのですぐにコミットされると思いきや、意外と時間がかかった
‒ 関連事項の調査など
‒ パッチ作成以外の仕事をしていると、いつの間にか議論が進んでいてコミットされていた
‒ whitespace warningsのような初歩的なミスを指摘されるのが申し訳なかった
‒ コミュニティには優しい方々が多い
‒ パッチ作成は大変だったが今後も取り組んでいきたい
- 26. © 2021 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。