summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorunknown <svoj@april.(none)>2006-01-26 15:12:59 +0400
committerunknown <svoj@april.(none)>2006-01-26 15:12:59 +0400
commit1d5185d6ece9f494377fdd032df53b27ceee2e65 (patch)
tree5dbe22168927cbaa729a46a96d7170ed4f80f2cb /storage
parentcbfc0f4c60553722ae93417dc1bc88eb0ac324c6 (diff)
downloadmariadb-git-1d5185d6ece9f494377fdd032df53b27ceee2e65.tar.gz
BUG#16722 - Fulltext: implicit limit for query word number (depends on length of the query)
Remove implicit limit for query word number. mysql-test/r/fulltext.result: Reoder results. storage/myisam/ft_boolean_search.c: Remove implicit limit for query word number. Instead compute number of elements and allocate exactly needed memory.
Diffstat (limited to 'storage')
-rw-r--r--storage/myisam/ft_boolean_search.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/storage/myisam/ft_boolean_search.c b/storage/myisam/ft_boolean_search.c
index fbd8e03f75c..ea179df0c56 100644
--- a/storage/myisam/ft_boolean_search.c
+++ b/storage/myisam/ft_boolean_search.c
@@ -107,6 +107,7 @@ typedef struct st_ftb_word
my_off_t key_root;
my_off_t *max_docid;
MI_KEYDEF *keyinfo;
+ struct st_ftb_word *prev;
float weight;
uint ndepth;
uint len;
@@ -121,6 +122,7 @@ typedef struct st_ft_info
CHARSET_INFO *charset;
FTB_EXPR *root;
FTB_WORD **list;
+ FTB_WORD *last_word;
MEM_ROOT mem_root;
QUEUE queue;
TREE no_dupes;
@@ -199,7 +201,9 @@ static int ftb_query_add_word(void *param, byte *word, uint word_len,
memcpy(ftbw->word + 1, word, word_len);
ftbw->word[0]= word_len;
if (info->yesno > 0) ftbw->up->ythresh++;
- queue_insert(&ftb_param->ftb->queue, (byte *)ftbw);
+ ftb_param->ftb->queue.max_elements++;
+ ftbw->prev= ftb_param->ftb->last_word;
+ ftb_param->ftb->last_word= ftbw;
ftb_param->ftb->with_scan|= (info->trunc & FTB_FLAG_TRUNC);
for (tmp_expr= ftb_param->ftbe; tmp_expr->up; tmp_expr= tmp_expr->up)
if (! (tmp_expr->flags & FTB_FLAG_YES))
@@ -505,7 +509,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
{
FTB *ftb;
FTB_EXPR *ftbe;
- uint res;
+ FTB_WORD *ftbw;
if (!(ftb=(FTB *)my_malloc(sizeof(FTB), MYF(MY_WME))))
return 0;
@@ -518,19 +522,10 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
ftb->with_scan=0;
ftb->lastpos=HA_OFFSET_ERROR;
bzero(& ftb->no_dupes, sizeof(TREE));
+ ftb->last_word= 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()
- */
- res=ftb->queue.max_elements=1+query_len/2;
- if (!(ftb->queue.root=
- (byte **)alloc_root(&ftb->mem_root, (res+1)*sizeof(void*))))
- goto err;
- reinit_queue(& ftb->queue, res, 0, 0,
- (int (*)(void*,byte*,byte*))FTB_WORD_cmp, 0);
+ ftb->queue.max_elements= 0;
if (!(ftbe=(FTB_EXPR *)alloc_root(&ftb->mem_root, sizeof(FTB_EXPR))))
goto err;
ftbe->weight=1;
@@ -545,6 +540,18 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
_ftb_parse_query(ftb, query, query_len, keynr == NO_SUCH_KEY ?
&ft_default_parser :
info->s->keyinfo[keynr].parser);
+ /*
+ Hack: instead of init_queue, we'll use reinit queue to be able
+ to alloc queue with alloc_root()
+ */
+ if (! (ftb->queue.root= (byte **)alloc_root(&ftb->mem_root,
+ (ftb->queue.max_elements + 1) *
+ sizeof(void *))))
+ goto err;
+ reinit_queue(&ftb->queue, ftb->queue.max_elements, 0, 0,
+ (int (*)(void*, byte*, byte*))FTB_WORD_cmp, 0);
+ for (ftbw= ftb->last_word; ftbw; ftbw= ftbw->prev)
+ queue_insert(&ftb->queue, (byte *)ftbw);
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
sizeof(FTB_WORD *)*ftb->queue.elements);
memcpy(ftb->list, ftb->queue.root+1, sizeof(FTB_WORD *)*ftb->queue.elements);