7月終わりに最終出社で8/31まで有給消化でした。

その間に色々したのでメモがてら記していきます。

読んだ本

データベースリライアビリティエンジニアリング

DBREを読みました。SREっぽい本でしたが、その中でもDB特有のポイントがまとまってました。半分ぐらいはDBっぽくない内容もあって、もう少し綺麗にまとめてほしいなという印象でした。

詳解 MySQL

最近DBの仕組みにとても興味があるのですが、内部実装にまで突っ込んだ本があまりありません。その中で内容古いですがMySQLのソースコードリーディングの助けになるような本があったので軽く読んでみました。

内容的にはバージョン4.0~5.0ぐらいなので、今の8.0だと半分以上は参考にならないのです。それでも少しはMySQLの処理フローとかclass, struct名ぐらいは残ってるので参考になります。とりあえずMySQLをbuildしてブレイクポイント貼ったりしてました。

技術系

MySQL build/debug

少しだけMySQLのソースコードリーディングをしてみました。

B+Tree

InnoDBみたいなストレージエンジンを実装してみたくて、Goで簡単なB+Treeを実装してみました。(どっかで記事にしたい)

プライベート

フジロック

2011年ぐらいからほぼ毎年行ってるのですが、3年ぶりに3Days行きました。あまり見たいアーティストいなかったのですが、なんだかんだ色々楽しめました。Superorganismがかなり良かったです。

あとコロナの影響もあってか、かなり過疎ってて興行って難しいなと感じました。

沖縄旅行

なんだかんだ妻とちゃんとした新婚旅行にいってないので、この期間にいきました。天気に恵まれてとてもよかったです。

まとめ

充実した。

--

--

最近DBにハマってるのですが、MySQLにおけるクエリのASTってどうなってるのかなと思い調べてみました。今回はSELECT文を調べてみました。

結論としては、全く自信が無いですがおそらく見つけたかなと思います。(間違ってる可能性もかなりありそうです。)

きっかけ

もともと詳解MySQLを読んでいて、「パーサとオプティマイザ」の章があり、その中に解析ツリーに関することが少し触れられました。 そこで以前SQL Parserを書いたのでMySQLのASTはどうなってるのかなと興味を持ったのがきっかけとなります。

今MySQLはバージョン8ですが、詳解MySQLはバージョン4~5の内容になっています。ですので半分くらい内容は当てにならないのですが、記載内容からどこらへんのclassかなというのはあたりを付けることができました。

SELECT文のAST

バージョン4~5自体の解析ツリーは sql/sql_lex.hst_select_lex_node クラスだったそうですが、最新のバージョン8ではそのクラスは存在しません。

なんとかコードを読んでいったところ sql/sql_lex.h にあるQuery_block というクラスが、SELECT文を表してそうだったので調べてみることにしました。

Query_block はテーブル、フィールド、GROUP BYかどうか、ORDER BYかどうかなどの情報を持ってるのでそう判断しました。

https://github.com/mysql/mysql-server/blob/8.0/sql/sql_lex.h#L1119L1124

/**
This class represents a query block, aka a query specification, which is
a query consisting of a SELECT keyword, followed by a table list,
optionally followed by a WHERE clause, a GROUP BY, etc.
*/
class Query_block {

ビルドとデバッグ

次にビルドして変数の中身を確認してみようと思います。

上記の通りにビルドしてVS Codeで中身を見てみました。ビルドに関しては成功しませんでしたが、 mysqldmysql など必要なバイナリは生成されてたので、上記のリンクの通りにデバッグしてみました。

Query_block が生成されるポイントは見つけていたので、そこにブレイクポイントを貼ってみました。

--

--

Introduction

The Go1.18 with Generics will come soon. So i’m going to try Generics.

We can use Generics in Go Playground by setting “go dev branch”.

Implementation

1. syntax

You can use Generics by writing bracket and type.

(I’m wondering why generics syntax is bracket [T] instead of gt and lt<T>. )

2. declaring cache client

Cache value is allowed all type by any.

3. Goal

Current Cache Client’s value is often interface{} , so we have to cast the cache value. However now you have a typed cache client!

Conclusion

Done! The following link is full code.

https://go.dev/play/p/F-6ifZQ9N6s?v=gotip

Next, i want to try declaring constraint by custom type or interface.

Ref

--

--

2021年の振り返りです。

今年はとても充実してた気がします。主にプライベートな面でライフイベントが2つあり、それを無事終えることができました。(正直かなり大変だったと思う。)

来年も妻と楽しく過ごせたらいいなと思います。

仕事面に関しては去年の夏から仕込んでたプロダクトがようやく4月にリリースしました。アーキテクチャから関わりつつ、ひたすらGoのコード書いてて楽しかったです。

またGCPやk8sなど初めて触る技術もあり、大いに成長できた年だったなと思います。

一方で課題も色々見つかったため、これからどうなりたいかを考える時間に10~12月と多くを費やしました。方向性は概ね定まったので来年はそれに関して実行していこうと思います。

それでは良いお年を。

--

--