5.0.27 ==> 5.0.32

注:以下のメモは、MySQLのオリジナルのソースコードに独自パッチを当てて、バージョンを挙げた際の問題についてです。オリジナルのソースには問題はありません。



パーサの実装がちょこちょこ変わってるようだ。patchコマンド、bisonコマンド、gccによるビルド、それぞれ問題は起きなかったものの、ビルドしたmysqldを起動したあとshow系コマンドを発行したら、こいつらが全てsyntaxエラーに。泣けるよ〜。うぅぅ。

調べて、何か分かったら続きを書きます。じゃ。。。

sql_yacc.ccにgdbブレークポイントいれたら、いくらcontinueしても即座に同じコードで再breakしてしまう。これは如何に? gdbの問題? でかいからなぁswitchが。



ちょいちょい調べていたら、lex_hash.hのget_hash_symbolインライン関数が"SELECT"等の文字列からSELECTというSQLコマンドへプログラム的に識別する処理をしていることが判明。lex.hに記述してあるSYMBOL配列型のsymbolsとかを見るのはこの関数。

gdbで丁寧に追ってみたら、"show"がSERIALIZABLEにマッピングされていた。ふむ、"show XXX"がsyntaxエラーになる原因はこれか。たぶんどこかでずれちゃってるっぽいね。それを探して直せばよさげ。



んん〜〜、直った〜。

教訓「lex.hのsymbols配列は、ちゃんとアルファベット順にね!!」

要するに、高速化のためにhash化している部分が、シンボルの配列定義順序依存なので、アルファベット順でないとずれる。コード管理上の理由から一ヶ所にまとめて追加とかしちゃうと、まずいってこと。

で、ver5.0.27の頃は別に問題なかったのが、、、ver5.0.32ではたぶん高速化のためにそのへんがシビアになって、問題が顕在化したということ。

いじょ。