summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <oystein.grovlen@sun.com>2010-04-13 11:38:28 +0200
committerunknown <oystein.grovlen@sun.com>2010-04-13 11:38:28 +0200
commit6a5b47a40015acfaf348e89d80d7b114dd53b120 (patch)
treed70457c22681aa24e0fc9cf4bdf3e2ac7ee21215
parent1b9adec789038d1059ff6a4d12058eed31619c6e (diff)
downloadmariadb-git-6a5b47a40015acfaf348e89d80d7b114dd53b120.tar.gz
Bug#51980 mysqld service crashes with a simple COUNT(DISTINCT) query over a view
Problem: Segmentation fault in add_group_and_distinct_keys() when accessing field of what is assumed to be an Item_field object. Cause: In case of views, the item added to list by is_indexed_agg_distinct() was not of type Item_field, but Item_ref. Resolution: Add the real Item_field object, the one referred to by Item_ref object, to the list, instead. mysql-test/r/count_distinct.result: Results for test case for Bug#51980. mysql-test/t/count_distinct.test: Test case for Bug#51980. Table needs to contain at least two rows to avoid const table optimization. sql/sql_select.cc: Make sure it is the actual Item_field object that is pushed to the out_args list of is_indexed_agg_distinct(), and not Item_ref objects.
-rw-r--r--mysql-test/r/count_distinct.result8
-rw-r--r--mysql-test/t/count_distinct.test11
-rw-r--r--sql/sql_select.cc2
3 files changed, 20 insertions, 1 deletions
diff --git a/mysql-test/r/count_distinct.result b/mysql-test/r/count_distinct.result
index 804bc1f4788..3b65dd0e608 100644
--- a/mysql-test/r/count_distinct.result
+++ b/mysql-test/r/count_distinct.result
@@ -86,3 +86,11 @@ select count(distinct if(f1,3,f2)) from t1;
count(distinct if(f1,3,f2))
2
drop table t1;
+create table t1 (i int);
+insert into t1 values (0), (1);
+create view v1 as select * from t1;
+select count(distinct i) from v1;
+count(distinct i)
+2
+drop table t1;
+drop view v1;
diff --git a/mysql-test/t/count_distinct.test b/mysql-test/t/count_distinct.test
index d0996689aeb..10b4ac6f0e7 100644
--- a/mysql-test/t/count_distinct.test
+++ b/mysql-test/t/count_distinct.test
@@ -96,3 +96,14 @@ insert into t1 values (0,1),(1,2);
select count(distinct if(f1,3,f2)) from t1;
drop table t1;
+#
+# Bug #51980 "mysqld service crashes with a simple COUNT(DISTINCT) query
+# over a view"
+#
+
+create table t1 (i int);
+insert into t1 values (0), (1);
+create view v1 as select * from t1;
+select count(distinct i) from v1;
+drop table t1;
+drop view v1;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 7d379ab34de..62a51a32ca2 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4157,7 +4157,7 @@ is_indexed_agg_distinct(JOIN *join, List<Item_field> *out_args)
optimization is applicable
*/
if (out_args)
- out_args->push_back((Item_field *) expr);
+ out_args->push_back((Item_field *) expr->real_item());
result= true;
}
}