[Senna-dev 12] Re: revision 7

Back to archive index

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




Senna-dev メーリングリストの案内
Back to archive index