diff --git a/mysql-test/r/range_interrupted-13751.result b/mysql-test/r/range_interrupted-13751.result new file mode 100644 index 0000000000000..f4f995721ad50 --- /dev/null +++ b/mysql-test/r/range_interrupted-13751.result @@ -0,0 +1,16 @@ +CREATE TABLE t1 (i INT AUTO_INCREMENT, c VARCHAR(1), KEY(i), KEY(c,i)) ENGINE=MyISAM; +INSERT INTO t1 (c) VALUES ('a'),('b'),('c'),('d'); +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +set @old_dbug=@@session.debug_dbug; +set debug_dbug="+d,kill_join_init_read_record"; +SELECT 1 FROM t1 AS alias1, t1 AS alias2, t1 AS alias3 +WHERE alias1.c = alias2.c OR alias1.i <= 1 +; +ERROR 70100: Query execution was interrupted +set debug_dbug=@old_dbug; +DROP TABLE t1; diff --git a/mysql-test/t/range_interrupted-13751.test b/mysql-test/t/range_interrupted-13751.test new file mode 100644 index 0000000000000..000a46383e859 --- /dev/null +++ b/mysql-test/t/range_interrupted-13751.test @@ -0,0 +1,25 @@ +source include/have_debug.inc; +# +# MDEV-13751 Interrupted SELECT fails with 1030: 'Got error 1 "Operation not permitted" from storage engine MyISAM' +# +CREATE TABLE t1 (i INT AUTO_INCREMENT, c VARCHAR(1), KEY(i), KEY(c,i)) ENGINE=MyISAM; +INSERT INTO t1 (c) VALUES ('a'),('b'),('c'),('d'); +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; +INSERT INTO t1 (c) SELECT c FROM t1; + +set @old_dbug=@@session.debug_dbug; +set debug_dbug="+d,kill_join_init_read_record"; + +--error ER_QUERY_INTERRUPTED +SELECT 1 FROM t1 AS alias1, t1 AS alias2, t1 AS alias3 +WHERE alias1.c = alias2.c OR alias1.i <= 1 +; + +set debug_dbug=@old_dbug; + +DROP TABLE t1; + diff --git a/sql/sql_select.cc b/sql/sql_select.cc index e933be390affd..326e87f9d9154 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -19456,7 +19456,6 @@ bool test_if_use_dynamic_range_scan(JOIN_TAB *join_tab) int join_init_read_record(JOIN_TAB *tab) { - int error; /* Note: the query plan tree for the below operations is constructed in save_agg_explain_data. @@ -19466,12 +19465,18 @@ int join_init_read_record(JOIN_TAB *tab) if (tab->filesort && tab->sort_table()) // Sort table. return 1; - if (tab->select && tab->select->quick && (error= tab->select->quick->reset())) + DBUG_EXECUTE_IF("kill_join_init_read_record", + tab->join->thd->set_killed(KILL_QUERY);); + if (tab->select && tab->select->quick && tab->select->quick->reset()) { - /* Ensures error status is propageted back to client */ - report_error(tab->table, error); + /* Ensures error status is propagated back to client */ + report_error(tab->table, + tab->join->thd->killed ? HA_ERR_QUERY_INTERRUPTED : HA_ERR_OUT_OF_MEM); return 1; } + /* make sure we won't get ER_QUERY_INTERRUPTED from any code below */ + DBUG_EXECUTE_IF("kill_join_init_read_record", + tab->join->thd->reset_killed();); if (!tab->preread_init_done && tab->preread_init()) return 1; if (init_read_record(&tab->read_record, tab->join->thd, tab->table,