Skip to content

Commit c311450

Browse files
Sergey GlukhovSergey Glukhov
Sergey Glukhov
authored and
Sergey Glukhov
committed
Bug#47371 reference by same column name
At the end of execution top level join execution we cleanup this join with true argument. It leads to underlying join cleanup(subquery) with true argument too and to tmp_table_param->field array cleanup which is required later. The problem is that Item_func_set_user_var does not set result_filed which leads to unnecessary repeated excution of subquery on final stage. The fix is to set result_field for Item_func_set_user_var.
1 parent 27c0939 commit c311450

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

mysql-test/r/count_distinct.result

+20
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,26 @@ select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join
4040
isbn city libname a
4141
007 Berkeley Berkeley Public1 2
4242
000 New York New York Public Libra 2
43+
select t2.isbn,city,@bar:=t1.libname,count(distinct t1.libname) as a
44+
from t3 left join t1 on t3.libname=t1.libname left join t2
45+
on t3.isbn=t2.isbn group by city having count(distinct
46+
t1.libname) > 1;
47+
isbn city @bar:=t1.libname a
48+
007 Berkeley Berkeley Public1 2
49+
000 New York New York Public Libra 2
50+
SELECT @bar;
51+
@bar
52+
Berkeley Public2
53+
select t2.isbn,city,concat(@bar:=t1.libname),count(distinct t1.libname) as a
54+
from t3 left join t1 on t3.libname=t1.libname left join t2
55+
on t3.isbn=t2.isbn group by city having count(distinct
56+
t1.libname) > 1;
57+
isbn city concat(@bar:=t1.libname) a
58+
007 Berkeley Berkeley Public1 2
59+
000 New York New York Public Libra 2
60+
SELECT @bar;
61+
@bar
62+
Berkeley Public2
4363
drop table t1, t2, t3;
4464
create table t1 (f1 int);
4565
insert into t1 values (1);

mysql-test/r/user_var.result

+15
Original file line numberDiff line numberDiff line change
@@ -363,4 +363,19 @@ SELECT a, b FROM t1 WHERE a=2 AND b=3 GROUP BY a, b;
363363
a b
364364
2 3
365365
DROP TABLE t1;
366+
CREATE TABLE t1 (f1 int(11) default NULL, f2 int(11) default NULL);
367+
CREATE TABLE t2 (f1 int(11) default NULL, f2 int(11) default NULL, foo int(11));
368+
CREATE TABLE t3 (f1 int(11) default NULL, f2 int(11) default NULL);
369+
INSERT INTO t1 VALUES(10, 10);
370+
INSERT INTO t1 VALUES(10, 10);
371+
INSERT INTO t2 VALUES(10, 10, 10);
372+
INSERT INTO t2 VALUES(10, 10, 10);
373+
INSERT INTO t3 VALUES(10, 10);
374+
INSERT INTO t3 VALUES(10, 10);
375+
SELECT MIN(t2.f1),
376+
@bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
377+
FROM t1,t2 WHERE t1.f1 = t2.f1 ORDER BY t2.f1;
378+
MIN(t2.f1) @bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
379+
10 NULL
380+
DROP TABLE t1, t2, t3;
366381
End of 5.0 tests

mysql-test/t/count_distinct.test

+19
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,25 @@ insert into t1 values ('NYC Lib','New York');
3535
select t2.isbn,city,t1.libname,count(t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city,t1.libname;
3636
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct t1.libname) > 1;
3737
select t2.isbn,city,t1.libname,count(distinct t1.libname) as a from t3 left join t1 on t3.libname=t1.libname left join t2 on t3.isbn=t2.isbn group by city having count(distinct concat(t1.libname,'a')) > 1;
38+
39+
select t2.isbn,city,@bar:=t1.libname,count(distinct t1.libname) as a
40+
from t3 left join t1 on t3.libname=t1.libname left join t2
41+
on t3.isbn=t2.isbn group by city having count(distinct
42+
t1.libname) > 1;
43+
#
44+
# Wrong result, see bug#49872
45+
#
46+
SELECT @bar;
47+
48+
select t2.isbn,city,concat(@bar:=t1.libname),count(distinct t1.libname) as a
49+
from t3 left join t1 on t3.libname=t1.libname left join t2
50+
on t3.isbn=t2.isbn group by city having count(distinct
51+
t1.libname) > 1;
52+
#
53+
# Wrong result, see bug#49872
54+
#
55+
SELECT @bar;
56+
3857
drop table t1, t2, t3;
3958

4059
#

mysql-test/t/user_var.test

+20
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,24 @@ SELECT @a, @b;
248248
SELECT a, b FROM t1 WHERE a=2 AND b=3 GROUP BY a, b;
249249
DROP TABLE t1;
250250

251+
#
252+
# Bug#47371: reference by same column name
253+
#
254+
CREATE TABLE t1 (f1 int(11) default NULL, f2 int(11) default NULL);
255+
CREATE TABLE t2 (f1 int(11) default NULL, f2 int(11) default NULL, foo int(11));
256+
CREATE TABLE t3 (f1 int(11) default NULL, f2 int(11) default NULL);
257+
258+
INSERT INTO t1 VALUES(10, 10);
259+
INSERT INTO t1 VALUES(10, 10);
260+
INSERT INTO t2 VALUES(10, 10, 10);
261+
INSERT INTO t2 VALUES(10, 10, 10);
262+
INSERT INTO t3 VALUES(10, 10);
263+
INSERT INTO t3 VALUES(10, 10);
264+
265+
SELECT MIN(t2.f1),
266+
@bar:= (SELECT MIN(t3.f2) FROM t3 WHERE t3.f2 > foo)
267+
FROM t1,t2 WHERE t1.f1 = t2.f1 ORDER BY t2.f1;
268+
269+
DROP TABLE t1, t2, t3;
270+
251271
--echo End of 5.0 tests

sql/item_func.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ void Item_func::signal_divide_by_null()
610610

611611
Item *Item_func::get_tmp_table_item(THD *thd)
612612
{
613-
if (!with_sum_func && !const_item() && functype() != SUSERVAR_FUNC)
613+
if (!with_sum_func && !const_item())
614614
return new Item_field(result_field);
615615
return copy_or_same(thd);
616616
}

0 commit comments

Comments
 (0)