17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include <drizzled/sql_string.h>
23
#include <drizzled/sql_list.h>
25
#include <drizzled/function/math/int.h>
22
#include <drizzled/check_stack_overrun.h>
23
#include <drizzled/current_session.h>
24
#include <drizzled/error.h>
25
#include <drizzled/field/decimal.h>
26
#include <drizzled/field/double.h>
26
27
#include <drizzled/field/int32.h>
27
28
#include <drizzled/field/int64.h>
28
#include <drizzled/field/decimal.h>
29
#include <drizzled/field/double.h>
30
29
#include <drizzled/field/size.h>
30
#include <drizzled/function/math/int.h>
31
#include <drizzled/item/field.h>
31
32
#include <drizzled/session.h>
32
#include <drizzled/error.h>
33
#include <drizzled/check_stack_overrun.h>
33
#include <drizzled/sql_list.h>
34
#include <drizzled/sql_string.h>
35
37
#include <algorithm>
45
Item_func::Item_func(void):
46
allowed_arg_cols(1), arg_count(0),
47
const_item_cache(false)
50
collation.set(DERIVATION_SYSCONST);
53
Item_func::Item_func(Item *a):
54
allowed_arg_cols(1), arg_count(1),
55
const_item_cache(false)
59
with_sum_func= a->with_sum_func;
60
collation.set(DERIVATION_SYSCONST);
63
Item_func::Item_func(Item *a,Item *b):
64
allowed_arg_cols(1), arg_count(2),
65
const_item_cache(false)
68
args[0]= a; args[1]= b;
69
with_sum_func= a->with_sum_func || b->with_sum_func;
70
collation.set(DERIVATION_SYSCONST);
73
Item_func::Item_func(Item *a,Item *b,Item *c):
75
const_item_cache(false)
78
if ((args= (Item**) memory::sql_alloc(sizeof(Item*)*3)))
81
args[0]= a; args[1]= b; args[2]= c;
82
with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func;
84
collation.set(DERIVATION_SYSCONST);
87
Item_func::Item_func(Item *a,Item *b,Item *c,Item *d):
89
const_item_cache(false)
92
if ((args= (Item**) memory::sql_alloc(sizeof(Item*)*4)))
95
args[0]= a; args[1]= b; args[2]= c; args[3]= d;
96
with_sum_func= a->with_sum_func || b->with_sum_func ||
97
c->with_sum_func || d->with_sum_func;
99
collation.set(DERIVATION_SYSCONST);
102
Item_func::Item_func(Item *a,Item *b,Item *c,Item *d,Item* e):
104
const_item_cache(false)
107
if ((args= (Item**) memory::sql_alloc(sizeof(Item*)*5)))
109
args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e;
110
with_sum_func= a->with_sum_func || b->with_sum_func ||
111
c->with_sum_func || d->with_sum_func || e->with_sum_func ;
113
collation.set(DERIVATION_SYSCONST);
43
117
void Item_func::set_arguments(List<Item> &list)
45
119
allowed_arg_cols= 1;
46
arg_count=list.elements;
120
arg_count=list.size();
47
121
args= tmp_arg; // If 2 arguments
48
122
if (arg_count <= 2 || (args=(Item**) memory::sql_alloc(sizeof(Item*)*arg_count)))
50
List_iterator_fast<Item> li(list);
124
List<Item>::iterator li(list.begin());
52
125
Item **save_args= args;
127
while (Item* item=li++)
56
129
*(save_args++)= item;
57
130
with_sum_func|=item->with_sum_func;
60
list.empty(); // Fields are used
133
list.clear(); // Fields are used
63
136
Item_func::Item_func(List<Item> &list) :
64
_session(*current_session),
65
137
allowed_arg_cols(1),
66
138
const_item_cache(false)
72
144
Item_func::Item_func(Session *session, Item_func *item) :
73
145
Item_result_field(session, item),
74
_session(*current_session),
75
146
allowed_arg_cols(item->allowed_arg_cols),
76
147
arg_count(item->arg_count),
77
148
used_tables_cache(item->used_tables_cache),
277
347
Item *new_item= (*arg)->transform(transformer, argument);
282
Session::change_item_tree() should be called only if the tree was
283
really transformed, i.e. when a new item has been created.
284
Otherwise we'll be allocating a lot of unnecessary memory for
285
change records at each execution.
287
if (*arg != new_item)
288
getSession().change_item_tree(arg, new_item);
291
353
return (this->*transformer)(argument);
333
395
unsigned char *arg_v= *arg_p;
334
396
Item *new_item= (*arg)->compile(analyzer, &arg_v, transformer, arg_t);
335
397
if (new_item && *arg != new_item)
336
current_session->change_item_tree(arg, new_item);
339
401
return (this->*transformer)(arg_t);
380
void Item_func::print(String *str, enum_query_type query_type)
442
void Item_func::print(String *str)
382
444
str->append(func_name());
383
445
str->append('(');
384
print_args(str, 0, query_type);
385
447
str->append(')');
389
void Item_func::print_args(String *str, uint32_t from, enum_query_type query_type)
451
void Item_func::print_args(String *str, uint32_t from)
391
453
for (uint32_t i=from ; i < arg_count ; i++)
394
456
str->append(',');
395
args[i]->print(str, query_type);
400
void Item_func::print_op(String *str, enum_query_type query_type)
462
void Item_func::print_op(String *str)
402
464
str->append('(');
403
465
for (uint32_t i=0 ; i < arg_count-1 ; i++)
405
args[i]->print(str, query_type);
406
468
str->append(' ');
407
469
str->append(func_name());
408
470
str->append(' ');
410
args[arg_count-1]->print(str, query_type);
472
args[arg_count-1]->print(str);
411
473
str->append(')');