diff options
author | Oleg Smirnov <olernov@gmail.com> | 2022-05-18 18:36:32 +0400 |
---|---|---|
committer | Oleg Smirnov <olernov@gmail.com> | 2022-05-18 18:36:38 +0400 |
commit | 6791c6b603d3d8a7353441478725686a664cfb99 (patch) | |
tree | 4d938be0df08bb10bb303b0d0c4f38ad81a1eb3f | |
parent | a5dc12eefd4bea1c3f77d02c55d0d459b4ae0566 (diff) | |
download | mariadb-git-bb-10.2-MDEV-24837.tar.gz |
MDEV-24837 HAVING clause yields wrong resultsbb-10.2-MDEV-24837
Set items references to point to the temporary table fields
when processing aggregate operations
-rw-r--r-- | mysql-test/r/having.result | 32 | ||||
-rw-r--r-- | mysql-test/t/having.test | 33 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 |
3 files changed, 67 insertions, 0 deletions
diff --git a/mysql-test/r/having.result b/mysql-test/r/having.result index d22f5563bbe..443217824fb 100644 --- a/mysql-test/r/having.result +++ b/mysql-test/r/having.result @@ -846,3 +846,35 @@ t r DROP TABLE t1; DROP FUNCTION next_seq_value; DROP TABLE series; +# +# MDEV-24837 HAVING clause yields wrong results in 10.2 and 10.3, +# fine in 10.1 +# +CREATE TABLE t1 (t1_id int, t1_val varchar(20), t1_var varchar(100)); +INSERT INTO t1 VALUES (1,'val','a'),(2,'val','b'),(3,'val','c'); +CREATE TABLE t2 (t2_id int, t2_valvar varchar(20), t3_id int ); +INSERT INTO t2 VALUES (1,'valb',1); +CREATE TABLE t3 (t3_id int primary key, t3_lib varchar(20)); +INSERT INTO t3 VALUES (1,'test'); +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar +AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'vala'; +cc group_concat(t2.t3_id) +vala NULL +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar +AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'valb'; +cc group_concat(t2.t3_id) +valb 1 +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar +AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'valc'; +cc group_concat(t2.t3_id) +valc NULL +DROP TABLES t1, t2, t3; diff --git a/mysql-test/t/having.test b/mysql-test/t/having.test index 179af14559f..b7fa6125376 100644 --- a/mysql-test/t/having.test +++ b/mysql-test/t/having.test @@ -890,3 +890,36 @@ SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) DROP TABLE t1; DROP FUNCTION next_seq_value; DROP TABLE series; + +--echo # +--echo # MDEV-24837 HAVING clause yields wrong results in 10.2 and 10.3, +--echo # fine in 10.1 +--echo # +CREATE TABLE t1 (t1_id int, t1_val varchar(20), t1_var varchar(100)); +INSERT INTO t1 VALUES (1,'val','a'),(2,'val','b'),(3,'val','c'); + +CREATE TABLE t2 (t2_id int, t2_valvar varchar(20), t3_id int ); +INSERT INTO t2 VALUES (1,'valb',1); + +CREATE TABLE t3 (t3_id int primary key, t3_lib varchar(20)); +INSERT INTO t3 VALUES (1,'test'); + +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar + AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'vala'; + +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar + AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'valb'; + +SELECT DISTINCT concat(t1.t1_val,t1.t1_var) as cc, group_concat(t2.t3_id) +FROM t1 LEFT JOIN (t2, t3) ON concat(t1_val,t1_var) = t2.t2_valvar + AND t2.t3_id = t3.t3_id +GROUP BY t1_id +HAVING cc = 'valc'; + +DROP TABLES t1, t2, t3; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 760730d799c..8adbe9ec78b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -20550,6 +20550,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), } copy_sum_funcs(join->sum_funcs, join->sum_funcs_end[send_group_parts]); + if (join->current_ref_ptrs != join->items1) + join->set_items_ref_array(join->items1); if (!join_tab->having || join_tab->having->val_int()) { int error= table->file->ha_write_tmp_row(table->record[0]); |