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
21
/* This file defines all string functions */
24
class Item_str_func :public Item_func
27
Item_str_func() :Item_func() { decimals=NOT_FIXED_DEC; }
28
Item_str_func(Item *a) :Item_func(a) {decimals=NOT_FIXED_DEC; }
29
Item_str_func(Item *a,Item *b) :Item_func(a,b) { decimals=NOT_FIXED_DEC; }
30
Item_str_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) { decimals=NOT_FIXED_DEC; }
31
Item_str_func(Item *a,Item *b,Item *c,Item *d) :Item_func(a,b,c,d) {decimals=NOT_FIXED_DEC; }
32
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
Item_str_func(List<Item> &list) :Item_func(list) {decimals=NOT_FIXED_DEC; }
36
my_decimal *val_decimal(my_decimal *);
37
enum Item_result result_type () const { return STRING_RESULT; }
38
void left_right_max_length();
39
bool fix_fields(THD *thd, Item **ref);
43
class Item_func_concat :public Item_str_func
47
Item_func_concat(List<Item> &list) :Item_str_func(list) {}
48
Item_func_concat(Item *a,Item *b) :Item_str_func(a,b) {}
49
String *val_str(String *);
50
void fix_length_and_dec();
51
const char *func_name() const { return "concat"; }
54
class Item_func_concat_ws :public Item_str_func
58
Item_func_concat_ws(List<Item> &list) :Item_str_func(list) {}
59
String *val_str(String *);
60
void fix_length_and_dec();
61
const char *func_name() const { return "concat_ws"; }
62
table_map not_null_tables() const { return 0; }
65
class Item_func_reverse :public Item_str_func
69
Item_func_reverse(Item *a) :Item_str_func(a) {}
70
String *val_str(String *);
71
void fix_length_and_dec();
72
const char *func_name() const { return "reverse"; }
76
class Item_func_replace :public Item_str_func
78
String tmp_value,tmp_value2;
80
Item_func_replace(Item *org,Item *find,Item *replace)
81
:Item_str_func(org,find,replace) {}
82
String *val_str(String *);
83
void fix_length_and_dec();
84
const char *func_name() const { return "replace"; }
88
class Item_func_insert :public Item_str_func
92
Item_func_insert(Item *org,Item *start,Item *length,Item *new_str)
93
:Item_str_func(org,start,length,new_str) {}
94
String *val_str(String *);
95
void fix_length_and_dec();
96
const char *func_name() const { return "insert"; }
100
class Item_str_conv :public Item_str_func
104
my_charset_conv_case converter;
107
Item_str_conv(Item *item) :Item_str_func(item) {}
108
String *val_str(String *);
112
class Item_func_lcase :public Item_str_conv
115
Item_func_lcase(Item *item) :Item_str_conv(item) {}
116
const char *func_name() const { return "lcase"; }
117
void fix_length_and_dec();
120
class Item_func_ucase :public Item_str_conv
123
Item_func_ucase(Item *item) :Item_str_conv(item) {}
124
const char *func_name() const { return "ucase"; }
125
void fix_length_and_dec();
129
class Item_func_left :public Item_str_func
133
Item_func_left(Item *a,Item *b) :Item_str_func(a,b) {}
134
String *val_str(String *);
135
void fix_length_and_dec();
136
const char *func_name() const { return "left"; }
140
class Item_func_right :public Item_str_func
144
Item_func_right(Item *a,Item *b) :Item_str_func(a,b) {}
145
String *val_str(String *);
146
void fix_length_and_dec();
147
const char *func_name() const { return "right"; }
151
class Item_func_substr :public Item_str_func
155
Item_func_substr(Item *a,Item *b) :Item_str_func(a,b) {}
156
Item_func_substr(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
157
String *val_str(String *);
158
void fix_length_and_dec();
159
const char *func_name() const { return "substr"; }
163
class Item_func_substr_index :public Item_str_func
167
Item_func_substr_index(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
168
String *val_str(String *);
169
void fix_length_and_dec();
170
const char *func_name() const { return "substring_index"; }
174
class Item_func_trim :public Item_str_func
180
Item_func_trim(Item *a,Item *b) :Item_str_func(a,b) {}
181
Item_func_trim(Item *a) :Item_str_func(a) {}
182
String *val_str(String *);
183
void fix_length_and_dec();
184
const char *func_name() const { return "trim"; }
185
virtual void print(String *str, enum_query_type query_type);
186
virtual const char *mode_name() const { return "both"; }
190
class Item_func_ltrim :public Item_func_trim
193
Item_func_ltrim(Item *a,Item *b) :Item_func_trim(a,b) {}
194
Item_func_ltrim(Item *a) :Item_func_trim(a) {}
195
String *val_str(String *);
196
const char *func_name() const { return "ltrim"; }
197
const char *mode_name() const { return "leading"; }
201
class Item_func_rtrim :public Item_func_trim
204
Item_func_rtrim(Item *a,Item *b) :Item_func_trim(a,b) {}
205
Item_func_rtrim(Item *a) :Item_func_trim(a) {}
206
String *val_str(String *);
207
const char *func_name() const { return "rtrim"; }
208
const char *mode_name() const { return "trailing"; }
212
class Item_func_sysconst :public Item_str_func
216
{ collation.set(system_charset_info,DERIVATION_SYSCONST); }
217
Item *safe_charset_converter(const CHARSET_INFO * const tocs);
219
Used to create correct Item name in new converted item in
220
safe_charset_converter, return string representation of this function
223
virtual const char *fully_qualified_func_name() const = 0;
227
class Item_func_database :public Item_func_sysconst
230
Item_func_database() :Item_func_sysconst() {}
231
String *val_str(String *);
232
void fix_length_and_dec()
234
max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
237
const char *func_name() const { return "database"; }
238
const char *fully_qualified_func_name() const { return "database()"; }
242
class Item_func_user :public Item_func_sysconst
245
bool init (const char *user, const char *host);
250
str_value.set("", 0, system_charset_info);
252
String *val_str(String *)
255
return (null_value ? 0 : &str_value);
257
bool fix_fields(THD *thd, Item **ref);
258
void fix_length_and_dec()
260
max_length= (USERNAME_CHAR_LENGTH + HOSTNAME_LENGTH + 1) *
261
system_charset_info->mbmaxlen;
263
const char *func_name() const { return "user"; }
264
const char *fully_qualified_func_name() const { return "user()"; }
265
int save_in_field(Field *field,
266
bool no_conversions __attribute__((unused)))
268
return save_str_value_in_field(field, &str_value);
273
class Item_func_current_user :public Item_func_user
275
Name_resolution_context *context;
278
Item_func_current_user(Name_resolution_context *context_arg)
279
: context(context_arg) {}
280
bool fix_fields(THD *thd, Item **ref);
281
const char *func_name() const { return "current_user"; }
282
const char *fully_qualified_func_name() const { return "current_user()"; }
286
class Item_func_soundex :public Item_str_func
290
Item_func_soundex(Item *a) :Item_str_func(a) {}
291
String *val_str(String *);
292
void fix_length_and_dec();
293
const char *func_name() const { return "soundex"; }
297
class Item_func_elt :public Item_str_func
300
Item_func_elt(List<Item> &list) :Item_str_func(list) {}
303
String *val_str(String *str);
304
void fix_length_and_dec();
305
const char *func_name() const { return "elt"; }
309
class Item_func_make_set :public Item_str_func
315
Item_func_make_set(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
316
String *val_str(String *str);
317
bool fix_fields(THD *thd, Item **ref)
320
return ((!item->fixed && item->fix_fields(thd, &item)) ||
321
item->check_cols(1) ||
322
Item_func::fix_fields(thd, ref));
324
void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
325
void fix_length_and_dec();
326
void update_used_tables();
327
const char *func_name() const { return "make_set"; }
329
bool walk(Item_processor processor, bool walk_subquery, unsigned char *arg)
331
return item->walk(processor, walk_subquery, arg) ||
332
Item_str_func::walk(processor, walk_subquery, arg);
334
Item *transform(Item_transformer transformer, unsigned char *arg);
335
virtual void print(String *str, enum_query_type query_type);
339
class Item_func_format :public Item_str_func
343
Item_func_format(Item *org, Item *dec);
344
String *val_str(String *);
345
void fix_length_and_dec();
346
const char *func_name() const { return "format"; }
347
virtual void print(String *str, enum_query_type query_type);
351
class Item_func_char :public Item_str_func
354
Item_func_char(List<Item> &list) :Item_str_func(list)
355
{ collation.set(&my_charset_bin); }
356
Item_func_char(List<Item> &list, const CHARSET_INFO * const cs) :Item_str_func(list)
357
{ collation.set(cs); }
358
String *val_str(String *);
359
void fix_length_and_dec()
361
max_length= arg_count * 4;
363
const char *func_name() const { return "char"; }
367
class Item_func_repeat :public Item_str_func
371
Item_func_repeat(Item *arg1,Item *arg2) :Item_str_func(arg1,arg2) {}
372
String *val_str(String *);
373
void fix_length_and_dec();
374
const char *func_name() const { return "repeat"; }
378
class Item_func_rpad :public Item_str_func
380
String tmp_value, rpad_str;
382
Item_func_rpad(Item *arg1,Item *arg2,Item *arg3)
383
:Item_str_func(arg1,arg2,arg3) {}
384
String *val_str(String *);
385
void fix_length_and_dec();
386
const char *func_name() const { return "rpad"; }
390
class Item_func_lpad :public Item_str_func
392
String tmp_value, lpad_str;
394
Item_func_lpad(Item *arg1,Item *arg2,Item *arg3)
395
:Item_str_func(arg1,arg2,arg3) {}
396
String *val_str(String *);
397
void fix_length_and_dec();
398
const char *func_name() const { return "lpad"; }
402
class Item_func_conv :public Item_str_func
405
Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
406
const char *func_name() const { return "conv"; }
407
String *val_str(String *);
408
void fix_length_and_dec()
410
collation.set(default_charset());
417
class Item_func_hex :public Item_str_func
421
Item_func_hex(Item *a) :Item_str_func(a) {}
422
const char *func_name() const { return "hex"; }
423
String *val_str(String *);
424
void fix_length_and_dec()
426
collation.set(default_charset());
428
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
432
class Item_func_unhex :public Item_str_func
436
Item_func_unhex(Item *a) :Item_str_func(a)
438
/* there can be bad hex strings */
441
const char *func_name() const { return "unhex"; }
442
String *val_str(String *);
443
void fix_length_and_dec()
445
collation.set(&my_charset_bin);
447
max_length=(1+args[0]->max_length)/2;
452
class Item_func_binary :public Item_str_func
455
Item_func_binary(Item *a) :Item_str_func(a) {}
456
String *val_str(String *a)
459
String *tmp=args[0]->val_str(a);
460
null_value=args[0]->null_value;
462
tmp->set_charset(&my_charset_bin);
465
void fix_length_and_dec()
467
collation.set(&my_charset_bin);
468
max_length=args[0]->max_length;
470
virtual void print(String *str, enum_query_type query_type);
471
const char *func_name() const { return "cast_as_binary"; }
475
class Item_load_file :public Item_str_func
479
Item_load_file(Item *a) :Item_str_func(a) {}
480
String *val_str(String *);
481
const char *func_name() const { return "load_file"; }
482
void fix_length_and_dec()
484
collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
486
max_length=MAX_BLOB_WIDTH;
491
class Item_func_export_set: public Item_str_func
494
Item_func_export_set(Item *a,Item *b,Item* c) :Item_str_func(a,b,c) {}
495
Item_func_export_set(Item *a,Item *b,Item* c,Item* d) :Item_str_func(a,b,c,d) {}
496
Item_func_export_set(Item *a,Item *b,Item* c,Item* d,Item* e) :Item_str_func(a,b,c,d,e) {}
497
String *val_str(String *str);
498
void fix_length_and_dec();
499
const char *func_name() const { return "export_set"; }
502
class Item_func_quote :public Item_str_func
506
Item_func_quote(Item *a) :Item_str_func(a) {}
507
const char *func_name() const { return "quote"; }
508
String *val_str(String *);
509
void fix_length_and_dec()
511
collation.set(args[0]->collation);
512
max_length= args[0]->max_length * 2 + 2;
516
class Item_func_conv_charset :public Item_str_func
518
bool use_cached_value;
521
const CHARSET_INFO *conv_charset; // keep it public
522
Item_func_conv_charset(Item *a, const CHARSET_INFO * const cs) :Item_str_func(a)
523
{ conv_charset= cs; use_cached_value= 0; safe= 0; }
524
Item_func_conv_charset(Item *a, const CHARSET_INFO * const cs, bool cache_if_const)
527
assert(args[0]->fixed);
529
if (cache_if_const && args[0]->const_item())
532
String tmp, *str= args[0]->val_str(&tmp);
533
if (!str || str_value.copy(str->ptr(), str->length(),
534
str->charset(), conv_charset, &errors))
537
str_value.mark_as_const();
544
Conversion from and to "binary" is safe.
545
Conversion to Unicode is safe.
546
Other kind of conversions are potentially lossy.
548
safe= (args[0]->collation.collation == &my_charset_bin ||
549
cs == &my_charset_bin ||
550
(cs->state & MY_CS_UNICODE));
553
String *val_str(String *);
554
void fix_length_and_dec();
555
const char *func_name() const { return "convert"; }
556
virtual void print(String *str, enum_query_type query_type);
559
class Item_func_set_collation :public Item_str_func
562
Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {};
563
String *val_str(String *);
564
void fix_length_and_dec();
565
bool eq(const Item *item, bool binary_cmp) const;
566
const char *func_name() const { return "collate"; }
567
enum Functype functype() const { return COLLATE_FUNC; }
568
virtual void print(String *str, enum_query_type query_type);
569
Item_field *filed_for_view_update()
571
/* this function is transparent for view updating */
572
return args[0]->filed_for_view_update();
576
class Item_func_charset :public Item_str_func
579
Item_func_charset(Item *a) :Item_str_func(a) {}
580
String *val_str(String *);
581
const char *func_name() const { return "charset"; }
582
void fix_length_and_dec()
584
collation.set(system_charset_info);
585
max_length= 64 * collation.collation->mbmaxlen; // should be enough
588
table_map not_null_tables() const { return 0; }
591
class Item_func_collation :public Item_str_func
594
Item_func_collation(Item *a) :Item_str_func(a) {}
595
String *val_str(String *);
596
const char *func_name() const { return "collation"; }
597
void fix_length_and_dec()
599
collation.set(system_charset_info);
600
max_length= 64 * collation.collation->mbmaxlen; // should be enough
603
table_map not_null_tables() const { return 0; }
607
class Item_func_weight_string :public Item_str_func
613
Item_func_weight_string(Item *a, uint32_t nweights_arg, uint32_t flags_arg)
614
:Item_str_func(a) { nweights= nweights_arg; flags= flags_arg; }
615
const char *func_name() const { return "weight_string"; }
616
String *val_str(String *);
617
void fix_length_and_dec();
620
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)
621
class Item_func_uuid: public Item_str_func
624
Item_func_uuid(): Item_str_func() {}
625
void fix_length_and_dec() {
626
collation.set(system_charset_info);
628
NOTE! uuid() should be changed to use 'ascii'
629
charset when hex(), format(), md5(), etc, and implicit
630
number-to-string conversion will use 'ascii'
632
max_length= UUID_LENGTH * system_charset_info->mbmaxlen;
634
const char *func_name() const{ return "uuid"; }
635
String *val_str(String *);