mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
finally proper recursive descent for parsing expressions with MATCH ... AGAINST in add_ft_keys()
This commit is contained in:
@ -5,9 +5,6 @@ INSERT INTO t1 VALUES('MySQL has now support', 'for full-text search'),
|
|||||||
('Only MyISAM tables','support collections'),
|
('Only MyISAM tables','support collections'),
|
||||||
('Function MATCH ... AGAINST()','is used to do a search'),
|
('Function MATCH ... AGAINST()','is used to do a search'),
|
||||||
('Full-text search in MySQL', 'implements vector space model');
|
('Full-text search in MySQL', 'implements vector space model');
|
||||||
explain select * from t1 where MATCH(a,b) AGAINST ("collections");
|
|
||||||
table type possible_keys key key_len ref rows Extra
|
|
||||||
t1 fulltext a a 0 1 Using where
|
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("collections");
|
select * from t1 where MATCH(a,b) AGAINST ("collections");
|
||||||
a b
|
a b
|
||||||
Only MyISAM tables support collections
|
Only MyISAM tables support collections
|
||||||
@ -19,11 +16,36 @@ select * from t1 where MATCH(a,b) AGAINST ("indexes collections");
|
|||||||
a b
|
a b
|
||||||
Full-text indexes are called collections
|
Full-text indexes are called collections
|
||||||
Only MyISAM tables support collections
|
Only MyISAM tables support collections
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections");
|
||||||
a b
|
table type possible_keys key key_len ref rows Extra
|
||||||
Only MyISAM tables support collections
|
t1 fulltext a a 0 1 Using where
|
||||||
Full-text indexes are called collections
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>0;
|
||||||
Full-text indexes are called collections
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>1;
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>=0;
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 ALL NULL NULL NULL NULL 5 Using where
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>=1;
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where 0<MATCH(a,b) AGAINST ("collections");
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where 1<MATCH(a,b) AGAINST ("collections");
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where 0<=MATCH(a,b) AGAINST ("collections");
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 ALL NULL NULL NULL NULL 5 Using where
|
||||||
|
explain select * from t1 where 1<=MATCH(a,b) AGAINST ("collections");
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>0 and a like '%ll%';
|
||||||
|
table type possible_keys key key_len ref rows Extra
|
||||||
|
t1 fulltext a a 0 1 Using where
|
||||||
select * from t1 where MATCH(a,b) AGAINST("support -collections" IN BOOLEAN MODE);
|
select * from t1 where MATCH(a,b) AGAINST("support -collections" IN BOOLEAN MODE);
|
||||||
a b
|
a b
|
||||||
MySQL has now support for full-text search
|
MySQL has now support for full-text search
|
||||||
@ -98,6 +120,11 @@ select * from t1 where MATCH b AGAINST ("sear*" IN BOOLEAN MODE);
|
|||||||
a b
|
a b
|
||||||
MySQL has now support for full-text search
|
MySQL has now support for full-text search
|
||||||
Function MATCH ... AGAINST() is used to do a search
|
Function MATCH ... AGAINST() is used to do a search
|
||||||
|
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
||||||
|
a b
|
||||||
|
Only MyISAM tables support collections
|
||||||
|
Full-text indexes are called collections
|
||||||
|
Full-text indexes are called collections
|
||||||
delete from t1 where a like "MySQL%";
|
delete from t1 where a like "MySQL%";
|
||||||
update t1 set a='some test foobar' where MATCH a,b AGAINST ('model');
|
update t1 set a='some test foobar' where MATCH a,b AGAINST ('model');
|
||||||
delete from t1 where MATCH(a,b) AGAINST ("indexes");
|
delete from t1 where MATCH(a,b) AGAINST ("indexes");
|
||||||
|
@ -12,14 +12,24 @@ INSERT INTO t1 VALUES('MySQL has now support', 'for full-text search'),
|
|||||||
('Full-text search in MySQL', 'implements vector space model');
|
('Full-text search in MySQL', 'implements vector space model');
|
||||||
|
|
||||||
# nl search
|
# nl search
|
||||||
|
|
||||||
explain select * from t1 where MATCH(a,b) AGAINST ("collections");
|
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("collections");
|
select * from t1 where MATCH(a,b) AGAINST ("collections");
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("indexes collections");
|
select * from t1 where MATCH(a,b) AGAINST ("indexes collections");
|
||||||
|
|
||||||
# UNION of fulltext's
|
|
||||||
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
# add_ft_keys() tests
|
||||||
|
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections");
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>0;
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>1;
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>=0;
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>=1;
|
||||||
|
explain select * from t1 where 0<MATCH(a,b) AGAINST ("collections");
|
||||||
|
explain select * from t1 where 1<MATCH(a,b) AGAINST ("collections");
|
||||||
|
explain select * from t1 where 0<=MATCH(a,b) AGAINST ("collections");
|
||||||
|
explain select * from t1 where 1<=MATCH(a,b) AGAINST ("collections");
|
||||||
|
explain select * from t1 where MATCH(a,b) AGAINST ("collections")>0 and a like '%ll%';
|
||||||
|
|
||||||
# boolean search
|
# boolean search
|
||||||
|
|
||||||
@ -48,6 +58,10 @@ select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
|
|||||||
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
||||||
select * from t1 where MATCH b AGAINST ("sear*" IN BOOLEAN MODE);
|
select * from t1 where MATCH b AGAINST ("sear*" IN BOOLEAN MODE);
|
||||||
|
|
||||||
|
# UNION of fulltext's
|
||||||
|
|
||||||
|
select * from t1 where MATCH(a,b) AGAINST ("collections") UNION ALL select * from t1 where MATCH(a,b) AGAINST ("indexes");
|
||||||
|
|
||||||
#update/delete with fulltext index
|
#update/delete with fulltext index
|
||||||
|
|
||||||
delete from t1 where a like "MySQL%";
|
delete from t1 where a like "MySQL%";
|
||||||
|
@ -1676,26 +1676,13 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
|
|||||||
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
|
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
|
||||||
{
|
{
|
||||||
Item *item;
|
Item *item;
|
||||||
/*
|
|
||||||
I'm (Sergei) too lazy to implement proper recursive descent here,
|
|
||||||
and anyway, nobody will use such a stupid queries
|
|
||||||
that will require it :-)
|
|
||||||
May be later...
|
|
||||||
*/
|
|
||||||
while ((item=li++))
|
while ((item=li++))
|
||||||
{
|
add_ft_keys(keyuse_array,stat,item,usable_tables);
|
||||||
if (item->type() == Item::FUNC_ITEM &&
|
|
||||||
((Item_func *)item)->functype() == Item_func::FT_FUNC)
|
|
||||||
{
|
|
||||||
cond_func=(Item_func_match *)item;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!cond_func || cond_func->key == NO_SUCH_KEY) ||
|
if (!cond_func || cond_func->key == NO_SUCH_KEY ||
|
||||||
(!(usable_tables & cond_func->table->map)))
|
!(usable_tables & cond_func->table->map))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
KEYUSE keyuse;
|
KEYUSE keyuse;
|
||||||
@ -1707,7 +1694,6 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
|
|||||||
VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
|
VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sort_keyuse(KEYUSE *a,KEYUSE *b)
|
sort_keyuse(KEYUSE *a,KEYUSE *b)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user