26 #include <drizzled/charset.h>
27 #include <drizzled/item.h>
28 #include <drizzled/item/bin_string.h>
29 #include <drizzled/lex_string.h>
30 #include <drizzled/sql_list.h>
31 #include <drizzled/type/decimal.h>
40 Item **args, *tmp_arg[2];
45 uint32_t allowed_arg_cols;
49 using Item::split_sum_func;
52 table_map used_tables_cache, not_null_tables_cache;
53 bool const_item_cache;
54 enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
56 LIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
57 COND_AND_FUNC, COND_OR_FUNC, COND_XOR_FUNC,
58 BETWEEN, IN_FUNC, MULT_EQUAL_FUNC,
59 INTERVAL_FUNC, ISNOTNULLTEST_FUNC,
60 NOT_FUNC, NOT_ALL_FUNC,
61 NOW_FUNC, TRIG_COND_FUNC,
62 SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC,
63 EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP,
65 enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL,
67 enum Type type()
const {
return FUNC_ITEM; }
68 virtual enum Functype functype()
const {
return UNKNOWN_FUNC; }
89 void fix_after_pullout(Select_Lex *new_parent,
Item **ref);
90 table_map used_tables()
const;
91 table_map not_null_tables()
const;
92 void update_used_tables();
93 bool eq(
const Item *item,
bool binary_cmp)
const;
94 virtual optimize_type select_optimize()
const {
return OPTIMIZE_NONE; }
95 virtual bool have_rev_func()
const {
return 0; }
96 virtual Item *key_item()
const {
return args[0]; }
107 virtual const char *func_name()
const {
return NULL; }
109 Item **arguments()
const {
return args; }
110 void set_arguments(List<Item> &list);
111 uint32_t argument_count()
const {
return arg_count; }
112 void remove_arguments() { arg_count=0; }
119 virtual void split_sum_func(
Session *session,
Item **ref_pointer_array,
122 virtual void print(
String *str);
123 void print_op(
String *str);
124 void print_args(
String *str, uint32_t from);
125 virtual void fix_num_length_and_dec();
126 void count_only_length();
127 void count_real_length();
128 void count_decimal_length();
130 bool get_arg0_date(
type::Time <ime, uint32_t fuzzy_date);
135 virtual bool deterministic()
const
140 void signal_divide_by_null();
142 virtual Field *tmp_table_field() {
return result_field; }
143 virtual Field *tmp_table_field(Table *t_arg);
145 Item *get_tmp_table_item(Session *session);
147 type::Decimal *val_decimal(type::Decimal *);
149 bool agg_arg_collations(DTCollation &c, Item **items, uint32_t nitems,
151 bool agg_arg_collations_for_comparison(DTCollation &c,
152 Item **items, uint32_t nitems,
154 bool agg_arg_charsets(DTCollation &c, Item **items, uint32_t nitems,
155 uint32_t flags,
int item_sep);
156 bool walk(Item_processor processor,
bool walk_subquery,
unsigned char *arg);
157 Item *transform(Item_transformer transformer,
unsigned char *arg);
158 Item* compile(Item_analyzer analyzer,
unsigned char **arg_p,
159 Item_transformer transformer,
unsigned char *arg_t);
160 void traverse_cond(Cond_traverser traverser,
161 void * arg, traverse_order order);
162 double fix_result(
double value);