1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
/* Copyright (C) 2000-2003 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
21
17
/* This file defines all string functions */
19
#ifdef USE_PRAGMA_INTERFACE
20
#pragma interface /* gcc class implementation */
24
23
class Item_str_func :public Item_func
39
38
bool fix_fields(THD *thd, Item **ref);
41
class Item_func_md5 :public Item_str_func
45
Item_func_md5(Item *a) :Item_str_func(a)
47
collation.set(&my_charset_bin);
49
String *val_str(String *);
50
void fix_length_and_dec();
51
const char *func_name() const { return "md5"; }
54
class Item_func_aes_encrypt :public Item_str_func
57
Item_func_aes_encrypt(Item *a, Item *b) :Item_str_func(a,b) {}
58
String *val_str(String *);
59
void fix_length_and_dec();
60
const char *func_name() const { return "aes_encrypt"; }
63
class Item_func_aes_decrypt :public Item_str_func
66
Item_func_aes_decrypt(Item *a, Item *b) :Item_str_func(a,b) {}
67
String *val_str(String *);
68
void fix_length_and_dec();
69
const char *func_name() const { return "aes_decrypt"; }
43
73
class Item_func_concat :public Item_str_func
243
Item_func_password -- new (4.1.1) PASSWORD() function implementation.
244
Returns strcat('*', octet2hex(sha1(sha1(password)))). '*' stands for new
245
password format, sha1(sha1(password) is so-called hash_stage2 value.
246
Length of returned string is always 41 byte. To find out how entire
247
authentication procedure works, see comments in password.c.
250
class Item_func_password :public Item_str_func
252
char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH+1];
254
Item_func_password(Item *a) :Item_str_func(a) {}
255
String *val_str(String *str);
256
void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH; }
257
const char *func_name() const { return "password"; }
258
static char *alloc(THD *thd, const char *password);
261
class Item_func_des_encrypt :public Item_str_func
265
String *val_str(String *);
266
void fix_length_and_dec()
267
{ maybe_null=1; max_length = args[0]->max_length+8; }
268
const char *func_name() const { return "des_encrypt"; }
271
class Item_func_des_decrypt :public Item_str_func
275
String *val_str(String *);
276
void fix_length_and_dec() { maybe_null=1; max_length = args[0]->max_length; }
277
const char *func_name() const { return "des_decrypt"; }
280
class Item_func_encrypt :public Item_str_func
284
/* Encapsulate common constructor actions */
285
void constructor_helper()
287
collation.set(&my_charset_bin);
290
Item_func_encrypt(Item *a) :Item_str_func(a)
292
constructor_helper();
294
Item_func_encrypt(Item *a, Item *b): Item_str_func(a,b)
296
constructor_helper();
298
String *val_str(String *);
299
void fix_length_and_dec() { maybe_null=1; max_length = 13; }
300
const char *func_name() const { return "encrypt"; }
303
#include "sql_crypt.h"
306
class Item_func_encode :public Item_str_func
309
Item_func_encode(Item *a, Item *seed):
310
Item_str_func(a, seed) {}
311
String *val_str(String *);
312
void fix_length_and_dec();
313
const char *func_name() const { return "encode"; }
317
class Item_func_decode :public Item_func_encode
320
Item_func_decode(Item *a, Item *seed): Item_func_encode(a, seed) {}
321
String *val_str(String *);
322
const char *func_name() const { return "decode"; }
212
326
class Item_func_sysconst :public Item_str_func
215
329
Item_func_sysconst()
216
330
{ collation.set(system_charset_info,DERIVATION_SYSCONST); }
217
Item *safe_charset_converter(const CHARSET_INFO * const tocs);
331
Item *safe_charset_converter(CHARSET_INFO *tocs);
219
333
Used to create correct Item name in new converted item in
220
334
safe_charset_converter, return string representation of this function
223
337
virtual const char *fully_qualified_func_name() const = 0;
224
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))
328
440
void update_used_tables();
329
441
const char *func_name() const { return "make_set"; }
331
bool walk(Item_processor processor, bool walk_subquery, unsigned char *arg)
443
bool walk(Item_processor processor, bool walk_subquery, uchar *arg)
333
445
return item->walk(processor, walk_subquery, arg) ||
334
446
Item_str_func::walk(processor, walk_subquery, arg);
336
Item *transform(Item_transformer transformer, unsigned char *arg);
448
Item *transform(Item_transformer transformer, uchar *arg);
337
449
virtual void print(String *str, enum_query_type query_type);
522
632
bool use_cached_value;
525
const CHARSET_INFO *conv_charset; // keep it public
526
Item_func_conv_charset(Item *a, const CHARSET_INFO * const cs) :Item_str_func(a)
635
CHARSET_INFO *conv_charset; // keep it public
636
Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a)
527
637
{ conv_charset= cs; use_cached_value= 0; safe= 0; }
528
Item_func_conv_charset(Item *a, const CHARSET_INFO * const cs, bool cache_if_const)
638
Item_func_conv_charset(Item *a, CHARSET_INFO *cs, bool cache_if_const)
529
639
:Item_str_func(a)
531
641
assert(args[0]->fixed);
532
642
conv_charset= cs;
533
643
if (cache_if_const && args[0]->const_item())
536
646
String tmp, *str= args[0]->val_str(&tmp);
537
647
if (!str || str_value.copy(str->ptr(), str->length(),
538
648
str->charset(), conv_charset, &errors))
611
721
class Item_func_weight_string :public Item_str_func
613
723
String tmp_value;
617
Item_func_weight_string(Item *a, uint32_t nweights_arg, uint32_t flags_arg)
727
Item_func_weight_string(Item *a, uint nweights_arg, uint flags_arg)
618
728
:Item_str_func(a) { nweights= nweights_arg; flags= flags_arg; }
619
729
const char *func_name() const { return "weight_string"; }
620
730
String *val_str(String *);
621
731
void fix_length_and_dec();
623
TODO: Currently this Item is not allowed for virtual columns
624
only due to a bug in generating virtual column value.
626
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))
735
class Item_func_crc32 :public Item_int_func
739
Item_func_crc32(Item *a) :Item_int_func(a) { unsigned_flag= 1; }
740
const char *func_name() const { return "crc32"; }
741
void fix_length_and_dec() { max_length=10; }
745
class Item_func_uncompressed_length : public Item_int_func
749
Item_func_uncompressed_length(Item *a):Item_int_func(a){}
750
const char *func_name() const{return "uncompressed_length";}
751
void fix_length_and_dec() { max_length=10; }
756
#define ZLIB_DEPENDED_FUNCTION ;
758
#define ZLIB_DEPENDED_FUNCTION { null_value=1; return 0; }
761
class Item_func_compress: public Item_str_func
765
Item_func_compress(Item *a):Item_str_func(a){}
766
void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
767
const char *func_name() const{return "compress";}
768
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
771
class Item_func_uncompress: public Item_str_func
775
Item_func_uncompress(Item *a): Item_str_func(a){}
776
void fix_length_and_dec(){ maybe_null= 1; max_length= MAX_BLOB_WIDTH; }
777
const char *func_name() const{return "uncompress";}
778
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
630
781
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)