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
31
30
Item_str_func(Item *a,Item *b,Item *c,Item *d) :Item_func(a,b,c,d) {decimals=NOT_FIXED_DEC; }
32
31
Item_str_func(Item *a,Item *b,Item *c,Item *d, Item* e) :Item_func(a,b,c,d,e) {decimals=NOT_FIXED_DEC; }
33
32
Item_str_func(List<Item> &list) :Item_func(list) {decimals=NOT_FIXED_DEC; }
36
35
my_decimal *val_decimal(my_decimal *);
37
36
enum Item_result result_type () const { return STRING_RESULT; }
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);
263
Item_func_old_password -- PASSWORD() implementation used in MySQL 3.21 - 4.0
264
compatibility mode. This item is created in sql_yacc.yy when
265
'old_passwords' session variable is set, and to handle OLD_PASSWORD()
269
class Item_func_old_password :public Item_str_func
271
char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1];
273
Item_func_old_password(Item *a) :Item_str_func(a) {}
274
String *val_str(String *str);
275
void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; }
276
const char *func_name() const { return "old_password"; }
277
static char *alloc(THD *thd, const char *password);
281
class Item_func_des_encrypt :public Item_str_func
285
String *val_str(String *);
286
void fix_length_and_dec()
287
{ maybe_null=1; max_length = args[0]->max_length+8; }
288
const char *func_name() const { return "des_encrypt"; }
291
class Item_func_des_decrypt :public Item_str_func
295
String *val_str(String *);
296
void fix_length_and_dec() { maybe_null=1; max_length = args[0]->max_length; }
297
const char *func_name() const { return "des_decrypt"; }
300
class Item_func_encrypt :public Item_str_func
304
/* Encapsulate common constructor actions */
305
void constructor_helper()
307
collation.set(&my_charset_bin);
310
Item_func_encrypt(Item *a) :Item_str_func(a)
312
constructor_helper();
314
Item_func_encrypt(Item *a, Item *b): Item_str_func(a,b)
316
constructor_helper();
318
String *val_str(String *);
319
void fix_length_and_dec() { maybe_null=1; max_length = 13; }
320
const char *func_name() const { return "encrypt"; }
323
#include "sql_crypt.h"
326
class Item_func_encode :public Item_str_func
329
Item_func_encode(Item *a, Item *seed):
330
Item_str_func(a, seed) {}
331
String *val_str(String *);
332
void fix_length_and_dec();
333
const char *func_name() const { return "encode"; }
337
class Item_func_decode :public Item_func_encode
340
Item_func_decode(Item *a, Item *seed): Item_func_encode(a, seed) {}
341
String *val_str(String *);
342
const char *func_name() const { return "decode"; }
212
346
class Item_func_sysconst :public Item_str_func
215
349
Item_func_sysconst()
216
350
{ collation.set(system_charset_info,DERIVATION_SYSCONST); }
217
Item *safe_charset_converter(const CHARSET_INFO * const tocs);
351
Item *safe_charset_converter(CHARSET_INFO *tocs);
219
353
Used to create correct Item name in new converted item in
220
354
safe_charset_converter, return string representation of this function
223
357
virtual const char *fully_qualified_func_name() const = 0;
224
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))
328
459
void update_used_tables();
329
460
const char *func_name() const { return "make_set"; }
331
bool walk(Item_processor processor, bool walk_subquery, unsigned char *arg)
462
bool walk(Item_processor processor, bool walk_subquery, uchar *arg)
333
464
return item->walk(processor, walk_subquery, arg) ||
334
465
Item_str_func::walk(processor, walk_subquery, arg);
336
Item *transform(Item_transformer transformer, unsigned char *arg);
467
Item *transform(Item_transformer transformer, uchar *arg);
337
468
virtual void print(String *str, enum_query_type query_type);
522
651
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)
654
CHARSET_INFO *conv_charset; // keep it public
655
Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a)
527
656
{ 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)
657
Item_func_conv_charset(Item *a, CHARSET_INFO *cs, bool cache_if_const)
529
658
:Item_str_func(a)
531
assert(args[0]->fixed);
660
DBUG_ASSERT(args[0]->fixed);
532
661
conv_charset= cs;
533
662
if (cache_if_const && args[0]->const_item())
536
665
String tmp, *str= args[0]->val_str(&tmp);
537
666
if (!str || str_value.copy(str->ptr(), str->length(),
538
667
str->charset(), conv_charset, &errors))
611
740
class Item_func_weight_string :public Item_str_func
613
742
String tmp_value;
617
Item_func_weight_string(Item *a, uint32_t nweights_arg, uint32_t flags_arg)
746
Item_func_weight_string(Item *a, uint nweights_arg, uint flags_arg)
618
747
:Item_str_func(a) { nweights= nweights_arg; flags= flags_arg; }
619
748
const char *func_name() const { return "weight_string"; }
620
749
String *val_str(String *);
621
750
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)))
754
class Item_func_crc32 :public Item_int_func
758
Item_func_crc32(Item *a) :Item_int_func(a) { unsigned_flag= 1; }
759
const char *func_name() const { return "crc32"; }
760
void fix_length_and_dec() { max_length=10; }
764
class Item_func_uncompressed_length : public Item_int_func
768
Item_func_uncompressed_length(Item *a):Item_int_func(a){}
769
const char *func_name() const{return "uncompressed_length";}
770
void fix_length_and_dec() { max_length=10; }
775
#define ZLIB_DEPENDED_FUNCTION ;
777
#define ZLIB_DEPENDED_FUNCTION { null_value=1; return 0; }
780
class Item_func_compress: public Item_str_func
784
Item_func_compress(Item *a):Item_str_func(a){}
785
void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
786
const char *func_name() const{return "compress";}
787
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
790
class Item_func_uncompress: public Item_str_func
794
Item_func_uncompress(Item *a): Item_str_func(a){}
795
void fix_length_and_dec(){ maybe_null= 1; max_length= MAX_BLOB_WIDTH; }
796
const char *func_name() const{return "uncompress";}
797
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
630
800
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)