diff options
author | unknown <dlenev@mysql.com> | 2005-06-20 16:07:36 +0400 |
---|---|---|
committer | unknown <dlenev@mysql.com> | 2005-06-20 16:07:36 +0400 |
commit | 79444fa5355609f51061f03229c7b9d18a7fd5e6 (patch) | |
tree | 449b86329f1f9b734e429d6663373d516cbbc131 | |
parent | c8714788864e2938b36e43e70fea4a155327b850 (diff) | |
parent | 78e6794b63bdacaf260397ee70d098ba7afb85d5 (diff) | |
download | mariadb-git-79444fa5355609f51061f03229c7b9d18a7fd5e6.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/dlenev/src/mysql-4.1-bg11060
-rw-r--r-- | mysql-test/r/ps.result | 6 | ||||
-rw-r--r-- | mysql-test/t/ps.test | 12 | ||||
-rw-r--r-- | sql/sql_insert.cc | 13 |
3 files changed, 30 insertions, 1 deletions
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index d66114fe44e..ca38f1c75cb 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -557,3 +557,9 @@ id 3 deallocate prepare stmt; drop table t1, t2; +create table t1 (id int); +prepare stmt from "insert into t1 (id) select id from t1 union select id from t1"; +execute stmt; +execute stmt; +deallocate prepare stmt; +drop table t1; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 96b83a09497..bb1052c7337 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -569,3 +569,15 @@ select t2.id from t2, t1 where (t1.id=1 and t2.t1_id=t1.id); deallocate prepare stmt; drop table t1, t2; + +# +# Bug#11060 "Server crashes on calling stored procedure with INSERT SELECT +# UNION SELECT" aka "Server crashes on re-execution of prepared INSERT ... +# SELECT with UNION". +# +create table t1 (id int); +prepare stmt from "insert into t1 (id) select id from t1 union select id from t1"; +execute stmt; +execute stmt; +deallocate prepare stmt; +drop table t1; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 718e6b00ddc..b90de7e93cc 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1578,10 +1578,21 @@ bool delayed_insert::handle_inserts(void) int select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u) { + int res; + LEX *lex= thd->lex; + SELECT_LEX *lex_current_select_save= lex->current_select; DBUG_ENTER("select_insert::prepare"); unit= u; - if (check_insert_fields(thd, table, *fields, values)) + /* + Since table in which we are going to insert is added to the first + select, LEX::current_select should point to the first select while + we are fixing fields from insert list. + */ + lex->current_select= &lex->select_lex; + res= check_insert_fields(thd, table, *fields, values); + lex->current_select= lex_current_select_save; + if (res) DBUG_RETURN(1); restore_record(table,default_values); // Get empty record |