summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorpem@mysql.com <>2004-05-07 18:52:06 +0200
committerpem@mysql.com <>2004-05-07 18:52:06 +0200
commitbf45960eef96dba7e7a7ffc8c3bfe6627daee2a3 (patch)
tree2f7b236a8721d14f1b398964b898d922fd133131 /myisam
parente1182c5226ce1c5f5aff4c1e59798b9d3dccde2a (diff)
parentdf8e3eac456b14b420f724e658eee175d2ee5e57 (diff)
downloadmariadb-git-bf45960eef96dba7e7a7ffc8c3bfe6627daee2a3.tar.gz
Merge 4.1 -> 5.0
Diffstat (limited to 'myisam')
-rw-r--r--myisam/ft_boolean_search.c48
-rw-r--r--myisam/ft_nlq_search.c18
-rw-r--r--myisam/mi_create.c4
-rw-r--r--myisam/mi_info.c3
-rw-r--r--myisam/mi_static.c1
-rw-r--r--myisam/myisam_ftdump.c2
-rw-r--r--myisam/myisamchk.c9
-rw-r--r--myisam/myisamdef.h1
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 */