Kazuhiro Osawa
ko****@yappo*****
2005年 4月 8日 (金) 00:15:23 JST
大沢です。 > クエリに引っかかったレコード数が、有る程度の数以上になると > errorが発生してしまいます。 なんとなく原因がつかめました。 mysqlパッチにてmyisam/ft_update.cのft_sen_index_addの中で sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, buf); として、index登録を行なっています。 posは数値型の変数となり、MYDのレコードのポジションになります。 このポインタが最終的にsennaのsym.cファイルの_sen_sym_addに渡され if (!size) { size = strlen((char *)key) + 1; } にて、keyのバイト数を求めてからidの割り当てを行なっているのですが posは数値型なので、正確なkeyのバイト数が求められないケースが多々あります。 試しに、sen_index_updの引数のposを、一度char型にsprintfで変換する用に (ft_nlq_search.cも変更しておく)した所、エラーが発生しなくなりました。 #実際、変更前にはsen_index_upd時に渡していない値がsen_records_nextより #返されていました。 #大概256より小さい数字で、直後にmysqlがエラーを吐きます。 正確なバイト数を求められない事を検証したソースもつけておきます。 ------ここから int main () { int i; for (i = (256 * 256) - 10;i < ((256 * 256) + 100); i++) { unsigned char *c = (unsigned char *) &i; printf("size=%d: %d,%d,%d,%d\n", strlen((char *)c), *c, *(c + 1), *(c + 2), *(c + 3)); } } ------ここまで なので、効率は下がりますsen_index_updに渡すときは文字列に 変換した方が良さそうな気がしました。 --- osawa