1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#ifndef DRIZZLED_ITEM_FUNC_H
21
#define DRIZZLED_ITEM_FUNC_H
24
/* If you fix the parser to no longer create functions these can be moved to create.cc */
25
#include <drizzled/function/math/divide.h>
26
#include <drizzled/function/get_user_var.h>
27
#include <drizzled/function/math/int.h>
28
#include <drizzled/function/math/int_divide.h>
29
#include <drizzled/function/math/minus.h>
30
#include <drizzled/function/math/mod.h>
31
#include <drizzled/function/math/multiply.h>
32
#include <drizzled/function/math/neg.h>
33
#include <drizzled/function/math/plus.h>
34
#include <drizzled/function/rollup_const.h>
35
#include <drizzled/function/math/round.h>
36
#include <drizzled/function/user_var_as_out_param.h>
1
/* Copyright (C) 2000-2006 MySQL AB
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.
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.
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
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
/* Function items used by mysql */
19
#ifdef USE_PRAGMA_INTERFACE
20
#pragma interface /* gcc class implementation */
24
extern "C" /* Bug in BSDI include file */
30
class Item_func :public Item_result_field
33
Item **args, *tmp_arg[2];
35
Allowed numbers of columns in result (usually 1, which means scalar value)
36
0 means get this number from first argument
38
uint allowed_arg_cols;
41
table_map used_tables_cache, not_null_tables_cache;
42
bool const_item_cache;
43
enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
45
LIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
46
COND_AND_FUNC, COND_OR_FUNC, COND_XOR_FUNC,
47
BETWEEN, IN_FUNC, MULT_EQUAL_FUNC,
48
INTERVAL_FUNC, ISNOTNULLTEST_FUNC,
49
NOT_FUNC, NOT_ALL_FUNC,
50
NOW_FUNC, TRIG_COND_FUNC,
51
SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC,
52
EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC,
54
enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL,
56
enum Type type() const { return FUNC_ITEM; }
57
virtual enum Functype functype() const { return UNKNOWN_FUNC; }
59
allowed_arg_cols(1), arg_count(0)
64
allowed_arg_cols(1), arg_count(1)
68
with_sum_func= a->with_sum_func;
70
Item_func(Item *a,Item *b):
71
allowed_arg_cols(1), arg_count(2)
74
args[0]= a; args[1]= b;
75
with_sum_func= a->with_sum_func || b->with_sum_func;
77
Item_func(Item *a,Item *b,Item *c):
81
if ((args= (Item**) sql_alloc(sizeof(Item*)*3)))
84
args[0]= a; args[1]= b; args[2]= c;
85
with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func;
88
Item_func(Item *a,Item *b,Item *c,Item *d):
92
if ((args= (Item**) 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;
100
Item_func(Item *a,Item *b,Item *c,Item *d,Item* e):
104
if ((args= (Item**) sql_alloc(sizeof(Item*)*5)))
106
args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e;
107
with_sum_func= a->with_sum_func || b->with_sum_func ||
108
c->with_sum_func || d->with_sum_func || e->with_sum_func ;
111
Item_func(List<Item> &list);
112
// Constructor used for Item_cond_and/or (see Item comment)
113
Item_func(THD *thd, Item_func *item);
114
bool fix_fields(THD *, Item **ref);
115
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
116
table_map used_tables() const;
117
table_map not_null_tables() const;
118
void update_used_tables();
119
bool eq(const Item *item, bool binary_cmp) const;
120
virtual optimize_type select_optimize() const { return OPTIMIZE_NONE; }
121
virtual bool have_rev_func() const { return 0; }
122
virtual Item *key_item() const { return args[0]; }
124
This method is used for debug purposes to print the name of an
125
item to the debug log. The second use of this method is as
126
a helper function of print(), where it is applicable.
127
To suit both goals it should return a meaningful,
128
distinguishable and sintactically correct string. This method
129
should not be used for runtime type identification, use enum
130
{Sum}Functype and Item_func::functype()/Item_sum::sum_func()
133
virtual const char *func_name() const= 0;
134
virtual bool const_item() const { return const_item_cache; }
135
inline Item **arguments() const { return args; }
136
void set_arguments(List<Item> &list);
137
inline uint argument_count() const { return arg_count; }
138
inline void remove_arguments() { arg_count=0; }
139
void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
140
virtual void print(String *str, enum_query_type query_type);
141
void print_op(String *str, enum_query_type query_type);
142
void print_args(String *str, uint from, enum_query_type query_type);
143
virtual void fix_num_length_and_dec();
144
void count_only_length();
145
void count_real_length();
146
void count_decimal_length();
147
inline bool get_arg0_date(MYSQL_TIME *ltime, uint fuzzy_date)
149
return (null_value=args[0]->get_date(ltime, fuzzy_date));
151
inline bool get_arg0_time(MYSQL_TIME *ltime)
153
return (null_value=args[0]->get_time(ltime));
159
void signal_divide_by_null();
160
friend class udf_handler;
161
Field *tmp_table_field() { return result_field; }
162
Field *tmp_table_field(TABLE *t_arg);
163
Item *get_tmp_table_item(THD *thd);
165
my_decimal *val_decimal(my_decimal *);
167
bool agg_arg_collations(DTCollation &c, Item **items, uint nitems,
170
return agg_item_collations(c, func_name(), items, nitems, flags, 1);
172
bool agg_arg_collations_for_comparison(DTCollation &c,
173
Item **items, uint nitems,
176
return agg_item_collations_for_comparison(c, func_name(),
177
items, nitems, flags);
179
bool agg_arg_charsets(DTCollation &c, Item **items, uint nitems,
180
uint flags, int item_sep)
182
return agg_item_charsets(c, func_name(), items, nitems, flags, item_sep);
184
bool walk(Item_processor processor, bool walk_subquery, uchar *arg);
185
Item *transform(Item_transformer transformer, uchar *arg);
186
Item* compile(Item_analyzer analyzer, uchar **arg_p,
187
Item_transformer transformer, uchar *arg_t);
188
void traverse_cond(Cond_traverser traverser,
189
void * arg, traverse_order order);
190
inline double fix_result(double value)
200
class Item_real_func :public Item_func
203
Item_real_func() :Item_func() {}
204
Item_real_func(Item *a) :Item_func(a) {}
205
Item_real_func(Item *a,Item *b) :Item_func(a,b) {}
206
Item_real_func(List<Item> &list) :Item_func(list) {}
207
String *val_str(String*str);
208
my_decimal *val_decimal(my_decimal *decimal_value);
210
{ assert(fixed == 1); return (int64_t) rint(val_real()); }
211
enum Item_result result_type () const { return REAL_RESULT; }
212
void fix_length_and_dec()
213
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
217
class Item_func_numhybrid: public Item_func
220
Item_result hybrid_type;
222
Item_func_numhybrid(Item *a) :Item_func(a), hybrid_type(REAL_RESULT)
224
Item_func_numhybrid(Item *a,Item *b)
225
:Item_func(a,b), hybrid_type(REAL_RESULT)
227
Item_func_numhybrid(List<Item> &list)
228
:Item_func(list), hybrid_type(REAL_RESULT)
231
enum Item_result result_type () const { return hybrid_type; }
232
void fix_length_and_dec();
233
void fix_num_length_and_dec();
234
virtual void find_num_type()= 0; /* To be called from fix_length_and_dec */
238
my_decimal *val_decimal(my_decimal *);
239
String *val_str(String*str);
242
@brief Performs the operation that this functions implements when the
245
@return The result of the operation.
247
virtual int64_t int_op()= 0;
250
@brief Performs the operation that this functions implements when the
253
@return The result of the operation.
255
virtual double real_op()= 0;
258
@brief Performs the operation that this functions implements when the
259
result type is DECIMAL.
261
@param A pointer where the DECIMAL value will be allocated.
263
- 0 If the result is NULL
264
- The same pointer it was given, with the area initialized to the
265
result of the operation.
267
virtual my_decimal *decimal_op(my_decimal *)= 0;
270
@brief Performs the operation that this functions implements when the
271
result type is a string type.
273
@return The result of the operation.
275
virtual String *str_op(String *)= 0;
276
bool is_null() { update_null_value(); return null_value; }
279
/* function where type of result detected by first argument */
280
class Item_func_num1: public Item_func_numhybrid
283
Item_func_num1(Item *a) :Item_func_numhybrid(a) {}
284
Item_func_num1(Item *a, Item *b) :Item_func_numhybrid(a, b) {}
286
void fix_num_length_and_dec();
287
void find_num_type();
288
String *str_op(String *str __attribute__((__unused__)))
289
{ assert(0); return 0; }
293
/* Base class for operations like '+', '-', '*' */
294
class Item_num_op :public Item_func_numhybrid
297
Item_num_op(Item *a,Item *b) :Item_func_numhybrid(a, b) {}
298
virtual void result_precision()= 0;
300
virtual inline void print(String *str, enum_query_type query_type)
302
print_op(str, query_type);
305
void find_num_type();
306
String *str_op(String *str __attribute__((__unused__)))
307
{ assert(0); return 0; }
311
class Item_int_func :public Item_func
314
Item_int_func() :Item_func() { max_length= 21; }
315
Item_int_func(Item *a) :Item_func(a) { max_length= 21; }
316
Item_int_func(Item *a,Item *b) :Item_func(a,b) { max_length= 21; }
317
Item_int_func(Item *a,Item *b,Item *c) :Item_func(a,b,c)
319
Item_int_func(List<Item> &list) :Item_func(list) { max_length= 21; }
320
Item_int_func(THD *thd, Item_int_func *item) :Item_func(thd, item) {}
322
String *val_str(String*str);
323
enum Item_result result_type () const { return INT_RESULT; }
324
void fix_length_and_dec() {}
328
class Item_func_connection_id :public Item_int_func
333
Item_func_connection_id() {}
334
const char *func_name() const { return "connection_id"; }
335
void fix_length_and_dec();
336
bool fix_fields(THD *thd, Item **ref);
337
int64_t val_int() { assert(fixed == 1); return value; }
341
class Item_func_signed :public Item_int_func
344
Item_func_signed(Item *a) :Item_int_func(a) {}
345
const char *func_name() const { return "cast_as_signed"; }
347
int64_t val_int_from_str(int *error);
348
void fix_length_and_dec()
349
{ max_length=args[0]->max_length; unsigned_flag=0; }
350
virtual void print(String *str, enum_query_type query_type);
351
uint decimal_precision() const { return args[0]->decimal_precision(); }
355
class Item_func_unsigned :public Item_func_signed
358
Item_func_unsigned(Item *a) :Item_func_signed(a) {}
359
const char *func_name() const { return "cast_as_unsigned"; }
360
void fix_length_and_dec()
361
{ max_length=args[0]->max_length; unsigned_flag=1; }
363
virtual void print(String *str, enum_query_type query_type);
367
class Item_decimal_typecast :public Item_func
369
my_decimal decimal_value;
371
Item_decimal_typecast(Item *a, int len, int dec) :Item_func(a)
374
max_length= my_decimal_precision_to_length(len, dec, unsigned_flag);
376
String *val_str(String *str);
379
my_decimal *val_decimal(my_decimal*);
380
enum Item_result result_type () const { return DECIMAL_RESULT; }
381
enum_field_types field_type() const { return MYSQL_TYPE_NEWDECIMAL; }
382
void fix_length_and_dec() {};
383
const char *func_name() const { return "decimal_typecast"; }
384
virtual void print(String *str, enum_query_type query_type);
388
class Item_func_additive_op :public Item_num_op
391
Item_func_additive_op(Item *a,Item *b) :Item_num_op(a,b) {}
392
void result_precision();
396
class Item_func_plus :public Item_func_additive_op
399
Item_func_plus(Item *a,Item *b) :Item_func_additive_op(a,b) {}
400
const char *func_name() const { return "+"; }
403
my_decimal *decimal_op(my_decimal *);
406
class Item_func_minus :public Item_func_additive_op
409
Item_func_minus(Item *a,Item *b) :Item_func_additive_op(a,b) {}
410
const char *func_name() const { return "-"; }
413
my_decimal *decimal_op(my_decimal *);
414
void fix_length_and_dec();
418
class Item_func_mul :public Item_num_op
421
Item_func_mul(Item *a,Item *b) :Item_num_op(a,b) {}
422
const char *func_name() const { return "*"; }
425
my_decimal *decimal_op(my_decimal *);
426
void result_precision();
430
class Item_func_div :public Item_num_op
434
Item_func_div(Item *a,Item *b) :Item_num_op(a,b) {}
435
int64_t int_op() { assert(0); return 0; }
437
my_decimal *decimal_op(my_decimal *);
438
const char *func_name() const { return "/"; }
439
void fix_length_and_dec();
440
void result_precision();
444
class Item_func_int_div :public Item_int_func
447
Item_func_int_div(Item *a,Item *b) :Item_int_func(a,b)
450
const char *func_name() const { return "DIV"; }
451
void fix_length_and_dec();
453
virtual inline void print(String *str, enum_query_type query_type)
455
print_op(str, query_type);
461
class Item_func_mod :public Item_num_op
464
Item_func_mod(Item *a,Item *b) :Item_num_op(a,b) {}
467
my_decimal *decimal_op(my_decimal *);
468
const char *func_name() const { return "%"; }
469
void result_precision();
470
void fix_length_and_dec();
474
class Item_func_neg :public Item_func_num1
477
Item_func_neg(Item *a) :Item_func_num1(a) {}
480
my_decimal *decimal_op(my_decimal *);
481
const char *func_name() const { return "-"; }
482
enum Functype functype() const { return NEG_FUNC; }
483
void fix_length_and_dec();
484
void fix_num_length_and_dec();
485
uint decimal_precision() const { return args[0]->decimal_precision(); }
489
class Item_func_abs :public Item_func_num1
492
Item_func_abs(Item *a) :Item_func_num1(a) {}
495
my_decimal *decimal_op(my_decimal *);
496
const char *func_name() const { return "abs"; }
497
void fix_length_and_dec();
500
// A class to handle logarithmic and trigonometric functions
502
class Item_dec_func :public Item_real_func
505
Item_dec_func(Item *a) :Item_real_func(a) {}
506
Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
507
void fix_length_and_dec()
509
decimals=NOT_FIXED_DEC; max_length=float_length(decimals);
514
class Item_func_exp :public Item_dec_func
517
Item_func_exp(Item *a) :Item_dec_func(a) {}
519
const char *func_name() const { return "exp"; }
523
class Item_func_ln :public Item_dec_func
526
Item_func_ln(Item *a) :Item_dec_func(a) {}
528
const char *func_name() const { return "ln"; }
532
class Item_func_log :public Item_dec_func
535
Item_func_log(Item *a) :Item_dec_func(a) {}
536
Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {}
538
const char *func_name() const { return "log"; }
542
class Item_func_log2 :public Item_dec_func
545
Item_func_log2(Item *a) :Item_dec_func(a) {}
547
const char *func_name() const { return "log2"; }
551
class Item_func_log10 :public Item_dec_func
554
Item_func_log10(Item *a) :Item_dec_func(a) {}
556
const char *func_name() const { return "log10"; }
560
class Item_func_sqrt :public Item_dec_func
563
Item_func_sqrt(Item *a) :Item_dec_func(a) {}
565
const char *func_name() const { return "sqrt"; }
569
class Item_func_pow :public Item_dec_func
572
Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
574
const char *func_name() const { return "pow"; }
578
class Item_func_acos :public Item_dec_func
581
Item_func_acos(Item *a) :Item_dec_func(a) {}
583
const char *func_name() const { return "acos"; }
586
class Item_func_asin :public Item_dec_func
589
Item_func_asin(Item *a) :Item_dec_func(a) {}
591
const char *func_name() const { return "asin"; }
594
class Item_func_atan :public Item_dec_func
597
Item_func_atan(Item *a) :Item_dec_func(a) {}
598
Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
600
const char *func_name() const { return "atan"; }
603
class Item_func_cos :public Item_dec_func
606
Item_func_cos(Item *a) :Item_dec_func(a) {}
608
const char *func_name() const { return "cos"; }
611
class Item_func_sin :public Item_dec_func
614
Item_func_sin(Item *a) :Item_dec_func(a) {}
616
const char *func_name() const { return "sin"; }
619
class Item_func_tan :public Item_dec_func
622
Item_func_tan(Item *a) :Item_dec_func(a) {}
624
const char *func_name() const { return "tan"; }
627
class Item_func_integer :public Item_int_func
630
inline Item_func_integer(Item *a) :Item_int_func(a) {}
631
void fix_length_and_dec();
635
class Item_func_int_val :public Item_func_num1
638
Item_func_int_val(Item *a) :Item_func_num1(a) {}
639
void fix_num_length_and_dec();
640
void find_num_type();
644
class Item_func_ceiling :public Item_func_int_val
647
Item_func_ceiling(Item *a) :Item_func_int_val(a) {}
648
const char *func_name() const { return "ceiling"; }
651
my_decimal *decimal_op(my_decimal *);
655
class Item_func_floor :public Item_func_int_val
658
Item_func_floor(Item *a) :Item_func_int_val(a) {}
659
const char *func_name() const { return "floor"; }
662
my_decimal *decimal_op(my_decimal *);
665
/* This handles round and truncate */
667
class Item_func_round :public Item_func_num1
671
Item_func_round(Item *a, Item *b, bool trunc_arg)
672
:Item_func_num1(a,b), truncate(trunc_arg) {}
673
const char *func_name() const { return truncate ? "truncate" : "round"; }
676
my_decimal *decimal_op(my_decimal *);
677
void fix_length_and_dec();
681
class Item_func_rand :public Item_real_func
683
struct rand_struct *rand;
685
Item_func_rand(Item *a) :Item_real_func(a), rand(0) {}
686
Item_func_rand() :Item_real_func() {}
688
const char *func_name() const { return "rand"; }
689
bool const_item() const { return 0; }
690
void update_used_tables();
691
bool fix_fields(THD *thd, Item **ref);
693
void seed_random (Item * val);
697
class Item_func_sign :public Item_int_func
700
Item_func_sign(Item *a) :Item_int_func(a) {}
701
const char *func_name() const { return "sign"; }
706
class Item_func_units :public Item_real_func
711
Item_func_units(char *name_arg,Item *a,double mul_arg,double add_arg)
712
:Item_real_func(a),name(name_arg),mul(mul_arg),add(add_arg) {}
714
const char *func_name() const { return name; }
715
void fix_length_and_dec()
716
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
720
class Item_func_min_max :public Item_func
722
Item_result cmp_type;
725
/* TRUE <=> arguments should be compared in the DATETIME context. */
726
bool compare_as_dates;
727
/* An item used for issuing warnings while string to DATETIME conversion. */
731
enum_field_types cached_field_type;
733
Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list),
734
cmp_type(INT_RESULT), cmp_sign(cmp_sign_arg), compare_as_dates(false),
738
String *val_str(String *);
739
my_decimal *val_decimal(my_decimal *);
740
void fix_length_and_dec();
741
enum Item_result result_type () const { return cmp_type; }
742
bool result_as_int64_t() { return compare_as_dates; };
743
uint cmp_datetimes(uint64_t *value);
744
enum_field_types field_type() const { return cached_field_type; }
747
class Item_func_min :public Item_func_min_max
750
Item_func_min(List<Item> &list) :Item_func_min_max(list,1) {}
751
const char *func_name() const { return "least"; }
754
class Item_func_max :public Item_func_min_max
757
Item_func_max(List<Item> &list) :Item_func_min_max(list,-1) {}
758
const char *func_name() const { return "greatest"; }
763
Objects of this class are used for ROLLUP queries to wrap up
764
each constant item referred to in GROUP BY list.
767
class Item_func_rollup_const :public Item_func
770
Item_func_rollup_const(Item *a) :Item_func(a)
773
name_length= a->name_length;
775
double val_real() { return args[0]->val_real(); }
776
int64_t val_int() { return args[0]->val_int(); }
777
String *val_str(String *str) { return args[0]->val_str(str); }
778
my_decimal *val_decimal(my_decimal *dec) { return args[0]->val_decimal(dec); }
779
const char *func_name() const { return "rollup_const"; }
780
bool const_item() const { return 0; }
781
Item_result result_type() const { return args[0]->result_type(); }
782
void fix_length_and_dec()
784
collation= args[0]->collation;
785
max_length= args[0]->max_length;
786
decimals=args[0]->decimals;
787
/* The item could be a NULL constant. */
788
null_value= args[0]->is_null();
793
class Item_func_length :public Item_int_func
797
Item_func_length(Item *a) :Item_int_func(a) {}
799
const char *func_name() const { return "length"; }
800
void fix_length_and_dec() { max_length=10; }
803
class Item_func_bit_length :public Item_func_length
806
Item_func_bit_length(Item *a) :Item_func_length(a) {}
808
{ assert(fixed == 1); return Item_func_length::val_int()*8; }
809
const char *func_name() const { return "bit_length"; }
812
class Item_func_char_length :public Item_int_func
816
Item_func_char_length(Item *a) :Item_int_func(a) {}
818
const char *func_name() const { return "char_length"; }
819
void fix_length_and_dec() { max_length=10; }
822
class Item_func_coercibility :public Item_int_func
825
Item_func_coercibility(Item *a) :Item_int_func(a) {}
827
const char *func_name() const { return "coercibility"; }
828
void fix_length_and_dec() { max_length=10; maybe_null= 0; }
829
table_map not_null_tables() const { return 0; }
832
class Item_func_locate :public Item_int_func
834
String value1,value2;
835
DTCollation cmp_collation;
837
Item_func_locate(Item *a,Item *b) :Item_int_func(a,b) {}
838
Item_func_locate(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
839
const char *func_name() const { return "locate"; }
841
void fix_length_and_dec();
842
virtual void print(String *str, enum_query_type query_type);
846
class Item_func_field :public Item_int_func
849
Item_result cmp_type;
850
DTCollation cmp_collation;
852
Item_func_field(List<Item> &list) :Item_int_func(list) {}
854
const char *func_name() const { return "field"; }
855
void fix_length_and_dec();
859
class Item_func_ascii :public Item_int_func
863
Item_func_ascii(Item *a) :Item_int_func(a) {}
865
const char *func_name() const { return "ascii"; }
866
void fix_length_and_dec() { max_length=3; }
869
class Item_func_ord :public Item_int_func
873
Item_func_ord(Item *a) :Item_int_func(a) {}
875
const char *func_name() const { return "ord"; }
878
class Item_func_find_in_set :public Item_int_func
883
DTCollation cmp_collation;
885
Item_func_find_in_set(Item *a,Item *b) :Item_int_func(a,b),enum_value(0) {}
887
const char *func_name() const { return "find_in_set"; }
888
void fix_length_and_dec();
891
/* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
893
class Item_func_bit: public Item_int_func
896
Item_func_bit(Item *a, Item *b) :Item_int_func(a, b) {}
897
Item_func_bit(Item *a) :Item_int_func(a) {}
898
void fix_length_and_dec() { unsigned_flag= 1; }
900
virtual inline void print(String *str, enum_query_type query_type)
902
print_op(str, query_type);
906
class Item_func_bit_or :public Item_func_bit
909
Item_func_bit_or(Item *a, Item *b) :Item_func_bit(a, b) {}
911
const char *func_name() const { return "|"; }
914
class Item_func_bit_and :public Item_func_bit
917
Item_func_bit_and(Item *a, Item *b) :Item_func_bit(a, b) {}
919
const char *func_name() const { return "&"; }
922
class Item_func_bit_count :public Item_int_func
925
Item_func_bit_count(Item *a) :Item_int_func(a) {}
927
const char *func_name() const { return "bit_count"; }
928
void fix_length_and_dec() { max_length=2; }
931
class Item_func_shift_left :public Item_func_bit
934
Item_func_shift_left(Item *a, Item *b) :Item_func_bit(a, b) {}
936
const char *func_name() const { return "<<"; }
939
class Item_func_shift_right :public Item_func_bit
942
Item_func_shift_right(Item *a, Item *b) :Item_func_bit(a, b) {}
944
const char *func_name() const { return ">>"; }
947
class Item_func_bit_neg :public Item_func_bit
950
Item_func_bit_neg(Item *a) :Item_func_bit(a) {}
952
const char *func_name() const { return "~"; }
954
virtual inline void print(String *str, enum_query_type query_type)
956
Item_func::print(str, query_type);
961
class Item_func_last_insert_id :public Item_int_func
964
Item_func_last_insert_id() :Item_int_func() {}
965
Item_func_last_insert_id(Item *a) :Item_int_func(a) {}
967
const char *func_name() const { return "last_insert_id"; }
968
void fix_length_and_dec()
971
max_length= args[0]->max_length;
973
bool fix_fields(THD *thd, Item **ref);
977
class Item_func_benchmark :public Item_int_func
980
Item_func_benchmark(Item *count_expr, Item *expr)
981
:Item_int_func(count_expr, expr)
984
const char *func_name() const { return "benchmark"; }
985
void fix_length_and_dec() { max_length=1; maybe_null=0; }
986
virtual void print(String *str, enum_query_type query_type);
990
class Item_udf_func :public Item_func
994
bool is_expensive_processor(uchar *arg __attribute__((__unused__)))
998
Item_udf_func(udf_func *udf_arg)
999
:Item_func(), udf(udf_arg) {}
1000
Item_udf_func(udf_func *udf_arg, List<Item> &list)
1001
:Item_func(list), udf(udf_arg) {}
1002
const char *func_name() const { return udf.name(); }
1003
enum Functype functype() const { return UDF_FUNC; }
1004
bool fix_fields(THD *thd, Item **ref __attribute__((__unused__)))
1007
bool res= udf.fix_fields(thd, this, arg_count, args);
1008
used_tables_cache= udf.used_tables_cache;
1009
const_item_cache= udf.const_item_cache;
1013
void update_used_tables()
1016
TODO: Make a member in UDF_INIT and return if a UDF is deterministic or
1018
Currently UDF_INIT has a member (const_item) that is an in/out
1019
parameter to the init() call.
1020
The code in udf_handler::fix_fields also duplicates the arguments
1021
handling code in Item_func::fix_fields().
1023
The lack of information if a UDF is deterministic makes writing
1024
a correct update_used_tables() for UDFs impossible.
1025
One solution to this would be :
1026
- Add a is_deterministic member of UDF_INIT
1027
- (optionally) deprecate the const_item member of UDF_INIT
1028
- Take away the duplicate code from udf_handler::fix_fields() and
1029
make Item_udf_func call Item_func::fix_fields() to process its
1030
arguments as for any other function.
1031
- Store the deterministic flag returned by <udf>_init into the
1033
- Don't implement Item_udf_func::fix_fields, implement
1034
Item_udf_func::fix_length_and_dec() instead (similar to non-UDF
1036
- Override Item_func::update_used_tables to call
1037
Item_func::update_used_tables() and add a RAND_TABLE_BIT to the
1038
result of Item_func::update_used_tables() if the UDF is
1040
- (optionally) rename RAND_TABLE_BIT to NONDETERMINISTIC_BIT to
1041
better describe its usage.
1043
The above would require a change of the UDF API.
1044
Until that change is done here's how the current code works:
1045
We call Item_func::update_used_tables() only when we know that
1046
the function depends on real non-const tables and is deterministic.
1047
This can be done only because we know that the optimizer will
1048
call update_used_tables() only when there's possibly a new const
1049
table. So update_used_tables() can only make a Item_func more
1050
constant than it is currently.
1051
That's why we don't need to do anything if a function is guaranteed
1052
to return non-constant (it's non-deterministic) or is already a
1055
if ((used_tables_cache & ~PSEUDO_TABLE_BITS) &&
1056
!(used_tables_cache & RAND_TABLE_BIT))
1058
Item_func::update_used_tables();
1059
if (!const_item_cache && !used_tables_cache)
1060
used_tables_cache= RAND_TABLE_BIT;
1064
Item_result result_type () const { return udf.result_type(); }
1065
table_map not_null_tables() const { return 0; }
1066
virtual void print(String *str, enum_query_type query_type);
1070
class Item_func_udf_float :public Item_udf_func
1073
Item_func_udf_float(udf_func *udf_arg)
1074
:Item_udf_func(udf_arg) {}
1075
Item_func_udf_float(udf_func *udf_arg,
1077
:Item_udf_func(udf_arg, list) {}
1081
return (int64_t) rint(Item_func_udf_float::val_real());
1083
my_decimal *val_decimal(my_decimal *dec_buf)
1085
double res=val_real();
1088
double2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf);
1092
String *val_str(String *str);
1093
void fix_length_and_dec() { fix_num_length_and_dec(); }
1097
class Item_func_udf_int :public Item_udf_func
1100
Item_func_udf_int(udf_func *udf_arg)
1101
:Item_udf_func(udf_arg) {}
1102
Item_func_udf_int(udf_func *udf_arg,
1104
:Item_udf_func(udf_arg, list) {}
1106
double val_real() { return (double) Item_func_udf_int::val_int(); }
1107
String *val_str(String *str);
1108
enum Item_result result_type () const { return INT_RESULT; }
1109
void fix_length_and_dec() { decimals= 0; max_length= 21; }
1113
class Item_func_udf_decimal :public Item_udf_func
1116
Item_func_udf_decimal(udf_func *udf_arg)
1117
:Item_udf_func(udf_arg) {}
1118
Item_func_udf_decimal(udf_func *udf_arg, List<Item> &list)
1119
:Item_udf_func(udf_arg, list) {}
1122
my_decimal *val_decimal(my_decimal *);
1123
String *val_str(String *str);
1124
enum Item_result result_type () const { return DECIMAL_RESULT; }
1125
void fix_length_and_dec();
1129
class Item_func_udf_str :public Item_udf_func
1132
Item_func_udf_str(udf_func *udf_arg)
1133
:Item_udf_func(udf_arg) {}
1134
Item_func_udf_str(udf_func *udf_arg, List<Item> &list)
1135
:Item_udf_func(udf_arg, list) {}
1136
String *val_str(String *);
1142
res= val_str(&str_value);
1143
return res ? my_strntod(res->charset(),(char*) res->ptr(),
1144
res->length(), &end_not_used, &err_not_used) : 0.0;
1149
String *res; res=val_str(&str_value);
1150
return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,
1151
(char**) 0, &err_not_used) : (int64_t) 0;
1153
my_decimal *val_decimal(my_decimal *dec_buf)
1155
String *res=val_str(&str_value);
1158
string2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf);
1161
enum Item_result result_type () const { return STRING_RESULT; }
1162
void fix_length_and_dec();
1166
/* replication functions */
1168
class Item_master_pos_wait :public Item_int_func
1172
Item_master_pos_wait(Item *a,Item *b) :Item_int_func(a,b) {}
1173
Item_master_pos_wait(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
1175
const char *func_name() const { return "master_pos_wait"; }
1176
void fix_length_and_dec() { max_length=21; maybe_null=1;}
1180
/* Handling of user definable variables */
1182
class user_var_entry;
1184
class Item_func_set_user_var :public Item_func
1186
enum Item_result cached_result_type;
1187
user_var_entry *entry;
1188
char buffer[MAX_FIELD_WIDTH];
1190
my_decimal decimal_buff;
1201
LEX_STRING name; // keep it public
1202
Item_func_set_user_var(LEX_STRING a,Item *b)
1203
:Item_func(b), cached_result_type(INT_RESULT), name(a)
1205
enum Functype functype() const { return SUSERVAR_FUNC; }
1208
String *val_str(String *str);
1209
my_decimal *val_decimal(my_decimal *);
1210
double val_result();
1211
int64_t val_int_result();
1212
String *str_result(String *str);
1213
my_decimal *val_decimal_result(my_decimal *);
1214
bool update_hash(void *ptr, uint length, enum Item_result type,
1215
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
1216
bool send(Protocol *protocol, String *str_arg);
1217
void make_field(Send_field *tmp_field);
1218
bool check(bool use_result_field);
1220
enum Item_result result_type () const { return cached_result_type; }
1221
bool fix_fields(THD *thd, Item **ref);
1222
void fix_length_and_dec();
1223
virtual void print(String *str, enum_query_type query_type);
1224
void print_as_stmt(String *str, enum_query_type query_type);
1225
const char *func_name() const { return "set_user_var"; }
1226
int save_in_field(Field *field, bool no_conversions,
1227
bool can_use_result_field);
1228
int save_in_field(Field *field, bool no_conversions)
1230
return save_in_field(field, no_conversions, 1);
1232
void save_org_in_field(Field *field) { (void)save_in_field(field, 1, 0); }
1233
bool register_field_in_read_map(uchar *arg);
1237
class Item_func_get_user_var :public Item_func
1239
user_var_entry *var_entry;
1240
Item_result m_cached_result_type;
1243
LEX_STRING name; // keep it public
1244
Item_func_get_user_var(LEX_STRING a):
1245
Item_func(), m_cached_result_type(STRING_RESULT), name(a) {}
1246
enum Functype functype() const { return GUSERVAR_FUNC; }
1247
LEX_STRING get_name() { return name; }
1250
my_decimal *val_decimal(my_decimal*);
1251
String *val_str(String* str);
1252
void fix_length_and_dec();
1253
virtual void print(String *str, enum_query_type query_type);
1254
enum Item_result result_type() const;
1256
We must always return variables as strings to guard against selects of type
1257
select @t1:=1,@t1,@t:="hello",@t from foo where (@t1:= t2.b)
1259
const char *func_name() const { return "get_user_var"; }
1260
bool const_item() const;
1261
table_map used_tables() const
1262
{ return const_item() ? 0 : RAND_TABLE_BIT; }
1263
bool eq(const Item *item, bool binary_cmp) const;
1268
This item represents user variable used as out parameter (e.g in LOAD DATA),
1269
and it is supposed to be used only for this purprose. So it is simplified
1270
a lot. Actually you should never obtain its value.
1272
The only two reasons for this thing being an Item is possibility to store it
1273
in List<Item> and desire to place this code somewhere near other functions
1274
working with user variables.
1276
class Item_user_var_as_out_param :public Item
1279
user_var_entry *entry;
1281
Item_user_var_as_out_param(LEX_STRING a) : name(a) {}
1282
/* We should return something different from FIELD_ITEM here */
1283
enum Type type() const { return STRING_ITEM;}
1286
String *val_str(String *str);
1287
my_decimal *val_decimal(my_decimal *decimal_buffer);
1288
/* fix_fields() binds variable name with its entry structure */
1289
bool fix_fields(THD *thd, Item **ref);
1290
virtual void print(String *str, enum_query_type query_type);
1291
void set_null_value(CHARSET_INFO* cs);
1292
void set_value(const char *str, uint length, CHARSET_INFO* cs);
1296
/* A system variable */
1298
class Item_func_get_system_var :public Item_func
1301
enum_var_type var_type;
1302
LEX_STRING component;
1304
Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
1305
LEX_STRING *component_arg, const char *name_arg,
1306
size_t name_len_arg);
1307
bool fix_fields(THD *thd, Item **ref);
1309
Stubs for pure virtual methods. Should never be called: this
1310
item is always substituted with a constant in fix_fields().
1312
double val_real() { assert(0); return 0.0; }
1313
int64_t val_int() { assert(0); return 0; }
1314
String* val_str(String*) { assert(0); return 0; }
1315
void fix_length_and_dec() { assert(0); }
1316
/* TODO: fix to support views */
1317
const char *func_name() const { return "get_system_var"; }
1319
Indicates whether this system variable is written to the binlog or not.
1321
Variables are written to the binlog as part of "status_vars" in
1322
Query_log_event, as an Intvar_log_event, or a Rand_log_event.
1324
@return true if the variable is written to the binlog, false otherwise.
1326
bool is_written_to_binlog();
1329
class Item_func_bit_xor : public Item_func_bit
1332
Item_func_bit_xor(Item *a, Item *b) :Item_func_bit(a, b) {}
1334
const char *func_name() const { return "^"; }
1337
class Item_func_is_free_lock :public Item_int_func
1341
Item_func_is_free_lock(Item *a) :Item_int_func(a) {}
1343
const char *func_name() const { return "is_free_lock"; }
1344
void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
1347
class Item_func_is_used_lock :public Item_int_func
1351
Item_func_is_used_lock(Item *a) :Item_int_func(a) {}
1353
const char *func_name() const { return "is_used_lock"; }
1354
void fix_length_and_dec() { decimals=0; max_length=10; maybe_null=1;}
38
1357
/* For type casts */
1361
ITEM_CAST_BINARY, ITEM_CAST_SIGNED_INT, ITEM_CAST_UNSIGNED_INT,
1362
ITEM_CAST_DATE, ITEM_CAST_TIME, ITEM_CAST_DATETIME, ITEM_CAST_CHAR,
53
1363
ITEM_CAST_DECIMAL
56
} /* namespace drizzled */
58
#endif /* DRIZZLED_ITEM_FUNC_H */
1367
class Item_func_row_count :public Item_int_func
1370
Item_func_row_count() :Item_int_func() {}
1372
const char *func_name() const { return "row_count"; }
1373
void fix_length_and_dec() { decimals= 0; maybe_null=0; }
1383
struct st_sp_security_context;
1385
class Item_func_found_rows :public Item_int_func
1388
Item_func_found_rows() :Item_int_func() {}
1390
const char *func_name() const { return "found_rows"; }
1391
void fix_length_and_dec() { decimals= 0; maybe_null=0; }