Commit ed80fe2d authored by unknown's avatar unknown
Browse files

Merge olga.mysql.com:/home/igor/mysql-5.0-opt

into  olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug26963


mysql-test/r/select.result:
  Auto merged
mysql-test/t/select.test:
  Auto merged
parents 91abf15e 13c05162
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -3942,4 +3942,42 @@ cc cc 7
aa  	aa	2
aa	aa	2
DROP TABLE t1,t2;
CREATE TABLE t1 (
access_id int NOT NULL default '0',
name varchar(20) default NULL,
rank int NOT NULL default '0',
KEY idx (access_id)
);
CREATE TABLE t2 (
faq_group_id int NOT NULL default '0',
faq_id int NOT NULL default '0',
access_id int default NULL,
UNIQUE KEY idx1 (faq_id),
KEY idx2 (faq_group_id,faq_id)
);
INSERT INTO t1 VALUES 
(1,'Everyone',2),(2,'Help',3),(3,'Technical Support',1),(4,'Chat User',4);
INSERT INTO t2 VALUES
(261,265,1),(490,494,1);
SELECT t2.faq_id 
FROM t1 INNER JOIN t2 IGNORE INDEX (idx1)
ON (t1.access_id = t2.access_id)
LEFT JOIN t2 t
ON (t.faq_group_id = t2.faq_group_id AND
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
WHERE
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
faq_id
265
SELECT t2.faq_id 
FROM t1 INNER JOIN t2
ON (t1.access_id = t2.access_id)
LEFT JOIN t2 t
ON (t.faq_group_id = t2.faq_group_id AND
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
WHERE
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
faq_id
265
DROP TABLE t1,t2;
End of 5.0 tests
+47 −0
Original line number Diff line number Diff line
@@ -3308,4 +3308,51 @@ SELECT * FROM t1 LEFT JOIN t2 ON t1.name=t2.name;

DROP TABLE t1,t2;


#
# Bug #26963: join with predicates that contain fields from equalities evaluated
#             to constants after constant table substitution
#

CREATE TABLE t1 (
 access_id int NOT NULL default '0',
 name varchar(20) default NULL,
 rank int NOT NULL default '0',
 KEY idx (access_id)
);

CREATE TABLE t2 (
  faq_group_id int NOT NULL default '0',
  faq_id int NOT NULL default '0',
  access_id int default NULL,
  UNIQUE KEY idx1 (faq_id),
  KEY idx2 (faq_group_id,faq_id)
);

INSERT INTO t1 VALUES 
  (1,'Everyone',2),(2,'Help',3),(3,'Technical Support',1),(4,'Chat User',4);
INSERT INTO t2 VALUES
  (261,265,1),(490,494,1);


SELECT t2.faq_id 
  FROM t1 INNER JOIN t2 IGNORE INDEX (idx1)
       ON (t1.access_id = t2.access_id)
       LEFT JOIN t2 t
       ON (t.faq_group_id = t2.faq_group_id AND
           find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
   WHERE
     t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);

SELECT t2.faq_id 
  FROM t1 INNER JOIN t2
       ON (t1.access_id = t2.access_id)
       LEFT JOIN t2 t
       ON (t.faq_group_id = t2.faq_group_id AND
           find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
   WHERE
     t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);

DROP TABLE t1,t2;

--echo End of 5.0 tests
+13 −2
Original line number Diff line number Diff line
@@ -4075,7 +4075,9 @@ bool Item_field::set_no_const_sub(byte *arg)
  DESCRIPTION
    The function returns a pointer to an item that is taken from
    the very beginning of the item_equal list which the Item_field
    object refers to (belongs to).  
    object refers to (belongs to) unless item_equal contains  a constant
    item. In this case the function returns this constant item, 
    (if the substitution does not require conversion).   
    If the Item_field object does not refer any Item_equal object
    'this' is returned 

@@ -4084,7 +4086,8 @@ bool Item_field::set_no_const_sub(byte *arg)
    of the thransformer method.  

  RETURN VALUES
    pointer to a replacement Item_field if there is a better equal item;
    pointer to a replacement Item_field if there is a better equal item or
    a pointer to a constant equal item;
    this - otherwise.
*/

@@ -4092,6 +4095,14 @@ Item *Item_field::replace_equal_field(byte *arg)
{
  if (item_equal)
  {
    Item *const_item= item_equal->get_const();
    if (const_item)
    {
      if (cmp_context != (Item_result)-1 &&
          const_item->cmp_context != cmp_context)
        return this;
      return const_item;
    }
    Item_field *subst= item_equal->get_first();
    if (subst && !field->eq(subst->field))
      return subst;