1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-31 22:22:30 +03:00

Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar

statements
Currently the optimizer evaluates loose index scan only for top-level SELECT
statements
Extend loose index scan applicability by :
 - Test the applicability of loose scan for each sub-select, instead of the
   whole query. This change enables loose index scan for sub-queries.
 - allow non-select statements with SELECT parts (like, e.g. 
   CREATE TABLE .. SELECT ...) to use loose index scan.


mysql-test/r/group_min_max.result:
  Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar
             statements
   - test case
mysql-test/t/group_min_max.test:
  Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar
             statements
   - test case
sql/opt_range.cc:
  Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar
             statements
   - loose index scan will be tried over the current subselect 
     (lex->current_select) instead of the whole query (lex->select_lex).
   - allow non-select statements with SELECT parts (like, e.g. 
     CREATE TABLE .. SELECT ...) to use loose index scan.
This commit is contained in:
unknown
2006-11-28 18:06:47 +02:00
parent 3ebdcee5c6
commit 762f4ac167
3 changed files with 187 additions and 3 deletions

View File

@@ -7445,7 +7445,7 @@ static TRP_GROUP_MIN_MAX *
get_best_group_min_max(PARAM *param, SEL_TREE *tree)
{
THD *thd= param->thd;
JOIN *join= thd->lex->select_lex.join;
JOIN *join= thd->lex->current_select->join;
TABLE *table= param->table;
bool have_min= FALSE; /* TRUE if there is a MIN function. */
bool have_max= FALSE; /* TRUE if there is a MAX function. */
@@ -7466,7 +7466,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
DBUG_ENTER("get_best_group_min_max");
/* Perform few 'cheap' tests whether this access method is applicable. */
if (!join || (thd->lex->sql_command != SQLCOM_SELECT))
if (!join)
DBUG_RETURN(NULL); /* This is not a select statement. */
if ((join->tables != 1) || /* The query must reference one table. */
((!join->group_list) && /* Neither GROUP BY nor a DISTINCT query. */
@@ -8316,7 +8316,7 @@ TRP_GROUP_MIN_MAX::make_quick(PARAM *param, bool retrieve_full_rows,
DBUG_ENTER("TRP_GROUP_MIN_MAX::make_quick");
quick= new QUICK_GROUP_MIN_MAX_SELECT(param->table,
param->thd->lex->select_lex.join,
param->thd->lex->current_select->join,
have_min, have_max, min_max_arg_part,
group_prefix_len, used_key_parts,
index_info, index, read_cost, records,