From e8b9afa4a132e8e32a7e8d0cee97b82f52f739de Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 30 Sep 2020 10:22:58 +1000 Subject: [PATCH] MDEV-22761: innodb row_search_idx_cond_check handle CHECK_ABORTED_BY_USER MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit handler_rowid_filter_check can return CHECK_ABORTED_BY_USER. All the functions that call row_search_idx_cond_check handle the CHECK_ABORTED_BY_USER return value. So return it rather than generating an error. This incorrect handling was introduced in MDEV-21794 (8d85715d507d). Reviewer: Marko Mäkelä --- .../main/rowid_filter_innodb_debug.result | 26 +++++++++++ .../main/rowid_filter_innodb_debug.test | 46 +++++++++++++++++++ mysql-test/unstable-tests | 1 + storage/innobase/row/row0sel.cc | 6 ++- 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 mysql-test/main/rowid_filter_innodb_debug.result create mode 100644 mysql-test/main/rowid_filter_innodb_debug.test diff --git a/mysql-test/main/rowid_filter_innodb_debug.result b/mysql-test/main/rowid_filter_innodb_debug.result new file mode 100644 index 0000000000000..91fa66937b62c --- /dev/null +++ b/mysql-test/main/rowid_filter_innodb_debug.result @@ -0,0 +1,26 @@ +set @save_optimizer_switch= @@optimizer_switch; +set @save_use_stat_tables= @@use_stat_tables; +set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; +set @@use_stat_tables=preferably; +set optimizer_use_condition_selectivity=2; +set optimizer_switch='rowid_filter=on'; +# +# MDEV-22761 KILL QUERY during rowid_filter, crashes +# +CREATE TABLE t1 (a INT, b INT, INDEX(a), INDEX(b)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,0),(1,0),(-1,1), (-2,1), (-2,3), (-3,4), (-2,4); +set debug_sync='row_search_pre_rowid_filter_check SIGNAL killme WAIT_FOR go'; +SELECT * FROM t1 WHERE a > 0 AND b=0; +connect con1, localhost, root,,; +connection con1; +set debug_sync='now WAIT_FOR killme'; +kill query @id; +set debug_sync='now SIGNAL go'; +connection default; +a b +set debug_sync='RESET'; +disconnect con1; +drop table t1; +set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +set @@optimizer_switch=@save_optimizer_switch; +set @@use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/main/rowid_filter_innodb_debug.test b/mysql-test/main/rowid_filter_innodb_debug.test new file mode 100644 index 0000000000000..3f8eb5b5c38fd --- /dev/null +++ b/mysql-test/main/rowid_filter_innodb_debug.test @@ -0,0 +1,46 @@ +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/have_innodb.inc +--source include/default_optimizer_switch.inc +--source include/count_sessions.inc + +set @save_optimizer_switch= @@optimizer_switch; +set @save_use_stat_tables= @@use_stat_tables; +set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; + +set @@use_stat_tables=preferably; + +set optimizer_use_condition_selectivity=2; +set optimizer_switch='rowid_filter=on'; + +--echo # +--echo # MDEV-22761 KILL QUERY during rowid_filter, crashes +--echo # + +CREATE TABLE t1 (a INT, b INT, INDEX(a), INDEX(b)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,0),(1,0),(-1,1), (-2,1), (-2,3), (-3,4), (-2,4); + +let $ID= `SELECT @id := CONNECTION_ID()`; + +set debug_sync='row_search_pre_rowid_filter_check SIGNAL killme WAIT_FOR go'; +send SELECT * FROM t1 WHERE a > 0 AND b=0; + +connect (con1, localhost, root,,); +connection con1; +let $ignore= `SELECT @id := $ID`; +set debug_sync='now WAIT_FOR killme'; +kill query @id; +set debug_sync='now SIGNAL go'; + +connection default; +reap; +set debug_sync='RESET'; + +disconnect con1; +drop table t1; + +set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +set @@optimizer_switch=@save_optimizer_switch; +set @@use_stat_tables=@save_use_stat_tables; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests index 093df40d1d028..1ddbc8d527859 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -184,6 +184,7 @@ main.rowid_filter : Modified in 10.4.13 main.rowid_filter_innodb : MDEV-20538 - Wrong result; modified in 10.4.13 main.rowid_filter_myisam : Added in 10.4.14 main.rpl_mysql_upgrade_slave_repo_check : Added in 10.4.13 +main.rowid_filter_innodb_debug : MDEV-22761 - Added in 10.4.15 main.select : MDEV-20532 - Floating point differences main.select_jcl6 : MDEV-20532 - Floating point differences main.select_pkeycache : MDEV-20532 - Floating point differences diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 26a6d608ad70e..7f1362cb9316e 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -3900,7 +3900,7 @@ row_sel_try_search_shortcut_for_mysql( /*********************************************************************//** Check a pushed-down index condition. -@return CHECK_NEG, CHECK_POS, or CHECK_OUT_OF_RANGE */ +@return CHECK_ABORTED_BY_USER, CHECK_NEG, CHECK_POS, or CHECK_OUT_OF_RANGE */ static check_result_t row_search_idx_cond_check( @@ -3975,6 +3975,8 @@ row_search_idx_cond_check( ut_ad(len == DATA_ROW_ID_LEN); memcpy(prebuilt->row_id, data, DATA_ROW_ID_LEN); } + DEBUG_SYNC_C("row_search_pre_rowid_filter_check"); + result = handler_rowid_filter_check(prebuilt->pk_filter); switch (result) { case CHECK_NEG: @@ -3986,7 +3988,7 @@ row_search_idx_cond_check( case CHECK_POS: break; default: - ut_error; + return(result); } } /* Convert the remaining fields to MySQL format.