mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
select_found.result, select_found.test:
Added a test case for bug #7945. sql_select.cc: Fixed bug #7945. If DISTINCT is used only with constants in a query with GROUP BY, we can apply an optimization that set LIMIT to 1 only in the case when there is no SQL_CALC_FOUND_ROWS.
This commit is contained in:
parent
3215550735
commit
8527f256c0
3 changed files with 27 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue