diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/include/my_base.h ./include/my_base.h --- ../mysql-5.0.51a-tritonn-1.0.9.orig/include/my_base.h 2008-01-30 17:55:57.000000000 +0900 +++ ./include/my_base.h 2008-02-03 16:54:41.000000000 +0900 @@ -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 /* diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/include/myisam.h ./include/myisam.h --- ../mysql-5.0.51a-tritonn-1.0.9.orig/include/myisam.h 2008-01-30 17:55:57.000000000 +0900 +++ ./include/myisam.h 2008-02-05 14:13:17.000000000 +0900 @@ -36,6 +36,10 @@ #include #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 @@ uint 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, diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_boolean_search.c ./myisam/ft_boolean_search.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_boolean_search.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/ft_boolean_search.c 2008-02-05 14:14:10.000000000 +0900 @@ -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 */ diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_nlq_search.c ./myisam/ft_nlq_search.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_nlq_search.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/ft_nlq_search.c 2008-02-05 14:15:05.000000000 +0900 @@ -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 */ diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_update.c ./myisam/ft_update.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/ft_update.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/ft_update.c 2008-02-05 14:16:18.000000000 +0900 @@ -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); diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_create.c ./myisam/mi_create.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_create.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/mi_create.c 2008-02-05 14:16:54.000000000 +0900 @@ -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); diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_delete_all.c ./myisam/mi_delete_all.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_delete_all.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/mi_delete_all.c 2008-02-04 15:20:54.000000000 +0900 @@ -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); diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_delete_table.c ./myisam/mi_delete_table.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_delete_table.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/mi_delete_table.c 2008-02-05 10:29:54.000000000 +0900 @@ -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 */ diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_extra.c ./myisam/mi_extra.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_extra.c 2008-01-11 23:43:29.000000000 +0900 +++ ./myisam/mi_extra.c 2008-02-04 12:45:40.000000000 +0900 @@ -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; diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_open.c ./myisam/mi_open.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_open.c 2008-01-30 17:55:57.000000000 +0900 +++ ./myisam/mi_open.c 2008-02-05 14:18:00.000000000 +0900 @@ -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,6 +80,13 @@ ******************************************************************************/ 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, @@ -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]); diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_rename.c ./myisam/mi_rename.c --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/mi_rename.c 2008-02-05 09:43:41.000000000 +0900 +++ ./myisam/mi_rename.c 2008-02-05 10:40:17.000000000 +0900 @@ -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 */ diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/myisamdef.h ./myisam/myisamdef.h --- ../mysql-5.0.51a-tritonn-1.0.9.orig/myisam/myisamdef.h 2008-01-11 23:43:18.000000000 +0900 +++ ./myisam/myisamdef.h 2008-02-04 12:39:40.000000000 +0900 @@ -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); } diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/ha_myisam.cc ./sql/ha_myisam.cc --- ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/ha_myisam.cc 2008-01-30 17:55:57.000000000 +0900 +++ ./sql/ha_myisam.cc 2008-02-04 19:46:14.000000000 +0900 @@ -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)); diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/item_func.cc ./sql/item_func.cc --- ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/item_func.cc 2008-01-30 17:55:57.000000000 +0900 +++ ./sql/item_func.cc 2008-02-03 00:35:57.000000000 +0900 @@ -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++) diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/mysqld.cc ./sql/mysqld.cc --- ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/mysqld.cc 2008-01-30 17:55:58.000000000 +0900 +++ ./sql/mysqld.cc 2008-02-05 10:00:17.000000000 +0900 @@ -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; diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/set_var.cc ./sql/set_var.cc --- ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/set_var.cc 2008-01-30 17:55:58.000000000 +0900 +++ ./sql/set_var.cc 2008-02-05 10:00:40.000000000 +0900 @@ -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}, diff -u -r ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/sql_select.cc ./sql/sql_select.cc --- ../mysql-5.0.51a-tritonn-1.0.9.orig/sql/sql_select.cc 2008-01-30 17:55:58.000000000 +0900 +++ ./sql/sql_select.cc 2008-02-03 16:52:03.000000000 +0900 @@ -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: