Commit 15249d6a authored by serg@serg.mylan's avatar serg@serg.mylan

bug#2708

test results updated
parent 03ffb63f
...@@ -61,12 +61,12 @@ typedef struct st_ftb_expr FTB_EXPR; ...@@ -61,12 +61,12 @@ typedef struct st_ftb_expr FTB_EXPR;
struct st_ftb_expr struct st_ftb_expr
{ {
FTB_EXPR *up; FTB_EXPR *up;
my_off_t docid[2]; uint flags;
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */ /* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
my_off_t docid[2];
float weight; float weight;
float cur_weight; float cur_weight;
byte *quot, *qend; byte *quot, *qend;
uint flags;
uint yesses; /* number of "yes" words matched */ uint yesses; /* number of "yes" words matched */
uint nos; /* number of "no" words matched */ uint nos; /* number of "no" words matched */
uint ythresh; /* number of "yes" words in expr */ uint ythresh; /* number of "yes" words in expr */
...@@ -76,13 +76,13 @@ struct st_ftb_expr ...@@ -76,13 +76,13 @@ struct st_ftb_expr
typedef struct st_ftb_word typedef struct st_ftb_word
{ {
FTB_EXPR *up; FTB_EXPR *up;
MI_KEYDEF *keyinfo; uint flags;
my_off_t docid[2]; /* for index search and for scan */
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */ /* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
my_off_t docid[2]; /* for index search and for scan */
my_off_t key_root; my_off_t key_root;
MI_KEYDEF *keyinfo;
float weight; float weight;
uint ndepth; uint ndepth;
uint flags;
uint len; uint len;
uchar off; uchar off;
byte word[1]; byte word[1];
...@@ -193,7 +193,7 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end, ...@@ -193,7 +193,7 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
} }
static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)), static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)),
const void *a,const void *b) const void *a,const void *b)
{ {
return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b))); return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b)));
} }
...@@ -238,9 +238,9 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -238,9 +238,9 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0) if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0)
{ {
/* /*
This word MUST BE present in every document returned, This word MUST BE present in every document returned,
so we can stop the search right now so we can stop the search right now
*/ */
ftb->state=INDEX_DONE; ftb->state=INDEX_DONE;
return 1; /* search is done */ return 1; /* search is done */
} }
...@@ -250,7 +250,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -250,7 +250,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
/* going up to the first-level tree to continue search there */ /* going up to the first-level tree to continue search there */
_mi_dpointer(info, (uchar*) (ftbw->word+ftbw->off+HA_FT_WLEN), _mi_dpointer(info, (uchar*) (ftbw->word+ftbw->off+HA_FT_WLEN),
ftbw->key_root); ftbw->key_root);
ftbw->key_root=info->s->state.key_root[ftb->keynr]; ftbw->key_root=info->s->state.key_root[ftb->keynr];
ftbw->keyinfo=info->s->keyinfo+ftb->keynr; ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
ftbw->off=0; ftbw->off=0;
...@@ -297,7 +297,7 @@ static void _ftb_init_index_search(FT_INFO *ftb) ...@@ -297,7 +297,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
if (ftbw->flags & FTB_FLAG_TRUNC) if (ftbw->flags & FTB_FLAG_TRUNC)
{ {
/* /*
special treatment for truncation operator special treatment for truncation operator
1. there are some (besides this) +words 1. there are some (besides this) +words
| no need to search in the index, it can never ADD new rows | no need to search in the index, it can never ADD new rows
| to the result, and to remove half-matched rows we do scan anyway | to the result, and to remove half-matched rows we do scan anyway
...@@ -348,7 +348,7 @@ static void _ftb_init_index_search(FT_INFO *ftb) ...@@ -348,7 +348,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query, FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
uint query_len) uint query_len)
{ {
FTB *ftb; FTB *ftb;
FTB_EXPR *ftbe; FTB_EXPR *ftbe;
...@@ -419,7 +419,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0, ...@@ -419,7 +419,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0,
while (p0 < e0) while (p0 < e0)
{ {
while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] != while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] !=
cs->to_upper[(uint) (uchar) *s1]) cs->to_upper[(uint) (uchar) *s1])
/* no-op */; /* no-op */;
if (p0 >= e0) if (p0 >= e0)
return 0; return 0;
...@@ -429,7 +429,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0, ...@@ -429,7 +429,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0,
p1=s1+1; p1=s1+1;
while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] == while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] ==
cs->to_upper[(uint) (uchar) *p1]) cs->to_upper[(uint) (uchar) *p1])
p0++, p1++; p0++, p1++;
if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0]))) if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0])))
return 1; return 1;
...@@ -487,12 +487,12 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_ ...@@ -487,12 +487,12 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_
if (yn & FTB_FLAG_NO) if (yn & FTB_FLAG_NO)
{ {
/* /*
NOTE: special sort function of queue assures that all NOTE: special sort function of queue assures that all
(yn & FTB_FLAG_NO) != 0 (yn & FTB_FLAG_NO) != 0
events for every particular subexpression will events for every particular subexpression will
"auto-magically" happen BEFORE all the "auto-magically" happen BEFORE all the
(yn & FTB_FLAG_YES) != 0 events. So no (yn & FTB_FLAG_YES) != 0 events. So no
already matched expression can become not-matched again. already matched expression can become not-matched again.
*/ */
++ftbe->nos; ++ftbe->nos;
break; break;
...@@ -500,7 +500,7 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_ ...@@ -500,7 +500,7 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_
else else
{ {
if (ftbe->ythresh) if (ftbe->ythresh)
weight/=3; weight/=3;
ftbe->cur_weight += weight; ftbe->cur_weight += weight;
if ((int) ftbe->yesses < ythresh) if ((int) ftbe->yesses < ythresh)
break; break;
...@@ -535,8 +535,8 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) ...@@ -535,8 +535,8 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
ftb->queue.first_cmp_arg=(void *)&curdoc; ftb->queue.first_cmp_arg=(void *)&curdoc;
while (ftb->state == INDEX_SEARCH && while (ftb->state == INDEX_SEARCH &&
(curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) != (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) !=
HA_POS_ERROR) HA_POS_ERROR)
{ {
while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0]) while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0])
{ {
...@@ -554,7 +554,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) ...@@ -554,7 +554,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
/* curdoc matched ! */ /* curdoc matched ! */
if (is_tree_inited(&ftb->no_dupes) && if (is_tree_inited(&ftb->no_dupes) &&
tree_insert(&ftb->no_dupes, &curdoc, 0, tree_insert(&ftb->no_dupes, &curdoc, 0,
ftb->no_dupes.custom_arg)->count >1) ftb->no_dupes.custom_arg)->count >1)
/* but it managed already to get past this line once */ /* but it managed already to get past this line once */
continue; continue;
......
...@@ -93,27 +93,30 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end, ...@@ -93,27 +93,30 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
for (;doc<end;doc++) for (;doc<end;doc++)
{ {
if (true_word_char(cs,*doc)) break; if (true_word_char(cs,*doc)) break;
if (*doc == FTB_RQUOT && param->quot) { if (*doc == FTB_RQUOT && param->quot)
{
param->quot=doc; param->quot=doc;
*start=doc+1; *start=doc+1;
return 3; /* FTB_RBR */ return 3; /* FTB_RBR */
} }
if ((*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT) if (!param->quot)
&& !param->quot)
{
/* param->prev=' '; */
*start=doc+1;
if (*doc == FTB_LQUOT) param->quot=*start;
return (*doc == FTB_RBR)+2;
}
if (param->prev == ' ' && !param->quot)
{ {
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else if (*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT)
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else {
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else /* param->prev=' '; */
if (*doc == FTB_INC ) { param->plusminus++; continue; } else *start=doc+1;
if (*doc == FTB_DEC ) { param->plusminus--; continue; } else if (*doc == FTB_LQUOT) param->quot=*start;
if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; } return (*doc == FTB_RBR)+2;
}
if (param->prev == ' ')
{
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else
if (*doc == FTB_INC ) { param->plusminus++; continue; } else
if (*doc == FTB_DEC ) { param->plusminus--; continue; } else
if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; }
}
} }
param->prev=*doc; param->prev=*doc;
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0); param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
...@@ -139,6 +142,11 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end, ...@@ -139,6 +142,11 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
return 1; return 1;
} }
} }
if (param->quot)
{
param->quot=*start=doc;
return 3; /* FTB_RBR */
}
return 0; return 0;
} }
......
...@@ -213,7 +213,7 @@ ERROR 42000: You have an error in your SQL syntax. Check the manual that corres ...@@ -213,7 +213,7 @@ ERROR 42000: You have an error in your SQL syntax. Check the manual that corres
create table t1 (a int); create table t1 (a int);
insert into t1 values (1),(2),(3); insert into t1 values (1),(2),(3);
update (select * from t1) as t1 set a = 5; update (select * from t1) as t1 set a = 5;
ERROR HY000: The target table t1 of the UPDATE is not updatable. ERROR HY000: The target table t1 of the UPDATE is not updatable
delete from (select * from t1); delete from (select * from t1);
ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(select * from t1)' at line 1 ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(select * from t1)' at line 1
insert into (select * from t1) values (5); insert into (select * from t1) values (5);
...@@ -264,7 +264,7 @@ N M ...@@ -264,7 +264,7 @@ N M
2 2 2 2
3 0 3 0
UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2, P2.N = 2; UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2, P2.N = 2;
ERROR HY000: The target table P2 of the UPDATE is not updatable. ERROR HY000: The target table P2 of the UPDATE is not updatable
UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2; UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
ERROR 42S22: Unknown column 'aaaa' in 'field list' ERROR 42S22: Unknown column 'aaaa' in 'field list'
delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
...@@ -272,7 +272,7 @@ select * from t1; ...@@ -272,7 +272,7 @@ select * from t1;
N M N M
3 0 3 0
delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
ERROR HY000: The target table P2 of the DELETE is not updatable. ERROR HY000: The target table P2 of the DELETE is not updatable
delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
ERROR 42S22: Unknown column 'aaa' in 'field list' ERROR 42S22: Unknown column 'aaa' in 'field list'
drop table t1; drop table t1;
......
...@@ -140,6 +140,9 @@ select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE); ...@@ -140,6 +140,9 @@ select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
a b a b
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
a b a b
select * from t1 where MATCH a,b AGAINST('"space model' IN BOOLEAN MODE);
a b
Full-text search in MySQL implements vector space model
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE); select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
a b a b
Full-text search in MySQL implements vector space model Full-text search in MySQL implements vector space model
......
...@@ -125,11 +125,11 @@ Warning 1265 Using storage engine MyISAM for table 't1' ...@@ -125,11 +125,11 @@ Warning 1265 Using storage engine MyISAM for table 't1'
drop table t1; drop table t1;
create table t1 (id int) type=heap; create table t1 (id int) type=heap;
Warnings: Warnings:
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead. Warning 1286 'TYPE=storage_engine' is deprecated, use 'ENGINE=storage_engine' instead
alter table t1 type=myisam; alter table t1 type=myisam;
Warnings: Warnings:
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead. Warning 1286 'TYPE=storage_engine' is deprecated, use 'ENGINE=storage_engine' instead
drop table t1; drop table t1;
set table_type=MYISAM; set table_type=MYISAM;
Warnings: Warnings:
Warning 1286 'table_type' is deprecated. Use 'storage_engine' instead. Warning 1286 'table_type' is deprecated, use 'storage_engine' instead
...@@ -64,6 +64,10 @@ select * from t1 where MATCH a,b AGAINST ('"text search" +"now support"' IN BOOL ...@@ -64,6 +64,10 @@ select * from t1 where MATCH a,b AGAINST ('"text search" +"now support"' IN BOOL
select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
# bug#2708 crash
select * from t1 where MATCH a,b AGAINST('"space model' IN BOOLEAN MODE);
# boolean w/o index: # boolean w/o index:
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE); select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
......
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