59
void Item_func::set_arguments(List<Item> &list)
62
arg_count=list.elements;
63
args= tmp_arg; // If 2 arguments
64
if (arg_count <= 2 || (args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
66
List_iterator_fast<Item> li(list);
68
Item **save_args= args;
73
with_sum_func|=item->with_sum_func;
76
list.empty(); // Fields are used
79
Item_func::Item_func(List<Item> &list)
85
Item_func::Item_func(THD *thd, Item_func *item)
86
:Item_result_field(thd, item),
87
allowed_arg_cols(item->allowed_arg_cols),
88
arg_count(item->arg_count),
89
used_tables_cache(item->used_tables_cache),
90
not_null_tables_cache(item->not_null_tables_cache),
91
const_item_cache(item->const_item_cache)
99
if (!(args=(Item**) thd->alloc(sizeof(Item*)*arg_count)))
102
memcpy((char*) args, (char*) item->args, sizeof(Item*)*arg_count);
108
Resolve references to table column for a function and its argument
113
ref Pointer to where this object is used. This reference
114
is used if we want to replace this object with another
115
one (for example in the summary functions).
118
Call fix_fields() for all arguments to the function. The main intention
119
is to allow all Item_field() objects to setup pointers to the table fields.
121
Sets as a side effect the following class variables:
122
maybe_null Set if any argument may return NULL
123
with_sum_func Set if any of the arguments contains a sum function
124
used_tables_cache Set to union of the tables used by arguments
126
str_value.charset If this is a string function, set this to the
127
character set for the first argument.
128
If any argument is binary, this is set to binary
130
If for any item any of the defaults are wrong, then this can
131
be fixed in the fix_length_and_dec() function that is called
132
after this one or by writing a specialized fix_fields() for the
137
true Got error. Stored with my_error().
141
Item_func::fix_fields(THD *thd, Item **ref __attribute__((__unused__)))
144
Item **arg,**arg_end;
145
void *save_thd_marker= thd->thd_marker;
146
uchar buff[STACK_BUFF_ALLOC]; // Max argument in function
148
used_tables_cache= not_null_tables_cache= 0;
151
if (check_stack_overrun(thd, STACK_MIN_SIZE, buff))
152
return true; // Fatal error if flag is set!
154
{ // Print purify happy
155
for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
159
We can't yet set item to *arg as fix_fields may change *arg
160
We shouldn't call fix_fields() twice, so check 'fixed' field first
162
if ((!(*arg)->fixed && (*arg)->fix_fields(thd, arg)))
163
return true; /* purecov: inspected */
166
if (allowed_arg_cols)
168
if (item->check_cols(allowed_arg_cols))
173
/* we have to fetch allowed_arg_cols from first argument */
174
assert(arg == args); // it is first argument
175
allowed_arg_cols= item->cols();
176
assert(allowed_arg_cols); // Can't be 0 any more
179
if (item->maybe_null)
182
with_sum_func= with_sum_func || item->with_sum_func;
183
used_tables_cache|= item->used_tables();
184
not_null_tables_cache|= item->not_null_tables();
185
const_item_cache&= item->const_item();
186
with_subselect|= item->with_subselect;
189
fix_length_and_dec();
190
if (thd->is_error()) // An error inside fix_length_and_dec occured
193
thd->thd_marker= save_thd_marker;
198
void Item_func::fix_after_pullout(st_select_lex *new_parent,
199
Item **ref __attribute__((__unused__)))
201
Item **arg,**arg_end;
203
used_tables_cache= not_null_tables_cache= 0;
208
for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
210
(*arg)->fix_after_pullout(new_parent, arg);
213
used_tables_cache|= item->used_tables();
214
not_null_tables_cache|= item->not_null_tables();
215
const_item_cache&= item->const_item();
221
bool Item_func::walk(Item_processor processor, bool walk_subquery,
226
Item **arg,**arg_end;
227
for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
229
if ((*arg)->walk(processor, walk_subquery, argument))
233
return (this->*processor)(argument);
236
void Item_func::traverse_cond(Cond_traverser traverser,
237
void *argument, traverse_order order)
241
Item **arg,**arg_end;
245
(*traverser)(this, argument);
246
for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
248
(*arg)->traverse_cond(traverser, argument, order);
252
for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
254
(*arg)->traverse_cond(traverser, argument, order);
256
(*traverser)(this, argument);
260
(*traverser)(this, argument);
265
Transform an Item_func object with a transformer callback function.
267
The function recursively applies the transform method to each
268
argument of the Item_func node.
269
If the call of the method for an argument item returns a new item
270
the old item is substituted for a new one.
271
After this the transformer is applied to the root node
272
of the Item_func object.
273
@param transformer the transformer callback function to be applied to
274
the nodes of the tree of the object
275
@param argument parameter to be passed to the transformer
278
Item returned as the result of transformation of the root node
281
Item *Item_func::transform(Item_transformer transformer, uchar *argument)
285
Item **arg,**arg_end;
286
for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
288
Item *new_item= (*arg)->transform(transformer, argument);
293
THD::change_item_tree() should be called only if the tree was
294
really transformed, i.e. when a new item has been created.
295
Otherwise we'll be allocating a lot of unnecessary memory for
296
change records at each execution.
298
if (*arg != new_item)
299
current_thd->change_item_tree(arg, new_item);
302
return (this->*transformer)(argument);
307
Compile Item_func object with a processor and a transformer
310
First the function applies the analyzer to the root node of
311
the Item_func object. Then if the analizer succeeeds (returns true)
312
the function recursively applies the compile method to each argument
313
of the Item_func node.
314
If the call of the method for an argument item returns a new item
315
the old item is substituted for a new one.
316
After this the transformer is applied to the root node
317
of the Item_func object.
319
@param analyzer the analyzer callback function to be applied to the
320
nodes of the tree of the object
321
@param[in,out] arg_p parameter to be passed to the processor
322
@param transformer the transformer callback function to be applied to the
323
nodes of the tree of the object
324
@param arg_t parameter to be passed to the transformer
327
Item returned as the result of transformation of the root node
330
Item *Item_func::compile(Item_analyzer analyzer, uchar **arg_p,
331
Item_transformer transformer, uchar *arg_t)
333
if (!(this->*analyzer)(arg_p))
337
Item **arg,**arg_end;
338
for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
341
The same parameter value of arg_p must be passed
342
to analyze any argument of the condition formula.
344
uchar *arg_v= *arg_p;
345
Item *new_item= (*arg)->compile(analyzer, &arg_v, transformer, arg_t);
346
if (new_item && *arg != new_item)
347
current_thd->change_item_tree(arg, new_item);
350
return (this->*transformer)(arg_t);
354
See comments in Item_cmp_func::split_sum_func()
357
void Item_func::split_sum_func(THD *thd, Item **ref_pointer_array,
360
Item **arg, **arg_end;
361
for (arg= args, arg_end= args+arg_count; arg != arg_end ; arg++)
362
(*arg)->split_sum_func2(thd, ref_pointer_array, fields, arg, true);
366
void Item_func::update_used_tables()
370
for (uint i=0 ; i < arg_count ; i++)
372
args[i]->update_used_tables();
373
used_tables_cache|=args[i]->used_tables();
374
const_item_cache&=args[i]->const_item();
379
table_map Item_func::used_tables() const
381
return used_tables_cache;
385
table_map Item_func::not_null_tables() const
387
return not_null_tables_cache;
391
void Item_func::print(String *str, enum_query_type query_type)
393
str->append(func_name());
395
print_args(str, 0, query_type);
400
void Item_func::print_args(String *str, uint from, enum_query_type query_type)
402
for (uint i=from ; i < arg_count ; i++)
406
args[i]->print(str, query_type);
411
void Item_func::print_op(String *str, enum_query_type query_type)
414
for (uint i=0 ; i < arg_count-1 ; i++)
416
args[i]->print(str, query_type);
418
str->append(func_name());
421
args[arg_count-1]->print(str, query_type);
426
bool Item_func::eq(const Item *item, bool binary_cmp) const
428
/* Assume we don't have rtti */
431
if (item->type() != FUNC_ITEM)
433
Item_func *item_func=(Item_func*) item;
434
Item_func::Functype func_type;
435
if ((func_type= functype()) != item_func->functype() ||
436
arg_count != item_func->arg_count ||
437
(func_type != Item_func::FUNC_SP &&
438
func_name() != item_func->func_name()) ||
439
(func_type == Item_func::FUNC_SP &&
440
my_strcasecmp(system_charset_info, func_name(), item_func->func_name())))
442
for (uint i=0; i < arg_count ; i++)
443
if (!args[i]->eq(item_func->args[i], binary_cmp))
449
Field *Item_func::tmp_table_field(TABLE *table)
453
switch (result_type()) {
455
if (max_length > MY_INT32_NUM_DECIMAL_DIGITS)
456
field= new Field_longlong(max_length, maybe_null, name, unsigned_flag);
458
field= new Field_long(max_length, maybe_null, name, unsigned_flag);
461
field= new Field_double(max_length, maybe_null, name, decimals);
464
return make_string_field(table);
467
field= new Field_new_decimal(my_decimal_precision_to_length(decimal_precision(),
470
maybe_null, name, decimals, unsigned_flag);
474
// This case should never be chosen
485
my_decimal *Item_func::val_decimal(my_decimal *decimal_value)
488
int2my_decimal(E_DEC_FATAL_ERROR, val_int(), unsigned_flag, decimal_value);
489
return decimal_value;
493
String *Item_real_func::val_str(String *str)
496
double nr= val_real();
498
return 0; /* purecov: inspected */
499
str->set_real(nr,decimals, &my_charset_bin);
504
my_decimal *Item_real_func::val_decimal(my_decimal *decimal_value)
507
double nr= val_real();
509
return 0; /* purecov: inspected */
510
double2my_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
511
return decimal_value;
51
515
void Item_func::fix_num_length_and_dec()
53
uint32_t fl_length= 0;
55
for (uint32_t i=0 ; i < arg_count ; i++)
519
for (uint i=0 ; i < arg_count ; i++)
57
521
set_if_bigger(decimals,args[i]->decimals);
58
522
set_if_bigger(fl_length, args[i]->max_length);
150
621
return copy_or_same(thd);
624
double Item_int_func::val_real()
628
return unsigned_flag ? (double) ((ulonglong) val_int()) : (double) val_int();
632
String *Item_int_func::val_str(String *str)
635
longlong nr=val_int();
638
str->set_int(nr, unsigned_flag, &my_charset_bin);
643
void Item_func_connection_id::fix_length_and_dec()
645
Item_int_func::fix_length_and_dec();
650
bool Item_func_connection_id::fix_fields(THD *thd, Item **ref)
652
if (Item_int_func::fix_fields(thd, ref))
654
thd->thread_specific_used= true;
655
value= thd->variables.pseudo_thread_id;
661
Check arguments here to determine result's type for a numeric
662
function of two arguments.
665
void Item_num_op::find_num_type(void)
667
assert(arg_count == 2);
668
Item_result r0= args[0]->result_type();
669
Item_result r1= args[1]->result_type();
671
if (r0 == REAL_RESULT || r1 == REAL_RESULT ||
672
r0 == STRING_RESULT || r1 ==STRING_RESULT)
675
max_length= float_length(decimals);
676
hybrid_type= REAL_RESULT;
678
else if (r0 == DECIMAL_RESULT || r1 == DECIMAL_RESULT)
680
hybrid_type= DECIMAL_RESULT;
685
assert(r0 == INT_RESULT && r1 == INT_RESULT);
687
hybrid_type=INT_RESULT;
695
Set result type for a numeric function of one argument
696
(can be also used by a numeric function of many arguments, if the result
697
type depends only on the first argument)
700
void Item_func_num1::find_num_type()
702
switch (hybrid_type= args[0]->result_type()) {
704
unsigned_flag= args[0]->unsigned_flag;
708
hybrid_type= REAL_RESULT;
709
max_length= float_length(decimals);
720
void Item_func_num1::fix_num_length_and_dec()
722
decimals= args[0]->decimals;
723
max_length= args[0]->max_length;
727
void Item_func_numhybrid::fix_length_and_dec()
729
fix_num_length_and_dec();
734
String *Item_func_numhybrid::val_str(String *str)
737
switch (hybrid_type) {
740
my_decimal decimal_value, *val;
741
if (!(val= decimal_op(&decimal_value)))
742
return 0; // null is set
743
my_decimal_round(E_DEC_FATAL_ERROR, val, decimals, false, val);
744
my_decimal2string(E_DEC_FATAL_ERROR, val, 0, 0, 0, str);
749
longlong nr= int_op();
751
return 0; /* purecov: inspected */
752
str->set_int(nr, unsigned_flag, &my_charset_bin);
757
double nr= real_op();
759
return 0; /* purecov: inspected */
760
str->set_real(nr,decimals,&my_charset_bin);
764
return str_op(&str_value);
772
double Item_func_numhybrid::val_real()
775
switch (hybrid_type) {
778
my_decimal decimal_value, *val;
780
if (!(val= decimal_op(&decimal_value)))
781
return 0.0; // null is set
782
my_decimal2double(E_DEC_FATAL_ERROR, val, &result);
787
longlong result= int_op();
788
return unsigned_flag ? (double) ((ulonglong) result) : (double) result;
796
String *res= str_op(&str_value);
797
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
798
&end_not_used, &err_not_used) : 0.0);
807
longlong Item_func_numhybrid::val_int()
810
switch (hybrid_type) {
813
my_decimal decimal_value, *val;
814
if (!(val= decimal_op(&decimal_value)))
815
return 0; // null is set
817
my_decimal2int(E_DEC_FATAL_ERROR, val, unsigned_flag, &result);
823
return (longlong) rint(real_op());
828
if (!(res= str_op(&str_value)))
831
char *end= (char*) res->ptr() + res->length();
832
CHARSET_INFO *cs= str_value.charset();
833
return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used);
842
my_decimal *Item_func_numhybrid::val_decimal(my_decimal *decimal_value)
844
my_decimal *val= decimal_value;
846
switch (hybrid_type) {
848
val= decimal_op(decimal_value);
852
longlong result= int_op();
853
int2my_decimal(E_DEC_FATAL_ERROR, result, unsigned_flag, decimal_value);
858
double result= (double)real_op();
859
double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
865
if (!(res= str_op(&str_value)))
868
str2my_decimal(E_DEC_FATAL_ERROR, (char*) res->ptr(),
869
res->length(), res->charset(), decimal_value);
880
void Item_func_signed::print(String *str, enum_query_type query_type)
882
str->append(STRING_WITH_LEN("cast("));
883
args[0]->print(str, query_type);
884
str->append(STRING_WITH_LEN(" as signed)"));
889
longlong Item_func_signed::val_int_from_str(int *error)
891
char buff[MAX_FIELD_WIDTH], *end, *start;
893
String tmp(buff,sizeof(buff), &my_charset_bin), *res;
897
For a string result, we must first get the string and then convert it
901
if (!(res= args[0]->val_str(&tmp)))
908
start= (char *)res->ptr();
909
length= res->length();
912
value= my_strtoll10(start, &end, error);
913
if (*error > 0 || end != start+ length)
916
String err_tmp(err_buff,(uint32) sizeof(err_buff), system_charset_info);
917
err_tmp.copy(start, length, system_charset_info);
918
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
919
ER_TRUNCATED_WRONG_VALUE,
920
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
927
longlong Item_func_signed::val_int()
932
if (args[0]->cast_to_int_type() != STRING_RESULT ||
933
args[0]->result_as_longlong())
935
value= args[0]->val_int();
936
null_value= args[0]->null_value;
940
value= val_int_from_str(&error);
941
if (value < 0 && error == 0)
943
push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
944
"Cast to signed converted positive out-of-range integer to "
945
"it's negative complement");
951
void Item_func_unsigned::print(String *str, enum_query_type query_type)
953
str->append(STRING_WITH_LEN("cast("));
954
args[0]->print(str, query_type);
955
str->append(STRING_WITH_LEN(" as unsigned)"));
960
longlong Item_func_unsigned::val_int()
965
if (args[0]->cast_to_int_type() == DECIMAL_RESULT)
967
my_decimal tmp, *dec= args[0]->val_decimal(&tmp);
968
if (!(null_value= args[0]->null_value))
969
my_decimal2int(E_DEC_FATAL_ERROR, dec, 1, &value);
974
else if (args[0]->cast_to_int_type() != STRING_RESULT ||
975
args[0]->result_as_longlong())
977
value= args[0]->val_int();
978
null_value= args[0]->null_value;
982
value= val_int_from_str(&error);
984
push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
985
"Cast to unsigned converted negative integer to it's "
986
"positive complement");
991
String *Item_decimal_typecast::val_str(String *str)
993
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
996
my_decimal2string(E_DEC_FATAL_ERROR, tmp, 0, 0, 0, str);
1001
double Item_decimal_typecast::val_real()
1003
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1007
my_decimal2double(E_DEC_FATAL_ERROR, tmp, &res);
1012
longlong Item_decimal_typecast::val_int()
1014
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1018
my_decimal2int(E_DEC_FATAL_ERROR, tmp, unsigned_flag, &res);
1023
my_decimal *Item_decimal_typecast::val_decimal(my_decimal *dec)
1025
my_decimal tmp_buf, *tmp= args[0]->val_decimal(&tmp_buf);
1029
if ((null_value= args[0]->null_value))
1031
my_decimal_round(E_DEC_FATAL_ERROR, tmp, decimals, false, dec);
1037
my_decimal_set_zero(dec);
1041
precision= my_decimal_length_to_precision(max_length,
1042
decimals, unsigned_flag);
1043
if (precision - decimals < (uint) my_decimal_intg(dec))
1045
max_my_decimal(dec, precision, decimals);
1052
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
1053
ER_WARN_DATA_OUT_OF_RANGE,
1054
ER(ER_WARN_DATA_OUT_OF_RANGE),
1060
void Item_decimal_typecast::print(String *str, enum_query_type query_type)
1062
char len_buf[20*3 + 1];
1065
uint precision= my_decimal_length_to_precision(max_length, decimals,
1067
str->append(STRING_WITH_LEN("cast("));
1068
args[0]->print(str, query_type);
1069
str->append(STRING_WITH_LEN(" as decimal("));
1071
end=int10_to_str(precision, len_buf,10);
1072
str->append(len_buf, (uint32) (end - len_buf));
1076
end=int10_to_str(decimals, len_buf,10);
1077
str->append(len_buf, (uint32) (end - len_buf));
1084
double Item_func_plus::real_op()
1086
double value= args[0]->val_real() + args[1]->val_real();
1087
if ((null_value=args[0]->null_value || args[1]->null_value))
1089
return fix_result(value);
1093
longlong Item_func_plus::int_op()
1095
longlong value=args[0]->val_int()+args[1]->val_int();
1096
if ((null_value=args[0]->null_value || args[1]->null_value))
1103
Calculate plus of two decimals.
1105
@param decimal_value Buffer that can be used to store result
1108
0 Value was NULL; In this case null_value is set
1110
\# Value of operation as a decimal
1113
my_decimal *Item_func_plus::decimal_op(my_decimal *decimal_value)
1115
my_decimal value1, *val1;
1116
my_decimal value2, *val2;
1117
val1= args[0]->val_decimal(&value1);
1118
if ((null_value= args[0]->null_value))
1120
val2= args[1]->val_decimal(&value2);
1121
if (!(null_value= (args[1]->null_value ||
1122
(my_decimal_add(E_DEC_FATAL_ERROR, decimal_value, val1,
1124
return decimal_value;
1129
Set precision of results for additive operations (+ and -)
1131
void Item_func_additive_op::result_precision()
1133
decimals= max(args[0]->decimals, args[1]->decimals);
1134
int max_int_part= max(args[0]->decimal_precision() - args[0]->decimals,
1135
args[1]->decimal_precision() - args[1]->decimals);
1136
int precision= min(max_int_part + 1 + decimals, DECIMAL_MAX_PRECISION);
1138
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1139
if (result_type() == INT_RESULT)
1140
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1142
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1143
max_length= my_decimal_precision_to_length(precision, decimals,
1149
The following function is here to allow the user to force
1150
subtraction of UNSIGNED BIGINT to return negative values.
1153
void Item_func_minus::fix_length_and_dec()
1155
Item_num_op::fix_length_and_dec();
1156
if (unsigned_flag &&
1157
(current_thd->variables.sql_mode & MODE_NO_UNSIGNED_SUBTRACTION))
1162
double Item_func_minus::real_op()
1164
double value= args[0]->val_real() - args[1]->val_real();
1165
if ((null_value=args[0]->null_value || args[1]->null_value))
1167
return fix_result(value);
1171
longlong Item_func_minus::int_op()
1173
longlong value=args[0]->val_int() - args[1]->val_int();
1174
if ((null_value=args[0]->null_value || args[1]->null_value))
1181
See Item_func_plus::decimal_op for comments.
1184
my_decimal *Item_func_minus::decimal_op(my_decimal *decimal_value)
1186
my_decimal value1, *val1;
1187
my_decimal value2, *val2=
1189
val1= args[0]->val_decimal(&value1);
1190
if ((null_value= args[0]->null_value))
1192
val2= args[1]->val_decimal(&value2);
1193
if (!(null_value= (args[1]->null_value ||
1194
(my_decimal_sub(E_DEC_FATAL_ERROR, decimal_value, val1,
1196
return decimal_value;
1201
double Item_func_mul::real_op()
1204
double value= args[0]->val_real() * args[1]->val_real();
1205
if ((null_value=args[0]->null_value || args[1]->null_value))
1207
return fix_result(value);
1211
longlong Item_func_mul::int_op()
1214
longlong value=args[0]->val_int()*args[1]->val_int();
1215
if ((null_value=args[0]->null_value || args[1]->null_value))
1221
/** See Item_func_plus::decimal_op for comments. */
1223
my_decimal *Item_func_mul::decimal_op(my_decimal *decimal_value)
1225
my_decimal value1, *val1;
1226
my_decimal value2, *val2;
1227
val1= args[0]->val_decimal(&value1);
1228
if ((null_value= args[0]->null_value))
1230
val2= args[1]->val_decimal(&value2);
1231
if (!(null_value= (args[1]->null_value ||
1232
(my_decimal_mul(E_DEC_FATAL_ERROR, decimal_value, val1,
1234
return decimal_value;
1239
void Item_func_mul::result_precision()
1241
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1242
if (result_type() == INT_RESULT)
1243
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1245
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1246
decimals= min(args[0]->decimals + args[1]->decimals, DECIMAL_MAX_SCALE);
1247
int precision= min(args[0]->decimal_precision() + args[1]->decimal_precision(),
1248
DECIMAL_MAX_PRECISION);
1249
max_length= my_decimal_precision_to_length(precision, decimals,unsigned_flag);
1253
double Item_func_div::real_op()
1256
double value= args[0]->val_real();
1257
double val2= args[1]->val_real();
1258
if ((null_value= args[0]->null_value || args[1]->null_value))
1262
signal_divide_by_null();
1265
return fix_result(value/val2);
1269
my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
1271
my_decimal value1, *val1;
1272
my_decimal value2, *val2;
1275
val1= args[0]->val_decimal(&value1);
1276
if ((null_value= args[0]->null_value))
1278
val2= args[1]->val_decimal(&value2);
1279
if ((null_value= args[1]->null_value))
1281
if ((err= my_decimal_div(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
1282
val1, val2, prec_increment)) > 3)
1284
if (err == E_DEC_DIV_ZERO)
1285
signal_divide_by_null();
1289
return decimal_value;
1293
void Item_func_div::result_precision()
1295
uint precision=min(args[0]->decimal_precision() + prec_increment,
1296
DECIMAL_MAX_PRECISION);
1297
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1298
if (result_type() == INT_RESULT)
1299
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1301
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1302
decimals= min(args[0]->decimals + prec_increment, DECIMAL_MAX_SCALE);
1303
max_length= my_decimal_precision_to_length(precision, decimals,
1308
void Item_func_div::fix_length_and_dec()
1310
prec_increment= current_thd->variables.div_precincrement;
1311
Item_num_op::fix_length_and_dec();
1312
switch(hybrid_type) {
1315
decimals=max(args[0]->decimals,args[1]->decimals)+prec_increment;
1316
set_if_smaller(decimals, NOT_FIXED_DEC);
1317
max_length=args[0]->max_length - args[0]->decimals + decimals;
1318
uint tmp=float_length(decimals);
1319
set_if_smaller(max_length,tmp);
1323
hybrid_type= DECIMAL_RESULT;
1326
case DECIMAL_RESULT:
1332
maybe_null= 1; // devision by zero
1337
/* Integer division */
1338
longlong Item_func_int_div::val_int()
1341
longlong value=args[0]->val_int();
1342
longlong val2=args[1]->val_int();
1343
if ((null_value= (args[0]->null_value || args[1]->null_value)))
1347
signal_divide_by_null();
1350
return (unsigned_flag ?
1351
(ulonglong) value / (ulonglong) val2 :
1356
void Item_func_int_div::fix_length_and_dec()
1358
Item_result argtype= args[0]->result_type();
1359
/* use precision ony for the data type it is applicable for and valid */
1360
max_length=args[0]->max_length -
1361
(argtype == DECIMAL_RESULT || argtype == INT_RESULT ?
1362
args[0]->decimals : 0);
1364
unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag;
1368
longlong Item_func_mod::int_op()
1371
longlong value= args[0]->val_int();
1372
longlong val2= args[1]->val_int();
1375
if ((null_value= args[0]->null_value || args[1]->null_value))
1376
return 0; /* purecov: inspected */
1379
signal_divide_by_null();
1383
if (args[0]->unsigned_flag)
1384
result= args[1]->unsigned_flag ?
1385
((ulonglong) value) % ((ulonglong) val2) : ((ulonglong) value) % val2;
1387
result= args[1]->unsigned_flag ?
1388
value % ((ulonglong) val2) : value % val2;
1393
double Item_func_mod::real_op()
1396
double value= args[0]->val_real();
1397
double val2= args[1]->val_real();
1398
if ((null_value= args[0]->null_value || args[1]->null_value))
1399
return 0.0; /* purecov: inspected */
1402
signal_divide_by_null();
1405
return fmod(value,val2);
1409
my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value)
1411
my_decimal value1, *val1;
1412
my_decimal value2, *val2;
1414
val1= args[0]->val_decimal(&value1);
1415
if ((null_value= args[0]->null_value))
1417
val2= args[1]->val_decimal(&value2);
1418
if ((null_value= args[1]->null_value))
1420
switch (my_decimal_mod(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
1422
case E_DEC_TRUNCATED:
1424
return decimal_value;
1425
case E_DEC_DIV_ZERO:
1426
signal_divide_by_null();
1434
void Item_func_mod::result_precision()
1436
decimals= max(args[0]->decimals, args[1]->decimals);
1437
max_length= max(args[0]->max_length, args[1]->max_length);
1441
void Item_func_mod::fix_length_and_dec()
1443
Item_num_op::fix_length_and_dec();
1445
unsigned_flag= args[0]->unsigned_flag;
1449
double Item_func_neg::real_op()
1451
double value= args[0]->val_real();
1452
null_value= args[0]->null_value;
1457
longlong Item_func_neg::int_op()
1459
longlong value= args[0]->val_int();
1460
null_value= args[0]->null_value;
1465
my_decimal *Item_func_neg::decimal_op(my_decimal *decimal_value)
1467
my_decimal val, *value= args[0]->val_decimal(&val);
1468
if (!(null_value= args[0]->null_value))
1470
my_decimal2decimal(value, decimal_value);
1471
my_decimal_neg(decimal_value);
1472
return decimal_value;
1478
void Item_func_neg::fix_num_length_and_dec()
1480
decimals= args[0]->decimals;
1481
/* 1 add because sign can appear */
1482
max_length= args[0]->max_length + 1;
1486
void Item_func_neg::fix_length_and_dec()
1488
Item_func_num1::fix_length_and_dec();
1491
If this is in integer context keep the context as integer if possible
1492
(This is how multiplication and other integer functions works)
1493
Use val() to get value as arg_type doesn't mean that item is
1494
Item_int or Item_real due to existence of Item_param.
1496
if (hybrid_type == INT_RESULT && args[0]->const_item())
1498
longlong val= args[0]->val_int();
1499
if ((ulonglong) val >= (ulonglong) LONGLONG_MIN &&
1500
((ulonglong) val != (ulonglong) LONGLONG_MIN ||
1501
args[0]->type() != INT_ITEM))
1504
Ensure that result is converted to DECIMAL, as longlong can't hold
1507
hybrid_type= DECIMAL_RESULT;
1515
double Item_func_abs::real_op()
1517
double value= args[0]->val_real();
1518
null_value= args[0]->null_value;
1523
longlong Item_func_abs::int_op()
1525
longlong value= args[0]->val_int();
1526
if ((null_value= args[0]->null_value))
1528
return (value >= 0) || unsigned_flag ? value : -value;
1532
my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
1534
my_decimal val, *value= args[0]->val_decimal(&val);
1535
if (!(null_value= args[0]->null_value))
1537
my_decimal2decimal(value, decimal_value);
1538
if (decimal_value->sign())
1539
my_decimal_neg(decimal_value);
1540
return decimal_value;
1546
void Item_func_abs::fix_length_and_dec()
1548
Item_func_num1::fix_length_and_dec();
1549
unsigned_flag= args[0]->unsigned_flag;
1553
/** Gateway to natural LOG function. */
1554
double Item_func_ln::val_real()
1557
double value= args[0]->val_real();
1558
if ((null_value= args[0]->null_value))
1562
signal_divide_by_null();
1569
Extended but so slower LOG function.
1571
We have to check if all values are > zero and first one is not one
1572
as these are the cases then result is not a number.
1574
double Item_func_log::val_real()
1577
double value= args[0]->val_real();
1578
if ((null_value= args[0]->null_value))
1582
signal_divide_by_null();
1587
double value2= args[1]->val_real();
1588
if ((null_value= args[1]->null_value))
1590
if (value2 <= 0.0 || value == 1.0)
1592
signal_divide_by_null();
1595
return log(value2) / log(value);
1600
double Item_func_log2::val_real()
1603
double value= args[0]->val_real();
1605
if ((null_value=args[0]->null_value))
1609
signal_divide_by_null();
1612
return log(value) / M_LN2;
1615
double Item_func_log10::val_real()
1618
double value= args[0]->val_real();
1619
if ((null_value= args[0]->null_value))
1623
signal_divide_by_null();
1626
return log10(value);
1629
double Item_func_exp::val_real()
1632
double value= args[0]->val_real();
1633
if ((null_value=args[0]->null_value))
1634
return 0.0; /* purecov: inspected */
1635
return fix_result(exp(value));
1638
double Item_func_sqrt::val_real()
1641
double value= args[0]->val_real();
1642
if ((null_value=(args[0]->null_value || value < 0)))
1643
return 0.0; /* purecov: inspected */
1647
double Item_func_pow::val_real()
1650
double value= args[0]->val_real();
1651
double val2= args[1]->val_real();
1652
if ((null_value=(args[0]->null_value || args[1]->null_value)))
1653
return 0.0; /* purecov: inspected */
1654
return fix_result(pow(value,val2));
1657
// Trigonometric functions
1659
double Item_func_acos::val_real()
1662
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
1663
volatile double value= args[0]->val_real();
1664
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
1669
double Item_func_asin::val_real()
1672
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
1673
volatile double value= args[0]->val_real();
1674
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
1679
double Item_func_atan::val_real()
1682
double value= args[0]->val_real();
1683
if ((null_value=args[0]->null_value))
1687
double val2= args[1]->val_real();
1688
if ((null_value=args[1]->null_value))
1690
return fix_result(atan2(value,val2));
1695
double Item_func_cos::val_real()
1698
double value= args[0]->val_real();
1699
if ((null_value=args[0]->null_value))
1704
double Item_func_sin::val_real()
1707
double value= args[0]->val_real();
1708
if ((null_value=args[0]->null_value))
1713
double Item_func_tan::val_real()
1716
double value= args[0]->val_real();
1717
if ((null_value=args[0]->null_value))
1719
return fix_result(tan(value));
153
1723
// Shift-functions, same as << and >> in C/C++
155
int64_t Item_func_shift_left::val_int()
1726
longlong Item_func_shift_left::val_int()
157
1728
assert(fixed == 1);
159
uint64_t res= ((uint64_t) args[0]->val_int() <<
1730
ulonglong res= ((ulonglong) args[0]->val_int() <<
160
1731
(shift=(uint) args[1]->val_int()));
161
1732
if (args[0]->null_value || args[1]->null_value)
198
1769
void Item_func_integer::fix_length_and_dec()
200
1771
max_length=args[0]->max_length - args[0]->decimals+1;
201
uint32_t tmp=float_length(decimals);
1772
uint tmp=float_length(decimals);
202
1773
set_if_smaller(max_length,tmp);
1777
void Item_func_int_val::fix_num_length_and_dec()
1779
max_length= args[0]->max_length - (args[0]->decimals ?
1780
args[0]->decimals + 1 :
1782
uint tmp= float_length(decimals);
1783
set_if_smaller(max_length,tmp);
1788
void Item_func_int_val::find_num_type()
1790
switch(hybrid_type= args[0]->result_type())
1794
hybrid_type= REAL_RESULT;
1795
max_length= float_length(decimals);
1798
case DECIMAL_RESULT:
1800
-2 because in most high position can't be used any digit for longlong
1801
and one position for increasing value during operation
1803
if ((args[0]->max_length - args[0]->decimals) >=
1804
(DECIMAL_LONGLONG_DIGITS - 2))
1806
hybrid_type= DECIMAL_RESULT;
1810
unsigned_flag= args[0]->unsigned_flag;
1811
hybrid_type= INT_RESULT;
1821
longlong Item_func_ceiling::int_op()
1824
switch (args[0]->result_type()) {
1826
result= args[0]->val_int();
1827
null_value= args[0]->null_value;
1829
case DECIMAL_RESULT:
1831
my_decimal dec_buf, *dec;
1832
if ((dec= Item_func_ceiling::decimal_op(&dec_buf)))
1833
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1839
result= (longlong)Item_func_ceiling::real_op();
1845
double Item_func_ceiling::real_op()
1848
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1851
volatile double value= args[0]->val_real();
1852
null_value= args[0]->null_value;
1857
my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value)
1859
my_decimal val, *value= args[0]->val_decimal(&val);
1860
if (!(null_value= (args[0]->null_value ||
1861
my_decimal_ceiling(E_DEC_FATAL_ERROR, value,
1862
decimal_value) > 1)))
1863
return decimal_value;
1868
longlong Item_func_floor::int_op()
1871
switch (args[0]->result_type()) {
1873
result= args[0]->val_int();
1874
null_value= args[0]->null_value;
1876
case DECIMAL_RESULT:
1878
my_decimal dec_buf, *dec;
1879
if ((dec= Item_func_floor::decimal_op(&dec_buf)))
1880
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1886
result= (longlong)Item_func_floor::real_op();
1892
double Item_func_floor::real_op()
1895
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1898
volatile double value= args[0]->val_real();
1899
null_value= args[0]->null_value;
1900
return floor(value);
1904
my_decimal *Item_func_floor::decimal_op(my_decimal *decimal_value)
1906
my_decimal val, *value= args[0]->val_decimal(&val);
1907
if (!(null_value= (args[0]->null_value ||
1908
my_decimal_floor(E_DEC_FATAL_ERROR, value,
1909
decimal_value) > 1)))
1910
return decimal_value;
1915
void Item_func_round::fix_length_and_dec()
1917
int decimals_to_set;
1921
unsigned_flag= args[0]->unsigned_flag;
1922
if (!args[1]->const_item())
1924
max_length= args[0]->max_length;
1925
decimals= args[0]->decimals;
1926
if (args[0]->result_type() == DECIMAL_RESULT)
1929
hybrid_type= DECIMAL_RESULT;
1932
hybrid_type= REAL_RESULT;
1936
val1= args[1]->val_int();
1937
val1_unsigned= args[1]->unsigned_flag;
1939
decimals_to_set= val1_unsigned ? INT_MAX : 0;
1941
decimals_to_set= (val1 > INT_MAX) ? INT_MAX : (int) val1;
1943
if (args[0]->decimals == NOT_FIXED_DEC)
1945
max_length= args[0]->max_length;
1946
decimals= min(decimals_to_set, NOT_FIXED_DEC);
1947
hybrid_type= REAL_RESULT;
1951
switch (args[0]->result_type()) {
1954
hybrid_type= REAL_RESULT;
1955
decimals= min(decimals_to_set, NOT_FIXED_DEC);
1956
max_length= float_length(decimals);
1959
if ((!decimals_to_set && truncate) || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))
1961
int length_can_increase= test(!truncate && (val1 < 0) && !val1_unsigned);
1962
max_length= args[0]->max_length + length_can_increase;
1963
/* Here we can keep INT_RESULT */
1964
hybrid_type= INT_RESULT;
1969
case DECIMAL_RESULT:
1971
hybrid_type= DECIMAL_RESULT;
1972
decimals_to_set= min(DECIMAL_MAX_SCALE, decimals_to_set);
1973
int decimals_delta= args[0]->decimals - decimals_to_set;
1974
int precision= args[0]->decimal_precision();
1975
int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1;
1977
precision-= decimals_delta - length_increase;
1978
decimals= min(decimals_to_set, DECIMAL_MAX_SCALE);
1979
max_length= my_decimal_precision_to_length(precision, decimals,
1984
assert(0); /* This result type isn't handled */
1988
double my_double_round(double value, longlong dec, bool dec_unsigned,
1992
bool dec_negative= (dec < 0) && !dec_unsigned;
1993
ulonglong abs_dec= dec_negative ? -dec : dec;
1995
tmp2 is here to avoid return the value with 80 bit precision
1996
This will fix that the test round(0.1,1) = round(0.1,1) is true
1998
volatile double tmp2;
2000
tmp=(abs_dec < array_elements(log_10) ?
2001
log_10[abs_dec] : pow(10.0,(double) abs_dec));
2003
if (dec_negative && my_isinf(tmp))
2005
else if (!dec_negative && my_isinf(value * tmp))
2010
tmp2= dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp;
2012
tmp2= dec < 0 ? ceil(value/tmp)*tmp : ceil(value*tmp)/tmp;
2015
tmp2=dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp;
2020
double Item_func_round::real_op()
2022
double value= args[0]->val_real();
2024
if (!(null_value= args[0]->null_value || args[1]->null_value))
2025
return my_double_round(value, args[1]->val_int(), args[1]->unsigned_flag,
2032
Rounds a given value to a power of 10 specified as the 'to' argument,
2033
avoiding overflows when the value is close to the ulonglong range boundary.
2036
static inline ulonglong my_unsigned_round(ulonglong value, ulonglong to)
2038
ulonglong tmp= value / to * to;
2039
return (value - tmp < (to >> 1)) ? tmp : tmp + to;
2043
longlong Item_func_round::int_op()
2045
longlong value= args[0]->val_int();
2046
longlong dec= args[1]->val_int();
2049
if ((null_value= args[0]->null_value || args[1]->null_value))
2051
if ((dec >= 0) || args[1]->unsigned_flag)
2052
return value; // integer have not digits after point
2057
if(abs_dec >= array_elements(log_10_int))
2060
tmp= log_10_int[abs_dec];
2063
value= (unsigned_flag) ?
2064
((ulonglong) value / tmp) * tmp : (value / tmp) * tmp;
2066
value= (unsigned_flag || value >= 0) ?
2067
my_unsigned_round((ulonglong) value, tmp) :
2068
-(longlong) my_unsigned_round((ulonglong) -value, tmp);
2073
my_decimal *Item_func_round::decimal_op(my_decimal *decimal_value)
2075
my_decimal val, *value= args[0]->val_decimal(&val);
2076
longlong dec= args[1]->val_int();
2077
if (dec >= 0 || args[1]->unsigned_flag)
2078
dec= min((ulonglong) dec, decimals);
2079
else if (dec < INT_MIN)
2082
if (!(null_value= (args[0]->null_value || args[1]->null_value ||
2083
my_decimal_round(E_DEC_FATAL_ERROR, value, (int) dec,
2084
truncate, decimal_value) > 1)))
2086
decimal_value->frac= decimals;
2087
return decimal_value;
2093
void Item_func_rand::seed_random(Item *arg)
2096
TODO: do not do reinit 'rand' for every execute of PS/SP if
2097
args[0] is a constant.
2099
uint32 tmp= (uint32) arg->val_int();
2100
randominit(rand, (uint32) (tmp*0x10001L+55555555L),
2101
(uint32) (tmp*0x10000001L));
2105
bool Item_func_rand::fix_fields(THD *thd,Item **ref)
2107
if (Item_real_func::fix_fields(thd, ref))
2109
used_tables_cache|= RAND_TABLE_BIT;
2111
{ // Only use argument once in query
2113
Allocate rand structure once: we must use thd->stmt_arena
2114
to create rand in proper mem_root if it's a prepared statement or
2117
No need to send a Rand log event if seed was given eg: RAND(seed),
2118
as it will be replicated in the query as such.
2120
if (!rand && !(rand= (struct rand_struct*)
2121
thd->stmt_arena->alloc(sizeof(*rand))))
2124
if (args[0]->const_item())
2125
seed_random (args[0]);
2130
Save the seed only the first time RAND() is used in the query
2131
Once events are forwarded rather than recreated,
2132
the following can be skipped if inside the slave thread
2134
if (!thd->rand_used)
2137
thd->rand_saved_seed1= thd->rand.seed1;
2138
thd->rand_saved_seed2= thd->rand.seed2;
2145
void Item_func_rand::update_used_tables()
2147
Item_real_func::update_used_tables();
2148
used_tables_cache|= RAND_TABLE_BIT;
2152
double Item_func_rand::val_real()
2155
if (arg_count && !args[0]->const_item())
2156
seed_random (args[0]);
2157
return my_rnd(rand);
2160
longlong Item_func_sign::val_int()
2163
double value= args[0]->val_real();
2164
null_value=args[0]->null_value;
2165
return value < 0.0 ? -1 : (value > 0 ? 1 : 0);
206
2169
double Item_func_units::val_real()
208
2171
assert(fixed == 1);
216
int64_t Item_func_char_length::val_int()
219
String *res=args[0]->val_str(&value);
223
return 0; /* purecov: inspected */
226
return (int64_t) res->numchars();
230
int64_t Item_func_coercibility::val_int()
2179
void Item_func_min_max::fix_length_and_dec()
2182
bool datetime_found= false;
2186
cmp_type=args[0]->result_type();
2188
for (uint i=0 ; i < arg_count ; i++)
2190
set_if_bigger(max_length, args[i]->max_length);
2191
set_if_bigger(decimals, args[i]->decimals);
2192
set_if_bigger(max_int_part, args[i]->decimal_int_part());
2193
if (args[i]->maybe_null)
2195
cmp_type=item_cmp_type(cmp_type,args[i]->result_type());
2196
if (args[i]->result_type() != ROW_RESULT && args[i]->is_datetime())
2198
datetime_found= true;
2199
if (!datetime_item || args[i]->field_type() == MYSQL_TYPE_DATETIME)
2200
datetime_item= args[i];
2203
if (cmp_type == STRING_RESULT)
2205
agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV, 1);
2209
compare_as_dates= true;
2212
else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
2213
max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals,
2215
cached_field_type= agg_field_type(args, arg_count);
2220
Compare item arguments in the DATETIME context.
2224
value [out] found least/greatest DATE/DATETIME value
2227
Compare item arguments as DATETIME values and return the index of the
2228
least/greatest argument in the arguments array.
2229
The correct integer DATE/DATETIME value of the found argument is
2230
stored to the value pointer, if latter is provided.
2233
0 If one of arguments is NULL
2234
# index of the least/greatest argument
2237
uint Item_func_min_max::cmp_datetimes(ulonglong *value)
2239
ulonglong min_max= 0;
2240
uint min_max_idx= 0;
2242
for (uint i=0; i < arg_count ; i++)
2244
Item **arg= args + i;
2246
ulonglong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
2247
if ((null_value= args[i]->null_value))
2249
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
2258
if (datetime_item->field_type() == MYSQL_TYPE_NEWDATE)
2265
String *Item_func_min_max::val_str(String *str)
2268
if (compare_as_dates)
2271
uint min_max_idx= cmp_datetimes(NULL);
2274
str_res= args[min_max_idx]->val_str(str);
2275
str_res->set_charset(collation.collation);
2281
longlong nr=val_int();
2284
str->set_int(nr, unsigned_flag, &my_charset_bin);
2287
case DECIMAL_RESULT:
2289
my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
2292
my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
2297
double nr= val_real();
2299
return 0; /* purecov: inspected */
2300
str->set_real(nr,decimals,&my_charset_bin);
2307
for (uint i=0; i < arg_count ; i++)
2310
res=args[i]->val_str(str);
2314
res2= args[i]->val_str(res == str ? &tmp_value : str);
2317
int cmp= sortcmp(res,res2,collation.collation);
2318
if ((cmp_sign < 0 ? cmp : -cmp) < 0)
2322
if ((null_value= args[i]->null_value))
2325
res->set_charset(collation.collation);
2330
// This case should never be chosen
2334
return 0; // Keep compiler happy
2338
double Item_func_min_max::val_real()
2342
if (compare_as_dates)
2344
ulonglong result= 0;
2345
(void)cmp_datetimes(&result);
2346
return (double)result;
2348
for (uint i=0; i < arg_count ; i++)
2351
value= args[i]->val_real();
2354
double tmp= args[i]->val_real();
2355
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
2358
if ((null_value= args[i]->null_value))
2365
longlong Item_func_min_max::val_int()
2369
if (compare_as_dates)
2371
ulonglong result= 0;
2372
(void)cmp_datetimes(&result);
2373
return (longlong)result;
2375
for (uint i=0; i < arg_count ; i++)
2378
value=args[i]->val_int();
2381
longlong tmp=args[i]->val_int();
2382
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
2385
if ((null_value= args[i]->null_value))
2392
my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
2395
my_decimal tmp_buf, *tmp, *res= NULL;
2397
if (compare_as_dates)
2400
(void)cmp_datetimes(&value);
2401
ulonglong2decimal(value, dec);
2404
for (uint i=0; i < arg_count ; i++)
2407
res= args[i]->val_decimal(dec);
2410
tmp= args[i]->val_decimal(&tmp_buf); // Zero if NULL
2411
if (tmp && (my_decimal_cmp(tmp, res) * cmp_sign) < 0)
2413
if (tmp == &tmp_buf)
2415
/* Move value out of tmp_buf as this will be reused on next loop */
2416
my_decimal2decimal(tmp, dec);
2423
if ((null_value= args[i]->null_value))
2433
longlong Item_func_length::val_int()
2436
String *res=args[0]->val_str(&value);
2440
return 0; /* purecov: inspected */
2443
return (longlong) res->length();
2447
longlong Item_func_char_length::val_int()
2450
String *res=args[0]->val_str(&value);
2454
return 0; /* purecov: inspected */
2457
return (longlong) res->numchars();
2461
longlong Item_func_coercibility::val_int()
232
2463
assert(fixed == 1);
234
return (int64_t) args[0]->collation.derivation;
2465
return (longlong) args[0]->collation.derivation;
478
2725
else if (str_end - str_begin == 0 &&
479
2726
find_str_len == 0 &&
480
2727
wc == (my_wc_t) separator)
481
return (int64_t) ++position;
2728
return (longlong) ++position;
489
int64_t Item_func_bit_count::val_int()
2736
longlong Item_func_bit_count::val_int()
491
2738
assert(fixed == 1);
492
uint64_t value= (uint64_t) args[0]->val_int();
2739
ulonglong value= (ulonglong) args[0]->val_int();
493
2740
if ((null_value= args[0]->null_value))
494
2741
return 0; /* purecov: inspected */
495
return (int64_t) my_count_bits(value);
2742
return (longlong) my_count_bits(value);
2746
/****************************************************************************
2747
** Functions to handle dynamic loadable functions
2748
** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
2749
** Rewritten by monty.
2750
****************************************************************************/
2752
void udf_handler::cleanup()
2758
if (u_d->func_deinit != NULL)
2760
Udf_func_deinit deinit= u_d->func_deinit;
2766
if (buffers) // Because of bug in ecc
2774
udf_handler::fix_fields(THD *thd, Item_result_field *func,
2775
uint arg_count, Item **arguments)
2777
uchar buff[STACK_BUFF_ALLOC]; // Max argument in function
2779
if (check_stack_overrun(thd, STACK_MIN_SIZE, buff))
2780
return(true); // Fatal error flag is set!
2782
udf_func *tmp_udf=find_udf(u_d->name.str,(uint) u_d->name.length);
2786
my_error(ER_CANT_FIND_UDF, MYF(0), u_d->name.str, errno);
2792
/* Fix all arguments */
2794
used_tables_cache=0;
2797
if ((f_args.arg_count=arg_count))
2799
if (!(f_args.arg_type= (Item_result*)
2800
sql_alloc(f_args.arg_count*sizeof(Item_result))))
2806
Item **arg,**arg_end;
2807
for (i=0, arg=arguments, arg_end=arguments+arg_count;
2811
if (!(*arg)->fixed &&
2812
(*arg)->fix_fields(thd, arg))
2814
// we can't assign 'item' before, because fix_fields() can change arg
2816
if (item->check_cols(1))
2819
TODO: We should think about this. It is not always
2820
right way just to set an UDF result to return my_charset_bin
2821
if one argument has binary sorting order.
2822
The result collation should be calculated according to arguments
2823
derivations in some cases and should not in other cases.
2824
Moreover, some arguments can represent a numeric input
2825
which doesn't effect the result character set and collation.
2826
There is no a general rule for UDF. Everything depends on
2827
the particular user defined function.
2829
if (item->collation.collation->state & MY_CS_BINSORT)
2830
func->collation.set(&my_charset_bin);
2831
if (item->maybe_null)
2833
func->with_sum_func= func->with_sum_func || item->with_sum_func;
2834
used_tables_cache|=item->used_tables();
2835
const_item_cache&=item->const_item();
2836
f_args.arg_type[i]=item->result_type();
2838
//TODO: why all following memory is not allocated with 1 call of sql_alloc?
2839
if (!(buffers=new String[arg_count]) ||
2840
!(f_args.args= (char**) sql_alloc(arg_count * sizeof(char *))) ||
2841
!(f_args.lengths= (ulong*) sql_alloc(arg_count * sizeof(long))) ||
2842
!(f_args.maybe_null= (char*) sql_alloc(arg_count * sizeof(char))) ||
2843
!(num_buffer= (char*) sql_alloc(arg_count *
2844
ALIGN_SIZE(sizeof(double)))) ||
2845
!(f_args.attributes= (char**) sql_alloc(arg_count * sizeof(char *))) ||
2846
!(f_args.attribute_lengths= (ulong*) sql_alloc(arg_count *
2852
func->fix_length_and_dec();
2853
initid.max_length=func->max_length;
2854
initid.maybe_null=func->maybe_null;
2855
initid.const_item=const_item_cache;
2856
initid.decimals=func->decimals;
2861
char init_msg_buff[MYSQL_ERRMSG_SIZE];
2862
char *to=num_buffer;
2863
for (uint i=0; i < arg_count; i++)
2866
For a constant argument i, args->args[i] points to the argument value.
2867
For non-constant, args->args[i] is NULL.
2869
f_args.args[i]= NULL; /* Non-const unless updated below. */
2871
f_args.lengths[i]= arguments[i]->max_length;
2872
f_args.maybe_null[i]= (char) arguments[i]->maybe_null;
2873
f_args.attributes[i]= arguments[i]->name;
2874
f_args.attribute_lengths[i]= arguments[i]->name_length;
2876
if (arguments[i]->const_item())
2878
switch (arguments[i]->result_type())
2881
case DECIMAL_RESULT:
2883
String *res= arguments[i]->val_str(&buffers[i]);
2884
if (arguments[i]->null_value)
2886
f_args.args[i]= (char*) res->c_ptr();
2887
f_args.lengths[i]= res->length();
2891
*((longlong*) to)= arguments[i]->val_int();
2892
if (arguments[i]->null_value)
2895
to+= ALIGN_SIZE(sizeof(longlong));
2898
*((double*) to)= arguments[i]->val_real();
2899
if (arguments[i]->null_value)
2902
to+= ALIGN_SIZE(sizeof(double));
2906
// This case should never be chosen
2912
Udf_func_init init= u_d->func_init;
2913
if ((error=(uchar) init(&initid, &f_args, init_msg_buff)))
2915
my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
2916
u_d->name.str, init_msg_buff);
2919
func->max_length=min(initid.max_length,MAX_BLOB_WIDTH);
2920
func->maybe_null=initid.maybe_null;
2921
const_item_cache=initid.const_item;
2923
Keep used_tables_cache in sync with const_item_cache.
2924
See the comment in Item_udf_func::update_used tables.
2926
if (!const_item_cache && !used_tables_cache)
2927
used_tables_cache= RAND_TABLE_BIT;
2928
func->decimals=min(initid.decimals,NOT_FIXED_DEC);
2933
my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
2934
u_d->name.str, ER(ER_UNKNOWN_ERROR));
2941
bool udf_handler::get_arguments()
2944
return 1; // Got an error earlier
2945
char *to= num_buffer;
2947
for (uint i=0; i < f_args.arg_count; i++)
2950
switch (f_args.arg_type[i]) {
2952
case DECIMAL_RESULT:
2954
String *res=args[i]->val_str(&buffers[str_count++]);
2955
if (!(args[i]->null_value))
2957
f_args.args[i]= (char*) res->ptr();
2958
f_args.lengths[i]= res->length();
2963
*((longlong*) to) = args[i]->val_int();
2964
if (!args[i]->null_value)
2967
to+= ALIGN_SIZE(sizeof(longlong));
2971
*((double*) to)= args[i]->val_real();
2972
if (!args[i]->null_value)
2975
to+= ALIGN_SIZE(sizeof(double));
2980
// This case should never be chosen
2990
(String*)NULL in case of NULL values
2992
String *udf_handler::val_str(String *str,String *save_str)
2994
uchar is_null_tmp=0;
2997
if (get_arguments())
2999
char * (*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
3000
(char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
3003
if ((res_length=str->alloced_length()) < MAX_FIELD_WIDTH)
3004
{ // This happens VERY seldom
3005
if (str->alloc(MAX_FIELD_WIDTH))
3011
char *res=func(&initid, &f_args, (char*) str->ptr(), &res_length,
3012
&is_null_tmp, &error);
3013
if (is_null_tmp || !res || error) // The !res is for safety
3017
if (res == str->ptr())
3019
str->length(res_length);
3022
save_str->set(res, res_length, str->charset());
3028
For the moment, UDF functions are returning DECIMAL values as strings
3031
my_decimal *udf_handler::val_decimal(my_bool *null_value, my_decimal *dec_buf)
3033
char buf[DECIMAL_MAX_STR_LENGTH+1], *end;
3034
ulong res_length= DECIMAL_MAX_STR_LENGTH;
3036
if (get_arguments())
3041
char *(*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
3042
(char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
3045
char *res= func(&initid, &f_args, buf, &res_length, &is_null, &error);
3046
if (is_null || error)
3051
end= res+ res_length;
3052
str2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf, &end);
3057
void Item_udf_func::cleanup()
3060
Item_func::cleanup();
3064
void Item_udf_func::print(String *str, enum_query_type query_type)
3066
str->append(func_name());
3068
for (uint i=0 ; i < arg_count ; i++)
3072
args[i]->print_item_w_name(str, query_type);
3078
double Item_func_udf_float::val_real()
3081
return(udf.val(&null_value));
3085
String *Item_func_udf_float::val_str(String *str)
3088
double nr= val_real();
3090
return 0; /* purecov: inspected */
3091
str->set_real(nr,decimals,&my_charset_bin);
3096
longlong Item_func_udf_int::val_int()
3099
return(udf.val_int(&null_value));
3103
String *Item_func_udf_int::val_str(String *str)
3106
longlong nr=val_int();
3109
str->set_int(nr, unsigned_flag, &my_charset_bin);
3114
longlong Item_func_udf_decimal::val_int()
3116
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3120
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
3125
double Item_func_udf_decimal::val_real()
3127
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3131
my_decimal2double(E_DEC_FATAL_ERROR, dec, &result);
3136
my_decimal *Item_func_udf_decimal::val_decimal(my_decimal *dec_buf)
3139
return(udf.val_decimal(&null_value, dec_buf));
3143
String *Item_func_udf_decimal::val_str(String *str)
3145
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3148
if (str->length() < DECIMAL_MAX_STR_LENGTH)
3149
str->length(DECIMAL_MAX_STR_LENGTH);
3150
my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
3151
my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, '0', str);
3156
void Item_func_udf_decimal::fix_length_and_dec()
3158
fix_num_length_and_dec();
3162
/* Default max_length is max argument length */
3164
void Item_func_udf_str::fix_length_and_dec()
3167
for (uint i = 0; i < arg_count; i++)
3168
set_if_bigger(max_length,args[i]->max_length);
3172
String *Item_func_udf_str::val_str(String *str)
3175
String *res=udf.val_str(str,&str_value);
3183
This has to come last in the udf_handler methods, or C for AIX
3184
version 6.0.0.0 fails to compile with debugging enabled. (Yes, really.)
3187
udf_handler::~udf_handler()
3189
/* Everything should be properly cleaned up by this moment. */
3190
assert(not_original || !(initialized || buffers));