Commit e95357d7 authored by unknown's avatar unknown
Browse files

Merge svojtovich@bk-internal.mysql.com:/home/bk/mysql-5.0-engines

into  mysql.com:/home/svoj/devel/mysql/BUG25729/mysql-5.0-engines


sql/item_func.cc:
  Auto merged
parents 55b096b8 3c763afc
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -90,3 +90,10 @@ id link name relevance
1	1	string	0
2	0	string	0
DROP TABLE t1,t2;
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (b INT, c TEXT, KEY(b));
INSERT INTO t1 VALUES(1);
INSERT INTO t2(b,c) VALUES(2,'castle'),(3,'castle');
SELECT * FROM t1 LEFT JOIN t2 ON a=b WHERE MATCH(c) AGAINST('+castle' IN BOOLEAN MODE);
a	b	c
DROP TABLE t1, t2;
+11 −0
Original line number Diff line number Diff line
@@ -87,3 +87,14 @@ SELECT t1.*, MATCH(t1.name) AGAINST('string') AS relevance
DROP TABLE t1,t2;

# End of 4.1 tests

#
# BUG#25729 - boolean full text search is confused by NULLs produced by LEFT
#             JOIN
#
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (b INT, c TEXT, KEY(b));
INSERT INTO t1 VALUES(1);
INSERT INTO t2(b,c) VALUES(2,'castle'),(3,'castle');
SELECT * FROM t1 LEFT JOIN t2 ON a=b WHERE MATCH(c) AGAINST('+castle' IN BOOLEAN MODE);
DROP TABLE t1, t2;
+4 −4
Original line number Diff line number Diff line
@@ -4615,14 +4615,14 @@ void Item_func_match::init_search(bool no_order)
    fields.push_back(new Item_string(" ",1, cmp_collation.collation));
    for (uint i=1; i < arg_count; i++)
      fields.push_back(args[i]);
    concat=new Item_func_concat_ws(fields);
    concat_ws=new Item_func_concat_ws(fields);
    /*
      Above function used only to get value and do not need fix_fields for it:
      Item_string - basic constant
      fields - fix_fields() was already called for this arguments
      Item_func_concat_ws - do not need fix_fields() to produce value
    */
    concat->quick_fix_field();
    concat_ws->quick_fix_field();
  }

  if (master)
@@ -4837,8 +4837,8 @@ double Item_func_match::val_real()

  if (key == NO_SUCH_KEY)
  {
    String *a= concat->val_str(&value);
    if ((null_value= (a == 0)))
    String *a= concat_ws->val_str(&value);
    if ((null_value= (a == 0)) || !a->length())
      DBUG_RETURN(0);
    DBUG_RETURN(ft_handler->please->find_relevance(ft_handler,
				      (byte *)a->ptr(), a->length()));
+4 −4
Original line number Diff line number Diff line
@@ -1308,12 +1308,12 @@ class Item_func_match :public Item_real_func
  FT_INFO *ft_handler;
  TABLE *table;
  Item_func_match *master;   // for master-slave optimization
  Item *concat;              // Item_func_concat_ws
  String value;              // value of concat
  Item *concat_ws;           // Item_func_concat_ws
  String value;              // value of concat_ws
  String search_value;       // key_item()'s value converted to cmp_collation

  Item_func_match(List<Item> &a, uint b): Item_real_func(a), key(0), flags(b),
       join_key(0), ft_handler(0), table(0), master(0), concat(0) { }
       join_key(0), ft_handler(0), table(0), master(0), concat_ws(0) { }
  void cleanup()
  {
    DBUG_ENTER("Item_func_match");
@@ -1321,7 +1321,7 @@ class Item_func_match :public Item_real_func
    if (!master && ft_handler)
      ft_handler->please->close_search(ft_handler);
    ft_handler= 0;
    concat= 0;
    concat_ws= 0;
    DBUG_VOID_RETURN;
  }
  enum Functype functype() const { return FT_FUNC; }