Commit c0bcf503 authored by unknown's avatar unknown
Browse files

Fix for BUG#11869: In Item_func_match::fix_index() handle the case when there is no

  source table present (this happens for ORDER BY after UNION)


mysql-test/r/fulltext_order_by.result:
  Testcase for BUG#11869
mysql-test/t/fulltext_order_by.test:
  Testcase for BUG#11869
parent d91c901f
Loading
Loading
Loading
Loading
+74 −0
Original line number Diff line number Diff line
@@ -86,3 +86,77 @@ a rel
1	1
2	2
drop table t1;
CREATE TABLE t1 (
id int(11) NOT NULL auto_increment,
thread int(11) NOT NULL default '0',
beitrag longtext NOT NULL,
PRIMARY KEY  (id),
KEY thread (thread),
FULLTEXT KEY beitrag (beitrag)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7923 ;
CREATE TABLE t2 (
id int(11) NOT NULL auto_increment,
text varchar(100) NOT NULL default '',
PRIMARY KEY  (id),
KEY text (text)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=63 ;
CREATE TABLE t3 (
id int(11) NOT NULL auto_increment,
forum int(11) NOT NULL default '0',
betreff varchar(70) NOT NULL default '',
PRIMARY KEY  (id),
KEY forum (forum),
FULLTEXT KEY betreff (betreff)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(b.betreff) against ('+abc' in boolean mode)
group by a.text, b.id, b.betreff
union
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(c.beitrag) against ('+abc' in boolean mode)
group by 
a.text, b.id, b.betreff
order by 
match(b.betreff) against ('+abc' in boolean mode) desc;
ERROR 42S02: Unknown table 'b' in order clause
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(b.betreff) against ('+abc' in boolean mode)
union
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(c.beitrag) against ('+abc' in boolean mode)
order by 
match(b.betreff) against ('+abc' in boolean mode) desc;
ERROR 42S02: Unknown table 'b' in order clause
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(b.betreff) against ('+abc' in boolean mode)
union
select a.text, b.id, b.betreff
from 
t2 a inner join t3 b on a.id = b.forum inner join
t1 c on b.id = c.thread
where 
match(c.beitrag) against ('+abc' in boolean mode)
order by 
match(betreff) against ('+abc' in boolean mode) desc;
text	id	betreff
drop table t1,t2,t3;
+81 −0
Original line number Diff line number Diff line
@@ -54,3 +54,84 @@ SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1;
SELECT a, MATCH (message) AGAINST ('t* f*' IN BOOLEAN MODE) as rel FROM t1 ORDER BY rel,a;
drop table t1;

# BUG#11869
CREATE TABLE t1 (
  id int(11) NOT NULL auto_increment,
  thread int(11) NOT NULL default '0',
  beitrag longtext NOT NULL,
  PRIMARY KEY  (id),
  KEY thread (thread),
  FULLTEXT KEY beitrag (beitrag)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7923 ;

CREATE TABLE t2 (
  id int(11) NOT NULL auto_increment,
  text varchar(100) NOT NULL default '',
  PRIMARY KEY  (id),
  KEY text (text)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=63 ;

CREATE TABLE t3 (
  id int(11) NOT NULL auto_increment,
  forum int(11) NOT NULL default '0',
  betreff varchar(70) NOT NULL default '',
  PRIMARY KEY  (id),
  KEY forum (forum),
  FULLTEXT KEY betreff (betreff)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;

--error 1109
select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(b.betreff) against ('+abc' in boolean mode)
group by a.text, b.id, b.betreff
union
select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(c.beitrag) against ('+abc' in boolean mode)
group by 
  a.text, b.id, b.betreff
order by 
  match(b.betreff) against ('+abc' in boolean mode) desc;
  
--error 1109
select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(b.betreff) against ('+abc' in boolean mode)
union
select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(c.beitrag) against ('+abc' in boolean mode)
order by 
  match(b.betreff) against ('+abc' in boolean mode) desc;

select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(b.betreff) against ('+abc' in boolean mode)
union
select a.text, b.id, b.betreff
from 
  t2 a inner join t3 b on a.id = b.forum inner join
  t1 c on b.id = c.thread
where 
  match(c.beitrag) against ('+abc' in boolean mode)
order by 
  match(betreff) against ('+abc' in boolean mode) desc;

drop table t1,t2,t3;
+3 −0
Original line number Diff line number Diff line
@@ -3197,6 +3197,9 @@ bool Item_func_match::fix_index()
  if (key == NO_SUCH_KEY)
    return 0;
  
  if (!table) 
    goto err;

  for (keynr=0 ; keynr < table->keys ; keynr++)
  {
    if ((table->key_info[keynr].flags & HA_FULLTEXT) &&