138
599
void Item_func::signal_divide_by_null()
140
Session *session= current_session;
141
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DIVISION_BY_ZERO, ER(ER_DIVISION_BY_ZERO));
601
THD *thd= current_thd;
602
push_warning(thd, DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DIVISION_BY_ZERO, ER(ER_DIVISION_BY_ZERO));
146
Item *Item_func::get_tmp_table_item(Session *session)
607
Item *Item_func::get_tmp_table_item(THD *thd)
148
609
if (!with_sum_func && !const_item() && functype() != SUSERVAR_FUNC)
149
610
return new Item_field(result_field);
150
return copy_or_same(session);
611
return copy_or_same(thd);
614
double Item_int_func::val_real()
618
return unsigned_flag ? (double) ((uint64_t) val_int()) : (double) val_int();
622
String *Item_int_func::val_str(String *str)
625
int64_t nr=val_int();
628
str->set_int(nr, unsigned_flag, &my_charset_bin);
633
void Item_func_connection_id::fix_length_and_dec()
635
Item_int_func::fix_length_and_dec();
640
bool Item_func_connection_id::fix_fields(THD *thd, Item **ref)
642
if (Item_int_func::fix_fields(thd, ref))
644
thd->thread_specific_used= true;
645
value= thd->variables.pseudo_thread_id;
651
Check arguments here to determine result's type for a numeric
652
function of two arguments.
655
void Item_num_op::find_num_type(void)
657
assert(arg_count == 2);
658
Item_result r0= args[0]->result_type();
659
Item_result r1= args[1]->result_type();
661
if (r0 == REAL_RESULT || r1 == REAL_RESULT ||
662
r0 == STRING_RESULT || r1 ==STRING_RESULT)
665
max_length= float_length(decimals);
666
hybrid_type= REAL_RESULT;
668
else if (r0 == DECIMAL_RESULT || r1 == DECIMAL_RESULT)
670
hybrid_type= DECIMAL_RESULT;
675
assert(r0 == INT_RESULT && r1 == INT_RESULT);
677
hybrid_type=INT_RESULT;
685
Set result type for a numeric function of one argument
686
(can be also used by a numeric function of many arguments, if the result
687
type depends only on the first argument)
690
void Item_func_num1::find_num_type()
692
switch (hybrid_type= args[0]->result_type()) {
694
unsigned_flag= args[0]->unsigned_flag;
698
hybrid_type= REAL_RESULT;
699
max_length= float_length(decimals);
710
void Item_func_num1::fix_num_length_and_dec()
712
decimals= args[0]->decimals;
713
max_length= args[0]->max_length;
717
void Item_func_numhybrid::fix_length_and_dec()
719
fix_num_length_and_dec();
724
String *Item_func_numhybrid::val_str(String *str)
727
switch (hybrid_type) {
730
my_decimal decimal_value, *val;
731
if (!(val= decimal_op(&decimal_value)))
732
return 0; // null is set
733
my_decimal_round(E_DEC_FATAL_ERROR, val, decimals, false, val);
734
my_decimal2string(E_DEC_FATAL_ERROR, val, 0, 0, 0, str);
739
int64_t nr= int_op();
741
return 0; /* purecov: inspected */
742
str->set_int(nr, unsigned_flag, &my_charset_bin);
747
double nr= real_op();
749
return 0; /* purecov: inspected */
750
str->set_real(nr,decimals,&my_charset_bin);
754
return str_op(&str_value);
762
double Item_func_numhybrid::val_real()
765
switch (hybrid_type) {
768
my_decimal decimal_value, *val;
770
if (!(val= decimal_op(&decimal_value)))
771
return 0.0; // null is set
772
my_decimal2double(E_DEC_FATAL_ERROR, val, &result);
777
int64_t result= int_op();
778
return unsigned_flag ? (double) ((uint64_t) result) : (double) result;
786
String *res= str_op(&str_value);
787
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
788
&end_not_used, &err_not_used) : 0.0);
797
int64_t Item_func_numhybrid::val_int()
800
switch (hybrid_type) {
803
my_decimal decimal_value, *val;
804
if (!(val= decimal_op(&decimal_value)))
805
return 0; // null is set
807
my_decimal2int(E_DEC_FATAL_ERROR, val, unsigned_flag, &result);
813
return (int64_t) rint(real_op());
818
if (!(res= str_op(&str_value)))
821
char *end= (char*) res->ptr() + res->length();
822
const CHARSET_INFO * const cs= str_value.charset();
823
return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used);
832
my_decimal *Item_func_numhybrid::val_decimal(my_decimal *decimal_value)
834
my_decimal *val= decimal_value;
836
switch (hybrid_type) {
838
val= decimal_op(decimal_value);
842
int64_t result= int_op();
843
int2my_decimal(E_DEC_FATAL_ERROR, result, unsigned_flag, decimal_value);
848
double result= (double)real_op();
849
double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
855
if (!(res= str_op(&str_value)))
858
str2my_decimal(E_DEC_FATAL_ERROR, (char*) res->ptr(),
859
res->length(), res->charset(), decimal_value);
870
void Item_func_signed::print(String *str, enum_query_type query_type)
872
str->append(STRING_WITH_LEN("cast("));
873
args[0]->print(str, query_type);
874
str->append(STRING_WITH_LEN(" as signed)"));
879
int64_t Item_func_signed::val_int_from_str(int *error)
881
char buff[MAX_FIELD_WIDTH], *end, *start;
883
String tmp(buff,sizeof(buff), &my_charset_bin), *res;
887
For a string result, we must first get the string and then convert it
891
if (!(res= args[0]->val_str(&tmp)))
898
start= (char *)res->ptr();
899
length= res->length();
902
value= my_strtoll10(start, &end, error);
903
if (*error > 0 || end != start+ length)
906
String err_tmp(err_buff,(uint32_t) sizeof(err_buff), system_charset_info);
907
err_tmp.copy(start, length, system_charset_info);
908
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
909
ER_TRUNCATED_WRONG_VALUE,
910
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
917
int64_t Item_func_signed::val_int()
922
if (args[0]->cast_to_int_type() != STRING_RESULT ||
923
args[0]->result_as_int64_t())
925
value= args[0]->val_int();
926
null_value= args[0]->null_value;
930
value= val_int_from_str(&error);
931
if (value < 0 && error == 0)
933
push_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
934
"Cast to signed converted positive out-of-range integer to "
935
"it's negative complement");
941
void Item_func_unsigned::print(String *str, enum_query_type query_type)
943
str->append(STRING_WITH_LEN("cast("));
944
args[0]->print(str, query_type);
945
str->append(STRING_WITH_LEN(" as unsigned)"));
950
int64_t Item_func_unsigned::val_int()
955
if (args[0]->cast_to_int_type() == DECIMAL_RESULT)
957
my_decimal tmp, *dec= args[0]->val_decimal(&tmp);
958
if (!(null_value= args[0]->null_value))
959
my_decimal2int(E_DEC_FATAL_ERROR, dec, 1, &value);
964
else if (args[0]->cast_to_int_type() != STRING_RESULT ||
965
args[0]->result_as_int64_t())
967
value= args[0]->val_int();
968
null_value= args[0]->null_value;
972
value= val_int_from_str(&error);
974
push_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
975
"Cast to unsigned converted negative integer to it's "
976
"positive complement");
981
String *Item_decimal_typecast::val_str(String *str)
983
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
986
my_decimal2string(E_DEC_FATAL_ERROR, tmp, 0, 0, 0, str);
991
double Item_decimal_typecast::val_real()
993
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
997
my_decimal2double(E_DEC_FATAL_ERROR, tmp, &res);
1002
int64_t Item_decimal_typecast::val_int()
1004
my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1008
my_decimal2int(E_DEC_FATAL_ERROR, tmp, unsigned_flag, &res);
1013
my_decimal *Item_decimal_typecast::val_decimal(my_decimal *dec)
1015
my_decimal tmp_buf, *tmp= args[0]->val_decimal(&tmp_buf);
1019
if ((null_value= args[0]->null_value))
1021
my_decimal_round(E_DEC_FATAL_ERROR, tmp, decimals, false, dec);
1027
my_decimal_set_zero(dec);
1031
precision= my_decimal_length_to_precision(max_length,
1032
decimals, unsigned_flag);
1033
if (precision - decimals < (uint) my_decimal_intg(dec))
1035
max_my_decimal(dec, precision, decimals);
1042
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
1043
ER_WARN_DATA_OUT_OF_RANGE,
1044
ER(ER_WARN_DATA_OUT_OF_RANGE),
1050
void Item_decimal_typecast::print(String *str, enum_query_type query_type)
1052
char len_buf[20*3 + 1];
1055
uint precision= my_decimal_length_to_precision(max_length, decimals,
1057
str->append(STRING_WITH_LEN("cast("));
1058
args[0]->print(str, query_type);
1059
str->append(STRING_WITH_LEN(" as decimal("));
1061
end=int10_to_str(precision, len_buf,10);
1062
str->append(len_buf, (uint32_t) (end - len_buf));
1066
end=int10_to_str(decimals, len_buf,10);
1067
str->append(len_buf, (uint32_t) (end - len_buf));
1074
double Item_func_plus::real_op()
1076
double value= args[0]->val_real() + args[1]->val_real();
1077
if ((null_value=args[0]->null_value || args[1]->null_value))
1079
return fix_result(value);
1083
int64_t Item_func_plus::int_op()
1085
int64_t value=args[0]->val_int()+args[1]->val_int();
1086
if ((null_value=args[0]->null_value || args[1]->null_value))
1093
Calculate plus of two decimals.
1095
@param decimal_value Buffer that can be used to store result
1098
0 Value was NULL; In this case null_value is set
1100
\# Value of operation as a decimal
1103
my_decimal *Item_func_plus::decimal_op(my_decimal *decimal_value)
1105
my_decimal value1, *val1;
1106
my_decimal value2, *val2;
1107
val1= args[0]->val_decimal(&value1);
1108
if ((null_value= args[0]->null_value))
1110
val2= args[1]->val_decimal(&value2);
1111
if (!(null_value= (args[1]->null_value ||
1112
(my_decimal_add(E_DEC_FATAL_ERROR, decimal_value, val1,
1114
return decimal_value;
1119
Set precision of results for additive operations (+ and -)
1121
void Item_func_additive_op::result_precision()
1123
decimals= max(args[0]->decimals, args[1]->decimals);
1124
int max_int_part= max(args[0]->decimal_precision() - args[0]->decimals,
1125
args[1]->decimal_precision() - args[1]->decimals);
1126
int precision= min(max_int_part + 1 + decimals, DECIMAL_MAX_PRECISION);
1128
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1129
if (result_type() == INT_RESULT)
1130
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1132
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1133
max_length= my_decimal_precision_to_length(precision, decimals,
1139
The following function is here to allow the user to force
1140
subtraction of UNSIGNED BIGINT to return negative values.
1143
void Item_func_minus::fix_length_and_dec()
1145
Item_num_op::fix_length_and_dec();
1151
double Item_func_minus::real_op()
1153
double value= args[0]->val_real() - args[1]->val_real();
1154
if ((null_value=args[0]->null_value || args[1]->null_value))
1156
return fix_result(value);
1160
int64_t Item_func_minus::int_op()
1162
int64_t value=args[0]->val_int() - args[1]->val_int();
1163
if ((null_value=args[0]->null_value || args[1]->null_value))
1170
See Item_func_plus::decimal_op for comments.
1173
my_decimal *Item_func_minus::decimal_op(my_decimal *decimal_value)
1175
my_decimal value1, *val1;
1176
my_decimal value2, *val2=
1178
val1= args[0]->val_decimal(&value1);
1179
if ((null_value= args[0]->null_value))
1181
val2= args[1]->val_decimal(&value2);
1182
if (!(null_value= (args[1]->null_value ||
1183
(my_decimal_sub(E_DEC_FATAL_ERROR, decimal_value, val1,
1185
return decimal_value;
1190
double Item_func_mul::real_op()
1193
double value= args[0]->val_real() * args[1]->val_real();
1194
if ((null_value=args[0]->null_value || args[1]->null_value))
1196
return fix_result(value);
1200
int64_t Item_func_mul::int_op()
1203
int64_t value=args[0]->val_int()*args[1]->val_int();
1204
if ((null_value=args[0]->null_value || args[1]->null_value))
1210
/** See Item_func_plus::decimal_op for comments. */
1212
my_decimal *Item_func_mul::decimal_op(my_decimal *decimal_value)
1214
my_decimal value1, *val1;
1215
my_decimal value2, *val2;
1216
val1= args[0]->val_decimal(&value1);
1217
if ((null_value= args[0]->null_value))
1219
val2= args[1]->val_decimal(&value2);
1220
if (!(null_value= (args[1]->null_value ||
1221
(my_decimal_mul(E_DEC_FATAL_ERROR, decimal_value, val1,
1223
return decimal_value;
1228
void Item_func_mul::result_precision()
1230
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1231
if (result_type() == INT_RESULT)
1232
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1234
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1235
decimals= min(args[0]->decimals + args[1]->decimals, DECIMAL_MAX_SCALE);
1236
int precision= min(args[0]->decimal_precision() + args[1]->decimal_precision(),
1237
(unsigned int)DECIMAL_MAX_PRECISION);
1238
max_length= my_decimal_precision_to_length(precision, decimals,unsigned_flag);
1242
double Item_func_div::real_op()
1245
double value= args[0]->val_real();
1246
double val2= args[1]->val_real();
1247
if ((null_value= args[0]->null_value || args[1]->null_value))
1251
signal_divide_by_null();
1254
return fix_result(value/val2);
1258
my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
1260
my_decimal value1, *val1;
1261
my_decimal value2, *val2;
1264
val1= args[0]->val_decimal(&value1);
1265
if ((null_value= args[0]->null_value))
1267
val2= args[1]->val_decimal(&value2);
1268
if ((null_value= args[1]->null_value))
1270
if ((err= my_decimal_div(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
1271
val1, val2, prec_increment)) > 3)
1273
if (err == E_DEC_DIV_ZERO)
1274
signal_divide_by_null();
1278
return decimal_value;
1282
void Item_func_div::result_precision()
1284
uint precision=min(args[0]->decimal_precision() + prec_increment,
1285
(unsigned int)DECIMAL_MAX_PRECISION);
1286
/* Integer operations keep unsigned_flag if one of arguments is unsigned */
1287
if (result_type() == INT_RESULT)
1288
unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1290
unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1291
decimals= min(args[0]->decimals + prec_increment, (unsigned int)DECIMAL_MAX_SCALE);
1292
max_length= my_decimal_precision_to_length(precision, decimals,
1297
void Item_func_div::fix_length_and_dec()
1299
prec_increment= current_thd->variables.div_precincrement;
1300
Item_num_op::fix_length_and_dec();
1301
switch(hybrid_type) {
1304
decimals=max(args[0]->decimals,args[1]->decimals)+prec_increment;
1305
set_if_smaller(decimals, NOT_FIXED_DEC);
1306
max_length=args[0]->max_length - args[0]->decimals + decimals;
1307
uint tmp=float_length(decimals);
1308
set_if_smaller(max_length,tmp);
1312
hybrid_type= DECIMAL_RESULT;
1315
case DECIMAL_RESULT:
1321
maybe_null= 1; // devision by zero
1326
/* Integer division */
1327
int64_t Item_func_int_div::val_int()
1330
int64_t value=args[0]->val_int();
1331
int64_t val2=args[1]->val_int();
1332
if ((null_value= (args[0]->null_value || args[1]->null_value)))
1336
signal_divide_by_null();
1339
return (unsigned_flag ?
1340
(uint64_t) value / (uint64_t) val2 :
1345
void Item_func_int_div::fix_length_and_dec()
1347
Item_result argtype= args[0]->result_type();
1348
/* use precision ony for the data type it is applicable for and valid */
1349
max_length=args[0]->max_length -
1350
(argtype == DECIMAL_RESULT || argtype == INT_RESULT ?
1351
args[0]->decimals : 0);
1353
unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag;
1357
int64_t Item_func_mod::int_op()
1360
int64_t value= args[0]->val_int();
1361
int64_t val2= args[1]->val_int();
1364
if ((null_value= args[0]->null_value || args[1]->null_value))
1365
return 0; /* purecov: inspected */
1368
signal_divide_by_null();
1372
if (args[0]->unsigned_flag)
1373
result= args[1]->unsigned_flag ?
1374
((uint64_t) value) % ((uint64_t) val2) : ((uint64_t) value) % val2;
1376
result= args[1]->unsigned_flag ?
1377
value % ((uint64_t) val2) : value % val2;
1382
double Item_func_mod::real_op()
1385
double value= args[0]->val_real();
1386
double val2= args[1]->val_real();
1387
if ((null_value= args[0]->null_value || args[1]->null_value))
1388
return 0.0; /* purecov: inspected */
1391
signal_divide_by_null();
1394
return fmod(value,val2);
1398
my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value)
1400
my_decimal value1, *val1;
1401
my_decimal value2, *val2;
1403
val1= args[0]->val_decimal(&value1);
1404
if ((null_value= args[0]->null_value))
1406
val2= args[1]->val_decimal(&value2);
1407
if ((null_value= args[1]->null_value))
1409
switch (my_decimal_mod(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
1411
case E_DEC_TRUNCATED:
1413
return decimal_value;
1414
case E_DEC_DIV_ZERO:
1415
signal_divide_by_null();
1423
void Item_func_mod::result_precision()
1425
decimals= max(args[0]->decimals, args[1]->decimals);
1426
max_length= max(args[0]->max_length, args[1]->max_length);
1430
void Item_func_mod::fix_length_and_dec()
1432
Item_num_op::fix_length_and_dec();
1434
unsigned_flag= args[0]->unsigned_flag;
1438
double Item_func_neg::real_op()
1440
double value= args[0]->val_real();
1441
null_value= args[0]->null_value;
1446
int64_t Item_func_neg::int_op()
1448
int64_t value= args[0]->val_int();
1449
null_value= args[0]->null_value;
1454
my_decimal *Item_func_neg::decimal_op(my_decimal *decimal_value)
1456
my_decimal val, *value= args[0]->val_decimal(&val);
1457
if (!(null_value= args[0]->null_value))
1459
my_decimal2decimal(value, decimal_value);
1460
my_decimal_neg(decimal_value);
1461
return decimal_value;
1467
void Item_func_neg::fix_num_length_and_dec()
1469
decimals= args[0]->decimals;
1470
/* 1 add because sign can appear */
1471
max_length= args[0]->max_length + 1;
1475
void Item_func_neg::fix_length_and_dec()
1477
Item_func_num1::fix_length_and_dec();
1480
If this is in integer context keep the context as integer if possible
1481
(This is how multiplication and other integer functions works)
1482
Use val() to get value as arg_type doesn't mean that item is
1483
Item_int or Item_real due to existence of Item_param.
1485
if (hybrid_type == INT_RESULT && args[0]->const_item())
1487
int64_t val= args[0]->val_int();
1488
if ((uint64_t) val >= (uint64_t) INT64_MIN &&
1489
((uint64_t) val != (uint64_t) INT64_MIN ||
1490
args[0]->type() != INT_ITEM))
1493
Ensure that result is converted to DECIMAL, as int64_t can't hold
1496
hybrid_type= DECIMAL_RESULT;
1504
double Item_func_abs::real_op()
1506
double value= args[0]->val_real();
1507
null_value= args[0]->null_value;
1512
int64_t Item_func_abs::int_op()
1514
int64_t value= args[0]->val_int();
1515
if ((null_value= args[0]->null_value))
1517
return (value >= 0) || unsigned_flag ? value : -value;
1521
my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
1523
my_decimal val, *value= args[0]->val_decimal(&val);
1524
if (!(null_value= args[0]->null_value))
1526
my_decimal2decimal(value, decimal_value);
1527
if (decimal_value->sign())
1528
my_decimal_neg(decimal_value);
1529
return decimal_value;
1535
void Item_func_abs::fix_length_and_dec()
1537
Item_func_num1::fix_length_and_dec();
1538
unsigned_flag= args[0]->unsigned_flag;
1542
/** Gateway to natural LOG function. */
1543
double Item_func_ln::val_real()
1546
double value= args[0]->val_real();
1547
if ((null_value= args[0]->null_value))
1551
signal_divide_by_null();
1558
Extended but so slower LOG function.
1560
We have to check if all values are > zero and first one is not one
1561
as these are the cases then result is not a number.
1563
double Item_func_log::val_real()
1566
double value= args[0]->val_real();
1567
if ((null_value= args[0]->null_value))
1571
signal_divide_by_null();
1576
double value2= args[1]->val_real();
1577
if ((null_value= args[1]->null_value))
1579
if (value2 <= 0.0 || value == 1.0)
1581
signal_divide_by_null();
1584
return log(value2) / log(value);
1589
double Item_func_log2::val_real()
1592
double value= args[0]->val_real();
1594
if ((null_value=args[0]->null_value))
1598
signal_divide_by_null();
1601
return log(value) / M_LN2;
1604
double Item_func_log10::val_real()
1607
double value= args[0]->val_real();
1608
if ((null_value= args[0]->null_value))
1612
signal_divide_by_null();
1615
return log10(value);
1618
double Item_func_exp::val_real()
1621
double value= args[0]->val_real();
1622
if ((null_value=args[0]->null_value))
1623
return 0.0; /* purecov: inspected */
1624
return fix_result(exp(value));
1627
double Item_func_sqrt::val_real()
1630
double value= args[0]->val_real();
1631
if ((null_value=(args[0]->null_value || value < 0)))
1632
return 0.0; /* purecov: inspected */
1636
double Item_func_pow::val_real()
1639
double value= args[0]->val_real();
1640
double val2= args[1]->val_real();
1641
if ((null_value=(args[0]->null_value || args[1]->null_value)))
1642
return 0.0; /* purecov: inspected */
1643
return fix_result(pow(value,val2));
1646
// Trigonometric functions
1648
double Item_func_acos::val_real()
1651
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
1652
volatile double value= args[0]->val_real();
1653
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
1658
double Item_func_asin::val_real()
1661
// the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
1662
volatile double value= args[0]->val_real();
1663
if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
1668
double Item_func_atan::val_real()
1671
double value= args[0]->val_real();
1672
if ((null_value=args[0]->null_value))
1676
double val2= args[1]->val_real();
1677
if ((null_value=args[1]->null_value))
1679
return fix_result(atan2(value,val2));
1684
double Item_func_cos::val_real()
1687
double value= args[0]->val_real();
1688
if ((null_value=args[0]->null_value))
1693
double Item_func_sin::val_real()
1696
double value= args[0]->val_real();
1697
if ((null_value=args[0]->null_value))
1702
double Item_func_tan::val_real()
1705
double value= args[0]->val_real();
1706
if ((null_value=args[0]->null_value))
1708
return fix_result(tan(value));
1712
// Shift-functions, same as << and >> in C/C++
1715
int64_t Item_func_shift_left::val_int()
1719
uint64_t res= ((uint64_t) args[0]->val_int() <<
1720
(shift=(uint) args[1]->val_int()));
1721
if (args[0]->null_value || args[1]->null_value)
1727
return (shift < sizeof(int64_t)*8 ? (int64_t) res : 0LL);
1730
int64_t Item_func_shift_right::val_int()
1734
uint64_t res= (uint64_t) args[0]->val_int() >>
1735
(shift=(uint) args[1]->val_int());
1736
if (args[0]->null_value || args[1]->null_value)
1742
return (shift < sizeof(int64_t)*8 ? (int64_t) res : 0LL);
1746
int64_t Item_func_bit_neg::val_int()
1749
uint64_t res= (uint64_t) args[0]->val_int();
1750
if ((null_value=args[0]->null_value))
1756
// Conversion functions
1758
void Item_func_integer::fix_length_and_dec()
1760
max_length=args[0]->max_length - args[0]->decimals+1;
1761
uint tmp=float_length(decimals);
1762
set_if_smaller(max_length,tmp);
1766
void Item_func_int_val::fix_num_length_and_dec()
1768
max_length= args[0]->max_length - (args[0]->decimals ?
1769
args[0]->decimals + 1 :
1771
uint tmp= float_length(decimals);
1772
set_if_smaller(max_length,tmp);
1777
void Item_func_int_val::find_num_type()
1779
switch(hybrid_type= args[0]->result_type())
1783
hybrid_type= REAL_RESULT;
1784
max_length= float_length(decimals);
1787
case DECIMAL_RESULT:
1789
-2 because in most high position can't be used any digit for int64_t
1790
and one position for increasing value during operation
1792
if ((args[0]->max_length - args[0]->decimals) >=
1793
(DECIMAL_LONGLONG_DIGITS - 2))
1795
hybrid_type= DECIMAL_RESULT;
1799
unsigned_flag= args[0]->unsigned_flag;
1800
hybrid_type= INT_RESULT;
1810
int64_t Item_func_ceiling::int_op()
1813
switch (args[0]->result_type()) {
1815
result= args[0]->val_int();
1816
null_value= args[0]->null_value;
1818
case DECIMAL_RESULT:
1820
my_decimal dec_buf, *dec;
1821
if ((dec= Item_func_ceiling::decimal_op(&dec_buf)))
1822
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1828
result= (int64_t)Item_func_ceiling::real_op();
1834
double Item_func_ceiling::real_op()
1837
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1840
volatile double value= args[0]->val_real();
1841
null_value= args[0]->null_value;
1846
my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value)
1848
my_decimal val, *value= args[0]->val_decimal(&val);
1849
if (!(null_value= (args[0]->null_value ||
1850
my_decimal_ceiling(E_DEC_FATAL_ERROR, value,
1851
decimal_value) > 1)))
1852
return decimal_value;
1857
int64_t Item_func_floor::int_op()
1860
switch (args[0]->result_type()) {
1862
result= args[0]->val_int();
1863
null_value= args[0]->null_value;
1865
case DECIMAL_RESULT:
1867
my_decimal dec_buf, *dec;
1868
if ((dec= Item_func_floor::decimal_op(&dec_buf)))
1869
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
1875
result= (int64_t)Item_func_floor::real_op();
1881
double Item_func_floor::real_op()
1884
the volatile's for BUG #3051 to calm optimizer down (because of gcc's
1887
volatile double value= args[0]->val_real();
1888
null_value= args[0]->null_value;
1889
return floor(value);
1893
my_decimal *Item_func_floor::decimal_op(my_decimal *decimal_value)
1895
my_decimal val, *value= args[0]->val_decimal(&val);
1896
if (!(null_value= (args[0]->null_value ||
1897
my_decimal_floor(E_DEC_FATAL_ERROR, value,
1898
decimal_value) > 1)))
1899
return decimal_value;
1904
void Item_func_round::fix_length_and_dec()
1906
int decimals_to_set;
1910
unsigned_flag= args[0]->unsigned_flag;
1911
if (!args[1]->const_item())
1913
max_length= args[0]->max_length;
1914
decimals= args[0]->decimals;
1915
if (args[0]->result_type() == DECIMAL_RESULT)
1918
hybrid_type= DECIMAL_RESULT;
1921
hybrid_type= REAL_RESULT;
1925
val1= args[1]->val_int();
1926
val1_unsigned= args[1]->unsigned_flag;
1928
decimals_to_set= val1_unsigned ? INT_MAX : 0;
1930
decimals_to_set= (val1 > INT_MAX) ? INT_MAX : (int) val1;
1932
if (args[0]->decimals == NOT_FIXED_DEC)
1934
max_length= args[0]->max_length;
1935
decimals= min(decimals_to_set, NOT_FIXED_DEC);
1936
hybrid_type= REAL_RESULT;
1940
switch (args[0]->result_type()) {
1943
hybrid_type= REAL_RESULT;
1944
decimals= min(decimals_to_set, NOT_FIXED_DEC);
1945
max_length= float_length(decimals);
1948
if ((!decimals_to_set && truncate) || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))
1950
int length_can_increase= test(!truncate && (val1 < 0) && !val1_unsigned);
1951
max_length= args[0]->max_length + length_can_increase;
1952
/* Here we can keep INT_RESULT */
1953
hybrid_type= INT_RESULT;
1958
case DECIMAL_RESULT:
1960
hybrid_type= DECIMAL_RESULT;
1961
decimals_to_set= min(DECIMAL_MAX_SCALE, decimals_to_set);
1962
int decimals_delta= args[0]->decimals - decimals_to_set;
1963
int precision= args[0]->decimal_precision();
1964
int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1;
1966
precision-= decimals_delta - length_increase;
1967
decimals= min(decimals_to_set, DECIMAL_MAX_SCALE);
1968
max_length= my_decimal_precision_to_length(precision, decimals,
1973
assert(0); /* This result type isn't handled */
1977
double my_double_round(double value, int64_t dec, bool dec_unsigned,
1981
bool dec_negative= (dec < 0) && !dec_unsigned;
1982
uint64_t abs_dec= dec_negative ? -dec : dec;
1984
tmp2 is here to avoid return the value with 80 bit precision
1985
This will fix that the test round(0.1,1) = round(0.1,1) is true
1987
volatile double tmp2;
1989
tmp=(abs_dec < array_elements(log_10) ?
1990
log_10[abs_dec] : pow(10.0,(double) abs_dec));
1992
if (dec_negative && my_isinf(tmp))
1994
else if (!dec_negative && my_isinf(value * tmp))
1999
tmp2= dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp;
2001
tmp2= dec < 0 ? ceil(value/tmp)*tmp : ceil(value*tmp)/tmp;
2004
tmp2=dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp;
2009
double Item_func_round::real_op()
2011
double value= args[0]->val_real();
2013
if (!(null_value= args[0]->null_value || args[1]->null_value))
2014
return my_double_round(value, args[1]->val_int(), args[1]->unsigned_flag,
2021
Rounds a given value to a power of 10 specified as the 'to' argument,
2022
avoiding overflows when the value is close to the uint64_t range boundary.
2025
static inline uint64_t my_unsigned_round(uint64_t value, uint64_t to)
2027
uint64_t tmp= value / to * to;
2028
return (value - tmp < (to >> 1)) ? tmp : tmp + to;
2032
int64_t Item_func_round::int_op()
2034
int64_t value= args[0]->val_int();
2035
int64_t dec= args[1]->val_int();
2038
if ((null_value= args[0]->null_value || args[1]->null_value))
2040
if ((dec >= 0) || args[1]->unsigned_flag)
2041
return value; // integer have not digits after point
2046
if(abs_dec >= array_elements(log_10_int))
2049
tmp= log_10_int[abs_dec];
2052
value= (unsigned_flag) ?
2053
((uint64_t) value / tmp) * tmp : (value / tmp) * tmp;
2055
value= (unsigned_flag || value >= 0) ?
2056
my_unsigned_round((uint64_t) value, tmp) :
2057
-(int64_t) my_unsigned_round((uint64_t) -value, tmp);
2062
my_decimal *Item_func_round::decimal_op(my_decimal *decimal_value)
2064
my_decimal val, *value= args[0]->val_decimal(&val);
2065
int64_t dec= args[1]->val_int();
2066
if (dec >= 0 || args[1]->unsigned_flag)
2067
dec= min(dec, (int64_t) decimals);
2068
else if (dec < INT_MIN)
2071
if (!(null_value= (args[0]->null_value || args[1]->null_value ||
2072
my_decimal_round(E_DEC_FATAL_ERROR, value, (int) dec,
2073
truncate, decimal_value) > 1)))
2075
decimal_value->frac= decimals;
2076
return decimal_value;
2082
void Item_func_rand::seed_random(Item *arg)
2085
TODO: do not do reinit 'rand' for every execute of PS/SP if
2086
args[0] is a constant.
2088
uint32_t tmp= (uint32_t) arg->val_int();
2089
randominit(rand, (uint32_t) (tmp*0x10001L+55555555L),
2090
(uint32_t) (tmp*0x10000001L));
2094
bool Item_func_rand::fix_fields(THD *thd,Item **ref)
2096
if (Item_real_func::fix_fields(thd, ref))
2098
used_tables_cache|= RAND_TABLE_BIT;
2100
{ // Only use argument once in query
2102
Allocate rand structure once: we must use thd->stmt_arena
2103
to create rand in proper mem_root if it's a prepared statement or
2106
No need to send a Rand log event if seed was given eg: RAND(seed),
2107
as it will be replicated in the query as such.
2109
if (!rand && !(rand= (struct rand_struct*)
2110
thd->stmt_arena->alloc(sizeof(*rand))))
2113
if (args[0]->const_item())
2114
seed_random (args[0]);
2119
Save the seed only the first time RAND() is used in the query
2120
Once events are forwarded rather than recreated,
2121
the following can be skipped if inside the slave thread
2123
if (!thd->rand_used)
2126
thd->rand_saved_seed1= thd->rand.seed1;
2127
thd->rand_saved_seed2= thd->rand.seed2;
2134
void Item_func_rand::update_used_tables()
2136
Item_real_func::update_used_tables();
2137
used_tables_cache|= RAND_TABLE_BIT;
2141
double Item_func_rand::val_real()
2144
if (arg_count && !args[0]->const_item())
2145
seed_random (args[0]);
2146
return my_rnd(rand);
2149
int64_t Item_func_sign::val_int()
2152
double value= args[0]->val_real();
2153
null_value=args[0]->null_value;
2154
return value < 0.0 ? -1 : (value > 0 ? 1 : 0);
2158
double Item_func_units::val_real()
2161
double value= args[0]->val_real();
2162
if ((null_value=args[0]->null_value))
2164
return value*mul+add;
2168
void Item_func_min_max::fix_length_and_dec()
2171
bool datetime_found= false;
2175
cmp_type=args[0]->result_type();
2177
for (uint i=0 ; i < arg_count ; i++)
2179
set_if_bigger(max_length, args[i]->max_length);
2180
set_if_bigger(decimals, args[i]->decimals);
2181
set_if_bigger(max_int_part, args[i]->decimal_int_part());
2182
if (args[i]->maybe_null)
2184
cmp_type=item_cmp_type(cmp_type,args[i]->result_type());
2185
if (args[i]->result_type() != ROW_RESULT && args[i]->is_datetime())
2187
datetime_found= true;
2188
if (!datetime_item || args[i]->field_type() == DRIZZLE_TYPE_DATETIME)
2189
datetime_item= args[i];
2192
if (cmp_type == STRING_RESULT)
2194
agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV, 1);
2198
compare_as_dates= true;
2201
else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
2202
max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals,
2204
cached_field_type= agg_field_type(args, arg_count);
2209
Compare item arguments in the DATETIME context.
2213
value [out] found least/greatest DATE/DATETIME value
2216
Compare item arguments as DATETIME values and return the index of the
2217
least/greatest argument in the arguments array.
2218
The correct integer DATE/DATETIME value of the found argument is
2219
stored to the value pointer, if latter is provided.
2222
0 If one of arguments is NULL
2223
# index of the least/greatest argument
2226
uint Item_func_min_max::cmp_datetimes(uint64_t *value)
2228
uint64_t min_max= 0;
2229
uint min_max_idx= 0;
2231
for (uint i=0; i < arg_count ; i++)
2233
Item **arg= args + i;
2235
uint64_t res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
2236
if ((null_value= args[i]->null_value))
2238
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
2247
if (datetime_item->field_type() == DRIZZLE_TYPE_NEWDATE)
2254
String *Item_func_min_max::val_str(String *str)
2257
if (compare_as_dates)
2260
uint min_max_idx= cmp_datetimes(NULL);
2263
str_res= args[min_max_idx]->val_str(str);
2264
str_res->set_charset(collation.collation);
2270
int64_t nr=val_int();
2273
str->set_int(nr, unsigned_flag, &my_charset_bin);
2276
case DECIMAL_RESULT:
2278
my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
2281
my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
2286
double nr= val_real();
2288
return 0; /* purecov: inspected */
2289
str->set_real(nr,decimals,&my_charset_bin);
2296
for (uint i=0; i < arg_count ; i++)
2299
res=args[i]->val_str(str);
2303
res2= args[i]->val_str(res == str ? &tmp_value : str);
2306
int cmp= sortcmp(res,res2,collation.collation);
2307
if ((cmp_sign < 0 ? cmp : -cmp) < 0)
2311
if ((null_value= args[i]->null_value))
2314
res->set_charset(collation.collation);
2319
// This case should never be chosen
2323
return 0; // Keep compiler happy
2327
double Item_func_min_max::val_real()
2331
if (compare_as_dates)
2334
(void)cmp_datetimes(&result);
2335
return (double)result;
2337
for (uint i=0; i < arg_count ; i++)
2340
value= args[i]->val_real();
2343
double tmp= args[i]->val_real();
2344
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
2347
if ((null_value= args[i]->null_value))
2354
int64_t Item_func_min_max::val_int()
2358
if (compare_as_dates)
2361
(void)cmp_datetimes(&result);
2362
return (int64_t)result;
2364
for (uint i=0; i < arg_count ; i++)
2367
value=args[i]->val_int();
2370
int64_t tmp=args[i]->val_int();
2371
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
2374
if ((null_value= args[i]->null_value))
2381
my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
2384
my_decimal tmp_buf, *tmp, *res= NULL;
2386
if (compare_as_dates)
2389
(void)cmp_datetimes(&value);
2390
uint64_t2decimal(value, dec);
2393
for (uint i=0; i < arg_count ; i++)
2396
res= args[i]->val_decimal(dec);
2399
tmp= args[i]->val_decimal(&tmp_buf); // Zero if NULL
2400
if (tmp && (my_decimal_cmp(tmp, res) * cmp_sign) < 0)
2402
if (tmp == &tmp_buf)
2404
/* Move value out of tmp_buf as this will be reused on next loop */
2405
my_decimal2decimal(tmp, dec);
2412
if ((null_value= args[i]->null_value))
2422
int64_t Item_func_length::val_int()
2425
String *res=args[0]->val_str(&value);
2429
return 0; /* purecov: inspected */
2432
return (int64_t) res->length();
2436
int64_t Item_func_char_length::val_int()
2439
String *res=args[0]->val_str(&value);
2443
return 0; /* purecov: inspected */
2446
return (int64_t) res->numchars();
2450
int64_t Item_func_coercibility::val_int()
2454
return (int64_t) args[0]->collation.derivation;
2458
void Item_func_locate::fix_length_and_dec()
2460
max_length= MY_INT32_NUM_DECIMAL_DIGITS;
2461
agg_arg_charsets(cmp_collation, args, 2, MY_COLL_CMP_CONV, 1);
2465
int64_t Item_func_locate::val_int()
2468
String *a=args[0]->val_str(&value1);
2469
String *b=args[1]->val_str(&value2);
2473
return 0; /* purecov: inspected */
2476
/* must be int64_t to avoid truncation */
2483
start0= start= args[2]->val_int() - 1;
2485
if ((start < 0) || (start > a->length()))
2488
/* start is now sufficiently valid to pass to charpos function */
2489
start= a->charpos((int) start);
2491
if (start + b->length() > a->length())
2495
if (!b->length()) // Found empty string at start
2498
if (!cmp_collation.collation->coll->instr(cmp_collation.collation,
2500
(uint) (a->length()-start),
2501
b->ptr(), b->length(),
2504
return (int64_t) match.mb_len + start0 + 1;
2508
void Item_func_locate::print(String *str, enum_query_type query_type)
2510
str->append(STRING_WITH_LEN("locate("));
2511
args[1]->print(str, query_type);
2513
args[0]->print(str, query_type);
2517
args[2]->print(str, query_type);
2523
int64_t Item_func_field::val_int()
2527
if (cmp_type == STRING_RESULT)
2530
if (!(field= args[0]->val_str(&value)))
2532
for (uint i=1 ; i < arg_count ; i++)
2534
String *tmp_value=args[i]->val_str(&tmp);
2535
if (tmp_value && !sortcmp(field,tmp_value,cmp_collation.collation))
2536
return (int64_t) (i);
2539
else if (cmp_type == INT_RESULT)
2541
int64_t val= args[0]->val_int();
2542
if (args[0]->null_value)
2544
for (uint i=1; i < arg_count ; i++)
2546
if (val == args[i]->val_int() && !args[i]->null_value)
2547
return (int64_t) (i);
2550
else if (cmp_type == DECIMAL_RESULT)
2552
my_decimal dec_arg_buf, *dec_arg,
2553
dec_buf, *dec= args[0]->val_decimal(&dec_buf);
2554
if (args[0]->null_value)
2556
for (uint i=1; i < arg_count; i++)
2558
dec_arg= args[i]->val_decimal(&dec_arg_buf);
2559
if (!args[i]->null_value && !my_decimal_cmp(dec_arg, dec))
2560
return (int64_t) (i);
2565
double val= args[0]->val_real();
2566
if (args[0]->null_value)
2568
for (uint i=1; i < arg_count ; i++)
2570
if (val == args[i]->val_real() && !args[i]->null_value)
2571
return (int64_t) (i);
2578
void Item_func_field::fix_length_and_dec()
2580
maybe_null=0; max_length=3;
2581
cmp_type= args[0]->result_type();
2582
for (uint i=1; i < arg_count ; i++)
2583
cmp_type= item_cmp_type(cmp_type, args[i]->result_type());
2584
if (cmp_type == STRING_RESULT)
2585
agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV, 1);
2589
int64_t Item_func_ascii::val_int()
2592
String *res=args[0]->val_str(&value);
2599
return (int64_t) (res->length() ? (uchar) (*res)[0] : (uchar) 0);
2602
int64_t Item_func_ord::val_int()
2605
String *res=args[0]->val_str(&value);
2612
if (!res->length()) return 0;
2614
if (use_mb(res->charset()))
2616
register const char *str=res->ptr();
2617
register uint32_t n=0, l=my_ismbchar(res->charset(),str,str+res->length());
2619
return (int64_t)((uchar) *str);
2621
n=(n<<8)|(uint32_t)((uchar) *str++);
2625
return (int64_t) ((uchar) (*res)[0]);
2628
/* Search after a string in a string of strings separated by ',' */
2629
/* Returns number of found type >= 1 or 0 if not found */
2630
/* This optimizes searching in enums to bit testing! */
2632
void Item_func_find_in_set::fix_length_and_dec()
2635
max_length=3; // 1-999
2636
agg_arg_charsets(cmp_collation, args, 2, MY_COLL_CMP_CONV, 1);
2639
static const char separator=',';
2641
int64_t Item_func_find_in_set::val_int()
2646
uint64_t tmp=(uint64_t) args[1]->val_int();
2647
if (!(null_value=args[1]->null_value || args[0]->null_value))
2655
String *find=args[0]->val_str(&value);
2656
String *buffer=args[1]->val_str(&value2);
2657
if (!find || !buffer)
2660
return 0; /* purecov: inspected */
2665
if ((diff=buffer->length() - find->length()) >= 0)
2668
const CHARSET_INFO * const cs= cmp_collation.collation;
2669
const char *str_begin= buffer->ptr();
2670
const char *str_end= buffer->ptr();
2671
const char *real_end= str_end+buffer->length();
2672
const uchar *find_str= (const uchar *) find->ptr();
2673
uint find_str_len= find->length();
2678
if ((symbol_len= cs->cset->mb_wc(cs, &wc, (uchar*) str_end,
2679
(uchar*) real_end)) > 0)
2681
const char *substr_end= str_end + symbol_len;
2682
bool is_last_item= (substr_end == real_end);
2683
bool is_separator= (wc == (my_wc_t) separator);
2684
if (is_separator || is_last_item)
2687
if (is_last_item && !is_separator)
2688
str_end= substr_end;
2689
if (!my_strnncoll(cs, (const uchar *) str_begin,
2690
str_end - str_begin,
2691
find_str, find_str_len))
2692
return (int64_t) position;
2694
str_begin= substr_end;
2696
str_end= substr_end;
2698
else if (str_end - str_begin == 0 &&
2699
find_str_len == 0 &&
2700
wc == (my_wc_t) separator)
2701
return (int64_t) ++position;
2709
int64_t Item_func_bit_count::val_int()
2712
uint64_t value= (uint64_t) args[0]->val_int();
2713
if ((null_value= args[0]->null_value))
2714
return 0; /* purecov: inspected */
2715
return (int64_t) my_count_bits(value);
2719
/****************************************************************************
2720
** Functions to handle dynamic loadable functions
2721
** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
2722
** Rewritten by monty.
2723
****************************************************************************/
2725
void udf_handler::cleanup()
2731
if (u_d->func_deinit != NULL)
2733
Udf_func_deinit deinit= u_d->func_deinit;
2739
if (buffers) // Because of bug in ecc
2747
udf_handler::fix_fields(THD *thd, Item_result_field *func,
2748
uint arg_count, Item **arguments)
2750
uchar buff[STACK_BUFF_ALLOC]; // Max argument in function
2752
if (check_stack_overrun(thd, STACK_MIN_SIZE, buff))
2753
return(true); // Fatal error flag is set!
2755
udf_func *tmp_udf=find_udf(u_d->name.str,(uint) u_d->name.length);
2759
my_error(ER_CANT_FIND_UDF, MYF(0), u_d->name.str, errno);
2765
/* Fix all arguments */
2767
used_tables_cache=0;
2770
if ((f_args.arg_count=arg_count))
2772
if (!(f_args.arg_type= (Item_result*)
2773
sql_alloc(f_args.arg_count*sizeof(Item_result))))
2779
Item **arg,**arg_end;
2780
for (i=0, arg=arguments, arg_end=arguments+arg_count;
2784
if (!(*arg)->fixed &&
2785
(*arg)->fix_fields(thd, arg))
2787
// we can't assign 'item' before, because fix_fields() can change arg
2789
if (item->check_cols(1))
2792
TODO: We should think about this. It is not always
2793
right way just to set an UDF result to return my_charset_bin
2794
if one argument has binary sorting order.
2795
The result collation should be calculated according to arguments
2796
derivations in some cases and should not in other cases.
2797
Moreover, some arguments can represent a numeric input
2798
which doesn't effect the result character set and collation.
2799
There is no a general rule for UDF. Everything depends on
2800
the particular user defined function.
2802
if (item->collation.collation->state & MY_CS_BINSORT)
2803
func->collation.set(&my_charset_bin);
2804
if (item->maybe_null)
2806
func->with_sum_func= func->with_sum_func || item->with_sum_func;
2807
used_tables_cache|=item->used_tables();
2808
const_item_cache&=item->const_item();
2809
f_args.arg_type[i]=item->result_type();
2811
//TODO: why all following memory is not allocated with 1 call of sql_alloc?
2812
if (!(buffers=new String[arg_count]) ||
2813
!(f_args.args= (char**) sql_alloc(arg_count * sizeof(char *))) ||
2814
!(f_args.lengths= (ulong*) sql_alloc(arg_count * sizeof(long))) ||
2815
!(f_args.maybe_null= (char*) sql_alloc(arg_count * sizeof(char))) ||
2816
!(num_buffer= (char*) sql_alloc(arg_count *
2817
ALIGN_SIZE(sizeof(double)))) ||
2818
!(f_args.attributes= (char**) sql_alloc(arg_count * sizeof(char *))) ||
2819
!(f_args.attribute_lengths= (ulong*) sql_alloc(arg_count *
2825
func->fix_length_and_dec();
2826
initid.max_length=func->max_length;
2827
initid.maybe_null=func->maybe_null;
2828
initid.const_item=const_item_cache;
2829
initid.decimals=func->decimals;
2834
char init_msg_buff[DRIZZLE_ERRMSG_SIZE];
2835
char *to=num_buffer;
2836
for (uint i=0; i < arg_count; i++)
2839
For a constant argument i, args->args[i] points to the argument value.
2840
For non-constant, args->args[i] is NULL.
2842
f_args.args[i]= NULL; /* Non-const unless updated below. */
2844
f_args.lengths[i]= arguments[i]->max_length;
2845
f_args.maybe_null[i]= (char) arguments[i]->maybe_null;
2846
f_args.attributes[i]= arguments[i]->name;
2847
f_args.attribute_lengths[i]= arguments[i]->name_length;
2849
if (arguments[i]->const_item())
2851
switch (arguments[i]->result_type())
2854
case DECIMAL_RESULT:
2856
String *res= arguments[i]->val_str(&buffers[i]);
2857
if (arguments[i]->null_value)
2859
f_args.args[i]= (char*) res->c_ptr();
2860
f_args.lengths[i]= res->length();
2864
*((int64_t*) to)= arguments[i]->val_int();
2865
if (arguments[i]->null_value)
2868
to+= ALIGN_SIZE(sizeof(int64_t));
2871
*((double*) to)= arguments[i]->val_real();
2872
if (arguments[i]->null_value)
2875
to+= ALIGN_SIZE(sizeof(double));
2879
// This case should never be chosen
2885
Udf_func_init init= u_d->func_init;
2886
if ((error=(uchar) init(&initid, &f_args, init_msg_buff)))
2888
my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
2889
u_d->name.str, init_msg_buff);
2892
func->max_length=min(initid.max_length,(unsigned long)MAX_BLOB_WIDTH);
2893
func->maybe_null=initid.maybe_null;
2894
const_item_cache=initid.const_item;
2896
Keep used_tables_cache in sync with const_item_cache.
2897
See the comment in Item_udf_func::update_used tables.
2899
if (!const_item_cache && !used_tables_cache)
2900
used_tables_cache= RAND_TABLE_BIT;
2901
func->decimals=min(initid.decimals,(unsigned int)NOT_FIXED_DEC);
2906
my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
2907
u_d->name.str, ER(ER_UNKNOWN_ERROR));
2914
bool udf_handler::get_arguments()
2917
return 1; // Got an error earlier
2918
char *to= num_buffer;
2920
for (uint i=0; i < f_args.arg_count; i++)
2923
switch (f_args.arg_type[i]) {
2925
case DECIMAL_RESULT:
2927
String *res=args[i]->val_str(&buffers[str_count++]);
2928
if (!(args[i]->null_value))
2930
f_args.args[i]= (char*) res->ptr();
2931
f_args.lengths[i]= res->length();
2936
*((int64_t*) to) = args[i]->val_int();
2937
if (!args[i]->null_value)
2940
to+= ALIGN_SIZE(sizeof(int64_t));
2944
*((double*) to)= args[i]->val_real();
2945
if (!args[i]->null_value)
2948
to+= ALIGN_SIZE(sizeof(double));
2953
// This case should never be chosen
2963
(String*)NULL in case of NULL values
2965
String *udf_handler::val_str(String *str,String *save_str)
2967
uchar is_null_tmp=0;
2970
if (get_arguments())
2972
char * (*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
2973
(char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
2976
if ((res_length=str->alloced_length()) < MAX_FIELD_WIDTH)
2977
{ // This happens VERY seldom
2978
if (str->alloc(MAX_FIELD_WIDTH))
2984
char *res=func(&initid, &f_args, (char*) str->ptr(), &res_length,
2985
&is_null_tmp, &error);
2986
if (is_null_tmp || !res || error) // The !res is for safety
2990
if (res == str->ptr())
2992
str->length(res_length);
2995
save_str->set(res, res_length, str->charset());
3001
For the moment, UDF functions are returning DECIMAL values as strings
3004
my_decimal *udf_handler::val_decimal(bool *null_value, my_decimal *dec_buf)
3006
char buf[DECIMAL_MAX_STR_LENGTH+1], *end;
3007
ulong res_length= DECIMAL_MAX_STR_LENGTH;
3009
if (get_arguments())
3014
char *(*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
3015
(char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
3018
char *res= func(&initid, &f_args, buf, &res_length, &is_null, &error);
3019
if (is_null || error)
3024
end= res+ res_length;
3025
str2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf, &end);
3030
void Item_udf_func::cleanup()
3033
Item_func::cleanup();
3037
void Item_udf_func::print(String *str, enum_query_type query_type)
3039
str->append(func_name());
3041
for (uint i=0 ; i < arg_count ; i++)
3045
args[i]->print_item_w_name(str, query_type);
3051
double Item_func_udf_float::val_real()
3054
return(udf.val(&null_value));
3058
String *Item_func_udf_float::val_str(String *str)
3061
double nr= val_real();
3063
return 0; /* purecov: inspected */
3064
str->set_real(nr,decimals,&my_charset_bin);
3069
int64_t Item_func_udf_int::val_int()
3072
return(udf.val_int(&null_value));
3076
String *Item_func_udf_int::val_str(String *str)
3079
int64_t nr=val_int();
3082
str->set_int(nr, unsigned_flag, &my_charset_bin);
3087
int64_t Item_func_udf_decimal::val_int()
3089
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3093
my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
3098
double Item_func_udf_decimal::val_real()
3100
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3104
my_decimal2double(E_DEC_FATAL_ERROR, dec, &result);
3109
my_decimal *Item_func_udf_decimal::val_decimal(my_decimal *dec_buf)
3112
return(udf.val_decimal(&null_value, dec_buf));
3116
String *Item_func_udf_decimal::val_str(String *str)
3118
my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
3121
if (str->length() < DECIMAL_MAX_STR_LENGTH)
3122
str->length(DECIMAL_MAX_STR_LENGTH);
3123
my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
3124
my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, '0', str);
3129
void Item_func_udf_decimal::fix_length_and_dec()
3131
fix_num_length_and_dec();
3135
/* Default max_length is max argument length */
3137
void Item_func_udf_str::fix_length_and_dec()
3140
for (uint i = 0; i < arg_count; i++)
3141
set_if_bigger(max_length,args[i]->max_length);
3145
String *Item_func_udf_str::val_str(String *str)
3148
String *res=udf.val_str(str,&str_value);
3156
This has to come last in the udf_handler methods, or C for AIX
3157
version 6.0.0.0 fails to compile with debugging enabled. (Yes, really.)
3160
udf_handler::~udf_handler()
3162
/* Everything should be properly cleaned up by this moment. */
3163
assert(not_original || !(initialized || buffers));
3170
pthread_mutex_t LOCK_user_locks;
3171
static HASH hash_user_locks;
3173
class User_level_lock
3181
pthread_cond_t cond;
3182
my_thread_id thread_id;
3183
void set_thread(THD *thd) { thread_id= thd->thread_id; }
3185
User_level_lock(const uchar *key_arg,uint length, ulong id)
3186
:key_length(length),count(1),locked(1), thread_id(id)
3188
key= (uchar*) my_memdup(key_arg,length,MYF(0));
3189
pthread_cond_init(&cond,NULL);
3192
if (my_hash_insert(&hash_user_locks,(uchar*) this))
3194
my_free(key,MYF(0));
3203
hash_delete(&hash_user_locks,(uchar*) this);
3204
my_free(key, MYF(0));
3206
pthread_cond_destroy(&cond);
3208
inline bool initialized() { return key != 0; }
3209
friend void item_user_lock_release(User_level_lock *ull);
3210
friend uchar *ull_get_key(const User_level_lock *ull, size_t *length,
3214
uchar *ull_get_key(const User_level_lock *ull, size_t *length,
3215
bool not_used __attribute__((unused)))
3217
*length= ull->key_length;
3222
static bool item_user_lock_inited= 0;
3224
void item_user_lock_init(void)
3226
pthread_mutex_init(&LOCK_user_locks,MY_MUTEX_INIT_SLOW);
3227
hash_init(&hash_user_locks, system_charset_info,
3228
16,0,0,(hash_get_key) ull_get_key,NULL,0);
3229
item_user_lock_inited= 1;
3232
void item_user_lock_free(void)
3234
if (item_user_lock_inited)
3236
item_user_lock_inited= 0;
3237
hash_free(&hash_user_locks);
3238
pthread_mutex_destroy(&LOCK_user_locks);
3242
void item_user_lock_release(User_level_lock *ull)
3247
pthread_cond_signal(&ull->cond);
3253
Wait until we are at or past the given position in the master binlog
3257
int64_t Item_master_pos_wait::val_int()
3260
THD* thd = current_thd;
3261
String *log_name = args[0]->val_str(&value);
3265
if (thd->slave_thread || !log_name || !log_name->length())
3270
#ifdef HAVE_REPLICATION
3271
int64_t pos = (ulong)args[1]->val_int();
3272
int64_t timeout = (arg_count==3) ? args[2]->val_int() : 0 ;
3273
if ((event_count = active_mi->rli.wait_for_pos(thd, log_name, pos, timeout)) == -2)
3283
void debug_sync_point(const char* lock_name, uint lock_timeout)
3290
int64_t Item_func_last_insert_id::val_int()
3292
THD *thd= current_thd;
3296
int64_t value= args[0]->val_int();
3297
null_value= args[0]->null_value;
3299
LAST_INSERT_ID(X) must affect the client's mysql_insert_id() as
3300
documented in the manual. We don't want to touch
3301
first_successful_insert_id_in_cur_stmt because it would make
3302
LAST_INSERT_ID(X) take precedence over an generated auto_increment
3305
thd->arg_of_last_insert_id_function= true;
3306
thd->first_successful_insert_id_in_prev_stmt= value;
3309
return thd->read_first_successful_insert_id_in_prev_stmt();
3313
bool Item_func_last_insert_id::fix_fields(THD *thd, Item **ref)
3315
return Item_int_func::fix_fields(thd, ref);
3319
/* This function is just used to test speed of different functions */
3321
int64_t Item_func_benchmark::val_int()
3324
char buff[MAX_FIELD_WIDTH];
3325
String tmp(buff,sizeof(buff), &my_charset_bin);
3326
my_decimal tmp_decimal;
3327
THD *thd=current_thd;
3328
uint64_t loop_count;
3330
loop_count= (uint64_t) args[0]->val_int();
3332
if (args[0]->null_value ||
3333
(!args[0]->unsigned_flag && (((int64_t) loop_count) < 0)))
3335
if (!args[0]->null_value)
3338
llstr(((int64_t) loop_count), buff);
3339
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
3340
ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE),
3341
"count", buff, "benchmark");
3349
for (uint64_t loop=0 ; loop < loop_count && !thd->killed; loop++)
3351
switch (args[1]->result_type()) {
3353
(void) args[1]->val_real();
3356
(void) args[1]->val_int();
3359
(void) args[1]->val_str(&tmp);
3361
case DECIMAL_RESULT:
3362
(void) args[1]->val_decimal(&tmp_decimal);
3366
// This case should never be chosen
3375
void Item_func_benchmark::print(String *str, enum_query_type query_type)
3377
str->append(STRING_WITH_LEN("benchmark("));
3378
args[0]->print(str, query_type);
3380
args[1]->print(str, query_type);
3384
#define extra_size sizeof(double)
3386
static user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
3387
bool create_if_not_exists)
3389
user_var_entry *entry;
3391
if (!(entry = (user_var_entry*) hash_search(hash, (uchar*) name.str,
3393
create_if_not_exists)
3395
uint size=ALIGN_SIZE(sizeof(user_var_entry))+name.length+1+extra_size;
3396
if (!hash_inited(hash))
3398
if (!(entry = (user_var_entry*) my_malloc(size,MYF(MY_WME | ME_FATALERROR))))
3400
entry->name.str=(char*) entry+ ALIGN_SIZE(sizeof(user_var_entry))+
3402
entry->name.length=name.length;
3405
entry->update_query_id=0;
3406
entry->collation.set(NULL, DERIVATION_IMPLICIT, 0);
3407
entry->unsigned_flag= 0;
3409
If we are here, we were called from a SET or a query which sets a
3410
variable. Imagine it is this:
3411
INSERT INTO t SELECT @a:=10, @a:=@a+1.
3412
Then when we have a Item_func_get_user_var (because of the @a+1) so we
3413
think we have to write the value of @a to the binlog. But before that,
3414
we have a Item_func_set_user_var to create @a (@a:=10), in this we mark
3415
the variable as "already logged" (line below) so that it won't be logged
3416
by Item_func_get_user_var (because that's not necessary).
3418
entry->used_query_id=current_thd->query_id;
3419
entry->type=STRING_RESULT;
3420
memcpy(entry->name.str, name.str, name.length+1);
3421
if (my_hash_insert(hash,(uchar*) entry))
3423
my_free((char*) entry,MYF(0));
3431
When a user variable is updated (in a SET command or a query like
3435
bool Item_func_set_user_var::fix_fields(THD *thd, Item **ref)
3438
/* fix_fields will call Item_func_set_user_var::fix_length_and_dec */
3439
if (Item_func::fix_fields(thd, ref) ||
3440
!(entry= get_variable(&thd->user_vars, name, 1)))
3443
Remember the last query which updated it, this way a query can later know
3444
if this variable is a constant item in the query (it is if update_query_id
3445
is different from query_id).
3447
entry->update_query_id= thd->query_id;
3449
As it is wrong and confusing to associate any
3450
character set with NULL, @a should be latin2
3451
after this query sequence:
3453
SET @a=_latin2'string';
3456
I.e. the second query should not change the charset
3457
to the current default value, but should keep the
3458
original value assigned during the first query.
3459
In order to do it, we don't copy charset
3460
from the argument if the argument is NULL
3461
and the variable has previously been initialized.
3463
null_item= (args[0]->type() == NULL_ITEM);
3464
if (!entry->collation.collation || !null_item)
3465
entry->collation.set(args[0]->collation.collation, DERIVATION_IMPLICIT);
3466
collation.set(entry->collation.collation, DERIVATION_IMPLICIT);
3467
cached_result_type= args[0]->result_type();
3473
Item_func_set_user_var::fix_length_and_dec()
3475
maybe_null=args[0]->maybe_null;
3476
max_length=args[0]->max_length;
3477
decimals=args[0]->decimals;
3478
collation.set(args[0]->collation.collation, DERIVATION_IMPLICIT);
3483
Mark field in read_map
3486
This is used by filesort to register used fields in a a temporary
3487
column read set or to register used fields in a view
3490
bool Item_func_set_user_var::register_field_in_read_map(uchar *arg)
3494
Table *table= (Table *) arg;
3495
if (result_field->table == table || !table)
3496
bitmap_set_bit(result_field->table->read_set, result_field->field_index);
3503
Set value to user variable.
3505
@param entry pointer to structure representing variable
3506
@param set_null should we set NULL value ?
3507
@param ptr pointer to buffer with new value
3508
@param length length of new value
3509
@param type type of new value
3510
@param cs charset info for new value
3511
@param dv derivation for new value
3512
@param unsigned_arg indiates if a value of type INT_RESULT is unsigned
3514
@note Sets error and fatal error if allocation fails.
3523
update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
3524
Item_result type, const CHARSET_INFO * const cs, Derivation dv,
3529
char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
3530
if (entry->value && entry->value != pos)
3531
my_free(entry->value,MYF(0));
3537
if (type == STRING_RESULT)
3538
length++; // Store strings with end \0
3539
if (length <= extra_size)
3541
/* Save value in value struct */
3542
char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
3543
if (entry->value != pos)
3546
my_free(entry->value,MYF(0));
3552
/* Allocate variable */
3553
if (entry->length != length)
3555
char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
3556
if (entry->value == pos)
3558
entry->value= (char*) my_realloc(entry->value, length,
3559
MYF(MY_ALLOW_ZERO_PTR | MY_WME |
3565
if (type == STRING_RESULT)
3567
length--; // Fix length change above
3568
entry->value[length]= 0; // Store end \0
3570
memcpy(entry->value,ptr,length);
3571
if (type == DECIMAL_RESULT)
3572
((my_decimal*)entry->value)->fix_buffer_pointer();
3573
entry->length= length;
3574
entry->collation.set(cs, dv);
3575
entry->unsigned_flag= unsigned_arg;
3583
Item_func_set_user_var::update_hash(void *ptr, uint length,
3584
Item_result res_type,
3585
const CHARSET_INFO * const cs, Derivation dv,
3589
If we set a variable explicitely to NULL then keep the old
3590
result type of the variable
3592
if ((null_value= args[0]->null_value) && null_item)
3593
res_type= entry->type; // Don't change type of item
3594
if (::update_hash(entry, (null_value= args[0]->null_value),
3595
ptr, length, res_type, cs, dv, unsigned_arg))
3722
This functions is invoked on SET \@variable or
3723
\@variable:= expression.
3725
Evaluate (and check expression), store results.
3728
For now it always return OK. All problem with value evaluating
3729
will be caught by thd->is_error() check in sql_set_variables().
3736
Item_func_set_user_var::check(bool use_result_field)
3738
if (use_result_field && !result_field)
3739
use_result_field= false;
3741
switch (cached_result_type) {
3744
save_result.vreal= use_result_field ? result_field->val_real() :
3745
args[0]->val_real();
3750
save_result.vint= use_result_field ? result_field->val_int() :
3752
unsigned_flag= use_result_field ? ((Field_num*)result_field)->unsigned_flag:
3753
args[0]->unsigned_flag;
3758
save_result.vstr= use_result_field ? result_field->val_str(&value) :
3759
args[0]->val_str(&value);
3762
case DECIMAL_RESULT:
3764
save_result.vdec= use_result_field ?
3765
result_field->val_decimal(&decimal_buff) :
3766
args[0]->val_decimal(&decimal_buff);
3771
// This case should never be chosen
3780
This functions is invoked on
3781
SET \@variable or \@variable:= expression.
3784
We have to store the expression as such in the variable, independent of
3785
the value method used by the user
3795
Item_func_set_user_var::update()
3799
switch (cached_result_type) {
3802
res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal),
3803
REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, 0);
3808
res= update_hash((void*) &save_result.vint, sizeof(save_result.vint),
3809
INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT,
3815
if (!save_result.vstr) // Null value
3816
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin,
3817
DERIVATION_IMPLICIT, 0);
3819
res= update_hash((void*) save_result.vstr->ptr(),
3820
save_result.vstr->length(), STRING_RESULT,
3821
save_result.vstr->charset(),
3822
DERIVATION_IMPLICIT, 0);
3825
case DECIMAL_RESULT:
3827
if (!save_result.vdec) // Null value
3828
res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin,
3829
DERIVATION_IMPLICIT, 0);
3831
res= update_hash((void*) save_result.vdec,
3832
sizeof(my_decimal), DECIMAL_RESULT,
3833
&my_charset_bin, DERIVATION_IMPLICIT, 0);
3838
// This case should never be chosen
3846
double Item_func_set_user_var::val_real()
3850
update(); // Store expression
3851
return entry->val_real(&null_value);
3854
int64_t Item_func_set_user_var::val_int()
3858
update(); // Store expression
3859
return entry->val_int(&null_value);
3862
String *Item_func_set_user_var::val_str(String *str)
3866
update(); // Store expression
3867
return entry->val_str(&null_value, str, decimals);
3871
my_decimal *Item_func_set_user_var::val_decimal(my_decimal *val)
3875
update(); // Store expression
3876
return entry->val_decimal(&null_value, val);
3880
double Item_func_set_user_var::val_result()
3884
update(); // Store expression
3885
return entry->val_real(&null_value);
3888
int64_t Item_func_set_user_var::val_int_result()
3892
update(); // Store expression
3893
return entry->val_int(&null_value);
3896
String *Item_func_set_user_var::str_result(String *str)
3900
update(); // Store expression
3901
return entry->val_str(&null_value, str, decimals);
3905
my_decimal *Item_func_set_user_var::val_decimal_result(my_decimal *val)
3909
update(); // Store expression
3910
return entry->val_decimal(&null_value, val);
3914
void Item_func_set_user_var::print(String *str, enum_query_type query_type)
3916
str->append(STRING_WITH_LEN("(@"));
3917
str->append(name.str, name.length);
3918
str->append(STRING_WITH_LEN(":="));
3919
args[0]->print(str, query_type);
3924
void Item_func_set_user_var::print_as_stmt(String *str,
3925
enum_query_type query_type)
3927
str->append(STRING_WITH_LEN("set @"));
3928
str->append(name.str, name.length);
3929
str->append(STRING_WITH_LEN(":="));
3930
args[0]->print(str, query_type);
3934
bool Item_func_set_user_var::send(Protocol *protocol, String *str_arg)
3940
return protocol->store(result_field);
3942
return Item::send(protocol, str_arg);
3945
void Item_func_set_user_var::make_field(Send_field *tmp_field)
3949
result_field->make_field(tmp_field);
3950
assert(tmp_field->table_name != 0);
3952
tmp_field->col_name=Item::name; // Use user supplied name
3955
Item::make_field(tmp_field);
3960
Save the value of a user variable into a field
3964
field target field to save the value to
3965
no_conversion flag indicating whether conversions are allowed
3968
Save the function value into a field and update the user variable
3969
accordingly. If a result field is defined and the target field doesn't
3970
coincide with it then the value from the result field will be used as
3971
the new value of the user variable.
3973
The reason to have this method rather than simply using the result
3974
field in the val_xxx() methods is that the value from the result field
3975
not always can be used when the result field is defined.
3976
Let's consider the following cases:
3977
1) when filling a tmp table the result field is defined but the value of it
3978
is undefined because it has to be produced yet. Thus we can't use it.
3979
2) on execution of an INSERT ... SELECT statement the save_in_field()
3980
function will be called to fill the data in the new record. If the SELECT
3981
part uses a tmp table then the result field is defined and should be
3982
used in order to get the correct result.
3984
The difference between the SET_USER_VAR function and regular functions
3985
like CONCAT is that the Item_func objects for the regular functions are
3986
replaced by Item_field objects after the values of these functions have
3987
been stored in a tmp table. Yet an object of the Item_field class cannot
3988
be used to update a user variable.
3989
Due to this we have to handle the result field in a special way here and
3990
in the Item_func_set_user_var::send() function.
3997
int Item_func_set_user_var::save_in_field(Field *field, bool no_conversions,
3998
bool can_use_result_field)
4000
bool use_result_field= (!can_use_result_field ? 0 :
4001
(result_field && result_field != field));
4004
/* Update the value of the user variable */
4005
check(use_result_field);
4008
if (result_type() == STRING_RESULT ||
4009
(result_type() == REAL_RESULT && field->result_type() == STRING_RESULT))
4012
const CHARSET_INFO * const cs= collation.collation;
4013
char buff[MAX_FIELD_WIDTH]; // Alloc buffer for small columns
4014
str_value.set_quick(buff, sizeof(buff), cs);
4015
result= entry->val_str(&null_value, &str_value, decimals);
4019
str_value.set_quick(0, 0, cs);
4020
return set_field_to_null_with_conversions(field, no_conversions);
4023
/* NOTE: If null_value == false, "result" must be not NULL. */
4025
field->set_notnull();
4026
error=field->store(result->ptr(),result->length(),cs);
4027
str_value.set_quick(0, 0, cs);
4029
else if (result_type() == REAL_RESULT)
4031
double nr= entry->val_real(&null_value);
4033
return set_field_to_null(field);
4034
field->set_notnull();
4035
error=field->store(nr);
4037
else if (result_type() == DECIMAL_RESULT)
4039
my_decimal decimal_value;
4040
my_decimal *val= entry->val_decimal(&null_value, &decimal_value);
4042
return set_field_to_null(field);
4043
field->set_notnull();
4044
error=field->store_decimal(val);
4048
int64_t nr= entry->val_int(&null_value);
4050
return set_field_to_null_with_conversions(field, no_conversions);
4051
field->set_notnull();
4052
error=field->store(nr, unsigned_flag);
4059
Item_func_get_user_var::val_str(String *str)
4063
return((String*) 0); // No such variable
4064
return(var_entry->val_str(&null_value, str, decimals));
4068
double Item_func_get_user_var::val_real()
4072
return 0.0; // No such variable
4073
return (var_entry->val_real(&null_value));
4077
my_decimal *Item_func_get_user_var::val_decimal(my_decimal *dec)
4082
return var_entry->val_decimal(&null_value, dec);
4086
int64_t Item_func_get_user_var::val_int()
4090
return 0LL; // No such variable
4091
return (var_entry->val_int(&null_value));
4096
Get variable by name and, if necessary, put the record of variable
4097
use into the binary log.
4099
When a user variable is invoked from an update query (INSERT, UPDATE etc),
4100
stores this variable and its value in thd->user_var_events, so that it can be
4101
written to the binlog (will be written just before the query is written, see
4104
@param thd Current thread
4105
@param name Variable name
4106
@param[out] out_entry variable structure or NULL. The pointer is set
4107
regardless of whether function succeeded or not.
4112
1 Failed to put appropriate record into binary log
4116
int get_var_with_binlog(THD *thd, enum_sql_command sql_command,
4117
LEX_STRING &name, user_var_entry **out_entry)
4119
BINLOG_USER_VAR_EVENT *user_var_event;
4120
user_var_entry *var_entry;
4121
var_entry= get_variable(&thd->user_vars, name, 0);
4124
Any reference to user-defined variable which is done from stored
4125
function or trigger affects their execution and the execution of the
4126
calling statement. We must log all such variables even if they are
4127
not involved in table-updating statements.
4129
if (!(opt_bin_log &&
4130
(is_update_query(sql_command) || thd->in_sub_stmt)))
4132
*out_entry= var_entry;
4139
If the variable does not exist, it's NULL, but we want to create it so
4140
that it gets into the binlog (if it didn't, the slave could be
4141
influenced by a variable of the same name previously set by another
4143
We create it like if it had been explicitly set with SET before.
4144
The 'new' mimics what sql_yacc.yy does when 'SET @a=10;'.
4145
sql_set_variables() is what is called from 'case SQLCOM_SET_OPTION'
4146
in dispatch_command()). Instead of building a one-element list to pass to
4147
sql_set_variables(), we could instead manually call check() and update();
4148
this would save memory and time; but calling sql_set_variables() makes
4149
one unique place to maintain (sql_set_variables()).
4151
Manipulation with lex is necessary since free_underlaid_joins
4152
is going to release memory belonging to the main query.
4155
List<set_var_base> tmp_var_list;
4156
LEX *sav_lex= thd->lex, lex_tmp;
4159
tmp_var_list.push_back(new set_var_user(new Item_func_set_user_var(name,
4161
/* Create the variable */
4162
if (sql_set_variables(thd, &tmp_var_list))
4168
if (!(var_entry= get_variable(&thd->user_vars, name, 0)))
4171
else if (var_entry->used_query_id == thd->query_id ||
4172
mysql_bin_log.is_query_in_union(thd, var_entry->used_query_id))
4175
If this variable was already stored in user_var_events by this query
4176
(because it's used in more than one place in the query), don't store
4179
*out_entry= var_entry;
4185
First we need to store value of var_entry, when the next situation
4188
> insert into t1 values (@a), (@a:=@a+1), (@a:=@a+1);
4189
We have to write to binlog value @a= 1.
4191
We allocate the user_var_event on user_var_events_alloc pool, not on
4192
the this-statement-execution pool because in SPs user_var_event objects
4193
may need to be valid after current [SP] statement execution pool is
4196
size= ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)) + var_entry->length;
4197
if (!(user_var_event= (BINLOG_USER_VAR_EVENT *)
4198
alloc_root(thd->user_var_events_alloc, size)))
4201
user_var_event->value= (char*) user_var_event +
4202
ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT));
4203
user_var_event->user_var_event= var_entry;
4204
user_var_event->type= var_entry->type;
4205
user_var_event->charset_number= var_entry->collation.collation->number;
4206
if (!var_entry->value)
4209
user_var_event->length= 0;
4210
user_var_event->value= 0;
4214
user_var_event->length= var_entry->length;
4215
memcpy(user_var_event->value, var_entry->value,
4218
/* Mark that this variable has been used by this query */
4219
var_entry->used_query_id= thd->query_id;
4220
if (insert_dynamic(&thd->user_var_events, (uchar*) &user_var_event))
4223
*out_entry= var_entry;
4227
*out_entry= var_entry;
4231
void Item_func_get_user_var::fix_length_and_dec()
4233
THD *thd=current_thd;
4236
decimals=NOT_FIXED_DEC;
4237
max_length=MAX_BLOB_WIDTH;
4239
error= get_var_with_binlog(thd, thd->lex->sql_command, name, &var_entry);
4242
If the variable didn't exist it has been created as a STRING-type.
4243
'var_entry' is NULL only if there occured an error during the call to
4244
get_var_with_binlog.
4248
m_cached_result_type= var_entry->type;
4249
unsigned_flag= var_entry->unsigned_flag;
4250
max_length= var_entry->length;
4252
collation.set(var_entry->collation);
4253
switch(m_cached_result_type) {
4255
max_length= DBL_DIG + 8;
4258
max_length= MAX_BIGINT_WIDTH;
4262
max_length= MAX_BLOB_WIDTH;
4264
case DECIMAL_RESULT:
4265
max_length= DECIMAL_MAX_STR_LENGTH;
4266
decimals= DECIMAL_MAX_SCALE;
4268
case ROW_RESULT: // Keep compiler happy
4276
collation.set(&my_charset_bin, DERIVATION_IMPLICIT);
4278
m_cached_result_type= STRING_RESULT;
4279
max_length= MAX_BLOB_WIDTH;
4284
bool Item_func_get_user_var::const_item() const
4286
return (!var_entry || current_thd->query_id != var_entry->update_query_id);
4290
enum Item_result Item_func_get_user_var::result_type() const
4292
return m_cached_result_type;
4296
void Item_func_get_user_var::print(String *str,
4297
enum_query_type query_type __attribute__((unused)))
4299
str->append(STRING_WITH_LEN("(@"));
4300
str->append(name.str,name.length);
4305
bool Item_func_get_user_var::eq(const Item *item,
4306
bool binary_cmp __attribute__((unused))) const
4308
/* Assume we don't have rtti */
4310
return 1; // Same item is same.
4311
/* Check if other type is also a get_user_var() object */
4312
if (item->type() != FUNC_ITEM ||
4313
((Item_func*) item)->functype() != functype())
4315
Item_func_get_user_var *other=(Item_func_get_user_var*) item;
4316
return (name.length == other->name.length &&
4317
!memcmp(name.str, other->name.str, name.length));
4321
bool Item_user_var_as_out_param::fix_fields(THD *thd, Item **ref)
4324
if (Item::fix_fields(thd, ref) ||
4325
!(entry= get_variable(&thd->user_vars, name, 1)))
4327
entry->type= STRING_RESULT;
4329
Let us set the same collation which is used for loading
4330
of fields in LOAD DATA INFILE.
4331
(Since Item_user_var_as_out_param is used only there).
4333
entry->collation.set(thd->variables.collation_database);
4334
entry->update_query_id= thd->query_id;
4339
void Item_user_var_as_out_param::set_null_value(const CHARSET_INFO * const cs)
4341
::update_hash(entry, true, 0, 0, STRING_RESULT, cs,
4342
DERIVATION_IMPLICIT, 0 /* unsigned_arg */);
4346
void Item_user_var_as_out_param::set_value(const char *str, uint length,
4347
const CHARSET_INFO * const cs)
4349
::update_hash(entry, false, (void*)str, length, STRING_RESULT, cs,
4350
DERIVATION_IMPLICIT, 0 /* unsigned_arg */);
4354
double Item_user_var_as_out_param::val_real()
4361
int64_t Item_user_var_as_out_param::val_int()
4368
String* Item_user_var_as_out_param::val_str(String *str __attribute__((unused)))
4375
my_decimal* Item_user_var_as_out_param::val_decimal(my_decimal *decimal_buffer __attribute__((unused)))
4382
void Item_user_var_as_out_param::print(String *str,
4383
enum_query_type query_type __attribute__((unused)))
4386
str->append(name.str,name.length);
4390
Item_func_get_system_var::
4391
Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
4392
LEX_STRING *component_arg, const char *name_arg,
4393
size_t name_len_arg)
4394
:var(var_arg), var_type(var_type_arg), component(*component_arg)
4396
/* set_name() will allocate the name */
4397
set_name(name_arg, name_len_arg, system_charset_info);
4402
Item_func_get_system_var::fix_fields(THD *thd, Item **ref)
4407
Evaluate the system variable and substitute the result (a basic constant)
4408
instead of this item. If the variable can not be evaluated,
4409
the error is reported in sys_var::item().
4411
if (!(item= var->item(thd, var_type, &component)))
4412
return(1); // Impossible
4413
item->set_name(name, 0, system_charset_info); // don't allocate a new name
4414
thd->change_item_tree(ref, item);
4420
bool Item_func_get_system_var::is_written_to_binlog()
4422
return var->is_written_to_binlog(var_type);
4425
int64_t Item_func_bit_xor::val_int()
4428
uint64_t arg1= (uint64_t) args[0]->val_int();
4429
uint64_t arg2= (uint64_t) args[1]->val_int();
4430
if ((null_value= (args[0]->null_value || args[1]->null_value)))
4432
return (int64_t) (arg1 ^ arg2);
4436
/***************************************************************************
4438
****************************************************************************/
4441
Return value of an system variable base[.name] as a constant item.
4443
@param thd Thread handler
4444
@param var_type global / session
4445
@param name Name of base or system variable
4446
@param component Component.
4449
If component.str = 0 then the variable name is in 'name'
4457
Item *get_system_var(THD *thd, enum_var_type var_type, LEX_STRING name,
4458
LEX_STRING component)
4461
LEX_STRING *base_name, *component_name;
4465
base_name= &component;
4466
component_name= &name;
4471
component_name= &component; // Empty string
4474
if (!(var= find_sys_var(thd, base_name->str, base_name->length)))
4478
if (!var->is_struct())
4480
my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), base_name->str);
4485
set_if_smaller(component_name->length, MAX_SYS_VAR_LENGTH);
4487
return new Item_func_get_system_var(var, var_type, component_name,
4493
Check a user level lock.
4495
Sets null_value=true on error.
4500
0 Already taken, or error
4503
int64_t Item_func_is_free_lock::val_int()
4506
String *res=args[0]->val_str(&value);
4507
User_level_lock *ull;
4510
if (!res || !res->length())
4516
pthread_mutex_lock(&LOCK_user_locks);
4517
ull= (User_level_lock *) hash_search(&hash_user_locks, (uchar*) res->ptr(),
4518
(size_t) res->length());
4519
pthread_mutex_unlock(&LOCK_user_locks);
4520
if (!ull || !ull->locked)
4525
int64_t Item_func_is_used_lock::val_int()
4528
String *res=args[0]->val_str(&value);
4529
User_level_lock *ull;
4532
if (!res || !res->length())
4535
pthread_mutex_lock(&LOCK_user_locks);
4536
ull= (User_level_lock *) hash_search(&hash_user_locks, (uchar*) res->ptr(),
4537
(size_t) res->length());
4538
pthread_mutex_unlock(&LOCK_user_locks);
4539
if (!ull || !ull->locked)
4543
return ull->thread_id;
4547
int64_t Item_func_row_count::val_int()
4550
THD *thd= current_thd;
4552
return thd->row_count_func;
4555
int64_t Item_func_found_rows::val_int()
4558
THD *thd= current_thd;
4560
return thd->found_rows();