mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
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.
This commit is contained in:
@@ -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 t2 const PRIMARY PRIMARY 4 const 1 Using index
|
||||||
1 SIMPLE t3 const PRIMARY PRIMARY 8 const,const 1
|
1 SIMPLE t3 const PRIMARY PRIMARY 8 const,const 1
|
||||||
DROP TABLE t1,t2,t3;
|
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;
|
||||||
|
@@ -2805,3 +2805,16 @@ EXPLAIN SELECT t2.key_a,foo
|
|||||||
WHERE t2.key_a=2 and key_b=5;
|
WHERE t2.key_a=2 and key_b=5;
|
||||||
|
|
||||||
DROP TABLE t1,t2,t3;
|
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;
|
||||||
|
@@ -9853,6 +9853,7 @@ flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
|
|||||||
int error;
|
int error;
|
||||||
READ_RECORD *info;
|
READ_RECORD *info;
|
||||||
|
|
||||||
|
join_tab->table->null_row= 0;
|
||||||
if (!join_tab->cache.records)
|
if (!join_tab->cache.records)
|
||||||
return NESTED_LOOP_OK; /* Nothing to do */
|
return NESTED_LOOP_OK; /* Nothing to do */
|
||||||
if (skip_last)
|
if (skip_last)
|
||||||
|
Reference in New Issue
Block a user