summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Smirnov <olernov@gmail.com>2022-05-18 18:36:32 +0400
committerOleg Smirnov <olernov@gmail.com>2022-05-18 18:36:38 +0400
commit6791c6b603d3d8a7353441478725686a664cfb99 (patch)
tree4d938be0df08bb10bb303b0d0c4f38ad81a1eb3f
parenta5dc12eefd4bea1c3f77d02c55d0d459b4ae0566 (diff)
downloadmariadb-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.result32
-rw-r--r--mysql-test/t/having.test33
-rw-r--r--sql/sql_select.cc2
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]);