summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/select_found.result8
-rw-r--r--mysql-test/t/select_found.test9
-rw-r--r--sql/sql_select.cc13
3 files changed, 27 insertions, 3 deletions
diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result
index 444124bcd67..11629addba4 100644
--- a/mysql-test/r/select_found.result
+++ b/mysql-test/r/select_found.result
@@ -223,3 +223,11 @@ SELECT FOUND_ROWS();
FOUND_ROWS()
0
DROP TABLE t1;
+CREATE TABLE t1 (a int, b int);
+INSERT INTO t1 VALUES (1,2), (1,3), (1,4), (1,5);
+SELECT SQL_CALC_FOUND_ROWS DISTINCT 'a' FROM t1 GROUP BY b LIMIT 2;
+a
+a
+SELECT FOUND_ROWS();
+FOUND_ROWS()
+1
diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test
index 7599277a867..997cadc2992 100644
--- a/mysql-test/t/select_found.test
+++ b/mysql-test/t/select_found.test
@@ -146,3 +146,12 @@ INSERT INTO t1 VALUES (0), (0), (1), (2);
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a = 0 GROUP BY a HAVING a > 10;
SELECT FOUND_ROWS();
DROP TABLE t1;
+
+#
+# Bug #7945: group by + distinct with constant expression + limit
+#
+
+CREATE TABLE t1 (a int, b int);
+INSERT INTO t1 VALUES (1,2), (1,3), (1,4), (1,5);
+SELECT SQL_CALC_FOUND_ROWS DISTINCT 'a' FROM t1 GROUP BY b LIMIT 2;
+SELECT FOUND_ROWS();
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index eda4ce73186..468cdf05d36 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2114,9 +2114,15 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
x = used key parts (1 <= x <= c)
*/
double rec_per_key;
+#if 0
if (!(rec_per_key=(double)
keyinfo->rec_per_key[keyinfo->key_parts-1]))
rec_per_key=(double) s->records/rec+1;
+#else
+ rec_per_key= keyinfo->rec_per_key[keyinfo->key_parts-1] ?
+ (double) keyinfo->rec_per_key[keyinfo->key_parts-1] :
+ (double) s->records/rec+1;
+#endif
if (!s->records)
tmp=0;
@@ -6276,13 +6282,14 @@ remove_duplicates(JOIN *join, TABLE *entry,List<Item> &fields, Item *having)
field_count++;
}
- if (!field_count)
- { // only const items
+ if (!field_count && !(join->select_options & OPTION_FOUND_ROWS))
+ { // only const items with no OPTION_FOUND_ROWS
join->thd->select_limit=1; // Only send first row
DBUG_RETURN(0);
}
Field **first_field=entry->field+entry->fields - field_count;
- offset=entry->field[entry->fields - field_count]->offset();
+ offset= field_count ?
+ entry->field[entry->fields - field_count]->offset() : 0;
reclength=entry->reclength-offset;
free_io_cache(entry); // Safety