summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2004-05-10 12:39:01 +0200
committerunknown <serg@serg.mylan>2004-05-10 12:39:01 +0200
commit0bfea087af007309ce06d346ecfb0683a3d012e7 (patch)
treeaa63f206deb5fdf6e373750f990cbe8768ce3c53
parent2d776e36d8dd205efccc18a75292308fd4c5d385 (diff)
downloadmariadb-git-0bfea087af007309ce06d346ecfb0683a3d012e7.tar.gz
backport from 4.1:
"phrase search" should not match partial words (it should not match 'paraphrase searches')
-rw-r--r--myisam/ft_boolean_search.c29
-rw-r--r--myisam/ft_parser.c9
-rw-r--r--myisam/ftdefs.h5
-rw-r--r--mysql-test/r/fulltext.result3
-rw-r--r--mysql-test/t/fulltext.test1
5 files changed, 25 insertions, 22 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index d728c379ea5..61381f80783 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -360,25 +360,34 @@ err:
}
-/* returns 1 if str0 contain str1 */
+/* returns 1 if str0 ~= /\<str1\>/ */
static int _ftb_strstr(const byte *s0, const byte *e0,
const byte *s1, const byte *e1,
CHARSET_INFO *cs)
{
- const byte *p;
+ const byte *p0, *p1;
+ my_bool s_after, e_before;
- while (s0 < e0)
+ s_after=true_word_char(s1[0]);
+ e_before=true_word_char(e1[-1]);
+ p0=s0;
+
+ while (p0 < e0)
{
- while (s0 < e0 && cs->to_upper[(uint) (uchar) *s0++] !=
+ while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] !=
cs->to_upper[(uint) (uchar) *s1])
/* no-op */;
- if (s0 >= e0)
+ if (p0 >= e0)
return 0;
- p=s1+1;
- while (s0 < e0 && p < e1 && cs->to_upper[(uint) (uchar) *s0] ==
- cs->to_upper[(uint) (uchar) *p])
- s0++, p++;
- if (p >= e1)
+
+ if (s_after && p0-1 > s0 && true_word_char(p0[-2]))
+ continue;
+
+ p1=s1+1;
+ while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] ==
+ cs->to_upper[(uint) (uchar) *p1])
+ p0++, p1++;
+ if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(p0[0])))
return 1;
}
return 0;
diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c
index c25ed6022a0..f397660af6b 100644
--- a/myisam/ft_parser.c
+++ b/myisam/ft_parser.c
@@ -105,15 +105,6 @@ FT_WORD * ft_linearize(TREE *wtree)
DBUG_RETURN(wlist);
}
-#define true_word_char(X) (isalnum(X) || (X)=='_')
-#ifdef HYPHEN_IS_DELIM
-#define misc_word_char(X) ((X)=='\'')
-#else
-#define misc_word_char(X) ((X)=='\'' || (X)=='-')
-#endif
-#define word_char(X) (true_word_char(X) || misc_word_char(X))
-
-
/* returns:
* 0 - eof
* 1 - word found
diff --git a/myisam/ftdefs.h b/myisam/ftdefs.h
index 62fa4362e19..46acf60d796 100644
--- a/myisam/ftdefs.h
+++ b/myisam/ftdefs.h
@@ -22,8 +22,9 @@
#include <m_ctype.h>
#include <my_tree.h>
-#define HYPHEN_IS_DELIM
-#define HYPHEN_IS_CONCAT /* not used for now */
+#define true_word_char(X) (isalnum(X) || (X)=='_')
+#define misc_word_char(X) ((X)=='\'')
+#define word_char(X) (true_word_char(X) || misc_word_char(X))
#define COMPILE_STOPWORDS_IN
diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result
index 738941f63c7..baa3a834f6f 100644
--- a/mysql-test/r/fulltext.result
+++ b/mysql-test/r/fulltext.result
@@ -116,7 +116,8 @@ a b
MySQL has now support for full-text search
select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
a b
-Full-text indexes are called collections
+select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
+a b
select * from t1 where MATCH a,b AGAINST ('+(support collections) +foobar*' IN BOOLEAN MODE);
a b
select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE);
diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test
index 774a3b42619..86d2cde370a 100644
--- a/mysql-test/t/fulltext.test
+++ b/mysql-test/t/fulltext.test
@@ -52,6 +52,7 @@ select * from t1 where MATCH a,b AGAINST ('"text search" "now support"' IN BOOL
select * from t1 where MATCH a,b AGAINST ('"text search" -"now support"' IN BOOLEAN MODE);
select * from t1 where MATCH a,b AGAINST ('"text search" +"now support"' 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 ('+(support collections) +foobar*' IN BOOLEAN MODE);
select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE);