diff options
author | Igor Babaev <igor@askmonty.org> | 2022-06-19 23:43:17 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2022-06-20 16:43:44 -0700 |
commit | 2adebf4876283859066c11f23e89965733594363 (patch) | |
tree | c7bb7ab6f94b4d34c9adab2bab466f37b3ed7f56 /sql/sql_update.cc | |
parent | f7d2374083184261897e86bced158d9ae2c4aaaf (diff) | |
download | mariadb-git-bb-10.10-mdev-7487.tar.gz |
MDEV-7487 Semi-join optimization for single-table update/delete statementsbb-10.10-mdev-7487
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>
Diffstat (limited to 'sql/sql_update.cc')
-rw-r--r-- | sql/sql_update.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 6b14c4f3fcc..b056b13bca3 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -2471,6 +2471,8 @@ int multi_update::do_updates() table = cur_table->table; if (table == table_to_update) continue; // Already updated + if (table->file->pushed_rowid_filter) + table->file->disable_pushed_rowid_filter(); org_updated= updated; tmp_table= tmp_tables[cur_table->shared]; tmp_table->file->extra(HA_EXTRA_CACHE); // Change to read cache @@ -2665,7 +2667,8 @@ int multi_update::do_updates() check_opt_it.rewind(); while (TABLE *tbl= check_opt_it++) tbl->file->ha_rnd_end(); - + if (table->file->save_pushed_rowid_filter) + table->file->enable_pushed_rowid_filter(); } DBUG_RETURN(0); @@ -2676,6 +2679,8 @@ err: } err2: + if (table->file->save_pushed_rowid_filter) + table->file->enable_pushed_rowid_filter(); if (table->file->inited) (void) table->file->ha_rnd_end(); if (tmp_table->file->inited) @@ -2955,7 +2960,9 @@ bool Sql_cmd_update::prepare_inner(THD *thd) { goto err; } - + if (!multitable && + select_lex->sj_subselects.elements) + multitable= true; } if (table_list->has_period()) |