Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
© 2021 NTT DATA Corporation
PostgreSQL初心者がパッチを提案してからコミットされるまで
2021年2月2日 第20回PostgreSQLアンカンファレンス@オンライン
株式会社NTTデータ 技術開発本部
加藤 慎也
© 2021 NTT DATA Corporation 2
自己紹介
⚫ 名前
‒ 加藤 慎也 @ShinyaKato_
⚫ 所属
‒ 株式会社NTTデータ 技術開発本部
⚫ 経歴
‒ 入社1年目社員
‒ PostgreSQL歴2ヶ月
‒ 大学時代は、DB系の研究をしてたがRDBに関してはほぼ初心者
(SQLもロクに書いたことがない…)
© 2021 NTT DATA Corporation 3
YouTubeチャンネル “NTT DATA Tech”
技術取り組み、活用情報を中心にお届けします
https://www.youtube.com/NTTDATATech
© 2021 NTT DATA Corporation 4
PostgreSQL初心者が
パッチを提案してからコミットされるまで
© 2021 NTT DATA Corporation 5
モチベーション
⚫ OSSコミッターが多数在籍する部署に配属
⚫ PostgreSQLのコア開発者になりたい!
⚫ まずは、簡単なパッチ開発に取り組もう!
⚫ カーソルに関するコマンドのタブ補完を改善するパッチの作成
‒ CLOSE、FETCH、MOVEのタブ補完が期待通り動作しない
‒ 期待通り動作するようにパッチを作成する
‒ タブ補完として、定義済カーソルの名前一覧+ALLを表示する
‒ ※CLOSEを中心に紹介します
© 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
…
タブキーを押すと、
入力内容が補完される
© 2021 NTT DATA Corporation 7
タブ補完がどのような仕組みで動いているかを確認
⚫ タブ補完のソースコードを探す
⚫ git grep “tab” -- “src/” でtabを含むコードを探してみる
‒ databaseやtableばかりが大量に引っかかって諦める
⚫ 大人しくディレクトリをたどってみる
‒ backendではないからbinにいってみよう
‒ おっ、psqlというディレクトリがある
‒ tab-complete.cがある!多分これだ!
© 2021 NTT DATA Corporation 8
タブ補完のソースコードを読み解く
前半部分にはマクロとして
様々なクエリが記述されている
後半部分にはタブ補完の条件
と補完内容が記述されている
© 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 タブを押しても
定義済みカーソルが表示されない
© 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)
© 2021 NTT DATA Corporation 11
実装
1. CLOSEが入力されたときの挙動を記述
2. 定義済カーソル一覧を表示するクエリのマクロを記述
© 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と
定義済カーソルが補完される
補完されない
© 2021 NTT DATA Corporation 13
パッチの作成
⚫ パッチ作成
$ git diff > fix_tab_complete_close_fetch_move.patch
© 2021 NTT DATA Corporation 14
メーリングリストに投稿
⚫ パッチを添付してpgsql-hackers@postgresql.org宛に送信
© 2021 NTT DATA Corporation 15
1月のCommitfestsへの登録
⚫ 1月のCommitfestsのページでパッチを登録
‒ https://commitfest.postgresql.org/31/
© 2021 NTT DATA Corporation 16
レビュー結果
1. パッチを適用しようとしたら、whitespace warningsが出る
2. カーソル一覧を表示するクエリの修正
3. コメントの修正
4. DECLARE文のタブ補完もこの機会にやっておくのはどうか?
© 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.
© 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'"
© 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
引用符付きで補完
引用符無しで補完
© 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
© 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
‒ 何も補完されない
⚫ これを修正したパッチをレビュワーの澤田さんに作って頂きました
© 2021 NTT DATA Corporation 22
コミット
© 2021 NTT DATA Corporation 23
コミット
© 2021 NTT DATA Corporation 24
(時間があれば)デモ
© 2021 NTT DATA Corporation 25
まとめ
⚫ PostgreSQLのコア開発者になる第一歩として
CLOSE、FETCH、MOVEのタブ補完機能を向上させるパッチを作成した
⚫ 無事コミットされた
⚫ 所感
‒ PostgreSQLコミュニティの開発フローが最初はよくわからなかった
‒ 12月にパッチ投稿→誰もレビューしてくれない…
‒ 1月になってCommitfestsが始まると、すぐにレビューされた
‒ 軽微なパッチなのですぐにコミットされると思いきや、意外と時間がかかった
‒ 関連事項の調査など
‒ パッチ作成以外の仕事をしていると、いつの間にか議論が進んでいてコミットされていた
‒ whitespace warningsのような初歩的なミスを指摘されるのが申し訳なかった
‒ コミュニティには優しい方々が多い
‒ パッチ作成は大変だったが今後も取り組んでいきたい
© 2021 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。

More Related Content

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 ‒ 何も補完されない ⚫ これを修正したパッチをレビュワーの澤田さんに作って頂きました
  • 22. © 2021 NTT DATA Corporation 22 コミット
  • 23. © 2021 NTT DATA Corporation 23 コミット
  • 24. © 2021 NTT DATA Corporation 24 (時間があれば)デモ
  • 25. © 2021 NTT DATA Corporation 25 まとめ ⚫ PostgreSQLのコア開発者になる第一歩として CLOSE、FETCH、MOVEのタブ補完機能を向上させるパッチを作成した ⚫ 無事コミットされた ⚫ 所感 ‒ PostgreSQLコミュニティの開発フローが最初はよくわからなかった ‒ 12月にパッチ投稿→誰もレビューしてくれない… ‒ 1月になってCommitfestsが始まると、すぐにレビューされた ‒ 軽微なパッチなのですぐにコミットされると思いきや、意外と時間がかかった ‒ 関連事項の調査など ‒ パッチ作成以外の仕事をしていると、いつの間にか議論が進んでいてコミットされていた ‒ whitespace warningsのような初歩的なミスを指摘されるのが申し訳なかった ‒ コミュニティには優しい方々が多い ‒ パッチ作成は大変だったが今後も取り組んでいきたい
  • 26. © 2021 NTT DATA Corporation その他、記載されている会社名、商品名、又はサービス名は、 各社の登録商標又は商標です。