tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

CMU database講義その2とMySQLパケット解析の進捗

CMU講義

RDBにアクセスするときの基本、SQLの解説、殆どのRDB製品はANSI SQL92を基本としているけど、製品ごとに方言や仕様に沿ってない部分がかなりある。 ANSI SQLは2016まで来ているけど、これらに従っている製品は殆ど無いとのこと。

集計関数、window関数, DBMSがサポートしている組み込み関数, CTEなどなどについて紹介と説明が会った。 postgresql, sqlite, mysqlあたりを例にDBMSごとの違いも説明している。

ANSI SQLは有料で結構高かった気がする。読む必要もないしいいかなー。

ANSI SQLでは文字列はシングルクォートだけらしい。 MySQLは"も文字列。 ANSI_QUOTESをSQL_MODEで指定することで"を```として扱うこともできるらしい( https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html )

MySQLでjoin書かずに直積でA, Bテーブルを持ってきて、where A.id = B.idってかけるの笑った。 ランダムな結果が帰るらしい。 SQL_MODE次第で防げたりしなかったっけな、、、と思ったけど、ドキュメント見てもなさそうなのと、strict_all_tables設定してもこのクエリは通った。

MySQL packet protocol

ステートを持ってパケットのbyte arrayを解析するのに加えて、MySQLのserver/client間のハンドシェイク(HandshakeV10, v9はサポートしない)があるまではパケットを捨てるようにした。 どのパケットが通ればどのステートに行くのかを管理するのがオーバーヘッドになるけど、中途半端なパース結果を返すよりはマシだと思う。 Handshake時のフラグを持っておけば、それ移行のフラグ次第なパケット構造を解析しやすくなるけど、パターンがあたまに入り切らないので、パケット構造のまとめを作り始めた。

良い感じになってきたけど、どっかでまとめて出したいので、今回は経過はなしで。