Commit 998b4ae5 authored by Guilhem Bichot's avatar Guilhem Bichot

Merge of MyISAM changes done in 5.1-main, into Maria

parent b90ff534
...@@ -191,7 +191,7 @@ typedef struct st_maria_keydef /* Key definition with open & info */ ...@@ -191,7 +191,7 @@ typedef struct st_maria_keydef /* Key definition with open & info */
uint16 maxlength; /* max length of (packed) key (auto) */ uint16 maxlength; /* max length of (packed) key (auto) */
uint32 write_comp_flag; /* compare flag for write key (auto) */ uint32 write_comp_flag; /* compare flag for write key (auto) */
uint32 version; /* For concurrent read/write */ uint32 version; /* For concurrent read/write */
uint32 ftparser_nr; /* distinct ftparser number */ uint32 ftkey_nr; /* full-text index number */
HA_KEYSEG *seg, *end; HA_KEYSEG *seg, *end;
struct st_mysql_ftparser *parser; /* Fulltext [pre]parser */ struct st_mysql_ftparser *parser; /* Fulltext [pre]parser */
......
...@@ -3675,7 +3675,7 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, ...@@ -3675,7 +3675,7 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info,
Note, built-in parser is always nr. 0 - see ftparser_call_initializer() Note, built-in parser is always nr. 0 - see ftparser_call_initializer()
*/ */
if (sort_param.keyinfo->ftparser_nr == 0) if (sort_param.keyinfo->ftkey_nr == 0)
{ {
/* /*
for built-in parser the number of generated index entries for built-in parser the number of generated index entries
...@@ -4222,6 +4222,9 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, ...@@ -4222,6 +4222,9 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info,
sort_param[0].fix_datafile= ! rep_quick; sort_param[0].fix_datafile= ! rep_quick;
sort_param[0].calc_checksum= test(param->testflag & T_CALC_CHECKSUM); sort_param[0].calc_checksum= test(param->testflag & T_CALC_CHECKSUM);
if (!maria_ftparser_alloc_param(info))
goto err;
sort_info.got_error=0; sort_info.got_error=0;
pthread_mutex_lock(&sort_info.mutex); pthread_mutex_lock(&sort_info.mutex);
......
...@@ -161,11 +161,11 @@ static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b) ...@@ -161,11 +161,11 @@ static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b)
static int FTB_WORD_cmp_list(CHARSET_INFO *cs, FTB_WORD **a, FTB_WORD **b) static int FTB_WORD_cmp_list(CHARSET_INFO *cs, FTB_WORD **a, FTB_WORD **b)
{ {
/* ORDER BY word DESC, ndepth DESC */ /* ORDER BY word, ndepth */
int i= ha_compare_text(cs, (uchar*) (*b)->word+1,(*b)->len-1, int i= ha_compare_text(cs, (uchar*) (*a)->word + 1,(*a)->len - 1,
(uchar*) (*a)->word+1,(*a)->len-1,0,0); (uchar*) (*b)->word + 1,(*b)->len - 1, 0, 0);
if (!i) if (!i)
i=CMP_NUM((*b)->ndepth,(*a)->ndepth); i=CMP_NUM((*a)->ndepth, (*b)->ndepth);
return i; return i;
} }
...@@ -879,23 +879,49 @@ static int ftb_find_relevance_add_word(MYSQL_FTPARSER_PARAM *param, ...@@ -879,23 +879,49 @@ static int ftb_find_relevance_add_word(MYSQL_FTPARSER_PARAM *param,
FT_INFO *ftb= ftb_param->ftb; FT_INFO *ftb= ftb_param->ftb;
FTB_WORD *ftbw; FTB_WORD *ftbw;
int a, b, c; int a, b, c;
/*
Find right-most element in the array of query words matching this
word from a document.
*/
for (a= 0, b= ftb->queue.elements, c= (a+b)/2; b-a>1; c= (a+b)/2) for (a= 0, b= ftb->queue.elements, c= (a+b)/2; b-a>1; c= (a+b)/2)
{ {
ftbw= ftb->list[c]; ftbw= ftb->list[c];
if (ha_compare_text(ftb->charset, (uchar*)word, len, if (ha_compare_text(ftb->charset, (uchar*)word, len,
(uchar*)ftbw->word+1, ftbw->len-1, (uchar*)ftbw->word+1, ftbw->len-1,
(my_bool)(ftbw->flags&FTB_FLAG_TRUNC), 0) > 0) (my_bool)(ftbw->flags&FTB_FLAG_TRUNC), 0) < 0)
b= c; b= c;
else else
a= c; a= c;
} }
/*
If there were no words with truncation operator, we iterate to the
beginning of an array until array element is equal to the word from
a document. This is done mainly because the same word may be
mentioned twice (or more) in the query.
In case query has words with truncation operator we must iterate
to the beginning of the array. There may be non-matching query words
between matching word with truncation operator and the right-most
matching element. E.g., if we're looking for 'aaa15' in an array of
'aaa1* aaa14 aaa15 aaa16'.
Worse of that there still may be match even if the binary search
above didn't find matching element. E.g., if we're looking for
'aaa15' in an array of 'aaa1* aaa14 aaa16'. The binary search will
stop at 'aaa16'.
*/
for (; c >= 0; c--) for (; c >= 0; c--)
{ {
ftbw= ftb->list[c]; ftbw= ftb->list[c];
if (ha_compare_text(ftb->charset, (uchar*)word, len, if (ha_compare_text(ftb->charset, (uchar*)word, len,
(uchar*)ftbw->word + 1,ftbw->len - 1, (uchar*)ftbw->word + 1,ftbw->len - 1,
(my_bool)(ftbw->flags & FTB_FLAG_TRUNC), 0)) (my_bool)(ftbw->flags & FTB_FLAG_TRUNC), 0))
{
if (ftb->with_scan & FTB_FLAG_TRUNC)
continue;
else
break; break;
}
if (ftbw->docid[1] == ftb->info->cur_row.lastpos) if (ftbw->docid[1] == ftb->info->cur_row.lastpos)
continue; continue;
ftbw->docid[1]= ftb->info->cur_row.lastpos; ftbw->docid[1]= ftb->info->cur_row.lastpos;
......
...@@ -326,59 +326,39 @@ int maria_ft_parse(TREE *wtree, uchar *doc, int doclen, ...@@ -326,59 +326,39 @@ int maria_ft_parse(TREE *wtree, uchar *doc, int doclen,
#define MAX_PARAM_NR 2 #define MAX_PARAM_NR 2
MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info,
uint keynr, uint paramnr) MYSQL_FTPARSER_PARAM* maria_ftparser_alloc_param(MARIA_HA *info)
{ {
uint32 ftparser_nr; if (!info->ftparser_param)
struct st_mysql_ftparser *parser;
if (! info->ftparser_param)
{ {
/* info->ftparser_param can not be zero after the initialization, /*
. info->ftparser_param can not be zero after the initialization,
because it always includes built-in fulltext parser. And built-in because it always includes built-in fulltext parser. And built-in
parser can be called even if the table has no fulltext indexes and parser can be called even if the table has no fulltext indexes and
no varchar/text fields. */ no varchar/text fields.
if (! info->s->ftparsers)
{ ftb_find_relevance... parser (ftb_find_relevance_parse,
/* It's ok that modification to shared structure is done w/o mutex ftb_find_relevance_add_word) calls ftb_check_phrase... parser
locks, because all threads would set the same variables to the (ftb_check_phrase_internal, ftb_phrase_add_word). Thus MAX_PARAM_NR=2.
same values. */
uint i, j, keys= info->s->state.header.keys, ftparsers= 1;
for (i= 0; i < keys; i++)
{
MARIA_KEYDEF *keyinfo= &info->s->keyinfo[i];
if (keyinfo->flag & HA_FULLTEXT)
{
for (j= 0;; j++)
{
if (j == i)
{
keyinfo->ftparser_nr= ftparsers++;
break;
}
if (info->s->keyinfo[j].flag & HA_FULLTEXT &&
keyinfo->parser == info->s->keyinfo[j].parser)
{
keyinfo->ftparser_nr= info->s->keyinfo[j].ftparser_nr;
break;
}
}
}
}
info->s->ftparsers= ftparsers;
}
/*
We have to allocate two MYSQL_FTPARSER_PARAM structures per plugin
because in a boolean search a parser is called recursively
ftb_find_relevance* calls ftb_check_phrase*
(MAX_PARAM_NR=2)
*/ */
info->ftparser_param= (MYSQL_FTPARSER_PARAM *) info->ftparser_param= (MYSQL_FTPARSER_PARAM *)
my_malloc(MAX_PARAM_NR * sizeof(MYSQL_FTPARSER_PARAM) * my_malloc(MAX_PARAM_NR * sizeof(MYSQL_FTPARSER_PARAM) *
info->s->ftparsers, MYF(MY_WME|MY_ZEROFILL)); info->s->ftkeys, MYF(MY_WME | MY_ZEROFILL));
init_alloc_root(&info->ft_memroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0); init_alloc_root(&info->ft_memroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0);
if (! info->ftparser_param)
return 0;
} }
return info->ftparser_param;
}
MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info,
uint keynr, uint paramnr)
{
uint32 ftparser_nr;
struct st_mysql_ftparser *parser;
if (!maria_ftparser_alloc_param(info))
return 0;
if (keynr == NO_SUCH_KEY) if (keynr == NO_SUCH_KEY)
{ {
ftparser_nr= 0; ftparser_nr= 0;
...@@ -386,7 +366,7 @@ MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info, ...@@ -386,7 +366,7 @@ MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info,
} }
else else
{ {
ftparser_nr= info->s->keyinfo[keynr].ftparser_nr; ftparser_nr= info->s->keyinfo[keynr].ftkey_nr;
parser= info->s->keyinfo[keynr].parser; parser= info->s->keyinfo[keynr].parser;
} }
DBUG_ASSERT(paramnr < MAX_PARAM_NR); DBUG_ASSERT(paramnr < MAX_PARAM_NR);
...@@ -419,7 +399,7 @@ void maria_ftparser_call_deinitializer(MARIA_HA *info) ...@@ -419,7 +399,7 @@ void maria_ftparser_call_deinitializer(MARIA_HA *info)
for (j=0; j < MAX_PARAM_NR; j++) for (j=0; j < MAX_PARAM_NR; j++)
{ {
MYSQL_FTPARSER_PARAM *ftparser_param= MYSQL_FTPARSER_PARAM *ftparser_param=
&info->ftparser_param[keyinfo->ftparser_nr*MAX_PARAM_NR + j]; &info->ftparser_param[keyinfo->ftkey_nr*MAX_PARAM_NR + j];
if (keyinfo->flag & HA_FULLTEXT && ftparser_param->mysql_add_word) if (keyinfo->flag & HA_FULLTEXT && ftparser_param->mysql_add_word)
{ {
if (keyinfo->parser->deinit) if (keyinfo->parser->deinit)
......
...@@ -147,6 +147,7 @@ void maria_ft_boolean_close_search(FT_INFO *); ...@@ -147,6 +147,7 @@ void maria_ft_boolean_close_search(FT_INFO *);
float maria_ft_boolean_get_relevance(FT_INFO *); float maria_ft_boolean_get_relevance(FT_INFO *);
my_off_t maria_ft_boolean_get_docid(FT_INFO *); my_off_t maria_ft_boolean_get_docid(FT_INFO *);
void maria_ft_boolean_reinit_search(FT_INFO *); void maria_ft_boolean_reinit_search(FT_INFO *);
MYSQL_FTPARSER_PARAM* maria_ftparser_alloc_param(MARIA_HA *info);
extern MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info, extern MYSQL_FTPARSER_PARAM *maria_ftparser_call_initializer(MARIA_HA *info,
uint keynr, uint keynr,
uint paramnr); uint paramnr);
......
...@@ -537,6 +537,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) ...@@ -537,6 +537,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
share->block_size= share->base.block_size; /* Convenience */ share->block_size= share->base.block_size; /* Convenience */
{ {
HA_KEYSEG *pos=share->keyparts; HA_KEYSEG *pos=share->keyparts;
uint32 ftkey_nr= 1;
for (i=0 ; i < keys ; i++) for (i=0 ; i < keys ; i++)
{ {
share->keyinfo[i].share= share; share->keyinfo[i].share= share;
...@@ -609,6 +610,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) ...@@ -609,6 +610,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
share->ft2_keyinfo.end=pos; share->ft2_keyinfo.end=pos;
setup_key_functions(& share->ft2_keyinfo); setup_key_functions(& share->ft2_keyinfo);
} }
share->keyinfo[i].ftkey_nr= ftkey_nr++;
} }
setup_key_functions(share->keyinfo+i); setup_key_functions(share->keyinfo+i);
share->keyinfo[i].end=pos; share->keyinfo[i].end=pos;
...@@ -646,7 +648,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) ...@@ -646,7 +648,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
pos->flag=0; pos->flag=0;
pos++; pos++;
} }
share->ftparsers= 0; share->ftkeys= ftkey_nr;
} }
share->data_file_type= share->state.header.data_file_type; share->data_file_type= share->state.header.data_file_type;
share->base_length= (BASE_ROW_HEADER_SIZE + share->base_length= (BASE_ROW_HEADER_SIZE +
...@@ -1527,7 +1529,7 @@ uchar *_ma_keydef_read(uchar *ptr, MARIA_KEYDEF *keydef) ...@@ -1527,7 +1529,7 @@ uchar *_ma_keydef_read(uchar *ptr, MARIA_KEYDEF *keydef)
keydef->underflow_block_length=keydef->block_length/3; keydef->underflow_block_length=keydef->block_length/3;
keydef->version = 0; /* Not saved */ keydef->version = 0; /* Not saved */
keydef->parser = &ft_default_parser; keydef->parser = &ft_default_parser;
keydef->ftparser_nr = 0; keydef->ftkey_nr = 0;
return ptr; return ptr;
} }
......
...@@ -348,7 +348,7 @@ typedef struct st_maria_share ...@@ -348,7 +348,7 @@ typedef struct st_maria_share
ulong state_diff_length; ulong state_diff_length;
uint rec_reflength; /* rec_reflength in use now */ uint rec_reflength; /* rec_reflength in use now */
uint keypage_header; uint keypage_header;
uint32 ftparsers; /* Number of distinct ftparsers uint32 ftkeys; /* Number of distinct full-text keys
+ 1 */ + 1 */
PAGECACHE_FILE kfile; /* Shared keyfile */ PAGECACHE_FILE kfile; /* Shared keyfile */
File data_file; /* Shared data file */ File data_file; /* Shared data file */
......
...@@ -302,7 +302,7 @@ static void print_version(void) ...@@ -302,7 +302,7 @@ static void print_version(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
puts("Copyright (C) 2002 MySQL AB"); puts("Copyright 2002-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.");
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,"); puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,");
puts("and you are welcome to modify and redistribute it under the GPL license\n"); puts("and you are welcome to modify and redistribute it under the GPL license\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment