Commit 50323800 authored by Evgeny Potemkin's avatar Evgeny Potemkin

Bug#46051: Incorrectly market field caused wrong result.

When during the optimization an item is moved to the upper select
the item's context left unchanged. This caused wrong result in the 
PS/SP mode.
The Item_ident::remove_dependence_processor now sets the context
of the select to which the item is moved to.

mysql-test/r/subselect.result:
  The test case for the bug#46051 is adjusted.
mysql-test/t/subselect.test:
  The test case for the bug#46051 is adjusted.
sql/item.cc:
  Bug#46051: Incorrectly market field caused wrong result.
  The Item_ident::remove_dependence_processor now sets the context
  of the select to which the item is moved to.
parent 63e6a59d
...@@ -4472,10 +4472,6 @@ int_nokey int_key ...@@ -4472,10 +4472,6 @@ int_nokey int_key
EXPLAIN EXTENDED SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`); EXPLAIN EXTENDED SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY C ALL NULL NULL NULL NULL 20 Using where 1 PRIMARY C ALL NULL NULL NULL NULL 20 Using where
Warnings:
Note 1276 Field or reference 'test.C.int_nokey' of SELECT #2 was resolved in SELECT #1
Note 1249 Select 2 was reduced during optimization
Note 1003 select `test`.`C`.`int_nokey` AS `int_nokey`,`test`.`C`.`int_key` AS `int_key` from `test`.`C` where (`test`.`C`.`int_nokey` = `test`.`C`.`int_key`)
DROP TABLE C; DROP TABLE C;
# End of test for bug#45061. # End of test for bug#45061.
End of 5.0 tests. End of 5.0 tests.
...@@ -3441,8 +3441,10 @@ INSERT INTO `C` VALUES (9,9), (0,0), (8,6), (3,6), (7,6), (0,4), ...@@ -3441,8 +3441,10 @@ INSERT INTO `C` VALUES (9,9), (0,0), (8,6), (3,6), (7,6), (0,4),
(1,7), (9,4), (0,8), (9,4), (0,7), (5,5), (0,0), (8,5), (8,7), (1,7), (9,4), (0,8), (9,4), (0,7), (5,5), (0,0), (8,5), (8,7),
(5,2), (1,8), (7,0), (0,9), (9,5); (5,2), (1,8), (7,0), (0,9), (9,5);
--disable_warnings
SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`); SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`);
EXPLAIN EXTENDED SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`); EXPLAIN EXTENDED SELECT * FROM C WHERE `int_key` IN (SELECT `int_nokey`);
--enable_warnings
DROP TABLE C; DROP TABLE C;
--echo # End of test for bug#45061. --echo # End of test for bug#45061.
......
...@@ -598,6 +598,7 @@ bool Item_ident::remove_dependence_processor(byte * arg) ...@@ -598,6 +598,7 @@ bool Item_ident::remove_dependence_processor(byte * arg)
DBUG_ENTER("Item_ident::remove_dependence_processor"); DBUG_ENTER("Item_ident::remove_dependence_processor");
if (depended_from == (st_select_lex *) arg) if (depended_from == (st_select_lex *) arg)
depended_from= 0; depended_from= 0;
context= &((st_select_lex *) arg)->context;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment