Kazuho Oku
kazuh****@gmail*****
2008年 2月 17日 (日) 08:43:15 JST
奥です。 おぉ。ありがとうございます。 お手数をおかけしますが、よろしくお願いいたします。 08/02/15 に Tetsuro IKEDA<te.ik****@jpta*****> さんは書きました: > こんにちは。池田です。 > > 奥さんが作成してくださったパッチの取り込みですが、 > 以下のツリーにて先ほどpatch+commitを行わせていただきました。 > > http://svn.sourceforge.jp/svnroot/tritonn/tags/tritonn-1.1.0-mysql-5.0.51a > > revisionは109になります。tritonn-1.1.0のリリースに含まれる予定です。 > > 尚、リリースまでの間に私のほうで、、、 > > 1. 変数senna_embedded_pkeyの代わりにUSING句で指定できるようにする > 2. ENABLE_SENNA_USE_PSEUDO_TFをENABLE_SENNAに統合する > 3. libmysqldへマージ > > といったような作業を追加で行いたいと考えております。 > > 2についてはconfigureオプション化も考えたのですが、変数での制御が > できる現状の形をそのまま有効活用したほうがいいかなと思い、 > 統合を考えました。 > > ご意見、ご要望等ありましたら、お知らせ下さい。>奥さんに限らず皆様 > > -------- Original Message -------- > Subject: [Tritonn-commit 97] [svn] [109] A contributed patch by > Kazuho Oku, Cybozu labs. > Date: Fri, 15 Feb 2008 17:16:35 +0900 > 差出人: svnno****@sourc***** > Reply-To: trito****@lists***** > 宛先: trito****@lists***** > > Revision: 109 > > http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=tritonn&view=rev&rev=109 > Author: mir > Date: 2008-02-15 17:16:35 +0900 (Fri, 15 Feb 2008) > > Log Message: > ----------- > A contributed patch by Kazuho Oku, Cybozu labs. > > This patch enable two new featrue. > > One enables tritonn to embed primary key value into "key" which is > passed to senna, so this can dramatically reduce disk I/O if select > statement use only fulltext index and primary key. > > The other feature enables tritonn to return TF score instead of > simple "number of found keyword in a certain document" which is > current implement and only implement. > > You can read full description about this patch at following URL: > > http://labs.cybozu.co.jp/blog/kazuho/archives/2008/02/triton-embed-primary-key.php > > Modified Paths: > -------------- > tags/tritonn-1.1.0-mysql-5.0.51a/include/my_base.h > tags/tritonn-1.1.0-mysql-5.0.51a/include/myisam.h > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_boolean_search.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_nlq_search.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_update.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_create.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_all.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_table.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_extra.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_open.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_rename.c > tags/tritonn-1.1.0-mysql-5.0.51a/myisam/myisamdef.h > tags/tritonn-1.1.0-mysql-5.0.51a/sql/ha_myisam.cc > tags/tritonn-1.1.0-mysql-5.0.51a/sql/item_func.cc > tags/tritonn-1.1.0-mysql-5.0.51a/sql/mysqld.cc > tags/tritonn-1.1.0-mysql-5.0.51a/sql/set_var.cc > tags/tritonn-1.1.0-mysql-5.0.51a/sql/sql_select.cc > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/include/my_base.h > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/include/my_base.h 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/include/my_base.h 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -347,6 +347,7 @@ > #define SENNA_IF_READ_RECORD (1 << 4) > #define SENNA_DISTINCT (1 << 5) > #define SENNA_FIRST_CALL (1 << 6) > +#define SENNA_ONLY_READ_PRIMARY_KEY (1 << 7) > #endif > > /* > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/include/myisam.h > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/include/myisam.h 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/include/myisam.h 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -36,6 +36,10 @@ > #include <senna.h> > #define SEN_DISABLE_SENNA 0x80000000 /* Don't use Senna fulltext search > engine */ > extern sen_logger_info senna_logger; > +extern my_bool senna_use_embedded_pkey; > +# ifdef ENABLE_SENNA_PSEUDO_TF > +extern my_bool senna_use_pseudo_tf; > +# endif > #endif /* ENABLE_SENNA */ > > /* > @@ -215,6 +219,10 @@ > ulonglong senna_inv_chunk_size; > sen_index *senna; > sen_encoding senna_encoding; > + int senna_embedded_pkey; > +# ifdef ENABLE_SENNA_PSEUDO_TF > + int senna_use_pseudo_tf; > +# endif > #endif /* ENABLE_SENNA */ > int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef > *keyinfo, > uchar *page,uchar *key, > @@ -291,6 +299,11 @@ > extern int mi_delete(struct st_myisam_info *file,const byte *buff); > extern struct st_myisam_info *mi_open(const char *name,int mode, > uint wait_if_locked); > +#ifdef ENABLE_SENNA > +extern struct st_myisam_info *mi_open_senna(const char *name,int mode, > + uint wait_if_locked, > + int senna_embedded_pkey); > +#endif > extern int mi_panic(enum ha_panic_function function); > extern int mi_rfirst(struct st_myisam_info *file,byte *buf,int inx); > extern int mi_rkey(struct st_myisam_info *file,byte *buf,int inx, > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_boolean_search.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_boolean_search.c > 2008-02-15 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_boolean_search.c > 2008-02-15 08:16:35 UTC (rev 109) > @@ -606,22 +606,31 @@ > #ifdef ENABLE_SENNA > if ((ftb->keynr != NO_SUCH_KEY) && > ftb->info->s->keyinfo[ftb->keynr].senna) > { > - my_off_t pos; > + SENNA_EMBEDDED_KEY skey; > + int skey_len; > MI_INFO *info=ftb->info; > - while (ftb->sir && sen_records_next(ftb->sir, &pos, > sizeof(my_off_t), NULL)) { > + while (ftb->sir && (skey_len = sen_records_next(ftb->sir, &skey, > sizeof(skey), NULL))) { > info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); > - info->lastpos=pos; > + info->lastpos=skey.pos; > if (my_thread_var->sen_flags & SENNA_USE_2IND) { > if (!(my_thread_var->sen_flags & (SENNA_IF_READ_RECORD | > SENNA_FILESORT))) { > SEN_LOG(sen_log_debug, "ft_boolean_read_next: 2ind return 0"); > return 0; > } > } > + if (skey_len == sizeof(SENNA_EMBEDDED_KEY) && > + info->s->keyinfo[ftb->keynr].senna_embedded_pkey != MAX_INDEXES && > + (my_thread_var->sen_flags & SENNA_ONLY_READ_PRIMARY_KEY)) { > + HA_KEYSEG *keyseg = > info->s->keyinfo[info->s->keyinfo[ftb->keynr].senna_embedded_pkey].seg; > + memcpy(record + keyseg->start, &skey.pkey, keyseg->length); > + info->update|= HA_STATE_AKTIV; /* Record is read */ > + return 0; > + } else > if (!(*info->read_record)(info,info->lastpos,record)) { > info->update|= HA_STATE_AKTIV; /* Record is read */ > return 0; > } > - SEN_LOG(sen_log_error, "ft_boolean_read_next: my_errno=%d > pos=%lld", my_errno, pos); > + SEN_LOG(sen_log_error, "ft_boolean_read_next: my_errno=%d > pos=%lld", my_errno, skey.pos); > if (my_errno == 127) { continue; } > return my_errno; > } > @@ -704,13 +713,21 @@ > #ifdef ENABLE_SENNA > if ((ftb->keynr != NO_SUCH_KEY) && > ftb->info->s->keyinfo[ftb->keynr].senna) > { > - my_off_t docid=ftb->info->lastpos; > + MYISAM_SHARE *share = ftb->info->s; > + SENNA_EMBEDDED_KEY skey; > + skey.pos=ftb->info->lastpos; > if (!ftb->sir) { return 0.0; } > - if (docid == HA_OFFSET_ERROR) > + if (skey.pos == HA_OFFSET_ERROR) > return -2.0; > + skey.pkey=0; > + if (share->keyinfo[ftb->keynr].senna_embedded_pkey != MAX_INDEXES) { > + HA_KEYSEG *keyseg = > + share->keyinfo[share->keyinfo[ftb->keynr].senna_embedded_pkey].seg; > + memcpy(&skey.pkey, record + keyseg->start, keyseg->length); > + } > SEN_LOG(sen_log_dump, "ft_boolean_find_relevance => > sen_records_find: records=%p, key=%p", > - ftb->sir, &docid); > - return 1.0 * sen_records_find(ftb->sir, &docid); > + ftb->sir, &skey.pos); > + return 1.0 * sen_records_find(ftb->sir, &skey); > } > else > #endif /* ENABLE_SENNA */ > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_nlq_search.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_nlq_search.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_nlq_search.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -34,6 +34,7 @@ > int curdoc; > #ifdef ENABLE_SENNA > sen_records *sir; > + int senna_embedded_pkey; > #endif /* ENABLE_SENNA */ > FT_DOC doc[1]; > }; > @@ -296,6 +297,7 @@ > > #ifdef ENABLE_SENNA > dlist->sir = sir; > + dlist->senna_embedded_pkey = info->s->keyinfo[keynr].senna_embedded_pkey; > #endif /* ENABLE_SENNA */ > tree_walk(&aio.dtree, (tree_walk_action) &walk_and_copy, > &dptr, left_root_right); > @@ -317,24 +319,34 @@ > #ifdef ENABLE_SENNA > if (handler->sir) > { > - my_off_t pos; > + SENNA_EMBEDDED_KEY skey; > + int skey_len; > info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); > SEN_LOG(sen_log_dump, "ft_nlq_read_next => sen_records_next in > while loop"); > - while (sen_records_next(handler->sir, &pos, sizeof(my_off_t), NULL)) > + while ((skey_len = sen_records_next(handler->sir, &skey, > sizeof(skey), NULL)) != 0) > { > - info->lastpos=pos; > + info->lastpos=skey.pos; > if (my_thread_var->sen_flags & SENNA_USE_2IND) { > if (!(my_thread_var->sen_flags & (SENNA_IF_READ_RECORD | > SENNA_FILESORT))) { > SEN_LOG(sen_log_debug, "ft_nlq_read_next => 2ind return 0"); > return 0; > } > } > + if (skey_len == sizeof(SENNA_EMBEDDED_KEY) && > + handler->senna_embedded_pkey != MAX_INDEXES && > + (my_thread_var->sen_flags & SENNA_ONLY_READ_PRIMARY_KEY)) { > + HA_KEYSEG *keyseg = info->s->keyinfo[handler->senna_embedded_pkey].seg; > + memcpy(record + keyseg->start, &skey.pkey, keyseg->length); > + info->update|= HA_STATE_AKTIV; /* Record is read */ > + return 0; > + } > + else > if (!(*info->read_record)(info,info->lastpos,record)) > { > info->update|= HA_STATE_AKTIV; /* Record is read */ > return 0; > } > - SEN_LOG(sen_log_error, "ft_nlq_read_next => my_errno=%d > pos=%lld", my_errno, pos); > + SEN_LOG(sen_log_error, "ft_nlq_read_next => my_errno=%d > pos=%lld", my_errno, skey.pos); > if (my_errno == 127) { continue; } > return my_errno; > } > @@ -373,9 +385,17 @@ > > #ifdef ENABLE_SENNA > if (handler->sir) { > + MYISAM_SHARE *share = handler->info->s; > + SENNA_EMBEDDED_KEY skey; > + skey.pos = docid; > + skey.pkey = 0; > + if (handler->senna_embedded_pkey != MAX_INDEXES) { > + HA_KEYSEG *keyseg = share->keyinfo[handler->senna_embedded_pkey].seg; > + memcpy(&skey.pkey, record + keyseg->start, keyseg->length); > + } > SEN_LOG(sen_log_dump, "ft_nlq_find_relevance => sen_records_find: > records=%p, key=%p", > handler->sir, &docid); > - return 1.0 * sen_records_find(handler->sir, &docid); > + return 1.0 * sen_records_find(handler->sir, &skey); > } > #endif /* ENABLE_SENNA */ > > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_update.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_update.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/ft_update.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -202,9 +202,20 @@ > > #ifdef ENABLE_SENNA > #define SECTIONALIZE 0x00080000 > +# ifdef ENABLE_SENNA_PSEUDO_TF > +#define TF_WEIGHT(len) ((len) != 0 ? 0x40000000 / (len) : (len)) > +# endif > int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, > my_off_t pos) > { > + SENNA_EMBEDDED_KEY skey; > DBUG_ENTER("ft_sen_index_add"); > + skey.pos = pos; > + skey.pkey = 0; > + if (info->s->keyinfo[keynr].senna_embedded_pkey != MAX_INDEXES) { > + HA_KEYSEG *keyseg = > + info->s->keyinfo[info->s->keyinfo[keynr].senna_embedded_pkey].seg; > + memcpy(&skey.pkey, record + keyseg->start, keyseg->length); > + } > if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { > FT_SEG_ITERATOR ftsi; > unsigned int section; > @@ -223,10 +234,16 @@ > values = sen_values_open(); > SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_add: values=%p, > str=%s, str_len=%d, weight=%d", > values, ftsi.pos, ftsi.len, 0); > - sen_values_add(values, ftsi.pos, ftsi.len, 0); > + sen_values_add(values, ftsi.pos, ftsi.len, > +# ifdef ENABLE_SENNA_PSEUDO_TF > + info->s->keyinfo[keynr].senna_use_pseudo_tf ? > TF_WEIGHT(ftsi.len) : 0 > +# else > + 0 > +# endif > + ); > SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_update: index=%p, > key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", > info->s->keyinfo[keynr].senna, &pos, (uint) pos, section, NULL, values); > - sen_index_update(info->s->keyinfo[keynr].senna, &pos, ftsi.num+1, > NULL, values); > + sen_index_update(info->s->keyinfo[keynr].senna, &skey, ftsi.num+1, > NULL, values); > SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_close: > values=%p", values); > sen_values_close(values); > } > @@ -257,7 +274,15 @@ > SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, > key=%p (pos=%d), oldvalue=%s," > "oldvalue_len=%d, newvalue=%s, newvalue_len=%d", > info->s->keyinfo[keynr].senna, &pos, (uint) pos, NULL, 0, buf, (p > - buf)); > - sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, 0, buf, (p > - buf)); > +# ifdef ENABLE_SENNA_PSEUDO_TF > + if (info->s->keyinfo[keynr].senna_use_pseudo_tf) { > + sen_values *values = sen_values_open(); > + sen_values_add(values, buf, p - buf, TF_WEIGHT(p - buf)); > + sen_index_update(info->s->keyinfo[keynr].senna, &skey, 2, NULL, > values); > + sen_values_close(values); > + } else > +# endif > + sen_index_upd(info->s->keyinfo[keynr].senna, &skey, NULL, 0, buf, > (p - buf)); > free(buf); > DBUG_RETURN(0); > } > @@ -265,6 +290,14 @@ > > int ft_sen_index_del(MI_INFO *info, uint keynr, const byte *record, > my_off_t pos) > { > + SENNA_EMBEDDED_KEY skey; > + skey.pos = pos; > + skey.pkey = 0; > + if (info->s->keyinfo[keynr].senna_embedded_pkey != MAX_INDEXES) { > + HA_KEYSEG *keyseg = > + info->s->keyinfo[info->s->keyinfo[keynr].senna_embedded_pkey].seg; > + memcpy(&skey.pkey, record + keyseg->start, keyseg->length); > + } > if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { > FT_SEG_ITERATOR ftsi; > unsigned int section; > @@ -286,7 +319,7 @@ > sen_values_add(values, ftsi.pos, ftsi.len, 0); > SEN_LOG(sen_log_info, "ft_sen_index_del => sen_index_update: > index=%p, key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", > info->s->keyinfo[keynr].senna, &pos, (uint) pos, > section, values, NULL); > - sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, > values, NULL); > + sen_index_update(info->s->keyinfo[keynr].senna, &skey, section, > values, NULL); > SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_close: > values=%p", values); > sen_values_close(values); > } > @@ -317,7 +350,7 @@ > SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, > key=%p (pos=%d), oldvalue=%p," > "oldvalue_len=%d, newvalue=%p, newvalue_len=%d", > info->s->keyinfo[keynr].senna, &pos, (uint) pos, buf, (p - > buf), NULL, 0); > - sen_index_upd(info->s->keyinfo[keynr].senna, &pos, buf, (p - buf), > NULL, 0); > + sen_index_upd(info->s->keyinfo[keynr].senna, &skey, buf, (p - buf), > NULL, 0); > free(buf); > return 0; > } > @@ -532,7 +565,8 @@ > share->keyinfo[i].senna = NULL; > DBUG_VOID_RETURN; > } else { > - share->keyinfo[i].senna = sen_index_create(buf, sizeof(my_off_t), > + share->keyinfo[i].senna = sen_index_create(buf, > + share->keyinfo[i].senna_embedded_pkey != MAX_INDEXES ? > sizeof(SENNA_EMBEDDED_KEY) : sizeof(my_off_t), > > share->keyinfo[i].senna_flags, > > share->keyinfo[i].senna_initial_n_segments, > > share->keyinfo[i].senna_encoding); > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_create.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_create.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_create.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -295,18 +295,31 @@ > /* make index files */ > SEN_LOG(sen_log_notice, > "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x, > ins=%d", buf, > - sizeof(my_off_t), keydef->senna_flags, keydef->senna_initial_n_segments); > + senna_use_embedded_pkey ? sizeof(SENNA_EMBEDDED_KEY) : sizeof(my_off_t), > + keydef->senna_flags, keydef->senna_initial_n_segments); > if (!(keydef->senna_encoding >= 0 && keydef->senna_encoding <= 6)) > { > my_errno= HA_WRONG_CREATE_OPTION; > goto err; > } > - senna = sen_index_create(buf, sizeof(my_off_t), > + senna = sen_index_create(buf, > + senna_use_embedded_pkey ? sizeof(SENNA_EMBEDDED_KEY) : > sizeof(my_off_t), > keydef->senna_flags, > keydef->senna_initial_n_segments, > keydef->senna_encoding); > SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); > sen_index_close(senna); > +# ifdef ENABLE_SENNA_PSEUDO_TF > + if (senna_use_pseudo_tf) { > + strcat(buf, ".tf"); > + int fd = open(buf, O_WRONLY | O_CREAT, 0666); > + if (fd == -1) { > + my_errno = HA_ERR_CRASHED; > + goto err; > + } > + close(fd); > + } > +# endif > } else { > SEN_LOG(sen_log_notice, "mi_create => sen_index_open: path=%s", buf); > senna = sen_index_open(buf); > @@ -322,13 +335,15 @@ > sen_index_remove(buf); > SEN_LOG(sen_log_notice, > "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x > ins=%d)", buf, > - sizeof(my_off_t), senna_flags, senna_initial_n_segments); > + senna_use_embedded_pkey ? sizeof(SENNA_EMBEDDED_KEY) : > sizeof(my_off_t), > + senna_flags, senna_initial_n_segments); > if (!(senna_encoding >= 0 && senna_encoding <= 6)) > { > my_errno= HA_WRONG_CREATE_OPTION; > goto err; > } > - senna = sen_index_create(buf, sizeof(my_off_t), > + senna = sen_index_create(buf, > + senna_use_embedded_pkey ? sizeof(SENNA_EMBEDDED_KEY) : > sizeof(my_off_t), > senna_flags, > senna_initial_n_segments, > senna_encoding); > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_all.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_all.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_all.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -53,7 +53,8 @@ > sen_index_remove(buf); > SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_create: > path=%s, flags=%x, ins=%d", > buf, share->keyinfo[i].senna_flags, > share->keyinfo[i].senna_initial_n_segments); > - senna = sen_index_create(buf, sizeof(my_off_t), > + senna = sen_index_create(buf, > + share->keyinfo[i].senna_embedded_pkey != MAX_INDEXES ? > sizeof(SENNA_EMBEDDED_KEY) : sizeof(my_off_t), > share->keyinfo[i].senna_flags, > share->keyinfo[i].senna_initial_n_segments, > share->keyinfo[i].senna_encoding); > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_table.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_table.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_delete_table.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -21,7 +21,11 @@ > > int mi_delete_table(const char *name) > { > +#ifdef ENABLE_SENNA_PSEUDO_TF > + char from[FN_REFLEN + 3]; > +#else > char from[FN_REFLEN]; > +#endif > #ifdef USE_RAID > uint raid_type=0,raid_chunks=0; > #endif > @@ -80,6 +84,10 @@ > my_snprintf(from, FN_REFLEN, "%s.%03d", name, should_be_deleted[i]); > SEN_LOG(sen_log_notice, "mi_delete_table => sen_index_remove: > path=%s", from); > sen_index_remove(from); > +# ifdef ENABLE_SENNA_PSEUDO_TF > + strcat(from, ".tf"); > + unlink(from); > +# endif > } > } > #endif /* ENABLE_SENNA */ > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_extra.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_extra.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_extra.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -199,6 +199,11 @@ > break; > case HA_EXTRA_KEYREAD: /* Read only keys to record */ > case HA_EXTRA_REMEMBER_POS: > +#ifdef ENABLE_SENNA > + if (info->s->senna_has_embedded_pkey && > + (my_thread_var->sen_flags & SENNA_MATCH)) > + break; > +#endif > info->opt_flag |= REMEMBER_OLD_POS; > bmove((byte*) info->lastkey+share->base.max_key_length*2, > (byte*) info->lastkey,info->lastkey_length); > @@ -210,6 +215,11 @@ > break; > /* fall through */ > case HA_EXTRA_KEYREAD_CHANGE_POS: > +#ifdef ENABLE_SENNA > + if (info->s->senna_has_embedded_pkey && > + (my_thread_var->sen_flags & SENNA_MATCH)) > + break; > +#endif > info->opt_flag |= KEY_READ_USED; > info->read_record=_mi_read_key_record; > break; > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_open.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_open.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_open.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -31,6 +31,13 @@ > #include "static.c" > #endif > > +#ifdef ENABLE_SENNA > +my_bool senna_use_embedded_pkey; > +# ifdef ENABLE_SENNA_PSEUDO_TF > +my_bool senna_use_pseudo_tf; > +# endif > +#endif > + > static void setup_key_functions(MI_KEYDEF *keyinfo); > #define get_next_element(to,pos,size) { memcpy((char*) to,pos,(size_t) > size); \ > pos+=size;} > @@ -73,7 +80,14 @@ > ******************************************************************************/ > > MI_INFO *mi_open(const char *name, int mode, uint open_flags) > +#ifdef ENABLE_SENNA > { > + return mi_open_senna(name, mode, open_flags, MAX_INDEXES); > +} > + > +MI_INFO *mi_open_senna(const char *name, int mode, uint open_flags, int > senna_embedded_pkey) > +#endif > +{ > int lock_error,kfile,open_mode,save_errno,have_rtree=0; > uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys, > key_parts,unique_key_parts,fulltext_keys,uniques; > @@ -348,6 +362,7 @@ > share->keyinfo[i].senna = NULL; > share->keyinfo[i].senna_flags = 0; > share->keyinfo[i].senna_initial_n_segments = 0; > + share->keyinfo[i].senna_embedded_pkey = MAX_INDEXES; > #endif /* ENABLE_SENNA */ > if (share->keyinfo[i].flag & HA_SPATIAL) > { > @@ -366,7 +381,13 @@ > if (!(share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA)) > { > { > +# ifdef ENABLE_SENNA_PSEUDO_TF > + char buf[FN_REFLEN + 3]; > + struct stat st; > +# else > char buf[FN_REFLEN]; > +# endif > + int key_size; > strncpy(buf, share->unique_file_name, FN_REFLEN - 1); > buf[FN_REFLEN - 1] = '\0'; > sprintf(buf + strlen(buf) - 3, "%03d", i); > @@ -377,11 +398,18 @@ > share->index_file_name, i, pos-FT_SEGS); > share->keyinfo[i].senna = sen_index_open(buf); > SEN_LOG(sen_log_info, "mi_open => sen_index_info: index=%p", > share->keyinfo[i].senna); > - sen_index_info(share->keyinfo[i].senna, NULL, > + sen_index_info(share->keyinfo[i].senna, &key_size, > &share->keyinfo[i].senna_flags, > &share->keyinfo[i].senna_initial_n_segments, > &share->keyinfo[i].senna_encoding, > NULL, NULL, NULL, NULL, NULL, NULL); > + /* adjusted later on */ > + if (key_size == sizeof(SENNA_EMBEDDED_KEY)) > + share->keyinfo[i].senna_embedded_pkey = senna_embedded_pkey; > +# ifdef ENABLE_SENNA_PSEUDO_TF > + strcat(buf, ".tf"); > + share->keyinfo[i].senna_use_pseudo_tf = stat(buf, &st) == 0; > +# endif > } > } > #endif /* ENABLE_SENNA */ > @@ -427,6 +455,29 @@ > pos->flag=0; /* For purify */ > pos++; > } > +#ifdef ENABLE_SENNA > + /* reset embedded pkey to MAX_KEY unless it fits in > SENNA_EMBEDDED_KEY */ > + share->senna_has_embedded_pkey = 0; > + if (senna_embedded_pkey != MAX_INDEXES) { > + switch (share->keyinfo[senna_embedded_pkey].seg[0].type) { > + case HA_KEYTYPE_SHORT_INT: > + case HA_KEYTYPE_LONG_INT: > + case HA_KEYTYPE_FLOAT: > + case HA_KEYTYPE_DOUBLE: > + case HA_KEYTYPE_USHORT_INT: > + case HA_KEYTYPE_ULONG_INT: > + /* supported types, ok */ > + for (i = 0; i < keys; i++) > + if (share->keyinfo[i].senna_embedded_pkey != MAX_INDEXES) > + share->senna_has_embedded_pkey = 1; > + break; > + default: > + for (i = 0; i < keys; i++) > + share->keyinfo[i].senna_embedded_pkey = MAX_INDEXES; > + break; > + } > + } > +#endif > for (i=0 ; i < uniques ; i++) > { > disk_pos=mi_uniquedef_read(disk_pos, &share->uniqueinfo[i]); > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_rename.c > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_rename.c 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/mi_rename.c 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -21,7 +21,11 @@ > > int mi_rename(const char *old_name, const char *new_name) > { > +#ifdef ENABLE_SENNA_PSEUDO_TF > + char from[FN_REFLEN + 3],to[FN_REFLEN + 3]; > +#else > char from[FN_REFLEN],to[FN_REFLEN]; > +#endif > #ifdef USE_RAID > uint raid_type=0,raid_chunks=0; > #endif > @@ -66,6 +70,11 @@ > my_snprintf(to, FN_REFLEN, "%s.%03d", new_name, senna_indexes[i]); > SEN_LOG(sen_log_notice, "mi_rename => sen_index_rename: from=%s, > to=%s", from, to); > sen_index_rename(from, to); > +# ifdef ENABLE_SENNA_PSEUDO_TF > + strcat(from, ".tf"); > + strcat(to, ".tf"); > + rename(from, to); > +# endif > } > } > #endif /* ENABLE_SENNA */ > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/myisam/myisamdef.h > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/myisam/myisamdef.h 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/myisam/myisamdef.h 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -208,6 +208,9 @@ > pthread_mutex_t intern_lock; /* Locking for use with _locking */ > rw_lock_t *key_root_lock; > #endif > +#ifdef ENABLE_SENNA > + int senna_has_embedded_pkey; > +#endif > } MYISAM_SHARE; > > > @@ -365,6 +368,15 @@ > #define READING_NEXT 1 > #define READING_HEADER 2 > > +#ifdef ENABLE_SENNA > + > +typedef struct st_senna_embedded_key { > + my_off_t pos; > + my_off_t pkey; /* used to store primary key if length<8 bytes */ > +} SENNA_EMBEDDED_KEY; > + > +#endif > + > #define mi_getint(x) ((uint) mi_uint2korr(x) & 32767) > #define mi_putint(x,y,nod) { uint16 boh=(nod ? (uint16) 32768 : 0) + > (uint16) (y);\ > mi_int2store(x,boh); } > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/sql/ha_myisam.cc > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/sql/ha_myisam.cc 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/sql/ha_myisam.cc 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -683,8 +683,18 @@ > > int ha_myisam::open(const char *name, int mode, uint test_if_locked) > { > +#ifdef ENABLE_SENNA > + int embedded_pkey = MAX_KEY; > + if (table->key_info && /* seems to be NULL w. pkey set to 0 on temp > tbl */ > + table->key_info[table->s->primary_key].key_parts == 1) { > + embedded_pkey = table->s->primary_key; > + } > + if (!(file=mi_open_senna(name, mode, test_if_locked, embedded_pkey))) > + return (my_errno ? my_errno : -1); > +#else > if (!(file=mi_open(name, mode, test_if_locked))) > return (my_errno ? my_errno : -1); > +#endif > > if (test_if_locked & (HA_OPEN_IGNORE_IF_LOCKED | HA_OPEN_TMP_TABLE)) > VOID(mi_extra(file, HA_EXTRA_NO_WAIT_LOCK, 0)); > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/sql/item_func.cc > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/sql/item_func.cc 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/sql/item_func.cc 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -4909,12 +4909,22 @@ > modifications to find_best and auto_close as complement to > auto_init code > above. > */ > +#ifdef ENABLE_SENNA > + bool save_set_query_id = thd->set_query_id; > + thd->set_query_id = 0; > +#endif > if (Item_func::fix_fields(thd, ref) || > !args[0]->const_during_execution()) > { > my_error(ER_WRONG_ARGUMENTS,MYF(0),"AGAINST"); > +#ifdef ENABLE_SENNA > + thd->set_query_id = save_set_query_id; > +#endif > return TRUE; > } > +#ifdef ENABLE_SENNA > + thd->set_query_id = save_set_query_id; > +#endif > > const_item_cache=0; > for (uint i=1 ; i < arg_count ; i++) > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/sql/mysqld.cc > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/sql/mysqld.cc 2008-02-15 06:43:05 > UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/sql/mysqld.cc 2008-02-15 08:16:35 > UTC (rev 109) > @@ -4894,6 +4894,10 @@ > OPT_SENNA_LOG_LEVEL, > OPT_SENNA_2IND, > OPT_SENNA_INDEX_TYPE, > + OPT_SENNA_EMBEDDED_PKEY, > +# ifdef ENABLE_SENNA_PSEUDO_TF > + OPT_SENNA_PSEUDO_TF, > +# endif > #endif > OPT_PROFILING, > OPT_INNODB_ROLLBACK_ON_TIMEOUT, > @@ -5573,6 +5577,16 @@ > {"senna-log-level", OPT_SENNA_LOG_LEVEL, "Senna log level.", > (gptr*) &opt_senna_log_level, (gptr*) &opt_senna_log_level, 0, > GET_STR, REQUIRED_ARG, > 0, 0, 0, 0, 0, 0}, > + {"senna-embedded-pkey", OPT_SENNA_EMBEDDED_PKEY, "Embed primary key > value to senna index.", > + (gptr*) &senna_use_embedded_pkey, > + (gptr*) &senna_use_embedded_pkey, > + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, > +# ifdef ENABLE_SENNA_PSEUDO_TF > + {"senna-pseudo-tf", OPT_SENNA_EMBEDDED_PKEY, "Use TF-like algorithm > for calculationg relevance.", > + (gptr*) &senna_use_pseudo_tf, > + (gptr*) &senna_use_pseudo_tf, > + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, > +# endif > #endif > {"secure-file-priv", OPT_SECURE_FILE_PRIV, > "Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files > within specified directory", > @@ -6847,6 +6861,10 @@ > opt_senna_log = 0; > senna_log_level_options = senna_logger.max_level; > global_system_variables.senna_2ind = 0; > + senna_use_embedded_pkey = 0; > +# ifdef ENABLE_SENNA_PSEUDO_TF > + senna_use_pseudo_tf = 0; > +# endif > #endif > > #if defined(__WIN__) || defined(__NETWARE__) > @@ -7485,6 +7503,14 @@ > case OPT_SENNA_2IND: > global_system_variables.senna_2ind = 1; > break; > + case OPT_SENNA_EMBEDDED_PKEY: > + senna_use_embedded_pkey = 1; > + break; > +# ifdef ENABLE_SENNA_PSEUDO_TF > + case OPT_SENNA_PSEUDO_TF: > + senna_use_pseudo_tf = 1; > + break; > +# endif > #endif > } > return 0; > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/sql/set_var.cc > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/sql/set_var.cc 2008-02-15 06:43:05 > UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/sql/set_var.cc 2008-02-15 08:16:35 > UTC (rev 109) > @@ -483,6 +483,10 @@ > sys_var_enum > sys_senna_log_level("senna_log_level",&senna_log_level_options, > &senna_log_level_typelib, fix_senna_log_level); > sys_var_thd_bool sys_senna_2ind("senna_2ind", &SV::senna_2ind, > fix_senna_2ind); > +sys_var_bool_ptr sys_senna_embedded_pkey("senna_embedded_pkey", > &senna_use_embedded_pkey); > +# ifdef ENABLE_SENNA_PSEUDO_TF > +sys_var_bool_ptr sys_senna_pseudo_tf("senna_pseudo_tf", > &senna_use_pseudo_tf); > +# endif > #endif > > /* Condition pushdown to storage engine */ > @@ -774,6 +778,10 @@ > &sys_senna_2ind, > &sys_senna_index_type, > &sys_senna_log_level, > + &sys_senna_embedded_pkey, > +# ifdef ENABLE_SENNA_PSEUDO_TF > + &sys_senna_pseudo_tf, > +# endif > #endif > &sys_server_id, > #ifdef HAVE_REPLICATION > @@ -1095,9 +1103,13 @@ > {"secure_file_priv", (char*) &sys_secure_file_priv, > SHOW_SYS}, > #ifdef ENABLE_SENNA > {"senna_2ind", (char*) &sys_senna_2ind, > SHOW_SYS}, > + {"senna_embedded_pkey", (char*) &sys_senna_embedded_pkey, > SHOW_SYS}, > {"senna_index_type", (char*) &sys_senna_index_type, > SHOW_SYS}, > {"senna_log", (char*) &opt_senna_log, > SHOW_MY_BOOL}, > {"senna_log_level", (char*) &sys_senna_log_level, > SHOW_SYS}, > +# ifdef ENABLE_SENNA_PSEUDO_TF > + {"senna_pseudo_tf", (char*) &sys_senna_pseudo_tf, > SHOW_SYS}, > +# endif > #endif > #ifdef HAVE_SMEM > {"shared_memory", (char*) &opt_enable_shared_memory, > SHOW_MY_BOOL}, > > Modified: tags/tritonn-1.1.0-mysql-5.0.51a/sql/sql_select.cc > =================================================================== > --- tags/tritonn-1.1.0-mysql-5.0.51a/sql/sql_select.cc 2008-02-15 > 06:43:05 UTC (rev 108) > +++ tags/tritonn-1.1.0-mysql-5.0.51a/sql/sql_select.cc 2008-02-15 > 08:16:35 UTC (rev 109) > @@ -2290,8 +2290,8 @@ > } > } > #ifdef ENABLE_SENNA > + if (select_lex->ftfunc_list->elements) {my_thread_var->sen_flags |= > SENNA_MATCH; } /* the flag is used to prevent the use of keyread in > mi_extra.c */ > if (my_thread_var->sen_flags & SENNA_USE_2IND) { > - if (select_lex->ftfunc_list->elements) {my_thread_var->sen_flags |= > SENNA_MATCH; } > if (join->select_distinct) { my_thread_var->sen_flags |= > SENNA_DISTINCT; } > } > #endif /* ENABLE_SENNA */ > @@ -6187,6 +6187,18 @@ > #ifdef ENABLE_SENNA > if (my_thread_var->sen_flags & SENNA_USE_2IND) > my_thread_var->sen_flags |= SENNA_DO_READ_RECORD; > + if (!table->no_keyread && table->s->primary_key != MAX_KEY) { > + KEY *pkey = table->key_info + table->s->primary_key; > + if (pkey->key_parts == 1) { > + for (Field **field = table->field; *field != NULL; field++) > + if ((*field)->query_id == join->thd->query_id && > + *field != pkey->key_part[0].field) > + goto SENNA_END_PRIMARY_KEY_OPTIMIZATION; > + my_thread_var->sen_flags |= SENNA_ONLY_READ_PRIMARY_KEY; > + SENNA_END_PRIMARY_KEY_OPTIMIZATION: > + ; > + } > + } > #endif /* ENABLE_SENNA */ > break; > case JT_ALL: > > _______________________________________________ > Tritonn-commit mailing list > Trito****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/tritonn-commit > > _______________________________________________ > Tritonn-dev mailing list > Trito****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/tritonn-dev > -- Kazuho Oku