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

MySQL数据库

开发平台:

Visual C++

  1.   {
  2.     return new store_key_const_item(thd,
  3.     key_part->field,
  4.     key_buff + maybe_null,
  5.     maybe_null ? key_buff : 0,
  6.     key_part->length,
  7.     keyuse->val);
  8.   }
  9.   else if (keyuse->val->type() == Item::FIELD_ITEM)
  10.     return new store_key_field(thd,
  11.        key_part->field,
  12.        key_buff + maybe_null,
  13.        maybe_null ? key_buff : 0,
  14.        key_part->length,
  15.        ((Item_field*) keyuse->val)->field,
  16.        keyuse->val->full_name());
  17.   return new store_key_item(thd,
  18.     key_part->field,
  19.     key_buff + maybe_null,
  20.     maybe_null ? key_buff : 0,
  21.     key_part->length,
  22.     keyuse->val);
  23. }
  24. /*
  25.   This function is only called for const items on fields which are keys
  26.   returns 1 if there was some conversion made when the field was stored.
  27. */
  28. bool
  29. store_val_in_field(Field *field,Item *item)
  30. {
  31.   bool error;
  32.   THD *thd=current_thd;
  33.   ha_rows cuted_fields=thd->cuted_fields;
  34.   /*
  35.     we should restore old value of count_cuted_fields because
  36.     store_val_in_field can be called from mysql_insert 
  37.     with select_insert, which make count_cuted_fields= 1
  38.    */
  39.   enum_check_fields old_count_cuted_fields= thd->count_cuted_fields;
  40.   thd->count_cuted_fields= CHECK_FIELD_WARN;
  41.   error= item->save_in_field(field, 1);
  42.   thd->count_cuted_fields= old_count_cuted_fields;
  43.   return error || cuted_fields != thd->cuted_fields;
  44. }
  45. static bool
  46. make_simple_join(JOIN *join,TABLE *tmp_table)
  47. {
  48.   TABLE **tableptr;
  49.   JOIN_TAB *join_tab;
  50.   if (!(tableptr=(TABLE**) join->thd->alloc(sizeof(TABLE*))) ||
  51.       !(join_tab=(JOIN_TAB*) join->thd->alloc(sizeof(JOIN_TAB))))
  52.     return TRUE;
  53.   join->join_tab=join_tab;
  54.   join->table=tableptr; tableptr[0]=tmp_table;
  55.   join->tables=1;
  56.   join->const_tables=0;
  57.   join->const_table_map=0;
  58.   join->tmp_table_param.field_count= join->tmp_table_param.sum_func_count=
  59.     join->tmp_table_param.func_count=0;
  60.   join->tmp_table_param.copy_field=join->tmp_table_param.copy_field_end=0;
  61.   join->first_record=join->sort_and_group=0;
  62.   join->send_records=(ha_rows) 0;
  63.   join->group=0;
  64.   join->row_limit=join->unit->select_limit_cnt;
  65.   join->do_send_rows = (join->row_limit) ? 1 : 0;
  66.   join_tab->cache.buff=0; /* No caching */
  67.   join_tab->table=tmp_table;
  68.   join_tab->select=0;
  69.   join_tab->select_cond=0;
  70.   join_tab->quick=0;
  71.   join_tab->type= JT_ALL; /* Map through all records */
  72.   join_tab->keys.init();
  73.   join_tab->keys.set_all();                     /* test everything in quick */
  74.   join_tab->info=0;
  75.   join_tab->on_expr=0;
  76.   join_tab->ref.key = -1;
  77.   join_tab->not_used_in_distinct=0;
  78.   join_tab->read_first_record= join_init_read_record;
  79.   join_tab->join=join;
  80.   bzero((char*) &join_tab->read_record,sizeof(join_tab->read_record));
  81.   tmp_table->status=0;
  82.   tmp_table->null_row=0;
  83.   return FALSE;
  84. }
  85. inline void add_cond_and_fix(Item **e1, Item *e2)
  86. {
  87.   if (*e1)
  88.   {
  89.     Item *res;
  90.     if ((res= new Item_cond_and(*e1, e2)))
  91.     {
  92.       *e1= res;
  93.       res->quick_fix_field();
  94.     }
  95.   }
  96.   else
  97.     *e1= e2;
  98. }
  99. /*
  100.   Add to join_tab->select_cond[i] "table.field IS NOT NULL" conditions we've
  101.   inferred from ref/eq_ref access performed.
  102.   SYNOPSIS
  103.     add_not_null_conds()
  104.       join  Join to process
  105.   NOTES
  106.     This function is a part of "Early NULL-values filtering for ref access"
  107.     optimization.
  108.     Example of this optimization:
  109.       For query SELECT * FROM t1,t2 WHERE t2.key=t1.field
  110.       and plan " any-access(t1), ref(t2.key=t1.field) "
  111.       add "t1.field IS NOT NULL" to t1's table condition.
  112.     Description of the optimization:
  113.     
  114.       We look through equalities choosen to perform ref/eq_ref access,
  115.       pick equalities that have form "tbl.part_of_key = othertbl.field"
  116.       (where othertbl is a non-const table and othertbl.field may be NULL)
  117.       and add them to conditions on correspoding tables (othertbl in this
  118.       example).
  119.       Exception from that is the case when referred_tab->join != join.
  120.       I.e. don't add NOT NULL constraints from any embedded subquery.
  121.       Consider this query:
  122.       SELECT A.f2 FROM t1 LEFT JOIN t2 A ON A.f2 = f1
  123.       WHERE A.f3=(SELECT MIN(f3) FROM  t2 C WHERE A.f4 = C.f4) OR A.f3 IS NULL;
  124.       Here condition A.f3 IS NOT NULL is going to be added to the WHERE
  125.       condition of the embedding query.
  126.       Another example:
  127.       SELECT * FROM t10, t11 WHERE (t10.a < 10 OR t10.a IS NULL)
  128.       AND t11.b <=> t10.b AND (t11.a = (SELECT MAX(a) FROM t12
  129.       WHERE t12.b = t10.a ));
  130.       Here condition t10.a IS NOT NULL is going to be added.
  131.       In both cases addition of NOT NULL condition will erroneously reject
  132.       some rows of the result set.
  133.       referred_tab->join != join constraint would disallow such additions.
  134.       This optimization doesn't affect the choices that ref, range, or join
  135.       optimizer make. This was intentional because this was added after 4.1
  136.       was GA.
  137.       
  138.     Implementation overview
  139.       1. update_ref_and_keys() accumulates info about null-rejecting
  140.          predicates in in KEY_FIELD::null_rejecting
  141.       1.1 add_key_part saves these to KEYUSE.
  142.       2. create_ref_for_key copies them to TABLE_REF.
  143.       3. add_not_null_conds adds "x IS NOT NULL" to join_tab->select_cond of
  144.          appropiate JOIN_TAB members.
  145. */
  146. static void add_not_null_conds(JOIN *join)
  147. {
  148.   DBUG_ENTER("add_not_null_conds");
  149.   for (uint i=join->const_tables ; i < join->tables ; i++)
  150.   {
  151.     JOIN_TAB *tab=join->join_tab+i;
  152.     if ((tab->type == JT_REF || tab->type == JT_REF_OR_NULL) &&
  153.          !tab->table->maybe_null)
  154.     {
  155.       for (uint keypart= 0; keypart < tab->ref.key_parts; keypart++)
  156.       {
  157.         if (tab->ref.null_rejecting & (1 << keypart))
  158.         {
  159.           Item *item= tab->ref.items[keypart];
  160.           Item *notnull;
  161.           DBUG_ASSERT(item->type() == Item::FIELD_ITEM);
  162.           Item_field *not_null_item= (Item_field*)item;
  163.           JOIN_TAB *referred_tab= not_null_item->field->table->reginfo.join_tab;
  164.           /*
  165.             For UPDATE queries such as:
  166.             UPDATE t1 SET t1.f2=(SELECT MAX(t2.f4) FROM t2 WHERE t2.f3=t1.f1);
  167.             not_null_item is the t1.f1, but it's referred_tab is 0.
  168.           */
  169.           if (!referred_tab || referred_tab->join != join)
  170.             continue;
  171.           if (!(notnull= new Item_func_isnotnull(not_null_item)))
  172.             DBUG_VOID_RETURN;
  173.           /*
  174.             We need to do full fix_fields() call here in order to have correct
  175.             notnull->const_item(). This is needed e.g. by test_quick_select 
  176.             when it is called from make_join_select after this function is 
  177.             called.
  178.           */
  179.           if (notnull->fix_fields(join->thd, join->tables_list, &notnull))
  180.             DBUG_VOID_RETURN;
  181.           DBUG_EXECUTE("where",print_where(notnull,
  182.                                            referred_tab->table->table_name););
  183.           add_cond_and_fix(&referred_tab->select_cond, notnull);
  184.         }
  185.       }
  186.     }
  187.   }
  188.   DBUG_VOID_RETURN;
  189. }
  190. static bool
  191. make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
  192. {
  193.   DBUG_ENTER("make_join_select");
  194.   if (select)
  195.   {
  196.     add_not_null_conds(join);
  197.     table_map used_tables;
  198.     if (join->tables > 1)
  199.       cond->update_used_tables(); // Tablenr may have changed
  200.     if (join->const_tables == join->tables &&
  201. join->thd->lex->current_select->master_unit() ==
  202. &join->thd->lex->unit) // not upper level SELECT
  203.       join->const_table_map|=RAND_TABLE_BIT;
  204.     { // Check const tables
  205.       COND *const_cond=
  206. make_cond_for_table(cond,join->const_table_map,(table_map) 0);
  207.       DBUG_EXECUTE("where",print_where(const_cond,"constants"););
  208.       if (const_cond && !const_cond->val_int())
  209.       {
  210. DBUG_PRINT("info",("Found impossible WHERE condition"));
  211. DBUG_RETURN(1); // Impossible const condition
  212.       }
  213.     }
  214.     used_tables=((select->const_tables=join->const_table_map) |
  215.  OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
  216.     for (uint i=join->const_tables ; i < join->tables ; i++)
  217.     {
  218.       JOIN_TAB *tab=join->join_tab+i;
  219.       table_map current_map= tab->table->map;
  220.       /*
  221. Following force including random expression in last table condition.
  222. It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5
  223.       */
  224.       if (i == join->tables-1)
  225. current_map|= OUTER_REF_TABLE_BIT | RAND_TABLE_BIT;
  226.       bool use_quick_range=0;
  227.       used_tables|=current_map;
  228.       if (tab->type == JT_REF && tab->quick &&
  229.   (uint) tab->ref.key == tab->quick->index &&
  230.   tab->ref.key_length < tab->quick->max_used_key_length)
  231.       {
  232. /* Range uses longer key;  Use this instead of ref on key */
  233. tab->type=JT_ALL;
  234. use_quick_range=1;
  235. tab->use_quick=1;
  236.         tab->ref.key= -1;
  237. tab->ref.key_parts=0; // Don't use ref key.
  238. join->best_positions[i].records_read= rows2double(tab->quick->records);
  239.       }
  240.       COND *tmp=make_cond_for_table(cond,used_tables,current_map);
  241.       if (!tmp && tab->quick)
  242.       { // Outer join
  243. /*
  244.   Hack to handle the case where we only refer to a table
  245.   in the ON part of an OUTER JOIN.
  246. */
  247. tmp=new Item_int((longlong) 1,1); // Always true
  248.       }
  249.       if (tmp)
  250.       {
  251. SQL_SELECT *sel=tab->select=(SQL_SELECT*)
  252.   join->thd->memdup((gptr) select, sizeof(SQL_SELECT));
  253. if (!sel)
  254.   DBUG_RETURN(1); // End of memory
  255.         add_cond_and_fix(&tab->select_cond, tmp);
  256.         sel->cond= tab->select_cond;
  257. sel->head=tab->table;
  258. DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name););
  259. if (tab->quick)
  260. {
  261.   /* Use quick key read if it's a constant and it's not used
  262.      with key reading */
  263.   if (tab->needed_reg.is_clear_all() && tab->type != JT_EQ_REF
  264.       && tab->type != JT_FT && (tab->type != JT_REF ||
  265.        (uint) tab->ref.key == tab->quick->index))
  266.   {
  267.     sel->quick=tab->quick; // Use value from get_quick_...
  268.     sel->quick_keys.clear_all();
  269.     sel->needed_reg.clear_all();
  270.   }
  271.   else
  272.   {
  273.     delete tab->quick;
  274.   }
  275.   tab->quick=0;
  276. }
  277. uint ref_key=(uint) sel->head->reginfo.join_tab->ref.key+1;
  278. if (i == join->const_tables && ref_key)
  279. {
  280.   if (!tab->const_keys.is_clear_all() &&
  281.               tab->table->reginfo.impossible_range)
  282.     DBUG_RETURN(1);
  283. }
  284. else if (tab->type == JT_ALL && ! use_quick_range)
  285. {
  286.   if (!tab->const_keys.is_clear_all() &&
  287.       tab->table->reginfo.impossible_range)
  288.     DBUG_RETURN(1); // Impossible range
  289.   /*
  290.     We plan to scan all rows.
  291.     Check again if we should use an index.
  292.     We could have used an column from a previous table in
  293.     the index if we are using limit and this is the first table
  294.   */
  295.   if ((!tab->keys.is_subset(tab->const_keys) && i > 0) ||
  296.       (!tab->const_keys.is_clear_all() && i == join->const_tables &&
  297.        join->unit->select_limit_cnt <
  298.        join->best_positions[i].records_read &&
  299.        !(join->select_options & OPTION_FOUND_ROWS)))
  300.   {
  301.     /* Join with outer join condition */
  302.     COND *orig_cond=sel->cond;
  303.     sel->cond= and_conds(sel->cond, tab->on_expr);
  304.     /*
  305.               We can't call sel->cond->fix_fields,
  306.               as it will break tab->on_expr if it's AND condition
  307.               (fix_fields currently removes extra AND/OR levels).
  308.               Yet attributes of the just built condition are not needed.
  309.               Thus we call sel->cond->quick_fix_field for safety.
  310.     */
  311.     if (sel->cond && !sel->cond->fixed)
  312.       sel->cond->quick_fix_field();
  313.     if (sel->test_quick_select(join->thd, tab->keys,
  314.        used_tables & ~ current_map,
  315.        (join->select_options &
  316. OPTION_FOUND_ROWS ?
  317. HA_POS_ERROR :
  318. join->unit->select_limit_cnt), 0) < 0)
  319.             {
  320.       /*
  321. Before reporting "Impossible WHERE" for the whole query
  322. we have to check isn't it only "impossible ON" instead
  323.       */
  324.               sel->cond=orig_cond;
  325.               if (!tab->on_expr ||
  326.                   sel->test_quick_select(join->thd, tab->keys,
  327.                                          used_tables & ~ current_map,
  328.                                          (join->select_options &
  329.                                           OPTION_FOUND_ROWS ?
  330.                                           HA_POS_ERROR :
  331.                                           join->unit->select_limit_cnt),0) < 0)
  332. DBUG_RETURN(1); // Impossible WHERE
  333.             }
  334.             else
  335.       sel->cond=orig_cond;
  336.     /* Fix for EXPLAIN */
  337.     if (sel->quick)
  338.       join->best_positions[i].records_read= sel->quick->records;
  339.   }
  340.   else
  341.   {
  342.     sel->needed_reg=tab->needed_reg;
  343.     sel->quick_keys.clear_all();
  344.   }
  345.   if (!sel->quick_keys.is_subset(tab->checked_keys) ||
  346.               !sel->needed_reg.is_subset(tab->checked_keys))
  347.   {
  348.     tab->keys=sel->quick_keys;
  349.             tab->keys.merge(sel->needed_reg);
  350.     tab->use_quick= (!sel->needed_reg.is_clear_all() &&
  351.      (select->quick_keys.is_clear_all() ||
  352.       (select->quick &&
  353.        (select->quick->records >= 100L)))) ?
  354.       2 : 1;
  355.     sel->read_tables= used_tables & ~current_map;
  356.   }
  357.   if (i != join->const_tables && tab->use_quick != 2)
  358.   { /* Read with cache */
  359.     if ((tmp=make_cond_for_table(cond,
  360.  join->const_table_map |
  361.  current_map,
  362.  current_map)))
  363.     {
  364.       DBUG_EXECUTE("where",print_where(tmp,"cache"););
  365.       tab->cache.select=(SQL_SELECT*)
  366. join->thd->memdup((gptr) sel, sizeof(SQL_SELECT));
  367.       tab->cache.select->cond=tmp;
  368.       tab->cache.select->read_tables=join->const_table_map;
  369.     }
  370.   }
  371. }
  372.       }
  373.     }
  374.   }
  375.   DBUG_RETURN(0);
  376. }
  377. static void
  378. make_join_readinfo(JOIN *join, uint options)
  379. {
  380.   uint i;
  381.   bool statistics= test(!(join->select_options & SELECT_DESCRIBE));
  382.   DBUG_ENTER("make_join_readinfo");
  383.   for (i=join->const_tables ; i < join->tables ; i++)
  384.   {
  385.     JOIN_TAB *tab=join->join_tab+i;
  386.     TABLE *table=tab->table;
  387.     tab->read_record.table= table;
  388.     tab->read_record.file=table->file;
  389.     tab->next_select=sub_select; /* normal select */
  390.     switch (tab->type) {
  391.     case JT_SYSTEM: // Only happens with left join
  392.       table->status=STATUS_NO_RECORD;
  393.       tab->read_first_record= join_read_system;
  394.       tab->read_record.read_record= join_no_more_records;
  395.       break;
  396.     case JT_CONST: // Only happens with left join
  397.       table->status=STATUS_NO_RECORD;
  398.       tab->read_first_record= join_read_const;
  399.       tab->read_record.read_record= join_no_more_records;
  400.       if (table->used_keys.is_set(tab->ref.key) &&
  401.           !table->no_keyread)
  402.       {
  403.         table->key_read=1;
  404.         table->file->extra(HA_EXTRA_KEYREAD);
  405.       }
  406.       break;
  407.     case JT_EQ_REF:
  408.       table->status=STATUS_NO_RECORD;
  409.       if (tab->select)
  410.       {
  411. delete tab->select->quick;
  412. tab->select->quick=0;
  413.       }
  414.       delete tab->quick;
  415.       tab->quick=0;
  416.       tab->read_first_record= join_read_key;
  417.       tab->read_record.read_record= join_no_more_records;
  418.       if (table->used_keys.is_set(tab->ref.key) &&
  419.   !table->no_keyread)
  420.       {
  421. table->key_read=1;
  422. table->file->extra(HA_EXTRA_KEYREAD);
  423.       }
  424.       break;
  425.     case JT_REF_OR_NULL:
  426.     case JT_REF:
  427.       table->status=STATUS_NO_RECORD;
  428.       if (tab->select)
  429.       {
  430. delete tab->select->quick;
  431. tab->select->quick=0;
  432.       }
  433.       delete tab->quick;
  434.       tab->quick=0;
  435.       if (table->used_keys.is_set(tab->ref.key) &&
  436.   !table->no_keyread)
  437.       {
  438. table->key_read=1;
  439. table->file->extra(HA_EXTRA_KEYREAD);
  440.       }
  441.       if (tab->type == JT_REF)
  442.       {
  443. tab->read_first_record= join_read_always_key;
  444. tab->read_record.read_record= join_read_next_same;
  445.       }
  446.       else
  447.       {
  448. tab->read_first_record= join_read_always_key_or_null;
  449. tab->read_record.read_record= join_read_next_same_or_null;
  450.       }
  451.       break;
  452.     case JT_FT:
  453.       table->status=STATUS_NO_RECORD;
  454.       tab->read_first_record= join_ft_read_first;
  455.       tab->read_record.read_record= join_ft_read_next;
  456.       break;
  457.     case JT_ALL:
  458.       /*
  459. If previous table use cache
  460.       */
  461.       table->status=STATUS_NO_RECORD;
  462.       if (i != join->const_tables && !(options & SELECT_NO_JOIN_CACHE) &&
  463.   tab->use_quick != 2 && !tab->on_expr)
  464.       {
  465. if ((options & SELECT_DESCRIBE) ||
  466.     !join_init_cache(join->thd,join->join_tab+join->const_tables,
  467.      i-join->const_tables))
  468. {
  469.   tab[-1].next_select=sub_select_cache; /* Patch previous */
  470. }
  471.       }
  472.       /* These init changes read_record */
  473.       if (tab->use_quick == 2)
  474.       {
  475. join->thd->server_status|=SERVER_QUERY_NO_GOOD_INDEX_USED;
  476. tab->read_first_record= join_init_quick_read_record;
  477. if (statistics)
  478.   statistic_increment(select_range_check_count, &LOCK_status);
  479.       }
  480.       else
  481.       {
  482. tab->read_first_record= join_init_read_record;
  483. if (i == join->const_tables)
  484. {
  485.   if (tab->select && tab->select->quick)
  486.   {
  487.     if (statistics)
  488.       statistic_increment(select_range_count, &LOCK_status);
  489.   }
  490.   else
  491.   {
  492.     join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
  493.     if (statistics)
  494.       statistic_increment(select_scan_count, &LOCK_status);
  495.   }
  496. }
  497. else
  498. {
  499.   if (tab->select && tab->select->quick)
  500.   {
  501.     if (statistics)
  502.       statistic_increment(select_full_range_join_count, &LOCK_status);
  503.   }
  504.   else
  505.   {
  506.     join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
  507.     if (statistics)
  508.       statistic_increment(select_full_join_count, &LOCK_status);
  509.   }
  510. }
  511. if (!table->no_keyread)
  512. {
  513.   if (tab->select && tab->select->quick &&
  514.       table->used_keys.is_set(tab->select->quick->index))
  515.   {
  516.     table->key_read=1;
  517.     table->file->extra(HA_EXTRA_KEYREAD);
  518.   }
  519.   else if (!table->used_keys.is_clear_all() &&
  520.    !(tab->select && tab->select->quick))
  521.   { // Only read index tree
  522.     tab->index=find_shortest_key(table, & table->used_keys);
  523.     tab->read_first_record= join_read_first;
  524.     tab->type=JT_NEXT; // Read with index_first / index_next
  525.   }
  526. }
  527.       }
  528.       break;
  529.     default:
  530.       DBUG_PRINT("error",("Table type %d found",tab->type)); /* purecov: deadcode */
  531.       break; /* purecov: deadcode */
  532.     case JT_UNKNOWN:
  533.     case JT_MAYBE_REF:
  534.       abort(); /* purecov: deadcode */
  535.     }
  536.   }
  537.   join->join_tab[join->tables-1].next_select=0; /* Set by do_select */
  538.   DBUG_VOID_RETURN;
  539. }
  540. /*
  541.   Give error if we some tables are done with a full join
  542.   SYNOPSIS
  543.     error_if_full_join()
  544.     join Join condition
  545.   USAGE
  546.    This is used by multi_table_update and multi_table_delete when running
  547.    in safe mode
  548.  RETURN VALUES
  549.    0 ok
  550.    1 Error (full join used)
  551. */
  552. bool error_if_full_join(JOIN *join)
  553. {
  554.   for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables;
  555.        tab < end;
  556.        tab++)
  557.   {
  558.     if (tab->type == JT_ALL && (!tab->select || !tab->select->quick))
  559.     {
  560.       my_error(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,MYF(0));
  561.       return(1);
  562.     }
  563.   }
  564.   return(0);
  565. }
  566. /*
  567.   cleanup JOIN_TAB
  568.   SYNOPSIS
  569.     JOIN_TAB::cleanup()
  570. */
  571. void JOIN_TAB::cleanup()
  572. {
  573.   delete select;
  574.   select= 0;
  575.   delete quick;
  576.   quick= 0;
  577.   x_free(cache.buff);
  578.   cache.buff= 0;
  579.   if (table)
  580.   {
  581.     if (table->key_read)
  582.     {
  583.       table->key_read= 0;
  584.       table->file->extra(HA_EXTRA_NO_KEYREAD);
  585.     }
  586.     table->file->ha_index_or_rnd_end();
  587.     /*
  588.       We need to reset this for next select
  589.       (Tested in part_of_refkey)
  590.     */
  591.     table->reginfo.join_tab= 0;
  592.   }
  593.   end_read_record(&read_record);
  594. }
  595. /*
  596.   Free resources of given join
  597.   SYNOPSIS
  598.     JOIN::join_free()
  599.     fill - true if we should free all resources, call with full==1 should be
  600.            last, before it this function can be called with full==0
  601.   NOTE: with subquery this function definitely will be called several times,
  602.     but even for simple query it can be called several times.
  603. */
  604. void
  605. JOIN::join_free(bool full)
  606. {
  607.   JOIN_TAB *tab,*end;
  608.   DBUG_ENTER("JOIN::join_free");
  609.   full= full || (!select_lex->uncacheable &&
  610.                  !thd->lex->subqueries &&
  611.                  !thd->lex->describe); // do not cleanup too early on EXPLAIN
  612.   if (table)
  613.   {
  614.     /*
  615.       Only a sorted table may be cached.  This sorted table is always the
  616.       first non const table in join->table
  617.     */
  618.     if (tables > const_tables) // Test for not-const tables
  619.     {
  620.       free_io_cache(table[const_tables]);
  621.       filesort_free_buffers(table[const_tables]);
  622.     }
  623.     for (SELECT_LEX_UNIT *unit= select_lex->first_inner_unit(); unit;
  624.          unit= unit->next_unit())
  625.     {
  626.       JOIN *join;
  627.       for (SELECT_LEX *sl= unit->first_select_in_union(); sl;
  628.            sl= sl->next_select())
  629.         if ((join= sl->join))
  630.           join->join_free(full);
  631.     }
  632.     if (full)
  633.     {
  634.       for (tab= join_tab, end= tab+tables; tab != end; tab++)
  635. tab->cleanup();
  636.       table= 0;
  637.       tables= 0;
  638.     }
  639.     else
  640.     {
  641.       for (tab= join_tab, end= tab+tables; tab != end; tab++)
  642.       {
  643. if (tab->table)
  644.     tab->table->file->ha_index_or_rnd_end();
  645.       }
  646.     }
  647.   }
  648.   /*
  649.     We are not using tables anymore
  650.     Unlock all tables. We may be in an INSERT .... SELECT statement.
  651.   */
  652.   if (full && lock && thd->lock && !(select_options & SELECT_NO_UNLOCK) &&
  653.       !select_lex->subquery_in_having)
  654.   {
  655.     // TODO: unlock tables even if the join isn't top level select in the tree
  656.     if (select_lex == (thd->lex->unit.fake_select_lex ?
  657.                        thd->lex->unit.fake_select_lex : &thd->lex->select_lex))
  658.     {
  659.       mysql_unlock_read_tables(thd, lock);        // Don't free join->lock
  660.       lock=0;
  661.     }
  662.   }
  663.   if (full)
  664.   {
  665.     group_fields.delete_elements();
  666.     /*
  667.       We can't call delete_elements() on copy_funcs as this will cause
  668.       problems in free_elements() as some of the elements are then deleted.
  669.     */
  670.     tmp_table_param.copy_funcs.empty();
  671.     tmp_table_param.cleanup();
  672.   }
  673.   DBUG_VOID_RETURN;
  674. }
  675. /*****************************************************************************
  676.   Remove the following expressions from ORDER BY and GROUP BY:
  677.   Constant expressions
  678.   Expression that only uses tables that are of type EQ_REF and the reference
  679.   is in the ORDER list or if all refereed tables are of the above type.
  680.   In the following, the X field can be removed:
  681.   SELECT * FROM t1,t2 WHERE t1.a=t2.a ORDER BY t1.a,t2.X
  682.   SELECT * FROM t1,t2,t3 WHERE t1.a=t2.a AND t2.b=t3.b ORDER BY t1.a,t3.X
  683.   These can't be optimized:
  684.   SELECT * FROM t1,t2 WHERE t1.a=t2.a ORDER BY t2.X,t1.a
  685.   SELECT * FROM t1,t2 WHERE t1.a=t2.a AND t1.b=t2.b ORDER BY t1.a,t2.c
  686.   SELECT * FROM t1,t2 WHERE t1.a=t2.a ORDER BY t2.b,t1.a
  687. *****************************************************************************/
  688. static bool
  689. eq_ref_table(JOIN *join, ORDER *start_order, JOIN_TAB *tab)
  690. {
  691.   if (tab->cached_eq_ref_table) // If cached
  692.     return tab->eq_ref_table;
  693.   tab->cached_eq_ref_table=1;
  694.   if (tab->type == JT_CONST) // We can skip const tables
  695.     return (tab->eq_ref_table=1); /* purecov: inspected */
  696.   if (tab->type != JT_EQ_REF || tab->table->maybe_null)
  697.     return (tab->eq_ref_table=0); // We must use this
  698.   Item **ref_item=tab->ref.items;
  699.   Item **end=ref_item+tab->ref.key_parts;
  700.   uint found=0;
  701.   table_map map=tab->table->map;
  702.   for (; ref_item != end ; ref_item++)
  703.   {
  704.     if (! (*ref_item)->const_item())
  705.     { // Not a const ref
  706.       ORDER *order;
  707.       for (order=start_order ; order ; order=order->next)
  708.       {
  709. if ((*ref_item)->eq(order->item[0],0))
  710.   break;
  711.       }
  712.       if (order)
  713.       {
  714. found++;
  715. DBUG_ASSERT(!(order->used & map));
  716. order->used|=map;
  717. continue; // Used in ORDER BY
  718.       }
  719.       if (!only_eq_ref_tables(join,start_order, (*ref_item)->used_tables()))
  720. return (tab->eq_ref_table=0);
  721.     }
  722.   }
  723.   /* Check that there was no reference to table before sort order */
  724.   for (; found && start_order ; start_order=start_order->next)
  725.   {
  726.     if (start_order->used & map)
  727.     {
  728.       found--;
  729.       continue;
  730.     }
  731.     if (start_order->depend_map & map)
  732.       return (tab->eq_ref_table=0);
  733.   }
  734.   return tab->eq_ref_table=1;
  735. }
  736. static bool
  737. only_eq_ref_tables(JOIN *join,ORDER *order,table_map tables)
  738. {
  739.   if (specialflag &  SPECIAL_SAFE_MODE)
  740.     return 0; // skip this optimize /* purecov: inspected */
  741.   for (JOIN_TAB **tab=join->map2table ; tables ; tab++, tables>>=1)
  742.   {
  743.     if (tables & 1 && !eq_ref_table(join, order, *tab))
  744.       return 0;
  745.   }
  746.   return 1;
  747. }
  748. /* Update the dependency map for the tables */
  749. static void update_depend_map(JOIN *join)
  750. {
  751.   JOIN_TAB *join_tab=join->join_tab, *end=join_tab+join->tables;
  752.   for (; join_tab != end ; join_tab++)
  753.   {
  754.     TABLE_REF *ref= &join_tab->ref;
  755.     table_map depend_map=0;
  756.     Item **item=ref->items;
  757.     uint i;
  758.     for (i=0 ; i < ref->key_parts ; i++,item++)
  759.       depend_map|=(*item)->used_tables();
  760.     ref->depend_map=depend_map & ~OUTER_REF_TABLE_BIT;
  761.     depend_map&= ~OUTER_REF_TABLE_BIT;
  762.     for (JOIN_TAB **tab=join->map2table;
  763.  depend_map ;
  764.  tab++,depend_map>>=1 )
  765.     {
  766.       if (depend_map & 1)
  767. ref->depend_map|=(*tab)->ref.depend_map;
  768.     }
  769.   }
  770. }
  771. /* Update the dependency map for the sort order */
  772. static void update_depend_map(JOIN *join, ORDER *order)
  773. {
  774.   for (; order ; order=order->next)
  775.   {
  776.     table_map depend_map;
  777.     order->item[0]->update_used_tables();
  778.     order->depend_map=depend_map=order->item[0]->used_tables();
  779.     // Not item_sum(), RAND() and no reference to table outside of sub select
  780.     if (!(order->depend_map & (OUTER_REF_TABLE_BIT | RAND_TABLE_BIT)))
  781.     {
  782.       for (JOIN_TAB **tab=join->map2table;
  783.    depend_map ;
  784.    tab++, depend_map>>=1)
  785.       {
  786. if (depend_map & 1)
  787.   order->depend_map|=(*tab)->ref.depend_map;
  788.       }
  789.     }
  790.   }
  791. }
  792. /*
  793.   Remove all constants and check if ORDER only contains simple expressions
  794.   SYNOPSIS
  795.    remove_const()
  796.    join Join handler
  797.    first_order List of SORT or GROUP order
  798.    cond WHERE statement
  799.    change_list Set to 1 if we should remove things from list
  800. If this is not set, then only simple_order is
  801.                         calculated   
  802.    simple_order Set to 1 if we are only using simple expressions
  803.   RETURN
  804.     Returns new sort order
  805.     simple_order is set to 1 if sort_order only uses fields from head table
  806.     and the head table is not a LEFT JOIN table
  807. */
  808. static ORDER *
  809. remove_const(JOIN *join,ORDER *first_order, COND *cond,
  810.              bool change_list, bool *simple_order)
  811. {
  812.   if (join->tables == join->const_tables)
  813.     return change_list ? 0 : first_order; // No need to sort
  814.   ORDER *order,**prev_ptr;
  815.   table_map first_table= join->join_tab[join->const_tables].table->map;
  816.   table_map not_const_tables= ~join->const_table_map;
  817.   table_map ref;
  818.   DBUG_ENTER("remove_const");
  819.   prev_ptr= &first_order;
  820.   *simple_order= join->join_tab[join->const_tables].on_expr ? 0 : 1;
  821.   /* NOTE: A variable of not_const_tables ^ first_table; breaks gcc 2.7 */
  822.   update_depend_map(join, first_order);
  823.   for (order=first_order; order ; order=order->next)
  824.   {
  825.     table_map order_tables=order->item[0]->used_tables();
  826.     if (order->item[0]->with_sum_func)
  827.       *simple_order=0; // Must do a temp table to sort
  828.     else if (!(order_tables & not_const_tables))
  829.     {
  830.       DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
  831.       continue; // skip const item
  832.     }
  833.     else
  834.     {
  835.       if (order_tables & (RAND_TABLE_BIT | OUTER_REF_TABLE_BIT))
  836. *simple_order=0;
  837.       else
  838.       {
  839. Item *comp_item=0;
  840. if (cond && const_expression_in_where(cond,order->item[0], &comp_item))
  841. {
  842.   DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
  843.   continue;
  844. }
  845. if ((ref=order_tables & (not_const_tables ^ first_table)))
  846. {
  847.   if (!(order_tables & first_table) &&
  848.               only_eq_ref_tables(join,first_order, ref))
  849.   {
  850.     DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
  851.     continue;
  852.   }
  853.   *simple_order=0; // Must do a temp table to sort
  854. }
  855.       }
  856.     }
  857.     if (change_list)
  858.       *prev_ptr= order; // use this entry
  859.     prev_ptr= &order->next;
  860.   }
  861.   if (change_list)
  862.     *prev_ptr=0;
  863.   if (prev_ptr == &first_order) // Nothing to sort/group
  864.     *simple_order=1;
  865.   DBUG_PRINT("exit",("simple_order: %d",(int) *simple_order));
  866.   DBUG_RETURN(first_order);
  867. }
  868. static int
  869. return_zero_rows(JOIN *join, select_result *result,TABLE_LIST *tables,
  870.  List<Item> &fields, bool send_row, uint select_options,
  871.  const char *info, Item *having, Procedure *procedure,
  872.  SELECT_LEX_UNIT *unit)
  873. {
  874.   DBUG_ENTER("return_zero_rows");
  875.   if (select_options & SELECT_DESCRIBE)
  876.   {
  877.     select_describe(join, FALSE, FALSE, FALSE, info);
  878.     DBUG_RETURN(0);
  879.   }
  880.   join->join_free(0);
  881.   if (send_row)
  882.   {
  883.     for (TABLE_LIST *table=tables; table ; table=table->next)
  884.       mark_as_null_row(table->table); // All fields are NULL
  885.     if (having && having->val_int() == 0)
  886.       send_row=0;
  887.   }
  888.   if (!(result->send_fields(fields,1)))
  889.   {
  890.     if (send_row)
  891.     {
  892.       List_iterator_fast<Item> it(fields);
  893.       Item *item;
  894.       while ((item= it++))
  895. item->no_rows_in_result();
  896.       result->send_data(fields);
  897.     }
  898.     result->send_eof(); // Should be safe
  899.   }
  900.   /* Update results for FOUND_ROWS */
  901.   join->thd->limit_found_rows= join->thd->examined_row_count= 0;
  902.   DBUG_RETURN(0);
  903. }
  904. static void clear_tables(JOIN *join)
  905. {
  906.   for (uint i=0 ; i < join->tables ; i++)
  907.     mark_as_null_row(join->table[i]); // All fields are NULL
  908. }
  909. /*****************************************************************************
  910.   Make som simple condition optimization:
  911.   If there is a test 'field = const' change all refs to 'field' to 'const'
  912.   Remove all dummy tests 'item = item', 'const op const'.
  913.   Remove all 'item is NULL', when item can never be null!
  914.   item->marker should be 0 for all items on entry
  915.   Return in cond_value FALSE if condition is impossible (1 = 2)
  916. *****************************************************************************/
  917. class COND_CMP :public ilink {
  918. public:
  919.   static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); }
  920.   static void operator delete(void *ptr __attribute__((unused)),
  921.       size_t size __attribute__((unused))) {} /*lint -e715 */
  922.   Item *and_level;
  923.   Item_func *cmp_func;
  924.   COND_CMP(Item *a,Item_func *b) :and_level(a),cmp_func(b) {}
  925. };
  926. #ifdef __GNUC__
  927. template class I_List<COND_CMP>;
  928. template class I_List_iterator<COND_CMP>;
  929. template class List<Item_func_match>;
  930. template class List_iterator<Item_func_match>;
  931. #endif
  932. /*
  933.   change field = field to field = const for each found field = const in the
  934.   and_level
  935. */
  936. static void
  937. change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
  938.                          Item *and_father, Item *cond,
  939.                          Item *field, Item *value)
  940. {
  941.   if (cond->type() == Item::COND_ITEM)
  942.   {
  943.     bool and_level= ((Item_cond*) cond)->functype() ==
  944.       Item_func::COND_AND_FUNC;
  945.     List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
  946.     Item *item;
  947.     while ((item=li++))
  948.       change_cond_ref_to_const(thd, save_list,and_level ? cond : item, item,
  949.        field, value);
  950.     return;
  951.   }
  952.   if (cond->eq_cmp_result() == Item::COND_OK)
  953.     return; // Not a boolean function
  954.   Item_bool_func2 *func=  (Item_bool_func2*) cond;
  955.   Item **args= func->arguments();
  956.   Item *left_item=  args[0];
  957.   Item *right_item= args[1];
  958.   Item_func::Functype functype=  func->functype();
  959.   if (right_item->eq(field,0) && left_item != value &&
  960.       (left_item->result_type() != STRING_RESULT ||
  961.        value->result_type() != STRING_RESULT ||
  962.        left_item->collation.collation == value->collation.collation))
  963.   {
  964.     Item *tmp=value->new_item();
  965.     if (tmp)
  966.     {
  967.       thd->change_item_tree(args + 1, tmp);
  968.       func->update_used_tables();
  969.       if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
  970.   && and_father != cond && !left_item->const_item())
  971.       {
  972. cond->marker=1;
  973. COND_CMP *tmp2;
  974. if ((tmp2=new COND_CMP(and_father,func)))
  975.   save_list->push_back(tmp2);
  976.       }
  977.       func->set_cmp_func();
  978.     }
  979.   }
  980.   else if (left_item->eq(field,0) && right_item != value &&
  981.            (right_item->result_type() != STRING_RESULT ||
  982.             value->result_type() != STRING_RESULT ||
  983.             right_item->collation.collation == value->collation.collation))
  984.   {
  985.     Item *tmp=value->new_item();
  986.     if (tmp)
  987.     {
  988.       thd->change_item_tree(args, tmp);
  989.       value= tmp;
  990.       func->update_used_tables();
  991.       if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
  992.   && and_father != cond && !right_item->const_item())
  993.       {
  994.         args[0]= args[1];                       // For easy check
  995.         thd->change_item_tree(args + 1, value);
  996. cond->marker=1;
  997. COND_CMP *tmp2;
  998. if ((tmp2=new COND_CMP(and_father,func)))
  999.   save_list->push_back(tmp2);
  1000.       }
  1001.       func->set_cmp_func();
  1002.     }
  1003.   }
  1004. }
  1005. /*
  1006.   Remove additional condition inserted by IN/ALL/ANY transformation
  1007.   SYNOPSIS
  1008.     remove_additional_cond()
  1009.     conds - condition for processing
  1010.   RETURN VALUES
  1011.     new conditions
  1012. */
  1013. static Item *remove_additional_cond(Item* conds)
  1014. {
  1015.   if (conds->name == in_additional_cond)
  1016.     return 0;
  1017.   if (conds->type() == Item::COND_ITEM)
  1018.   {
  1019.     Item_cond *cnd= (Item_cond*) conds;
  1020.     List_iterator<Item> li(*(cnd->argument_list()));
  1021.     Item *item;
  1022.     while ((item= li++))
  1023.     {
  1024.       if (item->name == in_additional_cond)
  1025.       {
  1026. li.remove();
  1027. if (cnd->argument_list()->elements == 1)
  1028.   return cnd->argument_list()->head();
  1029. return conds;
  1030.       }
  1031.     }
  1032.   }
  1033.   return conds;
  1034. }
  1035. static void
  1036. propagate_cond_constants(THD *thd, I_List<COND_CMP> *save_list,
  1037.                          COND *and_father, COND *cond)
  1038. {
  1039.   if (cond->type() == Item::COND_ITEM)
  1040.   {
  1041.     bool and_level= ((Item_cond*) cond)->functype() ==
  1042.       Item_func::COND_AND_FUNC;
  1043.     List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
  1044.     Item *item;
  1045.     I_List<COND_CMP> save;
  1046.     while ((item=li++))
  1047.     {
  1048.       propagate_cond_constants(thd, &save,and_level ? cond : item, item);
  1049.     }
  1050.     if (and_level)
  1051.     { // Handle other found items
  1052.       I_List_iterator<COND_CMP> cond_itr(save);
  1053.       COND_CMP *cond_cmp;
  1054.       while ((cond_cmp=cond_itr++))
  1055.       {
  1056.         Item **args= cond_cmp->cmp_func->arguments();
  1057.         if (!args[0]->const_item())
  1058.           change_cond_ref_to_const(thd, &save,cond_cmp->and_level,
  1059.                                    cond_cmp->and_level, args[0], args[1]);
  1060.       }
  1061.     }
  1062.   }
  1063.   else if (and_father != cond && !cond->marker) // In a AND group
  1064.   {
  1065.     if (cond->type() == Item::FUNC_ITEM &&
  1066. (((Item_func*) cond)->functype() == Item_func::EQ_FUNC ||
  1067.  ((Item_func*) cond)->functype() == Item_func::EQUAL_FUNC))
  1068.     {
  1069.       Item_func_eq *func=(Item_func_eq*) cond;
  1070.       Item **args= func->arguments();
  1071.       bool left_const= args[0]->const_item();
  1072.       bool right_const= args[1]->const_item();
  1073.       if (!(left_const && right_const) &&
  1074.           args[0]->result_type() == args[1]->result_type())
  1075.       {
  1076. if (right_const)
  1077. {
  1078.           resolve_const_item(thd, &args[1], args[0]);
  1079.   func->update_used_tables();
  1080.           change_cond_ref_to_const(thd, save_list, and_father, and_father,
  1081.                                    args[0], args[1]);
  1082. }
  1083. else if (left_const)
  1084. {
  1085.           resolve_const_item(thd, &args[0], args[1]);
  1086.   func->update_used_tables();
  1087.           change_cond_ref_to_const(thd, save_list, and_father, and_father,
  1088.                                    args[1], args[0]);
  1089. }
  1090.       }
  1091.     }
  1092.   }
  1093. }
  1094. static COND *
  1095. optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value)
  1096. {
  1097.   SELECT_LEX *select= thd->lex->current_select;
  1098.   DBUG_ENTER("optimize_cond");
  1099.   if (conds)
  1100.   {
  1101.     DBUG_EXECUTE("where", print_where(conds, "original"););
  1102.     /* change field = field to field = const for each found field = const */
  1103.     propagate_cond_constants(thd, (I_List<COND_CMP> *) 0, conds, conds);
  1104.     /*
  1105.       Remove all instances of item == item
  1106.       Remove all and-levels where CONST item != CONST item
  1107.     */
  1108.     DBUG_EXECUTE("where", print_where(conds, "after const change"););
  1109.     conds= remove_eq_conds(thd, conds, cond_value);
  1110.     DBUG_EXECUTE("info", print_where(conds, "after remove"););
  1111.   }
  1112.   else
  1113.   {
  1114.     *cond_value= Item::COND_TRUE;
  1115.     select->prep_where= 0;
  1116.   }
  1117.   DBUG_RETURN(conds);
  1118. }
  1119. /*
  1120.   Remove const and eq items. Return new item, or NULL if no condition
  1121.   cond_value is set to according:
  1122.   COND_OK    query is possible (field = constant)
  1123.   COND_TRUE  always true ( 1 = 1 )
  1124.   COND_FALSE always false ( 1 = 2 )
  1125. */
  1126. COND *
  1127. remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value)
  1128. {
  1129.   if (cond->type() == Item::COND_ITEM)
  1130.   {
  1131.     bool and_level= ((Item_cond*) cond)->functype()
  1132.       == Item_func::COND_AND_FUNC;
  1133.     List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
  1134.     Item::cond_result tmp_cond_value;
  1135.     bool should_fix_fields=0;
  1136.     *cond_value=Item::COND_UNDEF;
  1137.     Item *item;
  1138.     while ((item=li++))
  1139.     {
  1140.       Item *new_item=remove_eq_conds(thd, item, &tmp_cond_value);
  1141.       if (!new_item)
  1142. li.remove();
  1143.       else if (item != new_item)
  1144.       {
  1145. VOID(li.replace(new_item));
  1146. should_fix_fields=1;
  1147.       }
  1148.       if (*cond_value == Item::COND_UNDEF)
  1149. *cond_value=tmp_cond_value;
  1150.       switch (tmp_cond_value) {
  1151.       case Item::COND_OK: // Not TRUE or FALSE
  1152. if (and_level || *cond_value == Item::COND_FALSE)
  1153.   *cond_value=tmp_cond_value;
  1154. break;
  1155.       case Item::COND_FALSE:
  1156. if (and_level)
  1157. {
  1158.   *cond_value=tmp_cond_value;
  1159.   return (COND*) 0; // Always false
  1160. }
  1161. break;
  1162.       case Item::COND_TRUE:
  1163. if (!and_level)
  1164. {
  1165.   *cond_value= tmp_cond_value;
  1166.   return (COND*) 0; // Always true
  1167. }
  1168. break;
  1169.       case Item::COND_UNDEF: // Impossible
  1170. break; /* purecov: deadcode */
  1171.       }
  1172.     }
  1173.     if (should_fix_fields)
  1174.       cond->update_used_tables();
  1175.     if (!((Item_cond*) cond)->argument_list()->elements ||
  1176. *cond_value != Item::COND_OK)
  1177.       return (COND*) 0;
  1178.     if (((Item_cond*) cond)->argument_list()->elements == 1)
  1179.     { // Remove list
  1180.       item= ((Item_cond*) cond)->argument_list()->head();
  1181.       ((Item_cond*) cond)->argument_list()->empty();
  1182.       return item;
  1183.     }
  1184.   }
  1185.   else if (cond->type() == Item::FUNC_ITEM &&
  1186.    ((Item_func*) cond)->functype() == Item_func::ISNULL_FUNC)
  1187.   {
  1188.     /*
  1189.       Handles this special case for some ODBC applications:
  1190.       The are requesting the row that was just updated with a auto_increment
  1191.       value with this construct:
  1192.       SELECT * from table_name where auto_increment_column IS NULL
  1193.       This will be changed to:
  1194.       SELECT * from table_name where auto_increment_column = LAST_INSERT_ID
  1195.     */
  1196.     Item_func_isnull *func=(Item_func_isnull*) cond;
  1197.     Item **args= func->arguments();
  1198.     if (args[0]->type() == Item::FIELD_ITEM)
  1199.     {
  1200.       Field *field=((Item_field*) args[0])->field;
  1201.       if (field->flags & AUTO_INCREMENT_FLAG && !field->table->maybe_null &&
  1202.   (thd->options & OPTION_AUTO_IS_NULL) &&
  1203.   thd->insert_id())
  1204.       {
  1205. #ifdef HAVE_QUERY_CACHE
  1206. query_cache_abort(&thd->net);
  1207. #endif
  1208. COND *new_cond;
  1209. if ((new_cond= new Item_func_eq(args[0],
  1210. new Item_int("last_insert_id()",
  1211.      thd->insert_id(),
  1212.      21))))
  1213. {
  1214.   cond=new_cond;
  1215.   cond->fix_fields(thd, 0, &cond);
  1216. }
  1217. thd->insert_id(0); // Clear for next request
  1218.       }
  1219.       /* fix to replace 'NULL' dates with '0' (shreeve@uci.edu) */
  1220.       else if (((field->type() == FIELD_TYPE_DATE) ||
  1221. (field->type() == FIELD_TYPE_DATETIME)) &&
  1222. (field->flags & NOT_NULL_FLAG) &&
  1223.        !field->table->maybe_null)
  1224.       {
  1225. COND *new_cond;
  1226. if ((new_cond= new Item_func_eq(args[0],new Item_int("0", 0, 2))))
  1227. {
  1228.   cond=new_cond;
  1229.   cond->fix_fields(thd, 0, &cond);
  1230. }
  1231.       }
  1232.     }
  1233.   }
  1234.   else if (cond->const_item())
  1235.   {
  1236.     *cond_value= eval_const_cond(cond) ? Item::COND_TRUE : Item::COND_FALSE;
  1237.     return (COND*) 0;
  1238.   }
  1239.   else if ((*cond_value= cond->eq_cmp_result()) != Item::COND_OK)
  1240.   { // boolan compare function
  1241.     Item *left_item= ((Item_func*) cond)->arguments()[0];
  1242.     Item *right_item= ((Item_func*) cond)->arguments()[1];
  1243.     if (left_item->eq(right_item,1))
  1244.     {
  1245.       if (!left_item->maybe_null ||
  1246.   ((Item_func*) cond)->functype() == Item_func::EQUAL_FUNC)
  1247. return (COND*) 0; // Compare of identical items
  1248.     }
  1249.   }
  1250.   *cond_value=Item::COND_OK;
  1251.   return cond; // Point at next and level
  1252. }
  1253. /*
  1254.   Return 1 if the item is a const value in all the WHERE clause
  1255. */
  1256. static bool
  1257. const_expression_in_where(COND *cond, Item *comp_item, Item **const_item)
  1258. {
  1259.   if (cond->type() == Item::COND_ITEM)
  1260.   {
  1261.     bool and_level= (((Item_cond*) cond)->functype()
  1262.      == Item_func::COND_AND_FUNC);
  1263.     List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
  1264.     Item *item;
  1265.     while ((item=li++))
  1266.     {
  1267.       bool res=const_expression_in_where(item, comp_item, const_item);
  1268.       if (res) // Is a const value
  1269.       {
  1270. if (and_level)
  1271.   return 1;
  1272.       }
  1273.       else if (!and_level)
  1274. return 0;
  1275.     }
  1276.     return and_level ? 0 : 1;
  1277.   }
  1278.   else if (cond->eq_cmp_result() != Item::COND_OK)
  1279.   { // boolan compare function
  1280.     Item_func* func= (Item_func*) cond;
  1281.     if (func->functype() != Item_func::EQUAL_FUNC &&
  1282. func->functype() != Item_func::EQ_FUNC)
  1283.       return 0;
  1284.     Item *left_item= ((Item_func*) cond)->arguments()[0];
  1285.     Item *right_item= ((Item_func*) cond)->arguments()[1];
  1286.     if (left_item->eq(comp_item,1))
  1287.     {
  1288.       if (right_item->const_item())
  1289.       {
  1290. if (*const_item)
  1291.   return right_item->eq(*const_item, 1);
  1292. *const_item=right_item;
  1293. return 1;
  1294.       }
  1295.     }
  1296.     else if (right_item->eq(comp_item,1))
  1297.     {
  1298.       if (left_item->const_item())
  1299.       {
  1300. if (*const_item)
  1301.   return left_item->eq(*const_item, 1);
  1302. *const_item=left_item;
  1303. return 1;
  1304.       }
  1305.     }
  1306.   }
  1307.   return 0;
  1308. }
  1309. /****************************************************************************
  1310.   Create internal temporary table
  1311. ****************************************************************************/
  1312. /*
  1313.   Create field for temporary table from given field
  1314.   
  1315.   SYNOPSIS
  1316.     create_tmp_field_from_field()
  1317.     thd Thread handler
  1318.     org_field           field from which new field will be created
  1319.     name                New field name
  1320.     item Item to create a field for
  1321.     table Temporary table
  1322.     item         !=NULL if item->result_field should point to new field.
  1323. This is relevant for how fill_record() is going to work:
  1324. If item != NULL then fill_record() will update
  1325. the record in the original table.
  1326. If item == NULL then fill_record() will update
  1327. the temporary table
  1328.     convert_blob_length If >0 create a varstring(convert_blob_length) field 
  1329.                         instead of blob.
  1330.   RETURN
  1331.     0 on error
  1332.     new_created field
  1333. */
  1334. static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
  1335.                                           const char *name, TABLE *table,
  1336.                                           Item_field *item,
  1337.                                           uint convert_blob_length)
  1338. {
  1339.   Field *new_field;
  1340.   if (convert_blob_length && org_field->flags & BLOB_FLAG)
  1341.     new_field= new Field_varstring(convert_blob_length, org_field->maybe_null(),
  1342.                                    org_field->field_name, table,
  1343.                                    org_field->charset());
  1344.   else
  1345.     new_field= org_field->new_field(thd->mem_root, table);
  1346.   if (new_field)
  1347.   {
  1348.     if (item)
  1349.       item->result_field= new_field;
  1350.     else
  1351.       new_field->field_name= name;
  1352.     if (org_field->maybe_null() || (item && item->maybe_null))
  1353.       new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
  1354.     if (org_field->type() == FIELD_TYPE_VAR_STRING)
  1355.       table->db_create_options|= HA_OPTION_PACK_RECORD;
  1356.   }
  1357.   return new_field;
  1358. }
  1359. /*
  1360.   Create field for temporary table using type of given item
  1361.   
  1362.   SYNOPSIS
  1363.     create_tmp_field_from_item()
  1364.     thd Thread handler
  1365.     item Item to create a field for
  1366.     table Temporary table
  1367.     copy_func If set and item is a function, store copy of item
  1368. in this array
  1369.     modify_item 1 if item->result_field should point to new item.
  1370. This is relevent for how fill_record() is going to
  1371. work:
  1372. If modify_item is 1 then fill_record() will update
  1373. the record in the original table.
  1374. If modify_item is 0 then fill_record() will update
  1375. the temporary table
  1376.     convert_blob_length If >0 create a varstring(convert_blob_length) field 
  1377.                         instead of blob.
  1378.   RETURN
  1379.     0 on error
  1380.     new_created field
  1381. */
  1382. static Field* create_tmp_field_from_item(THD *thd, Item *item, TABLE *table,
  1383.                                          Item ***copy_func, bool modify_item,
  1384.                                          uint convert_blob_length)
  1385. {
  1386.   bool maybe_null=item->maybe_null;
  1387.   Field *new_field;
  1388.   LINT_INIT(new_field);
  1389.   switch (item->result_type()) {
  1390.   case REAL_RESULT:
  1391.     new_field=new Field_double(item->max_length, maybe_null,
  1392.        item->name, table, item->decimals);
  1393.     break;
  1394.   case INT_RESULT:
  1395.     new_field=new Field_longlong(item->max_length, maybe_null,
  1396.    item->name, table, item->unsigned_flag);
  1397.     break;
  1398.   case STRING_RESULT:
  1399.     DBUG_ASSERT(item->collation.collation);
  1400.   
  1401.     enum enum_field_types type;
  1402.     /*
  1403.       DATE/TIME fields have STRING_RESULT result type. To preserve
  1404.       type they needed to be handled separately.
  1405.     */
  1406.     if ((type= item->field_type()) == MYSQL_TYPE_DATETIME ||
  1407.         type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_DATE)
  1408.       new_field= item->tmp_table_field_from_field_type(table);
  1409.     else if (item->max_length/item->collation.collation->mbmaxlen > 255)
  1410.     {
  1411.       if (convert_blob_length)
  1412.         new_field= new Field_varstring(convert_blob_length, maybe_null,
  1413.                                        item->name, table,
  1414.                                        item->collation.collation);
  1415.       else
  1416.         new_field= new Field_blob(item->max_length, maybe_null, item->name,
  1417.                                   table, item->collation.collation);
  1418.     }
  1419.     else
  1420.       new_field= new Field_string(item->max_length, maybe_null, item->name, 
  1421.                                   table, item->collation.collation);
  1422.     break;
  1423.   case ROW_RESULT: 
  1424.   default: 
  1425.     // This case should never be choosen
  1426.     DBUG_ASSERT(0);
  1427.     new_field= 0; // to satisfy compiler (uninitialized variable)
  1428.     break;
  1429.   }
  1430.   if (copy_func && item->is_result_field())
  1431.     *((*copy_func)++) = item; // Save for copy_funcs
  1432.   if (modify_item)
  1433.     item->set_result_field(new_field);
  1434.   return new_field;
  1435. }
  1436. /*
  1437.   Create field for temporary table
  1438.   SYNOPSIS
  1439.     create_tmp_field()
  1440.     thd Thread handler
  1441.     table Temporary table
  1442.     item Item to create a field for
  1443.     type Type of item (normally item->type)
  1444.     copy_func If set and item is a function, store copy of item
  1445. in this array
  1446.     from_field          if field will be created using other field as example,
  1447.                         pointer example field will be written here
  1448.     group 1 if we are going to do a relative group by on result
  1449.     modify_item 1 if item->result_field should point to new item.
  1450. This is relevent for how fill_record() is going to
  1451. work:
  1452. If modify_item is 1 then fill_record() will update
  1453. the record in the original table.
  1454. If modify_item is 0 then fill_record() will update
  1455. the temporary table
  1456.     convert_blob_length If >0 create a varstring(convert_blob_length) field 
  1457.                         instead of blob.
  1458.   RETURN
  1459.     0 on error
  1460.     new_created field
  1461. */
  1462. Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
  1463.                         Item ***copy_func, Field **from_field,
  1464.                         bool group, bool modify_item, uint convert_blob_length)
  1465. {
  1466.   switch (type) {
  1467.   case Item::SUM_FUNC_ITEM:
  1468.   {
  1469.     Item_sum *item_sum=(Item_sum*) item;
  1470.     bool maybe_null=item_sum->maybe_null;
  1471.     switch (item_sum->sum_func()) {
  1472.     case Item_sum::AVG_FUNC: /* Place for sum & count */
  1473.       if (group)
  1474. return new Field_string(sizeof(double)+sizeof(longlong),
  1475. 0, item->name,table,&my_charset_bin);
  1476.       else
  1477. return new Field_double(item_sum->max_length,maybe_null,
  1478. item->name, table, item_sum->decimals);
  1479.     case Item_sum::VARIANCE_FUNC: /* Place for sum & count */
  1480.     case Item_sum::STD_FUNC:
  1481.       if (group)
  1482. return new Field_string(sizeof(double)*2+sizeof(longlong),
  1483.  0, item->name,table,&my_charset_bin);
  1484.       else
  1485. return new Field_double(item_sum->max_length, maybe_null,
  1486. item->name,table,item_sum->decimals);
  1487.     case Item_sum::UNIQUE_USERS_FUNC:
  1488.       return new Field_long(9,maybe_null,item->name,table,1);
  1489.     case Item_sum::MIN_FUNC:
  1490.     case Item_sum::MAX_FUNC:
  1491.       if (item_sum->args[0]->type() == Item::FIELD_ITEM)
  1492.       {
  1493.         *from_field= ((Item_field*) item_sum->args[0])->field;
  1494.         return create_tmp_field_from_field(thd, *from_field, item->name, table,
  1495.                                            NULL, convert_blob_length);
  1496.       }
  1497.       /* fall through */
  1498.     default:
  1499.       switch (item_sum->result_type()) {
  1500.       case REAL_RESULT:
  1501. return new Field_double(item_sum->max_length,maybe_null,
  1502. item->name,table,item_sum->decimals);
  1503.       case INT_RESULT:
  1504. return new Field_longlong(item_sum->max_length,maybe_null,
  1505.   item->name,table,item->unsigned_flag);
  1506.       case STRING_RESULT:
  1507. if (item_sum->max_length > 255)
  1508.         {
  1509.           if (convert_blob_length)
  1510.             return new Field_varstring(convert_blob_length, maybe_null,
  1511.                                        item->name, table,
  1512.                                        item->collation.collation);
  1513.           else
  1514.             return new Field_blob(item_sum->max_length, maybe_null, item->name,
  1515.                                   table, item->collation.collation);
  1516.         }
  1517. return new Field_string(item_sum->max_length,maybe_null,
  1518.  item->name,table,item->collation.collation);
  1519.       case ROW_RESULT:
  1520.       default:
  1521. // This case should never be choosen
  1522. DBUG_ASSERT(0);
  1523. thd->fatal_error();
  1524. return 0;
  1525.       }
  1526.     }
  1527.     /* We never come here */
  1528.   }
  1529.   case Item::FIELD_ITEM:
  1530.   case Item::DEFAULT_VALUE_ITEM:
  1531.   {
  1532.     Item_field *field= (Item_field*) item;
  1533.     return create_tmp_field_from_field(thd, (*from_field= field->field),
  1534.                                        item->name, table,
  1535.                                        modify_item ? (Item_field*) item : NULL,
  1536.                                        convert_blob_length);
  1537.   }
  1538.   case Item::FUNC_ITEM:
  1539.   case Item::COND_ITEM:
  1540.   case Item::FIELD_AVG_ITEM:
  1541.   case Item::FIELD_STD_ITEM:
  1542.   case Item::SUBSELECT_ITEM:
  1543.     /* The following can only happen with 'CREATE TABLE ... SELECT' */
  1544.   case Item::PROC_ITEM:
  1545.   case Item::INT_ITEM:
  1546.   case Item::REAL_ITEM:
  1547.   case Item::STRING_ITEM:
  1548.   case Item::REF_ITEM:
  1549.   case Item::NULL_ITEM:
  1550.   case Item::VARBIN_ITEM:
  1551.     return create_tmp_field_from_item(thd, item, table, copy_func, modify_item,
  1552.                                       convert_blob_length);
  1553.   case Item::TYPE_HOLDER:
  1554.     return ((Item_type_holder *)item)->make_field_by_type(table);
  1555.   default: // Dosen't have to be stored
  1556.     return 0;
  1557.   }
  1558. }
  1559. /*
  1560.   Create a temp table according to a field list.
  1561.   Set distinct if duplicates could be removed
  1562.   Given fields field pointers are changed to point at tmp_table
  1563.   for send_fields
  1564. */
  1565. TABLE *
  1566. create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
  1567.  ORDER *group, bool distinct, bool save_sum_fields,
  1568.  ulong select_options, ha_rows rows_limit,
  1569.  char *table_alias)
  1570. {
  1571.   TABLE *table;
  1572.   uint i,field_count,reclength,null_count,null_pack_length,
  1573.         hidden_null_count, hidden_null_pack_length, hidden_field_count,
  1574. blob_count,group_null_items;
  1575.   bool using_unique_constraint=0;
  1576.   bool  not_all_columns= !(select_options & TMP_TABLE_ALL_COLUMNS);
  1577.   char *tmpname,path[FN_REFLEN];
  1578.   byte *pos,*group_buff;
  1579.   uchar *null_flags;
  1580.   Field **reg_field, **from_field, **blob_field;
  1581.   Copy_field *copy=0;
  1582.   KEY *keyinfo;
  1583.   KEY_PART_INFO *key_part_info;
  1584.   Item **copy_func;
  1585.   MI_COLUMNDEF *recinfo;
  1586.   uint temp_pool_slot=MY_BIT_NONE;
  1587.   DBUG_ENTER("create_tmp_table");
  1588.   DBUG_PRINT("enter",("distinct: %d  save_sum_fields: %d  rows_limit: %lu  group: %d",
  1589.       (int) distinct, (int) save_sum_fields,
  1590.       (ulong) rows_limit,test(group)));
  1591.   statistic_increment(created_tmp_tables, &LOCK_status);
  1592.   if (use_temp_pool)
  1593.     temp_pool_slot = bitmap_set_next(&temp_pool);
  1594.   if (temp_pool_slot != MY_BIT_NONE) // we got a slot
  1595.     sprintf(path, "%s_%lx_%i", tmp_file_prefix,
  1596.     current_pid, temp_pool_slot);
  1597.   else // if we run out of slots or we are not using tempool
  1598.     sprintf(path,"%s%lx_%lx_%x", tmp_file_prefix,current_pid,
  1599.             thd->thread_id, thd->tmp_table++);
  1600.   fn_format(path, path, mysql_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
  1601.   if (lower_case_table_names)
  1602.     my_casedn_str(files_charset_info, path);
  1603.   if (group)
  1604.   {
  1605.     if (!param->quick_group)
  1606.       group=0; // Can't use group key
  1607.     else for (ORDER *tmp=group ; tmp ; tmp=tmp->next)
  1608.     {
  1609.       (*tmp->item)->marker=4; // Store null in key
  1610.       if ((*tmp->item)->max_length >= MAX_CHAR_WIDTH)
  1611. using_unique_constraint=1;
  1612.     }
  1613.     if (param->group_length >= MAX_BLOB_WIDTH)
  1614.       using_unique_constraint=1;
  1615.     if (group)
  1616.       distinct=0; // Can't use distinct
  1617.   }
  1618.   field_count=param->field_count+param->func_count+param->sum_func_count;
  1619.   hidden_field_count=param->hidden_field_count;
  1620.   if (!my_multi_malloc(MYF(MY_WME),
  1621.        &table,sizeof(*table),
  1622.        &reg_field,  sizeof(Field*)*(field_count+1),
  1623.        &blob_field, sizeof(Field*)*(field_count+1),
  1624.        &from_field, sizeof(Field*)*field_count,
  1625.        &copy_func,sizeof(*copy_func)*(param->func_count+1),
  1626.        &param->keyinfo,sizeof(*param->keyinfo),
  1627.        &key_part_info,
  1628.        sizeof(*key_part_info)*(param->group_parts+1),
  1629.        &param->start_recinfo,
  1630.        sizeof(*param->recinfo)*(field_count*2+4),
  1631.        &tmpname,(uint) strlen(path)+1,
  1632.        &group_buff,group && ! using_unique_constraint ?
  1633.        param->group_length : 0,
  1634.        NullS))
  1635.   {
  1636.     bitmap_clear_bit(&temp_pool, temp_pool_slot);
  1637.     DBUG_RETURN(NULL); /* purecov: inspected */
  1638.   }
  1639.   if (!(param->copy_field=copy=new Copy_field[field_count]))
  1640.   {
  1641.     bitmap_clear_bit(&temp_pool, temp_pool_slot);
  1642.     my_free((gptr) table,MYF(0)); /* purecov: inspected */
  1643.     DBUG_RETURN(NULL); /* purecov: inspected */
  1644.   }
  1645.   param->items_to_copy= copy_func;
  1646.   strmov(tmpname,path);
  1647.   /* make table according to fields */
  1648.   bzero((char*) table,sizeof(*table));
  1649.   bzero((char*) reg_field,sizeof(Field*)*(field_count+1));
  1650.   bzero((char*) from_field,sizeof(Field*)*field_count);
  1651.   table->field=reg_field;
  1652.   table->blob_field= (Field_blob**) blob_field;
  1653.   table->real_name=table->path=tmpname;
  1654.   table->table_name= table_alias;
  1655.   table->reginfo.lock_type=TL_WRITE; /* Will be updated */
  1656.   table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
  1657.   table->blob_ptr_size=mi_portable_sizeof_char_ptr;
  1658.   table->map=1;
  1659.   table->tmp_table= TMP_TABLE;
  1660.   table->db_low_byte_first=1; // True for HEAP and MyISAM
  1661.   table->temp_pool_slot = temp_pool_slot;
  1662.   table->copy_blobs= 1;
  1663.   table->in_use= thd;
  1664.   table->keys_for_keyread.init();
  1665.   table->keys_in_use.init();
  1666.   table->read_only_keys.init();
  1667.   table->quick_keys.init();
  1668.   table->used_keys.init();
  1669.   table->keys_in_use_for_query.init();
  1670.   /* Calculate which type of fields we will store in the temporary table */
  1671.   reclength=blob_count=null_count=hidden_null_count=group_null_items=0;
  1672.   param->using_indirect_summary_function=0;
  1673.   List_iterator_fast<Item> li(fields);
  1674.   Item *item;
  1675.   Field **tmp_from_field=from_field;
  1676.   while ((item=li++))
  1677.   {
  1678.     Item::Type type=item->type();
  1679.     if (not_all_columns)
  1680.     {
  1681.       if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
  1682.       {
  1683. /*
  1684.   Mark that the we have ignored an item that refers to a summary
  1685.   function. We need to know this if someone is going to use
  1686.   DISTINCT on the result.
  1687. */
  1688. param->using_indirect_summary_function=1;
  1689. continue;
  1690.       }
  1691.       if (item->const_item() && (int) hidden_field_count <= 0)
  1692.         continue; // We don't have to store this
  1693.     }
  1694.     if (type == Item::SUM_FUNC_ITEM && !group && !save_sum_fields)
  1695.     { /* Can't calc group yet */
  1696.       ((Item_sum*) item)->result_field=0;
  1697.       for (i=0 ; i < ((Item_sum*) item)->arg_count ; i++)
  1698.       {
  1699. Item **argp= ((Item_sum*) item)->args + i;
  1700. Item *arg= *argp;
  1701. if (!arg->const_item())
  1702. {
  1703.   Field *new_field=
  1704.             create_tmp_field(thd, table, arg, arg->type(), &copy_func,
  1705.                              tmp_from_field, group != 0,not_all_columns,
  1706.                              param->convert_blob_length);
  1707.   if (!new_field)
  1708.     goto err; // Should be OOM
  1709.   tmp_from_field++;
  1710.   *(reg_field++)= new_field;
  1711.   reclength+=new_field->pack_length();
  1712.   if (new_field->flags & BLOB_FLAG)
  1713.   {
  1714.     *blob_field++= new_field;
  1715.     blob_count++;
  1716.   }
  1717.           thd->change_item_tree(argp, new Item_field(new_field));
  1718.   if (!(new_field->flags & NOT_NULL_FLAG))
  1719.           {
  1720.     null_count++;
  1721.             /*
  1722.               new_field->maybe_null() is still false, it will be
  1723.               changed below. But we have to setup Item_field correctly
  1724.             */
  1725.             (*argp)->maybe_null=1;
  1726.           }
  1727. }
  1728.       }
  1729.     }
  1730.     else
  1731.     {
  1732.       /*
  1733. The last parameter to create_tmp_field() is a bit tricky:
  1734. We need to set it to 0 in union, to get fill_record() to modify the
  1735. temporary table.
  1736. We need to set it to 1 on multi-table-update and in select to
  1737. write rows to the temporary table.
  1738. We here distinguish between UNION and multi-table-updates by the fact
  1739. that in the later case group is set to the row pointer.
  1740.       */
  1741.       Field *new_field= create_tmp_field(thd, table, item, type, &copy_func,
  1742.                                          tmp_from_field, group != 0,
  1743.                                          not_all_columns || group !=0,
  1744.                                          param->convert_blob_length);
  1745.       if (!new_field)
  1746.       {
  1747. if (thd->is_fatal_error)
  1748.   goto err; // Got OOM
  1749. continue; // Some kindf of const item
  1750.       }
  1751.       if (type == Item::SUM_FUNC_ITEM)
  1752. ((Item_sum *) item)->result_field= new_field;
  1753.       tmp_from_field++;
  1754.       reclength+=new_field->pack_length();
  1755.       if (!(new_field->flags & NOT_NULL_FLAG))
  1756. null_count++;
  1757.       if (new_field->flags & BLOB_FLAG)
  1758.       {
  1759. *blob_field++= new_field;
  1760. blob_count++;
  1761.       }
  1762.       if (item->marker == 4 && item->maybe_null)
  1763.       {
  1764. group_null_items++;
  1765. new_field->flags|= GROUP_FLAG;
  1766.       }
  1767.       *(reg_field++) =new_field;
  1768.     }
  1769.     if (!--hidden_field_count)
  1770.       hidden_null_count=null_count;
  1771.   }
  1772.   DBUG_ASSERT(field_count >= (uint) (reg_field - table->field));
  1773.   field_count= (uint) (reg_field - table->field);
  1774.   *blob_field= 0; // End marker
  1775.   /* If result table is small; use a heap */
  1776.   if (blob_count || using_unique_constraint ||
  1777.       (select_options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
  1778.       OPTION_BIG_TABLES ||(select_options & TMP_TABLE_FORCE_MYISAM))
  1779.   {
  1780.     table->file=get_new_handler(table,table->db_type=DB_TYPE_MYISAM);
  1781.     if (group &&
  1782. (param->group_parts > table->file->max_key_parts() ||
  1783.  param->group_length > table->file->max_key_length()))
  1784.       using_unique_constraint=1;
  1785.   }
  1786.   else
  1787.   {
  1788.     table->file=get_new_handler(table,table->db_type=DB_TYPE_HEAP);
  1789.   }
  1790.   if (!using_unique_constraint)
  1791.     reclength+= group_null_items; // null flag is stored separately
  1792.   table->blob_fields=blob_count;
  1793.   if (blob_count == 0)
  1794.   {
  1795.     /* We need to ensure that first byte is not 0 for the delete link */
  1796.     if (param->hidden_field_count)
  1797.       hidden_null_count++;
  1798.     else
  1799.       null_count++;
  1800.   }
  1801.   hidden_null_pack_length=(hidden_null_count+7)/8;
  1802.   null_pack_length=hidden_null_count+(null_count+7)/8;
  1803.   reclength+=null_pack_length;
  1804.   if (!reclength)
  1805.     reclength=1; // Dummy select
  1806.   table->fields=field_count;
  1807.   table->reclength=reclength;
  1808.   {
  1809.     uint alloc_length=ALIGN_SIZE(reclength+MI_UNIQUE_HASH_LENGTH+1);
  1810.     table->rec_buff_length=alloc_length;
  1811.     if (!(table->record[0]= (byte *) my_malloc(alloc_length*3, MYF(MY_WME))))
  1812.       goto err;
  1813.     table->record[1]= table->record[0]+alloc_length;
  1814.     table->default_values= table->record[1]+alloc_length;
  1815.   }
  1816.   copy_func[0]=0; // End marker
  1817.   recinfo=param->start_recinfo;
  1818.   null_flags=(uchar*) table->record[0];
  1819.   pos=table->record[0]+ null_pack_length;
  1820.   if (null_pack_length)
  1821.   {
  1822.     bzero((byte*) recinfo,sizeof(*recinfo));
  1823.     recinfo->type=FIELD_NORMAL;
  1824.     recinfo->length=null_pack_length;
  1825.     recinfo++;
  1826.     bfill(null_flags,null_pack_length,255); // Set null fields
  1827.     table->null_flags= (uchar*) table->record[0];
  1828.     table->null_fields= null_count+ hidden_null_count;
  1829.     table->null_bytes= null_pack_length;
  1830.   }
  1831.   null_count= (blob_count == 0) ? 1 : 0;
  1832.   hidden_field_count=param->hidden_field_count;
  1833.   for (i=0,reg_field=table->field; i < field_count; i++,reg_field++,recinfo++)
  1834.   {
  1835.     Field *field= *reg_field;
  1836.     uint length;
  1837.     bzero((byte*) recinfo,sizeof(*recinfo));
  1838.     if (!(field->flags & NOT_NULL_FLAG))
  1839.     {
  1840.       if (field->flags & GROUP_FLAG && !using_unique_constraint)
  1841.       {
  1842. /*
  1843.   We have to reserve one byte here for NULL bits,
  1844.   as this is updated by 'end_update()'
  1845. */
  1846. *pos++=0; // Null is stored here
  1847. recinfo->length=1;
  1848. recinfo->type=FIELD_NORMAL;
  1849. recinfo++;
  1850. bzero((byte*) recinfo,sizeof(*recinfo));
  1851.       }
  1852.       else
  1853.       {
  1854. recinfo->null_bit= 1 << (null_count & 7);
  1855. recinfo->null_pos= null_count/8;
  1856.       }
  1857.       field->move_field((char*) pos,null_flags+null_count/8,
  1858. 1 << (null_count & 7));
  1859.       null_count++;
  1860.     }
  1861.     else
  1862.       field->move_field((char*) pos,(uchar*) 0,0);
  1863.     field->reset();
  1864.     if (from_field[i])
  1865.     { /* Not a table Item */
  1866.       copy->set(field,from_field[i],save_sum_fields);
  1867.       copy++;
  1868.     }
  1869.     length=field->pack_length();
  1870.     pos+= length;
  1871.     /* Make entry for create table */
  1872.     recinfo->length=length;
  1873.     if (field->flags & BLOB_FLAG)
  1874.       recinfo->type= (int) FIELD_BLOB;
  1875.     else if (!field->zero_pack() &&
  1876.      (field->type() == FIELD_TYPE_STRING ||
  1877.       field->type() == FIELD_TYPE_VAR_STRING) &&
  1878.      length >= 10 && blob_count)
  1879.       recinfo->type=FIELD_SKIP_ENDSPACE;
  1880.     else
  1881.       recinfo->type=FIELD_NORMAL;
  1882.     if (!--hidden_field_count)
  1883.       null_count=(null_count+7) & ~7; // move to next byte
  1884.     // fix table name in field entry
  1885.     field->table_name= table->table_name;
  1886.   }
  1887.   param->copy_field_end=copy;
  1888.   param->recinfo=recinfo;
  1889.   store_record(table,default_values); // Make empty default record
  1890.   if (thd->variables.tmp_table_size == ~(ulong) 0) // No limit
  1891.     table->max_rows= ~(ha_rows) 0;
  1892.   else
  1893.     table->max_rows=(((table->db_type == DB_TYPE_HEAP) ?
  1894.       min(thd->variables.tmp_table_size,
  1895.   thd->variables.max_heap_table_size) :
  1896.       thd->variables.tmp_table_size)/ table->reclength);
  1897.   set_if_bigger(table->max_rows,1); // For dummy start options
  1898.   keyinfo=param->keyinfo;
  1899.   if (group)
  1900.   {
  1901.     DBUG_PRINT("info",("Creating group key in temporary table"));
  1902.     table->group=group; /* Table is grouped by key */
  1903.     param->group_buff=group_buff;
  1904.     table->keys=1;
  1905.     table->uniques= test(using_unique_constraint);
  1906.     table->key_info=keyinfo;
  1907.     keyinfo->key_part=key_part_info;
  1908.     keyinfo->flags=HA_NOSAME;
  1909.     keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts;
  1910.     keyinfo->key_length=0;
  1911.     keyinfo->rec_per_key=0;
  1912.     keyinfo->algorithm= HA_KEY_ALG_UNDEF;
  1913.     for (; group ; group=group->next,key_part_info++)
  1914.     {
  1915.       Field *field=(*group->item)->get_tmp_table_field();
  1916.       bool maybe_null=(*group->item)->maybe_null;
  1917.       key_part_info->null_bit=0;
  1918.       key_part_info->field=  field;
  1919.       key_part_info->offset= field->offset();
  1920.       key_part_info->length= (uint16) field->pack_length();
  1921.       key_part_info->type=   (uint8) field->key_type();
  1922.       key_part_info->key_type =
  1923. ((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
  1924.  (ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT) ?
  1925. 0 : FIELDFLAG_BINARY;
  1926.       if (!using_unique_constraint)
  1927.       {
  1928. group->buff=(char*) group_buff;
  1929. if (!(group->field=field->new_field(thd->mem_root,table)))
  1930.   goto err; /* purecov: inspected */
  1931. if (maybe_null)
  1932. {
  1933.   /*
  1934.     To be able to group on NULL, we reserve place in group_buff
  1935.     for the NULL flag just before the column.
  1936.     The field data is after this flag.
  1937.     The NULL flag is updated by 'end_update()' and 'end_write()'
  1938.   */
  1939.   keyinfo->flags|= HA_NULL_ARE_EQUAL; // def. that NULL == NULL
  1940.   key_part_info->null_bit=field->null_bit;
  1941.   key_part_info->null_offset= (uint) (field->null_ptr -
  1942.       (uchar*) table->record[0]);
  1943.   group->field->move_field((char*) ++group->buff);
  1944.   group_buff++;
  1945. }
  1946. else
  1947.   group->field->move_field((char*) group_buff);
  1948. group_buff+= key_part_info->length;
  1949.       }
  1950.       keyinfo->key_length+=  key_part_info->length;
  1951.     }
  1952.   }
  1953.   if (distinct)
  1954.   {
  1955.     /*
  1956.       Create an unique key or an unique constraint over all columns
  1957.       that should be in the result.  In the temporary table, there are
  1958.       'param->hidden_field_count' extra columns, whose null bits are stored
  1959.       in the first 'hidden_null_pack_length' bytes of the row.
  1960.     */
  1961.     DBUG_PRINT("info",("hidden_field_count: %d", param->hidden_field_count));
  1962.     null_pack_length-=hidden_null_pack_length;
  1963.     keyinfo->key_parts= ((field_count-param->hidden_field_count)+
  1964.  test(null_pack_length));
  1965.     set_if_smaller(table->max_rows, rows_limit);
  1966.     param->end_write_records= rows_limit;
  1967.     table->distinct=1;
  1968.     table->keys=1;
  1969.     if (blob_count)
  1970.     {
  1971.       using_unique_constraint=1;
  1972.       table->uniques=1;
  1973.     }
  1974.     if (!(key_part_info= (KEY_PART_INFO*)
  1975.   sql_calloc((keyinfo->key_parts)*sizeof(KEY_PART_INFO))))
  1976.       goto err;
  1977.     table->key_info=keyinfo;
  1978.     keyinfo->key_part=key_part_info;
  1979.     keyinfo->flags=HA_NOSAME | HA_NULL_ARE_EQUAL;
  1980.     keyinfo->key_length=(uint16) reclength;
  1981.     keyinfo->name=(char*) "tmp";
  1982.     keyinfo->algorithm= HA_KEY_ALG_UNDEF;
  1983.     keyinfo->rec_per_key=0;
  1984.     if (null_pack_length)
  1985.     {
  1986.       key_part_info->null_bit=0;
  1987.       key_part_info->offset=hidden_null_pack_length;
  1988.       key_part_info->length=null_pack_length;
  1989.       key_part_info->field=new Field_string((char*) table->record[0],
  1990.     (uint32) key_part_info->length,
  1991.     (uchar*) 0,
  1992.     (uint) 0,
  1993.     Field::NONE,
  1994.     NullS, table, &my_charset_bin);
  1995.       key_part_info->key_type=FIELDFLAG_BINARY;
  1996.       key_part_info->type=    HA_KEYTYPE_BINARY;
  1997.       key_part_info++;
  1998.     }
  1999.     /* Create a distinct key over the columns we are going to return */
  2000.     for (i=param->hidden_field_count, reg_field=table->field + i ;
  2001.  i < field_count;
  2002.  i++, reg_field++, key_part_info++)
  2003.     {
  2004.       key_part_info->null_bit=0;
  2005.       key_part_info->field=    *reg_field;
  2006.       key_part_info->offset=   (*reg_field)->offset();
  2007.       key_part_info->length=   (uint16) (*reg_field)->pack_length();
  2008.       key_part_info->type=     (uint8) (*reg_field)->key_type();
  2009.       key_part_info->key_type =
  2010. ((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
  2011.  (ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT) ?
  2012. 0 : FIELDFLAG_BINARY;
  2013.     }
  2014.   }
  2015.   if (thd->is_fatal_error) // If end of memory
  2016.     goto err;  /* purecov: inspected */
  2017.   table->db_record_offset=1;
  2018.   if (table->db_type == DB_TYPE_MYISAM)
  2019.   {
  2020.     if (create_myisam_tmp_table(table,param,select_options))
  2021.       goto err;
  2022.   }
  2023.   if (!open_tmp_table(table))
  2024.     DBUG_RETURN(table);
  2025.  err:
  2026.   /*
  2027.     Hack to ensure that free_blobs() doesn't fail if blob_field is not yet
  2028.     complete
  2029.   */
  2030.   *table->blob_field= 0;
  2031.   free_tmp_table(thd,table);                    /* purecov: inspected */
  2032.   bitmap_clear_bit(&temp_pool, temp_pool_slot);
  2033.   DBUG_RETURN(NULL); /* purecov: inspected */
  2034. }
  2035. static bool open_tmp_table(TABLE *table)
  2036. {
  2037.   int error;
  2038.   if ((error=table->file->ha_open(table->real_name,O_RDWR,HA_OPEN_TMP_TABLE)))
  2039.   {
  2040.     table->file->print_error(error,MYF(0)); /* purecov: inspected */
  2041.     table->db_stat=0;
  2042.     return(1);
  2043.   }
  2044.   (void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
  2045.   return(0);
  2046. }
  2047. static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
  2048.     ulong options)
  2049. {
  2050.   int error;
  2051.   MI_KEYDEF keydef;
  2052.   MI_UNIQUEDEF uniquedef;
  2053.   KEY *keyinfo=param->keyinfo;
  2054.   DBUG_ENTER("create_myisam_tmp_table");
  2055.   if (table->keys)
  2056.   { // Get keys for ni_create
  2057.     bool using_unique_constraint=0;
  2058.     HA_KEYSEG *seg= (HA_KEYSEG*) sql_calloc(sizeof(*seg) *
  2059.     keyinfo->key_parts);
  2060.     if (!seg)
  2061.       goto err;
  2062.     if (keyinfo->key_length >= table->file->max_key_length() ||
  2063. keyinfo->key_parts > table->file->max_key_parts() ||
  2064. table->uniques)
  2065.     {
  2066.       /* Can't create a key; Make a unique constraint instead of a key */
  2067.       table->keys=0;
  2068.       table->uniques=1;
  2069.       using_unique_constraint=1;
  2070.       bzero((char*) &uniquedef,sizeof(uniquedef));
  2071.       uniquedef.keysegs=keyinfo->key_parts;
  2072.       uniquedef.seg=seg;
  2073.       uniquedef.null_are_equal=1;
  2074.       /* Create extra column for hash value */
  2075.       bzero((byte*) param->recinfo,sizeof(*param->recinfo));
  2076.       param->recinfo->type= FIELD_CHECK;
  2077.       param->recinfo->length=MI_UNIQUE_HASH_LENGTH;
  2078.       param->recinfo++;
  2079.       table->reclength+=MI_UNIQUE_HASH_LENGTH;
  2080.     }
  2081.     else
  2082.     {
  2083.       /* Create an unique key */
  2084.       bzero((char*) &keydef,sizeof(keydef));
  2085.       keydef.flag=HA_NOSAME | HA_BINARY_PACK_KEY | HA_PACK_KEY;
  2086.       keydef.keysegs=  keyinfo->key_parts;
  2087.       keydef.seg= seg;
  2088.     }
  2089.     for (uint i=0; i < keyinfo->key_parts ; i++,seg++)
  2090.     {
  2091.       Field *field=keyinfo->key_part[i].field;
  2092.       seg->flag=     0;
  2093.       seg->language= field->charset()->number;
  2094.       seg->length=   keyinfo->key_part[i].length;
  2095.       seg->start=    keyinfo->key_part[i].offset;
  2096.       if (field->flags & BLOB_FLAG)
  2097.       {
  2098. seg->type=
  2099. ((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
  2100.  HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT);
  2101. seg->bit_start=seg->length - table->blob_ptr_size;
  2102. seg->flag= HA_BLOB_PART;
  2103. seg->length=0; // Whole blob in unique constraint
  2104.       }
  2105.       else
  2106.       {
  2107. seg->type=
  2108.   ((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
  2109.    HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT);
  2110. if (!(field->flags & ZEROFILL_FLAG) &&
  2111.     (field->type() == FIELD_TYPE_STRING ||
  2112.      field->type() == FIELD_TYPE_VAR_STRING) &&
  2113.     keyinfo->key_part[i].length > 4)
  2114.   seg->flag|=HA_SPACE_PACK;
  2115.       }
  2116.       if (!(field->flags & NOT_NULL_FLAG))
  2117.       {
  2118. seg->null_bit= field->null_bit;
  2119. seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]);
  2120. /*
  2121.   We are using a GROUP BY on something that contains NULL
  2122.   In this case we have to tell MyISAM that two NULL should
  2123.   on INSERT be compared as equal
  2124. */
  2125. if (!using_unique_constraint)
  2126.   keydef.flag|= HA_NULL_ARE_EQUAL;
  2127.       }
  2128.     }
  2129.   }
  2130.   MI_CREATE_INFO create_info;
  2131.   bzero((char*) &create_info,sizeof(create_info));
  2132.   if ((options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
  2133.       OPTION_BIG_TABLES)
  2134.     create_info.data_file_length= ~(ulonglong) 0;
  2135.   if ((error=mi_create(table->real_name,table->keys,&keydef,
  2136.        (uint) (param->recinfo-param->start_recinfo),
  2137.        param->start_recinfo,
  2138.        table->uniques, &uniquedef,
  2139.        &create_info,
  2140.        HA_CREATE_TMP_TABLE)))
  2141.   {
  2142.     table->file->print_error(error,MYF(0)); /* purecov: inspected */
  2143.     table->db_stat=0;
  2144.     goto err;
  2145.   }
  2146.   statistic_increment(created_tmp_disk_tables, &LOCK_status);
  2147.   table->db_record_offset=1;
  2148.   DBUG_RETURN(0);
  2149.  err:
  2150.   DBUG_RETURN(1);
  2151. }
  2152. void
  2153. free_tmp_table(THD *thd, TABLE *entry)
  2154. {
  2155.   const char *save_proc_info;
  2156.   DBUG_ENTER("free_tmp_table");
  2157.   DBUG_PRINT("enter",("table: %s",entry->table_name));
  2158.   save_proc_info=thd->proc_info;
  2159.   thd->proc_info="removing tmp table";
  2160.   free_blobs(entry);
  2161.   if (entry->file)
  2162.   {
  2163.     if (entry->db_stat)
  2164.     {
  2165.       (void) entry->file->close();
  2166.     }
  2167.     /*
  2168.       We can't call ha_delete_table here as the table may created in mixed case
  2169.       here and we have to ensure that delete_table gets the table name in
  2170.       the original case.
  2171.     */
  2172.     if (!(test_flags & TEST_KEEP_TMP_TABLES) || entry->db_type == DB_TYPE_HEAP)
  2173.       entry->file->delete_table(entry->real_name);
  2174.     delete entry->file;
  2175.   }
  2176.   /* free blobs */
  2177.   for (Field **ptr=entry->field ; *ptr ; ptr++)
  2178.     (*ptr)->free();
  2179.   my_free((gptr) entry->record[0],MYF(0));
  2180.   free_io_cache(entry);
  2181.   bitmap_clear_bit(&temp_pool, entry->temp_pool_slot);
  2182.   my_free((gptr) entry,MYF(0));
  2183.   thd->proc_info=save_proc_info;
  2184.   DBUG_VOID_RETURN;
  2185. }
  2186. /*
  2187. * If a HEAP table gets full, create a MyISAM table and copy all rows to this
  2188. */
  2189. bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
  2190.      int error, bool ignore_last_dupp_key_error)
  2191. {
  2192.   TABLE new_table;
  2193.   const char *save_proc_info;
  2194.   int write_err;
  2195.   DBUG_ENTER("create_myisam_from_heap");
  2196.   if (table->db_type != DB_TYPE_HEAP || error != HA_ERR_RECORD_FILE_FULL)
  2197.   {
  2198.     table->file->print_error(error,MYF(0));
  2199.     DBUG_RETURN(1);
  2200.   }
  2201.   new_table= *table;
  2202.   new_table.db_type=DB_TYPE_MYISAM;
  2203.   if (!(new_table.file=get_new_handler(&new_table,DB_TYPE_MYISAM)))
  2204.     DBUG_RETURN(1); // End of memory
  2205.   save_proc_info=thd->proc_info;
  2206.   thd->proc_info="converting HEAP to MyISAM";
  2207.   if (create_myisam_tmp_table(&new_table,param,
  2208.       thd->lex->select_lex.options | thd->options))
  2209.     goto err2;
  2210.   if (open_tmp_table(&new_table))
  2211.     goto err1;
  2212.   if (table->file->indexes_are_disabled())
  2213.     new_table.file->disable_indexes(HA_KEY_SWITCH_ALL);
  2214.   table->file->ha_index_or_rnd_end();
  2215.   table->file->ha_rnd_init(1);
  2216.   if (table->no_rows)
  2217.   {
  2218.     new_table.file->extra(HA_EXTRA_NO_ROWS);
  2219.     new_table.no_rows=1;
  2220.   }
  2221. #ifdef TO_BE_DONE_LATER_IN_4_1
  2222.   /*
  2223.     To use start_bulk_insert() (which is new in 4.1) we need to find
  2224.     all places where a corresponding end_bulk_insert() should be put.
  2225.   */
  2226.   table->file->info(HA_STATUS_VARIABLE); /* update table->file->records */
  2227.   new_table.file->start_bulk_insert(table->file->records);
  2228. #else
  2229.   /* HA_EXTRA_WRITE_CACHE can stay until close, no need to disable it */
  2230.   new_table.file->extra(HA_EXTRA_WRITE_CACHE);
  2231. #endif
  2232.   /* copy all old rows */
  2233.   while (!table->file->rnd_next(new_table.record[1]))
  2234.   {
  2235.     if ((write_err=new_table.file->write_row(new_table.record[1])))
  2236.       goto err;
  2237.   }
  2238.   /* copy row that filled HEAP table */
  2239.   if ((write_err=new_table.file->write_row(table->record[0])))
  2240.   {
  2241.     if (write_err != HA_ERR_FOUND_DUPP_KEY &&
  2242. write_err != HA_ERR_FOUND_DUPP_UNIQUE || !ignore_last_dupp_key_error)
  2243.     goto err;
  2244.   }
  2245.   /* remove heap table and change to use myisam table */
  2246.   (void) table->file->ha_rnd_end();
  2247.   (void) table->file->close();
  2248.   (void) table->file->delete_table(table->real_name);
  2249.   delete table->file;
  2250.   table->file=0;
  2251.   *table =new_table;
  2252.   table->file->change_table_ptr(table);
  2253.   thd->proc_info= (!strcmp(save_proc_info,"Copying to tmp table") ?
  2254.    "Copying to tmp table on disk" : save_proc_info);
  2255.   DBUG_RETURN(0);
  2256.  err:
  2257.   DBUG_PRINT("error",("Got error: %d",write_err));
  2258.   table->file->print_error(error,MYF(0)); // Give table is full error
  2259.   (void) table->file->ha_rnd_end();
  2260.   (void) new_table.file->close();
  2261.  err1:
  2262.   new_table.file->delete_table(new_table.real_name);
  2263.   delete new_table.file;
  2264.  err2:
  2265.   thd->proc_info=save_proc_info;
  2266.   DBUG_RETURN(1);
  2267. }
  2268. /****************************************************************************
  2269.   Make a join of all tables and write it on socket or to table
  2270.   Return:  0 if ok
  2271.            1 if error is sent
  2272.           -1 if error should be sent
  2273. ****************************************************************************/
  2274. static int
  2275. do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
  2276. {
  2277.   int error= 0;
  2278.   JOIN_TAB *join_tab;
  2279.   int (*end_select)(JOIN *, struct st_join_table *,bool);
  2280.   DBUG_ENTER("do_select");
  2281.   List<Item> *columns_list= procedure ? &join->procedure_fields_list : fields;
  2282.   join->procedure=procedure;
  2283.   /*
  2284.     Tell the client how many fields there are in a row
  2285.   */
  2286.   if (!table)
  2287.     join->result->send_fields(*columns_list, 1);
  2288.   else
  2289.   {
  2290.     VOID(table->file->extra(HA_EXTRA_WRITE_CACHE));
  2291.     empty_record(table);
  2292.   }
  2293.   join->tmp_table= table; /* Save for easy recursion */
  2294.   join->fields= fields;
  2295.   /* Set up select_end */
  2296.   if (table)
  2297.   {
  2298.     if (table->group && join->tmp_table_param.sum_func_count)
  2299.     {
  2300.       if (table->keys)
  2301.       {
  2302. DBUG_PRINT("info",("Using end_update"));
  2303. end_select=end_update;
  2304.         if (!table->file->inited)
  2305.           table->file->ha_index_init(0);
  2306.       }
  2307.       else
  2308.       {
  2309. DBUG_PRINT("info",("Using end_unique_update"));
  2310. end_select=end_unique_update;
  2311.       }
  2312.     }
  2313.     else if (join->sort_and_group)
  2314.     {
  2315.       DBUG_PRINT("info",("Using end_write_group"));
  2316.       end_select=end_write_group;
  2317.     }
  2318.     else
  2319.     {
  2320.       DBUG_PRINT("info",("Using end_write"));
  2321.       end_select=end_write;
  2322.     }
  2323.   }
  2324.   else
  2325.   {
  2326.     if (join->sort_and_group || (join->procedure &&
  2327.  join->procedure->flags & PROC_GROUP))
  2328.       end_select=end_send_group;
  2329.     else
  2330.       end_select=end_send;
  2331.   }
  2332.   join->join_tab[join->tables-1].next_select=end_select;
  2333.   join_tab=join->join_tab+join->const_tables;
  2334.   join->send_records=0;
  2335.   if (join->tables == join->const_tables)
  2336.   {
  2337.     /*
  2338.       HAVING will be chcked after processing aggregate functions,
  2339.       But WHERE should checkd here (we alredy have read tables)
  2340.     */
  2341.     if (!join->conds || join->conds->val_int())
  2342.     {
  2343.       if (!(error=(*end_select)(join,join_tab,0)) || error == -3)
  2344. error=(*end_select)(join,join_tab,1);
  2345.     }
  2346.     else if (join->send_row_on_empty_set())
  2347.       error= join->result->send_data(*columns_list);
  2348.   }
  2349.   else
  2350.   {
  2351.     error= sub_select(join,join_tab,0);
  2352.     if (error >= 0)
  2353.       error= sub_select(join,join_tab,1);
  2354.     if (error == -3)
  2355.       error= 0; /* select_limit used */
  2356.   }
  2357.   if (error >= 0)
  2358.   {
  2359.     error=0;
  2360.     if (!table) // If sending data to client
  2361.     {
  2362.       /*
  2363. The following will unlock all cursors if the command wasn't an
  2364. update command
  2365.       */
  2366.       join->join_free(0); // Unlock all cursors
  2367.       if (join->result->send_eof())
  2368. error= 1; // Don't send error
  2369.     }
  2370.     DBUG_PRINT("info",("%ld records output",join->send_records));
  2371.   }
  2372.   if (table)
  2373.   {
  2374.     int tmp;
  2375.     if ((tmp=table->file->extra(HA_EXTRA_NO_CACHE)))
  2376.     {
  2377.       DBUG_PRINT("error",("extra(HA_EXTRA_NO_CACHE) failed"));
  2378.       my_errno= tmp;
  2379.       error= -1;
  2380.     }
  2381.     if ((tmp=table->file->ha_index_or_rnd_end()))
  2382.     {
  2383.       DBUG_PRINT("error",("ha_index_or_rnd_end() failed"));
  2384.       my_errno= tmp;
  2385.       error= -1;
  2386.     }
  2387.     if (error == -1)
  2388.       table->file->print_error(my_errno,MYF(0));
  2389.   }
  2390. #ifndef DBUG_OFF
  2391.   if (error)
  2392.   {
  2393.     DBUG_PRINT("error",("Error: do_select() failed"));
  2394.   }
  2395. #endif
  2396.   DBUG_RETURN(join->thd->net.report_error ? -1 : error);
  2397. }
  2398. static int
  2399. sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
  2400. {
  2401.   int error;
  2402.   if (end_of_records)
  2403.   {
  2404.     if ((error=flush_cached_records(join,join_tab,FALSE)) < 0)
  2405.       return error; /* purecov: inspected */
  2406.     return sub_select(join,join_tab,end_of_records);
  2407.   }
  2408.   if (join->thd->killed) // If aborted by user
  2409.   {
  2410.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  2411.     return -2;  /* purecov: inspected */
  2412.   }
  2413.   if (join_tab->use_quick != 2 || test_if_quick_select(join_tab) <= 0)
  2414.   {
  2415.     if (!store_record_in_cache(&join_tab->cache))
  2416.       return 0; // There is more room in cache
  2417.     return flush_cached_records(join,join_tab,FALSE);
  2418.   }
  2419.   if ((error=flush_cached_records(join,join_tab,TRUE)) < 0)
  2420.     return error; /* purecov: inspected */
  2421.   return sub_select(join,join_tab,end_of_records); /* Use ordinary select */
  2422. }
  2423. static int
  2424. sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
  2425. {
  2426.   join_tab->table->null_row=0;
  2427.   if (end_of_records)
  2428.     return (*join_tab->next_select)(join,join_tab+1,end_of_records);
  2429.   /* Cache variables for faster loop */
  2430.   int error;
  2431.   bool found=0;
  2432.   COND *on_expr=join_tab->on_expr, *select_cond=join_tab->select_cond;
  2433.   my_bool *report_error= &(join->thd->net.report_error);
  2434.   if (!(error=(*join_tab->read_first_record)(join_tab)))
  2435.   {
  2436.     bool not_exists_optimize= join_tab->table->reginfo.not_exists_optimize;
  2437.     bool not_used_in_distinct=join_tab->not_used_in_distinct;
  2438.     ha_rows found_records=join->found_records;
  2439.     READ_RECORD *info= &join_tab->read_record;
  2440.     join->thd->row_count= 0;
  2441.     do
  2442.     {
  2443.       if (join->thd->killed) // Aborted by user
  2444.       {
  2445. my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  2446. return -2; /* purecov: inspected */
  2447.       }
  2448.       join->examined_rows++;
  2449.       join->thd->row_count++;
  2450.       if (!on_expr || on_expr->val_int())
  2451.       {
  2452. found=1;
  2453. if (not_exists_optimize)
  2454.   break; // Searching after not null columns
  2455. if (!select_cond || select_cond->val_int())
  2456. {
  2457.   if ((error=(*join_tab->next_select)(join,join_tab+1,0)) < 0)
  2458.     return error;
  2459.   /*
  2460.     Test if this was a SELECT DISTINCT query on a table that
  2461.     was not in the field list;  In this case we can abort if
  2462.     we found a row, as no new rows can be added to the result.
  2463.   */
  2464.   if (not_used_in_distinct && found_records != join->found_records)
  2465.     return 0;
  2466. }
  2467. else
  2468.         {
  2469.           /* 
  2470.             This row failed selection, release lock on it.
  2471.             XXX: There is no table handler in MySQL which makes use of this
  2472.             call. It's kept from Gemini times. A lot of new code was added
  2473.             recently (i. e. subselects) without having it in mind.
  2474.           */
  2475.   info->file->unlock_row();
  2476.         }
  2477.       }
  2478.     } while (!(error=info->read_record(info)) && !(*report_error));
  2479.   }
  2480.   if (error > 0 || (*report_error)) // Fatal error
  2481.     return -1;
  2482.   if (!found && on_expr)
  2483.   { // OUTER JOIN
  2484.     restore_record(join_tab->table,default_values); // Make empty record
  2485.     mark_as_null_row(join_tab->table); // For group by without error
  2486.     if (!select_cond || select_cond->val_int())
  2487.     {
  2488.       if ((error=(*join_tab->next_select)(join,join_tab+1,0)) < 0)
  2489. return error; /* purecov: inspected */
  2490.     }
  2491.   }
  2492.   return 0;
  2493. }
  2494. static int
  2495. flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
  2496. {
  2497.   int error;
  2498.   READ_RECORD *info;
  2499.   if (!join_tab->cache.records)
  2500.     return 0; /* Nothing to do */
  2501.   if (skip_last)
  2502.     (void) store_record_in_cache(&join_tab->cache); // Must save this for later
  2503.   if (join_tab->use_quick == 2)
  2504.   {
  2505.     if (join_tab->select->quick)
  2506.     { /* Used quick select last. reset it */
  2507.       delete join_tab->select->quick;
  2508.       join_tab->select->quick=0;
  2509.     }
  2510.   }
  2511.  /* read through all records */
  2512.   if ((error=join_init_read_record(join_tab)))
  2513.   {
  2514.     reset_cache_write(&join_tab->cache);
  2515.     return -error; /* No records or error */
  2516.   }
  2517.   for (JOIN_TAB *tmp=join->join_tab; tmp != join_tab ; tmp++)
  2518.   {
  2519.     tmp->status=tmp->table->status;
  2520.     tmp->table->status=0;
  2521.   }
  2522.   info= &join_tab->read_record;
  2523.   do
  2524.   {
  2525.     if (join->thd->killed)
  2526.     {
  2527.       my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  2528.       return -2; // Aborted by user /* purecov: inspected */
  2529.     }
  2530.     SQL_SELECT *select=join_tab->select;
  2531.     if (!error && (!join_tab->cache.select ||
  2532.    !join_tab->cache.select->skip_record()))
  2533.     {
  2534.       uint i;
  2535.       reset_cache_read(&join_tab->cache);
  2536.       for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
  2537.       {
  2538. read_cached_record(join_tab);
  2539. if (!select || !select->skip_record())
  2540.   if ((error=(join_tab->next_select)(join,join_tab+1,0)) < 0)
  2541.           {
  2542.             reset_cache_write(&join_tab->cache);
  2543.     return error; /* purecov: inspected */
  2544.           }
  2545.       }
  2546.     }
  2547.   } while (!(error=info->read_record(info)));
  2548.   if (skip_last)
  2549.     read_cached_record(join_tab); // Restore current record
  2550.   reset_cache_write(&join_tab->cache);
  2551.   if (error > 0) // Fatal error
  2552.     return -1; /* purecov: inspected */
  2553.   for (JOIN_TAB *tmp2=join->join_tab; tmp2 != join_tab ; tmp2++)
  2554.     tmp2->table->status=tmp2->status;
  2555.   return 0;
  2556. }
  2557. /*****************************************************************************
  2558.   The different ways to read a record
  2559.   Returns -1 if row was not found, 0 if row was found and 1 on errors
  2560. *****************************************************************************/
  2561. /* Help function when we get some an error from the table handler */
  2562. int report_error(TABLE *table, int error)
  2563. {
  2564.   if (error == HA_ERR_END_OF_FILE || error == HA_ERR_KEY_NOT_FOUND)
  2565.   {
  2566.     table->status= STATUS_GARBAGE;
  2567.     return -1; // key not found; ok
  2568.   }
  2569.   /*
  2570.     Locking reads can legally return also these errors, do not
  2571.     print them to the .err log
  2572.   */
  2573.   if (error != HA_ERR_LOCK_DEADLOCK && error != HA_ERR_LOCK_WAIT_TIMEOUT)
  2574.     sql_print_error("Got error %d when reading table '%s'",
  2575.     error, table->path);
  2576.   table->file->print_error(error,MYF(0));
  2577.   return 1;
  2578. }
  2579. int safe_index_read(JOIN_TAB *tab)
  2580. {
  2581.   int error;
  2582.   TABLE *table= tab->table;
  2583.   if ((error=table->file->index_read(table->record[0],
  2584.      tab->ref.key_buff,
  2585.      tab->ref.key_length, HA_READ_KEY_EXACT)))
  2586.     return report_error(table, error);
  2587.   return 0;
  2588. }
  2589. static int
  2590. join_read_const_table(JOIN_TAB *tab, POSITION *pos)
  2591. {
  2592.   int error;
  2593.   DBUG_ENTER("join_read_const_table");
  2594.   TABLE *table=tab->table;
  2595.   table->const_table=1;
  2596.   table->null_row=0;
  2597.   table->status=STATUS_NO_RECORD;
  2598.   
  2599.   if (tab->type == JT_SYSTEM)
  2600.   {
  2601.     if ((error=join_read_system(tab)))
  2602.     { // Info for DESCRIBE
  2603.       tab->info="const row not found";
  2604.       /* Mark for EXPLAIN that the row was not found */
  2605.       pos->records_read=0.0;
  2606.       if (!table->outer_join || error > 0)
  2607. DBUG_RETURN(error);
  2608.     }
  2609.   }
  2610.   else
  2611.   {
  2612.     if (!table->key_read && table->used_keys.is_set(tab->ref.key) &&
  2613. !table->no_keyread &&
  2614.         (int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY)
  2615.     {
  2616.       table->key_read=1;
  2617.       table->file->extra(HA_EXTRA_KEYREAD);
  2618.       tab->index= tab->ref.key;
  2619.     }
  2620.     if ((error=join_read_const(tab)))
  2621.     {
  2622.       tab->info="unique row not found";
  2623.       /* Mark for EXPLAIN that the row was not found */
  2624.       pos->records_read=0.0;
  2625.       if (!table->outer_join || error > 0)
  2626. DBUG_RETURN(error);
  2627.     }
  2628.     if (table->key_read)
  2629.     {
  2630.       table->key_read=0;
  2631.       table->file->extra(HA_EXTRA_NO_KEYREAD);
  2632.     }
  2633.   }
  2634.   if (tab->on_expr && !table->null_row)
  2635.   {
  2636.     if ((table->null_row= test(tab->on_expr->val_int() == 0)))
  2637.       mark_as_null_row(table);  
  2638.   }
  2639.   if (!table->null_row)
  2640.     table->maybe_null=0;
  2641.   DBUG_RETURN(0);
  2642. }
  2643. static int
  2644. join_read_system(JOIN_TAB *tab)
  2645. {
  2646.   TABLE *table= tab->table;
  2647.   int error;
  2648.   if (table->status & STATUS_GARBAGE) // If first read
  2649.   {
  2650.     if ((error=table->file->read_first_row(table->record[0],
  2651.    table->primary_key)))
  2652.     {
  2653.       if (error != HA_ERR_END_OF_FILE)
  2654. return report_error(table, error);
  2655.       mark_as_null_row(tab->table);
  2656.       empty_record(table); // Make empty record
  2657.       return -1;
  2658.     }
  2659.     store_record(table,record[1]);
  2660.   }
  2661.   else if (!table->status) // Only happens with left join
  2662.     restore_record(table,record[1]); // restore old record
  2663.   table->null_row=0;
  2664.   return table->status ? -1 : 0;
  2665. }
  2666. static int
  2667. join_read_const(JOIN_TAB *tab)
  2668. {
  2669.   int error;
  2670.   TABLE *table= tab->table;
  2671.   if (table->status & STATUS_GARBAGE) // If first read
  2672.   {
  2673.     if (cp_buffer_from_ref(tab->join->thd, &tab->ref))
  2674.       error=HA_ERR_KEY_NOT_FOUND;
  2675.     else
  2676.     {
  2677.       error=table->file->index_read_idx(table->record[0],tab->ref.key,
  2678. (byte*) tab->ref.key_buff,
  2679. tab->ref.key_length,HA_READ_KEY_EXACT);
  2680.     }
  2681.     if (error)
  2682.     {
  2683.       mark_as_null_row(tab->table);
  2684.       empty_record(table);
  2685.       if (error != HA_ERR_KEY_NOT_FOUND)
  2686. return report_error(table, error);
  2687.       return -1;
  2688.     }
  2689.     store_record(table,record[1]);
  2690.   }
  2691.   else if (!(table->status & ~STATUS_NULL_ROW)) // Only happens with left join
  2692.   {
  2693.     table->status=0;
  2694.     restore_record(table,record[1]); // restore old record
  2695.   }
  2696.   table->null_row=0;
  2697.   return table->status ? -1 : 0;
  2698. }
  2699. static int
  2700. join_read_key(JOIN_TAB *tab)
  2701. {
  2702.   int error;
  2703.   TABLE *table= tab->table;
  2704.   if (!table->file->inited)
  2705.     table->file->ha_index_init(tab->ref.key);
  2706.   if (cmp_buffer_with_ref(tab) ||
  2707.       (table->status & (STATUS_GARBAGE | STATUS_NO_PARENT | STATUS_NULL_ROW)))
  2708.   {
  2709.     if (tab->ref.key_err)
  2710.     {
  2711.       table->status=STATUS_NOT_FOUND;
  2712.       return -1;
  2713.     }
  2714.     error=table->file->index_read(table->record[0],
  2715.   tab->ref.key_buff,
  2716.   tab->ref.key_length,HA_READ_KEY_EXACT);
  2717.     if (error && error != HA_ERR_KEY_NOT_FOUND)
  2718.       return report_error(table, error);
  2719.   }
  2720.   table->null_row=0;
  2721.   return table->status ? -1 : 0;
  2722. }
  2723. static int
  2724. join_read_always_key(JOIN_TAB *tab)
  2725. {
  2726.   int error;
  2727.   TABLE *table= tab->table;
  2728.   for (uint i= 0 ; i < tab->ref.key_parts ; i++)
  2729.   {
  2730.     if ((tab->ref.null_rejecting & 1 << i) && tab->ref.items[i]->is_null())
  2731.         return -1;
  2732.   } 
  2733.   if (!table->file->inited)
  2734.     table->file->ha_index_init(tab->ref.key);
  2735.   if (cp_buffer_from_ref(tab->join->thd, &tab->ref))
  2736.     return -1;
  2737.   if ((error=table->file->index_read(table->record[0],
  2738.      tab->ref.key_buff,
  2739.      tab->ref.key_length,HA_READ_KEY_EXACT)))
  2740.   {
  2741.     if (error != HA_ERR_KEY_NOT_FOUND)
  2742.       return report_error(table, error);
  2743.     return -1; /* purecov: inspected */
  2744.   }
  2745.   return 0;
  2746. }
  2747. /*
  2748.   This function is used when optimizing away ORDER BY in 
  2749.   SELECT * FROM t1 WHERE a=1 ORDER BY a DESC,b DESC
  2750. */
  2751.   
  2752. static int
  2753. join_read_last_key(JOIN_TAB *tab)
  2754. {
  2755.   int error;
  2756.   TABLE *table= tab->table;
  2757.   if (!table->file->inited)
  2758.     table->file->ha_index_init(tab->ref.key);
  2759.   if (cp_buffer_from_ref(tab->join->thd, &tab->ref))
  2760.     return -1;
  2761.   if ((error=table->file->index_read_last(table->record[0],
  2762.   tab->ref.key_buff,
  2763.   tab->ref.key_length)))
  2764.   {
  2765.     if (error != HA_ERR_KEY_NOT_FOUND)
  2766.       return report_error(table, error);
  2767.     return -1; /* purecov: inspected */
  2768.   }
  2769.   return 0;
  2770. }
  2771. /* ARGSUSED */
  2772. static int
  2773. join_no_more_records(READ_RECORD *info __attribute__((unused)))
  2774. {
  2775.   return -1;
  2776. }
  2777. static int
  2778. join_read_next_same(READ_RECORD *info)
  2779. {
  2780.   int error;
  2781.   TABLE *table= info->table;
  2782.   JOIN_TAB *tab=table->reginfo.join_tab;
  2783.   if ((error=table->file->index_next_same(table->record[0],
  2784.   tab->ref.key_buff,
  2785.   tab->ref.key_length)))
  2786.   {
  2787.     if (error != HA_ERR_END_OF_FILE)
  2788.       return report_error(table, error);
  2789.     table->status= STATUS_GARBAGE;
  2790.     return -1;
  2791.   }
  2792.   return 0;
  2793. }
  2794. static int
  2795. join_read_prev_same(READ_RECORD *info)
  2796. {
  2797.   int error;
  2798.   TABLE *table= info->table;
  2799.   JOIN_TAB *tab=table->reginfo.join_tab;
  2800.   if ((error=table->file->index_prev(table->record[0])))
  2801.     return report_error(table, error);
  2802.   if (key_cmp_if_same(table, tab->ref.key_buff, tab->ref.key,
  2803.                       tab->ref.key_length))
  2804.   {
  2805.     table->status=STATUS_NOT_FOUND;
  2806.     error= -1;
  2807.   }
  2808.   return error;
  2809. }
  2810. static int
  2811. join_init_quick_read_record(JOIN_TAB *tab)
  2812. {
  2813.   if (test_if_quick_select(tab) == -1)
  2814.     return -1; /* No possible records */
  2815.   return join_init_read_record(tab);
  2816. }
  2817. static int
  2818. test_if_quick_select(JOIN_TAB *tab)
  2819. {
  2820.   delete tab->select->quick;
  2821.   tab->select->quick=0;
  2822.   return tab->select->test_quick_select(tab->join->thd, tab->keys,
  2823. (table_map) 0, HA_POS_ERROR, 0);
  2824. }
  2825. static int
  2826. join_init_read_record(JOIN_TAB *tab)
  2827. {
  2828.   if (tab->select && tab->select->quick)
  2829.     tab->select->quick->reset();
  2830.   init_read_record(&tab->read_record, tab->join->thd, tab->table,
  2831.    tab->select,1,1);
  2832.   return (*tab->read_record.read_record)(&tab->read_record);
  2833. }
  2834. static int
  2835. join_read_first(JOIN_TAB *tab)
  2836. {
  2837.   int error;
  2838.   TABLE *table=tab->table;
  2839.   if (!table->key_read && table->used_keys.is_set(tab->index) &&
  2840.       !table->no_keyread)
  2841.   {
  2842.     table->key_read=1;
  2843.     table->file->extra(HA_EXTRA_KEYREAD);
  2844.   }
  2845.   tab->table->status=0;
  2846.   tab->read_record.read_record=join_read_next;
  2847.   tab->read_record.table=table;
  2848.   tab->read_record.file=table->file;
  2849.   tab->read_record.index=tab->index;
  2850.   tab->read_record.record=table->record[0];
  2851.   if (!table->file->inited)
  2852.     table->file->ha_index_init(tab->index);
  2853.   if ((error=tab->table->file->index_first(tab->table->record[0])))
  2854.   {
  2855.     if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
  2856.       report_error(table, error);
  2857.     return -1;
  2858.   }
  2859.   return 0;
  2860. }
  2861. static int
  2862. join_read_next(READ_RECORD *info)
  2863. {
  2864.   int error;
  2865.   if ((error=info->file->index_next(info->record)))
  2866.     return report_error(info->table, error);
  2867.   return 0;
  2868. }
  2869. static int
  2870. join_read_last(JOIN_TAB *tab)
  2871. {
  2872.   TABLE *table=tab->table;
  2873.   int error;
  2874.   if (!table->key_read && table->used_keys.is_set(tab->index) &&
  2875.       !table->no_keyread)
  2876.   {
  2877.     table->key_read=1;
  2878.     table->file->extra(HA_EXTRA_KEYREAD);
  2879.   }
  2880.   tab->table->status=0;
  2881.   tab->read_record.read_record=join_read_prev;
  2882.   tab->read_record.table=table;
  2883.   tab->read_record.file=table->file;
  2884.   tab->read_record.index=tab->index;
  2885.   tab->read_record.record=table->record[0];
  2886.   if (!table->file->inited)
  2887.     table->file->ha_index_init(tab->index);
  2888.   if ((error= tab->table->file->index_last(tab->table->record[0])))
  2889.     return report_error(table, error);
  2890.   return 0;
  2891. }
  2892. static int
  2893. join_read_prev(READ_RECORD *info)
  2894. {
  2895.   int error;
  2896.   if ((error= info->file->index_prev(info->record)))
  2897.     return report_error(info->table, error);
  2898.   return 0;
  2899. }
  2900. static int
  2901. join_ft_read_first(JOIN_TAB *tab)
  2902. {
  2903.   int error;
  2904.   TABLE *table= tab->table;
  2905.   if (!table->file->inited)
  2906.     table->file->ha_index_init(tab->ref.key);
  2907. #if NOT_USED_YET
  2908.   if (cp_buffer_from_ref(tab->join->thd, &tab->ref)) // as ft-key doesn't use store_key's
  2909.     return -1;                             // see also FT_SELECT::init()
  2910. #endif
  2911.   table->file->ft_init();
  2912.   if ((error= table->file->ft_read(table->record[0])))
  2913.     return report_error(table, error);
  2914.   return 0;
  2915. }
  2916. static int
  2917. join_ft_read_next(READ_RECORD *info)
  2918. {
  2919.   int error;
  2920.   if ((error= info->file->ft_read(info->table->record[0])))
  2921.     return report_error(info->table, error);
  2922.   return 0;
  2923. }
  2924. /*
  2925.   Reading of key with key reference and one part that may be NULL
  2926. */
  2927. static int
  2928. join_read_always_key_or_null(JOIN_TAB *tab)
  2929. {
  2930.   int res;
  2931.   /* First read according to key which is NOT NULL */
  2932.   *tab->ref.null_ref_key= 0; // Clear null byte
  2933.   if ((res= join_read_always_key(tab)) >= 0)
  2934.     return res;
  2935.   /* Then read key with null value */
  2936.   *tab->ref.null_ref_key= 1; // Set null byte
  2937.   return safe_index_read(tab);
  2938. }
  2939. static int
  2940. join_read_next_same_or_null(READ_RECORD *info)
  2941. {
  2942.   int error;
  2943.   if ((error= join_read_next_same(info)) >= 0)
  2944.     return error;
  2945.   JOIN_TAB *tab= info->table->reginfo.join_tab;
  2946.   /* Test if we have already done a read after null key */
  2947.   if (*tab->ref.null_ref_key)
  2948.     return -1; // All keys read
  2949.   *tab->ref.null_ref_key= 1; // Set null byte
  2950.   return safe_index_read(tab); // then read null keys
  2951. }
  2952. /*****************************************************************************
  2953.   The different end of select functions
  2954.   These functions returns < 0 when end is reached, 0 on ok and > 0 if a
  2955.   fatal error (like table corruption) was detected
  2956. *****************************************************************************/
  2957. /* ARGSUSED */
  2958. static int
  2959. end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  2960.  bool end_of_records)
  2961. {
  2962.   DBUG_ENTER("end_send");
  2963.   if (!end_of_records)
  2964.   {
  2965.     int error;
  2966.     if (join->having && join->having->val_int() == 0)
  2967.       DBUG_RETURN(0); // Didn't match having
  2968.     error=0;
  2969.     if (join->procedure)
  2970.       error=join->procedure->send_row(join->procedure_fields_list);
  2971.     else if (join->do_send_rows)
  2972.       error=join->result->send_data(*join->fields);
  2973.     if (error)
  2974.       DBUG_RETURN(-1); /* purecov: inspected */
  2975.     if (++join->send_records >= join->unit->select_limit_cnt &&
  2976. join->do_send_rows)
  2977.     {
  2978.       if (join->select_options & OPTION_FOUND_ROWS)
  2979.       {
  2980. JOIN_TAB *jt=join->join_tab;
  2981. if ((join->tables == 1) && !join->tmp_table && !join->sort_and_group
  2982.     && !join->send_group_parts && !join->having && !jt->select_cond &&
  2983.     !(jt->select && jt->select->quick) &&
  2984.     !(jt->table->file->table_flags() & HA_NOT_EXACT_COUNT) &&
  2985.             (jt->ref.key < 0))
  2986. {
  2987.   /* Join over all rows in table;  Return number of found rows */
  2988.   TABLE *table=jt->table;
  2989.   join->select_options ^= OPTION_FOUND_ROWS;
  2990.   if (table->sort.record_pointers ||
  2991.       (table->sort.io_cache && my_b_inited(table->sort.io_cache)))
  2992.   {
  2993.     /* Using filesort */
  2994.     join->send_records= table->sort.found_records;
  2995.   }
  2996.   else
  2997.   {
  2998.     table->file->info(HA_STATUS_VARIABLE);
  2999.     join->send_records = table->file->records;
  3000.   }
  3001. }
  3002. else 
  3003. {
  3004.   join->do_send_rows= 0;
  3005.   if (join->unit->fake_select_lex)
  3006.     join->unit->fake_select_lex->select_limit= HA_POS_ERROR;
  3007.   DBUG_RETURN(0);
  3008. }
  3009.       }
  3010.       DBUG_RETURN(-3); // Abort nicely
  3011.     }
  3012.   }
  3013.   else
  3014.   {
  3015.     if (join->procedure && join->procedure->end_of_records())
  3016.       DBUG_RETURN(-1);
  3017.   }
  3018.   DBUG_RETURN(0);
  3019. }
  3020. /* ARGSUSED */
  3021. static int
  3022. end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  3023.        bool end_of_records)
  3024. {
  3025.   int idx= -1;
  3026.   DBUG_ENTER("end_send_group");
  3027.   if (!join->first_record || end_of_records ||
  3028.       (idx=test_if_group_changed(join->group_fields)) >= 0)
  3029.   {
  3030.     if (join->first_record || (end_of_records && !join->group))
  3031.     {
  3032.       if (join->procedure)
  3033. join->procedure->end_group();
  3034.       if (idx < (int) join->send_group_parts)
  3035.       {
  3036. int error=0;
  3037. if (join->procedure)
  3038. {
  3039.   if (join->having && join->having->val_int() == 0)
  3040.     error= -1; // Didn't satisfy having
  3041.     else
  3042.   {
  3043.     if (join->do_send_rows)
  3044.       error=join->procedure->send_row(*join->fields) ? 1 : 0;
  3045.     join->send_records++;
  3046.   }
  3047.   if (end_of_records && join->procedure->end_of_records())
  3048.     error= 1; // Fatal error
  3049. }
  3050. else
  3051. {
  3052.   if (!join->first_record)
  3053.   {
  3054.     /* No matching rows for group function */
  3055.     join->clear();
  3056.   }
  3057.   if (join->having && join->having->val_int() == 0)
  3058.     error= -1; // Didn't satisfy having
  3059.   else
  3060.   {
  3061.     if (join->do_send_rows)
  3062.       error=join->result->send_data(*join->fields) ? 1 : 0;
  3063.     join->send_records++;
  3064.   }
  3065.   if (join->rollup.state != ROLLUP::STATE_NONE && error <= 0)
  3066.   {
  3067.     if (join->rollup_send_data((uint) (idx+1)))
  3068.       error= 1;
  3069.   }
  3070. }
  3071. if (error > 0)
  3072.   DBUG_RETURN(-1); /* purecov: inspected */
  3073. if (end_of_records)
  3074.   DBUG_RETURN(0);
  3075. if (join->send_records >= join->unit->select_limit_cnt &&
  3076.     join->do_send_rows)
  3077. {
  3078.   if (!(join->select_options & OPTION_FOUND_ROWS))
  3079.     DBUG_RETURN(-3); // Abort nicely
  3080.   join->do_send_rows=0;
  3081.   join->unit->select_limit_cnt = HA_POS_ERROR;
  3082.         }
  3083.       }
  3084.     }
  3085.     else
  3086.     {
  3087.       if (end_of_records)
  3088. DBUG_RETURN(0);
  3089.       join->first_record=1;
  3090.       VOID(test_if_group_changed(join->group_fields));
  3091.     }
  3092.     if (idx < (int) join->send_group_parts)
  3093.     {
  3094.       copy_fields(&join->tmp_table_param);
  3095.       if (init_sum_functions(join->sum_funcs, join->sum_funcs_end[idx+1]))
  3096. DBUG_RETURN(-1);
  3097.       if (join->procedure)
  3098. join->procedure->add();
  3099.       DBUG_RETURN(0);
  3100.     }
  3101.   }
  3102.   if (update_sum_func(join->sum_funcs))
  3103.     DBUG_RETURN(-1);
  3104.   if (join->procedure)
  3105.     join->procedure->add();
  3106.   DBUG_RETURN(0);
  3107. }
  3108. /* ARGSUSED */
  3109. static int
  3110. end_write(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  3111.   bool end_of_records)
  3112. {
  3113.   TABLE *table=join->tmp_table;
  3114.   int error;
  3115.   DBUG_ENTER("end_write");
  3116.   if (join->thd->killed) // Aborted by user
  3117.   {
  3118.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  3119.     DBUG_RETURN(-2); /* purecov: inspected */
  3120.   }
  3121.   if (!end_of_records)
  3122.   {
  3123.     copy_fields(&join->tmp_table_param);
  3124.     copy_funcs(join->tmp_table_param.items_to_copy);
  3125. #ifdef TO_BE_DELETED
  3126.     if (!table->uniques) // If not unique handling
  3127.     {
  3128.       /* Copy null values from group to row */
  3129.       ORDER   *group;
  3130.       for (group=table->group ; group ; group=group->next)
  3131.       {
  3132. Item *item= *group->item;