diff --git a/mysql-test/main/except.result b/mysql-test/main/except.result index 40a77fcd65025..212939f8f1865 100644 --- a/mysql-test/main/except.result +++ b/mysql-test/main/except.result @@ -710,3 +710,59 @@ SELECT * FROM t WHERE i != ANY ( SELECT 3 EXCEPT SELECT 3 ); i drop table t; # End of 10.3 tests +# +# MDEV-38988: Assertion failure in Protocol::end_statement or +# lack of warning upon query with INTERSECT and LIMIT ROWS EXAMINED +# +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t SELECT seq, seq FROM seq_1_to_30; +(SELECT a FROM t LIMIT ROWS EXAMINED 100) EXCEPT ALL (SELECT a FROM t); +a +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 100. The query result may be incomplete +DROP TABLE t; +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t SELECT seq, seq FROM seq_1_to_30; +(SELECT a FROM t LIMIT ROWS EXAMINED 100) EXCEPT ALL (SELECT a FROM t); +a +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 100. The query result may be incomplete +DROP TABLE t; +CREATE TABLE t (id INT PRIMARY KEY, f VARCHAR(16)) ENGINE=InnoDB; +INSERT INTO t SELECT seq, '' FROM seq_1_to_8650; +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000) +INTERSECT +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000); +f + +DROP TABLE t; +CREATE TABLE t (id INT PRIMARY KEY, f VARCHAR(16)) ENGINE=MyISAM; +INSERT INTO t SELECT seq, '' FROM seq_1_to_8650; +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000) +INTERSECT +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000); +f + +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 8000. The query result may be incomplete +DROP TABLE t; diff --git a/mysql-test/main/except.test b/mysql-test/main/except.test index d253b288d3bdf..ff83b0b4b54d4 100644 --- a/mysql-test/main/except.test +++ b/mysql-test/main/except.test @@ -99,3 +99,39 @@ drop table t; --echo # End of 10.3 tests + +--echo # +--echo # MDEV-38988: Assertion failure in Protocol::end_statement or +--echo # lack of warning upon query with INTERSECT and LIMIT ROWS EXAMINED +--echo # + +--source include/have_innodb.inc +--source include/have_sequence.inc + +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t SELECT seq, seq FROM seq_1_to_30; +(SELECT a FROM t LIMIT ROWS EXAMINED 100) EXCEPT ALL (SELECT a FROM t); + +DROP TABLE t; + +CREATE TABLE t (a INT PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t SELECT seq, seq FROM seq_1_to_30; +(SELECT a FROM t LIMIT ROWS EXAMINED 100) EXCEPT ALL (SELECT a FROM t); + +DROP TABLE t; + +CREATE TABLE t (id INT PRIMARY KEY, f VARCHAR(16)) ENGINE=InnoDB; +INSERT INTO t SELECT seq, '' FROM seq_1_to_8650; +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000) +INTERSECT +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000); + +DROP TABLE t; + +CREATE TABLE t (id INT PRIMARY KEY, f VARCHAR(16)) ENGINE=MyISAM; +INSERT INTO t SELECT seq, '' FROM seq_1_to_8650; +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000) +INTERSECT +(SELECT f FROM t WHERE id BETWEEN 7000 AND 9000 LIMIT ROWS EXAMINED 8000); + +DROP TABLE t; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 0014e79613c71..fb45eed588816 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -2434,7 +2434,7 @@ bool st_select_lex_unit::exec_inner() } } } - if (unlikely(saved_error)) + if (thd->killed != ABORT_QUERY && unlikely(saved_error)) { error= saved_error; goto err;