150
150
return copy_or_same(thd);
155
void Item_func_connection_id::fix_length_and_dec()
157
Item_int_func::fix_length_and_dec();
162
bool Item_func_connection_id::fix_fields(THD *thd, Item **ref)
164
if (Item_int_func::fix_fields(thd, ref))
166
thd->thread_specific_used= true;
167
value= thd->variables.pseudo_thread_id;
173
Set result type for a numeric function of one argument
174
(can be also used by a numeric function of many arguments, if the result
175
type depends only on the first argument)
178
void Item_func_num1::find_num_type()
180
switch (hybrid_type= args[0]->result_type()) {
182
unsigned_flag= args[0]->unsigned_flag;
186
hybrid_type= REAL_RESULT;
187
max_length= float_length(decimals);
198
void Item_func_num1::fix_num_length_and_dec()
200
decimals= args[0]->decimals;
201
max_length= args[0]->max_length;
205
void Item_func_signed::print(String *str, enum_query_type query_type)
207
str->append(STRING_WITH_LEN("cast("));
208
args[0]->print(str, query_type);
209
str->append(STRING_WITH_LEN(" as signed)"));
213
int64_t Item_func_signed::val_int_from_str(int *error)
215
char buff[MAX_FIELD_WIDTH], *end, *start;
217
String tmp(buff,sizeof(buff), &my_charset_bin), *res;
221
For a string result, we must first get the string and then convert it
225
if (!(res= args[0]->val_str(&tmp)))
232
start= (char *)res->ptr();
233
length= res->length();
236
value= my_strtoll10(start, &end, error);
237
if (*error > 0 || end != start+ length)
240
String err_tmp(err_buff,(uint32_t) sizeof(err_buff), system_charset_info);
241
err_tmp.copy(start, length, system_charset_info);
242
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
243
ER_TRUNCATED_WRONG_VALUE,
244
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
251
int64_t Item_func_signed::val_int()
256
if (args[0]->cast_to_int_type() != STRING_RESULT ||
257
args[0]->result_as_int64_t())
259
value= args[0]->val_int();
260
null_value= args[0]->null_value;
264
value= val_int_from_str(&error);
265
if (value < 0 && error == 0)
267
push_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
268
"Cast to signed converted positive out-of-range integer to "
269
"it's negative complement");
275
void Item_func_unsigned::print(String *str, enum_query_type query_type)
277
str->append(STRING_WITH_LEN("cast("));
278
args[0]->print(str, query_type);
279
str->append(STRING_WITH_LEN(" as unsigned)"));
284
int64_t Item_func_unsigned::val_int()
289
if (args[0]->cast_to_int_type() == DECIMAL_RESULT)
291
my_decimal tmp, *dec= args[0]->val_decimal(&tmp);
292
if (!(null_value= args[0]->null_value))
293
my_decimal2int(E_DEC_FATAL_ERROR, dec, 1, &value);
298
else if (args[0]->cast_to_int_type() != STRING_RESULT ||
299
args[0]->result_as_int64_t())
301
value= args[0]->val_int();
302
null_value= args[0]->null_value;
306
value= val_int_from_str(&error);
308
push_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
309
"Cast to unsigned converted negative integer to it's "
310
"positive complement");
315
String *Item_decimal_typecast::val_str(String *str)
317
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
320
my_decimal2string(E_DEC_FATAL_ERROR, tmp, 0, 0, 0, str);
325
double Item_decimal_typecast::val_real()
327
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
331
my_decimal2double(E_DEC_FATAL_ERROR, tmp, &res);
336
int64_t Item_decimal_typecast::val_int()
338
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
342
my_decimal2int(E_DEC_FATAL_ERROR, tmp, unsigned_flag, &res);
347
my_decimal *Item_decimal_typecast::val_decimal(my_decimal *dec)
349
my_decimal tmp_buf, *tmp= args[0]->val_decimal(&tmp_buf);
353
if ((null_value= args[0]->null_value))
355
my_decimal_round(E_DEC_FATAL_ERROR, tmp, decimals, false, dec);
357
precision= my_decimal_length_to_precision(max_length,
358
decimals, unsigned_flag);
359
if (precision - decimals < (uint) my_decimal_intg(dec))
361
max_my_decimal(dec, precision, decimals);
368
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
369
ER_WARN_DATA_OUT_OF_RANGE,
370
ER(ER_WARN_DATA_OUT_OF_RANGE),
376
void Item_decimal_typecast::print(String *str, enum_query_type query_type)
378
char len_buf[20*3 + 1];
381
uint32_t precision= my_decimal_length_to_precision(max_length, decimals,
383
str->append(STRING_WITH_LEN("cast("));
384
args[0]->print(str, query_type);
385
str->append(STRING_WITH_LEN(" as decimal("));
387
end=int10_to_str(precision, len_buf,10);
388
str->append(len_buf, (uint32_t) (end - len_buf));
392
end=int10_to_str(decimals, len_buf,10);
393
str->append(len_buf, (uint32_t) (end - len_buf));
400
double Item_func_plus::real_op()
402
double value= args[0]->val_real() + args[1]->val_real();
403
if ((null_value=args[0]->null_value || args[1]->null_value))
405
return fix_result(value);
409
int64_t Item_func_plus::int_op()
411
int64_t value=args[0]->val_int()+args[1]->val_int();
412
if ((null_value=args[0]->null_value || args[1]->null_value))
419
Calculate plus of two decimals.
421
@param decimal_value Buffer that can be used to store result
424
0 Value was NULL; In this case null_value is set
426
\# Value of operation as a decimal
429
my_decimal *Item_func_plus::decimal_op(my_decimal *decimal_value)
431
my_decimal value1, *val1;
432
my_decimal value2, *val2;
433
val1= args[0]->val_decimal(&value1);
434
if ((null_value= args[0]->null_value))
436
val2= args[1]->val_decimal(&value2);
437
if (!(null_value= (args[1]->null_value ||
438
(my_decimal_add(E_DEC_FATAL_ERROR, decimal_value, val1,
440
return decimal_value;
445
Set precision of results for additive operations (+ and -)
447
void Item_func_additive_op::result_precision()
449
decimals= cmax(args[0]->decimals, args[1]->decimals);
450
int max_int_part= cmax(args[0]->decimal_precision() - args[0]->decimals,
451
args[1]->decimal_precision() - args[1]->decimals);
452
int precision= cmin(max_int_part + 1 + decimals, DECIMAL_MAX_PRECISION);
454
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
455
if (result_type() == INT_RESULT)
456
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
458
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
459
max_length= my_decimal_precision_to_length(precision, decimals,
465
The following function is here to allow the user to force
466
subtraction of UNSIGNED BIGINT to return negative values.
469
void Item_func_minus::fix_length_and_dec()
471
Item_num_op::fix_length_and_dec();
475
double Item_func_minus::real_op()
477
double value= args[0]->val_real() - args[1]->val_real();
478
if ((null_value=args[0]->null_value || args[1]->null_value))
480
return fix_result(value);
484
int64_t Item_func_minus::int_op()
486
int64_t value=args[0]->val_int() - args[1]->val_int();
487
if ((null_value=args[0]->null_value || args[1]->null_value))
494
See Item_func_plus::decimal_op for comments.
497
my_decimal *Item_func_minus::decimal_op(my_decimal *decimal_value)
499
my_decimal value1, *val1;
500
my_decimal value2, *val2=
502
val1= args[0]->val_decimal(&value1);
503
if ((null_value= args[0]->null_value))
505
val2= args[1]->val_decimal(&value2);
506
if (!(null_value= (args[1]->null_value ||
507
(my_decimal_sub(E_DEC_FATAL_ERROR, decimal_value, val1,
509
return decimal_value;
514
double Item_func_mul::real_op()
517
double value= args[0]->val_real() * args[1]->val_real();
518
if ((null_value=args[0]->null_value || args[1]->null_value))
520
return fix_result(value);
524
int64_t Item_func_mul::int_op()
527
int64_t value=args[0]->val_int()*args[1]->val_int();
528
if ((null_value=args[0]->null_value || args[1]->null_value))
534
/** See Item_func_plus::decimal_op for comments. */
536
my_decimal *Item_func_mul::decimal_op(my_decimal *decimal_value)
538
my_decimal value1, *val1;
539
my_decimal value2, *val2;
540
val1= args[0]->val_decimal(&value1);
541
if ((null_value= args[0]->null_value))
543
val2= args[1]->val_decimal(&value2);
544
if (!(null_value= (args[1]->null_value ||
545
(my_decimal_mul(E_DEC_FATAL_ERROR, decimal_value, val1,
547
return decimal_value;
552
void Item_func_mul::result_precision()
554
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
555
if (result_type() == INT_RESULT)
556
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
558
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
559
decimals= cmin(args[0]->decimals + args[1]->decimals, DECIMAL_MAX_SCALE);
560
int precision= cmin(args[0]->decimal_precision() + args[1]->decimal_precision(),
561
(unsigned int)DECIMAL_MAX_PRECISION);
562
max_length= my_decimal_precision_to_length(precision, decimals,unsigned_flag);
566
double Item_func_div::real_op()
569
double value= args[0]->val_real();
570
double val2= args[1]->val_real();
571
if ((null_value= args[0]->null_value || args[1]->null_value))
575
signal_divide_by_null();
578
return fix_result(value/val2);
582
my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
584
my_decimal value1, *val1;
585
my_decimal value2, *val2;
588
val1= args[0]->val_decimal(&value1);
589
if ((null_value= args[0]->null_value))
591
val2= args[1]->val_decimal(&value2);
592
if ((null_value= args[1]->null_value))
594
if ((err= my_decimal_div(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
595
val1, val2, prec_increment)) > 3)
597
if (err == E_DEC_DIV_ZERO)
598
signal_divide_by_null();
602
return decimal_value;
606
void Item_func_div::result_precision()
608
uint32_t precision=cmin(args[0]->decimal_precision() + prec_increment,
609
(unsigned int)DECIMAL_MAX_PRECISION);
610
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
611
if (result_type() == INT_RESULT)
612
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
614
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
615
decimals= cmin(args[0]->decimals + prec_increment, (unsigned int)DECIMAL_MAX_SCALE);
616
max_length= my_decimal_precision_to_length(precision, decimals,
621
void Item_func_div::fix_length_and_dec()
623
prec_increment= current_thd->variables.div_precincrement;
624
Item_num_op::fix_length_and_dec();
625
switch(hybrid_type) {
628
decimals=cmax(args[0]->decimals,args[1]->decimals)+prec_increment;
629
set_if_smaller(decimals, NOT_FIXED_DEC);
630
max_length=args[0]->max_length - args[0]->decimals + decimals;
631
uint32_t tmp=float_length(decimals);
632
set_if_smaller(max_length,tmp);
636
hybrid_type= DECIMAL_RESULT;
645
maybe_null= 1; // devision by zero
650
/* Integer division */
651
int64_t Item_func_int_div::val_int()
654
int64_t value=args[0]->val_int();
655
int64_t val2=args[1]->val_int();
656
if ((null_value= (args[0]->null_value || args[1]->null_value)))
660
signal_divide_by_null();
663
return (unsigned_flag ?
664
(uint64_t) value / (uint64_t) val2 :
669
void Item_func_int_div::fix_length_and_dec()
671
Item_result argtype= args[0]->result_type();
672
/* use precision ony for the data type it is applicable for and valid */
673
max_length=args[0]->max_length -
674
(argtype == DECIMAL_RESULT || argtype == INT_RESULT ?
675
args[0]->decimals : 0);
677
unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag;
681
int64_t Item_func_mod::int_op()
684
int64_t value= args[0]->val_int();
685
int64_t val2= args[1]->val_int();
688
if ((null_value= args[0]->null_value || args[1]->null_value))
689
return 0; /* purecov: inspected */
692
signal_divide_by_null();
696
if (args[0]->unsigned_flag)
697
result= args[1]->unsigned_flag ?
698
((uint64_t) value) % ((uint64_t) val2) : ((uint64_t) value) % val2;
700
result= args[1]->unsigned_flag ?
701
value % ((uint64_t) val2) : value % val2;
706
double Item_func_mod::real_op()
709
double value= args[0]->val_real();
710
double val2= args[1]->val_real();
711
if ((null_value= args[0]->null_value || args[1]->null_value))
712
return 0.0; /* purecov: inspected */
715
signal_divide_by_null();
718
return fmod(value,val2);
722
my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value)
724
my_decimal value1, *val1;
725
my_decimal value2, *val2;
727
val1= args[0]->val_decimal(&value1);
728
if ((null_value= args[0]->null_value))
730
val2= args[1]->val_decimal(&value2);
731
if ((null_value= args[1]->null_value))
733
switch (my_decimal_mod(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
735
case E_DEC_TRUNCATED:
737
return decimal_value;
739
signal_divide_by_null();
747
void Item_func_mod::result_precision()
749
decimals= cmax(args[0]->decimals, args[1]->decimals);
750
max_length= cmax(args[0]->max_length, args[1]->max_length);
754
void Item_func_mod::fix_length_and_dec()
756
Item_num_op::fix_length_and_dec();
758
unsigned_flag= args[0]->unsigned_flag;
762
double Item_func_neg::real_op()
764
double value= args[0]->val_real();
765
null_value= args[0]->null_value;
770
int64_t Item_func_neg::int_op()
772
int64_t value= args[0]->val_int();
773
null_value= args[0]->null_value;
778
my_decimal *Item_func_neg::decimal_op(my_decimal *decimal_value)
780
my_decimal val, *value= args[0]->val_decimal(&val);
781
if (!(null_value= args[0]->null_value))
783
my_decimal2decimal(value, decimal_value);
784
my_decimal_neg(decimal_value);
785
return decimal_value;
791
void Item_func_neg::fix_num_length_and_dec()
793
decimals= args[0]->decimals;
794
/* 1 add because sign can appear */
795
max_length= args[0]->max_length + 1;
799
void Item_func_neg::fix_length_and_dec()
801
Item_func_num1::fix_length_and_dec();
804
If this is in integer context keep the context as integer if possible
805
(This is how multiplication and other integer functions works)
806
Use val() to get value as arg_type doesn't mean that item is
807
Item_int or Item_real due to existence of Item_param.
809
if (hybrid_type == INT_RESULT && args[0]->const_item())
811
int64_t val= args[0]->val_int();
812
if ((uint64_t) val >= (uint64_t) INT64_MIN &&
813
((uint64_t) val != (uint64_t) INT64_MIN ||
814
args[0]->type() != INT_ITEM))
817
Ensure that result is converted to DECIMAL, as int64_t can't hold
820
hybrid_type= DECIMAL_RESULT;
828
double Item_func_abs::real_op()
830
double value= args[0]->val_real();
831
null_value= args[0]->null_value;
836
int64_t Item_func_abs::int_op()
838
int64_t value= args[0]->val_int();
839
if ((null_value= args[0]->null_value))
841
return (value >= 0) || unsigned_flag ? value : -value;
845
my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
847
my_decimal val, *value= args[0]->val_decimal(&val);
848
if (!(null_value= args[0]->null_value))
850
my_decimal2decimal(value, decimal_value);
851
if (decimal_value->sign())
852
my_decimal_neg(decimal_value);
853
return decimal_value;
859
void Item_func_abs::fix_length_and_dec()
861
Item_func_num1::fix_length_and_dec();
862
unsigned_flag= args[0]->unsigned_flag;
866
/** Gateway to natural LOG function. */
867
double Item_func_ln::val_real()
870
double value= args[0]->val_real();
871
if ((null_value= args[0]->null_value))
875
signal_divide_by_null();
882
Extended but so slower LOG function.
884
We have to check if all values are > zero and first one is not one
885
as these are the cases then result is not a number.
887
double Item_func_log::val_real()
890
double value= args[0]->val_real();
891
if ((null_value= args[0]->null_value))
895
signal_divide_by_null();
900
double value2= args[1]->val_real();
901
if ((null_value= args[1]->null_value))
903
if (value2 <= 0.0 || value == 1.0)
905
signal_divide_by_null();
908
return log(value2) / log(value);
913
double Item_func_log2::val_real()
916
double value= args[0]->val_real();
918
if ((null_value=args[0]->null_value))
922
signal_divide_by_null();
925
return log(value) / M_LN2;
928
double Item_func_log10::val_real()
931
double value= args[0]->val_real();
932
if ((null_value= args[0]->null_value))
936
signal_divide_by_null();
942
double Item_func_exp::val_real()
945
double value= args[0]->val_real();
946
if ((null_value=args[0]->null_value))
947
return 0.0; /* purecov: inspected */
948
return fix_result(exp(value));
951
double Item_func_sqrt::val_real()
954
double value= args[0]->val_real();
955
if ((null_value=(args[0]->null_value || value < 0)))
956
return 0.0; /* purecov: inspected */
960
double Item_func_pow::val_real()
963
double value= args[0]->val_real();
964
double val2= args[1]->val_real();
965
if ((null_value=(args[0]->null_value || args[1]->null_value)))
966
return 0.0; /* purecov: inspected */
967
return fix_result(pow(value,val2));
970
// Trigonometric functions
972
double Item_func_acos::val_real()
975
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
976
volatile double value= args[0]->val_real();
977
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
982
double Item_func_asin::val_real()
985
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
986
volatile double value= args[0]->val_real();
987
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
992
double Item_func_atan::val_real()
995
double value= args[0]->val_real();
996
if ((null_value=args[0]->null_value))
1000
double val2= args[1]->val_real();
1001
if ((null_value=args[1]->null_value))
1003
return fix_result(atan2(value,val2));
1008
double Item_func_cos::val_real()
1011
double value= args[0]->val_real();
1012
if ((null_value=args[0]->null_value))
1017
double Item_func_sin::val_real()
1020
double value= args[0]->val_real();
1021
if ((null_value=args[0]->null_value))
1026
double Item_func_tan::val_real()
1029
double value= args[0]->val_real();
1030
if ((null_value=args[0]->null_value))
1032
return fix_result(tan(value));
153
1036
// Shift-functions, same as << and >> in C/C++
155
1039
int64_t Item_func_shift_left::val_int()
157
1041
assert(fixed == 1);
1090
void Item_func_int_val::fix_num_length_and_dec()
1092
max_length= args[0]->max_length - (args[0]->decimals ?
1093
args[0]->decimals + 1 :
1095
uint32_t tmp= float_length(decimals);
1096
set_if_smaller(max_length,tmp);
1101
void Item_func_int_val::find_num_type()
1103
switch(hybrid_type= args[0]->result_type())
1107
hybrid_type= REAL_RESULT;
1108
max_length= float_length(decimals);
1111
case DECIMAL_RESULT:
1113
-2 because in most high position can't be used any digit for int64_t
1114
and one position for increasing value during operation
1116
if ((args[0]->max_length - args[0]->decimals) >=
1117
(DECIMAL_LONGLONG_DIGITS - 2))
1119
hybrid_type= DECIMAL_RESULT;
1123
unsigned_flag= args[0]->unsigned_flag;
1124
hybrid_type= INT_RESULT;
1134
int64_t Item_func_ceiling::int_op()
1137
switch (args[0]->result_type()) {
1139
result= args[0]->val_int();
1140
null_value= args[0]->null_value;
1142
case DECIMAL_RESULT:
1144
my_decimal dec_buf, *dec;
1145
if ((dec= Item_func_ceiling::decimal_op(&dec_buf)))
1146
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1152
result= (int64_t)Item_func_ceiling::real_op();
1158
double Item_func_ceiling::real_op()
1161
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1164
volatile double value= args[0]->val_real();
1165
null_value= args[0]->null_value;
1170
my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value)
1172
my_decimal val, *value= args[0]->val_decimal(&val);
1173
if (!(null_value= (args[0]->null_value ||
1174
my_decimal_ceiling(E_DEC_FATAL_ERROR, value,
1175
decimal_value) > 1)))
1176
return decimal_value;
1181
int64_t Item_func_floor::int_op()
1184
switch (args[0]->result_type()) {
1186
result= args[0]->val_int();
1187
null_value= args[0]->null_value;
1189
case DECIMAL_RESULT:
1191
my_decimal dec_buf, *dec;
1192
if ((dec= Item_func_floor::decimal_op(&dec_buf)))
1193
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1199
result= (int64_t)Item_func_floor::real_op();
1205
double Item_func_floor::real_op()
1208
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1211
volatile double value= args[0]->val_real();
1212
null_value= args[0]->null_value;
1213
return floor(value);
1217
my_decimal *Item_func_floor::decimal_op(my_decimal *decimal_value)
1219
my_decimal val, *value= args[0]->val_decimal(&val);
1220
if (!(null_value= (args[0]->null_value ||
1221
my_decimal_floor(E_DEC_FATAL_ERROR, value,
1222
decimal_value) > 1)))
1223
return decimal_value;
1228
void Item_func_round::fix_length_and_dec()
1230
int decimals_to_set;
1234
unsigned_flag= args[0]->unsigned_flag;
1235
if (!args[1]->const_item())
1237
max_length= args[0]->max_length;
1238
decimals= args[0]->decimals;
1239
if (args[0]->result_type() == DECIMAL_RESULT)
1242
hybrid_type= DECIMAL_RESULT;
1245
hybrid_type= REAL_RESULT;
1249
val1= args[1]->val_int();
1250
val1_unsigned= args[1]->unsigned_flag;
1252
decimals_to_set= val1_unsigned ? INT_MAX : 0;
1254
decimals_to_set= (val1 > INT_MAX) ? INT_MAX : (int) val1;
1256
if (args[0]->decimals == NOT_FIXED_DEC)
1258
max_length= args[0]->max_length;
1259
decimals= cmin(decimals_to_set, NOT_FIXED_DEC);
1260
hybrid_type= REAL_RESULT;
1264
switch (args[0]->result_type()) {
1267
hybrid_type= REAL_RESULT;
1268
decimals= cmin(decimals_to_set, NOT_FIXED_DEC);
1269
max_length= float_length(decimals);
1272
if ((!decimals_to_set && truncate) || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))
1274
int length_can_increase= test(!truncate && (val1 < 0) && !val1_unsigned);
1275
max_length= args[0]->max_length + length_can_increase;
1276
/* Here we can keep INT_RESULT */
1277
hybrid_type= INT_RESULT;
1282
case DECIMAL_RESULT:
1284
hybrid_type= DECIMAL_RESULT;
1285
decimals_to_set= cmin(DECIMAL_MAX_SCALE, decimals_to_set);
1286
int decimals_delta= args[0]->decimals - decimals_to_set;
1287
int precision= args[0]->decimal_precision();
1288
int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1;
1290
precision-= decimals_delta - length_increase;
1291
decimals= cmin(decimals_to_set, DECIMAL_MAX_SCALE);
1292
max_length= my_decimal_precision_to_length(precision, decimals,
1297
assert(0); /* This result type isn't handled */
1301
double my_double_round(double value, int64_t dec, bool dec_unsigned,
1305
bool dec_negative= (dec < 0) && !dec_unsigned;
1306
uint64_t abs_dec= dec_negative ? -dec : dec;
1308
tmp2 is here to avoid return the value with 80 bit precision
1309
This will fix that the test round(0.1,1) = round(0.1,1) is true
1311
volatile double tmp2;
1313
tmp=(abs_dec < array_elements(log_10) ?
1314
log_10[abs_dec] : pow(10.0,(double) abs_dec));
1316
if (dec_negative && std::isinf(tmp))
1318
else if (!dec_negative && std::isinf(value * tmp))
1323
tmp2= dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp;
1325
tmp2= dec < 0 ? ceil(value/tmp)*tmp : ceil(value*tmp)/tmp;
1328
tmp2=dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp;
1333
double Item_func_round::real_op()
1335
double value= args[0]->val_real();
1337
if (!(null_value= args[0]->null_value || args[1]->null_value))
1338
return my_double_round(value, args[1]->val_int(), args[1]->unsigned_flag,
1345
Rounds a given value to a power of 10 specified as the 'to' argument,
1346
avoiding overflows when the value is close to the uint64_t range boundary.
1349
static inline uint64_t my_unsigned_round(uint64_t value, uint64_t to)
1351
uint64_t tmp= value / to * to;
1352
return (value - tmp < (to >> 1)) ? tmp : tmp + to;
1356
int64_t Item_func_round::int_op()
1358
int64_t value= args[0]->val_int();
1359
int64_t dec= args[1]->val_int();
1362
if ((null_value= args[0]->null_value || args[1]->null_value))
1364
if ((dec >= 0) || args[1]->unsigned_flag)
1365
return value; // integer have not digits after point
1370
if(abs_dec >= array_elements(log_10_int))
1373
tmp= log_10_int[abs_dec];
1376
value= (unsigned_flag) ?
1377
((uint64_t) value / tmp) * tmp : (value / tmp) * tmp;
1379
value= (unsigned_flag || value >= 0) ?
1380
my_unsigned_round((uint64_t) value, tmp) :
1381
-(int64_t) my_unsigned_round((uint64_t) -value, tmp);
1386
my_decimal *Item_func_round::decimal_op(my_decimal *decimal_value)
1388
my_decimal val, *value= args[0]->val_decimal(&val);
1389
int64_t dec= args[1]->val_int();
1390
if (dec >= 0 || args[1]->unsigned_flag)
1391
dec= cmin(dec, (int64_t) decimals);
1392
else if (dec < INT_MIN)
1395
if (!(null_value= (args[0]->null_value || args[1]->null_value ||
1396
my_decimal_round(E_DEC_FATAL_ERROR, value, (int) dec,
1397
truncate, decimal_value) > 1)))
1399
decimal_value->frac= decimals;
1400
return decimal_value;
1406
void Item_func_rand::seed_random(Item *arg)
1409
TODO: do not do reinit 'rand' for every execute of PS/SP if
1410
args[0] is a constant.
1412
uint32_t tmp= (uint32_t) arg->val_int();
1413
randominit(rand, (uint32_t) (tmp*0x10001L+55555555L),
1414
(uint32_t) (tmp*0x10000001L));
1418
bool Item_func_rand::fix_fields(THD *thd,Item **ref)
1420
if (Item_real_func::fix_fields(thd, ref))
1422
used_tables_cache|= RAND_TABLE_BIT;
1424
{ // Only use argument once in query
1426
No need to send a Rand log event if seed was given eg: RAND(seed),
1427
as it will be replicated in the query as such.
1429
if (!rand && !(rand= (struct rand_struct*)
1430
thd->alloc(sizeof(*rand))))
1433
if (args[0]->const_item())
1434
seed_random (args[0]);
1439
Save the seed only the first time RAND() is used in the query
1440
Once events are forwarded rather than recreated,
1441
the following can be skipped if inside the slave thread
1443
if (!thd->rand_used)
1446
thd->rand_saved_seed1= thd->rand.seed1;
1447
thd->rand_saved_seed2= thd->rand.seed2;
1454
void Item_func_rand::update_used_tables()
1456
Item_real_func::update_used_tables();
1457
used_tables_cache|= RAND_TABLE_BIT;
1461
double Item_func_rand::val_real()
1464
if (arg_count && !args[0]->const_item())
1465
seed_random (args[0]);
1466
return my_rnd(rand);
1469
int64_t Item_func_sign::val_int()
1472
double value= args[0]->val_real();
1473
null_value=args[0]->null_value;
1474
return value < 0.0 ? -1 : (value > 0 ? 1 : 0);
206
1478
double Item_func_units::val_real()
208
1480
assert(fixed == 1);
1488
void Item_func_min_max::fix_length_and_dec()
1491
bool datetime_found= false;
1495
cmp_type=args[0]->result_type();
1497
for (uint32_t i=0 ; i < arg_count ; i++)
1499
set_if_bigger(max_length, args[i]->max_length);
1500
set_if_bigger(decimals, args[i]->decimals);
1501
set_if_bigger(max_int_part, args[i]->decimal_int_part());
1502
if (args[i]->maybe_null)
1504
cmp_type=item_cmp_type(cmp_type,args[i]->result_type());
1505
if (args[i]->result_type() != ROW_RESULT && args[i]->is_datetime())
1507
datetime_found= true;
1508
if (!datetime_item || args[i]->field_type() == DRIZZLE_TYPE_DATETIME)
1509
datetime_item= args[i];
1512
if (cmp_type == STRING_RESULT)
1514
agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV, 1);
1518
compare_as_dates= true;
1521
else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
1522
max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals,
1524
cached_field_type= agg_field_type(args, arg_count);
1529
Compare item arguments in the DATETIME context.
1533
value [out] found least/greatest DATE/DATETIME value
1536
Compare item arguments as DATETIME values and return the index of the
1537
least/greatest argument in the arguments array.
1538
The correct integer DATE/DATETIME value of the found argument is
1539
stored to the value pointer, if latter is provided.
1542
0 If one of arguments is NULL
1543
# index of the least/greatest argument
1546
uint32_t Item_func_min_max::cmp_datetimes(uint64_t *value)
1548
uint64_t min_max= 0;
1549
uint32_t min_max_idx= 0;
1551
for (uint32_t i=0; i < arg_count ; i++)
1553
Item **arg= args + i;
1555
uint64_t res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
1556
if ((null_value= args[i]->null_value))
1558
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
1567
if (datetime_item->field_type() == DRIZZLE_TYPE_NEWDATE)
1574
String *Item_func_min_max::val_str(String *str)
1577
if (compare_as_dates)
1580
uint32_t min_max_idx= cmp_datetimes(NULL);
1583
str_res= args[min_max_idx]->val_str(str);
1584
str_res->set_charset(collation.collation);
1590
int64_t nr=val_int();
1593
str->set_int(nr, unsigned_flag, &my_charset_bin);
1596
case DECIMAL_RESULT:
1598
my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
1601
my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
1606
double nr= val_real();
1608
return 0; /* purecov: inspected */
1609
str->set_real(nr,decimals,&my_charset_bin);
1616
for (uint32_t i=0; i < arg_count ; i++)
1619
res=args[i]->val_str(str);
1623
res2= args[i]->val_str(res == str ? &tmp_value : str);
1626
int cmp= sortcmp(res,res2,collation.collation);
1627
if ((cmp_sign < 0 ? cmp : -cmp) < 0)
1631
if ((null_value= args[i]->null_value))
1634
res->set_charset(collation.collation);
1639
// This case should never be chosen
1643
return 0; // Keep compiler happy
1647
double Item_func_min_max::val_real()
1651
if (compare_as_dates)
1654
(void)cmp_datetimes(&result);
1655
return (double)result;
1657
for (uint32_t i=0; i < arg_count ; i++)
1660
value= args[i]->val_real();
1663
double tmp= args[i]->val_real();
1664
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
1667
if ((null_value= args[i]->null_value))
1674
int64_t Item_func_min_max::val_int()
1678
if (compare_as_dates)
1681
(void)cmp_datetimes(&result);
1682
return (int64_t)result;
1684
for (uint32_t i=0; i < arg_count ; i++)
1687
value=args[i]->val_int();
1690
int64_t tmp=args[i]->val_int();
1691
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
1694
if ((null_value= args[i]->null_value))
1701
my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
1704
my_decimal tmp_buf, *tmp, *res= NULL;
1706
if (compare_as_dates)
1709
(void)cmp_datetimes(&value);
1710
uint64_t2decimal(value, dec);
1713
for (uint32_t i=0; i < arg_count ; i++)
1716
res= args[i]->val_decimal(dec);
1719
tmp= args[i]->val_decimal(&tmp_buf); // Zero if NULL
1720
if (tmp && (my_decimal_cmp(tmp, res) * cmp_sign) < 0)
1722
if (tmp == &tmp_buf)
1724
/* Move value out of tmp_buf as this will be reused on next loop */
1725
my_decimal2decimal(tmp, dec);
1732
if ((null_value= args[i]->null_value))
1742
int64_t Item_func_length::val_int()
1745
String *res=args[0]->val_str(&value);
1749
return 0; /* purecov: inspected */
1752
return (int64_t) res->length();
216
1756
int64_t Item_func_char_length::val_int()
218
1758
assert(fixed == 1);