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時のフラグを持っておけば、それ移行のフラグ次第なパケット構造を解析しやすくなるけど、パターンがあたまに入り切らないので、パケット構造のまとめを作り始めた。
良い感じになってきたけど、どっかでまとめて出したいので、今回は経過はなしで。