どうもパースがうまく行かない原因がわかった
これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。
Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。
よく見るとCOM_QUERY Response, COM_FIELD_LIST Response, ProtocolText::Resultset のパケットはcommand_type = 03で来るけどCOM_QUERYのフィールド定義ではないので、ここでうまく行っていないことがわかった。
COM_QUERY Responseは以下のパケットに含まれ得る
- ERR_Packet
- a OK_Packet
- a Protocol::LOCAL_INFILE_Request
- a ProtocolText::Resultset
COM_FIELD_LIST Responseは以下。
- a ERR_Packet or
- one or more Column Definition packets and a closing EOF_Packet
ProtocolText::ResultsetはA query like SELECT @@version_comment returns:
とあって、おそらく最初のパケットは01 (COM_QUIT) でパースしてみる
COM_QUERYに関してはまだ調査不足
上のCOM_QUERY Response のリンクの内容見ても、完全にパースするにはまだドキュメントが網羅できてないことがわかる。。。