42
int optimizer::SEL_IMERGE::or_sel_tree(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree)
42
void optimizer::SEL_IMERGE::or_sel_tree(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree)
44
44
if (trees_next == trees_end)
47
47
uint32_t old_elements= (trees_end - trees);
48
48
uint32_t old_size= sizeof(optimizer::SEL_TREE**) * old_elements;
49
49
uint32_t new_size= old_size * realloc_ratio;
50
optimizer::SEL_TREE **new_trees= NULL;
51
if (! (new_trees= (optimizer::SEL_TREE**) param->mem_root->alloc_root(new_size)))
50
optimizer::SEL_TREE** new_trees= (optimizer::SEL_TREE**) param->mem_root->alloc(new_size);
53
51
memcpy(new_trees, trees, old_size);
55
53
trees_next= trees + old_elements;
56
54
trees_end= trees + old_elements * realloc_ratio;
58
56
*(trees_next++)= tree;
63
int optimizer::SEL_IMERGE::or_sel_tree_with_checks(optimizer::RangeParameter *param, optimizer::SEL_TREE *new_tree)
60
int optimizer::SEL_IMERGE::or_sel_tree_with_checks(optimizer::RangeParameter& param, optimizer::SEL_TREE& new_tree)
65
for (optimizer::SEL_TREE** tree = trees;
62
for (optimizer::SEL_TREE** tree = trees; tree != trees_next; tree++)
69
if (sel_trees_can_be_ored(*tree, new_tree, param))
64
if (sel_trees_can_be_ored(**tree, new_tree, param))
71
*tree = tree_or(param, *tree, new_tree);
66
*tree = tree_or(¶m, *tree, &new_tree);
74
if (((*tree)->type == optimizer::SEL_TREE::MAYBE) ||
75
((*tree)->type == optimizer::SEL_TREE::ALWAYS))
69
if (((*tree)->type == SEL_TREE::MAYBE) ||
70
((*tree)->type == SEL_TREE::ALWAYS))
77
72
/* optimizer::SEL_TREE::IMPOSSIBLE is impossible here */
82
77
/* New tree cannot be combined with any of existing trees. */
83
return or_sel_tree(param, new_tree);
78
or_sel_tree(¶m, &new_tree);
87
int optimizer::SEL_IMERGE::or_sel_imerge_with_checks(optimizer::RangeParameter *param, optimizer::SEL_IMERGE* imerge)
83
int optimizer::SEL_IMERGE::or_sel_imerge_with_checks(RangeParameter& param, SEL_IMERGE& imerge)
89
for (optimizer::SEL_TREE** tree= imerge->trees;
90
tree != imerge->trees_next;
85
for (SEL_TREE** tree= imerge.trees; tree != imerge.trees_next; tree++)
93
if (or_sel_tree_with_checks(param, *tree))
87
if (or_sel_tree_with_checks(param, **tree))