mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-24117: Memory management problem in statistics state for ... IN
Part#1: Revert the patch that caused it:
commit 291be49474
Author: Igor Babaev <igor@askmonty.org>
Date: Thu Sep 24 22:02:00 2020 -0700
MDEV-23811: With large number of indexes optimizer chooses an inefficient plan
This commit is contained in:
@ -1852,9 +1852,6 @@ SEL_ARG::SEL_ARG(SEL_ARG &arg) :Sql_alloc()
|
||||
next_key_part=arg.next_key_part;
|
||||
max_part_no= arg.max_part_no;
|
||||
use_count=1; elements=1;
|
||||
next= 0;
|
||||
if (next_key_part)
|
||||
++next_key_part->use_count;
|
||||
}
|
||||
|
||||
|
||||
@ -8872,15 +8869,9 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2)
|
||||
}
|
||||
bool no_imerge_from_ranges= FALSE;
|
||||
|
||||
SEL_TREE *rt1= tree1;
|
||||
SEL_TREE *rt2= tree2;
|
||||
/* Build the range part of the tree for the formula (1) */
|
||||
if (sel_trees_can_be_ored(param, tree1, tree2, &ored_keys))
|
||||
{
|
||||
if (no_merges1)
|
||||
rt1= new SEL_TREE(tree1, TRUE, param);
|
||||
if (no_merges2)
|
||||
rt2= new SEL_TREE(tree2, TRUE, param);
|
||||
bool must_be_ored= sel_trees_must_be_ored(param, tree1, tree2, ored_keys);
|
||||
no_imerge_from_ranges= must_be_ored;
|
||||
|
||||
@ -8938,6 +8929,12 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2)
|
||||
else if (!no_ranges1 && !no_ranges2 && !no_imerge_from_ranges)
|
||||
{
|
||||
/* Build the imerge part of the tree for the formula (1) */
|
||||
SEL_TREE *rt1= tree1;
|
||||
SEL_TREE *rt2= tree2;
|
||||
if (no_merges1)
|
||||
rt1= new SEL_TREE(tree1, TRUE, param);
|
||||
if (no_merges2)
|
||||
rt2= new SEL_TREE(tree2, TRUE, param);
|
||||
if (!rt1 || !rt2 ||
|
||||
result->merges.push_back(imerge_from_ranges) ||
|
||||
imerge_from_ranges->or_sel_tree(param, rt1) ||
|
||||
@ -9600,11 +9597,10 @@ key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1,SEL_ARG *key2)
|
||||
|
||||
if (!tmp->next_key_part)
|
||||
{
|
||||
SEL_ARG *key2_next= key2->next;
|
||||
if (key2->use_count)
|
||||
{
|
||||
SEL_ARG *key2_cpy= new SEL_ARG(*key2);
|
||||
if (!key2_cpy)
|
||||
if (key2_cpy)
|
||||
return 0;
|
||||
key2= key2_cpy;
|
||||
}
|
||||
@ -9625,7 +9621,7 @@ key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1,SEL_ARG *key2)
|
||||
Move on to next range in key2
|
||||
*/
|
||||
key2->increment_use_count(-1); // Free not used tree
|
||||
key2=key2_next;
|
||||
key2=key2->next;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user