diff options
author | pem@mysql.com <> | 2004-05-07 18:52:06 +0200 |
---|---|---|
committer | pem@mysql.com <> | 2004-05-07 18:52:06 +0200 |
commit | bf45960eef96dba7e7a7ffc8c3bfe6627daee2a3 (patch) | |
tree | 2f7b236a8721d14f1b398964b898d922fd133131 /myisam | |
parent | e1182c5226ce1c5f5aff4c1e59798b9d3dccde2a (diff) | |
parent | df8e3eac456b14b420f724e658eee175d2ee5e57 (diff) | |
download | mariadb-git-bf45960eef96dba7e7a7ffc8c3bfe6627daee2a3.tar.gz |
Merge 4.1 -> 5.0
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/ft_boolean_search.c | 48 | ||||
-rw-r--r-- | myisam/ft_nlq_search.c | 18 | ||||
-rw-r--r-- | myisam/mi_create.c | 4 | ||||
-rw-r--r-- | myisam/mi_info.c | 3 | ||||
-rw-r--r-- | myisam/mi_static.c | 1 | ||||
-rw-r--r-- | myisam/myisam_ftdump.c | 2 | ||||
-rw-r--r-- | myisam/myisamchk.c | 9 | ||||
-rw-r--r-- | myisam/myisamdef.h | 1 |
8 files changed, 61 insertions, 25 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 1d4bfee86a4..5f88122e730 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -204,7 +204,8 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) { int r; uint off; - int subkeys; + int subkeys=1; + my_bool can_go_down; MI_INFO *info=ftb->info; if (init_search) @@ -221,6 +222,24 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) r=_mi_search(info, ftbw->keyinfo, (uchar*) ftbw->word+ftbw->off, USE_WHOLE_KEY, SEARCH_BIGGER, ftbw->key_root); } + + can_go_down=(!ftbw->off && (init_search || (ftbw->flags & FTB_FLAG_TRUNC))); + /* Skip rows inserted by concurrent insert */ + while (!r) + { + if (can_go_down) + { + /* going down ? */ + off=info->lastkey_length-HA_FT_WLEN-info->s->base.rec_reflength; + subkeys=ft_sintXkorr(info->lastkey+off); + } + if (subkeys<0 || info->lastpos < info->state->data_file_length) + break; + r= _mi_search_next(info, ftbw->keyinfo, info->lastkey, + info->lastkey_length, + SEARCH_BIGGER, ftbw->key_root); + } + if (!r && !ftbw->off) { r= mi_compare_text(ftb->charset, @@ -260,22 +279,19 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) /* matching key found */ memcpy(ftbw->word+ftbw->off, info->lastkey, info->lastkey_length); - if (!ftbw->off && (init_search || (ftbw->flags & FTB_FLAG_TRUNC))) + /* going down ? */ + if (subkeys<0) { - /* going down ? */ - get_key_full_length_rdonly(off, info->lastkey); - subkeys=ft_sintXkorr(info->lastkey+off); - if (subkeys<0) - { - /* yep, going down, to the second-level tree */ - /* TODO here: subkey-based optimization */ - ftbw->off=off; - ftbw->key_root=info->lastpos; - ftbw->keyinfo=& info->s->ft2_keyinfo; - r=_mi_search_first(info, ftbw->keyinfo, ftbw->key_root); - DBUG_ASSERT(r==0); /* found something */ - memcpy(ftbw->word+off, info->lastkey, info->lastkey_length); - } + /* + yep, going down, to the second-level tree + TODO here: subkey-based optimization + */ + ftbw->off=off; + ftbw->key_root=info->lastpos; + ftbw->keyinfo=& info->s->ft2_keyinfo; + r=_mi_search_first(info, ftbw->keyinfo, ftbw->key_root); + DBUG_ASSERT(r==0); /* found something */ + memcpy(ftbw->word+off, info->lastkey, info->lastkey_length); } ftbw->docid[0]=info->lastpos; return 0; diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index 03875abe7b0..9b42d51ab55 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -88,7 +88,14 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) keylen-=HA_FT_WLEN; doc_cnt=0; - r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root); + /* Skip rows inserted by current inserted */ + for (r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root) ; + (subkeys=ft_sintXkorr(info->lastkey+info->lastkey_length-extra)) > 0 && + !r && info->lastpos >= info->state->data_file_length ; + r= _mi_search_next(info, keyinfo, info->lastkey, + info->lastkey_length, SEARCH_BIGGER, key_root)) + ; + info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */ while (!r && gweight) @@ -99,7 +106,6 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) info->lastkey_length-extra-1, keybuff+1,keylen-1,0,0)) break; - subkeys=ft_sintXkorr(info->lastkey+info->lastkey_length-extra); if (subkeys<0) { if (doc_cnt) @@ -113,7 +119,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) key_root=info->lastpos; keylen=0; r=_mi_search_first(info, keyinfo, key_root); - continue; + goto do_skip; } #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT tmp_weight=*(float*)&subkeys; @@ -151,6 +157,12 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) else r=_mi_search(info, keyinfo, info->lastkey, info->lastkey_length, SEARCH_BIGGER, key_root); +do_skip: + while ((subkeys=ft_sintXkorr(info->lastkey+info->lastkey_length-extra)) > 0 && + !r && info->lastpos >= info->state->data_file_length) + r= _mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length, + SEARCH_BIGGER, key_root); + } word->weight=gweight; diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 5682862c39a..838d647ea56 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -206,9 +206,9 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, 3 : 0))); if (options & (HA_OPTION_COMPRESS_RECORD | HA_OPTION_PACK_RECORD)) - pointer=mi_get_pointer_length(ci->data_file_length,4); + pointer=mi_get_pointer_length(ci->data_file_length,myisam_data_pointer_size); else - pointer=mi_get_pointer_length(ci->max_rows,4); + pointer=mi_get_pointer_length(ci->max_rows,myisam_data_pointer_size); if (!(max_rows=(ulonglong) ci->max_rows)) max_rows= ((((ulonglong) 1 << (pointer*8)) -1) / min_pack_length); diff --git a/myisam/mi_info.c b/myisam/mi_info.c index f4eace198f9..cf63ef63618 100644 --- a/myisam/mi_info.c +++ b/myisam/mi_info.c @@ -75,7 +75,8 @@ int mi_status(MI_INFO *info, register MI_ISAMINFO *x, uint flag) x->filenr = info->dfile; x->options = share->options; x->create_time=share->state.create_time; - x->reflength= mi_get_pointer_length(share->base.max_data_file_length,4); + x->reflength= mi_get_pointer_length(share->base.max_data_file_length, + myisam_data_pointer_size); x->record_offset= ((share->options & (HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ? 0L : share->base.pack_reclength); diff --git a/myisam/mi_static.c b/myisam/mi_static.c index a36c38e3c01..f7d008ffbb7 100644 --- a/myisam/mi_static.c +++ b/myisam/mi_static.c @@ -41,6 +41,7 @@ my_bool myisam_concurrent_insert=0; my_off_t myisam_max_extra_temp_length= MI_MAX_TEMP_LENGTH; my_off_t myisam_max_temp_length= MAX_FILE_SIZE; ulong myisam_bulk_insert_tree_size=8192*1024; +ulong myisam_data_pointer_size=4; /* read_vec[] is used for converting between P_READ_KEY.. and SEARCH_ diff --git a/myisam/myisam_ftdump.c b/myisam/myisam_ftdump.c index 8ab6a7600b2..075a0fd19e8 100644 --- a/myisam/myisam_ftdump.c +++ b/myisam/myisam_ftdump.c @@ -83,7 +83,7 @@ int main(int argc,char *argv[]) { char *end; - inx= strtoll(argv[1], &end, 10); + inx= (uint) strtoll(argv[1], &end, 10); if (*end) usage(); } diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index a96632b4f3c..cb7c8ae8288 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -154,7 +154,8 @@ enum options_mc { OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE, OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, OPT_SORT_BUFFER_SIZE, OPT_SORT_KEY_BLOCKS, OPT_DECODE_BITS, OPT_FT_MIN_WORD_LEN, - OPT_FT_MAX_WORD_LEN, OPT_FT_MAX_WORD_LEN_FOR_SORT, OPT_MAX_RECORD_LENGTH + OPT_FT_MAX_WORD_LEN, OPT_FT_MAX_WORD_LEN_FOR_SORT, OPT_FT_STOPWORD_FILE, + OPT_MAX_RECORD_LENGTH }; static struct my_option my_long_options[] = @@ -327,7 +328,11 @@ static struct my_option my_long_options[] = { "ft_max_word_len", OPT_FT_MAX_WORD_LEN, "", (gptr*) &ft_max_word_len, (gptr*) &ft_max_word_len, 0, GET_ULONG, REQUIRED_ARG, HA_FT_MAXCHARLEN, 10, HA_FT_MAXCHARLEN, 0, 1, 0}, - { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + { "ft_stopword_file", OPT_FT_STOPWORD_FILE, + "Use stopwords from this file instead of built-in list.", + (gptr*) &ft_stopword_file, (gptr*) &ft_stopword_file, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0} }; diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 987a9dfc39e..72260699d1e 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -417,6 +417,7 @@ typedef struct st_mi_sort_param #define MI_MIN_SIZE_BULK_INSERT_TREE 16384 /* this is per key */ #define MI_MIN_ROWS_TO_USE_BULK_INSERT 100 #define MI_MIN_ROWS_TO_DISABLE_INDEXES 100 +#define MI_MIN_ROWS_TO_USE_WRITE_CACHE 10 /* The UNIQUE check is done with a hashed long key */ |