sql_select.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:288k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2004 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* mysql_select and join optimization */
  14. #ifdef USE_PRAGMA_IMPLEMENTATION
  15. #pragma implementation // gcc: Class implementation
  16. #endif
  17. #include "mysql_priv.h"
  18. #include "sql_select.h"
  19. #include <m_ctype.h>
  20. #include <hash.h>
  21. #include <ft_global.h>
  22. const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
  23.       "MAYBE_REF","ALL","range","index","fulltext",
  24.       "ref_or_null","unique_subquery","index_subquery"
  25. };
  26. static void optimize_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse_array);
  27. static bool make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
  28.  DYNAMIC_ARRAY *keyuse);
  29. static bool update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,
  30. JOIN_TAB *join_tab,
  31.                                 uint tables, COND *conds,
  32. table_map table_map, SELECT_LEX *select_lex);
  33. static int sort_keyuse(KEYUSE *a,KEYUSE *b);
  34. static void set_position(JOIN *join,uint index,JOIN_TAB *table,KEYUSE *key);
  35. static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
  36.        table_map used_tables);
  37. static void find_best_combination(JOIN *join,table_map rest_tables);
  38. static void find_best(JOIN *join,table_map rest_tables,uint index,
  39.       double record_count,double read_time);
  40. static uint cache_record_length(JOIN *join,uint index);
  41. static double prev_record_reads(JOIN *join,table_map found_ref);
  42. static bool get_best_combination(JOIN *join);
  43. static store_key *get_store_key(THD *thd,
  44. KEYUSE *keyuse, table_map used_tables,
  45. KEY_PART_INFO *key_part, char *key_buff,
  46. uint maybe_null);
  47. static bool make_simple_join(JOIN *join,TABLE *tmp_table);
  48. static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item);
  49. static void make_join_readinfo(JOIN *join,uint options);
  50. static bool only_eq_ref_tables(JOIN *join, ORDER *order, table_map tables);
  51. static void update_depend_map(JOIN *join);
  52. static void update_depend_map(JOIN *join, ORDER *order);
  53. static ORDER *remove_const(JOIN *join,ORDER *first_order,COND *cond,
  54.    bool change_list, bool *simple_order);
  55. static int return_zero_rows(JOIN *join, select_result *res,TABLE_LIST *tables,
  56.     List<Item> &fields, bool send_row,
  57.     uint select_options, const char *info,
  58.     Item *having, Procedure *proc,
  59.     SELECT_LEX_UNIT *unit);
  60. static COND *optimize_cond(THD *thd, COND *conds,
  61.    Item::cond_result *cond_value);
  62. static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item);
  63. static bool open_tmp_table(TABLE *table);
  64. static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
  65.     ulong options);
  66. static int do_select(JOIN *join,List<Item> *fields,TABLE *tmp_table,
  67.      Procedure *proc);
  68. static int sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records);
  69. static int sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records);
  70. static int flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last);
  71. static int end_send(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
  72. static int end_send_group(JOIN *join, JOIN_TAB *join_tab,bool end_of_records);
  73. static int end_write(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
  74. static int end_update(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
  75. static int end_unique_update(JOIN *join,JOIN_TAB *join_tab,
  76.      bool end_of_records);
  77. static int end_write_group(JOIN *join, JOIN_TAB *join_tab,
  78.    bool end_of_records);
  79. static int test_if_group_changed(List<Item_buff> &list);
  80. static int join_read_const_table(JOIN_TAB *tab, POSITION *pos);
  81. static int join_read_system(JOIN_TAB *tab);
  82. static int join_read_const(JOIN_TAB *tab);
  83. static int join_read_key(JOIN_TAB *tab);
  84. static int join_read_always_key(JOIN_TAB *tab);
  85. static int join_read_last_key(JOIN_TAB *tab);
  86. static int join_no_more_records(READ_RECORD *info);
  87. static int join_read_next(READ_RECORD *info);
  88. static int join_init_quick_read_record(JOIN_TAB *tab);
  89. static int test_if_quick_select(JOIN_TAB *tab);
  90. static int join_init_read_record(JOIN_TAB *tab);
  91. static int join_read_first(JOIN_TAB *tab);
  92. static int join_read_next(READ_RECORD *info);
  93. static int join_read_next_same(READ_RECORD *info);
  94. static int join_read_last(JOIN_TAB *tab);
  95. static int join_read_prev_same(READ_RECORD *info);
  96. static int join_read_prev(READ_RECORD *info);
  97. static int join_ft_read_first(JOIN_TAB *tab);
  98. static int join_ft_read_next(READ_RECORD *info);
  99. static int join_read_always_key_or_null(JOIN_TAB *tab);
  100. static int join_read_next_same_or_null(READ_RECORD *info);
  101. static COND *make_cond_for_table(COND *cond,table_map table,
  102.  table_map used_table);
  103. static Item* part_of_refkey(TABLE *form,Field *field);
  104. static uint find_shortest_key(TABLE *table, const key_map *usable_keys);
  105. static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,
  106.     ha_rows select_limit, bool no_changes);
  107. static int create_sort_index(THD *thd, JOIN *join, ORDER *order,
  108.      ha_rows filesort_limit, ha_rows select_limit);
  109. static int remove_duplicates(JOIN *join,TABLE *entry,List<Item> &fields,
  110.      Item *having);
  111. static int remove_dup_with_compare(THD *thd, TABLE *entry, Field **field,
  112.    ulong offset,Item *having);
  113. static int remove_dup_with_hash_index(THD *thd,TABLE *table,
  114.       uint field_count, Field **first_field,
  115.       ulong key_length,Item *having);
  116. static int join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count);
  117. static ulong used_blob_length(CACHE_FIELD **ptr);
  118. static bool store_record_in_cache(JOIN_CACHE *cache);
  119. static void reset_cache_read(JOIN_CACHE *cache);
  120. static void reset_cache_write(JOIN_CACHE *cache);
  121. static void read_cached_record(JOIN_TAB *tab);
  122. static bool cmp_buffer_with_ref(JOIN_TAB *tab);
  123. static bool setup_new_fields(THD *thd,TABLE_LIST *tables,List<Item> &fields,
  124.      List<Item> &all_fields,ORDER *new_order);
  125. static ORDER *create_distinct_group(THD *thd, Item **ref_pointer_array,
  126.                                     ORDER *order, List<Item> &fields,
  127.     bool *all_order_by_fields_used);
  128. static bool test_if_subpart(ORDER *a,ORDER *b);
  129. static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
  130. static void calc_group_buffer(JOIN *join,ORDER *group);
  131. static bool make_group_fields(JOIN *main_join, JOIN *curr_join);
  132. static bool alloc_group_fields(JOIN *join,ORDER *group);
  133. // Create list for using with tempory table
  134. static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
  135.      List<Item> &new_list1,
  136.      List<Item> &new_list2,
  137.      uint elements, List<Item> &items);
  138. // Create list for using with tempory table
  139. static bool change_refs_to_tmp_fields(THD *thd, Item **ref_pointer_array,
  140.       List<Item> &new_list1,
  141.       List<Item> &new_list2,
  142.       uint elements, List<Item> &items);
  143. static void init_tmptable_sum_functions(Item_sum **func);
  144. static void update_tmptable_sum_func(Item_sum **func,TABLE *tmp_table);
  145. static void copy_sum_funcs(Item_sum **func_ptr, Item_sum **end);
  146. static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab);
  147. static bool init_sum_functions(Item_sum **func, Item_sum **end);
  148. static bool update_sum_func(Item_sum **func);
  149. static void select_describe(JOIN *join, bool need_tmp_table,bool need_order,
  150.     bool distinct, const char *message=NullS);
  151. static Item *remove_additional_cond(Item* conds);
  152. /*
  153.   This handles SELECT with and without UNION
  154. */
  155. int handle_select(THD *thd, LEX *lex, select_result *result)
  156. {
  157.   int res;
  158.   register SELECT_LEX *select_lex = &lex->select_lex;
  159.   DBUG_ENTER("handle_select");
  160.   if (select_lex->next_select())
  161.     res=mysql_union(thd, lex, result, &lex->unit);
  162.   else
  163.     res= mysql_select(thd, &select_lex->ref_pointer_array,
  164.       (TABLE_LIST*) select_lex->table_list.first,
  165.       select_lex->with_wild, select_lex->item_list,
  166.       select_lex->where,
  167.       select_lex->order_list.elements +
  168.       select_lex->group_list.elements,
  169.       (ORDER*) select_lex->order_list.first,
  170.       (ORDER*) select_lex->group_list.first,
  171.       select_lex->having,
  172.       (ORDER*) lex->proc_list.first,
  173.       select_lex->options | thd->options,
  174.       result, &(lex->unit), &(lex->select_lex));
  175.   /* Don't set res if it's -1 as we may want this later */
  176.   DBUG_PRINT("info",("res: %d  report_error: %d", res,
  177.      thd->net.report_error));
  178.   if (thd->net.report_error || res<0)
  179.   {
  180.     result->send_error(0, NullS);
  181.     result->abort();
  182.     res= 1; // Error sent to client
  183.   }
  184.   DBUG_RETURN(res);
  185. }
  186. /*
  187.   Function to setup clauses without sum functions
  188. */
  189. inline int setup_without_group(THD *thd, Item **ref_pointer_array,
  190.        TABLE_LIST *tables,
  191.        List<Item> &fields,
  192.        List<Item> &all_fields,
  193.        COND **conds,
  194.        ORDER *order,
  195.        ORDER *group, bool *hidden_group_fields)
  196. {
  197.   bool save_allow_sum_func;
  198.   int res;
  199.   DBUG_ENTER("setup_without_group");
  200.   save_allow_sum_func= thd->allow_sum_func;
  201.   thd->allow_sum_func= 0;
  202.   res= (setup_conds(thd, tables, conds) ||
  203.         setup_order(thd, ref_pointer_array, tables, fields, all_fields,
  204.                     order) ||
  205.         setup_group(thd, ref_pointer_array, tables, fields, all_fields,
  206.                     group, hidden_group_fields));
  207.   thd->allow_sum_func= save_allow_sum_func;
  208.   DBUG_RETURN(res);
  209. }
  210. /*****************************************************************************
  211.   Check fields, find best join, do the select and output fields.
  212.   mysql_select assumes that all tables are already opened
  213. *****************************************************************************/
  214. /*
  215.   Prepare of whole select (including sub queries in future).
  216.   return -1 on error
  217.           0 on success
  218. */
  219. int
  220. JOIN::prepare(Item ***rref_pointer_array,
  221.       TABLE_LIST *tables_init,
  222.       uint wild_num, COND *conds_init, uint og_num,
  223.       ORDER *order_init, ORDER *group_init,
  224.       Item *having_init,
  225.       ORDER *proc_param_init, SELECT_LEX *select_lex_arg,
  226.       SELECT_LEX_UNIT *unit_arg)
  227. {
  228.   DBUG_ENTER("JOIN::prepare");
  229.   // to prevent double initialization on EXPLAIN
  230.   if (optimized)
  231.     DBUG_RETURN(0);
  232.   conds= conds_init;
  233.   order= order_init;
  234.   group_list= group_init;
  235.   having= having_init;
  236.   proc_param= proc_param_init;
  237.   tables_list= tables_init;
  238.   select_lex= select_lex_arg;
  239.   select_lex->join= this;
  240.   union_part= (unit_arg->first_select()->next_select() != 0);
  241.   /* Check that all tables, fields, conds and order are ok */
  242.   if (setup_tables(tables_list) ||
  243.       setup_wild(thd, tables_list, fields_list, &all_fields, wild_num) ||
  244.       select_lex->setup_ref_array(thd, og_num) ||
  245.       setup_fields(thd, (*rref_pointer_array), tables_list, fields_list, 1,
  246.    &all_fields, 1) ||
  247.       setup_without_group(thd, (*rref_pointer_array), tables_list, fields_list,
  248.   all_fields, &conds, order, group_list, 
  249.   &hidden_group_fields))
  250.     DBUG_RETURN(-1); /* purecov: inspected */
  251.   ref_pointer_array= *rref_pointer_array;
  252.   
  253.   if (having)
  254.   {
  255.     thd->where="having clause";
  256.     thd->allow_sum_func=1;
  257.     select_lex->having_fix_field= 1;
  258.     bool having_fix_rc= (!having->fixed &&
  259.  (having->fix_fields(thd, tables_list, &having) ||
  260.   having->check_cols(1)));
  261.     select_lex->having_fix_field= 0;
  262.     if (having_fix_rc || thd->net.report_error)
  263.       DBUG_RETURN(-1); /* purecov: inspected */
  264.     if (having->with_sum_func)
  265.       having->split_sum_func(thd, ref_pointer_array, all_fields);
  266.   }
  267.   // Is it subselect
  268.   {
  269.     Item_subselect *subselect;
  270.     if ((subselect= select_lex->master_unit()->item))
  271.     {
  272.       Item_subselect::trans_res res;
  273.       if ((res= subselect->select_transformer(this)) !=
  274.   Item_subselect::RES_OK)
  275. DBUG_RETURN((res == Item_subselect::RES_ERROR));
  276.     }
  277.   }
  278.   if (setup_ftfuncs(select_lex)) /* should be after having->fix_fields */
  279.     DBUG_RETURN(-1);
  280.   
  281.   /*
  282.     Check if one one uses a not constant column with group functions
  283.     and no GROUP BY.
  284.     TODO:  Add check of calculation of GROUP functions and fields:
  285.    SELECT COUNT(*)+table.col1 from table1;
  286.   */
  287.   {
  288.     if (!group_list)
  289.     {
  290.       uint flag=0;
  291.       List_iterator_fast<Item> it(fields_list);
  292.       Item *item;
  293.       while ((item= it++))
  294.       {
  295. if (item->with_sum_func)
  296.   flag|=1;
  297. else if (!(flag & 2) && !item->const_during_execution())
  298.   flag|=2;
  299.       }
  300.       if (flag == 3)
  301.       {
  302. my_error(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,MYF(0));
  303. DBUG_RETURN(-1);
  304.       }
  305.     }
  306.     TABLE_LIST *table_ptr;
  307.     for (table_ptr= tables_list ; table_ptr ; table_ptr= table_ptr->next)
  308.       tables++;
  309.   }
  310.   {
  311.     /* Caclulate the number of groups */
  312.     send_group_parts= 0;
  313.     for (ORDER *group_tmp= group_list ; group_tmp ; group_tmp= group_tmp->next)
  314.       send_group_parts++;
  315.   }
  316.   
  317.   procedure= setup_procedure(thd, proc_param, result, fields_list, &error);
  318.   if (error)
  319.     goto err; /* purecov: inspected */
  320.   if (procedure)
  321.   {
  322.     if (setup_new_fields(thd, tables_list, fields_list, all_fields,
  323.  procedure->param_fields))
  324. goto err; /* purecov: inspected */
  325.     if (procedure->group)
  326.     {
  327.       if (!test_if_subpart(procedure->group,group_list))
  328.       { /* purecov: inspected */
  329. my_message(0,"Can't handle procedures with differents groups yet",
  330.    MYF(0)); /* purecov: inspected */
  331. goto err; /* purecov: inspected */
  332.       }
  333.     }
  334. #ifdef NOT_NEEDED
  335.     else if (!group_list && procedure->flags & PROC_GROUP)
  336.     {
  337.       my_message(0,"Select must have a group with this procedure",MYF(0));
  338.       goto err;
  339.     }
  340. #endif
  341.     if (order && (procedure->flags & PROC_NO_SORT))
  342.     { /* purecov: inspected */
  343.       my_message(0,"Can't use order with this procedure",MYF(0)); /* purecov: inspected */
  344.       goto err; /* purecov: inspected */
  345.     }
  346.   }
  347.   /* Init join struct */
  348.   count_field_types(&tmp_table_param, all_fields, 0);
  349.   ref_pointer_array_size= all_fields.elements*sizeof(Item*);
  350.   this->group= group_list != 0;
  351.   row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR :
  352.       unit_arg->select_limit_cnt);
  353.   /* select_limit is used to decide if we are likely to scan the whole table */
  354.   select_limit= unit_arg->select_limit_cnt;
  355.   if (having || (select_options & OPTION_FOUND_ROWS))
  356.     select_limit= HA_POS_ERROR;
  357.   do_send_rows = (unit_arg->select_limit_cnt) ? 1 : 0;
  358.   unit= unit_arg;
  359. #ifdef RESTRICTED_GROUP
  360.   if (sum_func_count && !group_list && (func_count || field_count))
  361.   {
  362.     my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0));
  363.     goto err;
  364.   }
  365. #endif
  366.   /*
  367.     We must not yet prepare the result table if it is the same as one of the 
  368.     source tables (INSERT SELECT). This is checked in mysql_execute_command()
  369.     and OPTION_BUFFER_RESULT is added to the select_options. A temporary 
  370.     table is then used to hold the result. The preparation may disable 
  371.     indexes on the result table, which may be used during the select, if it
  372.     is the same table (Bug #6034). Do the preparation after the select phase.
  373.   */
  374.   if (! procedure && ! test(select_options & OPTION_BUFFER_RESULT) &&
  375.       result && result->prepare(fields_list, unit_arg))
  376.     goto err; /* purecov: inspected */
  377.   if (select_lex->olap == ROLLUP_TYPE && rollup_init())
  378.     goto err;
  379.   if (alloc_func_list())
  380.     goto err;
  381.   DBUG_RETURN(0); // All OK
  382. err:
  383.   delete procedure; /* purecov: inspected */
  384.   procedure= 0;
  385.   DBUG_RETURN(-1); /* purecov: inspected */
  386. }
  387. /*
  388.   test if it is known for optimisation IN subquery
  389.   SYNOPSYS
  390.     JOIN::test_in_subselect
  391.     where - pointer for variable in which conditions should be
  392.             stored if subquery is known
  393.   RETURN
  394.     1 - known
  395.     0 - unknown
  396. */
  397. bool JOIN::test_in_subselect(Item **where)
  398. {
  399.   if (conds->type() == Item::FUNC_ITEM &&
  400.       ((Item_func *)this->conds)->functype() == Item_func::EQ_FUNC &&
  401.       ((Item_func *)conds)->arguments()[0]->type() == Item::REF_ITEM &&
  402.       ((Item_func *)conds)->arguments()[1]->type() == Item::FIELD_ITEM)
  403.   {
  404.     join_tab->info= "Using index";
  405.     *where= 0;
  406.     return 1;
  407.   }
  408.   if (conds->type() == Item::COND_ITEM &&
  409.       ((class Item_func *)this->conds)->functype() ==
  410.       Item_func::COND_AND_FUNC)
  411.   {
  412.     if ((*where= remove_additional_cond(conds)))
  413.       join_tab->info= "Using index; Using where";
  414.     else
  415.       join_tab->info= "Using index";
  416.     return 1;
  417.   }
  418.   return 0;
  419. }
  420. /*
  421.   global select optimisation.
  422.   return 0 - success
  423.          1 - error
  424.   error code saved in field 'error'
  425. */
  426. int
  427. JOIN::optimize()
  428. {
  429.   DBUG_ENTER("JOIN::optimize");
  430.   // to prevent double initialization on EXPLAIN
  431.   if (optimized)
  432.     DBUG_RETURN(0);
  433.   optimized= 1;
  434.   // Ignore errors of execution if option IGNORE present
  435.   if (thd->lex->ignore)
  436.     thd->lex->current_select->no_error= 1;
  437. #ifdef HAVE_REF_TO_FIELDS // Not done yet
  438.   /* Add HAVING to WHERE if possible */
  439.   if (having && !group_list && !sum_func_count)
  440.   {
  441.     if (!conds)
  442.     {
  443.       conds= having;
  444.       having= 0;
  445.     }
  446.     else if ((conds=new Item_cond_and(conds,having)))
  447.     {
  448.       conds->fix_fields(thd, tables_list, &conds);
  449.       conds->change_ref_to_fields(thd, tables_list);
  450.       conds->top_level_item();
  451.       having= 0;
  452.     }
  453.   }
  454. #endif
  455.   conds= optimize_cond(thd, conds, &cond_value);
  456.   if (thd->net.report_error)
  457.   {
  458.     error= 1;
  459.     DBUG_PRINT("error",("Error from optimize_cond"));
  460.     DBUG_RETURN(1);
  461.   }
  462.   if (cond_value == Item::COND_FALSE ||
  463.       (!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
  464.   { /* Impossible cond */
  465.     zero_result_cause= "Impossible WHERE";
  466.     error= 0;
  467.     DBUG_RETURN(0);
  468.   }
  469.   /* Optimize count(*), min() and max() */
  470.   if (tables_list && tmp_table_param.sum_func_count && ! group_list)
  471.   {
  472.     int res;
  473.     /*
  474.       opt_sum_query() returns -1 if no rows match to the WHERE conditions,
  475.       or 1 if all items were resolved, or 0, or an error number HA_ERR_...
  476.     */
  477.     if ((res=opt_sum_query(tables_list, all_fields, conds)))
  478.     {
  479.       if (res > 1)
  480.       {
  481. DBUG_RETURN(1);
  482.       }
  483.       if (res < 0)
  484.       {
  485. zero_result_cause= "No matching min/max row";
  486. error=0;
  487. DBUG_RETURN(0);
  488.       }
  489.       zero_result_cause= "Select tables optimized away";
  490.       tables_list= 0; // All tables resolved
  491.     }
  492.   }
  493.   if (!tables_list)
  494.   {
  495.     error= 0;
  496.     DBUG_RETURN(0);
  497.   }
  498.   error= -1; // Error is sent to client
  499.   sort_by_table= get_sort_by_table(order, group_list, tables_list);
  500.   /* Calculate how to do the join */
  501.   thd->proc_info= "statistics";
  502.   if (make_join_statistics(this, tables_list, conds, &keyuse) ||
  503.       thd->is_fatal_error)
  504.   {
  505.     DBUG_PRINT("error",("Error: make_join_statistics() failed"));
  506.     DBUG_RETURN(1);
  507.   }
  508.   /* Remove distinct if only const tables */
  509.   select_distinct= select_distinct && (const_tables != tables);
  510.   thd->proc_info= "preparing";
  511.   if (result->initialize_tables(this))
  512.   {
  513.     DBUG_PRINT("error",("Error: initialize_tables() failed"));
  514.     DBUG_RETURN(1); // error == -1
  515.   }
  516.   if (const_table_map != found_const_table_map &&
  517.       !(select_options & SELECT_DESCRIBE) &&
  518.       (!conds ||
  519.        !(conds->used_tables() & RAND_TABLE_BIT) ||
  520.        select_lex->master_unit() == &thd->lex->unit)) // upper level SELECT
  521.   {
  522.     zero_result_cause= "no matching row in const table";
  523.     DBUG_PRINT("error",("Error: %s", zero_result_cause));
  524.     error= 0;
  525.     DBUG_RETURN(0);
  526.   }
  527.   if (!(thd->options & OPTION_BIG_SELECTS) &&
  528.       best_read > (double) thd->variables.max_join_size &&
  529.       !(select_options & SELECT_DESCRIBE))
  530.   { /* purecov: inspected */
  531.     my_message(ER_TOO_BIG_SELECT, ER(ER_TOO_BIG_SELECT), MYF(0));
  532.     error= -1;
  533.     DBUG_RETURN(1);
  534.   }
  535.   if (const_tables && !thd->locked_tables &&
  536.       !(select_options & SELECT_NO_UNLOCK))
  537.     mysql_unlock_some_tables(thd, table, const_tables);
  538.   if (!conds && outer_join)
  539.   {
  540.     /* Handle the case where we have an OUTER JOIN without a WHERE */
  541.     conds=new Item_int((longlong) 1,1); // Always true
  542.   }
  543.   select=make_select(*table, const_table_map,
  544.      const_table_map, conds, &error);
  545.   if (error)
  546.   { /* purecov: inspected */
  547.     error= -1; /* purecov: inspected */
  548.     DBUG_PRINT("error",("Error: make_select() failed"));
  549.     DBUG_RETURN(1);
  550.   }
  551.   if (make_join_select(this, select, conds))
  552.   {
  553.     zero_result_cause=
  554.       "Impossible WHERE noticed after reading const tables";
  555.     DBUG_RETURN(0); // error == 0
  556.   }
  557.   error= -1; /* if goto err */
  558.   /* Optimize distinct away if possible */
  559.   {
  560.     ORDER *org_order= order;
  561.     order=remove_const(this, order,conds,1, &simple_order);
  562.     /*
  563.       If we are using ORDER BY NULL or ORDER BY const_expression,
  564.       return result in any order (even if we are using a GROUP BY)
  565.     */
  566.     if (!order && org_order)
  567.       skip_sort_order= 1;
  568.   }
  569.   if (group_list || tmp_table_param.sum_func_count)
  570.   {
  571.     if (! hidden_group_fields && rollup.state == ROLLUP::STATE_NONE)
  572.       select_distinct=0;
  573.   }
  574.   else if (select_distinct && tables - const_tables == 1)
  575.   {
  576.     /*
  577.       We are only using one table. In this case we change DISTINCT to a
  578.       GROUP BY query if:
  579.       - The GROUP BY can be done through indexes (no sort) and the ORDER
  580.         BY only uses selected fields.
  581. (In this case we can later optimize away GROUP BY and ORDER BY)
  582.       - We are scanning the whole table without LIMIT
  583.         This can happen if:
  584.         - We are using CALC_FOUND_ROWS
  585.         - We are using an ORDER BY that can't be optimized away.
  586.       We don't want to use this optimization when we are using LIMIT
  587.       because in this case we can just create a temporary table that
  588.       holds LIMIT rows and stop when this table is full.
  589.     */
  590.     JOIN_TAB *tab= &join_tab[const_tables];
  591.     bool all_order_fields_used;
  592.     if (order)
  593.       skip_sort_order= test_if_skip_sort_order(tab, order, select_limit, 1);
  594.     if ((group_list=create_distinct_group(thd, select_lex->ref_pointer_array,
  595.                                           order, fields_list,
  596.           &all_order_fields_used)))
  597.     {
  598.       bool skip_group= (skip_sort_order &&
  599. test_if_skip_sort_order(tab, group_list, select_limit,
  600. 1) != 0);
  601.       if ((skip_group && all_order_fields_used) ||
  602.   select_limit == HA_POS_ERROR ||
  603.   (order && !skip_sort_order))
  604.       {
  605. /*  Change DISTINCT to GROUP BY */
  606. select_distinct= 0;
  607. no_order= !order;
  608. if (all_order_fields_used)
  609. {
  610.   if (order && skip_sort_order)
  611.   {
  612.     /*
  613.       Force MySQL to read the table in sorted order to get result in
  614.       ORDER BY order.
  615.     */
  616.     tmp_table_param.quick_group=0;
  617.   }
  618.   order=0;
  619.         }
  620. group=1; // For end_write_group
  621.       }
  622.       else
  623. group_list= 0;
  624.     }
  625.     else if (thd->is_fatal_error) // End of memory
  626.       DBUG_RETURN(1);
  627.   }
  628.   simple_group= 0;
  629.   {
  630.     ORDER *old_group_list;
  631.     group_list= remove_const(this, (old_group_list= group_list), conds,
  632.                              rollup.state == ROLLUP::STATE_NONE,
  633.      &simple_group);
  634.     if (old_group_list && !group_list)
  635.       select_distinct= 0;
  636.   }
  637.   if (!group_list && group)
  638.   {
  639.     order=0; // The output has only one row
  640.     simple_order=1;
  641.     select_distinct= 0;                       // No need in distinct for 1 row
  642.   }
  643.   calc_group_buffer(this, group_list);
  644.   send_group_parts= tmp_table_param.group_parts; /* Save org parts */
  645.   if (procedure && procedure->group)
  646.   {
  647.     group_list= procedure->group= remove_const(this, procedure->group, conds,
  648.        1, &simple_group);
  649.     calc_group_buffer(this, group_list);
  650.   }
  651.   if (test_if_subpart(group_list, order) ||
  652.       (!group_list && tmp_table_param.sum_func_count))
  653.     order=0;
  654.   // Can't use sort on head table if using row cache
  655.   if (full_join)
  656.   {
  657.     if (group_list)
  658.       simple_group=0;
  659.     if (order)
  660.       simple_order=0;
  661.   }
  662.   /*
  663.     Check if we need to create a temporary table.
  664.     This has to be done if all tables are not already read (const tables)
  665.     and one of the following conditions holds:
  666.     - We are using DISTINCT (simple distinct's are already optimized away)
  667.     - We are using an ORDER BY or GROUP BY on fields not in the first table
  668.     - We are using different ORDER BY and GROUP BY orders
  669.     - The user wants us to buffer the result.
  670.   */
  671.   need_tmp= (const_tables != tables &&
  672.      ((select_distinct || !simple_order || !simple_group) ||
  673.       (group_list && order) ||
  674.       test(select_options & OPTION_BUFFER_RESULT)));
  675.   // No cache for MATCH
  676.   make_join_readinfo(this,
  677.      (select_options & (SELECT_DESCRIBE |
  678. SELECT_NO_JOIN_CACHE)) |
  679.      (select_lex->ftfunc_list->elements ?
  680.       SELECT_NO_JOIN_CACHE : 0));
  681.   /* Perform FULLTEXT search before all regular searches */
  682.   if (!(select_options & SELECT_DESCRIBE))
  683.     init_ftfuncs(thd, select_lex, test(order));
  684.   /*
  685.     is this simple IN subquery?
  686.   */
  687.   if (!group_list && !order &&
  688.       unit->item && unit->item->substype() == Item_subselect::IN_SUBS &&
  689.       tables == 1 && conds &&
  690.       !unit->first_select()->next_select())
  691.   {
  692.     if (!having)
  693.     {
  694.       Item *where= 0;
  695.       if (join_tab[0].type == JT_EQ_REF &&
  696.   join_tab[0].ref.items[0]->name == in_left_expr_name)
  697.       {
  698. if (test_in_subselect(&where))
  699. {
  700.   join_tab[0].type= JT_UNIQUE_SUBQUERY;
  701.   error= 0;
  702.   DBUG_RETURN(unit->item->
  703.       change_engine(new
  704.     subselect_uniquesubquery_engine(thd,
  705.     join_tab,
  706.     unit->item,
  707.     where)));
  708. }
  709.       }
  710.       else if (join_tab[0].type == JT_REF &&
  711.        join_tab[0].ref.items[0]->name == in_left_expr_name)
  712.       {
  713. if (test_in_subselect(&where))
  714. {
  715.   join_tab[0].type= JT_INDEX_SUBQUERY;
  716.   error= 0;
  717.   DBUG_RETURN(unit->item->
  718.       change_engine(new
  719.     subselect_indexsubquery_engine(thd,
  720.    join_tab,
  721.    unit->item,
  722.    where,
  723.    0)));
  724. }
  725.       }
  726.     } else if (join_tab[0].type == JT_REF_OR_NULL &&
  727.        join_tab[0].ref.items[0]->name == in_left_expr_name &&
  728.        having->type() == Item::FUNC_ITEM &&
  729.        ((Item_func *) having)->functype() ==
  730.        Item_func::ISNOTNULLTEST_FUNC)
  731.     {
  732.       join_tab[0].type= JT_INDEX_SUBQUERY;
  733.       error= 0;
  734.       if ((conds= remove_additional_cond(conds)))
  735. join_tab->info= "Using index; Using where";
  736.       else
  737. join_tab->info= "Using index";
  738.       DBUG_RETURN(unit->item->
  739.   change_engine(new subselect_indexsubquery_engine(thd,
  740.    join_tab,
  741.    unit->item,
  742.    conds,
  743.    1)));
  744.     }
  745.   }
  746.   /*
  747.     Need to tell Innobase that to play it safe, it should fetch all
  748.     columns of the tables: this is because MySQL may build row
  749.     pointers for the rows, and for all columns of the primary key the
  750.     field->query_id has not necessarily been set to thd->query_id by
  751.     MySQL.
  752.   */
  753. #ifdef HAVE_INNOBASE_DB
  754.   if (need_tmp || select_distinct || group_list || order)
  755.   {
  756.     for (uint i_h = const_tables; i_h < tables; i_h++)
  757.     {
  758.       TABLE* table_h = join_tab[i_h].table;
  759.       table_h->file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY);
  760.     }
  761.   }
  762. #endif
  763.   DBUG_EXECUTE("info",TEST_join(this););
  764.   /*
  765.     Because filesort always does a full table scan or a quick range scan
  766.     we must add the removed reference to the select for the table.
  767.     We only need to do this when we have a simple_order or simple_group
  768.     as in other cases the join is done before the sort.
  769.   */
  770.   if (const_tables != tables &&
  771.       (order || group_list) &&
  772.       join_tab[const_tables].type != JT_ALL &&
  773.       join_tab[const_tables].type != JT_FT &&
  774.       join_tab[const_tables].type != JT_REF_OR_NULL &&
  775.       (order && simple_order || group_list && simple_group))
  776.   {
  777.     if (add_ref_to_table_cond(thd,&join_tab[const_tables]))
  778.       DBUG_RETURN(1);
  779.   }
  780.   if (!(select_options & SELECT_BIG_RESULT) &&
  781.       ((group_list && const_tables != tables &&
  782. (!simple_group ||
  783.  !test_if_skip_sort_order(&join_tab[const_tables], group_list,
  784.   unit->select_limit_cnt, 0))) ||
  785.        select_distinct) &&
  786.       tmp_table_param.quick_group && !procedure)
  787.   {
  788.     need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort
  789.   }
  790.   tmp_having= having;
  791.   if (select_options & SELECT_DESCRIBE)
  792.   {
  793.     error= 0;
  794.     DBUG_RETURN(0);
  795.   }
  796.   having= 0;
  797.   /* Create a tmp table if distinct or if the sort is too complicated */
  798.   if (need_tmp)
  799.   {
  800.     DBUG_PRINT("info",("Creating tmp table"));
  801.     thd->proc_info="Creating tmp table";
  802.     init_items_ref_array();
  803.     tmp_table_param.hidden_field_count= (all_fields.elements -
  804.  fields_list.elements);
  805.     if (!(exec_tmp_table1 =
  806.   create_tmp_table(thd, &tmp_table_param, all_fields,
  807.    ((!simple_group && !procedure &&
  808.      !(test_flags & TEST_NO_KEY_GROUP)) ?
  809.     group_list : (ORDER*) 0),
  810.    group_list ? 0 : select_distinct,
  811.    group_list && simple_group,
  812.    select_options,
  813.    (order == 0 || skip_sort_order) ? select_limit :
  814.    HA_POS_ERROR,
  815.    (char *) "")))
  816.       DBUG_RETURN(1);
  817.     /*
  818.       We don't have to store rows in temp table that doesn't match HAVING if:
  819.       - we are sorting the table and writing complete group rows to the
  820.         temp table.
  821.       - We are using DISTINCT without resolving the distinct as a GROUP BY
  822.         on all columns.
  823.       
  824.       If having is not handled here, it will be checked before the row
  825.       is sent to the client.
  826.     */    
  827.     if (tmp_having && 
  828. (sort_and_group || (exec_tmp_table1->distinct && !group_list)))
  829.       having= tmp_having;
  830.     /* if group or order on first table, sort first */
  831.     if (group_list && simple_group)
  832.     {
  833.       DBUG_PRINT("info",("Sorting for group"));
  834.       thd->proc_info="Sorting for group";
  835.       if (create_sort_index(thd, this, group_list,
  836.     HA_POS_ERROR, HA_POS_ERROR) ||
  837.   alloc_group_fields(this, group_list) ||
  838.   make_sum_func_list(all_fields, fields_list, 1))
  839. DBUG_RETURN(1);
  840.       group_list=0;
  841.     }
  842.     else
  843.     {
  844.       if (make_sum_func_list(all_fields, fields_list, 0))
  845. DBUG_RETURN(1);
  846.       if (!group_list && ! exec_tmp_table1->distinct && order && simple_order)
  847.       {
  848. DBUG_PRINT("info",("Sorting for order"));
  849. thd->proc_info="Sorting for order";
  850. if (create_sort_index(thd, this, order,
  851.                               HA_POS_ERROR, HA_POS_ERROR))
  852.   DBUG_RETURN(1);
  853. order=0;
  854.       }
  855.     }
  856.     
  857.     /*
  858.       Optimize distinct when used on some of the tables
  859.       SELECT DISTINCT t1.a FROM t1,t2 WHERE t1.b=t2.b
  860.       In this case we can stop scanning t2 when we have found one t1.a
  861.     */
  862.     if (exec_tmp_table1->distinct)
  863.     {
  864.       table_map used_tables= thd->used_tables;
  865.       JOIN_TAB *last_join_tab= join_tab+tables-1;
  866.       do
  867.       {
  868. if (used_tables & last_join_tab->table->map)
  869.   break;
  870. last_join_tab->not_used_in_distinct=1;
  871.       } while (last_join_tab-- != join_tab);
  872.       /* Optimize "select distinct b from t1 order by key_part_1 limit #" */
  873.       if (order && skip_sort_order)
  874.       {
  875.   /* Should always succeed */
  876. if (test_if_skip_sort_order(&join_tab[const_tables],
  877.     order, unit->select_limit_cnt, 0))
  878.   order=0;
  879.       }
  880.     }
  881.     
  882.     if (thd->lex->subqueries)
  883.     {
  884.       if (!(tmp_join= (JOIN*)thd->alloc(sizeof(JOIN))))
  885. DBUG_RETURN(-1);
  886.       error= 0; // Ensure that tmp_join.error= 0
  887.       restore_tmp();
  888.     }
  889.   }
  890.   error= 0;
  891.   DBUG_RETURN(0);
  892. }
  893. /*
  894.   Restore values in temporary join
  895. */
  896. void JOIN::restore_tmp()
  897. {
  898.   memcpy(tmp_join, this, (size_t) sizeof(JOIN));
  899. }
  900. int
  901. JOIN::reinit()
  902. {
  903.   DBUG_ENTER("JOIN::reinit");
  904.   /* TODO move to unit reinit */
  905.   unit->offset_limit_cnt =select_lex->offset_limit;
  906.   unit->select_limit_cnt =select_lex->select_limit+select_lex->offset_limit;
  907.   if (unit->select_limit_cnt < select_lex->select_limit)
  908.     unit->select_limit_cnt= HA_POS_ERROR; // no limit
  909.   if (unit->select_limit_cnt == HA_POS_ERROR)
  910.     select_lex->options&= ~OPTION_FOUND_ROWS;
  911.   
  912.   if (!optimized && setup_tables(tables_list))
  913.     DBUG_RETURN(1);
  914.   
  915.   /* Reset of sum functions */
  916.   first_record= 0;
  917.   if (exec_tmp_table1)
  918.   {
  919.     exec_tmp_table1->file->extra(HA_EXTRA_RESET_STATE);
  920.     exec_tmp_table1->file->delete_all_rows();
  921.     free_io_cache(exec_tmp_table1);
  922.     filesort_free_buffers(exec_tmp_table1);
  923.   }
  924.   if (exec_tmp_table2)
  925.   {
  926.     exec_tmp_table2->file->extra(HA_EXTRA_RESET_STATE);
  927.     exec_tmp_table2->file->delete_all_rows();
  928.     free_io_cache(exec_tmp_table2);
  929.     filesort_free_buffers(exec_tmp_table2);
  930.   }
  931.   if (items0)
  932.     set_items_ref_array(items0);
  933.   if (join_tab_save)
  934.     memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables);
  935.   if (tmp_join)
  936.     restore_tmp();
  937.   if (sum_funcs)
  938.   {
  939.     Item_sum *func, **func_ptr= sum_funcs;
  940.     while ((func= *(func_ptr++)))
  941.       func->clear();
  942.   }
  943.   DBUG_RETURN(0);
  944. }
  945. bool
  946. JOIN::save_join_tab()
  947. {
  948.   if (!join_tab_save && select_lex->master_unit()->uncacheable)
  949.   {
  950.     if (!(join_tab_save= (JOIN_TAB*)thd->memdup((gptr) join_tab,
  951. sizeof(JOIN_TAB) * tables)))
  952.       return 1;
  953.   }
  954.   return 0;
  955. }
  956. /*
  957.   Exec select
  958. */
  959. void
  960. JOIN::exec()
  961. {
  962.   List<Item> *columns_list= &fields_list;
  963.   int      tmp_error;
  964.   DBUG_ENTER("JOIN::exec");
  965.   
  966.   error= 0;
  967.   if (procedure)
  968.   {
  969.     procedure_fields_list= fields_list;
  970.     if (procedure->change_columns(procedure_fields_list) ||
  971. result->prepare(procedure_fields_list, unit))
  972.     {
  973.       thd->limit_found_rows= thd->examined_row_count= 0;
  974.       DBUG_VOID_RETURN;
  975.     }
  976.     columns_list= &procedure_fields_list;
  977.   }
  978.   else if (test(select_options & OPTION_BUFFER_RESULT) &&
  979.            result && result->prepare(fields_list, unit))
  980.   {
  981.     error= 1;
  982.     thd->limit_found_rows= thd->examined_row_count= 0;
  983.     DBUG_VOID_RETURN;
  984.   }
  985.   if (!tables_list)
  986.   {                                           // Only test of functions
  987.     if (select_options & SELECT_DESCRIBE)
  988.       select_describe(this, FALSE, FALSE, FALSE,
  989.       (zero_result_cause?zero_result_cause:"No tables used"));
  990.     else
  991.     {
  992.       result->send_fields(*columns_list, 1);
  993.       /*
  994.         We have to test for 'conds' here as the WHERE may not be constant
  995.         even if we don't have any tables for prepared statements or if
  996.         conds uses something like 'rand()'.
  997.       */
  998.       if (cond_value != Item::COND_FALSE &&
  999.           (!conds || conds->val_int()) &&
  1000.           (!having || having->val_int()))
  1001.       {
  1002. if (do_send_rows &&
  1003.             (procedure ? (procedure->send_row(procedure_fields_list) ||
  1004.              procedure->end_of_records()) : result->send_data(fields_list)))
  1005.   error= 1;
  1006. else
  1007. {
  1008.   error= (int) result->send_eof();
  1009.   send_records= ((select_options & OPTION_FOUND_ROWS) ? 1 :
  1010.                          thd->sent_row_count);
  1011. }
  1012.       }
  1013.       else
  1014.       {
  1015. error=(int) result->send_eof();
  1016.         send_records= 0;
  1017.       }
  1018.     }
  1019.     /* Single select (without union) always returns 0 or 1 row */
  1020.     thd->limit_found_rows= send_records;
  1021.     thd->examined_row_count= 0;
  1022.     DBUG_VOID_RETURN;
  1023.   }
  1024.   thd->limit_found_rows= thd->examined_row_count= 0;
  1025.   if (zero_result_cause)
  1026.   {
  1027.     (void) return_zero_rows(this, result, tables_list, *columns_list,
  1028.     send_row_on_empty_set(),
  1029.     select_options,
  1030.     zero_result_cause,
  1031.     having, procedure,
  1032.     unit);
  1033.     DBUG_VOID_RETURN;
  1034.   }
  1035.   if (select_options & SELECT_DESCRIBE)
  1036.   {
  1037.     /*
  1038.       Check if we managed to optimize ORDER BY away and don't use temporary
  1039.       table to resolve ORDER BY: in that case, we only may need to do
  1040.       filesort for GROUP BY.
  1041.     */
  1042.     if (!order && !no_order && (!skip_sort_order || !need_tmp))
  1043.     {
  1044.       /*
  1045. Reset 'order' to 'group_list' and reinit variables describing
  1046. 'order'
  1047.       */
  1048.       order= group_list;
  1049.       simple_order= simple_group;
  1050.       skip_sort_order= 0;
  1051.     }
  1052.     if (order &&
  1053. (const_tables == tables ||
  1054.    ((simple_order || skip_sort_order) &&
  1055.   test_if_skip_sort_order(&join_tab[const_tables], order,
  1056.   select_limit, 0))))
  1057.       order=0;
  1058.     having= tmp_having;
  1059.     select_describe(this, need_tmp,
  1060.     order != 0 && !skip_sort_order,
  1061.     select_distinct);
  1062.     DBUG_VOID_RETURN;
  1063.   }
  1064.   JOIN *curr_join= this;
  1065.   List<Item> *curr_all_fields= &all_fields;
  1066.   List<Item> *curr_fields_list= &fields_list;
  1067.   TABLE *curr_tmp_table= 0;
  1068.   /* Create a tmp table if distinct or if the sort is too complicated */
  1069.   if (need_tmp)
  1070.   {
  1071.     if (tmp_join)
  1072.       curr_join= tmp_join;
  1073.     curr_tmp_table= exec_tmp_table1;
  1074.     /* Copy data to the temporary table */
  1075.     thd->proc_info= "Copying to tmp table";
  1076.     
  1077.     if ((tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table, 0)))
  1078.     {
  1079.       error= tmp_error;
  1080.       DBUG_VOID_RETURN;
  1081.     }
  1082.     curr_tmp_table->file->info(HA_STATUS_VARIABLE);
  1083.     
  1084.     if (curr_join->having)
  1085.       curr_join->having= curr_join->tmp_having= 0; // Allready done
  1086.     
  1087.     /* Change sum_fields reference to calculated fields in tmp_table */
  1088.     curr_join->all_fields= *curr_all_fields;
  1089.     if (!items1)
  1090.     {
  1091.       items1= items0 + all_fields.elements;
  1092.       if (sort_and_group || curr_tmp_table->group)
  1093.       {
  1094. if (change_to_use_tmp_fields(thd, items1,
  1095.      tmp_fields_list1, tmp_all_fields1,
  1096.      fields_list.elements, all_fields))
  1097.   DBUG_VOID_RETURN;
  1098.       }
  1099.       else
  1100.       {
  1101. if (change_refs_to_tmp_fields(thd, items1,
  1102.       tmp_fields_list1, tmp_all_fields1,
  1103.       fields_list.elements, all_fields))
  1104.   DBUG_VOID_RETURN;
  1105.       }
  1106.       curr_join->tmp_all_fields1= tmp_all_fields1;
  1107.       curr_join->tmp_fields_list1= tmp_fields_list1;
  1108.       curr_join->items1= items1;
  1109.     }
  1110.     curr_all_fields= &tmp_all_fields1;
  1111.     curr_fields_list= &tmp_fields_list1;
  1112.     curr_join->set_items_ref_array(items1);
  1113.     
  1114.     if (sort_and_group || curr_tmp_table->group)
  1115.     {
  1116.       curr_join->tmp_table_param.field_count+= 
  1117. curr_join->tmp_table_param.sum_func_count+
  1118. curr_join->tmp_table_param.func_count;
  1119.       curr_join->tmp_table_param.sum_func_count= 
  1120. curr_join->tmp_table_param.func_count= 0;
  1121.     }
  1122.     else
  1123.     {
  1124.       curr_join->tmp_table_param.field_count+= 
  1125. curr_join->tmp_table_param.func_count;
  1126.       curr_join->tmp_table_param.func_count= 0;
  1127.     }
  1128.     
  1129.     // procedure can't be used inside subselect => we do nothing special for it
  1130.     if (procedure)
  1131.       procedure->update_refs();
  1132.     
  1133.     if (curr_tmp_table->group)
  1134.     { // Already grouped
  1135.       if (!curr_join->order && !curr_join->no_order && !skip_sort_order)
  1136. curr_join->order= curr_join->group_list;  /* order by group */
  1137.       curr_join->group_list= 0;
  1138.     }
  1139.     
  1140.     /*
  1141.       If we have different sort & group then we must sort the data by group
  1142.       and copy it to another tmp table
  1143.       This code is also used if we are using distinct something
  1144.       we haven't been able to store in the temporary table yet
  1145.       like SEC_TO_TIME(SUM(...)).
  1146.     */
  1147.     if (curr_join->group_list && (!test_if_subpart(curr_join->group_list,
  1148.    curr_join->order) || 
  1149.   curr_join->select_distinct) ||
  1150. (curr_join->select_distinct &&
  1151.  curr_join->tmp_table_param.using_indirect_summary_function))
  1152.     { /* Must copy to another table */
  1153.       DBUG_PRINT("info",("Creating group table"));
  1154.       
  1155.       /* Free first data from old join */
  1156.       curr_join->join_free(0);
  1157.       if (make_simple_join(curr_join, curr_tmp_table))
  1158. DBUG_VOID_RETURN;
  1159.       calc_group_buffer(curr_join, group_list);
  1160.       count_field_types(&curr_join->tmp_table_param,
  1161. curr_join->tmp_all_fields1,
  1162. curr_join->select_distinct && !curr_join->group_list);
  1163.       curr_join->tmp_table_param.hidden_field_count= 
  1164. (curr_join->tmp_all_fields1.elements-
  1165.  curr_join->tmp_fields_list1.elements);
  1166.       
  1167.       
  1168.       if (exec_tmp_table2)
  1169. curr_tmp_table= exec_tmp_table2;
  1170.       else
  1171.       {
  1172. /* group data to new table */
  1173. if (!(curr_tmp_table=
  1174.       exec_tmp_table2= create_tmp_table(thd,
  1175. &curr_join->tmp_table_param,
  1176. *curr_all_fields,
  1177. (ORDER*) 0,
  1178. curr_join->select_distinct && 
  1179. !curr_join->group_list,
  1180. 1, curr_join->select_options,
  1181. HA_POS_ERROR,
  1182. (char *) "")))
  1183.   DBUG_VOID_RETURN;
  1184. curr_join->exec_tmp_table2= exec_tmp_table2;
  1185.       }
  1186.       if (curr_join->group_list)
  1187.       {
  1188. thd->proc_info= "Creating sort index";
  1189. if (curr_join->join_tab == join_tab && save_join_tab())
  1190. {
  1191.   DBUG_VOID_RETURN;
  1192. }
  1193. if (create_sort_index(thd, curr_join, curr_join->group_list,
  1194.       HA_POS_ERROR, HA_POS_ERROR) ||
  1195.     make_group_fields(this, curr_join))
  1196. {
  1197.   DBUG_VOID_RETURN;
  1198. }
  1199.       }
  1200.       
  1201.       thd->proc_info="Copying to group table";
  1202.       tmp_error= -1;
  1203.       if (curr_join != this)
  1204.       {
  1205. if (sum_funcs2)
  1206. {
  1207.   curr_join->sum_funcs= sum_funcs2;
  1208.   curr_join->sum_funcs_end= sum_funcs_end2; 
  1209. }
  1210. else
  1211. {
  1212.   curr_join->alloc_func_list();
  1213.   sum_funcs2= curr_join->sum_funcs;
  1214.   sum_funcs_end2= curr_join->sum_funcs_end;
  1215. }
  1216.       }
  1217.       if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
  1218. 1))
  1219.         DBUG_VOID_RETURN;
  1220.       curr_join->group_list= 0;
  1221.       if ((tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table,
  1222. 0)))
  1223.       {
  1224. error= tmp_error;
  1225. DBUG_VOID_RETURN;
  1226.       }
  1227.       end_read_record(&curr_join->join_tab->read_record);
  1228.       curr_join->const_tables= curr_join->tables; // Mark free for join_free()
  1229.       curr_join->join_tab[0].table= 0;           // Table is freed
  1230.       
  1231.       // No sum funcs anymore
  1232.       if (!items2)
  1233.       {
  1234. items2= items1 + all_fields.elements;
  1235. if (change_to_use_tmp_fields(thd, items2,
  1236.      tmp_fields_list2, tmp_all_fields2, 
  1237.      fields_list.elements, tmp_all_fields1))
  1238.   DBUG_VOID_RETURN;
  1239. curr_join->tmp_fields_list2= tmp_fields_list2;
  1240. curr_join->tmp_all_fields2= tmp_all_fields2;
  1241.       }
  1242.       curr_fields_list= &curr_join->tmp_fields_list2;
  1243.       curr_all_fields= &curr_join->tmp_all_fields2;
  1244.       curr_join->set_items_ref_array(items2);
  1245.       curr_join->tmp_table_param.field_count+= 
  1246. curr_join->tmp_table_param.sum_func_count;
  1247.       curr_join->tmp_table_param.sum_func_count= 0;
  1248.     }
  1249.     if (curr_tmp_table->distinct)
  1250.       curr_join->select_distinct=0; /* Each row is unique */
  1251.     
  1252.     curr_join->join_free(0); /* Free quick selects */
  1253.     if (curr_join->select_distinct && ! curr_join->group_list)
  1254.     {
  1255.       thd->proc_info="Removing duplicates";
  1256.       if (curr_join->tmp_having)
  1257. curr_join->tmp_having->update_used_tables();
  1258.       if (remove_duplicates(curr_join, curr_tmp_table,
  1259.     *curr_fields_list, curr_join->tmp_having))
  1260. DBUG_VOID_RETURN;
  1261.       curr_join->tmp_having=0;
  1262.       curr_join->select_distinct=0;
  1263.     }
  1264.     curr_tmp_table->reginfo.lock_type= TL_UNLOCK;
  1265.     if (make_simple_join(curr_join, curr_tmp_table))
  1266.       DBUG_VOID_RETURN;
  1267.     calc_group_buffer(curr_join, curr_join->group_list);
  1268.     count_field_types(&curr_join->tmp_table_param, *curr_all_fields, 0);
  1269.     
  1270.   }
  1271.   if (procedure)
  1272.     count_field_types(&curr_join->tmp_table_param, *curr_all_fields, 0);
  1273.   
  1274.   if (curr_join->group || curr_join->tmp_table_param.sum_func_count ||
  1275.       (procedure && (procedure->flags & PROC_GROUP)))
  1276.   {
  1277.     if (make_group_fields(this, curr_join))
  1278.     {
  1279.       DBUG_VOID_RETURN;
  1280.     }
  1281.     if (!items3)
  1282.     {
  1283.       if (!items0)
  1284. init_items_ref_array();
  1285.       items3= ref_pointer_array + (all_fields.elements*4);
  1286.       setup_copy_fields(thd, &curr_join->tmp_table_param,
  1287. items3, tmp_fields_list3, tmp_all_fields3,
  1288. curr_fields_list->elements, *curr_all_fields);
  1289.       tmp_table_param.save_copy_funcs= curr_join->tmp_table_param.copy_funcs;
  1290.       tmp_table_param.save_copy_field= curr_join->tmp_table_param.copy_field;
  1291.       tmp_table_param.save_copy_field_end=
  1292. curr_join->tmp_table_param.copy_field_end;
  1293.       curr_join->tmp_all_fields3= tmp_all_fields3;
  1294.       curr_join->tmp_fields_list3= tmp_fields_list3;
  1295.     }
  1296.     else
  1297.     {
  1298.       curr_join->tmp_table_param.copy_funcs= tmp_table_param.save_copy_funcs;
  1299.       curr_join->tmp_table_param.copy_field= tmp_table_param.save_copy_field;
  1300.       curr_join->tmp_table_param.copy_field_end=
  1301. tmp_table_param.save_copy_field_end;
  1302.     }
  1303.     curr_fields_list= &tmp_fields_list3;
  1304.     curr_all_fields= &tmp_all_fields3;
  1305.     curr_join->set_items_ref_array(items3);
  1306.     if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
  1307.       1) || thd->is_fatal_error)
  1308.       DBUG_VOID_RETURN;
  1309.   }
  1310.   if (curr_join->group_list || curr_join->order)
  1311.   {
  1312.     DBUG_PRINT("info",("Sorting for send_fields"));
  1313.     thd->proc_info="Sorting result";
  1314.     /* If we have already done the group, add HAVING to sorted table */
  1315.     if (curr_join->tmp_having && ! curr_join->group_list && 
  1316. ! curr_join->sort_and_group)
  1317.     {
  1318.       // Some tables may have been const
  1319.       curr_join->tmp_having->update_used_tables();
  1320.       JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables];
  1321.       table_map used_tables= (curr_join->const_table_map |
  1322.       curr_table->table->map);
  1323.       Item* sort_table_cond= make_cond_for_table(curr_join->tmp_having,
  1324.  used_tables,
  1325.  used_tables);
  1326.       if (sort_table_cond)
  1327.       {
  1328. if (!curr_table->select)
  1329.   if (!(curr_table->select= new SQL_SELECT))
  1330.     DBUG_VOID_RETURN;
  1331. if (!curr_table->select->cond)
  1332.   curr_table->select->cond= sort_table_cond;
  1333. else // This should never happen
  1334. {
  1335.   if (!(curr_table->select->cond=
  1336. new Item_cond_and(curr_table->select->cond,
  1337.   sort_table_cond)))
  1338.     DBUG_VOID_RETURN;
  1339.   /*
  1340.     Item_cond_and do not need fix_fields for execution, its parameters
  1341.     are fixed or do not need fix_fields, too
  1342.   */
  1343.   curr_table->select->cond->quick_fix_field();
  1344. }
  1345. curr_table->select_cond= curr_table->select->cond;
  1346. curr_table->select_cond->top_level_item();
  1347. DBUG_EXECUTE("where",print_where(curr_table->select->cond,
  1348.  "select and having"););
  1349. curr_join->tmp_having= make_cond_for_table(curr_join->tmp_having,
  1350.    ~ (table_map) 0,
  1351.    ~used_tables);
  1352. DBUG_EXECUTE("where",print_where(curr_join->tmp_having,
  1353.                                          "having after sort"););
  1354.       }
  1355.     }
  1356.     {
  1357.       if (group)
  1358. curr_join->select_limit= HA_POS_ERROR;
  1359.       else
  1360.       {
  1361. /*
  1362.   We can abort sorting after thd->select_limit rows if we there is no
  1363.   WHERE clause for any tables after the sorted one.
  1364. */
  1365. JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables+1];
  1366. JOIN_TAB *end_table= &curr_join->join_tab[curr_join->tables];
  1367. for (; curr_table < end_table ; curr_table++)
  1368. {
  1369.   /*
  1370.     table->keyuse is set in the case there was an original WHERE clause
  1371.     on the table that was optimized away.
  1372.     table->on_expr tells us that it was a LEFT JOIN and there will be
  1373.     at least one row generated from the table.
  1374.   */
  1375.   if (curr_table->select_cond ||
  1376.       (curr_table->keyuse && !curr_table->on_expr))
  1377.   {
  1378.     /* We have to sort all rows */
  1379.     curr_join->select_limit= HA_POS_ERROR;
  1380.     break;
  1381.   }
  1382. }
  1383.       }
  1384.       if (curr_join->join_tab == join_tab && save_join_tab())
  1385.       {
  1386. DBUG_VOID_RETURN;
  1387.       }
  1388.       /*
  1389. Here we sort rows for ORDER BY/GROUP BY clause, if the optimiser
  1390. chose FILESORT to be faster than INDEX SCAN or there is no 
  1391. suitable index present.
  1392. Note, that create_sort_index calls test_if_skip_sort_order and may
  1393. finally replace sorting with index scan if there is a LIMIT clause in
  1394. the query. XXX: it's never shown in EXPLAIN!
  1395. OPTION_FOUND_ROWS supersedes LIMIT and is taken into account.
  1396.       */
  1397.       if (create_sort_index(thd, curr_join,
  1398.     curr_join->group_list ? 
  1399.     curr_join->group_list : curr_join->order,
  1400.     curr_join->select_limit,
  1401.     (select_options & OPTION_FOUND_ROWS ?
  1402.      HA_POS_ERROR : unit->select_limit_cnt)))
  1403. DBUG_VOID_RETURN;
  1404.     }
  1405.   }
  1406.   curr_join->having= curr_join->tmp_having;
  1407.   thd->proc_info="Sending data";
  1408.   error= thd->net.report_error ? -1 :
  1409.     do_select(curr_join, curr_fields_list, NULL, procedure);
  1410.   thd->limit_found_rows= curr_join->send_records;
  1411.   thd->examined_row_count= curr_join->examined_rows;
  1412.   DBUG_VOID_RETURN;
  1413. }
  1414. /*
  1415.   Clean up join. Return error that hold JOIN.
  1416. */
  1417. int
  1418. JOIN::cleanup()
  1419. {
  1420.   DBUG_ENTER("JOIN::cleanup");
  1421.   select_lex->join= 0;
  1422.   if (tmp_join)
  1423.   {
  1424.     if (join_tab != tmp_join->join_tab)
  1425.     {
  1426.       JOIN_TAB *tab, *end;
  1427.       for (tab= join_tab, end= tab+tables ; tab != end ; tab++)
  1428.       {
  1429. tab->cleanup();
  1430.       }
  1431.     }
  1432.     tmp_join->tmp_join= 0;
  1433.     tmp_table_param.copy_field=0;
  1434.     DBUG_RETURN(tmp_join->cleanup());
  1435.   }
  1436.   lock=0;                                     // It's faster to unlock later
  1437.   join_free(1);
  1438.   if (exec_tmp_table1)
  1439.     free_tmp_table(thd, exec_tmp_table1);
  1440.   if (exec_tmp_table2)
  1441.     free_tmp_table(thd, exec_tmp_table2);
  1442.   delete select;
  1443.   delete_dynamic(&keyuse);
  1444.   delete procedure;
  1445.   for (SELECT_LEX_UNIT *lex_unit= select_lex->first_inner_unit();
  1446.        lex_unit != 0;
  1447.        lex_unit= lex_unit->next_unit())
  1448.   {
  1449.     error|= lex_unit->cleanup();
  1450.   }
  1451.   DBUG_RETURN(error);
  1452. }
  1453. int
  1454. mysql_select(THD *thd, Item ***rref_pointer_array,
  1455.      TABLE_LIST *tables, uint wild_num, List<Item> &fields,
  1456.      COND *conds, uint og_num,  ORDER *order, ORDER *group,
  1457.      Item *having, ORDER *proc_param, ulong select_options,
  1458.      select_result *result, SELECT_LEX_UNIT *unit,
  1459.      SELECT_LEX *select_lex)
  1460. {
  1461.   int err;
  1462.   bool free_join= 1;
  1463.   DBUG_ENTER("mysql_select");
  1464.   JOIN *join;
  1465.   if (select_lex->join != 0)
  1466.   {
  1467.     join= select_lex->join;
  1468.     // is it single SELECT in derived table, called in derived table creation
  1469.     if (select_lex->linkage != DERIVED_TABLE_TYPE ||
  1470. (select_options & SELECT_DESCRIBE))
  1471.     {
  1472.       if (select_lex->linkage != GLOBAL_OPTIONS_TYPE)
  1473.       {
  1474. //here is EXPLAIN of subselect or derived table
  1475. if (join->change_result(result))
  1476. {
  1477.   DBUG_RETURN(-1);
  1478. }
  1479.       }
  1480.       else
  1481.       {
  1482. if (join->prepare(rref_pointer_array, tables, wild_num,
  1483.   conds, og_num, order, group, having, proc_param,
  1484.   select_lex, unit))
  1485. {
  1486.   goto err;
  1487. }
  1488.       }
  1489.     }
  1490.     free_join= 0;
  1491.     join->select_options= select_options;
  1492.   }
  1493.   else
  1494.   {
  1495.     if (!(join= new JOIN(thd, fields, select_options, result)))
  1496. DBUG_RETURN(-1);
  1497.     thd->proc_info="init";
  1498.     thd->used_tables=0;                         // Updated by setup_fields
  1499.     if (join->prepare(rref_pointer_array, tables, wild_num,
  1500.       conds, og_num, order, group, having, proc_param,
  1501.       select_lex, unit))
  1502.     {
  1503.       goto err;
  1504.     }
  1505.   }
  1506.   if ((err= join->optimize()))
  1507.   {
  1508.     goto err; // 1
  1509.   }
  1510.   if (thd->lex->describe & DESCRIBE_EXTENDED)
  1511.   {
  1512.     join->conds_history= join->conds;
  1513.     join->having_history= (join->having?join->having:join->tmp_having);
  1514.   }
  1515.   if (thd->net.report_error)
  1516.     goto err;
  1517.   join->exec();
  1518.   if (thd->lex->describe & DESCRIBE_EXTENDED)
  1519.   {
  1520.     select_lex->where= join->conds_history;
  1521.     select_lex->having= join->having_history;
  1522.   }
  1523. err:
  1524.   if (free_join)
  1525.   {
  1526.     thd->proc_info="end";
  1527.     err= join->cleanup();
  1528.     if (thd->net.report_error)
  1529.       err= -1;
  1530.     delete join;
  1531.     DBUG_RETURN(err);
  1532.   }
  1533.   DBUG_RETURN(join->error);
  1534. }
  1535. /*****************************************************************************
  1536.   Create JOIN_TABS, make a guess about the table types,
  1537.   Approximate how many records will be used in each table
  1538. *****************************************************************************/
  1539. static ha_rows get_quick_record_count(THD *thd, SQL_SELECT *select,
  1540.       TABLE *table,
  1541.       const key_map *keys,ha_rows limit)
  1542. {
  1543.   int error;
  1544.   DBUG_ENTER("get_quick_record_count");
  1545.   if (select)
  1546.   {
  1547.     select->head=table;
  1548.     table->reginfo.impossible_range=0;
  1549.     if ((error= select->test_quick_select(thd, *(key_map *)keys,(table_map) 0,
  1550.                                           limit, 0)) == 1)
  1551.       DBUG_RETURN(select->quick->records);
  1552.     if (error == -1)
  1553.     {
  1554.       table->reginfo.impossible_range=1;
  1555.       DBUG_RETURN(0);
  1556.     }
  1557.     DBUG_PRINT("warning",("Couldn't use record count on const keypart"));
  1558.   }
  1559.   DBUG_RETURN(HA_POS_ERROR); /* This shouldn't happend */
  1560. }
  1561. /*
  1562.   Calculate the best possible join and initialize the join structure
  1563.   RETURN VALUES
  1564.   0 ok
  1565.   1 Fatal error
  1566. */
  1567. static bool
  1568. make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
  1569.      DYNAMIC_ARRAY *keyuse_array)
  1570. {
  1571.   int error;
  1572.   uint i,table_count,const_count,key;
  1573.   table_map found_const_table_map, all_table_map, found_ref, refs;
  1574.   key_map const_ref, eq_part;
  1575.   TABLE **table_vector;
  1576.   JOIN_TAB *stat,*stat_end,*s,**stat_ref;
  1577.   KEYUSE *keyuse,*start_keyuse;
  1578.   table_map outer_join=0;
  1579.   JOIN_TAB *stat_vector[MAX_TABLES+1];
  1580.   DBUG_ENTER("make_join_statistics");
  1581.   table_count=join->tables;
  1582.   stat=(JOIN_TAB*) join->thd->calloc(sizeof(JOIN_TAB)*table_count);
  1583.   stat_ref=(JOIN_TAB**) join->thd->alloc(sizeof(JOIN_TAB*)*MAX_TABLES);
  1584.   table_vector=(TABLE**) join->thd->alloc(sizeof(TABLE*)*(table_count*2));
  1585.   if (!stat || !stat_ref || !table_vector)
  1586.     DBUG_RETURN(1); // Eom /* purecov: inspected */
  1587.   join->best_ref=stat_vector;
  1588.   stat_end=stat+table_count;
  1589.   found_const_table_map= all_table_map=0;
  1590.   const_count=0;
  1591.   for (s=stat,i=0 ; tables ; s++,tables=tables->next,i++)
  1592.   {
  1593.     TABLE *table;
  1594.     stat_vector[i]=s;
  1595.     s->keys.init();
  1596.     s->const_keys.init();
  1597.     s->checked_keys.init();
  1598.     s->needed_reg.init();
  1599.     table_vector[i]=s->table=table=tables->table;
  1600.     table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);// record count
  1601.     table->quick_keys.clear_all();
  1602.     table->reginfo.join_tab=s;
  1603.     table->reginfo.not_exists_optimize=0;
  1604.     bzero((char*) table->const_key_parts, sizeof(key_part_map)*table->keys);
  1605.     all_table_map|= table->map;
  1606.     s->join=join;
  1607.     s->info=0; // For describe
  1608.     if ((s->on_expr=tables->on_expr))
  1609.     {
  1610.       /* Left join */
  1611.       if (!table->file->records)
  1612.       { // Empty table
  1613. s->key_dependent=s->dependent=0; // Ignore LEFT JOIN depend.
  1614. set_position(join,const_count++,s,(KEYUSE*) 0);
  1615. continue;
  1616.       }
  1617.       s->key_dependent=s->dependent=
  1618. s->on_expr->used_tables() & ~(table->map);
  1619.       if (table->outer_join & JOIN_TYPE_LEFT)
  1620. s->dependent|=stat_vector[i-1]->dependent | table_vector[i-1]->map;
  1621.       if (tables->outer_join & JOIN_TYPE_RIGHT)
  1622. s->dependent|=tables->next->table->map;
  1623.       outer_join|=table->map;
  1624.       continue;
  1625.     }
  1626.     if (tables->straight) // We don't have to move this
  1627.       s->dependent= table_vector[i-1]->map | stat_vector[i-1]->dependent;
  1628.     else
  1629.       s->dependent=(table_map) 0;
  1630.     s->key_dependent=(table_map) 0;
  1631.     if ((table->system || table->file->records <= 1) && ! s->dependent &&
  1632. !(table->file->table_flags() & HA_NOT_EXACT_COUNT) &&
  1633.         !table->fulltext_searched)
  1634.     {
  1635.       set_position(join,const_count++,s,(KEYUSE*) 0);
  1636.     }
  1637.   }
  1638.   stat_vector[i]=0;
  1639.   join->outer_join=outer_join;
  1640.   /*
  1641.     If outer join: Re-arrange tables in stat_vector so that outer join
  1642.     tables are after all tables it is dependent of.
  1643.     For example: SELECT * from A LEFT JOIN B ON B.c=C.c, C WHERE A.C=C.C
  1644.     Will shift table B after table C.
  1645.   */
  1646.   if (outer_join)
  1647.   {
  1648.     table_map used_tables=0L;
  1649.     for (i=0 ; i < join->tables-1 ; i++)
  1650.     {
  1651.       if (stat_vector[i]->dependent & ~used_tables)
  1652.       {
  1653. JOIN_TAB *save= stat_vector[i];
  1654. uint j;
  1655. for (j=i+1;
  1656.      j < join->tables && stat_vector[j]->dependent & ~used_tables;
  1657.      j++)
  1658. {
  1659.   JOIN_TAB *tmp=stat_vector[j]; // Move element up
  1660.   stat_vector[j]=save;
  1661.   save=tmp;
  1662. }
  1663. if (j == join->tables)
  1664. {
  1665.   join->tables=0; // Don't use join->table
  1666.   my_error(ER_WRONG_OUTER_JOIN,MYF(0));
  1667.   DBUG_RETURN(1);
  1668. }
  1669. stat_vector[i]=stat_vector[j];
  1670. stat_vector[j]=save;
  1671.       }
  1672.       used_tables|= stat_vector[i]->table->map;
  1673.     }
  1674.   }
  1675.   if (conds || outer_join)
  1676.     if (update_ref_and_keys(join->thd, keyuse_array, stat, join->tables,
  1677.                             conds, ~outer_join, join->select_lex))
  1678.       DBUG_RETURN(1);
  1679.   /* Read tables with 0 or 1 rows (system tables) */
  1680.   join->const_table_map= 0;
  1681.   for (POSITION *p_pos=join->positions, *p_end=p_pos+const_count;
  1682.        p_pos < p_end ;
  1683.        p_pos++)
  1684.   {
  1685.     int tmp;
  1686.     s= p_pos->table;
  1687.     s->type=JT_SYSTEM;
  1688.     join->const_table_map|=s->table->map;
  1689.     if ((tmp=join_read_const_table(s, p_pos)))
  1690.     {
  1691.       if (tmp > 0)
  1692. DBUG_RETURN(1); // Fatal error
  1693.     }
  1694.     else
  1695.       found_const_table_map|= s->table->map;
  1696.   }
  1697.   /* loop until no more const tables are found */
  1698.   int ref_changed;
  1699.   do
  1700.   {
  1701.     ref_changed = 0;
  1702.     found_ref=0;
  1703.     /*
  1704.       We only have to loop from stat_vector + const_count as
  1705.       set_position() will move all const_tables first in stat_vector
  1706.     */
  1707.     for (JOIN_TAB **pos=stat_vector+const_count ; (s= *pos) ; pos++)
  1708.     {
  1709.       TABLE *table=s->table;
  1710.       if (s->dependent) // If dependent on some table
  1711.       {
  1712. // All dep. must be constants
  1713. if (s->dependent & ~(found_const_table_map))
  1714.   continue;
  1715. if (table->file->records <= 1L &&
  1716.     !(table->file->table_flags() & HA_NOT_EXACT_COUNT))
  1717. { // system table
  1718.   int tmp= 0;
  1719.   s->type=JT_SYSTEM;
  1720.   join->const_table_map|=table->map;
  1721.   set_position(join,const_count++,s,(KEYUSE*) 0);
  1722.   if ((tmp= join_read_const_table(s,join->positions+const_count-1)))
  1723.   {
  1724.     if (tmp > 0)
  1725.       DBUG_RETURN(1); // Fatal error
  1726.   }
  1727.   else
  1728.     found_const_table_map|= table->map;
  1729.   continue;
  1730. }
  1731.       }
  1732.       /* check if table can be read by key or table only uses const refs */
  1733.       if ((keyuse=s->keyuse))
  1734.       {
  1735. s->type= JT_REF;
  1736. while (keyuse->table == table)
  1737. {
  1738.   start_keyuse=keyuse;
  1739.   key=keyuse->key;
  1740.   s->keys.set_bit(key);               // QQ: remove this ?
  1741.   refs=0;
  1742.           const_ref.clear_all();
  1743.   eq_part.clear_all();
  1744.   do
  1745.   {
  1746.     if (keyuse->val->type() != Item::NULL_ITEM && !keyuse->optimize)
  1747.     {
  1748.       if (!((~found_const_table_map) & keyuse->used_tables))
  1749. const_ref.set_bit(keyuse->keypart);
  1750.       else
  1751. refs|=keyuse->used_tables;
  1752.       eq_part.set_bit(keyuse->keypart);
  1753.     }
  1754.     keyuse++;
  1755.   } while (keyuse->table == table && keyuse->key == key);
  1756.   if (eq_part.is_prefix(table->key_info[key].key_parts) &&
  1757.       ((table->key_info[key].flags & (HA_NOSAME | HA_END_SPACE_KEY)) ==
  1758.        HA_NOSAME) &&
  1759.               !table->fulltext_searched)
  1760.   {
  1761.     if (const_ref == eq_part)
  1762.     { // Found everything for ref.
  1763.       int tmp;
  1764.       ref_changed = 1;
  1765.       s->type= JT_CONST;
  1766.       join->const_table_map|=table->map;
  1767.       set_position(join,const_count++,s,start_keyuse);
  1768.       if (create_ref_for_key(join, s, start_keyuse,
  1769.      found_const_table_map))
  1770. DBUG_RETURN(1);
  1771.       if ((tmp=join_read_const_table(s,
  1772.      join->positions+const_count-1)))
  1773.       {
  1774. if (tmp > 0)
  1775.   DBUG_RETURN(1); // Fatal error
  1776.       }
  1777.       else
  1778. found_const_table_map|= table->map;
  1779.       break;
  1780.     }
  1781.     else
  1782.       found_ref|= refs; // Table is const if all refs are const
  1783.   }
  1784. }
  1785.       }
  1786.     }
  1787.   } while (join->const_table_map & found_ref && ref_changed);
  1788.   /* Calc how many (possible) matched records in each table */
  1789.   for (s=stat ; s < stat_end ; s++)
  1790.   {
  1791.     if (s->type == JT_SYSTEM || s->type == JT_CONST)
  1792.     {
  1793.       /* Only one matching row */
  1794.       s->found_records=s->records=s->read_time=1; s->worst_seeks=1.0;
  1795.       continue;
  1796.     }
  1797.     /* Approximate found rows and time to read them */
  1798.     s->found_records=s->records=s->table->file->records;
  1799.     s->read_time=(ha_rows) s->table->file->scan_time();
  1800.     /*
  1801.       Set a max range of how many seeks we can expect when using keys
  1802.       This is can't be to high as otherwise we are likely to use
  1803.       table scan.
  1804.     */
  1805.     s->worst_seeks= min((double) s->found_records / 10,
  1806. (double) s->read_time*3);
  1807.     if (s->worst_seeks < 2.0) // Fix for small tables
  1808.       s->worst_seeks=2.0;
  1809.     if (! s->const_keys.is_clear_all())
  1810.     {
  1811.       ha_rows records;
  1812.       SQL_SELECT *select;
  1813.       select= make_select(s->table, found_const_table_map,
  1814.   found_const_table_map,
  1815.   s->on_expr ? s->on_expr : conds,
  1816.   &error);
  1817.       records= get_quick_record_count(join->thd, select, s->table,
  1818.       &s->const_keys, join->row_limit);
  1819.       s->quick=select->quick;
  1820.       s->needed_reg=select->needed_reg;
  1821.       select->quick=0;
  1822.       if (records == 0 && s->table->reginfo.impossible_range)
  1823.       {
  1824. /*
  1825.   Impossible WHERE or ON expression
  1826.   In case of ON, we mark that the we match one empty NULL row.
  1827.   In case of WHERE, don't set found_const_table_map to get the
  1828.   caller to abort with a zero row result.
  1829. */
  1830. join->const_table_map|= s->table->map;
  1831. set_position(join,const_count++,s,(KEYUSE*) 0);
  1832. s->type= JT_CONST;
  1833. if (s->on_expr)
  1834. {
  1835.   /* Generate empty row */
  1836.   s->info= "Impossible ON condition";
  1837.   found_const_table_map|= s->table->map;
  1838.   s->type= JT_CONST;
  1839.   mark_as_null_row(s->table); // All fields are NULL
  1840. }
  1841.       }
  1842.       if (records != HA_POS_ERROR)
  1843.       {
  1844. s->found_records=records;
  1845. s->read_time= (ha_rows) (s->quick ? s->quick->read_time : 0.0);
  1846.       }
  1847.       delete select;
  1848.     }
  1849.   }
  1850.   /* Find best combination and return it */
  1851.   join->join_tab=stat;
  1852.   join->map2table=stat_ref;
  1853.   join->table= join->all_tables=table_vector;
  1854.   join->const_tables=const_count;
  1855.   join->found_const_table_map=found_const_table_map;
  1856.   if (join->const_tables != join->tables)
  1857.   {
  1858.     optimize_keyuse(join, keyuse_array);
  1859.     find_best_combination(join,all_table_map & ~join->const_table_map);
  1860.   }
  1861.   else
  1862.   {
  1863.     memcpy((gptr) join->best_positions,(gptr) join->positions,
  1864.    sizeof(POSITION)*join->const_tables);
  1865.     join->best_read=1.0;
  1866.   }
  1867.   DBUG_RETURN(join->thd->killed || get_best_combination(join));
  1868. }
  1869. /*****************************************************************************
  1870.   Check with keys are used and with tables references with tables
  1871.   Updates in stat:
  1872.   keys      Bitmap of all used keys
  1873.   const_keys Bitmap of all keys with may be used with quick_select
  1874.   keyuse     Pointer to possible keys
  1875. *****************************************************************************/
  1876. typedef struct key_field_t { // Used when finding key fields
  1877.   Field *field;
  1878.   Item *val; // May be empty if diff constant
  1879.   uint level;
  1880.   uint optimize;
  1881.   bool eq_func;
  1882.   /*
  1883.     If true, the condition this struct represents will not be satisfied
  1884.     when val IS NULL.
  1885.   */
  1886.   bool          null_rejecting; 
  1887. } KEY_FIELD;
  1888. /* Values in optimize */
  1889. #define KEY_OPTIMIZE_EXISTS 1
  1890. #define KEY_OPTIMIZE_REF_OR_NULL 2
  1891. /*
  1892.   Merge new key definitions to old ones, remove those not used in both
  1893.   This is called for OR between different levels
  1894.   To be able to do 'ref_or_null' we merge a comparison of a column
  1895.   and 'column IS NULL' to one test.  This is useful for sub select queries
  1896.   that are internally transformed to something like:
  1897.   SELECT * FROM t1 WHERE t1.key=outer_ref_field or t1.key IS NULL 
  1898.   KEY_FIELD::null_rejecting is processed as follows:
  1899.   result has null_rejecting=true if it is set for both ORed references.
  1900.   for example:
  1901.     (t2.key = t1.field OR t2.key  =  t1.field) -> null_rejecting=true
  1902.     (t2.key = t1.field OR t2.key <=> t1.field) -> null_rejecting=false
  1903. */
  1904. static KEY_FIELD *
  1905. merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end,
  1906.  uint and_level)
  1907. {
  1908.   if (start == new_fields)
  1909.     return start; // Impossible or
  1910.   if (new_fields == end)
  1911.     return start; // No new fields, skip all
  1912.   KEY_FIELD *first_free=new_fields;
  1913.   /* Mark all found fields in old array */
  1914.   for (; new_fields != end ; new_fields++)
  1915.   {
  1916.     for (KEY_FIELD *old=start ; old != first_free ; old++)
  1917.     {
  1918.       if (old->field == new_fields->field)
  1919.       {
  1920. if (new_fields->val->used_tables())
  1921. {
  1922.   /*
  1923.     If the value matches, we can use the key reference.
  1924.     If not, we keep it until we have examined all new values
  1925.   */
  1926.   if (old->val->eq(new_fields->val, old->field->binary()))
  1927.   {
  1928.     old->level= and_level;
  1929.     old->optimize= ((old->optimize & new_fields->optimize &
  1930.      KEY_OPTIMIZE_EXISTS) |
  1931.     ((old->optimize | new_fields->optimize) &
  1932.      KEY_OPTIMIZE_REF_OR_NULL));
  1933.             old->null_rejecting= (old->null_rejecting &&
  1934.                                   new_fields->null_rejecting);
  1935.   }
  1936. }
  1937. else if (old->eq_func && new_fields->eq_func &&
  1938.  old->val->eq(new_fields->val, old->field->binary()))
  1939. {
  1940.   old->level= and_level;
  1941.   old->optimize= ((old->optimize & new_fields->optimize &
  1942.    KEY_OPTIMIZE_EXISTS) |
  1943.   ((old->optimize | new_fields->optimize) &
  1944.    KEY_OPTIMIZE_REF_OR_NULL));
  1945.           old->null_rejecting= (old->null_rejecting &&
  1946.                                 new_fields->null_rejecting);
  1947. }
  1948. else if (old->eq_func && new_fields->eq_func &&
  1949.  (old->val->is_null() || new_fields->val->is_null()))
  1950. {
  1951.   /* field = expression OR field IS NULL */
  1952.   old->level= and_level;
  1953.   old->optimize= KEY_OPTIMIZE_REF_OR_NULL;
  1954.   /* Remember the NOT NULL value */
  1955.   if (old->val->is_null())
  1956.     old->val= new_fields->val;
  1957.           /* The referred expression can be NULL: */ 
  1958.           old->null_rejecting= 0;
  1959. }
  1960. else
  1961. {
  1962.   /*
  1963.     We are comparing two different const.  In this case we can't
  1964.     use a key-lookup on this so it's better to remove the value
  1965.     and let the range optimzier handle it
  1966.   */
  1967.   if (old == --first_free) // If last item
  1968.     break;
  1969.   *old= *first_free; // Remove old value
  1970.   old--; // Retry this value
  1971. }
  1972.       }
  1973.     }
  1974.   }
  1975.   /* Remove all not used items */
  1976.   for (KEY_FIELD *old=start ; old != first_free ;)
  1977.   {
  1978.     if (old->level != and_level)
  1979.     { // Not used in all levels
  1980.       if (old == --first_free)
  1981. break;
  1982.       *old= *first_free; // Remove old value
  1983.       continue;
  1984.     }
  1985.     old++;
  1986.   }
  1987.   return first_free;
  1988. }
  1989. /*
  1990.   Add a possible key to array of possible keys if it's usable as a key
  1991.   SYNPOSIS
  1992.     add_key_field()
  1993.     key_fields Pointer to add key, if usable
  1994.     and_level And level, to be stored in KEY_FIELD
  1995.     field Field used in comparision
  1996.     eq_func True if we used =, <=> or IS NULL
  1997.     value Value used for comparison with field
  1998.     usable_tables Tables which can be used for key optimization
  1999.   NOTES
  2000.     If we are doing a NOT NULL comparison on a NOT NULL field in a outer join
  2001.     table, we store this to be able to do not exists optimization later.
  2002.   RETURN
  2003.     *key_fields is incremented if we stored a key in the array
  2004. */
  2005. static void
  2006. add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond,
  2007.       Field *field,bool eq_func,Item **value, uint num_values,
  2008.       table_map usable_tables)
  2009. {
  2010.   uint exists_optimize= 0;
  2011.   if (!(field->flags & PART_KEY_FLAG))
  2012.   {
  2013.     // Don't remove column IS NULL on a LEFT JOIN table
  2014.     if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
  2015.         !field->table->maybe_null || field->null_ptr)
  2016.       return; // Not a key. Skip it
  2017.     exists_optimize= KEY_OPTIMIZE_EXISTS;
  2018.   }
  2019.   else
  2020.   {
  2021.     table_map used_tables=0;
  2022.     bool optimizable=0;
  2023.     for (uint i=0; i<num_values; i++)
  2024.     {
  2025.       used_tables|=(value[i])->used_tables();
  2026.       if (!((value[i])->used_tables() & (field->table->map | RAND_TABLE_BIT)))
  2027.         optimizable=1;
  2028.     }
  2029.     if (!optimizable)
  2030.       return;
  2031.     if (!(usable_tables & field->table->map))
  2032.     {
  2033.       if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
  2034.           !field->table->maybe_null || field->null_ptr)
  2035. return; // Can't use left join optimize
  2036.       exists_optimize= KEY_OPTIMIZE_EXISTS;
  2037.     }
  2038.     else
  2039.     {
  2040.       JOIN_TAB *stat=field->table->reginfo.join_tab;
  2041.       key_map possible_keys=field->key_start;
  2042.       possible_keys.intersect(field->table->keys_in_use_for_query);
  2043.       stat[0].keys.merge(possible_keys);             // Add possible keys
  2044.       /*
  2045. Save the following cases:
  2046. Field op constant
  2047. Field LIKE constant where constant doesn't start with a wildcard
  2048. Field = field2 where field2 is in a different table
  2049. Field op formula
  2050. Field IS NULL
  2051. Field IS NOT NULL
  2052.          Field BETWEEN ...
  2053.          Field IN ...
  2054.       */
  2055.       stat[0].key_dependent|=used_tables;
  2056.       bool is_const=1;
  2057.       for (uint i=0; i<num_values; i++)
  2058.         is_const&= value[i]->const_item();
  2059.       if (is_const)
  2060.         stat[0].const_keys.merge(possible_keys);
  2061.       /*
  2062. We can't always use indexes when comparing a string index to a
  2063. number. cmp_type() is checked to allow compare of dates to numbers.
  2064.         eq_func is NEVER true when num_values > 1
  2065.        */
  2066.       if (!eq_func)
  2067.         return;
  2068.       if (field->result_type() == STRING_RESULT)
  2069.       {
  2070.         if ((*value)->result_type() != STRING_RESULT)
  2071.         {
  2072.           if (field->cmp_type() != (*value)->result_type())
  2073.             return;
  2074.         }
  2075.         else
  2076.         {
  2077.           /*
  2078.             We can't use indexes if the effective collation
  2079.             of the operation differ from the field collation.
  2080.             We can also not used index on a text column, as the column may
  2081.             contain 'x' 'xt' 'x ' and 'read_next_same' will stop after
  2082.             'x' when searching for WHERE col='x '
  2083.           */
  2084.           if (field->cmp_type() == STRING_RESULT &&
  2085.               (((Field_str*)field)->charset() != cond->compare_collation() ||
  2086.                ((*value)->type() != Item::NULL_ITEM &&
  2087.                 (field->flags & BLOB_FLAG) && !field->binary())))
  2088.             return;
  2089.         }
  2090.       }
  2091.     }
  2092.   }
  2093.   DBUG_ASSERT(num_values == 1);
  2094.   /*
  2095.     For the moment eq_func is always true. This slot is reserved for future
  2096.     extensions where we want to remembers other things than just eq comparisons
  2097.   */
  2098.   DBUG_ASSERT(eq_func);
  2099.   /* Store possible eq field */
  2100.   (*key_fields)->field= field;
  2101.   (*key_fields)->eq_func= eq_func;
  2102.   (*key_fields)->val= *value;
  2103.   (*key_fields)->level= and_level;
  2104.   (*key_fields)->optimize= exists_optimize;
  2105.   /*
  2106.     If the condition has form "tbl.keypart = othertbl.field" and 
  2107.     othertbl.field can be NULL, there will be no matches if othertbl.field 
  2108.     has NULL value.
  2109.     We use null_rejecting in add_not_null_conds() to add
  2110.     'othertbl.field IS NOT NULL' to tab->select_cond.
  2111.   */
  2112.   (*key_fields)->null_rejecting= ((cond->functype() == Item_func::EQ_FUNC) &&
  2113.                                  ((*value)->type() == Item::FIELD_ITEM) &&
  2114.                                   ((Item_field*)*value)->field->maybe_null());
  2115.   (*key_fields)++;
  2116. }
  2117. /*
  2118.   SYNOPSIS
  2119.     add_key_fields()
  2120.       key_fields      Add KEY_FIELD entries to this array (and move the 
  2121.                       pointer)
  2122.       and_level       AND-level (a value that is different for every n-way
  2123.                       AND operation)
  2124.       cond            Condition to analyze
  2125.       usable_tables   Value to pass to add_key_field
  2126. */
  2127. static void
  2128. add_key_fields(KEY_FIELD **key_fields,uint *and_level,
  2129.        COND *cond, table_map usable_tables)
  2130. {
  2131.   if (cond->type() == Item_func::COND_ITEM)
  2132.   {
  2133.     List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
  2134.     KEY_FIELD *org_key_fields= *key_fields;
  2135.     if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
  2136.     {
  2137.       Item *item;
  2138.       while ((item=li++))
  2139. add_key_fields(key_fields,and_level,item,usable_tables);
  2140.       for (; org_key_fields != *key_fields ; org_key_fields++)
  2141. org_key_fields->level= *and_level;
  2142.     }
  2143.     else
  2144.     {
  2145.       (*and_level)++;
  2146.       add_key_fields(key_fields,and_level,li++,usable_tables);
  2147.       Item *item;
  2148.       while ((item=li++))
  2149.       {
  2150. KEY_FIELD *start_key_fields= *key_fields;
  2151. (*and_level)++;
  2152. add_key_fields(key_fields,and_level,item,usable_tables);
  2153. *key_fields=merge_key_fields(org_key_fields,start_key_fields,
  2154.      *key_fields,++(*and_level));
  2155.       }
  2156.     }
  2157.     return;
  2158.   }
  2159.   /* If item is of type 'field op field/constant' add it to key_fields */
  2160.   if (cond->type() != Item::FUNC_ITEM)
  2161.     return;
  2162.   Item_func *cond_func= (Item_func*) cond;
  2163.   switch (cond_func->select_optimize()) {
  2164.   case Item_func::OPTIMIZE_NONE:
  2165.     break;
  2166.   case Item_func::OPTIMIZE_KEY:
  2167.     // BETWEEN, IN, NOT
  2168.     if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM &&
  2169. !(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
  2170.       add_key_field(key_fields,*and_level,cond_func,
  2171.     ((Item_field*)(cond_func->key_item()->real_item()))->field,
  2172.                     cond_func->argument_count() == 2 &&
  2173.                     cond_func->functype() == Item_func::IN_FUNC &&
  2174.                     !((Item_func_in*)cond_func)->negated,
  2175.                     cond_func->arguments()+1, cond_func->argument_count()-1,
  2176.                     usable_tables);
  2177.     break;
  2178.   case Item_func::OPTIMIZE_OP:
  2179.   {
  2180.     bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC ||
  2181.      cond_func->functype() == Item_func::EQUAL_FUNC);
  2182.     if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
  2183. !(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
  2184.     {
  2185.       add_key_field(key_fields,*and_level,cond_func,
  2186.     ((Item_field*) (cond_func->arguments()[0])->real_item())
  2187.     ->field,
  2188.     equal_func,
  2189.                     cond_func->arguments()+1, 1, usable_tables);
  2190.     }
  2191.     if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
  2192. cond_func->functype() != Item_func::LIKE_FUNC &&
  2193. !(cond_func->arguments()[1]->used_tables() & OUTER_REF_TABLE_BIT))
  2194.     {
  2195.       add_key_field(key_fields,*and_level,cond_func,
  2196.     ((Item_field*) (cond_func->arguments()[1])->real_item())
  2197.     ->field,
  2198.     equal_func,
  2199.     cond_func->arguments(),1,usable_tables);
  2200.     }
  2201.     break;
  2202.   }
  2203.   case Item_func::OPTIMIZE_NULL:
  2204.     /* column_name IS [NOT] NULL */
  2205.     if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
  2206. !(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
  2207.     {
  2208.       Item *tmp=new Item_null;
  2209.       if (unlikely(!tmp))                       // Should never be true
  2210. return;
  2211.       add_key_field(key_fields,*and_level,cond_func,
  2212.     ((Item_field*) (cond_func->arguments()[0])->real_item())
  2213.     ->field,
  2214.     cond_func->functype() == Item_func::ISNULL_FUNC,
  2215.     &tmp, 1, usable_tables);
  2216.     }
  2217.     break;
  2218.   }
  2219.   return;
  2220. }
  2221. /*
  2222.   Add all keys with uses 'field' for some keypart
  2223.   If field->and_level != and_level then only mark key_part as const_part
  2224. */
  2225. static uint
  2226. max_part_bit(key_part_map bits)
  2227. {
  2228.   uint found;
  2229.   for (found=0; bits & 1 ; found++,bits>>=1) ;
  2230.   return found;
  2231. }
  2232. static void
  2233. add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
  2234. {
  2235.   Field *field=key_field->field;
  2236.   TABLE *form= field->table;
  2237.   KEYUSE keyuse;
  2238.   if (key_field->eq_func && !(key_field->optimize & KEY_OPTIMIZE_EXISTS))
  2239.   {
  2240.     for (uint key=0 ; key < form->keys ; key++)
  2241.     {
  2242.       if (!(form->keys_in_use_for_query.is_set(key)))
  2243. continue;
  2244.       if (form->key_info[key].flags & HA_FULLTEXT)
  2245. continue;    // ToDo: ft-keys in non-ft queries.   SerG
  2246.       uint key_parts= (uint) form->key_info[key].key_parts;
  2247.       for (uint part=0 ; part <  key_parts ; part++)
  2248.       {
  2249. if (field->eq(form->key_info[key].key_part[part].field))
  2250. {
  2251.   keyuse.table= field->table;
  2252.   keyuse.val =  key_field->val;
  2253.   keyuse.key =  key;
  2254.   keyuse.keypart=part;
  2255.   keyuse.keypart_map= (key_part_map) 1 << part;
  2256.   keyuse.used_tables=key_field->val->used_tables();
  2257.   keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL;
  2258.           keyuse.null_rejecting= key_field->null_rejecting;
  2259.   VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
  2260. }
  2261.       }
  2262.     }
  2263.   }
  2264. }
  2265. #define FT_KEYPART   (MAX_REF_PARTS+10)
  2266. static void
  2267. add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
  2268.             JOIN_TAB *stat,COND *cond,table_map usable_tables)
  2269. {
  2270.   Item_func_match *cond_func=NULL;
  2271.   if (!cond)
  2272.     return;
  2273.   if (cond->type() == Item::FUNC_ITEM)
  2274.   {
  2275.     Item_func *func=(Item_func *)cond;
  2276.     Item_func::Functype functype=  func->functype();
  2277.     if (functype == Item_func::FT_FUNC)
  2278.       cond_func=(Item_func_match *)cond;
  2279.     else if (func->arg_count == 2)
  2280.     {
  2281.       Item_func *arg0=(Item_func *)(func->arguments()[0]),
  2282.                 *arg1=(Item_func *)(func->arguments()[1]);
  2283.       if (arg1->const_item()  &&
  2284.           ((functype == Item_func::GE_FUNC && arg1->val()> 0) ||
  2285.            (functype == Item_func::GT_FUNC && arg1->val()>=0))  &&
  2286.            arg0->type() == Item::FUNC_ITEM            &&
  2287.            arg0->functype() == Item_func::FT_FUNC)
  2288.         cond_func=(Item_func_match *) arg0;
  2289.       else if (arg0->const_item() &&
  2290.                ((functype == Item_func::LE_FUNC && arg0->val()> 0) ||
  2291.                 (functype == Item_func::LT_FUNC && arg0->val()>=0)) &&
  2292.                 arg1->type() == Item::FUNC_ITEM          &&
  2293.                 arg1->functype() == Item_func::FT_FUNC)
  2294.         cond_func=(Item_func_match *) arg1;
  2295.     }
  2296.   }
  2297.   else if (cond->type() == Item::COND_ITEM)
  2298.   {
  2299.     List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
  2300.     if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
  2301.     {
  2302.       Item *item;
  2303.       while ((item=li++))
  2304.         add_ft_keys(keyuse_array,stat,item,usable_tables);
  2305.     }
  2306.   }
  2307.   if (!cond_func || cond_func->key == NO_SUCH_KEY ||
  2308.       !(usable_tables & cond_func->table->map))
  2309.     return;
  2310.   KEYUSE keyuse;
  2311.   keyuse.table= cond_func->table;
  2312.   keyuse.val =  cond_func;
  2313.   keyuse.key =  cond_func->key;
  2314.   keyuse.keypart= FT_KEYPART;
  2315.   keyuse.used_tables=cond_func->key_item()->used_tables();
  2316.   keyuse.optimize= 0;
  2317.   keyuse.keypart_map= 0;
  2318.   VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
  2319. }
  2320. static int
  2321. sort_keyuse(KEYUSE *a,KEYUSE *b)
  2322. {
  2323.   int res;
  2324.   if (a->table->tablenr != b->table->tablenr)
  2325.     return (int) (a->table->tablenr - b->table->tablenr);
  2326.   if (a->key != b->key)
  2327.     return (int) (a->key - b->key);
  2328.   if (a->keypart != b->keypart)
  2329.     return (int) (a->keypart - b->keypart);
  2330.   // Place const values before other ones
  2331.   if ((res= test((a->used_tables & ~OUTER_REF_TABLE_BIT)) -
  2332.        test((b->used_tables & ~OUTER_REF_TABLE_BIT))))
  2333.     return res;
  2334.   /* Place rows that are not 'OPTIMIZE_REF_OR_NULL' first */
  2335.   return (int) ((a->optimize & KEY_OPTIMIZE_REF_OR_NULL) -
  2336. (b->optimize & KEY_OPTIMIZE_REF_OR_NULL));
  2337. }
  2338. /*
  2339.   Update keyuse array with all possible keys we can use to fetch rows
  2340.   
  2341.   SYNOPSIS
  2342.     update_ref_and_keys()
  2343.       thd 
  2344.       keyuse     OUT Put here ordered array of KEYUSE structures
  2345.       join_tab       Array in tablenr_order
  2346.       tables         Number of tables in join
  2347.       cond           WHERE condition (note that the function analyzes 
  2348.                      join_tab[i]->on_expr too)
  2349.       normal_tables  tables not inner w.r.t some outer join (ones for which
  2350.                      we can make ref access based the WHERE clause)
  2351.       select_lex     current SELECT
  2352.       
  2353.   RETURN 
  2354.    0 - OK
  2355.    1 - Out of memory.
  2356. */
  2357. static bool
  2358. update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
  2359.     uint tables, COND *cond, table_map normal_tables,
  2360.     SELECT_LEX *select_lex)
  2361. {
  2362.   uint and_level,i,found_eq_constant;
  2363.   KEY_FIELD *key_fields, *end, *field;
  2364.   if (!(key_fields=(KEY_FIELD*)
  2365. thd->alloc(sizeof(key_fields[0])*
  2366.    (thd->lex->current_select->cond_count+1)*2)))
  2367.     return TRUE; /* purecov: inspected */
  2368.   and_level= 0;
  2369.   field= end= key_fields;
  2370.   if (my_init_dynamic_array(keyuse,sizeof(KEYUSE),20,64))
  2371.     return TRUE;
  2372.   if (cond)
  2373.   {
  2374.     add_key_fields(&end,&and_level,cond,normal_tables);
  2375.     for (; field != end ; field++)
  2376.     {
  2377.       add_key_part(keyuse,field);
  2378.       /* Mark that we can optimize LEFT JOIN */
  2379.       if (field->val->type() == Item::NULL_ITEM &&
  2380.   !field->field->real_maybe_null())
  2381. field->field->table->reginfo.not_exists_optimize=1;
  2382.     }
  2383.   }
  2384.   for (i=0 ; i < tables ; i++)
  2385.   {
  2386.     if (join_tab[i].on_expr)
  2387.     {
  2388.       add_key_fields(&end,&and_level,join_tab[i].on_expr,
  2389.      join_tab[i].table->map);
  2390.     }
  2391.   }
  2392.   /* fill keyuse with found key parts */
  2393.   for ( ; field != end ; field++)
  2394.     add_key_part(keyuse,field);
  2395.   if (select_lex->ftfunc_list->elements)
  2396.   {
  2397.     add_ft_keys(keyuse,join_tab,cond,normal_tables);
  2398.   }
  2399.   /*
  2400.     Special treatment for ft-keys.
  2401.     Remove the following things from KEYUSE:
  2402.     - ref if there is a keypart which is a ref and a const.
  2403.     - keyparts without previous keyparts.
  2404.   */
  2405.   if (keyuse->elements)
  2406.   {
  2407.     KEYUSE end,*prev,*save_pos,*use;
  2408.     qsort(keyuse->buffer,keyuse->elements,sizeof(KEYUSE),
  2409.   (qsort_cmp) sort_keyuse);
  2410.     bzero((char*) &end,sizeof(end)); /* Add for easy testing */
  2411.     VOID(insert_dynamic(keyuse,(gptr) &end));
  2412.     use=save_pos=dynamic_element(keyuse,0,KEYUSE*);
  2413.     prev=&end;
  2414.     found_eq_constant=0;
  2415.     for (i=0 ; i < keyuse->elements-1 ; i++,use++)
  2416.     {
  2417.       if (!use->used_tables)
  2418. use->table->const_key_parts[use->key]|= use->keypart_map;
  2419.       if (use->keypart != FT_KEYPART)
  2420.       {
  2421. if (use->key == prev->key && use->table == prev->table)
  2422. {
  2423.   if (prev->keypart+1 < use->keypart ||
  2424.       prev->keypart == use->keypart && found_eq_constant)
  2425.     continue; /* remove */
  2426. }
  2427. else if (use->keypart != 0) // First found must be 0
  2428.   continue;
  2429.       }
  2430.       *save_pos= *use;
  2431.       prev=use;
  2432.       found_eq_constant= !use->used_tables;
  2433.       /* Save ptr to first use */
  2434.       if (!use->table->reginfo.join_tab->keyuse)
  2435. use->table->reginfo.join_tab->keyuse=save_pos;
  2436.       use->table->reginfo.join_tab->checked_keys.set_bit(use->key);
  2437.       save_pos++;
  2438.     }
  2439.     i=(uint) (save_pos-(KEYUSE*) keyuse->buffer);
  2440.     VOID(set_dynamic(keyuse,(gptr) &end,i));
  2441.     keyuse->elements=i;
  2442.   }
  2443.   return FALSE;
  2444. }
  2445. /*
  2446.   Update some values in keyuse for faster find_best_combination() loop
  2447. */
  2448. static void optimize_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse_array)
  2449. {
  2450.   KEYUSE *end,*keyuse= dynamic_element(keyuse_array, 0, KEYUSE*);
  2451.   for (end= keyuse+ keyuse_array->elements ; keyuse < end ; keyuse++)
  2452.   {
  2453.     table_map map;
  2454.     /*
  2455.       If we find a ref, assume this table matches a proportional
  2456.       part of this table.
  2457.       For example 100 records matching a table with 5000 records
  2458.       gives 5000/100 = 50 records per key
  2459.       Constant tables are ignored.
  2460.       To avoid bad matches, we don't make ref_table_rows less than 100.
  2461.     */
  2462.     keyuse->ref_table_rows= ~(ha_rows) 0; // If no ref
  2463.     if (keyuse->used_tables &
  2464. (map= (keyuse->used_tables & ~join->const_table_map &
  2465.        ~OUTER_REF_TABLE_BIT)))
  2466.     {
  2467.       uint tablenr;
  2468.       for (tablenr=0 ; ! (map & 1) ; map>>=1, tablenr++) ;
  2469.       if (map == 1) // Only one table
  2470.       {
  2471. TABLE *tmp_table=join->all_tables[tablenr];
  2472. keyuse->ref_table_rows= max(tmp_table->file->records, 100);
  2473.       }
  2474.     }
  2475.     /*
  2476.       Outer reference (external field) is constant for single executing
  2477.       of subquery
  2478.     */
  2479.     if (keyuse->used_tables == OUTER_REF_TABLE_BIT)
  2480.       keyuse->ref_table_rows= 1;
  2481.   }
  2482. }
  2483. /*****************************************************************************
  2484.   Go through all combinations of not marked tables and find the one
  2485.   which uses least records
  2486. *****************************************************************************/
  2487. /* Save const tables first as used tables */
  2488. static void
  2489. set_position(JOIN *join,uint idx,JOIN_TAB *table,KEYUSE *key)
  2490. {
  2491.   join->positions[idx].table= table;
  2492.   join->positions[idx].key=key;
  2493.   join->positions[idx].records_read=1.0; /* This is a const table */
  2494.   /* Move the const table as down as possible in best_ref */
  2495.   JOIN_TAB **pos=join->best_ref+idx+1;
  2496.   JOIN_TAB *next=join->best_ref[idx];
  2497.   for (;next != table ; pos++)
  2498.   {
  2499.     JOIN_TAB *tmp=pos[0];
  2500.     pos[0]=next;
  2501.     next=tmp;
  2502.   }
  2503.   join->best_ref[idx]=table;
  2504. }
  2505. static void
  2506. find_best_combination(JOIN *join, table_map rest_tables)
  2507. {
  2508.   DBUG_ENTER("find_best_combination");
  2509.   join->best_read=DBL_MAX;
  2510.   find_best(join,rest_tables, join->const_tables,1.0,0.0);
  2511.   DBUG_VOID_RETURN;
  2512. }
  2513. static void
  2514. find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
  2515.   double read_time)
  2516. {
  2517.   ha_rows rec;
  2518.   double tmp;
  2519.   THD *thd= join->thd;
  2520.   if (!rest_tables)
  2521.   {
  2522.     DBUG_PRINT("best",("read_time: %g  record_count: %g",read_time,
  2523.        record_count));
  2524.     read_time+=record_count/(double) TIME_FOR_COMPARE;
  2525.     if (join->sort_by_table &&
  2526. join->sort_by_table !=
  2527. join->positions[join->const_tables].table->table)
  2528.       read_time+=record_count; // We have to make a temp table
  2529.     if (read_time < join->best_read)
  2530.     {
  2531.       memcpy((gptr) join->best_positions,(gptr) join->positions,
  2532.      sizeof(POSITION)*idx);
  2533.       join->best_read=read_time;
  2534.     }
  2535.     return;
  2536.   }
  2537.   if (read_time+record_count/(double) TIME_FOR_COMPARE >= join->best_read)
  2538.     return; /* Found better before */
  2539.   JOIN_TAB *s;
  2540.   double best_record_count=DBL_MAX,best_read_time=DBL_MAX;
  2541.   for (JOIN_TAB **pos=join->best_ref+idx ; (s=*pos) ; pos++)
  2542.   {
  2543.     table_map real_table_bit=s->table->map;
  2544.     if ((rest_tables & real_table_bit) && !(rest_tables & s->dependent))
  2545.     {
  2546.       double best,best_time,records;
  2547.       best=best_time=records=DBL_MAX;
  2548.       KEYUSE *best_key=0;
  2549.       uint best_max_key_part=0;
  2550.       my_bool found_constraint= 0;
  2551.       if (s->keyuse)
  2552.       { /* Use key if possible */
  2553. TABLE *table=s->table;
  2554. KEYUSE *keyuse,*start_key=0;
  2555. double best_records=DBL_MAX;
  2556. uint max_key_part=0;
  2557. /* Test how we can use keys */
  2558. rec= s->records/MATCHING_ROWS_IN_OTHER_TABLE;  // Assumed records/key
  2559. for (keyuse=s->keyuse ; keyuse->table == table ;)
  2560. {
  2561.   key_part_map found_part=0;
  2562.   table_map found_ref=0;
  2563.   uint key=keyuse->key;
  2564.   KEY *keyinfo=table->key_info+key;
  2565.           bool ft_key=(keyuse->keypart == FT_KEYPART);
  2566.   uint found_ref_or_null= 0;
  2567.   /* Calculate how many key segments of the current key we can use */
  2568.   start_key=keyuse;
  2569.   do
  2570.   {
  2571.             uint keypart=keyuse->keypart;
  2572.             table_map best_part_found_ref= 0;
  2573.             double best_prev_record_reads= DBL_MAX;
  2574.     do
  2575.     {
  2576.       if (!(rest_tables & keyuse->used_tables) &&
  2577.   !(found_ref_or_null & keyuse->optimize))
  2578.       {
  2579. found_part|=keyuse->keypart_map;
  2580.                 double tmp= prev_record_reads(join,
  2581.       (found_ref |
  2582.        keyuse->used_tables));
  2583.                 if (tmp < best_prev_record_reads)
  2584.                 {
  2585.                   best_part_found_ref= keyuse->used_tables;
  2586.                   best_prev_record_reads= tmp;
  2587.                 }
  2588. if (rec > keyuse->ref_table_rows)
  2589.   rec= keyuse->ref_table_rows;
  2590. /*
  2591.   If there is one 'key_column IS NULL' expression, we can
  2592.   use this ref_or_null optimisation of this field
  2593. */
  2594. found_ref_or_null|= (keyuse->optimize &
  2595.      KEY_OPTIMIZE_REF_OR_NULL);
  2596.               }
  2597.       keyuse++;
  2598.     } while (keyuse->table == table && keyuse->key == key &&
  2599.      keyuse->keypart == keypart);
  2600.     found_ref|= best_part_found_ref;
  2601.   } while (keyuse->table == table && keyuse->key == key);
  2602.   /*
  2603.     Assume that that each key matches a proportional part of table.
  2604.   */
  2605.           if (!found_part && !ft_key)
  2606.     continue; // Nothing usable found
  2607.   if (rec < MATCHING_ROWS_IN_OTHER_TABLE)
  2608.     rec= MATCHING_ROWS_IN_OTHER_TABLE; // Fix for small tables
  2609.           /*
  2610.     ft-keys require special treatment
  2611.           */
  2612.           if (ft_key)
  2613.           {
  2614.             /*
  2615.       Really, there should be records=0.0 (yes!)
  2616.       but 1.0 would be probably safer
  2617.             */
  2618.             tmp=prev_record_reads(join,found_ref);
  2619.             records=1.0;
  2620.           }
  2621.           else
  2622.           {
  2623.   found_constraint= 1;
  2624.   /*
  2625.     Check if we found full key
  2626.   */
  2627.   if (found_part == PREV_BITS(uint,keyinfo->key_parts) &&
  2628.       !found_ref_or_null)
  2629.   { /* use eq key */
  2630.     max_key_part= (uint) ~0;
  2631.     if ((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY |
  2632.    HA_END_SPACE_KEY)) == HA_NOSAME)
  2633.     {
  2634.       tmp=prev_record_reads(join,found_ref);
  2635.       records=1.0;
  2636.     }
  2637.     else
  2638.     {
  2639.       if (!found_ref)
  2640.       { // We found a const key
  2641. if (table->quick_keys.is_set(key))
  2642.   records= (double) table->quick_rows[key];
  2643. else
  2644. {
  2645.   /* quick_range couldn't use key! */
  2646.   records= (double) s->records/rec;
  2647. }
  2648.       }
  2649.       else
  2650.       {
  2651. if (!(records=keyinfo->rec_per_key[keyinfo->key_parts-1]))
  2652. { // Prefere longer keys
  2653.   records=
  2654.     ((double) s->records / (double) rec *
  2655.      (1.0 +
  2656.       ((double) (table->max_key_length-keyinfo->key_length) /
  2657.        (double) table->max_key_length)));
  2658.   if (records < 2.0)
  2659.     records=2.0; // Can't be as good as a unique
  2660. }
  2661.       }
  2662.       /* Limit the number of matched rows */
  2663.       tmp= records;
  2664.       set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
  2665.       if (table->used_keys.is_set(key))
  2666.       {
  2667. /* we can use only index tree */
  2668. uint keys_per_block= table->file->block_size/2/
  2669.   (keyinfo->key_length+table->file->ref_length)+1;
  2670. tmp=record_count*(tmp+keys_per_block-1)/keys_per_block;
  2671.       }
  2672.       else
  2673. tmp=record_count*min(tmp,s->worst_seeks);
  2674.     }
  2675.   }
  2676.   else
  2677.   {
  2678.     /*
  2679.       Use as much key-parts as possible and a uniq key is better
  2680.       than a not unique key
  2681.       Set tmp to (previous record count) * (records / combination)
  2682.     */
  2683.     if ((found_part & 1) &&
  2684. (!(table->file->index_flags(key,0,0) & HA_ONLY_WHOLE_INDEX) ||
  2685.  found_part == PREV_BITS(uint,keyinfo->key_parts)))
  2686.     {
  2687.       max_key_part=max_part_bit(found_part);
  2688.       /*
  2689. Check if quick_range could determinate how many rows we
  2690. will match
  2691.       */
  2692.       if (table->quick_keys.is_set(key) &&
  2693.   table->quick_key_parts[key] == max_key_part)
  2694. tmp=records= (double) table->quick_rows[key];
  2695.       else
  2696.       {
  2697. /* Check if we have statistic about the distribution */
  2698. if ((records=keyinfo->rec_per_key[max_key_part-1]))
  2699.   tmp=records;
  2700. else
  2701. {
  2702.   /*
  2703.     Assume that the first key part matches 1% of the file
  2704.     and that the hole key matches 10 (duplicates) or 1
  2705.     (unique) records.
  2706.     Assume also that more key matches proportionally more
  2707.     records
  2708.     This gives the formula:
  2709.     records= (x * (b-a) + a*c-b)/(c-1)
  2710.     b = records matched by whole key
  2711.     a = records matched by first key part (10% of all records?)
  2712.     c = number of key parts in key
  2713.     x = used key parts (1 <= x <= c)
  2714.   */
  2715.   double rec_per_key;
  2716.                   rec_per_key= keyinfo->rec_per_key[keyinfo->key_parts-1] ?
  2717.     (double) keyinfo->rec_per_key[keyinfo->key_parts-1] :
  2718.     (double) s->records/rec+1;   
  2719.   if (!s->records)
  2720.     tmp=0;
  2721.   else if (rec_per_key/(double) s->records >= 0.01)
  2722.     tmp=rec_per_key;
  2723.   else
  2724.   {
  2725.     double a=s->records*0.01;
  2726.     tmp=(max_key_part * (rec_per_key - a) +
  2727.  a*keyinfo->key_parts - rec_per_key)/
  2728.       (keyinfo->key_parts-1);
  2729.     set_if_bigger(tmp,1.0);
  2730.   }
  2731.   records=(ulong) tmp;
  2732. }
  2733. /*
  2734.   If quick_select was used on a part of this key, we know
  2735.   the maximum number of rows that the key can match.
  2736. */
  2737. if (table->quick_keys.is_set(key) &&
  2738.     table->quick_key_parts[key] <= max_key_part &&
  2739.     records > (double) table->quick_rows[key])
  2740.   tmp= records= (double) table->quick_rows[key];
  2741. else if (found_ref_or_null)
  2742. {
  2743.   /* We need to do two key searches to find key */
  2744.   tmp*= 2.0;
  2745.   records*= 2.0;
  2746. }
  2747.       }
  2748.       /* Limit the number of matched rows */
  2749.       set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
  2750.       if (table->used_keys.is_set(key))
  2751.       {
  2752. /* we can use only index tree */
  2753. uint keys_per_block= table->file->block_size/2/
  2754.   (keyinfo->key_length+table->file->ref_length)+1;
  2755. tmp=record_count*(tmp+keys_per_block-1)/keys_per_block;
  2756.       }
  2757.       else
  2758. tmp=record_count*min(tmp,s->worst_seeks);
  2759.     }
  2760.     else
  2761.       tmp=best_time; // Do nothing
  2762.   }
  2763.           } /* not ft_key */
  2764.   if (tmp < best_time - records/(double) TIME_FOR_COMPARE)
  2765.   {
  2766.     best_time=tmp + records/(double) TIME_FOR_COMPARE;
  2767.     best=tmp;
  2768.     best_records=records;
  2769.     best_key=start_key;
  2770.     best_max_key_part=max_key_part;
  2771.   }
  2772. }
  2773. records=best_records;
  2774.       }
  2775.       /*
  2776. Don't test table scan if it can't be better.
  2777. Prefer key lookup if we would use the same key for scanning.
  2778. Don't do a table scan on InnoDB tables, if we can read the used
  2779. parts of the row from any of the used index.
  2780. This is because table scans uses index and we would not win
  2781. anything by using a table scan.
  2782.       */
  2783.       if ((records >= s->found_records || best > s->read_time) &&
  2784.   !(s->quick && best_key && s->quick->index == best_key->key &&
  2785.     best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&
  2786.   !((s->table->file->table_flags() & HA_TABLE_SCAN_ON_INDEX) &&
  2787.     ! s->table->used_keys.is_clear_all() && best_key) &&
  2788.   !(s->table->force_index && best_key))
  2789.       { // Check full join
  2790.         ha_rows rnd_records= s->found_records;
  2791.         /*
  2792.           If there is a restriction on the table, assume that 25% of the
  2793.           rows can be skipped on next part.
  2794.           This is to force tables that this table depends on before this
  2795.           table
  2796.         */
  2797.         if (found_constraint)
  2798.           rnd_records-= rnd_records/4;
  2799.         /*
  2800.           Range optimizer never proposes a RANGE if it isn't better
  2801.           than FULL: so if RANGE is present, it's always preferred to FULL.
  2802.           Here we estimate its cost.
  2803.         */
  2804.         if (s->quick)
  2805.         {
  2806.           /*
  2807.             For each record we:
  2808.              - read record range through 'quick'
  2809.              - skip rows which does not satisfy WHERE constraints
  2810.            */
  2811.           tmp= record_count *
  2812.                (s->quick->read_time +
  2813.                (s->found_records - rnd_records)/(double) TIME_FOR_COMPARE);
  2814.         }
  2815.         else
  2816.         {
  2817.           /* Estimate cost of reading table. */
  2818.           tmp= s->table->file->scan_time();
  2819.           if (s->on_expr)                         // Can't use join cache
  2820.           {
  2821.             /*
  2822.               For each record we have to:
  2823.               - read the whole table record 
  2824.               - skip rows which does not satisfy join condition
  2825.             */
  2826.             tmp= record_count *
  2827.                  (tmp +     
  2828.                  (s->records - rnd_records)/(double) TIME_FOR_COMPARE);
  2829.           }
  2830.           else
  2831.           {
  2832.             /* We read the table as many times as join buffer becomes full. */
  2833.             tmp*= (1.0 + floor((double) cache_record_length(join,idx) *
  2834.                                record_count /
  2835.                                (double) thd->variables.join_buff_size));
  2836.             /* 
  2837.               We don't make full cartesian product between rows in the scanned
  2838.               table and existing records because we skip all rows from the
  2839.               scanned table, which does not satisfy join condition when 
  2840.               we read the table (see flush_cached_records for details). Here we
  2841.               take into account cost to read and skip these records.
  2842.             */
  2843.             tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
  2844.           }
  2845.         }
  2846.         /*
  2847.           We estimate the cost of evaluating WHERE clause for found records
  2848.           as record_count * rnd_records / TIME_FOR_COMPARE. This cost plus
  2849.           tmp give us total cost of using TABLE SCAN
  2850.         */
  2851. if (best == DBL_MAX ||
  2852.     (tmp  + record_count/(double) TIME_FOR_COMPARE*rnd_records <
  2853.      best + record_count/(double) TIME_FOR_COMPARE*records))
  2854. {
  2855.   /*
  2856.     If the table has a range (s->quick is set) make_join_select()
  2857.     will ensure that this will be used
  2858.   */
  2859.   best=tmp;
  2860.   records= rows2double(rnd_records);
  2861.   best_key=0;
  2862. }
  2863.       }
  2864.       join->positions[idx].records_read= records;
  2865.       join->positions[idx].key=best_key;
  2866.       join->positions[idx].table= s;
  2867.       if (!best_key && idx == join->const_tables &&
  2868.   s->table == join->sort_by_table &&
  2869.   join->unit->select_limit_cnt >= records)
  2870. join->sort_by_table= (TABLE*) 1; // Must use temporary table
  2871.      /*
  2872. Go to the next level only if there hasn't been a better key on
  2873. this level! This will cut down the search for a lot simple cases!
  2874.        */
  2875.       double current_record_count=record_count*records;
  2876.       double current_read_time=read_time+best;
  2877.       if (best_record_count > current_record_count ||
  2878.   best_read_time > current_read_time ||
  2879.   idx == join->const_tables && s->table == join->sort_by_table)
  2880.       {
  2881. if (best_record_count >= current_record_count &&
  2882.     best_read_time >= current_read_time &&
  2883.     (!(s->key_dependent & rest_tables) || records < 2.0))
  2884. {
  2885.   best_record_count=current_record_count;
  2886.   best_read_time=current_read_time;
  2887. }
  2888. swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
  2889. find_best(join,rest_tables & ~real_table_bit,idx+1,
  2890.   current_record_count,current_read_time);
  2891.         if (thd->killed)
  2892.           return;
  2893. swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
  2894.       }
  2895.       if (join->select_options & SELECT_STRAIGHT_JOIN)
  2896. break; // Don't test all combinations
  2897.     }
  2898.   }
  2899. }
  2900. /*
  2901.   Find how much space the prevous read not const tables takes in cache
  2902. */
  2903. static void calc_used_field_length(THD *thd, JOIN_TAB *join_tab)
  2904. {
  2905.   uint null_fields,blobs,fields,rec_length;
  2906.   null_fields=blobs=fields=rec_length=0;
  2907.   Field **f_ptr,*field;
  2908.   for (f_ptr=join_tab->table->field ; (field= *f_ptr) ; f_ptr++)
  2909.   {
  2910.     if (field->query_id == thd->query_id)
  2911.     {
  2912.       uint flags=field->flags;
  2913.       fields++;
  2914.       rec_length+=field->pack_length();
  2915.       if (flags & BLOB_FLAG)
  2916. blobs++;
  2917.       if (!(flags & NOT_NULL_FLAG))
  2918. null_fields++;
  2919.     }
  2920.   }
  2921.   if (null_fields)
  2922.     rec_length+=(join_tab->table->null_fields+7)/8;
  2923.   if (join_tab->table->maybe_null)
  2924.     rec_length+=sizeof(my_bool);
  2925.   if (blobs)
  2926.   {
  2927.     uint blob_length=(uint) (join_tab->table->file->mean_rec_length-
  2928.      (join_tab->table->reclength- rec_length));
  2929.     rec_length+=(uint) max(4,blob_length);
  2930.   }
  2931.   join_tab->used_fields=fields;
  2932.   join_tab->used_fieldlength=rec_length;
  2933.   join_tab->used_blobs=blobs;
  2934. }
  2935. static uint
  2936. cache_record_length(JOIN *join,uint idx)
  2937. {
  2938.   uint length=0;
  2939.   JOIN_TAB **pos,**end;
  2940.   THD *thd=join->thd;
  2941.   for (pos=join->best_ref+join->const_tables,end=join->best_ref+idx ;
  2942.        pos != end ;
  2943.        pos++)
  2944.   {
  2945.     JOIN_TAB *join_tab= *pos;
  2946.     if (!join_tab->used_fieldlength) /* Not calced yet */
  2947.       calc_used_field_length(thd, join_tab);
  2948.     length+=join_tab->used_fieldlength;
  2949.   }
  2950.   return length;
  2951. }
  2952. static double
  2953. prev_record_reads(JOIN *join,table_map found_ref)
  2954. {
  2955.   double found=1.0;
  2956.   found_ref&= ~OUTER_REF_TABLE_BIT;
  2957.   for (POSITION *pos=join->positions ; found_ref ; pos++)
  2958.   {
  2959.     if (pos->table->table->map & found_ref)
  2960.     {
  2961.       found_ref&= ~pos->table->table->map;
  2962.       found*=pos->records_read;
  2963.     }
  2964.   }
  2965.   return found;
  2966. }
  2967. /*****************************************************************************
  2968.   Set up join struct according to best position.
  2969. *****************************************************************************/
  2970. static bool
  2971. get_best_combination(JOIN *join)
  2972. {
  2973.   uint i,tablenr;
  2974.   table_map used_tables;
  2975.   JOIN_TAB *join_tab,*j;
  2976.   KEYUSE *keyuse;
  2977.   uint table_count;
  2978.   THD *thd=join->thd;
  2979.   table_count=join->tables;
  2980.   if (!(join->join_tab=join_tab=
  2981. (JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB)*table_count)))
  2982.     return TRUE;
  2983.   join->full_join=0;
  2984.   used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read
  2985.   for (j=join_tab, tablenr=0 ; tablenr < table_count ; tablenr++,j++)
  2986.   {
  2987.     TABLE *form;
  2988.     *j= *join->best_positions[tablenr].table;
  2989.     form=join->table[tablenr]=j->table;
  2990.     used_tables|= form->map;
  2991.     form->reginfo.join_tab=j;
  2992.     if (!j->on_expr)
  2993.       form->reginfo.not_exists_optimize=0; // Only with LEFT JOIN
  2994.     if (j->type == JT_CONST)
  2995.       continue; // Handled in make_join_stat..
  2996.     j->ref.key = -1;
  2997.     j->ref.key_parts=0;
  2998.     if (j->type == JT_SYSTEM)
  2999.       continue;
  3000.     if (j->keys.is_clear_all() || !(keyuse= join->best_positions[tablenr].key))
  3001.     {
  3002.       j->type=JT_ALL;
  3003.       if (tablenr != join->const_tables)
  3004. join->full_join=1;
  3005.     }
  3006.     else if (create_ref_for_key(join, j, keyuse, used_tables))
  3007.       return TRUE; // Something went wrong
  3008.   }
  3009.   for (i=0 ; i < table_count ; i++)
  3010.     join->map2table[join->join_tab[i].table->tablenr]=join->join_tab+i;
  3011.   update_depend_map(join);
  3012.   return 0;
  3013. }
  3014. static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
  3015.        table_map used_tables)
  3016. {
  3017.   KEYUSE *keyuse=org_keyuse;
  3018.   bool ftkey=(keyuse->keypart == FT_KEYPART);
  3019.   THD  *thd= join->thd;
  3020.   uint keyparts,length,key;
  3021.   TABLE *table;
  3022.   KEY *keyinfo;
  3023.   /*  Use best key from find_best */
  3024.   table=j->table;
  3025.   key=keyuse->key;
  3026.   keyinfo=table->key_info+key;
  3027.   if (ftkey)
  3028.   {
  3029.     Item_func_match *ifm=(Item_func_match *)keyuse->val;
  3030.     length=0;
  3031.     keyparts=1;
  3032.     ifm->join_key=1;
  3033.   }
  3034.   else
  3035.   {
  3036.     keyparts=length=0;
  3037.     uint found_part_ref_or_null= 0;
  3038.     /*
  3039.       Calculate length for the used key
  3040.       Stop if there is a missing key part or when we find second key_part
  3041.       with KEY_OPTIMIZE_REF_OR_NULL
  3042.     */
  3043.     do
  3044.     {
  3045.       if (!(~used_tables & keyuse->used_tables))
  3046.       {
  3047. if (keyparts == keyuse->keypart &&
  3048.     !(found_part_ref_or_null & keyuse->optimize))
  3049. {
  3050.   keyparts++;
  3051.   length+= keyinfo->key_part[keyuse->keypart].store_length;
  3052.   found_part_ref_or_null|= keyuse->optimize;
  3053. }
  3054.       }
  3055.       keyuse++;
  3056.     } while (keyuse->table == table && keyuse->key == key);
  3057.   } /* not ftkey */
  3058.   /* set up fieldref */
  3059.   keyinfo=table->key_info+key;
  3060.   j->ref.key_parts=keyparts;
  3061.   j->ref.key_length=length;
  3062.   j->ref.key=(int) key;
  3063.   if (!(j->ref.key_buff= (byte*) thd->calloc(ALIGN_SIZE(length)*2)) ||
  3064.       !(j->ref.key_copy= (store_key**) thd->alloc((sizeof(store_key*) *
  3065.    (keyparts+1)))) ||
  3066.       !(j->ref.items=    (Item**) thd->alloc(sizeof(Item*)*keyparts)))
  3067.   {
  3068.     return TRUE;
  3069.   }
  3070.   j->ref.key_buff2=j->ref.key_buff+ALIGN_SIZE(length);
  3071.   j->ref.key_err=1;
  3072.   j->ref.null_rejecting= 0;
  3073.   keyuse=org_keyuse;
  3074.   store_key **ref_key= j->ref.key_copy;
  3075.   byte *key_buff=j->ref.key_buff, *null_ref_key= 0;
  3076.   bool keyuse_uses_no_tables= TRUE;
  3077.   if (ftkey)
  3078.   {
  3079.     j->ref.items[0]=((Item_func*)(keyuse->val))->key_item();
  3080.     if (keyuse->used_tables)
  3081.       return TRUE; // not supported yet. SerG
  3082.     j->type=JT_FT;
  3083.   }
  3084.   else
  3085.   {
  3086.     uint i;
  3087.     for (i=0 ; i < keyparts ; keyuse++,i++)
  3088.     {
  3089.       while (keyuse->keypart != i ||
  3090.      ((~used_tables) & keyuse->used_tables))
  3091. keyuse++; /* Skip other parts */
  3092.       uint maybe_null= test(keyinfo->key_part[i].null_bit);
  3093.       j->ref.items[i]=keyuse->val; // Save for cond removal
  3094.       if (keyuse->null_rejecting) 
  3095.         j->ref.null_rejecting |= 1 << i;
  3096.       keyuse_uses_no_tables= keyuse_uses_no_tables && !keyuse->used_tables;
  3097.       if (!keyuse->used_tables &&
  3098.   !(join->select_options & SELECT_DESCRIBE))
  3099.       { // Compare against constant
  3100. store_key_item tmp(thd, keyinfo->key_part[i].field,
  3101.                            (char*)key_buff + maybe_null,
  3102.                            maybe_null ?  (char*) key_buff : 0,
  3103.                            keyinfo->key_part[i].length, keyuse->val);
  3104. if (thd->is_fatal_error)
  3105.   return TRUE;
  3106. tmp.copy();
  3107.       }
  3108.       else
  3109. *ref_key++= get_store_key(thd,
  3110.   keyuse,join->const_table_map,
  3111.   &keyinfo->key_part[i],
  3112.   (char*) key_buff,maybe_null);
  3113.       /*
  3114. Remeber if we are going to use REF_OR_NULL
  3115. But only if field _really_ can be null i.e. we force JT_REF
  3116. instead of JT_REF_OR_NULL in case if field can't be null
  3117.       */
  3118.       if ((keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL) && maybe_null)
  3119. null_ref_key= key_buff;
  3120.       key_buff+=keyinfo->key_part[i].store_length;
  3121.     }
  3122.   } /* not ftkey */
  3123.   *ref_key=0; // end_marker
  3124.   if (j->type == JT_FT)
  3125.     return 0;
  3126.   if (j->type == JT_CONST)
  3127.     j->table->const_table= 1;
  3128.   else if (((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY |
  3129.        HA_END_SPACE_KEY)) != HA_NOSAME) ||
  3130.    keyparts != keyinfo->key_parts || null_ref_key)
  3131.   {
  3132.     /* Must read with repeat */
  3133.     j->type= null_ref_key ? JT_REF_OR_NULL : JT_REF;
  3134.     j->ref.null_ref_key= null_ref_key;
  3135.   }
  3136.   else if (keyuse_uses_no_tables)
  3137.   {
  3138.     /*
  3139.       This happen if we are using a constant expression in the ON part
  3140.       of an LEFT JOIN.
  3141.       SELECT * FROM a LEFT JOIN b ON b.key=30
  3142.       Here we should not mark the table as a 'const' as a field may
  3143.       have a 'normal' value or a NULL value.
  3144.     */
  3145.     j->type=JT_CONST;
  3146.   }
  3147.   else
  3148.     j->type=JT_EQ_REF;
  3149.   return 0;
  3150. }
  3151. static store_key *
  3152. get_store_key(THD *thd, KEYUSE *keyuse, table_map used_tables,
  3153.       KEY_PART_INFO *key_part, char *key_buff, uint maybe_null)
  3154. {
  3155.   if (!((~used_tables) & keyuse->used_tables)) // if const item