~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
1 by brian
clean slate
15
1241.9.36 by Monty Taylor
ZOMG. I deleted drizzled/server_includes.h.
16
#include "config.h"
550 by Monty Taylor
Moved error.h into just the files that need it.
17
#include <drizzled/error.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
18
#include <drizzled/session.h>
1 by brian
clean slate
19
584.4.7 by Monty Taylor
Removed a big bank of includes from item.h.
20
#include <drizzled/item/row.h>
21
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
22
namespace drizzled
23
{
1253.1.6 by Monty Taylor
Moved mem_root functions into drizzled::memory:: namespace.
24
1 by brian
clean slate
25
/**
26
  Row items used for comparing rows and IN operations on rows:
27
28
  @verbatim
29
  (a, b, c) > (10, 10, 30)
30
  (a, b, c) = (select c, d, e, from t1 where x=12)
31
  (a, b, c) IN ((1,2,2), (3,4,5), (6,7,8)
32
  (a, b, c) IN (select c, d, e, from t1)
33
  @endverbatim
34
35
  @todo
36
    think placing 2-3 component items in item (as it done for function
37
*/
38
39
Item_row::Item_row(List<Item> &arg):
40
  Item(), used_tables_cache(0), const_item_cache(1), with_null(0)
41
{
42
43
  //TODO: think placing 2-3 component items in item (as it done for function)
44
  if ((arg_count= arg.elements))
1253.1.6 by Monty Taylor
Moved mem_root functions into drizzled::memory:: namespace.
45
    items= (Item**) memory::sql_alloc(sizeof(Item*)*arg_count);
1 by brian
clean slate
46
  else
47
    items= 0;
48
  List_iterator<Item> li(arg);
482 by Brian Aker
Remove uint.
49
  uint32_t i= 0;
1 by brian
clean slate
50
  Item *item;
51
  while ((item= li++))
52
  {
53
    items[i]= item;
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
54
    i++;
1 by brian
clean slate
55
  }
56
}
57
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
58
void Item_row::illegal_method_call(const char *)
1 by brian
clean slate
59
{
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
60
  assert(0);
1 by brian
clean slate
61
  my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
62
  return;
1 by brian
clean slate
63
}
64
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
65
bool Item_row::fix_fields(Session *session, Item **)
1 by brian
clean slate
66
{
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
67
  assert(fixed == 0);
1 by brian
clean slate
68
  null_value= 0;
69
  maybe_null= 0;
70
  Item **arg, **arg_end;
71
  for (arg= items, arg_end= items+arg_count; arg != arg_end ; arg++)
72
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
73
    if ((*arg)->fix_fields(session, arg))
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
74
      return true;
1 by brian
clean slate
75
    // we can't assign 'item' before, because fix_fields() can change arg
76
    Item *item= *arg;
77
    used_tables_cache |= item->used_tables();
78
    const_item_cache&= item->const_item() && !with_null;
79
    if (const_item_cache)
80
    {
81
      if (item->cols() > 1)
82
	with_null|= item->null_inside();
83
      else
84
      {
85
	if (item->is_null())
86
          with_null|= 1;
87
      }
88
    }
89
    maybe_null|= item->maybe_null;
90
    with_sum_func= with_sum_func || item->with_sum_func;
91
  }
92
  fixed= 1;
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
93
  return false;
1 by brian
clean slate
94
}
95
96
97
void Item_row::cleanup()
98
{
99
  Item::cleanup();
100
  /* Reset to the original values */
101
  used_tables_cache= 0;
2060 by Brian Aker
Added native functions into the function table.
102
  const_item_cache= true;
1 by brian
clean slate
103
  with_null= 0;
104
51.1.22 by Jay Pipes
Removed DBUG symbols and fixed TRUE/FALSE
105
  return;
1 by brian
clean slate
106
}
107
108
520.1.22 by Brian Aker
Second pass of thd cleanup
109
void Item_row::split_sum_func(Session *session, Item **ref_pointer_array,
1 by brian
clean slate
110
                              List<Item> &fields)
111
{
112
  Item **arg, **arg_end;
113
  for (arg= items, arg_end= items+arg_count; arg != arg_end ; arg++)
584.4.9 by Monty Taylor
Renamed split_sum_func2 to split_sum_func. It's C++.
114
    (*arg)->split_sum_func(session, ref_pointer_array, fields, arg, true);
1 by brian
clean slate
115
}
116
117
118
void Item_row::update_used_tables()
119
{
120
  used_tables_cache= 0;
2060 by Brian Aker
Added native functions into the function table.
121
  const_item_cache= true;
482 by Brian Aker
Remove uint.
122
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
123
  {
124
    items[i]->update_used_tables();
125
    used_tables_cache|= items[i]->used_tables();
126
    const_item_cache&= items[i]->const_item();
127
  }
128
}
129
846 by Brian Aker
Removing on typedeffed class.
130
void Item_row::fix_after_pullout(Select_Lex *new_parent, Item **)
1 by brian
clean slate
131
{
132
  used_tables_cache= 0;
2060 by Brian Aker
Added native functions into the function table.
133
  const_item_cache= true;
482 by Brian Aker
Remove uint.
134
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
135
  {
136
    items[i]->fix_after_pullout(new_parent, &items[i]);
137
    used_tables_cache|= items[i]->used_tables();
138
    const_item_cache&= items[i]->const_item();
139
  }
140
}
141
482 by Brian Aker
Remove uint.
142
bool Item_row::check_cols(uint32_t c)
1 by brian
clean slate
143
{
144
  if (c != arg_count)
145
  {
146
    my_error(ER_OPERAND_COLUMNS, MYF(0), c);
147
    return 1;
148
  }
149
  return 0;
150
}
151
152
void Item_row::print(String *str, enum_query_type query_type)
153
{
154
  str->append('(');
482 by Brian Aker
Remove uint.
155
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
156
  {
157
    if (i)
158
      str->append(',');
159
    items[i]->print(str, query_type);
160
  }
161
  str->append(')');
162
}
163
164
481 by Brian Aker
Remove all of uchar.
165
bool Item_row::walk(Item_processor processor, bool walk_subquery, unsigned char *arg)
1 by brian
clean slate
166
{
482 by Brian Aker
Remove uint.
167
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
168
  {
169
    if (items[i]->walk(processor, walk_subquery, arg))
170
      return 1;
171
  }
172
  return (this->*processor)(arg);
173
}
174
175
481 by Brian Aker
Remove all of uchar.
176
Item *Item_row::transform(Item_transformer transformer, unsigned char *arg)
1 by brian
clean slate
177
{
482 by Brian Aker
Remove uint.
178
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
179
  {
180
    Item *new_item= items[i]->transform(transformer, arg);
181
    if (!new_item)
182
      return 0;
183
184
    /*
520.1.21 by Brian Aker
THD -> Session rename
185
      Session::change_item_tree() should be called only if the tree was
1 by brian
clean slate
186
      really transformed, i.e. when a new item has been created.
187
      Otherwise we'll be allocating a lot of unnecessary memory for
188
      change records at each execution.
189
    */
190
    if (items[i] != new_item)
520.1.22 by Brian Aker
Second pass of thd cleanup
191
      current_session->change_item_tree(&items[i], new_item);
1 by brian
clean slate
192
  }
193
  return (this->*transformer)(arg);
194
}
195
196
void Item_row::bring_value()
197
{
482 by Brian Aker
Remove uint.
198
  for (uint32_t i= 0; i < arg_count; i++)
1 by brian
clean slate
199
    items[i]->bring_value();
200
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
201
202
} /* namespace drizzled */