From e35880e0b86ea38412b1c5e94a99aa995f071564 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 Apr 2004 21:17:10 +0200 Subject: after-merge fix: make concurrent-insert-skip code ft2-aware mysql-test/t/func_group.test: no innodb is not an error --- myisam/ft_boolean_search.c | 16 +++++++++++++--- myisam/ft_nlq_search.c | 9 +++++---- 2 files changed, 18 insertions(+), 7 deletions(-) (limited to 'myisam') diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 2a1c07acf0b..90647990ee8 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -205,6 +205,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) int r; uint off; int subkeys; + my_bool can_go_down; MI_INFO *info=ftb->info; if (init_search) @@ -222,11 +223,22 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) 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 && info->lastpos >= info->state->data_file_length) + 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) { @@ -270,8 +282,6 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) if (!ftbw->off && (init_search || (ftbw->flags & FTB_FLAG_TRUNC))) { /* going down ? */ - get_key_full_length_rdonly(off, info->lastkey); - subkeys=ft_sintXkorr(info->lastkey+off); if (subkeys<0) { /* diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index f8ca7e96564..9b42d51ab55 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -90,6 +90,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) /* 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)) @@ -105,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) @@ -119,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; @@ -157,8 +157,9 @@ 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); - - while (!r && info->lastpos >= info->state->data_file_length) +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); -- cgit v1.2.1