My second SCRUM task:

Automatically add SQL_BUFFER_RESULT if INSERT is done from 
SELECT comprising a table to be inserted in.
parent 62c02d4b
...@@ -64,3 +64,16 @@ use test_$1; ...@@ -64,3 +64,16 @@ use test_$1;
create table t1 (c int); create table t1 (c int);
insert into test_$1.t1 set test_$1.t1.c = '1'; insert into test_$1.t1 set test_$1.t1.c = '1';
drop database test_$1; drop database test_$1;
use test;
drop table if exists t1,t2,t3;
create table t1(id1 int not null auto_increment primary key, t char(12));
create table t2(id2 int not null, t char(12));
create table t3(id3 int not null, t char(12), index(id3));
select count(*) from t2;
count(*)
500
insert into t2 select t1.* from t1, t2 t, t3 where t1.id1 = t.id2 and t.id2 = t3.id3;
select count(*) from t2;
count(*)
25500
drop table if exists t1,t2,t3;
...@@ -578,7 +578,6 @@ x ...@@ -578,7 +578,6 @@ x
3 3
3 3
INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2; INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2;
You can't specify target table 't1' for update in FROM clause
INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2)); INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2));
select * from t1; select * from t1;
x x
...@@ -586,6 +585,8 @@ x ...@@ -586,6 +585,8 @@ x
2 2
3 3
3 3
11
11
0 0
drop table t1, t2, t3; drop table t1, t2, t3;
CREATE TABLE t1 (x int not null, y int, primary key (x)); CREATE TABLE t1 (x int not null, y int, primary key (x));
......
...@@ -65,3 +65,34 @@ use test_$1; ...@@ -65,3 +65,34 @@ use test_$1;
create table t1 (c int); create table t1 (c int);
insert into test_$1.t1 set test_$1.t1.c = '1'; insert into test_$1.t1 set test_$1.t1.c = '1';
drop database test_$1; drop database test_$1;
use test;
--disable_warnings
drop table if exists t1,t2,t3;
--enable_warnings
create table t1(id1 int not null auto_increment primary key, t char(12));
create table t2(id2 int not null, t char(12));
create table t3(id3 int not null, t char(12), index(id3));
disable_query_log;
let $1 = 100;
while ($1)
{
let $2 = 5;
eval insert into t1(t) values ('$1');
while ($2)
{
eval insert into t2(id2,t) values ($1,'$2');
let $3 = 10;
while ($3)
{
eval insert into t3(id3,t) values ($1,'$2');
dec $3;
}
dec $2;
}
dec $1;
}
enable_query_log;
select count(*) from t2;
insert into t2 select t1.* from t1, t2 t, t3 where t1.id1 = t.id2 and t.id2 = t3.id3;
select count(*) from t2;
drop table if exists t1,t2,t3;
...@@ -335,7 +335,6 @@ INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(a) FROM t2)); ...@@ -335,7 +335,6 @@ INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(a) FROM t2));
select * from t1; select * from t1;
INSERT INTO t1 (x) select (SELECT SUM(a)+1 FROM t2) FROM t2; INSERT INTO t1 (x) select (SELECT SUM(a)+1 FROM t2) FROM t2;
select * from t1; select * from t1;
-- error 1093
INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2; INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2;
INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2)); INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2));
-- sleep 1 -- sleep 1
......
...@@ -2262,8 +2262,7 @@ mysql_execute_command(THD *thd) ...@@ -2262,8 +2262,7 @@ mysql_execute_command(THD *thd)
if (find_real_table_in_list(tables->next, tables->db, tables->real_name)) if (find_real_table_in_list(tables->next, tables->db, tables->real_name))
{ {
net_printf(thd,ER_UPDATE_TABLE_USED,tables->real_name); lex->select_lex.options |= OPTION_BUFFER_RESULT;
DBUG_VOID_RETURN;
} }
/* Skip first table, which is the table we are inserting in */ /* Skip first table, which is the table we are inserting in */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment