Commit 3a7b6d68 authored by serg@serg.mylan's avatar serg@serg.mylan

after-merge fix: make concurrent-insert-skip code ft2-aware

parent 4999203f
...@@ -205,6 +205,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -205,6 +205,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
int r; int r;
uint off; uint off;
int subkeys; int subkeys;
my_bool can_go_down;
MI_INFO *info=ftb->info; MI_INFO *info=ftb->info;
if (init_search) if (init_search)
...@@ -222,11 +223,22 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool 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); 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 */ /* 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, r= _mi_search_next(info, ftbw->keyinfo, info->lastkey,
info->lastkey_length, info->lastkey_length,
SEARCH_BIGGER, ftbw->key_root); SEARCH_BIGGER, ftbw->key_root);
}
if (!r && !ftbw->off) if (!r && !ftbw->off)
{ {
...@@ -270,8 +282,6 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -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))) if (!ftbw->off && (init_search || (ftbw->flags & FTB_FLAG_TRUNC)))
{ {
/* going down ? */ /* going down ? */
get_key_full_length_rdonly(off, info->lastkey);
subkeys=ft_sintXkorr(info->lastkey+off);
if (subkeys<0) if (subkeys<0)
{ {
/* /*
......
...@@ -90,6 +90,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -90,6 +90,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
/* Skip rows inserted by current inserted */ /* Skip rows inserted by current inserted */
for (r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root) ; 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 && info->lastpos >= info->state->data_file_length ;
r= _mi_search_next(info, keyinfo, info->lastkey, r= _mi_search_next(info, keyinfo, info->lastkey,
info->lastkey_length, SEARCH_BIGGER, key_root)) 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) ...@@ -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)) info->lastkey_length-extra-1, keybuff+1,keylen-1,0,0))
break; break;
subkeys=ft_sintXkorr(info->lastkey+info->lastkey_length-extra);
if (subkeys<0) if (subkeys<0)
{ {
if (doc_cnt) if (doc_cnt)
...@@ -119,7 +119,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -119,7 +119,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
key_root=info->lastpos; key_root=info->lastpos;
keylen=0; keylen=0;
r=_mi_search_first(info, keyinfo, key_root); r=_mi_search_first(info, keyinfo, key_root);
continue; goto do_skip;
} }
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
tmp_weight=*(float*)&subkeys; tmp_weight=*(float*)&subkeys;
...@@ -157,8 +157,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -157,8 +157,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
else else
r=_mi_search(info, keyinfo, info->lastkey, info->lastkey_length, r=_mi_search(info, keyinfo, info->lastkey, info->lastkey_length,
SEARCH_BIGGER, key_root); SEARCH_BIGGER, key_root);
do_skip:
while (!r && info->lastpos >= info->state->data_file_length) 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, r= _mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length,
SEARCH_BIGGER, key_root); SEARCH_BIGGER, key_root);
......
...@@ -366,7 +366,9 @@ explain ...@@ -366,7 +366,9 @@ explain
select concat(min(t1.a1),min(t2.a4)) from t1, t2 where t2.a4 <> 'AME'; select concat(min(t1.a1),min(t2.a4)) from t1, t2 where t2.a4 <> 'AME';
drop table t1, t2; drop table t1, t2;
--disable_warnings
create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB; create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB;
--enable_warnings
insert into t1 values (1, 3); insert into t1 values (1, 3);
select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ; select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ;
select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ;
......
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