Commit ddcc6d7b authored by unknown's avatar unknown
Browse files

Fixed bug #15347: Wrong result of subselect when records cache and set

functions are involved.

When subselect is a join with set functions and no record have been found in
it, end_send_group() sets null_row for all tables in order aggregate functions 
to calculate their values correctly. Normally this null_row flag is cleared for 
each table in sub_select(), but flush_cached_records() doesn't do so.
Due to this all fields from the table processed by flush_cached_records() are 
always evaluated as nulls and whole select produces wrong result.

flush_cached_records() now clears null_row flag at the very beginning.


mysql-test/t/select.test:
  Added test case for bug #15347: Wrong result of subselect when records cache
  and set functions are involved
mysql-test/r/select.result:
  Added test case for bug #15347: Wrong result of subselect when records cache
  and set functions are involved
sql/sql_select.cc:
  Fixed bug #15347: Wrong result of subselect when records cache and set functions are involved
  flush_cached_records() now clears null_row flag at the very beginning.
parent f81ed05c
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -3337,3 +3337,14 @@ id select_type table type possible_keys key key_len ref rows Extra
1	SIMPLE	t2	const	PRIMARY	PRIMARY	4	const	1	Using index
1	SIMPLE	t3	const	PRIMARY	PRIMARY	8	const,const	1	
DROP TABLE t1,t2,t3;
create  table t1 (f1 int);
insert into t1 values(1),(2);
create table t2 (f2 int, f3 int, key(f2));
insert into t2 values(1,1),(2,2);
create table t3 (f4 int not null);
insert into t3 values (2),(2),(2);
select f1,(select count(*) from t2,t3 where f2=f1 and f3=f4) as count from t1;
f1	count
1	0
2	3
drop table t1,t2,t3;
+13 −0
Original line number Diff line number Diff line
@@ -2805,3 +2805,16 @@ EXPLAIN SELECT t2.key_a,foo
    WHERE t2.key_a=2 and key_b=5;

DROP TABLE t1,t2,t3;

#
# Bug#15347 Wrong result of subselect when records cache and set functions
#           are involved
#
create  table t1 (f1 int);
insert into t1 values(1),(2);
create table t2 (f2 int, f3 int, key(f2));
insert into t2 values(1,1),(2,2);
create table t3 (f4 int not null);
insert into t3 values (2),(2),(2);
select f1,(select count(*) from t2,t3 where f2=f1 and f3=f4) as count from t1;
drop table t1,t2,t3;
+1 −0
Original line number Diff line number Diff line
@@ -9853,6 +9853,7 @@ flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
  int error;
  READ_RECORD *info;

  join_tab->table->null_row= 0;
  if (!join_tab->cache.records)
    return NESTED_LOOP_OK;                      /* Nothing to do */
  if (skip_last)