From 25c2d1adb09a3dd521a110013ab03eac3e1fc01a Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2005 02:40:27 -0800 Subject: [PATCH] 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. sql/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. mysql-test/t/select_found.test: Added a test case for bug #7945. mysql-test/r/select_found.result: Added a test case for bug #7945. --- mysql-test/r/select_found.result | 8 ++++++++ mysql-test/t/select_found.test | 9 +++++++++ sql/sql_select.cc | 13 ++++++++++--- 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 &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