From 389a7c02860460968c84c642e6fe758a08b96c07 Mon Sep 17 00:00:00 2001 From: "serg@serg.mysql.com" <> Date: Tue, 17 Apr 2001 14:17:22 +0200 Subject: bugfix: HAVING MATCH --- mysql-test/r/fulltext.result | 4 ++++ mysql-test/t/fulltext.test | 10 +++++++++- sql/item.h | 2 +- sql/item_func.cc | 9 ++++++--- sql/sql_select.cc | 5 +++-- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index a616b09781f..e8a4d87f680 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -21,3 +21,7 @@ t2 CREATE TABLE `t2` ( FULLTEXT KEY `tix` (`inhalt`) ) TYPE=MyISAM ticket inhalt +ticket inhalt +3 foobar +ticket inhalt +3 foobar diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 6614a81a94c..064219c6ad3 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -42,7 +42,10 @@ ticket2.id = ttxt.ticket WHERE t1.id = ticket2.ticket and match(ttxt.inhalt) against ('foobar'); INSERT INTO t1 VALUES (3,3); -select t1.id FROM t2 as ttxt,t1 INNER JOIN t1 as ticket2 ON ticket2.id = ttxt.ticket WHERE t1.id = ticket2.ticket and match(ttxt.inhalt) against ('foobar'); +select t1.id FROM t2 as ttxt,t1 +INNER JOIN t1 as ticket2 ON ticket2.id = ttxt.ticket +WHERE t1.id = ticket2.ticket and + match(ttxt.inhalt) against ('foobar'); # Check that we get 'fulltext' index in SHOW CREATE @@ -53,4 +56,9 @@ show create table t2; select * from t2 where MATCH inhalt AGAINST (NULL); +# MATCH in HAVING (pretty useless, but still it should work) + +select * from t2 where MATCH inhalt AGAINST ('foobar'); +select * from t2 having MATCH inhalt AGAINST ('foobar'); + drop table t1,t2; diff --git a/sql/item.h b/sql/item.h index 8b9a645d39b..9ad633d9278 100644 --- a/sql/item.h +++ b/sql/item.h @@ -298,8 +298,8 @@ public: class Item_ref :public Item_ident { - Item **ref; public: + Item **ref; Item_ref(char *db_par,char *table_name_par,char *field_name_par) :Item_ident(db_par,table_name_par,field_name_par),ref(0) {} Item_ref(Item **item, char *table_name_par,char *field_name_par) diff --git a/sql/item_func.cc b/sql/item_func.cc index 6c4e3e34fe3..84bc972608e 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1961,12 +1961,15 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist) while ((item=li++)) { - if (item->type() != Item::FIELD_ITEM || item->fix_fields(thd,tlist) || - !item->used_tables()) + if (item->fix_fields(thd,tlist)) + return 1; + if (item->type() == Item::REF_ITEM) + li.replace(item= *((Item_ref *)item)->ref); + if (item->type() != Item::FIELD_ITEM || !item->used_tables()) return 1; used_tables_cache|=item->used_tables(); } - /* check that all columns comes from the same table */ + /* check that all columns come from the same table */ if (count_bits(used_tables_cache) != 1) return 1; const_item_cache=0; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index db95214cfa3..e726a9969ca 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -178,8 +178,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, setup_fields(thd,tables,fields,1,&all_fields) || setup_conds(thd,tables,&conds) || setup_order(thd,tables,fields,all_fields,order) || - setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields) || - setup_ftfuncs(thd,tables,ftfuncs)) + setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields)) DBUG_RETURN(-1); /* purecov: inspected */ if (having) @@ -191,6 +190,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (having->with_sum_func) having->split_sum_func(all_fields); } + if (setup_ftfuncs(thd,tables,ftfuncs)) /* should be after having->fix_fields */ + DBUG_RETURN(-1); /* Check if one one uses a not constant column with group functions and no GROUP BY. -- cgit v1.2.1