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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.    subselect Item
  15. SUBSELECT TODO:
  16.    - add function from mysql_select that use JOIN* as parameter to JOIN methods
  17.      (sql_select.h/sql_select.cc)
  18. */
  19. #ifdef USE_PRAGMA_IMPLEMENTATION
  20. #pragma implementation // gcc: Class implementation
  21. #endif
  22. #include "mysql_priv.h"
  23. #include "sql_select.h"
  24. inline Item * and_items(Item* cond, Item *item)
  25. {
  26.   return (cond? (new Item_cond_and(cond, item)) : item);
  27. }
  28. Item_subselect::Item_subselect():
  29.   Item_result_field(), value_assigned(0), thd(0), substitution(0),
  30.   engine(0), old_engine(0), used_tables_cache(0), have_to_be_excluded(0),
  31.   const_item_cache(1), engine_changed(0), changed(0)
  32. {
  33.   reset();
  34.   /*
  35.     item value is NULL if select_subselect not changed this value
  36.     (i.e. some rows will be found returned)
  37.   */
  38.   null_value= 1;
  39. }
  40. void Item_subselect::init(st_select_lex *select_lex,
  41.   select_subselect *result)
  42. {
  43.   DBUG_ENTER("Item_subselect::init");
  44.   DBUG_PRINT("subs", ("select_lex 0x%xl", (ulong) select_lex));
  45.   unit= select_lex->master_unit();
  46.   if (unit->item)
  47.   {
  48.     /*
  49.       Item can be changed in JOIN::prepare while engine in JOIN::optimize
  50.       => we do not copy old_engine here
  51.     */
  52.     engine= unit->item->engine;
  53.     parsing_place= unit->item->parsing_place;
  54.     unit->item->engine= 0;
  55.     unit->item= this;
  56.     engine->change_item(this, result);
  57.   }
  58.   else
  59.   {
  60.     SELECT_LEX *outer_select= unit->outer_select();
  61.     /*
  62.       do not take into account expression inside aggregate functions because
  63.       they can access original table fields
  64.     */
  65.     parsing_place= (outer_select->in_sum_expr ?
  66.                     NO_MATTER :
  67.                     outer_select->parsing_place);
  68.     if (select_lex->next_select())
  69.       engine= new subselect_union_engine(unit, result, this);
  70.     else
  71.       engine= new subselect_single_select_engine(select_lex, result, this);
  72.   }
  73.   {
  74.     SELECT_LEX *upper= unit->outer_select();
  75.     if (upper->parsing_place == IN_HAVING)
  76.       upper->subquery_in_having= 1;
  77.   }
  78.   DBUG_VOID_RETURN;
  79. }
  80. void Item_subselect::cleanup()
  81. {
  82.   DBUG_ENTER("Item_subselect::cleanup");
  83.   Item_result_field::cleanup();
  84.   if (old_engine)
  85.   {
  86.     if (engine)
  87.       engine->cleanup();
  88.     engine= old_engine;
  89.     old_engine= 0;
  90.   }
  91.   if (engine)
  92.     engine->cleanup();
  93.   reset();
  94.   value_assigned= 0;
  95.   DBUG_VOID_RETURN;
  96. }
  97. void Item_singlerow_subselect::cleanup()
  98. {
  99.   DBUG_ENTER("Item_singlerow_subselect::cleanup");
  100.   value= 0; row= 0;
  101.   Item_subselect::cleanup();
  102.   DBUG_VOID_RETURN;
  103. }
  104. Item_subselect::~Item_subselect()
  105. {
  106.   delete engine;
  107. }
  108. Item_subselect::trans_res
  109. Item_subselect::select_transformer(JOIN *join)
  110. {
  111.   DBUG_ENTER("Item_subselect::select_transformer");
  112.   DBUG_RETURN(RES_OK);
  113. }
  114. bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
  115. {
  116.   DBUG_ASSERT(fixed == 0);
  117.   engine->set_thd((thd= thd_param));
  118.   char const *save_where= thd->where;
  119.   int res;
  120.   if (check_stack_overrun(thd, (gptr)&res))
  121.     return 1;
  122.   res= engine->prepare();
  123.   // all transformetion is done (used by prepared statements)
  124.   changed= 1;
  125.   if (!res)
  126.   {
  127.     if (substitution)
  128.     {
  129.       int ret= 0;
  130.       // did we changed top item of WHERE condition
  131.       if (unit->outer_select()->where == (*ref))
  132. unit->outer_select()->where= substitution; // correct WHERE for PS
  133.       else if (unit->outer_select()->having == (*ref))
  134. unit->outer_select()->having= substitution; // correct HAVING for PS
  135.       (*ref)= substitution;
  136.       substitution->name= name;
  137.       if (have_to_be_excluded)
  138. engine->exclude();
  139.       substitution= 0;
  140.       thd->where= "checking transformed subquery";
  141.       if (!(*ref)->fixed)
  142. ret= (*ref)->fix_fields(thd, tables, ref);
  143.       thd->where= save_where;
  144.       return ret;
  145.     }
  146.     // Is it one field subselect?
  147.     if (engine->cols() > max_columns)
  148.     {
  149.       my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
  150.       return 1;
  151.     }
  152.     fix_length_and_dec();
  153.   }
  154.   else
  155.     return 1;
  156.   uint8 uncacheable= engine->uncacheable();
  157.   if (uncacheable)
  158.   {
  159.     const_item_cache= 0;
  160.     if (uncacheable & UNCACHEABLE_RAND)
  161.       used_tables_cache|= RAND_TABLE_BIT;
  162.   }
  163.   fixed= 1;
  164.   thd->where= save_where;
  165.   return res;
  166. }
  167. bool Item_subselect::exec()
  168. {
  169.   int res;
  170.   MEM_ROOT *old_root= thd->mem_root;
  171.   /*
  172.     As this is execution, all objects should be allocated through the main
  173.     mem root
  174.   */
  175.   thd->mem_root= &thd->main_mem_root;
  176.   res= engine->exec();
  177.   thd->mem_root= old_root;
  178.   if (engine_changed)
  179.   {
  180.     engine_changed= 0;
  181.     return exec();
  182.   }
  183.   return (res);
  184. }
  185. Item::Type Item_subselect::type() const
  186. {
  187.   return SUBSELECT_ITEM;
  188. }
  189. void Item_subselect::fix_length_and_dec()
  190. {
  191.   engine->fix_length_and_dec(0);
  192. }
  193. table_map Item_subselect::used_tables() const
  194. {
  195.   return (table_map) (engine->uncacheable() ? used_tables_cache : 0L);
  196. }
  197. bool Item_subselect::const_item() const
  198. {
  199.   return const_item_cache;
  200. }
  201. Item *Item_subselect::get_tmp_table_item(THD *thd)
  202. {
  203.   if (!with_sum_func && !const_item())
  204.     return new Item_field(result_field);
  205.   return copy_or_same(thd);
  206. }
  207. void Item_subselect::update_used_tables()
  208. {
  209.   if (!engine->uncacheable())
  210.   {
  211.     // did all used tables become ststic?
  212.     if (!(used_tables_cache & ~engine->upper_select_const_tables()))
  213.       const_item_cache= 1;
  214.   }
  215. }
  216. void Item_subselect::print(String *str)
  217. {
  218.   str->append('(');
  219.   engine->print(str);
  220.   str->append(')');
  221. }
  222. Item_singlerow_subselect::Item_singlerow_subselect(st_select_lex *select_lex)
  223.   :Item_subselect(), value(0)
  224. {
  225.   DBUG_ENTER("Item_singlerow_subselect::Item_singlerow_subselect");
  226.   init(select_lex, new select_singlerow_subselect(this));
  227.   maybe_null= 1;
  228.   max_columns= UINT_MAX;
  229.   DBUG_VOID_RETURN;
  230. }
  231. Item_maxmin_subselect::Item_maxmin_subselect(Item_subselect *parent,
  232.      st_select_lex *select_lex,
  233.      bool max_arg)
  234.   :Item_singlerow_subselect(), was_values(TRUE)
  235. {
  236.   DBUG_ENTER("Item_maxmin_subselect::Item_maxmin_subselect");
  237.   max= max_arg;
  238.   init(select_lex, new select_max_min_finder_subselect(this, max_arg));
  239.   max_columns= 1;
  240.   maybe_null= 1;
  241.   max_columns= 1;
  242.   /*
  243.     Following information was collected during performing fix_fields()
  244.     of Items belonged to subquery, which will be not repeated
  245.   */
  246.   used_tables_cache= parent->get_used_tables_cache();
  247.   const_item_cache= parent->get_const_item_cache();
  248.   DBUG_VOID_RETURN;
  249. }
  250. void Item_maxmin_subselect::cleanup()
  251. {
  252.   DBUG_ENTER("Item_maxmin_subselect::cleanup");
  253.   Item_singlerow_subselect::cleanup();
  254.   /*
  255.     By default it is TRUE to avoid TRUE reporting by
  256.     Item_func_not_all/Item_func_nop_all if this item was never called.
  257.     Engine exec() set it to FALSE by reset_value_registration() call.
  258.     select_max_min_finder_subselect::send_data() set it back to TRUE if some
  259.     value will be found.
  260.   */
  261.   was_values= TRUE;
  262.   DBUG_VOID_RETURN;
  263. }
  264. void Item_maxmin_subselect::print(String *str)
  265. {
  266.   str->append(max?"<max>":"<min>", 5);
  267.   Item_singlerow_subselect::print(str);
  268. }
  269. void Item_singlerow_subselect::reset()
  270. {
  271.   null_value= 1;
  272.   if (value)
  273.     value->null_value= 1;
  274. }
  275. Item_subselect::trans_res
  276. Item_singlerow_subselect::select_transformer(JOIN *join)
  277. {
  278.   if (changed)
  279.     return RES_OK;
  280.   SELECT_LEX *select_lex= join->select_lex;
  281.   /* Juggle with current arena only if we're in prepared statement prepare */
  282.   Item_arena *arena= join->thd->current_arena;
  283.   if (!select_lex->master_unit()->first_select()->next_select() &&
  284.       !select_lex->table_list.elements &&
  285.       select_lex->item_list.elements == 1 &&
  286.       !select_lex->item_list.head()->with_sum_func &&
  287.       /*
  288. We cant change name of Item_field or Item_ref, because it will
  289. prevent it's correct resolving, but we should save name of
  290. removed item => we do not make optimization if top item of
  291. list is field or reference.
  292. TODO: solve above problem
  293.       */
  294.       !(select_lex->item_list.head()->type() == FIELD_ITEM ||
  295. select_lex->item_list.head()->type() == REF_ITEM) &&
  296.       /*
  297.         switch off this optimisation for prepare statement,
  298.         because we do not rollback this changes
  299.         TODO: make rollback for it, or special name resolving mode in 5.0.
  300.       */
  301.       !arena->is_stmt_prepare()
  302.       )
  303.   {
  304.     have_to_be_excluded= 1;
  305.     if (join->thd->lex->describe)
  306.     {
  307.       char warn_buff[MYSQL_ERRMSG_SIZE];
  308.       sprintf(warn_buff, ER(ER_SELECT_REDUCED), select_lex->select_number);
  309.       push_warning(join->thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
  310.    ER_SELECT_REDUCED, warn_buff);
  311.     }
  312.     substitution= select_lex->item_list.head();
  313.     /*
  314.       as far as we moved content to upper level, field which depend of
  315.       'upper' select is not really dependent => we remove this dependence
  316.     */
  317.     substitution->walk(&Item::remove_dependence_processor,
  318.        (byte *) select_lex->outer_select());
  319.     /* SELECT without FROM clause can't have WHERE or HAVING clause */
  320.     DBUG_ASSERT(join->conds == 0 && join->having == 0);
  321.     return RES_REDUCE;
  322.   }
  323.   return RES_OK;
  324. }
  325. void Item_singlerow_subselect::store(uint i, Item *item)
  326. {
  327.   row[i]->store(item);
  328. }
  329. enum Item_result Item_singlerow_subselect::result_type() const
  330. {
  331.   return engine->type();
  332. }
  333. void Item_singlerow_subselect::fix_length_and_dec()
  334. {
  335.   if ((max_columns= engine->cols()) == 1)
  336.   {
  337.     engine->fix_length_and_dec(row= &value);
  338.   }
  339.   else
  340.   {
  341.     if (!(row= (Item_cache**) sql_alloc(sizeof(Item_cache*)*max_columns)))
  342.       return;
  343.     engine->fix_length_and_dec(row);
  344.     value= *row;
  345.   }
  346.   /*
  347.     If there are not tables in subquery then ability to have NULL value
  348.     depends on SELECT list (if single row subquery have tables then it
  349.     always can be NULL if there are not records fetched).
  350.   */
  351.   if (engine->no_tables())
  352.     maybe_null= engine->may_be_null();
  353. }
  354. uint Item_singlerow_subselect::cols()
  355. {
  356.   return engine->cols();
  357. }
  358. bool Item_singlerow_subselect::check_cols(uint c)
  359. {
  360.   if (c != engine->cols())
  361.   {
  362.     my_error(ER_OPERAND_COLUMNS, MYF(0), c);
  363.     return 1;
  364.   }
  365.   return 0;
  366. }
  367. bool Item_singlerow_subselect::null_inside()
  368. {
  369.   for (uint i= 0; i < max_columns ; i++)
  370.   {
  371.     if (row[i]->null_value)
  372.       return 1;
  373.   }
  374.   return 0;
  375. }
  376. void Item_singlerow_subselect::bring_value()
  377. {
  378.   exec();
  379. }
  380. double Item_singlerow_subselect::val()
  381. {
  382.   DBUG_ASSERT(fixed == 1);
  383.   if (!exec() && !value->null_value)
  384.   {
  385.     null_value= 0;
  386.     return value->val();
  387.   }
  388.   else
  389.   {
  390.     reset();
  391.     return 0;
  392.   }
  393. }
  394. longlong Item_singlerow_subselect::val_int()
  395. {
  396.   DBUG_ASSERT(fixed == 1);
  397.   if (!exec() && !value->null_value)
  398.   {
  399.     null_value= 0;
  400.     return value->val_int();
  401.   }
  402.   else
  403.   {
  404.     reset();
  405.     return 0;
  406.   }
  407. }
  408. String *Item_singlerow_subselect::val_str (String *str)
  409. {
  410.   if (!exec() && !value->null_value)
  411.   {
  412.     null_value= 0;
  413.     return value->val_str(str);
  414.   }
  415.   else
  416.   {
  417.     reset();
  418.     return 0;
  419.   }
  420. }
  421. Item_exists_subselect::Item_exists_subselect(st_select_lex *select_lex):
  422.   Item_subselect()
  423. {
  424.   DBUG_ENTER("Item_exists_subselect::Item_exists_subselect");
  425.   init(select_lex, new select_exists_subselect(this));
  426.   max_columns= UINT_MAX;
  427.   null_value= 0; //can't be NULL
  428.   maybe_null= 0; //can't be NULL
  429.   value= 0;
  430.   // We need only 1 row to determinate existence
  431.   select_lex->master_unit()->global_parameters->select_limit= 1;
  432.   DBUG_VOID_RETURN;
  433. }
  434. void Item_exists_subselect::print(String *str)
  435. {
  436.   str->append("exists", 6);
  437.   Item_subselect::print(str);
  438. }
  439. bool Item_in_subselect::test_limit(SELECT_LEX_UNIT *unit)
  440. {
  441.   if (unit->fake_select_lex &&
  442.       unit->fake_select_lex->test_limit())
  443.     return(1);
  444.   SELECT_LEX *sl= unit->first_select();
  445.   for (; sl; sl= sl->next_select())
  446.   {
  447.     if (sl->test_limit())
  448.       return(1);
  449.   }
  450.   return(0);
  451. }
  452. Item_in_subselect::Item_in_subselect(Item * left_exp,
  453.      st_select_lex *select_lex):
  454.   Item_exists_subselect(), optimizer(0), transformed(0), upper_item(0)
  455. {
  456.   DBUG_ENTER("Item_in_subselect::Item_in_subselect");
  457.   left_expr= left_exp;
  458.   init(select_lex, new select_exists_subselect(this));
  459.   max_columns= UINT_MAX;
  460.   maybe_null= 1;
  461.   abort_on_null= 0;
  462.   reset();
  463.   //if test_limit will fail then error will be reported to client
  464.   test_limit(select_lex->master_unit());
  465.   DBUG_VOID_RETURN;
  466. }
  467. Item_allany_subselect::Item_allany_subselect(Item * left_exp,
  468.      Comp_creator *fn,
  469.      st_select_lex *select_lex,
  470.      bool all_arg)
  471.   :Item_in_subselect(), all(all_arg)
  472. {
  473.   DBUG_ENTER("Item_in_subselect::Item_in_subselect");
  474.   left_expr= left_exp;
  475.   func= fn;
  476.   init(select_lex, new select_exists_subselect(this));
  477.   max_columns= 1;
  478.   abort_on_null= 0;
  479.   reset();
  480.   //if test_limit will fail then error will be reported to client
  481.   test_limit(select_lex->master_unit());
  482.   DBUG_VOID_RETURN;
  483. }
  484. void Item_exists_subselect::fix_length_and_dec()
  485. {
  486.    decimals= 0;
  487.    max_length= 1;
  488.    max_columns= engine->cols();
  489. }
  490. double Item_exists_subselect::val()
  491. {
  492.   DBUG_ASSERT(fixed == 1);
  493.   if (exec())
  494.   {
  495.     reset();
  496.     return 0;
  497.   }
  498.   return (double) value;
  499. }
  500. longlong Item_exists_subselect::val_int()
  501. {
  502.   DBUG_ASSERT(fixed == 1);
  503.   if (exec())
  504.   {
  505.     reset();
  506.     return 0;
  507.   }
  508.   return value;
  509. }
  510. String *Item_exists_subselect::val_str(String *str)
  511. {
  512.   DBUG_ASSERT(fixed == 1);
  513.   if (exec())
  514.   {
  515.     reset();
  516.     return 0;
  517.   }
  518.   str->set(value,&my_charset_bin);
  519.   return str;
  520. }
  521. double Item_in_subselect::val()
  522. {
  523.   /*
  524.     As far as Item_in_subselect called only from Item_in_optimizer this
  525.     method should not be used
  526.   */
  527.   DBUG_ASSERT(0);
  528.   DBUG_ASSERT(fixed == 1);
  529.   if (exec())
  530.   {
  531.     reset();
  532.     null_value= 1;
  533.     return 0;
  534.   }
  535.   if (was_null && !value)
  536.     null_value= 1;
  537.   return (double) value;
  538. }
  539. longlong Item_in_subselect::val_int()
  540. {
  541.   DBUG_ASSERT(fixed == 1);
  542.   if (exec())
  543.   {
  544.     reset();
  545.     null_value= 1;
  546.     return 0;
  547.   }
  548.   if (was_null && !value)
  549.     null_value= 1;
  550.   return value;
  551. }
  552. String *Item_in_subselect::val_str(String *str)
  553. {
  554.   /*
  555.     As far as Item_in_subselect called only from Item_in_optimizer this
  556.     method should not be used
  557.   */
  558.   DBUG_ASSERT(0);
  559.   DBUG_ASSERT(fixed == 1);
  560.   if (exec())
  561.   {
  562.     reset();
  563.     null_value= 1;
  564.     return 0;
  565.   }
  566.   if (was_null && !value)
  567.   {
  568.     null_value= 1;
  569.     return 0;
  570.   }
  571.   str->set(value, &my_charset_bin);
  572.   return str;
  573. }
  574. /* Rewrite a single-column IN/ALL/ANY subselect. */
  575. Item_subselect::trans_res
  576. Item_in_subselect::single_value_transformer(JOIN *join,
  577.     Comp_creator *func)
  578. {
  579.   DBUG_ENTER("Item_in_subselect::single_value_transformer");
  580.   SELECT_LEX *select_lex= join->select_lex;
  581.   /*
  582.     Check that the right part of the subselect contains no more than one
  583.     column. E.g. in SELECT 1 IN (SELECT * ..) the right part is (SELECT * ...)
  584.   */
  585.   if (select_lex->item_list.elements > 1)
  586.   {
  587.     my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
  588.     DBUG_RETURN(RES_ERROR);
  589.   }
  590.   /*
  591.     If this is an ALL/ANY single-value subselect, try to rewrite it with
  592.     a MIN/MAX subselect. We can do that if a possible NULL result of the
  593.     subselect can be ignored.
  594.     E.g. SELECT * FROM t1 WHERE b > ANY (SELECT a FROM t2) can be rewritten
  595.     with SELECT * FROM t1 WHERE b > (SELECT MAX(a) FROM t2).
  596.     We can't check that this optimization is safe if it's not a top-level
  597.     item of the WHERE clause (e.g. because the WHERE clause can contain IS
  598.     NULL/IS NOT NULL functions). If so, we rewrite ALL/ANY with NOT EXISTS
  599.     later in this method.
  600.   */
  601.   if ((abort_on_null || (upper_item && upper_item->top_level())) &&
  602.       !select_lex->master_unit()->uncacheable && !func->eqne_op())
  603.   {
  604.     if (substitution)
  605.     {
  606.       // It is second (third, ...) SELECT of UNION => All is done
  607.       DBUG_RETURN(RES_OK);
  608.     }
  609.     Item *subs;
  610.     if (!select_lex->group_list.elements &&
  611.         !select_lex->having &&
  612. !select_lex->with_sum_func &&
  613. !(select_lex->next_select()))
  614.     {
  615.       Item_sum_hybrid *item;
  616.       if (func->l_op())
  617.       {
  618. /*
  619.   (ALL && (> || =>)) || (ANY && (< || =<))
  620.   for ALL condition is inverted
  621. */
  622. item= new Item_sum_max(*select_lex->ref_pointer_array);
  623.       }
  624.       else
  625.       {
  626. /*
  627.   (ALL && (< || =<)) || (ANY && (> || =>))
  628.   for ALL condition is inverted
  629. */
  630. item= new Item_sum_min(*select_lex->ref_pointer_array);
  631.       }
  632.       if (upper_item)
  633.         upper_item->set_sum_test(item);
  634.       *select_lex->ref_pointer_array= item;
  635.       {
  636. List_iterator<Item> it(select_lex->item_list);
  637. it++;
  638. it.replace(item);
  639.       }
  640.       /*
  641. Item_sum_(max|min) can't substitute other item => we can use 0 as
  642. reference
  643.       */
  644.       if (item->fix_fields(thd, join->tables_list, 0))
  645. DBUG_RETURN(RES_ERROR);
  646.       /* we added aggregate function => we have to change statistic */
  647.       count_field_types(&join->tmp_table_param, join->all_fields, 0);
  648.       subs= new Item_singlerow_subselect(select_lex);
  649.     }
  650.     else
  651.     {
  652.       Item_maxmin_subselect *item;
  653.       // remove LIMIT placed  by ALL/ANY subquery
  654.       select_lex->master_unit()->global_parameters->select_limit=
  655. HA_POS_ERROR;
  656.       subs= item= new Item_maxmin_subselect(this, select_lex, func->l_op());
  657.       if (upper_item)
  658.         upper_item->set_sub_test(item);
  659.     }
  660.     /* fix fields is already called for  left expression */
  661.     substitution= func->create(left_expr, subs);
  662.     DBUG_RETURN(RES_OK);
  663.   }
  664.   if (!substitution)
  665.   {
  666.     //first call for this unit
  667.     SELECT_LEX_UNIT *unit= select_lex->master_unit();
  668.     substitution= optimizer;
  669.     SELECT_LEX *current= thd->lex->current_select, *up;
  670.     thd->lex->current_select= up= current->return_after_parsing();
  671.     //optimizer never use Item **ref => we can pass 0 as parameter
  672.     if (!optimizer || optimizer->fix_left(thd, up->get_table_list(), 0))
  673.     {
  674.       thd->lex->current_select= current;
  675.       DBUG_RETURN(RES_ERROR);
  676.     }
  677.     thd->lex->current_select= current;
  678.     /*
  679.       As far as  Item_ref_in_optimizer do not substitude itself on fix_fields
  680.       we can use same item for all selects.
  681.     */
  682.     expr= new Item_direct_ref((Item**)optimizer->get_cache(),
  683.       (char *)"<no matter>",
  684.       (char *)in_left_expr_name);
  685.     unit->uncacheable|= UNCACHEABLE_DEPENDENT;
  686.   }
  687.   select_lex->uncacheable|= UNCACHEABLE_DEPENDENT;
  688.   Item *item;
  689.   item= (Item*) select_lex->item_list.head();
  690.   /*
  691.     Add the left part of a subselect to a WHERE or HAVING clause of
  692.     the right part, e.g. SELECT 1 IN (SELECT a FROM t1)  =>
  693.     SELECT Item_in_optimizer(1, SELECT a FROM t1 WHERE a=1)
  694.     HAVING is used only if the right part contains a SUM function, a GROUP
  695.     BY or a HAVING clause.
  696.   */
  697.   if (join->having || select_lex->with_sum_func ||
  698.       select_lex->group_list.elements)
  699.   {
  700.     item= func->create(expr,
  701.        new Item_ref_null_helper(this,
  702. select_lex->ref_pointer_array,
  703. (char *)"<ref>",
  704. this->full_name()));
  705.     /*
  706.       AND and comparison functions can't be changed during fix_fields()
  707.       we can assign select_lex->having here, and pass 0 as last
  708.       argument (reference) to fix_fields()
  709.     */
  710.     select_lex->having= join->having= and_items(join->having, item);
  711.     select_lex->having_fix_field= 1;
  712.     if (join->having->fix_fields(thd, join->tables_list, 0))
  713.     {
  714.       select_lex->having_fix_field= 0;
  715.       DBUG_RETURN(RES_ERROR);
  716.     }
  717.     select_lex->having_fix_field= 0;
  718.   }
  719.   else
  720.   {
  721.     select_lex->item_list.empty();
  722.     select_lex->item_list.push_back(new Item_int("Not_used",
  723.  (longlong) 1, 21));
  724.     select_lex->ref_pointer_array[0]= select_lex->item_list.head();
  725.     if (select_lex->table_list.elements)
  726.     {
  727.       Item *having= item, *orig_item= item;
  728.       item= func->create(expr, item);
  729.       if (!abort_on_null && orig_item->maybe_null)
  730.       {
  731. having= new Item_is_not_null_test(this, having);
  732. /*
  733.   Item_is_not_null_test can't be changed during fix_fields()
  734.   we can assign select_lex->having here, and pass 0 as last
  735.   argument (reference) to fix_fields()
  736. */
  737. select_lex->having=
  738.   join->having= (join->having ?
  739.  new Item_cond_and(having, join->having) :
  740.  having);
  741. select_lex->having_fix_field= 1;
  742. if (join->having->fix_fields(thd, join->tables_list, 0))
  743. {
  744.   select_lex->having_fix_field= 0;
  745.   DBUG_RETURN(RES_ERROR);
  746. }
  747. select_lex->having_fix_field= 0;
  748. item= new Item_cond_or(item,
  749.        new Item_func_isnull(orig_item));
  750.       }
  751.       item->name= (char *)in_additional_cond;
  752.       /*
  753. AND can't be changed during fix_fields()
  754. we can assign select_lex->having here, and pass 0 as last
  755. argument (reference) to fix_fields()
  756.       */
  757.       select_lex->where= join->conds= and_items(join->conds, item);
  758.       select_lex->where->top_level_item();
  759.       if (join->conds->fix_fields(thd, join->tables_list, 0))
  760. DBUG_RETURN(RES_ERROR);
  761.     }
  762.     else
  763.     {
  764.       if (select_lex->master_unit()->first_select()->next_select())
  765.       {
  766. /*
  767.   comparison functions can't be changed during fix_fields()
  768.   we can assign select_lex->having here, and pass 0 as last
  769.   argument (reference) to fix_fields()
  770. */
  771. select_lex->having=
  772.   join->having=
  773.   func->create(expr,
  774.        new Item_null_helper(this, item,
  775.     (char *)"<no matter>",
  776.     (char *)"<result>"));
  777. select_lex->having_fix_field= 1;
  778. if (join->having->fix_fields(thd, join->tables_list,
  779.      0))
  780. {
  781.   select_lex->having_fix_field= 0;
  782.   DBUG_RETURN(RES_ERROR);
  783. }
  784. select_lex->having_fix_field= 0;
  785.       }
  786.       else
  787.       {
  788. // it is single select without tables => possible optimization
  789. item= func->create(left_expr, item);
  790.         // fix_field of item will be done in time of substituting
  791. substitution= item;
  792. have_to_be_excluded= 1;
  793. if (thd->lex->describe)
  794. {
  795.   char warn_buff[MYSQL_ERRMSG_SIZE];
  796.   sprintf(warn_buff, ER(ER_SELECT_REDUCED), select_lex->select_number);
  797.   push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
  798.        ER_SELECT_REDUCED, warn_buff);
  799. }
  800. DBUG_RETURN(RES_REDUCE);
  801.       }
  802.     }
  803.   }
  804.   DBUG_RETURN(RES_OK);
  805. }
  806. Item_subselect::trans_res
  807. Item_in_subselect::row_value_transformer(JOIN *join)
  808. {
  809.   SELECT_LEX *select_lex= join->select_lex;
  810.   Item *having_item= 0;
  811.   uint cols_num= left_expr->cols();
  812.   bool is_having_used= (join->having || select_lex->with_sum_func ||
  813.                         select_lex->group_list.first ||
  814.                         !select_lex->table_list.elements);
  815.   DBUG_ENTER("Item_in_subselect::row_value_transformer");
  816.   if (select_lex->item_list.elements != left_expr->cols())
  817.   {
  818.     my_error(ER_OPERAND_COLUMNS, MYF(0), left_expr->cols());
  819.     DBUG_RETURN(RES_ERROR);
  820.   }
  821.   if (!substitution)
  822.   {
  823.     //first call for this unit
  824.     SELECT_LEX_UNIT *unit= select_lex->master_unit();
  825.     substitution= optimizer;
  826.     SELECT_LEX *current= thd->lex->current_select, *up;
  827.     thd->lex->current_select= up= current->return_after_parsing();
  828.     //optimizer never use Item **ref => we can pass 0 as parameter
  829.     if (!optimizer || optimizer->fix_left(thd, up->get_table_list(), 0))
  830.     {
  831.       thd->lex->current_select= current;
  832.       DBUG_RETURN(RES_ERROR);
  833.     }
  834.     // we will refer to apper level cache array => we have to save it in PS
  835.     optimizer->keep_top_level_cache();
  836.     thd->lex->current_select= current;
  837.     unit->uncacheable|= UNCACHEABLE_DEPENDENT;
  838.   }
  839.   select_lex->uncacheable|= UNCACHEABLE_DEPENDENT;
  840.   if (is_having_used)
  841.   {
  842.     /*
  843.       (l1, l2, l3) IN (SELECT v1, v2, v3 ... HAVING having) =>
  844.       EXISTS (SELECT ... HAVING having and
  845.                                 (l1 = v1 or is null v1) and
  846.                                 (l2 = v2 or is null v2) and
  847.                                 (l3 = v3 or is null v3) and
  848.                                 is_not_null_test(v1) and
  849.                                 is_not_null_test(v2) and
  850.                                 is_not_null_test(v3))
  851.       where is_not_null_test used to register nulls in case if we have
  852.       not found matching to return correct NULL value
  853.     */
  854.     Item *item_having_part2= 0;
  855.     for (uint i= 0; i < cols_num; i++)
  856.     {
  857.       DBUG_ASSERT(left_expr->fixed && select_lex->ref_pointer_array[i]->fixed);
  858.       if (select_lex->ref_pointer_array[i]->
  859.           check_cols(left_expr->el(i)->cols()))
  860.         DBUG_RETURN(RES_ERROR);
  861.       Item *item_eq=
  862.         new Item_func_eq(new
  863.                          Item_direct_ref((*optimizer->get_cache())->
  864.                                          addr(i),
  865.                                          (char *)"<no matter>",
  866.                                          (char *)in_left_expr_name),
  867.                          new
  868.                          Item_direct_ref(select_lex->ref_pointer_array + i,
  869.                                          (char *)"<no matter>",
  870.                                          (char *)"<list ref>")
  871.                         );
  872.       Item *item_isnull=
  873.         new Item_func_isnull(new
  874.                              Item_direct_ref( select_lex->
  875.                                               ref_pointer_array+i,
  876.                                               (char *)"<no matter>",
  877.                                               (char *)"<list ref>")
  878.                             );
  879.       having_item=
  880.         and_items(having_item,
  881.                   new Item_cond_or(item_eq, item_isnull));
  882.       item_having_part2=
  883.         and_items(item_having_part2,
  884.                   new
  885.                   Item_is_not_null_test(this,
  886.                                         new
  887.                                         Item_direct_ref(select_lex->
  888.                                                         ref_pointer_array + i,
  889.                                                         (char *)"<no matter>",
  890.                                                         (char *)"<list ref>")
  891.                                        )
  892.                  );
  893.       item_having_part2->top_level_item();
  894.     }
  895.     having_item= and_items(having_item, item_having_part2);
  896.     having_item->top_level_item();
  897.   }
  898.   else
  899.   {
  900.     /*
  901.       (l1, l2, l3) IN (SELECT v1, v2, v3 ... WHERE where) =>
  902.       EXISTS (SELECT ... WHERE where and
  903.                                (l1 = v1 or is null v1) and
  904.                                (l2 = v2 or is null v2) and
  905.                                (l3 = v3 or is null v3)
  906.                          HAVING is_not_null_test(v1) and
  907.                                 is_not_null_test(v2) and
  908.                                 is_not_null_test(v3))
  909.       where is_not_null_test register NULLs values but reject rows
  910.       in case when we do not need correct NULL, we have simplier construction:
  911.       EXISTS (SELECT ... WHERE where and
  912.                                (l1 = v1) and
  913.                                (l2 = v2) and
  914.                                (l3 = v3)
  915.     */
  916.     Item *where_item= 0;
  917.     for (uint i= 0; i < cols_num; i++)
  918.     {
  919.       Item *item, *item_isnull;
  920.       DBUG_ASSERT(left_expr->fixed && select_lex->ref_pointer_array[i]->fixed);
  921.       if (select_lex->ref_pointer_array[i]->
  922.           check_cols(left_expr->el(i)->cols()))
  923.         DBUG_RETURN(RES_ERROR);
  924.       item=
  925.         new Item_func_eq(new
  926.                          Item_direct_ref((*optimizer->get_cache())->
  927.                                          addr(i),
  928.                                          (char *)"<no matter>",
  929.                                          (char *)in_left_expr_name),
  930.                          new
  931.                          Item_direct_ref( select_lex->
  932.                                           ref_pointer_array+i,
  933.                                           (char *)"<no matter>",
  934.                                           (char *)"<list ref>")
  935.                         );
  936.       if (!abort_on_null)
  937.       {
  938.         having_item=
  939.           and_items(having_item,
  940.                     new
  941.                     Item_is_not_null_test(this,
  942.                                           new
  943.                                           Item_direct_ref(select_lex->
  944.                                                           ref_pointer_array + i,
  945.                                                           (char *)"<no matter>",
  946.                                                           (char *)"<list ref>")
  947.                                          )
  948.                   );
  949.         item_isnull= new
  950.           Item_func_isnull(new
  951.                            Item_direct_ref( select_lex->
  952.                                             ref_pointer_array+i,
  953.                                             (char *)"<no matter>",
  954.                                             (char *)"<list ref>")
  955.                           );
  956.         item= new Item_cond_or(item, item_isnull);
  957.       }
  958.       where_item= and_items(where_item, item);
  959.     }
  960.     /*
  961.       AND can't be changed during fix_fields()
  962.       we can assign select_lex->where here, and pass 0 as last
  963.       argument (reference) to fix_fields()
  964.     */
  965.     select_lex->where= join->conds= and_items(join->conds, where_item);
  966.     select_lex->where->top_level_item();
  967.     if (join->conds->fix_fields(thd, join->tables_list, 0))
  968.       DBUG_RETURN(RES_ERROR);
  969.   }
  970.   if (having_item)
  971.   {
  972.     bool res;
  973.     select_lex->having= join->having= and_items(join->having, having_item);
  974.     select_lex->having->top_level_item();
  975.     /*
  976.       AND can't be changed during fix_fields()
  977.       we can assign select_lex->having here, and pass 0 as last
  978.       argument (reference) to fix_fields()
  979.     */
  980.     select_lex->having_fix_field= 1;
  981.     res= join->having->fix_fields(thd, join->tables_list, 0);
  982.     select_lex->having_fix_field= 0;
  983.     if (res)
  984.     {
  985.       DBUG_RETURN(RES_ERROR);
  986.     }
  987.   }
  988.   DBUG_RETURN(RES_OK);
  989. }
  990. Item_subselect::trans_res
  991. Item_in_subselect::select_transformer(JOIN *join)
  992. {
  993.   return select_in_like_transformer(join, &eq_creator);
  994. }
  995. /*
  996.   Prepare IN/ALL/ANY/SOME subquery transformation and call appropriate
  997.   transformation function
  998.   SYNOPSIS
  999.     Item_in_subselect::select_in_like_transformer()
  1000.     join    JOIN object of transforming subquery
  1001.     func    creator of condition function of subquery
  1002.   DESCRIPTION
  1003.     To decide which transformation procedure (scalar or row) applicable here
  1004.     we have to call fix_fields() for left expression to be able to call
  1005.     cols() method on it. Also this method make arena management for
  1006.     underlying transformation methods.
  1007.   RETURN
  1008.     RES_OK      OK
  1009.     RES_REDUCE  OK, and current subquery was reduced during transformation
  1010.     RES_ERROR   Error
  1011. */
  1012. Item_subselect::trans_res
  1013. Item_in_subselect::select_in_like_transformer(JOIN *join, Comp_creator *func)
  1014. {
  1015.   Item_arena *arena, backup;
  1016.   SELECT_LEX *current= thd->lex->current_select, *up;
  1017.   const char *save_where= thd->where;
  1018.   Item_subselect::trans_res res= RES_ERROR;
  1019.   bool result;
  1020.   DBUG_ENTER("Item_in_subselect::select_in_like_transformer");
  1021.   if (changed)
  1022.   {
  1023.     DBUG_RETURN(RES_OK);
  1024.   }
  1025.   thd->where= "IN/ALL/ANY subquery";
  1026.   /*
  1027.     In some optimisation cases we will not need this Item_in_optimizer
  1028.     object, but we can't know it here, but here we need address correct
  1029.     reference on left expresion.
  1030.   */
  1031.   if (!optimizer)
  1032.   {
  1033.     arena= thd->change_arena_if_needed(&backup);
  1034.     result= (!(optimizer= new Item_in_optimizer(left_expr, this)));
  1035.     if (arena)
  1036.       thd->restore_backup_item_arena(arena, &backup);
  1037.     if (result)
  1038.       goto err;
  1039.   }
  1040.   thd->lex->current_select= up= current->return_after_parsing();
  1041.   result= (!left_expr->fixed &&
  1042.            left_expr->fix_fields(thd, up->get_table_list(),
  1043.                                  optimizer->arguments()));
  1044.   /* fix_fields can change reference to left_expr, we need reassign it */
  1045.   left_expr= optimizer->arguments()[0];
  1046.   thd->lex->current_select= current;
  1047.   if (result)
  1048.     goto err;
  1049.   transformed= 1;
  1050.   arena= thd->change_arena_if_needed(&backup);
  1051.   /*
  1052.     Both transformers call fix_fields() only for Items created inside them,
  1053.     and all that items do not make permanent changes in current item arena
  1054.     which allow to us call them with changed arena (if we do not know nature
  1055.     of Item, we have to call fix_fields() for it only with original arena to
  1056.     avoid memory leack)
  1057.   */
  1058.   if (left_expr->cols() == 1)
  1059.     res= single_value_transformer(join, func);
  1060.   else
  1061.   {
  1062.     /* we do not support row operation for ALL/ANY/SOME */
  1063.     if (func != &eq_creator)
  1064.     {
  1065.       if (arena)
  1066.         thd->restore_backup_item_arena(arena, &backup);
  1067.       my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
  1068.       DBUG_RETURN(RES_ERROR);
  1069.     }
  1070.     res= row_value_transformer(join);
  1071.   }
  1072.   if (arena)
  1073.     thd->restore_backup_item_arena(arena, &backup);
  1074. err:
  1075.   thd->where= save_where;
  1076.   DBUG_RETURN(res);
  1077. }
  1078. void Item_in_subselect::print(String *str)
  1079. {
  1080.   if (transformed)
  1081.     str->append("<exists>", 8);
  1082.   else
  1083.   {
  1084.     left_expr->print(str);
  1085.     str->append(" in ", 4);
  1086.   }
  1087.   Item_subselect::print(str);
  1088. }
  1089. Item_subselect::trans_res
  1090. Item_allany_subselect::select_transformer(JOIN *join)
  1091. {
  1092.   transformed= 1;
  1093.   if (upper_item)
  1094.     upper_item->show= 1;
  1095.   return select_in_like_transformer(join, func);
  1096. }
  1097. void Item_allany_subselect::print(String *str)
  1098. {
  1099.   if (transformed)
  1100.     str->append("<exists>", 8);
  1101.   else
  1102.   {
  1103.     left_expr->print(str);
  1104.     str->append(' ');
  1105.     str->append(func->symbol(all));
  1106.     str->append(all ? " all " : " any ", 5);
  1107.   }
  1108.   Item_subselect::print(str);
  1109. }
  1110. subselect_single_select_engine::
  1111. subselect_single_select_engine(st_select_lex *select,
  1112.        select_subselect *result,
  1113.        Item_subselect *item)
  1114.   :subselect_engine(item, result),
  1115.    prepared(0), optimized(0), executed(0), join(0)
  1116. {
  1117.   select_lex= select;
  1118.   SELECT_LEX_UNIT *unit= select_lex->master_unit();
  1119.   unit->offset_limit_cnt= unit->global_parameters->offset_limit;
  1120.   unit->select_limit_cnt= unit->global_parameters->select_limit+
  1121.     unit->global_parameters ->offset_limit;
  1122.   if (unit->select_limit_cnt < unit->global_parameters->select_limit)
  1123.     unit->select_limit_cnt= HA_POS_ERROR; // no limit
  1124.   if (unit->select_limit_cnt == HA_POS_ERROR)
  1125.     select_lex->options&= ~OPTION_FOUND_ROWS;
  1126.   unit->item= item;
  1127.   this->select_lex= select_lex;
  1128. }
  1129. void subselect_single_select_engine::cleanup()
  1130. {
  1131.   DBUG_ENTER("subselect_single_select_engine::cleanup");
  1132.   prepared= optimized= executed= 0;
  1133.   join= 0;
  1134.   result->cleanup();
  1135.   DBUG_VOID_RETURN;
  1136. }
  1137. void subselect_union_engine::cleanup()
  1138. {
  1139.   DBUG_ENTER("subselect_union_engine::cleanup");
  1140.   unit->reinit_exec_mechanism();
  1141.   result->cleanup();
  1142.   DBUG_VOID_RETURN;
  1143. }
  1144. void subselect_uniquesubquery_engine::cleanup()
  1145. {
  1146.   DBUG_ENTER("subselect_uniquesubquery_engine::cleanup");
  1147.   /*
  1148.     subselect_uniquesubquery_engine have not 'result' assigbed, so we do not
  1149.     cleanup() it
  1150.   */
  1151.   DBUG_VOID_RETURN;
  1152. }
  1153. subselect_union_engine::subselect_union_engine(st_select_lex_unit *u,
  1154.        select_subselect *result_arg,
  1155.        Item_subselect *item_arg)
  1156.   :subselect_engine(item_arg, result_arg)
  1157. {
  1158.   unit= u;
  1159.   if (!result_arg) //out of memory
  1160.     current_thd->fatal_error();
  1161.   unit->item= item_arg;
  1162. }
  1163. int subselect_single_select_engine::prepare()
  1164. {
  1165.   if (prepared)
  1166.     return 0;
  1167.   join= new JOIN(thd, select_lex->item_list,
  1168.  select_lex->options | SELECT_NO_UNLOCK, result);
  1169.   if (!join || !result)
  1170.   {
  1171.     thd->fatal_error(); //out of memory
  1172.     return 1;
  1173.   }
  1174.   prepared= 1;
  1175.   SELECT_LEX *save_select= thd->lex->current_select;
  1176.   thd->lex->current_select= select_lex;
  1177.   if (join->prepare(&select_lex->ref_pointer_array,
  1178.     (TABLE_LIST*) select_lex->table_list.first,
  1179.     select_lex->with_wild,
  1180.     select_lex->where,
  1181.     select_lex->order_list.elements +
  1182.     select_lex->group_list.elements,
  1183.     (ORDER*) select_lex->order_list.first,
  1184.     (ORDER*) select_lex->group_list.first,
  1185.     select_lex->having,
  1186.     (ORDER*) 0, select_lex,
  1187.     select_lex->master_unit()))
  1188.     return 1;
  1189.   thd->lex->current_select= save_select;
  1190.   return 0;
  1191. }
  1192. int subselect_union_engine::prepare()
  1193. {
  1194.   return unit->prepare(thd, result, SELECT_NO_UNLOCK, "");
  1195. }
  1196. int subselect_uniquesubquery_engine::prepare()
  1197. {
  1198.   //this never should be called
  1199.   DBUG_ASSERT(0);
  1200.   return 1;
  1201. }
  1202. static Item_result set_row(List<Item> &item_list, Item *item,
  1203.    Item_cache **row, bool *maybe_null)
  1204. {
  1205.   Item_result res_type= STRING_RESULT;
  1206.   Item *sel_item;
  1207.   List_iterator_fast<Item> li(item_list);
  1208.   for (uint i= 0; (sel_item= li++); i++)
  1209.   {
  1210.     item->max_length= sel_item->max_length;
  1211.     res_type= sel_item->result_type();
  1212.     item->decimals= sel_item->decimals;
  1213.     *maybe_null= sel_item->maybe_null;
  1214.     if (!(row[i]= Item_cache::get_cache(res_type)))
  1215.       return STRING_RESULT; // we should return something
  1216.     row[i]->setup(sel_item);
  1217.   }
  1218.   if (item_list.elements > 1)
  1219.     res_type= ROW_RESULT;
  1220.   return res_type;
  1221. }
  1222. void subselect_single_select_engine::fix_length_and_dec(Item_cache **row)
  1223. {
  1224.   DBUG_ASSERT(row || select_lex->item_list.elements==1);
  1225.   res_type= set_row(select_lex->item_list, item, row, &maybe_null);
  1226.   item->collation.set(row[0]->collation);
  1227.   if (cols() != 1)
  1228.     maybe_null= 0;
  1229. }
  1230. void subselect_union_engine::fix_length_and_dec(Item_cache **row)
  1231. {
  1232.   DBUG_ASSERT(row || unit->first_select()->item_list.elements==1);
  1233.   if (unit->first_select()->item_list.elements == 1)
  1234.   {
  1235.     res_type= set_row(unit->types, item, row, &maybe_null);
  1236.     item->collation.set(row[0]->collation);
  1237.   }
  1238.   else
  1239.   {
  1240.     bool fake= 0;
  1241.     res_type= set_row(unit->types, item, row, &fake);
  1242.   }
  1243. }
  1244. void subselect_uniquesubquery_engine::fix_length_and_dec(Item_cache **row)
  1245. {
  1246.   //this never should be called
  1247.   DBUG_ASSERT(0);
  1248. }
  1249. int subselect_single_select_engine::exec()
  1250. {
  1251.   DBUG_ENTER("subselect_single_select_engine::exec");
  1252.   char const *save_where= join->thd->where;
  1253.   SELECT_LEX *save_select= join->thd->lex->current_select;
  1254.   join->thd->lex->current_select= select_lex;
  1255.   if (!optimized)
  1256.   {
  1257.     optimized=1;
  1258.     if (join->optimize())
  1259.     {
  1260.       join->thd->where= save_where;
  1261.       executed= 1;
  1262.       join->thd->lex->current_select= save_select;
  1263.       DBUG_RETURN(join->error ? join->error : 1);
  1264.     }
  1265.     if (item->engine_changed)
  1266.     {
  1267.       DBUG_RETURN(1);
  1268.     }
  1269.   }
  1270.   if (select_lex->uncacheable && executed)
  1271.   {
  1272.     if (join->reinit())
  1273.     {
  1274.       join->thd->where= save_where;
  1275.       join->thd->lex->current_select= save_select;
  1276.       DBUG_RETURN(1);
  1277.     }
  1278.     item->reset();
  1279.     item->assigned((executed= 0));
  1280.   }
  1281.   if (!executed)
  1282.   {
  1283.     item->reset_value_registration();
  1284.     join->exec();
  1285.     executed= 1;
  1286.     join->thd->where= save_where;
  1287.     join->thd->lex->current_select= save_select;
  1288.     DBUG_RETURN(join->error||thd->is_fatal_error);
  1289.   }
  1290.   join->thd->where= save_where;
  1291.   join->thd->lex->current_select= save_select;
  1292.   DBUG_RETURN(0);
  1293. }
  1294. int subselect_union_engine::exec()
  1295. {
  1296.   char const *save_where= unit->thd->where;
  1297.   int res= unit->exec();
  1298.   unit->thd->where= save_where;
  1299.   return res;
  1300. }
  1301. int subselect_uniquesubquery_engine::exec()
  1302. {
  1303.   DBUG_ENTER("subselect_uniquesubquery_engine::exec");
  1304.   int error;
  1305.   TABLE *table= tab->table;
  1306.   for (store_key **copy=tab->ref.key_copy ; *copy ; copy++)
  1307.   {
  1308.     if ((tab->ref.key_err= (*copy)->copy()) & 1)
  1309.     {
  1310.       table->status= STATUS_NOT_FOUND;
  1311.       DBUG_RETURN(1);
  1312.     }
  1313.   }
  1314.   if (!table->file->inited)
  1315.     table->file->ha_index_init(tab->ref.key);
  1316.   error= table->file->index_read(table->record[0],
  1317.                                  tab->ref.key_buff,
  1318.                                  tab->ref.key_length,HA_READ_KEY_EXACT);
  1319.   if (error &&
  1320.       error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
  1321.     error= report_error(table, error);
  1322.   else
  1323.   {
  1324.     error= 0;
  1325.     table->null_row= 0;
  1326.     ((Item_in_subselect *) item)->value= (!table->status &&
  1327.                                           (!cond || cond->val_int()) ? 1 :
  1328.                                           0);
  1329.   }
  1330.   DBUG_RETURN(error != 0);
  1331. }
  1332. subselect_uniquesubquery_engine::~subselect_uniquesubquery_engine()
  1333. {
  1334.   /* Tell handler we don't need the index anymore */
  1335.   tab->table->file->ha_index_end();
  1336. }
  1337. int subselect_indexsubquery_engine::exec()
  1338. {
  1339.   DBUG_ENTER("subselect_indexsubselect_engine::exec");
  1340.   int error;
  1341.   bool null_finding= 0;
  1342.   TABLE *table= tab->table;
  1343.   ((Item_in_subselect *) item)->value= 0;
  1344.   if (check_null)
  1345.   {
  1346.     /* We need to check for NULL if there wasn't a matching value */
  1347.     *tab->ref.null_ref_key= 0; // Search first for not null
  1348.     ((Item_in_subselect *) item)->was_null= 0;
  1349.   }
  1350.   for (store_key **copy=tab->ref.key_copy ; *copy ; copy++)
  1351.   {
  1352.     if ((tab->ref.key_err= (*copy)->copy()) & 1)
  1353.     {
  1354.       table->status= STATUS_NOT_FOUND;
  1355.       DBUG_RETURN(1);
  1356.     }
  1357.   }
  1358.   if (!table->file->inited)
  1359.     table->file->ha_index_init(tab->ref.key);
  1360.   error= table->file->index_read(table->record[0],
  1361.                                  tab->ref.key_buff,
  1362.                                  tab->ref.key_length,HA_READ_KEY_EXACT);
  1363.   if (error &&
  1364.       error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
  1365.     error= report_error(table, error);
  1366.   else
  1367.   {
  1368.     for (;;)
  1369.     {
  1370.       error= 0;
  1371.       table->null_row= 0;
  1372.       if (!table->status)
  1373.       {
  1374.         if (!cond || cond->val_int())
  1375.         {
  1376.           if (null_finding)
  1377.             ((Item_in_subselect *) item)->was_null= 1;
  1378.           else
  1379.             ((Item_in_subselect *) item)->value= 1;
  1380.           break;
  1381.         }
  1382.         error= table->file->index_next_same(table->record[0],
  1383.                                             tab->ref.key_buff,
  1384.                                             tab->ref.key_length);
  1385.         if (error && error != HA_ERR_END_OF_FILE)
  1386.         {
  1387.           error= report_error(table, error);
  1388.           break;
  1389.         }
  1390.       }
  1391.       else
  1392.       {
  1393.         if (!check_null || null_finding)
  1394.           break; /* We don't need to check nulls */
  1395.         *tab->ref.null_ref_key= 1;
  1396.         null_finding= 1;
  1397.         /* Check if there exists a row with a null value in the index */
  1398.         if ((error= (safe_index_read(tab) == 1)))
  1399.           break;
  1400.       }
  1401.     }
  1402.   }
  1403.   DBUG_RETURN(error != 0);
  1404. }
  1405. uint subselect_single_select_engine::cols()
  1406. {
  1407.   DBUG_ASSERT(select_lex->join); // should be called after fix_fields()
  1408.   return select_lex->join->fields_list.elements;
  1409. }
  1410. uint subselect_union_engine::cols()
  1411. {
  1412.   DBUG_ASSERT(unit->is_prepared());  // should be called after fix_fields()
  1413.   return unit->types.elements;
  1414. }
  1415. uint8 subselect_single_select_engine::uncacheable()
  1416. {
  1417.   return select_lex->uncacheable;
  1418. }
  1419. uint8 subselect_union_engine::uncacheable()
  1420. {
  1421.   return unit->uncacheable;
  1422. }
  1423. void subselect_single_select_engine::exclude()
  1424. {
  1425.   select_lex->master_unit()->exclude_level();
  1426. }
  1427. void subselect_union_engine::exclude()
  1428. {
  1429.   unit->exclude_level();
  1430. }
  1431. void subselect_uniquesubquery_engine::exclude()
  1432. {
  1433.   //this never should be called
  1434.   DBUG_ASSERT(0);
  1435. }
  1436. table_map subselect_engine::calc_const_tables(TABLE_LIST *table)
  1437. {
  1438.   table_map map= 0;
  1439.   for (; table; table= table->next)
  1440.   {
  1441.     TABLE *tbl= table->table;
  1442.     if (tbl && tbl->const_table)
  1443.       map|= tbl->map;
  1444.   }
  1445.   return map;
  1446. }
  1447. table_map subselect_single_select_engine::upper_select_const_tables()
  1448. {
  1449.   return calc_const_tables((TABLE_LIST *) select_lex->outer_select()->
  1450.    table_list.first);
  1451. }
  1452. table_map subselect_union_engine::upper_select_const_tables()
  1453. {
  1454.   return calc_const_tables((TABLE_LIST *) unit->outer_select()->
  1455.    table_list.first);
  1456. }
  1457. void subselect_single_select_engine::print(String *str)
  1458. {
  1459.   select_lex->print(thd, str);
  1460. }
  1461. void subselect_union_engine::print(String *str)
  1462. {
  1463.   unit->print(str);
  1464. }
  1465. void subselect_uniquesubquery_engine::print(String *str)
  1466. {
  1467.   str->append("<primary_index_lookup>(", 23);
  1468.   tab->ref.items[0]->print(str);
  1469.   str->append(" in ", 4);
  1470.   str->append(tab->table->real_name);
  1471.   KEY *key_info= tab->table->key_info+ tab->ref.key;
  1472.   str->append(" on ", 4);
  1473.   str->append(key_info->name);
  1474.   if (cond)
  1475.   {
  1476.     str->append(" where ", 7);
  1477.     cond->print(str);
  1478.   }
  1479.   str->append(')');
  1480. }
  1481. void subselect_indexsubquery_engine::print(String *str)
  1482. {
  1483.   str->append("<index_lookup>(", 15);
  1484.   tab->ref.items[0]->print(str);
  1485.   str->append(" in ", 4);
  1486.   str->append(tab->table->real_name);
  1487.   KEY *key_info= tab->table->key_info+ tab->ref.key;
  1488.   str->append(" on ", 4);
  1489.   str->append(key_info->name);
  1490.   if (check_null)
  1491.     str->append(" chicking NULL", 14);
  1492.     if (cond)
  1493.   {
  1494.     str->append(" where ", 7);
  1495.     cond->print(str);
  1496.   }
  1497.   str->append(')');
  1498. }
  1499. /*
  1500.   change select_result object of engine
  1501.   SINOPSYS
  1502.     subselect_single_select_engine::change_result()
  1503.     si new subselect Item
  1504.     res new select_result object
  1505.   RETURN
  1506.     0  OK
  1507.     -1 error
  1508. */
  1509. int subselect_single_select_engine::change_item(Item_subselect *si,
  1510. select_subselect *res)
  1511. {
  1512.   item= si;
  1513.   result= res;
  1514.   return select_lex->join->change_result(result);
  1515. }
  1516. /*
  1517.   change select_result object of engine
  1518.   SINOPSYS
  1519.     subselect_single_select_engine::change_result()
  1520.     si new subselect Item
  1521.     res new select_result object
  1522.   RETURN
  1523.     0  OK
  1524.     -1 error
  1525. */
  1526. int subselect_union_engine::change_item(Item_subselect *si,
  1527. select_subselect *res)
  1528. {
  1529.   item= si;
  1530.   int rc= unit->change_result(res, result);
  1531.   result= res;
  1532.   return rc;
  1533. }
  1534. /*
  1535.   change select_result emulation, never should be called
  1536.   SINOPSYS
  1537.     subselect_single_select_engine::change_result()
  1538.     si new subselect Item
  1539.     res new select_result object
  1540.   RETURN
  1541.     -1 error
  1542. */
  1543. int subselect_uniquesubquery_engine::change_item(Item_subselect *si,
  1544.  select_subselect *res)
  1545. {
  1546.   DBUG_ASSERT(0);
  1547.   return -1;
  1548. }
  1549. /*
  1550.   Report about presence of tables in subquery
  1551.   SINOPSYS
  1552.     subselect_single_select_engine::no_tables()
  1553.   RETURN
  1554.     TRUE  there are not tables used in subquery
  1555.     FALSE there are some tables in subquery
  1556. */
  1557. bool subselect_single_select_engine::no_tables()
  1558. {
  1559.   return(select_lex->table_list.elements == 0);
  1560. }
  1561. /*
  1562.   Report about presence of tables in subquery
  1563.   SINOPSYS
  1564.     subselect_union_engine::no_tables()
  1565.   RETURN
  1566.     TRUE  there are not tables used in subquery
  1567.     FALSE there are some tables in subquery
  1568. */
  1569. bool subselect_union_engine::no_tables()
  1570. {
  1571.   for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
  1572.   {
  1573.     if (sl->table_list.elements)
  1574.       return FALSE;
  1575.   }
  1576.   return TRUE;
  1577. }
  1578. /*
  1579.   Report about presence of tables in subquery
  1580.   SINOPSYS
  1581.     subselect_uniquesubquery_engine::no_tables()
  1582.   RETURN
  1583.     TRUE  there are not tables used in subquery
  1584.     FALSE there are some tables in subquery
  1585. */
  1586. bool subselect_uniquesubquery_engine::no_tables()
  1587. {
  1588.   /* returning value is correct, but this method should never be called */
  1589.   return 0;
  1590. }