mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
Bug#46051: Incorrectly market field caused wrong result.
In a subselect all fields from outer selects are marked as dependent on selects they are belong to. In some cases optimizer substitutes it for an equivalent expression. For example "a_field IN (SELECT outer_field)" is substituted with "a_field = outer_field". As we moved the outer_field to the upper select it's not really outer anymore. But it was left marked as outer. If exists an index over a_field optimizer choose wrong execution plan and thus return wrong result. Now the Item_in_subselect::single_value_transformer function removes dependent marking from fields when a subselect is optimized away. mysql-test/r/subselect.result: Added a test case for the bug#46051. mysql-test/t/subselect.test: Added a test case for the bug#46051. sql/item_subselect.cc: Bug#46051: Incorrectly market field caused wrong result. Now the Item_in_subselect::single_value_transformer function removes dependent marking from fields when a subselect is optimized away.
This commit is contained in:
parent
924c8c5bfb
commit
63e6a59d73
3 changed files with 50 additions and 0 deletions
|
|
@ -1145,6 +1145,10 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
else
|
||||
{
|
||||
// it is single select without tables => possible optimization
|
||||
// remove the dependence mark since the item is moved to upper
|
||||
// select and is not outer anymore.
|
||||
item->walk(&Item::remove_dependence_processor,
|
||||
(byte *) select_lex->outer_select());
|
||||
item= func->create(left_expr, item);
|
||||
// fix_field of item will be done in time of substituting
|
||||
substitution= item;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue