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;
224
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))
229
class Item_func_database :public Item_func_sysconst
232
Item_func_database() :Item_func_sysconst() {}
233
String *val_str(String *);
234
void fix_length_and_dec()
236
max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
239
const char *func_name() const { return "database"; }
240
const char *fully_qualified_func_name() const { return "database()"; }
244
class Item_func_user :public Item_func_sysconst
247
bool init (const char *user, const char *host);
252
str_value.set("", 0, system_charset_info);
254
String *val_str(String *)
257
return (null_value ? 0 : &str_value);
259
bool fix_fields(THD *thd, Item **ref);
260
void fix_length_and_dec()
262
max_length= (USERNAME_CHAR_LENGTH + HOSTNAME_LENGTH + 1) *
263
system_charset_info->mbmaxlen;
265
const char *func_name() const { return "user"; }
266
const char *fully_qualified_func_name() const { return "user()"; }
267
int save_in_field(Field *field,
268
bool no_conversions __attribute__((unused)))
270
return save_str_value_in_field(field, &str_value);
275
class Item_func_current_user :public Item_func_user
277
Name_resolution_context *context;
280
Item_func_current_user(Name_resolution_context *context_arg)
281
: context(context_arg) {}
282
bool fix_fields(THD *thd, Item **ref);
283
const char *func_name() const { return "current_user"; }
284
const char *fully_qualified_func_name() const { return "current_user()"; }
288
class Item_func_soundex :public Item_str_func
292
Item_func_soundex(Item *a) :Item_str_func(a) {}
293
String *val_str(String *);
294
void fix_length_and_dec();
295
const char *func_name() const { return "soundex"; }
299
class Item_func_elt :public Item_str_func
302
Item_func_elt(List<Item> &list) :Item_str_func(list) {}
305
String *val_str(String *str);
306
void fix_length_and_dec();
307
const char *func_name() const { return "elt"; }
311
class Item_func_make_set :public Item_str_func
317
Item_func_make_set(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
318
String *val_str(String *str);
319
bool fix_fields(THD *thd, Item **ref)
322
return ((!item->fixed && item->fix_fields(thd, &item)) ||
323
item->check_cols(1) ||
324
Item_func::fix_fields(thd, ref));
326
void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
327
void fix_length_and_dec();
328
void update_used_tables();
329
const char *func_name() const { return "make_set"; }
331
bool walk(Item_processor processor, bool walk_subquery, unsigned char *arg)
333
return item->walk(processor, walk_subquery, arg) ||
334
Item_str_func::walk(processor, walk_subquery, arg);
336
Item *transform(Item_transformer transformer, unsigned char *arg);
337
virtual void print(String *str, enum_query_type query_type);
341
class Item_func_format :public Item_str_func
345
Item_func_format(Item *org, Item *dec);
346
String *val_str(String *);
347
void fix_length_and_dec();
348
const char *func_name() const { return "format"; }
349
virtual void print(String *str, enum_query_type query_type);
353
class Item_func_char :public Item_str_func
356
Item_func_char(List<Item> &list) :Item_str_func(list)
357
{ collation.set(&my_charset_bin); }
358
Item_func_char(List<Item> &list, const CHARSET_INFO * const cs) :Item_str_func(list)
359
{ collation.set(cs); }
360
String *val_str(String *);
361
void fix_length_and_dec()
363
max_length= arg_count * 4;
365
const char *func_name() const { return "char"; }
369
class Item_func_repeat :public Item_str_func
373
Item_func_repeat(Item *arg1,Item *arg2) :Item_str_func(arg1,arg2) {}
374
String *val_str(String *);
375
void fix_length_and_dec();
376
const char *func_name() const { return "repeat"; }
380
class Item_func_rpad :public Item_str_func
382
String tmp_value, rpad_str;
384
Item_func_rpad(Item *arg1,Item *arg2,Item *arg3)
385
:Item_str_func(arg1,arg2,arg3) {}
386
String *val_str(String *);
387
void fix_length_and_dec();
388
const char *func_name() const { return "rpad"; }
392
class Item_func_lpad :public Item_str_func
394
String tmp_value, lpad_str;
396
Item_func_lpad(Item *arg1,Item *arg2,Item *arg3)
397
:Item_str_func(arg1,arg2,arg3) {}
398
String *val_str(String *);
399
void fix_length_and_dec();
400
const char *func_name() const { return "lpad"; }
404
class Item_func_conv :public Item_str_func
407
Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
408
const char *func_name() const { return "conv"; }
409
String *val_str(String *);
410
void fix_length_and_dec()
412
collation.set(default_charset());
419
class Item_func_hex :public Item_str_func
423
Item_func_hex(Item *a) :Item_str_func(a) {}
424
const char *func_name() const { return "hex"; }
425
String *val_str(String *);
426
void fix_length_and_dec()
428
collation.set(default_charset());
430
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
434
class Item_func_unhex :public Item_str_func
438
Item_func_unhex(Item *a) :Item_str_func(a)
440
/* there can be bad hex strings */
443
const char *func_name() const { return "unhex"; }
444
String *val_str(String *);
445
void fix_length_and_dec()
447
collation.set(&my_charset_bin);
449
max_length=(1+args[0]->max_length)/2;
454
class Item_func_binary :public Item_str_func
457
Item_func_binary(Item *a) :Item_str_func(a) {}
458
String *val_str(String *a)
461
String *tmp=args[0]->val_str(a);
462
null_value=args[0]->null_value;
464
tmp->set_charset(&my_charset_bin);
467
void fix_length_and_dec()
469
collation.set(&my_charset_bin);
470
max_length=args[0]->max_length;
472
virtual void print(String *str, enum_query_type query_type);
473
const char *func_name() const { return "cast_as_binary"; }
477
class Item_load_file :public Item_str_func
481
Item_load_file(Item *a) :Item_str_func(a) {}
482
String *val_str(String *);
483
const char *func_name() const { return "load_file"; }
484
void fix_length_and_dec()
486
collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
488
max_length=MAX_BLOB_WIDTH;
490
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))
495
class Item_func_export_set: public Item_str_func
498
Item_func_export_set(Item *a,Item *b,Item* c) :Item_str_func(a,b,c) {}
499
Item_func_export_set(Item *a,Item *b,Item* c,Item* d) :Item_str_func(a,b,c,d) {}
500
Item_func_export_set(Item *a,Item *b,Item* c,Item* d,Item* e) :Item_str_func(a,b,c,d,e) {}
501
String *val_str(String *str);
502
void fix_length_and_dec();
503
const char *func_name() const { return "export_set"; }
506
class Item_func_quote :public Item_str_func
510
Item_func_quote(Item *a) :Item_str_func(a) {}
511
const char *func_name() const { return "quote"; }
512
String *val_str(String *);
513
void fix_length_and_dec()
515
collation.set(args[0]->collation);
516
max_length= args[0]->max_length * 2 + 2;
520
class Item_func_conv_charset :public Item_str_func
522
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)
527
{ 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)
531
assert(args[0]->fixed);
533
if (cache_if_const && args[0]->const_item())
536
String tmp, *str= args[0]->val_str(&tmp);
537
if (!str || str_value.copy(str->ptr(), str->length(),
538
str->charset(), conv_charset, &errors))
541
str_value.mark_as_const();
548
Conversion from and to "binary" is safe.
549
Conversion to Unicode is safe.
550
Other kind of conversions are potentially lossy.
552
safe= (args[0]->collation.collation == &my_charset_bin ||
553
cs == &my_charset_bin ||
554
(cs->state & MY_CS_UNICODE));
557
String *val_str(String *);
558
void fix_length_and_dec();
559
const char *func_name() const { return "convert"; }
560
virtual void print(String *str, enum_query_type query_type);
563
class Item_func_set_collation :public Item_str_func
566
Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {};
567
String *val_str(String *);
568
void fix_length_and_dec();
569
bool eq(const Item *item, bool binary_cmp) const;
570
const char *func_name() const { return "collate"; }
571
enum Functype functype() const { return COLLATE_FUNC; }
572
virtual void print(String *str, enum_query_type query_type);
573
Item_field *filed_for_view_update()
575
/* this function is transparent for view updating */
576
return args[0]->filed_for_view_update();
580
class Item_func_charset :public Item_str_func
583
Item_func_charset(Item *a) :Item_str_func(a) {}
584
String *val_str(String *);
585
const char *func_name() const { return "charset"; }
586
void fix_length_and_dec()
588
collation.set(system_charset_info);
589
max_length= 64 * collation.collation->mbmaxlen; // should be enough
592
table_map not_null_tables() const { return 0; }
595
class Item_func_collation :public Item_str_func
598
Item_func_collation(Item *a) :Item_str_func(a) {}
599
String *val_str(String *);
600
const char *func_name() const { return "collation"; }
601
void fix_length_and_dec()
603
collation.set(system_charset_info);
604
max_length= 64 * collation.collation->mbmaxlen; // should be enough
607
table_map not_null_tables() const { return 0; }
611
class Item_func_weight_string :public Item_str_func
617
Item_func_weight_string(Item *a, uint32_t nweights_arg, uint32_t flags_arg)
618
:Item_str_func(a) { nweights= nweights_arg; flags= flags_arg; }
619
const char *func_name() const { return "weight_string"; }
620
String *val_str(String *);
621
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)))
630
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)
631
class Item_func_uuid: public Item_str_func
634
Item_func_uuid(): Item_str_func() {}
635
void fix_length_and_dec() {
636
collation.set(system_charset_info);
638
NOTE! uuid() should be changed to use 'ascii'
639
charset when hex(), format(), md5(), etc, and implicit
640
number-to-string conversion will use 'ascii'
642
max_length= UUID_LENGTH * system_charset_info->mbmaxlen;
644
const char *func_name() const{ return "uuid"; }
645
String *val_str(String *);
646
bool check_vcol_func_processor(unsigned char *int_arg __attribute__((unused)))