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

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. #include "mysql_priv.h"
  14. /*
  15.   Row items used for comparing rows and IN operations on rows:
  16.   (a, b, c) > (10, 10, 30)
  17.   (a, b, c) = (select c, d, e, from t1 where x=12)
  18.   (a, b, c) IN ((1,2,2), (3,4,5), (6,7,8)
  19.   (a, b, c) IN (select c, d, e, from t1)
  20. */
  21. Item_row::Item_row(List<Item> &arg):
  22.   Item(), used_tables_cache(0), array_holder(1), const_item_cache(1), with_null(0)
  23. {
  24.   //TODO: think placing 2-3 component items in item (as it done for function)
  25.   if ((arg_count= arg.elements))
  26.     items= (Item**) sql_alloc(sizeof(Item*)*arg_count);
  27.   else
  28.     items= 0;
  29.   List_iterator<Item> li(arg);
  30.   uint i= 0;
  31.   Item *item;
  32.   while ((item= li++))
  33.   {
  34.     items[i]= item;
  35.     i++;    
  36.   }
  37. }
  38. void Item_row::illegal_method_call(const char *method)
  39. {
  40.   DBUG_ENTER("Item_row::illegal_method_call");
  41.   DBUG_PRINT("error", ("!!! %s method was called for row item", method));
  42.   DBUG_ASSERT(0);
  43.   my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
  44.   DBUG_VOID_RETURN;
  45. }
  46. bool Item_row::fix_fields(THD *thd, TABLE_LIST *tabl, Item **ref)
  47. {
  48.   DBUG_ASSERT(fixed == 0);
  49.   null_value= 0;
  50.   maybe_null= 0;
  51.   Item **arg, **arg_end;
  52.   for (arg= items, arg_end= items+arg_count; arg != arg_end ; arg++)
  53.   {
  54.     if ((*arg)->fix_fields(thd, tabl, arg))
  55.       return 1;
  56.     // we can't assign 'item' before, because fix_fields() can change arg
  57.     Item *item= *arg;
  58.     used_tables_cache |= item->used_tables();
  59.     const_item_cache&= item->const_item() && !with_null;
  60.     if (const_item_cache)
  61.     {
  62.       if (item->cols() > 1)
  63. with_null|= item->null_inside();
  64.       else
  65.       {
  66. item->val_int();
  67. with_null|= item->null_value;
  68.       }
  69.     }
  70.     maybe_null|= item->maybe_null;
  71.     with_sum_func= with_sum_func || item->with_sum_func;
  72.   }
  73.   fixed= 1;
  74.   return 0;
  75. }
  76. void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array,
  77.                               List<Item> &fields)
  78. {
  79.   Item **arg, **arg_end;
  80.   for (arg= items, arg_end= items+arg_count; arg != arg_end ; arg++)
  81.     (*arg)->split_sum_func2(thd, ref_pointer_array, fields, arg);
  82. }
  83. void Item_row::update_used_tables()
  84. {
  85.   used_tables_cache= 0;
  86.   const_item_cache= 1;
  87.   for (uint i= 0; i < arg_count; i++)
  88.   {
  89.     items[i]->update_used_tables();
  90.     used_tables_cache|= items[i]->used_tables();
  91.     const_item_cache&= items[i]->const_item();
  92.   }
  93. }
  94. bool Item_row::check_cols(uint c)
  95. {
  96.   if (c != arg_count)
  97.   {
  98.     my_error(ER_OPERAND_COLUMNS, MYF(0), c);
  99.     return 1;
  100.   }
  101.   return 0;
  102. }
  103. void Item_row::print(String *str)
  104. {
  105.   str->append('(');
  106.   for (uint i= 0; i < arg_count; i++)
  107.   {
  108.     if (i)
  109.       str->append(',');
  110.     items[i]->print(str);
  111.   }
  112.   str->append(')');
  113. }
  114. bool Item_row::walk(Item_processor processor, byte *arg)
  115. {
  116.   for (uint i= 0; i < arg_count; i++)
  117.   {
  118.     if (items[i]->walk(processor, arg))
  119.       return 1;
  120.   }
  121.   return (this->*processor)(arg);
  122. }
  123. void Item_row::bring_value()
  124. {
  125.   for (uint i= 0; i < arg_count; i++)
  126.     items[i]->bring_value();
  127. }