From 869c86b318e273f900a721463153907e875d7f9f Mon Sep 17 00:00:00 2001 From: Sergey Petrunia <sergefp@mysql.com> Date: Tue, 19 Aug 2008 17:15:29 +0400 Subject: [PATCH] BUG#36135: void Diagnostics_area::set_eof_status(THD*): Assertion `! is_set()' failed. - Before sending EOF, check if we've already sent an error. --- mysql-test/r/subselect3.result | 28 ++++++++++++++++++++++- mysql-test/t/subselect3.test | 41 +++++++++++++++++++++++++++++++++- sql/sql_class.cc | 6 +++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/subselect3.result b/mysql-test/r/subselect3.result index 5f8aa2f1767..f4fd041731d 100644 --- a/mysql-test/r/subselect3.result +++ b/mysql-test/r/subselect3.result @@ -1,4 +1,4 @@ -drop table if exists t0, t1, t2, t3, t4; +drop table if exists t0, t1, t2, t3, t4, t5; create table t1 (oref int, grp int, ie int) ; insert into t1 (oref, grp, ie) values (1, 1, 1), @@ -780,3 +780,29 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN (SELECT 1 FROM t1, t2 WHERE 0); 1 DROP TABLE t1, t2; End of 5.0 tests +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 ( +a int(11) default null, +b int(11) default null, +key (a) +); +insert into t1 select A.a+10*(B.a+10*C.a),A.a+10*(B.a+10*C.a) from t0 A, t0 B, t0 C; +create table t2 (a int(11) default null); +insert into t2 values (0),(1); +create table t3 (a int(11) default null); +insert into t3 values (0),(1); +create table t4 (a int(11) default null); +insert into t4 values (0),(1); +create table t5 (a int(11) default null); +insert into t5 values (0),(1),(0),(1); +select * from t2, t3 +where +t2.a < 10 and +t3.a+1 = 2 and +t3.a in (select t1.b from t1 +where t1.a+1=t1.a+1 and +t1.a < (select t4.a+10 +from t4, t5 limit 2)); +ERROR 21000: Subquery returns more than 1 row +drop table t0, t1, t2, t3, t4, t5; diff --git a/mysql-test/t/subselect3.test b/mysql-test/t/subselect3.test index d7bb1f7186a..ec13f8af705 100644 --- a/mysql-test/t/subselect3.test +++ b/mysql-test/t/subselect3.test @@ -1,5 +1,5 @@ --disable_warnings -drop table if exists t0, t1, t2, t3, t4; +drop table if exists t0, t1, t2, t3, t4, t5; --enable_warnings # @@ -619,3 +619,42 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN (SELECT 1 FROM t1, t2 WHERE 0); DROP TABLE t1, t2; --echo End of 5.0 tests + +# +# BUG#36135 "void Diagnostics_area::set_eof_status(THD*): Assertion `!is_set()' failed." +# +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +create table t1 ( + a int(11) default null, + b int(11) default null, + key (a) +); +# produce numbers 0..999 +insert into t1 select A.a+10*(B.a+10*C.a),A.a+10*(B.a+10*C.a) from t0 A, t0 B, t0 C; + +create table t2 (a int(11) default null); +insert into t2 values (0),(1); + +create table t3 (a int(11) default null); +insert into t3 values (0),(1); + +create table t4 (a int(11) default null); +insert into t4 values (0),(1); + +create table t5 (a int(11) default null); +insert into t5 values (0),(1),(0),(1); + +# this must not fail assertion +--error 1242 +select * from t2, t3 +where + t2.a < 10 and + t3.a+1 = 2 and + t3.a in (select t1.b from t1 + where t1.a+1=t1.a+1 and + t1.a < (select t4.a+10 + from t4, t5 limit 2)); + +drop table t0, t1, t2, t3, t4, t5; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 691b176e59d..186d6518676 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1580,6 +1580,12 @@ bool select_send::send_eof() mysql_unlock_tables(thd, thd->lock); thd->lock=0; } + /* + Don't send EOF if we're in error condition (which implies we've already + sent or are sending an error) + */ + if (thd->is_error()) + return TRUE; ::my_eof(thd); is_result_set_started= 0; return FALSE; -- 2.30.9