diff options
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/ft_boolean_search.c | 240 | ||||
-rw-r--r-- | myisam/ft_nlq_search.c | 85 | ||||
-rw-r--r-- | myisam/ft_parser.c | 2 | ||||
-rw-r--r-- | myisam/ft_static.c | 21 | ||||
-rw-r--r-- | myisam/ftdefs.h | 23 | ||||
-rw-r--r-- | myisam/mi_search.c | 120 | ||||
-rw-r--r-- | myisam/mi_write.c | 10 |
7 files changed, 314 insertions, 187 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 79fecccaaf6..32d8e7941bb 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -16,6 +16,7 @@ /* Written by Sergei A. Golubchik, who has a shared copyright to this code */ +#define FT_CORE #include "ftdefs.h" #include <queues.h> @@ -73,8 +74,9 @@ typedef struct { byte word[1]; } FTB_WORD; -typedef struct st_ftb_handler { - MI_INFO *info; +typedef struct st_ft_info { + struct _ft_vft *please; + MI_INFO *info; uint keynr; int ok; FTB_EXPR *root; @@ -85,10 +87,10 @@ typedef struct st_ftb_handler { int FTB_WORD_cmp(void *v, byte *a, byte *b) { /* ORDER BY docid, ndepth DESC */ - int i=((FTB_WORD *)a)->docid-((FTB_WORD *)b)->docid; + int i=comp(((FTB_WORD *)a)->docid, ((FTB_WORD *)b)->docid); if (!i) - i=((FTB_WORD *)b)->ndepth-((FTB_WORD *)a)->ndepth; - return sgn(i); + i=comp(((FTB_WORD *)b)->ndepth,((FTB_WORD *)a)->ndepth); + return i; } void _ftb_parse_query(FTB *ftb, byte **start, byte *end, @@ -108,70 +110,71 @@ void _ftb_parse_query(FTB *ftb, byte **start, byte *end, if (! ftb->ok) return; - while (res=ftb_get_word(&start,end,&w,¶m)) + param.prev=' '; + while (res=ft_get_word(start,end,&w,¶m)) { byte r=param.plusminus; float weight=(param.pmsign ? nwghts : wghts)[(r>5)?5:((r<-5)?-5:r)]; switch (res) { case FTB_LBR: - ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); - ftbe->yesno=param.yesno; - ftbe->weight=weight; - ftbe->up=up; - ftbe->ythresh=0; - ftbe->docid=HA_POS_ERROR; - if (ftbw->yesno > 0) up->ythresh++; + ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR)); + ftbe->yesno=param.yesno; + ftbe->weight=weight; + ftbe->up=up; + ftbe->ythresh=0; + ftbe->docid=HA_POS_ERROR; + if (ftbw->yesno > 0) up->ythresh++; _ftb_parse_query(ftb, start, end, ftbe, depth+1, - (param.yesno<0 ? depth+1 : ndepth)); + (param.yesno<0 ? depth+1 : ndepth)); break; case FTB_RBR: return; case 1: - ftbw=(FTB_WORD *)alloc_root(&ftb->mem_root, + ftbw=(FTB_WORD *)alloc_root(&ftb->mem_root, sizeof(FTB_WORD) + (param.trunc ? MI_MAX_KEY_BUFF : w.len+extra)); ftbw->len=w.len + !param.trunc; - ftbw->yesno=param.yesno; - ftbw->trunc=param.trunc; /* 0 or 1 */ - ftbw->weight=weight; - ftbw->up=up; - ftbw->docid=HA_POS_ERROR; - ftbw->ndepth= param.yesno<0 ? depth : ndepth; + ftbw->yesno=param.yesno; + ftbw->trunc=param.trunc; /* 0 or 1 */ + ftbw->weight=weight; + ftbw->up=up; + ftbw->docid=HA_POS_ERROR; + ftbw->ndepth= param.yesno<0 ? depth : ndepth; memcpy(ftbw->word+1, w.pos, w.len); ftbw->word[0]=w.len; - if (ftbw->yesno > 0) up->ythresh++; - /*****************************************/ - r=_mi_search(info, keyinfo, ftbw->word, ftbw->len, - SEARCH_FIND | SEARCH_PREFIX, keyroot); - if (!r) - { - r=_mi_compare_text(default_charset_info, - info->lastkey+ftbw->trunc,ftbw->len, - ftbw->word+ftbw->trunc,ftbw->len,0); - } - if (r) /* not found */ - { - if (ftbw->yesno>0 && ftbw->up->up==0) - { /* this word MUST BE present in every document returned, - so we can abort the search right now */ - ftb->ok=0; - return; - } - } - else - { - memcpy(ftbw->word, info->lastkey, info->lastkey_length); - ftbw->docid=info->lastpos; - queue_insert(& ftb->queue, (byte *)ftbw); - } - /*****************************************/ + if (ftbw->yesno > 0) up->ythresh++; + /*****************************************/ + r=_mi_search(info, keyinfo, ftbw->word, ftbw->len, + SEARCH_FIND | SEARCH_PREFIX, keyroot); + if (!r) + { + r=_mi_compare_text(default_charset_info, + info->lastkey+ftbw->trunc,ftbw->len, + ftbw->word+ftbw->trunc,ftbw->len,0); + } + if (r) /* not found */ + { + if (ftbw->yesno>0 && ftbw->up->up==0) + { /* this word MUST BE present in every document returned, + so we can abort the search right now */ + ftb->ok=0; + return; + } + } + else + { + memcpy(ftbw->word, info->lastkey, info->lastkey_length); + ftbw->docid=info->lastpos; + queue_insert(& ftb->queue, (byte *)ftbw); + } + /*****************************************/ break; } } return; } -FTB * ft_boolean_search_init(MI_INFO *info, uint keynr, byte *query, - uint query_len) +FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query, + uint query_len, my_bool presort __attribute__((unused))) { FTB *ftb; FTB_EXPR *ftbe; @@ -179,11 +182,12 @@ FTB * ft_boolean_search_init(MI_INFO *info, uint keynr, byte *query, if (!(ftb=(FTB *)my_malloc(sizeof(FTB), MYF(MY_WME)))) return 0; + ftb->please=& _ft_vft_boolean; ftb->ok=1; ftb->info=info; ftb->keynr=keynr; - init_alloc_root(&ftb->mem_root, query_len,0); + init_alloc_root(&ftb->mem_root, 1024, 1024); /* hack: instead of init_queue, we'll use reinit queue to be able * to alloc queue with alloc_root() @@ -201,7 +205,7 @@ FTB * ft_boolean_search_init(MI_INFO *info, uint keynr, byte *query, return ftb; } -int ft_boolean_search_next(FTB *ftb, char *record) +int ft_boolean_read_next(FT_INFO *ftb, char *record) { FTB_EXPR *ftbe, *up; FTB_WORD *ftbw; @@ -218,61 +222,64 @@ int ft_boolean_search_next(FTB *ftb, char *record) return my_errno; /* black magic OFF */ - while(ftb->ok && ftb->queue.elements) - { - curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid; + if (!ftb->queue.elements) + return my_errno=HA_ERR_END_OF_FILE; + while(ftb->ok && + (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid) != HA_POS_ERROR) + { while (curdoc==(ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid) { float weight=ftbw->weight; - uint yn=ftbw->yesno; + int yn=ftbw->yesno; for (ftbe=ftbw->up; ftbe; ftbe=ftbe->up) { - if (ftbe->docid != curdoc) - { - ftbe->cur_weight=ftbe->yesses=ftbe->nos=0; - ftbe->docid=curdoc; - } - if (yn>0) - { - ftbe->cur_weight+=weight; - if (++ftbe->yesses >= ftbe->ythresh && !ftbe->nos) - { + if (ftbe->docid != curdoc) + { + ftbe->cur_weight=ftbe->yesses=ftbe->nos=0; + ftbe->docid=curdoc; + } + if (yn>0) + { + ftbe->cur_weight+=weight; + if (++ftbe->yesses >= ftbe->ythresh && !ftbe->nos) + { yn=ftbe->yesno; - weight=ftbe->cur_weight*ftbe->weight; - } - else - break; - } - else - if (yn<0) - { - /* NOTE: special sort function of queue assures that all yn<0 - * events for every particular subexpression will happen - * BEFORE all yn>=0 events. So no already matched expression - * can become not-matched again. - */ - ++ftbe->nos; - break; - } - else + weight=ftbe->cur_weight*ftbe->weight; + } + else + break; + } + else + if (yn<0) + { + /* NOTE: special sort function of queue assures that all yn<0 + * events for every particular subexpression will + * "auto-magically" happen BEFORE all yn>=0 events. So no + * already matched expression can become not-matched again. + */ + ++ftbe->nos; + break; + } + else /* if (yn==0) */ - { - if (ftbe->yesses >= ftbe->ythresh && !ftbe->nos) - { + { + if (ftbe->yesses >= ftbe->ythresh && !ftbe->nos) + { yn=ftbe->yesno; - weight*=ftbe->weight; - } - else - { - ftbe->cur_weight+=weight; - break; - } - } + ftbe->cur_weight=weight; + weight*=ftbe->weight; + } + else + { + ftbe->cur_weight+=weight; + break; + } + } } /* update queue */ r=_mi_search(info, keyinfo, ftbw->word, ftbw->len, - SEARCH_FIND | SEARCH_PREFIX, keyroot); + SEARCH_BIGGER , keyroot); if (!r) { r=_mi_compare_text(default_charset_info, @@ -281,19 +288,19 @@ int ft_boolean_search_next(FTB *ftb, char *record) } if (r) /* not found */ { - queue_remove(& ftb->queue, 0); - if (ftbw->yesno>0 && ftbw->up->up==0) - { /* this word MUST BE present in every document returned, - so we can stop the search right now */ - ftb->ok=0; - } + ftbw->docid=HA_POS_ERROR; + if (ftbw->yesno>0 && ftbw->up->up==0) + { /* this word MUST BE present in every document returned, + so we can stop the search right now */ + ftb->ok=0; + } } else { memcpy(ftbw->word, info->lastkey, info->lastkey_length); ftbw->docid=info->lastpos; - queue_replaced(& ftb->queue); } + queue_replaced(& ftb->queue); } ftbe=ftb->root; @@ -305,8 +312,8 @@ int ft_boolean_search_next(FTB *ftb, char *record) /* info->lastpos=curdoc; */ /* do I need this ? */ if (!(*info->read_record)(info,curdoc,record)) { - info->update|= HA_STATE_AKTIV; /* Record is read */ - return 0; + info->update|= HA_STATE_AKTIV; /* Record is read */ + return 0; } return my_errno; } @@ -314,3 +321,30 @@ int ft_boolean_search_next(FTB *ftb, char *record) return my_errno=HA_ERR_END_OF_FILE; } +float ft_boolean_find_relevance(FT_INFO *ftb, my_off_t docid) +{ + fprintf(stderr, "ft_boolean_find_relevance called!\n"); + return -1.0; /* to be done via str scan */ +} + +void ft_boolean_close_search(FT_INFO *ftb) +{ + free_root(& ftb->mem_root, MYF(0)); + my_free((gptr)ftb,MYF(0)); +} + +float ft_boolean_get_relevance(FT_INFO *ftb) +{ + return ftb->root->cur_weight; +} + +my_off_t ft_boolean_get_docid(FT_INFO *ftb) +{ + return HA_POS_ERROR; +} + +void ft_boolean_reinit_search(FT_INFO *ftb) +{ + fprintf(stderr, "ft_boolean_reinit_search called!\n"); +} + diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index be11c5a9c4c..f0f878a7f16 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -16,10 +16,24 @@ /* Written by Sergei A. Golubchik, who has a shared copyright to this code */ +#define FT_CORE #include "ftdefs.h" /* search with natural language queries */ +typedef struct ft_doc_rec { + my_off_t dpos; + double weight; +} FT_DOC; + +struct st_ft_info { + struct _ft_vft *please; + MI_INFO *info; + int ndocs; + int curdoc; + FT_DOC doc[1]; +}; + typedef struct st_all_in_one { MI_INFO *info; uint keynr; @@ -152,27 +166,27 @@ static int FT_DOC_cmp(FT_DOC *a, FT_DOC *b) return sgn(b->weight - a->weight); } -FT_DOCLIST *ft_nlq_init_search(void *info, uint keynr, byte *query, - uint query_len, my_bool presort) +FT_INFO *ft_init_nlq_search(MI_INFO *info, uint keynr, byte *query, + uint query_len, my_bool presort) { TREE *wtree, allocated_wtree; ALL_IN_ONE aio; FT_DOC *dptr; - FT_DOCLIST *dlist=NULL; - my_off_t saved_lastpos=((MI_INFO *)info)->lastpos; + FT_INFO *dlist=NULL; + my_off_t saved_lastpos=info->lastpos; /* black magic ON */ - if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0) + if ((int) (keynr = _mi_check_index(info,keynr)) < 0) return NULL; - if (_mi_readinfo((MI_INFO *)info,F_RDLCK,1)) + if (_mi_readinfo(info,F_RDLCK,1)) return NULL; /* black magic OFF */ - aio.info=(MI_INFO *)info; + aio.info=info; aio.keynr=keynr; - aio.keybuff=aio.info->lastkey+aio.info->s->base.max_key_length; - aio.keyinfo=aio.info->s->keyinfo+keynr; - aio.key_root=aio.info->s->state.key_root[keynr]; + aio.keybuff=info->lastkey+info->s->base.max_key_length; + aio.keyinfo=info->s->keyinfo+keynr; + aio.key_root=info->s->state.key_root[keynr]; bzero(&allocated_wtree,sizeof(allocated_wtree)); @@ -186,18 +200,19 @@ FT_DOCLIST *ft_nlq_init_search(void *info, uint keynr, byte *query, left_root_right)) goto err2; - dlist=(FT_DOCLIST *)my_malloc(sizeof(FT_DOCLIST)+ + dlist=(FT_INFO *)my_malloc(sizeof(FT_INFO)+ sizeof(FT_DOC)*(aio.dtree.elements_in_tree-1),MYF(0)); if(!dlist) goto err2; + dlist->please=& _ft_vft_nlq; dlist->ndocs=aio.dtree.elements_in_tree; dlist->curdoc=-1; dlist->info=aio.info; dptr=dlist->doc; - tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, &dptr, - left_root_right); + tree_walk(&aio.dtree, (tree_walk_action)&walk_and_copy, + &dptr, left_root_right); if(presort) qsort(dlist->doc, dlist->ndocs, sizeof(FT_DOC), (qsort_cmp)&FT_DOC_cmp); @@ -207,11 +222,11 @@ err2: delete_tree(&aio.dtree); err: - ((MI_INFO *)info)->lastpos=saved_lastpos; + info->lastpos=saved_lastpos; return dlist; } -int ft_nlq_read_next(FT_DOCLIST *handler, char *record) +int ft_nlq_read_next(FT_INFO *handler, char *record) { MI_INFO *info= (MI_INFO *) handler->info; @@ -232,3 +247,43 @@ int ft_nlq_read_next(FT_DOCLIST *handler, char *record) return my_errno; } +float ft_nlq_find_relevance(FT_INFO *handler, my_off_t docid) +{ + int a,b,c; + FT_DOC *docs=handler->doc; + + // Assuming docs[] is sorted by dpos... + + for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2) + { + if (docs[c].dpos > docid) + b=c; + else + a=c; + } + if (docs[a].dpos == docid) + return docs[a].weight; + else + return 0.0; +} + +void ft_nlq_close_search(FT_INFO *handler) +{ + my_free((gptr)handler,MYF(0)); +} + +float ft_nlq_get_relevance(FT_INFO *handler) +{ + return handler->doc[handler->curdoc].weight; +} + +my_off_t ft_nlq_get_docid(FT_INFO *handler) +{ + return handler->doc[handler->curdoc].dpos; +} + +void ft_nlq_reinit_search(FT_INFO *handler) +{ + handler->curdoc=-1; +} + diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c index 83b0956a752..466f1dfe021 100644 --- a/myisam/ft_parser.c +++ b/myisam/ft_parser.c @@ -135,7 +135,7 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) if (true_word_char(*doc)) break; if (*doc == FTB_LBR || *doc == FTB_RBR) { - param->prev=' '; + /* param->prev=' '; */ *start=doc+1; return *doc; } diff --git a/myisam/ft_static.c b/myisam/ft_static.c index 09afadec23f..494d7638d67 100644 --- a/myisam/ft_static.c +++ b/myisam/ft_static.c @@ -43,10 +43,29 @@ const MI_KEYSEG ft_keysegs[FT_SEGS]={ }, #endif /* EVAL_RUN */ { - HA_FT_WTYPE, 7, 0, 0, 0, 0, HA_FT_WLEN, 0, 0, NULL + HA_FT_WTYPE, 7, 0, 0, 0, HA_NO_SORT, HA_FT_WLEN, 0, 0, NULL } }; +const struct _ft_vft _ft_vft_nlq = { + ft_nlq_read_next, ft_nlq_find_relevance, ft_nlq_close_search, + ft_nlq_get_relevance, ft_nlq_get_docid, ft_nlq_reinit_search +}; +const struct _ft_vft _ft_vft_boolean = { + ft_boolean_read_next, ft_boolean_find_relevance, ft_boolean_close_search, + ft_boolean_get_relevance, ft_boolean_get_docid, ft_boolean_reinit_search +}; + +FT_INFO *(*_ft_init_vft[2])(MI_INFO *, uint, byte *, uint, my_bool) = +{ ft_init_nlq_search, ft_init_boolean_search }; + +FT_INFO *ft_init_search(uint mode, void *info, uint keynr, + byte *query, uint query_len, my_bool presort) +{ + return (*_ft_init_vft[mode])((MI_INFO *)info, keynr, + query, query_len, presort); +} + const char *ft_precompiled_stopwords[] = { #ifdef COMPILE_STOPWORDS_IN diff --git a/myisam/ftdefs.h b/myisam/ftdefs.h index 1a017d3c73a..9eedf57c759 100644 --- a/myisam/ftdefs.h +++ b/myisam/ftdefs.h @@ -95,9 +95,6 @@ extern ulong collstat; #define FTB_NEG '~' #define FTB_TRUNC '*' -// #define FTB_MAX_SUBEXPR 255 -// #define FTB_MAX_DEPTH 16 - typedef struct st_ft_word { byte * pos; uint len; @@ -116,7 +113,6 @@ typedef struct st_ftb_param { } FTB_PARAM; int is_stopword(char *word, uint len); -int is_boolean(byte *q, uint len); uint _ft_make_key(MI_INFO *, uint , byte *, FT_WORD *, my_off_t); @@ -127,6 +123,21 @@ TREE * ft_parse(TREE *, byte *, int); FT_WORD * ft_linearize(MI_INFO *, uint, byte *, TREE *); FT_WORD * _mi_ft_parserecord(MI_INFO *, uint , byte *, const byte *); -FT_DOCLIST * ft_nlq_search(MI_INFO *, uint, byte *, uint); -FT_DOCLIST * ft_boolean_search(MI_INFO *, uint, byte *, uint); +const struct _ft_vft _ft_vft_nlq; +FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, my_bool); +int ft_nlq_read_next(FT_INFO *, char *); +float ft_nlq_find_relevance(FT_INFO *, my_off_t ); +void ft_nlq_close_search(FT_INFO *); +float ft_nlq_get_relevance(FT_INFO *); +my_off_t ft_nlq_get_docid(FT_INFO *); +void ft_nlq_reinit_search(FT_INFO *); + +const struct _ft_vft _ft_vft_boolean; +FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, my_bool); +int ft_boolean_read_next(FT_INFO *, char *); +float ft_boolean_find_relevance(FT_INFO *, my_off_t ); +void ft_boolean_close_search(FT_INFO *); +float ft_boolean_get_relevance(FT_INFO *); +my_off_t ft_boolean_get_docid(FT_INFO *); +void ft_boolean_reinit_search(FT_INFO *); diff --git a/myisam/mi_search.c b/myisam/mi_search.c index b9895e9d6cd..67db7c7110a 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -317,7 +317,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, while (page < end) { uint packed= *page & 128; - + vseg=page; if (keyinfo->seg->length >= 127) { @@ -333,7 +333,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, prefix_len=len; else { - prefix_len=suffix_len; + prefix_len=suffix_len; get_key_length(suffix_len,vseg); } } @@ -359,7 +359,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, for (keyseg=keyinfo->seg+1 ; keyseg->type ; keyseg++ ) { - + if (keyseg->flag & HA_NULL_PART) { if (!(*from++)) @@ -726,13 +726,14 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) { uchar *end; + uint piks=! (keyseg->flag & HA_NO_SORT); (*diff_pos)++; /* Handle NULL part */ if (keyseg->null_bit) { key_length--; - if (*a != *b) + if (*a != *b && piks) { flag = (int) *a - (int) *b; return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -758,9 +759,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -776,9 +777,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, while (b_length && b[b_length-1] == ' ') b_length--; } - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a=end; b+=length; @@ -792,9 +793,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -803,9 +804,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, else { uint length=keyseg->length; - if ((flag=compare_bin(a,length,b,length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=compare_bin(a,length,b,length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=length; b+=length; @@ -818,9 +819,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -834,9 +835,9 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + if (piks && + (flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -847,7 +848,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, { int i_1= (int) *((signed char*) a); int i_2= (int) *((signed char*) b); - if ((flag = CMP(i_1,i_2))) + if (piks && (flag = CMP(i_1,i_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b++; @@ -856,7 +857,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_SHORT_INT: s_1= mi_sint2korr(a); s_2= mi_sint2korr(b); - if ((flag = CMP(s_1,s_2))) + if (piks && (flag = CMP(s_1,s_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 2; /* sizeof(short int); */ @@ -866,7 +867,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, uint16 us_1,us_2; us_1= mi_sint2korr(a); us_2= mi_sint2korr(b); - if ((flag = CMP(us_1,us_2))) + if (piks && (flag = CMP(us_1,us_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+=2; /* sizeof(short int); */ @@ -875,7 +876,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_LONG_INT: l_1= mi_sint4korr(a); l_2= mi_sint4korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ @@ -883,7 +884,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_ULONG_INT: u_1= mi_sint4korr(a); u_2= mi_sint4korr(b); - if ((flag = CMP(u_1,u_2))) + if (piks && (flag = CMP(u_1,u_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ @@ -891,7 +892,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_INT24: l_1=mi_sint3korr(a); l_2=mi_sint3korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; @@ -899,7 +900,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_UINT24: l_1=mi_uint3korr(a); l_2=mi_uint3korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; @@ -907,7 +908,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_FLOAT: mi_float4get(f_1,a); mi_float4get(f_2,b); - if ((flag = CMP(f_1,f_2))) + if (piks && (flag = CMP(f_1,f_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(float); */ @@ -915,7 +916,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_DOUBLE: mi_float8get(d_1,a); mi_float8get(d_2,b); - if ((flag = CMP(d_1,d_2))) + if (piks && (flag = CMP(d_1,d_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; /* sizeof(double); */ @@ -945,33 +946,40 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, for ( ; alength && *a == ' ' ; a++, alength--) ; for ( ; blength && *b == ' ' ; b++, blength--) ; } - - if (*a == '-') - { - if (*b != '-') - return -1; - a++; b++; - swap(uchar*,a,b); - swap(int,alength,blength); - swap_flag=1-swap_flag; - alength--; blength--; - end=a+alength; - } - else if (*b == '-') - return 1; - while (alength && (*a == '+' || *a == '0')) + if (piks) { - a++; alength--; + if (*a == '-') + { + if (*b != '-') + return -1; + a++; b++; + swap(uchar*,a,b); + swap(int,alength,blength); + swap_flag=1-swap_flag; + alength--; blength--; + end=a+alength; + } + else if (*b == '-') + return 1; + while (alength && (*a == '+' || *a == '0')) + { + a++; alength--; + } + while (blength && (*b == '+' || *b == '0')) + { + b++; blength--; + } + if (alength != blength) + return (alength < blength) ? -1 : 1; + while (a < end) + if (*a++ != *b++) + return ((int) a[-1] - (int) b[-1]); } - while (blength && (*b == '+' || *b == '0')) + else { - b++; blength--; + b+=(end-a); + a=end; } - if (alength != blength) - return (alength < blength) ? -1 : 1; - while (a < end) - if (*a++ != *b++) - return ((int) a[-1] - (int) b[-1]); if (swap_flag) /* Restore pointers */ swap(uchar*,a,b); @@ -983,7 +991,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, longlong ll_a,ll_b; ll_a= mi_sint8korr(a); ll_b= mi_sint8korr(b); - if ((flag = CMP(ll_a,ll_b))) + if (piks && (flag = CMP(ll_a,ll_b))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; @@ -994,7 +1002,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, ulonglong ll_a,ll_b; ll_a= mi_uint8korr(a); ll_b= mi_uint8korr(b); - if ((flag = CMP(ll_a,ll_b))) + if (piks && (flag = CMP(ll_a,ll_b))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; diff --git a/myisam/mi_write.c b/myisam/mi_write.c index 096d5829fed..322b0755015 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -774,7 +774,7 @@ static int keys_free(uchar *key, TREE_FREE mode, bulk_insert_param *param) keyinfo=param->info->s->keyinfo+param->keynr; keylen=_mi_keylength(keyinfo, key); memcpy(lastkey, key, keylen); - return _mi_ck_write_btree(param->info,param->keynr,lastkey, + return _mi_ck_write_btree(param->info,param->keynr,lastkey, keylen - param->info->s->rec_reflength); case free_end: if (param->info->s->concurrent_insert) @@ -794,7 +794,7 @@ int _mi_init_bulk_insert(MI_INFO *info) if (info->bulk_insert) return 0; - + for (i=num_keys=0 ; i < share->base.keys ; i++) { if (!(key[i].flag & HA_NOSAME) && share->base.auto_key != i+1 @@ -807,7 +807,7 @@ int _mi_init_bulk_insert(MI_INFO *info) if (!num_keys) return 0; - + info->bulk_insert=(TREE *) my_malloc((sizeof(TREE)*share->base.keys+ sizeof(bulk_insert_param)*num_keys),MYF(0)); @@ -822,13 +822,13 @@ int _mi_init_bulk_insert(MI_INFO *info) { params->info=info; params->keynr=i; - init_tree(& info->bulk_insert[i], 0, + init_tree(& info->bulk_insert[i], 0, myisam_bulk_insert_tree_size / num_keys, 0, (qsort_cmp2)keys_compare, 0, (tree_element_free) keys_free, (void *)params++); } else - info->bulk_insert[i].root=0; + info->bulk_insert[i].root=0; } return 0; |