diff options
author | serg@serg.mylan <> | 2004-02-15 20:36:12 +0100 |
---|---|---|
committer | serg@serg.mylan <> | 2004-02-15 20:36:12 +0100 |
commit | 15249d6a72a101c44861b5654a081d14688cdc3e (patch) | |
tree | 304adc3ec45054065c6b77d3b55083cadf7a0fd0 | |
parent | 03ffb63f0803d19746dd72356c74c96a46f83aba (diff) | |
download | mariadb-git-15249d6a72a101c44861b5654a081d14688cdc3e.tar.gz |
bug#2708
test results updated
-rw-r--r-- | myisam/ft_boolean_search.c | 48 | ||||
-rw-r--r-- | myisam/ft_parser.c | 40 | ||||
-rw-r--r-- | mysql-test/r/derived.result | 6 | ||||
-rw-r--r-- | mysql-test/r/fulltext.result | 3 | ||||
-rw-r--r-- | mysql-test/r/warnings.result | 6 | ||||
-rw-r--r-- | mysql-test/t/fulltext.test | 4 |
6 files changed, 61 insertions, 46 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 8cbb7a71a43..447744b0521 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -61,12 +61,12 @@ typedef struct st_ftb_expr FTB_EXPR; struct st_ftb_expr { FTB_EXPR *up; - my_off_t docid[2]; + uint flags; /* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */ + my_off_t docid[2]; float weight; float cur_weight; byte *quot, *qend; - uint flags; uint yesses; /* number of "yes" words matched */ uint nos; /* number of "no" words matched */ uint ythresh; /* number of "yes" words in expr */ @@ -76,13 +76,13 @@ struct st_ftb_expr typedef struct st_ftb_word { FTB_EXPR *up; - MI_KEYDEF *keyinfo; - my_off_t docid[2]; /* for index search and for scan */ + uint flags; /* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */ + my_off_t docid[2]; /* for index search and for scan */ my_off_t key_root; + MI_KEYDEF *keyinfo; float weight; uint ndepth; - uint flags; uint len; uchar off; byte word[1]; @@ -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)), - const void *a,const void *b) + const void *a,const void *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) if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0) { /* - This word MUST BE present in every document returned, - so we can stop the search right now - */ + This word MUST BE present in every document returned, + so we can stop the search right now + */ ftb->state=INDEX_DONE; return 1; /* search is done */ } @@ -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 */ _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->keyinfo=info->s->keyinfo+ftb->keynr; ftbw->off=0; @@ -297,7 +297,7 @@ static void _ftb_init_index_search(FT_INFO *ftb) if (ftbw->flags & FTB_FLAG_TRUNC) { /* - special treatment for truncation operator + special treatment for truncation operator 1. there are some (besides this) +words | 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 @@ -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, - uint query_len) + uint query_len) { FTB *ftb; FTB_EXPR *ftbe; @@ -419,7 +419,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0, while (p0 < e0) { while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] != - cs->to_upper[(uint) (uchar) *s1]) + cs->to_upper[(uint) (uchar) *s1]) /* no-op */; if (p0 >= e0) return 0; @@ -429,7 +429,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0, p1=s1+1; 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++; if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0]))) return 1; @@ -487,12 +487,12 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_ if (yn & FTB_FLAG_NO) { /* - NOTE: special sort function of queue assures that all - (yn & FTB_FLAG_NO) != 0 - events for every particular subexpression will - "auto-magically" happen BEFORE all the - (yn & FTB_FLAG_YES) != 0 events. So no - already matched expression can become not-matched again. + NOTE: special sort function of queue assures that all + (yn & FTB_FLAG_NO) != 0 + events for every particular subexpression will + "auto-magically" happen BEFORE all the + (yn & FTB_FLAG_YES) != 0 events. So no + already matched expression can become not-matched again. */ ++ftbe->nos; break; @@ -500,7 +500,7 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_ else { if (ftbe->ythresh) - weight/=3; + weight/=3; ftbe->cur_weight += weight; if ((int) ftbe->yesses < ythresh) break; @@ -535,8 +535,8 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) ftb->queue.first_cmp_arg=(void *)&curdoc; while (ftb->state == INDEX_SEARCH && - (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) != - HA_POS_ERROR) + (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) != + HA_POS_ERROR) { 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) /* curdoc matched ! */ if (is_tree_inited(&ftb->no_dupes) && 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 */ continue; diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c index 0318bcbed10..f68bf3f030c 100644 --- a/myisam/ft_parser.c +++ b/myisam/ft_parser.c @@ -93,27 +93,30 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end, for (;doc<end;doc++) { if (true_word_char(cs,*doc)) break; - if (*doc == FTB_RQUOT && param->quot) { + if (*doc == FTB_RQUOT && param->quot) + { param->quot=doc; *start=doc+1; return 3; /* FTB_RBR */ } - if ((*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT) - && !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 (!param->quot) { - 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; } + if (*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT) + { + /* param->prev=' '; */ + *start=doc+1; + if (*doc == FTB_LQUOT) param->quot=*start; + 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->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0); @@ -139,6 +142,11 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end, return 1; } } + if (param->quot) + { + param->quot=*start=doc; + return 3; /* FTB_RBR */ + } return 0; } diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 049d88c5154..be743be386b 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -213,7 +213,7 @@ ERROR 42000: You have an error in your SQL syntax. Check the manual that corres create table t1 (a int); insert into t1 values (1),(2),(3); 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); 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); @@ -264,7 +264,7 @@ N M 2 2 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; -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; 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; @@ -272,7 +272,7 @@ select * from t1; N M 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; -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; ERROR 42S22: Unknown column 'aaa' in 'field list' drop table t1; diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 04c36f059e2..16aae989d2b 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -140,6 +140,9 @@ select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE); a b select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); 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); a b Full-text search in MySQL implements vector space model diff --git a/mysql-test/r/warnings.result b/mysql-test/r/warnings.result index b675d189d30..a4620701d91 100644 --- a/mysql-test/r/warnings.result +++ b/mysql-test/r/warnings.result @@ -125,11 +125,11 @@ Warning 1265 Using storage engine MyISAM for table 't1' drop table t1; create table t1 (id int) type=heap; 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; 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; set table_type=MYISAM; Warnings: -Warning 1286 'table_type' is deprecated. Use 'storage_engine' instead. +Warning 1286 'table_type' is deprecated, use 'storage_engine' instead diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 02ada3dc8cb..e24eb353cb3 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -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 ('"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: select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE); |