mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-7487 Semi-join optimization for single-table update/delete statements
This patch allows to use semi-join optimization at the top level of single-table update and delete statements. The problem of supporting such optimization became easy to resolve after processing a single-table update/delete statement started using JOIN structure. This allowed to use JOIN::prepare() not only for multi-table updates/deletes but for single-table ones as well. This was done in the patch for mdev-28883: Re-design the upper level of handling UPDATE and DELETE statements. Note that JOIN::prepare() detects all subqueries that can be considered as candidates for semi-join optimization. The code added by this patch looks for such candidates at the top level and if such candidates are found in the processed single-table update/delete the statement is handled in the same way as a multi-table update/delete. Approved by Oleksandr Byelkin <sanja@mariadb.com>
This commit is contained in:
@ -348,7 +348,6 @@ bool Sql_cmd_delete::delete_from_single_table(THD *thd)
|
||||
query_plan.using_filesort= FALSE;
|
||||
|
||||
THD_STAGE_INFO(thd, stage_init_update);
|
||||
create_explain_query(thd->lex, thd->mem_root);
|
||||
|
||||
const bool delete_history= table_list->vers_conditions.delete_history;
|
||||
DBUG_ASSERT(!(delete_history && table_list->period_conditions.is_set()));
|
||||
@ -1668,6 +1667,10 @@ bool Sql_cmd_delete::prepare_inner(THD *thd)
|
||||
{
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!multitable &&
|
||||
select_lex->sj_subselects.elements)
|
||||
multitable= true;
|
||||
}
|
||||
|
||||
if (multitable)
|
||||
|
Reference in New Issue
Block a user