102
String *Item_func_md5::val_str(String *str)
105
String * sptr= args[0]->val_str(str);
106
str->set_charset(&my_charset_bin);
113
my_MD5Init (&context);
114
my_MD5Update (&context,(uchar *) sptr->ptr(), sptr->length());
115
my_MD5Final (digest, &context);
116
if (str->alloc(32)) // Ensure that memory is free
121
sprintf((char *) str->ptr(),
122
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
123
digest[0], digest[1], digest[2], digest[3],
124
digest[4], digest[5], digest[6], digest[7],
125
digest[8], digest[9], digest[10], digest[11],
126
digest[12], digest[13], digest[14], digest[15]);
127
str->length((uint) 32);
135
void Item_func_md5::fix_length_and_dec()
139
The MD5() function treats its parameter as being a case sensitive. Thus
140
we set binary collation on it so different instances of MD5() will be
143
args[0]->collation.set(
144
get_charset_by_csname(args[0]->collation.collation->csname,
145
MY_CS_BINSORT,MYF(0)), DERIVATION_COERCIBLE);
149
101
Concatenate args with the following premises:
150
102
If only one arg (which is ok), return value of arg;
392
344
now work in place in tmp_value to set it to res | sep_str | res2
394
346
/* Chop the last characters in tmp_value that isn't in res2 */
395
tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) +
347
tmp_value.length((uint32_t) (res2->ptr() - tmp_value.ptr()) +
397
349
/* Place res2 at start of tmp_value, remove chars before res2 */
398
if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()),
350
if (tmp_value.replace(0,(uint32_t) (res2->ptr() - tmp_value.ptr()),
400
352
tmp_value.replace(res->length(),0, *sep_str))
705
657
if ((uint64_t) (res->length() - length + res2->length()) >
706
658
(uint64_t) current_thd->variables.max_allowed_packet)
708
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
660
push_warning_printf(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
709
661
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
710
662
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
711
663
func_name(), current_thd->variables.max_allowed_packet);
714
666
res=copy_if_not_alloced(str,res,res->length());
715
res->replace((uint32) start,(uint32) length,*res2);
667
res->replace((uint32_t) start,(uint32_t) length,*res2);
903
855
if ((start < 0) || ((uint) start + 1 > res->length()))
904
856
return &my_empty_string;
906
length= res->charpos((int) length, (uint32) start);
858
length= res->charpos((int) length, (uint32_t) start);
907
859
tmp_length= res->length() - start;
908
length= min(length, tmp_length);
860
length= cmin(length, tmp_length);
910
862
if (!start && (int64_t) res->length() == length)
912
tmp_value.set(*res, (uint32) start, (uint32) length);
864
tmp_value.set(*res, (uint32_t) start, (uint32_t) length);
913
865
return &tmp_value;
921
873
collation.set(args[0]->collation);
922
874
if (args[1]->const_item())
924
int32 start= (int32) args[1]->val_int();
876
int32_t start= (int32_t) args[1]->val_int();
926
878
max_length= ((uint)(-start) > max_length) ? 0 : (uint)(-start);
928
max_length-= min((uint)(start - 1), max_length);
880
max_length-= cmin((uint)(start - 1), max_length);
930
882
if (arg_count == 3 && args[2]->const_item())
932
int32 length= (int32) args[2]->val_int();
884
int32_t length= (int32_t) args[2]->val_int();
934
886
max_length=0; /* purecov: inspected */
1304
/* Item_func_password */
1306
String *Item_func_password::val_str(String *str)
1309
String *res= args[0]->val_str(str);
1310
if ((null_value=args[0]->null_value))
1312
if (res->length() == 0)
1313
return &my_empty_string;
1314
make_scrambled_password(tmp_value, res->c_ptr());
1315
str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH, res->charset());
1319
char *Item_func_password::alloc(THD *thd, const char *password)
1321
char *buff= (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1);
1323
make_scrambled_password(buff, password);
1327
#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
1329
String *Item_func_encrypt::val_str(String *str)
1332
String *res =args[0]->val_str(str);
1335
char salt[3],*salt_ptr;
1336
if ((null_value=args[0]->null_value))
1338
if (res->length() == 0)
1339
return &my_empty_string;
1342
{ // generate random salt
1343
time_t timestamp=current_thd->query_start();
1344
salt[0] = bin_to_ascii( (ulong) timestamp & 0x3f);
1345
salt[1] = bin_to_ascii(( (ulong) timestamp >> 5) & 0x3f);
1350
{ // obtain salt from the first two bytes
1351
String *salt_str=args[1]->val_str(&tmp_value);
1352
if ((null_value= (args[1]->null_value || salt_str->length() < 2)))
1354
salt_ptr= salt_str->c_ptr();
1356
pthread_mutex_lock(&LOCK_crypt);
1357
char *tmp= crypt(res->c_ptr(),salt_ptr);
1360
pthread_mutex_unlock(&LOCK_crypt);
1364
str->set(tmp, (uint) strlen(tmp), &my_charset_bin);
1366
pthread_mutex_unlock(&LOCK_crypt);
1371
#endif /* HAVE_CRYPT */
1374
void Item_func_encode::fix_length_and_dec()
1376
max_length=args[0]->max_length;
1377
maybe_null=args[0]->maybe_null || args[1]->maybe_null;
1378
collation.set(&my_charset_bin);
1381
String *Item_func_encode::val_str(String *str)
1385
String tmp_pw_value(pw_buff, sizeof(pw_buff), system_charset_info);
1389
if (!(res=args[0]->val_str(str)))
1391
null_value=1; /* purecov: inspected */
1392
return 0; /* purecov: inspected */
1395
if (!(password=args[1]->val_str(& tmp_pw_value)))
1402
res=copy_if_not_alloced(str,res,res->length());
1403
SQL_CRYPT sql_crypt(password->ptr());
1405
sql_crypt.encode((char*) res->ptr(),res->length());
1406
res->set_charset(&my_charset_bin);
1410
String *Item_func_decode::val_str(String *str)
1414
String tmp_pw_value(pw_buff, sizeof(pw_buff), system_charset_info);
1418
if (!(res=args[0]->val_str(str)))
1420
null_value=1; /* purecov: inspected */
1421
return 0; /* purecov: inspected */
1424
if (!(password=args[1]->val_str(& tmp_pw_value)))
1431
res=copy_if_not_alloced(str,res,res->length());
1432
SQL_CRYPT sql_crypt(password->ptr());
1434
sql_crypt.decode((char*) res->ptr(),res->length());
1439
Item *Item_func_sysconst::safe_charset_converter(CHARSET_INFO *tocs)
1256
Item *Item_func_sysconst::safe_charset_converter(const CHARSET_INFO * const tocs)
1441
1258
Item_string *conv;
1259
uint32_t conv_errors;
1443
1260
String tmp, cstr, *ostr= val_str(&tmp);
1444
1261
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
1445
1262
if (conv_errors ||
2288
2105
String *Item_func_charset::val_str(String *str)
2290
2107
assert(fixed == 1);
2108
uint32_t dummy_errors;
2293
CHARSET_INFO *cs= args[0]->collation.collation;
2110
const CHARSET_INFO * const cs= args[0]->collation.collation;
2295
2112
str->copy(cs->csname, strlen(cs->csname),
2296
&my_charset_latin1, collation.collation, &dummy_errors);
2113
&my_charset_utf8_general_ci, collation.collation, &dummy_errors);
2300
2117
String *Item_func_collation::val_str(String *str)
2302
2119
assert(fixed == 1);
2304
CHARSET_INFO *cs= args[0]->collation.collation;
2120
uint32_t dummy_errors;
2121
const CHARSET_INFO * const cs= args[0]->collation.collation;
2307
2124
str->copy(cs->name, strlen(cs->name),
2308
&my_charset_latin1, collation.collation, &dummy_errors);
2125
&my_charset_utf8_general_ci, collation.collation, &dummy_errors);
2313
2130
void Item_func_weight_string::fix_length_and_dec()
2315
CHARSET_INFO *cs= args[0]->collation.collation;
2132
const CHARSET_INFO * const cs= args[0]->collation.collation;
2316
2133
collation.set(&my_charset_bin, args[0]->collation.derivation);
2317
2134
flags= my_strxfrm_flag_normalize(flags, cs->levels_for_order);
2318
max_length= cs->mbmaxlen * max(args[0]->max_length, nweights);
2135
max_length= cs->mbmaxlen * cmax(args[0]->max_length, nweights);
2335
2152
tmp_length= cs->coll->strnxfrmlen(cs, cs->mbmaxlen *
2336
max(res->length(), nweights));
2153
cmax(res->length(), nweights));
2338
2155
if (tmp_value.alloc(tmp_length))
2341
2158
frm_length= cs->coll->strnxfrm(cs,
2342
(uchar*) tmp_value.ptr(), tmp_length,
2159
(unsigned char*) tmp_value.ptr(), tmp_length,
2343
2160
nweights ? nweights : tmp_length,
2344
(const uchar*) res->ptr(), res->length(),
2161
(const unsigned char*) res->ptr(), res->length(),
2346
2163
tmp_value.length(frm_length);
2575
2390
void Item_func_export_set::fix_length_and_dec()
2577
uint length=max(args[1]->max_length,args[2]->max_length);
2578
uint sep_length=(arg_count > 3 ? args[3]->max_length : 1);
2392
uint32_t length=cmax(args[1]->max_length,args[2]->max_length);
2393
uint32_t sep_length=(arg_count > 3 ? args[3]->max_length : 1);
2579
2394
max_length=length*64+sep_length*63;
2581
if (agg_arg_charsets(collation, args+1, min(4,arg_count)-1,
2396
if (agg_arg_charsets(collation, args+1, cmin((uint)4,arg_count)-1,
2582
2397
MY_COLL_ALLOW_CONV, 1))
2616
static uchar escmask[32]=
2431
static unsigned char escmask[32]=
2618
2433
0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00,
2619
2434
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
2685
int64_t Item_func_uncompressed_length::val_int()
2688
String *res= args[0]->val_str(&value);
2692
return 0; /* purecov: inspected */
2695
if (res->is_empty()) return 0;
2698
res->ptr() using is safe because we have tested that string is not empty,
2699
res->c_ptr() is not used because:
2700
- we do not need \0 terminated string to get first 4 bytes
2701
- c_ptr() tests simbol after string end (uninitialiozed memory) which
2704
return uint4korr(res->ptr()) & 0x3FFFFFFF;
2707
int64_t Item_func_crc32::val_int()
2710
String *res=args[0]->val_str(&value);
2714
return 0; /* purecov: inspected */
2717
return (int64_t) crc32(0L, (uchar*)res->ptr(), res->length());
2720
#ifdef HAVE_COMPRESS
2723
String *Item_func_compress::val_str(String *str)
2725
int err= Z_OK, code;
2729
char *tmp, *last_char;
2732
if (!(res= args[0]->val_str(str)))
2738
if (res->is_empty()) return res;
2741
Citation from zlib.h (comment for compress function):
2743
Compresses the source buffer into the destination buffer. sourceLen is
2744
the byte length of the source buffer. Upon entry, destLen is the total
2745
size of the destination buffer, which must be at least 0.1% larger than
2746
sourceLen plus 12 bytes.
2747
We assume here that the buffer can't grow more than .25 %.
2749
new_size= res->length() + res->length() / 5 + 12;
2751
// Check new_size overflow: new_size <= res->length()
2752
if (((uint32) (new_size+5) <= res->length()) ||
2753
buffer.realloc((uint32) new_size + 4 + 1))
2759
body= ((Byte*)buffer.ptr()) + 4;
2761
// As far as we have checked res->is_empty() we can use ptr()
2762
if ((err= compress(body, &new_size,
2763
(const Bytef*)res->ptr(), res->length())) != Z_OK)
2765
code= err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_BUF_ERROR;
2766
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
2771
tmp= (char*)buffer.ptr(); // int4store is a macro; avoid side effects
2772
int4store(tmp, res->length() & 0x3FFFFFFF);
2774
/* This is to ensure that things works for CHAR fields, which trim ' ': */
2775
last_char= ((char*)body)+new_size-1;
2776
if (*last_char == ' ')
2782
buffer.length((uint32)new_size + 4);
2787
String *Item_func_uncompress::val_str(String *str)
2790
String *res= args[0]->val_str(str);
2798
if (res->is_empty())
2801
/* If length is less than 4 bytes, data is corrupt */
2802
if (res->length() <= 4)
2804
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
2805
ER_ZLIB_Z_DATA_ERROR,
2806
ER(ER_ZLIB_Z_DATA_ERROR));
2810
/* Size of uncompressed data is stored as first 4 bytes of field */
2811
new_size= uint4korr(res->ptr()) & 0x3FFFFFFF;
2812
if (new_size > current_thd->variables.max_allowed_packet)
2814
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
2815
ER_TOO_BIG_FOR_UNCOMPRESS,
2816
ER(ER_TOO_BIG_FOR_UNCOMPRESS),
2817
current_thd->variables.max_allowed_packet);
2820
if (buffer.realloc((uint32)new_size))
2823
if ((err= uncompress((Byte*)buffer.ptr(), &new_size,
2824
((const Bytef*)res->ptr())+4,res->length())) == Z_OK)
2826
buffer.length((uint32) new_size);
2830
code= ((err == Z_BUF_ERROR) ? ER_ZLIB_Z_BUF_ERROR :
2831
((err == Z_MEM_ERROR) ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_DATA_ERROR));
2832
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
2842
2502
DCE 1.1: Remote Procedure Call,