mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3
TODO: enable MDEV-13049 optimization for 10.3
This commit is contained in:
@@ -1589,6 +1589,7 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
|
||||
sj-nest.
|
||||
*/
|
||||
st_select_lex *subq_lex= subq_pred->unit->first_select();
|
||||
DBUG_ASSERT(subq_lex->next_select() == NULL);
|
||||
nested_join->join_list.empty();
|
||||
List_iterator_fast<TABLE_LIST> li(subq_lex->top_join_list);
|
||||
TABLE_LIST *tl;
|
||||
@@ -1692,7 +1693,8 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
|
||||
|
||||
if (subq_pred->left_expr->cols() == 1)
|
||||
{
|
||||
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr,
|
||||
/* add left = select_list_element */
|
||||
nested_join->sj_outer_expr_list.push_back(&subq_pred->left_expr,
|
||||
thd->mem_root);
|
||||
/*
|
||||
Create Item_func_eq. Note that
|
||||
@@ -1706,26 +1708,62 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
|
||||
Item_func_eq *item_eq=
|
||||
new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr_orig,
|
||||
subq_lex->ref_pointer_array[0]);
|
||||
if (!item_eq)
|
||||
DBUG_RETURN(TRUE);
|
||||
if (subq_pred->left_expr_orig != subq_pred->left_expr)
|
||||
thd->change_item_tree(item_eq->arguments(), subq_pred->left_expr);
|
||||
item_eq->in_equality_no= 0;
|
||||
sj_nest->sj_on_expr= and_items(thd, sj_nest->sj_on_expr, item_eq);
|
||||
}
|
||||
else
|
||||
else if (subq_pred->left_expr->type() == Item::ROW_ITEM)
|
||||
{
|
||||
/*
|
||||
disassemple left expression and add
|
||||
left1 = select_list_element1 and left2 = select_list_element2 ...
|
||||
*/
|
||||
for (uint i= 0; i < subq_pred->left_expr->cols(); i++)
|
||||
{
|
||||
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr->
|
||||
element_index(i),
|
||||
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr->addr(i),
|
||||
thd->mem_root);
|
||||
Item_func_eq *item_eq=
|
||||
Item_func_eq *item_eq=
|
||||
new (thd->mem_root)
|
||||
Item_func_eq(thd, subq_pred->left_expr->element_index(i),
|
||||
Item_func_eq(thd, subq_pred->left_expr_orig->element_index(i),
|
||||
subq_lex->ref_pointer_array[i]);
|
||||
if (!item_eq)
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_ASSERT(subq_pred->left_expr->element_index(i)->fixed);
|
||||
if (subq_pred->left_expr_orig->element_index(i) !=
|
||||
subq_pred->left_expr->element_index(i))
|
||||
thd->change_item_tree(item_eq->arguments(),
|
||||
subq_pred->left_expr->element_index(i));
|
||||
item_eq->in_equality_no= i;
|
||||
sj_nest->sj_on_expr= and_items(thd, sj_nest->sj_on_expr, item_eq);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
add row operation
|
||||
left = (select_list_element1, select_list_element2, ...)
|
||||
*/
|
||||
Item_row *row= new (thd->mem_root) Item_row(thd, subq_lex->pre_fix);
|
||||
/* fix fields on subquery was call so they should be the same */
|
||||
DBUG_ASSERT(subq_pred->left_expr->cols() == row->cols());
|
||||
if (!row)
|
||||
DBUG_RETURN(TRUE);
|
||||
nested_join->sj_outer_expr_list.push_back(&subq_pred->left_expr);
|
||||
Item_func_eq *item_eq=
|
||||
new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr_orig, row);
|
||||
if (!item_eq)
|
||||
DBUG_RETURN(TRUE);
|
||||
for (uint i= 0; i < row->cols(); i++)
|
||||
{
|
||||
if (row->element_index(i) != subq_lex->ref_pointer_array[i])
|
||||
thd->change_item_tree(row->addr(i), subq_lex->ref_pointer_array[i]);
|
||||
}
|
||||
item_eq->in_equality_no= 0;
|
||||
sj_nest->sj_on_expr= and_items(thd, sj_nest->sj_on_expr, item_eq);
|
||||
}
|
||||
/*
|
||||
Fix the created equality and AND
|
||||
|
||||
@@ -3274,8 +3312,8 @@ void restore_prev_sj_state(const table_map remaining_tables,
|
||||
ulonglong get_bound_sj_equalities(TABLE_LIST *sj_nest,
|
||||
table_map remaining_tables)
|
||||
{
|
||||
List_iterator<Item> li(sj_nest->nested_join->sj_outer_expr_list);
|
||||
Item *item;
|
||||
List_iterator<Item_ptr> li(sj_nest->nested_join->sj_outer_expr_list);
|
||||
Item **item;
|
||||
uint i= 0;
|
||||
ulonglong res= 0;
|
||||
while ((item= li++))
|
||||
@@ -3286,7 +3324,7 @@ ulonglong get_bound_sj_equalities(TABLE_LIST *sj_nest,
|
||||
class and see if there is an element that is bound?
|
||||
(this is an optional feature)
|
||||
*/
|
||||
if (!(item->used_tables() & remaining_tables))
|
||||
if (!(item[0]->used_tables() & remaining_tables))
|
||||
{
|
||||
res |= 1ULL << i;
|
||||
}
|
||||
|
Reference in New Issue
Block a user