Merge olga.mysql.com:/home/igor/mysql-5.0-opt
into olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug26963
This commit is contained in:
commit
d0a6231201
@ -3942,4 +3942,42 @@ cc cc 7
|
|||||||
aa aa 2
|
aa aa 2
|
||||||
aa aa 2
|
aa aa 2
|
||||||
DROP TABLE t1,t2;
|
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
|
End of 5.0 tests
|
||||||
|
@ -3308,4 +3308,51 @@ SELECT * FROM t1 LEFT JOIN t2 ON t1.name=t2.name;
|
|||||||
|
|
||||||
DROP TABLE t1,t2;
|
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
|
--echo End of 5.0 tests
|
||||||
|
15
sql/item.cc
15
sql/item.cc
@ -4075,7 +4075,9 @@ bool Item_field::set_no_const_sub(byte *arg)
|
|||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
The function returns a pointer to an item that is taken from
|
The function returns a pointer to an item that is taken from
|
||||||
the very beginning of the item_equal list which the Item_field
|
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
|
If the Item_field object does not refer any Item_equal object
|
||||||
'this' is returned
|
'this' is returned
|
||||||
|
|
||||||
@ -4084,7 +4086,8 @@ bool Item_field::set_no_const_sub(byte *arg)
|
|||||||
of the thransformer method.
|
of the thransformer method.
|
||||||
|
|
||||||
RETURN VALUES
|
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.
|
this - otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -4092,6 +4095,14 @@ Item *Item_field::replace_equal_field(byte *arg)
|
|||||||
{
|
{
|
||||||
if (item_equal)
|
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();
|
Item_field *subst= item_equal->get_first();
|
||||||
if (subst && !field->eq(subst->field))
|
if (subst && !field->eq(subst->field))
|
||||||
return subst;
|
return subst;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user