item_row.cc 2.74 KB
Newer Older
unknown's avatar
unknown committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/* Copyright (C) 2000 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#include "mysql_priv.h"

Item_row::Item_row(List<Item> &arg):
20
  Item(), used_tables_cache(0), array_holder(1), const_item_cache(1)
unknown's avatar
unknown committed
21
{
unknown's avatar
unknown committed
22 23

  //TODO: think placing 2-3 component items in item (as it done for function)
unknown's avatar
unknown committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
  if ((arg_count= arg.elements))
    items= (Item**) sql_alloc(sizeof(Item*)*arg_count);
  else
    items= 0;
  List_iterator<Item> li(arg);
  uint i= 0;
  Item *item;
  while ((item= li++))
  {
    items[i]= item;
    i++;    
  }
}

void Item_row::illegal_method_call(const char *method)
{
  DBUG_ENTER("Item_row::illegal_method_call");
  DBUG_PRINT("error", ("!!! %s method was called for row item", method));
  DBUG_ASSERT(0);
unknown's avatar
unknown committed
43
  my_error(ER_CARDINALITY_COL, MYF(0), 1);
unknown's avatar
unknown committed
44 45 46 47 48
  DBUG_VOID_RETURN;
}

bool Item_row::fix_fields(THD *thd, TABLE_LIST *tabl, Item **ref)
{
unknown's avatar
unknown committed
49 50
  null_value= 0;
  maybe_null= 0;
unknown's avatar
unknown committed
51 52 53 54
  for (uint i= 0; i < arg_count; i++)
  {
    if (items[i]->fix_fields(thd, tabl, items+i))
      return 1;
unknown's avatar
unknown committed
55
    used_tables_cache |= items[i]->used_tables();
unknown's avatar
unknown committed
56
    if (const_item_cache&= items[i]->const_item() && !with_null)
unknown's avatar
unknown committed
57
    {
unknown's avatar
unknown committed
58 59 60 61 62 63 64
      if (items[i]->cols() > 1)
	with_null|= items[i]->null_inside();
      else
      {
	items[i]->val_int();
	with_null|= items[i]->null_value;
      }
unknown's avatar
unknown committed
65
    }
unknown's avatar
unknown committed
66
    maybe_null|= items[i]->maybe_null;
unknown's avatar
unknown committed
67 68 69 70
  }
  return 0;
}

unknown's avatar
unknown committed
71 72 73 74 75 76 77 78 79 80 81 82
void Item_row::update_used_tables()
{
  used_tables_cache= 0;
  const_item_cache= 1;
  for (uint i= 0; i < arg_count; i++)
  {
    items[i]->update_used_tables();
    used_tables_cache|= items[i]->used_tables();
    const_item_cache&= items[i]->const_item();
  }
}

unknown's avatar
unknown committed
83 84 85 86
bool Item_row::check_cols(uint c)
{
  if (c != arg_count)
  {
unknown's avatar
unknown committed
87
    my_error(ER_CARDINALITY_COL, MYF(0), c);
unknown's avatar
unknown committed
88 89 90 91
    return 1;
  }
  return 0;
}
unknown's avatar
unknown committed
92

unknown's avatar
unknown committed
93 94 95 96
void Item_row::bring_value()
{
  for (uint i= 0; i < arg_count; i++)
    items[i]->bring_value();
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
}

void Item_row::set_outer_resolving()
{
  for (uint i= 0; i < arg_count; i++)
    items[i]->set_outer_resolving();
}

bool Item_row::check_loop(uint id)
{
  if (Item::check_loop(id))
    return 1;
  for (uint i= 0; i < arg_count; i++)
    if (items[i]->check_loop(id))
      return 1;
  return 0;
unknown's avatar
unknown committed
113
}