Loading mysql-test/r/select.result +38 −0 Original line number Diff line number Diff line Loading @@ -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 mysql-test/t/select.test +47 −0 Original line number Diff line number Diff line Loading @@ -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 sql/item.cc +13 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. */ Loading @@ -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; Loading Loading
mysql-test/r/select.result +38 −0 Original line number Diff line number Diff line Loading @@ -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
mysql-test/t/select.test +47 −0 Original line number Diff line number Diff line Loading @@ -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
sql/item.cc +13 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. */ Loading @@ -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; Loading