diff options
author | unknown <serg@serg.mylan> | 2004-04-27 21:17:10 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2004-04-27 21:17:10 +0200 |
commit | e35880e0b86ea38412b1c5e94a99aa995f071564 (patch) | |
tree | 8cf231fea089cf1204f85536f9854e2abaf2bb6f | |
parent | 39ec9e1e23409b9ddb0c9b7c5baff3d4877c11b6 (diff) | |
download | mariadb-git-e35880e0b86ea38412b1c5e94a99aa995f071564.tar.gz |
after-merge fix: make concurrent-insert-skip code ft2-aware
mysql-test/t/func_group.test:
no innodb is not an error
-rw-r--r-- | myisam/ft_boolean_search.c | 16 | ||||
-rw-r--r-- | myisam/ft_nlq_search.c | 9 | ||||
-rw-r--r-- | mysql-test/t/func_group.test | 2 |
3 files changed, 20 insertions, 7 deletions
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); diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test index 76d572f5de3..a1acf5f89eb 100644 --- a/mysql-test/t/func_group.test +++ b/mysql-test/t/func_group.test @@ -366,7 +366,9 @@ explain select concat(min(t1.a1),min(t2.a4)) from t1, t2 where t2.a4 <> 'AME'; 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; +--enable_warnings 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 Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; |