summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <dlenev@mysql.com>2005-06-20 16:07:36 +0400
committerunknown <dlenev@mysql.com>2005-06-20 16:07:36 +0400
commit79444fa5355609f51061f03229c7b9d18a7fd5e6 (patch)
tree449b86329f1f9b734e429d6663373d516cbbc131
parentc8714788864e2938b36e43e70fea4a155327b850 (diff)
parent78e6794b63bdacaf260397ee70d098ba7afb85d5 (diff)
downloadmariadb-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.result6
-rw-r--r--mysql-test/t/ps.test12
-rw-r--r--sql/sql_insert.cc13
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